diff --git a/.cargo/config.toml b/.cargo/config.toml deleted file mode 100644 index 040ecfaf85..0000000000 --- a/.cargo/config.toml +++ /dev/null @@ -1,2 +0,0 @@ -[target.'cfg(target_env = "msvc")'] -rustflags = ["-C", "target-feature=+crt-static"] diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md deleted file mode 100644 index dfcae55248..0000000000 --- a/.github/pull_request_template.md +++ /dev/null @@ -1,13 +0,0 @@ - - - - -## Checklist - -- [ ] Tested the change ingame -- [ ] Provided screenshots if it is a visual change -- [ ] Tested in combination with possibly related configuration options -- [ ] Written a unit test (especially base/) or added coverage to integration test -- [ ] Considered possible null pointers and out of bounds array indexing -- [ ] Changed no physics that affect existing maps -- [ ] Tested the change with [ASan+UBSan or valgrind's memcheck](https://github.com/ddnet/ddnet/#using-addresssanitizer--undefinedbehavioursanitizer-or-valgrinds-memcheck) (optional) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 4f4a000508..0000000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,279 +0,0 @@ -name: Build - -on: - push: - branches-ignore: - - gh-readonly-queue/** - pull_request: - merge_group: - -jobs: - build-cmake: - runs-on: ${{ matrix.os }} - env: - CARGO_HTTP_MULTIPLEXING: false - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, macOS-latest, windows-latest, ubuntu-20.04] - include: - - os: ubuntu-latest - cmake-args: -G Ninja - cmake-init-env: CXXFLAGS=-Werror - package-file: "*-linux_x86_64.tar.xz" - fancy: true - - os: ubuntu-20.04 - cmake-path: /usr/bin/ - cmake-args: -G Ninja -DTEST_MYSQL=ON - cmake-init-env: CXXFLAGS=-Werror - gtest-env: GTEST_FILTER=-*SQLite* - package-file: "*-linux_x86_64.tar.xz" - fancy: false - - os: macOS-latest - cmake-args: -G Ninja - cmake-init-env: CXXFLAGS=-Werror - package-file: "*-macos.dmg" - fancy: false - - os: windows-latest - cmake-args: -A x64 - cmake-init-env: CXXFLAGS=/WX LDFLAGS=/WX - package-file: "*-win64.zip" - fancy: false - - steps: - - uses: actions/checkout@v4 - with: - submodules: true - - - name: Prepare Linux - if: contains(matrix.os, 'ubuntu') - run: | - sudo apt-get update -y - # mount: /var/lib/grub/esp: special device /dev/disk/by-id/scsi-... does not exist. - # sudo apt-get upgrade -y - sudo apt-get install pkg-config cmake ninja-build libfreetype6-dev libnotify-dev libsdl2-dev libsqlite3-dev libvulkan-dev glslang-tools spirv-tools libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev libx264-dev libpng-dev valgrind gcovr libglew-dev -y - - - name: Prepare Linux (non-fancy) - if: ${{ contains(matrix.os, 'ubuntu') && !matrix.fancy }} - run: | - # Our minimum supported Rust version (MSRV) - rustup default 1.63.0 - sudo rm -rf /var/lib/mysql/ /var/run/mysqld - sudo mkdir /var/lib/mysql/ /var/run/mysqld/ - sudo chown mysql:mysql /var/lib/mysql/ /var/run/mysqld/ - sudo mysqld --initialize-insecure --user=mysql --basedir=/usr --datadir=/var/lib/mysql/ - sudo /usr/bin/mysqld_safe --basedir=/usr --datadir='/var/lib/mysql/' & - sleep 10 - sudo mysql <> $GITHUB_PATH - sudo rm -rf /Library/Developer/CommandLineTools - - - name: Cache Rust dependencies - uses: Swatinem/rust-cache@v2 - - - name: Build in debug mode - run: | - mkdir debug - cd debug - ${{ matrix.cmake-path }}cmake -E env ${{ matrix.cmake-init-env }} ${{ matrix.cmake-path }}cmake ${{ matrix.cmake-args }} -DCMAKE_BUILD_TYPE=Debug -Werror=dev -DDOWNLOAD_GTEST=ON -DDEV=ON -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG=. .. - ${{ matrix.cmake-path }}cmake --build . --config Debug --target everything ${{ matrix.build-args }} - - - name: Test debug - run: | - cd debug - ${{ matrix.cmake-path }}cmake -E env ${{ matrix.gtest-env }} ${{ matrix.cmake-path }}cmake --build . --config Debug --target run_tests ${{ matrix.build-args }} - - - name: Run debug server - run: | - cd debug - ./DDNet-Server shutdown - - - name: Build in release mode - run: | - mkdir release - cd release - ${{ matrix.cmake-path }}cmake -E env ${{ matrix.cmake-init-env }} ${{ matrix.cmake-path }}cmake ${{ matrix.cmake-args }} -DCMAKE_BUILD_TYPE=Release -Werror=dev -DDOWNLOAD_GTEST=ON -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE=. .. - ${{ matrix.cmake-path }}cmake --build . --config Release --target everything ${{ matrix.build-args }} - - - name: Test release - run: | - cd release - ${{ matrix.cmake-path }}cmake -E env ${{ matrix.gtest-env }} ${{ matrix.cmake-path }}cmake --build . --config Release --target run_tests ${{ matrix.build-args }} - - - name: Run release server - run: | - cd release - ./DDNet-Server shutdown - - - name: Build headless client - if: contains(matrix.os, 'ubuntu-latest') - run: | - mkdir headless - cd headless - ${{ matrix.cmake-path }}cmake --version - ${{ matrix.cmake-path }}cmake -E env CXXFLAGS="--coverage -Werror" ${{ matrix.cmake-path }}cmake -E env LDFLAGS="--coverage -Werror" ${{ matrix.cmake-path }}cmake ${{ matrix.cmake-args }} -DHEADLESS_CLIENT=ON -DCMAKE_BUILD_TYPE=Debug -Werror=dev -DDOWNLOAD_GTEST=ON -DDEV=ON -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG=. .. - ${{ matrix.cmake-path }}cmake -E env RUSTFLAGS="-Clink-arg=--coverage" ${{ matrix.cmake-path }}cmake --build . --config Debug ${{ matrix.build-args }} - - - name: Test headless client (unit tests) - if: contains(matrix.os, 'ubuntu-latest') - run: | - cd headless - ${{ matrix.cmake-path }}cmake -E env RUSTFLAGS="-Clink-arg=--coverage" RUSTDOCFLAGS="-Clink-arg=--coverage" ${{ matrix.cmake-path }}cmake --build . --config Debug --target run_tests ${{ matrix.build-args }} - - - name: Upload Codecov report (unit tests) - if: contains(matrix.os, 'ubuntu-latest') - uses: codecov/codecov-action@v4 - with: - flags: unittests - - - name: Test headless client (start & connect) - if: contains(matrix.os, 'ubuntu-latest') - run: | - cd headless - # Remove old coverage data: - find . -name '*.gcno' -o -name '*.gcda' -delete - ./DDNet-Server & - ./DDNet "cl_download_skins 0;connect localhost:8303;quit" - - - name: Upload Codecov report (start & connect) - if: contains(matrix.os, 'ubuntu-latest') - uses: codecov/codecov-action@v4 - with: - flags: startconnect - - - name: Build in release mode with debug info and all features on - if: matrix.fancy - run: | - mkdir fancy - cd fancy - ${{ matrix.cmake-path }}cmake -E env ${{ matrix.cmake-init-env }} ${{ matrix.cmake-path }}cmake ${{ matrix.cmake-args }} -DCMAKE_BUILD_TYPE=RelWithDebInfo -DDOWNLOAD_GTEST=ON -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE=. -DANTIBOT=ON -DWEBSOCKETS=ON .. - ${{ matrix.cmake-path }}cmake --build . --config RelWithDebInfo --target everything ${{ matrix.build-args }} - - - name: Test fancy - if: matrix.fancy - run: | - cd fancy - ${{ matrix.cmake-path }}cmake -E env ${{ matrix.gtest-env }} ${{ matrix.cmake-path }}cmake --build . --config RelWithDebInfo --target run_tests ${{ matrix.build-args }} - - - name: Run fancy server - if: matrix.fancy - run: | - cd fancy - ./DDNet-Server shutdown - - - name: Run integration tests with Valgrind's Memcheck - if: contains(matrix.os, 'ubuntu-latest') - run: | - cd headless - # Remove old coverage data: - find . -name '*.gcno' -o -name '*.gcda' -delete - ./integration_test.sh --valgrind-memcheck - - - name: Upload Codecov report (integration tests) - if: contains(matrix.os, 'ubuntu-latest') - uses: codecov/codecov-action@v4 - with: - flags: integrationtests - - - name: Package - run: | - cd release - ${{ matrix.cmake-path }}cmake --build . --config Release --target package_default ${{ matrix.build-args }} - mkdir artifacts - mv ${{ matrix.package-file }} artifacts - - - name: Upload Artifacts - uses: actions/upload-artifact@v4 - with: - name: ddnet-${{ matrix.os }} - path: release/artifacts - - build-android: - runs-on: ubuntu-24.04 - env: - CARGO_HTTP_MULTIPLEXING: false - steps: - - uses: actions/checkout@v4 - with: - submodules: true - - - name: Prepare - run: | - sudo apt-get update -y - sudo apt-get install cmake ninja-build openjdk-21-jdk p7zip-full curl glslang-tools openssl - cargo install cargo-ndk - rustup target add armv7-linux-androideabi - rustup target add i686-linux-android - rustup target add aarch64-linux-android - rustup target add x86_64-linux-android - mkdir ~/Android - cd ~/Android - mkdir Sdk - cd Sdk - mkdir ndk - cd ndk - wget --quiet https://dl.google.com/android/repository/android-ndk-r26d-linux.zip - unzip android-ndk-r26d-linux.zip - rm android-ndk-r26d-linux.zip - cd ~/Android/Sdk - mkdir build-tools - cd build-tools - wget --quiet https://dl.google.com/android/repository/build-tools_r30.0.3-linux.zip - unzip build-tools_r30.0.3-linux.zip - rm build-tools_r30.0.3-linux.zip - mv android-11 30.0.3 - cd ~/Android/Sdk - mkdir cmdline-tools - cd cmdline-tools - wget --quiet https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip - unzip commandlinetools-linux-11076708_latest.zip - rm commandlinetools-linux-11076708_latest.zip - mv cmdline-tools latest - yes | latest/bin/sdkmanager --licenses - - - name: Build - env: - TW_KEY_NAME: /home/runner/DDNet.jks - TW_KEY_ALIAS: DDNet-Key - run: | - export TW_KEY_PW="$(openssl rand -base64 32)" - keytool -genkey -v -keystore "$TW_KEY_NAME" -keyalg RSA -keysize 2048 -validity 10000 -alias "$TW_KEY_ALIAS" -storepass "$TW_KEY_PW" -dname "CN=DDNet CI, OU=DDNet, O=DDNet" - mkdir build-android - scripts/android/cmake_android.sh all DDNet org.ddnet.client Release build-android - mkdir artifacts - mv build-android/DDNet.apk artifacts - - - name: Upload Artifacts - uses: actions/upload-artifact@v4 - with: - name: ddnet-android - path: artifacts diff --git a/.github/workflows/clang-sanitizer.yml b/.github/workflows/clang-sanitizer.yml index b08b3f31d6..45ce23877d 100644 --- a/.github/workflows/clang-sanitizer.yml +++ b/.github/workflows/clang-sanitizer.yml @@ -8,11 +8,13 @@ on: pull_request: merge_group: +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + jobs: check-clang-san: runs-on: ubuntu-20.04 - env: - CARGO_HTTP_MULTIPLEXING: false steps: - uses: actions/checkout@v4 with: @@ -21,9 +23,8 @@ jobs: - name: Prepare linux run: | sudo apt-get update -y - sudo apt-get install pkg-config cmake ninja-build libfreetype6-dev libnotify-dev libsdl2-dev libsqlite3-dev libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev libx264-dev libvulkan-dev glslang-tools spirv-tools libglew-dev -y - - name: Cache Rust dependencies - uses: Swatinem/rust-cache@v2 + sudo apt-get install pkg-config cmake ninja-build libsqlite3-dev -y + - name: Build with ASan and UBSan run: | mkdir clang-sanitizer @@ -32,37 +33,17 @@ jobs: export CXX=clang++ export CXXFLAGS="-fsanitize=address,undefined -fsanitize-recover=address,undefined -fno-omit-frame-pointer" export CFLAGS="-fsanitize=address,undefined -fsanitize-recover=address,undefined -fno-omit-frame-pointer" - cmake -DCMAKE_BUILD_TYPE=Debug -DHEADLESS_CLIENT=ON -Werror=dev -DDOWNLOAD_GTEST=ON -DDEV=ON -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG=. .. + cmake -DCMAKE_BUILD_TYPE=Debug -Werror=dev -DDEV=ON -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG=. .. make -j"$(nproc)" - - name: Run server and headless client with ASan and UBSan + - name: Run server with ASan and UBSan run: | cd clang-sanitizer export UBSAN_OPTIONS=suppressions=./ubsan.supp:log_path=./SAN:print_stacktrace=1:halt_on_errors=0 export ASAN_OPTIONS=log_path=./SAN:print_stacktrace=1:check_initialization_order=1:detect_leaks=1:halt_on_errors=0 export LSAN_OPTIONS=suppressions=./lsan.supp - ./DDNet "cl_download_skins 0;quit" || true ./DDNet-Server shutdown || true if test -n "$(find . -maxdepth 1 -name 'SAN.*' -print -quit)" then cat ./SAN.* exit 1 fi - - name: Run unit tests with ASan and UBSan - run: | - cd clang-sanitizer - cmake --build . --config Debug --target run_cxx_tests - # Rust tests work locally, but still not in CI, even with the same directory - if test -n "$(find . -maxdepth 1 -name 'SAN.*' -print -quit)" - then - cat ./SAN.* - exit 1 - fi - - name: Run integration tests with ASan and UBSan - run: | - cd clang-sanitizer - make run_integration_tests - if test -n "$(find . -maxdepth 1 -name 'SAN.*' -print -quit)" - then - cat ./SAN.* - exit 1 - fi diff --git a/.github/workflows/clang-tidy.yml b/.github/workflows/clang-tidy.yml index 29caf4ec93..b02b9d2c6d 100644 --- a/.github/workflows/clang-tidy.yml +++ b/.github/workflows/clang-tidy.yml @@ -8,11 +8,13 @@ on: pull_request: merge_group: +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + jobs: check-clang-tidy: runs-on: ubuntu-latest - env: - CARGO_HTTP_MULTIPLEXING: false steps: - uses: actions/checkout@v4 with: @@ -21,14 +23,11 @@ jobs: - name: Install clang-tidy run: | sudo apt-get update -y - sudo apt-get install pkg-config cmake ninja-build libfreetype6-dev libnotify-dev libsdl2-dev libsqlite3-dev libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev libx264-dev clang-tidy libvulkan-dev glslang-tools spirv-tools libglew-dev -y - - - name: Cache Rust dependencies - uses: Swatinem/rust-cache@v2 + sudo apt-get install pkg-config cmake ninja-build libsqlite3-dev clang-tidy -y - name: Build with clang-tidy run: | mkdir clang-tidy cd clang-tidy - cmake -G Ninja -DCMAKE_CXX_CLANG_TIDY="clang-tidy;-warnings-as-errors=*" -DCMAKE_C_CLANG_TIDY="clang-tidy;-warnings-as-errors=*" -DCMAKE_BUILD_TYPE=Debug -Werror=dev -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE=. .. + cmake -G Ninja -DCMAKE_CXX_CLANG_TIDY="clang-tidy;-warnings-as-errors=*" -DCMAKE_C_CLANG_TIDY="clang-tidy;-warnings-as-errors=*" -DCMAKE_BUILD_TYPE=Debug -Werror=dev .. cmake --build . --config Debug --target everything -- -k 0 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index 9e4df7bdb7..0000000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,67 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -name: "CodeQL" - -on: - push: - branches: [master] - pull_request: - # The branches below must be a subset of the branches above - branches: [master] - schedule: - - cron: '0 13 * * 0' - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - env: - CARGO_HTTP_MULTIPLEXING: false - - strategy: - fail-fast: false - matrix: - # Override automatic language detection by changing the below list - # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] - language: ['cpp', 'python'] - # Learn more... - # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - submodules: true - - - name: Prepare Linux - if: matrix.language == 'cpp' - run: | - sudo apt-get update -y - sudo apt-get install pkg-config cmake ninja-build libfreetype6-dev libnotify-dev libsdl2-dev libsqlite3-dev libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev libx264-dev libmariadb-dev libwebsockets-dev libvulkan-dev glslang-tools spirv-tools libglew-dev -y - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - - name: Cache Rust dependencies - uses: Swatinem/rust-cache@v2 - - - name: Build in release mode - if: matrix.language == 'cpp' - run: | - mkdir release - cd release - cmake -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DANTIBOT=ON -DMYSQL=ON -DWEBSOCKETS=ON .. - cmake --build . --config RelWithDebInfo --target everything - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml deleted file mode 100644 index 6c9ddd5086..0000000000 --- a/.github/workflows/rust.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: Check Rust - -on: - push: - branches-ignore: - - gh-readonly-queue/** - pull_request: - merge_group: - -jobs: - rustdoc: - runs-on: ubuntu-latest - env: - CARGO_HTTP_MULTIPLEXING: false - steps: - - uses: actions/checkout@v4 - - name: Cache Rust dependencies - uses: Swatinem/rust-cache@v2 - - name: Run Rustdoc - run: | - RUSTDOCFLAGS=-Dwarnings DDNET_TEST_NO_LINK=1 cargo doc - - rustfmt: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Run Rustfmt - run: - cargo fmt -- --check - - cargo-deny: - runs-on: ubuntu-latest - env: - CARGO_HTTP_MULTIPLEXING: false - strategy: - matrix: - checks: - - advisories - - bans licenses sources - - continue-on-error: ${{ matrix.checks == 'advisories' }} - - steps: - - uses: actions/checkout@v4 - - name: Cache Rust dependencies - uses: Swatinem/rust-cache@v2 - - uses: EmbarkStudios/cargo-deny-action@v1 - with: - command: check ${{ matrix.checks }} diff --git a/.github/workflows/style.yml b/.github/workflows/style.yml index 93c9e9022f..75747b0e12 100644 --- a/.github/workflows/style.yml +++ b/.github/workflows/style.yml @@ -8,11 +8,13 @@ on: pull_request: merge_group: +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + jobs: check-style: runs-on: ubuntu-20.04 - env: - CARGO_HTTP_MULTIPLEXING: false steps: - uses: actions/checkout@v4 with: @@ -20,48 +22,25 @@ jobs: - name: Prepare run: | sudo apt-get update -y - sudo apt-get install clang-format imagemagick ddnet-tools shellcheck pkg-config cmake ninja-build libfreetype6-dev libnotify-dev libsdl2-dev libsqlite3-dev libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev libx264-dev python3-clang libvulkan-dev glslang-tools spirv-tools libglew-dev -y - rustup default stable + sudo apt-get install clang-format ddnet-tools shellcheck pkg-config cmake ninja-build libsqlite3-dev python3-clang -y pip3 install pylint wget -O ~/.local/bin/shfmt https://github.com/mvdan/sh/releases/download/v3.8.0/shfmt_v3.8.0_linux_amd64 chmod +x ~/.local/bin/shfmt - git clone https://gitlab.com/Patiga/twmap.git/ - cd twmap/twmap-tools - cargo install --locked --path=. - cd ../.. - rm -rf twmap mkdir release cd release - cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DDOWNLOAD_GTEST=OFF -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE=. .. - cmake --build . --config Release --target dilate + cmake -G Ninja -DCMAKE_BUILD_TYPE=Release .. - name: Check clang-format run: clang-format -version - name: Check fix_style run: scripts/fix_style.py --dry-run - name: Check header guards run: scripts/check_header_guards.py - - name: Validate Languages - run: scripts/languages/validate.py - - name: Check languages - run: scripts/languages/update_all.py - - name: Check dilated images - run: scripts/check_dilate.sh release data - name: Check absolute includes - run: "! grep --exclude-dir rust-bridge -rE '^#include \"(antibot|base|engine|game|steam|test)/' src/" + run: "! grep -rE '^#include \"(antibot|base|engine|game|steam|test)/' src/" - name: Check standard header includes run: scripts/check_standard_headers.sh - name: Check config variables run: scripts/check_config_variables.py - # TODO: Enable on release branches - #- name: Out-of-date translations - # run: | - # cp -a data/languages data/languages.orig - # scripts/languages/update_all.py - # diff_lang=$(diff data/languages.orig data/languages) - # if [ -n "$diff_lang" ]; then - # echo "Update translations:\n$diff_lang" - # exit 1 - # fi - name: Shellcheck run: find . -type f -name '*.sh' -print0 | xargs -0 shellcheck - name: Shell format (shfmt) @@ -78,18 +57,7 @@ jobs: - name: Pylint run: | pylint --version - find . -type f -name "*.py" -not -path './ddnet-libs/*' -not -path './googletest-src/*' -print0 | xargs -0 pylint + find . -type f -name "*.py" -print0 | xargs -0 pylint - name: Unused header files run: scripts/check_unused_header_files.py - - name: Check maps - run: | - findings=$(find data -type f -name '*.map' ! -wholename 'data/maps/coverage.map' -print0 | xargs -0 ~/.cargo/bin/twmap-check-ddnet 2>&1 | \ - grep -v -E "\"data/maps/(ctf|dm).*\.map\": Time cps are missing on the map" | \ - grep -v -E "\"data/themes/.*\.map\": Time cps are missing on the map" | \ - grep -v -E "\"data/maps/ctf4\.map\": Map - In Image at index 3 -> Image 'jungle_doodads_old' is not a valid external image for DDNet06" | \ - grep -v -E "\"data/themes/autumn_night\.map\": Map - In Image at index 3 -> Image 'generic_lamps' is not a valid external image for DDNet06" | \ - grep -v -E "\"data/maps7?/Tutorial\.map\": Map setting - Unusual: 'sv_show_others_default'" || true) - if [ -n "$findings" ]; then - echo "$findings" - exit 1 - fi + diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 48f40a41b1..0000000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,2 +0,0 @@ -include: '.gitlab/*.yml' - diff --git a/.gitlab/build.yml b/.gitlab/build.yml index 03a739ec52..2e25619217 100644 --- a/.gitlab/build.yml +++ b/.gitlab/build.yml @@ -10,13 +10,8 @@ build_cmake: - apt-get upgrade -y - apt-get install pkg-config - clang rustc - cargo cmake ninja-build - libfreetype6-dev libnotify-dev libsdl2-dev libsqlite3-dev libvulkan-dev - glslang-tools spirv-tools libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev - libx264-dev libpng-dev - libcurl4 libcurl3-gnutls libcurl4-openssl-dev libcurlpp-dev - libogg-dev libopus-dev libopusfile-dev + clang cmake ninja-build + libsqlite3-dev libcurl4 libcurl3-gnutls libcurl4-openssl-dev libcurlpp-dev valgrind -y stage: test script: diff --git a/.gitmodules b/.gitmodules index 23aa58d9fc..f97bdef99d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,3 @@ [submodule "ddnet-libs"] path = ddnet-libs - url = https://github.com/ddnet/ddnet-libs - shallow = true + url = https://github.com/TeeworldsCN/ddnet-server-libs diff --git a/.mailmap b/.mailmap deleted file mode 100644 index d8ac665dc7..0000000000 --- a/.mailmap +++ /dev/null @@ -1,24 +0,0 @@ -Edgar Luque Edgar -Edgar Luque Ryozuki -Edgar Luque Ryozuki -Edgar Luque Edgar -Edgar Luque Edgar Luque -Edgar Luque Ryozuki -Edgar Luque Edgar -heinrich5991 heinrich5991 -Jupeyy jupeyy -Jupeyy jupeyy -Jupeyy jupeyy -Learath2 Learath -Learath2 Learath Lea -Learath2 Learath2 -Learath2 Emir Marincic -ChillerDragon ChillerDragon -ChillerDragon ChillerDrgon -ChillerDragon Chiller Dragon -ChillerDragon Chiller Dragun -Dennis Felsing def -Dennis Felsing def -Dennis Felsing Dennis Felsing -Patiga patiga -Patiga patiga diff --git a/CMakeLists.txt b/CMakeLists.txt index 9a0e84801f..aa9df23690 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,14 +58,12 @@ endif() if(CMAKE_SYSTEM_NAME STREQUAL "Windows") set(TARGET_OS "windows") -elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Emscripten") +elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") set(TARGET_OS "linux") elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") set(TARGET_OS "mac") elseif(CMAKE_SYSTEM_NAME STREQUAL "Haiku") set(TARGET_OS "haiku") -elseif(CMAKE_SYSTEM_NAME STREQUAL "Android") - set(TARGET_OS "android") endif() include(CheckCCompilerFlag) @@ -74,9 +72,6 @@ if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.18) include(CheckLinkerFlag) endif() include(CheckSymbolExists) -if(NOT (CMAKE_SYSTEM_NAME STREQUAL "Emscripten")) - include(CheckAtomic) -endif() check_symbol_exists(__i386 "" TARGET_ARCH_X86_i386) if(TARGET_ARCH_X86_i386) @@ -87,49 +82,19 @@ endif() set(AUTO_DEPENDENCIES_DEFAULT OFF) -set(AUTO_VULKAN_BACKEND ON) -if(TARGET_OS STREQUAL "windows") - set(AUTO_DEPENDENCIES_DEFAULT ON) - if(TARGET_CPU_ARCHITECTURE STREQUAL "x86") - set(AUTO_VULKAN_BACKEND OFF) - endif() -elseif(TARGET_OS STREQUAL "mac") - set(AUTO_VULKAN_BACKEND OFF) -endif() - option(WEBSOCKETS "Enable websockets support" OFF) option(MYSQL "Enable mysql support" OFF) -option(TEST_MYSQL "Test mysql support in unit tests (also sets -DMYSQL=ON)" OFF) -option(AUTOUPDATE "Enable the autoupdater" OFF) -option(INFORM_UPDATE "Inform about available updates" ON) -option(VIDEORECORDER "Enable video recording support via FFmpeg" ON) option(UPNP "Enable UPnP support" OFF) option(ANTIBOT "Enable support for a dynamic anticheat library (not provided, see src/antibot for interface if you want to implement your own)" OFF) -option(HEADLESS_CLIENT "Build the client without graphics" OFF) -option(CLIENT "Compile client" ON) option(SERVER "Compile server" ON) -option(TOOLS "Compile tools" ON) -option(DOWNLOAD_GTEST "Download and compile GTest" ${AUTO_DEPENDENCIES_DEFAULT}) -option(STEAM "Build the Steam release version" OFF) -option(DISCORD "Enable Discord rich presence support" OFF) -option(DISCORD_DYNAMIC "Enable discovering Discord rich presence libraries at runtime (Linux only)" OFF) option(PREFER_BUNDLED_LIBS "Prefer bundled libraries over system libraries" ${AUTO_DEPENDENCIES_DEFAULT}) option(DEV "Don't generate stuff necessary for packaging" OFF) -option(VULKAN "Enable the vulkan backend" ${AUTO_VULKAN_BACKEND}) option(EXCEPTION_HANDLING "Enable exception handling (only works with Windows as of now)" OFF) option(IPO "Enable interprocedural optimizations" OFF) option(FUSE_LD "Linker to use" OFF) option(SECURITY_COMPILER_FLAGS "Whether to set security-relevant compiler flags like -D_FORTIFY_SOURCE=2 and -fstack-protector-strong" ON) -if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") - include(${PROJECT_SOURCE_DIR}/cmake/toolchains/Emscripten.toolchain) -endif() - -if(TEST_MYSQL) - set(MYSQL ON) -endif() - # Set version if not explicitly set if(NOT VERSION) set(VERSION ${PROJECT_VERSION}) @@ -169,7 +134,6 @@ if(NOT "${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") endif() set(SERVER_EXECUTABLE DDNet-Server CACHE STRING "Name of the built server executable") -set(CLIENT_EXECUTABLE DDNet CACHE STRING "Name of the build client executable") ######################################################################## # Compiler flags @@ -317,7 +281,7 @@ if(NOT MSVC AND NOT HAIKU) add_cxx_compiler_flag_if_supported(OUR_FLAGS_OWN -Wall) add_cxx_compiler_flag_if_supported(OUR_FLAGS_OWN -Wextra) - add_cxx_compiler_flag_if_supported(OUR_FLAGS_OWN -Wno-psabi) # parameter passing for argument of type ‘__gnu_cxx::__normal_iterator*, std::vector, std::allocator > > >’ changed in GCC 7.1 + add_cxx_compiler_flag_if_supported(OUR_FLAGS_OWN -Wno-psabi) add_cxx_compiler_flag_if_supported(OUR_FLAGS_OWN -Wno-unused-parameter) add_cxx_compiler_flag_if_supported(OUR_FLAGS_OWN -Wno-missing-field-initializers) if(CMAKE_BUILD_TYPE STREQUAL DEBUG) @@ -401,9 +365,7 @@ endfunction() function(set_src VAR GLOBBING DIRECTORY) # ... set_glob(${VAR} ${GLOBBING} "c;cpp;h" ${DIRECTORY} ${ARGN}) set(${VAR} ${${VAR}} PARENT_SCOPE) - set(CHECKSUM_SRC ${CHECKSUM_SRC} ${${VAR}} PARENT_SCOPE) endfunction() -set(CHECKSUM_SRC) function(set_own_rpath TARGET) if(NOT TARGET_OS STREQUAL "windows" AND NOT TARGET_OS STREQUAL "mac") @@ -433,8 +395,6 @@ endif() if(FAT) set(LIB_DIR "${TARGET_OS}/libfat") -elseif(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") - set(LIB_DIR "webasm/libwasm") elseif(TARGET_CPU_ARCHITECTURE STREQUAL "arm" OR TARGET_CPU_ARCHITECTURE STREQUAL "arm64") set(LIB_DIR "${TARGET_OS}/lib${TARGET_CPU_ARCHITECTURE}") else() @@ -462,20 +422,12 @@ function(set_extra_dirs_include VARIABLE NAME LIBRARY) is_bundled(IS_BUNDLED "${LIBRARY}") if(IS_BUNDLED) set(TMP_TARGET_OS ${TARGET_OS}) - if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") - set(TMP_TARGET_OS webasm) - endif() set("HINTS_${VARIABLE}_INCLUDEDIR" "ddnet-libs/${NAME}/include" "ddnet-libs/${NAME}/include/${TMP_TARGET_OS}" PARENT_SCOPE) endif() endfunction() if(CMAKE_CROSSCOMPILING) - if(TARGET_OS STREQUAL "android" OR CMAKE_SYSTEM_NAME STREQUAL "Emscripten") - # be more aggressive with android toolchain - set(CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH NO_CMAKE_SYSTEM_PATH NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) - else() - set(CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH NO_CMAKE_SYSTEM_PATH) - endif() + set(CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH NO_CMAKE_SYSTEM_PATH) else() set(CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH) endif() @@ -498,23 +450,9 @@ if(NOT CMAKE_CROSSCOMPILING) # quietly. find_package(PkgConfig) endif() -if(TARGET_OS STREQUAL "android") - find_package(Android) -endif() find_package(ZLIB) find_package(Crypto) find_package(Curl) -if(CLIENT AND VIDEORECORDER) - find_package(FFMPEG) -endif() -find_package(Freetype) -if(DOWNLOAD_GTEST) - find_package(Git) -endif() -if(NOT(TARGET_OS STREQUAL "android")) - find_package(GLEW) -endif() -find_package(GTest) if(UPNP) find_package(Miniupnpc) endif() @@ -523,23 +461,13 @@ if(MYSQL) else() set(MYSQL_LIBRARIES) endif() -find_package(Ogg) -find_package(Opus) -find_package(Opusfile) -find_package(PNG) find_package(Python3) -find_package(Rust) -find_package(SDL2) find_package(SQLite3) -if(DISCORD) - find_package(DiscordSdk) -endif() if(UNIX) # Use -pthread instead of -lpthread to draw dependencies other than libpthread set(THREADS_PREFER_PTHREAD_FLAG TRUE) endif() find_package(Threads) -find_package(Wavpack) if(WEBSOCKETS) find_package(Websockets) else() @@ -560,16 +488,6 @@ if(TARGET_OS AND TARGET_OS STREQUAL "mac") find_program(DMGBUILD dmgbuild) endif() -set(VULKAN_SHADER_FILE_LIST "" CACHE STRING "Vulkan shader file list") -set(VULKAN_SHADER_FILE_SHA256 "" CACHE STRING "Vulkan shader file hash") -if(CLIENT AND VULKAN) - find_package(Vulkan) - include(cmake/BuildVulkanShaders.cmake) -else() - set(VULKAN_LIBRARIES) - set(VULKAN_INCLUDE_DIRS) -endif() - message(STATUS "******** ${CMAKE_PROJECT_NAME} ********") set(TARGET "Target OS: ${TARGET_OS} ${CMAKE_SYSTEM_PROCESSOR}") if(TARGET_OS STREQUAL "mac") @@ -577,7 +495,6 @@ if(TARGET_OS STREQUAL "mac") endif() message(STATUS ${TARGET}) message(STATUS "Compiler: ${CMAKE_CXX_COMPILER}") -message(STATUS "Rust version: ${RUST_VERSION_STRING}") message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") message(STATUS "Dependencies:") @@ -597,15 +514,6 @@ show_dependency_status("Curl" CURL) if(TARGET_OS AND TARGET_OS STREQUAL "mac") show_dependency_status("Dmg tools" DMGTOOLS) endif() -if(CLIENT AND VIDEORECORDER) - show_dependency_status("FFmpeg" FFMPEG) -endif() -show_dependency_status("Freetype" FREETYPE) -if(DOWNLOAD_GTEST) - show_dependency_status("Git" GIT) -endif() -show_dependency_status("Glew" GLEW) -show_dependency_status("GTest" GTEST) if(TARGET_OS AND TARGET_OS STREQUAL "mac") show_dependency_status("Dmgbuild" DMGBUILD) endif() @@ -615,36 +523,20 @@ endif() if(MYSQL) show_dependency_status("MySQL" MYSQL) endif() -show_dependency_status("Ogg" OGG) show_dependency_status("OpenSSL Crypto" CRYPTO) -show_dependency_status("Opus" OPUS) -show_dependency_status("Opusfile" OPUSFILE) -show_dependency_status("PNG" PNG) show_dependency_status("Python3" Python3) -show_dependency_status("SDL2" SDL2) show_dependency_status("SQLite3" SQLite3) -show_dependency_status("Wavpack" WAVPACK) show_dependency_status("Zlib" ZLIB) -if(DISCORD) - show_dependency_status("DiscordSdk" DiscordSdk) -endif() if(WEBSOCKETS) show_dependency_status("Websockets" WEBSOCKETS) endif() -if(CLIENT AND VULKAN) - show_dependency_status("Vulkan" VULKAN) -endif() - if(NOT(CURL_FOUND)) message(SEND_ERROR "You must install Curl to compile ${CMAKE_PROJECT_NAME}") endif() if(NOT(Python3_FOUND)) message(SEND_ERROR "You must install Python to compile ${CMAKE_PROJECT_NAME}") endif() -if(NOT(RUST_FOUND)) - message(SEND_ERROR "You must install Rust and Cargo to compile ${CMAKE_PROJECT_NAME}") -endif() if(NOT(SQLite3_FOUND)) message(SEND_ERROR "You must install SQLite3 to compile ${CMAKE_PROJECT_NAME}") endif() @@ -660,159 +552,30 @@ endif() if(UPNP AND NOT(MINIUPNPC_FOUND)) message(SEND_ERROR "You must install miniupnpc to compile the ${CMAKE_PROJECT_NAME} server with UPnP support") endif() -if(DISCORD AND NOT(DISCORDSDK_FOUND)) - message(SEND_ERROR "You must install the Discord SDK to compile the ${CMAKE_PROJECT_NAME} client with Discord support") -endif() -if(DISCORD_DYNAMIC) - if(TARGET_OS STREQUAL "windows" OR TARGET_OS STREQUAL "mac") - message(SEND_ERROR "Dynamically loading the Discord SDK is only supported on Linux") - endif() - if(NOT DISCORD) - message(SEND_ERROR "You must enable the DISCORD flag if you want to link the Discord SDK") - endif() -endif() -if(NOT(PNG_FOUND)) - message(SEND_ERROR "You must install libpng to compile ${CMAKE_PROJECT_NAME}") -endif() -if(CLIENT AND NOT(FREETYPE_FOUND)) - message(SEND_ERROR "You must install Freetype to compile the ${CMAKE_PROJECT_NAME} client") -endif() -if(CLIENT AND NOT(OGG_FOUND)) - message(SEND_ERROR "You must install Ogg to compile the ${CMAKE_PROJECT_NAME} client") -endif() -if(CLIENT AND NOT(OPUS_FOUND)) - message(SEND_ERROR "You must install Opus to compile the ${CMAKE_PROJECT_NAME} client") -endif() -if(CLIENT AND NOT(OPUSFILE_FOUND)) - message(SEND_ERROR "You must install Opusfile to compile the ${CMAKE_PROJECT_NAME} client") -endif() -if(CLIENT AND NOT(SDL2_FOUND)) - message(SEND_ERROR "You must install SDL2 to compile the ${CMAKE_PROJECT_NAME} client") -endif() -if(TARGET_OS STREQUAL "android" AND NOT(CRYPTO_FOUND)) - message(SEND_ERROR "You must install OpenSSL to compile ${CMAKE_PROJECT_NAME}") -endif() -if(NOT(GTEST_FOUND)) - if(DOWNLOAD_GTEST) - if(GIT_FOUND) - message(STATUS "Automatically downloading GTest to be able to run tests") - else() - set(DOWNLOAD_GTEST OFF) - message(WARNING "To automatically download GTest, you have to install Git") - endif() - else() - message(STATUS "To run the tests, you have to install GTest") - endif() -endif() - -if(CLIENT AND VULKAN AND NOT(VULKAN_FOUND)) - message(SEND_ERROR "You must install Vulkan libraries to compile the ${CMAKE_PROJECT_NAME} client") -endif() if(TARGET_OS STREQUAL "windows") - set(PLATFORM_CLIENT) - set(PLATFORM_CLIENT_LIBS opengl32 winmm imm32) set(PLATFORM_LIBS) list(APPEND PLATFORM_LIBS shlwapi) # PathIsRelativeW list(APPEND PLATFORM_LIBS version ws2_32) # Windows sockets - list(APPEND PLATFORM_LIBS bcrypt userenv) # for Rust (https://github.com/rust-lang/rust/issues/91974) list(APPEND PLATFORM_LIBS ole32) # CoInitialize(Ex) list(APPEND PLATFORM_LIBS shell32) list(APPEND PLATFORM_LIBS ntdll) # https://github.com/ddnet/ddnet/issues/6725 elseif(TARGET_OS STREQUAL "mac") find_library(CARBON Carbon) find_library(COCOA Cocoa) - find_library(OPENGL OpenGL) find_library(SECURITY Security) - set(PLATFORM_CLIENT - src/macos/client.mm - src/macos/notifications.mm - ) - set(PLATFORM_CLIENT_LIBS ${COCOA} ${OPENGL}) set(PLATFORM_LIBS ${CARBON} ${SECURITY}) elseif(TARGET_OS STREQUAL "haiku") - set(PLATFORM_CLIENT) - find_package(OpenGL) set(PLATFORM_LIBS GL network) - set(PLATFORM_CLIENT_LIBS ${OPENGL_gl_LIBRARY}) - set(PLATFORM_CLIENT_INCLUDE_DIRS ${OPENGL_INCLUDE_DIR}) -elseif(TARGET_OS STREQUAL "android") - set(PLATFORM_CLIENT - src/android/android_main.cpp - ) - set(PLATFORM_LIBS ${TW_ANDROID_LIBS}) - set(PLATFORM_CLIENT_LIBS ${TW_ANDROID_LIBS_CLIENT}) - set(PLATFORM_CLIENT_INCLUDE_DIRS) else() - find_package(Notify) - find_package(OpenGL) - set(PLATFORM_CLIENT_LIBS ${OPENGL_gl_LIBRARY} ${NOTIFY_LIBRARIES}) - set(PLATFORM_CLIENT_INCLUDE_DIRS ${OPENGL_INCLUDE_DIR} ${NOTIFY_INCLUDE_DIRS}) - set(PLATFORM_CLIENT) if(TARGET_OS STREQUAL "linux") set(PLATFORM_LIBS) list(APPEND PLATFORM_LIBS rt) # clock_gettime for glibc < 2.17 - list(APPEND PLATFORM_LIBS dl) # for Rust else() set(PLATFORM_LIBS) endif() endif() -if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") - set(PLATFORM_CLIENT_LIBS GL) - set(PLATFORM_CLIENT_INCLUDE_DIRS "") - set(CMAKE_EXECUTABLE_SUFFIX ".html") -endif() - -######################################################################## -# DOWNLOAD GTEST -######################################################################## - -if(NOT(GTEST_FOUND) AND DOWNLOAD_GTEST) - set(DDNET_GTEST_VERSION 3d73dee972d0db344bda9b659836612aba6a3564) - configure_file(cmake/Download_GTest_CMakeLists.txt.in googletest-download/CMakeLists.txt) - execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . - RESULT_VARIABLE result - WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/googletest-download - ) - if(result) - message(WARNING "CMake step for googletest failed: ${result}") - set(DOWNLOAD_GTEST OFF) - else() - execute_process(COMMAND ${CMAKE_COMMAND} --build . - RESULT_VARIABLE result - WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/googletest-download - ) - if(result) - message(WARNING "Build step for googletest failed: ${result}") - set(DOWNLOAD_GTEST OFF) - else() - # Prevent overriding the parent project's compiler/linker settings on Windows - set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) - - # Add googletest directly to our build. This defines the gtest target. - add_subdirectory( - ${PROJECT_BINARY_DIR}/googletest-src - ${PROJECT_BINARY_DIR}/googletest-build - EXCLUDE_FROM_ALL - ) - - if(MSVC) - foreach(target gtest gmock) - set_property(TARGET ${target} PROPERTY MSVC_RUNTIME_LIBRARY MultiThreaded$<${DBG}:Debug>) - # `/w` disables all warnings. This is needed because `gtest` enables - # `/WX` (equivalent of `-Werror`) for some reason, breaking builds - # when MSVS adds new warnings. - target_compile_options(${target} PRIVATE /w) - endforeach() - endif() - - set(GTEST_LIBRARIES gtest gmock) - set(GTEST_INCLUDE_DIRS) - endif() - endif() -endif() - ######################################################################## # DEPENDENCY COMPILATION ######################################################################## @@ -830,718 +593,14 @@ if(NOT CRYPTO_FOUND) set(DEP_MD5 $) endif() -######################################################################## -# RUST -######################################################################## - -set_glob(RUST_BASE GLOB_RECURSE "rs;toml" src/base - Cargo.toml - color.rs - lib.rs - rust.rs -) - -set_glob(RUST_ENGINE_INTERFACE GLOB "rs;toml" src/engine - Cargo.toml - console.rs - lib.rs -) - -set_glob(RUST_ENGINE_SHARED GLOB_RECURSE "rs;toml" src/engine/shared - Cargo.toml - build.rs - config.rs - lib.rs - rust_version.rs -) - -set_src(RUST_BRIDGE_SHARED GLOB_RECURSE src/rust-bridge - cpp/console.cpp - cpp/console.h - engine/shared/rust_version.cpp - engine/shared/rust_version.h -) - -set_glob(RUST_MASTERSRV GLOB "rs;toml" src/mastersrv/src - addr.rs - locations.rs - main.rs -) - -add_library(rust-bridge-shared EXCLUDE_FROM_ALL OBJECT ${RUST_BRIDGE_SHARED}) -list(APPEND TARGETS_OWN rust-bridge-shared) - -if(TARGET_OS STREQUAL "android") - set(CARGO_BUILD_DIR "${CARGO_NDK_TARGET}/") - set(CARGO_BUILD ${CMAKE_COMMAND} -E env CARGO_TARGET_DIR=${PROJECT_BINARY_DIR} DDNET_TEST_NO_LINK=1 ${RUST_CARGO} ndk --manifest-path "${PROJECT_SOURCE_DIR}/Cargo.toml" -t ${CARGO_NDK_TARGET} -p ${CARGO_NDK_API} build) - set(CARGO_TEST ${CMAKE_COMMAND} -E env CARGO_TARGET_DIR=${PROJECT_BINARY_DIR} ${RUST_CARGO} ndk -t ${CARGO_NDK_TARGET} -p ${CARGO_NDK_API} test) -else() - set(CARGO_BUILD_DIR "") - set(CARGO_BUILD ${CMAKE_COMMAND} -E env CARGO_TARGET_DIR=${PROJECT_BINARY_DIR} DDNET_TEST_NO_LINK=1 ${RUST_CARGO} build --manifest-path "${PROJECT_SOURCE_DIR}/Cargo.toml") - set(CARGO_TEST ${CMAKE_COMMAND} -E env CARGO_TARGET_DIR=${PROJECT_BINARY_DIR} ${RUST_CARGO} test) -endif() -if(MSVC) - list(INSERT CARGO_BUILD 0 ${CMAKE_COMMAND} -E env $<$:CFLAGS=/MTd> $<$:CXXFLAGS=/MTd>) - list(INSERT CARGO_TEST 0 ${CMAKE_COMMAND} -E env RUSTFLAGS=-Ctarget-feature=+crt-static) -endif() -if(RUST_NIGHTLY) - list(APPEND CARGO_BUILD -Z build-std=std,panic_abort) -endif() -if(NOT CMAKE_OSX_ARCHITECTURES AND (DEFINED CMAKE_RUST_COMPILER_TARGET OR RUST_NIGHTLY)) - if(DEFINED CMAKE_RUST_COMPILER_TARGET) - list(APPEND CARGO_TEST --target ${CMAKE_RUST_COMPILER_TARGET}) - set(RUST_TARGET ${CMAKE_RUST_COMPILER_TARGET}) - else() - set(RUST_TARGET ${RUST_TARGET_HOST}) - endif() - list(APPEND CARGO_BUILD --target ${RUST_TARGET}) - set(CARGO_BUILD_DIR "${RUST_TARGET}/") -endif() -set(CARGO_BUILD_DIR_DEBUG "${CARGO_BUILD_DIR}debug") -set(CARGO_BUILD_DIR_RELEASE "${CARGO_BUILD_DIR}release") -if(GENERATOR_IS_MULTI_CONFIG) - if(CMAKE_VERSION VERSION_LESS 3.20) - message(SEND_ERROR "Multi-config generators only supported from CMake 3.20 and up") - else() - set(CARGO_BUILD_DIR "${CARGO_BUILD_DIR}$<$:debug>$<$>:release>") - endif() -else() - if(CMAKE_BUILD_TYPE STREQUAL Debug) - set(CARGO_BUILD_DIR "${CARGO_BUILD_DIR_DEBUG}") - else() - set(CARGO_BUILD_DIR "${CARGO_BUILD_DIR_RELEASE}") - endif() -endif() -list(APPEND CARGO_BUILD $<$>:--release>) - -if(CMAKE_OSX_ARCHITECTURES) - set(RUST_OSX_ARCHITECTURES) - foreach(arch ${CMAKE_OSX_ARCHITECTURES}) - if(${arch} STREQUAL arm64) - list(APPEND RUST_OSX_ARCHITECTURES aarch64-apple-darwin) - elseif(${arch} STREQUAL x86_64) - list(APPEND RUST_OSX_ARCHITECTURES x86_64-apple-darwin) - else() - message(SEND_ERROR "CMAKE_OSX_ARCHITECTURES' architecture ${arch} unknown, can't build Rust code (known: arm64, x86_64)") - endif() - endforeach() -endif() - -set(RUST_SRC - ${RUST_BASE} - ${RUST_ENGINE_INTERFACE} - ${RUST_ENGINE_SHARED} - Cargo.toml - Cargo.lock -) -set(RUST_TARGETS engine_shared) -if(NOT CMAKE_OSX_ARCHITECTURES) - set(RUST_OUTPUTS) - foreach(rust_target ${RUST_TARGETS}) - set(LIBRARY_NAME "${CMAKE_STATIC_LIBRARY_PREFIX}ddnet_${rust_target}${CMAKE_STATIC_LIBRARY_SUFFIX}") - add_library(rust_${rust_target} STATIC IMPORTED GLOBAL) - add_custom_target(rust_${rust_target}_target DEPENDS "${PROJECT_BINARY_DIR}/${CARGO_BUILD_DIR}/${LIBRARY_NAME}") - add_dependencies(rust_${rust_target} rust_${rust_target}_target) - set_target_properties(rust_${rust_target} PROPERTIES - IMPORTED_LOCATION "${PROJECT_BINARY_DIR}/${CARGO_BUILD_DIR_RELEASE}/${LIBRARY_NAME}" - IMPORTED_LOCATION_DEBUG "${PROJECT_BINARY_DIR}/${CARGO_BUILD_DIR_DEBUG}/${LIBRARY_NAME}" - ) - list(APPEND RUST_OUTPUTS "${PROJECT_BINARY_DIR}/${CARGO_BUILD_DIR}/${LIBRARY_NAME}") - endforeach() - add_custom_command( - OUTPUT ${RUST_OUTPUTS} - COMMAND ${CARGO_BUILD} - WORKING_DIRECTORY ${PROJECT_BINARY_DIR} - USES_TERMINAL - DEPENDS ${RUST_SRC} - ) -else() - foreach(rust_target ${RUST_TARGETS}) - set(LIBRARY_NAME "${CMAKE_STATIC_LIBRARY_PREFIX}ddnet_${rust_target}${CMAKE_STATIC_LIBRARY_SUFFIX}") - add_library(rust_${rust_target} STATIC IMPORTED GLOBAL) - set_target_properties(rust_${rust_target} PROPERTIES - IMPORTED_LOCATION "${PROJECT_BINARY_DIR}/${CARGO_BUILD_DIR_RELEASE}/${LIBRARY_NAME}" - IMPORTED_LOCATION_DEBUG "${PROJECT_BINARY_DIR}/${CARGO_BUILD_DIR_DEBUG}/${LIBRARY_NAME}" - ) - add_custom_target(rust_${rust_target}_target DEPENDS "${PROJECT_BINARY_DIR}/${CARGO_BUILD_DIR}/${LIBRARY_NAME}") - add_dependencies(rust_${rust_target} rust_${rust_target}_target) - set(ARCH_LIBRARIES) - foreach(arch ${RUST_OSX_ARCHITECTURES}) - list(APPEND ARCH_LIBRARIES "${PROJECT_BINARY_DIR}/${arch}/${CARGO_BUILD_DIR}/${LIBRARY_NAME}") - endforeach() - add_custom_command( - OUTPUT "${PROJECT_BINARY_DIR}/${CARGO_BUILD_DIR}/${LIBRARY_NAME}" - COMMAND lipo ${ARCH_LIBRARIES} -create -output "${PROJECT_BINARY_DIR}/${CARGO_BUILD_DIR}/${LIBRARY_NAME}" - DEPENDS ${ARCH_LIBRARIES} - ) - endforeach() - foreach(arch ${RUST_OSX_ARCHITECTURES}) - set(RUST_OUTPUTS) - foreach(rust_target ${RUST_TARGETS}) - set(LIBRARY_NAME "${CMAKE_STATIC_LIBRARY_PREFIX}ddnet_${rust_target}${CMAKE_STATIC_LIBRARY_SUFFIX}") - list(APPEND RUST_OUTPUTS "${PROJECT_BINARY_DIR}/${arch}/${CARGO_BUILD_DIR}/${LIBRARY_NAME}") - endforeach() - add_custom_command( - OUTPUT ${RUST_OUTPUTS} - COMMAND ${CARGO_BUILD} --target=${arch} - WORKING_DIRECTORY ${PROJECT_BINARY_DIR} - USES_TERMINAL - DEPENDS ${RUST_SRC} - ) - endforeach() -endif() - ######################################################################## # DATA ######################################################################## set(EXPECTED_DATA announcement.txt - arrow.png - assets/entities/comfort/ddnet.png - assets/entities/license.txt - assets/game/game_06.png - audio/foley_body_impact-01.wv - audio/foley_body_impact-02.wv - audio/foley_body_impact-03.wv - audio/foley_body_splat-01.wv - audio/foley_body_splat-02.wv - audio/foley_body_splat-03.wv - audio/foley_body_splat-04.wv - audio/foley_dbljump-01.wv - audio/foley_dbljump-02.wv - audio/foley_dbljump-03.wv - audio/foley_foot_left-01.wv - audio/foley_foot_left-02.wv - audio/foley_foot_left-03.wv - audio/foley_foot_left-04.wv - audio/foley_foot_right-01.wv - audio/foley_foot_right-02.wv - audio/foley_foot_right-03.wv - audio/foley_foot_right-04.wv - audio/foley_land-01.wv - audio/foley_land-02.wv - audio/foley_land-03.wv - audio/foley_land-04.wv - audio/hook_attach-01.wv - audio/hook_attach-02.wv - audio/hook_attach-03.wv - audio/hook_loop-01.wv - audio/hook_loop-02.wv - audio/hook_noattach-01.wv - audio/hook_noattach-02.wv - audio/hook_noattach-03.wv - audio/music_menu.wv - audio/sfx_ctf_cap_pl.wv - audio/sfx_ctf_drop.wv - audio/sfx_ctf_grab_en.wv - audio/sfx_ctf_grab_pl.wv - audio/sfx_ctf_rtn.wv - audio/sfx_hit_strong-01.wv - audio/sfx_hit_strong-02.wv - audio/sfx_hit_weak-01.wv - audio/sfx_hit_weak-02.wv - audio/sfx_hit_weak-03.wv - audio/sfx_msg-client.wv - audio/sfx_msg-highlight.wv - audio/sfx_msg-server.wv - audio/sfx_pickup_arm-01.wv - audio/sfx_pickup_arm-02.wv - audio/sfx_pickup_arm-03.wv - audio/sfx_pickup_arm-04.wv - audio/sfx_pickup_gun.wv - audio/sfx_pickup_hrt-01.wv - audio/sfx_pickup_hrt-02.wv - audio/sfx_pickup_launcher.wv - audio/sfx_pickup_ninja.wv - audio/sfx_pickup_sg.wv - audio/sfx_skid-01.wv - audio/sfx_skid-02.wv - audio/sfx_skid-03.wv - audio/sfx_skid-04.wv - audio/sfx_spawn_wpn-01.wv - audio/sfx_spawn_wpn-02.wv - audio/sfx_spawn_wpn-03.wv - audio/vo_teefault_cry-01.wv - audio/vo_teefault_cry-02.wv - audio/vo_teefault_ninja-01.wv - audio/vo_teefault_ninja-02.wv - audio/vo_teefault_ninja-03.wv - audio/vo_teefault_ninja-04.wv - audio/vo_teefault_pain_long-01.wv - audio/vo_teefault_pain_long-02.wv - audio/vo_teefault_pain_short-01.wv - audio/vo_teefault_pain_short-02.wv - audio/vo_teefault_pain_short-03.wv - audio/vo_teefault_pain_short-04.wv - audio/vo_teefault_pain_short-05.wv - audio/vo_teefault_pain_short-06.wv - audio/vo_teefault_pain_short-07.wv - audio/vo_teefault_pain_short-08.wv - audio/vo_teefault_pain_short-09.wv - audio/vo_teefault_pain_short-10.wv - audio/vo_teefault_pain_short-11.wv - audio/vo_teefault_pain_short-12.wv - audio/vo_teefault_sledge-01.wv - audio/vo_teefault_sledge-02.wv - audio/vo_teefault_sledge-03.wv - audio/vo_teefault_spawn-01.wv - audio/vo_teefault_spawn-02.wv - audio/vo_teefault_spawn-03.wv - audio/vo_teefault_spawn-04.wv - audio/vo_teefault_spawn-05.wv - audio/vo_teefault_spawn-06.wv - audio/vo_teefault_spawn-07.wv - audio/wp_flump_explo-01.wv - audio/wp_flump_explo-02.wv - audio/wp_flump_explo-03.wv - audio/wp_flump_launch-01.wv - audio/wp_flump_launch-02.wv - audio/wp_flump_launch-03.wv - audio/wp_gun_fire-01.wv - audio/wp_gun_fire-02.wv - audio/wp_gun_fire-03.wv - audio/wp_hammer_hit-01.wv - audio/wp_hammer_hit-02.wv - audio/wp_hammer_hit-03.wv - audio/wp_hammer_swing-01.wv - audio/wp_hammer_swing-02.wv - audio/wp_hammer_swing-03.wv - audio/wp_laser_bnce-01.wv - audio/wp_laser_bnce-02.wv - audio/wp_laser_bnce-03.wv - audio/wp_laser_fire-01.wv - audio/wp_laser_fire-02.wv - audio/wp_laser_fire-03.wv - audio/wp_ninja_attack-01.wv - audio/wp_ninja_attack-02.wv - audio/wp_ninja_attack-03.wv - audio/wp_ninja_attack-04.wv - audio/wp_ninja_hit-01.wv - audio/wp_ninja_hit-02.wv - audio/wp_ninja_hit-03.wv - audio/wp_ninja_hit-04.wv - audio/wp_noammo-01.wv - audio/wp_noammo-02.wv - audio/wp_noammo-03.wv - audio/wp_noammo-04.wv - audio/wp_noammo-05.wv - audio/wp_shotty_fire-01.wv - audio/wp_shotty_fire-02.wv - audio/wp_shotty_fire-03.wv - audio/wp_switch-01.wv - audio/wp_switch-02.wv - audio/wp_switch-03.wv autoexec_server.cfg - background_noise.png - blob.png censorlist.txt - communityicons/none.png - countryflags/AD.png - countryflags/AE.png - countryflags/AF.png - countryflags/AG.png - countryflags/AI.png - countryflags/AL.png - countryflags/AM.png - countryflags/AO.png - countryflags/AQ.png - countryflags/AR.png - countryflags/AS.png - countryflags/AT.png - countryflags/AU.png - countryflags/AW.png - countryflags/AX.png - countryflags/AZ.png - countryflags/BA.png - countryflags/BB.png - countryflags/BD.png - countryflags/BE.png - countryflags/BF.png - countryflags/BG.png - countryflags/BH.png - countryflags/BI.png - countryflags/BJ.png - countryflags/BL.png - countryflags/BM.png - countryflags/BN.png - countryflags/BO.png - countryflags/BR.png - countryflags/BS.png - countryflags/BT.png - countryflags/BW.png - countryflags/BY.png - countryflags/BZ.png - countryflags/CA.png - countryflags/CC.png - countryflags/CD.png - countryflags/CF.png - countryflags/CG.png - countryflags/CH.png - countryflags/CI.png - countryflags/CK.png - countryflags/CL.png - countryflags/CM.png - countryflags/CN.png - countryflags/CO.png - countryflags/CR.png - countryflags/CU.png - countryflags/CV.png - countryflags/CW.png - countryflags/CX.png - countryflags/CY.png - countryflags/CZ.png - countryflags/DE.png - countryflags/DJ.png - countryflags/DK.png - countryflags/DM.png - countryflags/DO.png - countryflags/DZ.png - countryflags/EC.png - countryflags/EE.png - countryflags/EG.png - countryflags/EH.png - countryflags/ER.png - countryflags/ES-CT.png - countryflags/ES-GA.png - countryflags/ES.png - countryflags/ET.png - countryflags/EU.png - countryflags/FI.png - countryflags/FJ.png - countryflags/FK.png - countryflags/FM.png - countryflags/FO.png - countryflags/FR.png - countryflags/GA.png - countryflags/GB-ENG.png - countryflags/GB-NIR.png - countryflags/GB-SCT.png - countryflags/GB-WLS.png - countryflags/GB.png - countryflags/GD.png - countryflags/GE.png - countryflags/GF.png - countryflags/GG.png - countryflags/GH.png - countryflags/GI.png - countryflags/GL.png - countryflags/GM.png - countryflags/GN.png - countryflags/GP.png - countryflags/GQ.png - countryflags/GR.png - countryflags/GS.png - countryflags/GT.png - countryflags/GU.png - countryflags/GW.png - countryflags/GY.png - countryflags/HK.png - countryflags/HN.png - countryflags/HR.png - countryflags/HT.png - countryflags/HU.png - countryflags/ID.png - countryflags/IE.png - countryflags/IL.png - countryflags/IM.png - countryflags/IN.png - countryflags/IO.png - countryflags/IQ.png - countryflags/IR.png - countryflags/IS.png - countryflags/IT.png - countryflags/JE.png - countryflags/JM.png - countryflags/JO.png - countryflags/JP.png - countryflags/KE.png - countryflags/KG.png - countryflags/KH.png - countryflags/KI.png - countryflags/KM.png - countryflags/KN.png - countryflags/KP.png - countryflags/KR.png - countryflags/KW.png - countryflags/KY.png - countryflags/KZ.png - countryflags/LA.png - countryflags/LB.png - countryflags/LC.png - countryflags/LI.png - countryflags/LK.png - countryflags/LR.png - countryflags/LS.png - countryflags/LT.png - countryflags/LU.png - countryflags/LV.png - countryflags/LY.png - countryflags/MA.png - countryflags/MC.png - countryflags/MD.png - countryflags/ME.png - countryflags/MF.png - countryflags/MG.png - countryflags/MH.png - countryflags/MK.png - countryflags/ML.png - countryflags/MM.png - countryflags/MN.png - countryflags/MO.png - countryflags/MP.png - countryflags/MQ.png - countryflags/MR.png - countryflags/MS.png - countryflags/MT.png - countryflags/MU.png - countryflags/MV.png - countryflags/MW.png - countryflags/MX.png - countryflags/MY.png - countryflags/MZ.png - countryflags/NA.png - countryflags/NC.png - countryflags/NE.png - countryflags/NF.png - countryflags/NG.png - countryflags/NI.png - countryflags/NL.png - countryflags/NO.png - countryflags/NP.png - countryflags/NR.png - countryflags/NU.png - countryflags/NZ.png - countryflags/OM.png - countryflags/PA.png - countryflags/PE.png - countryflags/PF.png - countryflags/PG.png - countryflags/PH.png - countryflags/PK.png - countryflags/PL.png - countryflags/PM.png - countryflags/PN.png - countryflags/PR.png - countryflags/PS.png - countryflags/PT.png - countryflags/PW.png - countryflags/PY.png - countryflags/QA.png - countryflags/RE.png - countryflags/RO.png - countryflags/RS.png - countryflags/RU.png - countryflags/RW.png - countryflags/SA.png - countryflags/SB.png - countryflags/SC.png - countryflags/SD.png - countryflags/SE.png - countryflags/SG.png - countryflags/SH.png - countryflags/SI.png - countryflags/SK.png - countryflags/SL.png - countryflags/SM.png - countryflags/SN.png - countryflags/SO.png - countryflags/SR.png - countryflags/SS.png - countryflags/ST.png - countryflags/SV.png - countryflags/SX.png - countryflags/SY.png - countryflags/SZ.png - countryflags/TC.png - countryflags/TD.png - countryflags/TF.png - countryflags/TG.png - countryflags/TH.png - countryflags/TJ.png - countryflags/TK.png - countryflags/TL.png - countryflags/TM.png - countryflags/TN.png - countryflags/TO.png - countryflags/TR.png - countryflags/TT.png - countryflags/TV.png - countryflags/TW.png - countryflags/TZ.png - countryflags/UA.png - countryflags/UG.png - countryflags/US.png - countryflags/UY.png - countryflags/UZ.png - countryflags/VA.png - countryflags/VC.png - countryflags/VE.png - countryflags/VG.png - countryflags/VI.png - countryflags/VN.png - countryflags/VU.png - countryflags/WF.png - countryflags/WS.png - countryflags/YE.png - countryflags/ZA.png - countryflags/ZM.png - countryflags/ZW.png - countryflags/default.png - countryflags/index.txt - deadtee.png - debug_font.png - editor/audio_source.png - editor/automap/basic_freeze.rules - editor/automap/ddmax_freeze.rules - editor/automap/ddnet_grass.rules - editor/automap/ddnet_tiles.rules - editor/automap/ddnet_walls.rules - editor/automap/desert_main.rules - editor/automap/fadeout.rules - editor/automap/generic_clear.rules - editor/automap/generic_unhookable.rules - editor/automap/generic_unhookable_0.7.rules - editor/automap/grass_main.rules - editor/automap/jungle_main.rules - editor/automap/jungle_midground.rules - editor/automap/round_tiles.rules - editor/automap/water.rules - editor/automap/winter_main.rules - editor/checker.png - editor/cursor.png - editor/cursor_resize.png - editor/entities/DDNet.png - editor/entities/F-DDrace.png - editor/entities/FNG.png - editor/entities/Race.png - editor/entities/Vanilla.png - editor/entities/blockworlds.png - editor/entities_clear/blockworlds.png - editor/entities_clear/ddnet.png - editor/entities_clear/ddrace.png - editor/entities_clear/f-ddrace.png - editor/entities_clear/fng.png - editor/entities_clear/race.png - editor/entities_clear/vanilla.png - editor/front.png - editor/speed_arrow.png - editor/speed_arrow_array.png - editor/speedup.png - editor/switch.png - editor/tele.png - editor/tune.png - emoticons.png - extras.png - fonts/DejaVuSans.ttf - fonts/Font_Awesome_6_Free-Solid-900.otf - fonts/GlowSansJ-Compressed-Book.otf - fonts/SourceHanSans.ttc - fonts/index.json - game.png - gui_buttons.png - gui_cursor.png - gui_icons.png - gui_logo.png - hud.png - languages/arabic.txt - languages/azerbaijani.txt - languages/belarusian.txt - languages/bosnian.txt - languages/brazilian_portuguese.txt - languages/bulgarian.txt - languages/catalan.txt - languages/chuvash.txt - languages/czech.txt - languages/danish.txt - languages/dutch.txt - languages/esperanto.txt - languages/estonian.txt - languages/finnish.txt - languages/french.txt - languages/galician.txt - languages/german.txt - languages/greek.txt - languages/hungarian.txt - languages/index.txt - languages/italian.txt - languages/japanese.txt - languages/korean.txt - languages/kyrgyz.txt - languages/license.txt - languages/norwegian.txt - languages/persian.txt - languages/polish.txt - languages/portuguese.txt - languages/romanian.txt - languages/russian.txt - languages/serbian.txt - languages/serbian_cyrillic.txt - languages/simplified_chinese.txt - languages/slovak.txt - languages/spanish.txt - languages/swedish.txt - languages/traditional_chinese.txt - languages/turkish.txt - languages/ukrainian.txt - mapres/basic_freeze.png - mapres/bg_cloud1.png - mapres/bg_cloud2.png - mapres/bg_cloud3.png - mapres/ddmax_freeze.png - mapres/ddnet_grass.png - mapres/ddnet_start.png - mapres/ddnet_tiles.png - mapres/ddnet_walls.png - mapres/desert_background.png - mapres/desert_doodads.png - mapres/desert_main.png - mapres/desert_mountains.png - mapres/desert_mountains2.png - mapres/desert_mountains_new_background.png - mapres/desert_mountains_new_foreground.png - mapres/desert_sun.png - mapres/entities.png - mapres/fadeout.png - mapres/font_teeworlds.png - mapres/font_teeworlds_alt.png - mapres/generic_clear.png - mapres/generic_deathtiles.png - mapres/generic_lamps.png - mapres/generic_unhookable.png - mapres/generic_unhookable_0.7.png - mapres/grass_doodads.png - mapres/grass_doodads_0.7.png - mapres/grass_main.png - mapres/grass_main_0.7.png - mapres/jungle_background.png - mapres/jungle_deathtiles.png - mapres/jungle_doodads.png - mapres/jungle_main.png - mapres/jungle_midground.png - mapres/jungle_unhookables.png - mapres/light.png - mapres/mixed_tiles.png - mapres/moon.png - mapres/mountains.png - mapres/round_tiles.png - mapres/snow.png - mapres/snow_mountain.png - mapres/stars.png - mapres/sun.png - mapres/water.png - mapres/winter_doodads.png - mapres/winter_main.png - mapres/winter_main_0.7.png - mapres/winter_mountains.png - mapres/winter_mountains2.png - mapres/winter_mountains3.png - maps/Gold\ Mine.map - maps/LearnToPlay.map - maps/Sunny\ Side\ Up.map - maps/Tsunami.map - maps/Tutorial.map - maps/coverage.map maps/ctf1.map maps/ctf2.map maps/ctf3.map @@ -1556,296 +615,7 @@ set(EXPECTED_DATA maps/dm8.map maps/dm9.map maps/license.txt - maps7/Gold\ Mine.map - maps7/LearnToPlay.map - maps7/Sunny\ Side\ Up.map - maps7/Tsunami.map - maps7/Tutorial.map maps7/readme.txt - menuimages/demos.png - menuimages/editor.png - menuimages/local_server.png - menuimages/play_game.png - menuimages/settings.png - particles.png - race_flag.png - shader/pipeline.frag - shader/pipeline.vert - shader/prim.frag - shader/prim.vert - shader/primex.frag - shader/primex.vert - shader/quad.frag - shader/quad.vert - shader/spritemulti.frag - shader/spritemulti.vert - shader/text.frag - shader/text.vert - shader/tile.frag - shader/tile.vert - shader/tile_border.frag - shader/tile_border.vert - shader/vulkan/prim.frag - shader/vulkan/prim.vert - shader/vulkan/prim3d.frag - shader/vulkan/prim3d.vert - shader/vulkan/primex.frag - shader/vulkan/primex.vert - shader/vulkan/quad.frag - shader/vulkan/quad.vert - shader/vulkan/spritemulti.frag - shader/vulkan/spritemulti.vert - shader/vulkan/text.frag - shader/vulkan/text.vert - shader/vulkan/tile.frag - shader/vulkan/tile.vert - shader/vulkan/tile_border.frag - shader/vulkan/tile_border.vert - skins/PaladiN.png - skins/antiantey.png - skins/beast.png - skins/blacktee.png - skins/bluekitty.png - skins/bluestripe.png - skins/bomb.png - skins/brownbear.png - skins/cammo.png - skins/cammostripes.png - skins/chinese_by_whis.png - skins/coala.png - skins/coala_bluekitty.png - skins/coala_bluestripe.png - skins/coala_cammo.png - skins/coala_cammostripes.png - skins/coala_default.png - skins/coala_limekitty.png - skins/coala_pinky.png - skins/coala_redbopp.png - skins/coala_redstripe.png - skins/coala_saddo.png - skins/coala_toptri.png - skins/coala_twinbop.png - skins/coala_twintri.png - skins/coala_warpaint.png - skins/coala_x_ninja.png - skins/default.png - skins/demonlimekitty.png - skins/dino.png - skins/dragon.png - skins/evil.png - skins/evilwolfe.png - skins/ghost.png - skins/ghostjtj.png - skins/giraffe.png - skins/greensward.png - skins/greyfox.png - skins/greyfox_2.png - skins/hammie-chew.png - skins/hammie-whis.png - skins/jeet.png - skins/kintaro_2.png - skins/kitty_bluestripe.png - skins/kitty_brownbear.png - skins/kitty_cammo.png - skins/kitty_cammostripes.png - skins/kitty_coala.png - skins/kitty_default.png - skins/kitty_pinky.png - skins/kitty_redbopp.png - skins/kitty_redstripe.png - skins/kitty_saddo.png - skins/kitty_toptri.png - skins/kitty_twinbop.png - skins/kitty_twintri.png - skins/kitty_warpaint.png - skins/kitty_x_ninja.png - skins/license.txt - skins/limekitty.png - skins/mermydon-coala.png - skins/mermydon.png - skins/mouse.png - skins/musmann.png - skins/nanami.png - skins/nanas.png - skins/nersif.png - skins/oldman.png - skins/oldschool.png - skins/penguin.png - skins/pinky.png - skins/random.png - skins/redbopp.png - skins/redstripe.png - skins/saddo.png - skins/santa_bluekitty.png - skins/santa_bluestripe.png - skins/santa_brownbear.png - skins/santa_cammo.png - skins/santa_cammostripes.png - skins/santa_coala.png - skins/santa_default.png - skins/santa_limekitty.png - skins/santa_pinky.png - skins/santa_redbopp.png - skins/santa_redstripe.png - skins/santa_saddo.png - skins/santa_toptri.png - skins/santa_twinbop.png - skins/santa_twintri.png - skins/santa_warpaint.png - skins/teerasta.png - skins/toptri.png - skins/twinbop.png - skins/twintri.png - skins/veteran.png - skins/voodoo_tee.png - skins/warpaint.png - skins/wartee.png - skins/whis.png - skins/x_ninja.png - skins/x_spec.png - skins7/beaver.json - skins7/bluekitty.json - skins7/bluestripe.json - skins7/body/bat.png - skins7/body/bear.png - skins7/body/beaver.png - skins7/body/dog.png - skins7/body/force.png - skins7/body/fox.png - skins7/body/greensward.png - skins7/body/hippo.png - skins7/body/kitty.png - skins7/body/koala.png - skins7/body/monkey.png - skins7/body/mouse.png - skins7/body/piglet.png - skins7/body/raccoon.png - skins7/body/spiky.png - skins7/body/standard.png - skins7/body/x_ninja.png - skins7/bot.png - skins7/brownbear.json - skins7/bumbler.json - skins7/cammo.json - skins7/cammostripes.json - skins7/cavebat.json - skins7/decoration/hair.png - skins7/decoration/twinbopp.png - skins7/decoration/twinmello.png - skins7/decoration/twinpen.png - skins7/decoration/unibop.png - skins7/decoration/unimelo.png - skins7/decoration/unipento.png - skins7/default.json - skins7/eyes/colorable.png - skins7/eyes/negative.png - skins7/eyes/standard.png - skins7/eyes/standardreal.png - skins7/eyes/x_ninja.png - skins7/feet/standard.png - skins7/force.json - skins7/fox.json - skins7/greensward.json - skins7/greycoon.json - skins7/greyfox.json - skins7/hands/standard.png - skins7/hippo.json - skins7/koala.json - skins7/limedog.json - skins7/limekitty.json - skins7/marking/bear.png - skins7/marking/belly1.png - skins7/marking/belly2.png - skins7/marking/blush.png - skins7/marking/bug.png - skins7/marking/cammo1.png - skins7/marking/cammo2.png - skins7/marking/cammostripes.png - skins7/marking/coonfluff.png - skins7/marking/donny.png - skins7/marking/downdony.png - skins7/marking/duodonny.png - skins7/marking/fox.png - skins7/marking/hipbel.png - skins7/marking/lowcross.png - skins7/marking/lowpaint.png - skins7/marking/marksman.png - skins7/marking/mice.png - skins7/marking/mixture1.png - skins7/marking/mixture2.png - skins7/marking/monkey.png - skins7/marking/panda1.png - skins7/marking/panda2.png - skins7/marking/purelove.png - skins7/marking/saddo.png - skins7/marking/setisu.png - skins7/marking/sidemarks.png - skins7/marking/singu.png - skins7/marking/stripe.png - skins7/marking/striped.png - skins7/marking/stripes.png - skins7/marking/stripes2.png - skins7/marking/thunder.png - skins7/marking/tiger1.png - skins7/marking/tiger2.png - skins7/marking/toptri.png - skins7/marking/triangular.png - skins7/marking/tricircular.png - skins7/marking/tripledon.png - skins7/marking/tritri.png - skins7/marking/twinbelly.png - skins7/marking/twincross.png - skins7/marking/twintri.png - skins7/marking/uppy.png - skins7/marking/warpaint.png - skins7/marking/warstripes.png - skins7/marking/whisker.png - skins7/marking/wildpaint.png - skins7/marking/wildpatch.png - skins7/marking/yinyang.png - skins7/monkey.json - skins7/paintgre.json - skins7/pandabear.json - skins7/panther.json - skins7/pento.json - skins7/piggy.json - skins7/pinky.json - skins7/raccoon.json - skins7/redbopp.json - skins7/redstripe.json - skins7/saddo.json - skins7/setisu.json - skins7/snowti.json - skins7/spiky.json - skins7/swardy.json - skins7/tiger.json - skins7/tooxy.json - skins7/toptri.json - skins7/twinbop.json - skins7/twintri.json - skins7/warmouse.json - skins7/warpaint.json - skins7/x_ninja.json - skins7/xmas_hat.png - strong_weak.png - themes/auto.png - themes/autumn.png - themes/autumn_day.map - themes/autumn_night.map - themes/heavens.png - themes/heavens_day.map - themes/heavens_night.map - themes/jungle.png - themes/jungle_day.map - themes/jungle_night.map - themes/newyear.map - themes/newyear.png - themes/none.png - themes/rand.png - themes/winter.png - themes/winter_day.map - themes/winter_night.map - touch_controls.json wordlist.txt ) @@ -1866,19 +636,11 @@ set(INTEGRATION_TEST_COPY_FILES memcheck.supp ubsan.supp valgrind.supp - scripts/integration_test.sh ) set(COPY_FILES ${CURL_COPY_FILES} - ${FREETYPE_COPY_FILES} - ${OPUSFILE_COPY_FILES} - ${PNG_COPY_FILES} - ${SDL2_COPY_FILES} ${SQLite3_COPY_FILES} - ${FFMPEG_COPY_FILES} ${WEBSOCKETS_COPY_FILES} - ${DISCORDSDK_COPY_FILES} - ${VULKAN_COPY_FILES} ${EXCEPTION_HANDLING_COPY_FILES} ${SSP_COPY_FILES} ) @@ -1887,7 +649,6 @@ file(COPY ${COPY_FILES} DESTINATION .) # them in cpack. file(COPY ${INTEGRATION_TEST_COPY_FILES} DESTINATION .) -set(COPY_DIRS ${SDL2_COPY_DIRS}) file(COPY ${COPY_DIRS} DESTINATION .) ######################################################################## @@ -1961,8 +722,7 @@ add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src/game/generated/git_revision. ${GIT_REVISION_EXTRA_DEPS} scripts/git_revision.py ) -generate_source("src/game/generated/client_data.cpp" "client_content_source") -generate_source("src/game/generated/client_data.h" "client_content_header") + generate_source("src/game/generated/data_types.h" "content_types_header") generate_source("src/game/generated/protocol.cpp" "network_source") generate_source("src/game/generated/protocol.h" "network_header") @@ -1971,8 +731,6 @@ generate_source("src/game/generated/server_data.h" "server_content_header") generate_source7("src/game/generated/protocol7.cpp" "network_source") generate_source7("src/game/generated/protocol7.h" "network_header") -generate_source7("src/game/generated/client_data7.cpp" "client_content_source") -generate_source7("src/game/generated/client_data7.h" "client_content_header") generate_maps("src/game/generated/protocolglue.h" "map_header") generate_maps("src/game/generated/protocolglue.cpp" "map_source") @@ -2007,7 +765,6 @@ set_src(BASE GLOB_RECURSE src/base log.h logger.h math.h - rust.h system.cpp system.h tl/threading.h @@ -2022,36 +779,17 @@ set_src(BASE GLOB_RECURSE src/base ) set_src(ENGINE_INTERFACE GLOB src/engine antibot.h - client.h config.h console.h demo.h - discord.h - editor.h engine.h - favorites.h - friends.h - ghost.h - graphics.h http.h - image.h - input.h kernel.h - keys.h map.h message.h - notifications.h - rust.h server.h - serverbrowser.h - sound.h - sqlite.h - steam.h storage.h - textrender.h - updater.h uuid.h - warning.h ) set_src(ENGINE_SHARED GLOB_RECURSE src/engine/shared assertion_logger.cpp @@ -2103,7 +841,6 @@ set_src(ENGINE_SHARED GLOB_RECURSE src/engine/shared netban.h network.cpp network.h - network_client.cpp network_conn.cpp network_console.cpp network_console_conn.cpp @@ -2120,8 +857,6 @@ set_src(ENGINE_SHARED GLOB_RECURSE src/engine/shared protocolglue.h ringbuffer.cpp ringbuffer.h - serverinfo.cpp - serverinfo.h sixup_translate_snapshot.cpp snapshot.cpp snapshot.h @@ -2131,8 +866,6 @@ set_src(ENGINE_SHARED GLOB_RECURSE src/engine/shared teehistorian_ex.cpp teehistorian_ex.h teehistorian_ex_chunks.h - translation_context.cpp - translation_context.h uuid_manager.cpp uuid_manager.h video.cpp @@ -2140,13 +873,6 @@ set_src(ENGINE_SHARED GLOB_RECURSE src/engine/shared websockets.cpp websockets.h ) -set_src(ENGINE_GFX GLOB src/engine/gfx - image.cpp - image_loader.cpp - image_loader.h - image_manipulation.cpp - image_manipulation.h -) set_src(GAME_SHARED GLOB src/game alloc.h collision.cpp @@ -2217,449 +943,9 @@ set(LIBS ) # Targets -add_library(engine-gfx EXCLUDE_FROM_ALL OBJECT ${ENGINE_GFX}) -target_include_directories(engine-gfx PRIVATE ${PNG_INCLUDE_DIRS}) add_library(engine-shared EXCLUDE_FROM_ALL OBJECT ${ENGINE_INTERFACE} ${ENGINE_SHARED} ${ENGINE_UUID_SHARED} ${BASE}) add_library(game-shared EXCLUDE_FROM_ALL OBJECT ${GAME_SHARED} ${GAME_GENERATED_SHARED}) -list(APPEND TARGETS_OWN engine-gfx engine-shared game-shared) - -if(DISCORD AND NOT DISCORD_DYNAMIC) - add_library(discord-shared SHARED IMPORTED) - set_target_properties(discord-shared PROPERTIES - IMPORTED_LOCATION "${DISCORDSDK_LIBRARIES}" - IMPORTED_IMPLIB "${DISCORDSDK_LIBRARIES}" - ) -endif() - -######################################################################## -# CLIENT -######################################################################## - -if(CLIENT) - # Sources - set_src(STEAMAPI_SRC GLOB_RECURSE src/steam - steam_api_flat.h - steam_api_stub.cpp - ) - - if(STEAM OR TARGET_OS STREQUAL "windows" OR TARGET_OS STREQUAL "mac") - set(STEAMAPI_KIND SHARED) - else() - set(STEAMAPI_KIND STATIC) - endif() - set(TARGET_STEAMAPI steam_api) - add_library(${TARGET_STEAMAPI} ${STEAMAPI_KIND} ${STEAMAPI_SRC}) - list(APPEND TARGETS_OWN ${TARGET_STEAMAPI}) - - set_src(ENGINE_CLIENT GLOB_RECURSE src/engine/client - backend/backend_base.cpp - backend/backend_base.h - backend/glsl_shader_compiler.cpp - backend/glsl_shader_compiler.h - backend/null/backend_null.cpp - backend/null/backend_null.h - backend/opengl/backend_opengl.cpp - backend/opengl/backend_opengl.h - backend/opengl/backend_opengl3.cpp - backend/opengl/backend_opengl3.h - backend/opengl/opengl_sl.cpp - backend/opengl/opengl_sl.h - backend/opengl/opengl_sl_program.cpp - backend/opengl/opengl_sl_program.h - backend/opengles/backend_opengles.cpp - backend/opengles/backend_opengles3.cpp - backend/opengles/backend_opengles3.h - backend/opengles/gles_class_defines.h - backend/opengles/opengles_sl.cpp - backend/opengles/opengles_sl_program.cpp - backend/vulkan/backend_vulkan.cpp - backend/vulkan/backend_vulkan.h - backend_sdl.cpp - backend_sdl.h - blocklist_driver.cpp - blocklist_driver.h - checksum.h - client.cpp - client.h - demoedit.cpp - demoedit.h - discord.cpp - enums.h - favorites.cpp - friends.cpp - friends.h - ghost.cpp - ghost.h - graph.cpp - graph.h - graphics_defines.h - graphics_threaded.cpp - graphics_threaded.h - input.cpp - input.h - keynames.h - notifications.cpp - notifications.h - serverbrowser.cpp - serverbrowser.h - serverbrowser_http.cpp - serverbrowser_http.h - serverbrowser_ping_cache.cpp - serverbrowser_ping_cache.h - sixup_translate_system.cpp - smooth_time.cpp - smooth_time.h - sound.cpp - sound.h - sqlite.cpp - steam.cpp - text.cpp - updater.cpp - updater.h - video.cpp - video.h - warning.cpp - ) - set_src(GAME_CLIENT GLOB_RECURSE src/game/client - animstate.cpp - animstate.h - component.cpp - component.h - components/background.cpp - components/background.h - components/binds.cpp - components/binds.h - components/broadcast.cpp - components/broadcast.h - components/camera.cpp - components/camera.h - components/chat.cpp - components/chat.h - components/console.cpp - components/console.h - components/controls.cpp - components/controls.h - components/countryflags.cpp - components/countryflags.h - components/damageind.cpp - components/damageind.h - components/debughud.cpp - components/debughud.h - components/effects.cpp - components/effects.h - components/emoticon.cpp - components/emoticon.h - components/flow.cpp - components/flow.h - components/freezebars.cpp - components/freezebars.h - components/ghost.cpp - components/ghost.h - components/hud.cpp - components/hud.h - components/infomessages.cpp - components/infomessages.h - components/items.cpp - components/items.h - components/mapimages.cpp - components/mapimages.h - components/maplayers.cpp - components/maplayers.h - components/mapsounds.cpp - components/mapsounds.h - components/menu_background.cpp - components/menu_background.h - components/menus.cpp - components/menus.h - components/menus_browser.cpp - components/menus_demo.cpp - components/menus_ingame.cpp - components/menus_settings.cpp - components/menus_settings7.cpp - components/menus_settings_assets.cpp - components/menus_start.cpp - components/motd.cpp - components/motd.h - components/nameplates.cpp - components/nameplates.h - components/particles.cpp - components/particles.h - components/players.cpp - components/players.h - components/race_demo.cpp - components/race_demo.h - components/scoreboard.cpp - components/scoreboard.h - components/skins.cpp - components/skins.h - components/skins7.cpp - components/skins7.h - components/sounds.cpp - components/sounds.h - components/spectator.cpp - components/spectator.h - components/statboard.cpp - components/statboard.h - components/tooltips.cpp - components/tooltips.h - components/touch_controls.cpp - components/touch_controls.h - components/voting.cpp - components/voting.h - gameclient.cpp - gameclient.h - laser_data.cpp - laser_data.h - lineinput.cpp - lineinput.h - pickup_data.cpp - pickup_data.h - prediction/entities/character.cpp - prediction/entities/character.h - prediction/entities/dragger.cpp - prediction/entities/dragger.h - prediction/entities/laser.cpp - prediction/entities/laser.h - prediction/entities/pickup.cpp - prediction/entities/pickup.h - prediction/entities/projectile.cpp - prediction/entities/projectile.h - prediction/entity.cpp - prediction/entity.h - prediction/gameworld.cpp - prediction/gameworld.h - projectile_data.cpp - projectile_data.h - race.cpp - race.h - render.cpp - render.h - render_map.cpp - sixup_translate_game.cpp - sixup_translate_snapshot.cpp - skin.h - ui.cpp - ui.h - ui_listbox.cpp - ui_listbox.h - ui_rect.cpp - ui_rect.h - ui_scrollregion.cpp - ui_scrollregion.h - ) - set_src(GAME_EDITOR GLOB_RECURSE src/game/editor - auto_map.cpp - auto_map.h - component.cpp - component.h - editor.cpp - editor.h - editor_action.h - editor_actions.cpp - editor_actions.h - editor_history.cpp - editor_history.h - editor_object.cpp - editor_object.h - editor_props.cpp - editor_server_settings.cpp - editor_server_settings.h - editor_trackers.cpp - editor_trackers.h - editor_ui.h - enums.h - explanations.cpp - layer_selector.cpp - layer_selector.h - map_grid.cpp - map_grid.h - map_view.cpp - map_view.h - mapitems.h - mapitems/envelope.cpp - mapitems/envelope.h - mapitems/image.cpp - mapitems/image.h - mapitems/layer.h - mapitems/layer_front.cpp - mapitems/layer_front.h - mapitems/layer_game.cpp - mapitems/layer_game.h - mapitems/layer_group.cpp - mapitems/layer_group.h - mapitems/layer_quads.cpp - mapitems/layer_quads.h - mapitems/layer_sounds.cpp - mapitems/layer_sounds.h - mapitems/layer_speedup.cpp - mapitems/layer_speedup.h - mapitems/layer_switch.cpp - mapitems/layer_switch.h - mapitems/layer_tele.cpp - mapitems/layer_tele.h - mapitems/layer_tiles.cpp - mapitems/layer_tiles.h - mapitems/layer_tune.cpp - mapitems/layer_tune.h - mapitems/map.cpp - mapitems/map_io.cpp - mapitems/sound.cpp - mapitems/sound.h - popups.cpp - prompt.cpp - prompt.h - proof_mode.cpp - proof_mode.h - quick_action.h - quick_actions.cpp - quick_actions.h - smooth_value.cpp - smooth_value.h - tileart.cpp - ) - set(GAME_GENERATED_CLIENT - src/game/generated/checksum.cpp - src/game/generated/client_data.cpp - src/game/generated/client_data.h - src/game/generated/client_data7.cpp - src/game/generated/client_data7.h - ) - set(CLIENT_SRC ${ENGINE_CLIENT} ${PLATFORM_CLIENT} ${GAME_CLIENT} ${GAME_EDITOR} ${GAME_GENERATED_CLIENT}) - - set(DEPS_CLIENT ${DEPS} ${GLEW_DEP} ${WAVPACK_DEP}) - - # Libraries - set(LIBS_CLIENT - ${FREETYPE_LIBRARIES} - ${GLEW_LIBRARIES} - ${PNG_LIBRARIES} - ${SDL2_LIBRARIES} - ${WAVPACK_LIBRARIES} - ${FFMPEG_LIBRARIES} - - # Order of these three is important. - ${OPUSFILE_LIBRARIES} - ${OPUS_LIBRARIES} - ${OGG_LIBRARIES} - - ${VULKAN_LIBRARIES} - - ${TARGET_STEAMAPI} - rust_engine_shared - - ${PLATFORM_CLIENT_LIBS} - ${LIBS} - ) - - if(DISCORD) - if(NOT DISCORD_DYNAMIC) - list(APPEND LIBS_CLIENT discord-shared) - else() - list(APPEND LIBS_CLIENT ${CMAKE_DL_LIBS}) - endif() - endif() - - if(TARGET_OS STREQUAL "windows") - configure_file("other/manifest/client.manifest.in" "client.manifest") - set(CLIENT_ICON "other/icons/DDNet.rc") - if(NOT MINGW) - set(CLIENT_MANIFEST "${CMAKE_CURRENT_BINARY_DIR}/client.manifest") - else() - set(CLIENT_MANIFEST "other/manifest/client.rc") - set_target_properties(${TARGET_STEAMAPI} PROPERTIES PREFIX "") - endif() - else() - set(CLIENT_ICON) - set(CLIENT_MANIFEST) - endif() - - # Target - if(TARGET_OS STREQUAL "android") - add_library(game-client SHARED - ${CLIENT_SRC} - ${CLIENT_ICON} - ${CLIENT_MANIFEST} - ${DEPS_CLIENT} - $ - $ - $ - $ - ) - else() - add_executable(game-client WIN32 - ${CLIENT_SRC} - ${CLIENT_ICON} - ${CLIENT_MANIFEST} - ${DEPS_CLIENT} - $ - $ - $ - $ - ) - endif() - set_property(TARGET game-client - PROPERTY OUTPUT_NAME ${CLIENT_EXECUTABLE} - ) - target_link_libraries(game-client ${LIBS_CLIENT}) - - if(MSVC) - target_link_options(game-client PRIVATE /ENTRY:mainCRTStartup) - endif() - - target_include_directories(game-client SYSTEM PRIVATE - ${FREETYPE_INCLUDE_DIRS} - ${GLEW_INCLUDE_DIRS} - ${OGG_INCLUDE_DIRS} - ${OPUSFILE_INCLUDE_DIRS} - ${OPUS_INCLUDE_DIRS} - ${PNG_INCLUDE_DIRS} - ${SDL2_INCLUDE_DIRS} - ${WAVPACK_INCLUDE_DIRS} - ${FFMPEG_INCLUDE_DIRS} - ${DISCORDSDK_INCLUDE_DIRS} - - ${VULKAN_INCLUDE_DIRS} - - ${PLATFORM_CLIENT_INCLUDE_DIRS} - ) - - if(STEAMAPI_KIND STREQUAL SHARED OR DISCORD_DYNAMIC) - set_own_rpath(game-client) - endif() - - set(PARAMS "${WAVPACK_INCLUDE_DIRS};${WAVPACK_INCLUDE_DIRS}") - if(NOT(WAVPACK_OPEN_FILE_INPUT_EX_PARAMS STREQUAL PARAMS)) - unset(WAVPACK_OPEN_FILE_INPUT_EX CACHE) - endif() - set(WAVPACK_OPEN_FILE_INPUT_EX_PARAMS "${PARAMS}" CACHE INTERNAL "") - - set(CMAKE_REQUIRED_INCLUDES ${ORIGINAL_CMAKE_REQUIRED_INCLUDES} ${WAVPACK_INCLUDE_DIRS}) - set(CMAKE_REQUIRED_LIBRARIES ${ORIGINAL_CMAKE_REQUIRED_LIBRARIES} ${WAVPACK_LIBRARIES}) - check_symbol_exists(WavpackOpenFileInputEx wavpack.h WAVPACK_OPEN_FILE_INPUT_EX) - check_symbol_exists(WavpackCloseFile wavpack.h WAVPACK_CLOSE_FILE) - set(CMAKE_REQUIRED_INCLUDES ${ORIGINAL_CMAKE_REQUIRED_INCLUDES}) - set(CMAKE_REQUIRED_LIBRARIES ${ORIGINAL_CMAKE_REQUIRED_LIBRARIES}) - - if(WAVPACK_OPEN_FILE_INPUT_EX) - target_compile_definitions(game-client PRIVATE CONF_WAVPACK_OPEN_FILE_INPUT_EX) - endif() - - if(WAVPACK_CLOSE_FILE) - target_compile_definitions(game-client PRIVATE CONF_WAVPACK_CLOSE_FILE) - endif() - - if(GLEW_BUNDLED) - target_compile_definitions(game-client PRIVATE CONF_GLEW_HAS_CONTEXT_INIT) - endif() - - if(VULKAN) - target_compile_definitions(game-client PRIVATE CONF_BACKEND_VULKAN) - endif() - - list(APPEND TARGETS_OWN game-client) - list(APPEND TARGETS_LINK game-client) -endif() - +list(APPEND TARGETS_OWN engine-shared game-shared) ######################################################################## # SERVER @@ -2776,36 +1062,23 @@ if(SERVER) ${MINIUPNPC_LIBRARIES} ${MYSQL_LIBRARIES} ${TARGET_ANTIBOT} - rust_engine_shared ${LIBS} ) # Target - if(TARGET_OS STREQUAL "android") - add_library(game-server SHARED - ${DEPS} - ${SERVER_SRC} - ${SERVER_ICON} - $ - $ - $ - ) - else() - add_executable(game-server - ${DEPS} - ${SERVER_SRC} - ${SERVER_ICON} - $ - $ - $ - ) - endif() + add_executable(game-server + ${DEPS} + ${SERVER_SRC} + ${SERVER_ICON} + $ + $ + ) + set_property(TARGET game-server PROPERTY OUTPUT_NAME ${SERVER_EXECUTABLE} ) target_link_libraries(game-server ${LIBS_SERVER}) - target_include_directories(game-server PRIVATE ${PNG_INCLUDE_DIRS}) list(APPEND TARGETS_OWN game-server) list(APPEND TARGETS_LINK game-server) @@ -2823,250 +1096,14 @@ endif() # Targets for compatibility with build commands previously available with Makefiles if(CMAKE_GENERATOR MATCHES ".*Makefiles.*") - if(TARGET game-client) - add_custom_target(${CLIENT_EXECUTABLE}) - add_dependencies(${CLIENT_EXECUTABLE} game-client) - endif() - if(TARGET game-server) add_custom_target(${SERVER_EXECUTABLE}) add_dependencies(${SERVER_EXECUTABLE} game-server) endif() endif() -######################################################################## -# VARIOUS TARGETS -######################################################################## - -if(TOOLS) - set(TARGETS_TOOLS) - set_src(TOOLS_SRC GLOB src/tools - config_common.h - config_retrieve.cpp - config_store.cpp - crapnet.cpp - demo_extract_chat.cpp - dilate.cpp - dummy_map.cpp - map_convert_07.cpp - map_create_pixelart.cpp - map_diff.cpp - map_extract.cpp - map_find_env.cpp - map_optimize.cpp - map_replace_area.cpp - map_replace_image.cpp - map_resave.cpp - packetgen.cpp - stun.cpp - twping.cpp - unicode_confusables.cpp - uuid.cpp - ) - foreach(ABS_T ${TOOLS_SRC}) - file(RELATIVE_PATH T "${PROJECT_SOURCE_DIR}/src/tools/" ${ABS_T}) - if(T MATCHES "\\.cpp$") - string(REGEX REPLACE "\\.cpp$" "" TOOL "${T}") - set(TOOL_DEPS ${DEPS}) - set(TOOL_LIBS ${LIBS}) - unset(EXTRA_TOOL_SRC) - if(TOOL MATCHES "^(dilate|map_convert_07|map_create_pixelart|map_optimize|map_extract|map_replace_image)$") - list(APPEND TOOL_INCLUDE_DIRS ${PNG_INCLUDE_DIRS}) - list(APPEND TOOL_DEPS $) - list(APPEND TOOL_LIBS ${PNG_LIBRARIES}) - endif() - if(TOOL MATCHES "^config_") - list(APPEND EXTRA_TOOL_SRC "src/tools/config_common.h") - endif() - set(EXCLUDE_FROM_ALL) - if(DEV) - set(EXCLUDE_FROM_ALL EXCLUDE_FROM_ALL) - endif() - add_executable(${TOOL} ${EXCLUDE_FROM_ALL} - ${TOOL_DEPS} - src/tools/${TOOL}.cpp - ${EXTRA_TOOL_SRC} - $ - $ - ) - target_include_directories(${TOOL} SYSTEM PRIVATE ${TOOL_INCLUDE_DIRS}) - target_link_libraries(${TOOL} ${TOOL_LIBS}) - list(APPEND TARGETS_TOOLS ${TOOL}) - endif() - endforeach() - - list(APPEND TARGETS_OWN ${TARGETS_TOOLS}) - list(APPEND TARGETS_LINK ${TARGETS_TOOLS}) - - add_custom_target(tools DEPENDS ${TARGETS_TOOLS}) -endif() add_custom_target(everything DEPENDS ${TARGETS_OWN}) -######################################################################## -# CHECKSUM -######################################################################## - -if(DEV) - # Only do minimal checksumming in a DEV build. - set(CHECKSUM_SRC) -endif() -list(APPEND CHECKSUM_SRC - ${PROJECT_SOURCE_DIR}/CMakeLists.txt - ${PROJECT_SOURCE_DIR}/scripts/checksum.py -) -configure_file(cmake/checksummed_extra.txt checksummed_extra.txt) -string(REPLACE ";" "\n" CHECKSUM_SRC_FILE "${CHECKSUM_SRC}") -file(WRITE ${PROJECT_BINARY_DIR}/checksummed_files.txt ${CHECKSUM_SRC_FILE}) - -add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src/game/generated/checksum.cpp - COMMAND ${Python3_EXECUTABLE} - scripts/checksum.py - ${PROJECT_BINARY_DIR}/checksummed_files.txt - ${PROJECT_BINARY_DIR}/checksummed_extra.txt - > ${PROJECT_BINARY_DIR}/src/game/generated/checksum.cpp - WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - DEPENDS - ${CHECKSUM_SRC} - ${PROJECT_BINARY_DIR}/checksummed_files.txt - ${PROJECT_BINARY_DIR}/checksummed_extra.txt - scripts/checksum.py -) - -######################################################################## -# TESTS -######################################################################## - -if(GTEST_FOUND OR DOWNLOAD_GTEST) - set_src(TESTS GLOB src/test - aio.cpp - bezier.cpp - blocklist_driver.cpp - bytes_be.cpp - color.cpp - compression.cpp - csv.cpp - datafile.cpp - editor.cpp - fs.cpp - git_revision.cpp - hash.cpp - huffman.cpp - io.cpp - jobs.cpp - json.cpp - jsonwriter.cpp - linereader.cpp - mapbugs.cpp - math.cpp - memory.cpp - name_ban.cpp - net.cpp - netaddr.cpp - os.cpp - packer.cpp - prng.cpp - score.cpp - secure_random.cpp - serverbrowser.cpp - serverinfo.cpp - snapshot.cpp - str.cpp - strip_path_and_extension.cpp - swap_endian.cpp - teehistorian.cpp - test.cpp - test.h - thread.cpp - timestamp.cpp - unix.cpp - uuid.cpp - ) - set(TESTS_EXTRA - src/engine/client/blocklist_driver.cpp - src/engine/client/blocklist_driver.h - src/engine/client/serverbrowser.cpp - src/engine/client/serverbrowser.h - src/engine/client/serverbrowser_http.cpp - src/engine/client/serverbrowser_http.h - src/engine/client/serverbrowser_ping_cache.cpp - src/engine/client/serverbrowser_ping_cache.h - src/engine/client/sqlite.cpp - src/engine/server/databases/connection.cpp - src/engine/server/databases/connection.h - src/engine/server/databases/sqlite.cpp - src/engine/server/databases/mysql.cpp - src/engine/server/name_ban.cpp - src/engine/server/name_ban.h - src/engine/server/sql_string_helpers.cpp - src/engine/server/sql_string_helpers.h - src/game/server/teehistorian.cpp - src/game/server/teehistorian.h - src/game/server/scoreworker.cpp - src/game/server/scoreworker.h - ) - - set(TARGET_TESTRUNNER testrunner) - add_executable(${TARGET_TESTRUNNER} EXCLUDE_FROM_ALL - ${TESTS} - ${TESTS_EXTRA} - $ - $ - $ - ${DEPS} - ) - target_link_libraries(${TARGET_TESTRUNNER} ${MYSQL_LIBRARIES} ${PNG_LIBRARIES} ${GTEST_LIBRARIES} ${LIBS}) - target_include_directories(${TARGET_TESTRUNNER} SYSTEM PRIVATE ${GTEST_INCLUDE_DIRS}) - - list(APPEND TARGETS_OWN ${TARGET_TESTRUNNER}) - list(APPEND TARGETS_LINK ${TARGET_TESTRUNNER}) - - add_custom_target(run_cxx_tests - COMMAND $ ${TESTRUNNER_ARGS} - COMMENT Running unit tests - DEPENDS ${TARGET_TESTRUNNER} - USES_TERMINAL - ) - add_custom_target(run_tests - DEPENDS run_cxx_tests - ) - if(NOT MSVC OR CMAKE_BUILD_TYPE STREQUAL Release) - # On MSVC, Rust tests only work in the release mode because we link our C++ - # code with the debug C standard library (/MTd) but Rust only supports - # linking to the release C standard library (/MT). - # - # See also https://github.com/rust-lang/rust/issues/39016. - add_dependencies(run_tests run_rust_tests) - endif() -endif() - -add_library(rust_test STATIC EXCLUDE_FROM_ALL - $ - $ - $ - $ - ${DEPS} -) - -list(APPEND TARGETS_OWN rust_test) -list(APPEND TARGETS_LINK rust_test) - -set(RUST_TEST_LIBS ${LIBS} $) -list(REMOVE_ITEM RUST_TEST_LIBS "-pthread") -add_custom_target(run_rust_tests - COMMAND ${CMAKE_COMMAND} -E env "DDNET_TEST_LIBRARIES=${RUST_TEST_LIBS}" ${CARGO_TEST} - WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - USES_TERMINAL - DEPENDS rust_test - VERBATIM -) - -add_custom_target(run_integration_tests - COMMAND ${PROJECT_BINARY_DIR}/integration_test.sh ${INTEGRATIONTESTRUNNER_ARGS} - COMMENT Running integration tests - DEPENDS game-client game-server - USES_TERMINAL -) - ######################################################################## # INSTALLATION ######################################################################## @@ -3223,33 +1260,10 @@ endforeach() set(CMAKE_INSTALL_DEFAULT_COMPONENT_NAME ${PROJECT_NAME}) -if(TOOLS) - set(TARGET_TOOLS - config_retrieve - config_store - demo_extract_chat - dilate - map_convert_07 - map_create_pixelart - map_diff - map_extract - ) -else() - set(TARGET_TOOLS) -endif() - set(CPACK_TARGETS) -if(TARGET game-client) - list(APPEND CPACK_TARGETS game-client) -endif() if(TARGET game-server) list(APPEND CPACK_TARGETS game-server) endif() -list(APPEND CPACK_TARGETS ${TARGET_TOOLS}) - -if(STEAMAPI_KIND STREQUAL SHARED) - list(APPEND CPACK_TARGETS ${TARGET_STEAMAPI}) -endif() set(CPACK_DIRS data ${COPY_DIRS} @@ -3260,10 +1274,6 @@ set(CPACK_FILES ${COPY_FILES} ) -set(CPACK_GEN_FILES - ${VULKAN_SHADER_FILE_LIST} -) - if(TARGET_OS STREQUAL "windows") list(APPEND CPACK_FILES other/config_directory.bat) else() @@ -3273,33 +1283,17 @@ endif() if(NOT DEV) include(GNUInstallDirs) install(DIRECTORY data DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/ddnet COMPONENT data) - if(TARGET game-client) - install(TARGETS game-client DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT client) - endif() - if(STEAMAPI_KIND STREQUAL SHARED) - install(TARGETS ${TARGET_STEAMAPI} DESTINATION ${CMAKE_INSTALL_LIBDIR}/ddnet COMPONENT client) - endif() if(TARGET game-server) install(TARGETS game-server DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT server) endif() if(ANTIBOT) install(TARGETS ${TARGET_ANTIBOT} DESTINATION ${CMAKE_INSTALL_LIBDIR}/ddnet COMPONENT server) endif() - install(TARGETS ${TARGETS_TOOLS} DESTINATION ${CMAKE_INSTALL_LIBDIR}/ddnet COMPONENT tools) - if(TARGET game-client) - install(FILES other/ddnet.desktop DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications COMPONENT client) - endif() foreach(SIZE 16 32 48 256) - if(TARGET game-client) - install(FILES other/icons/DDNet_${SIZE}x${SIZE}x32.png DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/${SIZE}x${SIZE}/apps RENAME ddnet.png COMPONENT client) - endif() if(TARGET game-server) install(FILES other/icons/DDNet-Server_${SIZE}x${SIZE}x32.png DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/${SIZE}x${SIZE}/apps RENAME ddnet-server.png COMPONENT server) endif() endforeach() - foreach(file ${VULKAN_SHADER_FILE_LIST}) - install(FILES ${PROJECT_BINARY_DIR}/${file} DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/ddnet/data/shader/vulkan COMPONENT client) - endforeach() endif() if(DEV) @@ -3308,92 +1302,11 @@ else() set(EXTRA_ARGS DESTINATION ${CPACK_PACKAGE_FILE_NAME} COMPONENT portable EXCLUDE_FROM_ALL) install(TARGETS ${CPACK_TARGETS} ${EXTRA_ARGS}) install(DIRECTORY ${CPACK_DIRS} ${EXTRA_ARGS}) - set(CPACK_FILES_TMP ${CPACK_FILES} ${CPACK_GEN_FILES}) + set(CPACK_FILES_TMP ${CPACK_FILES}) install(FILES ${CPACK_FILES_TMP} ${EXTRA_ARGS}) endif() set(PACKAGE_TARGETS) -if(CLIENT AND DMGBUILD) - file(MAKE_DIRECTORY bundle/client/) - file(MAKE_DIRECTORY bundle/server/) - configure_file(other/bundle/client/Info.plist.in bundle/client/Info.plist) - configure_file(other/bundle/server/Info.plist.in bundle/server/Info.plist) - - set(DMG_TMPDIR pack_${CPACK_PACKAGE_FILE_NAME}_dmg) - set(DMG_MKDIRS - ${CLIENT_EXECUTABLE}.app - ${CLIENT_EXECUTABLE}.app/Contents - ${CLIENT_EXECUTABLE}.app/Contents/Frameworks - ${CLIENT_EXECUTABLE}.app/Contents/MacOS - ${CLIENT_EXECUTABLE}.app/Contents/Resources - ${SERVER_EXECUTABLE}.app - ${SERVER_EXECUTABLE}.app/Contents - ${SERVER_EXECUTABLE}.app/Contents/MacOS - ${SERVER_EXECUTABLE}.app/Contents/Resources - ${SERVER_EXECUTABLE}.app/Contents/Resources/data - ${SERVER_EXECUTABLE}.app/Contents/Resources/data/mapres - ) - set(DMG_MKDIR_COMMANDS) - foreach(dir ${DMG_MKDIRS}) - list(APPEND DMG_MKDIR_COMMANDS COMMAND ${CMAKE_COMMAND} -E make_directory ${DMG_TMPDIR}/${dir}) - endforeach() - - set(TARGET_TOOLS_FILES) - foreach(target ${TARGET_TOOLS}) - list(APPEND TARGET_TOOLS_FILES $) - endforeach() - - add_custom_command(OUTPUT ${CPACK_PACKAGE_FILE_NAME}.dmg - COMMAND ${CMAKE_COMMAND} -E remove_directory ${DMG_TMPDIR} - ${DMG_MKDIR_COMMANDS} - - # CLIENT - COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/data ${DMG_TMPDIR}/${CLIENT_EXECUTABLE}.app/Contents/Resources/data - COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/other/icons/${CLIENT_EXECUTABLE}.icns ${DMG_TMPDIR}/${CLIENT_EXECUTABLE}.app/Contents/Resources/ - COMMAND ${CMAKE_COMMAND} -E copy bundle/client/Info.plist ${PROJECT_SOURCE_DIR}/other/bundle/client/PkgInfo ${DMG_TMPDIR}/${CLIENT_EXECUTABLE}.app/Contents/ - COMMAND ${CMAKE_COMMAND} -E copy $ ${TARGET_TOOLS_FILES} ${DMG_TMPDIR}/${CLIENT_EXECUTABLE}.app/Contents/MacOS/ - COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/ddnet-libs/sdl/${LIB_DIR}/SDL2.framework ${DMG_TMPDIR}/${CLIENT_EXECUTABLE}.app/Contents/Frameworks/SDL2.framework - COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/ddnet-libs/discord/${LIB_DIR}/discord_game_sdk.dylib ${DMG_TMPDIR}/${CLIENT_EXECUTABLE}.app/Contents/Frameworks/ - COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/ddnet-libs/freetype/${LIB_DIR}/libfreetype.6.dylib ${DMG_TMPDIR}/${CLIENT_EXECUTABLE}.app/Contents/Frameworks/ - COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/ddnet-libs/png/${LIB_DIR}/libpng16.16.dylib ${DMG_TMPDIR}/${CLIENT_EXECUTABLE}.app/Contents/Frameworks/ - COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/ddnet-libs/ffmpeg/${LIB_DIR}/libavcodec.61.dylib ${DMG_TMPDIR}/${CLIENT_EXECUTABLE}.app/Contents/Frameworks/ - COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/ddnet-libs/ffmpeg/${LIB_DIR}/libavformat.61.dylib ${DMG_TMPDIR}/${CLIENT_EXECUTABLE}.app/Contents/Frameworks/ - COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/ddnet-libs/ffmpeg/${LIB_DIR}/libavutil.59.dylib ${DMG_TMPDIR}/${CLIENT_EXECUTABLE}.app/Contents/Frameworks/ - COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/ddnet-libs/ffmpeg/${LIB_DIR}/libswresample.5.dylib ${DMG_TMPDIR}/${CLIENT_EXECUTABLE}.app/Contents/Frameworks/ - COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/ddnet-libs/ffmpeg/${LIB_DIR}/libswscale.8.dylib ${DMG_TMPDIR}/${CLIENT_EXECUTABLE}.app/Contents/Frameworks/ - COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/libsteam_api.dylib ${DMG_TMPDIR}/${CLIENT_EXECUTABLE}.app/Contents/Frameworks/ - COMMAND ${Python3_EXECUTABLE} ${PROJECT_SOURCE_DIR}/scripts/darwin_strip_rpath.py ${CMAKE_OTOOL} ${CMAKE_INSTALL_NAME_TOOL} ${DMG_TMPDIR}/${CLIENT_EXECUTABLE}.app/Contents/MacOS/${CLIENT_EXECUTABLE} - COMMAND ${CMAKE_INSTALL_NAME_TOOL} -add_rpath @loader_path/../Frameworks ${DMG_TMPDIR}/${CLIENT_EXECUTABLE}.app/Contents/MacOS/${CLIENT_EXECUTABLE} - - # SERVER - COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/data/maps ${DMG_TMPDIR}/${SERVER_EXECUTABLE}.app/Contents/Resources/data/maps - COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/other/icons/${SERVER_EXECUTABLE}.icns ${DMG_TMPDIR}/${SERVER_EXECUTABLE}.app/Contents/Resources/ - COMMAND ${CMAKE_COMMAND} -E copy bundle/server/Info.plist ${PROJECT_SOURCE_DIR}/other/bundle/server/PkgInfo ${DMG_TMPDIR}/${SERVER_EXECUTABLE}.app/Contents/ - COMMAND ${CMAKE_COMMAND} -E copy $ $ ${DMG_TMPDIR}/${SERVER_EXECUTABLE}.app/Contents/MacOS/ - COMMAND ${Python3_EXECUTABLE} ${PROJECT_SOURCE_DIR}/scripts/darwin_strip_rpath.py ${CMAKE_OTOOL} ${CMAKE_INSTALL_NAME_TOOL} ${DMG_TMPDIR}/${SERVER_EXECUTABLE}.app/Contents/MacOS/${SERVER_EXECUTABLE} - COMMAND ${CMAKE_COMMAND} -E copy ${DMG_TMPDIR}/${SERVER_EXECUTABLE}.app/Contents/MacOS/${SERVER_EXECUTABLE} ${DMG_TMPDIR}/${CLIENT_EXECUTABLE}.app/Contents/MacOS/${SERVER_EXECUTABLE} - - # DMG - COMMAND dmgbuild -s ${PROJECT_SOURCE_DIR}/other/dmgsettings.py -D client=${DMG_TMPDIR}/${CLIENT_EXECUTABLE}.app -D server=${DMG_TMPDIR}/${SERVER_EXECUTABLE}.app -D background=${PROJECT_SOURCE_DIR}/other/dmgbackground.png "${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION}" ${CPACK_PACKAGE_FILE_NAME}.dmg - - DEPENDS - game-client - ${TARGET_STEAMAPI} - game-server-launcher - game-server - ${PROJECT_BINARY_DIR}/bundle/client/Info.plist - ${PROJECT_BINARY_DIR}/bundle/server/Info.plist - data - other/bundle/client/PkgInfo - other/bundle/server/PkgInfo - other/dmgbackground.png - other/dmgsettings.py - other/icons/${CLIENT_EXECUTABLE}.icns - other/icons/${SERVER_EXECUTABLE}.icns - ) - add_custom_target(package_dmg DEPENDS ${CPACK_PACKAGE_FILE_NAME}.dmg) - list(APPEND PACKAGE_TARGETS package_dmg) -endif() foreach(ext zip tar.gz tar.xz) set(TAR_MODE c) @@ -3409,9 +1322,6 @@ foreach(ext zip tar.gz tar.xz) foreach(file ${CPACK_FILES}) list(APPEND COPY_FILE_COMMANDS COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/${file} ${TMPDIR}/) endforeach() - foreach(file ${CPACK_GEN_FILES}) - list(APPEND COPY_FILE_COMMANDS COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/${file} ${TMPDIR}/${file}) - endforeach() foreach(dir ${CPACK_DIRS}) list(APPEND COPY_DIR_COMMANDS COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/${dir} ${TMPDIR}/${dir}) endforeach() @@ -3459,7 +1369,6 @@ unset(CPACK_SOURCE_FILES_INVERTED) unset(CPACK_TARGETS) unset(CPACK_DIRS) unset(CPACK_FILES) -unset(CPACK_GEN_FILES) include(CPack) @@ -3558,10 +1467,8 @@ foreach(target ${TARGETS_OWN}) endif() target_include_directories(${target} PRIVATE ${PROJECT_BINARY_DIR}/src) target_include_directories(${target} PRIVATE src) - target_include_directories(${target} PRIVATE src/rust-bridge) target_compile_definitions(${target} PRIVATE $<$:CONF_DEBUG>) target_include_directories(${target} SYSTEM PRIVATE ${CURL_INCLUDE_DIRS} ${SQLite3_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS}) - target_compile_definitions(${target} PRIVATE GLEW_STATIC) target_compile_definitions(${target} PRIVATE _FILE_OFFSET_BITS=64) # Ensure off_t is 64 bit for ftello and fseeko functions if(CRYPTO_FOUND) target_compile_definitions(${target} PRIVATE CONF_OPENSSL) @@ -3581,44 +1488,14 @@ foreach(target ${TARGETS_OWN}) if(ANTIBOT) target_compile_definitions(${target} PRIVATE CONF_ANTIBOT) endif() - if(HEADLESS_CLIENT) - target_compile_definitions(${target} PRIVATE CONF_HEADLESS_CLIENT) - endif() if(MYSQL) target_compile_definitions(${target} PRIVATE CONF_MYSQL) target_include_directories(${target} SYSTEM PRIVATE ${MYSQL_INCLUDE_DIRS}) endif() - if(TEST_MYSQL) - target_compile_definitions(${target} PRIVATE CONF_TEST_MYSQL) - endif() - if(AUTOUPDATE AND NOT STEAM) - target_compile_definitions(${target} PRIVATE CONF_AUTOUPDATE) - endif() - if(INFORM_UPDATE AND NOT STEAM) - target_compile_definitions(${target} PRIVATE CONF_INFORM_UPDATE) - endif() - if(STEAM) - target_compile_definitions(${target} PRIVATE PLATFORM_SUFFIX="-steam") - endif() - if(DISCORD) - target_compile_definitions(${target} PRIVATE CONF_DISCORD) - if(DISCORD_DYNAMIC) - target_compile_definitions(${target} PRIVATE CONF_DISCORD_DYNAMIC) - endif() - endif() if(VERSION) target_compile_definitions(${target} PRIVATE GAME_RELEASE_VERSION="${VERSION}") endif() - if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") - target_compile_definitions(${target} PRIVATE CONF_WEBASM) - endif() - if(TARGET_OS STREQUAL "android") - if(ANDROID_PACKAGE_NAME) - target_compile_definitions(${target} PRIVATE ANDROID_PACKAGE_NAME=${ANDROID_PACKAGE_NAME}) - else() - message(FATAL_ERROR "ANDROID_PACKAGE_NAME must define the package name when compiling for Android (using underscores instead of dots, e.g. org_example_app)") - endif() - endif() + endforeach() foreach(target ${TARGETS_DEP}) diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index 507539cde0..0000000000 --- a/Cargo.lock +++ /dev/null @@ -1,114 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "cc" -version = "1.0.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" - -[[package]] -name = "cxx" -version = "1.0.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5469a6f42296f4fd40789b397383718f9a0bd75d2f9b7cedbb249996811fba27" -dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", -] - -[[package]] -name = "cxxbridge-flags" -version = "1.0.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fef2b4ffdc935c973bc7817d541fc936fdc8a85194cfdd9c761aca8387edd48" - -[[package]] -name = "cxxbridge-macro" -version = "1.0.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d3a240a54f5526967ffae81fdcda1fc80564964220d90816960b2eae2eab7f4" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "ddnet-base" -version = "0.0.1" -dependencies = [ - "cxx", - "ddnet-test", -] - -[[package]] -name = "ddnet-engine" -version = "0.0.1" -dependencies = [ - "cxx", - "ddnet-base", - "ddnet-engine-shared", - "ddnet-test", -] - -[[package]] -name = "ddnet-engine-shared" -version = "0.0.1" -dependencies = [ - "cxx", - "ddnet-base", - "ddnet-engine", - "ddnet-test", -] - -[[package]] -name = "ddnet-test" -version = "0.0.1" - -[[package]] -name = "link-cplusplus" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cae2cd7ba2f3f63938b9c724475dfb7b9861b545a90324476324ed21dbc8c8" -dependencies = [ - "cc", -] - -[[package]] -name = "proc-macro2" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "syn" -version = "1.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "unicode-ident" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" diff --git a/Cargo.toml b/Cargo.toml deleted file mode 100644 index c511beee3b..0000000000 --- a/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[workspace] -members = [ - "src/base", - "src/engine", - "src/engine/shared", - "src/rust-bridge/test", -] - -resolver = "2" - -[profile.dev] -panic = "abort" - -[profile.release] -lto = "thin" -panic = "abort" diff --git a/Dockerfile b/Dockerfile index 75633ba14a..6f8cc62a90 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,39 +16,14 @@ RUN apt-get update && apt-get install -y gcc-mingw-w64-x86-64-posix \ build-essential \ python3 \ libcurl4-openssl-dev \ - libfreetype6-dev \ - libglew-dev \ - libogg-dev \ - libopus-dev \ - libpng-dev \ - libwavpack-dev \ - libopusfile-dev \ - libsdl2-dev \ cmake \ - glslang-tools \ - libavcodec-extra \ - libavdevice-dev \ - libavfilter-dev \ - libavformat-dev \ - libavutil-dev \ libcurl4-openssl-dev \ - libnotify-dev \ libsqlite3-dev \ libssl-dev \ - libvulkan-dev \ - libx264-dev \ spirv-tools \ curl -RUN curl https://sh.rustup.rs -sSf | \ - sh -s -- --default-toolchain stable -y - -RUN ~/.cargo/bin/rustup toolchain install stable -RUN ~/.cargo/bin/rustup target add i686-pc-windows-gnu -RUN ~/.cargo/bin/rustup target add x86_64-pc-windows-gnu - RUN printf '#!/bin/bash\n \ - export PATH=$PATH:$HOME/.cargo/bin\n \ set -x\n \ mkdir /build\n \ mkdir /build/linux\n \ diff --git a/README.md b/README.md index ab13f4c1b1..406c8ceb55 100644 --- a/README.md +++ b/README.md @@ -1,392 +1,5 @@ -[![DDraceNetwork](https://ddnet.org/ddnet-small.png)](https://ddnet.org) [![](https://github.com/ddnet/ddnet/workflows/Build/badge.svg)](https://github.com/ddnet/ddnet/actions?query=workflow%3ABuild+event%3Apush+branch%3Amaster) [![](https://codecov.io/gh/ddnet/ddnet/branch/master/graph/badge.svg)](https://codecov.io/gh/ddnet/ddnet/branch/master) +DDNet PvP +=== -Our own flavor of DDRace, a Teeworlds mod. See the [website](https://ddnet.org) for more information. +[Info to be added] -Development discussions happen on #ddnet on Quakenet ([Webchat](http://webchat.quakenet.org/?channels=ddnet&uio=d4)) or on [Discord in the developer channel](https://discord.gg/xsEd9xu). - -You can get binary releases on the [DDNet website](https://ddnet.org/downloads/), find it on [Steam](https://store.steampowered.com/app/412220/DDraceNetwork/) or [install from repository](#installation-from-repository). - -- [Code Browser](https://ddnet.org/codebrowser/DDNet/) -- [Source Code Documentation](https://codedoc.ddnet.org/) (very incomplete, only a few items are documented) -- [Contributing Guide](CONTRIBUTING.md) - -If you want to learn about the source code, you can check the [Development](https://wiki.ddnet.org/wiki/Development) article on the wiki. - -Cloning -------- - -To clone this repository with full history and external libraries (~350 MB): - - git clone --recursive https://github.com/ddnet/ddnet - -To clone this repository with full history when you have the necessary libraries on your system already (~220 MB): - - git clone https://github.com/ddnet/ddnet - -To clone this repository with history since we moved the libraries to https://github.com/ddnet/ddnet-libs (~40 MB): - - git clone --shallow-exclude=included-libs https://github.com/ddnet/ddnet - -To clone the libraries if you have previously cloned DDNet without them, or if you require the ddnet-libs history instead of a shallow clone: - - git submodule update --init --recursive - -Dependencies on Linux / macOS ------------------------------ - -You can install the required libraries on your system, `touch CMakeLists.txt` and CMake will use the system-wide libraries by default. You can install all required dependencies and CMake on Debian or Ubuntu like this: - - sudo apt install build-essential cargo cmake git glslang-tools google-mock libavcodec-extra libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev libcurl4-openssl-dev libfreetype6-dev libglew-dev libnotify-dev libogg-dev libopus-dev libopusfile-dev libpng-dev libsdl2-dev libsqlite3-dev libssl-dev libvulkan-dev libwavpack-dev libx264-dev python3 rustc spirv-tools - -On older distributions like Ubuntu 18.04 don't install `google-mock`, but instead set `-DDOWNLOAD_GTEST=ON` when building to get a more recent gtest/gmock version. - -On older distributions `rustc` version might be too old, to get an up-to-date Rust compiler you can use [rustup](https://rustup.rs/) with stable channel instead or try the `rustc-mozilla` package. - -Or on CentOS, RedHat and AlmaLinux like this: - - sudo yum install cargo cmake ffmpeg-devel freetype-devel gcc gcc-c++ git glew-devel glslang gmock-devel gtest-devel libcurl-devel libnotify-devel libogg-devel libpng-devel libx264-devel make openssl-devel opus-devel opusfile-devel python2 rust SDL2-devel spirv-tools sqlite-devel vulkan-devel wavpack-devel - -Or on Fedora like this: - - sudo dnf install cargo cmake ffmpeg-devel freetype-devel gcc gcc-c++ git glew-devel glslang gmock-devel gtest-devel libcurl-devel libnotify-devel libogg-devel libpng-devel make openssl-devel opus-devel opusfile-devel python2 SDL2-devel spirv-tools sqlite-devel vulkan-devel wavpack-devel x264-devel - -Or on Arch Linux like this: - - sudo pacman -S --needed base-devel cmake curl ffmpeg freetype2 git glew glslang gmock libnotify libpng opusfile python rust sdl2 spirv-tools sqlite vulkan-headers vulkan-icd-loader wavpack x264 - -Or on Gentoo like this: - - emerge --ask dev-db/sqlite dev-lang/rust-bin dev-libs/glib dev-libs/openssl dev-util/glslang dev-util/spirv-headers dev-util/spirv-tools media-libs/freetype media-libs/glew media-libs/libglvnd media-libs/libogg media-libs/libpng media-libs/libsdl2 media-libs/libsdl2[vulkan] media-libs/opus media-libs/opusfile media-libs/pnglite media-libs/vulkan-loader[layers] media-sound/wavpack media-video/ffmpeg net-misc/curl x11-libs/gdk-pixbuf x11-libs/libnotify - -On macOS you can use [homebrew](https://brew.sh/) to install build dependencies like this: - - brew install cmake ffmpeg freetype glew glslang googletest libpng molten-vk opusfile rust SDL2 spirv-tools vulkan-headers wavpack x264 - -If you don't want to use the system libraries, you can pass the `-DPREFER_BUNDLED_LIBS=ON` parameter to cmake. - -Building on Linux and macOS ---------------------------- - -To compile DDNet yourself, execute the following commands in the source root: - - mkdir build - cd build - cmake .. - make -j$(nproc) - -Pass the number of threads for compilation to `make -j`. `$(nproc)` in this case returns the number of processing units. - -DDNet requires additional libraries, some of which are bundled for the most common platforms (Windows, Mac, Linux, all x86 and x86\_64) for convenience and the official builds. The bundled libraries for official builds are now in the ddnet-libs submodule. Note that when you build and develop locally, you should ideally use your system's package manager to install the dependencies, instead of relying on ddnet-libs submodule, which does not contain all dependencies anyway (e.g. openssl, vulkan). See the previous section for how to get the dependencies. Alternatively see the following build arguments for how to disable some features and their dependencies (`-DVULKAN=OFF` won't require Vulkan for example). - -The following is a non-exhaustive list of build arguments that can be passed to the `cmake` command-line tool in order to enable or disable options in build time: - -* **-DCMAKE_BUILD_TYPE=[Release|Debug|RelWithDebInfo|MinSizeRel]**
-An optional CMake variable for setting the build type. If not set, defaults to "Release" if `-DDEV=ON` is **not** used, and "Debug" if `-DDEV=ON` is used. See `CMAKE_BUILD_TYPE` in CMake Documentation for more information. - -* **-DPREFER_BUNDLED_LIBS=[ON|OFF]**
-Whether to prefer bundled libraries over system libraries. Setting to ON will make DDNet use third party libraries available in the `ddnet-libs` folder, which is the git-submodule target of the [ddnet-libs](https://github.com/ddnet/ddnet-libs) repository mentioned above -- Useful if you do not have those libraries installed and want to avoid building them. If set to OFF, will only use bundled libraries when system libraries are not found. Default value is OFF. - -* **-DWEBSOCKETS=[ON|OFF]**
-Whether to enable WebSocket support for server. Setting to ON requires the `libwebsockets-dev` library installed. Default value is OFF. - -* **-DMYSQL=[ON|OFF]**
-Whether to enable MySQL/MariaDB support for server. Requires at least MySQL 8.0 or MariaDB 10.2. Setting to ON requires the `libmariadbclient-dev` library installed, which are also provided as bundled libraries for the common platforms. Default value is OFF. - - Note that the bundled MySQL libraries might not work properly on your system. If you run into connection problems with the MySQL server, for example that it connects as root while you chose another user, make sure to install your system libraries for the MySQL client. Make sure that the CMake configuration summary says that it found MySQL libs that were not bundled (no "using bundled libs"). - -* **-DTEST_MYSQL=[ON|OFF]**
-Whether to test MySQL/MariaDB support in GTest based tests. Default value is OFF. - - Note that this requires a running MySQL/MariaDB database on localhost with this setup: - -``` -CREATE DATABASE ddnet; -CREATE USER 'ddnet'@'localhost' IDENTIFIED BY 'thebestpassword'; -GRANT ALL PRIVILEGES ON ddnet.* TO 'ddnet'@'localhost'; -FLUSH PRIVILEGES; -``` - -* **-DAUTOUPDATE=[ON|OFF]**
-Whether to enable the autoupdater. Packagers may want to disable this for their packages. Default value is ON for Windows and Linux. - -* **-DCLIENT=[ON|OFF]**
-Whether to enable client compilation. If set to OFF, DDNet will not depend on Curl, Freetype, Ogg, Opus, Opusfile, and SDL2. Default value is ON. - -* **-DVIDEORECORDER=[ON|OFF]**
-Whether to add video recording support using FFmpeg to the client. Default value is ON. - -* **-DDOWNLOAD_GTEST=[ON|OFF]**
-Whether to download and compile GTest. Useful if GTest is not installed and, for Linux users, there is no suitable package providing it. Default value is OFF. - -* **-DDEV=[ON|OFF]**
-Whether to optimize for development, speeding up the compilation process a little. If enabled, don't generate stuff necessary for packaging. Setting to ON will set CMAKE\_BUILD\_TYPE to Debug by default. Default value is OFF. - -* **-DUPNP=[ON|OFF]**
-Whether to enable UPnP support for the server. -You need to install `libminiupnpc-dev` on Debian, `miniupnpc` on Arch Linux. -Default value is OFF. - -* **-DVULKAN=[ON|OFF]**
-Whether to enable the vulkan backend. -On Windows you need to install the Vulkan SDK and set the `VULKAN_SDK` environment flag accordingly. -Default value is ON for Windows x86\_64 and Linux, and OFF for Windows x86 and macOS. - -* **-GNinja**
-Use the Ninja build system instead of Make. This automatically parallelizes the build and is generally faster. Compile with `ninja` instead of `make`. Install Ninja with `sudo apt install ninja-build` on Debian, `sudo pacman -S --needed ninja` on Arch Linux. - -* **-DCMAKE_CXX_LINK_FLAGS=[FLAGS]**
-Custom flags to set for compiler when linking. - -* **-DEXCEPTION_HANDLING=[ON|OFF]**
-Enable exception handling (only works with Windows as of now, uses DrMingw there). Default value is OFF. - -* **-DIPO=[ON|OFF]**
-Enable interprocedural optimizations, also known as Link Time Optimization (LTO). Default value is OFF. - -* **-DFUSE_LD=[OFF|LINKER]**
-Linker to use. Default value is OFF to try mold, lld, gold. - -* **-DSECURITY_COMPILER_FLAGS=[ON|OFF]**
-Whether to set security-relevant compiler flags like `-D_FORTIFY_SOURCE=2` and `-fstack-protector-all`. Default Value is ON. - -Running tests (Debian/Ubuntu) ------------------------------ - -In order to run the tests, you need to install the following library `libgtest-dev`. - -This library isn't compiled, so you have to do it: -```bash -sudo apt install libgtest-dev -cd /usr/src/gtest -sudo cmake CMakeLists.txt -sudo make -j$(nproc) - -# copy or symlink libgtest.a and libgtest_main.a to your /usr/lib folder -sudo cp lib/*.a /usr/lib -``` - -To run the tests you must target `run_tests` with make: -`make run_tests` - -Code formatting ---------------- -We use clang-format 10 to format the C++ code of this project. Execute `scripts/fix_style.py` after changing the code to ensure code is formatted properly, a GitHub central style checker will do the same and prevent your change from being submitted. - -On Arch Linux you can install clang-format 10 using the [clang-format-static-bin AUR package](https://aur.archlinux.org/packages/clang-format-static-bin/). On macOS you can install clang-format 10 using a [homebrew tap](https://github.com/r-lib/homebrew-taps): -```bash -brew install r-lib/taps/clang-format@10 -sudo ln -s /opt/homebrew/Cellar/clang-format@10/10.0.1/bin/clang-format /opt/homebrew/bin/clang-format-10 -``` - -Using AddressSanitizer + UndefinedBehaviourSanitizer or Valgrind's Memcheck ---------------------------------------------------------------------------- -ASan+UBSan and Memcheck are useful to find code problems more easily. Please use them to test your changes if you can. - -For ASan+UBSan compile with: -```bash -CC=clang CXX=clang++ CXXFLAGS="-fsanitize=address,undefined -fsanitize-recover=address,undefined -fno-omit-frame-pointer" CFLAGS="-fsanitize=address,undefined -fsanitize-recover=address,undefined -fno-omit-frame-pointer" cmake -DCMAKE_BUILD_TYPE=Debug . -make -``` -and run with: -```bash -UBSAN_OPTIONS=suppressions=./ubsan.supp:log_path=./SAN:print_stacktrace=1:halt_on_errors=0 ASAN_OPTIONS=log_path=./SAN:print_stacktrace=1:check_initialization_order=1:detect_leaks=1:halt_on_errors=0 LSAN_OPTIONS=suppressions=./lsan.supp ./DDNet -``` - -Check the SAN.\* files afterwards. This finds more problems than memcheck, runs faster, but requires a modern GCC/Clang compiler. - -For valgrind's memcheck compile a normal Debug build and run with: `valgrind --tool=memcheck ./DDNet` -Expect a large slow down. - -Building on Windows with the Visual Studio IDE --------------------------------------- - -Download and install some version of [Microsoft Visual Studio](https://www.visualstudio.com/) (At the time of writing, MSVS Community 2022) with **C++ support**. - -You'll have to install both [Python 3](https://www.python.org/downloads/) and [Rust](https://rustup.rs/) as well. - -Make sure the MSVC build tools, C++ CMake-Tools and the latest Windows SDK version appropriate to your windows version are selected in the installer. - -Now open up your Project folder, Visual Studio should automatically detect and configure your project using CMake. - -On your tools hotbar next to the triangular "Run" Button, you can now select what you want to start (e.g game-client or game-server) and build it. - -Building on Windows with standalone MSVC build tools --------------------------------------- - -First off you will need to install the MSVC [Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/), [Python 3](https://www.python.org/downloads/) as well as [Rust](https://www.rust-lang.org/tools/install). - -To compile and build DDNet on Windows, use your IDE of choice either with a CMake integration (e.g Visual Studio Code), or by ~~**deprecated**~~ using the CMake GUI. - -Configure CMake to use the MSVC Build Tools appropriate to your System by your IDE's instructions. - -If you're using Visual Studio Code, you can use the [CMake Tools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools) extension to configure and build the project. - -You can then open the project folder in VSC and press `Ctrl+Shift+P` to open the command palette, then search for `CMake: Configure` - -This will open up a prompt for you to select a kit, select your `Visual Studio` version and save it. You can now use the GUI (bottom left) to compile and build your project. - - -Cross-compiling on Linux to Windows x86/x86\_64 ------------------------------------------------ - -Install MinGW cross-compilers of the form `i686-w64-mingw32-gcc` (32 bit) or -`x86_64-w64-mingw32-gcc` (64 bit). This is probably the hard part. ;) - -Then add `-DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/mingw64.toolchain` to the -**initial** CMake command line. - -Cross-compiling on Linux to WebAssembly via Emscripten --------------------------------------------------------- - -Install Emscripten cross-compilers (e.g. `sudo apt install emscripten`) on a modern linux distro. - -If you need to compile the ddnet-libs for WebAssembly, simply call - -```bash -# should be a directory outside of the project's source directory -scripts/compile_libs/gen_libs.sh webasm -``` - -from the project's source directory. It will automatically create a directory called `ddnet-libs`. -You can then manually merge this directory with the one in the ddnet source directory. - -Then run `emcmake cmake .. -DVIDEORECORDER=OFF -DVULKAN=OFF -DSERVER=OFF -DTOOLS=OFF -DPREFER_BUNDLED_LIBS=ON` in your build directory. - -To test the compiled code locally, just use `emrun --browser firefox DDNet.html` - -To host the compiled .html file copy all `.data`, `.html`, `.js`, `.wasm` files to the web server. (see /other/emscripten/minimal.html for a minimal html example) - -Then enable cross origin policies. Example for apache2 on debian based distros: -```bash -sudo a2enmod header - -# edit the apache2 config to allow .htaccess files -sudo nano /etc/apache2/apache2.conf - -# set AllowOverride to All for your directory -# then create a .htaccess file on the web server (where the .html is) -# and add these lines -Header add Cross-Origin-Embedder-Policy "require-corp" -Header add Cross-Origin-Opener-Policy "same-origin" - -# now restart apache2 -sudo service apache2 restart -``` - -Cross-compiling on Linux to macOS ---------------------------------- - -Install [osxcross](https://github.com/tpoechtrager/osxcross), then add -`-DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/darwin.toolchain` and -`-DCMAKE_OSX_SYSROOT=/path/to/osxcross/target/SDK/MacOSX10.11.sdk/` to the -**initial** CMake command line. - -Install `dmg` and `hfsplus` from -[libdmg-hfsplus](https://github.com/mozilla/libdmg-hfsplus) and `newfs_hfs` -from -[diskdev\_cmds](http://pkgs.fedoraproject.org/repo/pkgs/hfsplus-tools/diskdev_cmds-540.1.linux3.tar.gz/0435afc389b919027b69616ad1b05709/diskdev_cmds-540.1.linux3.tar.gz) -to unlock the `package_dmg` target that outputs a macOS disk image. - -Importing the official DDNet Database -------------------------------------- - -```bash -$ wget https://ddnet.org/stats/ddnet-sql.zip -$ unzip ddnet-sql.zip -$ yaourt -S mariadb mysql-connector-c++ -$ mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql -$ systemctl start mariadb -$ mysqladmin -u root password 'PW' -$ mysql -u root -p'PW' -MariaDB [(none)]> create database teeworlds; create user 'teeworlds'@'localhost' identified by 'PW2'; grant all privileges on teeworlds.* to 'teeworlds'@'localhost'; flush privileges; -# this takes a while, you can remove the KEYs in record_race.sql to trade performance in queries -$ mysql -u teeworlds -p'PW2' teeworlds < ddnet-sql/record_*.sql - -$ cat mine.cfg -sv_use_sql 1 -add_sqlserver r teeworlds record teeworlds "PW2" "localhost" "3306" -add_sqlserver w teeworlds record teeworlds "PW2" "localhost" "3306" - -$ mkdir build -$ cd build -$ cmake -DMYSQL=ON .. -$ make -j$(nproc) -$ ./DDNet-Server -f mine.cfg -``` - - - Packaging status - - -Installation from Repository ----------------------------- - -Debian/Ubuntu - -```bash -$ apt-get install ddnet - -``` - -MacOS - -```bash -$ brew install --cask ddnet -``` - -Fedora - -```bash -$ dnf install ddnet -``` - -Arch Linux - -```bash -$ yay -S ddnet -``` - -FreeBSD - -```bash -$ pkg install DDNet -``` - -Windows (Scoop) -``` -scoop bucket add games -scoop install games/ddnet -``` - -Benchmarking ------------- - -DDNet is available in the [Phoronix Test Suite](https://openbenchmarking.org/test/pts/ddnet). If you have PTS installed you can easily benchmark DDNet on your own system like this: - -```bash -$ phoronix-test-suite benchmark ddnet -``` - -Better Git Blame ----------------- - -First, use a better tool than `git blame` itself, e.g. [`tig`](https://jonas.github.io/tig/). There's probably a good UI for Windows, too. Alternatively, use the GitHub UI, click "Blame" in any file view. - -For `tig`, use `tig blame path/to/file.cpp` to open the blame view, you can navigate with arrow keys or kj, press comma to go to the previous revision of the current line, q to quit. - -Only then you could also set up git to ignore specific formatting revisions: -```bash -git config blame.ignoreRevsFile formatting-revs.txt -``` - -(Neo)Vim Syntax Highlighting for config files ----------------------------------------- -Copy the file detection and syntax files to your vim config folder: - -```bash -# vim -cp -R other/vim/* ~/.vim/ - -# neovim -cp -R other/vim/* ~/.config/nvim/ -``` diff --git a/cmake/BuildVulkanShaders.cmake b/cmake/BuildVulkanShaders.cmake deleted file mode 100644 index c6cb0d6fe0..0000000000 --- a/cmake/BuildVulkanShaders.cmake +++ /dev/null @@ -1,174 +0,0 @@ -find_program(GLSLANG_VALIDATOR_PROGRAM - NAMES glslang glslangValidator -) -find_program(SPIRV_OPTIMIZER_PROGRAM spirv-opt) - -set(GLSLANG_VALIDATOR_PROGRAM_FOUND TRUE) -if(NOT GLSLANG_VALIDATOR_PROGRAM) - set(GLSLANG_VALIDATOR_PROGRAM_FOUND FALSE) - if(TARGET_OS STREQUAL "windows") - if(${TARGET_CPU_ARCHITECTURE} STREQUAL "x86_64") - set(GLSLANG_VALIDATOR_PROGRAM "$ENV{VULKAN_SDK}/Bin/glslangValidator.exe") - else() - set(GLSLANG_VALIDATOR_PROGRAM "$ENV{VULKAN_SDK}/Bin32/glslangValidator.exe") - endif() - endif() - - if(EXISTS ${GLSLANG_VALIDATOR_PROGRAM}) - set(GLSLANG_VALIDATOR_PROGRAM_FOUND TRUE) - elseif(TARGET_OS STREQUAL "windows" AND ${TARGET_CPU_ARCHITECTURE} STREQUAL "x86_64") - set(GLSLANG_VALIDATOR_PROGRAM "${PROJECT_SOURCE_DIR}/ddnet-libs/vulkan/windows/lib64/glslangValidator.exe") - if(EXISTS ${GLSLANG_VALIDATOR_PROGRAM}) - set(GLSLANG_VALIDATOR_PROGRAM_FOUND TRUE) - endif() - endif() - - if(NOT GLSLANG_VALIDATOR_PROGRAM_FOUND) - message(FATAL_ERROR "glslangValidator binary was not found. Did you install the Vulkan SDK / packages ?") - endif() -endif() - -set(SPIRV_OPTIMIZER_PROGRAM_FOUND TRUE) -if(NOT SPIRV_OPTIMIZER_PROGRAM) - set(SPIRV_OPTIMIZER_PROGRAM_FOUND FALSE) - if(TARGET_OS STREQUAL "windows") - if (${TARGET_CPU_ARCHITECTURE} STREQUAL "x86_64") - set(SPIRV_OPTIMIZER_PROGRAM "$ENV{VULKAN_SDK}/Bin/spirv-opt.exe") - else() - set(SPIRV_OPTIMIZER_PROGRAM "$ENV{VULKAN_SDK}/Bin32/spirv-opt.exe") - endif() - endif() - - if(EXISTS ${SPIRV_OPTIMIZER_PROGRAM}) - set(SPIRV_OPTIMIZER_PROGRAM_FOUND TRUE) - endif() -endif() - -file(GLOB_RECURSE GLSL_SHADER_FILES - "data/shader/vulkan/*.frag" - "data/shader/vulkan/*.vert" -) - -set(TMP_SHADER_SHA256_LIST "") -foreach(GLSL_SHADER_FILE ${GLSL_SHADER_FILES}) - file(SHA256 ${GLSL_SHADER_FILE} TMP_FILE_SHA) - set(TMP_SHADER_SHA256_LIST "${TMP_SHADER_SHA256_LIST}${TMP_FILE_SHA}") -endforeach(GLSL_SHADER_FILE) - -string(SHA256 GLSL_SHADER_SHA256 "${TMP_SHADER_SHA256_LIST}") -set(GLSL_SHADER_SHA256 "${GLSL_SHADER_SHA256}@v1") - -set(FOUND_MATCHING_SHA256_FILE FALSE) - -if("${VULKAN_SHADER_FILE_SHA256}" STREQUAL "${GLSL_SHADER_SHA256}") - set(FOUND_MATCHING_SHA256_FILE TRUE) -endif() - -set(TW_VULKAN_VERSION "vulkan100") - -set(GLSLANG_VALIDATOR_COMMAND_LIST) -set(GLSLANG_VALIDATOR_DELETE_LIST) -set(SPIRV_OPTIMIZER_COMMAND_LIST) -function(generate_shader_file FILE_ARGS1 FILE_ARGS2 FILE_NAME FILE_OUTPUT_NAME) - set(FILE_TMP_NAME_POSTFIX "") - if(SPIRV_OPTIMIZER_PROGRAM_FOUND) - set(FILE_TMP_NAME_POSTFIX ".tmp") - endif() - list(APPEND GLSLANG_VALIDATOR_COMMAND_LIST COMMAND ${GLSLANG_VALIDATOR_PROGRAM} --client ${TW_VULKAN_VERSION} ${FILE_ARGS1} ${FILE_ARGS2} ${FILE_NAME} -o "${PROJECT_BINARY_DIR}/${FILE_OUTPUT_NAME}${FILE_TMP_NAME_POSTFIX}") - if(SPIRV_OPTIMIZER_PROGRAM_FOUND) - list(APPEND SPIRV_OPTIMIZER_COMMAND_LIST COMMAND ${SPIRV_OPTIMIZER_PROGRAM} -O "${PROJECT_BINARY_DIR}/${FILE_OUTPUT_NAME}${FILE_TMP_NAME_POSTFIX}" -o "${PROJECT_BINARY_DIR}/${FILE_OUTPUT_NAME}") - list(APPEND GLSLANG_VALIDATOR_DELETE_LIST "${PROJECT_BINARY_DIR}/${FILE_OUTPUT_NAME}${FILE_TMP_NAME_POSTFIX}") - endif() - file(RELATIVE_PATH TMP_SHADER_FILE_REL "${PROJECT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}/${FILE_OUTPUT_NAME}") - list(APPEND VULKAN_SHADER_FILE_LIST "${FILE_OUTPUT_NAME}") - set(VULKAN_SHADER_FILE_LIST ${VULKAN_SHADER_FILE_LIST} PARENT_SCOPE) - set(GLSLANG_VALIDATOR_DELETE_LIST ${GLSLANG_VALIDATOR_DELETE_LIST} PARENT_SCOPE) - set(SPIRV_OPTIMIZER_COMMAND_LIST ${SPIRV_OPTIMIZER_COMMAND_LIST} PARENT_SCOPE) - set(GLSLANG_VALIDATOR_COMMAND_LIST ${GLSLANG_VALIDATOR_COMMAND_LIST} PARENT_SCOPE) -endfunction() - -if(NOT FOUND_MATCHING_SHA256_FILE) - message(STATUS "Building vulkan shaders") - execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory "${PROJECT_BINARY_DIR}/data/shader/vulkan/") - - unset(VULKAN_SHADER_FILE_LIST CACHE) - - # primitives - generate_shader_file("" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/prim.frag" "data/shader/vulkan/prim.frag.spv") - generate_shader_file("-DTW_TEXTURED" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/prim.frag" "data/shader/vulkan/prim_textured.frag.spv") - - generate_shader_file("" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/prim.vert" "data/shader/vulkan/prim.vert.spv") - generate_shader_file("-DTW_TEXTURED" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/prim.vert" "data/shader/vulkan/prim_textured.vert.spv") - - generate_shader_file("" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/prim3d.frag" "data/shader/vulkan/prim3d.frag.spv") - generate_shader_file("-DTW_TEXTURED" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/prim3d.frag" "data/shader/vulkan/prim3d_textured.frag.spv") - - generate_shader_file("" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/prim3d.vert" "data/shader/vulkan/prim3d.vert.spv") - generate_shader_file("-DTW_TEXTURED" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/prim3d.vert" "data/shader/vulkan/prim3d_textured.vert.spv") - - # text - generate_shader_file("" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/text.frag" "data/shader/vulkan/text.frag.spv") - generate_shader_file("" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/text.vert" "data/shader/vulkan/text.vert.spv") - - # quad container - generate_shader_file("" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/primex.frag" "data/shader/vulkan/primex.frag.spv") - generate_shader_file("" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/primex.vert" "data/shader/vulkan/primex.vert.spv") - - generate_shader_file("" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/primex.frag" "data/shader/vulkan/primex_rotationless.frag.spv") - generate_shader_file("-DTW_ROTATIONLESS" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/primex.vert" "data/shader/vulkan/primex_rotationless.vert.spv") - - generate_shader_file("-DTW_TEXTURED" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/primex.frag" "data/shader/vulkan/primex_tex.frag.spv") - generate_shader_file("" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/primex.vert" "data/shader/vulkan/primex_tex.vert.spv") - - generate_shader_file("-DTW_TEXTURED" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/primex.frag" "data/shader/vulkan/primex_tex_rotationless.frag.spv") - generate_shader_file("-DTW_ROTATIONLESS" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/primex.vert" "data/shader/vulkan/primex_tex_rotationless.vert.spv") - - generate_shader_file("" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/spritemulti.frag" "data/shader/vulkan/spritemulti.frag.spv") - generate_shader_file("" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/spritemulti.vert" "data/shader/vulkan/spritemulti.vert.spv") - - generate_shader_file("-DTW_PUSH_CONST" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/spritemulti.frag" "data/shader/vulkan/spritemulti_push.frag.spv") - generate_shader_file("-DTW_PUSH_CONST" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/spritemulti.vert" "data/shader/vulkan/spritemulti_push.vert.spv") - - # tile layer - generate_shader_file("" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/tile.frag" "data/shader/vulkan/tile.frag.spv") - generate_shader_file("" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/tile.vert" "data/shader/vulkan/tile.vert.spv") - - generate_shader_file("-DTW_TILE_TEXTURED" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/tile.frag" "data/shader/vulkan/tile_textured.frag.spv") - generate_shader_file("-DTW_TILE_TEXTURED" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/tile.vert" "data/shader/vulkan/tile_textured.vert.spv") - - generate_shader_file("" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/tile_border.frag" "data/shader/vulkan/tile_border.frag.spv") - generate_shader_file("" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/tile_border.vert" "data/shader/vulkan/tile_border.vert.spv") - - generate_shader_file("" "-DTW_TILE_TEXTURED" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/tile_border.frag" "data/shader/vulkan/tile_border_textured.frag.spv") - generate_shader_file("" "-DTW_TILE_TEXTURED" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/tile_border.vert" "data/shader/vulkan/tile_border_textured.vert.spv") - - # quad layer - generate_shader_file("" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/quad.frag" "data/shader/vulkan/quad.frag.spv") - generate_shader_file("" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/quad.vert" "data/shader/vulkan/quad.vert.spv") - - generate_shader_file("-DTW_PUSH_CONST" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/quad.frag" "data/shader/vulkan/quad_push.frag.spv") - generate_shader_file("-DTW_PUSH_CONST" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/quad.vert" "data/shader/vulkan/quad_push.vert.spv") - - generate_shader_file("-DTW_QUAD_TEXTURED" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/quad.frag" "data/shader/vulkan/quad_textured.frag.spv") - generate_shader_file("-DTW_QUAD_TEXTURED" "" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/quad.vert" "data/shader/vulkan/quad_textured.vert.spv") - - generate_shader_file("-DTW_QUAD_TEXTURED" "-DTW_PUSH_CONST" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/quad.frag" "data/shader/vulkan/quad_push_textured.frag.spv") - generate_shader_file("-DTW_QUAD_TEXTURED" "-DTW_PUSH_CONST" "${PROJECT_SOURCE_DIR}/data/shader/vulkan/quad.vert" "data/shader/vulkan/quad_push_textured.vert.spv") - - execute_process(${GLSLANG_VALIDATOR_COMMAND_LIST} RESULT_VARIABLE STATUS) - if(STATUS AND NOT STATUS EQUAL 0) - message(FATAL_ERROR "${GLSLANG_VALIDATOR_COMMAND_LIST} failed") - endif() - if(SPIRV_OPTIMIZER_PROGRAM_FOUND) - execute_process(${SPIRV_OPTIMIZER_COMMAND_LIST} RESULT_VARIABLE STATUS) - if(STATUS AND NOT STATUS EQUAL 0) - message(FATAL_ERROR "${SPIRV_OPTIMIZER_COMMAND_LIST} failed") - endif() - file(REMOVE ${GLSLANG_VALIDATOR_DELETE_LIST}) - endif() - - set(VULKAN_SHADER_FILE_LIST ${VULKAN_SHADER_FILE_LIST} CACHE STRING "Vulkan shader file list" FORCE) - - message(STATUS "Finished building vulkan shaders") - set(VULKAN_SHADER_FILE_SHA256 ${GLSL_SHADER_SHA256} CACHE STRING "Vulkan shader file hash" FORCE) -endif() diff --git a/cmake/Download_GTest_CMakeLists.txt.in b/cmake/Download_GTest_CMakeLists.txt.in deleted file mode 100644 index ba373dd7fb..0000000000 --- a/cmake/Download_GTest_CMakeLists.txt.in +++ /dev/null @@ -1,16 +0,0 @@ -cmake_minimum_required(VERSION 2.8.12...3.19.1) - -project(googletest-download NONE) - -include(ExternalProject) -ExternalProject_Add(googletest - GIT_REPOSITORY https://github.com/google/googletest.git - GIT_TAG "${DDNET_GTEST_VERSION}" - SOURCE_DIR "${CMAKE_BINARY_DIR}/googletest-src" - BINARY_DIR "${CMAKE_BINARY_DIR}/googletest-build" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - TLS_VERIFY ON -) diff --git a/cmake/FindAndroid.cmake b/cmake/FindAndroid.cmake deleted file mode 100644 index a42a0a1f5a..0000000000 --- a/cmake/FindAndroid.cmake +++ /dev/null @@ -1,42 +0,0 @@ -# the android toolchain sets the paths right -FIND_LIBRARY(ANDROID_LIBRARY_EGL - EGL -) - -FIND_LIBRARY(ANDROID_LIBRARY_GLES1 - GLESv1_CM -) - -FIND_LIBRARY(ANDROID_LIBRARY_GLES2 - GLESv2 -) - -FIND_LIBRARY(ANDROID_LIBRARY_GLES3 - GLESv3 -) - -FIND_LIBRARY(ANDROID_LIBRARY_LOG - log -) - -FIND_LIBRARY(ANDROID_LIBRARY_ANDROID - android -) - -FIND_LIBRARY(ANDROID_LIBRARY_OPENSLES - OpenSLES -) - -set(TW_ANDROID_LIBS - ${ANDROID_LIBRARY_LOG} - ${ANDROID_LIBRARY_ANDROID} -) - -set(TW_ANDROID_LIBS_CLIENT - ${TW_ANDROID_LIBS} - ${ANDROID_LIBRARY_EGL} - ${ANDROID_LIBRARY_GLES1} - ${ANDROID_LIBRARY_GLES2} - ${ANDROID_LIBRARY_GLES3} - ${ANDROID_LIBRARY_OPENSLES} -) diff --git a/cmake/FindDiscordSdk.cmake b/cmake/FindDiscordSdk.cmake deleted file mode 100644 index 1edece5b91..0000000000 --- a/cmake/FindDiscordSdk.cmake +++ /dev/null @@ -1,36 +0,0 @@ -set_extra_dirs_lib(DISCORDSDK discord) -find_library(DISCORDSDK_LIBRARY - NAMES discord_game_sdk.dll.lib discord_game_sdk.dylib discord_game_sdk.so - HINTS ${HINTS_DISCORDSDK_LIBDIR} - PATHS ${PATHS_DISCORDSDK_LIBDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) -set_extra_dirs_include(DISCORDSDK discord "${DISCORDSDK_LIBRARY}") -find_path(DISCORDSDK_INCLUDEDIR discord_game_sdk.h - HINTS ${HINTS_DISCORDSDK_INCLUDEDIR} - PATHS ${PATHS_DISCORDSDK_INCLUDEDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(DiscordSdk DEFAULT_MSG DISCORDSDK_LIBRARY DISCORDSDK_INCLUDEDIR) - -mark_as_advanced(DISCORDSDK_LIBRARY DISCORDSDK_INCLUDEDIR) - -if(DISCORDSDK_FOUND) - is_bundled(DISCORDSDK_BUNDLED "${DISCORDSDK_LIBRARY}") - set(DISCORDSDK_LIBRARIES ${DISCORDSDK_LIBRARY}) - set(DISCORDSDK_INCLUDE_DIRS ${DISCORDSDK_INCLUDEDIR}) - - if(DISCORDSDK_BUNDLED) - if(TARGET_OS STREQUAL "windows") - set(DISCORDSDK_COPY_FILES "${EXTRA_DISCORDSDK_LIBDIR}/discord_game_sdk.dll") - elseif(TARGET_OS STREQUAL "linux") - set(DISCORDSDK_COPY_FILES "${EXTRA_DISCORDSDK_LIBDIR}/discord_game_sdk.so") - elseif(TARGET_OS STREQUAL "mac") - set(DISCORDSDK_COPY_FILES "${EXTRA_DISCORDSDK_LIBDIR}/discord_game_sdk.dylib") - endif() - else() - set(DISCORDSDK_COPY_FILES) - endif() -endif() diff --git a/cmake/FindFFMPEG.cmake b/cmake/FindFFMPEG.cmake deleted file mode 100644 index dfcd66ff50..0000000000 --- a/cmake/FindFFMPEG.cmake +++ /dev/null @@ -1,168 +0,0 @@ -if(NOT CMAKE_CROSSCOMPILING) - find_package(PkgConfig QUIET) - pkg_check_modules(PC_AVCODEC libavcodec) - pkg_check_modules(PC_AVFORMAT libavformat) - pkg_check_modules(PC_AVUTIL libavutil) - pkg_check_modules(PC_SWSCALE libswscale) - pkg_check_modules(PC_SWRESAMPLE libswresample) - if(TARGET_OS STREQUAL "linux") - pkg_search_module(PC_X264 libx264 x264) - endif() -endif() - -set_extra_dirs_lib(FFMPEG ffmpeg) -find_library(AVCODEC_LIBRARY - NAMES avcodec.61 avcodec libavcodec - HINTS ${HINTS_FFMPEG_LIBDIR} ${PC_AVCODEC_LIBRARY_DIRS} - PATHS ${PATHS_AVCODEC_LIBDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) - -find_library(AVFORMAT_LIBRARY - NAMES avformat.61 avformat libavformat - HINTS ${HINTS_FFMPEG_LIBDIR} ${PC_AVFORMAT_LIBRARY_DIRS} - PATHS ${PATHS_AVFORMAT_LIBDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) - -find_library(AVUTIL_LIBRARY - NAMES avutil.59 avutil libavutil - HINTS ${HINTS_FFMPEG_LIBDIR} ${PC_AVUTIL_LIBRARY_DIRS} - PATHS ${PATHS_AVUTIL_LIBDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) - -find_library(SWSCALE_LIBRARY - NAMES swscale.8 swscale libswscale - HINTS ${HINTS_FFMPEG_LIBDIR} ${PC_SWSCALE_LIBRARY_DIRS} - PATHS ${PATHS_SWSCALE_LIBDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) - -find_library(SWRESAMPLE_LIBRARY - NAMES swresample.5 swresample libswresample - HINTS ${HINTS_FFMPEG_LIBDIR} ${PC_SWRESAMPLE_LIBRARY_DIRS} - PATHS ${PATHS_SWRESAMPLE_LIBDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) - -if(TARGET_OS STREQUAL "linux") - find_library(X264_LIBRARY - NAMES x264 libx264 - HINTS ${HINTS_FFMPEG_LIBDIR} ${PC_X264_LIBRARY_DIRS} - PATHS ${PATHS_X264_LIBDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} - ) -endif() - -set_extra_dirs_include(AVCODEC ffmpeg "${AVCODEC_LIBRARY}") -find_path(AVCODEC_INCLUDEDIR libavcodec - HINTS ${HINTS_AVCODEC_INCLUDEDIR} ${PC_AVCODEC_INCLUDE_DIRS} - PATHS ${PATHS_AVCODEC_INCLUDEDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) - -set_extra_dirs_include(AVFORMAT ffmpeg "${AVFORMAT_LIBRARY}") -find_path(AVFORMAT_INCLUDEDIR libavformat - HINTS ${HINTS_AVFORMAT_INCLUDEDIR} ${PC_AVFORMAT_INCLUDE_DIRS} - PATHS ${PATHS_AVFORMAT_INCLUDEDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) - -set_extra_dirs_include(AVUTIL ffmpeg "${AVUTIL_LIBRARY}") -find_path(AVUTIL_INCLUDEDIR libavutil - HINTS ${HINTS_AVUTIL_INCLUDEDIR} ${PC_AVUTIL_INCLUDE_DIRS} - PATHS ${PATHS_AVUTIL_INCLUDEDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) - -set_extra_dirs_include(SWSCALE ffmpeg "${SWSCALE_LIBRARY}") -find_path(SWSCALE_INCLUDEDIR libswscale - HINTS ${HINTS_SWSCALE_INCLUDEDIR} ${PC_SWSCALE_INCLUDE_DIRS} - PATHS ${PATHS_SWSCALE_INCLUDEDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) - -set_extra_dirs_include(SWRESAMPLE ffmpeg "${SWRESAMPLE_LIBRARY}") -find_path(SWRESAMPLE_INCLUDEDIR libswresample - HINTS ${HINTS_SWRESAMPLE_INCLUDEDIR} ${PC_SWRESAMPLE_INCLUDE_DIRS} - PATHS ${PATHS_SWRESAMPLE_INCLUDEDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) - -if(TARGET_OS STREQUAL "linux") - set_extra_dirs_include(X264 x264 "${X264_LIBRARY}") -endif() - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(FFMPEG DEFAULT_MSG - AVCODEC_LIBRARY - AVFORMAT_LIBRARY - AVUTIL_LIBRARY - SWSCALE_LIBRARY - SWRESAMPLE_LIBRARY - AVCODEC_INCLUDEDIR - AVFORMAT_INCLUDEDIR - AVUTIL_INCLUDEDIR - SWSCALE_INCLUDEDIR - SWRESAMPLE_INCLUDEDIR -) - -mark_as_advanced( - AVCODEC_LIBRARY - AVFORMAT_LIBRARY - AVUTIL_LIBRARY - SWSCALE_LIBRARY - SWRESAMPLE_LIBRARY - AVCODEC_INCLUDEDIR - AVFORMAT_INCLUDEDIR - AVUTIL_INCLUDEDIR - SWSCALE_INCLUDEDIR - SWRESAMPLE_INCLUDEDIR -) - -set(FFMPEG_LIBRARIES - ${AVFORMAT_LIBRARY} # has to come before avcodec - ${AVCODEC_LIBRARY} - ${AVUTIL_LIBRARY} - ${SWSCALE_LIBRARY} - ${SWRESAMPLE_LIBRARY} -) - -if(TARGET_OS STREQUAL "linux") - list(APPEND FFMPEG_LIBRARIES ${X264_LIBRARY}) -endif() - -if(NOT TARGET_OS STREQUAL "windows") - list(APPEND FFMPEG_LIBRARIES ${CMAKE_DL_LIBS}) -endif() - -set(FFMPEG_INCLUDE_DIRS - ${AVCODEC_INCLUDEDIR} - ${AVFORMAT_INCLUDEDIR} - ${AVUTIL_INCLUDEDIR} - ${SWSCALE_INCLUDEDIR} - ${SWRESAMPLE_INCLUDEDIR} -) - -is_bundled(FFMPEG_BUNDLED "${AVCODEC_LIBRARY}") -set(FFMPEG_COPY_FILES) -if(FFMPEG_BUNDLED) - if(TARGET_OS STREQUAL "windows") - set(FFMPEG_COPY_FILES - "${EXTRA_FFMPEG_LIBDIR}/avcodec-61.dll" - "${EXTRA_FFMPEG_LIBDIR}/avformat-61.dll" - "${EXTRA_FFMPEG_LIBDIR}/avutil-59.dll" - "${EXTRA_FFMPEG_LIBDIR}/swresample-5.dll" - "${EXTRA_FFMPEG_LIBDIR}/swscale-8.dll" - ) - elseif(TARGET_OS STREQUAL "mac") - set(FFMPEG_COPY_FILES - "${EXTRA_FFMPEG_LIBDIR}/libavcodec.61.dylib" - "${EXTRA_FFMPEG_LIBDIR}/libavformat.61.dylib" - "${EXTRA_FFMPEG_LIBDIR}/libavutil.59.dylib" - "${EXTRA_FFMPEG_LIBDIR}/libswresample.5.dylib" - "${EXTRA_FFMPEG_LIBDIR}/libswscale.8.dylib" - ) - endif() -endif() diff --git a/cmake/FindFreetype.cmake b/cmake/FindFreetype.cmake deleted file mode 100644 index 04ea3ab523..0000000000 --- a/cmake/FindFreetype.cmake +++ /dev/null @@ -1,42 +0,0 @@ -if(NOT CMAKE_CROSSCOMPILING) - find_package(PkgConfig QUIET) - pkg_check_modules(PC_FREETYPE freetype2) -endif() - -set_extra_dirs_lib(FREETYPE freetype) -find_library(FREETYPE_LIBRARY - NAMES freetype.6 freetype - HINTS ${HINTS_FREETYPE_LIBDIR} ${PC_FREETYPE_LIBDIR} ${PC_FREETYPE_LIBRARY_DIRS} - PATHS ${PATHS_FREETYPE_LIBDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) -set_extra_dirs_include(FREETYPE freetype "${FREETYPE_LIBRARY}") -find_path(FREETYPE_INCLUDEDIR - NAMES freetype/config/ftheader.h config/ftheader.h - PATH_SUFFIXES freetype2 - HINTS ${HINTS_FREETYPE_INCLUDEDIR} ${PC_FREETYPE_INCLUDEDIR} ${PC_FREETYPE_INCLUDE_DIRS} - PATHS ${PATHS_FREETYPE_INCLUDEDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Freetype DEFAULT_MSG FREETYPE_LIBRARY FREETYPE_INCLUDEDIR) - -mark_as_advanced(FREETYPE_LIBRARY FREETYPE_INCLUDEDIR) - -if(FREETYPE_FOUND) - set(FREETYPE_LIBRARIES ${FREETYPE_LIBRARY}) - set(FREETYPE_INCLUDE_DIRS ${FREETYPE_INCLUDEDIR}) - - is_bundled(FREETYPE_BUNDLED "${FREETYPE_LIBRARY}") - set(FREETYPE_COPY_FILES) - if(FREETYPE_BUNDLED) - if(TARGET_OS STREQUAL "windows" AND TARGET_CPU_ARCHITECTURE STREQUAL "arm64") - set(FREETYPE_COPY_FILES "${EXTRA_FREETYPE_LIBDIR}/libfreetype-6.dll") - elseif(TARGET_OS STREQUAL "windows") - set(FREETYPE_COPY_FILES "${EXTRA_FREETYPE_LIBDIR}/libfreetype.dll") - elseif(TARGET_OS STREQUAL "mac") - set(FREETYPE_COPY_FILES "${EXTRA_FREETYPE_LIBDIR}/libfreetype.6.dylib") - endif() - endif() -endif() diff --git a/cmake/FindGLEW.cmake b/cmake/FindGLEW.cmake deleted file mode 100644 index 2a9de0dccb..0000000000 --- a/cmake/FindGLEW.cmake +++ /dev/null @@ -1,32 +0,0 @@ -if(NOT PREFER_BUNDLED_LIBS) - set(CMAKE_MODULE_PATH ${ORIGINAL_CMAKE_MODULE_PATH}) - find_package(GLEW) - set(CMAKE_MODULE_PATH ${OWN_CMAKE_MODULE_PATH}) - if(GLEW_FOUND) - set(GLEW_BUNDLED OFF) - set(GLEW_DEP) - if(NOT GLEW_LIBRARIES) - set(GLEW_LIBRARIES GLEW::GLEW) - endif() - endif() -endif() - -if(NOT GLEW_FOUND) - set(GLEW_BUNDLED ON) - set(GLEW_SRC_DIR src/engine/external/glew) - set_src(GLEW_SRC GLOB ${GLEW_SRC_DIR} glew.c) - set_src(GLEW_INCLUDES GLOB ${GLEW_SRC_DIR}/GL eglew.h glew.h glxew.h wglew.h) - add_library(glew EXCLUDE_FROM_ALL OBJECT ${GLEW_SRC} ${GLEW_INCLUDES}) - set(GLEW_INCLUDEDIR ${GLEW_SRC_DIR}) - target_include_directories(glew PRIVATE ${GLEW_INCLUDEDIR}) - target_compile_definitions(glew PRIVATE GLEW_STATIC) - - set(GLEW_DEP $) - set(GLEW_INCLUDE_DIRS ${GLEW_INCLUDEDIR}) - set(GLEW_LIBRARIES) - - list(APPEND TARGETS_DEP glew) - - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(GLEW DEFAULT_MSG GLEW_INCLUDEDIR) -endif() diff --git a/cmake/FindNotify.cmake b/cmake/FindNotify.cmake deleted file mode 100644 index 056e21b9ad..0000000000 --- a/cmake/FindNotify.cmake +++ /dev/null @@ -1,4 +0,0 @@ -find_package(PkgConfig QUIET) -pkg_check_modules(NOTIFY QUIET libnotify) -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Notify DEFAULT_MSG NOTIFY_LIBRARIES NOTIFY_INCLUDE_DIRS) diff --git a/cmake/FindOgg.cmake b/cmake/FindOgg.cmake deleted file mode 100644 index 9da12ed6a0..0000000000 --- a/cmake/FindOgg.cmake +++ /dev/null @@ -1,33 +0,0 @@ -if(NOT CMAKE_CROSSCOMPILING) - find_package(PkgConfig QUIET) - pkg_check_modules(PC_OGG ogg) -endif() - -set_extra_dirs_lib(OGG opus) -find_library(OGG_LIBRARY - NAMES ogg - HINTS ${HINTS_OGG_LIBDIR} ${PC_OGG_LIBDIR} ${PC_OGG_LIBRARY_DIRS} - PATHS ${PATHS_OGG_LIBDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) -set_extra_dirs_include(OGG opus "${OGG_LIBRARY}") -find_path(OGG_INCLUDEDIR ogg/ogg.h - PATH_SUFFIXES ogg - HINTS ${HINTS_OGG_INCLUDEDIR} ${PC_OGG_INCLUDEDIR} ${PC_OGG_INCLUDE_DIRS} - PATHS ${PATHS_OGG_INCLUDEDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Ogg DEFAULT_MSG OGG_INCLUDEDIR) - -mark_as_advanced(OGG_INCLUDEDIR OGG_LIBRARY) - -if(OGG_FOUND) - set(OGG_INCLUDE_DIRS ${OGG_INCLUDEDIR}) - if(OGG_LIBRARY) - set(OGG_LIBRARIES ${OGG_LIBRARY}) - else() - set(OGG_LIBRARIES) - endif() -endif() diff --git a/cmake/FindOpus.cmake b/cmake/FindOpus.cmake deleted file mode 100644 index 37c07a2a4a..0000000000 --- a/cmake/FindOpus.cmake +++ /dev/null @@ -1,33 +0,0 @@ -if(NOT CMAKE_CROSSCOMPILING) - find_package(PkgConfig QUIET) - pkg_check_modules(PC_OPUS opus) -endif() - -set_extra_dirs_lib(OPUS opus) -find_library(OPUS_LIBRARY - NAMES opus - HINTS ${HINTS_OPUS_LIBDIR} ${PC_OPUS_LIBDIR} ${PC_OPUS_LIBRARY_DIRS} - PATHS ${PATHS_OPUS_LIBDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) -set_extra_dirs_include(OPUS opus "${OPUS_LIBRARY}") -find_path(OPUS_INCLUDEDIR opus.h - PATH_SUFFIXES opus - HINTS ${HINTS_OPUS_INCLUDEDIR} ${PC_OPUS_INCLUDEDIR} ${PC_OPUS_INCLUDE_DIRS} - PATHS ${PATHS_OPUS_INCLUDEDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Opus DEFAULT_MSG OPUS_INCLUDEDIR) - -mark_as_advanced(OPUS_INCLUDEDIR OPUS_LIBRARY) - -if(OPUS_FOUND) - set(OPUS_INCLUDE_DIRS ${OPUS_INCLUDEDIR}) - if(OPUS_LIBRARY) - set(OPUS_LIBRARIES ${OPUS_LIBRARY}) - else() - set(OPUS_LIBRARIES) - endif() -endif() diff --git a/cmake/FindOpusfile.cmake b/cmake/FindOpusfile.cmake deleted file mode 100644 index dd522bb2b7..0000000000 --- a/cmake/FindOpusfile.cmake +++ /dev/null @@ -1,55 +0,0 @@ -if(NOT CMAKE_CROSSCOMPILING) - find_package(PkgConfig QUIET) - pkg_check_modules(PC_OPUSFILE opusfile) -endif() - -set_extra_dirs_lib(OPUSFILE opus) -find_library(OPUSFILE_LIBRARY - NAMES opusfile - HINTS ${HINTS_OPUSFILE_LIBDIR} ${PC_OPUSFILE_LIBDIR} ${PC_OPUSFILE_LIBRARY_DIRS} - PATHS ${PATHS_OPUSFILE_LIBDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) -set_extra_dirs_include(OPUSFILE opus "${OPUSFILE_LIBRARY}") -find_path(OPUSFILE_INCLUDEDIR opusfile.h - PATH_SUFFIXES opus - HINTS ${HINTS_OPUSFILE_INCLUDEDIR} ${PC_OPUSFILE_INCLUDEDIR} ${PC_OPUSFILE_INCLUDE_DIRS} - PATHS ${PATHS_OPUSFILE_INCLUDEDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Opusfile DEFAULT_MSG OPUSFILE_LIBRARY OPUSFILE_INCLUDEDIR) - -mark_as_advanced(OPUSFILE_LIBRARY OPUSFILE_INCLUDEDIR) - -set(OPUSFILE_LIBRARIES ${OPUSFILE_LIBRARY}) -set(OPUSFILE_INCLUDE_DIRS ${OPUSFILE_INCLUDEDIR}) - -if(OPUSFILE_FOUND) - is_bundled(OPUSFILE_BUNDLED "${OPUSFILE_LIBRARY}") - if(OPUSFILE_BUNDLED AND TARGET_OS STREQUAL "windows") - if (TARGET_CPU_ARCHITECTURE STREQUAL "arm64") - set(OPUSFILE_COPY_FILES - "${EXTRA_OPUSFILE_LIBDIR}/libopusfile-0.dll" - "${EXTRA_OPUSFILE_LIBDIR}/libopus-0.dll" - "${EXTRA_OPUSFILE_LIBDIR}/libogg-0.dll" - "${EXTRA_OPUSFILE_LIBDIR}/libwinpthread-1.dll" - ) - else() - set(OPUSFILE_COPY_FILES - "${EXTRA_OPUSFILE_LIBDIR}/libogg.dll" - "${EXTRA_OPUSFILE_LIBDIR}/libopus.dll" - "${EXTRA_OPUSFILE_LIBDIR}/libopusfile.dll" - "${EXTRA_OPUSFILE_LIBDIR}/libwinpthread-1.dll" - ) - endif() - if(TARGET_BITS EQUAL 32) - list(APPEND OPUSFILE_COPY_FILES - "${EXTRA_OPUSFILE_LIBDIR}/libgcc_s_sjlj-1.dll" - ) - endif() - else() - set(OPUSFILE_COPY_FILES) - endif() -endif() diff --git a/cmake/FindPNG.cmake b/cmake/FindPNG.cmake deleted file mode 100644 index 099071ad34..0000000000 --- a/cmake/FindPNG.cmake +++ /dev/null @@ -1,49 +0,0 @@ -if(NOT PREFER_BUNDLED_LIBS) - set(CMAKE_MODULE_PATH ${ORIGINAL_CMAKE_MODULE_PATH}) - find_package(PNG) - set(CMAKE_MODULE_PATH ${OWN_CMAKE_MODULE_PATH}) - if(PNG_FOUND) - set(PNG_BUNDLED OFF) - set(PNG_DEP) - endif() -endif() - -if(NOT PNG_FOUND) - set_extra_dirs_lib(PNG png) - find_library(PNG_LIBRARY - NAMES libpng16.16 png16.16 libpng16-16 png16-16 libpng16 png16 - HINTS ${HINTS_PNG_LIBDIR} ${PC_PNG_LIBDIR} ${PC_PNG_LIBRARY_DIRS} - PATHS ${PATHS_PNG_LIBDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} - ) - - set_extra_dirs_include(PNG png "${PNG_LIBRARY}") - find_path(PNG_INCLUDEDIR - NAMES png.h - HINTS ${HINTS_PNG_INCLUDEDIR} ${PC_PNG_INCLUDEDIR} ${PC_PNG_INCLUDE_DIRS} - PATHS ${PATHS_PNG_INCLUDEDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} - ) - - mark_as_advanced(PNG_LIBRARY PNG_INCLUDEDIR) - - if(PNG_LIBRARY AND PNG_INCLUDEDIR) - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(PNG DEFAULT_MSG PNG_LIBRARY PNG_INCLUDEDIR) - - set(PNG_LIBRARIES ${PNG_LIBRARY}) - set(PNG_INCLUDE_DIRS ${PNG_INCLUDEDIR}) - endif() -endif() - -set(PNG_COPY_FILES) -if(PNG_FOUND) - is_bundled(PNG_BUNDLED "${PNG_LIBRARY}") - if(PNG_BUNDLED) - if(TARGET_OS STREQUAL "windows") - set(PNG_COPY_FILES "${EXTRA_PNG_LIBDIR}/libpng16-16.dll") - elseif(TARGET_OS STREQUAL "mac") - set(PNG_COPY_FILES "${EXTRA_PNG_LIBDIR}/libpng16.16.dylib") - endif() - endif() -endif() diff --git a/cmake/FindRust.cmake b/cmake/FindRust.cmake deleted file mode 100644 index 9c2bf7ca7c..0000000000 --- a/cmake/FindRust.cmake +++ /dev/null @@ -1,29 +0,0 @@ -find_program(RUST_RUSTC rustc) -find_program(RUST_CARGO cargo) - -if(RUST_RUSTC) - execute_process(COMMAND ${RUST_RUSTC} --version --verbose OUTPUT_VARIABLE RUSTC_VERSION_OUTPUT) - string(REPLACE "\n" ";" RUSTC_VERSION_OUTPUT "${RUSTC_VERSION_OUTPUT}") - set(RUST_NIGHTLY OFF) - foreach(line ${RUSTC_VERSION_OUTPUT}) - if(NOT DEFINED RUST_VERSION_STRING) - set(RUST_VERSION_STRING ${line}) - endif() - if(line MATCHES "^([^:]+): (.*)$") - set(KEY ${CMAKE_MATCH_1}) - set(VALUE ${CMAKE_MATCH_2}) - if(KEY STREQUAL "release") - set(RUST_VERSION ${VALUE}) - if(VALUE MATCHES "nightly") - set(RUST_NIGHTLY ON) - endif() - elseif(KEY STREQUAL "host") - set(RUST_TARGET_HOST ${VALUE}) - endif() - endif() - endforeach() -endif() - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Rust DEFAULT_MSG RUST_RUSTC RUST_CARGO) -mark_as_advanced(RUST_RUSTC RUST_CARGO) diff --git a/cmake/FindSDL2.cmake b/cmake/FindSDL2.cmake deleted file mode 100644 index 8a7675bce9..0000000000 --- a/cmake/FindSDL2.cmake +++ /dev/null @@ -1,52 +0,0 @@ -if(NOT CMAKE_CROSSCOMPILING) - find_package(PkgConfig QUIET) - pkg_check_modules(PC_SDL2 sdl2) -endif() - -set_extra_dirs_lib(SDL2 sdl) -find_library(SDL2_LIBRARY - NAMES SDL2 - HINTS ${HINTS_SDL2_LIBDIR} ${PC_SDL2_LIBDIR} ${PC_SDL2_LIBRARY_DIRS} - PATHS ${PATHS_SDL2_LIBDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) -if(PREFER_BUNDLED_LIBS) - set(CMAKE_FIND_FRAMEWORK FIRST) -else() - set(CMAKE_FIND_FRAMEWORK LAST) -endif() -set_extra_dirs_include(SDL2 sdl "${SDL2_LIBRARY}") -# Looking for 'SDL.h' directly might accidentally find a SDL instead of SDL 2 -# installation. Look for a header file only present in SDL 2 instead. -find_path(SDL2_INCLUDEDIR SDL_assert.h - PATH_SUFFIXES SDL2 - HINTS ${HINTS_SDL2_INCLUDEDIR} ${PC_SDL2_INCLUDEDIR} ${PC_SDL2_INCLUDE_DIRS} - PATHS ${PATHS_SDL2_INCLUDEDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} -) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(SDL2 DEFAULT_MSG SDL2_LIBRARY SDL2_INCLUDEDIR) - -mark_as_advanced(SDL2_LIBRARY SDL2_INCLUDEDIR) - -if(SDL2_FOUND) - set(SDL2_LIBRARIES ${SDL2_LIBRARY}) - set(SDL2_INCLUDE_DIRS ${SDL2_INCLUDEDIR}) - - is_bundled(SDL2_BUNDLED "${SDL2_LIBRARY}") - set(SDL2_COPY_FILES) - set(SDL2_COPY_DIRS) - if(SDL2_BUNDLED) - if(TARGET_OS STREQUAL "windows") - set(SDL2_COPY_FILES "${EXTRA_SDL2_LIBDIR}/SDL2.dll") - if(TARGET_BITS EQUAL 32) - list(APPEND OPUSFILE_COPY_FILES - "${EXTRA_SDL2_LIBDIR}/libgcc_s_dw2-1.dll" - ) - endif() - elseif(TARGET_OS STREQUAL "mac") - set(SDL2_COPY_DIRS "${EXTRA_SDL2_LIBDIR}/SDL2.framework") - endif() - endif() -endif() diff --git a/cmake/FindVulkan.cmake b/cmake/FindVulkan.cmake deleted file mode 100644 index 4935fefb69..0000000000 --- a/cmake/FindVulkan.cmake +++ /dev/null @@ -1,61 +0,0 @@ -if(NOT CMAKE_CROSSCOMPILING) - find_package(PkgConfig QUIET) - pkg_check_modules(PC_VULKAN vulkan) - if(PC_VULKAN_FOUND) - set(VULKAN_INCLUDE_DIRS "${PC_VULKAN_INCLUDE_DIRS}") - set(VULKAN_LIBRARIES "${PC_VULKAN_LIBRARIES}") - set(VULKAN_FOUND TRUE) - endif() -endif() - -if(NOT VULKAN_FOUND) - if(TARGET_OS STREQUAL "android") - find_library(VULKAN_LIBRARIES - NAMES vulkan - ) - - find_path( - VULKAN_INCLUDE_DIRS - NAMES vulkan/vulkan.h - ) - elseif(TARGET_OS STREQUAL "mac") - find_library(VULKAN_LIBRARIES - NAMES MoltenVK - ) - - find_path( - VULKAN_INCLUDE_DIRS - NAMES vulkan/vulkan.h - ) - else() - set_extra_dirs_lib(VULKAN vulkan) - find_library(VULKAN_LIBRARIES - NAMES vulkan vulkan-1 - HINTS ${HINTS_VULKAN_LIBDIR} ${PC_VULKAN_LIBDIR} ${PC_VULKAN_LIBRARY_DIRS} - PATHS ${PATHS_VULKAN_LIBDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} - ) - - set_extra_dirs_include(VULKAN vulkan "${VULKAN_LIBRARIES}") - find_path( - VULKAN_INCLUDE_DIRS - NAMES vulkan/vulkan.h - HINTS ${HINTS_VULKAN_INCLUDEDIR} ${PC_VULKAN_INCLUDEDIR} ${PC_VULKAN_INCLUDE_DIRS} - PATHS ${PATHS_VULKAN_INCLUDEDIR} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} - ) - endif() - - if(VULKAN_INCLUDE_DIRS AND VULKAN_LIBRARIES) - set(VULKAN_FOUND TRUE) - else(VULKAN_INCLUDE_DIRS AND VULKAN_LIBRARIES) - set(VULKAN_FOUND FALSE) - endif(VULKAN_INCLUDE_DIRS AND VULKAN_LIBRARIES) -endif() - -if(TARGET_OS STREQUAL "windows") - is_bundled(VULKAN_BUNDLED "${VULKAN_LIBRARIES}") - if(VULKAN_BUNDLED) - set(VULKAN_COPY_FILES "${EXTRA_VULKAN_LIBDIR}/vulkan-1.dll") - endif() -endif() diff --git a/cmake/FindWavpack.cmake b/cmake/FindWavpack.cmake deleted file mode 100644 index b7e8552680..0000000000 --- a/cmake/FindWavpack.cmake +++ /dev/null @@ -1,52 +0,0 @@ -if(NOT PREFER_BUNDLED_LIBS) - if(NOT CMAKE_CROSSCOMPILING) - find_package(PkgConfig QUIET) - pkg_check_modules(PC_WAVPACK wavpack) - endif() - - find_library(WAVPACK_LIBRARY - NAMES wavpack - HINTS ${PC_WAVPACK_LIBDIR} ${PC_WAVPACK_LIBRARY_DIRS} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} - ) - find_path(WAVPACK_INCLUDEDIR - NAMES wavpack.h - PATH_SUFFIXES wavpack - HINTS ${PC_WAVPACK_INCLUDEDIR} ${PC_WAVPACK_INCLUDE_DIRS} - ${CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH} - ) - - mark_as_advanced(WAVPACK_LIBRARY WAVPACK_INCLUDEDIR) - - if(WAVPACK_LIBRARY AND WAVPACK_INCLUDEDIR) - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(Wavpack DEFAULT_MSG WAVPACK_LIBRARY WAVPACK_INCLUDEDIR) - - set(WAVPACK_LIBRARIES ${WAVPACK_LIBRARY}) - set(WAVPACK_INCLUDE_DIRS ${WAVPACK_INCLUDEDIR}) - set(WAVPACK_BUNDLED OFF) - endif() -endif() - -if(NOT WAVPACK_FOUND) - set(WAVPACK_SRC_DIR src/engine/external/wavpack) - set_src(WAVPACK_SRC GLOB ${WAVPACK_SRC_DIR} - bits.c - float.c - metadata.c - unpack.c - wavpack.h - words.c - wputils.c - ) - add_library(wavpack EXCLUDE_FROM_ALL OBJECT ${WAVPACK_SRC}) - set(WAVPACK_DEP $) - set(WAVPACK_INCLUDEDIR ${WAVPACK_SRC_DIR}) - set(WAVPACK_INCLUDE_DIRS ${WAVPACK_INCLUDEDIR}) - - list(APPEND TARGETS_DEP wavpack) - - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(Wavpack DEFAULT_MSG WAVPACK_INCLUDEDIR) - set(WAVPACK_BUNDLED ON) -endif() diff --git a/cmake/checksummed_extra.txt b/cmake/checksummed_extra.txt deleted file mode 100644 index b7520edfc7..0000000000 --- a/cmake/checksummed_extra.txt +++ /dev/null @@ -1,22 +0,0 @@ -${CMAKE_VERSION} -${PROJECT_VERSION} -${TARGET_BITS} -${TARGET_CPU_ARCHITECTURE} -${CMAKE_SYSTEM_NAME} -${WEBSOCKETS} -${MYSQL} -${AUTOUPDATE} -${INFORM_UPDATE} -${VIDEORECORDER} -${UPNP} -${ANTIBOT} -${HEADLESS_CLIENT} -${CLIENT} -${SERVER} -${TOOLS} -${STEAM} -${DISCORD} -${DISCORD_DYNAMIC} -${DEV} -${CMAKE_BUILD_TYPE} -${CMAKE_CXX_COMPILER} diff --git a/cmake/toolchains/Emscripten.toolchain b/cmake/toolchains/Emscripten.toolchain deleted file mode 100644 index ca59958220..0000000000 --- a/cmake/toolchains/Emscripten.toolchain +++ /dev/null @@ -1,38 +0,0 @@ -set(WASM_CXX_ENGINE_FLAGS "") -set(WASM_ENGINE_FLAGS "") -set(WASM_ENGINE_FLAGS "-s LLD_REPORT_UNDEFINED -s USE_PTHREADS=1") -# needed for loading files in a c-like style -set(WASM_ENGINE_FLAGS "${WASM_ENGINE_FLAGS} -s FILESYSTEM=1 -s FORCE_FILESYSTEM=1") -# load data directory to the filesystem -set(WASM_ENGINE_FLAGS "${WASM_ENGINE_FLAGS} --preload-file data") -# remove some annoyance for now, TODO -set(WASM_ENGINE_FLAGS "${WASM_ENGINE_FLAGS} --allow-multiple-definition -Wl,--shared-memory,--no-check-features") -# TODO -#set(WASM_ENGINE_FLAGS "${WASM_ENGINE_FLAGS} -lwebsocket.js -s PROXY_POSIX_SOCKETS=1") -# use Web Assembly & a WebGL2 compatible GLES3 implementation -set(WASM_ENGINE_FLAGS "${WASM_ENGINE_FLAGS} -s WASM=1") -set(WASM_ENGINE_FLAGS "${WASM_ENGINE_FLAGS} -s USE_WEBGL2=1") -set(WASM_ENGINE_FLAGS "${WASM_ENGINE_FLAGS} -s FULL_ES3=1") -set(WASM_ENGINE_FLAGS "${WASM_ENGINE_FLAGS} -s DEFAULT_LIBRARY_FUNCS_TO_INCLUDE=[\"$autoResumeAudioContext, $dynCall\"]") -# this flag is the most important one. It tells SDL2 to call emscripten functions when polling event -set(WASM_ENGINE_FLAGS "${WASM_ENGINE_FLAGS} -s ASYNCIFY=1") -# TODO, has to be fixed in SDL2, can improve responsivness of the site -#set(WASM_ENGINE_FLAGS "${WASM_ENGINE_FLAGS} -s PROXY_TO_PTHREAD=1") -# SDL2 is compiled by the gen_libs.sh script for easy up to date code -#set(WASM_ENGINE_FLAGS "${WASM_ENGINE_FLAGS} -s USE_SDL=2") -#set(WASM_CXX_ENGINE_FLAGS "${WASM_CXX_ENGINE_FLAGS} -s USE_SDL=2") -# even if slower, memory growth has the advantage of using less resources, keep it on for now (instead of a static memory pool) -set(WASM_ENGINE_FLAGS "${WASM_ENGINE_FLAGS} -s ALLOW_MEMORY_GROWTH=1") -#set(WASM_ENGINE_FLAGS "${WASM_ENGINE_FLAGS} -s INITIAL_MEMORY=2000MB") -set(WASM_ENGINE_FLAGS "${WASM_ENGINE_FLAGS} -s MAXIMUM_MEMORY=2000MB") -# not optimal but required so that threads are created on fly (instead of delayed when the next javascript calls come in) -set(WASM_ENGINE_FLAGS "${WASM_ENGINE_FLAGS} -s PTHREAD_POOL_SIZE=10") -if(NOT (CMAKE_BUILD_TYPE STREQUAL "Debug")) - # will drastically reduce code size - set(WASM_ENGINE_FLAGS "${WASM_ENGINE_FLAGS} -flto") -endif() -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -D_REENTRANT -g -O3 ${WASM_CXX_ENGINE_FLAGS}") -set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} -pthread -D_REENTRANT -g -O3 ${WASM_CXX_ENGINE_FLAGS}") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pthread ${WASM_ENGINE_FLAGS}") -set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${WASM_ENGINE_FLAGS}") -set(CMAKE_RUST_COMPILER_TARGET wasm32-unknown-emscripten) diff --git a/cmake/toolchains/darwin-arm64.toolchain b/cmake/toolchains/darwin-arm64.toolchain index cc3ee909b5..2801912cd1 100644 --- a/cmake/toolchains/darwin-arm64.toolchain +++ b/cmake/toolchains/darwin-arm64.toolchain @@ -11,7 +11,6 @@ set(CMAKE_C_COMPILER oa64-clang) set(CMAKE_CXX_COMPILER oa64-clang++) set(CMAKE_INSTALL_NAME_TOOL aarch64-apple-$ENV{OSXCROSS_TARGET}-install_name_tool) set(CMAKE_OTOOL aarch64-apple-$ENV{OSXCROSS_TARGET}-otool) -set(CMAKE_RUST_COMPILER_TARGET aarch64-apple-darwin) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) diff --git a/cmake/toolchains/darwin-x86_64.toolchain b/cmake/toolchains/darwin-x86_64.toolchain index f4a7ec3b10..d6824e7726 100644 --- a/cmake/toolchains/darwin-x86_64.toolchain +++ b/cmake/toolchains/darwin-x86_64.toolchain @@ -11,7 +11,6 @@ set(CMAKE_C_COMPILER o64-clang) set(CMAKE_CXX_COMPILER o64-clang++) set(CMAKE_INSTALL_NAME_TOOL x86_64-apple-$ENV{OSXCROSS_TARGET}-install_name_tool) set(CMAKE_OTOOL x86_64-apple-$ENV{OSXCROSS_TARGET}-otool) -set(CMAKE_RUST_COMPILER_TARGET x86_64-apple-darwin) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) diff --git a/cmake/toolchains/mingw32.toolchain b/cmake/toolchains/mingw32.toolchain index e920543d6e..c4c065b7eb 100644 --- a/cmake/toolchains/mingw32.toolchain +++ b/cmake/toolchains/mingw32.toolchain @@ -3,7 +3,6 @@ set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_C_COMPILER i686-w64-mingw32-gcc) set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++) set(CMAKE_RC_COMPILER i686-w64-mingw32-windres) -set(CMAKE_RUST_COMPILER_TARGET i686-pc-windows-gnu) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) diff --git a/cmake/toolchains/mingw64-aarch64-llvm.toolchain b/cmake/toolchains/mingw64-aarch64-llvm.toolchain index 0bf154bab3..a185bdfcce 100644 --- a/cmake/toolchains/mingw64-aarch64-llvm.toolchain +++ b/cmake/toolchains/mingw64-aarch64-llvm.toolchain @@ -4,7 +4,6 @@ set(CMAKE_SYSTEM_PROCESSOR aarch64) set(CMAKE_C_COMPILER aarch64-w64-mingw32-clang) set(CMAKE_CXX_COMPILER aarch64-w64-mingw32-clang++) set(CMAKE_RC_COMPILER aarch64-w64-mingw32-windres) -set(CMAKE_RUST_COMPILER_TARGET aarch64-pc-windows-gnullvm) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) diff --git a/cmake/toolchains/mingw64.toolchain b/cmake/toolchains/mingw64.toolchain index a43605b2a5..bec41e9447 100644 --- a/cmake/toolchains/mingw64.toolchain +++ b/cmake/toolchains/mingw64.toolchain @@ -3,7 +3,6 @@ set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) -set(CMAKE_RUST_COMPILER_TARGET x86_64-pc-windows-gnu) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) diff --git a/data/arrow.png b/data/arrow.png deleted file mode 100644 index 9890b3d2c1..0000000000 Binary files a/data/arrow.png and /dev/null differ diff --git a/data/assets/entities/comfort/ddnet.png b/data/assets/entities/comfort/ddnet.png deleted file mode 100644 index 6fdbb517c2..0000000000 Binary files a/data/assets/entities/comfort/ddnet.png and /dev/null differ diff --git a/data/assets/entities/license.txt b/data/assets/entities/license.txt deleted file mode 100644 index f537c100a9..0000000000 --- a/data/assets/entities/license.txt +++ /dev/null @@ -1,3 +0,0 @@ -comfort: -Copyright louis -CC BY-SA 3.0 license (https://creativecommons.org/licenses/by-sa/3.0/) diff --git a/data/assets/game/game_06.png b/data/assets/game/game_06.png deleted file mode 100644 index c6d7f46048..0000000000 Binary files a/data/assets/game/game_06.png and /dev/null differ diff --git a/data/audio/foley_body_impact-01.wv b/data/audio/foley_body_impact-01.wv deleted file mode 100644 index 7f6fc73f99..0000000000 Binary files a/data/audio/foley_body_impact-01.wv and /dev/null differ diff --git a/data/audio/foley_body_impact-02.wv b/data/audio/foley_body_impact-02.wv deleted file mode 100644 index d4f610c53b..0000000000 Binary files a/data/audio/foley_body_impact-02.wv and /dev/null differ diff --git a/data/audio/foley_body_impact-03.wv b/data/audio/foley_body_impact-03.wv deleted file mode 100644 index 774f7b645f..0000000000 Binary files a/data/audio/foley_body_impact-03.wv and /dev/null differ diff --git a/data/audio/foley_body_splat-01.wv b/data/audio/foley_body_splat-01.wv deleted file mode 100644 index e26ea467c6..0000000000 Binary files a/data/audio/foley_body_splat-01.wv and /dev/null differ diff --git a/data/audio/foley_body_splat-02.wv b/data/audio/foley_body_splat-02.wv deleted file mode 100644 index 5d60869825..0000000000 Binary files a/data/audio/foley_body_splat-02.wv and /dev/null differ diff --git a/data/audio/foley_body_splat-03.wv b/data/audio/foley_body_splat-03.wv deleted file mode 100644 index 3ba184fc65..0000000000 Binary files a/data/audio/foley_body_splat-03.wv and /dev/null differ diff --git a/data/audio/foley_body_splat-04.wv b/data/audio/foley_body_splat-04.wv deleted file mode 100644 index d137d392c3..0000000000 Binary files a/data/audio/foley_body_splat-04.wv and /dev/null differ diff --git a/data/audio/foley_dbljump-01.wv b/data/audio/foley_dbljump-01.wv deleted file mode 100644 index 17b3ca856b..0000000000 Binary files a/data/audio/foley_dbljump-01.wv and /dev/null differ diff --git a/data/audio/foley_dbljump-02.wv b/data/audio/foley_dbljump-02.wv deleted file mode 100644 index 3905e2a33f..0000000000 Binary files a/data/audio/foley_dbljump-02.wv and /dev/null differ diff --git a/data/audio/foley_dbljump-03.wv b/data/audio/foley_dbljump-03.wv deleted file mode 100644 index 2ba13bd7c1..0000000000 Binary files a/data/audio/foley_dbljump-03.wv and /dev/null differ diff --git a/data/audio/foley_foot_left-01.wv b/data/audio/foley_foot_left-01.wv deleted file mode 100644 index f527bb7963..0000000000 Binary files a/data/audio/foley_foot_left-01.wv and /dev/null differ diff --git a/data/audio/foley_foot_left-02.wv b/data/audio/foley_foot_left-02.wv deleted file mode 100644 index 61bb23733b..0000000000 Binary files a/data/audio/foley_foot_left-02.wv and /dev/null differ diff --git a/data/audio/foley_foot_left-03.wv b/data/audio/foley_foot_left-03.wv deleted file mode 100644 index 77850ee199..0000000000 Binary files a/data/audio/foley_foot_left-03.wv and /dev/null differ diff --git a/data/audio/foley_foot_left-04.wv b/data/audio/foley_foot_left-04.wv deleted file mode 100644 index 62ddcef32b..0000000000 Binary files a/data/audio/foley_foot_left-04.wv and /dev/null differ diff --git a/data/audio/foley_foot_right-01.wv b/data/audio/foley_foot_right-01.wv deleted file mode 100644 index 5e7786dbef..0000000000 Binary files a/data/audio/foley_foot_right-01.wv and /dev/null differ diff --git a/data/audio/foley_foot_right-02.wv b/data/audio/foley_foot_right-02.wv deleted file mode 100644 index f28eb0b9c7..0000000000 Binary files a/data/audio/foley_foot_right-02.wv and /dev/null differ diff --git a/data/audio/foley_foot_right-03.wv b/data/audio/foley_foot_right-03.wv deleted file mode 100644 index 757189ac7f..0000000000 Binary files a/data/audio/foley_foot_right-03.wv and /dev/null differ diff --git a/data/audio/foley_foot_right-04.wv b/data/audio/foley_foot_right-04.wv deleted file mode 100644 index d39068f41b..0000000000 Binary files a/data/audio/foley_foot_right-04.wv and /dev/null differ diff --git a/data/audio/foley_land-01.wv b/data/audio/foley_land-01.wv deleted file mode 100644 index f427f927ad..0000000000 Binary files a/data/audio/foley_land-01.wv and /dev/null differ diff --git a/data/audio/foley_land-02.wv b/data/audio/foley_land-02.wv deleted file mode 100644 index 43a4a64f3c..0000000000 Binary files a/data/audio/foley_land-02.wv and /dev/null differ diff --git a/data/audio/foley_land-03.wv b/data/audio/foley_land-03.wv deleted file mode 100644 index e079b5cf0d..0000000000 Binary files a/data/audio/foley_land-03.wv and /dev/null differ diff --git a/data/audio/foley_land-04.wv b/data/audio/foley_land-04.wv deleted file mode 100644 index 7090043dbd..0000000000 Binary files a/data/audio/foley_land-04.wv and /dev/null differ diff --git a/data/audio/hook_attach-01.wv b/data/audio/hook_attach-01.wv deleted file mode 100644 index e62bc850c5..0000000000 Binary files a/data/audio/hook_attach-01.wv and /dev/null differ diff --git a/data/audio/hook_attach-02.wv b/data/audio/hook_attach-02.wv deleted file mode 100644 index 75f4c39bfd..0000000000 Binary files a/data/audio/hook_attach-02.wv and /dev/null differ diff --git a/data/audio/hook_attach-03.wv b/data/audio/hook_attach-03.wv deleted file mode 100644 index 3b9ea5ee54..0000000000 Binary files a/data/audio/hook_attach-03.wv and /dev/null differ diff --git a/data/audio/hook_loop-01.wv b/data/audio/hook_loop-01.wv deleted file mode 100644 index f3dd305519..0000000000 Binary files a/data/audio/hook_loop-01.wv and /dev/null differ diff --git a/data/audio/hook_loop-02.wv b/data/audio/hook_loop-02.wv deleted file mode 100644 index 85e6390c0a..0000000000 Binary files a/data/audio/hook_loop-02.wv and /dev/null differ diff --git a/data/audio/hook_noattach-01.wv b/data/audio/hook_noattach-01.wv deleted file mode 100644 index 96957c736f..0000000000 Binary files a/data/audio/hook_noattach-01.wv and /dev/null differ diff --git a/data/audio/hook_noattach-02.wv b/data/audio/hook_noattach-02.wv deleted file mode 100644 index 410c94aabc..0000000000 Binary files a/data/audio/hook_noattach-02.wv and /dev/null differ diff --git a/data/audio/hook_noattach-03.wv b/data/audio/hook_noattach-03.wv deleted file mode 100644 index 2b0f70ae8d..0000000000 Binary files a/data/audio/hook_noattach-03.wv and /dev/null differ diff --git a/data/audio/music_menu.wv b/data/audio/music_menu.wv deleted file mode 100644 index b396c5811c..0000000000 Binary files a/data/audio/music_menu.wv and /dev/null differ diff --git a/data/audio/sfx_ctf_cap_pl.wv b/data/audio/sfx_ctf_cap_pl.wv deleted file mode 100644 index d9a5022a75..0000000000 Binary files a/data/audio/sfx_ctf_cap_pl.wv and /dev/null differ diff --git a/data/audio/sfx_ctf_drop.wv b/data/audio/sfx_ctf_drop.wv deleted file mode 100644 index d5121a5509..0000000000 Binary files a/data/audio/sfx_ctf_drop.wv and /dev/null differ diff --git a/data/audio/sfx_ctf_grab_en.wv b/data/audio/sfx_ctf_grab_en.wv deleted file mode 100644 index 56c7a941ca..0000000000 Binary files a/data/audio/sfx_ctf_grab_en.wv and /dev/null differ diff --git a/data/audio/sfx_ctf_grab_pl.wv b/data/audio/sfx_ctf_grab_pl.wv deleted file mode 100644 index 62b9480562..0000000000 Binary files a/data/audio/sfx_ctf_grab_pl.wv and /dev/null differ diff --git a/data/audio/sfx_ctf_rtn.wv b/data/audio/sfx_ctf_rtn.wv deleted file mode 100644 index 6f967942e4..0000000000 Binary files a/data/audio/sfx_ctf_rtn.wv and /dev/null differ diff --git a/data/audio/sfx_hit_strong-01.wv b/data/audio/sfx_hit_strong-01.wv deleted file mode 100644 index 0cd0261476..0000000000 Binary files a/data/audio/sfx_hit_strong-01.wv and /dev/null differ diff --git a/data/audio/sfx_hit_strong-02.wv b/data/audio/sfx_hit_strong-02.wv deleted file mode 100644 index 471b9abbeb..0000000000 Binary files a/data/audio/sfx_hit_strong-02.wv and /dev/null differ diff --git a/data/audio/sfx_hit_weak-01.wv b/data/audio/sfx_hit_weak-01.wv deleted file mode 100644 index 0f320891eb..0000000000 Binary files a/data/audio/sfx_hit_weak-01.wv and /dev/null differ diff --git a/data/audio/sfx_hit_weak-02.wv b/data/audio/sfx_hit_weak-02.wv deleted file mode 100644 index 0c353eb245..0000000000 Binary files a/data/audio/sfx_hit_weak-02.wv and /dev/null differ diff --git a/data/audio/sfx_hit_weak-03.wv b/data/audio/sfx_hit_weak-03.wv deleted file mode 100644 index c29794e2be..0000000000 Binary files a/data/audio/sfx_hit_weak-03.wv and /dev/null differ diff --git a/data/audio/sfx_msg-client.wv b/data/audio/sfx_msg-client.wv deleted file mode 100644 index 516db88e90..0000000000 Binary files a/data/audio/sfx_msg-client.wv and /dev/null differ diff --git a/data/audio/sfx_msg-highlight.wv b/data/audio/sfx_msg-highlight.wv deleted file mode 100644 index 6b68b312e1..0000000000 Binary files a/data/audio/sfx_msg-highlight.wv and /dev/null differ diff --git a/data/audio/sfx_msg-server.wv b/data/audio/sfx_msg-server.wv deleted file mode 100644 index ff81143c27..0000000000 Binary files a/data/audio/sfx_msg-server.wv and /dev/null differ diff --git a/data/audio/sfx_pickup_arm-01.wv b/data/audio/sfx_pickup_arm-01.wv deleted file mode 100644 index 0655220fc8..0000000000 Binary files a/data/audio/sfx_pickup_arm-01.wv and /dev/null differ diff --git a/data/audio/sfx_pickup_arm-02.wv b/data/audio/sfx_pickup_arm-02.wv deleted file mode 100644 index 82518357f7..0000000000 Binary files a/data/audio/sfx_pickup_arm-02.wv and /dev/null differ diff --git a/data/audio/sfx_pickup_arm-03.wv b/data/audio/sfx_pickup_arm-03.wv deleted file mode 100644 index 497dad88d6..0000000000 Binary files a/data/audio/sfx_pickup_arm-03.wv and /dev/null differ diff --git a/data/audio/sfx_pickup_arm-04.wv b/data/audio/sfx_pickup_arm-04.wv deleted file mode 100644 index e10b791cbe..0000000000 Binary files a/data/audio/sfx_pickup_arm-04.wv and /dev/null differ diff --git a/data/audio/sfx_pickup_gun.wv b/data/audio/sfx_pickup_gun.wv deleted file mode 100644 index af937ce300..0000000000 Binary files a/data/audio/sfx_pickup_gun.wv and /dev/null differ diff --git a/data/audio/sfx_pickup_hrt-01.wv b/data/audio/sfx_pickup_hrt-01.wv deleted file mode 100644 index ebd0fa0d94..0000000000 Binary files a/data/audio/sfx_pickup_hrt-01.wv and /dev/null differ diff --git a/data/audio/sfx_pickup_hrt-02.wv b/data/audio/sfx_pickup_hrt-02.wv deleted file mode 100644 index 1c5c8212a3..0000000000 Binary files a/data/audio/sfx_pickup_hrt-02.wv and /dev/null differ diff --git a/data/audio/sfx_pickup_launcher.wv b/data/audio/sfx_pickup_launcher.wv deleted file mode 100644 index 977b083ab6..0000000000 Binary files a/data/audio/sfx_pickup_launcher.wv and /dev/null differ diff --git a/data/audio/sfx_pickup_ninja.wv b/data/audio/sfx_pickup_ninja.wv deleted file mode 100644 index b8b6f5afb0..0000000000 Binary files a/data/audio/sfx_pickup_ninja.wv and /dev/null differ diff --git a/data/audio/sfx_pickup_sg.wv b/data/audio/sfx_pickup_sg.wv deleted file mode 100644 index 0bf2ddcd5e..0000000000 Binary files a/data/audio/sfx_pickup_sg.wv and /dev/null differ diff --git a/data/audio/sfx_skid-01.wv b/data/audio/sfx_skid-01.wv deleted file mode 100644 index 16702bdd76..0000000000 Binary files a/data/audio/sfx_skid-01.wv and /dev/null differ diff --git a/data/audio/sfx_skid-02.wv b/data/audio/sfx_skid-02.wv deleted file mode 100644 index 7cd1167a87..0000000000 Binary files a/data/audio/sfx_skid-02.wv and /dev/null differ diff --git a/data/audio/sfx_skid-03.wv b/data/audio/sfx_skid-03.wv deleted file mode 100644 index 98dfb7b897..0000000000 Binary files a/data/audio/sfx_skid-03.wv and /dev/null differ diff --git a/data/audio/sfx_skid-04.wv b/data/audio/sfx_skid-04.wv deleted file mode 100644 index ce8f83b624..0000000000 Binary files a/data/audio/sfx_skid-04.wv and /dev/null differ diff --git a/data/audio/sfx_spawn_wpn-01.wv b/data/audio/sfx_spawn_wpn-01.wv deleted file mode 100644 index b372d1248e..0000000000 Binary files a/data/audio/sfx_spawn_wpn-01.wv and /dev/null differ diff --git a/data/audio/sfx_spawn_wpn-02.wv b/data/audio/sfx_spawn_wpn-02.wv deleted file mode 100644 index a978da8602..0000000000 Binary files a/data/audio/sfx_spawn_wpn-02.wv and /dev/null differ diff --git a/data/audio/sfx_spawn_wpn-03.wv b/data/audio/sfx_spawn_wpn-03.wv deleted file mode 100644 index 81f59a6c65..0000000000 Binary files a/data/audio/sfx_spawn_wpn-03.wv and /dev/null differ diff --git a/data/audio/vo_teefault_cry-01.wv b/data/audio/vo_teefault_cry-01.wv deleted file mode 100644 index 3a9bf543d9..0000000000 Binary files a/data/audio/vo_teefault_cry-01.wv and /dev/null differ diff --git a/data/audio/vo_teefault_cry-02.wv b/data/audio/vo_teefault_cry-02.wv deleted file mode 100644 index 8230d7be68..0000000000 Binary files a/data/audio/vo_teefault_cry-02.wv and /dev/null differ diff --git a/data/audio/vo_teefault_ninja-01.wv b/data/audio/vo_teefault_ninja-01.wv deleted file mode 100644 index 9dd25bfe1b..0000000000 Binary files a/data/audio/vo_teefault_ninja-01.wv and /dev/null differ diff --git a/data/audio/vo_teefault_ninja-02.wv b/data/audio/vo_teefault_ninja-02.wv deleted file mode 100644 index 71989108f7..0000000000 Binary files a/data/audio/vo_teefault_ninja-02.wv and /dev/null differ diff --git a/data/audio/vo_teefault_ninja-03.wv b/data/audio/vo_teefault_ninja-03.wv deleted file mode 100644 index 820c094852..0000000000 Binary files a/data/audio/vo_teefault_ninja-03.wv and /dev/null differ diff --git a/data/audio/vo_teefault_ninja-04.wv b/data/audio/vo_teefault_ninja-04.wv deleted file mode 100644 index ca61237e06..0000000000 Binary files a/data/audio/vo_teefault_ninja-04.wv and /dev/null differ diff --git a/data/audio/vo_teefault_pain_long-01.wv b/data/audio/vo_teefault_pain_long-01.wv deleted file mode 100644 index f08f22ecfa..0000000000 Binary files a/data/audio/vo_teefault_pain_long-01.wv and /dev/null differ diff --git a/data/audio/vo_teefault_pain_long-02.wv b/data/audio/vo_teefault_pain_long-02.wv deleted file mode 100644 index a5c910be8d..0000000000 Binary files a/data/audio/vo_teefault_pain_long-02.wv and /dev/null differ diff --git a/data/audio/vo_teefault_pain_short-01.wv b/data/audio/vo_teefault_pain_short-01.wv deleted file mode 100644 index f4d938100e..0000000000 Binary files a/data/audio/vo_teefault_pain_short-01.wv and /dev/null differ diff --git a/data/audio/vo_teefault_pain_short-02.wv b/data/audio/vo_teefault_pain_short-02.wv deleted file mode 100644 index 9af515f489..0000000000 Binary files a/data/audio/vo_teefault_pain_short-02.wv and /dev/null differ diff --git a/data/audio/vo_teefault_pain_short-03.wv b/data/audio/vo_teefault_pain_short-03.wv deleted file mode 100644 index 6e306030f6..0000000000 Binary files a/data/audio/vo_teefault_pain_short-03.wv and /dev/null differ diff --git a/data/audio/vo_teefault_pain_short-04.wv b/data/audio/vo_teefault_pain_short-04.wv deleted file mode 100644 index 195efa8020..0000000000 Binary files a/data/audio/vo_teefault_pain_short-04.wv and /dev/null differ diff --git a/data/audio/vo_teefault_pain_short-05.wv b/data/audio/vo_teefault_pain_short-05.wv deleted file mode 100644 index 8edb4d9773..0000000000 Binary files a/data/audio/vo_teefault_pain_short-05.wv and /dev/null differ diff --git a/data/audio/vo_teefault_pain_short-06.wv b/data/audio/vo_teefault_pain_short-06.wv deleted file mode 100644 index c9311c6f5b..0000000000 Binary files a/data/audio/vo_teefault_pain_short-06.wv and /dev/null differ diff --git a/data/audio/vo_teefault_pain_short-07.wv b/data/audio/vo_teefault_pain_short-07.wv deleted file mode 100644 index 9e429e91df..0000000000 Binary files a/data/audio/vo_teefault_pain_short-07.wv and /dev/null differ diff --git a/data/audio/vo_teefault_pain_short-08.wv b/data/audio/vo_teefault_pain_short-08.wv deleted file mode 100644 index de10a72e37..0000000000 Binary files a/data/audio/vo_teefault_pain_short-08.wv and /dev/null differ diff --git a/data/audio/vo_teefault_pain_short-09.wv b/data/audio/vo_teefault_pain_short-09.wv deleted file mode 100644 index 68fb014426..0000000000 Binary files a/data/audio/vo_teefault_pain_short-09.wv and /dev/null differ diff --git a/data/audio/vo_teefault_pain_short-10.wv b/data/audio/vo_teefault_pain_short-10.wv deleted file mode 100644 index 4ef70063ae..0000000000 Binary files a/data/audio/vo_teefault_pain_short-10.wv and /dev/null differ diff --git a/data/audio/vo_teefault_pain_short-11.wv b/data/audio/vo_teefault_pain_short-11.wv deleted file mode 100644 index 4e8eca7d3f..0000000000 Binary files a/data/audio/vo_teefault_pain_short-11.wv and /dev/null differ diff --git a/data/audio/vo_teefault_pain_short-12.wv b/data/audio/vo_teefault_pain_short-12.wv deleted file mode 100644 index 785ed61509..0000000000 Binary files a/data/audio/vo_teefault_pain_short-12.wv and /dev/null differ diff --git a/data/audio/vo_teefault_sledge-01.wv b/data/audio/vo_teefault_sledge-01.wv deleted file mode 100644 index 55590b22f2..0000000000 Binary files a/data/audio/vo_teefault_sledge-01.wv and /dev/null differ diff --git a/data/audio/vo_teefault_sledge-02.wv b/data/audio/vo_teefault_sledge-02.wv deleted file mode 100644 index 92a229f21a..0000000000 Binary files a/data/audio/vo_teefault_sledge-02.wv and /dev/null differ diff --git a/data/audio/vo_teefault_sledge-03.wv b/data/audio/vo_teefault_sledge-03.wv deleted file mode 100644 index 8df9cc685d..0000000000 Binary files a/data/audio/vo_teefault_sledge-03.wv and /dev/null differ diff --git a/data/audio/vo_teefault_spawn-01.wv b/data/audio/vo_teefault_spawn-01.wv deleted file mode 100644 index 499f8d0a34..0000000000 Binary files a/data/audio/vo_teefault_spawn-01.wv and /dev/null differ diff --git a/data/audio/vo_teefault_spawn-02.wv b/data/audio/vo_teefault_spawn-02.wv deleted file mode 100644 index 6bf3437de9..0000000000 Binary files a/data/audio/vo_teefault_spawn-02.wv and /dev/null differ diff --git a/data/audio/vo_teefault_spawn-03.wv b/data/audio/vo_teefault_spawn-03.wv deleted file mode 100644 index ee954f4a04..0000000000 Binary files a/data/audio/vo_teefault_spawn-03.wv and /dev/null differ diff --git a/data/audio/vo_teefault_spawn-04.wv b/data/audio/vo_teefault_spawn-04.wv deleted file mode 100644 index 3f2a528f5f..0000000000 Binary files a/data/audio/vo_teefault_spawn-04.wv and /dev/null differ diff --git a/data/audio/vo_teefault_spawn-05.wv b/data/audio/vo_teefault_spawn-05.wv deleted file mode 100644 index 73d5df6799..0000000000 Binary files a/data/audio/vo_teefault_spawn-05.wv and /dev/null differ diff --git a/data/audio/vo_teefault_spawn-06.wv b/data/audio/vo_teefault_spawn-06.wv deleted file mode 100644 index 01c7b6e978..0000000000 Binary files a/data/audio/vo_teefault_spawn-06.wv and /dev/null differ diff --git a/data/audio/vo_teefault_spawn-07.wv b/data/audio/vo_teefault_spawn-07.wv deleted file mode 100644 index 938ae70217..0000000000 Binary files a/data/audio/vo_teefault_spawn-07.wv and /dev/null differ diff --git a/data/audio/wp_flump_explo-01.wv b/data/audio/wp_flump_explo-01.wv deleted file mode 100644 index fdb9dd5bad..0000000000 Binary files a/data/audio/wp_flump_explo-01.wv and /dev/null differ diff --git a/data/audio/wp_flump_explo-02.wv b/data/audio/wp_flump_explo-02.wv deleted file mode 100644 index 97f595a02f..0000000000 Binary files a/data/audio/wp_flump_explo-02.wv and /dev/null differ diff --git a/data/audio/wp_flump_explo-03.wv b/data/audio/wp_flump_explo-03.wv deleted file mode 100644 index 54618709eb..0000000000 Binary files a/data/audio/wp_flump_explo-03.wv and /dev/null differ diff --git a/data/audio/wp_flump_launch-01.wv b/data/audio/wp_flump_launch-01.wv deleted file mode 100644 index 6aab68593e..0000000000 Binary files a/data/audio/wp_flump_launch-01.wv and /dev/null differ diff --git a/data/audio/wp_flump_launch-02.wv b/data/audio/wp_flump_launch-02.wv deleted file mode 100644 index 305938d3b2..0000000000 Binary files a/data/audio/wp_flump_launch-02.wv and /dev/null differ diff --git a/data/audio/wp_flump_launch-03.wv b/data/audio/wp_flump_launch-03.wv deleted file mode 100644 index 3454e955e4..0000000000 Binary files a/data/audio/wp_flump_launch-03.wv and /dev/null differ diff --git a/data/audio/wp_gun_fire-01.wv b/data/audio/wp_gun_fire-01.wv deleted file mode 100644 index 17bd9cf4a8..0000000000 Binary files a/data/audio/wp_gun_fire-01.wv and /dev/null differ diff --git a/data/audio/wp_gun_fire-02.wv b/data/audio/wp_gun_fire-02.wv deleted file mode 100644 index c7290f3ade..0000000000 Binary files a/data/audio/wp_gun_fire-02.wv and /dev/null differ diff --git a/data/audio/wp_gun_fire-03.wv b/data/audio/wp_gun_fire-03.wv deleted file mode 100644 index b9afb2fa52..0000000000 Binary files a/data/audio/wp_gun_fire-03.wv and /dev/null differ diff --git a/data/audio/wp_hammer_hit-01.wv b/data/audio/wp_hammer_hit-01.wv deleted file mode 100644 index 3177feae33..0000000000 Binary files a/data/audio/wp_hammer_hit-01.wv and /dev/null differ diff --git a/data/audio/wp_hammer_hit-02.wv b/data/audio/wp_hammer_hit-02.wv deleted file mode 100644 index e033019ed0..0000000000 Binary files a/data/audio/wp_hammer_hit-02.wv and /dev/null differ diff --git a/data/audio/wp_hammer_hit-03.wv b/data/audio/wp_hammer_hit-03.wv deleted file mode 100644 index 5fd00fea21..0000000000 Binary files a/data/audio/wp_hammer_hit-03.wv and /dev/null differ diff --git a/data/audio/wp_hammer_swing-01.wv b/data/audio/wp_hammer_swing-01.wv deleted file mode 100644 index 5081c07adb..0000000000 Binary files a/data/audio/wp_hammer_swing-01.wv and /dev/null differ diff --git a/data/audio/wp_hammer_swing-02.wv b/data/audio/wp_hammer_swing-02.wv deleted file mode 100644 index 5f635a6cdf..0000000000 Binary files a/data/audio/wp_hammer_swing-02.wv and /dev/null differ diff --git a/data/audio/wp_hammer_swing-03.wv b/data/audio/wp_hammer_swing-03.wv deleted file mode 100644 index 703f234490..0000000000 Binary files a/data/audio/wp_hammer_swing-03.wv and /dev/null differ diff --git a/data/audio/wp_laser_bnce-01.wv b/data/audio/wp_laser_bnce-01.wv deleted file mode 100644 index be367571e4..0000000000 Binary files a/data/audio/wp_laser_bnce-01.wv and /dev/null differ diff --git a/data/audio/wp_laser_bnce-02.wv b/data/audio/wp_laser_bnce-02.wv deleted file mode 100644 index 012be5fdb5..0000000000 Binary files a/data/audio/wp_laser_bnce-02.wv and /dev/null differ diff --git a/data/audio/wp_laser_bnce-03.wv b/data/audio/wp_laser_bnce-03.wv deleted file mode 100644 index 16d4935739..0000000000 Binary files a/data/audio/wp_laser_bnce-03.wv and /dev/null differ diff --git a/data/audio/wp_laser_fire-01.wv b/data/audio/wp_laser_fire-01.wv deleted file mode 100644 index dddab57719..0000000000 Binary files a/data/audio/wp_laser_fire-01.wv and /dev/null differ diff --git a/data/audio/wp_laser_fire-02.wv b/data/audio/wp_laser_fire-02.wv deleted file mode 100644 index 74d178969c..0000000000 Binary files a/data/audio/wp_laser_fire-02.wv and /dev/null differ diff --git a/data/audio/wp_laser_fire-03.wv b/data/audio/wp_laser_fire-03.wv deleted file mode 100644 index a931bd26e3..0000000000 Binary files a/data/audio/wp_laser_fire-03.wv and /dev/null differ diff --git a/data/audio/wp_ninja_attack-01.wv b/data/audio/wp_ninja_attack-01.wv deleted file mode 100644 index 5cfd540abb..0000000000 Binary files a/data/audio/wp_ninja_attack-01.wv and /dev/null differ diff --git a/data/audio/wp_ninja_attack-02.wv b/data/audio/wp_ninja_attack-02.wv deleted file mode 100644 index f19741f2d4..0000000000 Binary files a/data/audio/wp_ninja_attack-02.wv and /dev/null differ diff --git a/data/audio/wp_ninja_attack-03.wv b/data/audio/wp_ninja_attack-03.wv deleted file mode 100644 index 62ad05e8d4..0000000000 Binary files a/data/audio/wp_ninja_attack-03.wv and /dev/null differ diff --git a/data/audio/wp_ninja_attack-04.wv b/data/audio/wp_ninja_attack-04.wv deleted file mode 100644 index b2fa87a5a7..0000000000 Binary files a/data/audio/wp_ninja_attack-04.wv and /dev/null differ diff --git a/data/audio/wp_ninja_hit-01.wv b/data/audio/wp_ninja_hit-01.wv deleted file mode 100644 index d2e5bd6334..0000000000 Binary files a/data/audio/wp_ninja_hit-01.wv and /dev/null differ diff --git a/data/audio/wp_ninja_hit-02.wv b/data/audio/wp_ninja_hit-02.wv deleted file mode 100644 index 79f3bcbe87..0000000000 Binary files a/data/audio/wp_ninja_hit-02.wv and /dev/null differ diff --git a/data/audio/wp_ninja_hit-03.wv b/data/audio/wp_ninja_hit-03.wv deleted file mode 100644 index 249664f1b3..0000000000 Binary files a/data/audio/wp_ninja_hit-03.wv and /dev/null differ diff --git a/data/audio/wp_ninja_hit-04.wv b/data/audio/wp_ninja_hit-04.wv deleted file mode 100644 index 2279e16b95..0000000000 Binary files a/data/audio/wp_ninja_hit-04.wv and /dev/null differ diff --git a/data/audio/wp_noammo-01.wv b/data/audio/wp_noammo-01.wv deleted file mode 100644 index a2ba8bada4..0000000000 Binary files a/data/audio/wp_noammo-01.wv and /dev/null differ diff --git a/data/audio/wp_noammo-02.wv b/data/audio/wp_noammo-02.wv deleted file mode 100644 index 7f97bf2e66..0000000000 Binary files a/data/audio/wp_noammo-02.wv and /dev/null differ diff --git a/data/audio/wp_noammo-03.wv b/data/audio/wp_noammo-03.wv deleted file mode 100644 index 1a33b4316c..0000000000 Binary files a/data/audio/wp_noammo-03.wv and /dev/null differ diff --git a/data/audio/wp_noammo-04.wv b/data/audio/wp_noammo-04.wv deleted file mode 100644 index 85b0124174..0000000000 Binary files a/data/audio/wp_noammo-04.wv and /dev/null differ diff --git a/data/audio/wp_noammo-05.wv b/data/audio/wp_noammo-05.wv deleted file mode 100644 index 2e8eef0491..0000000000 Binary files a/data/audio/wp_noammo-05.wv and /dev/null differ diff --git a/data/audio/wp_shotty_fire-01.wv b/data/audio/wp_shotty_fire-01.wv deleted file mode 100644 index f303bc3440..0000000000 Binary files a/data/audio/wp_shotty_fire-01.wv and /dev/null differ diff --git a/data/audio/wp_shotty_fire-02.wv b/data/audio/wp_shotty_fire-02.wv deleted file mode 100644 index feb87b96cf..0000000000 Binary files a/data/audio/wp_shotty_fire-02.wv and /dev/null differ diff --git a/data/audio/wp_shotty_fire-03.wv b/data/audio/wp_shotty_fire-03.wv deleted file mode 100644 index 0a3ad08169..0000000000 Binary files a/data/audio/wp_shotty_fire-03.wv and /dev/null differ diff --git a/data/audio/wp_switch-01.wv b/data/audio/wp_switch-01.wv deleted file mode 100644 index a405b10789..0000000000 Binary files a/data/audio/wp_switch-01.wv and /dev/null differ diff --git a/data/audio/wp_switch-02.wv b/data/audio/wp_switch-02.wv deleted file mode 100644 index bcb4372b47..0000000000 Binary files a/data/audio/wp_switch-02.wv and /dev/null differ diff --git a/data/audio/wp_switch-03.wv b/data/audio/wp_switch-03.wv deleted file mode 100644 index a2bedf2d33..0000000000 Binary files a/data/audio/wp_switch-03.wv and /dev/null differ diff --git a/data/background_noise.png b/data/background_noise.png deleted file mode 100644 index 31af989630..0000000000 Binary files a/data/background_noise.png and /dev/null differ diff --git a/data/blob.png b/data/blob.png deleted file mode 100644 index ff05fd8b1f..0000000000 Binary files a/data/blob.png and /dev/null differ diff --git a/data/communityicons/none.png b/data/communityicons/none.png deleted file mode 100644 index e29fccfce3..0000000000 Binary files a/data/communityicons/none.png and /dev/null differ diff --git a/data/countryflags/AD.png b/data/countryflags/AD.png deleted file mode 100644 index 196e58e32e..0000000000 Binary files a/data/countryflags/AD.png and /dev/null differ diff --git a/data/countryflags/AE.png b/data/countryflags/AE.png deleted file mode 100644 index 9ce0e4b9ef..0000000000 Binary files a/data/countryflags/AE.png and /dev/null differ diff --git a/data/countryflags/AF.png b/data/countryflags/AF.png deleted file mode 100644 index 7e5aeccc42..0000000000 Binary files a/data/countryflags/AF.png and /dev/null differ diff --git a/data/countryflags/AG.png b/data/countryflags/AG.png deleted file mode 100644 index d762098259..0000000000 Binary files a/data/countryflags/AG.png and /dev/null differ diff --git a/data/countryflags/AI.png b/data/countryflags/AI.png deleted file mode 100644 index 90d60f81b3..0000000000 Binary files a/data/countryflags/AI.png and /dev/null differ diff --git a/data/countryflags/AL.png b/data/countryflags/AL.png deleted file mode 100644 index b65a384419..0000000000 Binary files a/data/countryflags/AL.png and /dev/null differ diff --git a/data/countryflags/AM.png b/data/countryflags/AM.png deleted file mode 100644 index bb18fcbddc..0000000000 Binary files a/data/countryflags/AM.png and /dev/null differ diff --git a/data/countryflags/AO.png b/data/countryflags/AO.png deleted file mode 100644 index a80abe5d9c..0000000000 Binary files a/data/countryflags/AO.png and /dev/null differ diff --git a/data/countryflags/AQ.png b/data/countryflags/AQ.png deleted file mode 100644 index 0cd28fd5af..0000000000 Binary files a/data/countryflags/AQ.png and /dev/null differ diff --git a/data/countryflags/AR.png b/data/countryflags/AR.png deleted file mode 100644 index 6b2fbced52..0000000000 Binary files a/data/countryflags/AR.png and /dev/null differ diff --git a/data/countryflags/AS.png b/data/countryflags/AS.png deleted file mode 100644 index 37f53b4428..0000000000 Binary files a/data/countryflags/AS.png and /dev/null differ diff --git a/data/countryflags/AT.png b/data/countryflags/AT.png deleted file mode 100644 index 01756ad3f4..0000000000 Binary files a/data/countryflags/AT.png and /dev/null differ diff --git a/data/countryflags/AU.png b/data/countryflags/AU.png deleted file mode 100644 index 976eb843b2..0000000000 Binary files a/data/countryflags/AU.png and /dev/null differ diff --git a/data/countryflags/AW.png b/data/countryflags/AW.png deleted file mode 100644 index 3ba1da676d..0000000000 Binary files a/data/countryflags/AW.png and /dev/null differ diff --git a/data/countryflags/AX.png b/data/countryflags/AX.png deleted file mode 100644 index 095bd83f24..0000000000 Binary files a/data/countryflags/AX.png and /dev/null differ diff --git a/data/countryflags/AZ.png b/data/countryflags/AZ.png deleted file mode 100644 index 9e9fd8d576..0000000000 Binary files a/data/countryflags/AZ.png and /dev/null differ diff --git a/data/countryflags/BA.png b/data/countryflags/BA.png deleted file mode 100644 index 3945aa1a1b..0000000000 Binary files a/data/countryflags/BA.png and /dev/null differ diff --git a/data/countryflags/BB.png b/data/countryflags/BB.png deleted file mode 100644 index a50083a649..0000000000 Binary files a/data/countryflags/BB.png and /dev/null differ diff --git a/data/countryflags/BD.png b/data/countryflags/BD.png deleted file mode 100644 index 76fde834c2..0000000000 Binary files a/data/countryflags/BD.png and /dev/null differ diff --git a/data/countryflags/BE.png b/data/countryflags/BE.png deleted file mode 100644 index 53849e3bde..0000000000 Binary files a/data/countryflags/BE.png and /dev/null differ diff --git a/data/countryflags/BF.png b/data/countryflags/BF.png deleted file mode 100644 index 06cb5c0865..0000000000 Binary files a/data/countryflags/BF.png and /dev/null differ diff --git a/data/countryflags/BG.png b/data/countryflags/BG.png deleted file mode 100644 index 9ccae0a7d5..0000000000 Binary files a/data/countryflags/BG.png and /dev/null differ diff --git a/data/countryflags/BH.png b/data/countryflags/BH.png deleted file mode 100644 index 86009f3bb7..0000000000 Binary files a/data/countryflags/BH.png and /dev/null differ diff --git a/data/countryflags/BI.png b/data/countryflags/BI.png deleted file mode 100644 index ed94ca6a77..0000000000 Binary files a/data/countryflags/BI.png and /dev/null differ diff --git a/data/countryflags/BJ.png b/data/countryflags/BJ.png deleted file mode 100644 index fd2423d7e5..0000000000 Binary files a/data/countryflags/BJ.png and /dev/null differ diff --git a/data/countryflags/BL.png b/data/countryflags/BL.png deleted file mode 100644 index a9601f24fb..0000000000 Binary files a/data/countryflags/BL.png and /dev/null differ diff --git a/data/countryflags/BM.png b/data/countryflags/BM.png deleted file mode 100644 index 7d0b0f8416..0000000000 Binary files a/data/countryflags/BM.png and /dev/null differ diff --git a/data/countryflags/BN.png b/data/countryflags/BN.png deleted file mode 100644 index 1170dc1c06..0000000000 Binary files a/data/countryflags/BN.png and /dev/null differ diff --git a/data/countryflags/BO.png b/data/countryflags/BO.png deleted file mode 100644 index 1c059a0bdd..0000000000 Binary files a/data/countryflags/BO.png and /dev/null differ diff --git a/data/countryflags/BR.png b/data/countryflags/BR.png deleted file mode 100644 index 97d982f361..0000000000 Binary files a/data/countryflags/BR.png and /dev/null differ diff --git a/data/countryflags/BS.png b/data/countryflags/BS.png deleted file mode 100644 index 1e1da8823e..0000000000 Binary files a/data/countryflags/BS.png and /dev/null differ diff --git a/data/countryflags/BT.png b/data/countryflags/BT.png deleted file mode 100644 index 4bf2f79fb2..0000000000 Binary files a/data/countryflags/BT.png and /dev/null differ diff --git a/data/countryflags/BW.png b/data/countryflags/BW.png deleted file mode 100644 index 1160e95650..0000000000 Binary files a/data/countryflags/BW.png and /dev/null differ diff --git a/data/countryflags/BY.png b/data/countryflags/BY.png deleted file mode 100644 index 09a8fb0516..0000000000 Binary files a/data/countryflags/BY.png and /dev/null differ diff --git a/data/countryflags/BZ.png b/data/countryflags/BZ.png deleted file mode 100644 index 4634b67452..0000000000 Binary files a/data/countryflags/BZ.png and /dev/null differ diff --git a/data/countryflags/CA.png b/data/countryflags/CA.png deleted file mode 100644 index d6d29c517f..0000000000 Binary files a/data/countryflags/CA.png and /dev/null differ diff --git a/data/countryflags/CC.png b/data/countryflags/CC.png deleted file mode 100644 index c601ef9063..0000000000 Binary files a/data/countryflags/CC.png and /dev/null differ diff --git a/data/countryflags/CD.png b/data/countryflags/CD.png deleted file mode 100644 index 7c44370a85..0000000000 Binary files a/data/countryflags/CD.png and /dev/null differ diff --git a/data/countryflags/CF.png b/data/countryflags/CF.png deleted file mode 100644 index 83338b4a50..0000000000 Binary files a/data/countryflags/CF.png and /dev/null differ diff --git a/data/countryflags/CG.png b/data/countryflags/CG.png deleted file mode 100644 index 67f59cb196..0000000000 Binary files a/data/countryflags/CG.png and /dev/null differ diff --git a/data/countryflags/CH.png b/data/countryflags/CH.png deleted file mode 100644 index 625e5b00cb..0000000000 Binary files a/data/countryflags/CH.png and /dev/null differ diff --git a/data/countryflags/CI.png b/data/countryflags/CI.png deleted file mode 100644 index aca39375e3..0000000000 Binary files a/data/countryflags/CI.png and /dev/null differ diff --git a/data/countryflags/CK.png b/data/countryflags/CK.png deleted file mode 100644 index a331b0f12a..0000000000 Binary files a/data/countryflags/CK.png and /dev/null differ diff --git a/data/countryflags/CL.png b/data/countryflags/CL.png deleted file mode 100644 index edcd07513d..0000000000 Binary files a/data/countryflags/CL.png and /dev/null differ diff --git a/data/countryflags/CM.png b/data/countryflags/CM.png deleted file mode 100644 index 243c43c2da..0000000000 Binary files a/data/countryflags/CM.png and /dev/null differ diff --git a/data/countryflags/CN.png b/data/countryflags/CN.png deleted file mode 100644 index 7a402cdecc..0000000000 Binary files a/data/countryflags/CN.png and /dev/null differ diff --git a/data/countryflags/CO.png b/data/countryflags/CO.png deleted file mode 100644 index 698e67de65..0000000000 Binary files a/data/countryflags/CO.png and /dev/null differ diff --git a/data/countryflags/CR.png b/data/countryflags/CR.png deleted file mode 100644 index b71566aaff..0000000000 Binary files a/data/countryflags/CR.png and /dev/null differ diff --git a/data/countryflags/CU.png b/data/countryflags/CU.png deleted file mode 100644 index ca24f5cbd2..0000000000 Binary files a/data/countryflags/CU.png and /dev/null differ diff --git a/data/countryflags/CV.png b/data/countryflags/CV.png deleted file mode 100644 index 63e237940a..0000000000 Binary files a/data/countryflags/CV.png and /dev/null differ diff --git a/data/countryflags/CW.png b/data/countryflags/CW.png deleted file mode 100644 index 115bcb89c7..0000000000 Binary files a/data/countryflags/CW.png and /dev/null differ diff --git a/data/countryflags/CX.png b/data/countryflags/CX.png deleted file mode 100644 index 6694d1556e..0000000000 Binary files a/data/countryflags/CX.png and /dev/null differ diff --git a/data/countryflags/CY.png b/data/countryflags/CY.png deleted file mode 100644 index 4851555601..0000000000 Binary files a/data/countryflags/CY.png and /dev/null differ diff --git a/data/countryflags/CZ.png b/data/countryflags/CZ.png deleted file mode 100644 index 9828e5ae50..0000000000 Binary files a/data/countryflags/CZ.png and /dev/null differ diff --git a/data/countryflags/DE.png b/data/countryflags/DE.png deleted file mode 100644 index 1ff70ba610..0000000000 Binary files a/data/countryflags/DE.png and /dev/null differ diff --git a/data/countryflags/DJ.png b/data/countryflags/DJ.png deleted file mode 100644 index 1e0c78eff9..0000000000 Binary files a/data/countryflags/DJ.png and /dev/null differ diff --git a/data/countryflags/DK.png b/data/countryflags/DK.png deleted file mode 100644 index e8bc24ac8d..0000000000 Binary files a/data/countryflags/DK.png and /dev/null differ diff --git a/data/countryflags/DM.png b/data/countryflags/DM.png deleted file mode 100644 index c394fa7749..0000000000 Binary files a/data/countryflags/DM.png and /dev/null differ diff --git a/data/countryflags/DO.png b/data/countryflags/DO.png deleted file mode 100644 index afad91ed4a..0000000000 Binary files a/data/countryflags/DO.png and /dev/null differ diff --git a/data/countryflags/DZ.png b/data/countryflags/DZ.png deleted file mode 100644 index 0c96841719..0000000000 Binary files a/data/countryflags/DZ.png and /dev/null differ diff --git a/data/countryflags/EC.png b/data/countryflags/EC.png deleted file mode 100644 index 8673553dcc..0000000000 Binary files a/data/countryflags/EC.png and /dev/null differ diff --git a/data/countryflags/EE.png b/data/countryflags/EE.png deleted file mode 100644 index 04d30a7d6f..0000000000 Binary files a/data/countryflags/EE.png and /dev/null differ diff --git a/data/countryflags/EG.png b/data/countryflags/EG.png deleted file mode 100644 index f5a6a2ea84..0000000000 Binary files a/data/countryflags/EG.png and /dev/null differ diff --git a/data/countryflags/EH.png b/data/countryflags/EH.png deleted file mode 100644 index f78d06c1ae..0000000000 Binary files a/data/countryflags/EH.png and /dev/null differ diff --git a/data/countryflags/ER.png b/data/countryflags/ER.png deleted file mode 100644 index a43de809a3..0000000000 Binary files a/data/countryflags/ER.png and /dev/null differ diff --git a/data/countryflags/ES-CT.png b/data/countryflags/ES-CT.png deleted file mode 100644 index 72a116d962..0000000000 Binary files a/data/countryflags/ES-CT.png and /dev/null differ diff --git a/data/countryflags/ES-GA.png b/data/countryflags/ES-GA.png deleted file mode 100644 index 5860a2c759..0000000000 Binary files a/data/countryflags/ES-GA.png and /dev/null differ diff --git a/data/countryflags/ES.png b/data/countryflags/ES.png deleted file mode 100644 index 5734863749..0000000000 Binary files a/data/countryflags/ES.png and /dev/null differ diff --git a/data/countryflags/ET.png b/data/countryflags/ET.png deleted file mode 100644 index 108560ad11..0000000000 Binary files a/data/countryflags/ET.png and /dev/null differ diff --git a/data/countryflags/EU.png b/data/countryflags/EU.png deleted file mode 100644 index 5896d2bf87..0000000000 Binary files a/data/countryflags/EU.png and /dev/null differ diff --git a/data/countryflags/FI.png b/data/countryflags/FI.png deleted file mode 100644 index 980589cb65..0000000000 Binary files a/data/countryflags/FI.png and /dev/null differ diff --git a/data/countryflags/FJ.png b/data/countryflags/FJ.png deleted file mode 100644 index 200ed9461f..0000000000 Binary files a/data/countryflags/FJ.png and /dev/null differ diff --git a/data/countryflags/FK.png b/data/countryflags/FK.png deleted file mode 100644 index 7f2069ac8a..0000000000 Binary files a/data/countryflags/FK.png and /dev/null differ diff --git a/data/countryflags/FM.png b/data/countryflags/FM.png deleted file mode 100644 index e541523c29..0000000000 Binary files a/data/countryflags/FM.png and /dev/null differ diff --git a/data/countryflags/FO.png b/data/countryflags/FO.png deleted file mode 100644 index 5941bf3713..0000000000 Binary files a/data/countryflags/FO.png and /dev/null differ diff --git a/data/countryflags/FR.png b/data/countryflags/FR.png deleted file mode 100644 index 7e71018dbf..0000000000 Binary files a/data/countryflags/FR.png and /dev/null differ diff --git a/data/countryflags/GA.png b/data/countryflags/GA.png deleted file mode 100644 index 78fb74c570..0000000000 Binary files a/data/countryflags/GA.png and /dev/null differ diff --git a/data/countryflags/GB-ENG.png b/data/countryflags/GB-ENG.png deleted file mode 100644 index 6f886aaa09..0000000000 Binary files a/data/countryflags/GB-ENG.png and /dev/null differ diff --git a/data/countryflags/GB-NIR.png b/data/countryflags/GB-NIR.png deleted file mode 100644 index 7852698cec..0000000000 Binary files a/data/countryflags/GB-NIR.png and /dev/null differ diff --git a/data/countryflags/GB-SCT.png b/data/countryflags/GB-SCT.png deleted file mode 100644 index bcceafc23a..0000000000 Binary files a/data/countryflags/GB-SCT.png and /dev/null differ diff --git a/data/countryflags/GB-WLS.png b/data/countryflags/GB-WLS.png deleted file mode 100644 index c255846348..0000000000 Binary files a/data/countryflags/GB-WLS.png and /dev/null differ diff --git a/data/countryflags/GB.png b/data/countryflags/GB.png deleted file mode 100644 index 98fb5493e4..0000000000 Binary files a/data/countryflags/GB.png and /dev/null differ diff --git a/data/countryflags/GD.png b/data/countryflags/GD.png deleted file mode 100644 index 0508bbc5fe..0000000000 Binary files a/data/countryflags/GD.png and /dev/null differ diff --git a/data/countryflags/GE.png b/data/countryflags/GE.png deleted file mode 100644 index 91a43c600d..0000000000 Binary files a/data/countryflags/GE.png and /dev/null differ diff --git a/data/countryflags/GF.png b/data/countryflags/GF.png deleted file mode 100644 index c653811fbd..0000000000 Binary files a/data/countryflags/GF.png and /dev/null differ diff --git a/data/countryflags/GG.png b/data/countryflags/GG.png deleted file mode 100644 index 18f6bb3f10..0000000000 Binary files a/data/countryflags/GG.png and /dev/null differ diff --git a/data/countryflags/GH.png b/data/countryflags/GH.png deleted file mode 100644 index c852c97814..0000000000 Binary files a/data/countryflags/GH.png and /dev/null differ diff --git a/data/countryflags/GI.png b/data/countryflags/GI.png deleted file mode 100644 index 6e958990e2..0000000000 Binary files a/data/countryflags/GI.png and /dev/null differ diff --git a/data/countryflags/GL.png b/data/countryflags/GL.png deleted file mode 100644 index afc0cdf53d..0000000000 Binary files a/data/countryflags/GL.png and /dev/null differ diff --git a/data/countryflags/GM.png b/data/countryflags/GM.png deleted file mode 100644 index 73862b929c..0000000000 Binary files a/data/countryflags/GM.png and /dev/null differ diff --git a/data/countryflags/GN.png b/data/countryflags/GN.png deleted file mode 100644 index 68c8bc2140..0000000000 Binary files a/data/countryflags/GN.png and /dev/null differ diff --git a/data/countryflags/GP.png b/data/countryflags/GP.png deleted file mode 100644 index 33a02c06c0..0000000000 Binary files a/data/countryflags/GP.png and /dev/null differ diff --git a/data/countryflags/GQ.png b/data/countryflags/GQ.png deleted file mode 100644 index 4d9774fb34..0000000000 Binary files a/data/countryflags/GQ.png and /dev/null differ diff --git a/data/countryflags/GR.png b/data/countryflags/GR.png deleted file mode 100644 index d614fdc233..0000000000 Binary files a/data/countryflags/GR.png and /dev/null differ diff --git a/data/countryflags/GS.png b/data/countryflags/GS.png deleted file mode 100644 index 27960a9964..0000000000 Binary files a/data/countryflags/GS.png and /dev/null differ diff --git a/data/countryflags/GT.png b/data/countryflags/GT.png deleted file mode 100644 index 3ec41430c8..0000000000 Binary files a/data/countryflags/GT.png and /dev/null differ diff --git a/data/countryflags/GU.png b/data/countryflags/GU.png deleted file mode 100644 index c25f5f909c..0000000000 Binary files a/data/countryflags/GU.png and /dev/null differ diff --git a/data/countryflags/GW.png b/data/countryflags/GW.png deleted file mode 100644 index 9e1ae28428..0000000000 Binary files a/data/countryflags/GW.png and /dev/null differ diff --git a/data/countryflags/GY.png b/data/countryflags/GY.png deleted file mode 100644 index 43a6f83fdb..0000000000 Binary files a/data/countryflags/GY.png and /dev/null differ diff --git a/data/countryflags/HK.png b/data/countryflags/HK.png deleted file mode 100644 index 287dfd18bc..0000000000 Binary files a/data/countryflags/HK.png and /dev/null differ diff --git a/data/countryflags/HN.png b/data/countryflags/HN.png deleted file mode 100644 index 3c111cc80f..0000000000 Binary files a/data/countryflags/HN.png and /dev/null differ diff --git a/data/countryflags/HR.png b/data/countryflags/HR.png deleted file mode 100644 index 109498e6eb..0000000000 Binary files a/data/countryflags/HR.png and /dev/null differ diff --git a/data/countryflags/HT.png b/data/countryflags/HT.png deleted file mode 100644 index 59a8fef73b..0000000000 Binary files a/data/countryflags/HT.png and /dev/null differ diff --git a/data/countryflags/HU.png b/data/countryflags/HU.png deleted file mode 100644 index 31c207c7ab..0000000000 Binary files a/data/countryflags/HU.png and /dev/null differ diff --git a/data/countryflags/ID.png b/data/countryflags/ID.png deleted file mode 100644 index ac2dcfba98..0000000000 Binary files a/data/countryflags/ID.png and /dev/null differ diff --git a/data/countryflags/IE.png b/data/countryflags/IE.png deleted file mode 100644 index a5a2858ac9..0000000000 Binary files a/data/countryflags/IE.png and /dev/null differ diff --git a/data/countryflags/IL.png b/data/countryflags/IL.png deleted file mode 100644 index 2b4af9eae0..0000000000 Binary files a/data/countryflags/IL.png and /dev/null differ diff --git a/data/countryflags/IM.png b/data/countryflags/IM.png deleted file mode 100644 index 9c98068dd7..0000000000 Binary files a/data/countryflags/IM.png and /dev/null differ diff --git a/data/countryflags/IN.png b/data/countryflags/IN.png deleted file mode 100644 index 639a16500b..0000000000 Binary files a/data/countryflags/IN.png and /dev/null differ diff --git a/data/countryflags/IO.png b/data/countryflags/IO.png deleted file mode 100644 index e80752e5c8..0000000000 Binary files a/data/countryflags/IO.png and /dev/null differ diff --git a/data/countryflags/IQ.png b/data/countryflags/IQ.png deleted file mode 100644 index 88b710ce66..0000000000 Binary files a/data/countryflags/IQ.png and /dev/null differ diff --git a/data/countryflags/IR.png b/data/countryflags/IR.png deleted file mode 100644 index 8d6e7821a6..0000000000 Binary files a/data/countryflags/IR.png and /dev/null differ diff --git a/data/countryflags/IS.png b/data/countryflags/IS.png deleted file mode 100644 index b4e27be797..0000000000 Binary files a/data/countryflags/IS.png and /dev/null differ diff --git a/data/countryflags/IT.png b/data/countryflags/IT.png deleted file mode 100644 index 1f10278e80..0000000000 Binary files a/data/countryflags/IT.png and /dev/null differ diff --git a/data/countryflags/JE.png b/data/countryflags/JE.png deleted file mode 100644 index d6af2994ac..0000000000 Binary files a/data/countryflags/JE.png and /dev/null differ diff --git a/data/countryflags/JM.png b/data/countryflags/JM.png deleted file mode 100644 index 36ceeba4f8..0000000000 Binary files a/data/countryflags/JM.png and /dev/null differ diff --git a/data/countryflags/JO.png b/data/countryflags/JO.png deleted file mode 100644 index 465d06eecd..0000000000 Binary files a/data/countryflags/JO.png and /dev/null differ diff --git a/data/countryflags/JP.png b/data/countryflags/JP.png deleted file mode 100644 index df8c8c267e..0000000000 Binary files a/data/countryflags/JP.png and /dev/null differ diff --git a/data/countryflags/KE.png b/data/countryflags/KE.png deleted file mode 100644 index 7fabb40482..0000000000 Binary files a/data/countryflags/KE.png and /dev/null differ diff --git a/data/countryflags/KG.png b/data/countryflags/KG.png deleted file mode 100644 index 71fb92940f..0000000000 Binary files a/data/countryflags/KG.png and /dev/null differ diff --git a/data/countryflags/KH.png b/data/countryflags/KH.png deleted file mode 100644 index ca8e71cd5b..0000000000 Binary files a/data/countryflags/KH.png and /dev/null differ diff --git a/data/countryflags/KI.png b/data/countryflags/KI.png deleted file mode 100644 index 9b4a63b340..0000000000 Binary files a/data/countryflags/KI.png and /dev/null differ diff --git a/data/countryflags/KM.png b/data/countryflags/KM.png deleted file mode 100644 index 6dc2e60f83..0000000000 Binary files a/data/countryflags/KM.png and /dev/null differ diff --git a/data/countryflags/KN.png b/data/countryflags/KN.png deleted file mode 100644 index aa30723971..0000000000 Binary files a/data/countryflags/KN.png and /dev/null differ diff --git a/data/countryflags/KP.png b/data/countryflags/KP.png deleted file mode 100644 index 0c3c3617fd..0000000000 Binary files a/data/countryflags/KP.png and /dev/null differ diff --git a/data/countryflags/KR.png b/data/countryflags/KR.png deleted file mode 100644 index 68eb1bb9b4..0000000000 Binary files a/data/countryflags/KR.png and /dev/null differ diff --git a/data/countryflags/KW.png b/data/countryflags/KW.png deleted file mode 100644 index 90e9217dc8..0000000000 Binary files a/data/countryflags/KW.png and /dev/null differ diff --git a/data/countryflags/KY.png b/data/countryflags/KY.png deleted file mode 100644 index 364398d6ba..0000000000 Binary files a/data/countryflags/KY.png and /dev/null differ diff --git a/data/countryflags/KZ.png b/data/countryflags/KZ.png deleted file mode 100644 index 0f9f02139a..0000000000 Binary files a/data/countryflags/KZ.png and /dev/null differ diff --git a/data/countryflags/LA.png b/data/countryflags/LA.png deleted file mode 100644 index 7f69803ca3..0000000000 Binary files a/data/countryflags/LA.png and /dev/null differ diff --git a/data/countryflags/LB.png b/data/countryflags/LB.png deleted file mode 100644 index a1fbe68d3f..0000000000 Binary files a/data/countryflags/LB.png and /dev/null differ diff --git a/data/countryflags/LC.png b/data/countryflags/LC.png deleted file mode 100644 index 42531c000d..0000000000 Binary files a/data/countryflags/LC.png and /dev/null differ diff --git a/data/countryflags/LI.png b/data/countryflags/LI.png deleted file mode 100644 index 7adfb1ba4c..0000000000 Binary files a/data/countryflags/LI.png and /dev/null differ diff --git a/data/countryflags/LK.png b/data/countryflags/LK.png deleted file mode 100644 index e40bff196a..0000000000 Binary files a/data/countryflags/LK.png and /dev/null differ diff --git a/data/countryflags/LR.png b/data/countryflags/LR.png deleted file mode 100644 index a7aa1b78d2..0000000000 Binary files a/data/countryflags/LR.png and /dev/null differ diff --git a/data/countryflags/LS.png b/data/countryflags/LS.png deleted file mode 100644 index c22a8cd8f0..0000000000 Binary files a/data/countryflags/LS.png and /dev/null differ diff --git a/data/countryflags/LT.png b/data/countryflags/LT.png deleted file mode 100644 index 131e3ed26e..0000000000 Binary files a/data/countryflags/LT.png and /dev/null differ diff --git a/data/countryflags/LU.png b/data/countryflags/LU.png deleted file mode 100644 index 58d819f4ef..0000000000 Binary files a/data/countryflags/LU.png and /dev/null differ diff --git a/data/countryflags/LV.png b/data/countryflags/LV.png deleted file mode 100644 index 4e496f5f79..0000000000 Binary files a/data/countryflags/LV.png and /dev/null differ diff --git a/data/countryflags/LY.png b/data/countryflags/LY.png deleted file mode 100644 index f07e94dc89..0000000000 Binary files a/data/countryflags/LY.png and /dev/null differ diff --git a/data/countryflags/MA.png b/data/countryflags/MA.png deleted file mode 100644 index 22c489288d..0000000000 Binary files a/data/countryflags/MA.png and /dev/null differ diff --git a/data/countryflags/MC.png b/data/countryflags/MC.png deleted file mode 100644 index 21bda02449..0000000000 Binary files a/data/countryflags/MC.png and /dev/null differ diff --git a/data/countryflags/MD.png b/data/countryflags/MD.png deleted file mode 100644 index 1ee076a8c4..0000000000 Binary files a/data/countryflags/MD.png and /dev/null differ diff --git a/data/countryflags/ME.png b/data/countryflags/ME.png deleted file mode 100644 index 9c4d254255..0000000000 Binary files a/data/countryflags/ME.png and /dev/null differ diff --git a/data/countryflags/MF.png b/data/countryflags/MF.png deleted file mode 100644 index d4073db56e..0000000000 Binary files a/data/countryflags/MF.png and /dev/null differ diff --git a/data/countryflags/MG.png b/data/countryflags/MG.png deleted file mode 100644 index 0eca6b8020..0000000000 Binary files a/data/countryflags/MG.png and /dev/null differ diff --git a/data/countryflags/MH.png b/data/countryflags/MH.png deleted file mode 100644 index e8fc05a52a..0000000000 Binary files a/data/countryflags/MH.png and /dev/null differ diff --git a/data/countryflags/MK.png b/data/countryflags/MK.png deleted file mode 100644 index 0c96114191..0000000000 Binary files a/data/countryflags/MK.png and /dev/null differ diff --git a/data/countryflags/ML.png b/data/countryflags/ML.png deleted file mode 100644 index b56af4907b..0000000000 Binary files a/data/countryflags/ML.png and /dev/null differ diff --git a/data/countryflags/MM.png b/data/countryflags/MM.png deleted file mode 100644 index f5c9bfbf7a..0000000000 Binary files a/data/countryflags/MM.png and /dev/null differ diff --git a/data/countryflags/MN.png b/data/countryflags/MN.png deleted file mode 100644 index 976c44c4d8..0000000000 Binary files a/data/countryflags/MN.png and /dev/null differ diff --git a/data/countryflags/MO.png b/data/countryflags/MO.png deleted file mode 100644 index 8c8ebfebef..0000000000 Binary files a/data/countryflags/MO.png and /dev/null differ diff --git a/data/countryflags/MP.png b/data/countryflags/MP.png deleted file mode 100644 index 2b021ea6f7..0000000000 Binary files a/data/countryflags/MP.png and /dev/null differ diff --git a/data/countryflags/MQ.png b/data/countryflags/MQ.png deleted file mode 100644 index 8d7681326a..0000000000 Binary files a/data/countryflags/MQ.png and /dev/null differ diff --git a/data/countryflags/MR.png b/data/countryflags/MR.png deleted file mode 100644 index b45ed9b424..0000000000 Binary files a/data/countryflags/MR.png and /dev/null differ diff --git a/data/countryflags/MS.png b/data/countryflags/MS.png deleted file mode 100644 index 9396c31baf..0000000000 Binary files a/data/countryflags/MS.png and /dev/null differ diff --git a/data/countryflags/MT.png b/data/countryflags/MT.png deleted file mode 100644 index d2e4e37365..0000000000 Binary files a/data/countryflags/MT.png and /dev/null differ diff --git a/data/countryflags/MU.png b/data/countryflags/MU.png deleted file mode 100644 index 7df5c53b49..0000000000 Binary files a/data/countryflags/MU.png and /dev/null differ diff --git a/data/countryflags/MV.png b/data/countryflags/MV.png deleted file mode 100644 index ab6c1f352f..0000000000 Binary files a/data/countryflags/MV.png and /dev/null differ diff --git a/data/countryflags/MW.png b/data/countryflags/MW.png deleted file mode 100644 index 669f4da1e4..0000000000 Binary files a/data/countryflags/MW.png and /dev/null differ diff --git a/data/countryflags/MX.png b/data/countryflags/MX.png deleted file mode 100644 index 441bafbb94..0000000000 Binary files a/data/countryflags/MX.png and /dev/null differ diff --git a/data/countryflags/MY.png b/data/countryflags/MY.png deleted file mode 100644 index ea77e649d1..0000000000 Binary files a/data/countryflags/MY.png and /dev/null differ diff --git a/data/countryflags/MZ.png b/data/countryflags/MZ.png deleted file mode 100644 index 31b4798002..0000000000 Binary files a/data/countryflags/MZ.png and /dev/null differ diff --git a/data/countryflags/NA.png b/data/countryflags/NA.png deleted file mode 100644 index 3c146d0cfa..0000000000 Binary files a/data/countryflags/NA.png and /dev/null differ diff --git a/data/countryflags/NC.png b/data/countryflags/NC.png deleted file mode 100644 index b356c0baad..0000000000 Binary files a/data/countryflags/NC.png and /dev/null differ diff --git a/data/countryflags/NE.png b/data/countryflags/NE.png deleted file mode 100644 index 0e3509c94f..0000000000 Binary files a/data/countryflags/NE.png and /dev/null differ diff --git a/data/countryflags/NF.png b/data/countryflags/NF.png deleted file mode 100644 index 0bc64800bc..0000000000 Binary files a/data/countryflags/NF.png and /dev/null differ diff --git a/data/countryflags/NG.png b/data/countryflags/NG.png deleted file mode 100644 index 02a8b4cfc7..0000000000 Binary files a/data/countryflags/NG.png and /dev/null differ diff --git a/data/countryflags/NI.png b/data/countryflags/NI.png deleted file mode 100644 index c0a835abd9..0000000000 Binary files a/data/countryflags/NI.png and /dev/null differ diff --git a/data/countryflags/NL.png b/data/countryflags/NL.png deleted file mode 100644 index f151f2b5e2..0000000000 Binary files a/data/countryflags/NL.png and /dev/null differ diff --git a/data/countryflags/NO.png b/data/countryflags/NO.png deleted file mode 100644 index 0a90a7ef80..0000000000 Binary files a/data/countryflags/NO.png and /dev/null differ diff --git a/data/countryflags/NP.png b/data/countryflags/NP.png deleted file mode 100644 index fe382bba97..0000000000 Binary files a/data/countryflags/NP.png and /dev/null differ diff --git a/data/countryflags/NR.png b/data/countryflags/NR.png deleted file mode 100644 index 777f47724d..0000000000 Binary files a/data/countryflags/NR.png and /dev/null differ diff --git a/data/countryflags/NU.png b/data/countryflags/NU.png deleted file mode 100644 index 78668c7110..0000000000 Binary files a/data/countryflags/NU.png and /dev/null differ diff --git a/data/countryflags/NZ.png b/data/countryflags/NZ.png deleted file mode 100644 index e3a5db8596..0000000000 Binary files a/data/countryflags/NZ.png and /dev/null differ diff --git a/data/countryflags/OM.png b/data/countryflags/OM.png deleted file mode 100644 index d3d6483167..0000000000 Binary files a/data/countryflags/OM.png and /dev/null differ diff --git a/data/countryflags/PA.png b/data/countryflags/PA.png deleted file mode 100644 index 6489ddde3d..0000000000 Binary files a/data/countryflags/PA.png and /dev/null differ diff --git a/data/countryflags/PE.png b/data/countryflags/PE.png deleted file mode 100644 index 20661357c1..0000000000 Binary files a/data/countryflags/PE.png and /dev/null differ diff --git a/data/countryflags/PF.png b/data/countryflags/PF.png deleted file mode 100644 index e16894c1ca..0000000000 Binary files a/data/countryflags/PF.png and /dev/null differ diff --git a/data/countryflags/PG.png b/data/countryflags/PG.png deleted file mode 100644 index 0226ea3c69..0000000000 Binary files a/data/countryflags/PG.png and /dev/null differ diff --git a/data/countryflags/PH.png b/data/countryflags/PH.png deleted file mode 100644 index 928e743ac2..0000000000 Binary files a/data/countryflags/PH.png and /dev/null differ diff --git a/data/countryflags/PK.png b/data/countryflags/PK.png deleted file mode 100644 index 835ecc5465..0000000000 Binary files a/data/countryflags/PK.png and /dev/null differ diff --git a/data/countryflags/PL.png b/data/countryflags/PL.png deleted file mode 100644 index 9ffc682f79..0000000000 Binary files a/data/countryflags/PL.png and /dev/null differ diff --git a/data/countryflags/PM.png b/data/countryflags/PM.png deleted file mode 100644 index 57d7355d76..0000000000 Binary files a/data/countryflags/PM.png and /dev/null differ diff --git a/data/countryflags/PN.png b/data/countryflags/PN.png deleted file mode 100644 index 1f21ef1f5d..0000000000 Binary files a/data/countryflags/PN.png and /dev/null differ diff --git a/data/countryflags/PR.png b/data/countryflags/PR.png deleted file mode 100644 index e28f1cd6f1..0000000000 Binary files a/data/countryflags/PR.png and /dev/null differ diff --git a/data/countryflags/PS.png b/data/countryflags/PS.png deleted file mode 100644 index f8d81601ee..0000000000 Binary files a/data/countryflags/PS.png and /dev/null differ diff --git a/data/countryflags/PT.png b/data/countryflags/PT.png deleted file mode 100644 index 4fd5a4019d..0000000000 Binary files a/data/countryflags/PT.png and /dev/null differ diff --git a/data/countryflags/PW.png b/data/countryflags/PW.png deleted file mode 100644 index 3a0cbc4748..0000000000 Binary files a/data/countryflags/PW.png and /dev/null differ diff --git a/data/countryflags/PY.png b/data/countryflags/PY.png deleted file mode 100644 index f4334643d6..0000000000 Binary files a/data/countryflags/PY.png and /dev/null differ diff --git a/data/countryflags/QA.png b/data/countryflags/QA.png deleted file mode 100644 index 2dcccd016c..0000000000 Binary files a/data/countryflags/QA.png and /dev/null differ diff --git a/data/countryflags/RE.png b/data/countryflags/RE.png deleted file mode 100644 index d6e57ee55b..0000000000 Binary files a/data/countryflags/RE.png and /dev/null differ diff --git a/data/countryflags/RO.png b/data/countryflags/RO.png deleted file mode 100644 index 10c1344560..0000000000 Binary files a/data/countryflags/RO.png and /dev/null differ diff --git a/data/countryflags/RS.png b/data/countryflags/RS.png deleted file mode 100644 index 7ebdd68d0e..0000000000 Binary files a/data/countryflags/RS.png and /dev/null differ diff --git a/data/countryflags/RU.png b/data/countryflags/RU.png deleted file mode 100644 index ddf0095636..0000000000 Binary files a/data/countryflags/RU.png and /dev/null differ diff --git a/data/countryflags/RW.png b/data/countryflags/RW.png deleted file mode 100644 index 59111bac11..0000000000 Binary files a/data/countryflags/RW.png and /dev/null differ diff --git a/data/countryflags/SA.png b/data/countryflags/SA.png deleted file mode 100644 index 94dc17960d..0000000000 Binary files a/data/countryflags/SA.png and /dev/null differ diff --git a/data/countryflags/SB.png b/data/countryflags/SB.png deleted file mode 100644 index e016f576dc..0000000000 Binary files a/data/countryflags/SB.png and /dev/null differ diff --git a/data/countryflags/SC.png b/data/countryflags/SC.png deleted file mode 100644 index 7eb232b4e4..0000000000 Binary files a/data/countryflags/SC.png and /dev/null differ diff --git a/data/countryflags/SD.png b/data/countryflags/SD.png deleted file mode 100644 index ffc43f0428..0000000000 Binary files a/data/countryflags/SD.png and /dev/null differ diff --git a/data/countryflags/SE.png b/data/countryflags/SE.png deleted file mode 100644 index 9a07190fcb..0000000000 Binary files a/data/countryflags/SE.png and /dev/null differ diff --git a/data/countryflags/SG.png b/data/countryflags/SG.png deleted file mode 100644 index 99f3b015af..0000000000 Binary files a/data/countryflags/SG.png and /dev/null differ diff --git a/data/countryflags/SH.png b/data/countryflags/SH.png deleted file mode 100644 index a38aea322c..0000000000 Binary files a/data/countryflags/SH.png and /dev/null differ diff --git a/data/countryflags/SI.png b/data/countryflags/SI.png deleted file mode 100644 index 350a3af2a0..0000000000 Binary files a/data/countryflags/SI.png and /dev/null differ diff --git a/data/countryflags/SK.png b/data/countryflags/SK.png deleted file mode 100644 index 20e67b3238..0000000000 Binary files a/data/countryflags/SK.png and /dev/null differ diff --git a/data/countryflags/SL.png b/data/countryflags/SL.png deleted file mode 100644 index 9babb0122f..0000000000 Binary files a/data/countryflags/SL.png and /dev/null differ diff --git a/data/countryflags/SM.png b/data/countryflags/SM.png deleted file mode 100644 index 3aaea35360..0000000000 Binary files a/data/countryflags/SM.png and /dev/null differ diff --git a/data/countryflags/SN.png b/data/countryflags/SN.png deleted file mode 100644 index 9c86b93662..0000000000 Binary files a/data/countryflags/SN.png and /dev/null differ diff --git a/data/countryflags/SO.png b/data/countryflags/SO.png deleted file mode 100644 index a26bc0c2fe..0000000000 Binary files a/data/countryflags/SO.png and /dev/null differ diff --git a/data/countryflags/SR.png b/data/countryflags/SR.png deleted file mode 100644 index 106c785d61..0000000000 Binary files a/data/countryflags/SR.png and /dev/null differ diff --git a/data/countryflags/SS.png b/data/countryflags/SS.png deleted file mode 100644 index 2bd4cbbd78..0000000000 Binary files a/data/countryflags/SS.png and /dev/null differ diff --git a/data/countryflags/ST.png b/data/countryflags/ST.png deleted file mode 100644 index ee46fe2880..0000000000 Binary files a/data/countryflags/ST.png and /dev/null differ diff --git a/data/countryflags/SV.png b/data/countryflags/SV.png deleted file mode 100644 index 4e03d3a70e..0000000000 Binary files a/data/countryflags/SV.png and /dev/null differ diff --git a/data/countryflags/SX.png b/data/countryflags/SX.png deleted file mode 100644 index 560e19ce33..0000000000 Binary files a/data/countryflags/SX.png and /dev/null differ diff --git a/data/countryflags/SY.png b/data/countryflags/SY.png deleted file mode 100644 index 06bc504010..0000000000 Binary files a/data/countryflags/SY.png and /dev/null differ diff --git a/data/countryflags/SZ.png b/data/countryflags/SZ.png deleted file mode 100644 index 87cdcf7762..0000000000 Binary files a/data/countryflags/SZ.png and /dev/null differ diff --git a/data/countryflags/TC.png b/data/countryflags/TC.png deleted file mode 100644 index e85d21a2a5..0000000000 Binary files a/data/countryflags/TC.png and /dev/null differ diff --git a/data/countryflags/TD.png b/data/countryflags/TD.png deleted file mode 100644 index dd9f7a1fdd..0000000000 Binary files a/data/countryflags/TD.png and /dev/null differ diff --git a/data/countryflags/TF.png b/data/countryflags/TF.png deleted file mode 100644 index f14df56577..0000000000 Binary files a/data/countryflags/TF.png and /dev/null differ diff --git a/data/countryflags/TG.png b/data/countryflags/TG.png deleted file mode 100644 index c08f9b916f..0000000000 Binary files a/data/countryflags/TG.png and /dev/null differ diff --git a/data/countryflags/TH.png b/data/countryflags/TH.png deleted file mode 100644 index 5894a815e4..0000000000 Binary files a/data/countryflags/TH.png and /dev/null differ diff --git a/data/countryflags/TJ.png b/data/countryflags/TJ.png deleted file mode 100644 index b5d7862aef..0000000000 Binary files a/data/countryflags/TJ.png and /dev/null differ diff --git a/data/countryflags/TK.png b/data/countryflags/TK.png deleted file mode 100644 index 53d1ea176b..0000000000 Binary files a/data/countryflags/TK.png and /dev/null differ diff --git a/data/countryflags/TL.png b/data/countryflags/TL.png deleted file mode 100644 index df63f75433..0000000000 Binary files a/data/countryflags/TL.png and /dev/null differ diff --git a/data/countryflags/TM.png b/data/countryflags/TM.png deleted file mode 100644 index cacfff5ffd..0000000000 Binary files a/data/countryflags/TM.png and /dev/null differ diff --git a/data/countryflags/TN.png b/data/countryflags/TN.png deleted file mode 100644 index 5f9015570c..0000000000 Binary files a/data/countryflags/TN.png and /dev/null differ diff --git a/data/countryflags/TO.png b/data/countryflags/TO.png deleted file mode 100644 index 4af9d09f40..0000000000 Binary files a/data/countryflags/TO.png and /dev/null differ diff --git a/data/countryflags/TR.png b/data/countryflags/TR.png deleted file mode 100644 index 7e4a3d8572..0000000000 Binary files a/data/countryflags/TR.png and /dev/null differ diff --git a/data/countryflags/TT.png b/data/countryflags/TT.png deleted file mode 100644 index 22b8d10ab4..0000000000 Binary files a/data/countryflags/TT.png and /dev/null differ diff --git a/data/countryflags/TV.png b/data/countryflags/TV.png deleted file mode 100644 index 221d9d8e6e..0000000000 Binary files a/data/countryflags/TV.png and /dev/null differ diff --git a/data/countryflags/TW.png b/data/countryflags/TW.png deleted file mode 100644 index 40ba3a2f60..0000000000 Binary files a/data/countryflags/TW.png and /dev/null differ diff --git a/data/countryflags/TZ.png b/data/countryflags/TZ.png deleted file mode 100644 index c12f407975..0000000000 Binary files a/data/countryflags/TZ.png and /dev/null differ diff --git a/data/countryflags/UA.png b/data/countryflags/UA.png deleted file mode 100644 index 0555bdc952..0000000000 Binary files a/data/countryflags/UA.png and /dev/null differ diff --git a/data/countryflags/UG.png b/data/countryflags/UG.png deleted file mode 100644 index 28a3b4990f..0000000000 Binary files a/data/countryflags/UG.png and /dev/null differ diff --git a/data/countryflags/US.png b/data/countryflags/US.png deleted file mode 100644 index a232621a64..0000000000 Binary files a/data/countryflags/US.png and /dev/null differ diff --git a/data/countryflags/UY.png b/data/countryflags/UY.png deleted file mode 100644 index 4edfb06948..0000000000 Binary files a/data/countryflags/UY.png and /dev/null differ diff --git a/data/countryflags/UZ.png b/data/countryflags/UZ.png deleted file mode 100644 index a8db7a7e06..0000000000 Binary files a/data/countryflags/UZ.png and /dev/null differ diff --git a/data/countryflags/VA.png b/data/countryflags/VA.png deleted file mode 100644 index 7adfc74f81..0000000000 Binary files a/data/countryflags/VA.png and /dev/null differ diff --git a/data/countryflags/VC.png b/data/countryflags/VC.png deleted file mode 100644 index bd553bfb36..0000000000 Binary files a/data/countryflags/VC.png and /dev/null differ diff --git a/data/countryflags/VE.png b/data/countryflags/VE.png deleted file mode 100644 index 70d2726a02..0000000000 Binary files a/data/countryflags/VE.png and /dev/null differ diff --git a/data/countryflags/VG.png b/data/countryflags/VG.png deleted file mode 100644 index 9fac7941f3..0000000000 Binary files a/data/countryflags/VG.png and /dev/null differ diff --git a/data/countryflags/VI.png b/data/countryflags/VI.png deleted file mode 100644 index 65402ef2f7..0000000000 Binary files a/data/countryflags/VI.png and /dev/null differ diff --git a/data/countryflags/VN.png b/data/countryflags/VN.png deleted file mode 100644 index d034ce3831..0000000000 Binary files a/data/countryflags/VN.png and /dev/null differ diff --git a/data/countryflags/VU.png b/data/countryflags/VU.png deleted file mode 100644 index ed2b6cedd2..0000000000 Binary files a/data/countryflags/VU.png and /dev/null differ diff --git a/data/countryflags/WF.png b/data/countryflags/WF.png deleted file mode 100644 index 519b5d6a6a..0000000000 Binary files a/data/countryflags/WF.png and /dev/null differ diff --git a/data/countryflags/WS.png b/data/countryflags/WS.png deleted file mode 100644 index 84a18d6664..0000000000 Binary files a/data/countryflags/WS.png and /dev/null differ diff --git a/data/countryflags/YE.png b/data/countryflags/YE.png deleted file mode 100644 index e29fb146a5..0000000000 Binary files a/data/countryflags/YE.png and /dev/null differ diff --git a/data/countryflags/ZA.png b/data/countryflags/ZA.png deleted file mode 100644 index 3d9b820bac..0000000000 Binary files a/data/countryflags/ZA.png and /dev/null differ diff --git a/data/countryflags/ZM.png b/data/countryflags/ZM.png deleted file mode 100644 index 1b94471ab9..0000000000 Binary files a/data/countryflags/ZM.png and /dev/null differ diff --git a/data/countryflags/ZW.png b/data/countryflags/ZW.png deleted file mode 100644 index 99ab2ddeb5..0000000000 Binary files a/data/countryflags/ZW.png and /dev/null differ diff --git a/data/countryflags/default.png b/data/countryflags/default.png deleted file mode 100644 index b26f2a3fac..0000000000 Binary files a/data/countryflags/default.png and /dev/null differ diff --git a/data/countryflags/index.txt b/data/countryflags/index.txt deleted file mode 100644 index 28ece35085..0000000000 --- a/data/countryflags/index.txt +++ /dev/null @@ -1,781 +0,0 @@ - -##### country codes ##### - -##### custom ##### - -default -== -1 - -##### ISO 3166-2 subdivisions ##### - -GB-ENG -== 901 - -GB-NIR -== 902 - -GB-SCT -== 903 - -GB-WLS -== 904 - -ES-CT -== 906 - -ES-GA -== 907 - -##### ISO 3166/MA exceptional reservations ##### - -EU -== 905 - -##### ISO 3166-1 based ##### - -AF -== 4 - -AX -== 248 - -AL -== 8 - -DZ -== 12 - -AS -== 16 - -AD -== 20 - -AO -== 24 - -AI -== 660 - -AQ -== 10 - -AG -== 28 - -AR -== 32 - -AM -== 51 - -AW -== 533 - -AU -== 36 - -AT -== 40 - -AZ -== 31 - -BS -== 44 - -BH -== 48 - -BD -== 50 - -BB -== 52 - -BY -== 112 - -BE -== 56 - -BZ -== 84 - -BJ -== 204 - -BM -== 60 - -BT -== 64 - -BO -== 68 - -#BQ -#== 535 - -BA -== 70 - -BW -== 72 - -#BV -#== 74 - -BR -== 76 - -IO -== 86 - -BN -== 96 - -BG -== 100 - -BF -== 854 - -BI -== 108 - -KH -== 116 - -CM -== 120 - -CA -== 124 - -CV -== 132 - -KY -== 136 - -CF -== 140 - -TD -== 148 - -CL -== 152 - -CN -== 156 - -CX -== 162 - -CC -== 166 - -CO -== 170 - -KM -== 174 - -CG -== 178 - -CD -== 180 - -CK -== 184 - -CR -== 188 - -CI -== 384 - -HR -== 191 - -CU -== 192 - -CW -== 531 - -CY -== 196 - -CZ -== 203 - -DK -== 208 - -DJ -== 262 - -DM -== 212 - -DO -== 214 - -EC -== 218 - -EG -== 818 - -SV -== 222 - -GQ -== 226 - -ER -== 232 - -EE -== 233 - -ET -== 231 - -FK -== 238 - -FO -== 234 - -FJ -== 242 - -FI -== 246 - -FR -== 250 - -GF -== 254 - -PF -== 258 - -TF -== 260 - -GA -== 266 - -GM -== 270 - -GE -== 268 - -DE -== 276 - -GH -== 288 - -GI -== 292 - -GR -== 300 - -GL -== 304 - -GD -== 308 - -GP -== 312 - -GU -== 316 - -GT -== 320 - -GG -== 831 - -GN -== 324 - -GW -== 624 - -GY -== 328 - -HT -== 332 - -#HM -#== 334 - -VA -== 336 - -HN -== 340 - -HK -== 344 - -HU -== 348 - -IS -== 352 - -IN -== 356 - -ID -== 360 - -IR -== 364 - -IQ -== 368 - -IE -== 372 - -IM -== 833 - -IL -== 376 - -IT -== 380 - -JM -== 388 - -JP -== 392 - -JE -== 832 - -JO -== 400 - -KZ -== 398 - -KE -== 404 - -KI -== 296 - -KP -== 408 - -KR -== 410 - -KW -== 414 - -KG -== 417 - -LA -== 418 - -LV -== 428 - -LB -== 422 - -LS -== 426 - -LR -== 430 - -LY -== 434 - -LI -== 438 - -LT -== 440 - -LU -== 442 - -MO -== 446 - -MK -== 807 - -MG -== 450 - -MW -== 454 - -MY -== 458 - -MV -== 462 - -ML -== 466 - -MT -== 470 - -MH -== 584 - -MQ -== 474 - -MR -== 478 - -MU -== 480 - -#YT -#== 175 - -MX -== 484 - -FM -== 583 - -MD -== 498 - -MC -== 492 - -MN -== 496 - -ME -== 499 - -MS -== 500 - -MA -== 504 - -MZ -== 508 - -MM -== 104 - -NA -== 516 - -NR -== 520 - -NP -== 524 - -NL -== 528 - -NC -== 540 - -NZ -== 554 - -NI -== 558 - -NE -== 562 - -NG -== 566 - -NU -== 570 - -NF -== 574 - -MP -== 580 - -NO -== 578 - -OM -== 512 - -PK -== 586 - -PW -== 585 - -PA -== 591 - -PG -== 598 - -PY -== 600 - -PE -== 604 - -PH -== 608 - -PN -== 612 - -PL -== 616 - -PT -== 620 - -PR -== 630 - -PS -== 275 - -QA -== 634 - -RE -== 638 - -RO -== 642 - -RU -== 643 - -RW -== 646 - -BL -== 652 - -SH -== 654 - -KN -== 659 - -LC -== 662 - -MF -== 663 - -PM -== 666 - -VC -== 670 - -WS -== 882 - -SM -== 674 - -ST -== 678 - -SA -== 682 - -SN -== 686 - -RS -== 688 - -SC -== 690 - -SL -== 694 - -SG -== 702 - -SX -== 534 - -SK -== 703 - -SI -== 705 - -SB -== 90 - -SO -== 706 - -SS -== 737 - -ZA -== 710 - -GS -== 239 - -ES -== 724 - -LK -== 144 - -SD -== 736 - -SR -== 740 - -#SJ -#== 744 - -SZ -== 748 - -SE -== 752 - -CH -== 756 - -SY -== 760 - -TW -== 158 - -TJ -== 762 - -TZ -== 834 - -TH -== 764 - -TL -== 626 - -TG -== 768 - -TK -== 772 - -TO -== 776 - -TT -== 780 - -TN -== 788 - -TR -== 792 - -TM -== 795 - -TC -== 796 - -TV -== 798 - -UG -== 800 - -UA -== 804 - -AE -== 784 - -GB -== 826 - -US -== 840 - -#UM -#== 581 - -UY -== 858 - -UZ -== 860 - -VU -== 548 - -VE -== 862 - -VN -== 704 - -VG -== 92 - -VI -== 850 - -WF -== 876 - -EH -== 732 - -YE -== 887 - -ZM -== 894 - -ZW -== 716 diff --git a/data/deadtee.png b/data/deadtee.png deleted file mode 100644 index c22df99608..0000000000 Binary files a/data/deadtee.png and /dev/null differ diff --git a/data/debug_font.png b/data/debug_font.png deleted file mode 100644 index 50a52e744c..0000000000 Binary files a/data/debug_font.png and /dev/null differ diff --git a/data/editor/audio_source.png b/data/editor/audio_source.png deleted file mode 100644 index 94ea09c520..0000000000 Binary files a/data/editor/audio_source.png and /dev/null differ diff --git a/data/editor/automap/basic_freeze.rules b/data/editor/automap/basic_freeze.rules deleted file mode 100644 index 98fc94c988..0000000000 --- a/data/editor/automap/basic_freeze.rules +++ /dev/null @@ -1,597 +0,0 @@ -[Freeze soft corners] - -Index 0 -Pos 0 0 NOTINDEX 3 OR 4 OR 19 OR 20 OR 52 OR 35 OR 36 OR 56 OR 57 OR 72 OR 73 OR 89 - -NewRun - -Index 4 - -Index 17 -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 EMPTY -Pos 0 1 EMPTY -Pos -1 0 FULL -Pos 0 -1 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 - -Index 17 ROTATE -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 - -Index 17 XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 -1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos -1 0 EMPTY -Pos 1 0 NOTINDEX -1 -Pos 0 1 NOTINDEX -1 - -Index 17 ROTATE XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL -Pos 0 1 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 - -Index 18 -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos 0 1 EMPTY -Pos -1 0 FULL - -Index 18 ROTATE -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos -1 0 EMPTY - -Index 18 XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 -1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos -1 0 FULL - -Index 18 ROTATE XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL - -Index 34 -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos -1 0 FULL - -Index 19 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos -1 -1 EMPTY - -Index 19 ROTATE -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 -1 EMPTY - -Index 19 XFLIP YFLIP -Pos 0 1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY - -Index 19 ROTATE XFLIP YFLIP -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos -1 1 EMPTY - -Index 20 -Pos -1 0 EMPTY -Pos -1 -1 EMPTY -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY - -Index 20 ROTATE -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY - -Index 20 XFLIP YFLIP -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY -Pos -1 0 EMPTY - -Index 20 ROTATE XFLIP YFLIP -Pos 0 -1 EMPTY -Pos -1 -1 EMPTY -Pos -1 0 EMPTY -Pos -1 1 EMPTY -Pos 0 1 EMPTY - -Index 52 -Pos 1 -1 FULL -Pos -1 1 FULL -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos 0 -1 EMPTY -Pos -1 -1 EMPTY -Pos -1 0 EMPTY - -Index 52 ROTATE -Pos -1 -1 FULL -Pos 1 1 FULL -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos -1 0 EMPTY -Pos -1 1 EMPTY -Pos 0 1 EMPTY - -Index 35 -Pos -1 1 FULL -Pos -1 -1 EMPTY -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -Index 35 ROTATE -Pos -1 -1 FULL -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY -Pos -1 0 EMPTY - -Index 35 XFLIP YFLIP -Pos 1 -1 FULL -Pos -1 -1 EMPTY -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY -Pos -1 0 EMPTY - -Index 35 ROTATE XFLIP YFLIP -Pos 1 1 FULL -Pos -1 -1 EMPTY -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY -Pos -1 0 EMPTY - -Index 36 -Pos -1 -1 EMPTY -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY -Pos -1 0 EMPTY - - - -[Freeze round corners] - -Index 0 -Pos 0 0 NOTINDEX 3 OR 4 OR 19 OR 20 OR 52 OR 35 OR 36 OR 56 OR 57 OR 72 OR 73 OR 89 - -NewRun - -Index 4 - -Index 17 -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 EMPTY -Pos 0 1 EMPTY -Pos -1 0 FULL -Pos 0 -1 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 - -Index 17 ROTATE -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 - -Index 17 XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 -1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos -1 0 EMPTY -Pos 1 0 NOTINDEX -1 -Pos 0 1 NOTINDEX -1 - -Index 17 ROTATE XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL -Pos 0 1 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 - -Index 18 -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos 0 1 EMPTY -Pos -1 0 FULL - -Index 18 ROTATE -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos -1 0 EMPTY - -Index 18 XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 -1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos -1 0 FULL - -Index 18 ROTATE XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL - -Index 34 -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos -1 0 FULL - -Index 3 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos -1 -1 EMPTY - -Index 3 ROTATE -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 -1 EMPTY - -Index 3 XFLIP YFLIP -Pos 0 1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY - -Index 3 ROTATE XFLIP YFLIP -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos -1 1 EMPTY - -Index 20 -Pos -1 0 EMPTY -Pos -1 -1 EMPTY -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY - -Index 20 ROTATE -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY - -Index 20 XFLIP YFLIP -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY -Pos -1 0 EMPTY - -Index 20 ROTATE XFLIP YFLIP -Pos 0 -1 EMPTY -Pos -1 -1 EMPTY -Pos -1 0 EMPTY -Pos -1 1 EMPTY -Pos 0 1 EMPTY - -Index 52 -Pos 1 -1 FULL -Pos -1 1 FULL -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos 0 -1 EMPTY -Pos -1 -1 EMPTY -Pos -1 0 EMPTY - -Index 52 ROTATE -Pos -1 -1 FULL -Pos 1 1 FULL -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos -1 0 EMPTY -Pos -1 1 EMPTY -Pos 0 1 EMPTY - -Index 35 -Pos -1 1 FULL -Pos -1 -1 EMPTY -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -Index 35 ROTATE -Pos -1 -1 FULL -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY -Pos -1 0 EMPTY - -Index 35 XFLIP YFLIP -Pos 1 -1 FULL -Pos -1 -1 EMPTY -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY -Pos -1 0 EMPTY - -Index 35 ROTATE XFLIP YFLIP -Pos 1 1 FULL -Pos -1 -1 EMPTY -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY -Pos -1 0 EMPTY - -Index 36 -Pos -1 -1 EMPTY -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY -Pos -1 0 EMPTY - - - -[Freeze diagonal corners] - -Index 0 -Pos 0 0 NOTINDEX 3 OR 4 OR 19 OR 20 OR 52 OR 35 OR 36 OR 56 OR 57 OR 72 OR 73 OR 89 - -NewRun - -Index 4 - -Index 54 -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 EMPTY -Pos 0 1 EMPTY -Pos -1 0 FULL -Pos 0 -1 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 - -Index 54 ROTATE -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 - -Index 54 XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 -1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos -1 0 EMPTY -Pos 1 0 NOTINDEX -1 -Pos 0 1 NOTINDEX -1 - -Index 54 ROTATE XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL -Pos 0 1 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 - -Index 55 -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos 0 1 EMPTY -Pos -1 0 FULL - -Index 55 ROTATE -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos -1 0 EMPTY - -Index 55 XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 -1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos -1 0 FULL - -Index 55 ROTATE XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL - -Index 87 -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos -1 0 FULL - -Index 56 -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 -1 EMPTY - -Index 56 ROTATE -Pos 0 1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY - -Index 56 XFLIP YFLIP -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos -1 1 EMPTY - -Index 56 ROTATE XFLIP YFLIP -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos -1 -1 EMPTY - -Index 57 -Pos -1 0 EMPTY -Pos -1 -1 EMPTY -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY - -Index 57 ROTATE -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY - -Index 57 XFLIP YFLIP -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY -Pos -1 0 EMPTY - -Index 57 ROTATE XFLIP YFLIP -Pos 0 -1 EMPTY -Pos -1 -1 EMPTY -Pos -1 0 EMPTY -Pos -1 1 EMPTY -Pos 0 1 EMPTY - -Index 72 -Pos 1 -1 FULL -Pos -1 1 FULL -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos 0 -1 EMPTY -Pos -1 -1 EMPTY -Pos -1 0 EMPTY - -Index 72 ROTATE -Pos -1 -1 FULL -Pos 1 1 FULL -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos -1 0 EMPTY -Pos -1 1 EMPTY -Pos 0 1 EMPTY - -Index 73 -Pos -1 1 FULL -Pos -1 -1 EMPTY -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -Index 73 ROTATE -Pos -1 -1 FULL -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY -Pos -1 0 EMPTY - -Index 73 XFLIP YFLIP -Pos 1 -1 FULL -Pos -1 -1 EMPTY -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY -Pos -1 0 EMPTY - -Index 73 ROTATE XFLIP YFLIP -Pos 1 1 FULL -Pos -1 -1 EMPTY -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY -Pos -1 0 EMPTY - -Index 89 -Pos -1 -1 EMPTY -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY -Pos -1 0 EMPTY diff --git a/data/editor/automap/ddmax_freeze.rules b/data/editor/automap/ddmax_freeze.rules deleted file mode 100644 index 325728f3c6..0000000000 --- a/data/editor/automap/ddmax_freeze.rules +++ /dev/null @@ -1,197 +0,0 @@ -[Freeze] - -Index 0 -Pos 0 0 NOTINDEX 1 OR 16 OR 17 OR 18 OR 19 OR 20 - -NewRun - -Index 1 - -Index 2 -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 EMPTY -Pos 0 1 EMPTY -Pos -1 0 FULL -Pos 0 -1 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 - -Index 2 ROTATE -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 - -Index 2 XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 -1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos -1 0 EMPTY -Pos 1 0 NOTINDEX -1 -Pos 0 1 NOTINDEX -1 - -Index 2 ROTATE XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL -Pos 0 1 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 - -Index 3 -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos 0 1 EMPTY -Pos -1 0 FULL - -Index 3 ROTATE -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos -1 0 EMPTY - -Index 3 XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 -1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos -1 0 FULL - -Index 3 ROTATE XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL - -Index 4 -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos -1 0 FULL - -Index 16 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos -1 -1 EMPTY - -Index 16 ROTATE -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 -1 EMPTY - -Index 16 XFLIP YFLIP -Pos 0 1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY - -Index 16 ROTATE XFLIP YFLIP -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos -1 1 EMPTY - -Index 17 -Pos -1 0 EMPTY -Pos -1 -1 EMPTY -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY - -Index 17 ROTATE -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY - -Index 17 XFLIP YFLIP -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY -Pos -1 0 EMPTY - -Index 17 ROTATE XFLIP YFLIP -Pos 0 -1 EMPTY -Pos -1 -1 EMPTY -Pos -1 0 EMPTY -Pos -1 1 EMPTY -Pos 0 1 EMPTY - -Index 18 -Pos 1 -1 FULL -Pos -1 1 FULL -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos 0 -1 EMPTY -Pos -1 -1 EMPTY -Pos -1 0 EMPTY - -Index 18 ROTATE -Pos -1 -1 FULL -Pos 1 1 FULL -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos -1 0 EMPTY -Pos -1 1 EMPTY -Pos 0 1 EMPTY - -Index 19 -Pos -1 1 FULL -Pos -1 -1 EMPTY -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -Index 19 ROTATE -Pos -1 -1 FULL -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY -Pos -1 0 EMPTY - -Index 19 XFLIP YFLIP -Pos 1 -1 FULL -Pos -1 -1 EMPTY -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY -Pos -1 0 EMPTY - -Index 19 ROTATE XFLIP YFLIP -Pos 1 1 FULL -Pos -1 -1 EMPTY -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY -Pos -1 0 EMPTY - -Index 20 -Pos -1 -1 EMPTY -Pos 0 -1 EMPTY -Pos 1 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY -Pos -1 0 EMPTY diff --git a/data/editor/automap/ddnet_grass.rules b/data/editor/automap/ddnet_grass.rules deleted file mode 100644 index 025b316284..0000000000 --- a/data/editor/automap/ddnet_grass.rules +++ /dev/null @@ -1,1304 +0,0 @@ -[Default] -Index 1 - -#top -Index 16 -Pos 0 -1 EMPTY - -#right -Index 21 -Pos 1 0 EMPTY - -#bottom -Index 52 -Pos 0 1 EMPTY - -#left -Index 20 -Pos -1 0 EMPTY - -#corner top-right -Index 5 -Pos 0 -1 EMPTY -Pos 1 0 EMPTY - -#corner top-left -Index 4 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-left -Index 36 -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-right -Index 37 -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -#inside corner top-right -Index 54 -Pos -1 1 EMPTY -Pos -1 0 FULL -Pos 0 1 FULL - -#inside corner top-left -Index 53 -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL - -#single tile -Index 84 -Pos -1 0 EMPTY -Pos 0 -1 EMPTY -Pos 0 1 EMPTY -Pos 0 -1 EMPTY - -#top + inside corner top-left -Index 98 -Pos 0 -1 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos 1 1 EMPTY - -#top + inside corner top-right -Index 99 -Pos 0 -1 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY - -#left + top + bottom -Index 100 -Pos 0 -1 EMPTY -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos 1 0 FULL - -#top + bottom -Index 101 -Pos 0 -1 EMPTY -Pos 0 1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL - -#right + top + bottom -Index 102 -Pos 0 -1 EMPTY -Pos 0 1 EMPTY -Pos -1 0 FULL -Pos 1 0 EMPTY - -#left + inside corner bottom-right -Index 96 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 1 1 EMPTY - -#right + inside corner bottom-left-left -Index 97 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos -1 1 EMPTY - -#left + inside corner top-right -Index 112 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 1 -1 EMPTY - -#left + inside corner top-left -Index 113 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos -1 -1 EMPTY - -#bottom + inside corner top-right -Index 114 -Pos 0 -1 FULL -Pos 0 1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos 1 -1 EMPTY - -#bottom + inside corner top-left -Index 115 -Pos 0 -1 FULL -Pos 0 1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 EMPTY - -#left + right + top -Index 116 -Pos 0 -1 EMPTY -Pos 0 1 FULL -Pos -1 0 EMPTY -Pos 1 0 EMPTY - -#left + right -Index 117 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 EMPTY -Pos 1 0 EMPTY - -#left + right + bottom -Index 118 -Pos 0 -1 FULL -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos 1 0 EMPTY - -#corner top-left + inside corner bottom-right -Index 128 -Pos 0 -1 EMPTY -Pos 0 1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 1 1 EMPTY - -#top + inside corner bottom-right-left -Index 129 -Pos 0 -1 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos 1 1 EMPTY -Pos -1 1 EMPTY - -#corner top-right + inside corner bottom-left -Index 130 -Pos 0 -1 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos -1 1 EMPTY - -#inside corner top-right -Index 131 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 FULL -Pos -1 1 FULL -Pos 1 -1 EMPTY -Pos 1 1 FULL - -#inside corner top-left -Index 132 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 EMPTY -Pos -1 1 FULL -Pos 1 -1 FULL -Pos 1 1 FULL - -#inside corner bottom-left-right -Index 133 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 FULL -Pos -1 1 EMPTY -Pos 1 -1 FULL -Pos 1 1 EMPTY - -#inside corner top-right + bottom-left -Index 134 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 FULL -Pos -1 1 EMPTY -Pos 1 -1 EMPTY -Pos 1 1 FULL - -#left + inside corner top-right + bottom-right -Index 144 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 1 -1 EMPTY -Pos 1 1 EMPTY - -#inside corner bottom left-right + top-left-right -Index 145 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 EMPTY -Pos -1 1 EMPTY -Pos 1 -1 EMPTY -Pos 1 1 EMPTY - -#right + inside corner top-left + bottom-left -Index 146 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos -1 -1 EMPTY -Pos -1 1 EMPTY - -#inside corner top-left-right + bottom right -Index 147 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 EMPTY -Pos -1 1 FULL -Pos 1 -1 EMPTY -Pos 1 1 EMPTY - -#inside corner top-left-right + bottom left -Index 148 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 EMPTY -Pos -1 1 EMPTY -Pos 1 -1 EMPTY -Pos 1 1 FULL - -#inside corner top-left-right -Index 149 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 EMPTY -Pos -1 1 FULL -Pos 1 -1 EMPTY -Pos 1 1 FULL - -#inside corner top-left + bottom-right -Index 150 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 EMPTY -Pos -1 1 FULL -Pos 1 -1 FULL -Pos 1 1 EMPTY - -#inside corner bottom-left + inside corner top-right -Index 160 -Pos 0 -1 FULL -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 1 -1 EMPTY - -#bottom + inside corner top-left-right -Index 161 -Pos 0 -1 FULL -Pos 0 1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 EMPTY -Pos 1 -1 EMPTY - -#inside corner bottom-right + inside corner top-left -Index 162 -Pos 0 -1 FULL -Pos 0 1 EMPTY -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos -1 -1 EMPTY - -#inside corner top-right + bottom-left-right -Index 163 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 FULL -Pos -1 1 EMPTY -Pos 1 -1 EMPTY -Pos 1 1 EMPTY - -#inside corner top-left + bottom-left-right -Index 164 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 EMPTY -Pos -1 1 EMPTY -Pos 1 -1 FULL -Pos 1 1 EMPTY - -#inside corner top-right + bottom-right -Index 165 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 FULL -Pos -1 1 FULL -Pos 1 -1 EMPTY -Pos 1 1 EMPTY - -#inside corner top-left + bottom-left -Index 166 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 EMPTY -Pos -1 1 EMPTY -Pos 1 -1 FULL -Pos 1 1 FULL - -NewRun - -#random bones -Index 2 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 3 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 66 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 67 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 68 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 83 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -NewRun - -#random big bones -Index 64 -Pos 0 0 INDEX 1 -Pos 1 0 INDEX 1 -Pos 0 1 INDEX 1 -Pos 1 1 INDEX 1 -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 1 NOTINDEX -1 -Random 500 - -Index 69 -Pos 0 0 INDEX 1 -Pos 1 0 INDEX 1 -Pos 0 1 INDEX 1 -Pos 1 1 INDEX 1 -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 1 NOTINDEX -1 -Random 500 - -NewRun - -#remove overlaps -Index 1 -Pos 0 0 INDEX 64 OR 69 -Pos -1 0 INDEX 64 OR 69 - -Index 1 -Pos 0 0 INDEX 64 OR 69 -Pos -1 -1 INDEX 64 OR 69 - -Index 1 -Pos 0 0 INDEX 64 OR 69 -Pos 0 -1 INDEX 64 OR 69 - -NewRun - -#fill bones -Index 65 -Pos -1 0 INDEX 64 -Index 80 -Pos 0 -1 INDEX 64 -Index 81 -Pos -1 -1 INDEX 64 - -Index 70 -Pos -1 0 INDEX 69 -Index 85 -Pos 0 -1 INDEX 69 -Index 86 -Pos -1 -1 INDEX 69 - - - -[Grass] -Index 1 - -#top -Index 16 -Pos 0 -1 EMPTY - -#right -Index 17 -Pos 1 0 EMPTY - -#bottom -Index 18 -Pos 0 1 EMPTY - -#left -Index 19 -Pos -1 0 EMPTY - -#corner top-right -Index 33 -Pos 0 -1 EMPTY -Pos 1 0 EMPTY - -#corner top-left -Index 32 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-left -Index 35 -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-right -Index 34 -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -#inside corner top-right -Index 51 -Pos -1 1 EMPTY -Pos -1 0 FULL -Pos 0 1 FULL - -#inside corner top-left -Index 50 -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL - -#inside corner bottom-left -Index 49 -Pos 1 -1 EMPTY -Pos 1 0 FULL -Pos 0 -1 FULL - -#inside corner bottom-right -Index 48 -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos 0 -1 FULL - -NewRun - -#random bones -Index 2 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 3 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 66 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 67 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 68 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 83 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -NewRun - -#random big bones -Index 64 -Pos 0 0 INDEX 1 -Pos 1 0 INDEX 1 -Pos 0 1 INDEX 1 -Pos 1 1 INDEX 1 -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 1 NOTINDEX -1 -Random 500 - -Index 69 -Pos 0 0 INDEX 1 -Pos 1 0 INDEX 1 -Pos 0 1 INDEX 1 -Pos 1 1 INDEX 1 -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 1 NOTINDEX -1 -Random 500 - -NewRun - -#remove overlaps -Index 1 -Pos 0 0 INDEX 64 OR 69 -Pos -1 0 INDEX 64 OR 69 - -Index 1 -Pos 0 0 INDEX 64 OR 69 -Pos -1 -1 INDEX 64 OR 69 - -Index 1 -Pos 0 0 INDEX 64 OR 69 -Pos 0 -1 INDEX 64 OR 69 - -NewRun - -#fill bones -Index 65 -Pos -1 0 INDEX 64 -Index 80 -Pos 0 -1 INDEX 64 -Index 81 -Pos -1 -1 INDEX 64 - -Index 70 -Pos -1 0 INDEX 69 -Index 85 -Pos 0 -1 INDEX 69 -Index 86 -Pos -1 -1 INDEX 69 - - - -[Dirt] -Index 1 - -#top -Index 52 YFLIP -Pos 0 -1 EMPTY - -#right -Index 21 -Pos 1 0 EMPTY - -#bottom -Index 52 -Pos 0 1 EMPTY - -#left -Index 20 -Pos -1 0 EMPTY - -#corner top-right -Index 37 YFLIP -Pos 0 -1 EMPTY -Pos 1 0 EMPTY - -#corner top-left -Index 36 YFLIP -Pos 0 -1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-left -Index 36 -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-right -Index 37 -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -#inside corner top-right -Index 54 -Pos -1 1 EMPTY -Pos -1 0 FULL -Pos 0 1 FULL - -#inside corner top-left -Index 53 -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL - -#inside corner bottom-left -Index 53 YFLIP -Pos 1 -1 EMPTY -Pos 1 0 FULL -Pos 0 -1 FULL - -#inside corner bottom-right -Index 54 YFLIP -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos 0 -1 FULL - -#single tile -Index 82 -Pos -1 0 EMPTY -Pos 0 -1 EMPTY -Pos 0 1 EMPTY -Pos 0 -1 EMPTY - -#top + inside corner top-left -Index 97 XFLIP YFLIP ROTATE -Pos 0 -1 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos 1 1 EMPTY - -#top + inside corner top-right -Index 96 ROTATE -Pos 0 -1 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY - -#left + top + bottom -Index 118 ROTATE -Pos 0 -1 EMPTY -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos 1 0 FULL - -#top + bottom -Index 117 ROTATE -Pos 0 -1 EMPTY -Pos 0 1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL - -#right + top + bottom -Index 118 XFLIP YFLIP ROTATE -Pos 0 -1 EMPTY -Pos 0 1 EMPTY -Pos -1 0 FULL -Pos 1 0 EMPTY - -#left + inside corner bottom-right -Index 96 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 1 1 EMPTY - -#right + inside corner bottom-left -Index 97 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos -1 1 EMPTY - -#left + inside corner top-right -Index 96 YFLIP -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 1 -1 EMPTY - -#left + inside corner top-left -Index 97 YFLIP -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos -1 -1 EMPTY - -#bottom + inside corner top-right -Index 96 XFLIP YFLIP ROTATE -Pos 0 -1 FULL -Pos 0 1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos 1 -1 EMPTY - -#bottom + inside corner top-left -Index 97 ROTATE -Pos 0 -1 FULL -Pos 0 1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 EMPTY - -#left + right + top -Index 118 YFLIP -Pos 0 -1 EMPTY -Pos 0 1 FULL -Pos -1 0 EMPTY -Pos 1 0 EMPTY - -#left + right -Index 117 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 EMPTY -Pos 1 0 EMPTY - -#left + right + bottom -Index 118 -Pos 0 -1 FULL -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos 1 0 EMPTY - -#corner top-left + inside corner bottom-right -Index 179 ROTATE -Pos 0 -1 EMPTY -Pos 0 1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 1 1 EMPTY - -#top + inside corner bottom-right-left -Index 180 -Pos 0 -1 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos 1 1 EMPTY -Pos -1 1 EMPTY - -#corner top-right + inside corner bottom-left -Index 179 XFLIP YFLIP -Pos 0 -1 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos -1 1 EMPTY - -#inside corner bottom-left-right -Index 133 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 FULL -Pos -1 1 EMPTY -Pos 1 -1 FULL -Pos 1 1 EMPTY - -#inside corner top-right + bottom-left -Index 176 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 FULL -Pos -1 1 EMPTY -Pos 1 -1 EMPTY -Pos 1 1 FULL - -#left + inside corner top-right + bottom-right -Index 180 XFLIP YFLIP ROTATE -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 1 -1 EMPTY -Pos 1 1 EMPTY - -#inside corner bottom left-right + top-left-right -Index 178 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 EMPTY -Pos -1 1 EMPTY -Pos 1 -1 EMPTY -Pos 1 1 EMPTY - -#right + inside corner top-left + bottom-left -Index 180 ROTATE -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos -1 -1 EMPTY -Pos -1 1 EMPTY - -#inside corner top-left-right + bottom right -Index 177 XFLIP YFLIP ROTATE -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 EMPTY -Pos -1 1 FULL -Pos 1 -1 EMPTY -Pos 1 1 EMPTY - -#inside corner top-left-right + bottom left -Index 177 XFLIP YFLIP -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 EMPTY -Pos -1 1 EMPTY -Pos 1 -1 EMPTY -Pos 1 1 FULL - -#inside corner top-left-right -Index 133 YFLIP -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 EMPTY -Pos -1 1 FULL -Pos 1 -1 EMPTY -Pos 1 1 FULL - -#inside corner top-left + bottom-right -Index 176 XFLIP -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 EMPTY -Pos -1 1 FULL -Pos 1 -1 FULL -Pos 1 1 EMPTY - -#inside corner bottom-left + inside corner top-right -Index 179 -Pos 0 -1 FULL -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 1 -1 EMPTY - -#bottom + inside corner top-left-right -Index 180 YFLIP -Pos 0 -1 FULL -Pos 0 1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 EMPTY -Pos 1 -1 EMPTY - -#inside corner bottom-right + inside corner top-left -Index 179 XFLIP -Pos 0 -1 FULL -Pos 0 1 EMPTY -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos -1 -1 EMPTY - -#inside corner top-right + bottom-left-right -Index 177 -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 FULL -Pos -1 1 EMPTY -Pos 1 -1 EMPTY -Pos 1 1 EMPTY - -#inside corner top-left + bottom-left-right -Index 163 YFLIP -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 EMPTY -Pos -1 1 EMPTY -Pos 1 -1 FULL -Pos 1 1 EMPTY - -#inside corner top-right + bottom-right -Index 133 XFLIP YFLIP ROTATE -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 FULL -Pos -1 1 FULL -Pos 1 -1 EMPTY -Pos 1 1 EMPTY - -#inside corner top-left + bottom-left -Index 133 ROTATE -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 -1 EMPTY -Pos -1 1 EMPTY -Pos 1 -1 FULL -Pos 1 1 FULL - -NewRun - -#random bones -Index 2 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 3 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 66 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 67 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 68 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 83 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -NewRun - -#random big bones -Index 64 -Pos 0 0 INDEX 1 -Pos 1 0 INDEX 1 -Pos 0 1 INDEX 1 -Pos 1 1 INDEX 1 -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 1 NOTINDEX -1 -Random 500 - -Index 69 -Pos 0 0 INDEX 1 -Pos 1 0 INDEX 1 -Pos 0 1 INDEX 1 -Pos 1 1 INDEX 1 -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 1 NOTINDEX -1 -Random 500 - -NewRun - -#remove overlaps -Index 1 -Pos 0 0 INDEX 64 OR 69 -Pos -1 0 INDEX 64 OR 69 - -Index 1 -Pos 0 0 INDEX 64 OR 69 -Pos -1 -1 INDEX 64 OR 69 - -Index 1 -Pos 0 0 INDEX 64 OR 69 -Pos 0 -1 INDEX 64 OR 69 - -NewRun - -#fill bones -Index 65 -Pos -1 0 INDEX 64 -Index 80 -Pos 0 -1 INDEX 64 -Index 81 -Pos -1 -1 INDEX 64 - -Index 70 -Pos -1 0 INDEX 69 -Index 85 -Pos 0 -1 INDEX 69 -Index 86 -Pos -1 -1 INDEX 69 - - - - -[Cave] -Index 13 - -#top -Index 26 -Pos 0 -1 EMPTY - -#right -Index 25 -Pos 1 0 EMPTY - -#bottom -Index 10 -Pos 0 1 EMPTY - -#left -Index 24 -Pos -1 0 EMPTY - -#corner top-right -Index 9 -Pos 0 -1 EMPTY -Pos 1 0 EMPTY - -#corner top-left -Index 8 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-left -Index 40 -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-right -Index 41 -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -#inside corner top-right -Index 12 -Pos -1 1 EMPTY -Pos -1 0 FULL -Pos 0 1 FULL - -#inside corner top-left -Index 11 -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL - -#inside corner bottom-left -Index 27 -Pos 1 -1 EMPTY -Pos 1 0 FULL -Pos 0 -1 FULL - -#inside corner bottom-right -Index 28 -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos 0 -1 FULL - -NewRun - -#random bones -Index 29 -Pos 0 0 INDEX 13 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 200 - -Index 42 -Pos 0 0 INDEX 13 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 200 - -Index 43 -Pos 0 0 INDEX 13 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 200 - -Index 44 -Pos 0 0 INDEX 13 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 200 - -Index 45 -Pos 0 0 INDEX 13 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 200 - -Index 61 -Pos 0 0 INDEX 13 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 200 - -NewRun - -#random big bones -Index 14 -Pos 0 0 INDEX 13 -Pos 1 0 INDEX 13 -Pos 0 1 INDEX 13 -Pos 1 1 INDEX 13 -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 1 NOTINDEX -1 -Random 400 - -Index 46 -Pos 0 0 INDEX 13 -Pos 1 0 INDEX 13 -Pos 0 1 INDEX 13 -Pos 1 1 INDEX 13 -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 1 NOTINDEX -1 -Random 400 - -NewRun - -#remove overlaps -Index 1 -Pos 0 0 INDEX 14 OR 46 -Pos -1 0 INDEX 14 OR 46 - -Index 1 -Pos 0 0 INDEX 14 OR 46 -Pos -1 -1 INDEX 14 OR 46 - -Index 1 -Pos 0 0 INDEX 14 OR 46 -Pos 0 -1 INDEX 14 OR 46 - -NewRun - -#fill bones -Index 15 -Pos -1 0 INDEX 14 -Index 30 -Pos 0 -1 INDEX 14 -Index 31 -Pos -1 -1 INDEX 14 - -Index 47 -Pos -1 0 INDEX 46 -Index 62 -Pos 0 -1 INDEX 46 -Index 63 -Pos -1 -1 INDEX 46 diff --git a/data/editor/automap/ddnet_tiles.rules b/data/editor/automap/ddnet_tiles.rules deleted file mode 100644 index ca92507a32..0000000000 --- a/data/editor/automap/ddnet_tiles.rules +++ /dev/null @@ -1,74 +0,0 @@ -[DDNet] -Index 110 - -Index 94 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 0 1 FULL -Pos 1 0 FULL -Pos 1 -1 EMPTY -Pos -1 1 EMPTY -Pos -1 -1 EMPTY - -Index 94 XFLIP -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL -Pos -1 -1 EMPTY -Pos 1 1 EMPTY -Pos 1 -1 EMPTY - -Index 94 YFLIP -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos 1 1 EMPTY -Pos -1 -1 EMPTY -Pos -1 1 EMPTY - -Index 94 XFLIP YFLIP -Pos 0 1 EMPTY -Pos 1 0 EMPTY -Pos 0 -1 FULL -Pos -1 0 FULL -Pos -1 1 EMPTY -Pos 1 -1 EMPTY -Pos 1 1 EMPTY - -Index 108 -Pos 0 0 EMPTY -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 0 1 FULL -Pos 1 0 FULL -Pos 0 1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 - -Index 108 XFLIP -Pos 0 0 EMPTY -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL -Pos 0 1 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 - -Index 108 YFLIP -Pos 0 0 EMPTY -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 - -Index 108 XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 1 EMPTY -Pos 1 0 EMPTY -Pos 0 -1 FULL -Pos -1 0 FULL -Pos 0 -1 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 diff --git a/data/editor/automap/ddnet_walls.rules b/data/editor/automap/ddnet_walls.rules deleted file mode 100644 index 7355aa123d..0000000000 --- a/data/editor/automap/ddnet_walls.rules +++ /dev/null @@ -1,424 +0,0 @@ -[Basic Walls] -Index 16 - -#1W2W3W4W -Index 17 -Pos 0 -1 EMPTY -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos 1 0 EMPTY - -#1W2W3S4W -Index 18 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 0 1 FULL -Pos 1 0 EMPTY - -#1W2W3S4W -Index 18 YFLIP -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -#1W2S3S4W -Index 19 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 0 1 FULL -Pos 1 0 FULL -Pos 1 1 FULL - -#1W2S3S4W -Index 19 YFLIP -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 0 1 EMPTY -Pos 1 0 FULL -Pos 1 -1 FULL - -#1W2S3S4W -Index 19 XFLIP -Pos 0 -1 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos -1 1 FULL - -#1W2S3S4W -Index 19 XFLIP YFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos 0 1 EMPTY - -#1W2S3W4S -Index 20 -Pos -1 0 FULL -Pos 1 0 FULL -Pos 0 -1 EMPTY -Pos 0 1 EMPTY - -#1W2S3S4S -Index 21 -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 -1 EMPTY - -#1W2S3S4S -Index 21 YFLIP -Pos -1 -1 FULL -Pos 1 -1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 1 EMPTY - -#1D2D3D4D -Index 32 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1D2S3D4D -Index 33 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL - -#1D2S3D4D -Index 33 XFLIP -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1D2S3D4D -Index 33 YFLIP -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1D2S3D4D -Index 33 XFLIP YFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1D2S3S4D -Index 34 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 FULL - -#1D2S3S4D -Index 34 YFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1S2S3S4D -Index 35 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 FULL - -#1S2S3S4D -Index 35 XFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 FULL - -#1S2S3S4D -Index 35 YFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL - -#1S2S3S4D -Index 35 XFLIP YFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1S2D3S4D -Index 36 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1S2D3S4D -Index 36 XFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL - -#1S2S3D4D -Index 37 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL - -#1S2S3D4D -Index 37 XFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1W2D3S4W -Index 48 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY -Pos 1 0 FULL - -#1W2D3S4W -Index 48 XFLIP -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL - -#1W2D3S4W -Index 48 YFLIP -Pos -1 0 EMPTY -Pos 0 1 EMPTY -Pos 1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL - -#1W2D3S4W -Index 48 XFLIP YFLIP -Pos 1 0 EMPTY -Pos 0 1 EMPTY -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos -1 0 FULL - -#1W2D3D4S -Index 49 -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 -1 EMPTY - -#1W2D3D4S -Index 49 YFLIP -Pos -1 -1 EMPTY -Pos 1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 1 EMPTY - -#1W2S3D4S -Index 50 -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 -1 EMPTY - -#1W2S3D4S -Index 50 XFLIP -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 -1 EMPTY - -#1W2S3D4S -Index 50 YFLIP -Pos -1 -1 EMPTY -Pos 1 -1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 1 EMPTY - -#1W2S3D4S -Index 50 XFLIP YFLIP -Pos -1 -1 FULL -Pos 1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 1 EMPTY - -#1S2W3S4W -Index 51 -Pos -1 0 EMPTY -Pos 1 0 EMPTY -Pos 0 -1 FULL -Pos 0 1 FULL - -#1W2S3W4W -Index 52 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 0 1 EMPTY - -#1W2S3W4W -Index 52 XFLIP -Pos 0 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos 0 1 EMPTY - -#1S2S3S4W -Index 53 -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 -1 FULL -Pos 1 1 FULL - -#1S2S3S4W -Index 53 XFLIP -Pos 0 -1 FULL -Pos -1 -1 FULL -Pos -1 0 FULL -Pos -1 1 FULL -Pos 1 0 EMPTY -Pos 0 1 FULL - -#1D2D3S4W -Index 64 -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 -1 EMPTY -Pos 1 1 EMPTY - -#1D2D3S4W -Index 64 XFLIP -Pos 0 -1 FULL -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos -1 1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 FULL - -#1S2W3D4S -Index 65 -Pos 0 -1 FULL -Pos -1 -1 FULL -Pos -1 0 FULL -Pos -1 1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 FULL - -#1S2W3D4S -Index 65 XFLIP -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 -1 FULL -Pos 1 1 EMPTY - -#1S2W3D4S -Index 65 YFLIP -Pos 0 -1 FULL -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos -1 1 FULL -Pos 1 0 EMPTY -Pos 0 1 FULL - -#1S2W3D4S -Index 65 XFLIP YFLIP -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 -1 EMPTY -Pos 1 1 FULL diff --git a/data/editor/automap/desert_main.rules b/data/editor/automap/desert_main.rules deleted file mode 100644 index 7a01248924..0000000000 --- a/data/editor/automap/desert_main.rules +++ /dev/null @@ -1,227 +0,0 @@ -[Desert] -Index 1 - -#random -Index 2 -Pos 0 1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Random 150 - -Index 3 -Pos 0 1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Random 150 - -#top -Index 16 -Pos 0 -1 EMPTY - -#right -Index 17 -Pos 1 0 EMPTY - -#bottom -Index 18 -Pos 0 1 EMPTY - -#left -Index 19 -Pos -1 0 EMPTY - -#corner top-right -Index 33 -Pos 0 -1 EMPTY -Pos 1 0 EMPTY - -#corner top-left -Index 32 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-left -Index 35 -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-right -Index 34 -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -#inside corner top-right -Index 51 -Pos -1 1 EMPTY -Pos -1 0 FULL -Pos 0 1 FULL - -#inside corner top-left -Index 50 -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL - -#inside corner bottom-left -Index 49 -Pos 1 -1 EMPTY -Pos 1 0 FULL -Pos 0 -1 FULL - -#inside corner bottom-right -Index 48 -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos 0 -1 FULL - - - -[Mine] -Index 81 - -#random -Index 82 -Pos 0 1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Random 500 - -Index 83 -Pos 0 1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Random 500 - -Index 84 -Pos 0 1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Random 500 - -Index 85 -Pos 0 1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Random 500 - -Index 86 -Pos 0 1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Random 500 - -Index 100 -Pos 0 1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Random 500 - -Index 101 -Pos 0 1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Random 500 - -Index 102 -Pos 0 1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Random 500 - -Index 117 -Pos 0 1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Random 500 - -Index 118 -Pos 0 1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Random 500 - -Index 133 -Pos 0 1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Random 500 - -Index 134 -Pos 0 1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Random 500 - -#top -Index 96 -Pos 0 -1 EMPTY - -#right -Index 97 -Pos 1 0 EMPTY - -#bottom -Index 98 -Pos 0 1 EMPTY - -#left -Index 99 -Pos -1 0 EMPTY - -#corner top-right -Index 113 -Pos 0 -1 EMPTY -Pos 1 0 EMPTY - -#corner top-left -Index 112 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-left -Index 115 -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-right -Index 114 -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -#inside corner top-right -Index 131 -Pos -1 1 EMPTY -Pos -1 0 FULL -Pos 0 1 FULL - -#inside corner top-left -Index 130 -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL - -#inside corner bottom-left -Index 129 -Pos 1 -1 EMPTY -Pos 1 0 FULL -Pos 0 -1 FULL - -#inside corner bottom-right -Index 128 -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos 0 -1 FULL diff --git a/data/editor/automap/fadeout.rules b/data/editor/automap/fadeout.rules deleted file mode 100644 index 7fe468a10e..0000000000 --- a/data/editor/automap/fadeout.rules +++ /dev/null @@ -1,86 +0,0 @@ -[Fadeout] -Index 6 - -Index 7 -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 0 1 FULL -Pos 1 0 FULL -Pos 1 -1 FULL -Pos 1 1 FULL - -Index 7 XFLIP -Pos 0 -1 FULL -Pos -1 0 FULL -Pos 0 1 FULL -Pos 1 0 EMPTY -Pos -1 -1 FULL -Pos -1 1 FULL - -Index 8 -Pos 0 -1 EMPTY -Pos -1 0 FULL -Pos 0 1 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 1 1 FULL - -Index 8 YFLIP -Pos 0 -1 FULL -Pos -1 0 FULL -Pos 0 1 EMPTY -Pos 1 0 FULL -Pos -1 -1 FULL -Pos 1 -1 FULL - -Index 9 -Pos 0 -1 FULL -Pos -1 0 FULL -Pos 0 1 FULL -Pos 1 0 FULL -Pos 1 1 EMPTY - -Index 9 YFLIP -Pos 0 -1 FULL -Pos -1 0 FULL -Pos 0 1 FULL -Pos 1 0 FULL -Pos 1 -1 EMPTY - -Index 9 XFLIP -Pos 0 -1 FULL -Pos -1 0 FULL -Pos 0 1 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY - -Index 9 XFLIP YFLIP -Pos 0 -1 FULL -Pos -1 0 FULL -Pos 0 1 FULL -Pos 1 0 FULL -Pos -1 -1 EMPTY - -Index 10 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 0 1 FULL -Pos 1 0 FULL - -Index 10 XFLIP -Pos 0 -1 EMPTY -Pos -1 0 FULL -Pos 0 1 FULL -Pos 1 0 EMPTY - -Index 10 YFLIP -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 0 1 EMPTY -Pos 1 0 FULL - -Index 10 XFLIP YFLIP -Pos 0 -1 FULL -Pos -1 0 FULL -Pos 0 1 EMPTY -Pos 1 0 EMPTY diff --git a/data/editor/automap/generic_clear.rules b/data/editor/automap/generic_clear.rules deleted file mode 100644 index 033fb5bf40..0000000000 --- a/data/editor/automap/generic_clear.rules +++ /dev/null @@ -1,448 +0,0 @@ -[Random Blocks] - -Index 1 - -Index 1 XFLIP -Random 40 - -Index 1 YFLIP -Random 40 - -Index 1 YFLIP XFLIP -Random 40 - -Index 2 -Random 40 - -Index 2 XFLIP -Random 40 - -Index 2 YFLIP -Random 40 - -Index 2 YFLIP XFLIP -Random 40 - -Index 3 XFLIP -Random 40 - -Index 3 YFLIP -Random 40 - -Index 3 YFLIP XFLIP -Random 40 - -Index 4 -Random 40 - -Index 4 XFLIP -Random 40 - -Index 4 YFLIP -Random 40 - -Index 4 YFLIP XFLIP -Random 40 - -Index 5 -Random 40 - -Index 5 XFLIP -Random 40 - -Index 5 YFLIP -Random 40 - -Index 5 YFLIP XFLIP -Random 40 - -Index 6 -Random 40 - -Index 6 XFLIP -Random 40 - -Index 6 YFLIP -Random 40 - -Index 6 YFLIP XFLIP -Random 40 - -Index 64 -Random 40 - -Index 64 XFLIP -Random 40 - -Index 64 YFLIP -Random 40 - -Index 64 YFLIP XFLIP -Random 40 - -Index 65 -Random 40 - -Index 65 XFLIP -Random 40 - -Index 65 YFLIP -Random 40 - -Index 65 YFLIP XFLIP -Random 40 - -Index 66 -Random 40 - -Index 66 XFLIP -Random 40 - -Index 66 YFLIP -Random 40 - -Index 66 YFLIP XFLIP -Random 40 - -Index 67 -Random 40 - -Index 67 XFLIP -Random 40 - -Index 67 YFLIP -Random 40 - -Index 67 YFLIP XFLIP -Random 40 - -#random 2x2 -Index 19 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 0 NOTINDEX -1 -Random 100 - - -#random 3x3 -Index 16 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 2 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 2 1 FULL -Pos 0 2 FULL -Pos 1 2 FULL -Pos 2 2 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 3 NOTINDEX -1 -Pos 3 0 NOTINDEX -1 -Random 100 - - -NewRun - -#Remove overlaps -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos -2 -2 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos -1 -2 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos 0 -2 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos 1 -2 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos 2 -2 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos -2 -1 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos -1 -1 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos 0 -1 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos 1 -1 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos 2 -1 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos -2 0 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos -1 0 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos 1 0 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos 2 0 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos -2 1 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos -1 1 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos 0 1 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos 1 1 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos 2 1 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos -2 2 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos -1 2 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos 0 2 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos 1 2 INDEX 16 OR 19 - -Index 1 -Pos 0 0 INDEX 16 OR 19 -Pos 2 2 INDEX 16 OR 19 - -NewRun - -#Fill tiles -Index 20 -Pos -1 0 INDEX 19 -Index 35 -Pos 0 -1 INDEX 19 -Index 36 -Pos -1 -1 INDEX 19 - -Index 17 -Pos -1 0 INDEX 16 -Index 18 -Pos -2 0 INDEX 16 -Index 32 -Pos 0 -1 INDEX 16 -Index 33 -Pos -1 -1 INDEX 16 -Index 34 -Pos -2 -1 INDEX 16 -Index 48 -Pos 0 -2 INDEX 16 -Index 49 -Pos -1 -2 INDEX 16 -Index 50 -Pos -2 -2 INDEX 16 - - - -[Random small Blocks] - -Index 1 - -Index 1 XFLIP -Random 40 - -Index 1 YFLIP -Random 40 - -Index 1 YFLIP XFLIP -Random 40 - -Index 2 -Random 40 - -Index 2 XFLIP -Random 40 - -Index 2 YFLIP -Random 40 - -Index 2 YFLIP XFLIP -Random 40 - -Index 3 XFLIP -Random 40 - -Index 3 YFLIP -Random 40 - -Index 3 YFLIP XFLIP -Random 40 - -Index 4 -Random 40 - -Index 4 XFLIP -Random 40 - -Index 4 YFLIP -Random 40 - -Index 4 YFLIP XFLIP -Random 40 - -Index 5 -Random 40 - -Index 5 XFLIP -Random 40 - -Index 5 YFLIP -Random 40 - -Index 5 YFLIP XFLIP -Random 40 - -Index 6 -Random 40 - -Index 6 XFLIP -Random 40 - -Index 6 YFLIP -Random 40 - -Index 6 YFLIP XFLIP -Random 40 - -Index 64 -Random 40 - -Index 64 XFLIP -Random 40 - -Index 64 YFLIP -Random 40 - -Index 64 YFLIP XFLIP -Random 40 - -Index 65 -Random 40 - -Index 65 XFLIP -Random 40 - -Index 65 YFLIP -Random 40 - -Index 65 YFLIP XFLIP -Random 40 - -Index 66 -Random 40 - -Index 66 XFLIP -Random 40 - -Index 66 YFLIP -Random 40 - -Index 66 YFLIP XFLIP -Random 40 - -Index 67 -Random 40 - -Index 67 XFLIP -Random 40 - -Index 67 YFLIP -Random 40 - -Index 67 YFLIP XFLIP -Random 40 - - - -[Random Decoration] - -Index 7 - -Index 7 XFLIP -Random 18 - -Index 7 YFLIP -Random 18 - -Index 7 YFLIP XFLIP -Random 18 - -Index 21 -Random 18 - -Index 21 XFLIP -Random 18 - -Index 21 YFLIP -Random 18 - -Index 21 YFLIP XFLIP -Random 18 - -Index 23 -Random 18 - -Index 23 XFLIP -Random 18 - -Index 23 YFLIP -Random 18 - -Index 23 YFLIP XFLIP -Random 18 - -Index 51 -Random 18 - -Index 51 XFLIP -Random 18 - -Index 51 YFLIP -Random 18 - -Index 51 YFLIP XFLIP -Random 18 - -Index 68 -Random 18 diff --git a/data/editor/automap/generic_unhookable.rules b/data/editor/automap/generic_unhookable.rules deleted file mode 100644 index a32b9677ab..0000000000 --- a/data/editor/automap/generic_unhookable.rules +++ /dev/null @@ -1,1778 +0,0 @@ -[Random Silver] - -Index 16 - -Index 1 -Random 32 - -Index 1 XFLIP -Random 32 - -Index 1 YFLIP -Random 32 - -Index 1 YFLIP XFLIP -Random 32 - -Index 2 -Random 32 - -Index 2 XFLIP -Random 32 - -Index 2 YFLIP -Random 32 - -Index 2 YFLIP XFLIP -Random 32 - -Index 16 XFLIP -Random 32 - -Index 16 YFLIP -Random 32 - -Index 16 YFLIP XFLIP -Random 32 - -Index 17 -Random 32 - -Index 17 XFLIP -Random 32 - -Index 17 YFLIP -Random 32 - -Index 17 YFLIP XFLIP -Random 32 - -Index 18 -Random 32 - -Index 18 XFLIP -Random 32 - -Index 18 YFLIP -Random 32 - -Index 18 YFLIP XFLIP -Random 32 - -Index 32 -Random 32 - -Index 32 XFLIP -Random 32 - -Index 32 YFLIP -Random 32 - -Index 32 YFLIP XFLIP -Random 32 - -Index 33 -Random 32 - -Index 33 XFLIP -Random 32 - -Index 33 YFLIP -Random 32 - -Index 33 YFLIP XFLIP -Random 32 - -Index 34 -Random 32 - -Index 34 XFLIP -Random 32 - -Index 34 YFLIP -Random 32 - -Index 34 YFLIP XFLIP -Random 32 - -#random 2x2 -Index 3 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 0 NOTINDEX -1 -Random 50 - -Index 5 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 0 NOTINDEX -1 -Random 50 - -#random 3x3 -Index 80 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 2 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 2 1 FULL -Pos 0 2 FULL -Pos 1 2 FULL -Pos 2 2 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 3 NOTINDEX -1 -Pos 3 0 NOTINDEX -1 -Random 75 - -#random 3x2 -Index 67 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 2 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 2 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 3 0 NOTINDEX -1 -Random 75 - -NewRun - -#Remove overlaps -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos -2 -2 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos -1 -2 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos 0 -2 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos 1 -2 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos 2 -2 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos -2 -1 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos -1 -1 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos 0 -1 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos 1 -1 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos 2 -1 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos -2 0 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos -1 0 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos 1 0 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos 2 0 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos -2 1 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos -1 1 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos 0 1 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos 1 1 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos 2 1 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos -2 2 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos -1 2 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos 0 2 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos 1 2 INDEX 3 OR 5 OR 80 OR 67 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 -Pos 2 2 INDEX 3 OR 5 OR 80 OR 67 - -NewRun - -#Fill tiles -Index 4 -Pos -1 0 INDEX 3 -Index 19 -Pos 0 -1 INDEX 3 -Index 20 -Pos -1 -1 INDEX 3 - -Index 6 -Pos -1 0 INDEX 5 -Index 21 -Pos 0 -1 INDEX 5 -Index 22 -Pos -1 -1 INDEX 5 - -Index 81 -Pos -1 0 INDEX 80 -Index 82 -Pos -2 0 INDEX 80 -Index 96 -Pos 0 -1 INDEX 80 -Index 97 -Pos -1 -1 INDEX 80 -Index 98 -Pos -2 -1 INDEX 80 -Index 112 -Pos 0 -2 INDEX 80 -Index 113 -Pos -1 -2 INDEX 80 -Index 114 -Pos -2 -2 INDEX 80 - -Index 68 -Pos -1 0 INDEX 67 -Index 69 -Pos -2 0 INDEX 67 -Index 83 -Pos 0 -1 INDEX 67 -Index 84 -Pos -1 -1 INDEX 67 -Index 85 -Pos -2 -1 INDEX 67 - - - -[Random Gold] - -Index 23 - -Index 8 -Random 32 - -Index 8 XFLIP -Random 32 - -Index 8 YFLIP -Random 32 - -Index 8 YFLIP XFLIP -Random 32 - -Index 9 -Random 32 - -Index 9 XFLIP -Random 32 - -Index 9 YFLIP -Random 32 - -Index 9 YFLIP XFLIP -Random 32 - -Index 23 XFLIP -Random 32 - -Index 23 YFLIP -Random 32 - -Index 23 YFLIP XFLIP -Random 32 - -Index 24 -Random 32 - -Index 24 XFLIP -Random 32 - -Index 24 YFLIP -Random 32 - -Index 24 YFLIP XFLIP -Random 32 - -Index 25 -Random 32 - -Index 25 XFLIP -Random 32 - -Index 25 YFLIP -Random 32 - -Index 25 YFLIP XFLIP -Random 32 - -Index 39 -Random 32 - -Index 39 XFLIP -Random 32 - -Index 39 YFLIP -Random 32 - -Index 39 YFLIP XFLIP -Random 32 - -Index 40 -Random 32 - -Index 40 XFLIP -Random 32 - -Index 40 YFLIP -Random 32 - -Index 40 YFLIP XFLIP -Random 32 - -Index 41 -Random 32 - -Index 41 XFLIP -Random 32 - -Index 41 YFLIP -Random 32 - -Index 41 YFLIP XFLIP -Random 32 - -#random 2x2 -Index 10 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 0 NOTINDEX -1 -Random 50 - -Index 12 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 0 NOTINDEX -1 -Random 50 - -#random 3x3 -Index 87 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 2 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 2 1 FULL -Pos 0 2 FULL -Pos 1 2 FULL -Pos 2 2 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 3 NOTINDEX -1 -Pos 3 0 NOTINDEX -1 -Random 75 - -#random 3x2 -Index 74 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 2 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 2 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 3 0 NOTINDEX -1 -Random 75 - -NewRun - -#Remove overlaps -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos -2 -2 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos -1 -2 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos 0 -2 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos 1 -2 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos 2 -2 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos -2 -1 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos -1 -1 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos 0 -1 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos 1 -1 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos 2 -1 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos -2 0 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos -1 0 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos 1 0 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos 2 0 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos -2 1 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos -1 1 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos 0 1 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos 1 1 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos 2 1 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos -2 2 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos -1 2 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos 0 2 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos 1 2 INDEX 10 OR 12 OR 87 OR 74 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 -Pos 2 2 INDEX 10 OR 12 OR 87 OR 74 - -NewRun - -#Fill tiles -Index 11 -Pos -1 0 INDEX 10 -Index 26 -Pos 0 -1 INDEX 10 -Index 27 -Pos -1 -1 INDEX 10 - -Index 13 -Pos -1 0 INDEX 12 -Index 28 -Pos 0 -1 INDEX 12 -Index 29 -Pos -1 -1 INDEX 12 - -Index 88 -Pos -1 0 INDEX 87 -Index 89 -Pos -2 0 INDEX 87 -Index 103 -Pos 0 -1 INDEX 87 -Index 104 -Pos -1 -1 INDEX 87 -Index 105 -Pos -2 -1 INDEX 87 -Index 119 -Pos 0 -2 INDEX 87 -Index 120 -Pos -1 -2 INDEX 87 -Index 121 -Pos -2 -2 INDEX 87 - -Index 75 -Pos -1 0 INDEX 74 -Index 76 -Pos -2 0 INDEX 74 -Index 90 -Pos 0 -1 INDEX 74 -Index 91 -Pos -1 -1 INDEX 74 -Index 92 -Pos -2 -1 INDEX 74 - - - -[Random Bronze] - -Index 144 - -Index 129 -Random 32 - -Index 129 XFLIP -Random 32 - -Index 129 YFLIP -Random 32 - -Index 129 YFLIP XFLIP -Random 32 - -Index 130 -Random 32 - -Index 130 XFLIP -Random 32 - -Index 130 YFLIP -Random 32 - -Index 130 YFLIP XFLIP -Random 32 - -Index 144 XFLIP -Random 32 - -Index 144 YFLIP -Random 32 - -Index 144 YFLIP XFLIP -Random 32 - -Index 145 -Random 32 - -Index 145 XFLIP -Random 32 - -Index 145 YFLIP -Random 32 - -Index 145 YFLIP XFLIP -Random 32 - -Index 146 -Random 32 - -Index 146 XFLIP -Random 32 - -Index 146 YFLIP -Random 32 - -Index 146 YFLIP XFLIP -Random 32 - -Index 160 -Random 32 - -Index 160 XFLIP -Random 32 - -Index 160 YFLIP -Random 32 - -Index 160 YFLIP XFLIP -Random 32 - -Index 161 -Random 32 - -Index 161 XFLIP -Random 32 - -Index 161 YFLIP -Random 32 - -Index 161 YFLIP XFLIP -Random 32 - -Index 162 -Random 32 - -Index 162 XFLIP -Random 32 - -Index 162 YFLIP -Random 32 - -Index 162 YFLIP XFLIP -Random 32 - -#random 2x2 -Index 131 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 0 NOTINDEX -1 -Random 50 - -Index 133 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 0 NOTINDEX -1 -Random 50 - -#random 3x3 -Index 208 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 2 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 2 1 FULL -Pos 0 2 FULL -Pos 1 2 FULL -Pos 2 2 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 3 NOTINDEX -1 -Pos 3 0 NOTINDEX -1 -Random 75 - -#random 3x2 -Index 195 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 2 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 2 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 3 0 NOTINDEX -1 -Random 75 - -NewRun - -#Remove overlaps -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos -2 -2 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos -1 -2 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos 0 -2 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos 1 -2 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos 2 -2 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos -2 -1 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos -1 -1 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos 0 -1 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos 1 -1 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos 2 -1 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos -2 0 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos -1 0 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos 1 0 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos 2 0 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos -2 1 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos -1 1 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos 0 1 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos 1 1 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos 2 1 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos -2 2 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos -1 2 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos 0 2 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos 1 2 INDEX 131 OR 133 OR 208 OR 195 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 -Pos 2 2 INDEX 131 OR 133 OR 208 OR 195 - -NewRun - -#Fill tiles -Index 132 -Pos -1 0 INDEX 131 -Index 147 -Pos 0 -1 INDEX 131 -Index 148 -Pos -1 -1 INDEX 131 - -Index 134 -Pos -1 0 INDEX 133 -Index 149 -Pos 0 -1 INDEX 133 -Index 150 -Pos -1 -1 INDEX 133 - -Index 209 -Pos -1 0 INDEX 208 -Index 210 -Pos -2 0 INDEX 208 -Index 224 -Pos 0 -1 INDEX 208 -Index 225 -Pos -1 -1 INDEX 208 -Index 226 -Pos -2 -1 INDEX 208 -Index 240 -Pos 0 -2 INDEX 208 -Index 241 -Pos -1 -2 INDEX 208 -Index 242 -Pos -2 -2 INDEX 208 - -Index 196 -Pos -1 0 INDEX 195 -Index 197 -Pos -2 0 INDEX 195 -Index 211 -Pos 0 -1 INDEX 195 -Index 212 -Pos -1 -1 INDEX 195 -Index 213 -Pos -2 -1 INDEX 195 - - - -[Silver/Gold-Mix] - -#Silver -Index 16 - -Index 1 -Random 64 - -Index 1 XFLIP -Random 64 - -Index 1 YFLIP -Random 64 - -Index 1 YFLIP XFLIP -Random 64 - -Index 2 -Random 64 - -Index 2 XFLIP -Random 64 - -Index 2 YFLIP -Random 64 - -Index 2 YFLIP XFLIP -Random 64 - -Index 16 XFLIP -Random 64 - -Index 16 YFLIP -Random 64 - -Index 16 YFLIP XFLIP -Random 64 - -Index 17 -Random 64 - -Index 17 XFLIP -Random 64 - -Index 17 YFLIP -Random 64 - -Index 17 YFLIP XFLIP -Random 64 - -Index 18 -Random 64 - -Index 18 XFLIP -Random 64 - -Index 18 YFLIP -Random 64 - -Index 18 YFLIP XFLIP -Random 64 - -Index 32 -Random 64 - -Index 32 XFLIP -Random 64 - -Index 32 YFLIP -Random 64 - -Index 32 YFLIP XFLIP -Random 64 - -Index 33 -Random 64 - -Index 33 XFLIP -Random 64 - -Index 33 YFLIP -Random 64 - -Index 33 YFLIP XFLIP -Random 64 - -Index 34 -Random 64 - -Index 34 XFLIP -Random 64 - -Index 34 YFLIP -Random 64 - -Index 34 YFLIP XFLIP -Random 64 - -#Gold - -Index 8 -Random 64 - -Index 8 XFLIP -Random 64 - -Index 8 YFLIP -Random 64 - -Index 8 YFLIP XFLIP -Random 64 - -Index 9 -Random 64 - -Index 9 XFLIP -Random 64 - -Index 9 YFLIP -Random 64 - -Index 9 YFLIP XFLIP -Random 64 - -Index 23 -Random 64 - -Index 23 XFLIP -Random 64 - -Index 23 YFLIP -Random 64 - -Index 23 YFLIP XFLIP -Random 64 - -Index 24 -Random 64 - -Index 24 XFLIP -Random 64 - -Index 24 YFLIP -Random 64 - -Index 24 YFLIP XFLIP -Random 64 - -Index 25 -Random 64 - -Index 25 XFLIP -Random 64 - -Index 25 YFLIP -Random 64 - -Index 25 YFLIP XFLIP -Random 64 - -Index 39 -Random 64 - -Index 39 XFLIP -Random 64 - -Index 39 YFLIP -Random 64 - -Index 39 YFLIP XFLIP -Random 64 - -Index 40 -Random 64 - -Index 40 XFLIP -Random 64 - -Index 40 YFLIP -Random 64 - -Index 40 YFLIP XFLIP -Random 64 - -Index 41 -Random 64 - -Index 41 XFLIP -Random 64 - -Index 41 YFLIP -Random 64 - -Index 41 YFLIP XFLIP -Random 64 - - - -[Copper/Silver-Mix] - -#Copper -Index 144 - -Index 129 -Random 64 - -Index 129 XFLIP -Random 64 - -Index 129 YFLIP -Random 64 - -Index 129 YFLIP XFLIP -Random 64 - -Index 130 -Random 64 - -Index 130 XFLIP -Random 64 - -Index 130 YFLIP -Random 64 - -Index 130 YFLIP XFLIP -Random 64 - -Index 144 XFLIP -Random 64 - -Index 144 YFLIP -Random 64 - -Index 144 YFLIP XFLIP -Random 64 - -Index 145 -Random 64 - -Index 145 XFLIP -Random 64 - -Index 145 YFLIP -Random 64 - -Index 145 YFLIP XFLIP -Random 64 - -Index 146 -Random 64 - -Index 146 XFLIP -Random 64 - -Index 146 YFLIP -Random 64 - -Index 146 YFLIP XFLIP -Random 64 - -Index 160 -Random 64 - -Index 160 XFLIP -Random 64 - -Index 160 YFLIP -Random 64 - -Index 160 YFLIP XFLIP -Random 64 - -Index 161 -Random 64 - -Index 161 XFLIP -Random 64 - -Index 161 YFLIP -Random 64 - -Index 161 YFLIP XFLIP -Random 64 - -Index 162 -Random 64 - -Index 162 XFLIP -Random 64 - -Index 162 YFLIP -Random 64 - -Index 162 YFLIP XFLIP -Random 64 - -#Silver - -Index 1 -Random 64 - -Index 1 XFLIP -Random 64 - -Index 1 YFLIP -Random 64 - -Index 1 YFLIP XFLIP -Random 64 - -Index 2 -Random 64 - -Index 2 XFLIP -Random 64 - -Index 2 YFLIP -Random 64 - -Index 2 YFLIP XFLIP -Random 64 - -Index 16 -Random 64 - -Index 16 XFLIP -Random 64 - -Index 16 YFLIP -Random 64 - -Index 16 YFLIP XFLIP -Random 64 - -Index 17 -Random 64 - -Index 17 XFLIP -Random 64 - -Index 17 YFLIP -Random 64 - -Index 17 YFLIP XFLIP -Random 64 - -Index 18 -Random 64 - -Index 18 XFLIP -Random 64 - -Index 18 YFLIP -Random 64 - -Index 18 YFLIP XFLIP -Random 64 - -Index 32 -Random 64 - -Index 32 XFLIP -Random 64 - -Index 32 YFLIP -Random 64 - -Index 32 YFLIP XFLIP -Random 64 - -Index 33 -Random 64 - -Index 33 XFLIP -Random 64 - -Index 33 YFLIP -Random 64 - -Index 33 YFLIP XFLIP -Random 64 - -Index 34 -Random 64 - -Index 34 XFLIP -Random 64 - -Index 34 YFLIP -Random 64 - -Index 34 YFLIP XFLIP -Random 64 - - - -[Gold/Copper-Mix] - -#Gold -Index 23 - -Index 8 -Random 64 - -Index 8 XFLIP -Random 64 - -Index 8 YFLIP -Random 64 - -Index 8 YFLIP XFLIP -Random 64 - -Index 9 -Random 64 - -Index 9 XFLIP -Random 64 - -Index 9 YFLIP -Random 64 - -Index 9 YFLIP XFLIP -Random 64 - -Index 23 XFLIP -Random 64 - -Index 23 YFLIP -Random 64 - -Index 23 YFLIP XFLIP -Random 64 - -Index 24 -Random 64 - -Index 24 XFLIP -Random 64 - -Index 24 YFLIP -Random 64 - -Index 24 YFLIP XFLIP -Random 64 - -Index 25 -Random 64 - -Index 25 XFLIP -Random 64 - -Index 25 YFLIP -Random 64 - -Index 25 YFLIP XFLIP -Random 64 - -Index 39 -Random 64 - -Index 39 XFLIP -Random 64 - -Index 39 YFLIP -Random 64 - -Index 39 YFLIP XFLIP -Random 64 - -Index 40 -Random 64 - -Index 40 XFLIP -Random 64 - -Index 40 YFLIP -Random 64 - -Index 40 YFLIP XFLIP -Random 64 - -Index 41 -Random 64 - -Index 41 XFLIP -Random 64 - -Index 41 YFLIP -Random 64 - -Index 41 YFLIP XFLIP -Random 64 - -#Copper - -Index 129 -Random 64 - -Index 129 XFLIP -Random 64 - -Index 129 YFLIP -Random 64 - -Index 129 YFLIP XFLIP -Random 64 - -Index 130 -Random 64 - -Index 130 XFLIP -Random 64 - -Index 130 YFLIP -Random 64 - -Index 130 YFLIP XFLIP -Random 64 - -Index 144 -Random 64 - -Index 144 XFLIP -Random 64 - -Index 144 YFLIP -Random 64 - -Index 144 YFLIP XFLIP -Random 64 - -Index 145 -Random 64 - -Index 145 XFLIP -Random 64 - -Index 145 YFLIP -Random 64 - -Index 145 YFLIP XFLIP -Random 64 - -Index 146 -Random 64 - -Index 146 XFLIP -Random 64 - -Index 146 YFLIP -Random 64 - -Index 146 YFLIP XFLIP -Random 64 - -Index 160 -Random 64 - -Index 160 XFLIP -Random 64 - -Index 160 YFLIP -Random 64 - -Index 160 YFLIP XFLIP -Random 64 - -Index 161 -Random 64 - -Index 161 XFLIP -Random 64 - -Index 161 YFLIP -Random 64 - -Index 161 YFLIP XFLIP -Random 64 - -Index 162 -Random 64 - -Index 162 XFLIP -Random 64 - -Index 162 YFLIP -Random 64 - -Index 162 YFLIP XFLIP -Random 64 - - - -[Mix All] - -#Silver -Index 16 - -Index 1 -Random 96 - -Index 1 XFLIP -Random 96 - -Index 1 YFLIP -Random 96 - -Index 1 YFLIP XFLIP -Random 96 - -Index 2 -Random 96 - -Index 2 XFLIP -Random 96 - -Index 2 YFLIP -Random 96 - -Index 2 YFLIP XFLIP -Random 96 - -Index 16 XFLIP -Random 96 - -Index 16 YFLIP -Random 96 - -Index 16 YFLIP XFLIP -Random 96 - -Index 17 -Random 96 - -Index 17 XFLIP -Random 96 - -Index 17 YFLIP -Random 96 - -Index 17 YFLIP XFLIP -Random 96 - -Index 18 -Random 96 - -Index 18 XFLIP -Random 96 - -Index 18 YFLIP -Random 96 - -Index 18 YFLIP XFLIP -Random 96 - -Index 32 -Random 96 - -Index 32 XFLIP -Random 96 - -Index 32 YFLIP -Random 96 - -Index 32 YFLIP XFLIP -Random 96 - -Index 33 -Random 96 - -Index 33 XFLIP -Random 96 - -Index 33 YFLIP -Random 96 - -Index 33 YFLIP XFLIP -Random 96 - -Index 34 -Random 96 - -Index 34 XFLIP -Random 96 - -Index 34 YFLIP -Random 96 - -Index 34 YFLIP XFLIP -Random 96 - -#Gold - -Index 8 -Random 96 - -Index 8 XFLIP -Random 96 - -Index 8 YFLIP -Random 96 - -Index 8 YFLIP XFLIP -Random 96 - -Index 9 -Random 96 - -Index 9 XFLIP -Random 96 - -Index 9 YFLIP -Random 96 - -Index 9 YFLIP XFLIP -Random 96 - -Index 23 -Random 96 - -Index 23 XFLIP -Random 96 - -Index 23 YFLIP -Random 96 - -Index 23 YFLIP XFLIP -Random 96 - -Index 24 -Random 96 - -Index 24 XFLIP -Random 96 - -Index 24 YFLIP -Random 96 - -Index 24 YFLIP XFLIP -Random 96 - -Index 25 -Random 96 - -Index 25 XFLIP -Random 96 - -Index 25 YFLIP -Random 96 - -Index 25 YFLIP XFLIP -Random 96 - -Index 39 -Random 96 - -Index 39 XFLIP -Random 96 - -Index 39 YFLIP -Random 96 - -Index 39 YFLIP XFLIP -Random 96 - -Index 40 -Random 96 - -Index 40 XFLIP -Random 96 - -Index 40 YFLIP -Random 96 - -Index 40 YFLIP XFLIP -Random 96 - -Index 41 -Random 96 - -Index 41 XFLIP -Random 96 - -Index 41 YFLIP -Random 96 - -Index 41 YFLIP XFLIP -Random 96 - -#Copper - -Index 129 -Random 96 - -Index 129 XFLIP -Random 96 - -Index 129 YFLIP -Random 96 - -Index 129 YFLIP XFLIP -Random 96 - -Index 130 -Random 96 - -Index 130 XFLIP -Random 96 - -Index 130 YFLIP -Random 96 - -Index 130 YFLIP XFLIP -Random 96 - -Index 144 -Random 96 - -Index 144 XFLIP -Random 96 - -Index 144 YFLIP -Random 96 - -Index 144 YFLIP XFLIP -Random 96 - -Index 145 -Random 96 - -Index 145 XFLIP -Random 96 - -Index 145 YFLIP -Random 96 - -Index 145 YFLIP XFLIP -Random 96 - -Index 146 -Random 96 - -Index 146 XFLIP -Random 96 - -Index 146 YFLIP -Random 96 - -Index 146 YFLIP XFLIP -Random 96 - -Index 160 -Random 96 - -Index 160 XFLIP -Random 96 - -Index 160 YFLIP -Random 96 - -Index 160 YFLIP XFLIP -Random 96 - -Index 161 -Random 96 - -Index 161 XFLIP -Random 96 - -Index 161 YFLIP -Random 96 - -Index 161 YFLIP XFLIP -Random 96 - -Index 162 -Random 96 - -Index 162 XFLIP -Random 96 - -Index 162 YFLIP -Random 96 - -Index 162 YFLIP XFLIP -Random 96 diff --git a/data/editor/automap/generic_unhookable_0.7.rules b/data/editor/automap/generic_unhookable_0.7.rules deleted file mode 100644 index 8e6335a881..0000000000 --- a/data/editor/automap/generic_unhookable_0.7.rules +++ /dev/null @@ -1,2138 +0,0 @@ -[Random Silver] - -Index 16 - -Index 1 -Random 40 - -Index 1 XFLIP -Random 40 - -Index 1 YFLIP -Random 40 - -Index 1 YFLIP XFLIP -Random 40 - -Index 2 -Random 40 - -Index 2 XFLIP -Random 40 - -Index 2 YFLIP -Random 40 - -Index 2 YFLIP XFLIP -Random 40 - -Index 16 XFLIP -Random 40 - -Index 16 YFLIP -Random 40 - -Index 16 YFLIP XFLIP -Random 40 - -Index 17 -Random 40 - -Index 17 XFLIP -Random 40 - -Index 17 YFLIP -Random 40 - -Index 17 YFLIP XFLIP -Random 40 - -Index 18 -Random 40 - -Index 18 XFLIP -Random 40 - -Index 18 YFLIP -Random 40 - -Index 18 YFLIP XFLIP -Random 40 - -Index 32 -Random 40 - -Index 32 XFLIP -Random 40 - -Index 32 YFLIP -Random 40 - -Index 32 YFLIP XFLIP -Random 40 - -Index 33 -Random 40 - -Index 33 XFLIP -Random 40 - -Index 33 YFLIP -Random 40 - -Index 33 YFLIP XFLIP -Random 40 - -Index 34 -Random 40 - -Index 34 XFLIP -Random 40 - -Index 34 YFLIP -Random 40 - -Index 34 YFLIP XFLIP -Random 40 - -Index 38 -Random 40 - -Index 38 XFLIP -Random 40 - -Index 38 YFLIP -Random 40 - -Index 38 YFLIP XFLIP -Random 40 - -Index 54 -Random 40 - -Index 54 XFLIP -Random 40 - -Index 54 YFLIP -Random 40 - -Index 54 YFLIP XFLIP -Random 40 - -#random 2x2 -Index 3 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 0 NOTINDEX -1 -Random 50 - -Index 5 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 0 NOTINDEX -1 -Random 50 - -#random 3x3 -Index 80 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 2 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 2 1 FULL -Pos 0 2 FULL -Pos 1 2 FULL -Pos 2 2 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 3 NOTINDEX -1 -Pos 3 0 NOTINDEX -1 -Random 75 - -#random 3x2 -Index 67 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 2 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 2 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 3 0 NOTINDEX -1 -Random 100 - -Index 99 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 2 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 2 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 3 0 NOTINDEX -1 -Random 100 - -NewRun - -#Remove overlaps -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos -2 -2 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos -1 -2 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos 0 -2 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos 1 -2 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos 2 -2 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos -2 -1 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos -1 -1 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos 0 -1 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos 1 -1 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos 2 -1 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos -2 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos -1 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos 1 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos 2 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos -2 1 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos -1 1 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos 0 1 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos 1 1 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos 2 1 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos -2 2 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos -1 2 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos 0 2 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos 1 2 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -Index 16 -Pos 0 0 INDEX 3 OR 5 OR 80 OR 67 OR 99 -Pos 2 2 INDEX 3 OR 5 OR 80 OR 67 OR 99 - -NewRun - -#Fill tiles -Index 4 -Pos -1 0 INDEX 3 -Index 19 -Pos 0 -1 INDEX 3 -Index 20 -Pos -1 -1 INDEX 3 - -Index 6 -Pos -1 0 INDEX 5 -Index 21 -Pos 0 -1 INDEX 5 -Index 22 -Pos -1 -1 INDEX 5 - -Index 81 -Pos -1 0 INDEX 80 -Index 82 -Pos -2 0 INDEX 80 -Index 96 -Pos 0 -1 INDEX 80 -Index 97 -Pos -1 -1 INDEX 80 -Index 98 -Pos -2 -1 INDEX 80 -Index 112 -Pos 0 -2 INDEX 80 -Index 113 -Pos -1 -2 INDEX 80 -Index 114 -Pos -2 -2 INDEX 80 - -Index 68 -Pos -1 0 INDEX 67 -Index 69 -Pos -2 0 INDEX 67 -Index 83 -Pos 0 -1 INDEX 67 -Index 84 -Pos -1 -1 INDEX 67 -Index 85 -Pos -2 -1 INDEX 67 - -Index 100 -Pos -1 0 INDEX 99 -Index 101 -Pos -2 0 INDEX 99 -Index 115 -Pos 0 -1 INDEX 99 -Index 116 -Pos -1 -1 INDEX 99 -Index 117 -Pos -2 -1 INDEX 99 - - - -[Random Gold] - -Index 23 - -Index 8 -Random 40 - -Index 8 XFLIP -Random 40 - -Index 8 YFLIP -Random 40 - -Index 8 YFLIP XFLIP -Random 40 - -Index 9 -Random 40 - -Index 9 XFLIP -Random 40 - -Index 9 YFLIP -Random 40 - -Index 9 YFLIP XFLIP -Random 40 - -Index 23 XFLIP -Random 40 - -Index 23 YFLIP -Random 40 - -Index 23 YFLIP XFLIP -Random 40 - -Index 24 -Random 40 - -Index 24 XFLIP -Random 40 - -Index 24 YFLIP -Random 40 - -Index 24 YFLIP XFLIP -Random 40 - -Index 25 -Random 40 - -Index 25 XFLIP -Random 40 - -Index 25 YFLIP -Random 40 - -Index 25 YFLIP XFLIP -Random 40 - -Index 39 -Random 40 - -Index 39 XFLIP -Random 40 - -Index 39 YFLIP -Random 40 - -Index 39 YFLIP XFLIP -Random 40 - -Index 40 -Random 40 - -Index 40 XFLIP -Random 40 - -Index 40 YFLIP -Random 40 - -Index 40 YFLIP XFLIP -Random 40 - -Index 41 -Random 40 - -Index 41 XFLIP -Random 40 - -Index 41 YFLIP -Random 40 - -Index 41 YFLIP XFLIP -Random 40 - -Index 45 -Random 40 - -Index 45 XFLIP -Random 40 - -Index 45 YFLIP -Random 40 - -Index 45 YFLIP XFLIP -Random 40 - -Index 61 -Random 40 - -Index 61 XFLIP -Random 40 - -Index 61 YFLIP -Random 40 - -Index 61 YFLIP XFLIP -Random 40 - -#random 2x2 -Index 10 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 0 NOTINDEX -1 -Random 50 - -Index 12 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 0 NOTINDEX -1 -Random 50 - -#random 3x3 -Index 87 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 2 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 2 1 FULL -Pos 0 2 FULL -Pos 1 2 FULL -Pos 2 2 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 3 NOTINDEX -1 -Pos 3 0 NOTINDEX -1 -Random 75 - -#random 3x2 -Index 74 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 2 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 2 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 3 0 NOTINDEX -1 -Random 100 - -Index 106 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 2 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 2 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 3 0 NOTINDEX -1 -Random 100 - -NewRun - -#Remove overlaps -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos -2 -2 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos -1 -2 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos 0 -2 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos 1 -2 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos 2 -2 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos -2 -1 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos -1 -1 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos 0 -1 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos 1 -1 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos 2 -1 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos -2 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos -1 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos 1 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos 2 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos -2 1 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos -1 1 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos 0 1 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos 1 1 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos 2 1 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos -2 2 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos -1 2 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos 0 2 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos 1 2 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -Index 23 -Pos 0 0 INDEX 10 OR 12 OR 87 OR 74 OR 106 -Pos 2 2 INDEX 10 OR 12 OR 87 OR 74 OR 106 - -NewRun - -#Fill tiles -Index 11 -Pos -1 0 INDEX 10 -Index 26 -Pos 0 -1 INDEX 10 -Index 27 -Pos -1 -1 INDEX 10 - -Index 13 -Pos -1 0 INDEX 12 -Index 28 -Pos 0 -1 INDEX 12 -Index 29 -Pos -1 -1 INDEX 12 - -Index 88 -Pos -1 0 INDEX 87 -Index 89 -Pos -2 0 INDEX 87 -Index 103 -Pos 0 -1 INDEX 87 -Index 104 -Pos -1 -1 INDEX 87 -Index 105 -Pos -2 -1 INDEX 87 -Index 119 -Pos 0 -2 INDEX 87 -Index 120 -Pos -1 -2 INDEX 87 -Index 121 -Pos -2 -2 INDEX 87 - -Index 75 -Pos -1 0 INDEX 74 -Index 76 -Pos -2 0 INDEX 74 -Index 90 -Pos 0 -1 INDEX 74 -Index 91 -Pos -1 -1 INDEX 74 -Index 92 -Pos -2 -1 INDEX 74 - -Index 107 -Pos -1 0 INDEX 106 -Index 108 -Pos -2 0 INDEX 106 -Index 122 -Pos 0 -1 INDEX 106 -Index 123 -Pos -1 -1 INDEX 106 -Index 124 -Pos -2 -1 INDEX 106 - - - -[Random Bronze] - -Index 144 - -Index 129 -Random 40 - -Index 129 XFLIP -Random 40 - -Index 129 YFLIP -Random 40 - -Index 129 YFLIP XFLIP -Random 40 - -Index 130 -Random 40 - -Index 130 XFLIP -Random 40 - -Index 130 YFLIP -Random 40 - -Index 130 YFLIP XFLIP -Random 40 - -Index 144 XFLIP -Random 40 - -Index 144 YFLIP -Random 40 - -Index 144 YFLIP XFLIP -Random 40 - -Index 145 -Random 40 - -Index 145 XFLIP -Random 40 - -Index 145 YFLIP -Random 40 - -Index 145 YFLIP XFLIP -Random 40 - -Index 146 -Random 40 - -Index 146 XFLIP -Random 40 - -Index 146 YFLIP -Random 40 - -Index 146 YFLIP XFLIP -Random 40 - -Index 160 -Random 40 - -Index 160 XFLIP -Random 40 - -Index 160 YFLIP -Random 40 - -Index 160 YFLIP XFLIP -Random 40 - -Index 161 -Random 40 - -Index 161 XFLIP -Random 40 - -Index 161 YFLIP -Random 40 - -Index 161 YFLIP XFLIP -Random 40 - -Index 162 -Random 40 - -Index 162 XFLIP -Random 40 - -Index 162 YFLIP -Random 40 - -Index 162 YFLIP XFLIP -Random 40 - -Index 166 -Random 40 - -Index 166 XFLIP -Random 40 - -Index 166 YFLIP -Random 40 - -Index 166 YFLIP XFLIP -Random 40 - -Index 182 -Random 40 - -Index 182 XFLIP -Random 40 - -Index 182 YFLIP -Random 40 - -Index 182 YFLIP XFLIP -Random 40 - -#random 2x2 -Index 131 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 0 NOTINDEX -1 -Random 50 - -Index 133 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 0 NOTINDEX -1 -Random 50 - -#random 3x3 -Index 208 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 2 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 2 1 FULL -Pos 0 2 FULL -Pos 1 2 FULL -Pos 2 2 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 3 NOTINDEX -1 -Pos 3 0 NOTINDEX -1 -Random 75 - -#random 3x2 -Index 195 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 2 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 2 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 3 0 NOTINDEX -1 -Random 100 - -Index 227 -Pos 0 0 FULL -Pos 1 0 FULL -Pos 2 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 2 1 FULL -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 3 0 NOTINDEX -1 -Random 100 - -NewRun - -#Remove overlaps -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos -2 -2 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos -1 -2 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos 0 -2 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos 1 -2 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos 2 -2 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos -2 -1 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos -1 -1 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos 0 -1 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos 1 -1 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos 2 -1 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos -2 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos -1 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos 1 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos 2 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos -2 1 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos -1 1 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos 0 1 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos 1 1 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos 2 1 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos -2 2 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos -1 2 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos 0 2 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos 1 2 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -Index 144 -Pos 0 0 INDEX 131 OR 133 OR 208 OR 195 OR 227 -Pos 2 2 INDEX 131 OR 133 OR 208 OR 195 OR 227 - -NewRun - -#Fill tiles -Index 132 -Pos -1 0 INDEX 131 -Index 147 -Pos 0 -1 INDEX 131 -Index 148 -Pos -1 -1 INDEX 131 - -Index 134 -Pos -1 0 INDEX 133 -Index 149 -Pos 0 -1 INDEX 133 -Index 150 -Pos -1 -1 INDEX 133 - -Index 209 -Pos -1 0 INDEX 208 -Index 210 -Pos -2 0 INDEX 208 -Index 224 -Pos 0 -1 INDEX 208 -Index 225 -Pos -1 -1 INDEX 208 -Index 226 -Pos -2 -1 INDEX 208 -Index 240 -Pos 0 -2 INDEX 208 -Index 241 -Pos -1 -2 INDEX 208 -Index 242 -Pos -2 -2 INDEX 208 - -Index 196 -Pos -1 0 INDEX 195 -Index 197 -Pos -2 0 INDEX 195 -Index 211 -Pos 0 -1 INDEX 195 -Index 212 -Pos -1 -1 INDEX 195 -Index 213 -Pos -2 -1 INDEX 195 - -Index 228 -Pos -1 0 INDEX 227 -Index 229 -Pos -2 0 INDEX 227 -Index 243 -Pos 0 -1 INDEX 227 -Index 244 -Pos -1 -1 INDEX 227 -Index 245 -Pos -2 -1 INDEX 227 - - - -[Silver/Gold-Mix] - -#Silver -Index 16 - -Index 1 -Random 80 - -Index 1 XFLIP -Random 80 - -Index 1 YFLIP -Random 80 - -Index 1 YFLIP XFLIP -Random 80 - -Index 2 -Random 80 - -Index 2 XFLIP -Random 80 - -Index 2 YFLIP -Random 80 - -Index 2 YFLIP XFLIP -Random 80 - -Index 16 XFLIP -Random 80 - -Index 16 YFLIP -Random 80 - -Index 16 YFLIP XFLIP -Random 80 - -Index 17 -Random 80 - -Index 17 XFLIP -Random 80 - -Index 17 YFLIP -Random 80 - -Index 17 YFLIP XFLIP -Random 80 - -Index 18 -Random 80 - -Index 18 XFLIP -Random 80 - -Index 18 YFLIP -Random 80 - -Index 18 YFLIP XFLIP -Random 80 - -Index 32 -Random 80 - -Index 32 XFLIP -Random 80 - -Index 32 YFLIP -Random 80 - -Index 32 YFLIP XFLIP -Random 80 - -Index 33 -Random 80 - -Index 33 XFLIP -Random 80 - -Index 33 YFLIP -Random 80 - -Index 33 YFLIP XFLIP -Random 80 - -Index 34 -Random 80 - -Index 34 XFLIP -Random 80 - -Index 34 YFLIP -Random 80 - -Index 34 YFLIP XFLIP -Random 80 - -Index 38 -Random 80 - -Index 38 XFLIP -Random 80 - -Index 38 YFLIP -Random 80 - -Index 38 YFLIP XFLIP -Random 80 - -Index 54 -Random 80 - -Index 54 XFLIP -Random 80 - -Index 54 YFLIP -Random 80 - -Index 54 YFLIP XFLIP -Random 80 - -#Gold - -Index 8 -Random 80 - -Index 8 XFLIP -Random 80 - -Index 8 YFLIP -Random 80 - -Index 8 YFLIP XFLIP -Random 80 - -Index 9 -Random 80 - -Index 9 XFLIP -Random 80 - -Index 9 YFLIP -Random 80 - -Index 9 YFLIP XFLIP -Random 80 - -Index 23 -Random 80 - -Index 23 XFLIP -Random 80 - -Index 23 YFLIP -Random 80 - -Index 23 YFLIP XFLIP -Random 80 - -Index 24 -Random 80 - -Index 24 XFLIP -Random 80 - -Index 24 YFLIP -Random 80 - -Index 24 YFLIP XFLIP -Random 80 - -Index 25 -Random 80 - -Index 25 XFLIP -Random 80 - -Index 25 YFLIP -Random 80 - -Index 25 YFLIP XFLIP -Random 80 - -Index 39 -Random 80 - -Index 39 XFLIP -Random 80 - -Index 39 YFLIP -Random 80 - -Index 39 YFLIP XFLIP -Random 80 - -Index 40 -Random 80 - -Index 40 XFLIP -Random 80 - -Index 40 YFLIP -Random 80 - -Index 40 YFLIP XFLIP -Random 80 - -Index 41 -Random 80 - -Index 41 XFLIP -Random 80 - -Index 41 YFLIP -Random 80 - -Index 41 YFLIP XFLIP -Random 80 - -Index 45 -Random 80 - -Index 45 XFLIP -Random 80 - -Index 45 YFLIP -Random 80 - -Index 45 YFLIP XFLIP -Random 80 - -Index 61 -Random 80 - -Index 61 XFLIP -Random 80 - -Index 61 YFLIP -Random 80 - -Index 61 YFLIP XFLIP -Random 80 - - - -[Copper/Silver-Mix] - -#Copper -Index 144 - -Index 129 -Random 80 - -Index 129 XFLIP -Random 80 - -Index 129 YFLIP -Random 80 - -Index 129 YFLIP XFLIP -Random 80 - -Index 130 -Random 80 - -Index 130 XFLIP -Random 80 - -Index 130 YFLIP -Random 80 - -Index 130 YFLIP XFLIP -Random 80 - -Index 144 XFLIP -Random 80 - -Index 144 YFLIP -Random 80 - -Index 144 YFLIP XFLIP -Random 80 - -Index 145 -Random 80 - -Index 145 XFLIP -Random 80 - -Index 145 YFLIP -Random 80 - -Index 145 YFLIP XFLIP -Random 80 - -Index 146 -Random 80 - -Index 146 XFLIP -Random 80 - -Index 146 YFLIP -Random 80 - -Index 146 YFLIP XFLIP -Random 80 - -Index 160 -Random 80 - -Index 160 XFLIP -Random 80 - -Index 160 YFLIP -Random 80 - -Index 160 YFLIP XFLIP -Random 80 - -Index 161 -Random 80 - -Index 161 XFLIP -Random 80 - -Index 161 YFLIP -Random 80 - -Index 161 YFLIP XFLIP -Random 80 - -Index 162 -Random 80 - -Index 162 XFLIP -Random 80 - -Index 162 YFLIP -Random 80 - -Index 162 YFLIP XFLIP -Random 80 - -Index 166 -Random 80 - -Index 166 XFLIP -Random 80 - -Index 166 YFLIP -Random 80 - -Index 166 YFLIP XFLIP -Random 80 - -Index 182 -Random 80 - -Index 182 XFLIP -Random 80 - -Index 182 YFLIP -Random 80 - -Index 182 YFLIP XFLIP -Random 80 - -#Silver - -Index 1 -Random 80 - -Index 1 XFLIP -Random 80 - -Index 1 YFLIP -Random 80 - -Index 1 YFLIP XFLIP -Random 80 - -Index 2 -Random 80 - -Index 2 XFLIP -Random 80 - -Index 2 YFLIP -Random 80 - -Index 2 YFLIP XFLIP -Random 80 - -Index 16 -Random 80 - -Index 16 XFLIP -Random 80 - -Index 16 YFLIP -Random 80 - -Index 16 YFLIP XFLIP -Random 80 - -Index 17 -Random 80 - -Index 17 XFLIP -Random 80 - -Index 17 YFLIP -Random 80 - -Index 17 YFLIP XFLIP -Random 80 - -Index 18 -Random 80 - -Index 18 XFLIP -Random 80 - -Index 18 YFLIP -Random 80 - -Index 18 YFLIP XFLIP -Random 80 - -Index 32 -Random 80 - -Index 32 XFLIP -Random 80 - -Index 32 YFLIP -Random 80 - -Index 32 YFLIP XFLIP -Random 80 - -Index 33 -Random 80 - -Index 33 XFLIP -Random 80 - -Index 33 YFLIP -Random 80 - -Index 33 YFLIP XFLIP -Random 80 - -Index 34 -Random 80 - -Index 34 XFLIP -Random 80 - -Index 34 YFLIP -Random 80 - -Index 34 YFLIP XFLIP -Random 80 - -Index 38 -Random 80 - -Index 38 XFLIP -Random 80 - -Index 38 YFLIP -Random 80 - -Index 38 YFLIP XFLIP -Random 80 - -Index 54 -Random 80 - -Index 54 XFLIP -Random 80 - -Index 54 YFLIP -Random 80 - -Index 54 YFLIP XFLIP -Random 80 - - - -[Gold/Copper-Mix] - -#Gold -Index 23 - -Index 8 -Random 80 - -Index 8 XFLIP -Random 80 - -Index 8 YFLIP -Random 80 - -Index 8 YFLIP XFLIP -Random 80 - -Index 9 -Random 80 - -Index 9 XFLIP -Random 80 - -Index 9 YFLIP -Random 80 - -Index 9 YFLIP XFLIP -Random 80 - -Index 23 XFLIP -Random 80 - -Index 23 YFLIP -Random 80 - -Index 23 YFLIP XFLIP -Random 80 - -Index 24 -Random 80 - -Index 24 XFLIP -Random 80 - -Index 24 YFLIP -Random 80 - -Index 24 YFLIP XFLIP -Random 80 - -Index 25 -Random 80 - -Index 25 XFLIP -Random 80 - -Index 25 YFLIP -Random 80 - -Index 25 YFLIP XFLIP -Random 80 - -Index 39 -Random 80 - -Index 39 XFLIP -Random 80 - -Index 39 YFLIP -Random 80 - -Index 39 YFLIP XFLIP -Random 80 - -Index 40 -Random 80 - -Index 40 XFLIP -Random 80 - -Index 40 YFLIP -Random 80 - -Index 40 YFLIP XFLIP -Random 80 - -Index 41 -Random 80 - -Index 41 XFLIP -Random 80 - -Index 41 YFLIP -Random 80 - -Index 41 YFLIP XFLIP -Random 80 - -Index 45 -Random 80 - -Index 45 XFLIP -Random 80 - -Index 45 YFLIP -Random 80 - -Index 45 YFLIP XFLIP -Random 80 - -Index 61 -Random 80 - -Index 61 XFLIP -Random 80 - -Index 61 YFLIP -Random 80 - -Index 61 YFLIP XFLIP -Random 80 - -#Copper - -Index 129 -Random 80 - -Index 129 XFLIP -Random 80 - -Index 129 YFLIP -Random 80 - -Index 129 YFLIP XFLIP -Random 80 - -Index 130 -Random 80 - -Index 130 XFLIP -Random 80 - -Index 130 YFLIP -Random 80 - -Index 130 YFLIP XFLIP -Random 80 - -Index 144 -Random 80 - -Index 144 XFLIP -Random 80 - -Index 144 YFLIP -Random 80 - -Index 144 YFLIP XFLIP -Random 80 - -Index 145 -Random 80 - -Index 145 XFLIP -Random 80 - -Index 145 YFLIP -Random 80 - -Index 145 YFLIP XFLIP -Random 80 - -Index 146 -Random 80 - -Index 146 XFLIP -Random 80 - -Index 146 YFLIP -Random 80 - -Index 146 YFLIP XFLIP -Random 80 - -Index 160 -Random 80 - -Index 160 XFLIP -Random 80 - -Index 160 YFLIP -Random 80 - -Index 160 YFLIP XFLIP -Random 80 - -Index 161 -Random 80 - -Index 161 XFLIP -Random 80 - -Index 161 YFLIP -Random 80 - -Index 161 YFLIP XFLIP -Random 80 - -Index 162 -Random 80 - -Index 162 XFLIP -Random 80 - -Index 162 YFLIP -Random 80 - -Index 162 YFLIP XFLIP -Random 80 - -Index 166 -Random 80 - -Index 166 XFLIP -Random 80 - -Index 166 YFLIP -Random 80 - -Index 166 YFLIP XFLIP -Random 80 - -Index 182 -Random 80 - -Index 182 XFLIP -Random 80 - -Index 182 YFLIP -Random 80 - -Index 182 YFLIP XFLIP -Random 80 - - - -[Mix All] - -#Silver -Index 16 - -Index 1 -Random 120 - -Index 1 XFLIP -Random 120 - -Index 1 YFLIP -Random 120 - -Index 1 YFLIP XFLIP -Random 120 - -Index 2 -Random 120 - -Index 2 XFLIP -Random 120 - -Index 2 YFLIP -Random 120 - -Index 2 YFLIP XFLIP -Random 120 - -Index 16 XFLIP -Random 120 - -Index 16 YFLIP -Random 120 - -Index 16 YFLIP XFLIP -Random 120 - -Index 17 -Random 120 - -Index 17 XFLIP -Random 120 - -Index 17 YFLIP -Random 120 - -Index 17 YFLIP XFLIP -Random 120 - -Index 18 -Random 120 - -Index 18 XFLIP -Random 120 - -Index 18 YFLIP -Random 120 - -Index 18 YFLIP XFLIP -Random 120 - -Index 32 -Random 120 - -Index 32 XFLIP -Random 120 - -Index 32 YFLIP -Random 120 - -Index 32 YFLIP XFLIP -Random 120 - -Index 33 -Random 120 - -Index 33 XFLIP -Random 120 - -Index 33 YFLIP -Random 120 - -Index 33 YFLIP XFLIP -Random 120 - -Index 34 -Random 120 - -Index 34 XFLIP -Random 120 - -Index 34 YFLIP -Random 120 - -Index 34 YFLIP XFLIP -Random 120 - -Index 38 -Random 120 - -Index 38 XFLIP -Random 120 - -Index 38 YFLIP -Random 120 - -Index 38 YFLIP XFLIP -Random 120 - -Index 54 -Random 120 - -Index 54 XFLIP -Random 120 - -Index 54 YFLIP -Random 120 - -Index 54 YFLIP XFLIP -Random 120 - -#Gold - -Index 8 -Random 120 - -Index 8 XFLIP -Random 120 - -Index 8 YFLIP -Random 120 - -Index 8 YFLIP XFLIP -Random 120 - -Index 9 -Random 120 - -Index 9 XFLIP -Random 120 - -Index 9 YFLIP -Random 120 - -Index 9 YFLIP XFLIP -Random 120 - -Index 23 -Random 120 - -Index 23 XFLIP -Random 120 - -Index 23 YFLIP -Random 120 - -Index 23 YFLIP XFLIP -Random 120 - -Index 24 -Random 120 - -Index 24 XFLIP -Random 120 - -Index 24 YFLIP -Random 120 - -Index 24 YFLIP XFLIP -Random 120 - -Index 25 -Random 120 - -Index 25 XFLIP -Random 120 - -Index 25 YFLIP -Random 120 - -Index 25 YFLIP XFLIP -Random 120 - -Index 39 -Random 120 - -Index 39 XFLIP -Random 120 - -Index 39 YFLIP -Random 120 - -Index 39 YFLIP XFLIP -Random 120 - -Index 40 -Random 120 - -Index 40 XFLIP -Random 120 - -Index 40 YFLIP -Random 120 - -Index 40 YFLIP XFLIP -Random 120 - -Index 41 -Random 120 - -Index 41 XFLIP -Random 120 - -Index 41 YFLIP -Random 120 - -Index 41 YFLIP XFLIP -Random 120 - -Index 45 -Random 120 - -Index 45 XFLIP -Random 120 - -Index 45 YFLIP -Random 120 - -Index 45 YFLIP XFLIP -Random 120 - -Index 61 -Random 120 - -Index 61 XFLIP -Random 120 - -Index 61 YFLIP -Random 120 - -Index 61 YFLIP XFLIP -Random 120 - -#Copper - -Index 129 -Random 120 - -Index 129 XFLIP -Random 120 - -Index 129 YFLIP -Random 120 - -Index 129 YFLIP XFLIP -Random 120 - -Index 130 -Random 120 - -Index 130 XFLIP -Random 120 - -Index 130 YFLIP -Random 120 - -Index 130 YFLIP XFLIP -Random 120 - -Index 144 -Random 120 - -Index 144 XFLIP -Random 120 - -Index 144 YFLIP -Random 120 - -Index 144 YFLIP XFLIP -Random 120 - -Index 145 -Random 120 - -Index 145 XFLIP -Random 120 - -Index 145 YFLIP -Random 120 - -Index 145 YFLIP XFLIP -Random 120 - -Index 146 -Random 120 - -Index 146 XFLIP -Random 120 - -Index 146 YFLIP -Random 120 - -Index 146 YFLIP XFLIP -Random 120 - -Index 160 -Random 120 - -Index 160 XFLIP -Random 120 - -Index 160 YFLIP -Random 120 - -Index 160 YFLIP XFLIP -Random 120 - -Index 161 -Random 120 - -Index 161 XFLIP -Random 120 - -Index 161 YFLIP -Random 120 - -Index 161 YFLIP XFLIP -Random 120 - -Index 162 -Random 120 - -Index 162 XFLIP -Random 120 - -Index 162 YFLIP -Random 120 - -Index 162 YFLIP XFLIP -Random 120 - -Index 166 -Random 120 - -Index 166 XFLIP -Random 120 - -Index 166 YFLIP -Random 120 - -Index 166 YFLIP XFLIP -Random 120 - -Index 182 -Random 120 - -Index 182 XFLIP -Random 120 - -Index 182 YFLIP -Random 120 - -Index 182 YFLIP XFLIP -Random 120 diff --git a/data/editor/automap/grass_main.rules b/data/editor/automap/grass_main.rules deleted file mode 100644 index 1bbf8fdd0a..0000000000 --- a/data/editor/automap/grass_main.rules +++ /dev/null @@ -1,676 +0,0 @@ -[Default] -Index 1 - -#top -Index 16 -Pos 0 -1 EMPTY - -#right -Index 21 -Pos 1 0 EMPTY - -#bottom -Index 52 -Pos 0 1 EMPTY - -#left -Index 20 -Pos -1 0 EMPTY - -#corner top-right -Index 5 -Pos 0 -1 EMPTY -Pos 1 0 EMPTY - -#corner top-left -Index 4 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-left -Index 36 -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-right -Index 37 -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -#inside corner top-right -Index 54 -Pos -1 1 EMPTY -Pos -1 0 FULL -Pos 0 1 FULL - -#inside corner top-left -Index 53 -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL - -#inside corner bottom-left -Index 49 -Pos 1 -1 EMPTY -Pos 1 0 FULL -Pos 0 -1 FULL - -#inside corner bottom-right -Index 48 -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos 0 -1 FULL - -#right bottom -Index 22 -Pos -1 0 EMPTY -Pos -1 1 FULL -Pos 0 1 FULL - -#left bottom -Index 38 -Pos 1 0 EMPTY -Pos 1 1 FULL -Pos 0 1 FULL - -#top corner right 2 -Index 33 -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 FULL - -#top corner left 2 -Index 32 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos -1 1 FULL - -NewRun - -#random bones -Index 2 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 3 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 66 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 67 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 68 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -NewRun - -#random big bones -Index 64 -Pos 0 0 INDEX 1 -Pos 1 0 INDEX 1 -Pos 0 1 INDEX 1 -Pos 1 1 INDEX 1 -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 0 NOTINDEX -1 -Random 300 - -NewRun - -#remove overlaps -Index 1 -Pos 0 0 INDEX 64 -Pos -1 0 INDEX 64 - -Index 1 -Pos 0 0 INDEX 64 -Pos -1 -1 INDEX 64 - -Index 1 -Pos 0 0 INDEX 64 -Pos 0 -1 INDEX 64 - -Index 1 -Pos 0 0 INDEX 64 -Pos 1 -1 INDEX 64 - -NewRun - -#fill bones -Index 65 -Pos -1 0 INDEX 64 -Index 80 -Pos 0 -1 INDEX 64 -Index 81 -Pos -1 -1 INDEX 64 - - - -[Grass] -Index 1 - -#top -Index 16 -Pos 0 -1 EMPTY - -#right -Index 17 -Pos 1 0 EMPTY - -#bottom -Index 18 -Pos 0 1 EMPTY - -#left -Index 19 -Pos -1 0 EMPTY - -#corner top-right -Index 33 -Pos 0 -1 EMPTY -Pos 1 0 EMPTY - -#corner top-left -Index 32 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-left -Index 35 -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-right -Index 34 -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -#inside corner top-right -Index 51 -Pos -1 1 EMPTY -Pos -1 0 FULL -Pos 0 1 FULL - -#inside corner top-left -Index 50 -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL - -#inside corner bottom-left -Index 49 -Pos 1 -1 EMPTY -Pos 1 0 FULL -Pos 0 -1 FULL - -#inside corner bottom-right -Index 48 -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos 0 -1 FULL - -NewRun - -#random bones -Index 2 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 3 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 66 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 67 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 68 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -NewRun - -#random big bones -Index 64 -Pos 0 0 INDEX 1 -Pos 1 0 INDEX 1 -Pos 0 1 INDEX 1 -Pos 1 1 INDEX 1 -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 0 NOTINDEX -1 -Random 300 - -NewRun - -#remove overlaps -Index 1 -Pos 0 0 INDEX 64 -Pos -1 0 INDEX 64 - -Index 1 -Pos 0 0 INDEX 64 -Pos -1 -1 INDEX 64 - -Index 1 -Pos 0 0 INDEX 64 -Pos 0 -1 INDEX 64 - -Index 1 -Pos 0 0 INDEX 64 -Pos 1 -1 INDEX 64 - -NewRun - -#fill bones -Index 65 -Pos -1 0 INDEX 64 -Index 80 -Pos 0 -1 INDEX 64 -Index 81 -Pos -1 -1 INDEX 64 - - - -[Dirt] -Index 1 - -#top -Index 52 YFLIP -Pos 0 -1 EMPTY - -#right -Index 21 -Pos 1 0 EMPTY - -#bottom -Index 52 -Pos 0 1 EMPTY - -#left -Index 20 -Pos -1 0 EMPTY - -#corner top-right -Index 37 YFLIP -Pos 0 -1 EMPTY -Pos 1 0 EMPTY - -#corner top-left -Index 36 YFLIP -Pos 0 -1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-left -Index 36 -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-right -Index 37 -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -#inside corner top-right -Index 54 -Pos -1 1 EMPTY -Pos -1 0 FULL -Pos 0 1 FULL - -#inside corner top-left -Index 53 -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL - -#inside corner bottom-left -Index 53 YFLIP -Pos 1 -1 EMPTY -Pos 1 0 FULL -Pos 0 -1 FULL - -#inside corner bottom-right -Index 54 YFLIP -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos 0 -1 FULL - -NewRun - -#random bones -Index 2 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 3 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 66 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 67 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -Index 68 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 250 - -NewRun - -#random big bones -Index 64 -Pos 0 0 INDEX 1 -Pos 1 0 INDEX 1 -Pos 0 1 INDEX 1 -Pos 1 1 INDEX 1 -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 0 NOTINDEX -1 -Random 300 - -NewRun - -#remove overlaps -Index 1 -Pos 0 0 INDEX 64 -Pos -1 0 INDEX 64 - -Index 1 -Pos 0 0 INDEX 64 -Pos -1 -1 INDEX 64 - -Index 1 -Pos 0 0 INDEX 64 -Pos 0 -1 INDEX 64 - -Index 1 -Pos 0 0 INDEX 64 -Pos 1 -1 INDEX 64 - -NewRun - -#fill bones -Index 65 -Pos -1 0 INDEX 64 -Index 80 -Pos 0 -1 INDEX 64 -Index 81 -Pos -1 -1 INDEX 64 - - - -[Cave] -Index 13 - -#top -Index 26 -Pos 0 -1 EMPTY - -#right -Index 25 -Pos 1 0 EMPTY - -#bottom -Index 10 -Pos 0 1 EMPTY - -#left -Index 24 -Pos -1 0 EMPTY - -#corner top-right -Index 9 -Pos 0 -1 EMPTY -Pos 1 0 EMPTY - -#corner top-left -Index 8 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-left -Index 40 -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-right -Index 41 -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -#inside corner top-right -Index 12 -Pos -1 1 EMPTY -Pos -1 0 FULL -Pos 0 1 FULL - -#inside corner top-left -Index 11 -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL - -#inside corner bottom-left -Index 27 -Pos 1 -1 EMPTY -Pos 1 0 FULL -Pos 0 -1 FULL - -#inside corner bottom-right -Index 28 -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos 0 -1 FULL - -NewRun - -#random bones -Index 29 -Pos 0 0 INDEX 13 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 150 - -Index 42 -Pos 0 0 INDEX 13 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 150 - -Index 43 -Pos 0 0 INDEX 13 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 150 - -Index 44 -Pos 0 0 INDEX 13 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 150 - -Index 45 -Pos 0 0 INDEX 13 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 150 - - - -[Freeze] -Index 110 - -Index 108 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY - -Index 109 -Pos 0 -1 EMPTY -Pos 1 0 EMPTY - -Index 124 -Pos -1 0 EMPTY -Pos 0 1 EMPTY - -Index 125 -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -Index 110 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 0 1 EMPTY -Pos 1 0 EMPTY - - - -[Unfreeze] -Index 78 - -Index 76 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY - -Index 77 -Pos 0 -1 EMPTY -Pos 1 0 EMPTY - -Index 92 -Pos -1 0 EMPTY -Pos 0 1 EMPTY - -Index 93 -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -Index 78 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 0 1 EMPTY -Pos 1 0 EMPTY - - - -[Tele] -Index 142 - -Index 140 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY - -Index 141 -Pos 0 -1 EMPTY -Pos 1 0 EMPTY - -Index 156 -Pos -1 0 EMPTY -Pos 0 1 EMPTY - -Index 157 -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -Index 142 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 0 1 EMPTY -Pos 1 0 EMPTY - - -Index 1 -Pos 0 0 INDEX 64 -Pos 1 0 INDEX 80 - -Index 1 -Pos 0 0 INDEX 80 -Pos 1 -1 INDEX 80 - -Index 1 -Pos 0 0 INDEX 81 -Pos 0 -1 INDEX 80 diff --git a/data/editor/automap/jungle_main.rules b/data/editor/automap/jungle_main.rules deleted file mode 100644 index 432c428eeb..0000000000 --- a/data/editor/automap/jungle_main.rules +++ /dev/null @@ -1,329 +0,0 @@ -[Jungle] -Index 1 - -#top -Index 16 -Pos 0 -1 EMPTY - -Index 96 -Pos 0 -1 EMPTY -Random 15 - -Index 97 -Pos 0 -1 EMPTY -Random 15 - -Index 98 -Pos 0 -1 EMPTY -Random 15 - -#right -Index 21 -Pos 1 0 EMPTY - -#bottom -Index 52 -Pos 0 1 EMPTY - -Index 99 -Pos 0 1 EMPTY -Random 10 - -Index 100 -Pos 0 1 EMPTY -Random 10 - -Index 101 -Pos 0 1 EMPTY -Random 10 - -#left -Index 21 XFLIP -Pos -1 0 EMPTY - -#corner top-right -Index 5 -Pos 0 -1 EMPTY -Pos 1 0 EMPTY - -#corner top-left -Index 5 XFLIP -Pos 0 -1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-left -Index 37 XFLIP -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -Index 39 XFLIP -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Random 2 - -#corner bottom-right -Index 37 -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -Index 39 -Pos 0 1 EMPTY -Pos 1 0 EMPTY -Random 2 - -#inside corner top-right -Index 54 -Pos -1 1 EMPTY -Pos -1 0 FULL -Pos 0 1 FULL - -Index 53 XFLIP -Pos -1 1 EMPTY -Pos -1 0 FULL -Pos 0 1 FULL -Random 2 - -#inside corner top-left -Index 54 XFLIP -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL - -Index 53 -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Random 2 - -#inside corner bottom-left -Index 48 XFLIP -Pos 1 -1 EMPTY -Pos 1 0 FULL -Pos 0 -1 FULL - -Index 49 -Pos 1 -1 EMPTY -Pos 1 0 FULL -Pos 0 -1 FULL -Random 3 - -Index 50 YFLIP -Pos 1 -1 EMPTY -Pos 1 0 FULL -Pos 0 -1 FULL -Random 3 - -#inside corner bottom-right -Index 48 -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos 0 -1 FULL - -Index 49 XFLIP -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos 0 -1 FULL -Random 3 - -Index 51 YFLIP -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos 0 -1 FULL -Random 3 - -#right bottom -Index 22 -Pos -1 0 EMPTY -Pos -1 1 FULL -Pos 0 1 FULL - -#left bottom -Index 22 XFLIP -Pos 1 0 EMPTY -Pos 1 1 FULL -Pos 0 1 FULL - -#top corner right 2 -Index 33 -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 FULL - -#top corner left 2 -Index 32 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos -1 1 FULL - -NewRun - -#random bricks -Index 66 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 200 - -Index 67 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 200 - -Index 68 -Pos 0 0 INDEX 1 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 400 - -NewRun - -#random big bricks -Index 64 -Pos 0 0 INDEX 1 -Pos 1 0 INDEX 1 -Pos 0 1 INDEX 1 -Pos 1 1 INDEX 1 -Pos -1 0 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 0 2 NOTINDEX -1 -Pos 2 0 NOTINDEX -1 -Random 300 - -NewRun - -#remove overlaps -Index 1 -Pos 0 0 INDEX 64 OR 69 -Pos -1 0 INDEX 64 OR 69 - -Index 1 -Pos 0 0 INDEX 64 OR 69 -Pos -1 -1 INDEX 64 OR 69 - -Index 1 -Pos 0 0 INDEX 64 OR 69 -Pos 0 -1 INDEX 64 OR 69 -NewRun - -#fill bones -Index 65 -Pos -1 0 INDEX 64 -Index 80 -Pos 0 -1 INDEX 64 -Index 81 -Pos -1 -1 INDEX 64 - - - -[Jungle dark] -Index 13 - -#top -Index 26 -Pos 0 -1 EMPTY - -#right -Index 25 -Pos 1 0 EMPTY - -#bottom -Index 10 -Pos 0 1 EMPTY - -#left -Index 24 -Pos -1 0 EMPTY - -#corner top-right -Index 9 -Pos 0 -1 EMPTY -Pos 1 0 EMPTY - -#corner top-left -Index 8 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-left -Index 40 -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-right -Index 41 -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -#inside corner top-right -Index 12 -Pos -1 1 EMPTY -Pos -1 0 FULL -Pos 0 1 FULL - -#inside corner top-left -Index 11 -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL - -#inside corner bottom-left -Index 27 -Pos 1 -1 EMPTY -Pos 1 0 FULL -Pos 0 -1 FULL - -#inside corner bottom-right -Index 28 -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos 0 -1 FULL - -NewRun - -#random bricks -Index 29 -Pos 0 0 INDEX 13 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 400 - -Index 42 -Pos 0 0 INDEX 13 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 150 - -Index 43 -Pos 0 0 INDEX 13 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 150 - -Index 44 -Pos 0 0 INDEX 13 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 150 - -Index 45 -Pos 0 0 INDEX 13 -Pos 0 1 NOTINDEX -1 -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 -Random 150 \ No newline at end of file diff --git a/data/editor/automap/jungle_midground.rules b/data/editor/automap/jungle_midground.rules deleted file mode 100644 index 4dadbafc46..0000000000 --- a/data/editor/automap/jungle_midground.rules +++ /dev/null @@ -1,1468 +0,0 @@ -[Raw] - -#clear -Index 0 -Pos 0 0 INDEX 211 OR 214 OR 217 OR 218 OR 219 OR 224 - -NewRun - -Index 35 - - -[Small] - -#clear -Index 0 -Pos 0 0 INDEX 211 OR 214 OR 217 OR 218 OR 219 OR 224 - -NewRun - -Index 35 - -#top -Index 200 -Pos 0 -1 EMPTY - -#right -Index 200 ROTATE -Pos 1 0 EMPTY - -#bottom -Index 200 XFLIP YFLIP -Pos 0 1 EMPTY - -#left -Index 200 ROTATE XFLIP YFLIP -Pos -1 0 EMPTY - -#corner top-right -Index 199 -Pos 0 -1 EMPTY -Pos 1 0 EMPTY - -#corner top-left -Index 199 ROTATE XFLIP YFLIP -Pos 0 -1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-left -Index 199 XFLIP YFLIP -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-right -Index 199 ROTATE -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -#inside corner top-right -Index 215 XFLIP YFLIP -Pos -1 1 EMPTY -Pos -1 0 FULL -Pos 0 1 FULL - -#inside corner top-left -Index 215 ROTATE -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL - -#inside corner bottom-left -Index 215 -Pos 1 -1 EMPTY -Pos 1 0 FULL -Pos 0 -1 FULL - -#inside corner bottom-right -Index 215 ROTATE XFLIP YFLIP -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos 0 -1 FULL - -NewRun - -#corner top-left 3x3 -Index 160 -Pos 0 0 INDEX 199 -Pos 1 -1 EMPTY -Pos 2 -1 EMPTY -Pos -1 1 EMPTY -Pos -1 2 EMPTY -Pos 1 0 FULL -Pos 2 0 FULL -Pos 3 0 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 2 1 FULL -Pos 3 1 FULL -Pos 0 2 FULL -Pos 1 2 FULL -Pos 2 2 FULL -Pos 0 3 FULL -Pos 1 3 FULL - -NewRun - -#corner top-right 3x3 -Index 160 ROTATE -Pos 0 0 INDEX 199 -Pos -1 -1 EMPTY -Pos -2 -1 EMPTY -Pos 1 1 EMPTY -Pos 1 2 EMPTY -Pos -1 0 FULL -Pos -2 0 FULL -Pos -3 0 FULL -Pos 0 1 FULL -Pos -1 1 FULL -Pos -2 1 FULL -Pos -3 1 FULL -Pos 0 2 FULL -Pos -1 2 FULL -Pos -2 2 FULL -Pos 0 3 FULL -Pos -1 3 FULL -Pos -4 0 NOTINDEX 160 -Pos -3 0 NOTINDEX 160 - -NewRun - -#corner bottom-left 3x3 -Index 160 ROTATE XFLIP YFLIP -Pos 0 0 INDEX 199 -Pos 1 1 EMPTY -Pos 2 1 EMPTY -Pos -1 -1 EMPTY -Pos -1 -2 EMPTY -Pos 1 0 FULL -Pos 2 0 FULL -Pos 3 0 FULL -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos 2 -1 FULL -Pos 3 -1 FULL -Pos 0 -2 FULL -Pos 1 -2 FULL -Pos 2 -2 FULL -Pos 0 -3 FULL -Pos 1 -3 FULL -Pos 0 -4 NOTINDEX 160 -Pos 0 -3 NOTINDEX 160 - -NewRun - -#corner bottom-right 3x3 -Index 160 XFLIP YFLIP -Pos 0 0 INDEX 199 -Pos -1 1 EMPTY -Pos -2 1 EMPTY -Pos 1 -1 EMPTY -Pos 1 -2 EMPTY -Pos -1 0 FULL -Pos -2 0 FULL -Pos -3 0 FULL -Pos 0 -1 FULL -Pos -1 -1 FULL -Pos -2 -1 FULL -Pos -3 -1 FULL -Pos 0 -2 FULL -Pos -1 -2 FULL -Pos -2 -2 FULL -Pos 0 -3 FULL -Pos -1 -3 FULL -Pos -4 0 NOTINDEX 160 -Pos -3 0 NOTINDEX 160 -Pos 0 -4 NOTINDEX 160 -Pos 0 -3 NOTINDEX 160 - -NewRun - -#fill top-left -Index 161 -Pos -1 0 INDEX 160 -Pos 1 0 FULL -Pos 0 -1 EMPTY - -Index 162 -Pos -2 0 INDEX 160 -Pos -1 0 FULL -Pos 0 -1 EMPTY - -Index 176 -Pos 0 -1 INDEX 160 -Pos 0 1 FULL -Pos -1 0 EMPTY - -Index 177 -Pos -1 -1 INDEX 160 -Pos 0 -1 FULL -Pos -1 0 FULL - -Index 192 -Pos 0 -2 INDEX 160 -Pos 0 -1 FULL -Pos -1 0 EMPTY - -#fill top-right -Index 176 ROTATE -Pos 1 0 INDEX 160 -Pos -1 0 FULL -Pos 0 -1 EMPTY - -Index 192 ROTATE -Pos 2 0 INDEX 160 -Pos 1 0 FULL -Pos 0 -1 EMPTY - -Index 161 ROTATE -Pos 0 -1 INDEX 160 -Pos 0 1 FULL -Pos 1 0 EMPTY - -Index 177 ROTATE -Pos 1 -1 INDEX 160 -Pos 0 -1 FULL -Pos 1 0 FULL - -Index 162 ROTATE -Pos 0 -2 INDEX 160 -Pos 0 -1 FULL -Pos 1 0 EMPTY - -#fill bottom-left -Index 176 ROTATE XFLIP YFLIP -Pos -1 0 INDEX 160 -Pos 1 0 FULL -Pos 0 1 EMPTY - -Index 192 ROTATE XFLIP YFLIP -Pos -2 0 INDEX 160 -Pos -1 0 FULL -Pos 0 1 EMPTY - -Index 161 ROTATE XFLIP YFLIP -Pos 0 1 INDEX 160 -Pos 0 -1 FULL -Pos -1 0 EMPTY - -Index 177 ROTATE XFLIP YFLIP -Pos -1 1 INDEX 160 -Pos 0 1 FULL -Pos -1 0 FULL - -Index 162 ROTATE XFLIP YFLIP -Pos 0 2 INDEX 160 -Pos 0 1 FULL -Pos -1 0 EMPTY - -#fill bottom-right -Index 161 XFLIP YFLIP -Pos 1 0 INDEX 160 -Pos -1 0 FULL -Pos 0 1 EMPTY - -Index 162 XFLIP YFLIP -Pos 2 0 INDEX 160 -Pos 1 0 FULL -Pos 0 1 EMPTY - -Index 176 XFLIP YFLIP -Pos 0 1 INDEX 160 -Pos 0 -1 FULL -Pos 1 0 EMPTY - -Index 177 XFLIP YFLIP -Pos 1 1 INDEX 160 -Pos 0 1 FULL -Pos 1 0 FULL - -Index 192 XFLIP YFLIP -Pos 0 2 INDEX 160 -Pos 0 1 FULL -Pos 1 0 EMPTY - -NewRun - -#corner top-right 4x3 -Index 165 -Pos 0 0 INDEX 199 -Pos 1 1 INDEX 199 -Pos -1 -1 EMPTY -Pos -2 -1 EMPTY -Pos -1 0 FULL -Pos -2 0 FULL -Pos -3 0 FULL -Pos -3 1 FULL -Pos -2 1 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos -1 2 FULL -Pos 0 2 FULL -Pos 1 2 FULL -Pos 2 2 EMPTY -Pos 0 3 FULL -Pos 1 3 FULL -Pos -2 0 INDEX 200 -Pos 1 2 INDEX 200 - -NewRun - -#corner top-left 4x3 -Index 165 XFLIP -Pos 0 0 INDEX 199 -Pos -1 1 INDEX 199 -Pos 1 -1 EMPTY -Pos 2 -1 EMPTY -Pos 1 0 FULL -Pos 2 0 FULL -Pos 3 0 FULL -Pos 3 1 FULL -Pos 2 1 FULL -Pos 1 1 FULL -Pos 0 1 FULL -Pos 1 2 FULL -Pos 0 2 FULL -Pos -1 2 FULL -Pos -2 2 EMPTY -Pos 0 3 FULL -Pos -1 3 FULL -Pos 2 0 INDEX 200 -Pos -1 2 INDEX 200 -Pos 4 0 NOTINDEX 165 -Pos 3 0 NOTINDEX 165 - -NewRun - -#corner bottom-left 4x3 -Index 165 XFLIP YFLIP -Pos 0 0 INDEX 199 -Pos -1 -1 INDEX 199 -Pos 1 1 EMPTY -Pos 2 1 EMPTY -Pos 1 0 FULL -Pos 2 0 FULL -Pos 3 0 FULL -Pos 3 -1 FULL -Pos 2 -1 FULL -Pos 1 -1 FULL -Pos 0 -1 FULL -Pos 1 -2 FULL -Pos 0 -2 FULL -Pos -1 -2 FULL -Pos -2 -2 EMPTY -Pos 0 -3 FULL -Pos -1 -3 FULL -Pos 2 0 INDEX 200 -Pos -1 -2 INDEX 200 -Pos 0 -4 NOTINDEX 165 - -NewRun - -#corner bottom-right 4x3 -Index 165 YFLIP -Pos 0 0 INDEX 199 -Pos 1 -1 INDEX 199 -Pos -1 1 EMPTY -Pos -2 1 EMPTY -Pos -1 0 FULL -Pos -2 0 FULL -Pos -3 0 FULL -Pos -3 -1 FULL -Pos -2 -1 FULL -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos -1 -2 FULL -Pos 0 -2 FULL -Pos 1 -2 FULL -Pos 2 -2 EMPTY -Pos 0 -3 FULL -Pos 1 -3 FULL -Pos -2 0 INDEX 200 -Pos 1 -2 INDEX 200 -Pos -4 0 NOTINDEX 165 -Pos -3 0 NOTINDEX 165 -Pos 0 -4 NOTINDEX 165 - -NewRun - -#fill top-right 4x3 -Index 164 -Pos 1 0 INDEX 165 -Pos 0 -1 EMPTY -Pos -1 0 FULL - -Index 163 -Pos 2 0 INDEX 165 -Pos 0 -1 EMPTY -Pos -1 0 FULL - -Index 181 -Pos 0 -1 INDEX 165 -Pos 1 -1 EMPTY -Pos 1 0 FULL - -Index 182 -Pos -1 -1 INDEX 165 -Pos -1 0 FULL -Pos 1 0 EMPTY - -Index 198 -Pos -1 -2 INDEX 165 -Pos 0 -1 FULL -Pos 1 0 EMPTY - -#fill top-left 4x3 -Index 164 XFLIP -Pos -1 0 INDEX 165 -Pos 0 -1 EMPTY -Pos 1 0 FULL - -Index 163 XFLIP -Pos -2 0 INDEX 165 -Pos 0 -1 EMPTY -Pos 1 0 FULL - -Index 181 XFLIP -Pos 0 -1 INDEX 165 -Pos -1 -1 EMPTY -Pos -1 0 FULL - -Index 182 XFLIP -Pos 1 -1 INDEX 165 -Pos 1 0 FULL -Pos -1 0 EMPTY - -Index 198 XFLIP -Pos 1 -2 INDEX 165 -Pos 0 -1 FULL -Pos -1 0 EMPTY - -#fill bottom-left 4x3 -Index 164 XFLIP YFLIP -Pos -1 0 INDEX 165 -Pos 0 1 EMPTY -Pos 1 0 FULL - -Index 163 XFLIP YFLIP -Pos -2 0 INDEX 165 -Pos 0 1 EMPTY -Pos 1 0 FULL - -Index 181 XFLIP YFLIP -Pos 0 1 INDEX 165 -Pos -1 1 EMPTY -Pos -1 0 FULL - -Index 182 XFLIP YFLIP -Pos 1 1 INDEX 165 -Pos 1 0 FULL -Pos -1 0 EMPTY - -Index 198 XFLIP YFLIP -Pos 1 2 INDEX 165 -Pos 0 1 FULL -Pos -1 0 EMPTY - -#fill bottom-right 4x3 -Index 164 YFLIP -Pos 1 0 INDEX 165 -Pos 0 1 EMPTY -Pos -1 0 FULL - -Index 163 YFLIP -Pos 2 0 INDEX 165 -Pos 0 1 EMPTY -Pos -1 0 FULL - -Index 181 YFLIP -Pos 0 1 INDEX 165 -Pos 1 1 EMPTY -Pos 1 0 FULL - -Index 182 YFLIP -Pos -1 1 INDEX 165 -Pos -1 0 FULL -Pos 1 0 EMPTY - -Index 198 YFLIP -Pos -1 2 INDEX 165 -Pos 0 1 FULL -Pos 1 0 EMPTY - -NewRun - -#corner top-left 3x4 -Index 165 ROTATE XFLIP YFLIP -Pos 0 0 INDEX 199 -Pos 1 -1 INDEX 199 -Pos 2 -2 EMPTY -Pos 2 -1 FULL -Pos 3 -1 FULL -Pos 1 0 FULL -Pos 2 0 FULL -Pos 3 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL -Pos 2 1 FULL -Pos -1 2 EMPTY -Pos 0 2 FULL -Pos 1 2 FULL -Pos 0 3 FULL -Pos 1 3 FULL -Pos 0 2 INDEX 200 -Pos 2 -1 INDEX 200 - -NewRun - -#corner top-right 3x4 -Index 165 ROTATE XFLIP -Pos 0 0 INDEX 199 -Pos -1 -1 INDEX 199 -Pos -2 -2 EMPTY -Pos -2 -1 FULL -Pos -3 -1 FULL -Pos -1 0 FULL -Pos -2 0 FULL -Pos -3 0 FULL -Pos 1 1 EMPTY -Pos 0 1 FULL -Pos -1 1 FULL -Pos -2 1 FULL -Pos 1 2 EMPTY -Pos 0 2 FULL -Pos -1 2 FULL -Pos 0 3 FULL -Pos -1 3 FULL -Pos 0 2 INDEX 200 -Pos -2 -1 INDEX 200 - -NewRun - -#corner bottom-right 3x4 -Index 165 ROTATE -Pos 0 0 INDEX 199 -Pos -1 1 INDEX 199 -Pos -2 2 EMPTY -Pos -2 1 FULL -Pos -3 1 FULL -Pos -1 0 FULL -Pos -2 0 FULL -Pos -3 0 FULL -Pos 1 -1 EMPTY -Pos 0 -1 FULL -Pos -1 -1 FULL -Pos -2 -1 FULL -Pos 1 -2 EMPTY -Pos 0 -2 FULL -Pos -1 -2 FULL -Pos 0 -3 FULL -Pos -1 -3 FULL -Pos 0 -2 INDEX 200 -Pos -2 1 INDEX 200 -Pos 0 -4 NOTINDEX 165 -Pos 0 -3 NOTINDEX 165 - -NewRun - -#corner bottom-left 3x4 -Index 165 ROTATE YFLIP -Pos 0 0 INDEX 199 -Pos 1 1 INDEX 199 -Pos 2 2 EMPTY -Pos 2 1 FULL -Pos 3 1 FULL -Pos 1 0 FULL -Pos 2 0 FULL -Pos 3 0 FULL -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos 2 -1 FULL -Pos -1 -2 EMPTY -Pos 0 -2 FULL -Pos 1 -2 FULL -Pos 0 -3 FULL -Pos 1 -3 FULL -Pos 0 -2 INDEX 200 -Pos 2 1 INDEX 200 -Pos 0 -4 NOTINDEX 165 -Pos 0 -3 NOTINDEX 165 - -NewRun - -#fill top-left 3x4 -Index 164 ROTATE XFLIP YFLIP -Pos 0 -1 INDEX 165 -Pos -1 0 EMPTY -Pos 0 1 FULL - -Index 163 ROTATE XFLIP YFLIP -Pos 0 -2 INDEX 165 -Pos -1 0 EMPTY -Pos 0 1 FULL - -Index 181 ROTATE XFLIP YFLIP -Pos -1 0 INDEX 165 -Pos -1 -1 EMPTY -Pos 0 -1 FULL - -Index 182 ROTATE XFLIP YFLIP -Pos -1 1 INDEX 165 -Pos 0 1 FULL -Pos 0 -1 EMPTY - -Index 198 ROTATE XFLIP YFLIP -Pos -2 1 INDEX 165 -Pos -1 0 FULL -Pos 0 -1 EMPTY - -#fill top-right 3x4 -Index 164 ROTATE XFLIP -Pos 0 -1 INDEX 165 -Pos 1 0 EMPTY -Pos 0 1 FULL - -Index 163 ROTATE XFLIP -Pos 0 -2 INDEX 165 -Pos 1 0 EMPTY -Pos 0 1 FULL - -Index 181 ROTATE XFLIP -Pos 1 0 INDEX 165 -Pos 1 -1 EMPTY -Pos 0 -1 FULL - -Index 182 ROTATE XFLIP -Pos 1 1 INDEX 165 -Pos 0 1 FULL -Pos 0 -1 EMPTY - -Index 198 ROTATE XFLIP -Pos 2 1 INDEX 165 -Pos 1 0 FULL -Pos 0 -1 EMPTY - -#fill bottom-right 3x4 -Index 164 ROTATE -Pos 0 1 INDEX 165 -Pos 1 0 EMPTY -Pos 0 -1 FULL - -Index 163 ROTATE -Pos 0 2 INDEX 165 -Pos 1 0 EMPTY -Pos 0 -1 FULL - -Index 181 ROTATE -Pos 1 0 INDEX 165 -Pos 1 1 EMPTY -Pos 0 1 FULL - -Index 182 ROTATE -Pos 1 -1 INDEX 165 -Pos 0 -1 FULL -Pos 0 1 EMPTY - -Index 198 ROTATE -Pos 2 -1 INDEX 165 -Pos 1 0 FULL -Pos 0 1 EMPTY - -#fill bottom-left 3x4 -Index 164 ROTATE YFLIP -Pos 0 1 INDEX 165 -Pos -1 0 EMPTY -Pos 0 -1 FULL - -Index 163 ROTATE YFLIP -Pos 0 2 INDEX 165 -Pos -1 0 EMPTY -Pos 0 -1 FULL - -Index 181 ROTATE YFLIP -Pos -1 0 INDEX 165 -Pos -1 1 EMPTY -Pos 0 1 FULL - -Index 182 ROTATE YFLIP -Pos -1 -1 INDEX 165 -Pos 0 -1 FULL -Pos 0 1 EMPTY - -Index 198 ROTATE YFLIP -Pos -2 -1 INDEX 165 -Pos -1 0 FULL -Pos 0 1 EMPTY - -NewRun - -#dead end top -Index 227 XFLIP YFLIP -Pos -1 0 INDEX 215 -Pos 0 0 INDEX 200 -Pos 1 0 INDEX 215 -Pos -1 1 INDEX 200 -Pos 0 1 EMPTY -Pos 1 1 INDEX 200 - -#dead end right -Index 227 ROTATE XFLIP YFLIP -Pos 0 -1 INDEX 215 -Pos 0 0 INDEX 200 -Pos 0 1 INDEX 215 -Pos -1 -1 INDEX 200 -Pos -1 0 EMPTY -Pos -1 1 INDEX 200 - -#dead end bottom -Index 227 -Pos -1 0 INDEX 215 -Pos 0 0 INDEX 200 -Pos 1 0 INDEX 215 -Pos -1 -1 INDEX 200 -Pos 0 -1 EMPTY -Pos 1 -1 INDEX 200 - -#dead end left -Index 227 ROTATE -Pos 0 -1 INDEX 215 -Pos 0 0 INDEX 200 -Pos 0 1 INDEX 215 -Pos 1 -1 INDEX 200 -Pos 1 0 EMPTY -Pos 1 1 INDEX 200 - -NewRun - -#fill dead end top -Index 226 XFLIP YFLIP -Pos -1 0 INDEX 227 -Pos 0 1 INDEX 200 -Pos 1 0 FULL -Pos 0 -1 FULL - -Index 228 XFLIP YFLIP -Pos 1 0 INDEX 227 -Pos 0 1 INDEX 200 -Pos -1 0 FULL -Pos 0 1 FULL - -Index 210 XFLIP YFLIP -Pos -1 -1 INDEX 227 -Pos -1 0 EMPTY - -Index 211 XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 -1 INDEX 227 -Pos 0 1 EMPTY - -Index 212 XFLIP YFLIP -Pos 1 -1 INDEX 227 -Pos 1 0 EMPTY - -#fill dead end right -Index 226 ROTATE XFLIP YFLIP -Pos 0 -1 INDEX 227 -Pos -1 0 INDEX 200 -Pos 0 1 FULL -Pos 1 0 FULL - -Index 228 ROTATE XFLIP YFLIP -Pos 0 1 INDEX 227 -Pos -1 0 INDEX 200 -Pos 0 -1 FULL -Pos 1 0 FULL - -Index 210 ROTATE XFLIP YFLIP -Pos 1 -1 INDEX 227 -Pos 0 -1 EMPTY - -Index 211 ROTATE XFLIP YFLIP -Pos 0 0 EMPTY -Pos 1 0 INDEX 227 -Pos -1 0 EMPTY - -Index 212 ROTATE XFLIP YFLIP -Pos 1 1 INDEX 227 -Pos 0 1 EMPTY - -#fill dead end bottom -Index 226 -Pos 1 0 INDEX 227 -Pos 0 -1 INDEX 200 -Pos -1 0 FULL -Pos 0 1 FULL - -Index 228 -Pos -1 0 INDEX 227 -Pos 0 -1 INDEX 200 -Pos 1 0 FULL -Pos 0 1 FULL - -Index 210 -Pos 1 1 INDEX 227 -Pos 1 0 EMPTY - -Index 211 -Pos 0 0 EMPTY -Pos 0 1 INDEX 227 -Pos 0 -1 EMPTY - -Index 212 -Pos -1 1 INDEX 227 -Pos -1 0 EMPTY - -#fill dead end left -Index 226 ROTATE -Pos 0 1 INDEX 227 -Pos 1 0 INDEX 200 -Pos 0 -1 FULL -Pos -1 0 FULL - -Index 228 ROTATE -Pos 0 -1 INDEX 227 -Pos 1 0 INDEX 200 -Pos 0 1 FULL -Pos -1 0 FULL - -Index 210 ROTATE -Pos -1 1 INDEX 227 -Pos 0 1 EMPTY - -Index 211 ROTATE -Pos 0 0 EMPTY -Pos -1 0 INDEX 227 -Pos 1 0 EMPTY - -Index 212 ROTATE -Pos -1 -1 INDEX 227 -Pos 0 -1 EMPTY - -NewRun - -#s-curve bottom-left 1 -Index 209 XFLIP YFLIP -Pos 0 0 INDEX 215 -Pos 0 -1 INDEX 200 -Pos 1 0 INDEX 199 -Pos 1 -1 EMPTY - -#s-curve bottom-left 1 alt -Index 229 -Pos 0 0 INDEX 215 -Pos 0 -1 INDEX 200 -Pos 1 0 INDEX 199 -Pos 1 -1 EMPTY -Random 2 - -NewRun - -#s-curve bottom-left 2 -Index 209 ROTATE YFLIP -Pos 0 0 INDEX 215 -Pos 1 0 INDEX 200 -Pos 0 -1 INDEX 199 -Pos 1 -1 EMPTY - -#s-curve bottom-left 2 alt -Index 229 ROTATE XFLIP -Pos 0 0 INDEX 215 -Pos 1 0 INDEX 200 -Pos 0 -1 INDEX 199 -Pos 1 -1 EMPTY -Random 2 - -NewRun - -#s-curve top-left 1 -Index 209 XFLIP -Pos 0 0 INDEX 215 -Pos 0 1 INDEX 200 -Pos 1 0 INDEX 199 -Pos 1 1 EMPTY -Pos 0 2 NOTINDEX 209 OR 229 - -#s-curve top-left 1 alt -Index 229 YFLIP -Pos 0 0 INDEX 215 -Pos 0 1 INDEX 200 -Pos 1 0 INDEX 199 -Pos 1 1 EMPTY -Pos 0 2 NOTINDEX 209 OR 229 -Random 2 - -NewRun - -#s-curve top-left 2 -Index 209 ROTATE XFLIP YFLIP -Pos 0 0 INDEX 215 -Pos 1 0 INDEX 200 -Pos 0 1 INDEX 199 -Pos 1 1 EMPTY - -#s-curve top-left 2 alt -Index 229 ROTATE -Pos 0 0 INDEX 215 -Pos 1 0 INDEX 200 -Pos 0 1 INDEX 199 -Pos 1 1 EMPTY -Random 2 - -NewRun - -#s-curve top-right 1 -Index 209 -Pos 0 0 INDEX 215 -Pos 0 1 INDEX 200 -Pos -1 0 INDEX 199 -Pos -1 1 EMPTY - -#s-curve top-right 1 alt -Index 229 XFLIP YFLIP -Pos 0 0 INDEX 215 -Pos 0 1 INDEX 200 -Pos -1 0 INDEX 199 -Pos -1 1 EMPTY -Random 2 - -NewRun - -#s-curve top-right 2 -Index 209 ROTATE XFLIP -Pos 0 0 INDEX 215 -Pos -1 0 INDEX 200 -Pos 0 1 INDEX 199 -Pos -1 1 EMPTY -Pos -2 0 NOTINDEX 209 OR 229 - -#s-curve top-right 2 alt -Index 229 ROTATE YFLIP -Pos 0 0 INDEX 215 -Pos -1 0 INDEX 200 -Pos 0 1 INDEX 199 -Pos -1 1 EMPTY -Pos -2 0 NOTINDEX 209 OR 229 -Random 2 - -NewRun - -#s-curve bottom-right 1 -Index 209 YFLIP -Pos 0 0 INDEX 215 -Pos 0 -1 INDEX 200 -Pos -1 0 INDEX 199 -Pos -1 -1 EMPTY -Pos 0 -2 NOTINDEX 209 OR 229 - -#s-curve bottom-right 1 alt -Index 229 XFLIP -Pos 0 0 INDEX 215 -Pos 0 -1 INDEX 200 -Pos -1 0 INDEX 199 -Pos -1 -1 EMPTY -Pos 0 -2 NOTINDEX 209 OR 229 -Random 2 - -NewRun - -#s-curve bottom-right 2 -Index 209 ROTATE -Pos 0 0 INDEX 215 -Pos -1 0 INDEX 200 -Pos 0 -1 INDEX 199 -Pos -1 -1 EMPTY -Pos -2 0 NOTINDEX 209 OR 229 - -#s-curve bottom-right 2 alt -Index 229 ROTATE XFLIP YFLIP -Pos 0 0 INDEX 215 -Pos -1 0 INDEX 200 -Pos 0 -1 INDEX 199 -Pos -1 -1 EMPTY -Pos -2 0 NOTINDEX 209 OR 229 -Random 2 - -NewRun - -#fill s-curve bottom-left 1 -Index 225 XFLIP YFLIP -Pos 0 0 INDEX 200 -Pos 0 1 INDEX 209 -Pos 1 0 EMPTY - -Index 208 XFLIP YFLIP -Pos 0 0 INDEX 199 -Pos -1 0 INDEX 209 -Pos 0 -1 EMPTY - -Index 224 XFLIP YFLIP -Pos 0 0 EMPTY -Pos -1 1 INDEX 209 -Pos -1 0 INDEX 200 - -#fill s-curve bottom-left 1 alt -Index 213 -Pos 0 0 INDEX 200 -Pos 0 1 INDEX 229 -Pos 1 0 EMPTY - -Index 230 -Pos 0 0 INDEX 199 -Pos -1 0 INDEX 229 -Pos 0 -1 EMPTY - -Index 214 -Pos 0 0 EMPTY -Pos -1 1 INDEX 229 -Pos -1 0 INDEX 200 - -#fill s-curve bottom-left 2 -Index 225 ROTATE YFLIP -Pos 0 0 INDEX 200 -Pos -1 0 INDEX 209 -Pos 0 -1 EMPTY - -Index 208 ROTATE YFLIP -Pos 0 0 INDEX 199 -Pos 0 1 INDEX 209 -Pos 1 0 EMPTY - -Index 224 ROTATE YFLIP -Pos 0 0 EMPTY -Pos -1 1 INDEX 209 -Pos 0 1 INDEX 200 - -#fill s-curve bottom-left 2 alt -Index 213 ROTATE XFLIP -Pos 0 0 INDEX 200 -Pos -1 0 INDEX 229 -Pos 0 -1 EMPTY - -Index 230 ROTATE XFLIP -Pos 0 0 INDEX 199 -Pos 0 1 INDEX 229 -Pos 1 0 EMPTY - -Index 214 ROTATE XFLIP -Pos 0 0 EMPTY -Pos -1 1 INDEX 229 -Pos 0 1 INDEX 200 - -#fill s-curve top-left 1 -Index 225 XFLIP -Pos 0 0 INDEX 200 -Pos 0 -1 INDEX 209 -Pos 1 0 EMPTY - -Index 208 XFLIP -Pos 0 0 INDEX 199 -Pos -1 0 INDEX 209 -Pos 0 1 EMPTY - -Index 224 XFLIP -Pos 0 0 EMPTY -Pos -1 -1 INDEX 209 -Pos -1 0 INDEX 200 - -#fill s-curve top-left 1 alt -Index 213 YFLIP -Pos 0 0 INDEX 200 -Pos 0 -1 INDEX 229 -Pos 1 0 EMPTY - -Index 230 YFLIP -Pos 0 0 INDEX 199 -Pos -1 0 INDEX 229 -Pos 0 1 EMPTY - -Index 214 YFLIP -Pos 0 0 EMPTY -Pos -1 -1 INDEX 229 -Pos -1 0 INDEX 200 - -#fill s-curve top-left 2 -Index 225 ROTATE XFLIP YFLIP -Pos 0 0 INDEX 200 -Pos -1 0 INDEX 209 -Pos 0 1 EMPTY - -Index 208 ROTATE XFLIP YFLIP -Pos 0 0 INDEX 199 -Pos 0 -1 INDEX 209 -Pos 1 0 EMPTY - -Index 224 ROTATE XFLIP YFLIP -Pos 0 0 EMPTY -Pos -1 -1 INDEX 209 -Pos 0 -1 INDEX 200 - -#fill s-curve top-left 2 alt -Index 213 ROTATE -Pos 0 0 INDEX 200 -Pos -1 0 INDEX 229 -Pos 0 1 EMPTY - -Index 230 ROTATE -Pos 0 0 INDEX 199 -Pos 0 -1 INDEX 229 -Pos 1 0 EMPTY - -Index 214 ROTATE -Pos 0 0 EMPTY -Pos -1 -1 INDEX 229 -Pos 0 -1 INDEX 200 - -#fill s-curve top-right 1 -Index 225 -Pos 0 0 INDEX 200 -Pos 0 -1 INDEX 209 -Pos -1 0 EMPTY - -Index 208 -Pos 0 0 INDEX 199 -Pos 1 0 INDEX 209 -Pos 0 1 EMPTY - -Index 224 -Pos 0 0 EMPTY -Pos 1 -1 INDEX 209 -Pos 1 0 INDEX 200 - -#fill s-curve top-right 1 alt -Index 213 XFLIP YFLIP -Pos 0 0 INDEX 200 -Pos 0 -1 INDEX 229 -Pos -1 0 EMPTY - -Index 230 XFLIP YFLIP -Pos 0 0 INDEX 199 -Pos 1 0 INDEX 229 -Pos 0 1 EMPTY - -Index 214 XFLIP YFLIP -Pos 0 0 EMPTY -Pos 1 -1 INDEX 229 -Pos 1 0 INDEX 200 - -#fill s-curve top-right 2 -Index 225 ROTATE XFLIP -Pos 0 0 INDEX 200 -Pos 1 0 INDEX 209 -Pos 0 1 EMPTY - -Index 208 ROTATE XFLIP -Pos 0 0 INDEX 199 -Pos 0 -1 INDEX 209 -Pos -1 0 EMPTY - -Index 224 ROTATE XFLIP -Pos 0 0 EMPTY -Pos 1 -1 INDEX 209 -Pos 0 -1 INDEX 200 - -#fill s-curve top-right 2 alt -Index 213 ROTATE YFLIP -Pos 0 0 INDEX 200 -Pos 1 0 INDEX 229 -Pos 0 1 EMPTY - -Index 230 ROTATE YFLIP -Pos 0 0 INDEX 199 -Pos 0 -1 INDEX 229 -Pos -1 0 EMPTY - -Index 214 ROTATE YFLIP -Pos 0 0 EMPTY -Pos 1 -1 INDEX 229 -Pos 0 -1 INDEX 200 - -#fill s-curve bottom-right 1 -Index 225 YFLIP -Pos 0 0 INDEX 200 -Pos 0 1 INDEX 209 -Pos -1 0 EMPTY - -Index 208 YFLIP -Pos 0 0 INDEX 199 -Pos 1 0 INDEX 209 -Pos 0 -1 EMPTY - -Index 224 YFLIP -Pos 0 0 EMPTY -Pos 1 1 INDEX 209 -Pos 1 0 INDEX 200 - -#fill s-curve bottom-right 1 alt -Index 213 XFLIP -Pos 0 0 INDEX 200 -Pos 0 1 INDEX 229 -Pos -1 0 EMPTY - -Index 230 XFLIP -Pos 0 0 INDEX 199 -Pos 1 0 INDEX 229 -Pos 0 -1 EMPTY - -Index 214 XFLIP -Pos 0 0 EMPTY -Pos 1 1 INDEX 229 -Pos 1 0 INDEX 200 - -#fill s-curve bottom-right 2 -Index 225 ROTATE -Pos 0 0 INDEX 200 -Pos 1 0 INDEX 209 -Pos 0 -1 EMPTY - -Index 208 ROTATE -Pos 0 0 INDEX 199 -Pos 0 1 INDEX 209 -Pos -1 0 EMPTY - -Index 224 ROTATE -Pos 0 0 EMPTY -Pos 1 1 INDEX 209 -Pos 0 1 INDEX 200 - -#fill s-curve bottom-right 2 alt -Index 213 ROTATE XFLIP YFLIP -Pos 0 0 INDEX 200 -Pos 1 0 INDEX 229 -Pos 0 -1 EMPTY - -Index 230 ROTATE XFLIP YFLIP -Pos 0 0 INDEX 199 -Pos 0 1 INDEX 229 -Pos -1 0 EMPTY - -Index 214 ROTATE XFLIP YFLIP -Pos 0 0 EMPTY -Pos 1 1 INDEX 229 -Pos 0 1 INDEX 200 - - -NewRun - -#top long -Index 233 -Pos 0 0 INDEX 200 -Pos 0 -1 EMPTY -Pos 0 -2 EMPTY -Pos -1 0 FULL -Pos 1 0 INDEX 200 -Pos 2 0 INDEX 200 -Random 5 - -#right long -Index 233 ROTATE -Pos 0 0 INDEX 200 -Pos 1 0 EMPTY -Pos 2 0 EMPTY -Pos 0 -1 FULL -Pos 0 1 INDEX 200 -Pos 0 2 INDEX 200 -Random 5 - -#bottom long -Index 233 XFLIP YFLIP -Pos 0 0 INDEX 200 -Pos 0 1 EMPTY -Pos 0 2 EMPTY -Pos 1 0 FULL -Pos -1 0 INDEX 200 -Pos -2 0 INDEX 200 -Random 5 - -#left long -Index 233 ROTATE XFLIP YFLIP -Pos 0 0 INDEX 200 -Pos -1 0 EMPTY -Pos -2 0 EMPTY -Pos 0 1 FULL -Pos 0 -1 INDEX 200 -Pos 0 -2 INDEX 200 -Random 5 - - -NewRun - -#top overlap -Index 200 -Pos 0 0 233 -Pos 0 -1 EMPTY -Pos 0 0 233 -Pos -1 0 INDEX 233 - -#top overlap 2 -Index 200 -Pos 0 0 233 -Pos 0 -1 EMPTY -Pos 0 0 INDEX 233 -Pos -2 0 INDEX 233 - -#right overlap -Index 200 ROTATE -Pos 0 0 233 -Pos 1 0 EMPTY -Pos 0 0 INDEX 233 -Pos 0 -1 INDEX 233 - -#right overlap 2 -Index 200 ROTATE -Pos 0 0 233 -Pos 1 0 EMPTY -Pos 0 0 INDEX 233 -Pos 0 -2 INDEX 233 - -#bottom overlap -Index 200 XFLIP YFLIP -Pos 0 0 233 -Pos 0 1 EMPTY -Pos 0 0 INDEX 233 -Pos 1 0 INDEX 233 - -#bottom overlap 2 -Index 200 XFLIP YFLIP -Pos 0 0 233 -Pos 0 1 EMPTY -Pos 0 0 INDEX 233 -Pos 2 0 INDEX 233 - -#left overlap -Index 200 ROTATE XFLIP YFLIP -Pos 0 0 233 -Pos -1 0 EMPTY -Pos 0 0 INDEX 233 -Pos 0 1 INDEX 233 - -#left overlap 2 -Index 200 ROTATE XFLIP YFLIP -Pos 0 0 233 -Pos -1 0 EMPTY -Pos 0 0 INDEX 233 -Pos 0 2 INDEX 233 - -NewRun - -#fill top long 1 -Index 234 -Pos -1 0 INDEX 233 -Pos 0 -1 EMPTY - -#fill top long 2 -Index 235 -Pos -2 0 INDEX 233 -Pos -1 0 INDEX 200 -Pos 0 -1 EMPTY -Pos 1 0 FULL - -#fill right long 1 -Index 234 ROTATE -Pos 0 -1 INDEX 233 -Pos 1 0 EMPTY - -#fill right long 2 -Index 235 ROTATE -Pos 0 -2 INDEX 233 -Pos 0 -1 INDEX 200 -Pos 1 0 EMPTY -Pos 0 1 FULL - -#fill bottom long 1 -Index 234 XFLIP YFLIP -Pos 1 0 INDEX 233 -Pos 0 1 EMPTY - -#fill bottom long 2 -Index 235 XFLIP YFLIP -Pos 2 0 INDEX 233 -Pos 1 0 INDEX 200 -Pos 0 1 EMPTY -Pos -1 0 FULL - -#fill left long 1 -Index 234 ROTATE XFLIP YFLIP -Pos 0 1 INDEX 233 -Pos -1 0 EMPTY - -#fill left long 2 -Index 235 ROTATE XFLIP YFLIP -Pos 0 2 INDEX 233 -Pos 0 1 INDEX 200 -Pos -1 0 EMPTY -Pos 0 -1 FULL - -NewRun - -#fill top long 3 -Index 217 -Pos 0 0 EMPTY -Pos 0 1 INDEX 233 -Pos 0 2 FULL - -#fill top long 4 -Index 218 -Pos 0 0 EMPTY -Pos 0 1 INDEX 234 -Pos 0 2 FULL - -#fill top long 5 -Index 219 -Pos 0 0 EMPTY -Pos 0 1 INDEX 235 -Pos 0 2 FULL - -#fill right long 3 -Index 217 ROTATE -Pos 0 0 EMPTY -Pos -1 0 INDEX 233 -Pos -2 0 FULL - -#fill right long 4 -Index 218 ROTATE -Pos 0 0 EMPTY -Pos -1 0 INDEX 234 -Pos -2 0 FULL - -#fill right long 5 -Index 219 ROTATE -Pos 0 0 EMPTY -Pos -1 0 INDEX 235 -Pos -2 0 FULL - -#fill bottom long 3 -Index 217 XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 -1 INDEX 233 -Pos 0 -2 FULL - -#fill bottom long 4 -Index 218 XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 -1 INDEX 234 -Pos 0 -2 FULL - -#fill bottom long 5 -Index 219 XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 -1 INDEX 235 -Pos 0 -2 FULL - -#fill left long 3 -Index 217 ROTATE XFLIP YFLIP -Pos 0 0 EMPTY -Pos 1 0 INDEX 233 -Pos 2 0 FULL - -#fill left long 4 -Index 218 ROTATE XFLIP YFLIP -Pos 0 0 EMPTY -Pos 1 0 INDEX 234 -Pos 2 0 FULL - -#fill left long 5 -Index 219 ROTATE XFLIP YFLIP -Pos 0 0 EMPTY -Pos 1 0 INDEX 235 -Pos 2 0 FULL diff --git a/data/editor/automap/round_tiles.rules b/data/editor/automap/round_tiles.rules deleted file mode 100644 index 9723c97547..0000000000 --- a/data/editor/automap/round_tiles.rules +++ /dev/null @@ -1,146 +0,0 @@ -[DDNet] - -Index 0 -Pos 0 0 INDEX 33 OR 33 XFLIP OR 33 YFLIP OR 33 XFLIP YFLIP - -NewRun - -Index 1 - -Index 2 -Pos 0 -1 EMPTY -Pos 0 1 FULL -Pos 1 0 EMPTY -Pos 1 -1 EMPTY - -Index 2 XFLIP -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos -1 -1 EMPTY - -Index 2 YFLIP -Pos -1 0 FULL -Pos 0 1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY - -Index 2 XFLIP YFLIP -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 0 1 EMPTY -Pos -1 1 EMPTY - -Index 33 -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos -1 0 FULL -Pos 1 -1 FULL -Pos -1 1 FULL -Pos 0 -1 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 - -Index 33 XFLIP -Pos 0 0 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 -1 FULL -Pos 1 1 FULL -Pos 0 -1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 - -Index 33 YFLIP -Pos 0 0 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 1 FULL -Pos -1 -1 FULL -Pos 0 1 NOTINDEX -1 -Pos -1 0 NOTINDEX -1 - -Index 33 XFLIP YFLIP -Pos 0 0 EMPTY -Pos 0 1 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 1 -1 FULL -Pos 0 1 NOTINDEX -1 -Pos 1 0 NOTINDEX -1 - -Index 18 -Pos 0 -1 FULL -Pos -1 0 FULL -Pos -1 -1 FULL -Pos 0 1 EMPTY -Pos 1 0 EMPTY -Pos 1 1 EMPTY - -Index 18 XFLIP -Pos 0 -1 FULL -Pos 1 0 FULL -Pos 1 -1 FULL -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos -1 1 EMPTY - -Index 18 YFLIP -Pos 0 1 FULL -Pos -1 0 FULL -Pos -1 1 FULL -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos 1 -1 EMPTY - -Index 18 XFLIP YFLIP -Pos 0 1 FULL -Pos 1 0 FULL -Pos 1 1 FULL -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos -1 -1 EMPTY - -[Chiller] -Index 1 - -#FLY -Index 1 -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -#top -Index 1 -Pos 0 -1 EMPTY - -#right -Index 1 -Pos 1 0 EMPTY - -#bottom -Index 1 -Pos 0 1 EMPTY - -#left -Index 1 -Pos -1 0 EMPTY - -#corner top-right -Index 18 YFLIP -Pos 0 -1 EMPTY -Pos 1 0 EMPTY - -#corner top-left -Index 18 YFLIP XFLIP -Pos 0 -1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-left -Index 18 XFLIP -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -#corner bottom-right -Index 18 -Pos 0 1 EMPTY -Pos 1 0 EMPTY diff --git a/data/editor/automap/water.rules b/data/editor/automap/water.rules deleted file mode 100644 index 56e98e8e21..0000000000 --- a/data/editor/automap/water.rules +++ /dev/null @@ -1,1278 +0,0 @@ -#Original by DoNe for DDNet-Walls. - -[Blue Water] -Index 16 - -#1W2W3W4W -Index 17 -Pos 0 -1 EMPTY -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos 1 0 EMPTY - -#1W2W3S4W -Index 18 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 0 1 FULL -Pos 1 0 EMPTY - -#1W2W3S4W -Index 18 YFLIP -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -#1W2S3S4W -Index 19 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 0 1 FULL -Pos 1 0 FULL -Pos 1 1 FULL - -#1W2S3S4W -Index 19 YFLIP -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 0 1 EMPTY -Pos 1 0 FULL -Pos 1 -1 FULL - -#1W2S3S4W -Index 19 XFLIP -Pos 0 -1 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos -1 1 FULL - -#1W2S3S4W -Index 19 XFLIP YFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos 0 1 EMPTY - -#1W2S3W4S -Index 20 -Pos -1 0 FULL -Pos 1 0 FULL -Pos 0 -1 EMPTY -Pos 0 1 EMPTY - -#1W2S3S4S -Index 21 -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 -1 EMPTY - -#1W2S3S4S -Index 21 YFLIP -Pos -1 -1 FULL -Pos 1 -1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 1 EMPTY - -#1D2D3D4D -Index 32 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1D2S3D4D -Index 33 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL - -#1D2S3D4D -Index 33 XFLIP -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1D2S3D4D -Index 33 YFLIP -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1D2S3D4D -Index 33 XFLIP YFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1D2S3S4D -Index 34 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 FULL - -#1D2S3S4D -Index 34 YFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1S2S3S4D -Index 35 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 FULL - -#1S2S3S4D -Index 35 XFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 FULL - -#1S2S3S4D -Index 35 YFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL - -#1S2S3S4D -Index 35 XFLIP YFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1S2D3S4D -Index 36 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1S2D3S4D -Index 36 XFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL - -#1S2S3D4D -Index 37 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL - -#1S2S3D4D -Index 37 XFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1W2D3S4W -Index 48 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY -Pos 1 0 FULL - -#1W2D3S4W -Index 48 XFLIP -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL - -#1W2D3S4W -Index 48 YFLIP -Pos -1 0 EMPTY -Pos 0 1 EMPTY -Pos 1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL - -#1W2D3S4W -Index 48 XFLIP YFLIP -Pos 1 0 EMPTY -Pos 0 1 EMPTY -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos -1 0 FULL - -#1W2D3D4S -Index 49 -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 -1 EMPTY - -#1W2D3D4S -Index 49 YFLIP -Pos -1 -1 EMPTY -Pos 1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 1 EMPTY - -#1W2S3D4S -Index 50 -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 -1 EMPTY - -#1W2S3D4S -Index 50 XFLIP -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 -1 EMPTY - -#1W2S3D4S -Index 50 YFLIP -Pos -1 -1 EMPTY -Pos 1 -1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 1 EMPTY - -#1W2S3D4S -Index 50 XFLIP YFLIP -Pos -1 -1 FULL -Pos 1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 1 EMPTY - -#1S2W3S4W -Index 51 -Pos -1 0 EMPTY -Pos 1 0 EMPTY -Pos 0 -1 FULL -Pos 0 1 FULL - -#1W2S3W4W -Index 52 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 0 1 EMPTY - -#1W2S3W4W -Index 52 XFLIP -Pos 0 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos 0 1 EMPTY - -#1S2S3S4W -Index 53 -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 -1 FULL -Pos 1 1 FULL - -#1S2S3S4W -Index 53 XFLIP -Pos 0 -1 FULL -Pos -1 -1 FULL -Pos -1 0 FULL -Pos -1 1 FULL -Pos 1 0 EMPTY -Pos 0 1 FULL - -#1D2D3S4W -Index 64 -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 -1 EMPTY -Pos 1 1 EMPTY - -#1D2D3S4W -Index 64 XFLIP -Pos 0 -1 FULL -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos -1 1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 FULL - -#1S2W3D4S -Index 65 -Pos 0 -1 FULL -Pos -1 -1 FULL -Pos -1 0 FULL -Pos -1 1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 FULL - -#1S2W3D4S -Index 65 XFLIP -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 -1 FULL -Pos 1 1 EMPTY - -#1S2W3D4S -Index 65 YFLIP -Pos 0 -1 FULL -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos -1 1 FULL -Pos 1 0 EMPTY -Pos 0 1 FULL - -#1S2W3D4S -Index 65 XFLIP YFLIP -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 -1 EMPTY -Pos 1 1 FULL - - -[White Water] -Index 23 - -#1W2W3W4W -Index 24 -Pos 0 -1 EMPTY -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos 1 0 EMPTY - -#1W2W3S4W -Index 25 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 0 1 FULL -Pos 1 0 EMPTY - -#1W2W3S4W -Index 25 YFLIP -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -#1W2S3S4W -Index 26 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 0 1 FULL -Pos 1 0 FULL -Pos 1 1 FULL - -#1W2S3S4W -Index 26 YFLIP -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 0 1 EMPTY -Pos 1 0 FULL -Pos 1 -1 FULL - -#1W2S3S4W -Index 26 XFLIP -Pos 0 -1 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos -1 1 FULL - -#1W2S3S4W -Index 26 XFLIP YFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos 0 1 EMPTY - -#1W2S3W4S -Index 27 -Pos -1 0 FULL -Pos 1 0 FULL -Pos 0 -1 EMPTY -Pos 0 1 EMPTY - -#1W2S3S4W -Index 28 -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 -1 EMPTY - -#1W2S3S4S -Index 28 YFLIP -Pos -1 -1 FULL -Pos 1 -1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 1 EMPTY - -#1D2D3D4D -Index 39 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1D2S3D4D -Index 40 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL - -#1D2S3D4D -Index 40 XFLIP -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1D2S3D4D -Index 40 YFLIP -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1D2S3D4D -Index 40 XFLIP YFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1D2S3S4D -Index 41 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 FULL - -#1D2S3S4D -Index 41 YFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1S2S3S4D -Index 42 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 FULL - -#1S2S3S4D -Index 42 XFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 FULL - -#1S2S3S4D -Index 42 YFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL - -#1S2S3S4D -Index 42 XFLIP YFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1S2D3S4D -Index 43 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1S2D3S4D -Index 43 XFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL - -#1S2S3D4D -Index 44 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL - -#1S2S3D4D -Index 44 XFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1W2D3S4W -Index 55 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY -Pos 1 0 FULL - -#1W2D3S4W -Index 55 XFLIP -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL - -#1W2D3S4W -Index 55 YFLIP -Pos -1 0 EMPTY -Pos 0 1 EMPTY -Pos 1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL - -#1W2D3S4W -Index 55 XFLIP YFLIP -Pos 1 0 EMPTY -Pos 0 1 EMPTY -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos -1 0 FULL - -#1W2D3D4S -Index 56 -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 -1 EMPTY - -#1W2D3D4S -Index 56 YFLIP -Pos -1 -1 EMPTY -Pos 1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 1 EMPTY - -#1W2S3D4S -Index 57 -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 -1 EMPTY - -#1W2S3D4S -Index 57 XFLIP -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 -1 EMPTY - -#1W2S3D4S -Index 57 YFLIP -Pos -1 -1 EMPTY -Pos 1 -1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 1 EMPTY - -#1W2S3D4S -Index 57 XFLIP YFLIP -Pos -1 -1 FULL -Pos 1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 1 EMPTY - -#1S2W3S4W -Index 58 -Pos -1 0 EMPTY -Pos 1 0 EMPTY -Pos 0 -1 FULL -Pos 0 1 FULL - -#1W2S3W4W -Index 59 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 0 1 EMPTY - -#1W2S3W4W -Index 59 XFLIP -Pos 0 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos 0 1 EMPTY - -#1S2S3S4W -Index 60 -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 -1 FULL -Pos 1 1 FULL - -#1S2S3S4W -Index 60 XFLIP -Pos 0 -1 FULL -Pos -1 -1 FULL -Pos -1 0 FULL -Pos -1 1 FULL -Pos 1 0 EMPTY -Pos 0 1 FULL - -#1D2D3S4W -Index 71 -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 -1 EMPTY -Pos 1 1 EMPTY - -#1D2D3S4W -Index 71 XFLIP -Pos 0 -1 FULL -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos -1 1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 FULL - -#1S2W3D4S -Index 72 -Pos 0 -1 FULL -Pos -1 -1 FULL -Pos -1 0 FULL -Pos -1 1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 FULL - -#1S2W3D4S -Index 72 XFLIP -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 -1 FULL -Pos 1 1 EMPTY - -#1S2W3D4S -Index 72 YFLIP -Pos 0 -1 FULL -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos -1 1 FULL -Pos 1 0 EMPTY -Pos 0 1 FULL - -#1S2W3D4S -Index 72 XFLIP YFLIP -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 -1 EMPTY -Pos 1 1 FULL - - -[Green Water] -Index 96 - -#1W2W3W4W -Index 97 -Pos 0 -1 EMPTY -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos 1 0 EMPTY - -#1W2W3S4W -Index 98 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 0 1 FULL -Pos 1 0 EMPTY - -#1W2W3S4W -Index 98 YFLIP -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -#1W2S3S4W -Index 99 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 0 1 FULL -Pos 1 0 FULL -Pos 1 1 FULL - -#1W2S3S4W -Index 99 YFLIP -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 0 1 EMPTY -Pos 1 0 FULL -Pos 1 -1 FULL - -#1W2S3S4W -Index 99 XFLIP -Pos 0 -1 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos -1 1 FULL - -#1W2S3S4W -Index 99 XFLIP YFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos 0 1 EMPTY - -#1W2S3W4S -Index 100 -Pos -1 0 FULL -Pos 1 0 FULL -Pos 0 -1 EMPTY -Pos 0 1 EMPTY - -#1W2S3S4S -Index 101 -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 -1 EMPTY - -#1W2S3S4S -Index 101 YFLIP -Pos -1 -1 FULL -Pos 1 -1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 1 EMPTY - -#1D2D3D4D -Index 112 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1D2S3D4D -Index 113 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL - -#1D2S3D4D -Index 113 XFLIP -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1D2S3D4D -Index 113 YFLIP -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1D2S3D4D -Index 113 XFLIP YFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1D2S3S4D -Index 114 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 FULL - -#1D2S3S4D -Index 114 YFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1S2S3S4D -Index 115 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 FULL - -#1S2S3S4D -Index 115 XFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 FULL - -#1S2S3S4D -Index 115 YFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL - -#1S2S3S4D -Index 115 XFLIP YFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1S2D3S4D -Index 116 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1S2D3S4D -Index 116 XFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL - -#1S2S3D4D -Index 117 -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 -1 FULL -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL - -#1S2S3D4D -Index 117 XFLIP -Pos -1 -1 FULL -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 FULL -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 EMPTY - -#1W2D3S4W -Index 128 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY -Pos 1 0 FULL - -#1W2D3S4W -Index 128 XFLIP -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos -1 0 FULL - -#1W2D3S4W -Index 128 YFLIP -Pos -1 0 EMPTY -Pos 0 1 EMPTY -Pos 1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL - -#1W2D3S4W -Index 128 XFLIP YFLIP -Pos 1 0 EMPTY -Pos 0 1 EMPTY -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos -1 0 FULL - -#1W2D3D4S -Index 129 -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 -1 EMPTY - -#1W2D3D4S -Index 129 YFLIP -Pos -1 -1 EMPTY -Pos 1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 1 EMPTY - -#1W2S3D4S -Index 130 -Pos -1 1 EMPTY -Pos 0 1 FULL -Pos 1 1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 -1 EMPTY - -#1W2S3D4S -Index 130 XFLIP -Pos -1 1 FULL -Pos 0 1 FULL -Pos 1 1 EMPTY -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 -1 EMPTY - -#1W2S3D4S -Index 130 YFLIP -Pos -1 -1 EMPTY -Pos 1 -1 FULL -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 1 EMPTY - -#1W2S3D4S -Index 130 XFLIP YFLIP -Pos -1 -1 FULL -Pos 1 -1 EMPTY -Pos 0 -1 FULL -Pos 1 0 FULL -Pos -1 0 FULL -Pos 0 1 EMPTY - -#1S2W3S4W -Index 131 -Pos -1 0 EMPTY -Pos 1 0 EMPTY -Pos 0 -1 FULL -Pos 0 1 FULL - -#1W2S3W4W -Index 132 -Pos 0 -1 EMPTY -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 0 1 EMPTY - -#1W2S3W4W -Index 132 XFLIP -Pos 0 -1 EMPTY -Pos -1 0 FULL -Pos 1 0 EMPTY -Pos 0 1 EMPTY - -#1S2S3S4W -Index 133 -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 -1 FULL -Pos 1 1 FULL - -#1S2S3S4W -Index 133 XFLIP -Pos 0 -1 FULL -Pos -1 -1 FULL -Pos -1 0 FULL -Pos -1 1 FULL -Pos 1 0 EMPTY -Pos 0 1 FULL - -#1D2D3S4W -Index 144 -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 -1 EMPTY -Pos 1 1 EMPTY - -#1D2D3S4W -Index 144 XFLIP -Pos 0 -1 FULL -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos -1 1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 FULL - -#1S2W3D4S -Index 145 -Pos 0 -1 FULL -Pos -1 -1 FULL -Pos -1 0 FULL -Pos -1 1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 FULL - -#1S2W3D4S -Index 145 XFLIP -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 -1 FULL -Pos 1 1 EMPTY - -#1S2W3D4S -Index 145 YFLIP -Pos 0 -1 FULL -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos -1 1 FULL -Pos 1 0 EMPTY -Pos 0 1 FULL - -#1S2W3D4S -Index 145 XFLIP YFLIP -Pos 0 -1 FULL -Pos -1 0 EMPTY -Pos 1 0 FULL -Pos 0 1 FULL -Pos 1 -1 EMPTY -Pos 1 1 FULL \ No newline at end of file diff --git a/data/editor/automap/winter_main.rules b/data/editor/automap/winter_main.rules deleted file mode 100644 index 914bf52033..0000000000 --- a/data/editor/automap/winter_main.rules +++ /dev/null @@ -1,282 +0,0 @@ - - -[Winter] - -Index 0 -Pos 0 0 INDEX 224 OR 225 OR 226 OR 227 OR 228 OR 229 OR 230 OR 248 OR 249 OR 250 OR 251 OR 252 OR 253 OR 254 OR 255 - -Index 1 - -NewRun - -#1tile height -Index 115 -Pos 0 -1 EMPTY -Pos 0 1 EMPTY - -#top -Index 19 -Pos 0 -1 EMPTY -Pos 0 1 FULL - -#left -Index 2 -Pos -1 0 EMPTY -Pos 1 0 FULL - -#right -Index 2 XFLIP -Pos -1 0 FULL -Pos 1 0 EMPTY - -#bottom -Index 97 -Pos 0 -1 FULL -Pos 0 1 EMPTY - - -#now map corners and links - -#Top corners -#corner left -Index 16 -Pos -1 0 EMPTY -Pos 0 -1 EMPTY -Pos 0 1 FULL - -#corner right -Index 20 -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 FULL - -#inside corner left -Index 3 -Pos 0 -1 FULL -Pos 1 -1 EMPTY -Pos 1 0 FULL -Pos 1 1 FULL -Pos 0 1 FULL - -#inside corner right -Index 4 -Pos -1 0 FULL -Pos -1 -1 EMPTY -Pos 0 -1 FULL -Pos 0 1 FULL -Pos -1 1 FULL - - -#bottom corners -#corner bottom right -Index 100 -Pos 0 -1 FULL -Pos 0 1 EMPTY -Pos 1 0 EMPTY - -#corner bottom left -Index 96 -Pos 0 -1 FULL -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -#inside corner top right -Index 8 -Pos -1 -1 FULL -Pos 0 1 FULL -Pos -1 0 FULL -Pos -1 1 EMPTY - -#inside corner top left -Index 7 -Pos 1 -1 FULL -Pos 0 1 FULL -Pos 1 0 FULL -Pos 1 1 EMPTY - - -#1tile height -#left -Index 112 -Pos 0 1 EMPTY -Pos -1 0 EMPTY -Pos 0 -1 EMPTY - -#right -Index 116 -Pos 0 -1 EMPTY -Pos 1 0 EMPTY -Pos 0 1 EMPTY - -#one tile height link right -Index 6 -Pos -1 -1 EMPTY -Pos -1 0 FULL -Pos 0 -1 FULL -Pos -1 1 EMPTY - -#one tile height link left -Index 5 -Pos 1 -1 EMPTY -Pos 1 0 FULL -Pos 0 -1 FULL -Pos 1 1 EMPTY - - - -#add design elements -NewRun - -#start placing the little snow and bottom design tiles to the left -#snow -Index 17 -Pos 0 0 INDEX 19 -Pos -1 0 INDEX 16 OR 3 -Pos 1 -1 EMPTY #prevents bug with ID4 - -#1tile snow -Index 113 -Pos 0 0 INDEX 115 -Pos -1 0 INDEX 112 OR 5 -Pos 1 -1 EMPTY #prevents bug with ID 6 - -#bottoms -Index 98 -Pos 0 0 INDEX 97 -Pos -2 0 INDEX 96 OR 7 - - -#fill the rows with design elements -NewRun -NoLayerCopy #updates the "Layer Copy" as soon as a tile gets changed by a rule afaik - -#snow -Index 17 -Pos 0 0 INDEX 19 -Pos -3 0 INDEX 17 -Pos 1 -1 EMPTY #prevents bug with ID4 -Index 18 -Pos 0 0 INDEX 19 -Pos -1 0 INDEX 17 - -#1tile snow -Index 113 -Pos 0 0 INDEX 115 -Pos -3 0 INDEX 113 -Pos 1 -1 EMPTY #prevents bug with ID 6 -Index 114 -Pos 0 0 INDEX 115 -Pos -1 0 INDEX 113 - -#bottoms -Index 98 -Pos 0 0 INDEX 97 -Pos -5 0 INDEX 98 -Index 99 -Pos 0 0 INDEX 97 -Pos -1 0 INDEX 98 -Index 102 -Pos 0 0 INDEX 97 -Pos -1 0 INDEX 99 -Index 103 -Pos 0 0 INDEX 97 -Pos -1 0 INDEX 102 - - - -#fix top right corners -NewRun - -Index 24 -Pos 0 0 INDEX 20 -Pos -1 0 INDEX 17 - -Index 120 -Pos 0 0 INDEX 116 -Pos -1 0 INDEX 113 - - - - - - - - -[Winter dark] -Index 177 - -#right -Index 178 XFLIP -Pos 1 0 EMPTY - -#left -Index 178 -Pos -1 0 EMPTY - -#corner bottom left -Index 193 -Pos 0 1 EMPTY -Pos -1 0 EMPTY - -#inside corner top right -Index 180 -Pos 0 1 FULL -Pos -1 0 FULL -Pos -1 1 EMPTY - -#inside corner top left -Index 179 -Pos 0 1 FULL -Pos 1 0 FULL -Pos 1 1 EMPTY - -#bottoms -NewRun - -Index 194 -Pos 0 1 EMPTY -Pos -1 0 INDEX 193 OR 179 - -NoLayerCopy - -Index 194 -Pos 0 1 EMPTY -Pos -5 0 INDEX 194 - -Index 195 -Pos 0 1 EMPTY -Pos -1 0 INDEX 194 - -Index 196 -Pos 0 1 EMPTY -Pos -1 0 INDEX 195 - -Index 210 -Pos 0 1 EMPTY -Pos -1 0 INDEX 196 - -Index 211 -Pos 0 1 EMPTY -Pos -1 0 INDEX 210 - - -#fix corners -#corner bottom right -Index 197 -Pos 0 1 EMPTY -Pos 1 0 EMPTY - - - - - - - - - - - - - - - diff --git a/data/editor/checker.png b/data/editor/checker.png deleted file mode 100644 index e7674b1746..0000000000 Binary files a/data/editor/checker.png and /dev/null differ diff --git a/data/editor/cursor.png b/data/editor/cursor.png deleted file mode 100644 index 0b292de707..0000000000 Binary files a/data/editor/cursor.png and /dev/null differ diff --git a/data/editor/cursor_resize.png b/data/editor/cursor_resize.png deleted file mode 100644 index ca696d06e9..0000000000 Binary files a/data/editor/cursor_resize.png and /dev/null differ diff --git a/data/editor/entities/DDNet.png b/data/editor/entities/DDNet.png deleted file mode 100644 index 0ff4a8d8e4..0000000000 Binary files a/data/editor/entities/DDNet.png and /dev/null differ diff --git a/data/editor/entities/F-DDrace.png b/data/editor/entities/F-DDrace.png deleted file mode 100644 index ccfac04659..0000000000 Binary files a/data/editor/entities/F-DDrace.png and /dev/null differ diff --git a/data/editor/entities/FNG.png b/data/editor/entities/FNG.png deleted file mode 100644 index 6657c94e1e..0000000000 Binary files a/data/editor/entities/FNG.png and /dev/null differ diff --git a/data/editor/entities/Race.png b/data/editor/entities/Race.png deleted file mode 100644 index c63c734285..0000000000 Binary files a/data/editor/entities/Race.png and /dev/null differ diff --git a/data/editor/entities/Vanilla.png b/data/editor/entities/Vanilla.png deleted file mode 100644 index 8013d6addb..0000000000 Binary files a/data/editor/entities/Vanilla.png and /dev/null differ diff --git a/data/editor/entities/blockworlds.png b/data/editor/entities/blockworlds.png deleted file mode 100644 index 7cca8e1237..0000000000 Binary files a/data/editor/entities/blockworlds.png and /dev/null differ diff --git a/data/editor/entities_clear/blockworlds.png b/data/editor/entities_clear/blockworlds.png deleted file mode 100644 index da576512a3..0000000000 Binary files a/data/editor/entities_clear/blockworlds.png and /dev/null differ diff --git a/data/editor/entities_clear/ddnet.png b/data/editor/entities_clear/ddnet.png deleted file mode 100644 index ac3ae6ec80..0000000000 Binary files a/data/editor/entities_clear/ddnet.png and /dev/null differ diff --git a/data/editor/entities_clear/ddrace.png b/data/editor/entities_clear/ddrace.png deleted file mode 100644 index 2ec824ac8d..0000000000 Binary files a/data/editor/entities_clear/ddrace.png and /dev/null differ diff --git a/data/editor/entities_clear/f-ddrace.png b/data/editor/entities_clear/f-ddrace.png deleted file mode 100644 index 71923eb94b..0000000000 Binary files a/data/editor/entities_clear/f-ddrace.png and /dev/null differ diff --git a/data/editor/entities_clear/fng.png b/data/editor/entities_clear/fng.png deleted file mode 100644 index 65dc8b3291..0000000000 Binary files a/data/editor/entities_clear/fng.png and /dev/null differ diff --git a/data/editor/entities_clear/race.png b/data/editor/entities_clear/race.png deleted file mode 100644 index bf1fa03f6c..0000000000 Binary files a/data/editor/entities_clear/race.png and /dev/null differ diff --git a/data/editor/entities_clear/vanilla.png b/data/editor/entities_clear/vanilla.png deleted file mode 100644 index 2afbb9b554..0000000000 Binary files a/data/editor/entities_clear/vanilla.png and /dev/null differ diff --git a/data/editor/front.png b/data/editor/front.png deleted file mode 100644 index 67f8366306..0000000000 Binary files a/data/editor/front.png and /dev/null differ diff --git a/data/editor/speed_arrow.png b/data/editor/speed_arrow.png deleted file mode 100644 index d5d45b9ce3..0000000000 Binary files a/data/editor/speed_arrow.png and /dev/null differ diff --git a/data/editor/speed_arrow_array.png b/data/editor/speed_arrow_array.png deleted file mode 100644 index f85db1a0f4..0000000000 Binary files a/data/editor/speed_arrow_array.png and /dev/null differ diff --git a/data/editor/speedup.png b/data/editor/speedup.png deleted file mode 100644 index 0ba0d71aa5..0000000000 Binary files a/data/editor/speedup.png and /dev/null differ diff --git a/data/editor/switch.png b/data/editor/switch.png deleted file mode 100644 index 3e14e106bf..0000000000 Binary files a/data/editor/switch.png and /dev/null differ diff --git a/data/editor/tele.png b/data/editor/tele.png deleted file mode 100644 index aa14ca1e38..0000000000 Binary files a/data/editor/tele.png and /dev/null differ diff --git a/data/editor/tune.png b/data/editor/tune.png deleted file mode 100644 index 25f7781542..0000000000 Binary files a/data/editor/tune.png and /dev/null differ diff --git a/data/emoticons.png b/data/emoticons.png deleted file mode 100644 index 63f0126b5b..0000000000 Binary files a/data/emoticons.png and /dev/null differ diff --git a/data/extras.png b/data/extras.png deleted file mode 100644 index 14d320e1e6..0000000000 Binary files a/data/extras.png and /dev/null differ diff --git a/data/fonts/DejaVuSans.ttf b/data/fonts/DejaVuSans.ttf deleted file mode 100644 index e5f7eecce4..0000000000 Binary files a/data/fonts/DejaVuSans.ttf and /dev/null differ diff --git a/data/fonts/Font_Awesome_6_Free-Solid-900.otf b/data/fonts/Font_Awesome_6_Free-Solid-900.otf deleted file mode 100644 index a95c71e05d..0000000000 Binary files a/data/fonts/Font_Awesome_6_Free-Solid-900.otf and /dev/null differ diff --git a/data/fonts/GlowSansJ-Compressed-Book.otf b/data/fonts/GlowSansJ-Compressed-Book.otf deleted file mode 100644 index 510cd97230..0000000000 Binary files a/data/fonts/GlowSansJ-Compressed-Book.otf and /dev/null differ diff --git a/data/fonts/SourceHanSans.ttc b/data/fonts/SourceHanSans.ttc deleted file mode 100644 index cf5efd6d8b..0000000000 Binary files a/data/fonts/SourceHanSans.ttc and /dev/null differ diff --git a/data/fonts/index.json b/data/fonts/index.json deleted file mode 100644 index 2f2e9c460f..0000000000 --- a/data/fonts/index.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "font files": [ - "DejaVuSans.ttf", - "Font_Awesome_6_Free-Solid-900.otf", - "GlowSansJ-Compressed-Book.otf", - "SourceHanSans.ttc" - ], - "default": "DejaVu Sans", - "language variants": { - "japanese": "Glow Sans J Compressed Book", - "korean": "Source Han Sans K", - "simplified_chinese": "Source Han Sans SC", - "traditional_chinese": "Source Han Sans TC" - }, - "fallbacks": [ - "Source Han Sans" - ], - "icon": "Font Awesome 6 Free" -} diff --git a/data/game.png b/data/game.png deleted file mode 100644 index 750e09b9d3..0000000000 Binary files a/data/game.png and /dev/null differ diff --git a/data/gui_buttons.png b/data/gui_buttons.png deleted file mode 100644 index 58e7fac3c4..0000000000 Binary files a/data/gui_buttons.png and /dev/null differ diff --git a/data/gui_cursor.png b/data/gui_cursor.png deleted file mode 100644 index e5adb7733d..0000000000 Binary files a/data/gui_cursor.png and /dev/null differ diff --git a/data/gui_icons.png b/data/gui_icons.png deleted file mode 100644 index 78e1cc4888..0000000000 Binary files a/data/gui_icons.png and /dev/null differ diff --git a/data/gui_logo.png b/data/gui_logo.png deleted file mode 100644 index c01456b717..0000000000 Binary files a/data/gui_logo.png and /dev/null differ diff --git a/data/hud.png b/data/hud.png deleted file mode 100644 index 4b3ff61960..0000000000 Binary files a/data/hud.png and /dev/null differ diff --git a/data/languages/arabic.txt b/data/languages/arabic.txt deleted file mode 100644 index ea7bdcd46c..0000000000 --- a/data/languages/arabic.txt +++ /dev/null @@ -1,2069 +0,0 @@ -############ authors ################### -# Created By : Relax / .Yukki -# Created By : Reko / vMarshu -######################################## - -##### translated strings ##### - -%ds left -== ﺖﻀﻣ %ds - -%i minute left -== ﺖﻀﻣ ﺔﻘﻴﻗﺩ %i - -%i minutes left -== ﺖﻀﻣ ﻖﺋﺎﻗﺩ %i - -%i second left -== ﺖﻀﻣ ﺔﻴﻧﺎﺛ %i - -%i seconds left -== ﺖﻀﻣ ﻦﻧﺍﻮﺛ %i - -%s wins! -== !ﺯﺎﻓ %s - -Abort -== ﻁﺎﺒﺣﺇ - -Add -== ﺔﻓﺎﺿﺍ - -Add Friend -== ﻖﻳﺪﺻ ﺔﻓﺎﺿﺍ - -Address -== ﻥﺍﻮﻨﻋ - -All -== ﻞﻜﻟﺍ - -Are you sure that you want to quit? -== ﻪﺒﻌﻠﻟﺍ ﻕﻼﻏﻻ ﺪﻛﺎﺘﻣ ﺖﻧﺍ ﻞﻫ - -Automatically record demos -== ﻲﺋﺎﻘﻠﺗ ﻮﻳﺪﻴﻓ ﻞﻴﺠﺴﺗ - -Blue team -== ﻕﺭﺯﻻﺍ ﻖﻳﺮﻔﻟﺍ - -Blue team wins! -== !ﺯﺎﻓ ﻕﺭﺯﻻﺍ ﻖﻳﺮﻔﻟﺍ - -Body -== ﻢﺴﺠﻟﺍ - -Call vote -== ﺖﻳﻮﺼﺗ - -Change settings -== ﺕﺍﺩﺍﺪﻋﻻﺍ ﺮﻴﻴﻐﺗ - -Chat -== ﺔﺷﺩﺭﺩ - -Clan -== ﻥﻼﻛ - -Client -== ﺖﻨﻳﻼﻛ - -Connecting to -== ﻰﻟﺍ ﻝﺎﺼﺗﺍ - -Connection Problems… -== ﻝﺎﺼﺗﻻﺍ ﻲﻓ ﻞﻛﺎﺸﻣ… - -Console -== ﻞﺴﻧﻮﻜﻟﺍ - -Controls -== ﻢﻜﺤﺘﻟﺍ - -Count players only -== ﻂﻘﻓ ﻦﻴﺒﻋﻼﻟﺍ ﺪﻋ - -Current -== ﻲﻟﺎﺤﻟﺍ - -Custom colors -== ﺔﺼﺼﺨﻣ ﻥﺍﻮﻟﺍ - -Delete -== ﻑﺬﺣ - -Delete demo -== ﻮﻳﺪﻴﻔﻟﺍ ﻑﺬﺣ - -Demofile: %s -== %s :ﻮﻳﺪﻴﻔﻟﺍ ﻒﻠﻣ - -Demos -== ﺕﺎﻫﻮﻳﺪﻴﻔﻟﺍ - -Disconnect -== ﺝﻭﺮﺧ - -Disconnected -== ﺮﻓﺮﻴﺴﻟﺍ ﻦﻣ ﺝﺮﺧ - -Downloading map -== ﺏﺎﻤﻟﺍ ﻞﻴﻤﺤﺗ - -Draw! -== !ﻝﺩﺎﻌﺗ - -Dynamic Camera -== ﺍﺮﻴﻣﺎﻛ ﻚﻴﻣﺎﻨﻳﺩ - -Emoticon -== ﺕﻮﻤﻳﺍ - -Error -== ﺀﺎﻄﺧ - -Error loading demo -== ﻮﻳﺪﻴﻓﻟﺍ ﻞﻴﻤﺤﺗ ﻞﺸﻓ - -Favorite -== ﻞﻀﻔﻤﻟﺍ - -Favorites -== ﺔﻠﻀﻔﻤﻟﺍ - -Feet -== ﺔﻣﺰﺟ - -Fire -== ﺭﺎﻧ - -Folder -== ﻒﻠﻣ - -Force vote -== ﺖﻳﻮﺼﺘﻟﺍ ﺽﺮﻓ - -Free-View -== ﺮﺤﻟﺍ ﺮﻈﻨﻤﻟﺍ - -Fullscreen -== ﻞﻣﺎﻜﻟﺍ ﺔﺷﺎﺸﻟﺍ ﻊﺿﻭ - -Game -== ﺔﺒﻌﻠﻟﺍ - -Game info -== ﺔﺒﻌﻠﻟﺍ ﺕﺎﻣﻮﻠﻌﻣ - -Game over -== ﺔﺒﻌﻠﻟﺍ ﺖﻬﺘﻧﺍ - -Game paused -== ﺔﺒﻌﻠﻟﺍ ﺖﻔﻗﻮﺗ - -Game type -== ﺔﺒﻌﻠﻟﺍ ﺭﻮﻃ - -Game types: -== ﺔﺒﻌﻠﻟﺍ ﺭﺍﻮﻃﺍ: - -General -== ﻡﺎﻋ - -Graphics -== ﺲﻜﻴﻓﺍﺮﺟ - -Grenade -== ﺔﻠﺒﻨﻗ - -Hammer -== ﺔﻗﺮﻄﻣ - -Has people playing -== ﺹﺎﺨﺷﺍ ﻪﺑ ﺪﺟﻮﻳ - -High Detail -== ﺔﻴﻟﺎﻋ ﻞﻴﺻﺎﻔﺗ - -Hook -== ﺐﺤﺳ - -Invalid Demo -== ﺢﻟﺎﺻ ﺮﻴﻏ ﻮﻳﺪﻴﻓ - -Join blue -== ﻕﺭﺯﻻﺍ ﻰﻟﺍ ﻡﺎﻤﻀﻧﻻﺍ - -Join red -== ﺮﻤﺣﻻﺍ ﻰﻟﺍ ﻡﺎﻤﻀﻧﻻﺍ - -Jump -== ﺰﻔﻗ - -Kick player -== ﺐﻋﻻ ﺩﺮﻃ - -Language -== ﺔﻐﻠﻟﺍ - -MOTD -== ﻡﻮﻴﻟﺍ ﺔﻟﺎﺳﺭ - -Map -== ﺏﺎﻤﻟﺍ - -Move left -== ﺭﺎﺴﻳ ﻙﺮﺤﺘﻟﺍ - -Move player to spectators -== ﺪﻫﺎﺸﻳ ﺐﻋﻻ ﻞﻌﺟ - -Move right -== ﻦﻴﻤﻳ ﻙﺮﺤﺘﻟﺍ - -Movement -== ﻙﺮﺤﺘﻟﺍ - -Mute when not active -== ﺔﺒﻌﻠﻟﺍ ﻞﻳﺪﺒﺘﻟﺍ ﺎﻣﺪﻨﻋ ، ﺕﻮﺼﻟﺍ ﻢﺘﻛ - -Name -== ﻢﺳﻻﺍ - -Next weapon -== ﻲﻟﺎﺘﻟﺍ ﻡﻼﺴﻟﺍ - -Nickname -== ﻢﺳﻻﺍ - -No -== ﻻ - -No password -== ﺮﺳ ﺔﻤﻠﻛ ﺪﺟﻮﻳ ﻻ - -No servers found -== ﺕﺍﺮﻓﺮﻴﺳ ﺪﺟﻮﻳ ﻻ - -No servers match your filter criteria -== ﻚﺑ ﺔﺻﺎﺨﻟﺍ ﺔﻴﻔﺼﺘﻟﺍ ﺮﻴﻳﺎﻌﻣ ﻖﺑﺎﻄﺗ ﺮﻓﺮﻴﺳ ﺪﺟﻮﺗ ﻻ - -Ok -== ﻙﻭﺍ - -Parent Folder -== ﻞﺻﻷﺍ ﺪﻠﺠﻤﻟﺍ - -Password -== ﺭﻭﺮﻤﻟﺍ ﺔﻤﻠﻛ - -Password incorrect -== ﺔﺌﻃﺎﺧ ﺭﻭﺮﻤﻟﺍ ﺔﻤﻠﻛ - -Ping -== ﻖﻨﺑ - -Pistol -== ﺱﺪﺴﻣ - -Play background music -== ﺔﻴﻔﻠﺨﻟﺍ ﺕﻮﺻ ﻞﻴﻌﻔﺗ - -Player -== ﺐﻋﻻ - -Player country: -== ﺐﻋﻼﻟﺍ ﺪﻠﺑ: - -Players -== ﻦﻴﺒﻋﻻ - -Please balance teams! -== !ﻕﺮﻔﻟﺍ ﺔﻧﺯﺍﻮﻣ ﺀﺎﺟﺮﻟﺍ - -Prev. weapon -== ﻖﺑﺎﺴﻟﺍ ﺡﻼﺴﻟﺍ - -Quit -== ﺝﻭﺮﺧ - -Reason: -== :ﺐﺒﺴﻟﺍ - -Red team -== ﺮﻤﺣﻻﺍ ﻖﻳﺮﻔﻟﺍ - -Red team wins! -== !ﺮﺼﺘﻧﺍ ﺮﻤﺣﻻﺍ ﻖﻳﺮﻔﻟﺍ - -Remote console -== ﻦﻣﺩﻻﺍ ﻞﺴﻧﻮﻛ - -Remove -== ﻑﺬﺣ - -Remove friend -== ﻖﻳﺪﺻ ﻑﺬﺣ - -Rename demo -== ﻮﻳﺪﻴﻓﻟﺍ ﺔﻴﻤﺴﺗ ﺓﺩﺎﻋﺍ - -Reset filter -== ﺔﻴﻔﺼﺘﻟﺍ ﺓﺩﺎﻋﺍ - -Score -== ﻁﺎﻘﻨﻟﺍ - -Score limit -== ﻁﺎﻘﻨﻟﺍ ﺩﻭﺪﺣ - -Scoreboard -== ﻁﺎﻘﻨﻟﺍ ﺔﻤﺋﺎﻗ - -Screenshot -== ﺔﺷﺎﺸﻟﺍ ﺔﻄﻘﻟ - -Server address: -== ﺮﻓﺮﻴﺴﻟﺍ ﻥﺍﻮﻨﻋ: - -Server info -== ﺮﻓﺮﻴﺴﻟﺍ ﺕﺎﻣﻮﻠﻌﻣ - -Server not full -== ﺊﻠﺘﻤﻣ ﺲﻴﻟ ﺮﻓﺮﻴﺴﻟﺍ - -Shotgun -== ﻦﻘﺘﺷ - -Show chat -== ﺕﺎﺸﻟﺍ ﺭﺎﻬﻇﺍ - -Show friends only -== ﻂﻘﻓ ﺀﺎﻗﺪﺻﻻﺍ ﺭﺎﻬﻇﺍ - -Show ingame HUD -== ﺔﺒﻌﻠﻟﺍ ﺮﻬﻈﻣ ﺭﺎﻬﻇﺍ - -Show name plates -== ﻲﻣﺎﺳﻻﺍ ﺭﺎﻬﻇﺍ - -Show only chat messages from friends -== ﺀﺎﻗﺪﺻﻻﺍ ﻦﻣ ﻂﻘﻓ ﻞﺋﺎﺳﺮﻟﺍ ﺭﺎﻬﻇﺍ - -Sound -== ﺕﻮﺼﻟﺍ - -Sound error -== ﺕﻮﺼﻟﺎﺑ ﺎﻄﺧ - -Spectate -== ﺓﺪﻫﺎﺸﻤﻟﺍ ﻊﺿﻭ - -Spectate next -== ﻲﻟﺎﺘﻟﺍ ﺓﺪﻫﺎﺸﻣ - -Spectate previous -== ﻖﺑﺎﺴﻟﺍ ﺓﺪﻫﺎﺸﻣ - -Spectator mode -== ﺓﺪﻫﺎﺸﻤﻟﺍ ﻊﺿﻭ - -Spectators -== ﻥﻭﺪﻫﺎﺸﻤﻟﺍ - -Stop record -== ﺮﻳﻮﺼﺘﻟﺍ ﻑﺎﻘﻳﺍ - -Strict gametype filter -== ﻂﺒﻀﻟﺎﺑ ﺔﺒﻌﻠﻟﺍ ﻉﻮﻧ - -Sudden Death -== ﺊﺟﺎﻔﻤﻟﺍ ﺕﻮﻤﻟﺍ - -Switch weapon on pickup -== ﻁﺎﻘﺘﻟﻻﺍ ﺪﻨﻋ ﺡﻼﺴﻟﺍ ﻞﻳﺪﺒﺗ - -Team -== ﻖﻳﺮﻔﻟﺍ - -Team chat -== ﻖﻳﺮﻔﻟﺍ ﺕﺎﺷ - -The audio device couldn't be initialised. -== .ﺕﻮﺼﻟﺍ ﺯﺎﻬﺟ ﺔﺌﻴﻬﺗ ﺭﺬﻌﺗ - -The server is running a non-standard tuning on a pure game type. -== .ﺺﻟﺎﺧ ﺔﺒﻌﻟ ﻉﻮﻧ ﻰﻠﻋ ﻲﺳﺎﻴﻗ ﺮﻴﻏ ﻂﺒﺿ ﻞﻴﻐﺸﺘﺑ ﺮﻓﺮﻴﺳ ﻡﻮﻘﻳ - -Time limit -== ﺖﻗﻮﻟﺍ ﺩﻭﺪﺣ - -Time limit: %d min -== ﺖﻗﻮﻟﺍ ﺩﻭﺪﺣ: %d min - -Try again -== ﺍﺩﺪﺠﻣ ﻝﻭﺎﺣ - -Type -== ﺭﻮﻃ - -Unable to rename the demo -== ﻮﻳﺪﻴﻓﻟﺍ ﺔﻴﻤﺴﺗ ﺓﺩﺎﻋﺎﺑ ﻞﺸﻓ - -Use sounds -== ﺕﺍﻮﺻﻻﺍ ﻡﺍﺪﺨﺘﺳﺍ - -Use team colors for name plates -== ﻢﺳﻼﻟ ﻖﻳﺮﻔﻟﺍ ﻥﺍﻮﻟﺃ ﻡﺪﺨﺘﺳﺍ - -V-Sync -== V-Sync - -Version -== ﺭﺍﺪﺻﻻﺍ - -Vote command: -== ﺖﻳﻮﺼﺘﻟﺍ ﺭﺯ: - -Vote description: -== ﺖﻳﻮﺼﺘﻟﺍ ﻒﺻﻭ: - -Vote no -== ﻻ ﺖﻳﻮﺼﺗ - -Vote yes -== ﻢﻌﻧ ﺖﻳﻮﺼﺗ - -Voting -== ﺕﻮﺼﻳ - -Warmup -== ﺔﻴﻤﺤﺗ - -Weapon -== ﺡﻼﺳ - -Yes -== ﻢﻌﻧ - -You must restart the game for all settings to take effect. -== .ﻝﻮﻌﻔﻤﻟﺍ ﺔﻳﺭﺎﺳ ﺕﺍﺩﺍﺪﻋﻹﺍ ﻊﻴﻤﺟ ﺢﺒﺼﺗ ﻰﺘﺣ ﺔﺒﻌﻠﻟﺍ ﻞﻴﻐﺸﺗ ﺓﺩﺎﻋﺇ ﺐﺠﻳ - -New name: -== ﺪﻳﺪﺟ ﻢﺳﺍ: - -Sat. -== ﺔﻴﻓﺎﻔﺷ - -Miscellaneous -== ﻉﻮﻨﺘﻣ - -Internet -== ﺖﻧﺮﺘﻧﻻﺍ - -Max demos -== ﺕﺎﻫﻮﻳﺪﻴﻔﻠﻟ ﻰﺼﻗﻻﺍ ﺪﺤﻟﺍ - -News -== ﺭﺎﺒﺧﻻﺍ - -Join game -== ﺔﺒﻌﻠﻟﺍ ﻰﻟﺍ ﻉﻮﺟﺭ - -FSAA samples -== Anti-Aliasing - -Sound volume -== ﺕﻮﺼﻟﺍ ﻢﺠﺣ - -Max Screenshots -== ﺭﻮﺼﻠﻟ ﻰﺼﻗﻻﺍ ﺪﺤﻟﺍ - -Hue -== ﻥﻮﻟ - -Record demo -== ﻮﻳﺪﻴﻓ ﺮﻳﻮﺼﺗ - -Your skin -== ﻚﻨﻜﺳ - -Reset to defaults -== ﺀﻲﺷ ﻞﻛ ﺓﺩﺎﻋﺍ - -Lht. -== ﺢﻴﺘﻔﺗ - -UI Color -== ﻥﺍﻮﻟﻻﺍ ﺔﻤﺋﺎﻗ - -Alpha -== ﺔﻴﻓﺎﻔﺷ - -LAN -== LAN - -Name plates size -== ﻲﻣﺎﺳﻻﺍ ﻢﺠﺣ - -Ratio -== ﺔﺒﺴﻧ - -AntiPing -== AntiPing - -Show quads -== Quads ﺭﺎﻬﻇﺍ - -Map sound volume -== ﺏﺎﻤﻟﺍ ﺕﻮﺻ - -Countries -== ﻥﺍﺪﻠﺒﻟﺍ - -Types -== ﻉﺍﻮﻧﺃ - -Show kill messages -== ﻞﺘﻘﻟﺍ ﻞﺋﺎﺳﺭ ﺭﺎﻬﻇﺍ - -Show ghost -== ﺢﺒﺸﻟﺍ ﺭﺎﻬﻇﺍ - -No updates available -== ﺕﺎﺜﻳﺪﺤﺗ ﺪﺟﻮﻳﻻ - -Update now -== ﻥﻻﺍ ﺚﻳﺪﺤﺘﻟﺍ - -Enable server message sound -== ﺮﻓﺮﻴﺴﻟﺍ ﺔﺷﺩﺭﺩ ﺕﻮﺻ ﻞﻴﻌﻔﺗ - -Show votes window after voting -== ﺖﻳﻮﺼﺘﻟﺍ ﺪﻌﺑ ﺕﺎﺘﻳﻮﺼﺘﻟﺍ ﺔﻤﺋﺎﻗ ﺭﺎﻬﻇﺍ - -HUD -== ﺔﺒﻌﻠﻟﺍ ﺮﻬﻈﻣ - -Show names in chat in team colors -== ﻖﻳﺮﻔﻟﺍ ﻥﺍﻮﻟﺄﺑ ﺔﺷﺩﺭﺪﻟﺍ ﻲﻓ ﺀﺎﻤﺳﻷﺍ ﺭﺎﻬﻇﺇ - -Enable team chat sound -== ﻖﻳﺮﻔﻟﺍ ﺔﺷﺩﺭﺩ ﺕﻮﺻ ﻞﻴﻌﻔﺗ - -Show other players' hook collision lines -== ﻦﻳﺮﺧﻵﺍ ﻦﻴﺒﻋﻼﻟﺍ ﺐﺤﺳ ﻡﺍﺪﻄﺻﺍ ﻁﻮﻄﺧ ﺮﻬﻇﺃ - -Deaths -== ﺕﺍﻮﻣﻻﺍ - -Enable game sounds -== ﺔﺒﻌﻟﻻﺍ ﺕﻮﺻ ﻞﻴﻌﻔﺗ - -DDNet Client needs to be restarted to complete update! -== DDNet-Client !ﺚﻳﺪﺤﺘﻟﺍ ﻝﺎﻤﻛﻻ ﻞﻴﻐﺸﺘﻟﺍ ﺓﺩﺎﻋﻻ ﺝﺎﺘﺤﺗ - -Show others -== ﻦﻳﺮﺧﻻﺍ ﺭﺎﻬﻇﺍ - -Restart -== ﻞﻴﻐﺸﺘﻟﺍ ﺓﺩﺎﻋﺍ - -Browser -== ﺢﻔﺼﺘﻤﻟﺍ - -Enable gun sound -== ﺔﺤﻠﺳﻻﺍ ﺕﻮﺻ ﻞﻴﻌﻔﺗ - -Team message -== ﻖﻳﺮﻔﻟﺍ ﺔﻟﺎﺳﺭ - -Save the best demo of each race -== ﻕﺎﺒﺳ ﻞﻜﻟ ﻲﺒﻳﺮﺠﺗ ﺽﺮﻋ ﻞﻀﻓﺃ ﻆﻔﺣﺍ - -Are you sure that you want to disconnect? -== ﺝﻭﺮﺨﻟﺍ ﺪﻳﺮﺗ ﻚﻧﺎﺑ ﺪﻛﺂﺘﻣ ﺖﻧﺍ ﻞﻫ - -Ghost -== ﺢﺒﺸﻟﺍ - -Check now -== ﻥﻻﺍ ﺪﻛﺄﺗ - -DDNet Client updated! -== DDNet-Client تحدثت! - -AntiPing: predict other players -== AntiPing: ﻦﻳﺮﺧﻵﺍ ﻦﻴﺒﻋﻼﻟ ﻖﺒﺴﻣ ﺏﺎﺴﺣ - -Show other players' key presses -== ﻦﻳﺮﺧﻻﺍ ﻦﻴﺒﻋﻼﻟﺍ ﺎﻬﻄﻐﻀﺑ ﻡﺎﻗ ﻲﺘﻟﺍ ﺢﻴﺗﺎﻔﻤﻟﺍ ﺭﺎﻬﻇﺍ - -System message -== ﻡﺎﻈﻨﻟﺍ ﻞﺋﺎﺳﺭ - -Updating… -== …ﺚﻳﺪﺤﺘﻟﺍ ﺭﺎﺟ - -Overlay entities -== ﻥﺍﺭﺪﺠﻟﺍ-ﺐﻛﺍﺮﺗ - -Messages -== ﻞﺋﺎﺳﺮﻟﺍ - -%.2f MiB -== %.2f MiB - -Loading DDNet Client -== ﻞﻴﻤﺤﺘﻟﺍ ﺭﺎﺟ DDNet Client - -Default zoom -== ﻲﻌﻴﺒﻄﻟﺍ ﺮﻴﺒﻜﺘﻟﺍ - -Show score -== ﻁﺎﻘﻨﻟﺍ ﺭﺎﻬﻇﺍ - -%.2f KiB -== %.2f KiB - -Enable regular chat sound -== ﺔﻳﺩﺎﻌﻟﺍ ﺔﺷﺩﺭﺩ ﺕﻮﺻ ﻞﻴﻌﻔﺗ - -DDNet -== ﺖﻴﻧﺩﺩ - -Normal message -== ﺔﻴﻌﻴﺒﻄﻟﺍ ﻞﺋﺎﺳﺮﻟﺍ - -AntiPing: predict grenade paths -== AntiPing: ﺔﻳﻭﺪﻴﻟﺍ ﻞﺑﺎﻨﻘﻟﺍ ﺕﺍﺭﺎﺴﻣ ﻊﻗﻮﺗ - -Search -== ﺚﺤﺑ - -Connecting dummy -== ﺔﻴﻣﺪﻟﺍ ﻝﺎﺼﺗﺍ - -Show clan above name plates -== ﻢﻬﻴﻣﺎﺳﺍ ﻕﻮﻓ ﻥﻼﻜﻟﺍ ﺭﺎﻬﻇﺍ - -Save ghost -== ﺢﺒﺸﻟﺍ ﻆﻔﺣ - -Enable highlighted chat sound -== ﻪﻴﺒﻨﺘﻟﺍ ﺕﻮﺻ ﻞﻴﻌﻔﺗ - -AntiPing: predict weapons -== AntiPing: ﺔﺤﻠﺳﻷﺍ ﺮﻴﻀﺤﺗ - -Highlighted message -== ﻪﻴﺒﻨﺘﻟﺍ ﻞﺋﺎﺳﺭ - -Switch weapon when out of ammo -== ﺓﺮﻴﺧﺬﻟﺍ ﺫﺎﻔﻧ ﺪﻨﻋ ﺡﻼﺴﻟﺍ ﺮﻴﻴﻐﺗ - -Grabs -== ﺕﺎﻜﺴﻣ - -Automatically take game over screenshot -== ﺔﺷﺎﺸﻟﺍ ﺔﻄﻘﻟ ﻰﻠﻋ ﺍًﻴﺋﺎﻘﻠﺗ ﺔﺒﻌﻠﻟﺍ ﺬﺧﺃ - -Gameplay -== ﺐﻌﻠﻟﺍ - -Laser -== ﺭﺰﻴﻟ - -Follow -== ﻊﺒﺗﺃ - -Reset -== ﻦﻴﻴﻌﺗ ﺓﺩﺎﻋﺇ - -Automatically create statboard csv -== statboard ﻞﻤﻋ ﻲﺋﺎﻘﻠﺗ - -Show tiles layers from BG map -== ﺔﻴﻔﻠﺨﻟﺍ ﺏﺎﻤﻠﻟ ﺐﻧﺎﺠﺘﻟﺍ ﺕﺎﻘﺒﻃ ﺭﺎﻬﻇﺇ - -Remove chat -== ﺕﺎﺸﻟﺍ ﻑﺬﺣ - -Frags -== ﻞﺑﺎﻨﻗ - -Automatically take statboard screenshot -== ﺍﻴﺋﺎﻘﻠﺗ ﺞﺋﺎﺘﻨﻟﺍ ﺔﺣﻮﻠﻟ ﺔﺷﺎﺷ ﺔﻄﻘﻟ ﺬﺧﺍ - -Enable long pain sound (used when shooting in freeze) -== ( ﺰﻳﺮﻔﺘﻳ ﺎﻣﺪﻨﻋ ﻡﺪﺨﺘﺴﻳ ) ﻢﻟﻵﺍ ﺕﻮﺻ - -Vanilla skins only -== ﻂﻘﻓ ﺔﻴﺳﺎﺳﻻﺍ ﺕﺎﻨﻜﺴﻟﺍ - -Refresh Rate -== ﻢﻳﺮﻔﻟﺍ ﻝﺪﻌﻣ - -New random timeout code -== ﺪﻳﺪﺟ ﻲﺋﺍﻮﺸﻋ ﺔﻠﻬﻣ ﺩﻮﻛ - -Suicides -== ﺭﺎﺤﺘﻧﻻﺍ - -Net -== ﺔﻜﺒﺸﻟﺍ - -FPM -== فبم - -Spree -== ﺡﺮﻣ - -Max CSVs -== Max CSVs - -Best -== ﻞﻀﻓﺍ - -Screen -== ﺔﺷﺎﺷ - -Exclude -== ﺩﺎﻌﺒﺘﺳﺍ - -Demo -== ﺕﺎﻫﻮﻳﺪﻴﻔﻟﺍ - -Fat skins (DDFat) -== ﺔﻨﻴﻤﺳ ﺕﺎﻨﻜﺳ - -Show DDNet map finishes in server browser -== ﺭﺎﻬﻇﺍ DDNet ﺕﺍﺮﻓﺮﻴﺴﻟﺍ ﺢﻔﺼﺘﻣ ﻲﻓ ﺔﻴﻬﺘﻨﻤﻟﺍ ﺕﺎﺑﺎﻤﻟﺍ - -Unfinished map -== ﺔﻴﻬﺘﻨﻣ ﺮﻴﻐﻟﺍ ﺕﺎﺑﺎﻤﻟﺍ - -Welcome to DDNet -== ﻲﻓ ﻚﺑ ﺎﺒﺣﺮﻣ DDNet - -may cause delay -== ﺮﻴﺧﺄﺗ ﺐﺒﺴﻳ - -Indicate map finish -== ﺔﻗﺎﻄﺒﻟﺍ ﺭﺎﺼﺘﻧﺍ ﺭﺎﻬﻇﺇ - -File already exists, do you want to overwrite it? -== ﻪﻗﻮﻓ ﺔﺑﺎﺘﻜﻟﺍ ﺪﻳﺮﺗ ﻞﻫ ، ﻞﻌﻔﻟﺎﺑ ﺩﻮﺟﻮﻣ ﻒﻠﻤﻟﺍ - -Clan plates size -== ﻥﻼﻜﻟﺍ ﻞﻜﺷ ﻢﺠﺣ - -Friend message -== ﻖﻳﺪﺻ ﺔﻟﺎﺳﺭ - -Date -== ﺦﻳﺭﺎﺗ - -Skin prefix -== ﻦﻜﺴﻟﺍ ﺲﻜﻓﺮﺑ - -Show HUD -== ﻞﻜﺸﻟﺍ ﺭﺎﻬﻇﺍ - -9+ new mentions -== 9+ ﺓﺪﻳﺪﺟ ﺕﺍﺭﺎﻌﺷﺍ - -Lock team -== ﻖﻳﺮﻔﻟﺍ ﻞﻔﻗ - -Zoom out -== ﺮﻴﻐﺼﺗ - -Are you sure that you want to disconnect your dummy? -== ﻚﺘﻴﻣﺩ ﺝﺍﺮﺧﺍ ﺪﻳﺮﺗ ﻚﻧﺍ ﻦﻣ ﺪﻛﺎﺘﻣ ﺖﻧﺍ ﻞﻫ - -Activate -== ﻞﻴﻌﻔﺗ - -Time -== ﺖﻗﻮﻟﺍ - -Successfully saved the replay! -== !ﺡﺎﺠﻨﺑ ﺓﺩﺎﻋﻻﺍ ﻩﺬﻫ ﻆﻔﺣ ﻢﺗ - -Length -== ﻝﻮﻄﻟﺍ - -Show text entities -== Entities-Text ﺭﺎﻬﻇﺍ - -Hook collisions -== ﺐﺤﺴﻟﺍ ﺭﺰﻴﻟ ﺭﺎﻬﻇﺍ - -Fetch Info -== ﺕﺎﻣﻮﻠﻌﻤﻟﺍ ﺭﺎﻀﺣﺍ - -DDNet %s is out! -== DDNet %s ﺪﻳﺪﺟ ﺭﺍﺪﺻﺍ! - -Save -== ﻆﻔﺣ - -%d new mentions -== %d ﺓﺪﻳﺪﺟ ﺕﺍﺭﺎﻌﺷﺍ - -Show all -== ﻞﻜﻟﺍ ﺭﺎﻬﻇﺍ - -1 new mention -== 1 ﺪﻳﺪﺟ ﺭﺎﻌﺷﺍ - -Dummy copy -== ﺔﻴﻣﺪﻟﺍ ﺦﺴﻧ - -Downloading %s: -== ﻞﻴﻤﺤﺗ %s: - -Show entities -== ﻥﺍﺭﺪﺠﻟﺍ ﺭﺎﻬﻇﺍ - -Zoom in -== ﺮﻴﺒﻜﺗ - -Disconnect Dummy -== ﺔﻴﻣﺪﻟﺍ ﺝﺍﺮﺧﺍ - -Update failed! Check log… -== …ﺕﺎﻗﻮﻠﻟﺍ ﻦﻣ ﺪﻛﺎﺗ !ﻞﺸﻓ ﺚﻳﺪﺤﺘﻟﺍ - -Markers -== ﺕﺎﻣﻼﻌﻟﺍ - -Enable replays -== ﺓﺩﺎﻋﻻﺍ ﻦﻴﻜﻤﺗ - -Toggle dummy -== ﺔﻴﻣﺪﻠﻟ ﻞﻳﺪﺒﺗ - -Converse -== ﺔﺛﺩﺎﺤﻣ - -Filter connecting players -== ﻦﻴﻠﺼﺘﻤﻟﺍ ﻦﻴﺒﻋﻼﻟﺍ ﺔﻴﻔﺼﺗ - -Size -== ﻢﺠﺣ - -Deactivate -== ﻞﻴﻄﻌﺗ - -Replay feature is disabled! -== !ﺔﻔﻗﻮﻣ ﻞﻴﻐﺸﺘﻟﺍ ﺓﺩﺎﻋﺍ ﺓﺰﻴﻣ - -Replace video -== ﻮﻳﺪﻴﻔﻟﺍ ﻝﺍﺪﺒﺘﺳﺍ - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork ، ﻦﻴﺋﺪﺘﺒﻤﻟﺍ ﺕﺍﺮﻓﺮﻴﺳ ﻰﻠﻋ ﺃﺪﺒﺗ ﻥﺃ ﺐﺠﻳ ، ﺍًﺪﻳﺪﺟ ﺍًﻣﺩﺎﻗ ﻚﺘﻔﺼﺑ .ﺏﺎﻤﻟﺍ ﻰﻠﻋ ﺔﻳﺎﻬﻨﻟﺍ ﻂﺧ ﻰﻟﺇ ﺕﻼﻤﺤﻤﻟﺍ ﻦﻣ ﻚﺘﻋﻮﻤﺠﻣﻭ ﺖﻧﺃ ﻚﻟﻮﺻﻭ ﻮﻫ ﻑﺪﻬﻟﺍ ﻥﻮﻜﻳ ﺚﻴﺣ ﺖﻧﺮﺘﻧﻹﺍ ﺮﺒﻋ ﺔﻴﻧﻭﺎﻌﺗ ﺔﺒﻌﻟ ﻲﻫ - -Default length -== ﻲﺿﺍﺮﺘﻓﻻﺍ ﻝﻮﻄﻟﺍ - -Pause -== ﺔﺒﻗﺍﺮﻣ - -transmits your player name to info.ddnet.org -== ﻰﻟﺇ ﻚﺑ ﺹﺎﺨﻟﺍ ﺐﻋﻼﻟﺍ ﻢﺳﺍ ﻞﻘﻨﻳ info.ddnet.org - -Server best: -== :ﺮﻓﺮﻴﺳ ﻞﻀﻓﺍ - -Render demo -== ﻮﻳﺪﻴﻓﻟﺍ ﻞﻴﻤﺤﺗ - -Hammerfly dummy -== ﺔﻗﺮﻄﻤﻟﺎﺑ ﻥﺍﺮﻴﻃ-ﺔﻴﻣﺪﻟﺍ - -Connect Dummy -== ﺔﻴﻣﺪﻟﺍ ﻝﺎﺧﺩﺍ - -Toggle ghost -== ﺢﺒﺸﻟﺍ ﻊﺿﻭ - -Statboard -== ﺩﺭﻮﺑ ﺕﺎﺘﺳ - -Reconnect in %d sec -== %d ﻲﻓ ﻝﻮﺧﺪﻟﺍ ﺓﺩﺎﻋﺍ - -Personal best: -== :ﺔﻴﺼﺨﺷ ﻞﻀﻓﺃ - -Kill -== ﻞﺘﻗ - -Please enter your nickname below. -== ﻚﺑ ﺹﺎﺨﻟﺍ ﻢﺳﺍ ﻝﺎﺧﺩﺇ ﺀﺎﺟﺮﻟﺍ - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== .ﺮﻓﺮﻴﺴﻟﺍ ﻰﻟﺇ ﻡﺎﻤﻀﻧﻻﺍ ﻞﺒﻗ ﻚﺘﺒﻏﺭ ﺐﺴﺣ ﺎﻬﻄﺒﻀﻟ ﺕﺍﺩﺍﺪﻋﻹﺍ ﻦﻣ ﻖﻘﺤﺘﻟﺎﺑ ﻰﺻﻮﻳ - -Use high DPI -== ﻲﻟﺎﻋ IPD ﻡﺍﺪﺨﺘﺳﺍ - -Learn -== ﻢﻠﻌﺗ - -Video name: -== :ﻮﻳﺪﻴﻓﻟﺍ ﻢﺳﺍ - -Toggle dyncam -== ﺔﻴﻜﻴﻣﺎﻨﻳﺪﻟﺍ ﺍﺮﻴﻣﺎﻛ - -Show others (own team only) -== ﻂﻘﻓ ﻢﻴﺘﻠﻟ ﻦﻳﺮﺧﻻﺍ ﺭﺎﻬﻇﺍ - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== .ﻯﺮﺧﻷﺍ ﺭﺍﺭﺯﻻﺍ ﻂﺑﺍﻭﺭ ﺕﺍﺩﺍﺪﻋﺇ ﻊﺟﺍﺭ .ﻦﻳﺮﺧﻻﺍ ﻦﻴﺒﻋﻻﺍ ﺓﺪﻫﺎﺸﻣ ﻭ ﻒﻗﻮﻠﻟ q ,(ﺓﺩﺎﻋﺍ) ﻞﺘﻘﻠﻟ k ﺭﺯ ﻡﺪﺨﺘﺳﺍ - -Client message -== ﺔﻟﺎﺳﺭ - -Skip the main menu -== ﺔﻤﺋﺎﻘﻟﺍ ﻲﻄﺨﺗ - -Settings -== ﺕﺍﺩﺍﺪﻋﻻﺍ - -Run server -== ﺮﻓﺮﻴﺳ ﻞﻴﻐﺸﺗ - -Stop server -== ﺮﻓﺮﻴﺴﻟﺍ ﻑﺎﻘﻳﺍ - -Editor -== ﻞﻳﺪﻌﺗ - -Download skins -== ﺕﺎﻨﻜﺴﻟﺍ ﻞﻴﻤﺤﺗ - -Warning -== ﺮﻳﺬﺤﺗ - -Speed -== ﺔﻋﺮﺳ - -Website -== ﻊﻗﻮﻣ - -Server executable not found, can't run server -== ﺮﻓﺮﻴﺴﻟﺍ ﻞﻴﻐﺸﺗ ﻦﻜﻤﻳ ﻻﻭ ،ﺬﻴﻔﻨﺘﻠﻟ ﻞﺑﺎﻗ ﺮﻓﺮﻴﺳ ﻰﻠﻋ ﺭﻮﺜﻌﻟﺍ ﻢﺘﻳ ﻢﻟ - -[Start menu] -Play -== ﺐﻌﻟ - -%d of %d servers -== %d ﻦﻣ ﺮﻓﺮﻴﺳ %d - -%d of %d server -== %d ﻦﻣ ﺮﻓﺮﻴﺳ %d - -%d players -== %d ﻦﻴﺒﻋﻻ - -%d player -== %d ﺐﻋﻻ - -Theme -== ﺕﺎﻤﻴﺜﻟﺍ - -Demos directory -== ﺮﻳﻮﺼﺘﻟﺍ ﻒﻠﻣ ﺢﺘﻓ - -Themes directory -== ﺕﺎﻤﻴﺜﻟﺍ ﻒﻠﻣ ﺢﺘﻓ - -Skin Database -== ﺕﺎﻨﻜﺴﻟﺍ ﺔﺒﺘﻜﻣ - -Skins directory -== ﺕﺎﻨﻜﺴﻟﺍ ﻒﻠﻣ ﺢﺘﻓ - -Background music volume -== ﺔﻴﻔﻠﺨﻟﺍ ﺕﻮﺻ - -Assets -== ﻝﺎﻜﺷﻻﺍ - -Entities -== ﻥﺍﺭﺪﺠﻟﺍ - -Emoticons -== ﺕﺎﺗﻮﻤﻳﻻﺍ - -Particles -== ﺰﻠﻜﺗﺭﺎﺒﻟﺍ - -Assets directory -== ﻝﺎﻜﺷﻻﺍ ﻒﻠﻣ ﺢﺘﻓ - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ - -Use current map as background -== ﺔﻴﻔﻠﺨﻛ ﻲﻟﺎﺤﻟﺍ ﺏﺎﻤﻟﺍ ﻡﺍﺪﺨﺘﺳﺍ - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== ﺔﻓﺎﻘﻳﻻ Ctrl+Shift+D ﻂﻐﺿﺍ .ﻝﺎﻐﺷ ﻖﻴﻗﺪﺘﻟﺍ ﻊﺿﻭ - -Existing Player -== ﺩﻮﺟﻮﻣ ﺐﻋﻼﻟﺍ - -Checking for existing player with your name -== ﻚﻤﺳﺎﺑ ﺐﻋﻻ ﺩﻮﺟﻭ ﻦﻣ ﻖﻘﺤﺘﻟﺍ - -Game sound volume -== ﺔﺒﻌﻠﻟﺍ ﺕﻮﺻ - -Chat sound volume -== ﺔﺷﺩﺭﺪﻟﺍ ﺕﻮﺻ - -Use old chat style -== ﻢﻳﺪﻘﻟﺍ ﺔﺛﺩﺎﺤﻤﻟﺍ ﻞﻜﺷ ﻡﺍﺪﺨﺘﺳﺍ - -Manual -== ﻱﻭﺪﻳ - -Race -== ﻕﺎﺒﺳ - -Auto -== ﻲﺋﺎﻘﻠﺗ - -Replay -== ﻞﻴﻐﺸﺘﻟﺍ ﺓﺩﺎﻋﺍ - -Smooth Dynamic Camera -== ﺔﻤﻋﺎﻧ ﺍﺮﻴﻣﺎﻛ ﻚﻴﻣﺎﻨﻳﺩ - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not save downloaded map. Try manually deleting this file: %s -== - -Could not connect dummy -== - -Error playing demo -== - -Failed saving the replay! -== - -Saving settings to '%s' failed -== - -Error saving settings -== - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -The format of texture %s is not RGBA which will cause visual bugs. -== - -Preparing demo playback -== - -Connected -== - -Loading map file from storage -== - -Loading demo file from storage -== - -Some fonts could not be loaded. Check the local console for details. -== - -Initializing components -== - -Why are you slowmo replaying to read this? -== - -Initializing assets -== - -Initializing map logic -== - -Sending initial client info -== - -Quitting. Please wait… -== - -Restarting. Please wait… -== - -Loading skin files -== - -Loading background map -== - -Searching -== - -Enter Username -== - -Enter Password -== - -NOT CONNECTED -== - -Match %d of %d -== - -No results -== - -Lines %d - %d (%s) -== - -Locked -== - -Following -== - -Loading commands… -== - -Position: -== - -Speed: -== - -Angle: -== - -Multi-View -== - -[Spectating] -Following %s -== - -[Spectating Camera Mode Icon] -AUTO -== - -Team %d -== - -Some map images could not be loaded. Check the local console for details. -== - -Uploading map data to GPU -== - -Some map sounds could not be loaded. Check the local console for details. -== - -Loading menu themes -== - -Press a key… -== - -Main menu -== - -Rename folder -== - -Render complete -== - -Are you sure that you want to restart? -== - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -There's an unsaved map in the editor, you might want to save it. -== - -Continue anyway? -== - -A demo with this name already exists -== - -A folder with this name already exists -== - -Unable to rename the folder -== - -File '%s' already exists, do you want to overwrite it? -== - -(paused) -== - -Videos directory -== - -Video was saved to '%s' -== - -Join Tutorial Server -== - -Skip Tutorial -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -Trying to determine UDP connectivity… -== - -UDP seems to be filtered. -== - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== - -No answer from server yet. -== - -%d/%d KiB (%.1f KiB/s) -== - -Getting game info -== - -Requesting to join the game -== - -Loading menu images -== - -AFR -== - -ASI -== - -AUS -== - -EUR -== - -NA -== - -SA -== - -CHN -== - -Getting server list from master server -== - -No local servers found (ports %d-%d) -== - -Example of usage -== - -Are you sure that you want to disconnect and switch to a different server? -== - -No login required -== - -Communities -== - -Copy info -== - -Leak IP -== - -No server selected -== - -Online friends (%d) -== - -Online clanmates (%d) -== - -[friends (server browser)] -Offline (%d) -== - -Click to select server. Double click to join your friend. -== - -Click to remove this player from your friends list. -== - -Click to remove this clan from your friends list. -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Are you sure that you want to remove the player '%s' from your friends list? -== - -Are you sure that you want to remove the clan '%s' from your friends list? -== - -Add Clan -== - -Server filter -== - -Friends -== - -Play the current demo -== - -Pause the current demo -== - -Stop the current demo -== - -Go back the specified duration -== - -[Demo player duration] -%d min. -== - -[Demo player duration] -%d sec. -== - -Change the skip duration -== - -Go forward the specified duration -== - -Go back one tick -== - -Go forward one tick -== - -Go back one marker -== - -Go forward one marker -== - -Slow down the demo -== - -Speed up the demo -== - -Mark the beginning of a cut (right click to reset) -== - -Mark the end of a cut (right click to reset) -== - -Export cut as a separate demo -== - -Close the demo player -== - -Toggle keyboard shortcuts -== - -Toggle auto camera -== - -Export demo cut -== - -Cut interval -== - -Cut length -== - -Render cut to video -== - -Please use a different filename -== - -Loading demo files -== - -All combined -== - -No demo selected -== - -Folder Link -== - -Created -== - -Netversion -== - -[Demo details] -map not included -== - -Open the directory that contains the demo files -== - -Are you sure that you want to delete the folder '%s'? -== - -Are you sure that you want to delete the demo '%s'? -== - -Delete folder -== - -Unable to delete the demo '%s' -== - -Unable to delete the folder '%s'. Make sure it's empty first. -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Loading… -== - -Loading ghost files -== - -Ghosts directory -== - -Activate all -== - -Deactivate all -== - -Menu opened. Press Esc key again to close menu. -== - -[Hertz] -Hz -== - -Save power by lowering refresh rate (higher input latency) -== - -Settings file -== - -Open the settings file -== - -Config directory -== - -Open the directory that contains the configuration and user files -== - -Open the directory to add custom themes -== - -Dummy -== - -Player info change cooldown -== - -Download community skins -== - -Create a random skin -== - -Choose default eyes when joining a server -== - -Open the directory to add custom skins -== - -Chat command -== - -Enable controller -== - -Controller -== - -Ingame controller mode -== - -[Ingame controller mode] -Relative -== - -[Ingame controller mode] -Absolute -== - -Ingame controller sens. -== - -UI controller sens. -== - -Controller jitter tolerance -== - -No controller found. Plug in a controller. -== - -Axis -== - -Status -== - -Aim bind -== - -Mouse -== - -Ingame mouse sens. -== - -UI mouse sens. -== - -Reset controls -== - -Are you sure that you want to reset the controls to their defaults? -== - -Cancel -== - -Windowed -== - -Windowed borderless -== - -Windowed fullscreen -== - -Desktop fullscreen -== - -Allows maps to render with more detail -== - -Renderer -== - -default -== - -custom -== - -Graphics card -== - -auto -== - -Tee -== - -Appearance -== - -Name Plate -== - -Hook Collisions -== - -Info Messages -== - -Show health, shields and ammo -== - -Show local time always -== - -Authed name color in scoreboard -== - -Same clan color in scoreboard -== - -DDRace HUD -== - -Show client IDs (scoreboard, chat, spectator) -== - -Show DDRace HUD -== - -Show jumps indicator -== - -Show dummy actions -== - -Show player position -== - -Show player speed -== - -Show player target angle -== - -Show freeze bars -== - -Opacity of freeze bars inside freeze -== - -Always show chat -== - -Show only chat messages from team members -== - -Chat font size -== - -Chat width -== - -Preview -== - -Show friend mark (♥) in name plates -== - -Show client IDs in name plates -== - -Hook Strength -== - -Show hook strength icon indicator -== - -Show hook strength number indicator -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Show local player's key presses -== - -Size of key press icons -== - -Hook collision line -== - -Show own player's hook collision line -== - -Always show own player's hook collision line -== - -Always show other players' hook collision lines -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Hook collision line opacity -== - -Colors of the hook collision line, in case of a possible collision with: -== - -Your movements are not taken into account when calculating the line colors -== - -Nothing hookable -== - -Something hookable -== - -A Tee -== - -Preview 'Hook collisions' being pressed -== - -Show finish messages -== - -Normal Color -== - -Highlight Color -== - -Weapons -== - -Rifle Laser Outline Color -== - -Rifle Laser Inner Color -== - -Shotgun Laser Outline Color -== - -Shotgun Laser Inner Color -== - -Door Laser Outline Color -== - -Door Laser Inner Color -== - -Freeze Laser Outline Color -== - -Freeze Laser Inner Color -== - -Set all to Rifle -== - -Enable ghost -== - -When you cross the start line, show a ghost tee replicating the movements of your best time -== - -Opacity -== - -Only save improvements -== - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== - -Quads are used for background decoration -== - -Tries to predict other entities to give a feel of low latency -== - -Background -== - -Regular background color -== - -Entities background color -== - -Run on join -== - -Chat command (e.g. showall 1) -== - -Unregister protocol and file extensions -== - -DDNet %s is available: -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Extras -== - -Loading assets -== - -Open the directory to add custom assets -== - -Discord -== - -https://ddnet.org/discord -== - -Tutorial -== - -Can't find a Tutorial server -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Loading race demo files -== - -Round %d/%d -== - -[Spectators] -%d others… -== - -Super -== - -[Team and size] -%d\n(%d/%d) -== - -Team %d (%d/%d) -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Loading sound files -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -Moved ingame -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/azerbaijani.txt b/data/languages/azerbaijani.txt deleted file mode 100644 index 853808078e..0000000000 --- a/data/languages/azerbaijani.txt +++ /dev/null @@ -1,2075 +0,0 @@ -##### authors ##### -#originally created by: -# Gokturk, seishiroon and Aykhan [EN07Z] -#modified by: -# Gokturk 2024-06-09 12:00:50 -# Gokturk 2024-07-17 02:24:00 -# Gokturk 2024-08-29 23:39:00 -# Gokturk 2024-09-29 19:24:00 -# Gokturk 2024-11-04 11:35:00 -# Gokturk & seishiroon 2024-12-03 16:35:00 -##### /authors ##### - -##### translated strings ##### -%ds left -== %ds qaldı - -%i minute left -== %i dəqiqə qaldı - -%i minutes left -== %i dəqiqə qaldı - -%i second left -== %i saniyə qaldı - -%i seconds left -== %i saniyə qaldı - -%s wins! -== %s qalibdir! - -Abort -== Ləğv edin - -Add -== Əlavə etmək - -Add Friend -== Dost əlavə et - -Address -== Ünvan - -All -== Hamısı - -Are you sure that you want to quit? -== Çıxmaq istədiyinizə əminsiniz? - -Automatically record demos -== Demoları avtomatik olaraq qeyd edin - -Automatically take game over screenshot -== Avtomatik olaraq oyun sonu ekran görüntüsü al - -Blue team -== Mavi qrup - -Blue team wins! -== Mavi qrup qazandı! - -Body -== Bədən - -Call vote -== Səsvermə - -Change settings -== Parametrləri dəyişdirin - -Chat -== Söhbət - -Clan -== Klan - -Client -== Klient - -Connecting to -== Bağlanmaq - -Connection Problems… -== Bağlantı Xətası… - -Console -== Konsol - -Controls -== Kontroller - -Count players only -== Sadəcə oyunçuları say - -Current -== İndi - -Custom colors -== Xüsusi rənglər - -Delete -== Sil - -Delete demo -== Demo sil - -Demofile: %s -== Demo faylı: %s - -Demos -== Demolar - -Disconnect -== Bağlantını kəsin - -Disconnected -== Bağlantı kəsildi - -Downloading map -== Xəritə yüklənir - -Draw! -== Bərabərə! - -Dynamic Camera -== Dinamik Kamera - -Emoticon -== Emosiya - -Error -== Xəta - -Error loading demo -== Demo yüklənərkən xəta baş verdi - -Favorite -== Favori - -Favorites -== Favorilər - -Feet -== Ayaq - -Fire -== Atəş - -Folder -== Qovluq - -Force vote -== Məcburi səsvermə - -Free-View -== Sərbəst baxış - -Fullscreen -== Tam ekran - -Game -== Oyun - -Game info -== Oyun haqqında - -Game over -== Oyun bitdi - -Game type -== Oyun növü - -Game types: -== Oyun növləri: - -General -== Ümumi - -Graphics -== Qrafikalar - -Grenade -== Qumbara - -Hammer -== Çəkic - -Has people playing -== Var olan oyunçu - -High Detail -== Yüksək Detal - -Hook -== Qarmaq - -Invalid Demo -== Etibarsız demo - -Join blue -== Maviye daxil ol - -Join red -== Qırmızıya daxil ol - -Jump -== Tullanma - -Kick player -== Oyunçu At - -Language -== Dil - -MOTD -== MOTD - -Map -== Xəritə - -Move left -== Sola get - -Move player to spectators -== Tamaşaçılara qoşulun - -Move right -== Sağa get - -Movement -== Hərəkat - -Mute when not active -== Aktif değilken sessizleştir - -Name -== Server adı - -Next weapon -== Növbəti silah - -Nickname -== Ləqəb - -No -== Yox - -No password -== Parol yox - -No servers found -== Server tapıla bilmədi - -No servers match your filter criteria -== Filtre kriterlerinize uygun sunucu bulunamadı - -Ok -== Yaxşı - -Parent Folder -== Ana Kataloq - -Password -== Parol - -Password incorrect -== Səhv Parol - -Ping -== Ping - -Pistol -== Tapança - -Play background music -== Fon musiqisini çal - -Player -== Oyunçu - -Players -== Oyunçular - -Please balance teams! -== Qrupları balanslaşdırın! - -Prev. weapon -== Əvvəlki silah - -Quit -== Çıxmaq - -Reason: -== Səbəb: - -Red team -== Qırmızı qruq - -Red team wins! -== Qırmızı qruq qazandı! - -Remote console -== Uzaq Konsol - -Remove -== Çıxarmaq - -Remove friend -== Dostu çıxarın - -Rename demo -== Demonun adını dəyişdirin - -Reset filter -== Filtrləri sıfırlayın - -Score -== Xal - -Score limit -== Xal limiti - -Scoreboard -== Xal lövhəsi - -Screenshot -== Ekran görüntüsü - -Server address: -== Server ünvanı: - -Server info -== Server haqqında - -Server not full -== Sunucu dolu deyil - -Shotgun -== Tüfəng - -Show chat -== Söhbəti göstər - -Show friends only -== Yalnız dostlar göstərin - -Show ingame HUD -== Oyundaxili HUD göstərin - -Show name plates -== Oyunçu adlarını göstərin - -Sound -== Səs - -Sound error -== Səs xətası - -Spectate -== Tamaşa - -Spectate next -== Sonra ki tamaşa - -Spectate previous -== Avvəlki tamaşa - -Spectator mode -== Tamaşaçı rejimi - -Spectators -== İzleyiciler - -Stop record -== Qeydi dayandırın - -Strict gametype filter -== Ciddi oyun növü filtri - -Sudden Death -== Ani ölüm - -Switch weapon on pickup -== Silah alındıqda yeni silahdan istifadə edin - -Team -== Qrup - -Team chat -== Qrup söhbəti - -The audio device couldn't be initialised. -== Ses aparatı işə sala bilmədi. - -The server is running a non-standard tuning on a pure game type. -== Bu server təmiz oyun janrında qeyri-standart parametrdən istifadə edir. - -Time limit -== Vaxt məhdudiyyəti - -Time limit: %d min -== Vaxt məhdudiyyəti: %d dəqiqə - -Try again -== Yenidən cəhd elə - -Type -== Növü - -Unable to rename the demo -== Demonun adını dəyişdirmək olmaz - -Use sounds -== Səslərdən istifadə edin - -Use team colors for name plates -== Ad etiketlərində komanda rənglərindən istifadə edin - -V-Sync -== V-Sync - -Version -== Versiya - -Vote command: -== Səs Əmr: - -Vote description: -== Şərh: - -Vote no -== Yox - -Vote yes -== Hə - -Voting -== Səsvermə - -Warmup -== İstiləşmə - -Weapon -== Silah - -Yes -== Bəli - -You must restart the game for all settings to take effect. -== Bütün parametrlərin aktiv olması üçün oyunu yenidən başlatmalısınız. - -New name: -== Yeni ad: - -Sat. -== Doygunluk - -Miscellaneous -== Müxtəlif - -Internet -== Internet - -Max demos -== Maksimum Demo sayı - -News -== Xəbərlər - -Join game -== Oyuna daxil ol - -FSAA samples -== FSAA nümunələri - -Sound volume -== Ses səviyyəsi - -Max Screenshots -== Maksimum Ekran Görüntüsü Sayısı - -Laser -== Lazer - -Hue -== Rəng - -Record demo -== Demo qeyd - -Your skin -== Şəxsi görünüş - -Reset to defaults -== Defoltlara sıfırlayın - -Lht. -== Parlaqlıq - -UI Color -== Menu rəngi - -Alpha -== Şəffaflıq - -LAN -== LAN - -Name plates size -== Ölçü - -Successfully saved the replay! -== Uğurla yadda saxlandı! - -Replay feature is disabled! -== Təkrar oxutma funksiyası deaktiv edildi! - -Game paused -== Oyun dayandı - -Server best: -== Ən yaxşı server: - -Personal best: -== Ən yaxşı şəxsi: - -Learn -== Öyrən - -Browser -== Serverlər - -Ghost -== Ruh - -Loading DDNet Client -== DDNet Klient Yüklənir - -Reconnect in %d sec -== %d saniyə ərzində yenidən qoşulacaq - -Render demo -== Render demo - -Replace video -== Video üzərinə yaz - -File already exists, do you want to overwrite it? -== Fayl hal-hazırda mövcuddur, üzərinə qeyd edilsin? - -Are you sure that you want to disconnect? -== Çıxmağa razısan? - -Disconnect Dummy -== Dummy Ayrıl - -Are you sure that you want to disconnect your dummy? -== Dummy Bağlantını kəsmək istədiyinizə əminsiniz? - -Welcome to DDNet -== DDNet’ə xoş gəldiniz! - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork korperativ onlayn oyundur, bu xəritədə məqsəd siz və sizin qrupunuzun ən qısa zamanda finiş nöqtəsinə çatmağıdır. Yeni gələn oyunçular üçün asan xəritələrdə yəni Novice(Təcrübəsiz) serverlərdə oynamağını tövsiyyə edirik. Hər hansı bir server seçmədən əvvəl, sizə yaxın bir server seçmək üçün ping-i nəzərdən keçirin. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== İntihar etmək (yenidən başlamaq) üçün k düyməsi, oyunu dayandırıb digər oyunçuları izləmək üçün q düyməsini istifadə edə bilərsiniz. Digər düymələrə parametrlərdən baxa bilərsiniz. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Serverlərə qoşulmadan əvvəl parametrləri nəzərdən keçirib özünüzə uyğun konfiqurasiya etməyinizi tövsiyyə edirik. - -Please enter your nickname below. -== Xahiş edirik istifadəçi adınızı daxil edin - -Video name: -== Video adı: - -Show DDNet map finishes in server browser -== Tamamlanan DDNet xəritələrini server listində göstər - -transmits your player name to info.ddnet.org -== istifadəçi adını info.ddnet.org ilə paylaş - -Search -== Ara - -Exclude -== Qəric - -Player country: -== Oyunçu ölkəsi - -Filter connecting players -== Qoşulmuş oyunçuların sayılması - -Indicate map finish -== Tamamlanmış xəritələri göstərin - -Unfinished map -== Natamam xəritə - -Countries -== Ölkəlar - -Types -== Növləri - -DDNet %s is out! -== DDNet %s nəşr olundu! - -Downloading %s: -== Endirilir %s: - -Update failed! Check log… -== Yeniləmə zamanı xəta baş verdi! - -DDNet Client updated! -== DDNet Klient yeniləndi! - -Update now -== yeniləmə - -Restart -== Yenidən başlatmaq - -Remove chat -== Söhbəti silin - -%.2f MiB -== %.2f MiB - -%.2f KiB -== %.2f KiB - -Demo -== Demo - -Markers -== İşaretler - -Length -== Uzunluq - -Date -== Tarix - -Fetch Info -== Məlumat haqqında - -Connecting dummy -== Dummy bağlanmaq - -Connect Dummy -== Dummy daxil ol - -Deactivate -== Qeyri-aktiv etmək - -Activate -== Aktivləşdirmək - -Save -== Saxla - -Switch weapon when out of ammo -== Mərmi bitəndə silahı dəyiş - -Show only chat messages from friends -== Sadəcə dostlarından gələn mesajları göstər - -Show clan above name plates -== İstifadəçi adının üzərində klan adını göstər - -Clan plates size -== Ölçü - -Refresh Rate -== Yenileme Hızı - -Automatically take statboard screenshot -== Avtomatik olaraq xal lövhəsinin ekran görüntüsünü al - -Automatically create statboard csv -== Avtomatik olaraq xal lövhəsini csv olaraq yarat - -Max CSVs -== Maksimum CSVs - -Vanilla skins only -== Ancaq vanilla skinləri - -Fat skins (DDFat) -== Şişman skinlər (DDFat) - -Skin prefix -== Skin üzü - -Hook collisions -== Qarmaq izi - -Pause -== Dayandır - -Kill -== Ölmək - -Zoom in -== Yaxınlaşdır - -Zoom out -== Uzaqlaşdır - -Default zoom -== Defolt yaxınlaşdırma - -Show others -== Digərlərini göstər - -Show all -== Hər kəsi göstər - -Toggle dyncam -== Dinamik kamera - -Toggle dummy -== Dummyden istifadə edin - -Toggle ghost -== Ruhu göstər - -Dummy copy -== Dummy kopya - -Hammerfly dummy -== Hammerfly dummy - -Converse -== Qonuşma - -Statboard -== Skor Tablosu - -Lock team -== Qrubu kilidlən - -Show entities -== Binaları göstər - -Show HUD -== İnterfeysi göstər - -may cause delay -== gecikmələrə səbəb ola bilər - -Screen -== Ekran - -Use high DPI -== Yüksək DPI istifadə et - -Enable game sounds -== Oyun səsini aktivləşdirin - -Enable gun sound -== Silah səsini aktivləşdirin - -Enable long pain sound (used when shooting in freeze) -== Uzun qışqırıq səsini aktivləşdirin (freeze zamanı atəş edərkən istifadə olunur) - -Enable server message sound -== Server mesajının səsini aktivləşdirin - -Enable regular chat sound -== Ümumi mesaj səsini aktivləşdirin - -Enable team chat sound -== Qrup mesajının səsini aktivləşdirin - -Enable highlighted chat sound -== Vurğulanmış mesaj səsini aktivləşdirin - -Map sound volume -== Xəritə səs səviyyəsi - -HUD -== interfeys - -DDNet -== DDNet - -DDNet Client needs to be restarted to complete update! -== Yeniləmənin tamamlanması üçün oyunu yenidən başlatmaq lazımdır! - -Show score -== Xal göstər - -Show names in chat in team colors -== Çatda adları komanda rənglərində göstərin - -Show kill messages -== Ölüm mesajlarını göstərin - -Show votes window after voting -== Səsvermədən sonra səslər pəncərəsini göstərin - -Messages -== Mesajlar - -System message -== Sistem mesajı - -Reset -== Sıfırlayın - -Highlighted message -== Vurğulanan mesaj - -Team message -== Qrup mesajı - -Friend message -== Dost mesajı - -Normal message -== Normal mesaj - -Client message -== Klient mesajı - -Save the best demo of each race -== Hər yarış üçün ən yaxşı demonu yadda saxlayın - -Default length -== Standart uzunluq - -Enable replays -== Təkrarları aktivləşdirin - -Show ghost -== Ruhu göstər - -Save ghost -== Ruhu xilas et - -Gameplay -== Oyunda - -Overlay entities -== Üst təbəqə strukturları - -Size -== Ölçü - -Show text entities -== Post strukturlarını göstərin - -Show others (own team only) -== Başqalarını göstər (yalnız öz komanda) - -Show quads -== Dördbucaqlı strukturları göstərin - -AntiPing -== AntiPing - -AntiPing: predict other players -== AntiPing: predict other players - -AntiPing: predict weapons -== AntiPing: predict weapons - -AntiPing: predict grenade paths -== AntiPing: predict grenade paths - -Show other players' hook collision lines -== Show other players' hook collision lines - -Show other players' key presses -== Show other players' key presses - -Show tiles layers from BG map -== Show tiles layers from BG map - -DDNet %s is available: -== DDNet %s Nəşr olundu: - -Updating… -== Yenilənir… - -No updates available -== Güncəlləmə mövcud deyil - -Check now -== Yoxlayın - -New random timeout code -== New random timeout code - -Time -== Müddət - -Follow -== İzləyin - -Frags -== Frags - -Deaths -== Ölümler - -Suicides -== İntiharlar - -Ratio -== Oran - -Net -== Net - -FPM -== FPM - -Spree -== Spree - -Best -== Ən yaxşı - -Grabs -== Yakalama - -1 new mention -== 1 yeni bildiriş - -%d new mentions -== %d yeni bildiriş - -9+ new mentions -== 9+ yeni bildiriş - -Manual -== Manual - -Race -== Yarış - -Auto -== Avtomatik - -Replay -== Yeniden oynatma - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/wiki/Main_Page/ - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== An error during command recording occurred. Try to update your GPU drivers. - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== Render komutu başarısız oldu. GPU sürücülerini güncellemeyi deneyin. - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== Submitting the render commands failed. Try to update your GPU drivers. - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== Failed to swap framebuffers. Try to update your GPU drivers. - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== Could not initialize the given graphics backend, reverting to the default backend now. - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. - -Could not save downloaded map. Try manually deleting this file: %s -== Could not save downloaded map. Try manually deleting this file: %s - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. - -The format of texture %s is not RGBA which will cause visual bugs. -== The format of texture %s is not RGBA which will cause visual bugs. - -Preparing demo playback -== Demo oynamağa hazırlaşır - -Connected -== Əlaqədar - -Loading map file from storage -== Xəritə faylı yüklənir - -Why are you slowmo replaying to read this? -== Bunu oxumaq üçün niyə yavaş çəkilişdə baxırsan? - -Initializing components -== Komponentlər işə salınır - -Initializing assets -== Resurslar yüklənir - -Initializing map logic -== Xəritə məzmunu yüklənir - -Sending initial client info -== İlkin məlumatlar kliente göndərilir - -Warning -== Xəbərdarlıq - -Quitting. Please wait… -== Çıxılır. Zəhmət olmasa, gözləyin… - -Restarting. Please wait… -== Yenidən işə salınır. Zəhmət olmasa, gözləyin… - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Sazlama rejimi aktivdir. Onu söndürmək üçün Ctrl+Shift+D düymələrini sıxın. - -Position: -== Vəzifə: - -Speed: -== Sürət: - -Angle: -== Açı: - -Multi-View -== Coxlu izləmə - -Team %d -== Qrup %d - -Uploading map data to GPU -== Uploading map data to GPU - -Trying to determine UDP connectivity… -== Trying to determine UDP connectivity… - -UDP seems to be filtered. -== UDP seems to be filtered. - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. - -No answer from server yet. -== Hələlik serverdən heç bir cavab gəlməyib. - -Getting game info -== Oyun məlumatlarının alınır - -Requesting to join the game -== Oyuna girməyə çalışır - -Rename folder -== Qovluğun adını dəyişdirin - -Existing Player -== Mövcud oyunçu - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Sizin '%s' ləqəbiniz başqası tərəfindən istifadə olunur (%d xal). Hələ də istifadə etmək istəyirsən? - -Checking for existing player with your name -== Eyni adlı mövcud oyunçular yoxlanılır - -A demo with this name already exists -== Eyni adlı demo hal-hazırda mövcuddur - -A folder with this name already exists -== Eyni adlı qovluq hal-hazırda mövcuddur - -Unable to rename the folder -== Qovluğun adı dəyişdirilə bilmədi - -File '%s' already exists, do you want to overwrite it? -== '%s' faylı hal-hazırda mövcuddur, əvəz edilsin?? - -(paused) -== (fasilədə) - -Speed -== Sürət - -Join Tutorial Server -== Öyrədici derverə daxil olun - -Skip Tutorial -== Dərsi keçin - -Theme -== Tema - -Loading menu images -== Menyu şəkilləri yüklənir - -AFR -== AFR - -ASI -== ASI - -AUS -== AUS - -EUR -== EUR - -NA -== NA - -SA -== SA - -CHN -== CHN - -Getting server list from master server -== Master serverdən server siyahısı əldə edilir - -%d of %d servers -== %2$d serverdən %1$d ədədi - -%d of %d server -== %2$d serverdən %1$d ədədi - -%d players -== %d oyunçu - -%d player -== %d oyunçu - -Are you sure that you want to disconnect and switch to a different server? -== Bağlantını kəsib başqa serverə daxil olmaq istədiyinizə əminsiniz? - -Copy info -== Məlumatı kopyalayın - -Leak IP -== IP-i sızdır - -No server selected -== Heç bir server seçilmədi - -Online clanmates (%d) -== Onlayn klandaşlar (%d) - -[friends (server browser)] -Offline (%d) -== Oflayn (%d) - -Click to select server. Double click to join your friend. -== Server seçmək üçün klikləyin. Dostunuza qoşulmaq üçün iki dəfə klikləyin. - -Click to remove this player from your friends list. -== Bu oyunçunu dostlarınızın siyahısından silmək üçün klikləyin. - -Click to remove this clan from your friends list. -== Bu klanı dostlarınızın siyahısından silmək üçün klikləyin. - -Are you sure that you want to remove the player '%s' from your friends list? -== '%s' oyunçu dostlarınız siyahısından silmək istədiyinizə əminsiniz? - -Are you sure that you want to remove the clan '%s' from your friends list? -== '%s' klanı dostlarınız siyahısından silmək istədiyinizə əminsiniz? - -Add Clan -== Klan əlavə edin - -Play the current demo -== Cari demoyu oynayın - -Pause the current demo -== Demoya fasilə ver - -Stop the current demo -== Demoyu dayandır - -Go back one tick -== Bir tik geri qayıt - -Go forward one tick -== Bir tik irəli get - -Slow down the demo -== Demoyu yavaşlat - -Speed up the demo -== Demoyu sürətləndir - -Mark the beginning of a cut (right click to reset) -== Kəsim başlanğıcını işarələ (sağ kliklə sıfırla) - -Mark the end of a cut (right click to reset) -== Kəsim sonunu işarələ (sol kliklə sıfırla) - -Export cut as a separate demo -== Kəsimi ayrıca demo kimi ixrac et - -Go back one marker -== Bir işarə geri qayıt - -Go forward one marker -== Bir işarə irəli get - -Close the demo player -== Demo pleyeri bağla - -Toggle keyboard shortcuts -== Klaviatura qısayollarına keçid - -Export demo cut -== Demo kəsimini ixrac et - -Cut interval -== Kəsim intervalı - -Cut length -== Kəsim müddəti - -Loading demo files -== Demo fayllarının yüklənməsi - -All combined -== Hamısı bir yerdə - -Folder Link -== Qovluğa keçid - -Demos directory -== Demolara keçid - -Open the directory that contains the demo files -== Demo faylları olan qovluğu aç - -Are you sure that you want to delete the folder '%s'? -== '%s' qovluğunu silmək istədiyinizə əminsinizmi? - -Are you sure that you want to delete the demo '%s'? -== '%s' demosunu silmək istədiyinizə əminsinizmi? - -Delete folder -== Qovluğu silin - -Unable to delete the demo '%s' -== '%s' demosu silinə bilmədi. - -Unable to delete the folder '%s'. Make sure it's empty first. -== '%s' qovluğu silinə bilmədi. Əvvəlcə boş olduğundan əmin olun. - -Loading ghost files -== Ruh faylların yüklənməsi - -Menu opened. Press Esc key again to close menu. -== Menyu açıqdır. Menyuyu yenidən bağlamaq üçün Esc klavişini sıxın. - -Smooth Dynamic Camera -== Hamar Dinamik Kamera - -Skip the main menu -== Əsas menyudan keçin - -Save power by lowering refresh rate (higher input latency) -== Yeniləmə sürətini azaltmaqla enerjiyə qənaət edin (daha yüksək giriş gecikməsi) - -Settings file -== Parametrlər faylı - -Open the settings file -== Parametrlər faylını açın - -Config directory -== Konfiqurasiya qovluğu - -Open the directory that contains the configuration and user files -== Konfiqurasiya və istifadəçi faylları olan qovluğu açın - -Themes directory -== Mövzu qovluğu - -Open the directory to add custom themes -== Fərdi mövzular əlavə etmək üçün qovluğu açın - -Loading skin files -== Skin faylların yüklənməsi - -Download skins -== Skinleri yükləyin - -Download community skins -== İcma skinlerini yükləyin - -Choose default eyes when joining a server -== Serverə daxil olarkən istifadə etmək üçün standart gözləri seçin - -Create a random skin -== Təsadüfi skin yaradın - -Skin Database -== Skin verilənlər bazası - -Skins directory -== Skin qovluq - -Open the directory to add custom skins -== Xüsusi örtük(?) etmək üçün kataloqu açın. - -Chat command -== Söhbət əmri - -Enable controller -== Kontrolleri aktivləşdir - -Controller -== Kontroller - -Ingame controller mode -== Oyundaxili kontroller rejimi - -[Ingame controller mode] -Relative -== Nisbi - -[Ingame controller mode] -Absolute -== Mütləq - -Ingame controller sens. -== Oyundaxili kontroller həssaslığı. - -UI controller sens. -== UI kontroller həssaslığı. - -Controller jitter tolerance -== Kontroller gecikmə əmsalı - -No controller found. Plug in a controller. -== Kontroller tapılmadı. Kontrolleri qoşun - -Axis -== Ox - -Status -== Vəziyyət - -Aim bind -== Nişan almaq - -Mouse -== Mouse - -Ingame mouse sens. -== Oyun hassasiyeti - -UI mouse sens. -== Arayüz hassasiyeti - -Reset controls -== Kontrolleri sıfırla - -Are you sure that you want to reset the controls to their defaults? -== Kontrolleri varsayılan değerlerine döndürmek istediğine emin misin? - -Cancel -== İmtina etmək - -Dummy -== Dummy - -Windowed -== Pəncərəli - -Windowed borderless -== Sərhədsiz pəncərəli - -Windowed fullscreen -== Pəncərəli tam ekran - -Desktop fullscreen -== Tam ekran - -Allows maps to render with more detail -== Haritaların daha detaylı işlenmesine izin ver - -Renderer -== İşləyici - -default -== defolt - -custom -== xüsusi - -Graphics card -== Video kart - -auto -== avtomatik - -Game sound volume -== Oyun səs səviyyəsi - -Chat sound volume -== Söhbət səs səviyyəsi - -Background music volume -== Arxa plan musiqi səs səviyyəsi - -Appearance -== Görüntü - -Assets -== Mənbələr - -Name Plate -== İstifadəçi adı - -Hook Collisions -== Qarmaq kəsişmələri - -Show health, shields and ammo -== Can, qalxan və sursatı göstər - -DDRace HUD -== DDRace interfeysi - -Show DDRace HUD -== DDRace interfeysi göstər - -Show jumps indicator -== Neçə tullanma qaldığını göstər - -Show dummy actions -== Dummy hərəkətlərini göstər - -Show player position -== Oyunçu pozisyalarını göstər - -Show player speed -== Oyunçu sürətini göstər - -Show player target angle -== Oyunçunun hədəf bucağını göstər - -Show freeze bars -== Freeze barını göstər - -Opacity of freeze bars inside freeze -== Freeze içindəykən freeze barının qeyri-şəffaflığı - -Use old chat style -== Köhnə söhbət stilini istifadə et - -Preview -== Önizləmə - -Show local player's key presses -== Yerli oyunçunun düymə basmalarını göstərin - -Hook collision line -== Qarmaq izi - -Hook collision line opacity -== Kanca çizgisi opaklığı - -Colors of the hook collision line, in case of a possible collision with: -== OMümkün bir kəsişmə nəticəsində qarmaq izinin rəngləri: - -Your movements are not taken into account when calculating the line colors -== Rəngləri hesablanarkən hərəkətləriniz diqqətə (qeydə) alınmaz - -Nothing hookable -== Qarmaq atıla bilməz - -Something hookable -== Qarmaq atıla bilər - -A Tee -== Bir tee - -Normal Color -== Normal rəngi - -Highlight Color -== Vurğu rəngi - -Weapons -== Silahlar - -Rifle Laser Outline Color -== Tüfəng lazerinin çöl rəngi - -Rifle Laser Inner Color -== Tüfəng lazerinin iç rəngi - -Shotgun Laser Outline Color -== Ov tüfəngi lazerinin çöl rəngi - -Shotgun Laser Inner Color -== Ov tüfəngi lazerinin çöl rəngi - -Entities -== Binalar - -Door Laser Outline Color -== Qapı lazerinin çöl rəngi - -Door Laser Inner Color -== Qapı lazerinin iç rəngi - -Freeze Laser Outline Color -== Freeze lazerinin çöl rəngi - -Freeze Laser Inner Color -== Freeze lazerinin iç rəngi - -Set all to Rifle -== Hamısını tüfəngə quraşdır - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Başlanğıc xəttini keçdiyiniz zaman ən yaxşı vaxtınızın hərəkətlərini kopyalayan bir kabus tee göstər - -Opacity -== Şəffaflıq - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Teelər və istifadəçi adları kimi digər qruplara aid varlıqların qeyri-şəffaflığını düzəldin - -Quads are used for background decoration -== Dördbucaq binalar arxa plan dekorasiyası üçün istifadə edilir - -Tries to predict other entities to give a feel of low latency -== Kiçik gecikmə hissi vermək üçün digər binaları təxmin etməyə çalışdır - -Background -== Arxa fon - -Use current map as background -== Cari xəritəni fon kimi istifadə edin - -Run on join -== Qoşulduqda çalışdır - -Chat command (e.g. showall 1) -== Söhbət komandası (məs. showall 1) - -Unregister protocol and file extensions -== Protokol və fayl uzantılarının qeydiyyatını sil - -Emoticons -== Emosiyalar (İfadələr) - -Particles -== Hissəciklər - -Extras -== Əlavələr - -Loading assets -== Aktivlər yüklənir - -Assets directory -== Mənbə qovluğu - -Open the directory to add custom assets -== Xüsusi mənbə əlavə etmək üçün qovluq açın - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -Tutorial -== Təlimat - -Can't find a Tutorial server -== Təlimat server tapmaq mümkün deyil - -Website -== Web-sayt - -Settings -== Parametrlər - -Stop server -== Serveri dayandırın - -Run server -== Açıq server - -Server executable not found, can't run server -== Server icra edilə bilən tapılmadı, serveri işə salmaq mümkün deyil - -Editor -== Redaktor - -[Start menu] -Play -== Oynamaq - -Loading race demo files -== Yarış demo faylları yüklənir - -Super -== Əla - -Loading sound files -== Səs faylları yükləni - -Moved ingame -== Hərəkət edildi - -Go back the specified duration -== Verilən zaman qədər geri qayıt - -[Demo player duration] -%d min. -== %d dəq. - -[Demo player duration] -%d sec. -== %d san. - -Change the skip duration -== Keçiləcək zamanı dəyişdir - -Go forward the specified duration -== Verilən zaman qədər irəli get - -Render cut to video -== Kəsiyi (hissəni) videoya çevir - -Error playing demo -== Demo açılarkən xəta baş verdi - -Failed saving the replay! -== Təkrar yaddaşda saxlanılmadı ! (qeydə alınmadı) - -Saving settings to '%s' failed -== Parametrlər ‘%s’ qovluğuna qeyd edilmədi - -Error saving settings -== Parametrləri qeyd edərkən xəta baş verdi - -Searching -== Axtarış - -Enter Username -== İstifadəçi adınızı daxil edin - -Enter Password -== Parola daxil edin - -NOT CONNECTED -== BAĞLANTI YOXDUR - -Match %d of %d -== Uyğunluq %d dən %d - -No results -== Heç bir nəticə yoxdur - -Lines %d - %d (%s) -== Xətlər %d - %d (%s) - -Locked -== Kilidli - -Following -== İzləyir - -Loading commands… -== Komandalar yüklənir… - -Some map images could not be loaded. Check the local console for details. -== Bəzi fotolar yüklənmədi. Detallar üçün konsola nəzət yetirin. - -Some map sounds could not be loaded. Check the local console for details. -== Bəzi səslər yüklənmədi. Detallar üçün konsola nəzər yetirin. - -Loading menu themes -== Temalar yüklənir - -Press a key… -== Bir düyməni basın… - -Main menu -== Əsas menyu - -Render complete -== Videonun işlənməsi tamamlandı - -Are you sure that you want to restart? -== Yenidən başlamaq istədiyinizə əminsiniz? - -There's an unsaved map in the editor, you might want to save it. -== Redaktorda saxlanmamış xəritə var, onu saxlamaq istəyə bilərsiniz - -Continue anyway? -== Yenə də davam et? - -Videos directory -== Video kataloqu - -Video was saved to '%s' -== Video '%s' yolunda xilas oldu - -Communities -== İcmalar - -Server filter -== Server filtri - -Friends -== Dostlar - -Please use a different filename -== Fərqli fayl adı istifadə edin - -No demo selected -== Demo seçilməyib - -Created -== Yaradılmışdır - -Loading… -== Yüklənir… - -Ghosts directory -== Ruh kataloqu - -Activate all -== Tümünü etkinleştir - -Deactivate all -== Tümünü devre dışı bırak - -Info Messages -== Məlumat Mesajları - -Show local time always -== Yerli saat həmişə göstərmək - -Chat font size -== Şrift ölçüsü - -Chat width -== Söhbət eni - -Authed name color in scoreboard -== Xal lövhəsində səlahiyyətli ad rəngi - -Same clan color in scoreboard -== Xal lövhəsində eyni qlan rəngi - -Show finish messages -== Bitirmə mesajlarını göstərin - -Enable ghost -== Ruhu aktivləşdirin - -Only save improvements -== Sadəcə təkmilləşdirmələri saxlayın - -Regular background color -== Normal fon rəngi - -Entities background color -== Struktur fon rəngi - -Loading demo file from storage -== Demo faylı yaddaşdan yüklənir - -No login required -== Giriş tələb olunmur - -Netversion -== Netversion - -Player info change cooldown -== Oyunçu məlumatını dəyişmək üçün gözləmə vaxtı - -Always show chat -== Həmişə söhbəti göstərin - -Show friend mark (♥) in name plates -== İstifadəçi adlarında dostluq simvolunu (♥️) göstər - -Show hook strength icon indicator -== Qarmaq gücü işarəsi göstəricisini göstər - -Show hook strength number indicator -== Qarmaq gücü say göstəricisini göstər - -Show own player's hook collision line -== Oyunçunun qarmaq toqquşma sərhədini göstər - -Always show own player's hook collision line -== Oyunçunun qarmaq toqquşma sərhədini həmişə göstər - -Always show other players' hook collision lines -== Digər oyunçuların qarmaq toqquşma sərhədini həmişə göstər - -%d/%d KiB (%.1f KiB/s) -== %d/%d KiB (%.1f KiB/s) - -[Demo details] -map not included -== xəritə daxil deyil - -Tee -== Tee - -Show only chat messages from team members -== Yalnız komanda üzvlərinin mesajlarını göstərin - -[Spectating] -Following %s -== izlənilməkdədir %s - -Example of usage -== İstifadə nümunəsi - -Round %d/%d -== Yumru %d/%d - -[Spectators] -%d others… -== %d başqaları - -[Team and size] -%d\n(%d/%d) -== %d\n(%d/%d) - -Team %d (%d/%d) -== Komanda %d (%d/%d - -https://wiki.ddnet.org/wiki/Mapping -== https://wiki.ddnet.org/wiki/Mapping - -Could not resolve connect address '%s'. See local console for details. -== '%s' Link ünvanını həll etmək mümkün olmadı. Ətraflı məlumat üçün yerli konsola baxın - -Connect address error -== Link ünvanı xətası - -Could not connect dummy -== Dummy qoşula bilmədi - -Dummy is not allowed on this server -== Bu serverdə dummy icazə verilmir - -Please wait… -== Zəhmət olmasa gözləyin… - -Show client IDs (scoreboard, chat, spectator) -== Klient ID'sini göstərin (aparıcı lövhə, söhbət, izləyici) - -Are you sure that you want to delete '%s'? -== '%s' Bunu silmək istədiyinizə əminsiniz? - -Delete skin -== Skini silin - -Basic -== Sadə - -Custom -== Xüsusi - -Unable to delete skin -== Skin silinə bilməz - -Save skin -== Skini saxla - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== Skini xilas etmək istəyirsiniz? Bu adda başqa bir skin varsa, mövcud skin əvəzinə bu skin xilas olacaq. - -Unable to save the skin -== Skini xilas etmək mümkün deyil - -Unable to save the skin with a reserved name -== Skin xilas edilir, artıq bu adda skin vardı. - -No local servers found (ports %d-%d) -== Yerli server tapılmadı (port %d-%d) - -[Hertz] -Hz -== Hz - -[skins] -Body -== Gövdə - -[skins] -Marking -== İşarələmə - -[skins] -Decoration -== Dekorasiya - -[skins] -Hands -== Əl - -[skins] -Feet -== Ayaq - -[skins] -Eyes -== Göz - -Some fonts could not be loaded. Check the local console for details. -== Bəzi yazı fontları yüklənə bilmir. Ətraflı məlumat üçün əsas konsolu yoxlayın. - -Online friends (%d) -== Onlayn dostlar (%d) - -Add friends by entering their name below or by clicking their name in the player list. -== Aşağıya ad yazaraq və ya oyunçu siyahısından adlarına tıklayaraq dost əlavə edin. - -Add clanmates by entering their clan below and leaving the name blank. -== Klan yoldaşlarınızı klan adını aşağıya yazaraq və ad hissəsini boş buraxaraq əlavə edin. - -Offline friends and clanmates will appear here. -== Oflayn dostlar və klan yoldaşları burada görünəcək. - -Edit touch controls -== Toxunuş idarəetmələrini düzəlt - -Close -== Bağla - -Save changes -== Dəyişiklikləri yadda saxla - -Error saving touch controls -== Toxunuş idarəetmələri saxlanılarkən xəta baş verdi - -Could not save touch controls to file. See local console for details. -== Toxunuş idarəetmələrini fayllara yadda saxlamaq mümkün olmadı. Ətraflı məlumat üçün konsola baxın. - -Unsaved changes -== Yadda saxlanılmamış dəyişikliklər - -Discard changes -== Dəyişiklikləri ləğv et - -Are you sure that you want to discard the current changes to the touch controls? -== Toxunuş idarəetmələrindəki dəyişiklikləri ləğv etmək istədiyinizə əminsinizmi? - -Are you sure that you want to reset the touch controls to default? -== oxunuş idarəetmələrini varsayılan parametrlərə qaytarmaq istədiyinizə əminsinizmi? - -Import from clipboard -== Panodan içəri idxal et - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== Toxunuş idarəetmələrini panodan idxal etmək istədiyinizə əminsinizmi? Bu, mövcud idarəetmələrin üzərinə yazılacaq. - -Export to clipboard -== Panoya ixrac et - -Direct touch input while ingame -== Oyun içində olarkən birbaşa toxunuş girişi - -[Direct touch input] -Disabled -== Deaktiv edilib - -[Direct touch input] -Active action -== Aktiv hərəkət - -[Direct touch input] -Aim -== Aim - -[Direct touch input] -Fire -== Atəş - -[Direct touch input] -Hook -== Qarmaq - -Direct touch input while spectating -== İzləmə rejimində olarkən birbaşa toxunuş girişi - -Error loading touch controls -== Toxunuş idarəetmələri yüklənərkən xəta baş verdi - -Could not load touch controls from file. See local console for details. -== Toxunuş idarəetmələrini fayllardan yükləmək mümkün olmadı. Ətraflı məlumat üçün konsola baxın. - -Could not load default touch controls from file. See local console for details. -== Varsayılan toxunuş idarəetmələrini fayllardan yükləmək mümkün olmadı. Ətraflı məlumat üçün konsola baxın. - -Could not load touch controls from clipboard. See local console for details. -== Toxunuş idarəetmələrini panodan yükləmək mümkün olmadı. Ətraflı məlumat üçün konsola baxın. - -Width of your own hook collision line -== Öz qarmağınızın toqquşma xəttinin qalınlığı - -Width of others' hook collision line -== Başqalarının qarmaqlarının toqquşma xəttinin qalınlığı - -Preview 'Hook collisions' being pressed -== ‘Qarmaq toqquşmaları’ basılarkən önizləmə - -Aim -== Aim - -Active: Fire -== Aktiv: Atəş - -Active: Hook -== Aktiv: Qarmaq - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Loading background map -== - -[Spectating Camera Mode Icon] -AUTO -== - -Toggle auto camera -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Show client IDs in name plates -== - -Hook Strength -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== diff --git a/data/languages/belarusian.txt b/data/languages/belarusian.txt deleted file mode 100644 index 92a60c15c3..0000000000 --- a/data/languages/belarusian.txt +++ /dev/null @@ -1,2076 +0,0 @@ -##### authors ##### -#originally created by: -# arionwt1997 -#modified by: -# Chill [TD] & PoKeMoN [TD] 2023-03-31 16:00:00 -# Chill [TD] & PoKeMoN [TD] 2023-07-02 00:54:00 -# Chill [TD] & PoKeMoN [TD] 2023-09-22 17:49:00 -# Chill [TD] & PoKeMoN [TD] 2023-11-14 12:42:00 -# Chill [TD] & PoKeMoN [TD] 2024-08-23 23:17:00 -# -##### /authors ##### - -##### translated strings ##### - -%ds left -== засталося %d сек. - -%i minute left -== Засталася %i хвіліна! - -%i minutes left -== Засталося %i хвілін! - -%i second left -== Засталася %i секунда! - -%i seconds left -== Засталося %i секунд! - -%s wins! -== %s перамагае! - -Abort -== Перапыніць - -Add -== Дадаць - -Add Friend -== Дадаць сябра - -Address -== Адрас - -All -== Усім - -Are you sure that you want to quit? -== Вы сапраўды жадаеце выйсці? - -Automatically record demos -== Аўтаматычна запісваць дэма - -Automatically take game over screenshot -== Аўтаматычна рабіць здымак вынікаў гульні - -Blue team -== Сіняя каманда - -Blue team wins! -== Сіняя каманда перамагае! - -Body -== Цела - -Call vote -== Галасаваць - -Change settings -== Змяніць налады - -Chat -== Чат - -Clan -== Клан - -Client -== Кліент - -Connecting to -== Падлучэнне да - -Connection Problems… -== Праблемы з падлучэннем… - -Console -== Кансоль - -Controls -== Кіраванне - -Count players only -== Лічыць толькі гульцоў - -Current -== Бягучая разрознасць - -Custom colors -== Карыстацкія колеры - -Delete -== Выдаліць - -Delete demo -== Выдаліць дэма - -Demofile: %s -== Дэма: %s - -Demos -== Дэма - -Disconnect -== Адлучыцца - -Disconnected -== Адлучана - -Downloading map -== Спампоўка карты - -Draw! -== Нічыя! - -Dynamic Camera -== Дынамічная камера - -Emoticon -== Эмоцыі - -Error -== Памылка - -Error loading demo -== Памылка пры загрузцы дэма - -Favorite -== Любімы - -Favorites -== Любімыя - -Feet -== Ногі - -Fire -== Стрэл - -Folder -== Тэчка - -Force vote -== Фарсіраваць - -Free-View -== Вольны агляд - -Fullscreen -== Поўнаэкранны рэжым - -Game -== Гульня - -Game info -== Інфа пра гульню - -Game over -== Канец гульні - -Game type -== Тып гульні - -Game types: -== Тыпы гульні: - -General -== Агульныя - -Graphics -== Графіка - -Grenade -== Гранатамёт - -Hammer -== Молат - -Has people playing -== Ёсць гульцы - -High Detail -== Высокая дэталізацыя - -Hook -== Крук - -Invalid Demo -== Несапраўднае дэма - -Join blue -== За сініх - -Join red -== За чырвоных - -Jump -== Скачок - -Kick player -== Выгнаць гульца - -Language -== Мова - -MOTD -== MOTD - -Map -== Карта - -Move left -== Крок налева - -Move player to spectators -== Зрабіць назіральнікам - -Move right -== Крок направа - -Movement -== Перасоўванне - -Mute when not active -== Глушыць гукі, калі гульня неактыўная - -Name -== Імя - -Next weapon -== Наступная зброя - -Nickname -== Нікнэйм - -No -== Не - -No password -== Без пароля - -No servers found -== Серверы не знойдзены - -No servers match your filter criteria -== Няма сервераў, адпаведных вашым крытэрыям - -Ok -== ОК - -Parent Folder -== Бацькоўская тэчка - -Password -== Пароль - -Password incorrect -== Няправільны пароль - -Ping -== Пінг - -Pistol -== Пісталет - -Play background music -== Граць фонавую музыку - -Player -== Гулец - -Player country: -== Краіна гульца: - -Players -== Гульцы - -Please balance teams! -== Калі ласка, збалансуйце каманды! - -Prev. weapon -== Папярэдняя зброя - -Quit -== Выйсці - -Reason: -== Прычына: - -Red team -== Чырвоная каманда - -Red team wins! -== Чырвоная каманда перамагае! - -Remote console -== Кансоль сервера - -Remove -== Выдаліць - -Remove friend -== Выдаліць сябра - -Rename demo -== Пераназваць дэма - -Reset filter -== Скінуць фільтр - -Score -== Ачкі - -Score limit -== Ліміт ачкоў - -Scoreboard -== Табло - -Screenshot -== Здымак - -Server address: -== Адрас сервера: - -Server info -== Інфармацыя - -Server not full -== Сервер не запоўнены - -Shotgun -== Драбавік - -Show chat -== Паказваць чат - -Show friends only -== Толькі з сябрамі - -Show ingame HUD -== Паказваць нутрагульнявы HUD - -Show name plates -== Паказваць таблічкі з імёнамі - -Sound -== Гук - -Sound error -== Гукавая памылка - -Spectate -== Назіраць - -Spectate next -== Назіраць наст. - -Spectate previous -== Назіраць папяр. - -Spectator mode -== Рэжым назірання - -Spectators -== Назіральнікі - -Stop record -== Стоп запісу - -Strict gametype filter -== Строгі фільтр рэжымаў - -Sudden Death -== Раптоўная смерць - -Switch weapon on pickup -== Пераключаць зброю пры падборы - -Team -== Каманда - -Team chat -== Камандны чат - -The audio device couldn't be initialised. -== Аўдыё прылада не можа быць ініцыялізавана. - -The server is running a non-standard tuning on a pure game type. -== Сервер запушчаны з нестандартнымі наладамі на стандартным тыпе гульні. - -Time limit -== Ліміт часу - -Time limit: %d min -== Ліміт часу: %d - -Try again -== Паспрабаваць зноў - -Type -== Тып - -Unable to rename the demo -== Немагчыма пераназваць дэма - -Use sounds -== Выкарыстоўваць гукі - -Use team colors for name plates -== Выкарыстоўваць камандныя колеры для таблічак з імёнамі - -V-Sync -== Вертыкальная сінхранізацыя - -Version -== Версія - -Vote command: -== Камманда для галасавання: - -Vote description: -== Апісанне галасавання: - -Vote no -== Супраць - -Vote yes -== За - -Voting -== Галасаванне - -Warmup -== Размінка - -Weapon -== Зброя - -Yes -== Так - -You must restart the game for all settings to take effect. -== Трэба перазапусціць гульню, каб усе налады набылі моц. - -New name: -== Новае імя: - -Sat. -== Насычанасць - -Miscellaneous -== Рознае - -Internet -== Інтэрнэт - -Max demos -== Максімальная колькасць дэма - -News -== Навіны - -Join game -== Гуляць - -FSAA samples -== Сэмплаў FSAA - -Sound volume -== Гучнасць - -Max Screenshots -== Максімальная колькасць здымкаў - -Laser -== Лазер - -Hue -== Адценне - -Record demo -== Запісаць дэма - -Your skin -== Ваш скін - -Reset to defaults -== Скінуць налады - -Lht. -== Светлата - -UI Color -== Колер інтэрфейсу - -Alpha -== Непразрыст. - -LAN -== LAN - -Name plates size -== Памер таблічак з імёнамі - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== Не атрымалася выканаць падпампоўку кадравых буфераў. Паспрабуйце абнавіць драйверы відэакарты. - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Невядомая памылка. Паспрабуйце змяніць gfx_backend на OpenGL або Vulkan ў settings_ddnet.cfg ў тэчцы config і паспрабуйце зноў. - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== Не атрымалася ініцыялізаваць дадзены графічны бэкэнд, вяртанне да бэкэнда па змаўчанні. - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== Не атрымалася ініцыялізаваць дадзены графічны бэкэнд, магчыма, гэта звязана з тым, што вы не ўсталявалі драйвер убудаванай відэакарты. - -Could not save downloaded map. Try manually deleting this file: %s -== Не ўдалося захаваць спампаваную карту. Паспрабуйце ўручную выдаліць гэты файл: %s - -Successfully saved the replay! -== Паўтор паспяхова захаваны! - -Replay feature is disabled! -== Функцыя паўтору адключаная! - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== Шырыня тэкстуры %s не дзеліцца на %d ці вышыня не дзеліцца на %d, што можа выклікаць візуальныя багі. - -The format of texture %s is not RGBA which will cause visual bugs. -== Фармат тэкстуры %s не адпавядае RGBA, што можа выклікаць візуальныя багі. - -Preparing demo playback -== Падрыхтоўка прайгравання дэма - -Connected -== Падлучана - -Loading map file from storage -== Загрузка файла карты са сховішча - -Loading DDNet Client -== Загрузка кліента DDNet - -Why are you slowmo replaying to read this? -== Навошта вы запавольваеце прайграванне каб прачытаць гэта? - -Initializing components -== Ініцыялізацыя кампанентаў - -Initializing assets -== Ініцыялізацыя рэсурсаў - -Initializing map logic -== Ініцыялізацыя логікі карты - -Sending initial client info -== Адпраўка пачатковых дадзеных кліента - -Warning -== Папярэджанне - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Рэжым адладкі уключаны. Націсніце Ctrl+Shift+D, каб выключыць яго. - -Game paused -== Гульня спыненая - -Position: -== Пазіцыя: - -Speed: -== Хуткасць: - -Angle: -== Вугал: - -Server best: -== Рэкорд сервера: - -Personal best: -== Асабісты рэкорд: - -Uploading map data to GPU -== Загрузка дадзеных карты ў GPU - -Reset -== Скід - -Browser -== Браўзэр - -Ghost -== Прывід - -Trying to determine UDP connectivity… -== Спроба вызначыць UDP падлучэнне… - -UDP seems to be filtered. -== Здаецца, UDP фільтруецца. - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== Здаецца, UDP ды TCP IP адрозніваюцца. Паспрабуйце адключыць VPN, проксі і паскаральнікі сеткі. - -No answer from server yet. -== Сервер яшчэ не адказаў. - -Getting game info -== Атрыманне гульнявой інфармацыі - -Requesting to join the game -== Запыт на далучэнне да гульні - -Reconnect in %d sec -== Перападлучэнне праз %d сек. - -Render demo -== Рэндэр дэма - -Welcome to DDNet -== Запрашаем у DDNet - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork — гэта кааператыўная анлайн гульня, дзе мэта для вас і вашай групы Tee — дабрацца да фінішнай лініі карты. Як навічку, вам варта пачаць на Novice серверах, дзе размешчаны самыя простыя карты. Улічвайце пінг, каб выбраць блізкі да вас сервер. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Выкарыстоўвайце клавішу k, каб забіць свайго Tee (пачаць нанова), q для паўзы і назірання за іншымі гульцамі. Паглядзіце налады для іншых біндоў клавіш. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Рэкамендуецца праверыць налады, каб наладзіць іх паводле свайго меркавання перад далучэннем да сервера. - -Please enter your nickname below. -== Калі ласка, увядзіце свой нікнэйм ніжэй. - -Existing Player -== Існуючы гулец - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Ваш нікнэйм '%s' ужо выкарыстоўваецца (%d поінтаў). Хочаце выкарыстоўваць яго? - -Checking for existing player with your name -== Праверка на наяўнасць гульца з вашым імем - -Cancel -== Скасаваць - -File '%s' already exists, do you want to overwrite it? -== Файл '%s' ужо існуе, вы хочаце яго перазапісаць? - -Replace video -== Замяніць відэа - -Speed -== Хуткасць - -Video name: -== Назва відэа: - -Join Tutorial Server -== Далучыцца да навучальнага сервера - -Skip Tutorial -== Прапусціць навучанне - -Show DDNet map finishes in server browser -== Пазначаць пройдзеныя карты ў браўзэры - -transmits your player name to info.ddnet.org -== перадае ваша імя гульца на info.ddnet.org - -Theme -== Тэма - -Loading menu images -== Загрузка відарысаў меню - -AFR -== AFR - -ASI -== ASI - -AUS -== AUS - -EUR -== EUR - -NA -== NA - -SA -== SA - -CHN -== CHN - -Getting server list from master server -== Атрыманне спіса сервераў ад майстар сервера - -Search -== Пошук - -Exclude -== Выключыць - -%d of %d servers -== %d з %d сервераў - -%d of %d server -== %d з %d сервера - -%d players -== %d гульцоў - -%d player -== %d гулец - -Are you sure that you want to disconnect and switch to a different server? -== Вы ўпэўненыя, што хочаце адлучыцца і пераключыцца на іншы сервер? - -Filter connecting players -== Убраць тых, што падлучаюцца - -Indicate map finish -== Вылучыць пройдзеныя карты - -Unfinished map -== Няпройдзеная карта - -Countries -== Краіны - -Types -== Тыпы - -Copy info -== Капіяваць інфармацыю - -Leak IP -== Перадаваць IP - -Are you sure that you want to remove the player '%s' from your friends list? -== Вы ўпэўненыя што хочаце выдаліць гульца '%s' са спіса вашых сяброў? - -Are you sure that you want to remove the clan '%s' from your friends list? -== Вы ўпэўненыя што хочаце выдаліць клан '%s' са спіса вашых сяброў? - -Please use a different filename -== Калі ласка, выкарыстайце іншае імя файла - -File already exists, do you want to overwrite it? -== Файл ужо існуе, ці вы хочаце перазапісаць яго? - -Remove chat -== Прыбраць чат - -Play the current demo -== Прайграць бягучае дэма - -Pause the current demo -== Прыпыніць бягучае дэма - -Stop the current demo -== Спыніць бягучае дэма - -Go back one tick -== Пераматаць назад на адзін цік - -Go forward one tick -== Пераматаць наперад на адзін цік - -Slow down the demo -== Запаволіць дэма - -Speed up the demo -== Паскорыць дэма - -Export cut as a separate demo -== Экспартаваць адрэзак як асобнае дэма - -Go back one marker -== Пераматаць назад на адну пазнаку - -Go forward one marker -== Пераматаць наперад на адну пазнаку - -Toggle keyboard shortcuts -== Уключыць гарачыя клавішы - -Loading demo files -== Загрузка дэма файлаў - -%.2f MiB -== %.2f МіБ - -%.2f KiB -== %.2f КіБ - -Demo -== Дэма - -Markers -== Пазнакі - -Length -== Працягласць - -Date -== Дата - -Fetch Info -== Атрымаць інфа. - -Demos directory -== Тэчка дэма - -Open the directory that contains the demo files -== Адкрыць тэчку, якая ўтрымвае файлы дэма - -Are you sure that you want to delete the demo '%s'? -== Вы ўпэўненыя, што хочаце выдаліць дэма '%s'? - -Unable to delete the demo '%s' -== Немагчыма выдаліць дэма '%s' - -Are you sure that you want to disconnect? -== Вы ўпэўненыя, што хочаце адлучыцца? - -Connect Dummy -== Падлучыць даммі - -Connecting dummy -== Падлучэнне даммі - -Disconnect Dummy -== Адлучыць даммі - -Are you sure that you want to disconnect your dummy? -== Вы ўпэўненыя, што хочаце адлучыць вашага даммі? - -Kill -== Забіць - -Pause -== Паўза - -Loading ghost files -== Загрузка файлаў прывідаў - -Time -== Час - -Deactivate -== Выключыць - -Activate -== Уключыць - -Save -== Захаваць - -Menu opened. Press Esc key again to close menu. -== Меню адкрыта. Зноў націсніце Esc для закрыцця меню. - -Smooth Dynamic Camera -== Плыўная дынамічная камера - -Switch weapon when out of ammo -== Пераключаць зброю, калі скончыліся патроны - -Skip the main menu -== Прапускаць галоўнае меню пры запуску - -Refresh Rate -== Чашчыня абнаўлення - -Save power by lowering refresh rate (higher input latency) -== Эканомія энергіі за кошт зніжэння чашчыні абнаўленняў (больш высокая затрымка ўводу) - -Settings file -== Файл налад - -Open the settings file -== Адкрыць файл налад - -Config directory -== Тэчка канфігурацыі - -Open the directory that contains the configuration and user files -== Адкрыць тэчку, якая ўтрымвае файлы канфігурацыі і файлы карыстальніка - -Themes directory -== Тэчка тэм - -Open the directory to add custom themes -== Адкрыць тэчку для дадання карыстацкіх тэм - -Automatically take statboard screenshot -== Аўтаматычна рабіць здымак статыстыкі - -Automatically create statboard csv -== Аўтаматычна запісваць статыстыку ў CSV - -Max CSVs -== Максімум CSV - -Loading skin files -== Загрузка файлаў скінаў - -Download skins -== Спампаваць скіны - -Download community skins -== Пампаваць скіны супольнасці - -Vanilla skins only -== Толькі ванільныя скіны - -Fat skins (DDFat) -== Тоўстыя скіны (DDFat) - -Skin prefix -== Прэфікс скіна - -Choose default eyes when joining a server -== Выбраць вочы па змаўчанні пры падлучэнні да сервера - -Create a random skin -== Стварыць выпадковы скін - -Skin Database -== База дадзеных скінаў - -Skins directory -== Тэчка скіноў - -Open the directory to add custom skins -== Адкрыць тэчку для дадання карыстацкіх скінаў - -Hook collisions -== Сутыкненні крука - -Zoom in -== Прыблізіць - -Zoom out -== Аддаліць - -Default zoom -== Маштаб па змаўч. - -Show others -== Паказваць іншых - -Show all -== Паказваць усіх - -Toggle dyncam -== Змена дын. камеры - -Toggle dummy -== Пераключыць даммі - -Toggle ghost -== Пераключыць прывід - -Dummy copy -== Даммі капіруе - -Hammerfly dummy -== Даммі б'е - -Converse -== Асабістае павед. - -Statboard -== Статыстыка - -Lock team -== Заблакаваць каманду - -Show entities -== Паказваць энтыты - -Show HUD -== Паказваць HUD - -Chat command -== Каманда чата - -Enable controller -== Уключыць кантролер - -[Ingame controller mode] -Relative -== Адносны - -[Ingame controller mode] -Absolute -== Абсалютны - -Ingame controller mode -== Рэжым кантролера ў гульні - -Ingame controller sens. -== Адчувальнасць кантролера ў гульні - -UI controller sens. -== Адчувальнасць кантролера ў меню - -Controller jitter tolerance -== Устойлівасць кантролера да дрыгацення - -No controller found. Plug in a controller. -== Кантролер не знойдзены. Падключыце кантролер. - -Status -== Статус - -Aim bind -== Вось прыцэла - -Mouse -== Мыш - -Ingame mouse sens. -== Адчувальнасць мышы ў гульні - -UI mouse sens. -== Адчувальнасць мышы ў меню - -Controller -== Кантролер - -Reset controls -== Скінуць налады - -Are you sure that you want to reset the controls to their defaults? -== Вы ўпэўненыя, што хочаце скінуць кіраванне да значэнняў па змаўчанні - -Dummy -== Даммі - -Windowed -== Аконны - -Windowed borderless -== Аконны без рамкі - -Windowed fullscreen -== Аконны на ўвесь экран - -Desktop fullscreen -== Поўнаэкранны - -may cause delay -== можа выклікаць затрымку - -Screen -== Экран - -Allows maps to render with more detail -== Дазваляе картам рэндэрыцца з большай дэталізацыяй - -Use high DPI -== Выкарыстоўваць высокі DPI - -Renderer -== Рэндэрэр - -default -== па змаўчанні - -custom -== карыстацкі - -auto -== аўта - -Enable game sounds -== Уключыць гукі гульні - -Enable gun sound -== Уключыць гук пісталета (толькі для DDRace) - -Enable long pain sound (used when shooting in freeze) -== Уключыць доўгі гук болю (выкарыстоўваецца пры стральбе ў замарозцы) - -Enable server message sound -== Уключыць гук паведамленняў сервера - -Enable regular chat sound -== Уключыць гук звычайных паведамленняў - -Enable team chat sound -== Уключыць гук камандных паведамленняў - -Enable highlighted chat sound -== Уключыць гук падсвечаных паведамленняў - -Game sound volume -== Гучнасць гульні - -Chat sound volume -== Гучнасць чата - -Map sound volume -== Гучнасць карты - -Background music volume -== Гучнасць фонавай музыкі - -Appearance -== Выгляд - -DDNet -== DDNet - -Assets -== Тэкстуры - -DDNet Client needs to be restarted to complete update! -== Патрабуецца перазапусціць кліент DDnet для завяршэння абнаўлення! - -HUD -== HUD - -Name Plate -== Таблічка з імем - -Hook Collisions -== Сутыкненні крука - -Show health, shields and ammo -== Паказваць здароўе, шчыты і боепрыпасы - -Show kill messages -== Паказваць паведамленні пра смерць - -Show score -== Паказваць ачкі - -Show votes window after voting -== Паказваць акно галасавання пасля выбару - -DDRace HUD -== DDRace HUD - -Show DDRace HUD -== Паказваць DDRace HUD - -Show jumps indicator -== Паказваць індыкатар скачкоў - -Show dummy actions -== Паказваць дзеянні даммі - -Show player position -== Паказваць пазіцыю гульца - -Show player speed -== Паказваць хуткасць гульца - -Show player target angle -== Паказваць вугал прыцэла гульца - -Show freeze bars -== Паказваць палоскі замарозкі - -Opacity of freeze bars inside freeze -== Непразрыстасць палоскі замарозкі ўнутры замарозцы - -Show names in chat in team colors -== Паказваць імёны ў чаце ў камандных колерах - -Show only chat messages from friends -== Паказваць паведамленні чата толькі ад сяброў - -Use old chat style -== Выкарыстоўваць стары стыль чата - -Messages -== Паведамленні - -System message -== Сістэмнае паведамленне - -Highlighted message -== Падсвечанае паведамленне - -Team message -== Каманднае паведамленне - -Friend message -== Паведамленне ад сябра - -Normal message -== Звычайнае паведамленне - -Client message -== Паведамленне кліента - -Preview -== Прадпрагляд - -Show clan above name plates -== Паказваць клан над таблічкамі з імёнамі - -Clan plates size -== Памер таблічак з кланамі - -Show other players' key presses -== Паказваць націснутыя клавішы іншых гульцоў - -Show local player's key presses -== Паказваць вашы націснутыя клавішы - -Hook collision line -== Лінія сутыкнення крука - -Show other players' hook collision lines -== Паказваць сутыкненні крука іншых гульцоў - -Hook collision line opacity -== Непразрыстасьць лініі сутыкнення крука - -Colors of the hook collision line, in case of a possible collision with: -== Колер лініі сутыкнення крука ў выпадку калі: - -Your movements are not taken into account when calculating the line colors -== Ваш рух не ўлічваецца, калі разлічваецца колер лініі - -Nothing hookable -== Немагчыма зачапіцца - -Something hookable -== Магчыма зачапіцца - -A Tee -== Трапленне з Tee - -Normal Color -== Звычайны колер - -Highlight Color -== Колер падсвятлення - -Weapons -== Зброя - -Rifle Laser Outline Color -== Колер абводкі лазера вінтоўкі - -Rifle Laser Inner Color -== Унутраны колер лазера вінтоўкі - -Shotgun Laser Outline Color -== Колер абводкі лазера драбавіка - -Shotgun Laser Inner Color -== Унутраны колер лазера драбавіка - -Entities -== Энтыты - -Door Laser Outline Color -== Колер абводкі лазера дзвярэй - -Door Laser Inner Color -== Унутраны колер лазера дзвярэй - -Freeze Laser Outline Color -== Колер абводкі лазера замарозкі - -Freeze Laser Inner Color -== Унутраны колер лазера замарозкі - -Set all to Rifle -== Зрабіць усё як у вінтоўкі - -Save the best demo of each race -== Захоўваць лепшае дэма кожнага забегу - -Enable replays -== Уключыць запісы - -Default length -== Станд. працягласць - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Пры перасячэнні стартавай лініі, паказваць прывід Tee, які паўтарае ваш лепшы час - -Show ghost -== Паказваць прывід - -Save ghost -== Захоўваць прывід - -Gameplay -== Гульнявы працэс - -Overlay entities -== Накладаць энтыты - -Size -== Памер - -Show text entities -== Паказваць подпісы энтыты - -Opacity -== Непразр. - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Рэгуляванне непразрыстасці аб'ектаў іншых каманд, такіх як Tee і таблічкі з імёнамі. - -Show others (own team only) -== Паказваць іншых (толькі сваю каманду) - -Show quads -== Паказваць квады - -Quads are used for background decoration -== Квады выкарыстоўваюцца для ўпрыгожвання фону - -AntiPing -== АнтыПінг - -Tries to predict other entities to give a feel of low latency -== Спрабуе прадказаць іншыя аб'екты, каб надаць адчуванне нізкай затрымкі - -AntiPing: predict other players -== АнтыПінг: прадказваць становішча гульцоў - -AntiPing: predict weapons -== АнтыПінг: прадказваць зброю - -AntiPing: predict grenade paths -== АнтыПінг: прадказывать траекторыі гранат - -Background -== Фон - -Use current map as background -== Выкарыстоўваць бягучую карту як фон - -Show tiles layers from BG map -== Таксама выкарыстоўваць фонавыя тэкстуры карты - -New random timeout code -== Новы выпадковы таймаўт код - -Run on join -== Запускаць пры ўваходзе - -Chat command (e.g. showall 1) -== Каманда чата (напрыклад, showall 1) - -Unregister protocol and file extensions -== Незарэгістраваны пратакол і пашырэнні файлаў - -DDNet %s is available: -== Даступны DDNet %s: - -Update now -== Абнавіць зараз - -Updating… -== Абнаўленне… - -DDNet Client updated! -== Кліент DDNet абнаўлён! - -No updates available -== Няма даступных абнаўленняў - -Check now -== Праверыць зараз - -Emoticons -== Эмоцыi - -Particles -== Часціцы - -Extras -== Дадаткова - -Loading assets -== Загрузка тэкстур - -Assets directory -== Тэчка тэкстур - -Open the directory to add custom assets -== Адкрыць тэчку для дадання карыстацкіх тэкстур - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -Learn -== Вікі - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ - -Tutorial -== Навучанне - -Can't find a Tutorial server -== Навучальны сервер не знойдзены - -Website -== Сайт - -Settings -== Налады - -Stop server -== Спыніць сервер - -Run server -== Запусціць сервер - -Server executable not found, can't run server -== Выканальны файл сервера не знойдзены, немагчыма запусціць сервер - -Editor -== Рэдактар - -[Start menu] -Play -== Гуляць - -DDNet %s is out! -== Выйшаў DDNet %s! - -Downloading %s: -== Спампоўка %s: - -Update failed! Check log… -== Абнаўленне не атрымалася. Праверце логі… - -Restart -== Перазапуск - -Loading race demo files -== Загрузка дэма файлаў забегаў - -Super -== Супер - -Team %d -== Каманда %d - -Manual -== Уручную - -Race -== Забег - -Auto -== Аўта - -Replay -== Запіс - -Loading sound files -== Загрузка гукавых файлаў - -Follow -== Сачыць - -Frags -== Забойства - -Deaths -== Смерці - -Suicides -== Суіц. - -Ratio -== Суадн. - -Net -== Варт. - -FPM -== ЗУХ - -Spree -== Серыя - -Best -== Вынік - -Grabs -== Зах. - -1 new mention -== 1 новая згадка - -%d new mentions -== %d новых згадак - -9+ new mentions -== 9+ новых згадак - -A demo with this name already exists -== Дэма з такой назвай ужо існуе - -No server selected -== Сервер не абраны - -Online clanmates (%d) -== Членаў клана анлайн (%d) - -[friends (server browser)] -Offline (%d) -== Афлайн (%d) - -Click to select server. Double click to join your friend. -== Націсніце, как абраць сервер. Націсніце двойчы, каб далучыцца да вашага сябра. - -Click to remove this player from your friends list. -== Націсніце, как выдаліць гэтага гульца са свайго спіса сяброў. - -Click to remove this clan from your friends list. -== Націсніце, как выдаліць гэты клан са свайго спіса сяброў. - -Add Clan -== Дадаць клан - -Mark the beginning of a cut (right click to reset) -== Пазначыць пачатак адрэзка (правая кнопка мышы для скіду) - -Mark the end of a cut (right click to reset) -== Пазначыць канец адрэзка (правая кнопка мышы для скіду) - -Close the demo player -== Закрыць прайгравальнік дэма - -Export demo cut -== Экспартаваць адрэзак дэма - -Cut interval -== Інтэрвал адрэзка - -Cut length -== Працягласць адрэзка - -Axis -== Вось - -Graphics card -== Відэакарта - -Quitting. Please wait… -== Выхад. Пачакайце, калі ласка… - -Restarting. Please wait… -== Перазапуск. Пачакайце, калі ласка… - -Multi-View -== Мульты-агляд - -Rename folder -== Пераназваць тэчку - -A folder with this name already exists -== Тэчка з такой назвай ужо існуе - -Unable to rename the folder -== Немагчыма пераназваць тэчку - -(paused) -== (паўза) - -Go back the specified duration -== Назад на выбраную працягласць - -[Demo player duration] -%d min. -== %d хв. - -[Demo player duration] -%d sec. -== %d сек. - -Change the skip duration -== Змяніць працягласць пропуску - -Go forward the specified duration -== Уперад на выбраную працягласць - -Render cut to video -== Рэндэрыць адрэзак у відэа - -All combined -== Усе разам - -Folder Link -== Ярлык тэчкі - -Are you sure that you want to delete the folder '%s'? -== Вы ўпэўненыя, што хочаце выдаліць тэчку '%s'? - -Delete folder -== Выдаліць тэчку - -Unable to delete the folder '%s'. Make sure it's empty first. -== Немагчыма выдаліць тэчку '%s'. Спачатку пераканайцеся, што яна пустая. - -Moved ingame -== Перамешчаны ў гульні - -Error playing demo -== Памылка прайгравання дэма - -Some map images could not be loaded. Check the local console for details. -== Некаторыя відарысы карты немагчыма спампаваць. Для атрымання дэталей праверце лакальную кансоль. - -Some map sounds could not be loaded. Check the local console for details. -== Некаторыя гукі карты немагчыма спампаваць. Для атрымання дэталей праверце лакальную кансоль. - -Loading menu themes -== Спампоўка тэм меню - -Render complete -== Рэндэр завершаны - -Videos directory -== Тэчка відэа - -Video was saved to '%s' -== Відэа было захавана ў '%s' - -No demo selected -== Дэма не выбрана - -Created -== Створана - -Netversion -== Сеткавая версія - -[Demo details] -map not included -== карта не ўключана - -Ghosts directory -== Тэчка прывідаў - -Activate all -== Актываваць усе - -Deactivate all -== Дэактываваць усе - -Enable ghost -== Уключыць прывід - -Only save improvements -== Захоўваць толькі паляпшэнні - -Regular background color -== Колер звычайнага фону - -Entities background color -== Колер фону энтыты - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== Адбылася памылка падчас выканання каманды запісу. Паспрабуйце абнавіць драйверы відэакарты. - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== Каманда рэндэрынгу не выканана. Паспрабуйце абнавіць драйверы відэакарты. - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Памылка падчас ініцыялізацыі. Паспрабуйце змяніць gfx_backend на OpenGL або Vulcan у settings_dnet.cfg ў тэчцы канфігурацыйных файлаў і паспрабуйце яшчэ раз. - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== Недахоп VRAM. Паспрабуйце выдаліць карыстацкія тэкстуры (скіны, энтыты і г.д.), асабліва тыя, якія маюць высокую разрознасць. - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== Адпраўка каманд рэндэрынгу не ўдалася. Паспрабуйце абнавіць драйверы відэакарты. - -Failed saving the replay! -== Не атрымалася захаваць паўтор! - -Saving settings to '%s' failed -== Захаванне налад у '%s' не атрымалася - -Error saving settings -== Памылка захавання налад - -Loading demo file from storage -== Загрузка файла дэма са сховішча - -Searching -== Пошук - -Enter Username -== Увядзіце імя карыстальніка - -Enter Password -== Увядзіце пароль - -NOT CONNECTED -== НЕ ПАДЛУЧАНА - -Match %d of %d -== Адпаведна %d з %d - -No results -== Няма вынікаў - -Lines %d - %d (%s) -== Радкі %d - %d (%s) - -Locked -== Зафіксаваныя - -Following -== Бягучыя - -Loading commands… -== Загрузка каманд… - -[Spectating] -Following %s -== Назіранне за %s - -Press a key… -== Націсніце клавішу… - -Main menu -== Галоўнае меню - -Are you sure that you want to restart? -== Вы ўпэўненыя, што хочаце пачаць нанова? - -There's an unsaved map in the editor, you might want to save it. -== У рэдактары засталася не захаваная карта, магчыма вы хочаце яе захаваць. - -Continue anyway? -== Працягнуць у любым выпадку? - -%d/%d KiB (%.1f KiB/s) -== %d/%d КіБ (%.1f КіБ/с) - -Example of usage -== Прыклад выкарыстання - -No login required -== Уваход не патрабуецца - -Communities -== Суполкі - -Server filter -== Фільтр сервераў - -Friends -== Сябры - -Loading… -== Загрузка… - -Player info change cooldown -== Затрымка абнаўлення інфармацыі пра гульца - -Tee -== Tee - -Info Messages -== Інфа. Паведамленні - -Show local time always -== Заўсёды паказваць мясцовы час - -Always show chat -== Заўсёды паказваць чат - -Show only chat messages from team members -== Паказваць паведамленні чата толькі ад чальцоў каманды - -Chat font size -== Памер шрыфта чата - -Chat width -== Шырыня чата - -Show friend mark (♥) in name plates -== Паказваць адзнаку сябра (♥) у таблічках з імёнамі - -Show hook strength icon indicator -== Паказваць іконку індыкатара сілы крука - -Show hook strength number indicator -== Паказваць нумар індыкатара сілы крука - -Authed name color in scoreboard -== Колер аўтарызаваных гульцоў у табло ачкоў - -Same clan color in scoreboard -== Колер твайго клана ў табло ачкоў - -Show own player's hook collision line -== Паказваць сваю лінію сутыкнення крука - -Always show own player's hook collision line -== Заўсёды паказваць сваю лінію сутыкнення крука - -Always show other players' hook collision lines -== Заўсёды паказваць лініі сутыкнення крука іншых гульцоў - -Show finish messages -== Паказваць паведамленні пра фініш - -Round %d/%d -== Раўнд %d/%d - -[Spectators] -%d others… -== %d іншых… - -[Team and size] -%d\n(%d/%d) -== %d\n(%d/%d) - -Team %d (%d/%d) -== Каманда %d (%d/%d) - -https://wiki.ddnet.org/wiki/Mapping -== https://wiki.ddnet.org/wiki/Mapping - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not connect dummy -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Some fonts could not be loaded. Check the local console for details. -== - -Loading background map -== - -[Spectating Camera Mode Icon] -AUTO -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -No local servers found (ports %d-%d) -== - -Online friends (%d) -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Toggle auto camera -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -[Hertz] -Hz -== - -Show client IDs (scoreboard, chat, spectator) -== - -Show client IDs in name plates -== - -Hook Strength -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Preview 'Hook collisions' being pressed -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Aim -== - -Active: Fire -== - -Active: Hook -== diff --git a/data/languages/bosnian.txt b/data/languages/bosnian.txt deleted file mode 100644 index 9f60bd16ea..0000000000 --- a/data/languages/bosnian.txt +++ /dev/null @@ -1,2076 +0,0 @@ -##### authors ##### -#originally created by: -# *** -#modified by: -# *** 2011-01-05 18:48:00 -# *** 2011-04-12 17:53:42 -# *** 2011-07-04 23:31:22 -# MikiGamer 2020-09-08 13:13:00 -##### /authors ##### - -##### translated strings ##### - -%ds left -== Još %ds - -%i minute left -== Preostalo: %i min. - -%i minutes left -== Preostalo: %i min. - -%i second left -== Preostalo: %i sek. - -%i seconds left -== Preostalo: %i sek. - -%s wins! -== %s je pobijedio! - -Abort -== Prekini - -Add -== Dodaj - -Add Friend -== Dodaj prijatelja - -Address -== Adresa - -All -== Svi - -Are you sure that you want to quit? -== Da li ste sigurni da želite izaći? - -Automatically record demos -== Automatski demo-snimci - -Automatically take game over screenshot -== Automatski screenshot nakon završetka igre - -Blue team -== Plavi tim - -Blue team wins! -== Plavi tim je pobijedio! - -Body -== Tijelo - -Call vote -== Glasanje - -Change settings -== Izmijeni postavke - -Chat -== Chat - -Clan -== Klan - -Client -== Klijent - -Connecting to -== Konektovanje na - -Connection Problems… -== Problemi sa konekcijom… - -Console -== Konzola - -Controls -== Kontrole - -Count players only -== Izbroj samo igrače - -Current -== Current - -Custom colors -== Vlastite boje - -Delete -== Obriši - -Delete demo -== Brisanje demo-snimka - -Demofile: %s -== Demo-snimak: %s - -Demos -== Demo - -Disconnect -== Diskonektuj - -Disconnected -== Diskonektovan - -Downloading map -== Preuzimanje mape - -Draw! -== Neriješeno! - -Dynamic Camera -== Dinamička kamera - -Emoticon -== Emotikoni - -Error -== Greška - -Error loading demo -== Došlo je do greške pri učitavanju demo-snimka - -Favorite -== Omiljeni - -Favorites -== Omiljeni - -Feet -== Stopala - -Fire -== Pucanje - -Folder -== Folder - -Force vote -== Obavezno glasanje - -Free-View -== Slobodan pogled - -Fullscreen -== Čitav ekran - -Game -== Igra - -Game info -== O igri - -Game over -== Igra je završena - -Game type -== Tip igre - -Game types: -== Tipovi igre: - -General -== Opće - -Graphics -== Grafika - -Grenade -== Granate - -Hammer -== Čekić - -Has people playing -== Server nije prazan - -High Detail -== Visoki detalji - -Hook -== Lanac - -Invalid Demo -== Neispravan demo-snimak - -Join blue -== U plavi tim - -Join red -== U crveni tim - -Jump -== Skok - -Kick player -== Izbaci igrača iz igre - -Language -== Jezik - -MOTD -== Poruka dana - -Map -== Mapa - -Move left -== Lijevo - -Move player to spectators -== Izbaci igrača u posmatrače - -Move right -== Desno - -Movement -== Kretanje - -Mute when not active -== Bez zvuka prilikom neaktivnosti - -Name -== Ime - -Next weapon -== Sljedeće oružje - -Nickname -== Nadimak - -No -== Ne - -No password -== Bez lozinke - -No servers found -== Nema pronađenih servera - -No servers match your filter criteria -== Nema pronađenih servera sa odgovarajućim filterom - -Ok -== OK - -Parent Folder -== Prethodni folder - -Password -== Lozinka - -Password incorrect -== Pogrešna lozinka - -Ping -== Ping - -Pistol -== Pištolj - -Play background music -== Pozadinska muzika - -Player -== Igrač - -Player country: -== Država - -Players -== Igrači - -Please balance teams! -== Molimo da balansirate timove! - -Prev. weapon -== Prethodno oružje - -Quit -== Izlaz - -Reason: -== Razlog: - -Red team -== Crveni tim - -Red team wins! -== Crveni tim je pobijedio! - -Remote console -== Udaljena konzola - -Remove -== Ukloni - -Remove friend -== Ukloni prijatelja - -Rename demo -== Preimenuj demo-snimak - -Reset filter -== Poništi filter - -Score -== Rezultat - -Score limit -== Max. bodova - -Scoreboard -== Bodovi - -Screenshot -== Screenshot - -Server address: -== Adresa servera: - -Server info -== O Serveru - -Server not full -== Server nije pun - -Shotgun -== Pumparica - -Show chat -== Prikaži chat - -Show friends only -== Prikaži samo prijatelje - -Show ingame HUD -== Prikaži HUD - -Show name plates -== Prikaži imena igrača - -Sound -== Zvuk - -Sound error -== Problem sa zvukom - -Spectate -== Posmatraj - -Spectate next -== Posmatraj narednog - -Spectate previous -== Posmatraj prethodnog - -Spectator mode -== Posmatrački mod - -Spectators -== Posmatrači - -Stop record -== Prekini snimanje - -Strict gametype filter -== Striktan filter tipa igre - -Sudden Death -== Iznenadna smrt - -Switch weapon on pickup -== Aktiviraj novo oružje prilikom uzimanja - -Team -== Tim - -Team chat -== Timski chat - -The audio device couldn't be initialised. -== Audio-uređaj nije moguće pokrenuti. - -The server is running a non-standard tuning on a pure game type. -== Server sadrži nestandardne postavke. - -Time limit -== Max. vremena - -Time limit: %d min -== Max. vremena: %d min. - -Try again -== Pokušaj ponovo - -Type -== Tip - -Unable to rename the demo -== Demo-snimak nije moguće preimenovati - -Use sounds -== Aktiviraj zvuk - -Use team colors for name plates -== Koristi timsku boju u prikazu imena - -V-Sync -== V-Sync - -Version -== Verzija - -Vote command: -== Komanda za glasanje: - -Vote description: -== Opis glasanja: - -Vote no -== Ne - -Vote yes -== Da - -Voting -== Glasanje - -Warmup -== Zagrijavanje - -Weapon -== Oružje - -Yes -== Da - -You must restart the game for all settings to take effect. -== Morate ponovo pokrenuti igru da bi sve postavke bile primijenjene. - -##### needs translation ##### - -New name: -== Novo ime: - -Sat. -== Zasić. - -Miscellaneous -== Razno - -Internet -== Internet - -Max demos -== Maximalan broj demo-snimaka - -News -== Novosti - -Join game -== Uključi se u igru - -FSAA samples -== FSAA samples - -Sound volume -== Jačina zvuka - -Max Screenshots -== Maksimalan broj screenshot-a - -Laser -== Laser - -Hue -== Nijans. - -Record demo -== Snimi demo - -Your skin -== Vaš skin - -Reset to defaults -== Vrati na početne postavke - -Lht. -== Svjetl. - -UI Color -== Boja menija - -Alpha -== Provid. - -LAN -== LAN - -Name plates size -== Veličina podloge za ime - -Successfully saved the replay! -== Uspješno sačuvan replay-snimak! - -Replay feature is disabled! -== Replay opcija je isključena! - -Game paused -== Igra je pauzirana - -Server best: -== Najbolje na serveru - -Personal best: -== Najbolje osobno - -Learn -== Wiki - -Browser -== Pretraživač - -Ghost -== Duh - -Loading DDNet Client -== Učitavanje DDNet Klijenta - -Reconnect in %d sec -== Rekonetovanje za %d sekundi - -Render demo -== Renderuj demo - -Replace video -== Zamijeni video - -File already exists, do you want to overwrite it? -== Fajl već postoji, da li ga ipak želite sačuvati? - -Are you sure that you want to disconnect? -== Da li ste sigurni da se želite diskonektovati? - -Disconnect Dummy -== Diskonektuj Dummy-a - -Are you sure that you want to disconnect your dummy? -== Da li ste sigurni da želite diskonektovati dummy-a? - -Welcome to DDNet -== Dobrodošli na DDNet - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork je kooperativna online igra gdje je cilj da ti i tvoja grupa igrača dođete do finiša na mapi. Kao početnik trebalo bi da počneš igrati na Novice serverima, gdje se nalaze najlakše mape. U zavisnosti od ping-a izaberite server najbliži vama. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Koristi k tipku da se ubiješ (restart), q da pauziraš i posmatraš ostale igrače. Pogledaj podešavanja za ostale bindove za tipke. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Preporučeno je da provjeriš i podesiš postavke najbolje za tebe prije nego uđeš na server. - -Please enter your nickname below. -== Molimo unesite vaš nadimak dole. - -Video name: -== Ime videa: - -Show DDNet map finishes in server browser -== Prikaži završene DDNet mape u pretraživaču za servere - -transmits your player name to info.ddnet.org -== prenosi tvoje ime na info.ddnet.org - -Search -== Pretraži - -Exclude -== Izostavi - -Filter connecting players -== Filtriraj igrače koji se konektuju - -Indicate map finish -== Indikator završene mape - -Unfinished map -== Nezavršene mape - -Countries -== Zemlje - -Types -== Tipovi - -DDNet %s is out! -== DDNet %s je dostupan! - -Downloading %s: -== Preuzimanje %s: - -Update failed! Check log… -== Ažuriranje neuspješno! Provjeri log… - -DDNet Client updated! -== DDNet Klijent ažuriran! - -Update now -== Ažuriraj sad - -Restart -== Restart - -Remove chat -== Ukloni čat - -Demo -== Demo-snimak - -Markers -== Markeri - -Length -== Dužina - -Date -== Datum - -Fetch Info -== Dohvati info - -Connecting dummy -== Konektovanje dummy-a - -Connect Dummy -== Konektuj dummy-a - -Deactivate -== Deaktiviraj - -Activate -== Aktiviraj - -Save -== Sačuvati - -Switch weapon when out of ammo -== Promijeni oružje kada nestane municije - -Show only chat messages from friends -== Prikaži čat poruke samo od prijatelja - -Show clan above name plates -== Prikaži klan iznad imena - -Clan plates size -== Veličina klan podloge - -Refresh Rate -== Brzina osvježavanja - -Automatically take statboard screenshot -== Automatski slikaj tablicu bodova - -Automatically create statboard csv -== Automatski kreiraj csv tablice bodova - -Vanilla skins only -== Samo skinovi iz Vanille - -Fat skins (DDFat) -== Debeli skinovi (DDFat) - -Skin prefix -== Prefiks Skina - -Hook collisions -== Sudari lanca - -Pause -== Pauza - -Kill -== Smrt - -Zoom in -== Uvećati - -Zoom out -== Umanjiti - -Default zoom -== Zadana veličina - -Show others -== Prikaži ostale - -Show all -== Prikaži sve - -Toggle dyncam -== Promijeni din. kameru - -Toggle dummy -== Promijeni dummy-a - -Toggle ghost -== Promijeni duha - -Dummy copy -== Dummy kopiranje - -Hammerfly dummy -== Dummy čekić-letenje - -Converse -== Konverzacija - -Statboard -== Tablica bodova - -Lock team -== Zaključaj tim - -Show entities -== Prikaži entiti-e - -Show HUD -== Prikaži HUD - -may cause delay -== može prouzrokovati kašnjenje - -Screen -== Ekran - -Use high DPI -== Koristi visoki DPI - -Enable game sounds -== Omogući zvukove igre - -Enable gun sound -== Omogući zvukove pištolja - -Enable long pain sound (used when shooting in freeze) -== Omogući dugi bolni zvuk (koristi se kada se puca dok si zaleđen) - -Enable server message sound -== Omogući zvuk poruke servera - -Enable regular chat sound -== Omogući zvuk regularnog čata - -Enable team chat sound -== Omogući zvuk timskog čata - -Enable highlighted chat sound -== Omogući zvuk označavanja u čatu - -Map sound volume -== Glasnoća zvuka mape - -DDNet Client needs to be restarted to complete update! -== DDNet Klijent mora da se restartuje da bi završio ažuriranje! - -Show score -== Prikaži bodove - -Show names in chat in team colors -== Prikaži imena timova u boji - -Show kill messages -== Prikaži smrtne poruke - -Show votes window after voting -== Prikaži prozor glasanja nakon glasanja - -Messages -== Poruke - -System message -== Poruka od sistema - -Reset -== Reset - -Highlighted message -== Označene poruke - -Team message -== Timske poruke - -Friend message -== Poruka prijatelja - -Normal message -== Normalna poruka - -Client message -== Poruka klijenta - -Save the best demo of each race -== Sačuvaj najbolji demo-snimak svake trke - -Default length -== Zadana dužina - -Enable replays -== Omogući replay - -Show ghost -== Prikaži duha - -Save ghost -== Sačuvaj duha - -Gameplay -== Igra - -Size -== Veličina - -Show text entities -== Prikaži tekst entiti-e - -Show others (own team only) -== Prikaži ostale (samo vlastiti tim) - -Show quads -== Prikaži quads - -AntiPing: predict other players -== AntiPing: preduhitri ostale igrače - -AntiPing: predict weapons -== AntiPing: preduhitri oružja - -AntiPing: predict grenade paths -== AntiPing: preduhitri putanje granate - -Show other players' hook collision lines -== Prikaži linije sudaranja lanca od ostalih igrača - -Show other players' key presses -== Prikaži tipke koje ostali igrači pritiskaju - -Show tiles layers from BG map -== Prikaži slojeve od pozadinske mape - -DDNet %s is available: -== DDNet %s je dostupan: - -Updating… -== Ažuriranje… - -No updates available -== Nema dostupnih ažuriranja - -Check now -== Provjeri sad - -New random timeout code -== Novi nasumični timeout kod - -Time -== Vrijeme - -Follow -== Prati - -Frags -== Fragovi - -Deaths -== Smrti - -Suicides -== Samoubistva - -Ratio -== Omjer - -Net -== Net - -Best -== Najbolji - -1 new mention -== 1 novo označenje - -%d new mentions -== %d novih označenja - -9+ new mentions -== 9+ novih označenja - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not save downloaded map. Try manually deleting this file: %s -== - -Could not connect dummy -== - -Error playing demo -== - -Failed saving the replay! -== - -Saving settings to '%s' failed -== - -Error saving settings -== - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -The format of texture %s is not RGBA which will cause visual bugs. -== - -Preparing demo playback -== - -Connected -== - -Loading map file from storage -== - -Loading demo file from storage -== - -Some fonts could not be loaded. Check the local console for details. -== - -Initializing components -== - -Why are you slowmo replaying to read this? -== - -Initializing assets -== - -Initializing map logic -== - -Sending initial client info -== - -Warning -== - -Quitting. Please wait… -== - -Restarting. Please wait… -== - -Loading skin files -== - -Loading background map -== - -Searching -== - -Enter Username -== - -Enter Password -== - -NOT CONNECTED -== - -Match %d of %d -== - -No results -== - -Lines %d - %d (%s) -== - -Locked -== - -Following -== - -Loading commands… -== - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== - -Position: -== - -Speed: -== - -Angle: -== - -Multi-View -== - -[Spectating] -Following %s -== - -[Spectating Camera Mode Icon] -AUTO -== - -Team %d -== - -Some map images could not be loaded. Check the local console for details. -== - -Uploading map data to GPU -== - -Some map sounds could not be loaded. Check the local console for details. -== - -Loading menu themes -== - -Press a key… -== - -Settings -== - -Editor -== - -Main menu -== - -Rename folder -== - -Render complete -== - -Are you sure that you want to restart? -== - -Existing Player -== - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== - -Checking for existing player with your name -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -There's an unsaved map in the editor, you might want to save it. -== - -Continue anyway? -== - -A demo with this name already exists -== - -A folder with this name already exists -== - -Unable to rename the folder -== - -File '%s' already exists, do you want to overwrite it? -== - -(paused) -== - -Speed -== - -Videos directory -== - -Video was saved to '%s' -== - -Join Tutorial Server -== - -Skip Tutorial -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -Trying to determine UDP connectivity… -== - -UDP seems to be filtered. -== - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== - -No answer from server yet. -== - -%d/%d KiB (%.1f KiB/s) -== - -Getting game info -== - -Requesting to join the game -== - -Theme -== - -Loading menu images -== - -AFR -== - -ASI -== - -AUS -== - -EUR -== - -NA -== - -SA -== - -CHN -== - -Getting server list from master server -== - -No local servers found (ports %d-%d) -== - -Example of usage -== - -%d of %d servers -== - -%d of %d server -== - -%d players -== - -%d player -== - -Are you sure that you want to disconnect and switch to a different server? -== - -No login required -== - -Communities -== - -Copy info -== - -Leak IP -== - -No server selected -== - -Online friends (%d) -== - -Online clanmates (%d) -== - -[friends (server browser)] -Offline (%d) -== - -Click to select server. Double click to join your friend. -== - -Click to remove this player from your friends list. -== - -Click to remove this clan from your friends list. -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Are you sure that you want to remove the player '%s' from your friends list? -== - -Are you sure that you want to remove the clan '%s' from your friends list? -== - -Add Clan -== - -Server filter -== - -Friends -== - -Play the current demo -== - -Pause the current demo -== - -Stop the current demo -== - -Go back the specified duration -== - -[Demo player duration] -%d min. -== - -[Demo player duration] -%d sec. -== - -Change the skip duration -== - -Go forward the specified duration -== - -Go back one tick -== - -Go forward one tick -== - -Go back one marker -== - -Go forward one marker -== - -Slow down the demo -== - -Speed up the demo -== - -Mark the beginning of a cut (right click to reset) -== - -Mark the end of a cut (right click to reset) -== - -Export cut as a separate demo -== - -Close the demo player -== - -Toggle keyboard shortcuts -== - -Toggle auto camera -== - -Export demo cut -== - -Cut interval -== - -Cut length -== - -Render cut to video -== - -Please use a different filename -== - -Loading demo files -== - -All combined -== - -No demo selected -== - -Folder Link -== - -Created -== - -Netversion -== - -[Demo details] -map not included -== - -%.2f MiB -== - -%.2f KiB -== - -Demos directory -== - -Open the directory that contains the demo files -== - -Are you sure that you want to delete the folder '%s'? -== - -Are you sure that you want to delete the demo '%s'? -== - -Delete folder -== - -Unable to delete the demo '%s' -== - -Unable to delete the folder '%s'. Make sure it's empty first. -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Loading… -== - -Loading ghost files -== - -Ghosts directory -== - -Activate all -== - -Deactivate all -== - -Menu opened. Press Esc key again to close menu. -== - -Smooth Dynamic Camera -== - -Skip the main menu -== - -[Hertz] -Hz -== - -Save power by lowering refresh rate (higher input latency) -== - -Settings file -== - -Open the settings file -== - -Config directory -== - -Open the directory that contains the configuration and user files -== - -Themes directory -== - -Open the directory to add custom themes -== - -Max CSVs -== - -Dummy -== - -Player info change cooldown -== - -Download skins -== - -Download community skins -== - -Create a random skin -== - -Choose default eyes when joining a server -== - -Skin Database -== - -Skins directory -== - -Open the directory to add custom skins -== - -Chat command -== - -Enable controller -== - -Controller -== - -Ingame controller mode -== - -[Ingame controller mode] -Relative -== - -[Ingame controller mode] -Absolute -== - -Ingame controller sens. -== - -UI controller sens. -== - -Controller jitter tolerance -== - -No controller found. Plug in a controller. -== - -Axis -== - -Status -== - -Aim bind -== - -Mouse -== - -Ingame mouse sens. -== - -UI mouse sens. -== - -Reset controls -== - -Are you sure that you want to reset the controls to their defaults? -== - -Cancel -== - -Windowed -== - -Windowed borderless -== - -Windowed fullscreen -== - -Desktop fullscreen -== - -Allows maps to render with more detail -== - -Renderer -== - -default -== - -custom -== - -Graphics card -== - -auto -== - -Game sound volume -== - -Chat sound volume -== - -Background music volume -== - -Tee -== - -Appearance -== - -DDNet -== - -Assets -== - -HUD -== - -Name Plate -== - -Hook Collisions -== - -Info Messages -== - -Show health, shields and ammo -== - -Show local time always -== - -Authed name color in scoreboard -== - -Same clan color in scoreboard -== - -DDRace HUD -== - -Show client IDs (scoreboard, chat, spectator) -== - -Show DDRace HUD -== - -Show jumps indicator -== - -Show dummy actions -== - -Show player position -== - -Show player speed -== - -Show player target angle -== - -Show freeze bars -== - -Opacity of freeze bars inside freeze -== - -Always show chat -== - -Show only chat messages from team members -== - -Use old chat style -== - -Chat font size -== - -Chat width -== - -Preview -== - -Show friend mark (♥) in name plates -== - -Show client IDs in name plates -== - -Hook Strength -== - -Show hook strength icon indicator -== - -Show hook strength number indicator -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Show local player's key presses -== - -Size of key press icons -== - -Hook collision line -== - -Show own player's hook collision line -== - -Always show own player's hook collision line -== - -Always show other players' hook collision lines -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Hook collision line opacity -== - -Colors of the hook collision line, in case of a possible collision with: -== - -Your movements are not taken into account when calculating the line colors -== - -Nothing hookable -== - -Something hookable -== - -A Tee -== - -Preview 'Hook collisions' being pressed -== - -Show finish messages -== - -Normal Color -== - -Highlight Color -== - -Weapons -== - -Rifle Laser Outline Color -== - -Rifle Laser Inner Color -== - -Shotgun Laser Outline Color -== - -Shotgun Laser Inner Color -== - -Entities -== - -Door Laser Outline Color -== - -Door Laser Inner Color -== - -Freeze Laser Outline Color -== - -Freeze Laser Inner Color -== - -Set all to Rifle -== - -Enable ghost -== - -When you cross the start line, show a ghost tee replicating the movements of your best time -== - -Opacity -== - -Only save improvements -== - -Overlay entities -== - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== - -Quads are used for background decoration -== - -AntiPing -== - -Tries to predict other entities to give a feel of low latency -== - -Background -== - -Regular background color -== - -Entities background color -== - -Use current map as background -== - -Run on join -== - -Chat command (e.g. showall 1) -== - -Unregister protocol and file extensions -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Emoticons -== - -Particles -== - -Extras -== - -Loading assets -== - -Assets directory -== - -Open the directory to add custom assets -== - -Discord -== - -https://ddnet.org/discord -== - -https://wiki.ddnet.org/ -== - -Tutorial -== - -Can't find a Tutorial server -== - -Website -== - -Stop server -== - -Run server -== - -[Start menu] -Play -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Server executable not found, can't run server -== - -Loading race demo files -== - -Round %d/%d -== - -[Spectators] -%d others… -== - -Super -== - -[Team and size] -%d\n(%d/%d) -== - -Team %d (%d/%d) -== - -Manual -== - -Race -== - -Auto -== - -Replay -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Loading sound files -== - -FPM -== - -Spree -== - -Grabs -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -Moved ingame -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/brazilian_portuguese.txt b/data/languages/brazilian_portuguese.txt deleted file mode 100644 index 7cabdc9a4b..0000000000 --- a/data/languages/brazilian_portuguese.txt +++ /dev/null @@ -1,2106 +0,0 @@ -##### authors ##### -#originally created by: -# slinack -#modified by: -# yemDX 2010-05-29 17:22:42 -# yemDX 2010-05-30 02:51:34 -# slinack 2010-06-02 20:57:46 -# slinack 2011-05-02 18:24:12 -# Isadora 2011-05-09 17:26:02 -# slinack 2011-07-03 00:23:26 -# Ryomou Hentai Girl 2011-07-11 11:33:42 -# Isadora 2011-07-20 21:47:11 -# HeroiAmarelo 2012-08-01 15:50:18 -# Rafael Fontenelle 2014-11-21 13:31:06 -# Rafael Fontenelle 2016-12-12 13:31:06 -# Rafael Fontenelle 2017-09-06 09:51:00 -# Rafael Fontenelle 2018-07-04 07:38:13 -# Rafael Fontenelle 2019-04-06 16:49:12 -# Rafael Fontenelle 2019-12-18 02:47:58 -# Rafael Fontenelle 2020-08-27 12:38:07 -# Rafael Fontenelle 2020-09-20 11:00:38 -# Rafael Fontenelle 2021-02-13 07:00:00 -# Rafael Fontenelle 2021-06-10 12:00:00 -# pv 2022-06-01 20:44:00 -# Rafael Fontenelle 2022-09-17 23:23:00 -# Rafael Fontenelle 2022-10-25 11:22:00 -# Rafael Fontenelle 2023-01-09 10:33:00 -# Rafael Fontenelle 2023-03-26 19:11:00 -# Rafael Fontenelle 2023-07-07 12:11:00 -# Rafael Fontenelle 2023-08-14 14:17:00 -# Rafael Fontenelle 2023-09-25 14:23:00 -# Rafael Fontenelle 2023-12-05 17:01:00 -# Rafael Fontenelle 2024-03-02 16:20:00 -# Rafael Fontenelle 2024-04-30 14:52:00 -# Rafael Fontenelle 2024-06-11 22:43:00 -# Rafael Fontenelle 2024-07-17 12:04:00 -# Rafael Fontenelle 2024-09-02 16:02:00 -# Rafael Fontenelle 2024-09-30 07:53:00 -# Rafael Fontenelle 2024-11-01 17:21:00 -# Rafael Fontenelle 2025-01-03 07:05:00 -##### /authors ##### - -##### translated strings ##### - -%ds left -== Faltam %ds - -%i minute left -== Falta %i minuto - -%i minutes left -== Faltam %i minutos - -%i second left -== Falta %i segundo - -%i seconds left -== Faltam %i segundos - -%s wins! -== Vitória de %s! - -Abort -== Cancelar - -Add -== Adicionar - -Add Friend -== Adicionar amigo - -Address -== Endereço - -All -== Todos - -Are you sure that you want to quit? -== Você tem certeza que deseja sair? - -Automatically record demos -== Gravar demos automaticamente - -Automatically take game over screenshot -== Capturar tela final de jogo automaticamente - -Blue team -== Time azul - -Blue team wins! -== Vitória do time azul! - -Body -== Corpo - -Call vote -== Votar - -Change settings -== Mudar configurações - -Chat -== Chat - -Clan -== Clã - -Client -== Cliente - -Connecting to -== Conectando a - -Connection Problems… -== Problemas de conexão… - -Console -== Console - -Controls -== Controles - -Count players only -== Contar apenas jogadores - -Current -== Atual - -Custom colors -== Cores personalizadas - -Delete -== Deletar - -Delete demo -== Deletar demo - -Demofile: %s -== Demo: %s - -Demos -== Demos - -Disconnect -== Desconectar - -Disconnected -== Desconectado - -Downloading map -== Baixando mapa - -Draw! -== Empate! - -Dynamic Camera -== Câmera dinâmica - -Emoticon -== Emoticon - -Error -== Erro - -Error loading demo -== Erro ao carregar demo - -Favorite -== Favorito - -Favorites -== Favoritos - -Feet -== Pés - -Fire -== Atirar - -Folder -== Pasta - -Force vote -== Forçar votação - -Free-View -== Visualização livre - -Fullscreen -== Tela cheia - -Game -== Jogo - -Game info -== Jogo - -Game over -== Fim do jogo - -Game paused -== Game pausado - -Game type -== Tipo de jogo - -Game types: -== Tipos de jogo: - -General -== Geral - -Graphics -== Gráficos - -Grenade -== Granada - -Hammer -== Martelo - -Has people playing -== Há pessoas jogando - -High Detail -== Mostrar detalhes - -Hook -== Gancho (hook) - -Invalid Demo -== Demo inválida - -Join blue -== Azul - -Join red -== Vermelho - -Jump -== Pular - -Kick player -== Expulsar jogador - -Language -== Idioma - -MOTD -== MOTD - -Map -== Mapa - -Move left -== Esquerda - -Move player to spectators -== Mover jogador para observadores - -Move right -== Direita - -Movement -== Movimento - -Mute when not active -== Silenciar quando inativo - -Name -== Nome - -Next weapon -== Próxima arma - -Nickname -== Apelido - -No -== Não - -No password -== Sem senha - -No servers found -== Nenhum servidor encontrado - -No servers match your filter criteria -== Nenhum servidor corresponde aos critérios do filtro - -Ok -== Ok - -Parent Folder -== Diretório pai - -Password -== Senha - -Password incorrect -== Senha incorreta - -Ping -== Ping - -Pistol -== Pistola - -Play background music -== Tocar música de fundo - -Player -== Jogador - -Player country: -== País do jogador: - -Players -== Jogadores - -Please balance teams! -== Favor balancear os times! - -Prev. weapon -== Arma anterior - -Quit -== Sair - -Reason: -== Motivo: - -Red team -== Time vermelho - -Red team wins! -== Vitória do time vermelho! - -Remote console -== Console remoto - -Remove -== Deletar - -Remove friend -== Deletar amigo - -Rename demo -== Renomear demo - -Reset filter -== Redefinir filtro - -Score -== Pontos - -Score limit -== Pontuação máx. - -Scoreboard -== Placar - -Screenshot -== Capturar tela - -Server address: -== Endereço: - -Server info -== Servidor - -Server not full -== Servidor não lotado - -Shotgun -== Espingarda - -Show chat -== Mostrar chat - -Show friends only -== Mostrar apenas amigos - -Show ingame HUD -== Mostrar HUD do jogo - -Show name plates -== Mostrar apelidos - -Show only chat messages from friends -== Mostrar apenas mensagens de amigos - -Sound -== Som - -Sound error -== Erro de som - -Spectate -== Observar - -Spectate next -== Observar próximo - -Spectate previous -== Observar anterior - -Spectator mode -== Modo observador - -Spectators -== Observadores - -Stop record -== Parar a gravação - -Strict gametype filter -== Filtrar tipo de jogo exato - -Sudden Death -== Morte súbita - -Switch weapon on pickup -== Equipar arma ao pegá-la - -Team -== Time - -Team chat -== Chat do time - -The audio device couldn't be initialised. -== O dispositivo de áudio não pôde ser inicializado. - -The server is running a non-standard tuning on a pure game type. -== O servidor está rodando com modificações em um tipo de jogo oficial. - -Time limit -== Limite de tempo - -Time limit: %d min -== Limite de tempo: %d minutos - -Try again -== Tente de novo - -Type -== Tipo - -Unable to rename the demo -== Não foi possível renomear a demo - -Use sounds -== Usar sons - -Use team colors for name plates -== Usar cores dos times em apelidos - -V-Sync -== V-Sync - -Version -== Versão - -Vote command: -== Comando da votação: - -Vote description: -== Descrição da votação: - -Vote no -== Votar não - -Vote yes -== Votar sim - -Voting -== Votação - -Warmup -== Aquecimento - -Weapon -== Arma - -Yes -== Sim - -You must restart the game for all settings to take effect. -== Você deve reiniciar o jogo para que todas as alterações tenham efeito. - -Demo -== Demo - -Laser -== Laser - -Reset -== Redefinir - -Screen -== Tela - -New name: -== Novo jogo: - -Ratio -== Proporção - -Max demos -== Máximo de demos - -AntiPing -== AntiPing - -Show quads -== Mostrar quadrados - -Map sound volume -== Volume do som de mapas - -Join game -== Entrar no jogo - -Countries -== Países - -FSAA samples -== Amostras FSAA - -Reconnect in %d sec -== Reconectar em %d segundos - -Save ghost -== Salvar fantasma - -Show kill messages -== Mostrar mensagens de kill - -Show ghost -== Mostrar fantasma - -Clan plates size -== Tamanho da placa do clã - -No updates available -== Nenhuma atualização disponível - -Update now -== Atualizar agora - -Enable server message sound -== Habilitar som de mensagem do servidor - -Show votes window after voting -== Mostrar janela de votos após votar - -HUD -== HUD - -Show names in chat in team colors -== Mostrar nomes no chat com cores do time - -Enable team chat sound -== Habilitar som de chat do time - -Show other players' hook collision lines -== Mostra linhas de colisão dos outros jogadores - -Your skin -== Sua skin - -Deaths -== Mortes - -Enable game sounds -== Habilitar sons do jogo - -DDNet Client needs to be restarted to complete update! -== O Cliente DDNet precisa ser reiniciado para completar a atualização! - -Max Screenshots -== Máximo de capturas de tela - -Sound volume -== Volume do som - -Hue -== Matiz - -Show others -== Mostrar outros - -Gameplay -== Jogabilidade - -Restart -== Reiniciar - -Browser -== Navegar - -Follow -== Seguir - -%.2f KiB -== %.2f KiB - -Enable gun sound -== Habilitar som da arma - -Team message -== Mensagem do time - -Save the best demo of each race -== Salvar a melhor demo de cada corrida - -Show tiles layers from BG map -== Mostrar camadas de tiles de mapas - -Are you sure that you want to disconnect? -== Tem certeza que deseja se desconectar? - -Types -== Tipos - -Ghost -== Fantasma - -Remove chat -== Remover chat - -Check now -== Verificar agora - -Exclude -== Excluir - -DDNet Client updated! -== DDNet Client atualizado! - -Internet -== Internet - -Frags -== Frags - -AntiPing: predict other players -== AntiPing: prever outros jogadores - -Show other players' key presses -== Mostrar teclas pressionadas de outros jogadores - -Automatically take statboard screenshot -== Automaticamente capturar imagem do statboard - -System message -== Mensagem do sistema - -DDNet %s is available: -== DDNet %s está disponível: - -News -== Novidades - -Updating… -== Atualizando… - -Overlay entities -== Sobrepor entidades - -Messages -== Mensagens - -Sat. -== Sat. - -%.2f MiB -== %.2f MiB - -Refresh Rate -== Taxa de atualização - -New random timeout code -== Novo código aleatório de timeout - -Suicides -== Suicídios - -Record demo -== Gravar demo - -Net -== Net - -Miscellaneous -== Diversos - -Loading DDNet Client -== Carregando DDNet Client - -FPM -== FPM - -Default zoom -== Zoom padrão - -Show score -== Mostrar pontuação - -UI Color -== Cor da UI - -Best -== Melhor - -Enable regular chat sound -== Habilitar som comum de chat - -DDNet -== DDNet - -Normal message -== Mensagem normal - -AntiPing: predict grenade paths -== AntiPing: predizer caminho de granada - -Search -== Pesquisar - -LAN -== LAN - -Connecting dummy -== Conectando dummy - -Lht. -== Lumin. - -Show clan above name plates -== Mostrar clã sobre placas de nomes - -Enable highlighted chat sound -== Habilitar som realçado de chat - -Reset to defaults -== Redefinir valores - -AntiPing: predict weapons -== AntiPing: predizer armas - -Highlighted message -== Mensagem realçada - -Alpha -== Alfa - -Switch weapon when out of ammo -== Trocar de arma quando acabar munição - -Name plates size -== Tamanho de placas de nomes - -Grabs -== Pega - -Automatically create statboard csv -== Criar csv de statboard automaticamente - -Enable long pain sound (used when shooting in freeze) -== Habilitar som de dor longa (usado ao atirar em congelamento) - -Spree -== Sequência - -Max CSVs -== CSVs máx - -Friend message -== Mensagem de amigo - -Fat skins (DDFat) -== Skins Fat (DDFat) - -may cause delay -== pode causar atrasos - -Unfinished map -== Mapa não finalizado - -Deactivate -== Desativar - -Welcome to DDNet -== Bem-vindo ao DDNet - -Activate -== Ativar - -File already exists, do you want to overwrite it? -== O arquivo já existe, você deseja sobrescrevê-lo? - -Indicate map finish -== Indicar finalização de mapa - -Save -== Salvar - -Vanilla skins only -== Skins vanilla somente - -Date -== Data - -Show DDNet map finishes in server browser -== Mostrar finalizações de mapas do DDNet no navegador do servidor - -transmits your player name to info.ddnet.org -== transmite seu nome de jogador para info.ddnet.org - -Time -== Tempo - -Update failed! Check log… -== Atualização falhou! Verifique o log… - -1 new mention -== 1 nova menção - -Fetch Info -== Obter info - -%d new mentions -== %d novas menções - -Downloading %s: -== Baixar %s: - -Filter connecting players -== Filtrar jogadores se conectando - -DDNet %s is out! -== DDNet %s está disponível! - -Disconnect Dummy -== Desconectar dummy - -Are you sure that you want to disconnect your dummy? -== Você tem certeza que deseja desconectar seu dummy? - -Skin prefix -== Prefixo de skins - -Markers -== Marcadores - -Length -== Tamanho - -9+ new mentions -== 9+ novas menções - -Hammerfly dummy -== Hammerfly dummy - -Lock team -== Travar time - -Show entities -== Mostra entidades - -Kill -== Morrer - -Show text entities -== Mostrar entidades de texto - -Show all -== Mostrar todos - -Enable replays -== Habilitar reproduções - -Hook collisions -== Colisões de gancho - -Toggle dyncam -== Ativar dyncam - -Show HUD -== Mostrar HUD - -Dummy copy -== Copiar dummy - -Toggle dummy -== Ativar dummy - -Size -== Tamanho - -Statboard -== Statboard - -Toggle ghost -== Ativar fantasma - -Pause -== Pausar - -Converse -== Conversar - -Successfully saved the replay! -== A reprodução foi salva com sucesso - -Default length -== Duração padrão - -Replay feature is disabled! -== O Recurso de reprodução está desabilitado! - -Zoom in -== Zoom in - -Zoom out -== Zoom out - -Server best: -== Melhor servidor: - -Personal best: -== Melhor pessoal: - -Learn -== Aprender - -Render demo -== Renderizar demo - -Replace video -== Substituir vídeo - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork é um jogo online cooperativo cujo objetivo é você e seu grupo de tees chegarem à linha de chegada do mapa. Como um novato, você deve começar nos servidores Novice, que hospedam os mapas mais fáceis. Considere o ping para escolher um servidor próximo a você. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Use a tecla k para se matar (reiniciar), q para pausar e assistir outros jogadores. Veja as configurações para outras combinações de teclas. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== É recomendado que você verifique as configurações para ajustá-las ao seu gosto antes de entrar em um servidor. - -Please enter your nickname below. -== Por favor, insira seu apelido abaixo. - -Video name: -== Nome do vídeo - -Connect Dummy -== Conectar dummy - -Use high DPI -== Usar DPI alta - -Client message -== Mensagem do cliente - -Show others (own team only) -== Mostrar outras (próprio time apenas) - -Warning -== Atenção - -Speed -== Velocidade - -%d of %d servers -== %d de %d servidores - -%d of %d server -== %d de %d servidor - -%d players -== %d jogadores - -%d player -== %d jogador - -Skip the main menu -== Pular o menu principal - -Download skins -== Baixar skins - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/wiki/Main_Page/pt-br - -Website -== Site - -Settings -== Configurações - -Stop server -== Parar servidor - -Run server -== Iniciar servidor - -Server executable not found, can't run server -== Executável de servidor não encontrado, não foi possível executar o servidor - -Editor -== Editor - -[Start menu] -Play -== Jogar - -Theme -== Tema - -Demos directory -== Diretório de demos - -Themes directory -== Diretório de temas - -Skin Database -== Banco de Dados de Skins - -Skins directory -== Diretório de skins - -Background music volume -== Volume da música de fundo - -Assets -== Ativos - -Use current map as background -== Usar o mapa atual como plano de fundo - -Entities -== Entidades - -Emoticons -== Emoticons - -Particles -== Partículas - -Assets directory -== Diretório de ativos - -Manual -== Manual - -Race -== Corrida - -Auto -== Auto - -Replay -== Reproduzir - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Modo de depuração habilitado. Pressione Ctrl+Shift+D para desabilitar o modo de depuração. - -Existing Player -== Jogador existente - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Seu apelido "%s" já está sendo usado (%d pontos). Ainda assim, você deseja usá-lo? - -Checking for existing player with your name -== Conferindo por jogador existente com seu nome - -Smooth Dynamic Camera -== Câmera dinâmica suave - -Game sound volume -== Volume de som do jogo - -Chat sound volume -== Volume de som do chat - -Use old chat style -== Usar estilo de chat antigo - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== A largura da textura %s não é divisível por %d ou a altura não é divisível por %d, o que pode causar erros visuais. - -Dummy -== Dummy - -Preview -== Visualizar - -Background -== Plano de fundo - -AFR -== AFR - -ASI -== ASI - -AUS -== AUS - -EUR -== EUR - -NA -== NA - -SA -== SA - -CHN -== CHN - -Getting server list from master server -== Obtendo lista de servidores do servidor mestre - -Leak IP -== Vazar IP - -Chat command -== Comando de chat - -Windowed -== Janela - -Windowed borderless -== Janela sem borda - -Desktop fullscreen -== Tela cheia de desktop - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -Are you sure that you want to disconnect and switch to a different server? -== Tem certeza que deseja desconectar e trocar para um servidor diferente? - -Show local player's key presses -== Mostrar pressionamento de teclas de jogadores locais - -The format of texture %s is not RGBA which will cause visual bugs. -== O formato da textura %s não é RGBA, o que vai causar falhas visuais. - -Join Tutorial Server -== Entrar no servidor de tutorial - -Skip Tutorial -== Pular tutorial - -Settings file -== Arquivo de configurações - -Config directory -== Diretório de configurações - -Windowed fullscreen -== Tela cheia em janela - -Renderer -== Renderizador - -default -== padrão - -custom -== personalizado - -auto -== auto - -Run on join -== Executar ao entrar - -Chat command (e.g. showall 1) -== Comando de chat (p. ex., showall 1) - -Tutorial -== Tutorial - -Can't find a Tutorial server -== Não foi possível encontrar o servidor de tutorial - -Choose default eyes when joining a server -== Escolha os olhos padrões ao entrar em um servidor - -Allows maps to render with more detail -== Permite que os mapas renderizem com mais detalhes - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Ao cruzar a linha de partida, mostra um tee fantasma replicando os movimentos do seu melhor tempo - -Opacity -== Opacidade - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Ajustar a opacidade das entidades pertencentes a outros times, tais como tees e placas de identificação - -Quads are used for background decoration -== Quads são utilizados para decoração de fundo - -Tries to predict other entities to give a feel of low latency -== Tenta prever outras entidades para dar uma sensação de baixa latência - -Super -== Super - -Team %d -== Time %d - -Position: -== Posição: - -Speed: -== Velocidade: - -Angle: -== Ângulo: - -Trying to determine UDP connectivity… -== Tentando determinar conectividade UDP… - -UDP seems to be filtered. -== UDP parece estar filtrado. - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== Os endereços IP em UDP e TCP parecem estar diferentes. Tente desabilitar VPN, proxy e aceleradores de rede. - -No answer from server yet. -== Nenhuma resposta dos servidores ainda. - -Download community skins -== Baixar skins da comunidade - -Enable controller -== Habilitar controle - -[Ingame controller mode] -Relative -== Relativo - -[Ingame controller mode] -Absolute -== Absoluto - -Ingame controller mode -== Modo do controle no jogo - -Ingame controller sens. -== Sens. do controle no jogo - -UI controller sens. -== Sens do controle na UI - -Controller jitter tolerance -== Tolerância jitter do controle - -Status -== Status - -Aim bind -== Associação de mira - -Mouse -== Mouse - -Ingame mouse sens. -== Sens. do mouse no jogo - -UI mouse sens. -== Sens. do mouse na UI - -Controller -== Controle - -Show dummy actions -== Mostrar ações do dummy - -Show player position -== Mostrar posição do jogador - -Show player speed -== Mostrar velocidade do jogador - -Show player target angle -== Mostrar ângulo de alvo do jogador - -Show freeze bars -== Mostrar barra de congelamento - -Opacity of freeze bars inside freeze -== Opacidade das barras de congelamento durante o congelamento - -Normal Color -== Cor normal - -Highlight Color -== Cor realçada - -Extras -== Extras - -Preparing demo playback -== Preparando reprodução da demo - -Connected -== Conectado - -Loading map file from storage -== Carregando arquivo de mapa do armazenamento - -Why are you slowmo replaying to read this? -== Por que você está respondendo em câmera lenta para ler isso? - -Initializing components -== Inicializando componentes - -Initializing assets -== Inicializando ativos - -Initializing map logic -== Inicializando lógica de mapa - -Sending initial client info -== Enviando info iniciais do cliente - -Uploading map data to GPU -== Carregando dados de mapa para GPU - -Getting game info -== Obtendo info do jogo - -Requesting to join the game -== Solicitando entrada no jogo - -Loading menu images -== Carregando imagens de menu - -Loading demo files -== Carregando arquivos de demo - -Loading ghost files -== Carregando arquivos de fantasma - -Loading skin files -== Carregando arquivos de skins - -Appearance -== Aparência - -Name Plate -== Placa de nome - -Hook Collisions -== Colisões de gancho - -Show health, shields and ammo -== Mostrar saúde, escudos e munição - -DDRace HUD -== HUD do DDRace - -Show DDRace HUD -== Mostrar HUD do DDRace - -Show jumps indicator -== Mostrar indicador de pulos - -Hook collision line -== Linha de colisão do gancho - -Hook collision line opacity -== Opacidade da linha de colisão do gancho - -Colors of the hook collision line, in case of a possible collision with: -== Cores da linha de colisão do gancho, no caso de uma possível colisão com: - -Your movements are not taken into account when calculating the line colors -== Seus movimentos não são levados em conta ao calcular as cores de linha - -Nothing hookable -== Nada enganchável - -Something hookable -== Alguma coisa enganchável - -A Tee -== Um tee - -Loading assets -== Carregando ativos - -Loading race demo files -== Carregando arquivos de demo de corrida - -Loading sound files -== Carregando arquivos de som - -Play the current demo -== Assistir a demo atual - -Pause the current demo -== Pausar a demo atual - -Stop the current demo -== Parar a demo atual - -Slow down the demo -== Desacelerar a demo - -Speed up the demo -== Acelerar a demo - -Export cut as a separate demo -== Exportar corte como uma demo separada - -Toggle keyboard shortcuts -== Ativar atalhos de teclado - -Weapons -== Armas - -Rifle Laser Outline Color -== Cor de contorno do laser do rifle - -Rifle Laser Inner Color -== Cor de interna do laser do rifle - -Shotgun Laser Outline Color -== Cor contorno do laser da espingarda - -Shotgun Laser Inner Color -== Cor interna do laser do espingarda - -Door Laser Outline Color -== Cor de contorno do laser da porta - -Door Laser Inner Color -== Cor interna do laser do porta - -Freeze Laser Outline Color -== Cor de contorno do laser do congelamento - -Freeze Laser Inner Color -== Cor interna do laser do congelamento - -Menu opened. Press Esc key again to close menu. -== Menu aberto. Pressione Esc novamente para fechar o menu. - -Set all to Rifle -== Definir todos para rifle - -Cancel -== Cancelar - -File '%s' already exists, do you want to overwrite it? -== O arquivo "%s" já existe, tem certeza que deseja sobrescrevê-lo? - -Are you sure that you want to remove the player '%s' from your friends list? -== Tem certeza que deseja remover o jogador "%s" de sua lista de amigos? - -Are you sure that you want to remove the clan '%s' from your friends list? -== Tem certeza que deseja remover o clã "%s" da sua lista de amigos? - -Go back one tick -== Voltar um passo - -Go forward one tick -== Avançar um passo - -Go back one marker -== Voltar um marcador - -Go forward one marker -== Avançar um marcador - -Are you sure that you want to delete the demo '%s'? -== Tem certeza que deseja excluir a demo "%s"? - -Unable to delete the demo '%s' -== Não foi possível excluir a demo "%s" - -Reset controls -== Redefinir controles - -Are you sure that you want to reset the controls to their defaults? -== Tem certeza que deseja redefinir os controles para seu padrão? - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Falha durante a inicialização. Tente alterar gfx_backend para OpenGL ou Vulkan em settings_ddnet.cfg no diretório de configuração e tente novamente. - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== VRAM insuficiente. Tente remover ativos personalizados (skins, entidades, etc.), especialmente aqueles com alta resolução. - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== Ocorreu um erro durante a gravação do comando. Tente atualizar seus drivers de GPU. - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== Um comando de renderização falhou. Tente atualizar seus drivers de GPU. - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== O envio dos comandos de renderização falhou. Tente atualizar seus drivers de GPU. - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== Falha ao trocar framebuffers. Tente atualizar seus drivers de GPU. - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Erro desconhecido. Tente alterar gfx_backend para OpenGL ou Vulkan em settings_ddnet.cfg no diretório de configuração e tente novamente. - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== Não foi possível inicializar o backend gráfico fornecido, revertendo para o backend padrão agora. - -Open the directory that contains the demo files -== Abre o diretório que contém os arquivos de demonstração - -Save power by lowering refresh rate (higher input latency) -== Economiza energia diminuindo a taxa de atualização (maior latência de entrada) - -Open the settings file -== Abre o arquivo de configurações - -Open the directory that contains the configuration and user files -== Abre o diretório que contém os arquivos de configuração e do usuário - -Open the directory to add custom themes -== Abre o diretório para adicionar os temas personalizados - -Open the directory to add custom skins -== Abre o diretório para adicionar skins personalizadas - -No controller found. Plug in a controller. -== Nenhum controle encontrado. Conecte um controle. - -Unregister protocol and file extensions -== Protoloco e arquivos de extensões não registrados - -Open the directory to add custom assets -== Abre o diretório para adicionar os ativos personalizados - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== Não foi possível inicializar o backend de vídeo fornecido, isso provavelmente porque você não instalou o driver da placa de vídeo. - -Could not save downloaded map. Try manually deleting this file: %s -== Não foi possível salvar o mapa baixado. Tente excluir manualmente este arquivo: %s - -Copy info -== Copiar informação - -Create a random skin -== Criar uma skin aleatória - -A demo with this name already exists -== Uma demo com este nome já existe - -No server selected -== Nenhum serviço selecionado - -Online clanmates (%d) -== Colegas de clã online (%d) - -[friends (server browser)] -Offline (%d) -== Offline (%d) - -Click to select server. Double click to join your friend. -== Clique para selecionar o servidor. Clique duplo para se juntar a seus amigos. - -Click to remove this player from your friends list. -== Clique para remover este jogador de sua lista de amigos. - -Click to remove this clan from your friends list. -== Clique para remover este clã a partir de sua lista de amigos. - -Add Clan -== Adicionar clã - -Mark the beginning of a cut (right click to reset) -== Marcar o início de um corte (clique direito para redefinir) - -Mark the end of a cut (right click to reset) -== Marcar o fim de um corte (clique direito para redefinir) - -Close the demo player -== Fechar o reprodutor de demo - -Export demo cut -== Exportar corte de demo - -Cut interval -== Intervalo de corte - -Cut length -== Comprimento do corte - -Axis -== Eixo - -Graphics card -== Placa de vídeo - -Quitting. Please wait… -== Saindo. Por favor, aguarde… - -Restarting. Please wait… -== Reiniciando. Por favor, aguarde… - -Multi-View -== Multivisão - -Rename folder -== Renomear pasta - -A folder with this name already exists -== Uma pasta com este nome já existe - -Unable to rename the folder -== Não foi possível renomear a pasta - -(paused) -== (pausado) - -All combined -== Tudo combinado - -Folder Link -== Link da pasta - -Are you sure that you want to delete the folder '%s'? -== Tem certeza que você deseja excluir a pasta "%s"? - -Delete folder -== Excluir pasta - -Unable to delete the folder '%s'. Make sure it's empty first. -== Não foi possível excluir a pasta "%s". Certifique-se que ela esteja vazia primeiro. - -Moved ingame -== Movido no jogo - -Go back the specified duration -== Voltar na duração especificada - -[Demo player duration] -%d min. -== %d min. - -[Demo player duration] -%d sec. -== %d seg. - -Change the skip duration -== Alterar a duração de pulo - -Go forward the specified duration -== Avançar na duração especificada - -Render cut to video -== Renderizar corte do vídeo - -Error playing demo -== Erro ao reproduzir demo - -Some map images could not be loaded. Check the local console for details. -== Algumas imagens de mapa não puderam ser carregadas. Verifique o console local para detalhes. - -Some map sounds could not be loaded. Check the local console for details. -== Alguns sons de mapa não puderam ser carregadas. Verifique o console local para detalhes. - -Loading menu themes -== Carregando temas de menu - -Render complete -== Renderização concluída - -Videos directory -== Diretório de vídeos - -Video was saved to '%s' -== O vídeo foi salvo em "%s" - -No demo selected -== Nenhuma demo selecionada - -Created -== Criada - -Netversion -== Netversion - -[Demo details] -map not included -== mapa não incluído - -Ghosts directory -== Diretório de fantasmas - -Activate all -== Ativar tudo - -Deactivate all -== Desativar tudo - -Enable ghost -== Habilitar fantasma - -Only save improvements -== Salvar somente melhorias - -Regular background color -== Cor de fundo regular - -Entities background color -== Cor de fundo de entidades - -Saving settings to '%s' failed -== Falha ao salvar as configurações para '%s' - -Searching -== Pesquisando - -Enter Username -== Insira o nome de usuário - -Enter Password -== Insira a senha - -NOT CONNECTED -== NÃO CONECTADO - -Match %d of %d -== Correspondência %d de %d - -No results -== Nenhum resultado - -Lines %d - %d (%s) -== Linhas %d - %d (%s) - -Locked -== Bloqueado - -Following -== Seguindo - -Press a key… -== Pressione uma tecla… - -Are you sure that you want to restart? -== Tem certeza que você deseja reiniciar? - -There's an unsaved map in the editor, you might want to save it. -== Há um mapa não salvo no editor, você pode querer salvá-lo. - -Continue anyway? -== Continuar mesmo assim? - -Communities -== Comunidades - -Please use a different filename -== Por favor, use um nome de arquivo diferente - -Info Messages -== Mensagens de informação - -Show local time always -== Mostrar sempre o tempo local - -Chat font size -== Tamanho da fonte do chat - -Chat width -== Largura do chat - -Authed name color in scoreboard -== Cor do seu nome no placar - -Same clan color in scoreboard -== Cor do mesmo clã no placar - -Show finish messages -== Mostrar mensagens de finalização - -Failed saving the replay! -== Falha ao salvar a reprodução! - -Error saving settings -== Erro ao salvar as configurações - -Loading commands… -== Carregando comandos… - -Main menu -== Menu principal - -Server filter -== Filtro de servidores - -Friends -== Amigos - -Loading… -== Carregando… - -Loading demo file from storage -== Carregando arquivo de demo do armazenamento - -No login required -== Nenhum login exigido - -Player info change cooldown -== Tempo de resfriamento para alterações de informações de jogador - -Always show chat -== Sempre mostrar o chat - -Show friend mark (♥) in name plates -== Mostrar marca de amigo (♥) em apelidos - -Show hook strength icon indicator -== Mostrar indicador de ícone de força do gancho - -Show hook strength number indicator -== Mostrar indicador de número da força do gancho - -Show own player's hook collision line -== Mostrar a linha de colisão do gancho do próprio jogador - -Always show own player's hook collision line -== Sempre mostrar a linha de colisão do gancho do próprio jogador - -Always show other players' hook collision lines -== Sempre mostrar linhas de colisão do gancho dos outros jogadores - -%d/%d KiB (%.1f KiB/s) -== %d/%d KiB (%.1f KiB/s) - -Tee -== Tee - -Show only chat messages from team members -== Mostrar apenas mensagens de chat de membros do time - -[Spectating] -Following %s -== Seguindo %s - -Example of usage -== Exemplo de uso - -Round %d/%d -== Rodada %d/%d - -[Spectators] -%d others… -== %d outros… - -[Team and size] -%d\n(%d/%d) -== %d\n(%d/%d) - -Team %d (%d/%d) -== Time %d (%d/%d) - -https://wiki.ddnet.org/wiki/Mapping -== https://wiki.ddnet.org/wiki/Mapping - -Could not resolve connect address '%s'. See local console for details. -== Não foi possível resolver o endereço de conexão '%s'. Veja o console local para detalhes. - -Connect address error -== Erro no endereço de conexão - -Could not connect dummy -== Não foi possível conectar o dummy - -Dummy is not allowed on this server -== Dummy não é permitido neste servidor - -Please wait… -== Por favor, aguarde… - -Show client IDs (scoreboard, chat, spectator) -== Mostrar IDs de clientes (placar, chat, observador) - -Are you sure that you want to delete '%s'? -== Tem certeza que deseja excluir '%s'? - -Delete skin -== Excluir skin - -Basic -== Básico - -Custom -== Personalizado - -Unable to delete skin -== Não foi possível excluir skin - -Save skin -== Salvar skin - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== Tem certeza de que deseja salvar sua skin? Se uma skin com esse nome já existir, ela será substituída. - -Unable to save the skin -== Não foi possível salvar a skin - -Unable to save the skin with a reserved name -== Não foi possível salvar a skin com um nome reservado - -No local servers found (ports %d-%d) -== Nenhum servidor local encontrado (portas %d-%d) - -[Hertz] -Hz -== Hz - -[skins] -Body -== Corpo - -[skins] -Marking -== Marca - -[skins] -Decoration -== Decoração - -[skins] -Hands -== Mãos - -[skins] -Feet -== Pés - -[skins] -Eyes -== Olhos - -Some fonts could not be loaded. Check the local console for details. -== Algumas fontes não puderam ser carregadas. Verifique o console local para detalhes. - -Online friends (%d) -== Amigos online (%d) - -Add friends by entering their name below or by clicking their name in the player list. -== Adicione amigos digitando o nome deles abaixo ou clicando no nome deles na lista de jogadores. - -Add clanmates by entering their clan below and leaving the name blank. -== Adicione companheiros de clã inserindo o clã deles abaixo e deixando o nome em branco. - -Offline friends and clanmates will appear here. -== Amigos offline e companheiros de clã aparecerão aqui. - -Edit touch controls -== Editar controles de toque - -Close -== Fechar - -Save changes -== Salvar alterações - -Error saving touch controls -== Erro ao salvar controles de toque - -Could not save touch controls to file. See local console for details. -== Não foi possível salvar os controles de toque no arquivo. Veja o console local para detalhes. - -Unsaved changes -== Alterações não salvas - -Discard changes -== Descartar alterações - -Are you sure that you want to discard the current changes to the touch controls? -== Tem certeza de que deseja descartar as alterações atuais nos controles de toque? - -Are you sure that you want to reset the touch controls to default? -== Tem certeza de que deseja redefinir os controles de toque para o padrão? - -Import from clipboard -== Importar da área de transferência - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== Tem certeza de que deseja importar os controles de toque da área de transferência? Isso substituirá seus controles de toque atuais. - -Export to clipboard -== Exportar para área de transferência - -Direct touch input while ingame -== Entrada de toque direto durante o jogo - -[Direct touch input] -Disabled -== Desabilitada - -[Direct touch input] -Active action -== Ação ativa - -[Direct touch input] -Aim -== Mira - -[Direct touch input] -Fire -== Atirar - -[Direct touch input] -Hook -== Gancho - -Direct touch input while spectating -== Entrada de toque direto durante observação - -Error loading touch controls -== Erro ao carregar controles de toque - -Could not load touch controls from file. See local console for details. -== Não foi possível carregar controles de toque do arquivo. Veja o console local para detalhes. - -Could not load default touch controls from file. See local console for details. -== Não foi possível carregar controles de toque padrão do arquivo. Veja o console local para detalhes. - -Could not load touch controls from clipboard. See local console for details. -== Não foi possível carregar controles de toque da área de transferência. Veja o console local para detalhes. - -Width of your own hook collision line -== Largura de sua própria linha de colisão do gancho - -Width of others' hook collision line -== Largura de linha de colisão do gancho dos outros - -Preview 'Hook collisions' being pressed -== Prévia de 'colisões de gancho' sendo pressionada - -Aim -== Mira - -Active: Fire -== Ativo: atirar - -Active: Hook -== Ativo: Gancho - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== "%s" não é compatível com pnglite e não pode ser carregado por versões antigas do DDNet: - -Loading background map -== Carregando mapa de fundo - -[Spectating Camera Mode Icon] -AUTO -== AUTO - -Toggle auto camera -== Alternar câmera automática - -https://wiki.ddnet.org/wiki/Touch_controls -== https://wiki.ddnet.org/wiki/Touch_controls - -Show client IDs in name plates -== Mostrar IDs de clientes em placas de identificação - -Hook Strength -== Força do gancho - -Size of hook strength icon and number indicator -== Tamanho do ícone de força do gancho e indicador de número - -Key Presses -== Teclas pressionadas - -Size of key press icons -== Tamanho dos ícones de pressionamento de tecla - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== O servidor não pôde ser iniciado. Certifique-se de conceder a permissão de notificação nas configurações do aplicativo para que o servidor possa ser executado em segundo plano. diff --git a/data/languages/bulgarian.txt b/data/languages/bulgarian.txt deleted file mode 100644 index 5da4f5c7b3..0000000000 --- a/data/languages/bulgarian.txt +++ /dev/null @@ -1,2073 +0,0 @@ -##### authors ##### -#originally created by: -# Hip-Hop_Blond -#modified by: -# Hip-Hop_Blond 2011-07-15 01:19:13 -##### /authors ##### - -##### translated strings ##### - -%ds left -== остават %d сек. - -%i minute left -== %i минута остава - -%i minutes left -== %i минути остават - -%i second left -== %i секунда остава - -%i seconds left -== %i секунди остават - -%s wins! -== %s печели! - -Abort -== Прекрати - -Add -== Добави - -Add Friend -== Добави Приятел - -Address -== Адрес - -All -== Всички - -Are you sure that you want to quit? -== Сигурен ли си че искаш да напуснеш? - -Automatically record demos -== Записвай демота автоматично - -Automatically take game over screenshot -== Автоматична снимка в края на играта - -Blue team -== Отбор Сини - -Blue team wins! -== Отбор Сини печели! - -Body -== Тяло - -Call vote -== Гласувай - -Change settings -== Промени настройките - -Chat -== Чат - -Clan -== Клан - -Client -== Клиент - -Connecting to -== Свързвам се с - -Connection Problems… -== Проблеми с Връзката… - -Console -== Конзола - -Controls -== Контроли - -Count players only -== Брой на играчите - -Current -== Текущ - -Custom colors -== Произволни цветове - -Delete -== Изтрий - -Delete demo -== Изтрий демото - -Demofile: %s -== Демофайл: %s - -Demos -== Демота - -Disconnect -== Отпиши - -Disconnected -== Отписан - -Downloading map -== Свалям карта - -Draw! -== Равни! - -Dynamic Camera -== Динамична Камера - -Emoticon -== Емотикони - -Error -== Грешка - -Error loading demo -== Грешка при зареждане на демо файл - -Favorite -== Любим - -Favorites -== Любими - -Feet -== Крака - -Fire -== Стрелба - -Folder -== Папка - -Force vote -== Форсирай вот - -Free-View -== Свободен Изглед - -Fullscreen -== Цял Екран - -Game -== Игра - -Game info -== Игра - -Game over -== Играта свърши - -Game type -== Тип игра - -Game types: -== Тип иги: - -General -== Основни - -Graphics -== Графика - -Grenade -== Граната - -Hammer -== Чук - -Has people playing -== Не показвай празни - -High Detail -== Висока Детайлност - -Hook -== Верига - -Invalid Demo -== Невалидно Демо - -Join blue -== Влез син - -Join red -== Влез червен - -Jump -== Скок - -Kick player -== Кикни играч - -Language -== Език - -MOTD -== MOTD - -Map -== Карта - -Move left -== На ляво - -Move player to spectators -== Премести играча в наблюдатели - -Move right -== На дясно - -Movement -== Движение - -Mute when not active -== Изключвай звука когато играта е неактивна - -Name -== Име - -Next weapon -== След. оръжие - -Nickname -== Ник - -No -== Не - -No password -== Без парола - -No servers found -== Няма намерени сървъри - -No servers match your filter criteria -== Няма сървъри съответстващи твоите настройки - -Ok -== Добре - -Parent Folder -== Предишна Папка - -Password -== Парола - -Password incorrect -== Грешна Парола - -Ping -== Пинг - -Pistol -== Пистолет - -Play background music -== Пусни музика за фон - -Player -== Играч - -Player country: -== Страна на играча: - -Players -== Играчи - -Please balance teams! -== Моля уравновесете отборите! - -Prev. weapon -== Пред. оръжие - -Quit -== Изход - -Reason: -== Причина: - -Red team -== Отбор Червени - -Red team wins! -== Отбор Червени печели! - -Remote console -== Сървър Конзола - -Remove -== Премахни - -Remove friend -== Премахни приятел - -Rename demo -== Преименувай демо - -Reset filter -== Рестартирай филтрите - -Score -== Точки - -Score limit -== Лимит на точките - -Scoreboard -== Резултат - -Screenshot -== Снимка - -Server address: -== Адрес на сървъра: - -Server info -== Инфо - -Server not full -== Не показвай пълните - -Shotgun -== Пушка - -Show chat -== Показвай чата - -Show friends only -== Покажи приятели - -Show ingame HUD -== Показвай детайли в играта - -Show name plates -== Показвай лентите с имената - -Sound -== Звук - -Sound error -== Грешка в звука - -Spectate -== Наблюдавай - -Spectate next -== Наблюдавай след. - -Spectator mode -== Наблюдател - -Spectators -== Наблюдатели - -Stop record -== Спри записа - -Strict gametype filter -== Стриктен геймтайп филтър - -Sudden Death -== Внезапна Смърт - -Switch weapon on pickup -== Сменяй оръжието при взимане - -Team -== Отбор - -Team chat -== Отборен чат - -The audio device couldn't be initialised. -== Аудио устройството не може да бъде стартирано. - -The server is running a non-standard tuning on a pure game type. -== Този сървър използва нестандартен тунинг на стандартен тип ига. - -Time limit -== Лимит на Времето - -Time limit: %d min -== Лимит на Времето: %d мин - -Try again -== Опитай пак - -Type -== Тип - -Unable to rename the demo -== Преименуването неуспешно - -Use sounds -== Използвай Звук - -Use team colors for name plates -== Използвай цветове в лентите - -V-Sync -== Вертикална Синхронизация - -Version -== Версия - -Vote command: -== Вот команда: - -Vote description: -== Вот дефиниция: - -Vote no -== Против - -Vote yes -== За - -Voting -== Гласуване - -Warmup -== Разгрявка - -Weapon -== Оръжия - -Yes -== Да - -You must restart the game for all settings to take effect. -== Трябва да рестартираш играта за да поемат ефект новите настройки. - -##### needs translation ##### - -New name: -== Ново име: - -Sat. -== Контраст - -Miscellaneous -== Допълнителни - -Internet -== Интернет - -Max demos -== Максимум Демота - -News -== Новини - -Join game -== Влез - -FSAA samples -== FSAA семпли - -Sound volume -== Сила на звука - -Max Screenshots -== Максимум Снимки - -Laser -== Лазер - -Hue -== Оттенък - -Record demo -== Запиши демо - -Your skin -== Твоят модел - -Reset to defaults -== Рестартирай настройките - -Lht. -== Яркост - -UI Color -== Цвят на Интерфейса - -Alpha -== Прозрачност - -LAN -== ЛАН - -Name plates size -== Размер на лентата с имената - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not save downloaded map. Try manually deleting this file: %s -== - -Could not connect dummy -== - -Error playing demo -== - -Successfully saved the replay! -== - -Failed saving the replay! -== - -Saving settings to '%s' failed -== - -Error saving settings -== - -Replay feature is disabled! -== - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -The format of texture %s is not RGBA which will cause visual bugs. -== - -Preparing demo playback -== - -Connected -== - -Loading map file from storage -== - -Loading demo file from storage -== - -Some fonts could not be loaded. Check the local console for details. -== - -Loading DDNet Client -== - -Initializing components -== - -Why are you slowmo replaying to read this? -== - -Initializing assets -== - -Initializing map logic -== - -Sending initial client info -== - -Warning -== - -Quitting. Please wait… -== - -Restarting. Please wait… -== - -Loading skin files -== - -Search -== - -Loading background map -== - -Searching -== - -Enter Username -== - -Enter Password -== - -NOT CONNECTED -== - -Match %d of %d -== - -No results -== - -Lines %d - %d (%s) -== - -Locked -== - -Following -== - -Loading commands… -== - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== - -Game paused -== - -Position: -== - -Speed: -== - -Angle: -== - -Multi-View -== - -[Spectating] -Following %s -== - -[Spectating Camera Mode Icon] -AUTO -== - -Server best: -== - -Personal best: -== - -Team %d -== - -Some map images could not be loaded. Check the local console for details. -== - -Uploading map data to GPU -== - -Some map sounds could not be loaded. Check the local console for details. -== - -Loading menu themes -== - -Reset -== - -Press a key… -== - -Settings -== - -Editor -== - -Main menu -== - -Browser -== - -Ghost -== - -Reconnect in %d sec -== - -Rename folder -== - -Render demo -== - -Render complete -== - -Restart -== - -Are you sure that you want to restart? -== - -Welcome to DDNet -== - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== - -Please enter your nickname below. -== - -Existing Player -== - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== - -Checking for existing player with your name -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -There's an unsaved map in the editor, you might want to save it. -== - -Continue anyway? -== - -A demo with this name already exists -== - -A folder with this name already exists -== - -Unable to rename the folder -== - -File '%s' already exists, do you want to overwrite it? -== - -Replace video -== - -(paused) -== - -Speed -== - -Video name: -== - -Videos directory -== - -Video was saved to '%s' -== - -Join Tutorial Server -== - -Skip Tutorial -== - -Show DDNet map finishes in server browser -== - -transmits your player name to info.ddnet.org -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -Trying to determine UDP connectivity… -== - -UDP seems to be filtered. -== - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== - -No answer from server yet. -== - -%d/%d KiB (%.1f KiB/s) -== - -Getting game info -== - -Requesting to join the game -== - -Theme -== - -Loading menu images -== - -AFR -== - -ASI -== - -AUS -== - -EUR -== - -NA -== - -SA -== - -CHN -== - -Getting server list from master server -== - -No local servers found (ports %d-%d) -== - -Example of usage -== - -Exclude -== - -%d of %d servers -== - -%d of %d server -== - -%d players -== - -%d player -== - -Are you sure that you want to disconnect and switch to a different server? -== - -No login required -== - -Filter connecting players -== - -Indicate map finish -== - -Unfinished map -== - -Countries -== - -Types -== - -Communities -== - -Copy info -== - -Leak IP -== - -No server selected -== - -Online friends (%d) -== - -Online clanmates (%d) -== - -[friends (server browser)] -Offline (%d) -== - -Click to select server. Double click to join your friend. -== - -Click to remove this player from your friends list. -== - -Click to remove this clan from your friends list. -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Are you sure that you want to remove the player '%s' from your friends list? -== - -Are you sure that you want to remove the clan '%s' from your friends list? -== - -Add Clan -== - -Server filter -== - -Friends -== - -Play the current demo -== - -Pause the current demo -== - -Stop the current demo -== - -Go back the specified duration -== - -[Demo player duration] -%d min. -== - -[Demo player duration] -%d sec. -== - -Change the skip duration -== - -Go forward the specified duration -== - -Go back one tick -== - -Go forward one tick -== - -Go back one marker -== - -Go forward one marker -== - -Slow down the demo -== - -Speed up the demo -== - -Mark the beginning of a cut (right click to reset) -== - -Mark the end of a cut (right click to reset) -== - -Export cut as a separate demo -== - -Close the demo player -== - -Toggle keyboard shortcuts -== - -Toggle auto camera -== - -Export demo cut -== - -Cut interval -== - -Cut length -== - -Remove chat -== - -Render cut to video -== - -Please use a different filename -== - -File already exists, do you want to overwrite it? -== - -Loading demo files -== - -All combined -== - -Demo -== - -Length -== - -Date -== - -No demo selected -== - -Folder Link -== - -Created -== - -Markers -== - -Netversion -== - -Size -== - -[Demo details] -map not included -== - -%.2f MiB -== - -%.2f KiB -== - -Fetch Info -== - -Demos directory -== - -Open the directory that contains the demo files -== - -Are you sure that you want to delete the folder '%s'? -== - -Are you sure that you want to delete the demo '%s'? -== - -Delete folder -== - -Unable to delete the demo '%s' -== - -Unable to delete the folder '%s'. Make sure it's empty first. -== - -Are you sure that you want to disconnect? -== - -Connect Dummy -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Connecting dummy -== - -Disconnect Dummy -== - -Are you sure that you want to disconnect your dummy? -== - -Kill -== - -Pause -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Loading… -== - -Loading ghost files -== - -Time -== - -Ghosts directory -== - -Activate all -== - -Deactivate all -== - -Deactivate -== - -Activate -== - -Save -== - -Menu opened. Press Esc key again to close menu. -== - -Smooth Dynamic Camera -== - -Switch weapon when out of ammo -== - -Skip the main menu -== - -[Hertz] -Hz -== - -Refresh Rate -== - -Save power by lowering refresh rate (higher input latency) -== - -Settings file -== - -Open the settings file -== - -Config directory -== - -Open the directory that contains the configuration and user files -== - -Themes directory -== - -Open the directory to add custom themes -== - -Automatically take statboard screenshot -== - -Automatically create statboard csv -== - -Max CSVs -== - -Dummy -== - -Player info change cooldown -== - -Download skins -== - -Download community skins -== - -Vanilla skins only -== - -Fat skins (DDFat) -== - -Skin prefix -== - -Create a random skin -== - -Choose default eyes when joining a server -== - -Skin Database -== - -Skins directory -== - -Open the directory to add custom skins -== - -Hook collisions -== - -Zoom in -== - -Zoom out -== - -Default zoom -== - -Show others -== - -Show all -== - -Toggle dyncam -== - -Toggle ghost -== - -Converse -== - -Chat command -== - -Toggle dummy -== - -Dummy copy -== - -Hammerfly dummy -== - -Spectate previous -== - -Statboard -== - -Lock team -== - -Show entities -== - -Show HUD -== - -Enable controller -== - -Controller -== - -Ingame controller mode -== - -[Ingame controller mode] -Relative -== - -[Ingame controller mode] -Absolute -== - -Ingame controller sens. -== - -UI controller sens. -== - -Controller jitter tolerance -== - -No controller found. Plug in a controller. -== - -Axis -== - -Status -== - -Aim bind -== - -Mouse -== - -Ingame mouse sens. -== - -UI mouse sens. -== - -Reset controls -== - -Are you sure that you want to reset the controls to their defaults? -== - -Cancel -== - -Windowed -== - -Windowed borderless -== - -Windowed fullscreen -== - -Desktop fullscreen -== - -Screen -== - -may cause delay -== - -Allows maps to render with more detail -== - -Use high DPI -== - -Renderer -== - -default -== - -custom -== - -Graphics card -== - -auto -== - -Enable game sounds -== - -Enable gun sound -== - -Enable long pain sound (used when shooting in freeze) -== - -Enable server message sound -== - -Enable regular chat sound -== - -Enable team chat sound -== - -Enable highlighted chat sound -== - -Game sound volume -== - -Chat sound volume -== - -Map sound volume -== - -Background music volume -== - -Tee -== - -Appearance -== - -DDNet -== - -Assets -== - -DDNet Client needs to be restarted to complete update! -== - -HUD -== - -Name Plate -== - -Hook Collisions -== - -Info Messages -== - -Show health, shields and ammo -== - -Show score -== - -Show local time always -== - -Show votes window after voting -== - -Authed name color in scoreboard -== - -Same clan color in scoreboard -== - -DDRace HUD -== - -Show client IDs (scoreboard, chat, spectator) -== - -Show DDRace HUD -== - -Show jumps indicator -== - -Show dummy actions -== - -Show player position -== - -Show player speed -== - -Show player target angle -== - -Show freeze bars -== - -Opacity of freeze bars inside freeze -== - -Always show chat -== - -Show names in chat in team colors -== - -Show only chat messages from friends -== - -Show only chat messages from team members -== - -Use old chat style -== - -Chat font size -== - -Chat width -== - -Messages -== - -System message -== - -Highlighted message -== - -Team message -== - -Friend message -== - -Normal message -== - -Client message -== - -Preview -== - -Show clan above name plates -== - -Clan plates size -== - -Show friend mark (♥) in name plates -== - -Show client IDs in name plates -== - -Hook Strength -== - -Show hook strength icon indicator -== - -Show hook strength number indicator -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Show other players' key presses -== - -Show local player's key presses -== - -Size of key press icons -== - -Hook collision line -== - -Show own player's hook collision line -== - -Always show own player's hook collision line -== - -Show other players' hook collision lines -== - -Always show other players' hook collision lines -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Hook collision line opacity -== - -Colors of the hook collision line, in case of a possible collision with: -== - -Your movements are not taken into account when calculating the line colors -== - -Nothing hookable -== - -Something hookable -== - -A Tee -== - -Preview 'Hook collisions' being pressed -== - -Show kill messages -== - -Show finish messages -== - -Normal Color -== - -Highlight Color -== - -Weapons -== - -Rifle Laser Outline Color -== - -Rifle Laser Inner Color -== - -Shotgun Laser Outline Color -== - -Shotgun Laser Inner Color -== - -Entities -== - -Door Laser Outline Color -== - -Door Laser Inner Color -== - -Freeze Laser Outline Color -== - -Freeze Laser Inner Color -== - -Set all to Rifle -== - -Save the best demo of each race -== - -Enable replays -== - -Default length -== - -Enable ghost -== - -When you cross the start line, show a ghost tee replicating the movements of your best time -== - -Show ghost -== - -Opacity -== - -Save ghost -== - -Only save improvements -== - -Gameplay -== - -Overlay entities -== - -Show text entities -== - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== - -Show others (own team only) -== - -Show quads -== - -Quads are used for background decoration -== - -AntiPing -== - -Tries to predict other entities to give a feel of low latency -== - -AntiPing: predict other players -== - -AntiPing: predict weapons -== - -AntiPing: predict grenade paths -== - -Background -== - -Regular background color -== - -Entities background color -== - -Use current map as background -== - -Show tiles layers from BG map -== - -New random timeout code -== - -Run on join -== - -Chat command (e.g. showall 1) -== - -Unregister protocol and file extensions -== - -DDNet %s is available: -== - -Update now -== - -Updating… -== - -DDNet Client updated! -== - -No updates available -== - -Check now -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Emoticons -== - -Particles -== - -Extras -== - -Loading assets -== - -Assets directory -== - -Open the directory to add custom assets -== - -Discord -== - -https://ddnet.org/discord -== - -Learn -== - -https://wiki.ddnet.org/ -== - -Tutorial -== - -Can't find a Tutorial server -== - -Website -== - -Stop server -== - -Run server -== - -[Start menu] -Play -== - -DDNet %s is out! -== - -Downloading %s: -== - -Update failed! Check log… -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Server executable not found, can't run server -== - -Loading race demo files -== - -Round %d/%d -== - -[Spectators] -%d others… -== - -Super -== - -[Team and size] -%d\n(%d/%d) -== - -Team %d (%d/%d) -== - -Manual -== - -Race -== - -Auto -== - -Replay -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Loading sound files -== - -Follow -== - -Frags -== - -Deaths -== - -Suicides -== - -Ratio -== - -Net -== - -FPM -== - -Spree -== - -Best -== - -Grabs -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -1 new mention -== - -%d new mentions -== - -9+ new mentions -== - -Moved ingame -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/catalan.txt b/data/languages/catalan.txt deleted file mode 100644 index 2074d272b9..0000000000 --- a/data/languages/catalan.txt +++ /dev/null @@ -1,2066 +0,0 @@ -##### authors ##### -#translated to catalan by: -# Ryozuki -##### translated strings ##### - -%ds left -== %ds restants - -%i minute left -== %i minuts restants - -%i minutes left -== %i minuts restants - -%i second left -== %i segons restants - -%i seconds left -== %i segons restants - -%s wins! -== ¡%s ha guanyat! - -Abort -== Cancelar - -Add -== Afegir - -Add Friend -== Afegir amic - -Address -== Direcció - -All -== Tots - -Are you sure that you want to quit? -== Estàs segur que vols sortir? - -Automatically record demos -== Gravar repeticions automàticament - -Automatically take game over screenshot -== Fer una foto de la pantalla al final de la partida automàticament - -Blue team -== Equip blau - -Blue team wins! -== El equip blau ha guanyat! - -Body -== Cos - -Call vote -== Votar - -Change settings -== Canviar la configuració - -Chat -== Conversació - -Clan -== Clan - -Client -== Client - -Connecting to -== T'estàs unint a - -Connection Problems… -== Problemes de connexió… - -Console -== Consola - -Controls -== Controls - -Count players only -== Només contar jugadors - -Current -== Actual - -Custom colors -== Colors personalitzats - -Delete -== Esborrar - -Delete demo -== Esborrar repetició - -Demofile: %s -== Fitxer de la repetició: %s - -Demos -== Repeticions - -Disconnect -== Desconnectar - -Disconnected -== Desconnectat - -Downloading map -== Descarregant mapa - -Draw! -== Empat! - -Dynamic Camera -== Càmera dinàmica - -Emoticon -== Emoticó - -Error -== Error - -Error loading demo -== Error en carregar la repetició - -Favorite -== Preferit - -Favorites -== Preferits -Feet -== Peus - -Fire -== Disparar - -Folder -== Carpeta - -Force vote -== Forçar la votació - -Free-View -== Vista lliure - -Fullscreen -== Pantalla completa - -Game -== Joc - -Game info -== Informació de la partida - -Game over -== Fi de la partida - -Game paused -== Joc en pausa - -Game type -== Mode de joc - -Game types: -== Modes de joc: - -General -== General - -Graphics -== Gràfics - -Grenade -== Granada - -Hammer -== Martell - -Has people playing -== Hi ha gent jugant - -High Detail -== Més detalls - -Hook -== Ganxo - -Invalid Demo -== Repetició invàlida - -Join blue -== Unir-se al blau - -Join red -== Unir-se al vermell - -Jump -== Saltar - -Kick player -== Expulsar el jugador - -Language -== Idioma - -MOTD -== MOTD - -Map -== Mapa - -Move left -== Moure's a l'esquerra - -Move player to spectators -== Moure el jugador als espectadors - -Move right -== Moure's a la dreta - -Movement -== Moviment - -Mute when not active -== Silenciar si no està actiu - -Name -== Nom - -Next weapon -== Arma següent - -Nickname -== Nom - -No -== No - -No password -== Sense contrasenya - -No servers found -== Cap servidor trobat - -No servers match your filter criteria -== Cap servidor correspon als criteris de filtratge - -Ok -== Ok - -Parent Folder -== Carpeta principal - -Password -== Contrasenya - -Password incorrect -== Contrasenya incorrecta - -Ping -== Ping - -Pistol -== Pistola - -Play background music -== Reproduir música de fons - -Player -== Jugador - -Player country: -== País del jugador - -Players -== Jugadors - -Please balance teams! -== Si us plau, equilibreu els equips! - -Prev. weapon -== Arma anterior - -Quit -== Sortir - -Reason: -== Motiu: - -Red team -== Equip vermell - -Red team wins! -== El equip vermell guanya! - -Remote console -== Consola remota - -Remove -== Eliminar - -Remove friend -== Eliminar amic - -Rename demo -== Canviar de nom la repetició - -Reset filter -== Reiniciar el filtre - -Score -== Punts - -Score limit -== Límit de punts - -Scoreboard -== Puntuació - -Screenshot -== Foto de pantalla - -Server address: -== IP del servidor: - -Server info -== Servidor - -Server not full -== Servidor sense omplir - -Shotgun -== Escopeta - -Show chat -== Veure el xat - -Show friends only -== Només veure els amics - -Show ingame HUD -== Veure el HUD en el joc - -Show name plates -== Veure els noms - -Show only chat messages from friends -== Rebre només missatges d'amics - -Sound -== So - -Sound error -== Error de so - -Spectate -== Asistir - -Spectate next -== Observar el següent - -Spectate previous -== Observar l'anterior - -Spectator mode -== Mode espectador - -Spectators -== Espectadors - -Stop record -== Parar la grabació - -Strict gametype filter -== Filtratge estricte del mode de joc - -Sudden Death -== Mort sobtada - -Switch weapon on pickup -== Canviar d'arma a l'agafar-la - -Team -== Equip - -Team chat -== En equip - -The audio device couldn't be initialised. -== El dispositiu d'àudio no pot ser inicialitzat. - -The server is running a non-standard tuning on a pure game type. -== El servidor està utilitzant una modificació en un mode de joc estàndard - -Time limit -== Temps límit - -Time limit: %d min -== Temps límit: %d minuts - -Try again -== Intenteu de nou - -Type -== Tipus - -Unable to rename the demo -== No es pot reanomenar la repetició - -Use sounds -== Utilitzar sons - -Use team colors for name plates -== Fer servir els colors dels equips en els noms - -V-Sync -== V-Sync - -Version -== Versió - -Vote command: -== Ordre per la votació: - -Vote description: -== Descripció de la votació: - -Vote no -== Votar no - -Vote yes -== Votar sí - -Voting -== Votació - -Warmup -== Escalfament - -Weapon -== Arma - -Yes -== Sí - -You must restart the game for all settings to take effect. -== Has de reiniciar el joc perquè els canvis tinguin efecte. - -Demo -== Repetició - -Laser -== Làser - -Reset -== Reiniciat - -Screen -== Pantalla - -New name: -== Nom nou: - -Sat. -== Saturació - -Miscellaneous -== Miscel·lània - -Internet -== Internet - -Max demos -== Número màxim de repeticions - -News -== Notícies - -Join game -== Unir-se - -FSAA samples -== Mostres FSAA - -Sound volume -== Volum del so - -Max Screenshots -== Número màxim de captures - -Hue -== Tonalitat - -Record demo -== Grabar repetició - -Your skin -== La teva skin - -Reset to defaults -== Restaurar als valors predeterminats - -Lht. -== Lluminositat - -UI Color -== Color del menú - -Alpha -== Alfa - -LAN -== LAN - -Name plates size -== Mida de la lletra dels noms - -Ratio -== Proporció - -AntiPing -== AntiPing - -Show quads -== Mostrar els quads - -Map sound volume -== Volum del so del mapa - -Countries -== Països - -Reconnect in %d sec -== Reconnectar-se en %d segons - -Grabs -== Agafa - -Show kill messages -== Mostrar missatges de mort - -Show ghost -== Mostrar el fantasma - -DDNet -== DDNet - -No updates available -== No hi ha actualitzacions disponibles - -Enable server message sound -== Activa el so del missatge del servidor - -Show votes window after voting -== Mostrar la finestra de votacions després de votar - -HUD -== HUD - -Enable team chat sound -== Activar el so del xat d'equip - -Show other players' hook collision lines -== Mostra les línies de col·lisió d'altres jugadors - -Deaths -== Morts - -Enable game sounds -== Activar sons del joc - -DDNet Client needs to be restarted to complete update! -== El client DDNet necessita reiniciar-se per completar l'actualització! - -Show others -== Mostrar altres - -Gameplay -== Joc - -Restart -== Reiniciar - -Browser -== Navegador - -Follow -== Seguir - -Enable gun sound -== Activar el so de la pistola - -Team message -== Missatge d'equip - -Automatically create statboard csv -== Crear un fitxer csv d'estadístiques automàticament - -Save the best demo of each race -== Guardar la millor demo de cada carrera - -Show tiles layers from BG map -== Mostrar les capes de rajoles del mapa de fons - -Are you sure that you want to disconnect? -== Estàs segur que et vols desconnectar? - -Types -== Tipus - -Ghost -== Fantasma - -Remove chat -== Eliminar el xat - -Check now -== Comprova ara - -Frags -== Morts causades - -AntiPing: predict other players -== AntiPing: Predir altres jugadors - -Show other players' key presses -== Mostrar les tecles premudes d'altres jugadors - -Automatically take statboard screenshot -== Fer una foto de la taula d'estadístiques automàticament - -System message -== Missatge del sistema - -Enable long pain sound (used when shooting in freeze) -== Activar el so de dolor llarg (quan dispares congelat) - -DDNet %s is available: -== DDNet %s està disponible: - -Updating… -== Actualitzant… - -Overlay entities -== Entitats superposades - -Messages -== Missatges - -%.2f MiB -== %.2f MiB - -Refresh Rate -== Freqüència d'actualització - -New random timeout code -== Nou codi aleatori pel timeout - -Suicides -== Suïcidis - -Net -== Net - -Loading DDNet Client -== Carregant el client DDNet - -FPM -== FPM - -Default zoom -== Zoom predeterminat - -Show score -== Mostrar la puntuació - -Spree -== Spree - -Max CSVs -== CSVs màxims - -%.2f KiB -== %.2f KiB - -Best -== Millor - -Enable regular chat sound -== Activar el so de xat regular - -Normal message -== Missatge normal - -Search -== Buscar - -Connecting dummy -== Connectant el maniquí - -Clan plates size -== Mida del clan - -Update now -== Actualitza ara - -Show clan above name plates -== Mostrar el clan a dalt dels noms - -Save ghost -== Guardar el fantasma - -Exclude -== Excloure - -Enable highlighted chat sound -== Activar el so del xat destacat - -AntiPing: predict weapons -== AntiPing: predir armes - -DDNet Client updated! -== El client DDNet s'ha actualitzat! - -Highlighted message -== Missatge destacat - -Switch weapon when out of ammo -== Canviar d'arma en quedar-se sense munició - -AntiPing: predict grenade paths -== AntiPing: predir el camí de la granada - -Friend message -== Missatge d'amics - -Fat skins (DDFat) -== Skins Groses (DDFat) - -Show names in chat in team colors -== Mostrar els noms en el xat amb colors - -may cause delay -== pot causar retràs - -Unfinished map -== Mapa inacabat - -Deactivate -== Desactivar - -Welcome to DDNet -== Benvingut a DDNet - -Activate -== Activar - -File already exists, do you want to overwrite it? -== L'arxiu ja existeix, vols reescriure'l? - -Indicate map finish -== Indicar la finalització d'un mapa - -Save -== Guardar - -Vanilla skins only -== Només Vanilla skins only - -Date -== Data - -Show DDNet map finishes in server browser -== Mostrar finalitzacions de mapes en el buscador de servidors - -transmits your player name to info.ddnet.org -== retransmet el teu nom de jugar a info.ddnet.org - -Successfully saved the replay! -== S'ha guardat la repetició correctament! - -Replay feature is disabled! -== La funció de reproducció està desactivada. - -Server best: -== Millor del servidor: - -Personal best: -== Millor personal: - -Learn -== Aprendre - -Render demo -== Renderitzar demo - -Replace video -== Substituir el video - -Disconnect Dummy -== Desconnectar dummy - -Are you sure that you want to disconnect your dummy? -== Estàs segur que vols desconnectar el teu dummy? - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork és un videojoc cooperatiu en línia on l'objectiu és que tu i el teu grup de tees arribin a la meta final del mapa. Com a nouvingut hauries de començar en els servidors Novice, que contenen els mapes més fàcils. Considera el teu ping per escollir un servidor a prop teu. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== És recomanat que miris la configuració i ho canviïs al teu gust abans d'entrar a un servidor. - -Please enter your nickname below. -== Si us plau, escriu el teu nom a sota. - -Video name: -== Nom del vídeo: - -Filter connecting players -== Filtrar els jugadors connectant-se - -DDNet %s is out! -== DDNet %s ja està disponible! - -Downloading %s: -== Descarregant %s: - -Update failed! Check log… -== L'actualització ha fallat! Mira el registre… - -Markers -== Marques - -Length -== Llargada - -Fetch Info -== Obtenir informació - -Connect Dummy -== Connectar el dummy - -Skin prefix -== Prefix de la skin - -Hook collisions -== Col·lisions del ganxo - -Pause -== Pausa - -Kill -== Matar - -Zoom in -== Fer zoom - -Zoom out -== Disminuir zoom - -Show all -== Mostrar tots - -Toggle dyncam -== Commutar dyncam - -Toggle dummy -== Commutar dummy - -Toggle ghost -== Commutar fantasma - -Dummy copy -== Dummy copia - -Hammerfly dummy -== Dummy hammerfly - -Converse -== Conversar - -Statboard -== Taula d'estadístiques - -Lock team -== Bloquejar l'equip - -Show entities -== Mostrar entitats - -Show HUD -== Mostrar el HUD - -Use high DPI -== Fer servir alt DPI - -Default length -== Llargada predeterminada - -Enable replays -== Activar les repeticions - -Size -== Mida - -Show text entities -== Mostrar entitats de text - -Show others (own team only) -== Mostar altres (només de l'equip) - -Time -== Temps - -1 new mention -== 1 nova menció - -%d new mentions -== %d noves mencions - -9+ new mentions -== 9+ noves mencions - -Manual -== Manual - -Race -== Carrera - -Auto -== Auto - -Replay -== Repetició - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== La mida de la textura %s no es divisible per %d, o l'altura no es divisible per %d, el qual pot resultar en errors visuals. - -Warning -== Advertència - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Mode de depuració activat. Utilitza Ctrl+Shift+D per desactivar-lo. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Utilitza la tecla k per morir (reiniciar). Veure la configuració per més key binds. - -Existing Player -== Jugador Existent - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== El teu sobrenom '%s' ja esta en ús (té %d punts). Vols continuar utilitzant-lo? - -Checking for existing player with your name -== Comprovant si existeix un jugador amb el teu nom - -Are you sure that you want to disconnect and switch to a different server? -== Estàs segur que et vols desconnectar i entrar a un servidor diferent? - -Speed -== Velocitat - -Theme -== Tema - -Getting server list from master server -== Obtenint la llista de servidors - -%d of %d servers -== %d de %d servidors - -%d of %d server -== %d de %d servidor - -%d players -== %d jugadors - -%d player -== %d jugador - -Leak IP -== Fer la teva ip pública - -Demos directory -== Directori de demos - -Smooth Dynamic Camera -== Camera dinàmica suau - -Skip the main menu -== Saltar el menu principal - -Themes directory -== Directori de temes - -Download skins -== Descargar skins - -Skin Database -== Base de dades de skins - -Skins directory -== Directori de skins - -Chat command -== Comanda de xat - -Dummy -== Dummy - -Windowed -== Finestra - -Windowed borderless -== Finestra sense vores - -Desktop fullscreen -== Pantalla completa d'escriptori - -Game sound volume -== Volum del so del joc - -Chat sound volume -== Volum del so de xat - -Background music volume -== Volum de música de fons - -Assets -== Arxius - -Use old chat style -== Utilitzar l'estil antic del xat - -Client message -== Missatge del client - -Preview -== Vista prèvia - -Show local player's key presses -== Mostrar les tecles premudes del jugador local - -Background -== Fons - -Use current map as background -== Utilitzar el mapa actual com a fons - -Entities -== Entitats - -Emoticons -== Emoticons - -Particles -== Partícules - -Assets directory -== Directori d'arxius del joc - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/wiki/Main_Page/ca - -Website -== Página Web - -Settings -== Configuració - -Stop server -== Apagar servidor - -Run server -== Engegar servidor - -Server executable not found, can't run server -== L'executable del servidor no s'ha trobat, no es pot engegar el servidor - -Editor -== Editor - -[Start menu] -Play -== Jugar - -AFR -== AFR - -ASI -== ASI - -AUS -== AUS - -EUR -== EUR - -NA -== NA - -SA -== SA - -CHN -== CHN - -The format of texture %s is not RGBA which will cause visual bugs. -== El format de la textura %s no és RGBA i pot causar errors visuals. - -Join Tutorial Server -== Entrar al tutorial - -Skip Tutorial -== Saltar el Tutorial - -Settings file -== Arxiu de configuració - -Config directory -== Directori amb la configuració - -Windowed fullscreen -== Windowed fullscreen - -Renderer -== Renderitzador - -default -== predeterminat - -custom -== personalitzat - -auto -== auto - -Run on join -== Córrer en unir-se - -Chat command (e.g. showall 1) -== Commanda del xat (e.g showall 1) - -Tutorial -== Tutorial - -Can't find a Tutorial server -== No s'ha pogut trobar un servidor del tutorial - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not save downloaded map. Try manually deleting this file: %s -== - -Could not connect dummy -== - -Error playing demo -== - -Failed saving the replay! -== - -Saving settings to '%s' failed -== - -Error saving settings -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Preparing demo playback -== - -Connected -== - -Loading map file from storage -== - -Loading demo file from storage -== - -Some fonts could not be loaded. Check the local console for details. -== - -Initializing components -== - -Why are you slowmo replaying to read this? -== - -Initializing assets -== - -Initializing map logic -== - -Sending initial client info -== - -Quitting. Please wait… -== - -Restarting. Please wait… -== - -Loading skin files -== - -Loading background map -== - -Searching -== - -Enter Username -== - -Enter Password -== - -NOT CONNECTED -== - -Match %d of %d -== - -No results -== - -Lines %d - %d (%s) -== - -Locked -== - -Following -== - -Loading commands… -== - -Position: -== - -Speed: -== - -Angle: -== - -Multi-View -== - -[Spectating] -Following %s -== - -[Spectating Camera Mode Icon] -AUTO -== - -Team %d -== - -Some map images could not be loaded. Check the local console for details. -== - -Uploading map data to GPU -== - -Some map sounds could not be loaded. Check the local console for details. -== - -Loading menu themes -== - -Press a key… -== - -Main menu -== - -Rename folder -== - -Render complete -== - -Are you sure that you want to restart? -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -There's an unsaved map in the editor, you might want to save it. -== - -Continue anyway? -== - -A demo with this name already exists -== - -A folder with this name already exists -== - -Unable to rename the folder -== - -File '%s' already exists, do you want to overwrite it? -== - -(paused) -== - -Videos directory -== - -Video was saved to '%s' -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -Trying to determine UDP connectivity… -== - -UDP seems to be filtered. -== - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== - -No answer from server yet. -== - -%d/%d KiB (%.1f KiB/s) -== - -Getting game info -== - -Requesting to join the game -== - -Loading menu images -== - -No local servers found (ports %d-%d) -== - -Example of usage -== - -No login required -== - -Communities -== - -Copy info -== - -No server selected -== - -Online friends (%d) -== - -Online clanmates (%d) -== - -[friends (server browser)] -Offline (%d) -== - -Click to select server. Double click to join your friend. -== - -Click to remove this player from your friends list. -== - -Click to remove this clan from your friends list. -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Are you sure that you want to remove the player '%s' from your friends list? -== - -Are you sure that you want to remove the clan '%s' from your friends list? -== - -Add Clan -== - -Server filter -== - -Friends -== - -Play the current demo -== - -Pause the current demo -== - -Stop the current demo -== - -Go back the specified duration -== - -[Demo player duration] -%d min. -== - -[Demo player duration] -%d sec. -== - -Change the skip duration -== - -Go forward the specified duration -== - -Go back one tick -== - -Go forward one tick -== - -Go back one marker -== - -Go forward one marker -== - -Slow down the demo -== - -Speed up the demo -== - -Mark the beginning of a cut (right click to reset) -== - -Mark the end of a cut (right click to reset) -== - -Export cut as a separate demo -== - -Close the demo player -== - -Toggle keyboard shortcuts -== - -Toggle auto camera -== - -Export demo cut -== - -Cut interval -== - -Cut length -== - -Render cut to video -== - -Please use a different filename -== - -Loading demo files -== - -All combined -== - -No demo selected -== - -Folder Link -== - -Created -== - -Netversion -== - -[Demo details] -map not included -== - -Open the directory that contains the demo files -== - -Are you sure that you want to delete the folder '%s'? -== - -Are you sure that you want to delete the demo '%s'? -== - -Delete folder -== - -Unable to delete the demo '%s' -== - -Unable to delete the folder '%s'. Make sure it's empty first. -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Loading… -== - -Loading ghost files -== - -Ghosts directory -== - -Activate all -== - -Deactivate all -== - -Menu opened. Press Esc key again to close menu. -== - -[Hertz] -Hz -== - -Save power by lowering refresh rate (higher input latency) -== - -Open the settings file -== - -Open the directory that contains the configuration and user files -== - -Open the directory to add custom themes -== - -Player info change cooldown -== - -Download community skins -== - -Create a random skin -== - -Choose default eyes when joining a server -== - -Open the directory to add custom skins -== - -Enable controller -== - -Controller -== - -Ingame controller mode -== - -[Ingame controller mode] -Relative -== - -[Ingame controller mode] -Absolute -== - -Ingame controller sens. -== - -UI controller sens. -== - -Controller jitter tolerance -== - -No controller found. Plug in a controller. -== - -Axis -== - -Status -== - -Aim bind -== - -Mouse -== - -Ingame mouse sens. -== - -UI mouse sens. -== - -Reset controls -== - -Are you sure that you want to reset the controls to their defaults? -== - -Cancel -== - -Allows maps to render with more detail -== - -Graphics card -== - -Tee -== - -Appearance -== - -Name Plate -== - -Hook Collisions -== - -Info Messages -== - -Show health, shields and ammo -== - -Show local time always -== - -Authed name color in scoreboard -== - -Same clan color in scoreboard -== - -DDRace HUD -== - -Show client IDs (scoreboard, chat, spectator) -== - -Show DDRace HUD -== - -Show jumps indicator -== - -Show dummy actions -== - -Show player position -== - -Show player speed -== - -Show player target angle -== - -Show freeze bars -== - -Opacity of freeze bars inside freeze -== - -Always show chat -== - -Show only chat messages from team members -== - -Chat font size -== - -Chat width -== - -Show friend mark (♥) in name plates -== - -Show client IDs in name plates -== - -Hook Strength -== - -Show hook strength icon indicator -== - -Show hook strength number indicator -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Hook collision line -== - -Show own player's hook collision line -== - -Always show own player's hook collision line -== - -Always show other players' hook collision lines -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Hook collision line opacity -== - -Colors of the hook collision line, in case of a possible collision with: -== - -Your movements are not taken into account when calculating the line colors -== - -Nothing hookable -== - -Something hookable -== - -A Tee -== - -Preview 'Hook collisions' being pressed -== - -Show finish messages -== - -Normal Color -== - -Highlight Color -== - -Weapons -== - -Rifle Laser Outline Color -== - -Rifle Laser Inner Color -== - -Shotgun Laser Outline Color -== - -Shotgun Laser Inner Color -== - -Door Laser Outline Color -== - -Door Laser Inner Color -== - -Freeze Laser Outline Color -== - -Freeze Laser Inner Color -== - -Set all to Rifle -== - -Enable ghost -== - -When you cross the start line, show a ghost tee replicating the movements of your best time -== - -Opacity -== - -Only save improvements -== - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== - -Quads are used for background decoration -== - -Tries to predict other entities to give a feel of low latency -== - -Regular background color -== - -Entities background color -== - -Unregister protocol and file extensions -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Extras -== - -Loading assets -== - -Open the directory to add custom assets -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Loading race demo files -== - -Round %d/%d -== - -[Spectators] -%d others… -== - -Super -== - -[Team and size] -%d\n(%d/%d) -== - -Team %d (%d/%d) -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Loading sound files -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -Moved ingame -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/chuvash.txt b/data/languages/chuvash.txt deleted file mode 100644 index 6bfc573e44..0000000000 --- a/data/languages/chuvash.txt +++ /dev/null @@ -1,2073 +0,0 @@ -##### authors ##### -#originally created by: -# Watz -#modified by: -# -##### /authors ##### - -##### translated strings ##### - -%ds left -== %d сек. - -%i minute left -== %i мин. - -%i minutes left -== %i мин. - -%i second left -== %i сек. - -%i seconds left -== %i сек. - -%s wins! -== %s çĕнтерчĕ! - -Abort -== Каялла - -Add -== Хуш - -Add Friend -== Юлташа хуш - -Address -== Адрес - -All -== Пурте - -Are you sure that you want to quit? -== Эсир тухасшăн-и? - -Automatically record demos -== Демосене автоматикăла çыр - -Automatically take game over screenshot -== Вăйăн пайта çут-ӳкерчĕк ту - -Blue team -== Кăвак ушкăн - -Blue team wins! -== Кăвак ушкăн çĕнтерчĕ! - -Body -== Ӳт - -Call vote -== Сасăла - -Change settings -== Йĕркелӳсене урăхлатма - -Chat -== Калаçу - -Clan -== Кланĕ - -Client -== Клиент - -Connecting to -== Çыхăну - -Connection Problems… -== Çыхăну проблемасем - -Console -== Консоль - -Controls -== Пăхăнтару - -Count players only -== Çынсене анчах шутлама - -Current -== Хальхи - -Custom colors -== Усă кураканăн тĕсĕсем - -Delete -== Шăлса тасатма - -Delete demo -== Демо шăлса тасатма - -Demofile: %s -== Демо: %s - -Demos -== Демосем - -Disconnect -== Çыхăну чарма - -Disconnected -== Çыхăну чарăнчĕ - -Downloading map -== Карта илӳ - -Draw! -== Никам та çĕнтермерĕ! - -Dynamic Camera -== Куçакан камера - -Emoticon -== Кăмăл-туйăмсем - -Error -== Йăнăш - -Error loading demo -== Демо илĕвĕн йăнăш - -Favorite -== Суйланни - -Favorites -== Суйланнисем - -Feet -== Урасем - -Fire -== Пĕрӳ - -Folder -== Папка - -Force vote -== Вăйлăт - -Free-View -== Ирĕклĕ обзор - -Fullscreen -== Тулли экран - -Game -== Вăйă - -Game info -== Вăйă пĕлтерӳ - -Game over -== Вăйа вĕçленчĕ - -Game type -== Вăйăн тĕс - -Game types: -== Вăйăн тĕсĕсем - -General -== Тĕп - -Graphics -== Ӳкерӳ - -Grenade -== Гранатомёт - -Hammer -== Мăлатук - -Has people playing -== Вылякан пур - -High Detail -== Лайăх ӳкерӳ - -Hook -== Çекĕл - -Invalid Demo -== Тĕрĕс мар демо - -Join blue -== Кăваксемпе! - -Join red -== Хĕрлĕсемпе! - -Jump -== Сик - -Kick player -== Вылякана бан - -Language -== Чĕлхе - -MOTD -== MOTD - -Map -== Карта - -Move left -== Сулахаялла - -Move player to spectators -== Пăхакансем çине куçарма - -Move right -== Сылтăмалла - -Movement -== Куçăм - -Mute when not active -== Тивмен чух сасăна шăплантар - -Name -== Ят - -Next weapon -== Тепĕр хĕç-пăшал - -Nickname -== Ят - -No -== Çук - -No password -== Вăрттăн сăмахсăр - -No servers found -== Серверсем çук - -No servers match your filter criteria -== Фильтр майлă серверсем çук - -Ok -== Çапла - -Parent Folder -== Аслă каталог - -Password -== Вăрттăн сăмах - -Password incorrect -== Тĕрĕс мар вăрттăн сăмах - -Ping -== Пинг - -Pistol -== Пистолет - -Play background music -== Кĕвви - -Player -== Вылякан - -Player country: -== Çĕршыв: - -Players -== Çынсем - -Please balance teams! -== Вылякан ушкăнĕсене шайлаштар! - -Prev. weapon -== Малтанхи хĕç-пăшал - -Quit -== Туху - -Reason: -== Сăлтав: - -Red team -== Хĕрлĕ ушкăн - -Red team wins! -== Хĕрлĕ ушкăн çĕнтерчĕ! - -Remote console -== Сервер консолĕ - -Remove -== Тасат - -Remove friend -== Юлташа тасат - -Rename demo -== Демо çĕнĕ ят - -Reset filter -== Фильтрсене тасат - -Score -== Паллă - -Score limit -== Паллă лимичĕ - -Scoreboard -== Паллăсен хăмми - -Screenshot -== Экран ӳкерӳ - -Server address: -== Сервер адресĕ - -Server info -== Пĕлтерӳ - -Server not full -== Сервер тулли мар - -Shotgun -== Йĕтре пăшал - -Show chat -== Калаçӳ кăтартма - -Show friends only -== Юлташсемпе анчах - -Show ingame HUD -== Вăйă çинчи HUD кăтартма - -Show name plates -== Вылякансен ят кăтартма - -Sound -== Сасă - -Sound error -== Сасă йăнăш - -Spectate -== Пăхма - -Spectate next -== Тепĕрне пăхма - -Spectate previous -== Малтанхине пăхма - -Spectator mode -== Пăхакан - -Spectators -== Пăхакансем - -Stop record -== Чарма - -Strict gametype filter -== Хытă вăйă тĕс фильтрĕ - -Sudden Death -== Хăвăрт вилӳ - -Switch weapon on pickup -== Хĕç-пăшал илнĕ чух улăштарма - -Team -== Ушкăн - -Team chat -== Ушкăнри калаçу - -The audio device couldn't be initialised. -== Аудио ярма пултараймасть - -The server is running a non-standard tuning on a pure game type. -== Серверта стардартлă мар опцисемпе таса вăйă тĕсĕрĕ - -Time limit -== Вăхăт лимичĕ - -Time limit: %d min -== Вăхăт лимичĕ: %d мин - -Try again -== Тепĕр хут - -Type -== Тĕс - -Unable to rename the demo -== Демо ячĕ улăштарма пулмасть - -Use sounds -== Сасă уса курма - -Use team colors for name plates -== Ушкăн тĕсĕсем ятсем валли - -V-Sync -== Вертикаллĕ синхронизаци - -Version -== Версие - -Vote command: -== Суйлав хушу: - -Vote description: -== Суйлав пирки: - -Vote no -== Хирĕç - -Vote yes -== Çинчен - -Voting -== Суйлав - -Warmup -== Карăну - -Weapon -== Хĕç-пăшал - -Yes -== Çапла - -You must restart the game for all settings to take effect. -== Режим улăштарма валли вăйă сӳнтер тата каллер яр - -##### needs translation ##### - -New name: -== Çĕн ят - -Max demos -== Чи пысăк демо хисепĕ - -Internet -== Интернет - -News -== Хыпарсем - -Join game -== Выляма - -FSAA samples -== FSAA якату - -Sat. -== Контраст - -LAN -== LAN - -Sound volume -== Сасă янравлăш - -Record demo -== Демо çыр - -Miscellaneous -== Хушнисем - -UI Color -== Интерфейс тĕсĕ - -Max Screenshots -== Ӳкерчĕксен чи пысăк хисепĕ - -Hue -== Тĕс сĕмĕ - -Your skin -== Санăн сăн - -Reset to defaults -== Йĕркелӳ тасат - -Laser -== Бластер - -Lht. -== Çутăллăх - -Alpha -== Тăрă - -Name plates size -== Пысăкăш - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not save downloaded map. Try manually deleting this file: %s -== - -Could not connect dummy -== - -Error playing demo -== - -Successfully saved the replay! -== - -Failed saving the replay! -== - -Saving settings to '%s' failed -== - -Error saving settings -== - -Replay feature is disabled! -== - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -The format of texture %s is not RGBA which will cause visual bugs. -== - -Preparing demo playback -== - -Connected -== - -Loading map file from storage -== - -Loading demo file from storage -== - -Some fonts could not be loaded. Check the local console for details. -== - -Loading DDNet Client -== - -Initializing components -== - -Why are you slowmo replaying to read this? -== - -Initializing assets -== - -Initializing map logic -== - -Sending initial client info -== - -Warning -== - -Quitting. Please wait… -== - -Restarting. Please wait… -== - -Loading skin files -== - -Search -== - -Loading background map -== - -Searching -== - -Enter Username -== - -Enter Password -== - -NOT CONNECTED -== - -Match %d of %d -== - -No results -== - -Lines %d - %d (%s) -== - -Locked -== - -Following -== - -Loading commands… -== - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== - -Game paused -== - -Position: -== - -Speed: -== - -Angle: -== - -Multi-View -== - -[Spectating] -Following %s -== - -[Spectating Camera Mode Icon] -AUTO -== - -Server best: -== - -Personal best: -== - -Team %d -== - -Some map images could not be loaded. Check the local console for details. -== - -Uploading map data to GPU -== - -Some map sounds could not be loaded. Check the local console for details. -== - -Loading menu themes -== - -Reset -== - -Press a key… -== - -Settings -== - -Editor -== - -Main menu -== - -Browser -== - -Ghost -== - -Reconnect in %d sec -== - -Rename folder -== - -Render demo -== - -Render complete -== - -Restart -== - -Are you sure that you want to restart? -== - -Welcome to DDNet -== - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== - -Please enter your nickname below. -== - -Existing Player -== - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== - -Checking for existing player with your name -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -There's an unsaved map in the editor, you might want to save it. -== - -Continue anyway? -== - -A demo with this name already exists -== - -A folder with this name already exists -== - -Unable to rename the folder -== - -File '%s' already exists, do you want to overwrite it? -== - -Replace video -== - -(paused) -== - -Speed -== - -Video name: -== - -Videos directory -== - -Video was saved to '%s' -== - -Join Tutorial Server -== - -Skip Tutorial -== - -Show DDNet map finishes in server browser -== - -transmits your player name to info.ddnet.org -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -Trying to determine UDP connectivity… -== - -UDP seems to be filtered. -== - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== - -No answer from server yet. -== - -%d/%d KiB (%.1f KiB/s) -== - -Getting game info -== - -Requesting to join the game -== - -Theme -== - -Loading menu images -== - -AFR -== - -ASI -== - -AUS -== - -EUR -== - -NA -== - -SA -== - -CHN -== - -Getting server list from master server -== - -No local servers found (ports %d-%d) -== - -Example of usage -== - -Exclude -== - -%d of %d servers -== - -%d of %d server -== - -%d players -== - -%d player -== - -Are you sure that you want to disconnect and switch to a different server? -== - -No login required -== - -Filter connecting players -== - -Indicate map finish -== - -Unfinished map -== - -Countries -== - -Types -== - -Communities -== - -Copy info -== - -Leak IP -== - -No server selected -== - -Online friends (%d) -== - -Online clanmates (%d) -== - -[friends (server browser)] -Offline (%d) -== - -Click to select server. Double click to join your friend. -== - -Click to remove this player from your friends list. -== - -Click to remove this clan from your friends list. -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Are you sure that you want to remove the player '%s' from your friends list? -== - -Are you sure that you want to remove the clan '%s' from your friends list? -== - -Add Clan -== - -Server filter -== - -Friends -== - -Play the current demo -== - -Pause the current demo -== - -Stop the current demo -== - -Go back the specified duration -== - -[Demo player duration] -%d min. -== - -[Demo player duration] -%d sec. -== - -Change the skip duration -== - -Go forward the specified duration -== - -Go back one tick -== - -Go forward one tick -== - -Go back one marker -== - -Go forward one marker -== - -Slow down the demo -== - -Speed up the demo -== - -Mark the beginning of a cut (right click to reset) -== - -Mark the end of a cut (right click to reset) -== - -Export cut as a separate demo -== - -Close the demo player -== - -Toggle keyboard shortcuts -== - -Toggle auto camera -== - -Export demo cut -== - -Cut interval -== - -Cut length -== - -Remove chat -== - -Render cut to video -== - -Please use a different filename -== - -File already exists, do you want to overwrite it? -== - -Loading demo files -== - -All combined -== - -Demo -== - -Length -== - -Date -== - -No demo selected -== - -Folder Link -== - -Created -== - -Markers -== - -Netversion -== - -Size -== - -[Demo details] -map not included -== - -%.2f MiB -== - -%.2f KiB -== - -Fetch Info -== - -Demos directory -== - -Open the directory that contains the demo files -== - -Are you sure that you want to delete the folder '%s'? -== - -Are you sure that you want to delete the demo '%s'? -== - -Delete folder -== - -Unable to delete the demo '%s' -== - -Unable to delete the folder '%s'. Make sure it's empty first. -== - -Are you sure that you want to disconnect? -== - -Connect Dummy -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Connecting dummy -== - -Disconnect Dummy -== - -Are you sure that you want to disconnect your dummy? -== - -Kill -== - -Pause -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Loading… -== - -Loading ghost files -== - -Time -== - -Ghosts directory -== - -Activate all -== - -Deactivate all -== - -Deactivate -== - -Activate -== - -Save -== - -Menu opened. Press Esc key again to close menu. -== - -Smooth Dynamic Camera -== - -Switch weapon when out of ammo -== - -Skip the main menu -== - -[Hertz] -Hz -== - -Refresh Rate -== - -Save power by lowering refresh rate (higher input latency) -== - -Settings file -== - -Open the settings file -== - -Config directory -== - -Open the directory that contains the configuration and user files -== - -Themes directory -== - -Open the directory to add custom themes -== - -Automatically take statboard screenshot -== - -Automatically create statboard csv -== - -Max CSVs -== - -Dummy -== - -Player info change cooldown -== - -Download skins -== - -Download community skins -== - -Vanilla skins only -== - -Fat skins (DDFat) -== - -Skin prefix -== - -Create a random skin -== - -Choose default eyes when joining a server -== - -Skin Database -== - -Skins directory -== - -Open the directory to add custom skins -== - -Hook collisions -== - -Zoom in -== - -Zoom out -== - -Default zoom -== - -Show others -== - -Show all -== - -Toggle dyncam -== - -Toggle ghost -== - -Converse -== - -Chat command -== - -Toggle dummy -== - -Dummy copy -== - -Hammerfly dummy -== - -Statboard -== - -Lock team -== - -Show entities -== - -Show HUD -== - -Enable controller -== - -Controller -== - -Ingame controller mode -== - -[Ingame controller mode] -Relative -== - -[Ingame controller mode] -Absolute -== - -Ingame controller sens. -== - -UI controller sens. -== - -Controller jitter tolerance -== - -No controller found. Plug in a controller. -== - -Axis -== - -Status -== - -Aim bind -== - -Mouse -== - -Ingame mouse sens. -== - -UI mouse sens. -== - -Reset controls -== - -Are you sure that you want to reset the controls to their defaults? -== - -Cancel -== - -Windowed -== - -Windowed borderless -== - -Windowed fullscreen -== - -Desktop fullscreen -== - -Screen -== - -may cause delay -== - -Allows maps to render with more detail -== - -Use high DPI -== - -Renderer -== - -default -== - -custom -== - -Graphics card -== - -auto -== - -Enable game sounds -== - -Enable gun sound -== - -Enable long pain sound (used when shooting in freeze) -== - -Enable server message sound -== - -Enable regular chat sound -== - -Enable team chat sound -== - -Enable highlighted chat sound -== - -Game sound volume -== - -Chat sound volume -== - -Map sound volume -== - -Background music volume -== - -Tee -== - -Appearance -== - -DDNet -== - -Assets -== - -DDNet Client needs to be restarted to complete update! -== - -HUD -== - -Name Plate -== - -Hook Collisions -== - -Info Messages -== - -Show health, shields and ammo -== - -Show score -== - -Show local time always -== - -Show votes window after voting -== - -Authed name color in scoreboard -== - -Same clan color in scoreboard -== - -DDRace HUD -== - -Show client IDs (scoreboard, chat, spectator) -== - -Show DDRace HUD -== - -Show jumps indicator -== - -Show dummy actions -== - -Show player position -== - -Show player speed -== - -Show player target angle -== - -Show freeze bars -== - -Opacity of freeze bars inside freeze -== - -Always show chat -== - -Show names in chat in team colors -== - -Show only chat messages from friends -== - -Show only chat messages from team members -== - -Use old chat style -== - -Chat font size -== - -Chat width -== - -Messages -== - -System message -== - -Highlighted message -== - -Team message -== - -Friend message -== - -Normal message -== - -Client message -== - -Preview -== - -Show clan above name plates -== - -Clan plates size -== - -Show friend mark (♥) in name plates -== - -Show client IDs in name plates -== - -Hook Strength -== - -Show hook strength icon indicator -== - -Show hook strength number indicator -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Show other players' key presses -== - -Show local player's key presses -== - -Size of key press icons -== - -Hook collision line -== - -Show own player's hook collision line -== - -Always show own player's hook collision line -== - -Show other players' hook collision lines -== - -Always show other players' hook collision lines -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Hook collision line opacity -== - -Colors of the hook collision line, in case of a possible collision with: -== - -Your movements are not taken into account when calculating the line colors -== - -Nothing hookable -== - -Something hookable -== - -A Tee -== - -Preview 'Hook collisions' being pressed -== - -Show kill messages -== - -Show finish messages -== - -Normal Color -== - -Highlight Color -== - -Weapons -== - -Rifle Laser Outline Color -== - -Rifle Laser Inner Color -== - -Shotgun Laser Outline Color -== - -Shotgun Laser Inner Color -== - -Entities -== - -Door Laser Outline Color -== - -Door Laser Inner Color -== - -Freeze Laser Outline Color -== - -Freeze Laser Inner Color -== - -Set all to Rifle -== - -Save the best demo of each race -== - -Enable replays -== - -Default length -== - -Enable ghost -== - -When you cross the start line, show a ghost tee replicating the movements of your best time -== - -Show ghost -== - -Opacity -== - -Save ghost -== - -Only save improvements -== - -Gameplay -== - -Overlay entities -== - -Show text entities -== - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== - -Show others (own team only) -== - -Show quads -== - -Quads are used for background decoration -== - -AntiPing -== - -Tries to predict other entities to give a feel of low latency -== - -AntiPing: predict other players -== - -AntiPing: predict weapons -== - -AntiPing: predict grenade paths -== - -Background -== - -Regular background color -== - -Entities background color -== - -Use current map as background -== - -Show tiles layers from BG map -== - -New random timeout code -== - -Run on join -== - -Chat command (e.g. showall 1) -== - -Unregister protocol and file extensions -== - -DDNet %s is available: -== - -Update now -== - -Updating… -== - -DDNet Client updated! -== - -No updates available -== - -Check now -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Emoticons -== - -Particles -== - -Extras -== - -Loading assets -== - -Assets directory -== - -Open the directory to add custom assets -== - -Discord -== - -https://ddnet.org/discord -== - -Learn -== - -https://wiki.ddnet.org/ -== - -Tutorial -== - -Can't find a Tutorial server -== - -Website -== - -Stop server -== - -Run server -== - -[Start menu] -Play -== - -DDNet %s is out! -== - -Downloading %s: -== - -Update failed! Check log… -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Server executable not found, can't run server -== - -Loading race demo files -== - -Round %d/%d -== - -[Spectators] -%d others… -== - -Super -== - -[Team and size] -%d\n(%d/%d) -== - -Team %d (%d/%d) -== - -Manual -== - -Race -== - -Auto -== - -Replay -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Loading sound files -== - -Follow -== - -Frags -== - -Deaths -== - -Suicides -== - -Ratio -== - -Net -== - -FPM -== - -Spree -== - -Best -== - -Grabs -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -1 new mention -== - -%d new mentions -== - -9+ new mentions -== - -Moved ingame -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/czech.txt b/data/languages/czech.txt deleted file mode 100644 index 4d164e986d..0000000000 --- a/data/languages/czech.txt +++ /dev/null @@ -1,2077 +0,0 @@ -##### authors ##### -#originally created by: -# -#modified by: -# khubajsn 2010-05-31 16:54:03 -# Petr 2011-04-02 23:02:33 -# Medik & Petr 2011-07-02 19:37:05 -# TeeWorlds-org 2011-07-15 00:34:19 -# dobrykafe 2024-09-29 00:00:00 -##### /authors ##### - -##### translated strings ##### - -%ds left -== zbývá %ds - -%i minute left -== %i zbývající minuta - -%i minutes left -== %i zbývajících minut - -%i second left -== %i zbývající sekunda - -%i seconds left -== %i zbývajících sekund - -%s wins! -== %s vyhrává! - -Abort -== Přerušit - -Add -== Přidat - -Add Friend -== Přidat do přátel - -Address -== Adresa - -All -== Všem - -Are you sure that you want to quit? -== Opravdu chcete ukončit hru? - -Automatically record demos -== Automaticky nahrávat záznamy - -Automatically take game over screenshot -== Automaticky pořídit snímek obrazovky konce hry - -Blue team -== Modří - -Blue team wins! -== Modří vyhráli! - -Body -== Tělo - -Call vote -== Hlasovat - -Change settings -== Změna nastavení - -Chat -== Chat - -Clan -== Klan - -Client -== Klient - -Connecting to -== Připojuji na - -Connection Problems… -== Problémy s připojením… - -Console -== Konzole - -Controls -== Ovládání - -Count players only -== Započítat hrající hráče - -Current -== Aktuální - -Custom colors -== Vlastní barvy - -Delete -== Smazat - -Delete demo -== Smazat záznam - -Demofile: %s -== Soubor záznamu: %s - -Demos -== Záznamy - -Disconnect -== Odpojit - -Disconnected -== Odpojeno - -Downloading map -== Stahování mapy - -Draw! -== Remíza! - -Dynamic Camera -== Pohyblivá kamera - -Emoticon -== Emotikon - -Error -== Chyba - -Error loading demo -== Chyba při načítání záznamu - -Favorite -== Oblíbený - -Favorites -== Oblíbené - -Feet -== Chodidla - -Fire -== Střelba - -Folder -== Složka - -Force vote -== Vynutit hlasování - -Free-View -== Volný pohled - -Fullscreen -== Celá obrazovka - -Game -== Hra - -Game info -== Herní info - -Game over -== Konec hry - -Game type -== Herní mód - -Game types: -== Herní módy: - -General -== Všeobecné - -Graphics -== Grafika - -Grenade -== Granátomet - -Hammer -== Kladivo - -Has people playing -== Hráči na serveru - -High Detail -== Vysoké detaily - -Hook -== Hák - -Invalid Demo -== Neplatný záznam - -Join blue -== Modří - -Join red -== Červení - -Jump -== Skok - -Kick player -== Vyhodit hráče - -Language -== Jazyk - -MOTD -== MOTD - -Map -== Mapa - -Move left -== Pohyb doleva - -Move player to spectators -== Přesunout hráče k divákům - -Move right -== Pohyb doprava - -Movement -== Pohyb - -Mute when not active -== Při nečinnosti ztlumit zvuk - -Name -== Jméno - -Next weapon -== Další zbraň - -Nickname -== Přezdívka - -No -== Ne - -No password -== Bez hesla - -No servers found -== Žádný server nenalezen - -No servers match your filter criteria -== Žádný server neodpovídá požadavkům filtru - -Ok -== Ok - -Parent Folder -== Nadřazená složka - -Password -== Heslo - -Password incorrect -== Špatné heslo - -Ping -== Ping - -Pistol -== Pistole - -Play background music -== Přehrávat hudbu na pozadí - -Player -== Hráč - -Player country: -== Země hráčů: - -Players -== Hráči - -Please balance teams! -== Prosím vyrovnejte týmy! - -Prev. weapon -== Předchozí zbraň - -Quit -== Ukončit - -Reason: -== Důvod: - -Red team -== Červení - -Red team wins! -== Červení vyhráli! - -Remote console -== Vzdálená konzole - -Remove -== Odstranit - -Remove friend -== Odebrat přítele - -Rename demo -== Přejmenovat záznam - -Reset filter -== Resetovat filtr - -Score -== Skóre - -Score limit -== Limit skóre - -Scoreboard -== Tabulka výsledků - -Screenshot -== Snímek obrazovky - -Server address: -== Adresa serveru: - -Server info -== Server info - -Server not full -== Možnost připojit se - -Shotgun -== Brokovnice - -Show chat -== Zobrazit chat - -Show friends only -== Zobrazit přátele - -Show ingame HUD -== Zobrazit HUD - -Show name plates -== Zobrazit jmenovky - -Sound -== Zvuk - -Sound error -== Chyba zvuku - -Spectate -== Pozorovat - -Spectate next -== Pozorovat dalšího - -Spectate previous -== Pozorovat předchozího - -Spectator mode -== Divácký režim - -Spectators -== Diváci - -Stop record -== Zastavit záznam - -Strict gametype filter -== Pouze tento herní mód - -Sudden Death -== Náhlá smrt - -Switch weapon on pickup -== Přehazovat zbraň na nově sebranou - -Team -== Týmu - -Team chat -== Týmový chat - -The audio device couldn't be initialised. -== Zvukové zařízení se nepodařilo inicializovat. - -The server is running a non-standard tuning on a pure game type. -== Server používá nestandardní nastavení pro základní módy. - -Time limit -== Časový limit - -Time limit: %d min -== Časový limit: %d min - -Try again -== Zkusit znovu - -Type -== Mód - -Unable to rename the demo -== Záznam nelze přejmenovat - -Use sounds -== Povolit zvuk - -Use team colors for name plates -== Použít barvy týmu pro jmenovky - -V-Sync -== Vertikální synchronizace - -Version -== Verze - -Vote command: -== Příkaz hlasování: - -Vote description: -== Popis hlasování: - -Vote no -== Hlasovat ne - -Vote yes -== Hlasovat ano - -Voting -== Hlasování - -Warmup -== Zahřívací kolo - -Weapon -== Zbraň - -Yes -== Ano - -You must restart the game for all settings to take effect. -== Změna nastavení se projeví až po restartu hry. - -##### needs translation ##### - -New name: -== Nové jméno: - -Sat. -== Syt. - -Miscellaneous -== Ostatní - -Internet -== Internet - -Max demos -== Maximální počet záznamů - -News -== Novinky - -Join game -== Do hry - -FSAA samples -== FSAA vzorkování - -Sound volume -== Hlasitost - -Max Screenshots -== Maximální počet vyfocených obrazovek - -Laser -== Laser - -Hue -== Ods. - -Record demo -== Začít záznam - -Your skin -== Zvolený vzhled - -Reset to defaults -== Obnovit výchozí - -Lht. -== Jas - -UI Color -== Barva uživatelského rozhraní - -Alpha -== Alfa - -LAN -== LAN - -Name plates size -== Velikost jmenovek - -Successfully saved the replay! -== Záznam byl úspěšně uložen! - -Replay feature is disabled! -== Funkce záznamů je zakázána! - -Game paused -== Hra pozastavena - -Server best: -== Server rekord: - -Personal best: -== Osobní rekord: - -Learn -== Učit se - -Browser -== Prohlížeč - -Ghost -== Duch - -Loading DDNet Client -== Načítání DDNet Klienta - -Reconnect in %d sec -== Opětovné připojení za %d sek - -Render demo -== Vykreslit záznam - -Replace video -== Nahradit video - -File already exists, do you want to overwrite it? -== Soubor již existuje, chcete jej přepsat? - -Are you sure that you want to disconnect? -== Jste si jisti, že se chcete odpojit? - -Disconnect Dummy -== Odpojit Dummyho - -Are you sure that you want to disconnect your dummy? -== Jste si jisti, že chcete odpojit svého dummyho? - -Welcome to DDNet -== Vítejte na DDNetu - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork je kooperativní online hra, kde je cílem pro vás a vaši skupinu dosáhnout cílové čáry mapy. Jako nováček byste měli začít na začínajících serverech, které hostují nejjednodušší mapy. Zvažte ping a vyberte si server, který je vám nejblíž. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Před připojením k serveru se doporučuje zkontrolovat nastavení a upravit je podle vašich představ. - -Video name: -== Název videa: - -Show DDNet map finishes in server browser -== Zobrazit dokončení DDNet map v prohlížeči serveru - -Search -== Hledat - -Exclude -== Vyloučit - -Filter connecting players -== Filtrovat připojující se hráče - -Indicate map finish -== Indikovat dokončení mapy - -Unfinished map -== Nedokončená mapa - -Countries -== Země - -Types -== Módy - -DDNet %s is out! -== DDNet %s je venku! - -Downloading %s: -== Stahování %s: - -DDNet Client updated! -== DDNet Klient aktualizován! - -Update now -== Aktualizovat nyní - -Restart -== Restartovat - -Remove chat -== Odebrat chat - -%.2f MiB -== %.2f MiB - -%.2f KiB -== %.2f KiB - -Demo -== Záznam - -Markers -== Markery - -Length -== Délka - -Date -== Datum - -Fetch Info -== Načíst informace - -Connecting dummy -== Připojování dummyho - -Connect Dummy -== Připojit dummyho - -Deactivate -== Deaktivovat - -Activate -== Aktivovat - -Save -== Uložit - -Switch weapon when out of ammo -== Změnit zbraň když vám dojdou náboje - -Show only chat messages from friends -== Zobrazit pouze zprávy od přátel - -Show clan above name plates -== Ukázat klan nad jménem - -Clan plates size -== Velikost jmenovek klanu - -Refresh Rate -== Obnovovací frekvence - -Automatically take statboard screenshot -== Automaticky pořídit snímek obrazovky statboardu - -Automatically create statboard csv -== Automaticky vytvořit statboard csv - -Max CSVs -== Maximální počet CSV - -Vanilla skins only -== Pouze vanilla skiny - -Fat skins (DDFat) -== Tlusté skiny (DDFat) - -Skin prefix -== Skin předpona - -Hook collisions -== Kolize háku - -Pause -== Pauza - -Kill -== Zabít - -Zoom in -== Přiblížit - -Zoom out -== Oddálit - -Default zoom -== Výchozí zvětšení - -Show others -== Ukázat ostatní - -Show all -== Ukázat všechny - -Toggle dyncam -== Přepnout dyncam - -Toggle dummy -== Přepnout dummyho - -Toggle ghost -== Přepnout ducha - -Dummy copy -== Dummy kopírovat - -Hammerfly dummy -== Dummy hammerfly - -Converse -== Konverzovat - -Statboard -== Statboard - -Lock team -== Zamknout tým - -Show entities -== Zobrazit entity - -Show HUD -== Zobrazit HUD - -may cause delay -== může způsobit zpoždění - -Screen -== Obrazovka - -Use high DPI -== Použít vysoké DPI - -Enable game sounds -== Povolit zvuky hry - -Enable gun sound -== Povolit zvuk zbraně - -Enable long pain sound (used when shooting in freeze) -== Povolit zvuk dlouhé bolesti (používá se při střílení ve zmrazení) - -Enable server message sound -== Povolit zvuk zpráv serveru - -Enable regular chat sound -== Povolit zvuk normálního chatu - -Enable team chat sound -== Povolit zvuk týmového chatu - -Enable highlighted chat sound -== Povolit zvuk zvýrazněné zprávy - -Map sound volume -== Hlasitost zvuků mapy - -HUD -== HUD - -DDNet -== DDNet - -DDNet Client needs to be restarted to complete update! -== K dokončení aktualizace je nutné restartovat klienta DDNet! - -Show score -== Zobrazit skóre - -Show names in chat in team colors -== Zobrazit jména v chatu v týmových barvách - -Show kill messages -== Zobrazit zprávy zabití - -Show votes window after voting -== Zobrazit okno hlasování po odhlasování - -Messages -== Zprávy - -System message -== Systémová zpráva - -Reset -== Resetovat - -Highlighted message -== Zvýrazněná zpráva - -Team message -== Týmová zpráva - -Friend message -== Zpráva od přítele - -Normal message -== Normální zpráva - -Save the best demo of each race -== Ukládat nejlepší záznam každého závodu - -Default length -== Výchozí délka - -Enable replays -== Povolit záznamy - -Show ghost -== Ukázat ducha - -Save ghost -== Uložit ducha - -Gameplay -== Hratelnost - -Overlay entities -== Překrytí entit - -Size -== Velikost - -Show text entities -== Zobrazit textové entity - -Show others (own team only) -== Zobrazit ostatní (pouze vlastní tým) - -Show quads -== Zobrazit quads - -AntiPing -== AntiPing - -AntiPing: predict other players -== AntiPing: předvídání ostatních hráčů - -AntiPing: predict weapons -== AntiPing: předvídání zbraní - -AntiPing: predict grenade paths -== AntiPing: předvídání cest granátů - -Show other players' hook collision lines -== Zobrazit čáru kolize háků ostatních hráčů - -Show other players' key presses -== Zobrazit stisknutí kláves ostatních hráčů - -Show tiles layers from BG map -== Zobrazit vrstvy dlaždic z mapy BG - -DDNet %s is available: -== DDNet %s je k dispozici: - -Updating… -== Aktualizace… - -No updates available -== Nejsou k dispozici žádné aktualizace - -Check now -== Zkontrolovat nyní - -New random timeout code -== Nový náhodný timeout kód - -Time -== Čas - -Manual -== Manuál - -Race -== Závod - -Auto -== Auto - -Replay -== Replay - -Follow -== Následovat - -Frags -== Fragy - -Deaths -== Smrti - -Suicides -== Sebevraždy - -Ratio -== Poměr - -Net -== Net - -FPM -== FPM - -Spree -== Řádění - -Best -== Nejlepší - -Grabs -== Chycení - -1 new mention -== 1 nová zmínka - -%d new mentions -== %d nových zmínek - -9+ new mentions -== 9+ nových zmínek - -Warning -== Varování - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Režim ladění povolen. Stisknutím kláves Ctrl + Shift + D deaktivujte režim ladění. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Pomocí klávesy k se zabijete (restartujte), pomocí q pauznete a můžete sledovat ostatní hráče. Otevřte nastavení pro další klávesové zkratky. - -Please enter your nickname below. -== Níže zadejte svou přezdívku. - -Existing Player -== Stávající hráč - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Vaše přezdívka '%s' je již použita (%d bodů). Chcete ji i přes to používat? - -Checking for existing player with your name -== Kontrola pro existujícího hráče s vaším jménem - -Speed -== Rychlost - -transmits your player name to info.ddnet.org -== přenese vaše jméno hráče na info.ddnet.org - -Theme -== Téma - -%d of %d servers -== %d z %d serverů - -%d of %d server -== %d z %d serveru - -%d players -== %d hráčů - -%d player -== %d hráč - -Demos directory -== Adresář záznamů - -Smooth Dynamic Camera -== Hladká pohyblivá kamera - -Skip the main menu -== Přeskočit hlavní nabídku - -Themes directory -== Adresář témat - -Download skins -== Stahovat skiny - -Skin Database -== Databáze skinů - -Skins directory -== Adresář skinů - -Game sound volume -== Hlasitost zvuku hry - -Chat sound volume -== Hlasitost chatu - -Background music volume -== Hlasitost hudby na pozadí - -Assets -== Aktiva - -Use old chat style -== Použít starý styl chatu - -Client message -== Zpráva klienta - -Use current map as background -== Použít aktuální mapu jako pozadí - -Entities -== Entity - -Emoticons -== Emotikony - -Particles -== Částice - -Assets directory -== Adresář aktiv - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ - -Website -== Web stránka - -Settings -== Nastavení - -Stop server -== Zastavit server - -Run server -== Spustit server - -Server executable not found, can't run server -== Spustitelný soubor serveru nebyl nalezen, server nelze spustit - -Editor -== Editor - -[Start menu] -Play -== Hrát - -Update failed! Check log… -== Aktualizace selhala! Zkontrolujte log… - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Inicializace se nezdařila. Zkuste změnit gfx_backend na OpenGL nebo Vulkan v settings_ddnet.cfg v adresáři s konfigurací a zkuste to znovu. - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== Nedostatek VRAM. Zkuste odebrat vlastní aktiva (skins, entity, atd.), zejména ty s vysokým rozlišením. - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== Při nahrávání příkazu došlo k chybě. Zkuste aktualizovat ovladače GPU. - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== Příkaz k vykreslení selhal. Zkuste aktualizovat ovladače GPU. - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== Odeslání příkazů vykreslení se nezdařilo. Zkuste aktualizovat ovladače GPU. - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== Záměna framebufferů se nezdařila. Zkuste aktualizovat ovladače GPU. - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Neznámá chyba. Zkuste změnit gfx_backend na OpenGL nebo Vulkan v settings_ddnet.cfg v adresáři s konfigurací a zkuste to znovu. - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== Nelze inicializovat daný grafický backend, vrací se k výchozímu backendu. - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== Nelze inicializovat daný grafický backend, pravděpodobně proto, že jste nenainstalovali ovladač integrované grafické karty. - -Could not save downloaded map. Try manually deleting this file: %s -== Staženou mapu nelze uložit. Zkuste ručně smazat tento soubor: %s - -Error playing demo -== Chyba přehrávání záznamu - -Failed saving the replay! -== Uložení záznamu se nezdařilo! - -Saving settings to '%s' failed -== Uložení nastavení do '%s' se nezdařilo - -Error saving settings -== Při ukládání nastavení došlo k chybě - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== Šířka textury %s není dělitelná %d nebo výška není dělitelná %d, což může způsobit vizuální chyby. - -The format of texture %s is not RGBA which will cause visual bugs. -== Formát textury %s není RGBA, což způsobí vizuální chyby. - -Preparing demo playback -== Příprava přehrávání záznamu - -Connected -== Připojeno - -Loading map file from storage -== Načítání souboru mapy z úložiště - -Why are you slowmo replaying to read this? -== Proč přehráváte pomalu kvůli tomuhle? - -Initializing components -== Inicializace komponent - -Initializing assets -== Inicializace aktiv - -Initializing map logic -== Inicializace logiky mapy - -Sending initial client info -== Odeslání prvotních informací o klientovi - -Quitting. Please wait… -== Ukončování. Prosím, čekejte… - -Restarting. Please wait… -== Restartování. Prosím, čekejte… - -Loading skin files -== Načítání skin souborů - -Searching -== Hledání - -Enter Username -== Zadejte uživatelské jméno - -Enter Password -== Zadejte heslo - -NOT CONNECTED -== NEPŘIPOJENO - -Match %d of %d -== Shoda %d z %d - -No results -== Žádné výsledky - -Lines %d - %d (%s) -== Řádky %d – %d (%s) - -Locked -== Zamčeno - -Following -== Následování - -Loading commands… -== Načítání příkazů… - -Position: -== Pozice: - -Speed: -== Rychlost: - -Angle: -== Úhel: - -Multi-View -== Multi-Pohled - -Team %d -== Tým %d - -Some map images could not be loaded. Check the local console for details. -== Některé obrázky mapy se nepodařilo načíst. Podrobnosti najdete v místní konzoli. - -Uploading map data to GPU -== Nahrávání dat map do GPU - -Some map sounds could not be loaded. Check the local console for details. -== Některé zvuky mapy nelze načíst. Podrobnosti najdete v místní konzoli. - -Loading menu themes -== Načítání motivů menu - -Press a key… -== Zmáčkni tlačítko… - -Main menu -== Hlavní menu - -Trying to determine UDP connectivity… -== Pokus o zjištění připojení UDP… - -UDP seems to be filtered. -== Zdá se, že UDP je filtrován. - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== IP adresy UDP a TCP se zdají být odlišné. Zkuste deaktivovat VPN, proxy nebo síťové akcelerátory. - -No answer from server yet. -== Ze serveru zatím žádná odpověď. - -Getting game info -== Získávání informací o hře - -Requesting to join the game -== Žádost o připojení do hry - -Rename folder -== Přejmenovat složku - -Render complete -== Vykreslení dokončeno - -Are you sure that you want to restart? -== Opravdu chcete restartovat hru? - -There's an unsaved map in the editor, you might want to save it. -== V editoru je neuložená mapa, možná ji budete chtít uložit. - -Continue anyway? -== Přesto pokračovat? - -A demo with this name already exists -== Záznam s tímto názvem již existuje - -A folder with this name already exists -== Složka s tímto názvem již existuje - -Unable to rename the folder -== Složku nelze přejmenovat - -File '%s' already exists, do you want to overwrite it? -== Soubor '%s' již existuje, chcete jej přepsat? - -(paused) -== (pozastaveno) - -Videos directory -== Adresář videí - -Video was saved to '%s' -== Video bylo uloženo do '%s' - -Join Tutorial Server -== Připojit se k výukovému serveru - -Skip Tutorial -== Přeskočit výuku - -Loading menu images -== Načítání obrázků v menu - -AFR -== AFR - -ASI -== ASI - -AUS -== AUS - -EUR -== EUR - -NA -== NA - -SA -== SA - -CHN -== CHN - -Getting server list from master server -== Získávání seznamu serverů z hlavního serveru - -Are you sure that you want to disconnect and switch to a different server? -== Opravdu se chcete odpojit a přesunout na jiný server? - -Communities -== Komunity - -Copy info -== Zkopírovat info - -Leak IP -== Zobrazit IP - -No server selected -== Není vybrán žádný server - -Online clanmates (%d) -== Online členové klanu (%d) - -[friends (server browser)] -Offline (%d) -== Offline (%d) - -Click to select server. Double click to join your friend. -== Kliknutím vyberete server. Dvojitým kliknutím se připojíte k příteli. - -Click to remove this player from your friends list. -== Kliknutím odeberete tohoto hráče ze seznamu přátel. - -Click to remove this clan from your friends list. -== Kliknutím odeberete tento klan ze seznamu přátel. - -Are you sure that you want to remove the player '%s' from your friends list? -== Opravdu chcete odstranit hráče '%s' ze seznamu přátel? - -Are you sure that you want to remove the clan '%s' from your friends list? -== Jste si jisti, že chcete odstranit klan '%s' ze svého seznamu přátel? - -Add Clan -== Přidat Klan - -Server filter -== Filtr serveru - -Friends -== Přátelé - -Play the current demo -== Přehrát aktuální záznam - -Pause the current demo -== Pozastavit aktuální záznam - -Stop the current demo -== Zastavit aktuální záznam - -Go back the specified duration -== Vrátit se o zadanou dobu - -[Demo player duration] -%d min. -== %d min. - -[Demo player duration] -%d sec. -== %d sec. - -Change the skip duration -== Změnit dobu přeskočení - -Go forward the specified duration -== Vpřed o zadanou dobu trvání - -Go back one tick -== Vzad o jeden tick - -Go forward one tick -== Vpřed o jeden tick - -Go back one marker -== Vzad o jeden marker - -Go forward one marker -== Vpřed o jeden marker - -Slow down the demo -== Zpomalit záznam - -Speed up the demo -== Zrychlit záznam - -Mark the beginning of a cut (right click to reset) -== Označit začátek řezu (pravý klik pro reset) - -Mark the end of a cut (right click to reset) -== Označit konec řezu (pravý klik pro reset) - -Export cut as a separate demo -== Exportovat řez jako samostatný záznam - -Close the demo player -== Zavřít přehrávač záznamů - -Toggle keyboard shortcuts -== Přepnout klávesové zkratky - -Export demo cut -== Exportovat řez záznamu - -Cut interval -== Interval řezu - -Cut length -== Délka řezu - -Render cut to video -== Vykreslit řez do videa - -Please use a different filename -== Použijte prosím jiný název souboru - -Loading demo files -== Načítání záznamů - -All combined -== Vše dohromady - -No demo selected -== Není vybrán žádný záznam - -Folder Link -== Odkaz na složku - -Created -== Vytvořeno - -Netversion -== Netversion - -[Demo details] -map not included -== mapa není součástí - -Open the directory that contains the demo files -== Otevřete adresář, který obsahuje soubory se záznamy - -Are you sure that you want to delete the folder '%s'? -== Jste si jisti, že chcete smazat složku '%s'? - -Are you sure that you want to delete the demo '%s'? -== Jste si jisti, že chcete smazat záznam '%s'? - -Delete folder -== Smazat složku - -Unable to delete the demo '%s' -== Nelze smazat záznam '%s' - -Unable to delete the folder '%s'. Make sure it's empty first. -== Nelze smazat složku '%s'. Nejprve se ujistěte, že je prázdná. - -Loading… -== Načítání… - -Loading ghost files -== Načítání souborů duchů - -Ghosts directory -== Adresář duchů - -Activate all -== Aktivovat vše - -Deactivate all -== Deaktivovat vše - -Menu opened. Press Esc key again to close menu. -== Nabídka otevřena. Stisknutím klávesy Esc nabídku zavřete. - -Save power by lowering refresh rate (higher input latency) -== Šetřit energii snížením obnovovací frekvence (vyšší vstupní odezva) - -Settings file -== Soubor s nastavením - -Open the settings file -== Otevřít soubor s nastavením - -Config directory -== Adresář s konfigurací - -Open the directory that contains the configuration and user files -== Otevřít adresář, který obsahuje konfigurační a uživatelské soubory - -Open the directory to add custom themes -== Pro přidání vlastních motivů otevřte adresář - -Dummy -== Dummy - -Download community skins -== Stahovat komunitní skiny - -Create a random skin -== Vytvořit náhodný skin - -Choose default eyes when joining a server -== Vybrat výchozí oči po připojení k serveru - -Open the directory to add custom skins -== Pro přidání vlastních skinů otevřte adresář - -Chat command -== Chat příkaz - -Enable controller -== Povolit ovladač - -Controller -== Ovladač - -Ingame controller mode -== Režim ovladače ve hře - -[Ingame controller mode] -Relative -== Relativní - -[Ingame controller mode] -Absolute -== Absolutní - -Ingame controller sens. -== Citlivost ovladače ve hře - -UI controller sens. -== Citlivost ovladače v menu - -Controller jitter tolerance -== Tolerance nervozity ovladače - -No controller found. Plug in a controller. -== Nebyl nalezen žádný ovladač. Zapojte ovladač. - -Axis -== Osa - -Status -== Status - -Aim bind -== Bind míření - -Mouse -== Myš - -Ingame mouse sens. -== Citlivost myši ve hře - -UI mouse sens. -== Citlivost myši v menu - -Reset controls -== Resetovat ovládání - -Are you sure that you want to reset the controls to their defaults? -== Opravdu chcete obnovit výchozí nastavení ovládání? - -Cancel -== Zrušit - -Windowed -== V okně - -Windowed borderless -== V okně bez okrajů - -Windowed fullscreen -== Celá obrazovka v okně - -Desktop fullscreen -== Celá obrazovka plochy - -Allows maps to render with more detail -== Umožňuje vykreslovat mapy s většími detaily - -Renderer -== Renderer - -default -== výchozí - -custom -== vlastní - -Graphics card -== Grafická karta - -auto -== auto - -Appearance -== Vzhled - -Name Plate -== Jmenovka - -Hook Collisions -== Kolize Háku - -Info Messages -== Informační Zprávy - -Show health, shields and ammo -== Zobrazit zdraví, štíty a munici - -Show local time always -== Vždy zobrazovat místní čas - -DDRace HUD -== DDRace HUD - -Show DDRace HUD -== Zobrazit DDRace HUD - -Show jumps indicator -== Zobrazit indikátor skoku - -Show dummy actions -== Zobrazit akce dummyho - -Show player position -== Zobrazit pozici hráče - -Show player speed -== Zobrazit rychlost hráče - -Show player target angle -== Zobrazit cílový úhel hráče - -Show freeze bars -== Zobrazit freeze bary - -Opacity of freeze bars inside freeze -== Neprůhlednost freeze barů uvnitř freeze - -Chat font size -== Velikost písma chatu - -Chat width -== Šířka chatu - -Preview -== Náhled - -Show local player's key presses -== Zobrazit stisknutí kláves místních hráčů - -Authed name color in scoreboard -== Barva ověřeného hráče ve výsledkové tabulce - -Same clan color in scoreboard -== Barva stejného klanu ve výsledkové tabulce - -Hook collision line -== Čára kolize háku - -Hook collision line opacity -== Neprůhlednost čáry kolize háku - -Colors of the hook collision line, in case of a possible collision with: -== Barvy čáry kolize háku v případě kolize s: - -Your movements are not taken into account when calculating the line colors -== Váš pohyb se při výpočtu barev čar nebere v úvahu - -Nothing hookable -== Nic k zaháknutí - -Something hookable -== Něco k zaháknutí - -A Tee -== Hráč - -Show finish messages -== Zobrazit zprávy o dokončení - -Normal Color -== Normální Barva - -Highlight Color -== Zvýrazněná barva - -Weapons -== Zbraně - -Rifle Laser Outline Color -== Vnější Barva Laseru Pušky - -Rifle Laser Inner Color -== Vnitřní Barva Laseru Pušky - -Shotgun Laser Outline Color -== Vnější Barva Laseru Brokovnice - -Shotgun Laser Inner Color -== Vnitřní Barva Laseru Brokovnice - -Door Laser Outline Color -== Vnější Barva Laseru Dveří - -Door Laser Inner Color -== Vnitřní Barva Laseru Dveří - -Freeze Laser Outline Color -== Vnější Barva Freeze Laseru - -Freeze Laser Inner Color -== Vnitřní Barva Freeze Laseru - -Set all to Rifle -== Nastavit vše na Pušku - -Enable ghost -== Povolit ducha - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Po překročení startovní čáry ukázat ducha, který kopíruje pohyby vašeho nejlepšího času - -Opacity -== Neprůhlednost - -Only save improvements -== Ukládat pouze vylepšení - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Neprůhlednost entit patřících jiným týmům jako jsou hráči a jmenovky - -Quads are used for background decoration -== Quads se používají pro dekoraci pozadí - -Tries to predict other entities to give a feel of low latency -== Snaží se předpovídat jiné entity, aby navodil pocit nízké odezvy - -Background -== Pozadí - -Regular background color -== Běžná barva pozadí - -Entities background color -== Barva pozadí entit - -Run on join -== Spustit po připojení - -Chat command (e.g. showall 1) -== Chat příkaz (např. showall 1) - -Unregister protocol and file extensions -== Odregistrovat protokol a přípony souborů - -Extras -== Extra - -Loading assets -== Načítání aktiv - -Open the directory to add custom assets -== Pro přidání vlastních aktiv otevřte adresář - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -Tutorial -== Výuka - -Can't find a Tutorial server -== Nelze najít Výukový server - -Loading race demo files -== Načítání záznamů závodů - -Super -== Super - -Loading sound files -== Načítání zvukových souborů - -Moved ingame -== Přesun ve hře - -Loading demo file from storage -== Načítání souboru záznamu z úložiště - -No login required -== Bez přihlášení - -Player info change cooldown -== Cooldown změny informací o hráči - -Always show chat -== Vždy zobrazit chat - -Show friend mark (♥) in name plates -== Zobrazit značku přítele (♥) ve jmenovkách - -Show hook strength icon indicator -== Zobrazit sílu háku pomocí ikony - -Show hook strength number indicator -== Zobrazit sílu háku pomocí čísla - -Show own player's hook collision line -== Zobrazit čáru kolize háku vlastního hráče - -Always show own player's hook collision line -== Vždy zobrazit čáru kolize háku vlastního hráče - -Always show other players' hook collision lines -== Vždy zobrazit čáru kolize háků ostatních hráčů - -%d/%d KiB (%.1f KiB/s) -== %d/%d KiB (%.1f KiB/s) - -Tee -== Tee - -Show only chat messages from team members -== Zobrazit pouze zprávy od členů týmu - -Could not resolve connect address '%s'. See local console for details. -== Nelze získat adresu k připojení '%s'. Podrobnosti najdete v místní konzoli. - -Connect address error -== Chyba v adrese k připojení - -Could not connect dummy -== Nepodařilo se připojit dummyho - -[Spectating] -Following %s -== Sledujete %s - -Example of usage -== Příklad použití - -Dummy is not allowed on this server -== Dummy není na tomto serveru povolen - -Please wait… -== Čekejte prosím… - -Show client IDs (scoreboard, chat, spectator) -== Zobrazit ID klientů (výsledková tabulka, chat, divák) - -Are you sure that you want to delete '%s'? -== Jste si jisti, že chcete smazat '%s'? - -Delete skin -== Odstranit skin - -Basic -== Základní - -Custom -== Vlastní - -Unable to delete skin -== Nelze odstranit skin - -Round %d/%d -== Kolo %d/%d - -[Spectators] -%d others… -== %d dalších… - -[Team and size] -%d\n(%d/%d) -== %d\n(%d/%d) - -Team %d (%d/%d) -== Tým %d (%d/%d) - -https://wiki.ddnet.org/wiki/Mapping -== https://wiki.ddnet.org/wiki/Mapping - -Save skin -== Uložit skin - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== Opravdu chcete uložit svůj skin? Pokud skin s tímto názvem již existuje, bude nahrazen. - -Unable to save the skin -== Nelze uložit skin - -Unable to save the skin with a reserved name -== Nelze uložit skin s rezervovaným názvem - -No local servers found (ports %d-%d) -== Žádný místní server nenalezen (porty %d-%d) - -[Hertz] -Hz -== Hz - -[skins] -Body -== Tělo - -[skins] -Marking -== Značení - -[skins] -Decoration -== Dekorace - -[skins] -Hands -== Ruce - -[skins] -Feet -== Chodidla - -[skins] -Eyes -== Oči - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Some fonts could not be loaded. Check the local console for details. -== - -Loading background map -== - -[Spectating Camera Mode Icon] -AUTO -== - -Online friends (%d) -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Toggle auto camera -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Show client IDs in name plates -== - -Hook Strength -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Preview 'Hook collisions' being pressed -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Aim -== - -Active: Fire -== - -Active: Hook -== diff --git a/data/languages/danish.txt b/data/languages/danish.txt deleted file mode 100644 index 3f6666be10..0000000000 --- a/data/languages/danish.txt +++ /dev/null @@ -1,2074 +0,0 @@ -##### authors ##### -#originally created by: -# SnOrKilll -#modified by: -# matiasmunk 2011-08-06 22:49:11 -# Fin (b3z) 2020-11-11 20:05:00 -##### /authors ##### - -##### translated strings ##### - -%ds left -== %d sekunder tilbage - -%i minute left -== %i minut tilbage - -%i minutes left -== %i minutter tilbage - -%i second left -== %i sekund tilbage - -%i seconds left -== %i sekunder tilbage - -%s wins! -== %s vinder! - -Abort -== Afbryd - -Add -== Tilføj - -Add Friend -== Tilføj ven - -Address -== Adresse - -All -== Alle - -Are you sure that you want to quit? -== Er du sikker på at du vil afslutte? - -Automatically record demos -== Optag automatisk demoer - -Automatically take game over screenshot -== Tag automatisk et game over screenshot - -Blue team -== Blå hold - -Blue team wins! -== Blåt hold vinder! - -Body -== Krop - -Call vote -== Lav afstemning - -Change settings -== Ændre indstillinger - -Chat -== Chat - -Clan -== Klan - -Client -== Klient - -Connecting to -== Forbinder til - -Connection Problems… -== Forbindelsesproblemer… - -Console -== Konsol - -Controls -== Taster - -Count players only -== Tæl kun spillere - -Current -== Nuværende - -Custom colors -== Brugerdefinerede farver - -Delete -== Slet - -Delete demo -== Slet demo - -Demofile: %s -== Demo fil: %s - -Demos -== Demoer - -Disconnect -== Frakoble - -Disconnected -== Frakoblet - -Downloading map -== Downloader bane - -Draw! -== Uafgjort! - -Dynamic Camera -== Dynamisk kamera - -Emoticon -== Humørikoner - -Error -== Fejl - -Error loading demo -== Kunne ikke ikke indlæse demoen - -Favorite -== Favorit - -Favorites -== Favoritter - -Feet -== Fødder - -Fire -== Skyd - -Folder -== Mappe - -Force vote -== Tving afstemning - -Free-View -== Free-View - -Fullscreen -== Fuldskærm - -Game -== Spil - -Game info -== Spil info - -Game over -== Game over - -Game type -== Spiltype - -Game types: -== Spiltyper: - -General -== Generelt - -Graphics -== Grafik - -Grenade -== Granatkaster - -Hammer -== Hammer - -Has people playing -== Har folk som spiller - -High Detail -== Extra detaljer - -Hook -== Krog - -Invalid Demo -== Ugyldig demo - -Join blue -== Spil for blå - -Join red -== Spil for rød - -Jump -== Hop - -Kick player -== Udsmid spiller - -Language -== Sprog - -MOTD -== MOTD - -Map -== Kort - -Move left -== Gå til venstre - -Move player to spectators -== Flyt spilleren til tilskuerne - -Move right -== Gå til højre - -Movement -== Bevægelse - -Mute when not active -== Ingen lyd når du ikke er aktiv - -Name -== Navn - -Next weapon -== Næste våben - -Nickname -== Navn - -No -== Nej - -No password -== Ingen adgangskode - -No servers found -== Ingen servere fundet - -No servers match your filter criteria -== Ingen servere matcher din filterkriterier - -Ok -== Ok - -Parent Folder -== Overmappe - -Password -== Adgangskode - -Password incorrect -== Forkert adgangskode - -Ping -== Ping - -Pistol -== Pistol - -Play background music -== Spil baggrunds musik - -Player -== Spiller - -Player country: -== Spillernes land: - -Players -== Spillere - -Please balance teams! -== Balancer venligst holdet! - -Prev. weapon -== Foregående våben - -Quit -== Afslut - -Reason: -== Grund: - -Red team -== Rødt hold - -Red team wins! -== Rødt hold vinder! - -Remote console -== Serverkonsol - -Remove -== Fjern - -Remove friend -== Fjern ven - -Rename demo -== Omdøb navn på demoen - -Reset filter -== Nulstil filter - -Score -== Score - -Score limit -== Score grænse - -Scoreboard -== Resultatliste - -Screenshot -== Skærmbillede - -Server address: -== Serveradresse - -Server info -== Serverinfo - -Server not full -== Ikke fuld server - -Shotgun -== Haglgevær - -Show chat -== Vis chat - -Show friends only -== Vis venner - -Show ingame HUD -== Vis HUD i spillet - -Show name plates -== Vis navneskilte - -Sound -== Lyd - -Sound error -== Lyd fejl - -Spectate -== Kig på - -Spectate next -== Kig på næste - -Spectate previous -== Kig på forrige - -Spectator mode -== Tilskuer mode - -Spectators -== Tilskuer - -Stop record -== Stop optagelse - -Strict gametype filter -== Streng spiltype filter - -Sudden Death -== Sudden Death - -Switch weapon on pickup -== Byt våben ved anskafning - -Team -== Hold - -Team chat -== Holdchat - -The audio device couldn't be initialised. -== Lydenheden kunne ikke startes - -The server is running a non-standard tuning on a pure game type. -== Denne server kører på en ikke-standard tuning på en ren spilletype. - -Time limit -== Tidsbegrænsning - -Time limit: %d min -== Tidsbegrænsning: %d min - -Try again -== Forsøg igen - -Type -== Type - -Unable to rename the demo -== Kunne ikke omdøbe demoen - -Use sounds -== Anvend lydeffekter - -Use team colors for name plates -== Anvend holdfarver til navneskilte - -V-Sync -== V-Sync - -Version -== Version - -Vote command: -== Afstemningsordre: - -Vote description: -== Afstemningsbeskrivelse: - -Vote no -== Stem nej - -Vote yes -== Stem ja - -Voting -== Afstemning - -Warmup -== Opvarmning - -Weapon -== Våben - -Yes -== Ja - -You must restart the game for all settings to take effect. -== Du skal genstarte spillet før alle indstillingerne virker. - -##### needs translation ##### - -New name: -== Nyt navn: - -Sat. -== Mætning - -Miscellaneous -== Diverse - -Internet -== Internet - -Max demos -== Max antal demoer - -News -== Nyheder - -Join game -== Start spil - -FSAA samples -== FSAA samples - -Sound volume -== Lydstyrke - -Max Screenshots -== Max antal screenshots - -Laser -== Laser - -Hue -== Farve - -Record demo -== Optag demo - -Your skin -== Dit udseende - -Reset to defaults -== Sæt til standard - -Lht. -== Lys - -UI Color -== Brugergrænseflade farve - -Alpha -== Alpha - -LAN -== LAN - -Name plates size -== Størrelse på navneskilte - -Successfully saved the replay! -== Afspilning blev gemt! - -Replay feature is disabled! -== Afspilningsfunktionen er deaktiveret! - -Warning -== Advarsel - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Fejlfindingstilstand aktiveret. Tryk på Ctrl+Shift+D for at deaktivere fejlretningstilstand. - -Game paused -== Spillet sat på pause - -Server best: -== Server bedst: - -Personal best: -== Personlig bedst: - -Browser -== Browser - -Ghost -== Spøgelse - -Loading DDNet Client -== Indlæser DDNet Klient - -Reconnect in %d sec -== Tilslut igen om %d sek - -Render demo -== Gengive demo - -Replace video -== Udskift video - -File already exists, do you want to overwrite it? -== Filen findes allerede. Vil du overskrive den? - -Are you sure that you want to disconnect? -== Er du sikker på, at du vil afbryde forbindelsen? - -Disconnect Dummy -== Afbryd dummy - -Are you sure that you want to disconnect your dummy? -== Er du sikker på, at du vil afbryde din dummy? - -Welcome to DDNet -== Velkommen til DDNet - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork er et samarbejdsvilligt onlinespil, hvor målet er, at du og din gruppe tees når målstregen på kortet. Som nybegynder skal du starte på Novice-servere, som er vært for de nemmeste kort. Overvej ping for at vælge en server tæt på dig. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Brug k tasten til at dræbe (genstart), q for at sætte pause og se andre spillere. Se indstillinger for andre tastebindinger. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Det anbefales, at du kontrollerer indstillingerne for at justere dem efter eget valg, før du opretter forbindelse til en server. - -Please enter your nickname below. -== Indtast dit kaldenavn nedenfor. - -Existing Player -== Eksisterende Spiller - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Your nickname '%s' is already in use (%d points). Do you still want to use it? - -Checking for existing player with your name -== Kontrollerer for eksisterende spiller med dit navn - -Speed -== Hastighed - -Video name: -== Video navn: - -Show DDNet map finishes in server browser -== Vis DDNet kort færdig i serverbrowseren - -transmits your player name to info.ddnet.org -== sender dit spillernavn til info.ddnet.org - -Theme -== Tema - -Search -== Søg - -Exclude -== Udelukke - -%d of %d servers -== %d ud af %d servere - -%d of %d server -== %d af %d server - -%d players -== %d spillere - -%d player -== %d spiller - -Filter connecting players -== Filtrer forbindende spillere - -Indicate map finish -== Angiv, om kortet er færdigt - -Unfinished map -== Ufærdigt kort - -Countries -== Lande - -Types -== Typer - -Remove chat -== Fjern chat - -%.2f MiB -== %.2f MiB - -%.2f KiB -== %.2f KiB - -Demo -== Demo - -Markers -== Markører - -Length -== Længde - -Date -== Dato - -Fetch Info -== Hent info - -Demos directory -== Demoer vejviser - -Connecting dummy -== Forbinder dummy - -Connect Dummy -== Forbind dummy - -Kill -== Dræbe - -Pause -== Pause - -Deactivate -== Deaktiver - -Activate -== Aktivér - -Save -== Gemme - -Smooth Dynamic Camera -== Glat Dynamisk Kamera - -Switch weapon when out of ammo -== Skift våben, når du er ude af ammunition - -Show only chat messages from friends -== Vis kun chatbeskeder fra venner - -Show clan above name plates -== Vis klan over navneskilt - -Clan plates size -== Klanetiketstørrelse - -Skip the main menu -== Spring hovedmenuen over - -Refresh Rate -== Opdateringshastighed - -Themes directory -== Tema vejviser - -Automatically take statboard screenshot -== Tag automatisk skærmbillede på statboard - -Automatically create statboard csv -== Opret automatisk statboard csv - -Max CSVs -== Maks CSVs - -Download skins -== Download skind - -Vanilla skins only -== Kun vaniljeskind - -Fat skins (DDFat) -== Fed skind (DDFat) - -Skin prefix -== Hudpræfiks - -Skin Database -== Huddatabase - -Skins directory -== Skind vejviser - -Hook collisions -== Krogkollisioner - -Zoom in -== Zoome ind - -Zoom out -== Zoome ud - -Default zoom -== Standard zoom - -Show others -== Vis andre - -Show all -== Vis alt - -Toggle dyncam -== Skift dyncam - -Toggle dummy -== Skift dummy - -Toggle ghost -== Skift spøgelse - -Dummy copy -== Skift kopi - -Hammerfly dummy -== Hammerflyve dummy - -Converse -== Snak - -Statboard -== Statboard - -Lock team -== Lås team - -Show entities -== Vis entities - -Show HUD -== Vis HUD - -may cause delay -== kan forårsage forsinkelse - -Screen -== Skærm - -Use high DPI -== Brug højt DPI - -Enable game sounds -== Aktivér spillyde - -Enable gun sound -== Aktivér pistollyd - -Enable long pain sound (used when shooting in freeze) -== Aktivér lyd med lang smerte (bruges når du falder i frysepunkt) - -Enable server message sound -== Aktivér serverbeskedlyd - -Enable regular chat sound -== Aktivér regelmæssig chatlyd - -Enable team chat sound -== Aktivér teamchat-lyd - -Enable highlighted chat sound -== Aktivér fremhævet chatlyd - -Game sound volume -== Spillydstyrke - -Chat sound volume -== Chatlydstyrke - -Map sound volume -== Kortlydstyrke - -Background music volume -== Baggrundsmusikvolumen - -HUD -== HUD - -DDNet -== DDNet - -Assets -== Assets - -DDNet Client needs to be restarted to complete update! -== DDNet Klient skal genstartes for at fuldføre opdateringen! - -Show score -== Vis score - -Use old chat style -== Brug gammel chat-stil - -Show names in chat in team colors -== Vis navne i chat i teamfarver - -Show kill messages -== Vis dræb beskeder - -Show votes window after voting -== Vis vinduet med stemmer efter afstemning - -Messages -== Beskeder - -System message -== Systemmeddelelse - -Reset -== Nulstil - -Highlighted message -== Fremhævet besked - -Team message -== Team besked - -Friend message -== Ven besked - -Normal message -== Normal besked - -Client message -== Klient besked - -Save the best demo of each race -== Gem den bedste demo af hvert løb - -Default length -== Standardlængde - -Enable replays -== Aktivér gentagelser - -Show ghost -== Vis spøgelse - -Save ghost -== Gem spøgelse - -Gameplay -== Gameplay - -Overlay entities -== Dække entities - -Size -== Størrelse - -Show text entities -== Vis tekst entities - -Show others (own team only) -== Vis andre (kun eget hold) - -Show quads -== Vis quads - -AntiPing -== AntiPing - -AntiPing: predict other players -== AntiPing: forudsige andre spillere - -AntiPing: predict weapons -== AntiPing: forudsige våben - -AntiPing: predict grenade paths -== AbtiPing: forudsige granatstier - -Show other players' hook collision lines -== Vis andre spillers kroge kollisionslinjer - -Show other players' key presses -== Vis andre spillers tastetryk - -Use current map as background -== Brug det aktuelle kort som baggrund - -Show tiles layers from BG map -== Vis fliselag fra baggrundskortet - -DDNet %s is available: -== DDNet %s er tilgængelig: - -Update now -== Opdatere nu - -Updating… -== Opdaterer… - -DDNet Client updated! -== DDNet Klient opdateret! - -No updates available -== Ingen opdateringer tilgængelige - -Check now -== Tjek nu - -New random timeout code -== Ny tilfældig timeout kode - -Entities -== Entities - -Emoticons -== Humørikoner - -Particles -== Partikler - -Assets directory -== Assets vejviser - -Learn -== Lære - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ - -Website -== Internet side - -Settings -== Indstillinger - -Stop server -== Stop server - -Run server -== Kør server - -Server executable not found, can't run server -== Server eksekverbar blev ikke fundet, kan ikke køre server - -Editor -== Redaktør - -[Start menu] -Play -== Spil - -DDNet %s is out! -== DDNet %s er ude! - -Downloading %s: -== Downloader %s: - -Update failed! Check log… -== Opdatering fejlede! Tjek log… - -Restart -== Genstart - -Time -== Tid - -Manual -== Manual - -Race -== Race - -Auto -== Auto - -Replay -== Afspil igen - -Follow -== Følge med - -Frags -== Frags - -Deaths -== Dødsfalder - -Suicides -== Selvmord - -Ratio -== Forhold - -Net -== Net - -FPM -== FPM - -Spree -== Spree - -Best -== Bedst - -Grabs -== Tager fat - -1 new mention -== 1 ny nævne - -%d new mentions -== %d ny nævner - -9+ new mentions -== 9+ ny nævner - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not save downloaded map. Try manually deleting this file: %s -== - -Could not connect dummy -== - -Error playing demo -== - -Failed saving the replay! -== - -Saving settings to '%s' failed -== - -Error saving settings -== - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -The format of texture %s is not RGBA which will cause visual bugs. -== - -Preparing demo playback -== - -Connected -== - -Loading map file from storage -== - -Loading demo file from storage -== - -Some fonts could not be loaded. Check the local console for details. -== - -Initializing components -== - -Why are you slowmo replaying to read this? -== - -Initializing assets -== - -Initializing map logic -== - -Sending initial client info -== - -Quitting. Please wait… -== - -Restarting. Please wait… -== - -Loading skin files -== - -Loading background map -== - -Searching -== - -Enter Username -== - -Enter Password -== - -NOT CONNECTED -== - -Match %d of %d -== - -No results -== - -Lines %d - %d (%s) -== - -Locked -== - -Following -== - -Loading commands… -== - -Position: -== - -Speed: -== - -Angle: -== - -Multi-View -== - -[Spectating] -Following %s -== - -[Spectating Camera Mode Icon] -AUTO -== - -Team %d -== - -Some map images could not be loaded. Check the local console for details. -== - -Uploading map data to GPU -== - -Some map sounds could not be loaded. Check the local console for details. -== - -Loading menu themes -== - -Press a key… -== - -Main menu -== - -Rename folder -== - -Render complete -== - -Are you sure that you want to restart? -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -There's an unsaved map in the editor, you might want to save it. -== - -Continue anyway? -== - -A demo with this name already exists -== - -A folder with this name already exists -== - -Unable to rename the folder -== - -File '%s' already exists, do you want to overwrite it? -== - -(paused) -== - -Videos directory -== - -Video was saved to '%s' -== - -Join Tutorial Server -== - -Skip Tutorial -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -Trying to determine UDP connectivity… -== - -UDP seems to be filtered. -== - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== - -No answer from server yet. -== - -%d/%d KiB (%.1f KiB/s) -== - -Getting game info -== - -Requesting to join the game -== - -Loading menu images -== - -AFR -== - -ASI -== - -AUS -== - -EUR -== - -NA -== - -SA -== - -CHN -== - -Getting server list from master server -== - -No local servers found (ports %d-%d) -== - -Example of usage -== - -Are you sure that you want to disconnect and switch to a different server? -== - -No login required -== - -Communities -== - -Copy info -== - -Leak IP -== - -No server selected -== - -Online friends (%d) -== - -Online clanmates (%d) -== - -[friends (server browser)] -Offline (%d) -== - -Click to select server. Double click to join your friend. -== - -Click to remove this player from your friends list. -== - -Click to remove this clan from your friends list. -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Are you sure that you want to remove the player '%s' from your friends list? -== - -Are you sure that you want to remove the clan '%s' from your friends list? -== - -Add Clan -== - -Server filter -== - -Friends -== - -Play the current demo -== - -Pause the current demo -== - -Stop the current demo -== - -Go back the specified duration -== - -[Demo player duration] -%d min. -== - -[Demo player duration] -%d sec. -== - -Change the skip duration -== - -Go forward the specified duration -== - -Go back one tick -== - -Go forward one tick -== - -Go back one marker -== - -Go forward one marker -== - -Slow down the demo -== - -Speed up the demo -== - -Mark the beginning of a cut (right click to reset) -== - -Mark the end of a cut (right click to reset) -== - -Export cut as a separate demo -== - -Close the demo player -== - -Toggle keyboard shortcuts -== - -Toggle auto camera -== - -Export demo cut -== - -Cut interval -== - -Cut length -== - -Render cut to video -== - -Please use a different filename -== - -Loading demo files -== - -All combined -== - -No demo selected -== - -Folder Link -== - -Created -== - -Netversion -== - -[Demo details] -map not included -== - -Open the directory that contains the demo files -== - -Are you sure that you want to delete the folder '%s'? -== - -Are you sure that you want to delete the demo '%s'? -== - -Delete folder -== - -Unable to delete the demo '%s' -== - -Unable to delete the folder '%s'. Make sure it's empty first. -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Loading… -== - -Loading ghost files -== - -Ghosts directory -== - -Activate all -== - -Deactivate all -== - -Menu opened. Press Esc key again to close menu. -== - -[Hertz] -Hz -== - -Save power by lowering refresh rate (higher input latency) -== - -Settings file -== - -Open the settings file -== - -Config directory -== - -Open the directory that contains the configuration and user files -== - -Open the directory to add custom themes -== - -Dummy -== - -Player info change cooldown -== - -Download community skins -== - -Create a random skin -== - -Choose default eyes when joining a server -== - -Open the directory to add custom skins -== - -Chat command -== - -Enable controller -== - -Controller -== - -Ingame controller mode -== - -[Ingame controller mode] -Relative -== - -[Ingame controller mode] -Absolute -== - -Ingame controller sens. -== - -UI controller sens. -== - -Controller jitter tolerance -== - -No controller found. Plug in a controller. -== - -Axis -== - -Status -== - -Aim bind -== - -Mouse -== - -Ingame mouse sens. -== - -UI mouse sens. -== - -Reset controls -== - -Are you sure that you want to reset the controls to their defaults? -== - -Cancel -== - -Windowed -== - -Windowed borderless -== - -Windowed fullscreen -== - -Desktop fullscreen -== - -Allows maps to render with more detail -== - -Renderer -== - -default -== - -custom -== - -Graphics card -== - -auto -== - -Tee -== - -Appearance -== - -Name Plate -== - -Hook Collisions -== - -Info Messages -== - -Show health, shields and ammo -== - -Show local time always -== - -Authed name color in scoreboard -== - -Same clan color in scoreboard -== - -DDRace HUD -== - -Show client IDs (scoreboard, chat, spectator) -== - -Show DDRace HUD -== - -Show jumps indicator -== - -Show dummy actions -== - -Show player position -== - -Show player speed -== - -Show player target angle -== - -Show freeze bars -== - -Opacity of freeze bars inside freeze -== - -Always show chat -== - -Show only chat messages from team members -== - -Chat font size -== - -Chat width -== - -Preview -== - -Show friend mark (♥) in name plates -== - -Show client IDs in name plates -== - -Hook Strength -== - -Show hook strength icon indicator -== - -Show hook strength number indicator -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Show local player's key presses -== - -Size of key press icons -== - -Hook collision line -== - -Show own player's hook collision line -== - -Always show own player's hook collision line -== - -Always show other players' hook collision lines -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Hook collision line opacity -== - -Colors of the hook collision line, in case of a possible collision with: -== - -Your movements are not taken into account when calculating the line colors -== - -Nothing hookable -== - -Something hookable -== - -A Tee -== - -Preview 'Hook collisions' being pressed -== - -Show finish messages -== - -Normal Color -== - -Highlight Color -== - -Weapons -== - -Rifle Laser Outline Color -== - -Rifle Laser Inner Color -== - -Shotgun Laser Outline Color -== - -Shotgun Laser Inner Color -== - -Door Laser Outline Color -== - -Door Laser Inner Color -== - -Freeze Laser Outline Color -== - -Freeze Laser Inner Color -== - -Set all to Rifle -== - -Enable ghost -== - -When you cross the start line, show a ghost tee replicating the movements of your best time -== - -Opacity -== - -Only save improvements -== - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== - -Quads are used for background decoration -== - -Tries to predict other entities to give a feel of low latency -== - -Background -== - -Regular background color -== - -Entities background color -== - -Run on join -== - -Chat command (e.g. showall 1) -== - -Unregister protocol and file extensions -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Extras -== - -Loading assets -== - -Open the directory to add custom assets -== - -Discord -== - -https://ddnet.org/discord -== - -Tutorial -== - -Can't find a Tutorial server -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Loading race demo files -== - -Round %d/%d -== - -[Spectators] -%d others… -== - -Super -== - -[Team and size] -%d\n(%d/%d) -== - -Team %d (%d/%d) -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Loading sound files -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -Moved ingame -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/dutch.txt b/data/languages/dutch.txt deleted file mode 100644 index a30178b3cb..0000000000 --- a/data/languages/dutch.txt +++ /dev/null @@ -1,2085 +0,0 @@ -##### authors ##### -#originally created by: -# -#modified by: -# vierkant 2010-06-03 19:06:34 -# vierkant 2010-06-04 13:20:25 -# vierkant 2010-06-09 14:40:12 -# Sijmen Schoon 2010-11-21 16:08:46 -# vierkant 2010-11-21 18:19:48 -# vierkant 2010-12-16 19:44:49 -# vierkant 2011-01-03 12:22:05 -# vierkant 2011-01-29 18:40:28 -# vierkant 2011-04-02 22:19:30 -# Vijfhoek 2011-05-02 18:09:31 -# Syntax Error 2011-07-02 20:09:24 -# Yared Hufkens 2012-02-03 19:57:59 -# Yared Hufkens 2012-12-08 10:51:30 -# Ronan 2022-05-17 22:22:22 -##### /authors ##### - -##### translated strings ##### - -%ds left -== %ds over - -%i minute left -== nog %i minuut - -%i minutes left -== nog %i minuten - -%i second left -== nog %i seconde - -%i seconds left -== nog %i seconden - -%s wins! -== %s wint! - -Abort -== Afbreken - -Add -== Toevoegen - -Add Friend -== Voeg vriend toe - -Address -== Adres - -All -== Alle - -Are you sure that you want to quit? -== Weet je zeker dat je wilt stoppen? - -Automatically record demos -== Automatisch demo's opnemen - -Automatically take game over screenshot -== Automatisch schermafbeeldingen nemen bij einde spel - -Blue team -== Blauwe team - -Blue team wins! -== Blauwe team wint! - -Body -== Lichaam - -Call vote -== Stem - -Change settings -== Verander instellingen - -Chat -== Chat - -Clan -== Clan - -Client -== Client - -Connecting to -== Verbinden met - -Connection Problems… -== Verbindingsproblemen… - -Console -== Console - -Controls -== Besturing - -Count players only -== Alleen spelers tellen - -Current -== Huidig - -Custom colors -== Aangepaste kleuren - -Delete -== Verwijder - -Delete demo -== Verwijder demo - -Demofile: %s -== Demobestand: %s - -Demos -== Demo's - -Disconnect -== Stoppen - -Disconnected -== Verbinding verbroken - -Downloading map -== Kaart aan het downloaden - -Draw! -== Gelijkspel! - -Dynamic Camera -== Dynamische Camera - -Emoticon -== Emoticon - -Error -== Fout - -Error loading demo -== Fout bij laden demo - -Favorite -== Favoriet - -Favorites -== Favorieten - -Feet -== Voeten - -Fire -== Schieten - -Folder -== Map - -Force vote -== Stem forceren - -Free-View -== Vrij bewegen - -Fullscreen -== Volledig scherm - -Game -== Spel - -Game info -== Spelinfo - -Game over -== Spel afgelopen - -Game type -== Speltype - -Game types: -== Speltypes: - -General -== Algemeen - -Graphics -== Beeld - -Grenade -== Granaat - -Hammer -== Hamer - -Has people playing -== Mensen in server - -High Detail -== Hoge Details - -Hook -== Haak - -Invalid Demo -== Ongeldige demo - -Join blue -== Ga bij blauw - -Join red -== Ga bij rood - -Jump -== Springen - -Kick player -== Kick speler - -Language -== Taal - -MOTD -== MOTD - -Map -== Kaart - -Move left -== Naar links - -Move player to spectators -== Verplaats speler naar toeschouwers - -Move right -== Naar rechts - -Movement -== Bewegen - -Mute when not active -== Dempen wanneer inactief - -Name -== Naam - -Next weapon -== Volgend wapen - -Nickname -== Bijnaam - -No -== Nee - -No password -== Geen wachtwoord - -No servers found -== Geen servers gevonden - -No servers match your filter criteria -== Geen servers komen overeen met je filtercriteria - -Ok -== Oké - -Parent Folder -== Bovenliggende map - -Password -== Wachtwoord - -Password incorrect -== Wachtwoord verkeerd - -Ping -== Ping - -Pistol -== Pistool - -Play background music -== Speel achtergrondmuziek - -Player -== Speler - -Player country: -== Speler land: - -Players -== Spelers - -Please balance teams! -== Balanceer teams! - -Prev. weapon -== Vorig wapen - -Quit -== Afsluiten - -Reason: -== Reden: - -Red team -== Rode team - -Red team wins! -== Rode team wint! - -Remote console -== Remote console - -Remove -== Verwijderen - -Remove friend -== Verwijder vriend - -Rename demo -== Hernoem demo - -Reset filter -== Herstel filter - -Score -== Score - -Score limit -== Score limiet - -Scoreboard -== Scorebord - -Screenshot -== Schermafbeelding - -Server address: -== Serveradres: - -Server info -== Serverinfo - -Server not full -== Server niet vol - -Shotgun -== Shotgun - -Show chat -== Laat chat zien - -Show friends only -== Laat alleen vrienden zien - -Show ingame HUD -== Laat ingame HUD zien - -Show name plates -== Laat naamplaat zien - -Sound -== Geluid - -Sound error -== Geluidsfout - -Spectate -== Toekijken - -Spectate next -== Volg volgende speler - -Spectate previous -== Volg vorige speler - -Spectator mode -== Toeschouwermode - -Spectators -== Toeschouwers - -Stop record -== Stop met opnemen - -Strict gametype filter -== Strikt speltype filter - -Sudden Death -== Sudden Death - -Switch weapon on pickup -== Verander wapen bij het oppakken - -Team -== Team - -Team chat -== Team chat - -The audio device couldn't be initialised. -== Het audioapparaat kon niet worden geïnitialiseerd. - -The server is running a non-standard tuning on a pure game type. -== The server draait geen standaard spel type. - -Time limit -== Tijdslimiet - -Time limit: %d min -== Tijdslimiet: %d minuten - -Try again -== Probeer opnieuw - -Type -== Type - -Unable to rename the demo -== Niet mogelijk om de demo te hernoemen - -Use sounds -== Gebruik geluiden - -Use team colors for name plates -== Gebruik teamkleuren voor naamplaten - -V-Sync -== V-Sync - -Version -== Versie - -Vote command: -== Stemcommando: - -Vote description: -== Stemomschrijving: - -Vote no -== Stem nee - -Vote yes -== Stem ja - -Voting -== Stemmen - -Warmup -== Opwarmen - -Weapon -== Wapen - -Yes -== Ja - -You must restart the game for all settings to take effect. -== Je moet het spel herstarten voordat de veranderingen effect hebben. - -##### needs translation ##### - -New name: -== Nieuwe naam: - -Sat. -== Verz. - -Miscellaneous -== Diverse - -Internet -== Internet - -Max demos -== Maximaal aantal demo's - -News -== Nieuws - -Join game -== Binnenkomen - -FSAA samples -== FSAA samples - -Sound volume -== Volume - -Max Screenshots -== Maximaal aantal schermafbeeldingen - -Laser -== Laser - -Hue -== Tint - -Record demo -== Neem demo op - -Your skin -== Jouw skin - -Reset to defaults -== Terugzetten naar standaardinstellingen - -Lht. -== Licht - -UI Color -== UI Kleur - -Alpha -== Alpha - -LAN -== LAN - -Name plates size -== Grootte naamplaat - -Successfully saved the replay! -== De replay is succesvol opgeslagen! - -Replay feature is disabled! -== Replay functie is uitgeschakeld! - -Game paused -== Spel gepauzeerd - -Server best: -== Servers record: - -Personal best: -== Persoonlijk record: - -Learn -== Leren - -Browser -== Verkenner - -Ghost -== Spook - -Loading DDNet Client -== DDNet Client laden - -Reconnect in %d sec -== Opnieuw verbinden in %d sec - -Render demo -== Demo renderen - -Replace video -== Video vervangen - -File already exists, do you want to overwrite it? -== Dit bestand bestaat al, wil je het vervangen? - -Are you sure that you want to disconnect? -== Weet je zeker dat je de server wilt verlaten? - -Disconnect Dummy -== Dummy loskoppelen - -Are you sure that you want to disconnect your dummy? -== Weet je zeker dat je je dummy wilt loskoppelen? - -Welcome to DDNet -== Welkom bij DDNet - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork is een coöperatief online spel waar het doel is om met jezelf en je medespelers de finish van de map te behalen. Als een nieuwkomer kun je het best starten op een Novice server, waar je de makkelijkste maps zult vinden. Neem je ping in overweging bij het kiezen van een server. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Het wordt aangeraden dat je de instellingen bekijkt en ze aanpast naar jouw wensen voordat je met een server verbindt. - -Please enter your nickname below. -== Voer je bijnaam in a.u.b. - -Video name: -== Video naam: - -Show DDNet map finishes in server browser -== Laat gefinishte maps zien in de verkenner - -transmits your player name to info.ddnet.org -== verzendt je speler naam naar info.ddnet.org - -Search -== Zoek - -Exclude -== Uitsluiten - -Filter connecting players -== Filter verbindende spelers - -Indicate map finish -== Laat map finish zien - -Unfinished map -== Niet gefinishte map - -Countries -== Landen - -Types -== Types - -DDNet %s is out! -== DDNet %s is beschikbaar! - -Downloading %s: -== Downloaden %s: - -Update failed! Check log… -== Update fout! Check log… - -DDNet Client updated! -== DDNet Client is geüpdate - -Update now -== Nu updaten - -Restart -== Herstarten - -Remove chat -== Verwijder chat - -%.2f MiB -== %.2f MiB - -%.2f KiB -== %.2f KiB - -Demo -== Demo - -Markers -== Markeringen - -Length -== Lengte -Date -== Datum - -Fetch Info -== Info opvragen - -Connecting dummy -== Dummy verbinden - -Connect Dummy -== Verbind Dummy - -Deactivate -== Deactiveren - -Activate -== Activeren - -Save -== Opslaan - -Switch weapon when out of ammo -== Verander wapen wanneer de munitie op is - -Show only chat messages from friends -== Laat alleen berichten van vrienden zien - -Show clan above name plates -== Laat clan boven naamplaten zien - -Clan plates size -== Clan plaat grootte - -Refresh Rate -== Vernieuwingsfrequentie - -Automatically take statboard screenshot -== Automatisch statistiekbord screenshot nemen - -Automatically create statboard csv -== Automatisch statistiekbord csv creëren - -Max CSVs -== Max CSVs - -Vanilla skins only -== Alleen vanilla skins - -Fat skins (DDFat) -== Fat skins (DDFat) - -Skin prefix -== Skin prefix - -Hook collisions -== Hookraaklijnen - -Pause -== Pauze - -Kill -== Zelfmoord - -Zoom in -== Inzoomen - -Zoom out -== Uitzoomen - -Default zoom -== Standaard zoom - -Show others -== Laat anderen zien - -Show all -== Laat iedereen zien - -Toggle dyncam -== Dyncam aan/uit - -Toggle dummy -== Wissel naar dummy - -Toggle ghost -== Spook in/uit - -Dummy copy -== Dummy copy - -Hammerfly dummy -== Hamervlieg dummy - -Converse -== Converseren - -Statboard -== Statistiekbord - -Lock team -== Team versleutelen - -Show entities -== Laat entities zien - -Show HUD -== Laat HUD zien - -may cause delay -== kan voor vertraging zorgen - -Screen -== Scherm - -Use high DPI -== Gebruik hoge DPI - -Enable game sounds -== Schakel spelgeluid in - -Enable gun sound -== Schakel pistool geluid in - -Enable long pain sound (used when shooting in freeze) -== Schakel lang pijn geluid in (wanneer je schiet in freeze) - -Enable server message sound -== Schakel server berichten geluid in - -Enable regular chat sound -== Schakel regulier chat geluid in - -Enable team chat sound -== Schakel team chat geluid in - -Enable highlighted chat sound -== Schakel gemarkeerde chat geluiden in - -Map sound volume -== Map geluid volume - -HUD -== HUD - -DDNet -== DDNet - -DDNet Client needs to be restarted to complete update! -== DDNet Client moet herstart worden om de update te voltooien! - -Show score -== Laat score zien - -Show names in chat in team colors -== Laat namen in chat in de kleuren van het team zien - -Show kill messages -== Laat sterfberichten zien - -Show votes window after voting -== Laat stemscherm zien na het stemmen - -Messages -== Berichten - -System message -== Systeembericht - -Reset -== Reset - -Highlighted message -== Gemarkeerd bericht - -Team message -== Teambericht - -Friend message -== Bericht van een vriend - -Normal message -== Normaal bericht - -Save the best demo of each race -== Sla de beste demo op van elke race - -Default length -== Standaard lengte - -Enable replays -== Replays aanzetten - -Show ghost -== Laat spook zien - -Save ghost -== Sla spook op - -Gameplay -== Gameplay - -Overlay entities -== Overlay entities - -Size -== Grootte - -Show text entities -== Laat text entities zien - -Show others (own team only) -== Laat anderen zien (alleen eigen team) - -Show quads -== Laat quads zien - -AntiPing -== AntiPing - -AntiPing: predict other players -== AntiPing: Voorspel andere spelers - -AntiPing: predict weapons -== AntiPing: Voorspel wapens - -AntiPing: predict grenade paths -== AntiPing: Voorspel de baan van granaten - -Show other players' hook collision lines -== Laat de hookraaklijn van andere spelers zien - -Show other players' key presses -== Laat toetsaanslagen van andere spelers zien - -Show tiles layers from BG map -== Laat tegellagen van achtergrondmap zien - -DDNet %s is available: -== DDNet %s is beschikbaar - -Updating… -== Aan het updaten - -No updates available -== Geen updates beschikbaar - -Check now -== Check nu - -New random timeout code -== Nieuwe willekeurige time-out code - -Time -== Tijd - -Follow -== Volg - -Frags -== Liquidaties - -Deaths -== Doodgegaan - -Suicides -== Zelfmoorden - -Ratio -== Ratio - -Spree -== Reeks - -Best -== Beste - -Grabs -== Grepen - -1 new mention -== 1 nieuw bericht - -%d new mentions -== %d nieuwe berichten - -9+ new mentions -== 9+ nieuwe berichten - -Manual -== Manual - -Race -== Race - -Auto -== Automatisch - -Replay -== Herhaling - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== De wijdte van de texture %s is niet te delen door %d, of de hoogte is niet te delen door %d wat visuele bugs kan veroorzaken. - -The format of texture %s is not RGBA which will cause visual bugs. -== Het format van de texture %s is niet RGBA, hetgeen zal visuele bugs veroorzaken. - -Warning -== Waarschuwing - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Debug mode is geactiveerd. Gebruik Ctrl+Shift+D om debug mode te deactiveren. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Gebruik de k toets om jezelf te doden (herstarten), q om te pauzeren en andere spelers te bekijken. Zie instellingen voor andere toetsenbindingen. - -Existing Player -== Bestaande speler - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Jouw gebruikersnaam '%s' is al in gebruik (%d points). Wil je deze naam alsnog gebruiken? - -Checking for existing player with your name -== Aan het zoeken naar bestaande spelers met jouw naam - -Are you sure that you want to disconnect and switch to a different server? -== Weet je zeker dat je de verbinding wilt verbreken en wilt verbinden met een andere server? - -Speed -== Snelheid - -Join Tutorial Server -== Tutorial server betreden - -Skip Tutorial -== Tutorial overslaan - -Theme -== Thema - -AFR -== AFR - -ASI -== AZI - -AUS -== AUS - -EUR -== EUR - -NA -== NA - -SA -== ZA - -CHN -== CHN - -Getting server list from master server -== Serverlijst ophalen bij masterserver - -%d of %d servers -== %d van de %d servers - -%d of %d server -== %d van %d server - -%d players -== %d spelers - -%d player -== %d speler - -Leak IP -== Lek IP - -Demos directory -== Demo's map - -Smooth Dynamic Camera -== Vloeiende Dynamische Camera - -Skip the main menu -== Sla het hoofdmenu over - -Settings file -== Instellingenbestand - -Config directory -== Configuratie map - -Themes directory -== Thema map - -Download skins -== Skins downloaden - -Choose default eyes when joining a server -== Kies standaard ogen wanneer je een server betreedt - -Skin Database -== Skin database - -Skins directory -== Skins map - -Chat command -== Chat command - -Dummy -== Dummy - -Windowed -== Venster - -Windowed borderless -== Randloos venster - -Windowed fullscreen -== Volledigscherm (in venster) - -Desktop fullscreen -== Bureaublad volledigscherm - -Allows maps to render with more detail -== Maakt het mogelijk om kaarten met meer detail te renderen - -Renderer -== Renderer - -default -== standaard - -custom -== custom - -auto -== Automatisch - -Game sound volume -== Game geluid volume - -Chat sound volume -== Chat geluid volume - -Background music volume -== Achtergrond geluid volume - -Assets -== Assets - -Use old chat style -== Oude chatstijl gebruiken - -Client message -== Clientbericht - -Preview -== Voorbeeld - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Wanneer je over de startlijn gaat, laat een spook tee zien die jouw beste tijd repliceert - -Opacity -== Ondoorzichtigheid - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Pas de ondoorzichtigheid van entities die tot andere teams behoren aan, zoals de tee's en de naamplaten - -Quads are used for background decoration -== Quads worden gebruikt voor achtergronddecoratie - -Tries to predict other entities to give a feel of low latency -== Probeert andere entities te voorspellen om een gevoel van "low latency" te geven - -Show local player's key presses -== Laat lokale spelers hun toetsaanslagen zien - -Background -== Achtergrond - -Use current map as background -== Gebruik de huidige map als achtergrond - -Run on join -== Run bij deelnemen - -Chat command (e.g. showall 1) -== Chat command (bijv. showall 1) - -Entities -== Entities - -Emoticons -== Emoticons - -Particles -== Particles - -Assets directory -== Assets map - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ - -Tutorial -== Tutorial - -Can't find a Tutorial server -== De Tutorial server is niet gevonden - -Website -== Website - -Settings -== Instellingen - -Stop server -== Stop server - -Run server -== Laad server - -Server executable not found, can't run server -== Server executable niet gevonden, de server kon niet worden gestart - -Editor -== Editor - -[Start menu] -Play -== Speel - -Super -== Super - -Team %d -== Team %d - -Net -== Net - -FPM -== FPM - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not save downloaded map. Try manually deleting this file: %s -== - -Could not connect dummy -== - -Error playing demo -== - -Failed saving the replay! -== - -Saving settings to '%s' failed -== - -Error saving settings -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Preparing demo playback -== - -Connected -== - -Loading map file from storage -== - -Loading demo file from storage -== - -Some fonts could not be loaded. Check the local console for details. -== - -Initializing components -== - -Why are you slowmo replaying to read this? -== - -Initializing assets -== - -Initializing map logic -== - -Sending initial client info -== - -Quitting. Please wait… -== - -Restarting. Please wait… -== - -Loading skin files -== - -Loading background map -== - -Searching -== - -Enter Username -== - -Enter Password -== - -NOT CONNECTED -== - -Match %d of %d -== - -No results -== - -Lines %d - %d (%s) -== - -Locked -== - -Following -== - -Loading commands… -== - -Position: -== - -Speed: -== - -Angle: -== - -Multi-View -== - -[Spectating] -Following %s -== - -[Spectating Camera Mode Icon] -AUTO -== - -Some map images could not be loaded. Check the local console for details. -== - -Uploading map data to GPU -== - -Some map sounds could not be loaded. Check the local console for details. -== - -Loading menu themes -== - -Press a key… -== - -Main menu -== - -Rename folder -== - -Render complete -== - -Are you sure that you want to restart? -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -There's an unsaved map in the editor, you might want to save it. -== - -Continue anyway? -== - -A demo with this name already exists -== - -A folder with this name already exists -== - -Unable to rename the folder -== - -File '%s' already exists, do you want to overwrite it? -== - -(paused) -== - -Videos directory -== - -Video was saved to '%s' -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -Trying to determine UDP connectivity… -== - -UDP seems to be filtered. -== - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== - -No answer from server yet. -== - -%d/%d KiB (%.1f KiB/s) -== - -Getting game info -== - -Requesting to join the game -== - -Loading menu images -== - -No local servers found (ports %d-%d) -== - -Example of usage -== - -No login required -== - -Communities -== - -Copy info -== - -No server selected -== - -Online friends (%d) -== - -Online clanmates (%d) -== - -[friends (server browser)] -Offline (%d) -== - -Click to select server. Double click to join your friend. -== - -Click to remove this player from your friends list. -== - -Click to remove this clan from your friends list. -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Are you sure that you want to remove the player '%s' from your friends list? -== - -Are you sure that you want to remove the clan '%s' from your friends list? -== - -Add Clan -== - -Server filter -== - -Friends -== - -Play the current demo -== - -Pause the current demo -== - -Stop the current demo -== - -Go back the specified duration -== - -[Demo player duration] -%d min. -== - -[Demo player duration] -%d sec. -== - -Change the skip duration -== - -Go forward the specified duration -== - -Go back one tick -== - -Go forward one tick -== - -Go back one marker -== - -Go forward one marker -== - -Slow down the demo -== - -Speed up the demo -== - -Mark the beginning of a cut (right click to reset) -== - -Mark the end of a cut (right click to reset) -== - -Export cut as a separate demo -== - -Close the demo player -== - -Toggle keyboard shortcuts -== - -Toggle auto camera -== - -Export demo cut -== - -Cut interval -== - -Cut length -== - -Render cut to video -== - -Please use a different filename -== - -Loading demo files -== - -All combined -== - -No demo selected -== - -Folder Link -== - -Created -== - -Netversion -== - -[Demo details] -map not included -== - -Open the directory that contains the demo files -== - -Are you sure that you want to delete the folder '%s'? -== - -Are you sure that you want to delete the demo '%s'? -== - -Delete folder -== - -Unable to delete the demo '%s' -== - -Unable to delete the folder '%s'. Make sure it's empty first. -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Loading… -== - -Loading ghost files -== - -Ghosts directory -== - -Activate all -== - -Deactivate all -== - -Menu opened. Press Esc key again to close menu. -== - -[Hertz] -Hz -== - -Save power by lowering refresh rate (higher input latency) -== - -Open the settings file -== - -Open the directory that contains the configuration and user files -== - -Open the directory to add custom themes -== - -Player info change cooldown -== - -Download community skins -== - -Create a random skin -== - -Open the directory to add custom skins -== - -Enable controller -== - -Controller -== - -Ingame controller mode -== - -[Ingame controller mode] -Relative -== - -[Ingame controller mode] -Absolute -== - -Ingame controller sens. -== - -UI controller sens. -== - -Controller jitter tolerance -== - -No controller found. Plug in a controller. -== - -Axis -== - -Status -== - -Aim bind -== - -Mouse -== - -Ingame mouse sens. -== - -UI mouse sens. -== - -Reset controls -== - -Are you sure that you want to reset the controls to their defaults? -== - -Cancel -== - -Graphics card -== - -Tee -== - -Appearance -== - -Name Plate -== - -Hook Collisions -== - -Info Messages -== - -Show health, shields and ammo -== - -Show local time always -== - -Authed name color in scoreboard -== - -Same clan color in scoreboard -== - -DDRace HUD -== - -Show client IDs (scoreboard, chat, spectator) -== - -Show DDRace HUD -== - -Show jumps indicator -== - -Show dummy actions -== - -Show player position -== - -Show player speed -== - -Show player target angle -== - -Show freeze bars -== - -Opacity of freeze bars inside freeze -== - -Always show chat -== - -Show only chat messages from team members -== - -Chat font size -== - -Chat width -== - -Show friend mark (♥) in name plates -== - -Show client IDs in name plates -== - -Hook Strength -== - -Show hook strength icon indicator -== - -Show hook strength number indicator -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Hook collision line -== - -Show own player's hook collision line -== - -Always show own player's hook collision line -== - -Always show other players' hook collision lines -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Hook collision line opacity -== - -Colors of the hook collision line, in case of a possible collision with: -== - -Your movements are not taken into account when calculating the line colors -== - -Nothing hookable -== - -Something hookable -== - -A Tee -== - -Preview 'Hook collisions' being pressed -== - -Show finish messages -== - -Normal Color -== - -Highlight Color -== - -Weapons -== - -Rifle Laser Outline Color -== - -Rifle Laser Inner Color -== - -Shotgun Laser Outline Color -== - -Shotgun Laser Inner Color -== - -Door Laser Outline Color -== - -Door Laser Inner Color -== - -Freeze Laser Outline Color -== - -Freeze Laser Inner Color -== - -Set all to Rifle -== - -Enable ghost -== - -Only save improvements -== - -Regular background color -== - -Entities background color -== - -Unregister protocol and file extensions -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Extras -== - -Loading assets -== - -Open the directory to add custom assets -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Loading race demo files -== - -Round %d/%d -== - -[Spectators] -%d others… -== - -[Team and size] -%d\n(%d/%d) -== - -Team %d (%d/%d) -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Loading sound files -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -Moved ingame -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/esperanto.txt b/data/languages/esperanto.txt deleted file mode 100644 index 8366f5bf09..0000000000 --- a/data/languages/esperanto.txt +++ /dev/null @@ -1,2064 +0,0 @@ -##### translated strings ##### - -Connected -== Konektita - -Loading map file from storage -== Ŝargas mapdosieron el la diskaparato - -Loading DDNet Client -== Ŝargas DDNet - -Warning -== Averto - -All -== Ĉio - -Team -== Teamo - -Chat -== Diskutejo - -Game paused -== Paŭzata ludo - -Warmup -== Trejnado - -Connection Problems… -== Konekta problemoj… - -Please balance teams! -== Bonvolu ekvilibrigi teamojn! - -%ds left -== Restas %ds - -Reason: -== Kialo: - -Vote yes -== Voĉdoni jes - -Vote no -== Voĉdoni ne - -Speed: -== Rapideco: - -Spectate -== Spekti - -Free-View -== Libera vidado - -News -== Novaĵoj - -Internet -== Internet - -LAN -== LAN - -Favorites -== Favoratoj - -Game -== Ludo - -Players -== Ludantoj - -Server info -== Servila informoj - -Browser -== Retumilo - -Ghost -== Fantomo - -Call vote -== Voĉdoni - -Connecting to -== Konektas al - -Abort -== Nuligi - -Downloading map -== Elŝutas mapon - -Disconnected -== Malkonektita - -Ok -== Okej - -Reconnect in %d sec -== Rekonektiĝos post %d sek - -Try again -== Reprovi - -Quit -== Eliri - -Are you sure that you want to quit? -== Ĉu vi certas eliri? - -Disconnect -== Malkonektiĝi - -Are you sure that you want to disconnect? -== Ĉu vi certas malkonektiĝi? - -Disconnect Dummy -== Malkonektigi pupon - -Are you sure that you want to disconnect your dummy? -== Ĉu vi certas malkonektiĝi vian pupon? - -Welcome to DDNet -== Bonvenon en DDNet - -Please enter your nickname below. -== Bonvolu tajpi vian kromnomon. - -Existing Player -== Ekzista ludanto - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Vian kromnomon '%s' estas jam uzata (%d poentoj). Ĉu vi tamen volas uzi ĝin? - -Checking for existing player with your name -== Kontrolas ekzistan ludanton kun via nomo - -Are you sure that you want to disconnect and switch to a different server? -== Ĉu vi certas malkonektiĝi kaj movi al alia servilo? - -No -== Ne - -Yes -== Jes - -Password -== Pasvorto - -%i minute left -== Restas %i minuto - -%i minutes left -== Restas %i minutoj - -%i second left -== Restas %i sekundo - -%i seconds left -== Restas %i sekundoj - -Error -== Eraro - -New name: -== Nova nomo: - -Show chat -== Montri la diskutejon - -Use sounds -== Uzi sonojn - -Speed -== Rapideco - -Join Tutorial Server -== Aliĝi al la lernila servilo - -Skip Tutorial -== Pasi la lernilo - -Nickname -== Kromnomo - -Theme -== Temo - -AFR -== AFR - -ASI -== AZI - -AUS -== AŬS - -EUR -== EŬR - -NA -== NA - -SA -== SA - -CHN -== ĈIN - -Type -== Tipo - -Getting server list from master server -== Elŝutas servilaro de ĉefa servilo - -No servers found -== Neniuj serviloj trovitaj - -No servers match your filter criteria -== Neniuj serviloj kun via filtro - -Search -== Serĉi - -Exclude -== Ekskludi - -%d of %d servers -== %d de %d serviloj - -%d of %d server -== %d de %d servilo - -%d players -== %d ludantoj - -%d player -== %d ludanto - -Server address: -== Retadreso de servilo: - -Count players only -== Nur nombri ludantojn - -Show friends only -== Nur montri amikojn - -No password -== Neniu pasvorto - -Game types: -== Ludtipoj: - -Countries -== Landoj - -Favorite -== Favorati - -Name -== Nomo - -Clan -== Klano - -Add Friend -== Aldoni amikon - -Remove chat -== Malmontri la diskutejon - -Folder -== Dosierujo - -Delete -== Forigi - -Connect Dummy -== Konektigi pupon - -Connecting dummy -== Pupo konektas - -Join red -== Aliĝi al ruĝa taemo - -Join blue -== Aliĝi al blua teamo - -Join game -== Aliĝi al la ludo - -Kill -== Mortiĝi - -Pause -== Paŭzi - -Player -== Ludanto - -Address -== Retadreso - -Ping -== Latenco - -Version -== Versio - -Game info -== Ludaj informoj - -Game type -== Ludtipo - -Map -== Mapo - -MOTD -== MDLT - -Change settings -== Ŝanĝi agordojn - -Kick player -== Elirigi ludanton - -Move player to spectators -== Movi ludanton al spektantoj - -Force vote -== Forci voĉdonon - -Vote description: -== Voĉdona priskribo: - -Vote command: -== Voĉdona komando: - -Add -== Aldoni - -Time -== Tempo - -Skin Database -== Datumbazo de haŭtoj - -Skins directory -== Dosierujo de haŭtoj - -Move left -== Movi maldekstren - -Move right -== Movi dekstren - -Jump -== Salti - -Fire -== Pafi - -Hook -== Hoki - -Show others -== Montri aliaj - -Show all -== Montri ĉiuj - -Hammer -== Martelo - -Pistol -== Pistolo - -Laser -== Lasero - -Mouse -== Muso - -Weapon -== Batalilo - -Dummy -== Pupo - -Screen -== Ekrano - -default -== defaŭlta - -auto -== aŭtomata - -Language -== Lingvo - -General -== Ĝenerala - -Appearance -== Aspekto - -Graphics -== Grafikoj - -Sound -== Sono - -DDNet -== DDNet - -Assets -== Bildoj - -DDNet Client needs to be restarted to complete update! -== Vi devas relanci DDNet por kompletigi la ĝisdatigon. - -You must restart the game for all settings to take effect. -== Vi devas relanci la ludon por aktivigi ĉiujn agordojn. - -Show dummy actions -== Montri la agojn de la pupo - -Team message -== Mesaĝo de teamo - -Friend message -== Mesaĝo de amiko - -Normal message -== Normala mesaĝo - -Preview -== Antaŭrigardilo - -A Tee -== Tejo - -DDNet %s is available: -== DDNet %s estas disponebla: - -Update now -== Ĝisdatigi nun - -Updating… -== Ĝisdatiĝas… - -Check now -== Kontroli nun - -Discord -== Diskordo - -https://ddnet.org/discord -== https://ddnet.org/discord - -Learn -== Lerni - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ - -Tutorial -== Lernilo - -Website -== Retejo - -Settings -== Agordoj - -Stop server -== Halti servilon - -Run server -== Lanci servilon - -Editor -== Redaktilo - -[Start menu] -Play -== Ludi - -DDNet %s is out! -== DDNet %s estas disponebla! - -Downloading %s: -== Elŝutas %s: - -Restart -== Relanci - -Spectators -== Spektantoj - -Red team -== Ruĝa teamo - -Blue team -== Blua teamo - -Follow -== Sekvi - -Deaths -== Mortoj - -1 new mention -== 1 nova mencio - -%d new mentions -== %d novaj mencioj - -9+ new mentions -== 9+ novaj mencioj - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not save downloaded map. Try manually deleting this file: %s -== - -Could not connect dummy -== - -Error playing demo -== - -Successfully saved the replay! -== - -Failed saving the replay! -== - -Sound error -== - -The audio device couldn't be initialised. -== - -Saving settings to '%s' failed -== - -Error saving settings -== - -Replay feature is disabled! -== - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -The format of texture %s is not RGBA which will cause visual bugs. -== - -Preparing demo playback -== - -Loading demo file from storage -== - -Some fonts could not be loaded. Check the local console for details. -== - -Initializing components -== - -Why are you slowmo replaying to read this? -== - -Initializing assets -== - -Initializing map logic -== - -Sending initial client info -== - -Quitting. Please wait… -== - -Restarting. Please wait… -== - -Loading skin files -== - -Loading background map -== - -Searching -== - -Enter Username -== - -Enter Password -== - -NOT CONNECTED -== - -Match %d of %d -== - -No results -== - -Lines %d - %d (%s) -== - -Locked -== - -Following -== - -Loading commands… -== - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== - -Sudden Death -== - -Position: -== - -Angle: -== - -Multi-View -== - -[Spectating] -Following %s -== - -[Spectating Camera Mode Icon] -AUTO -== - -Server best: -== - -Personal best: -== - -Team %d -== - -Some map images could not be loaded. Check the local console for details. -== - -Uploading map data to GPU -== - -Some map sounds could not be loaded. Check the local console for details. -== - -Loading menu themes -== - -Reset -== - -Press a key… -== - -Demos -== - -Main menu -== - -Rename folder -== - -Rename demo -== - -Render demo -== - -Render complete -== - -Password incorrect -== - -Are you sure that you want to restart? -== - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -There's an unsaved map in the editor, you might want to save it. -== - -Continue anyway? -== - -A demo with this name already exists -== - -A folder with this name already exists -== - -Unable to rename the folder -== - -Unable to rename the demo -== - -File '%s' already exists, do you want to overwrite it? -== - -Replace video -== - -Show ingame HUD -== - -(paused) -== - -Video name: -== - -Videos directory -== - -Video was saved to '%s' -== - -Show DDNet map finishes in server browser -== - -transmits your player name to info.ddnet.org -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -Trying to determine UDP connectivity… -== - -UDP seems to be filtered. -== - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== - -No answer from server yet. -== - -%d/%d KiB (%.1f KiB/s) -== - -Getting game info -== - -Requesting to join the game -== - -Error loading demo -== - -The server is running a non-standard tuning on a pure game type. -== - -Loading menu images -== - -No local servers found (ports %d-%d) -== - -Reset filter -== - -Example of usage -== - -Has people playing -== - -Server not full -== - -No login required -== - -Strict gametype filter -== - -Player country: -== - -Filter connecting players -== - -Indicate map finish -== - -Unfinished map -== - -Types -== - -Communities -== - -Copy info -== - -Leak IP -== - -No server selected -== - -Online friends (%d) -== - -Online clanmates (%d) -== - -[friends (server browser)] -Offline (%d) -== - -Click to select server. Double click to join your friend. -== - -Click to remove this player from your friends list. -== - -Click to remove this clan from your friends list. -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Are you sure that you want to remove the player '%s' from your friends list? -== - -Are you sure that you want to remove the clan '%s' from your friends list? -== - -Remove friend -== - -Add Clan -== - -Server filter -== - -Friends -== - -Play the current demo -== - -Pause the current demo -== - -Stop the current demo -== - -Go back the specified duration -== - -[Demo player duration] -%d min. -== - -[Demo player duration] -%d sec. -== - -Change the skip duration -== - -Go forward the specified duration -== - -Go back one tick -== - -Go forward one tick -== - -Go back one marker -== - -Go forward one marker -== - -Slow down the demo -== - -Speed up the demo -== - -Mark the beginning of a cut (right click to reset) -== - -Mark the end of a cut (right click to reset) -== - -Export cut as a separate demo -== - -Close the demo player -== - -Toggle keyboard shortcuts -== - -Toggle auto camera -== - -Demofile: %s -== - -Export demo cut -== - -Cut interval -== - -Cut length -== - -Render cut to video -== - -Please use a different filename -== - -File already exists, do you want to overwrite it? -== - -Loading demo files -== - -All combined -== - -Demo -== - -Length -== - -Date -== - -No demo selected -== - -Parent Folder -== - -Folder Link -== - -Invalid Demo -== - -Created -== - -Markers -== - -Netversion -== - -Size -== - -[Demo details] -map not included -== - -%.2f MiB -== - -%.2f KiB -== - -Fetch Info -== - -Demos directory -== - -Open the directory that contains the demo files -== - -Are you sure that you want to delete the folder '%s'? -== - -Are you sure that you want to delete the demo '%s'? -== - -Delete folder -== - -Delete demo -== - -Unable to delete the demo '%s' -== - -Unable to delete the folder '%s'. Make sure it's empty first. -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Stop record -== - -Record demo -== - -Edit touch controls -== - -Close -== - -Remote console -== - -Console -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Reset to defaults -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Score limit -== - -Time limit -== - -Loading… -== - -Remove -== - -Loading ghost files -== - -Ghosts directory -== - -Activate all -== - -Deactivate all -== - -Deactivate -== - -Activate -== - -Save -== - -Menu opened. Press Esc key again to close menu. -== - -Dynamic Camera -== - -Smooth Dynamic Camera -== - -Switch weapon on pickup -== - -Switch weapon when out of ammo -== - -Client -== - -Skip the main menu -== - -[Hertz] -Hz -== - -Refresh Rate -== - -Save power by lowering refresh rate (higher input latency) -== - -Settings file -== - -Open the settings file -== - -Config directory -== - -Open the directory that contains the configuration and user files -== - -Themes directory -== - -Open the directory to add custom themes -== - -Automatically record demos -== - -Max demos -== - -Automatically take game over screenshot -== - -Max Screenshots -== - -Automatically take statboard screenshot -== - -Automatically create statboard csv -== - -Max CSVs -== - -Player info change cooldown -== - -Download skins -== - -Download community skins -== - -Vanilla skins only -== - -Fat skins (DDFat) -== - -Skin prefix -== - -Your skin -== - -Create a random skin -== - -Custom colors -== - -Choose default eyes when joining a server -== - -Body -== - -Feet -== - -Open the directory to add custom skins -== - -Hook collisions -== - -Zoom in -== - -Zoom out -== - -Default zoom -== - -Toggle dyncam -== - -Toggle ghost -== - -Shotgun -== - -Grenade -== - -Next weapon -== - -Prev. weapon -== - -Team chat -== - -Converse -== - -Chat command -== - -Toggle dummy -== - -Dummy copy -== - -Hammerfly dummy -== - -Emoticon -== - -Spectator mode -== - -Spectate next -== - -Spectate previous -== - -Screenshot -== - -Scoreboard -== - -Statboard -== - -Lock team -== - -Show entities -== - -Show HUD -== - -Enable controller -== - -Controller -== - -Ingame controller mode -== - -[Ingame controller mode] -Relative -== - -[Ingame controller mode] -Absolute -== - -Ingame controller sens. -== - -UI controller sens. -== - -Controller jitter tolerance -== - -No controller found. Plug in a controller. -== - -Axis -== - -Status -== - -Aim bind -== - -Ingame mouse sens. -== - -UI mouse sens. -== - -Movement -== - -Reset controls -== - -Are you sure that you want to reset the controls to their defaults? -== - -Cancel -== - -Voting -== - -Miscellaneous -== - -Current -== - -Windowed -== - -Windowed borderless -== - -Windowed fullscreen -== - -Desktop fullscreen -== - -Fullscreen -== - -V-Sync -== - -may cause delay -== - -FSAA samples -== - -High Detail -== - -Allows maps to render with more detail -== - -Use high DPI -== - -UI Color -== - -Renderer -== - -custom -== - -Graphics card -== - -Play background music -== - -Mute when not active -== - -Enable game sounds -== - -Enable gun sound -== - -Enable long pain sound (used when shooting in freeze) -== - -Enable server message sound -== - -Enable regular chat sound -== - -Enable team chat sound -== - -Enable highlighted chat sound -== - -Sound volume -== - -Game sound volume -== - -Chat sound volume -== - -Map sound volume -== - -Background music volume -== - -Tee -== - -Controls -== - -Hue -== - -Sat. -== - -Lht. -== - -Alpha -== - -HUD -== - -Name Plate -== - -Hook Collisions -== - -Info Messages -== - -Show health, shields and ammo -== - -Show score -== - -Show local time always -== - -Show votes window after voting -== - -Authed name color in scoreboard -== - -Same clan color in scoreboard -== - -DDRace HUD -== - -Show client IDs (scoreboard, chat, spectator) -== - -Show DDRace HUD -== - -Show jumps indicator -== - -Show player position -== - -Show player speed -== - -Show player target angle -== - -Show freeze bars -== - -Opacity of freeze bars inside freeze -== - -Always show chat -== - -Show names in chat in team colors -== - -Show only chat messages from friends -== - -Show only chat messages from team members -== - -Use old chat style -== - -Chat font size -== - -Chat width -== - -Messages -== - -System message -== - -Highlighted message -== - -Client message -== - -Show name plates -== - -Name plates size -== - -Show clan above name plates -== - -Clan plates size -== - -Use team colors for name plates -== - -Show friend mark (♥) in name plates -== - -Show client IDs in name plates -== - -Hook Strength -== - -Show hook strength icon indicator -== - -Show hook strength number indicator -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Show other players' key presses -== - -Show local player's key presses -== - -Size of key press icons -== - -Hook collision line -== - -Show own player's hook collision line -== - -Always show own player's hook collision line -== - -Show other players' hook collision lines -== - -Always show other players' hook collision lines -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Hook collision line opacity -== - -Colors of the hook collision line, in case of a possible collision with: -== - -Your movements are not taken into account when calculating the line colors -== - -Nothing hookable -== - -Something hookable -== - -Preview 'Hook collisions' being pressed -== - -Show kill messages -== - -Show finish messages -== - -Normal Color -== - -Highlight Color -== - -Weapons -== - -Rifle Laser Outline Color -== - -Rifle Laser Inner Color -== - -Shotgun Laser Outline Color -== - -Shotgun Laser Inner Color -== - -Entities -== - -Door Laser Outline Color -== - -Door Laser Inner Color -== - -Freeze Laser Outline Color -== - -Freeze Laser Inner Color -== - -Set all to Rifle -== - -Save the best demo of each race -== - -Enable replays -== - -Default length -== - -Enable ghost -== - -When you cross the start line, show a ghost tee replicating the movements of your best time -== - -Show ghost -== - -Opacity -== - -Save ghost -== - -Only save improvements -== - -Gameplay -== - -Overlay entities -== - -Show text entities -== - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== - -Show others (own team only) -== - -Show quads -== - -Quads are used for background decoration -== - -AntiPing -== - -Tries to predict other entities to give a feel of low latency -== - -AntiPing: predict other players -== - -AntiPing: predict weapons -== - -AntiPing: predict grenade paths -== - -Background -== - -Regular background color -== - -Entities background color -== - -Use current map as background -== - -Show tiles layers from BG map -== - -New random timeout code -== - -Run on join -== - -Chat command (e.g. showall 1) -== - -Unregister protocol and file extensions -== - -DDNet Client updated! -== - -No updates available -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Emoticons -== - -Particles -== - -Extras -== - -Loading assets -== - -Assets directory -== - -Open the directory to add custom assets -== - -Can't find a Tutorial server -== - -Update failed! Check log… -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Server executable not found, can't run server -== - -Loading race demo files -== - -Time limit: %d min -== - -Round %d/%d -== - -[Spectators] -%d others… -== - -Score -== - -Super -== - -[Team and size] -%d\n(%d/%d) -== - -Team %d (%d/%d) -== - -Manual -== - -Race -== - -Auto -== - -Replay -== - -Red team wins! -== - -%s wins! -== - -Blue team wins! -== - -Draw! -== - -Game over -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Loading sound files -== - -Frags -== - -Suicides -== - -Ratio -== - -Net -== - -FPM -== - -Spree -== - -Best -== - -Grabs -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -Moved ingame -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/estonian.txt b/data/languages/estonian.txt deleted file mode 100644 index 0f27d14a78..0000000000 --- a/data/languages/estonian.txt +++ /dev/null @@ -1,2075 +0,0 @@ -##### authors ##### -#originally created by: -# Cammodude -#modified by: -# Cammodude 2024-09-03 22:19:06 -# Cammodude 2024-10-03 18:04:16 -# Cammodude 2024-12-04 17:35:38 -# Cammodude 2024-20-04 15:17:26 -# Cammodude 2024-18-07 20:00:25 -##### /authors ##### - -##### translated strings ##### - -%ds left -== %ds jäänud - -%i minute left -== %i minut jäänud - -%i minutes left -== %i minutit jäänud - -%i second left -== %i sekund jäänud - -%i seconds left -== %i sekundit jäänud - -%s wins! -== %s võitis! - -Abort -== Katkesta - -Add -== Lisa - -Add Friend -== Lisa sõber - -Address -== Aadress - -All -== Kõik - -Are you sure that you want to quit? -== Kas olete kindel, et tahate lahkuda? - -Automatically record demos -== Automaatselt lindista demosid - -Automatically take game over screenshot -== Automaatselt tee mängu lõpu ekraanipilt. - -Blue team -== Sinine tiim - -Blue team wins! -== Sinine tiim võitis! - -Body -== Keha - -Call vote -== Alusta hääletus - -Change settings -== Muuda sätteid - -Chat -== Vestlus - -Clan -== Klann - -Client -== Klient - -Connecting to -== Ühenduse loomine - -Connection Problems… -== Ühenduse Probleemid… - -Console -== Konsool - -Controls -== Kontrollid - -Count players only -== Loe ainult mängijaid - -Current -== Praegune - -Custom colors -== Oma värvid - -Delete -== Kustuta - -Delete demo -== Kustuta demo - -Demofile: %s -== Demo fail: %s - -Demos -== Demod - -Disconnect -== Katkesta ühendus - -Disconnected -== Ühendus katkestatud - -Downloading map -== Kaardi laadimine - -Draw! -== Joonista! - -Dynamic Camera -== Dünaamiline Kaamera - -Emoticon -== Emotikon - -Error -== Rike - -Error loading demo -== Rike demo laadimisega - -Favorite -== Lemmik - -Favorites -== Lemmikud - -Feet -== Jalad - -Fire -== Tuli - -Folder -== Kaust - -Force vote -== Sunni hääletus - -Free-View -== Vaba vaade - -Fullscreen -== Täisekraan - -Game -== Mäng - -Game info -== Mängu info - -Game over -== Mäng läbi - -Game type -== Mängu tüüp - -Game types: -== Mängu tüübid: - -General -== Üldine - -Graphics -== Graafika - -Grenade -== Granaat - -Hammer -== Haamer - -Has people playing -== Inimesed mängivad - -High Detail -== Kõrge kvaliteet - -Hook -== Konks - -Invalid Demo -== Kehtetu Demo - -Join blue -== Liitu sinisega - -Join red -== Liitu punasega - -Jump -== Hüppa - -Kick player -== Löö mängija välja - -Language -== Keel - -MOTD -== Serveri sõnum - -Map -== Kaart - -Move left -== Liigu vasakule - -Move player to spectators -== Liiguta mängija pealtvaatajate hulka - -Move right -== Liigu paremale - -Movement -== Liikumine - -Mute when not active -== Vaigista, kui ei ole aktiivne - -Name -== Nimi - -Next weapon -== Järgmine relv - -Nickname -== Hüüdnimi - -No -== Ei - -No password -== Salasõnata - -No servers found -== Serverit ei leitud - -No servers match your filter criteria -== Ükski server ei vasta teie filtrikriteeriumidele - -Ok -== Ok - -Parent Folder -== Ülemkaust - -Password -== Salasõna - -Password incorrect -== Vale salasõna - -Ping -== Ping - -Pistol -== Püstol - -Play background music -== Mängi taustamuusikat - -Player -== Mängija - -Player country: -== Mängija maa: - -Players -== Mängijad - -Please balance teams! -== Palun tasakaalusta tiime! - -Prev. weapon -== Eelmine relv - -Quit -== Lõpeta - -Reason: -== Põhjus: - -Red team -== Punane tiim - -Red team wins! -== Punane tiim võitis! - -Remote console -== Kaugkonsool - -Remove -== Eemalda - -Remove friend -== Eemalda sõber - -Rename demo -== Nimeta demo ümber - -Reset filter -== Lähtesta filter - -Score -== Punktid - -Score limit -== Punktilimiit - -Scoreboard -== Punktitabel - -Screenshot -== Ekraanipilt - -Server address: -== Serveri aadress: - -Server info -== Serveri info - -Server not full -== Server pole täis - -Shotgun -== Pumppüss - -Show chat -== Näita vestlust - -Show friends only -== Näita ainult sõpru - -Show ingame HUD -== Näita mängusisest HUD-di - -Show name plates -== Näita nimesilte - -Sound -== Heli - -Sound error -== Helirike - -Spectate -== Vaata pealt - -Spectate next -== Jälgi järgmist - -Spectate previous -== Jälgi eelmist - -Spectator mode -== Pealtvaataja režiim - -Spectators -== Pealtvaatajad - -Stop record -== Lõpeta lindistamine - -Strict gametype filter -== Range mängutüübi filter - -Sudden Death -== Äkksurm - -Switch weapon on pickup -== Vaheta relva selle ülesvõtmisel - -Team -== Tiim - -Team chat -== Tiimi vestlus - -The audio device couldn't be initialised. -== Audio süsteemi ei saanud lähtestada. - -The server is running a non-standard tuning on a pure game type. -== Server jookseb mittestandardsel häälestusel puhtal mängutüübil. - -Time limit -== Ajapiirang - -Time limit: %d min -== Ajapiirang: %d min - -Try again -== Proovi uuesti - -Type -== Tüüp - -Unable to rename the demo -== Demot ei saa ümber nimetada - -Use sounds -== Kasuta heli - -Use team colors for name plates -== Kasuta tiimi värve nimesiltide jaoks - -V-Sync -== V-Sync - -Version -== Versioon - -Vote command: -== Hääletuskäsk: - -Vote description: -== Hääletuse kirjeldus: - -Vote no -== Hääleta ei - -Vote yes -== Hääleta jah - -Voting -== Hääletus - -Warmup -== Soojendus - -Weapon -== Relv - -Yes -== Jah - -You must restart the game for all settings to take effect. -== Te peate mängu taaskäivitama, et kõik seaded jõustuks. - -New name: -== Uus nimi: - -Sat. -== Küllastus - -Miscellaneous -== Muu - -Internet -== Internet - -Max demos -== Demode maksimaalne arv - -News -== Uudised - -Join game -== Liitu mänguga - -FSAA samples -== FSAA samples - -Sound volume -== Helitugevus - -Max Screenshots -== Ekraanipiltide maksimaalne arv - -Laser -== Laser - -Hue -== Värvitoon - -Record demo -== Lindista demo - -Your skin -== Teie välimus - -Reset to defaults -== Lähtesta vaikeseadetele - -Lht. -== Heledus - -UI Color -== UI Värv - -Alpha -== Alfa - -LAN -== LAN - -Name plates size -== Nimesiltide suurus - -Successfully saved the replay! -== Kordus on edukalt salvestatud! - -Replay feature is disabled! -== Korduse funktsioon on keelatud! - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== Tekstuuri %s laius ei jagu %d-ga või kõrgus ei jagu %d-ga, mis võib põhjustada visuaalseid vigu. - -Warning -== Hoiatus - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Silumisrežiim on käivitatud. Vajutage klahvikombinatsiooni Ctrl+Shift+D et silumisrežiimist lahkuda. - -Game paused -== Mäng peatatud - -Server best: -== Serveri parim: - -Personal best: -== Isiklik parim: - -Reset -== Lähtesta - -Browser -== Brauser - -Ghost -== Kummitus - -Loading DDNet Client -== DDNet Kliendi laadimine - -Reconnect in %d sec -== Taasühendamine %d sekundi pärast - -Render demo -== Renderda demo - -Replace video -== Asenda video - -File already exists, do you want to overwrite it? -== Fail on juba olemas, kas te tahate selle üle kirjutada? - -Are you sure that you want to disconnect? -== Kas olete kindel, et tahate ühenduse katkestada? - -Disconnect Dummy -== Katkesta Dummy Ühendus - -Are you sure that you want to disconnect your dummy? -== Kas olete kindel, et tahate oma dummy ühenduse katkestada? - -Welcome to DDNet -== Tere tulemast DDNet-i - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork on koostööpõhine interneti mäng, mille eesmärk on, et teie ja teie grupp teesid jõuaksid kaardi finišisse. Uue mängijana peaksite alustama Novice serveritest, kus on kõige lihtsamad kaardid. Leia pingi abil sinule lähim server. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Kasutage klahvi k tapmiseks (uuesti proovimiseks), q teiste mängijate pealtvaatamiseks. Vaadake sätteid muude klahvide jaoks. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Soovitatav on enne serveriga ühendamist sätteid üle vaadata, et neid oma maitse järgi kohandada. - -Please enter your nickname below. -== Palun sisestage oma hüüdnimi all. - -Existing Player -== Olemasolev Mängija - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Teie hüüdnimi '%s' on juba kasutuses (%d punkti). Kas te ikka soovite seda kasutada? - -Checking for existing player with your name -== Samasuguse nimega mängija kontrollimine - -Speed -== Kiirus - -Video name: -== Video nimi: - -Show DDNet map finishes in server browser -== Näita DDNet kaardi lõpetusi serveri brauseris - -transmits your player name to info.ddnet.org -== edastab teie mängija nime veebilehele info.ddnet.org - -Theme -== Teema - -AFR -== AFR - -ASI -== ASI - -AUS -== AUS - -EUR -== EUR - -NA -== NA - -SA -== SA - -CHN -== CHN - -Getting server list from master server -== Serveriloendi hankimine peaserverist - -Search -== Otsi - -Exclude -== Välista - -%d of %d servers -== %d serverit %d -st - -%d of %d server -== %d server %d -st - -%d players -== %d mängijat - -%d player -== %d mängija - -Filter connecting players -== Filtreri ühendavaid mängijaid - -Indicate map finish -== Näita kaardi lõpetusi - -Unfinished map -== Lõpetamata kaart - -Countries -== Riigid - -Types -== Tüübid - -Leak IP -== Lekki IP - -Remove chat -== Eemalda vestlus - -%.2f MiB -== %.2f MiB - -%.2f KiB -== %.2f KiB - -Demo -== Demo - -Markers -== Markerid - -Length -== Pikkus - -Date -== Kuupäev - -Fetch Info -== Hangi Info - -Demos directory -== Demode asukoht - -Connecting dummy -== Ühendan dummyga - -Connect Dummy -== Ühenda Dummy - -Kill -== Tapa - -Pause -== Paus - -Deactivate -== Deaktiveeri - -Activate -== Aktiveeri - -Save -== Salvesta - -Smooth Dynamic Camera -== Sujuv Dünaamiline Kaamera - -Switch weapon when out of ammo -== Vaheta relva kui laskemoon on otsas - -Show only chat messages from friends -== Ainult näita sõnumeid sõpradelt - -Show clan above name plates -== Näita klanni nimesildi peal - -Clan plates size -== Klanni nimesildi suurus - -Skip the main menu -== Jäta peamenüü vahele - -Refresh Rate -== Värskenduse Määr - -Themes directory -== Teemade asukoht - -Download skins -== Laadi alla nahad - -Vanilla skins only -== Ainult vaikenahad - -Skin prefix -== Naha eesliide - -Skin Database -== Naha andmebaas - -Skins directory -== Nahkade asukoht - -Hook collisions -== Konksu kokkupõrked - -Zoom in -== Suumi sisse - -Zoom out -== Suumi välja - -Default zoom -== Vaikimisi suum - -Show others -== Näita teisi - -Show all -== Näita kõiki - -Toggle dyncam -== Lülita dünaamilist kaamerat - -Toggle dummy -== Lülita dummy - -Toggle ghost -== Lülita kummitus - -Lock team -== Lukusta tiim - -Show HUD -== Näita HUDi - -Chat command -== Vestluse käsk - -Dummy -== Dummy - -Windowed -== Aknas - -Windowed borderless -== Aknas raamita - -Desktop fullscreen -== Töölaua täisekraan - -may cause delay -== võib tekitada viivitust - -Screen -== Ekraan - -Use high DPI -== Kasuta kõrget DPId - -Enable game sounds -== Kasuta mängu helisid - -Enable gun sound -== Kasuta püssi heli - -Enable server message sound -== Kasuta serveri sõnumi heli - -Enable regular chat sound -== Kasuta tavalise sõnumi heli - -Enable team chat sound -== Kasuta tiimi sõnumi heli - -Enable highlighted chat sound -== Kasuta esile tõstetud sõnumi heli - -Game sound volume -== Mängu helitugevus - -Chat sound volume -== Vestluse helitugevus - -Map sound volume -== Kaardi helitugevus - -Background music volume -== Tausta muusika helitugevus - -HUD -== HUD - -DDNet -== DDNet - -DDNet Client needs to be restarted to complete update! -== DDNet Klient peab taaskäivitama, et uuendus lõpetada! - -Show score -== Näita punkte - -Show names in chat in team colors -== Näita vestluses olevaid nimesid tiimi värvidega - -Show kill messages -== Näita tapasõnumeid - -Show votes window after voting -== Näita hääletuse akent pärast hääletamist - -Use old chat style -== Kasuta vana vestluse stiili - -Messages -== Sõnumid - -System message -== Süsteemi sõnum - -Highlighted message -== Esiletõstetud sõnum - -Team message -== Tiimi sõnum - -Friend message -== Sõbra sõnum - -Normal message -== Tavaline sõnum - -Client message -== Kliendi sõnum - -Preview -== Eelvaade - -Save the best demo of each race -== Salvesta iga võistluse parim demo - -Default length -== Vaikepikkus - -Enable replays -== Kasuta kordusi - -Show ghost -== Näita kummitust - -Save ghost -== Salvesta kummitus - -Gameplay -== Mäng - -Size -== Suurus - -Show others (own team only) -== Näita teisi (ainult omas tiimis) - -AntiPing -== AntiPing - -AntiPing: predict other players -== AntiPing: ennusta teisi mängijaid - -AntiPing: predict weapons -== AntiPing: ennusta relvi - -AntiPing: predict grenade paths -== AntiPing: ennusta granaadi teekonda - -Show other players' hook collision lines -== Näita teiste mängijate konksu kokkupõrke jooni - -Show other players' key presses -== Näita teiste mängijate klahvivajutusi - -Background -== Tagataust - -Use current map as background -== Kasuta praegust kaarti tagataustana - -DDNet %s is available: -== DDNet %s on saadaval: - -Update now -== Uuenda nüüd - -Updating… -== Uuendamine… - -DDNet Client updated! -== DDNet Klient on uuendatud! - -No updates available -== Ühtegi uuendust pole saadaval - -Check now -== Kontrolli nüüd - -Emoticons -== Emotikonid - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -Learn -== Õppige - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ - -Website -== Veebileht - -Settings -== Sätted - -Stop server -== Peata server - -Run server -== Käivita server - -Editor -== Kaardiredaktor - -[Start menu] -Play -== Mängi - -DDNet %s is out! -== DDNet %s on väljas! - -Downloading %s: -== Allalaadimine %s: - -Update failed! Check log… -== Uuendus ebaõnnestus! Vaata logi… - -Restart -== Taaskäivita - -Time -== Aeg - -Manual -== Manuaal - -Race -== Võistlus - -Replay -== Kordus - -Follow -== Järgne - -Frags -== Killustused - -Deaths -== Surma - -Suicides -== Enesetappu - -Ratio -== Suhe - -FPM -== FPM - -Best -== Parim - -1 new mention -== 1 uus mainimine - -%d new mentions -== %d uut mainimist - -9+ new mentions -== 9+ uut mainimist - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Ebaõnnestumine initsialiseerimise ajal. Üritage gfx_backend muuta OpenGL-iks või Vulkan-iks settings_ddnet.cfg failis konfig. asukohas ja proovige uuesti. - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== VRAM on otsas. Üritage eemaldada oma varad (nahad, üksused, jne.), eriti need, millel on kõrge resolutsioon. - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== Error esines käsusalvestamise ajal. Üritage uuendada oma GPU draivereid. - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== Renderdamiskäsk ebaõnnestus. Üritage uuendada oma GPU draivereid. - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== Renderdamiskäskude esitamine ebaõnnestus. Üritage uuendada oma GPU draivereid. - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== Kaadripuhvrite vahetus ebaõnnestus. Üritage uuendada oma GPU draivereid. - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Tundmatu error. Üritage gfx_backend muuta OpenGL-iks või Vulkan-iks settings_ddnet.cfg failis konfig. asukohas ja proovige uuesti. - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== Ei suutnud initsialiseerida antud graafika tagaprogrammi, vaiketagaprogrammile naasmine - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== Ei suutnud initsialiseerida antud graafika tagaprogrammi, see on ilmselt sellepärast, et teie ei installinud oma integreeritud graafika kaardi draivereid. - -Could not save downloaded map. Try manually deleting this file: %s -== Ei suutnud salvestada allalaaditud kaarti. Proovi käsitsi kustutada seda faili: %s - -Error playing demo -== Rike demo mängimisel - -Failed saving the replay! -== Ei suutnud salvestada kordust! - -Saving settings to '%s' failed -== Sätete salvestamine '%s'-i ebaõnnestus - -Error saving settings -== Rike sätete salvestamisel - -The format of texture %s is not RGBA which will cause visual bugs. -== Tekstuuri %s vorming ei ole RGBA, mis põhjustab visuaalseid vigu. - -Preparing demo playback -== Demo taasesituse ettevalmistamine - -Connected -== Ühendatud - -Loading map file from storage -== Kaardifaili laadimine mälust - -Why are you slowmo replaying to read this? -== Miks sa kasutad aeglustust, et seda lugeda? - -Initializing components -== Komponentide initsialiseerimine - -Initializing assets -== Varade initsialiseerimine - -Initializing map logic -== Kaardi loogika initsialiseerimine - -Sending initial client info -== Esialgse kliendiinfo saatmine - -Quitting. Please wait… -== Lõpetamine. Palun oota… - -Restarting. Please wait… -== Taaskäivitamine. Palun oota… - -Loading skin files -== Naha failide laadimine - -Searching -== Otsimine - -Enter Username -== Sisesta Hüüdnimi - -Enter Password -== Sisesta Parool - -NOT CONNECTED -== MITTE ÜHENDATUD - -Match %d of %d -== Vaste %d %d -st - -No results -== Tulemusi pole - -Lines %d - %d (%s) -== Read %d - %d (%s) - -Locked -== Lukus - -Following -== Järgneb - -Loading commands… -== Käskude laadimine… - -Position: -== Asukoht: - -Speed: -== Kiirus: - -Angle: -== Nurk: - -Multi-View -== Mitmikvaade - -Team %d -== Tiim %d - -Some map images could not be loaded. Check the local console for details. -== Mõnda kaardi pilti ei suudetud laadida. Vaadake kohalikku konsooli lisateabe saamiseks. - -Uploading map data to GPU -== Kaardi info üleslaadimine GPU-le - -Some map sounds could not be loaded. Check the local console for details. -== Mõnda kaardi heli ei suudetud laadida. Vaadake kohalikku konsooli lisateabe saamiseks. - -Loading menu themes -== Menüü teemade laadimine - -Press a key… -== Vajuta nuppu… - -Main menu -== Peamenüü - -Trying to determine UDP connectivity… -== UDP-ühenduvuse määramine - -UDP seems to be filtered. -== UDP näib olevat filtreeritud. - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== UDP ja TCP IP-aadressid näivad olevat erinevad. Proovige lülitada välja VPN, puhverserver või võrgukiirendi. - -No answer from server yet. -== Serverilt pole veel vastust. - -Getting game info -== Mängu info saamine - -Requesting to join the game -== Taotlus mänguga liitmise jaoks - -Rename folder -== Nimeta kaust ümber - -Render complete -== Renderdamine on valmis - -Are you sure that you want to restart? -== Kas te olete kindel, et tahate taaskäivitada? - -There's an unsaved map in the editor, you might want to save it. -== Kaardiredaktoris on salvestamata kaart, te võibolla tahate seda salvestada. - -Continue anyway? -== Jätka igatahes? - -A demo with this name already exists -== Demo sellise nimega on juba olemas - -A folder with this name already exists -== Kaust sellise nimega on juba olemas - -Unable to rename the folder -== Ei saa kausta ümber nimetada - -File '%s' already exists, do you want to overwrite it? -== Fail '%s' on juba olemas, kas te soovite selle üle kirjutada? - -(paused) -== (peatatud) - -Videos directory -== Videode asukoht - -Video was saved to '%s' -== Video on salvestatud kohta '%s' - -Join Tutorial Server -== Liitu Õpetuse Serveriga - -Skip Tutorial -== Jäta Õpetus Vahele - -Loading menu images -== Menüü piltide laadimine - -Are you sure that you want to disconnect and switch to a different server? -== Kas te olete kindel, et soovite katkestada ühenduse ja liituda teise serveriga? - -Communities -== Kogukonnad - -Copy info -== Kopeeri info - -No server selected -== Serverit pole valitud - -Online clanmates (%d) -== Võrgus olevaid klannikaaslasi (%d) - -[friends (server browser)] -Offline (%d) -== Võrguühenduseta (%d) - -Click to select server. Double click to join your friend. -== Klõpsake, et valida server. Topelt klõps et liituda sõbraga. - -Click to remove this player from your friends list. -== Klõpsake, et eemaldada see mängija oma sõbranimekirjast. - -Click to remove this clan from your friends list. -== Klõpsake, et eemaldada see klann oma sõbranimekirjast. - -Are you sure that you want to remove the player '%s' from your friends list? -== Kas olete kindel, et soovite eemaldada mängija '%s' oma sõbranimekirjast? - -Are you sure that you want to remove the clan '%s' from your friends list? -== Kas olete kindel, et soovite eemaldada klanni '%s' oma sõbranimekirjast? - -Add Clan -== Lisa Klann - -Server filter -== Serveri filter - -Friends -== Sõbrad - -Play the current demo -== Mängi praegust demo - -Pause the current demo -== Peata praegune demo - -Stop the current demo -== Katkesta praegune demo - -Go back the specified duration -== Mine tagasi määratud kestus - -[Demo player duration] -%d min. -== %d min. - -[Demo player duration] -%d sec. -== %d sek. - -Change the skip duration -== Muuda vahelejätmise kestust - -Go forward the specified duration -== Mine edasi määratud kestus - -Go back one tick -== Mine tagasi üks tiks - -Go forward one tick -== Mine edasi üks tiks - -Go back one marker -== Mine tagasi üks marker - -Go forward one marker -== Mine edasi üks marker - -Slow down the demo -== Aeglusta demo - -Speed up the demo -== Kiirenda demo - -Mark the beginning of a cut (right click to reset) -== Märgi lõike algus (parem klick lähtestamiseks) - -Mark the end of a cut (right click to reset) -== Märgi lõike lõpp (parem klick lähtestamiseks) - -Export cut as a separate demo -== Ekspordi lõik eraldi demona - -Close the demo player -== Sulge demo mängija - -Toggle keyboard shortcuts -== Lülita klaviatuuri otseteed - -Export demo cut -== Ekspordi demo lõik - -Cut interval -== Lõigu ajavahemik - -Cut length -== Lõigu pikkus - -Render cut to video -== Renderda lõik videoks - -Please use a different filename -== Palun kasutage teistsugust faili nime - -Loading demo files -== Demo failide laadimine - -All combined -== Kõik koos - -No demo selected -== Demo pole valitud - -Folder Link -== Kausta Side - -Created -== Loodud - -Netversion -== Netversioon - -[Demo details] -map not included -== kaart pole kaasas - -Open the directory that contains the demo files -== Ava demo failide asukoht - -Are you sure that you want to delete the folder '%s'? -== Kas olete kindel, et soovite kustutada kausta '%s'? - -Are you sure that you want to delete the demo '%s'? -== Kas olete kindel, et soovite kustutada demo '%s'? - -Delete folder -== Kustuta kaust - -Unable to delete the demo '%s' -== Ei saa kustutada demo '%s' - -Unable to delete the folder '%s'. Make sure it's empty first. -== Ei saa kustutada kausta '%s'. Tehke kindlaks et see on tühi. - -Loading… -== Laadimine… - -Loading ghost files -== Kummitus failide laadimine - -Ghosts directory -== Kummituse asukoht - -Activate all -== Aktiveeri kõik - -Deactivate all -== Deaktiveeri kõik - -Menu opened. Press Esc key again to close menu. -== Menüü avatud. Vajutage Esc klahvi, et see sulgeda. - -Save power by lowering refresh rate (higher input latency) -== Säästke voolu värskendamise määru vähendamisel (suurem sisendi latentsus) - -Settings file -== Sättete fail - -Open the settings file -== Avage sättete fail - -Config directory -== Konfig. asukoht - -Open the directory that contains the configuration and user files -== Avage konfiguratsiooni ja kasutaja failide asukoht - -Open the directory to add custom themes -== Avage oma teemade asukoht - -Automatically take statboard screenshot -== Automaatselt tee stat. tabeli ekraanipilt - -Automatically create statboard csv -== Automaatselt loo stat. tabeli csv - -Max CSVs -== CSV-de maksimaalne arv - -Download community skins -== Laadige alla kogukonna nahad - -Fat skins (DDFat) -== Paksud nahad (DDFat) - -Create a random skin -== Loo suvaline nahk - -Choose default eyes when joining a server -== Vali vaikesilmad serveriga ühinedes - -Open the directory to add custom skins -== Avage oma nahkade asukoht - -Converse -== Suhtle - -Dummy copy -== Dummy kopeerimine - -Hammerfly dummy -== Dummy haamrilend - -Statboard -== Stat. tabel - -Show entities -== Näita üksuseid - -Enable controller -== Käivita kontroller - -Controller -== Kontroller - -Ingame controller mode -== Mängusisene kontrolleri režiim - -[Ingame controller mode] -Relative -== Relatiivne - -[Ingame controller mode] -Absolute -== Absoluutne - -Ingame controller sens. -== Mängusisese kontrolleri sensitiivsus - -UI controller sens. -== UI kontrolleri sensitiivsus - -Controller jitter tolerance -== Kontrolleri värinataluvus - -No controller found. Plug in a controller. -== Kontrollerit ei leitud. Sisestage kontroller. - -Axis -== Telg - -Status -== Staatus - -Aim bind -== Sihtimisside - -Mouse -== Hiir - -Ingame mouse sens. -== Mängusisene hiire sensitiivsus - -UI mouse sens. -== UI hiire sensitiivsus - -Reset controls -== Lähtesta juhtnupud - -Are you sure that you want to reset the controls to their defaults? -== Kas olete kindel, et soovite lähtestada juhtnupud nende vaikeseadetele? - -Cancel -== Tühista - -Windowed fullscreen -== Aknas täisekraanis - -Allows maps to render with more detail -== Lubab kaartidel renderdada rohkem üksikasjadega - -Renderer -== Renderdaja - -default -== vaikimisi - -custom -== oma - -Graphics card -== Graafika kaart - -auto -== automaatne - -Enable long pain sound (used when shooting in freeze) -== Kasuta pikka valuheli (kasutatakse tulistamisel külmutatuna) - -Appearance -== Välimus - -Assets -== Varad - -Name Plate -== Nimesilt - -Hook Collisions -== Konksu kokkupõrked - -Info Messages -== Info sõnumid - -Show health, shields and ammo -== Näita elu, kilpe ja laskemoona - -Show local time always -== Näita alati kohalikku aega - -DDRace HUD -== DDRace HUD - -Show DDRace HUD -== Näita DDRace HUD-i - -Show jumps indicator -== Näita hüpete indikaatorit - -Show dummy actions -== Näita dummy tegevusi - -Show player position -== Näita mängija positsiooni - -Show player speed -== Näita mängija kiirust - -Show player target angle -== Näita mängija sihtnurka - -Show freeze bars -== Näita külmutusriba - -Opacity of freeze bars inside freeze -== Külmutusribade läbipaistvus külmutuses - -Chat font size -== Vestluse fondi suurus - -Chat width -== Vestluse laius - -Show local player's key presses -== Näita kohaliku mängija klahvivajutusi - -Authed name color in scoreboard -== Autentitud nime värv tulemustabelis - -Same clan color in scoreboard -== Sama klanni värv tulemustabelis - -Hook collision line -== Konksu kokkupõrkejoon - -Hook collision line opacity -== Konksu kokkupõrkejoone läbipaistvus - -Colors of the hook collision line, in case of a possible collision with: -== Konksu kokkupõrkejoone värvid, juhul kui on võimalik kokkupõrge: - -Your movements are not taken into account when calculating the line colors -== Teie liigutusi ei võeta arvesse joone värvide arvutamisel - -Nothing hookable -== Mittemillegi haakuvaga - -Something hookable -== Millegi haakuvaga - -A Tee -== Teega - -Show finish messages -== Näita lõpusõnumeid - -Normal Color -== Normaalne Värv - -Highlight Color -== Esile Tõstetud Värv - -Weapons -== Relvad - -Rifle Laser Outline Color -== Laserpüssi Kontuuri Värv - -Rifle Laser Inner Color -== Laserpüssi Sisene Värv - -Shotgun Laser Outline Color -== Pumppüssi Laseri Kontuuri Värv - -Shotgun Laser Inner Color -== Pumppüssi Laseri Sisene Värv - -Entities -== Üksused - -Door Laser Outline Color -== Ukse Laseri Kontuuri Värv - -Door Laser Inner Color -== Ukse Laseri Sisene Värv - -Freeze Laser Outline Color -== Külmutava Laseri Kontuuri Värv - -Freeze Laser Inner Color -== Külmutava Laseri Sisene Värv - -Set all to Rifle -== Seadke Kõik Laserpüssiks - -Enable ghost -== Kasuta kummitust - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Kui ületate stardijoone, näidake kummitus-teed, mis kordab teie parima aja liigutusi - -Opacity -== Läbipaistvus - -Only save improvements -== Ainult salvesta täiustusi - -Overlay entities -== Üksuste ülekate - -Show text entities -== Näita teksti üksusi - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Seadista teiste tiimide üksuste läbipaistvust, nagu teed ja nimesildid - -Show quads -== Näita nelikuid - -Quads are used for background decoration -== Nelikuid kasutatakse tagatausta kaunistamiseks - -Tries to predict other entities to give a feel of low latency -== Üritab ennustada teisi üksuseid, et anda madala latentsuse tunne - -Regular background color -== Normaalne tagatausta värv - -Entities background color -== Üksuste tagatausta värv - -Show tiles layers from BG map -== Näita plaate tausta kaardist - -New random timeout code -== Uus suvaline timeout kood - -Run on join -== Jooksuta liitumisel - -Chat command (e.g. showall 1) -== Vestluse käskus (nt showall 1) - -Unregister protocol and file extensions -== Tühista protokolli ja faililaiendite registreerimine - -Particles -== Osakesed - -Extras -== Ekstrad - -Loading assets -== Varade laadimine - -Assets directory -== Varade asukoht - -Open the directory to add custom assets -== Ava oma varade lisamise asukoht - -Tutorial -== Õpetus - -Can't find a Tutorial server -== Ei suuda leida Õpetuse serverit - -Server executable not found, can't run server -== Serveri käivitaja faili ei leitud, serverit ei saa käivitada - -Loading race demo files -== Võistluste demofailide laadimine - -Super -== Super - -Auto -== Auto - -Loading sound files -== Helifailide laadimine - -Spree -== Pillerkaar - -Grabs -== Haaramised - -Moved ingame -== Mängusisene liikumine - -Loading demo file from storage -== Demofaili laadimine mälust - -No login required -== Sisse pole vaja logida - -Player info change cooldown -== Mängija info muutmise viivitus - -Always show chat -== Alati näita vestlust - -Show friend mark (♥) in name plates -== Näita sõbra märki (♥) nimesiltides - -Show hook strength icon indicator -== Näita konksu jõu ikooni indikaatorit - -Show hook strength number indicator -== Näita konksu jõu numbri indikaatorit - -Show own player's hook collision line -== Näita enda konksu kokkupõrkejoont - -Always show own player's hook collision line -== Alati näita enda konksu kokkupõrkejoont - -Always show other players' hook collision lines -== Alati näita teiste konksu kokkupõrkejoont - -Net -== Võrk - -[Spectating] -Following %s -== %s jälgimine - -%d/%d KiB (%.1f KiB/s) -== %d/%d KiB (%.1f KiB/s) - -Example of usage -== Kasutamise näide - -Tee -== Tee - -Show only chat messages from team members -== Ainult näita sõnumeid tiimi kaaslastelt - -Round %d/%d -== Raund %d/%d - -[Spectators] -%d others… -== %d teisi… - -[Team and size] -%d\n(%d/%d) -== %d\n(%d/%d) - -Team %d (%d/%d) -== Tiim %d (%d/%d) - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not connect dummy -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Some fonts could not be loaded. Check the local console for details. -== - -Loading background map -== - -[Spectating Camera Mode Icon] -AUTO -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -No local servers found (ports %d-%d) -== - -Online friends (%d) -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Toggle auto camera -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -[Hertz] -Hz -== - -Show client IDs (scoreboard, chat, spectator) -== - -Show client IDs in name plates -== - -Hook Strength -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Preview 'Hook collisions' being pressed -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/finnish.txt b/data/languages/finnish.txt deleted file mode 100644 index d9d5390874..0000000000 --- a/data/languages/finnish.txt +++ /dev/null @@ -1,2074 +0,0 @@ -##### authors ##### -#originally created by: -# ziltoide -#modified by: -# ziltoide 2011-04-06 23:56:54 -# ziltoide 2011-07-05 18:31:04 -# Misse & Igrekyll 2021-07-07 18:01:51 -# ƤØŢĀŤ0Co 2024-04-26 21:37:00 -##### /authors ##### - -##### translated strings ##### - -%ds left -== %ds jäljellä - -%i minute left -== %i minuutti jäljellä - -%i minutes left -== %i minuuttia jäljellä - -%i second left -== %i sekunti jäljellä - -%i seconds left -== %i sekuntia jäljellä - -%s wins! -== %s voitti! - -Abort -== Keskeytä - -Add -== Lisää - -Add Friend -== Lisää ystävä - -Address -== Osoite - -All -== Kaikki - -Are you sure that you want to quit? -== Oletko varma, että haluat lopettaa pelin? - -Automatically record demos -== Nauhoita demot automaattisesti - -Automatically take game over screenshot -== Ota pelin jälkeinen kuvankaappaus automaattisesti - -Blue team -== Sininen joukkue - -Blue team wins! -== Sininen joukkue voitti! - -Body -== Vartalo - -Call vote -== Aloita äänestys - -Change settings -== Muuta asetuksia - -Chat -== Chatti - -Clan -== Klaani - -Client -== Asiakasohjelma - -Connecting to -== Yhdistetään - -Connection Problems… -== Yhteysongelmia… - -Console -== Konsoli - -Controls -== Ohjaus - -Count players only -== Laske vain pelaajat - -Current -== Nykyinen - -Custom colors -== Mukautetut värit - -Delete -== Poista - -Delete demo -== Poista demo - -Demofile: %s -== Demotiedosto: %s - -Demos -== Demot - -Disconnect -== Katk. yhteys - -Disconnected -== Yhteys katkaistu - -Downloading map -== Ladataan kenttää - -Draw! -== Tasapeli! - -Dynamic Camera -== Dynaaminen kamera - -Emoticon -== Hymiö - -Error -== Virhe - -Error loading demo -== Virhe ladattaessa demoa - -Favorite -== Suosikki - -Favorites -== Suosikit - -Feet -== Jalat - -Fire -== Ammu - -Folder -== Kansio - -Force vote -== Päätä äänestys - -Free-View -== Vapaa näkymä - -Fullscreen -== Koko näyttö - -Game -== Peli - -Game info -== Pelin tiedot - -Game over -== Peli loppui - -Game type -== Pelityyppi - -Game types: -== Pelityypit: - -General -== Yleinen - -Graphics -== Grafiikat - -Grenade -== Kranaatti - -Hammer -== Nuija - -Has people playing -== Ihmisiä pelaamassa - -High Detail -== Korkea yksityiskohtataso - -Hook -== Koukku - -Invalid Demo -== Epäkelpo demo - -Join blue -== Liity sinisiin - -Join red -== Liity punaisiin - -Jump -== Hyppää - -Kick player -== Potkaise pelaaja - -Language -== Kieli - -MOTD -== Palvelimen viesti - -Map -== Kenttä - -Move left -== Liiku vasemmalle - -Move player to spectators -== Siirrä pelaaja katsojaksi - -Move right -== Liiku oikealle - -Movement -== Liike - -Mute when not active -== Mykistä, kun ei aktiivinen - -Name -== Nimi - -Next weapon -== Seuraava ase - -Nickname -== Nimimerkki - -No -== Ei - -No password -== Ei salasanaa - -No servers found -== Palvelimia ei löytynyt - -No servers match your filter criteria -== Yksikään palvelin ei täyttänyt suodinkriteerejäsi - -Ok -== Ok - -Parent Folder -== Yläkansio - -Password -== Salasana - -Password incorrect -== Väärä salasana - -Ping -== Ping - -Pistol -== Pistooli - -Play background music -== Soita taustamusiikki - -Player -== Pelaaja - -Player country: -== Pelaajan maa: - -Players -== Pelaajat - -Please balance teams! -== Ole hyvä ja tasoita joukkueita! - -Prev. weapon -== Edellinen ase - -Quit -== Lopeta - -Reason: -== Syy: - -Red team -== Punainen joukkue - -Red team wins! -== Punainen joukkue voitti! - -Remote console -== Etäkonsoli - -Remove -== Poista - -Remove friend -== Poista ystävä - -Rename demo -== Uudelleennimeä demo - -Reset filter -== Nollaa suotimet - -Score -== Pisteet - -Score limit -== Pisteraja - -Scoreboard -== Tuloslista - -Screenshot -== Kuvankaappaus - -Server address: -== Palvelimen osoite: - -Server info -== Palvelintiedot - -Server not full -== Palvelin ei täysi - -Shotgun -== Haulikko - -Show chat -== Näytä chatti - -Show friends only -== Näytä vain ystävät - -Show ingame HUD -== Näytä peli-HUD - -Show name plates -== Näytä nimikyltit - -Sound -== Äänet - -Sound error -== Äänivirhe - -Spectate -== Katso - -Spectate next -== Katso seuraavaa - -Spectate previous -== Katso edellistä - -Spectator mode -== Katsojatila - -Spectators -== Katsojat - -Stop record -== Lopeta nauhoit. - -Strict gametype filter -== Tarkka pelityyppisuodin - -Sudden Death -== Äkkikuolema - -Switch weapon on pickup -== Vaihda asetta nostaessasi uuden - -Team -== Joukkue - -Team chat -== Joukkuechatti - -The audio device couldn't be initialised. -== Äänilaitteen alustaminen ei onnistunut. - -The server is running a non-standard tuning on a pure game type. -== Tämä palvelin ajaa ei-standardeja virityksiä standardipelityypillä. - -Time limit -== Aikaraja - -Time limit: %d min -== Aikaraja: %d min - -Try again -== Yritä uudelleen - -Type -== Tyyppi - -Unable to rename the demo -== Demon nimeäminen ei onnistunut - -Use sounds -== Käytä ääniefektejä - -Use team colors for name plates -== Käytä joukkueiden värejä nimikylteissä - -V-Sync -== V-Sync - -Version -== Versio - -Vote command: -== Äänestyskäsky: - -Vote description: -== Äänestyksen kuvaus: - -Vote no -== Äänestä ei - -Vote yes -== Äänestä kyllä - -Voting -== Äänestys - -Warmup -== Lämmittely - -Weapon -== Ase - -Yes -== Kyllä - -You must restart the game for all settings to take effect. -== Sinun täytyy uudelleenkäynnistää peli, jotta kaikki asetukset tulisivat voimaan. - -New name: -== Uusi nimi: - -Sat. -== Kyllästys - -Miscellaneous -== Sekalaista - -Internet -== Internet - -Max demos -== Demomaksimi - -News -== Uutiset - -Join game -== Liity peliin - -FSAA samples -== FSAA-näytteet - -Sound volume -== Äänenvoimakkuus - -Max Screenshots -== Kuvankaappausmaksimi - -Laser -== Laser - -Hue -== Värisävy - -Record demo -== Nauhoita demo - -Your skin -== Sinun ulkonäkösi - -Reset to defaults -== Palaa oletusasetuksiin - -Lht. -== Valoisuus - -UI Color -== Käyttöliittymäväri - -Alpha -== Alfa - -LAN -== LAN - -Name plates size -== Nimikylttien koko - -Successfully saved the replay! -== Uudelleentoisto tallentui onnistuneesti! - -Replay feature is disabled! -== Uudelleentoisto-ominaisuus on pois käytöstä! - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== Tekstuurin %s leveys ei ole jaollinen luvulla %d tai korkeus ei ole jaollinen luvulla %d, mikä voi aiheuttaa visuaalisia häiriöitä. - -Warning -== Varoitus - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Debuggaustila on käytössä. Paina Ctrl+Shift+D poistaaksesi debuggaustilan käytöstä. - -Game paused -== Peli pysäytetty - -Server best: -== Palvelimen paras: - -Personal best: -== Henkilökohtainen paras: - -Reset -== Nollaa - -Browser -== Selain - -Ghost -== Haamu - -Loading DDNet Client -== Ladataan DDNet-asiakasta - -Reconnect in %d sec -== Yhdistää uudelleen %d sekunnissa - -Render demo -== Renderöi demo - -Replace video -== Korvaa video - -File already exists, do you want to overwrite it? -== Tiedosto on jo olemassa, haluatko kirjoittaa sen päälle? - -Are you sure that you want to disconnect? -== Oletko varma, että haluat katkaista yhteyden? - -Disconnect Dummy -== Katk. nuken yhteys - -Are you sure that you want to disconnect your dummy? -== Oletko varma, että haluat katkaista nukkeesi yhteyden? - -Welcome to DDNet -== Tervetuloa DDNet:iin - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork on yhteistoiminnallinen verkkopeli, jossa tavoitteena on, että sinä ja teeryhmäsi saavuttavat kentän maaliviivan. Alokkaana sinun kannattaisi aloittaa Novice-palvelimilla, jotka isännöivät helpoimiä kenttiä. Huomioi viive valitaksesi lähellä olevan palvelimen. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Käytä näppäintä k tappaaksesi (uudelleenaloitus) ja näppäintä q pysäyttääksesi sekä katsoaksesi muita pelaajia. Asetuksista löydät muiden näppäinten asettelut. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== On suositeltavaa, että tarkistat asetukset ja säädät ne haluamiksesi ennen kuin liityt palvelimelle. - -Please enter your nickname below. -== Ole hyvä ja syötä nimimerkki alle. - -Existing Player -== Olemassaoleva pelaaja - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Nimimerkki '%s' on jo käytössä (%d pistettä). Haluatko silti käyttää sitä? - -Checking for existing player with your name -== Tarkistetaan, onko nimesi jo käytössä - -Speed -== Vauhti - -Video name: -== Videon nimi: - -Show DDNet map finishes in server browser -== Näytä DDNet kenttäläpäisyt palvelinselaimessa - -transmits your player name to info.ddnet.org -== lähettää nimimerkkisi osoitteeseen info.ddnet.org - -Theme -== Teema - -AFR -== AFR - -ASI -== ASI - -AUS -== AUS - -EUR -== EUR - -NA -== NA - -SA -== SA - -CHN -== CHN - -Getting server list from master server -== Ladataan palvelinlistaa isäntäpalvelimelta - -Search -== Hae - -Exclude -== Jätä pois - -%d of %d servers -== %d %d palvelimesta - -%d of %d server -== %d %d palvelimesta - -%d players -== %d pelaajaa - -%d player -== %d pelaaja - -Filter connecting players -== Suodata yhdistävät pelaajat - -Indicate map finish -== Näytä kenttäläpäisyt - -Unfinished map -== Läpäisemätön kartta - -Countries -== Maat - -Types -== Tyypit - -Leak IP -== Vuoda IP - -Remove chat -== Poista chatti - -%.2f MiB -== %.2f MiB - -%.2f KiB -== %.2f KiB - -Demo -== Demo - -Markers -== Merkit - -Length -== Pituus - -Date -== Päivämäärä - -Fetch Info -== Lataa info - -Demos directory -== Demohakemisto - -Connecting dummy -== Yhdistetään nukkea - -Connect Dummy -== Yhdistä nukke - -Kill -== Tapa - -Pause -== Pysäytä - -Deactivate -== Deaktivoi - -Activate -== Aktivoi - -Save -== Tallenna - -Smooth Dynamic Camera -== Pehmeä dynaaminen kamera - -Switch weapon when out of ammo -== Vaihda asetta ammusten loppuessa - -Show only chat messages from friends -== Näytä chattiviestit vain ystäviltä - -Show clan above name plates -== Näytä klaani nimikylttien yläpuolella - -Clan plates size -== Klaanikylttien koko - -Skip the main menu -== Ohita päävalikko - -Refresh Rate -== Virkistystaajuus - -Themes directory -== Teemahakemisto - -Download skins -== Lataa ulkonäköjä - -Vanilla skins only -== Pelkästään oletusulkonäöt - -Skin prefix -== Ulkonäön etuliite - -Skin Database -== Ulkonäkötietokanta - -Skins directory -== Ulkonäköhakemisto - -Hook collisions -== Koukun törmäysviiva - -Zoom in -== Suurenna - -Zoom out -== Pienennä - -Default zoom -== Oletuszoom - -Show others -== Näytä muut - -Show all -== Näytä kaikki - -Toggle dyncam -== Vaihda dynaaminen kamera - -Toggle dummy -== Vaihda nukkeen - -Toggle ghost -== Vaihda haamu - -Lock team -== Lukitse joukkue - -Show HUD -== Näytä HUD - -Chat command -== Chattikomento - -Dummy -== Nukke - -Windowed -== Ikkunoitu - -Windowed borderless -== Reunaton ikkuna - -Desktop fullscreen -== Koko näyttö - -may cause delay -== saattaa aiheuttaa viivettä - -Screen -== Näyttö - -Use high DPI -== Käytä korkeaa DPI:tä - -Enable game sounds -== Ota pelin äänet käyttöön - -Enable gun sound -== Ota aseiden äänet käyttöön - -Enable server message sound -== Ota palvelinviestiäänet käyttöön - -Enable regular chat sound -== Ota chatin äänet käyttöön - -Enable team chat sound -== Ota joukkuechatin äänet käyttöön - -Enable highlighted chat sound -== Ota korostetun chatin äänet käyttöön - -Game sound volume -== Pelin äänenvoimakkuus - -Chat sound volume -== Chatin äänenvoimakkuus - -Map sound volume -== Kenttien äänenvoimakkuus - -Background music volume -== Taustamusiikin äänenvoimakkuus - -HUD -== HUD - -DDNet -== DDNet - -DDNet Client needs to be restarted to complete update! -== DDNet-asiakas täytyy käynnistää uudelleen latauksen viimeistelemiseksi - -Show score -== Näytä pistemäärä - -Show names in chat in team colors -== Näytä nimet chatissa joukkueiden väreissä - -Show kill messages -== Näytä tappoviestit - -Show votes window after voting -== Näytä äänestysikkuna äänestämisen jälkeen - -Use old chat style -== Käytä vanhaa chatin tyyliä - -Messages -== Viestit - -System message -== Järjestelmäviesti - -Highlighted message -== Korostettu viesti - -Team message -== Joukkueviesti - -Friend message -== Ystäväviesti - -Normal message -== Tavallinen viesti - -Client message -== Asiakasviesti - -Preview -== Esikatselu - -Save the best demo of each race -== Tallenna jokaisen kentän paras demo - -Default length -== Oletuspituus - -Enable replays -== Luo uudelleentoistoja - -Show ghost -== Näytä haamu - -Save ghost -== Tallenna haamu - -Gameplay -== Peli - -Size -== Koko - -Show others (own team only) -== Näytä muut (vain joukkuekaverit) - -AntiPing -== AntiPing - -AntiPing: predict other players -== AntiPing: ennusta muut pelaajat - -AntiPing: predict weapons -== AntiPing: ennusta aseet - -AntiPing: predict grenade paths -== AntiPing: ennusta kranaattien polut - -Show other players' hook collision lines -== Näytä muiden pelaajien koukkujen törmaysviivat - -Show other players' key presses -== Näytä muiden pelaajien näppäinpainallukset - -Background -== Tausta - -Use current map as background -== Käytä nykyistä kenttää taustana - -DDNet %s is available: -== DDNet %s on saatavilla: - -Update now -== Päivitä nyt - -Updating… -== Päivitetään… - -DDNet Client updated! -== DDNet-asiakas on päivitetty! - -No updates available -== Ei päivityksiä saatavilla - -Check now -== Tarkista nyt - -Emoticons -== Hymiöt - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -Learn -== Opi - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ - -Website -== Verkkosivu - -Settings -== Asetukset - -Stop server -== Pysäytä palvelin - -Run server -== Suorita palvelin - -Editor -== Editori - -[Start menu] -Play -== Pelaa - -DDNet %s is out! -== DDNet %s on julkaistu! - -Downloading %s: -== Päivitetään %s: - -Update failed! Check log… -== Päivitys epäonnistui! Katso loki… - -Restart -== Uudelleenaloitus - -Time -== Aika - -Manual -== Ohjekirja - -Race -== Kisa - -Replay -== Uudelleentoisto - -Follow -== Seuraa - -Frags -== Tapot - -Deaths -== Kuolemat - -Suicides -== Itsemurhat - -Ratio -== Suhde - -Net -== Verkko - -FPM -== FPM - -Best -== Paras - -1 new mention -== 1 uusi maininta - -%d new mentions -== %d uutta mainintaa - -9+ new mentions -== 9+ uutta mainintaa - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Epäonnistui alustuksen aikana. Yritä muuttaa gfx_backend arvoksi OpenGL tai Vulkan asetushakemistossa settings_ddnet.cfg ja yritä uudelleen. - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== VRAM loppu. Yritä poistaa mukautettuja resursseja (skinit, entiteetit, jne.), erityisesti korkearesoluutioiset. - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== Komennon tallennuksen aikana tapahtui virhe. Yritä päivittää GPU-ajurit. - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== Renderöintikomento epäonnistui. Yritä päivittää GPU-ajurit. - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== Renderöintikomentojen lähettäminen epäonnistui. Yritä päivittää GPU-ajurit. - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== Framepuskureiden vaihto epäonnistui. Yritä päivittää GPU-ajurit. - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Tuntematon virhe. Yritä muuttaa gfx_backend arvoksi OpenGL tai Vulkan asetushakemistossa settings_ddnet.cfg ja yritä uudelleen. - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== Annettua näytönohjainta ei voitu alustaa. Palataan nyt oletusarvoiseen taustajärjestelmään. - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== Annettua näytönohjainta ei voitu alustaa, tämä johtuu luultavasti siitä, että et asentanut integroidun näytönohjaimen ohjainta. - -Could not save downloaded map. Try manually deleting this file: %s -== Ei voitu tallentaa ladattua karttaa. Yritä poistaa tämä tiedosto manuaalisesti: %s - -Error playing demo -== Virhe demoa toistaessa - -Failed saving the replay! -== Toiston tallentaminen epäonnistui! - -Saving settings to '%s' failed -== Asetusten tallentaminen '%s' epäonnistui - -Error saving settings -== Virhe asetusten tallentamisessa - -The format of texture %s is not RGBA which will cause visual bugs. -== Tekstuurin %s muoto ei ole RGBA, mikä aiheuttaa visuaalisia virheitä. - -Preparing demo playback -== Valmistetaan demon toistoa - -Connected -== Yhdistetty - -Loading map file from storage -== Ladataan karttatiedostoa tallennustilasta - -Why are you slowmo replaying to read this? -== Miksi hidastat toistoa lukeaksesi tätä? - -Initializing components -== Komponenttien alustus - -Initializing assets -== Resurssien alustaminen - -Initializing map logic -== Karttalogiikkaa alustetaan - -Sending initial client info -== Alkuasiakastietojen lähettäminen - -Quitting. Please wait… -== Lopettaminen. Odota… - -Restarting. Please wait… -== Käynnistetään uudelleen. Odota… - -Loading skin files -== Ladataan skinin tiedostoja - -Searching -== Etsitään - -Enter Username -== Syötä käyttäjätunnus - -Enter Password -== Syötä Salasana - -NOT CONNECTED -== EI YHTEYTTÄ - -Match %d of %d -== Yhdistä %d'n %d - -No results -== Ei tuloksia - -Lines %d - %d (%s) -== Rivit %d - %d (%s) - -Locked -== Lukittu - -Following -== Seurataan - -Loading commands… -== Ladataan komentoja… - -Position: -== Positio: - -Speed: -== Vauhti: - -Angle: -== Kulma: - -Multi-View -== Moni-Näkymä - -Team %d -== Joukkue %d - -Some map images could not be loaded. Check the local console for details. -== Joitakin kartan kuvia ei voitu ladata. Tarkasta paikallinen konsoli yksityiskohtia varten. - -Uploading map data to GPU -== Ladataan karttatietoja GPU:lle - -Some map sounds could not be loaded. Check the local console for details. -== Joitakin kartan ääniä ei voitu ladata. Tarkasta paikallinen konsoli yksityiskohtia varten. - -Loading menu themes -== Ladataan valikon teemoja - -Press a key… -== Paina näppäintä… - -Main menu -== Päävalikko - -Trying to determine UDP connectivity… -== Yritetään selvittää UDP-yhteyden toimivuutta… - -UDP seems to be filtered. -== UDP näyttää olevan suodatettu. - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== UDP ja TCP IP-osoitteet näyttävät eroavan. Yritä poistaa käytöstä VPN, välityspalvelin tai verkon nopeuttimia. - -No answer from server yet. -== Ei vielä vastausta palvelimelta. - -Getting game info -== Saadaan pelitietoja - -Requesting to join the game -== Pyydetään liittymistä peliin - -Rename folder -== Nimeä uudelleen kansio - -Render complete -== Renderöinti valmis - -Are you sure that you want to restart? -== Oletko varma, että haluat käynnistää uudelleen? - -There's an unsaved map in the editor, you might want to save it. -== Editorissa on tallentamaton kartta, joten haluat ehkä tallentaa sen. - -Continue anyway? -== Jatka silti? - -A demo with this name already exists -== Demo tällä nimellä on jo olemassa - -A folder with this name already exists -== Kansio tällä nimellä on jo olemassa - -Unable to rename the folder -== Ei voitu nimetä kansiota uudelleen - -File '%s' already exists, do you want to overwrite it? -== Tiedosto '%s' on jo olemassa, haluatko korvata sen? - -(paused) -== (keskeytetty) - -Videos directory -== Videoitten kansio - -Video was saved to '%s' -== Video tallennettiin osoitteeseen '%s' - -Join Tutorial Server -== Liity opetuspalvelimeen - -Skip Tutorial -== Ohita Tutoriali - -Loading menu images -== Ladataan valikon kuvia - -Are you sure that you want to disconnect and switch to a different server? -== Oletko varma, että haluat katkaista yhteyden ja siirtyä toiseen palvelimeen? - -Communities -== Yhteisöt - -Copy info -== Kopioi tiedot - -No server selected -== Palvelinta ei ole valittu - -Online clanmates (%d) -== Online klaanikaverit (%d) - -[friends (server browser)] -Offline (%d) -== Offline (%d) - -Click to select server. Double click to join your friend. -== Klikkaa valitaksesi palvelimen. Kaksoisklikkaa liittyäksesi ystävään. - -Click to remove this player from your friends list. -== Klikkaa poistaaksesi tämän pelaajan ystävälistaltasi. - -Click to remove this clan from your friends list. -== Klikkaa poistaaksesi tämän klaanin ystävälistaltasi. - -Are you sure that you want to remove the player '%s' from your friends list? -== Oletko varma että haluat poistaa pelaajan '%s' ystävälistaltasi? - -Are you sure that you want to remove the clan '%s' from your friends list? -== Oletko varma että haluat poistaa klaanin '%s' ystävälistaltasi? - -Add Clan -== Lisää Klaani - -Server filter -== Palvelimen - -Friends -== Ystävät - -Play the current demo -== Pyöritä nykyistä demoa - -Pause the current demo -== Tauota nykyinen demo - -Stop the current demo -== Pysäytä nykyinen demo - -Go back the specified duration -== Mene annetun ajan taaksepäin - -[Demo player duration] -%d min. -== %d min. - -[Demo player duration] -%d sec. -== %d sek. - -Change the skip duration -== Vaihda hyppyajan kesto - -Go forward the specified duration -== Mene annetun ajan eteenpäin - -Go back one tick -== Mene yhden askelen taaksepäin - -Go forward one tick -== Mene yhden askelen eteenpäin - -Go back one marker -== Mene yhden merkin taaksepäin - -Go forward one marker -== Mene yhden merkin eteenpäin - -Slow down the demo -== Hidasta demoa - -Speed up the demo -== Nopeuta demoa - -Mark the beginning of a cut (right click to reset) -== Merkitse leikkauksen alku (oikea klikkaus nollaa) - -Mark the end of a cut (right click to reset) -== Merkitse leikkauksen loppu (oikea klikkaus nollaa) - -Export cut as a separate demo -== Vie leikkaus erillisenä demona - -Close the demo player -== Sulje demo pelaaja - -Toggle keyboard shortcuts -== Vaihda näppäimistön pikanäppäimet - -Export demo cut -== Vie demoleikkaus - -Cut interval -== Leikkauksen väliaika - -Cut length -== Leikkauksen pituus - -Render cut to video -== Renderöi leikkaus videoksi - -Please use a different filename -== Käytä toista tiedostonimeä - -Loading demo files -== Ladataan demo-tiedostoja - -All combined -== Kaikki yhdistettynä - -No demo selected -== Demoa ei valittu - -Folder Link -== Kansio Linkki - -Created -== Luotu - -Netversion -== Netversio - -[Demo details] -map not included -== kartta ei sisälly - -Open the directory that contains the demo files -== Avaa kansio joka sisältää demo-tiedostot - -Are you sure that you want to delete the folder '%s'? -== Oletko varma että haluat poistaa kansion '%s'? - -Are you sure that you want to delete the demo '%s'? -== Oletko varma että haluat poistaa demon '%s'? - -Delete folder -== Poista kansio - -Unable to delete the demo '%s' -== Ei voitu poistaa demoa '%s' - -Unable to delete the folder '%s'. Make sure it's empty first. -== Ei voitu poistaa kansiota '%s'. Varmista että se on tyhjä ensin. - -Loading… -== Ladataan… - -Loading ghost files -== Ladataan aave-tiedostoja - -Ghosts directory -== Aaveitten kansio - -Activate all -== Aktivoi kaikki - -Deactivate all -== Deaktivoi kaikki - -Menu opened. Press Esc key again to close menu. -== Valikko avattu. Paina Esc-näppäintä uudelleen sulkeaksesi valikon. - -Save power by lowering refresh rate (higher input latency) -== Säästä virtaa alentamalla virkistystaajuutta (korkeampi viive syötteessä) - -Settings file -== asetustiedosto - -Open the settings file -== Avaa asetustiedosto - -Config directory -== Konfigurionti kansio - -Open the directory that contains the configuration and user files -== Avaa kansio jossa ovat asetus- ja käyttäjätiedostot - -Open the directory to add custom themes -== Avaa kansio mukautetuille teemoille - -Automatically take statboard screenshot -== Automaattisesti ota tilastotaulun kuva - -Automatically create statboard csv -== Automaattisesti luo tilastotaulu csv - -Max CSVs -== Maksimi CSV:t - -Download community skins -== Lataa yhteisön skinit - -Fat skins (DDFat) -== Lihavoidut ihonvärit (DDfat) - -Create a random skin -== Luo satunnainen skinit - -Choose default eyes when joining a server -== Valitse oletussilmät palvelimeen liittyessä - -Open the directory to add custom skins -== Avaa kansio mukautetuille ihonväreille - -Loading demo file from storage -== Ladataan demo-tiedosto tallennuksesta - -No login required -== Kirjautumista ei vaadita - -Player info change cooldown -== Pelaajan tiedon muutos viive - -Always show chat -== Aina näytä chatti - -Show friend mark (♥) in name plates -== Näytä ystävämerkki (♥) nimilaatoissa - -Show hook strength icon indicator -== Näytä koukun voiman ikoniindikaattori - -Show hook strength number indicator -== Näytä koukun voimanumeroindikaattori - -Show own player's hook collision line -== Näytä oman pelaajan törmäysviiva - -Always show own player's hook collision line -== Näytä aina oman pelaajan törmäysviiva - -Always show other players' hook collision lines -== Näytä aina muiden pelaajien törmaysviivat - -Dummy copy -== Nuken kopio - -Hammerfly dummy -== Vasaralento nukella - -Statboard -== Tilastotaulu - -Show entities -== Näytä entiteetit - -Enable controller -== Salli ohjain - -Controller -== Ohjain - -Ingame controller mode -== Pelissä ohjaimen tilatila - -[Ingame controller mode] -Relative -== Suhteellinen - -[Ingame controller mode] -Absolute -== Ehdoton - -Ingame controller sens. -== Pelissä ohjaimen herkkyys - -UI controller sens. -== Käyttöliittymässä - -Controller jitter tolerance -== Ohjaimen häiriösieto - -No controller found. Plug in a controller. -== Ohjainta ei löytynyt. Liitä ohjain. - -Axis -== Akseli - -Status -== Status - -Aim bind -== Tähtäys sidonta - -Mouse -== Hiiri - -Ingame mouse sens. -== Pelissä hiiren herkkyys - -UI mouse sens. -== Käyttöliittymän hiiren herkkyys - -Reset controls -== Nollaa ohjaukset - -Are you sure that you want to reset the controls to their defaults? -== Oletko varma että haluat palauttaa ohjaimet oletusasetuksiin? - -Cancel -== Peruta - -Windowed fullscreen -== Ikkuna koko näyttö - -Allows maps to render with more detail -== Salli karttojen renderöitymisen enemmän yksityiskohtia - -Renderer -== Renderöijä - -default -== tavallinen - -custom -== mukautettu - -Graphics card -== Näytönohjain - -auto -== automaattinen - -Enable long pain sound (used when shooting in freeze) -== Salli pitkä kipuääni (käytetään jäädytyksessä ampumiseen) - -Appearance -== Ulkomuoto - -Assets -== Resurssit - -Name Plate -== Nimi - -Hook Collisions -== Koukun törmäykset - -Info Messages -== Info viestit - -Show health, shields and ammo -== Näytä elämät, kilvet ja ammukset - -Show local time always -== Näytä paikallinen aika aina - -DDRace HUD -== DDrace-HUD - -Show DDRace HUD -== Näytä DDRace-HUD - -Show jumps indicator -== Näytä hyppyjen mittari - -Show dummy actions -== Näytä dummyn toiminnot - -Show player position -== Näytä pelaajan sijainti - -Show player speed -== Näytä pelaajan nopeus - -Show player target angle -== Näytä pelaajan maalikulma - -Show freeze bars -== Näytä jäätymispalkit - -Opacity of freeze bars inside freeze -== Läpinäkyvyys jäätymisessä olevan pelaajan jäätymispalkkien sisällä - -Chat font size -== Chatti kirjasinkoko - -Chat width -== Chatin leveys - -Show local player's key presses -== Näytä paikallisen pelaajan näppäimistönpainallukset - -Authed name color in scoreboard -== Autentifikoidun käyttäjän nimen väri pistetaulukossa - -Same clan color in scoreboard -== Saman klaanin väri pistetaulukossa - -Hook collision line -== Koukku törmäysviiva - -Hook collision line opacity -== Koukku törmäysviivan läpinäkyvyys - -Colors of the hook collision line, in case of a possible collision with: -== Koukun törmäysviivan värit mahdollisen törmäyksen tapauksessa: - -Your movements are not taken into account when calculating the line colors -== Sinun liikkeitäsi ei oteta huomioon viivan värien laskennassa - -Nothing hookable -== Ei mitään koukutettavaa - -Something hookable -== Jotain koukutettavaa - -A Tee -== Tee - -Show finish messages -== Näytä maaliviiva viestit - -Normal Color -== Tavallinen väri - -Highlight Color -== Korostus väri - -Weapons -== Aseet - -Rifle Laser Outline Color -== Kivärin laserin reunaviivan väri - -Rifle Laser Inner Color -== Kivärin laserin sisäinen väri - -Shotgun Laser Outline Color -== Haulikon laserin reunaviivan väri - -Shotgun Laser Inner Color -== Haulikon laserin sisäinen väri - -Entities -== Entiteetit - -Door Laser Outline Color -== Oven laserin reunaviivan väri - -Door Laser Inner Color -== Oven laserin sisäinen väri - -Freeze Laser Outline Color -== Jäädytys laserin reunaviivan väri - -Freeze Laser Inner Color -== Jäädytys laserin sisäinen väri - -Set all to Rifle -== Aseta kaikki kivääriksi - -Enable ghost -== Ota käyttöön aave - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Kun ylität maaliviivan, näytä aave-tee, joka toistaa parhaan aikasi liikkeet - -Opacity -== Peittävyys - -Only save improvements -== Tallenna vain parannukset - -Overlay entities -== Päällys entiteetit - -Show text entities -== Näytä teksti-entiteettejä - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Säädä muiden joukkueiden entiteettien, kuten teen ja nimilaattojen, läpinäkyvyyttä - -Show quads -== Näytä quadit - -Quads are used for background decoration -== Quadit ovat taustakoristelua varten - -Tries to predict other entities to give a feel of low latency -== Yrittää ennustaa muiden entiteettien liikkeitä antamaan tuntuman pienestä viiveestä - -Regular background color -== Tavallinen taustaväri - -Entities background color -== Entiteettien taustaväri - -Show tiles layers from BG map -== Näytä kartan taustakartan kerrokset - -New random timeout code -== Uusi satunnainen timeout koodi - -Run on join -== Käynnistä liittyessä palvelimeen - -Chat command (e.g. showall 1) -== Chatti komento (esim. showall 1) - -Unregister protocol and file extensions -== Rekisteröimätön protokolla ja tiedostopäätteet - -Particles -== Partikkelit - -Extras -== Lisä. - -Loading assets -== Ladataan resursseja - -Assets directory -== Resurssien kansio - -Open the directory to add custom assets -== Avaa kansio johon voi lisätä omia resursseja - -Tutorial -== Tutoriali - -Can't find a Tutorial server -== Ei voitu löytää Tutoriali palvelinta - -Server executable not found, can't run server -== Serverin suoritettavaa tiedostoa ei löytynyt, palvelinta ei voitu käynnistää - -Loading race demo files -== Ladataan kilpailu demo tiedostoja - -Super -== Super - -Auto -== Automaattinen - -Loading sound files -== Ladataan ääni tiedostoja - -Moved ingame -== Liikui pelissä - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not connect dummy -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Some fonts could not be loaded. Check the local console for details. -== - -Loading background map -== - -[Spectating] -Following %s -== - -[Spectating Camera Mode Icon] -AUTO -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -%d/%d KiB (%.1f KiB/s) -== - -No local servers found (ports %d-%d) -== - -Example of usage -== - -Online friends (%d) -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Toggle auto camera -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -[Hertz] -Hz -== - -Converse -== - -Tee -== - -Show client IDs (scoreboard, chat, spectator) -== - -Show only chat messages from team members -== - -Show client IDs in name plates -== - -Hook Strength -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Preview 'Hook collisions' being pressed -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Round %d/%d -== - -[Spectators] -%d others… -== - -[Team and size] -%d\n(%d/%d) -== - -Team %d (%d/%d) -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Spree -== - -Grabs -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/french.txt b/data/languages/french.txt deleted file mode 100644 index 3127e99664..0000000000 --- a/data/languages/french.txt +++ /dev/null @@ -1,2099 +0,0 @@ -##### authors ##### -#originally created by: -# -#modified by: -# lordskelethom 2010-05-30 14:01:11 -# Ubu 2010-05-30 18:41:43 -# Choupom 2010-10-11 00:32:54 -# Choupom 2010-11-21 14:07:30 -# Choupom 2011-01-05 22:13:44 -# clecle226 2011-02-09 12:28:39 -# clecle226 2011-02-12 23:43:59 -# Choupom 2011-02-13 12:24:15 -# Choupom 2011-04-02 19:53:54 -# Choupom 2011-04-03 23:00:57 -# Ubu 2011-04-04 21:09:05 -# Choupom 2011-07-02 19:23:49 -# SunnyPistache & Pipou 2020-07-09 21:09:00 -# SunnyPistache & Pipou 2020-10-03 09:29:00 -# SunnyPistache & Pipou 2020-11-07 11:30:00 -# Chairn 2021-05-31 20:00:00 -# T tee 2021-06-01 00:39:00 -# T tee & NRK & Chairn 2022-03-23 20:52:52 -# Nouaa 2022-05-14 23:00:00 -# Chairn 2022-06-16 19:00:00 -# Sucre 2022-07-19 20:36:00 -# archimede67 2022-08-15 13:02:00 -# Nouaa 2022-10-25 18:00:00 -# Sukya 2023-05-20 19:38:00 -# Emilcha 2024-06-09 11:31:00 -# Yubel 2024-12-04 16:17:00 - -##### /authors ##### - -##### translated strings ##### - -%ds left -== %ds restantes - -%i minute left -== %i minute restante - -%i minutes left -== %i minutes restantes - -%i second left -== %i seconde restante - -%i seconds left -== %i secondes restantes - -%s wins! -== %s gagne ! - -Abort -== Annuler - -Add -== Ajouter - -Add Friend -== Ajouter aux amis - -Address -== Adresse - -All -== Tout le monde - -Are you sure that you want to quit? -== Êtes-vous sûr de vouloir quitter ? - -Automatically record demos -== Enregistrer les démos automatiquement - -Automatically take game over screenshot -== Prendre une capture d'écran de fin de partie automatiquement - -Blue team -== Équipe bleue - -Blue team wins! -== L'équipe bleue gagne ! - -Body -== Corps - -Call vote -== Voter - -Change settings -== Changer les options - -Chat -== Chat - -Clan -== Clan - -Client -== Client - -Connecting to -== Connexion à - -Connection Problems… -== Problèmes de connexion… - -Console -== Console - -Controls -== Contrôles - -Count players only -== Seulement les joueurs - -Current -== Actuellement - -Custom colors -== Couleurs personnalisées - -Delete -== Supprimer - -Delete demo -== Supprimer la démo - -Demofile: %s -== Démo : %s - -Demos -== Démos - -Disconnect -== Partir - -Disconnected -== Déconnecté - -Downloading map -== Téléchargement de la carte - -Draw! -== Égalité ! - -Dynamic Camera -== Caméra dynamique - -Emoticon -== Émoticônes - -Error -== Erreur - -Error loading demo -== Erreur lors du chargement de la démo - -Favorite -== Favori - -Favorites -== Favoris - -Feet -== Pieds - -Fire -== Tirer - -Folder -== Dossier - -Force vote -== Forcer le vote - -Free-View -== Vue libre - -Fullscreen -== Plein écran - -Game -== Jeu - -Game info -== Info. jeu - -Game over -== Fin de la partie - -Game type -== Type de jeu - -Game types: -== Types de jeu : - -General -== Général - -Graphics -== Affichage - -Grenade -== Lance-grenade - -Hammer -== Marteau - -Has people playing -== Au moins un joueur - -High Detail -== Tous les détails - -Hook -== Grappin - -Invalid Demo -== Démo invalide - -Join blue -== Rej. Bleus - -Join red -== Rej. Rouges - -Jump -== Sauter - -Kick player -== Expulser un joueur - -Language -== Langue - -MOTD -== Message du jour - -Map -== Carte - -Move left -== Aller à gauche - -Move player to spectators -== Déplacer un joueur vers le mode spectateur - -Move right -== Aller à droite - -Movement -== Mouvement - -Mute when not active -== Rendre muet en cas d'inactivité - -Name -== Nom - -Next weapon -== Arme suivante - -Nickname -== Pseudonyme - -No -== Non - -No password -== Pas de mot de passe - -No servers found -== Aucun serveur trouvé - -No servers match your filter criteria -== Aucun serveur ne correspond à vos critères - -Ok -== Ok - -Parent Folder -== Dossier parent - -Password -== Mot de passe - -Password incorrect -== Mot de passe incorrect - -Ping -== Ping - -Pistol -== Pistolet - -Play background music -== Jouer la musique de fond - -Player -== Joueur - -Player country: -== Origine des Tees: - -Players -== Joueurs - -Please balance teams! -== Équilibrez les équipes ! - -Prev. weapon -== Arme précédente - -Quit -== Quitter - -Reason: -== Raison : - -Red team -== Équipe rouge - -Red team wins! -== L'équipe rouge gagne ! - -Remote console -== Console serveur - -Remove -== Retirer - -Remove friend -== Retirer des amis - -Rename demo -== Renommer la démo - -Reset filter -== Filtres par défaut - -Score -== Score - -Score limit -== Limite des scores - -Scoreboard -== Tableau des scores - -Screenshot -== Capture d'écran - -Server address: -== Adresse du serveur : - -Server info -== Info. serveur - -Server not full -== Pas de serveurs pleins - -Shotgun -== Fusil à pompe - -Show chat -== Afficher le chat - -Show friends only -== Seulement les amis - -Show ingame HUD -== Afficher l'interface du jeu - -Show name plates -== Afficher les pseudonymes - -Sound -== Son - -Sound error -== Erreur de son - -Spectate -== Mode spec. - -Spectate next -== Suivre le Tee d'avant - -Spectate previous -== Suivre le Tee d'après - -Spectator mode -== Option mode spec. - -Spectators -== Spectateurs - -Stop record -== Arrêter l'enregistrement - -Strict gametype filter -== Types de jeux exacts - -Sudden Death -== Mort Subite - -Switch weapon on pickup -== Sélectionner l'arme ramassée - -Team -== Équipe - -Team chat -== Chat d'équipe - -The audio device couldn't be initialised. -== Le périphérique audio n'a pas pu être initialisé. - -The server is running a non-standard tuning on a pure game type. -== Le serveur utilise des paramètres non standards sur un type de jeu standard. - -Time limit -== Limite de temps - -Time limit: %d min -== Limite de temps : %d min - -Try again -== Réessayer - -Type -== Type - -Unable to rename the demo -== Impossible de renommer la démo - -Use sounds -== Jouer les sons - -Use team colors for name plates -== Mettre votre pseudonyme aux couleurs de votre équipe - -V-Sync -== V-Sync - -Version -== Version - -Vote command: -== Commande de vote : - -Vote description: -== Description du vote : - -Vote no -== Voter non - -Vote yes -== Voter oui - -Voting -== Vote - -Warmup -== Échauffement - -Weapon -== Arme - -Yes -== Oui - -You must restart the game for all settings to take effect. -== Les changements prendront effet au prochain redémarrage. - -##### needs translation ##### - -New name: -== Nouveau nom : - -Sat. -== Saturation - -Miscellaneous -== Divers - -Internet -== Internet - -Max demos -== Nombre maximum de démos - -News -== Infos - -Join game -== Rejoindre - -FSAA samples -== Échantillonage FSAA - -Sound volume -== Volume du son général - -Max Screenshots -== Nombre maximum de captures d'écran - -Laser -== Laser - -Hue -== Teinte - -Record demo -== Enregist. démo - -Your skin -== Votre skin - -Reset to defaults -== Réinitialiser - -Lht. -== Luminosité - -UI Color -== Couleur du menu - -Alpha -== Alpha - -LAN -== LAN - -Name plates size -== Taille des pseudonymes - -Enable game sounds -== Activer les sons du jeu - -DDNet Client needs to be restarted to complete update! -== Le client DDNet a besoin d'être redémarré pour finir la MAJ ! - -Toggle dummy -== Basculer vers le dummy - -No updates available -== Pas de mise à jour disponible - -1 new mention -== 1 nouveau message - -Save -== Sauvegarder - -Fat skins (DDFat) -== Skins enrobés (DDFat) - -Automatically take statboard screenshot -== Prendre une capture d'écran du tableau des stats automatiquement - -Clan plates size -== Taille du clan - -Zoom out -== Dézoomer - -Show other players' hook collision lines -== Montrer la ligne de collision du grappin des autres joueurs - -Filter connecting players -== Filtre les Tees se connectant - -AntiPing: predict grenade paths -== AntiPing: prédit la trajectoire du lance-grenade - -Size -== Taille - -Enable team chat sound -== Activer les sons du chat d'équipe - -Browser -== Navigateur - -DDNet -== DDNet - -Show all -== Montrer tout le monde - -Vanilla skins only -== Skins par défaut - -DDNet %s is out! -== DDNet %s est disponible! - -Show ghost -== Afficher le fantôme - -Friend message -== Message d'ami - -AntiPing: predict other players -== AntiPing: prédit le déplacement des autres joueurs - -Are you sure that you want to disconnect your dummy? -== Êtes-vous sûr de vouloir déconnecter votre dummy ? - -Server best: -== Meilleur score du serveur - -Personal best: -== Meilleur temps personnel - -Skin prefix -== Préfixe de skin - -Date -== Date - -Suicides -== Suicides - -Check now -== Vérifier - -Enable regular chat sound -== Activer les sons de chat par défaut - -Enable server message sound -== Activer les sons des messages du serveur - -Enable gun sound -== Activer le son du pistolet - -Welcome to DDNet -== Bienvenue sur DDNet - -Max CSVs -== CSV maximum - -Statboard -== Tableau des stats - -Show text entities -== Afficher le texte des entités - -Connecting dummy -== Connexion du dummy - -Render demo -== Convertir une démo - -Save ghost -== Sauvegarder le fantôme - -Game paused -== Jeu en pause - -Team message -== Message d'équipe - -DDNet Client updated! -== Le client DDNet est à jour! - -Show entities -== Afficher les entités - -Replay feature is disabled! -== L'option de replay est désactivée - -Updating… -== Mise à jour en cours… - -Use high DPI -== Utiliser un DPI élevé - -Default zoom -== Zoom par défaut - -System message -== Message du système - -Are you sure that you want to disconnect? -== Êtes-vous sûr de vouloir vous déconnecter ? - -Deactivate -== Désactiver - -Update failed! Check log… -== La mise à jour a échouée ! Vérifiez les logs… - -%.2f KiB -== %.2f Kio - -Reset -== Défaut - -File already exists, do you want to overwrite it? -== Ce fichier existe déjà, voulez-vous l'écraser ? - -Grabs -== Grappins - -Update now -== Mettre à jour - -Follow -== Suivre - -Converse -== Converser - -Hook collisions -== Collision du grappin - -Frags -== Éliminations - -Indicate map finish -== Indiquer les cartes finies - -Show names in chat in team colors -== Colorer les pseudonymes dans le chat selon la couleur de l'équipe - -Messages -== Messages - -Fetch Info -== Afficher les détails - -Show only chat messages from friends -== Ne montrer que les messages des amis - -Remove chat -== Désactiver le chat - -Pause -== Pause - -Deaths -== Morts - -Length -== Durée - -Normal message -== Message normal - -Dummy copy -== Copiage du dummy - -Demo -== Démo - -Map sound volume -== Volume des sons de la carte - -Time -== Temps - -Exclude -== Exclure - -Disconnect Dummy -== Déconnecter le dummy - -Show clan above name plates -== Afficher le clan au dessus du pseudonyme - -Downloading %s: -== Téléchargement %s: - -Toggle dyncam -== Activer la dyncam - -Show other players' key presses -== Montrer les touches que les autres joueurs appuient - -Toggle ghost -== Activer le fantôme - -Enable highlighted chat sound -== Activer les sons du chat en surbrillance - -Overlay entities -== Afficher les entités - -Net -== Net - -Show HUD -== Afficher l'interface - -DDNet %s is available: -== DDNet %s est disponible: - -Search -== Chercher - -Activate -== Activer - -Hammerfly dummy -== Hammerfly du dummy - -Switch weapon when out of ammo -== Changer d'arme lorsqu'il n'y a plus de munition - -Save the best demo of each race -== Sauvegarder la meilleure démo de chaque course - -may cause delay -== Peut causer du délai - -Show others -== Montrer les autres - -%.2f MiB -== %.2f Mio - -Unfinished map -== Carte non terminée - -Default length -== Durée par défaut - -Highlighted message -== Message en surbrillance - -Successfully saved the replay! -== Le replay est sauvegardé avec succès! - -New random timeout code -== Nouveau code de time-out aléatoire - -FPM -== FPM - -Enable replays -== Activer les replays - -Loading DDNet Client -== Chargement du client DDNet - -Zoom in -== Zoomer - -Ghost -== Fantôme - -Show kill messages -== Afficher les messages d'élimination - -Markers -== Marqueurs - -HUD -== Interface - -Refresh Rate -== Taux de rafraîchissement - -Show score -== Afficher les scores - -Replace video -== Remplacer la vidéo - -Show tiles layers from BG map -== Utiliser les tuiles de la carte de fond - -Show votes window after voting -== Afficher la fenêtre de vote après avoir voté - -%d new mentions -== %d nouveaux messages - -Learn -== Guide - -Restart -== Redémarrer - -AntiPing: predict weapons -== AntiPing: prédit le comportement des armes - -Automatically create statboard csv -== Créer un tableau CSV des stats automatiquement - -Video name: -== Nom de la vidéo - -Show quads -== Afficher les quads - -Best -== Meilleur - -Ratio -== Ratio - -Lock team -== Verrouiller l'équipe - -Screen -== Écran - -Spree -== Série - -AntiPing -== AntiPing - -Enable long pain sound (used when shooting in freeze) -== Activer les sons de douleur du Tee (utilisé lorsqu'un Tee tire depuis le freeze (gel)) - -9+ new mentions -== 9+ nouveaux messages - -Kill -== Tuer - -Types -== Types - -Countries -== Pays - -Gameplay -== Jouabilité - -Connect Dummy -== Connecter le dummy - -Reconnect in %d sec -== Reconnexion dans %d sec - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDRaceNetwork est un jeu coopératif en ligne dont l'objectif est, pour vous ainsi que votre groupe de tees, d'atteindre la ligne d'arrivée d'une carte. En tant que nouveau joueur, il est préférable que vous commenciez sur les serveurs Novice, qui sont constitués des cartes les plus simples. Prenez en compte le ping afin de choisir un serveur proche de chez vous. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Il est recommandé d'ajuster les configurations à votre goût avant de rejoindre un serveur. - -Please enter your nickname below. -== Veuillez entrer votre pseudonyme ci-dessous. - -Show DDNet map finishes in server browser -== Afficher les cartes de DDNet terminées dans le navigateur - -transmits your player name to info.ddnet.org -== transmet votre pseudonyme à info.ddnet.org - -Warning -== Alerte - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Appuyez sur "k" pour mourir (recommencer) et "a" pour vous mettre en pause afin de regarder les autres joueurs. Allez dans les configurations pour voir davantage de raccourcis. - -Speed -== Vitesse - -Theme -== Thème - -%d of %d servers -== %d sur %d serveurs - -%d of %d server -== %d sur %d serveur - -%d players -== %d joueurs - -%d player -== %d joueur - -Demos directory -== Répertoire des enregistrements - -Skip the main menu -== Passer le menu principal - -Themes directory -== Répertoire des thèmes - -Download skins -== Télécharger des skins - -Skin Database -== Base de données de skins - -Skins directory -== Répertoire des skins - -Background music volume -== Volume de la musique de fond - -Assets -== Assets - -Client message -== Message du client - -Show others (own team only) -== Montrer les autres (de sa propre équipe uniquement) - -Use current map as background -== Utiliser la carte actuelle en tant qu'arrière-plan - -Entities -== Entités - -Emoticons -== Émoticônes - -Particles -== Particules - -Assets directory -== Répertoire des assets - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/wiki/Main_Page/fr - -Website -== Site web - -Settings -== Configurations - -Stop server -== Arrêter le serveur - -Run server -== Démarrer le serveur - -Server executable not found, can't run server -== L'exécutable du serveur est introuvable, le serveur ne peut donc pas démarrer - -Editor -== Éditeur - -[Start menu] -Play -== Jouer - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Mode développeur activé. Appuyez sur Ctrl+Maj+D pour le désactiver. - -Existing Player -== Joueur existant - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Le pseudonyme '%s' est déjà pris (%d points). Voulez-vous tout de même le garder ? - -Checking for existing player with your name -== Vérification de la disponibilité du pseudonyme - -Smooth Dynamic Camera -== Caméra dynamique fluide - -Game sound volume -== Volume des sons du jeu - -Chat sound volume -== Volume des sons du chat - -Use old chat style -== Utiliser l'ancien chat - -Manual -== Manuel - -Race -== Race - -Auto -== Auto - -Replay -== Replay - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== La largeur de la texture %s n'est pas divisible par %d, ou la hauteur n'est pas divisible par %d, ce qui peut causer des bugs visuels. - -AFR -== AFR - -ASI -== ASI - -AUS -== AUS - -EUR -== EUR - -NA -== AN - -SA -== AS - -CHN -== CHN - -Getting server list from master server -== Obtention de la liste des serveurs depuis le serveur maître - -Leak IP -== Fuiter l'IP - -Chat command -== Commande de chat - -Dummy -== Dummy - -Windowed -== Fenêtré - -Windowed borderless -== Fenêtré sans bordure - -Desktop fullscreen -== Bureau plein écran - -Preview -== Prévisualisation - -Background -== Arrière-plan - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -Are you sure that you want to disconnect and switch to a different server? -== Êtes-vous sûr de vouloir vous déconnecter et changer de serveur ? - -Show local player's key presses -== Montrer les touches appuyées des autres joueurs - -Settings file -== Fichier des paramètres - -Config directory -== Répertoire de configuration - -Windowed fullscreen -== Plein écran fenêtré - -Run on join -== Exécuter en rejoignant - -Chat command (e.g. showall 1) -== Commande du chat (ex : showall 1) - -The format of texture %s is not RGBA which will cause visual bugs. -== La texture %s n'est pas au format RGBA, ce qui causera des bugs visuels. - -Join Tutorial Server -== Rejoindre un serveur de tutoriel - -Skip Tutorial -== Passer le tutoriel - -Choose default eyes when joining a server -== Choisissez les yeux par défaut lorsque vous rejoignez un serveur - -Allows maps to render with more detail -== Permet de rendre les cartes avec plus de détails - -Renderer -== Moteur de rendu graphique - -default -== défaut - -custom -== Personnalisé - -auto -== Automatique - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Lorsque vous franchissez la ligne de départ, montre un fantôme reproduisant les mouvements de votre meilleur temps - -Opacity -== Opacité - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Ajustez l'opacité des entités appartenant à d'autres équipes, telle que les tees et les noms des joueurs - -Quads are used for background decoration -== Les quads sont utilisés pour la décoration de l'arrière-plan - -Tries to predict other entities to give a feel of low latency -== Essaie de prédire les autres entités pour donner une impression de faible latence - -Tutorial -== Tutoriel - -Can't find a Tutorial server -== Impossible de trouver un serveur tutoriel - -Super -== Super - -Team %d -== Équipe %d - -Position: -== Position : - -Speed: -== Vitesse : - -Angle: -== Angle : - -Trying to determine UDP connectivity… -== Tentative de connexion UDP… - -UDP seems to be filtered. -== UDP semble filtré. - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== Les adresses IP UDP et TCP semblent différentes. Essayez de désactiver les VPN, proxy ou accélérateurs réseaux. - -No answer from server yet. -== Aucune réponse du serveur. - -Download community skins -== Télécharger les skins de la communauté - -Enable controller -== Activer la manette - -[Ingame controller mode] -Relative -== Relatif - -[Ingame controller mode] -Absolute -== Absolu - -Ingame controller mode -== Mode manette - -Ingame controller sens. -== Sensibilité manette (jeu) - -UI controller sens. -== Sensibilité manette (menus) - -Controller jitter tolerance -== Tolérance gigue de la manette - -Status -== Statut - -Aim bind -== Touche visée - -Mouse -== Souris - -Ingame mouse sens. -== Sensibilité souris (jeu) - -UI mouse sens. -== Sensibilité souris (menus) - -Controller -== Manette - -Show dummy actions -== Afficher les actions du dummy - -Show freeze bars -== Afficher la barre de gel - -Show player position -== Afficher la position - -Show player speed -== Afficher la vitesse - -Show player target angle -== Afficher l'angle de visée - -Opacity of freeze bars inside freeze -== Opacité de la barre de gel dans le gel - -Normal Color -== Couleur normal - -Highlight Color -== Couleur surbrillante - -Extras -== Extras - -Connected -== Connecté - -Initializing assets -== Initialisation des assets - -Getting game info -== Obtention des informations de la partie - -Requesting to join the game -== Demande de rejoindre la partie - -Loading skin files -== Chargement des fichiers de skin - -Appearance -== Apparence - -Show health, shields and ammo -== Monter la vie, bouclier et les munitions - -DDRace HUD -== HUD DDRace - -Show DDRace HUD -== Montrer l'HUD DDrace - -Show jumps indicator -== Montrer l'indicateur de sauts - -Hook collision line -== Ligne de collision du grapin - -A Tee -== Un Tee - -Loading assets -== Chargement des assets - -Loading sound files -== Chargement des fichiers sonores - -Preparing demo playback -== Préparation de la lecture de la demo - -Loading map file from storage -== Chargement de la map depuis le stockage - -Why are you slowmo replaying to read this? -== Pourquoi rejoues-tu en slow-motion pour lire ça? - -Initializing components -== Initialisation des composants - -Initializing map logic -== Initialisation de la logique de la map - -Sending initial client info -== Envoi des informations initiales du client - -Uploading map data to GPU -== Transfert des données de la map vers le GPU - -Loading menu images -== Chargement des images de menu - -Loading demo files -== Chargement des fichiers de demo - -Loading ghost files -== Chargement des fichiers de fantôme - -Name Plate -== Plaque de nom - -Hook Collisions -== Collisions du grappin - -Hook collision line opacity -== Opacité de la ligne de collision du grappin - -Colors of the hook collision line, in case of a possible collision with: -== Couleurs de la ligne de collision du grappin, dans le cas d'une collision possible avec : - -Your movements are not taken into account when calculating the line colors -== Vos mouvements ne sont pas pris en compte lors du calcul des couleurs de la ligne - -Nothing hookable -== Rien d'accrochable - -Something hookable -== Quelque chose d'accrochable - -Loading race demo files -== Chargement des fichiers de demo de course - -Play the current demo -== Jouer la démo en cours - -Pause the current demo -== Mettre en pause la démo en cours - -Stop the current demo -== Arrêter la démo en cours - -Slow down the demo -== Ralentir la démo - -Speed up the demo -== Accélérer la démo - -Export cut as a separate demo -== Exporter la coupe comme une démo séparée - -Toggle keyboard shortcuts -== Basculer les raccourcis clavier - -Menu opened. Press Esc key again to close menu. -== Menu ouvert. Appuyez à nouveau sur la touche Éch. pour fermer le menu. - -Weapons -== Armes - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Échec lors de l'initialisation. Essayez de changer gfx_backend à OpenGL ou Vulkan dans le fichier settings_ddnet.cfg dans le dossier de configuration et réessayez. - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== Mémoire graphique insuffisante. Essayez de retirer des ressources personnalisées (skins, entités, etc.), en particulier celles de haute résolution. - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== Une erreur est survenue pendant l'enregistrement des commandes. Essayez de mettre à jour vos pilotes GPU. - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== Une commande de rendu a échoué. Essayez de mettre à jour vos pilotes GPU. - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== L'envoi d'une commande de rendu a échoué. Essayez de mettre à jour vos pilotes GPU. - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== Échec de l'échange de tampons d'images. Essayez de mettre à jour vos pilotes GPU. - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Erreur inconnue. Essayez de changer gfx_backend à OpenGL ou Vulkan dans le fichier settings_ddnet.cfg dans le dossier de configuration et réessayez. - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== Impossible d'initialiser le moteur de rendu spécifié, nouvel essai avec le moteur par défaut. - -Cancel -== Annuler - -File '%s' already exists, do you want to overwrite it? -== Le fichier '%s' existe déjà, voulez-vous l'écraser ? - -Are you sure that you want to remove the player '%s' from your friends list? -== Êtes-vous sûr de vouloir retirer le joueur '%s' de votre liste d'amis ? - -Are you sure that you want to remove the clan '%s' from your friends list? -== Êtes-vous sûr de vouloir retirer le clan '%s' de votre liste d'amis ? - -Go back one tick -== Reculer d'une image - -Go forward one tick -== Avancer d'une image - -Go back one marker -== Aller au marqueur précédent - -Go forward one marker -== Aller au marqueur suivant - -Open the directory that contains the demo files -== Ouvrir le dossier contenant les fichiers démo - -Are you sure that you want to delete the demo '%s'? -== Êtes-vous sûr de vouloir supprimer la démo '%s' ? - -Unable to delete the demo '%s' -== Impossible de supprimer la démo '%s' - -Save power by lowering refresh rate (higher input latency) -== Économiser la puissance en diminuant le taux de rafraîchissement (augmente la latence d'entrée) - -Open the settings file -== Ouvrir le fichier de configuration - -Open the directory that contains the configuration and user files -== Ouvrir le dossier contenant les fichiers de configuration et d'utilisateurs - -Open the directory to add custom themes -== Ouvrir le dossier pour ajouter un thème personnalisé - -Open the directory to add custom skins -== Ouvrir le dossier pour ajouter des skins personnalisés - -No controller found. Plug in a controller. -== Aucune manette détectée. Branchez une manette. - -Reset controls -== Réinitialiser les contrôles - -Are you sure that you want to reset the controls to their defaults? -== Êtes-vous sûr de vouloir réinitialiser les contrôles aux valeurs par défaut ? - -Rifle Laser Outline Color -== Couleur fusil laser (contour) - -Rifle Laser Inner Color -== Couleur fusil laser (intérieur) - -Shotgun Laser Outline Color -== Couleur fusil à pompe (contour) - -Shotgun Laser Inner Color -== Couleur fusil à pompe (intérieur) - -Door Laser Outline Color -== Couleur porte laser (contour) - -Door Laser Inner Color -== Couleur porte laser (intérieur) - -Freeze Laser Outline Color -== Couleur laser gelant (contour) - -Freeze Laser Inner Color -== Couleur laser gelant (intérieur) - -Set all to Rifle -== Copier les réglages du fusil laser à tous - -Unregister protocol and file extensions -== Désenregistrer le protocole et les extensions de fichier - -Open the directory to add custom assets -== Ouvrir le dossier pour ajouter des ressources personnalisées - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== Impossible d'initialiser l'interface graphique, vous n'avez probablement pas installé les pilotes de votre carte graphique. - -Could not save downloaded map. Try manually deleting this file: %s -== Impossible de sauvegarder la carte téléchargée. Essayez de supprimer ce fichier manuellement: %s - -Copy info -== Copier les infos - -Online clanmates (%d) -== Membres du clan en ligne (%d) - -[friends (server browser)] -Offline (%d) -== Hors-Ligne (%d) - -Click to select server. Double click to join your friend. -== Cliquez pour sélectionner ce serveur. Double-cliquez pour rejoindre votre ami(e) - -Click to remove this player from your friends list. -== Cliquez pour retirer ce joueur de votre liste d'amis - -Click to remove this clan from your friends list. -== Cliquez pour retirer ce clan de votre liste d'amis - -Add Clan -== Ajouter un clan - -Create a random skin -== Créer un skin aléatoire - -Error playing demo -== Erreur durant la lecture de la demo - -Failed saving the replay! -== Erreur durant la sauvegarde du replay ! - -Saving settings to '%s' failed -== La sauvegarde des paramètres vers '%s' a échouée - -Error saving settings -== Erreur de sauvegarde des paramètres - -Loading demo file from storage -== Chargement du fichier de la demo à partir du stockage - -Quitting. Please wait… -== En train de quitter. Veuillez patienter… - -Restarting. Please wait… -== Redémarrage. Veuillez patienter… - -Searching -== Recherche - -Enter Username -== Saisir le nom d'utilisateur - -Enter Password -== Saisir le mot de passe - -NOT CONNECTED -== NON CONNECTÉ - -Match %d of %d -== Correspondance %d sur %d - -No results -== Aucun résultat - -Lines %d - %d (%s) -== Lignes %d - %d (%s) - -Locked -== Verrouillé - -Following -== Suivi - -Loading commands… -== Chargement des commandes… - -Multi-View -== Multi-vues - -Some map images could not be loaded. Check the local console for details. -== Certaines images de la carte n'ont pas pu être chargées. Consultez la console locale pour plus de détails. - -Some map sounds could not be loaded. Check the local console for details. -== Certains sons de la carte n'ont pas pu être chargés. Consultez la console locale pour plus de détails. - -Loading menu themes -== Chargement des thèmes du menu - -Press a key… -== Appuyez sur une touche… - -Main menu -== Menu principal - -Rename folder -== Renommer le dossier - -Render complete -== Rendu terminé - -Are you sure that you want to restart? -== Êtes-vous sûr de vouloir recommencer ? - -There's an unsaved map in the editor, you might want to save it. -== Il y a une carte non enregistrée dans l'éditeur, vous voulez peut-être l'enregistrer. - -Continue anyway? -== Continuer quand même ? - -A demo with this name already exists -== Une démo avec ce nom existe déjà - -A folder with this name already exists -== Un dossier avec ce nom existe déjà - -Unable to rename the folder -== Impossible de renommer le dossier - -(paused) -== (en pause) - -Videos directory -== Dossier des vidéos - -Video was saved to '%s' -== La vidéo a été enregistrée dans '%s' - -%d/%d KiB (%.1f KiB/s) -== %d/%d Kio (%.1f Kio/s) - -No login required -== Pas d'authentification requise - -Communities -== Communautés - -No server selected -== Aucun serveur sélectionné - -Server filter -== Filtre de serveur - -Friends -== Amis - -Go back the specified duration -== Saut arrière de la durée spécifiée - -[Demo player duration] -%d min. -== %d min. - -[Demo player duration] -%d sec. -== %d sec. - -Change the skip duration -== Modifier la durée du saut - -Go forward the specified duration -== Saut avant de la durée spécifiée - -Mark the beginning of a cut (right click to reset) -== Marquer le début d'une coupe (clic droit pour réinitialiser) - -Mark the end of a cut (right click to reset) -== Marquer la fin d'une coupe (clic droit pour réinitialiser) - -Close the demo player -== Fermer le lecteur de demo - -Export demo cut -== Exporter le découpage de la demo - -Cut interval -== Intervale du découpage - -Cut length -== Longeur du découpage - -Render cut to video -== Rendu du découpage vers une vidéo - -Please use a different filename -== Veuillez utiliser un nom de fichier différent - -All combined -== Tout combiné - -No demo selected -== Aucune demo sélectionnée - -Folder Link -== Dossier Lien - -Created -== Créé - -Netversion -== Netversion - -[Demo details] -map not included -== carte non incluse - -Are you sure that you want to delete the folder '%s'? -== Êtes-vous sûr de vouloir supprimer le dossier '%s'? - -Delete folder -== Supprimer le dossier - -Unable to delete the folder '%s'. Make sure it's empty first. -== Impossible de supprimer le dossier '%s'. Assurez-vous d'abord qu'il est vide. - -Loading… -== Chargement… - -Ghosts directory -== Dossier des fantômes - -Activate all -== Tout activer - -Deactivate all -== Tout désactiver - -Player info change cooldown -== Délai de changement des informations du joueur - -Axis -== Axe - -Graphics card -== Carte graphique - -Tee -== Tee - -Info Messages -== Messages d'information - -Show local time always -== Toujours afficher l'heure locale - -Always show chat -== Toujours afficher le chat - -Show only chat messages from team members -== Afficher uniquement les messages des membres de l'équipe - -Chat font size -== Taille de police du chat - -Chat width -== Largeur du chat - -Show friend mark (♥) in name plates -== Montrez l'icone d'ami (♥) dans les pseudonymes - -Show hook strength icon indicator -== Afficher l'indicateur de force du grappin - -Show hook strength number indicator -== Afficher le nombre de force du grappin - -Authed name color in scoreboard -== Couleur des noms authentifiés dans le tableau des scores - -Same clan color in scoreboard -== Couleur des membres du clan dans le tableau des scores - -Show own player's hook collision line -== Afficher la ligne de collision de son propre grappin - -Always show own player's hook collision line -== Toujours afficher la ligne de collision de son propre grappin - -Always show other players' hook collision lines -== Toujours afficher la ligne de collision du grappin des autres joueurs - -Show finish messages -== Afficher les messages de fin de course - -Enable ghost -== Activer le fantôme - -Only save improvements -== Enregistrer uniquement les améliorations - -Regular background color -== Couleur de fond - -Entities background color -== Couleur de fond des entités - -Moved ingame -== Déplacé en jeu - -Could not resolve connect address '%s'. See local console for details. -== Impossible de résoudre l'adresse de connexion '%s'. Consultez la console locale pour plus de détails. - -Connect address error -== Erreur d'adresse de connexion - -Could not connect dummy -== Impossible de connecter le dummy - -Some fonts could not be loaded. Check the local console for details. -== Certaines polices n'ont pas pu être chargées. Consultez la console locale pour plus de détails. - -[Spectating] -Following %s -== Suivi de %s - -Save skin -== Enregistrer le skin - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== Êtes-vous sûr de vouloir enregistrer votre skin ? Si un skin déjà existant possède ce nom, il sera remplacé. - -Unable to save the skin -== Impossible d'enregistrer le skin - -Unable to save the skin with a reserved name -== Impossible d'enregistrer le skin avec un nom réservé - -No local servers found (ports %d-%d) -== Aucun serveur local trouvé (ports %d-%d) - -Example of usage -== Exemple d'utilisation - -Online friends (%d) -== Amis connectés (%d) - -Add friends by entering their name below or by clicking their name in the player list. -== Ajoutez des amis en entrant leurs noms ci-dessous ou en cliquant sur leurs noms dans la liste des joueurs. - -Add clanmates by entering their clan below and leaving the name blank. -== Ajoutez des membres du clan en entrant le nom de clan ci-dessous et en laissant le nom de joueur vide. - -Offline friends and clanmates will appear here. -== Les amis hors-lignes et les membres du clan apparaîtront ici. - -Dummy is not allowed on this server -== Le dummy n'est pas autorisé sur ce serveur - -Please wait… -== Veuillez patienter… - -Edit touch controls -== Modifier les contrôles tactiles - -Close -== Fermer - -Save changes -== Enregistrer les modifications - -Error saving touch controls -== Erreur lors de l'enregistrement des contrôles tactiles - -Could not save touch controls to file. See local console for details. -== Impossible d'enregistrer les contrôles tactiles dans le fichier. Consultez la console locale pour plus de détails. - -Unsaved changes -== Modifications non-enregistrées - -Discard changes -== Annuler les modifications - -Are you sure that you want to discard the current changes to the touch controls? -== Êtes-vous sûr de vouloir annuler les modifications actuelles des contrôles tactiles ? - -Are you sure that you want to reset the touch controls to default? -== Êtes-vous sûr de vouloir réinitialiser les contrôles tactiles aux valeurs par défaut ? - -Import from clipboard -== Importer depuis le presse-papiers - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== Êtes-vous sûr de vouloir importer les contrôles tactiles depuis le presse-papiers ? Cela va remplacer les contrôles tactiles actuels. - -Export to clipboard -== Exporter au presse-papiers - -Direct touch input while ingame -== Entrée tactile directe en jeu - -[Direct touch input] -Disabled -== Désactivée - -[Direct touch input] -Active action -== Action active - -[Direct touch input] -Aim -== Viser - -[Direct touch input] -Fire -== Tirer - -[Direct touch input] -Hook -== Grappin - -Direct touch input while spectating -== Entrée tactile directe en mode spec. - -Error loading touch controls -== Erreur lors du chargement des contrôles tactiles - -Could not load touch controls from file. See local console for details. -== Impossible de charger les contrôles tactiles depuis le fichier. Consultez la console locale pour plus de détails. - -Could not load default touch controls from file. See local console for details. -== Impossible de charger les contrôles tactiles par défaut depuis le fichier. Consultez la console locale pour plus de détails. - -Could not load touch controls from clipboard. See local console for details. -== Impossible de charger les contrôles tactiles depuis le presse-papiers. Consultez la console locale pour plus de détails. - -[Hertz] -Hz -== Hz - -Show client IDs (scoreboard, chat, spectator) -== Afficher les IDs des clients (tableau des scores, chat, spectateur) - -Width of your own hook collision line -== Largeur de la ligne de collision de votre grappin - -Width of others' hook collision line -== Largeur de la ligne de collision du grappin des autres joueurs - -Preview 'Hook collisions' being pressed -== Prévisualiser lorsque 'Collision du grappin' est utilisée - -Basic -== Basique - -Custom -== Personnalisé - -Are you sure that you want to delete '%s'? -== Êtes-vous sûr de vouloir supprimer '%s' ? - -Delete skin -== Supprimer le skin - -Unable to delete skin -== Impossible de supprimer le skin - -Round %d/%d -== Manche %d/%d - -[Spectators] -%d others… -== %d autres… - -[Team and size] -%d\n(%d/%d) -== %d\n(%d/%d) - -Team %d (%d/%d) -== Équipe %d (%d/%d) - -[skins] -Body -== Corps - -[skins] -Marking -== Marquage - -[skins] -Decoration -== Décoration - -[skins] -Hands -== Mains - -[skins] -Feet -== Pieds - -[skins] -Eyes -== Yeux - -Aim -== Viser - -Active: Fire -== Actif : Tirer - -Active: Hook -== Actif : Grappin - -https://wiki.ddnet.org/wiki/Mapping -== https://wiki.ddnet.org/wiki/Mapping - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Loading background map -== - -[Spectating Camera Mode Icon] -AUTO -== - -Toggle auto camera -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Show client IDs in name plates -== - -Hook Strength -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== diff --git a/data/languages/galician.txt b/data/languages/galician.txt deleted file mode 100644 index 8c060361c8..0000000000 --- a/data/languages/galician.txt +++ /dev/null @@ -1,2071 +0,0 @@ -##### authors ##### -# based on Spanish translation (2023-07-05) -# -# originally created by: -# TormentaDeFacha and Mercadona (2023-07-05) -##### /authors ##### - -##### translated strings ##### - -%ds left -== %ds restantes - -%i minute left -== %i minuto restante - -%i minutes left -== %i minutos restantes - -%i second left -== %i segundo restante - -%i seconds left -== %i segundos restantes - -%s wins! -== ¡%s gana! - -Abort -== Cancelar - -Add -== Añadir - -Add Friend -== Añadir amigo - -Address -== Dirección - -All -== Todos - -Are you sure that you want to quit? -== Estás seguro de que queres saír? - -Automatically record demos -== Gravar demos automaticamente - -Automatically take game over screenshot -== Captura de pantalla ao final da partida - -Blue team -== Equipo azul - -Blue team wins! -== O equipo azul gana! - -Body -== Corpo - -Call vote -== Votar - -Change settings -== Cambiar configuración - -Chat -== Chat - -Clan -== Clan - -Client -== Cliente - -Connecting to -== Conectando con - -Connection Problems… -== Problemas de conexión… - -Console -== Consola - -Controls -== Controis - -Count players only -== Só contar xogadores - -Current -== Actual - -Custom colors -== Cores personalizadas - -Delete -== Borrar - -Delete demo -== Borrar demo - -Demofile: %s -== Arquivo: %s - -Demos -== Demos - -Disconnect -== Desconectar - -Disconnected -== Desconectado - -Downloading map -== Descargando mapa - -Draw! -== Empate! - -Dynamic Camera -== Cámara dinámica - -Emoticon -== Emoticon - -Error -== Erro - -Error loading demo -== Erro ao cargar a demo - -Favorite -== Favorito - -Favorites -== Favoritos - -Feet -== Pés - -Fire -== Disparar - -Folder -== Cartafol - -Force vote -== Forzar - -Free-View -== Vista libre - -Fullscreen -== Pantalla completa - -Game -== Xogo - -Game info -== Información do xogo - -Game over -== Fin da partida - -Game paused -== Xogo en Pausa - -Game type -== Modo - -Game types: -== Tipos de Xogo: - -General -== Xeneral - -Graphics -== Gráficos - -Grenade -== Granada - -Hammer -== Martelo - -Has people playing -== Hai xente xogando - -High Detail -== Máis detalles (HD) - -Hook -== Gancho - -Invalid Demo -== Demo inválida - -Join blue -== Unirse ao azul - -Join red -== Unirse ao vermello - -Jump -== Saltar - -Kick player -== Expulsar xogador - -Language -== Idioma - -MOTD -== MOTD - -Map -== Mapa - -Move left -== Mover á esquerda - -Move player to spectators -== Mover xogador a espectadores - -Move right -== Mover á dereita - -Movement -== Movemento - -Mute when not active -== Silenciar se non está activo - -Name -== Nome - -Next weapon -== Arma seguinte - -Nickname -== Alcume - -No -== No - -No password -== Sen contrasinal - -No servers found -== Ningún servidor atopado - -No servers match your filter criteria -== Ningún servidor corresponde aos criterios de filtrado - -Ok -== Aceptar - -Parent Folder -== Directorio pai - -Password -== Contrasinal - -Password incorrect -== Contrasinal incorreta - -Ping -== Ping - -Pistol -== Pistola - -Play background music -== Reproducir música de fondo - -Player -== Xogador - -Player country: -== País do xogador - -Players -== Xogadores - -Please balance teams! -== Por favor, equilibrade os equipos! - -Prev. weapon -== Arma anterior - -Quit -== Saír - -Reason: -== Motivo: - -Red team -== Equipo vermello - -Red team wins! -== O equipo vermello gana! - -Remote console -== Consola remota - -Remove -== Eliminar - -Remove friend -== Eliminar amigo - -Rename demo -== Renombrar demo - -Reset filter -== Restablecer filtro - -Score -== Puntos - -Score limit -== Límite puntos - -Scoreboard -== Puntuaxe - -Screenshot -== Captura de pantalla - -Server address: -== IP do servidor: - -Server info -== Servidor - -Server not full -== Servidor sen encher - -Shotgun -== Escopeta - -Show chat -== Mostrar chat - -Show friends only -== Só mostrar amigos - -Show ingame HUD -== Mostrar HUD durante o xogo - -Show name plates -== Mostrar alcumes - -Show only chat messages from friends -== Recibir mensaxes só de amigos - -Sound -== Son - -Sound error -== Erro de son - -Spectate -== Asistir - -Spectate next -== Observar seguinte - -Spectate previous -== Observar anterior - -Spectator mode -== Modo espectador - -Spectators -== Espectadores - -Stop record -== Deter gravación - -Strict gametype filter -== Filtro de tipo de xogo estrito - -Sudden Death -== Morte súbita - -Switch weapon on pickup -== Cambiar á arma recollida - -Team -== Equipo - -Team chat -== En equipo - -The audio device couldn't be initialised. -== O dispositivo de audio non puido ser inicializado. - -The server is running a non-standard tuning on a pure game type. -== O servidor está a executar unha configuración non estándar nun tipo de xogo puro. - -Time limit -== Tempo límite - -Time limit: %d min -== Tempo límite: %d minutos - -Try again -== Tentar de novo - -Type -== Tipo - -Unable to rename the demo -== Non se puido renombrar a demo - -Use sounds -== Usar sons - -Use team colors for name plates -== Usar a cor de equipo nos alcumes - -V-Sync -== V-Sync - -Version -== Versión - -Vote command: -== Comando de votación: - -Vote description: -== Descrición da votación: - -Vote no -== Votar no - -Vote yes -== Votar sí - -Voting -== Votación - -Warmup -== Quecemento - -Weapon -== Arma - -Yes -== Sí - -You must restart the game for all settings to take effect. -== Debes reiniciar o xogo para que os cambios teñan efecto. - -New name: -== Novo nome: - -Sat. -== Sat. - -Miscellaneous -== Miscelánea - -Internet -== Internet - -Max demos -== Número máximo de demos - -News -== Noticias - -Join game -== Unirse - -FSAA samples -== Muestras FSAA - -Sound volume -== Volume do son - -Max Screenshots -== Número máximo de capturas - -Laser -== Láser - -Hue -== Matiz - -Record demo -== Grabar demo - -Your skin -== O teu skin - -Reset to defaults -== Restablecer por defecto - -Lht. -== Lum. - -UI Color -== Cor de menú - -Alpha -== Transp. - -LAN -== LAN - -Name plates size -== Tamaño da fonte dos alcumes - -Successfully saved the replay! -== Repetición gardada con éxito! - -Replay feature is disabled! -== A función de repetición está desactivada! - -Server best: -== Mellor do servidor: - -Personal best: -== Mellor persoal: - -Learn -== Aprender - -Browser -== Navegador - -Ghost -== Pantasma - -Loading DDNet Client -== Cargando o cliente DDNet - -Reconnect in %d sec -== Reconectando en %d seg - -Render demo -== Renderizar demo - -Replace video -== Substituír vídeo - -File already exists, do you want to overwrite it? -== O arquivo xa existe, queres sobrescribirlo? - -Are you sure that you want to disconnect? -== Estás seguro de que queres desconectarche? - -Disconnect Dummy -== Desconectar Dummy - -Are you sure that you want to disconnect your dummy? -== Estás seguro de que queres desconectar o teu dummy? - -Welcome to DDNet -== Benvido a DDNet - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork é un xogo cooperativo en liña onde o obxectivo é que ti e o voso grupo de tees cheguen á meta do mapa. Como recentemente chegado, deberías comezar nos servidores Novice, que aloxan os mapas máis fáciles. Considera o ping para elixir un servidor próximo - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Recoméndase que verifiques a configuración para axustala ao teu gusto antes de unirche a un servidor. - -Please enter your nickname below. -== Por favor, introduza o seu alcume a continuación. - -Video name: -== Nome do vídeo: - -Show DDNet map finishes in server browser -== Marcar os mapas DDNet acabados no navegador de servidores - -transmits your player name to info.ddnet.org -== transmite o teu nome de xogador a info.ddnet.org - -Search -== Buscar - -Exclude -== Excluír - -Filter connecting players -== Filtrar xogadores conectándose - -Indicate map finish -== Indicar mapa acabado - -Unfinished map -== Mapa inacabado - -Countries -== Países - -Types -== Tipos - -DDNet %s is out! -== DDNet %s xa esta dispoñible! - -Downloading %s: -== Descargando %s: - -Update failed! Check log… -== Actualización errada! Comproba o rexistro… - -DDNet Client updated! -== Cliente DDNet actualizado! - -Update now -== Actualizar agora - -Restart -== Reiniciar - -Remove chat -== Eliminar chat - -%.2f MiB -== %.2f MiB - -%.2f KiB -== %.2f KiB - -Demo -== Demo - -Markers -== Marcadores - -Length -== Lonxitude - -Date -== Data - -Fetch Info -== Obter info. - -Connecting dummy -== Conectando dummy - -Connect Dummy -== Conectar Dummy - -Deactivate -== Desactivar - -Activate -== Activar - -Save -== Gardar - -Switch weapon when out of ammo -== Cambiar de arma cando se acabe a munición - -Show clan above name plates -== Mostrar o clan por encima dos nomes - -Clan plates size -== Tamaño da fonte do clan - -Refresh Rate -== Frecuencia de actualización - -Automatically take statboard screenshot -== Tomar automaticamente a captura de pantalla do Statboard - -Automatically create statboard csv -== Crear automaticamente o csv do Statboard - -Max CSVs -== CSV máx - -Vanilla skins only -== Só skins Vanilla - -Fat skins (DDFat) -== Skins Obesas (DDFat) - -Skin prefix -== Prefixo de skin - -Hook collisions -== Colisións do gancho - -Pause -== Pausa - -Kill -== Matar - -Zoom in -== Achegar - -Zoom out -== Afastar - -Default zoom -== Zoom predeterm. - -Show others -== Mostrar outros - -Show all -== Mostrar todo - -Toggle dyncam -== Alt. cámara dinámica - -Toggle dummy -== Alternar dummy - -Toggle ghost -== Alternar pantasma - -Dummy copy -== Copiar dummy - -Hammerfly dummy -== Hammerfly dummy - -Converse -== Conversar - -Statboard -== Statboard - -Lock team -== Bloquear equipo - -Show entities -== Mostrar entidades - -Show HUD -== Mostrar HUD - -may cause delay -== pode causar atraso - -Screen -== Pantalla - -Use high DPI -== Usar DPI alto - -Enable game sounds -== Habilitar sons do xogo - -Enable gun sound -== Habilitar son de pistola - -Enable long pain sound (used when shooting in freeze) -== Habilitar o son de dor prolongada (úsase ao disparar estando conxelado) - -Enable server message sound -== Habilitar o son para mensaxes do servidor - -Enable regular chat sound -== Habilitar son do chat normal - -Enable team chat sound -== Habilitar o son do chat do equipo - -Enable highlighted chat sound -== Habilitar son de chat resaltado - -Map sound volume -== Vol. do son do mapa - -HUD -== Aparencia - -DDNet -== DDNet - -DDNet Client needs to be restarted to complete update! -== Utilizar o marcador DDRace - -Show score -== Mostrar puntaje - -Show names in chat in team colors -== Mostrar nomes con cores de equipo no chat - -Show kill messages -== Mostrar mensaxes de morte - -Show votes window after voting -== Mostrar xanela de votos despois de votar - -Messages -== Menxaxes - -System message -== Menxaxe do sistema - -Reset -== Reiniciar - -Highlighted message -== Mensaxe resaltada - -Team message -== Mensaxe do equipo - -Friend message -== Mensaxe dun amigo - -Normal message -== Menxaxe normal - -Save the best demo of each race -== Gardar o mellor demo de cada carreira - -Enable replays -== Habilitar repeticiones - -Show ghost -== Mostrar pantasma - -Save ghost -== Guardar pantasma - -Gameplay -== Gameplay - -Overlay entities -== Entidades superpostas - -Size -== Tamaño - -Show text entities -== Mostrar entidades de texto - -Show others (own team only) -== Mostrar outros (solo equipo propio) - -Show quads -== Mostrar quads - -AntiPing -== AntiPing - -AntiPing: predict other players -== AntiPing: predicir outros xogadores - -AntiPing: predict weapons -== AntiPing: predicir armas - -AntiPing: predict grenade paths -== AntiPing: predicir percorrido de granadas - -Show other players' hook collision lines -== Mostrar as liñas de colisión de gancho doutros xogadores - -Show other players' key presses -== Mostrar as pulsacións de teclas doutros xogadores - -Show tiles layers from BG map -== Mostrar capas de tiles do mapa de fondo - -DDNet %s is available: -== DDNet %s está dispoñible: - -Updating… -== Actualizando… - -No updates available -== Non hai actualizacións dispoñibles - -Check now -== Revisalo agora - -New random timeout code -== Novo código de timeout aleatorio - -Time -== Tempo - -Follow -== Seguir - -Frags -== Asasinatos - -Deaths -== Mortes - -Suicides -== Suicidios - -Ratio -== K/D - -Net -== Ventaxa - -FPM -== APM - -Spree -== Racha - -Best -== Mellor - -Grabs -== Bandeiras - -1 new mention -== 1 nova mención - -%d new mentions -== %d novas mencións - -9+ new mentions -== 9+ novas mencións - -Warning -== Advertencia - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Modo debug activado. Pulsa Ctrl+Shift+D para desactivarlo. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Usa a tecla K para suicidarche (reiniciar), Q para pausar e ver a outros xogadores. Mira a configuración para outras teclas. - -Existing Player -== Este xogador xa existe - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== O teu nome '%s' xa está usado (%d puntos). Desexas seguir usándoo? - -Checking for existing player with your name -== Comprobando se xa existe un xogador co teu nome - -Speed -== Velocidade - -Theme -== Tema - -%d of %d servers -== %d dos %d servidores - -%d of %d server -== %d do %d servidor - -%d players -== %d xogadores - -%d player -== %d xogador - -Demos directory -== Directorio de demos - -Smooth Dynamic Camera -== Cámara dinámica suave - -Skip the main menu -== Saltar ao menú principal - -Themes directory -== Directorio de temas - -Download skins -== Descargar skins - -Skin Database -== Base de datos de skins - -Skins directory -== Directorio de skins - -Game sound volume -== Vol. do sonido do xogo - -Chat sound volume -== Vol. do sonido do chat - -Background music volume -== Vol. da música de fondo - -Assets -== Recursos - -Use old chat style -== Usar estilo antigo do chat - -Client message -== Mensaxe do cliente - -Use current map as background -== Usar mapa actual como fondo - -Entities -== Entidades - -Emoticons -== Emoticones - -Particles -== Partículas - -Assets directory -== Directorio de recursos - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/wiki/Main_Page/es - -Website -== Páxina web - -Settings -== Configuración - -Stop server -== Deter servidor - -Run server -== Iniciar servidor - -Server executable not found, can't run server -== Executable do servidor non atopado. Non se pode iniciar o servidor - -Editor -== Editor - -[Start menu] -Play -== Xogar - -Manual -== Manual - -Race -== Carreira - -Auto -== Auto - -Replay -== Repetición - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== O ancho da textura %s non é divisible por %d, ou o alto non é divisible por %d, o que pode causar erros visuais. - -AFR -== AFR - -ASI -== ASI - -AUS -== AUS - -EUR -== EUR - -NA -== NA - -SA -== SA - -CHN -== CHN - -Getting server list from master server -== Obtendo lista de servidores do servidor mestre - -Leak IP -== Filtrar tu IP - -Chat command -== Comando de chat - -Dummy -== Dummy - -Windowed -== En xanela - -Windowed borderless -== Xanela sen bordos - -Desktop fullscreen -== Pantalla completa de escritorio - -Preview -== Vista previa - -Background -== Fondo - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -Are you sure that you want to disconnect and switch to a different server? -== Seguro que queres desconectarche e cambiar de servidor? - -Show local player's key presses -== Mostrar as teclas presionadas polo xogador local - -Settings file -== Arquivo de configuraciones - -Config directory -== Directorio de configuración - -Run on join -== Ejec. ao entrar - -Chat command (e.g. showall 1) -== Comando de chat (Ex. showall 1) - -The format of texture %s is not RGBA which will cause visual bugs. -== O formato da textura %s non é RGBA, o que pode causar erros visuais. - -Join Tutorial Server -== Ir a un servidor Titorial - -Skip Tutorial -== Saltar T`itorial - -Windowed fullscreen -== Xanela a pantalla completa - -Renderer -== Renderizador - -default -== por defecto - -custom -== personalizado - -auto -== auto. - -Tutorial -== Titorial - -Can't find a Tutorial server -== Non se puido atopar un servidor Titorial - -Choose default eyes when joining a server -== Escolle os ollos predeterminados ao unirche a un servidor - -Allows maps to render with more detail -== Permite que os mapas teñan máis detalles - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Cando cruzas a liña de inicio, móstrase un tee pantasma replicando os movementos do teu mellor tempo - -Opacity -== Opacidade - -Quads are used for background decoration -== As quads úsanse para a decoración do fondo - -Tries to predict other entities to give a feel of low latency -== Tenta predicir a outras entidades para dar unha sensación de baixa latencia - -Super -== Súper - -Team %d -== Equipo %d - -Position: -== Posición: - -Speed: -== Velocidade: - -Angle: -== Ángulo: - -Trying to determine UDP connectivity… -== Tratando de determinar a conexión UDP… - -UDP seems to be filtered. -== UDP parece estar filtrado. - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== As direccións IP TCP e UDP parecen ser diferentes. Tenta desactivar calquera VPN, proxy ou acelerador de rede. - -No answer from server yet. -== Aínda non hai resposta do servidor. - -Download community skins -== Descargar skins da comunidade - -Enable controller -== Habilitar mando - -Ingame controller mode -== Modo do mando - -Ingame controller sens. -== Sens. do mando do xogo - -UI controller sens. -== Sens. do mando do menú - -Controller jitter tolerance -== Tolerancia á fluctuación do mando - -Status -== Estado - -Aim bind -== Apuntar - -Mouse -== Ratón - -Ingame mouse sens. -== Sens. do ratón no xogo - -UI mouse sens. -== Sens. do ratón no menú - -Controller -== Mando - -Show dummy actions -== Mostrar acciones del dummy - -Show freeze bars -== Mostrar barras do freeze - -Show player position -== Mostrar a posición do xogador - -Show player speed -== Mostrar a velocidade do xogador - -Show player target angle -== Mostrar o ángulo do obxectivo do xogador - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Axusta a opacidade de entidades pertencentes a outros equipos, como os tees e os nomes. - -Opacity of freeze bars inside freeze -== Opacidade das barras de freeze dentro do freeze - -Normal Color -== Cor normal - -Highlight Color -== Cor resaltada - -Extras -== Extras - -Preparing demo playback -== Preparando a reprodución da demo - -Connected -== Conectado - -Loading map file from storage -== Cargando arquivo de mapa desde o almacenamento - -Why are you slowmo replaying to read this? -== Por que o reproduces a cámara lenta para ler isto? - -Initializing components -== Inicializando compoñentes - -Initializing assets -== Inicializando recursos - -Initializing map logic -== Inicializando lóxica de mapa - -Sending initial client info -== Enviando información inicial do cliente - -Uploading map data to GPU -== Cargando datos do mapa á GPU - -Getting game info -== Obtendo información da partida - -Requesting to join the game -== Solicitando unión á partida - -Loading menu images -== Cargando imaxes do menú - -Play the current demo -== Reproducir a demo actual - -Pause the current demo -== Pausar a demo actual - -Stop the current demo -== Deter a demo actual - -Slow down the demo -== Retardar a demo - -Speed up the demo -== Acelerar a demo - -Export cut as a separate demo -== Exportar corte como unha demo diferente - -Toggle keyboard shortcuts -== Alternar atallos de teclado - -Loading demo files -== Cargando arquivos de demos - -Menu opened. Press Esc key again to close menu. -== Menú aberto. Presiona a tecla Esc outra vez para pechalo. - -Loading ghost files -== Cargando arquivos de pantasma - -Loading skin files -== Cargando arquivos de skins - -Appearance -== Aparencia - -Name Plate -== Nomes - -Hook Collisions -== Colisións do gancho - -Show health, shields and ammo -== Mostrar saúde, escudos e munición - -DDRace HUD -== HUD DDRace - -Show DDRace HUD -== Mostrar o HUD DDRace - -Show jumps indicator -== Mostrar indicador de saltos - -Hook collision line -== Liña de colisión do gancho - -Hook collision line opacity -== Opacidade da liña de colisión do gancho - -Colors of the hook collision line, in case of a possible collision with: -== Cores da liña de colisión do gancho, no posible caso de que choque con: - -Your movements are not taken into account when calculating the line colors -== Os teus movementos non contan ao calcular as cores da liña - -Nothing hookable -== Nada enganchable - -Something hookable -== Algo enganchable - -A Tee -== Un Tee - -Weapons -== Armas - -Rifle Laser Outline Color -== Cor externa do Láser de Rifle - -Rifle Laser Inner Color -== Cor interna do Láser de Rifle - -Shotgun Laser Outline Color -== Cor externa do Láser da Escopeta - -Shotgun Laser Inner Color -== Cor interna do Láser da Escopeta - -Door Laser Outline Color -== Cor externa das Puertas Láser - -Door Laser Inner Color -== Cor interna das Puertas Láser - -Freeze Laser Outline Color -== Cor externa do Láser Congelante - -Freeze Laser Inner Color -== Cor interna do Láser Congelante - -Set all to Rifle -== Usar todos como o Rifle - -Loading assets -== Cargando recursos - -Loading race demo files -== Cargando arquivos de demos de carreiras - -Loading sound files -== Cargando arquivos de son - -Cancel -== Cancelar - -File '%s' already exists, do you want to overwrite it? -== O arquivo '%s' xa existe, queres sobrescribirlo? - -Are you sure that you want to remove the player '%s' from your friends list? -== Estás seguro de que queres quitar ao xogador '%s' da túa lista de amigos? - -Are you sure that you want to remove the clan '%s' from your friends list? -== Estás seguro de que queres quitar ao clan '%s' da túa lista de amigos? - -Go back one tick -== Retroceder un tick - -Go forward one tick -== Avanzar un tick - -Go back one marker -== Retroceder un marcador - -Go forward one marker -== Avanzar un marcador - -Are you sure that you want to delete the demo '%s'? -== Estás seguro de que queres eliminar a demo '%s'? - -Unable to delete the demo '%s' -== Non se puido eliminar a demo '%s' - -Reset controls -== Restablecer controis - -Are you sure that you want to reset the controls to their defaults? -== Estás seguro de que queres restablecer aos controis predeterminados? - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Erro durante a iniciación. Tenta cambiar gfx_backend a OpenGL ou Vulkan desde settings_ddnet.cfg no cartafol de configuracións e téntao outra vez. - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== A VRAM encheuse. Tenta quitar recursos personalizados (skins, entidades etc.)/ etc.), especialmente os de resolución alta. - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== Ocorreu un erro durante a gravación de comandos. Tenta actualizar os controladores do teu GPU. - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== Un comando de renderización fallou. Tenta actualizar os controladores do teu GPU. - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== Erro ao enviar os comandos de renderización. Tenta actualizar os controladores do teu GPU. - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== Erro ao intercambiar búferes de fotogramas. Tenta actualizar os controladores do teu GPU. - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Erro descoñecido. Tenta cambiar gfx_backend a OpenGL ou Vulkan desde settings_ddnet.cfg no directorio de configuracións e téntao outra vez. - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== Non se puido inicializar o backend de gráficos dado, volvendo ao backend predeterminado. - -Open the directory that contains the demo files -== Abrir o cartafol que contén os arquivos de demo - -Save power by lowering refresh rate (higher input latency) -== Aforra enerxía ao reducir a frecuencia de actualización (maior latencia de entrada) - -Open the settings file -== Abrir o arquivo de configuracións - -Open the directory that contains the configuration and user files -== Abrir o cartafol que contén as configuracións e arquivos do usuario - -Open the directory to add custom themes -== Abrir o cartafol para agregar temas personalizados - -Open the directory to add custom skins -== Abrir o cartafol para agregar skins personalizadas - -No controller found. Plug in a controller. -== Non se atopou un mando. Conecta un. - -Unregister protocol and file extensions -== Anular rexistro de protocolo e extensións de arquivo - -Open the directory to add custom assets -== Abrir o cartafol para agregar recursos personalizados - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== No se pudo inizializar el backend de gráficos dado, probablemente debido a que los controladores de la tarjeta gráfica integrada no están instalados. - -Could not save downloaded map. Try manually deleting this file: %s -== Non se puido almacenar o mapa descargado. Tenta eliminar este arquivo manualmente: %s - -Copy info -== Copiar información - -Create a random skin -== Crear skin aleatoria - -Online clanmates (%d) -== Compañeiro de clan en liña (%d) - -[friends (server browser)] -Offline (%d) -== Desconectados (%d) - -Click to select server. Double click to join your friend. -== Haz clic para seleccionar o servidor. Dobre clic para unirche ao teu amigo. - -Click to remove this player from your friends list. -== Haz clic para quitar este xogador da túa lista de amigos. - -Click to remove this clan from your friends list. -== Haz clic para quitar este clan da túa lista de amigos. - -Add Clan -== Agregar clan - -[Ingame controller mode] -Relative -== Relativo - -[Ingame controller mode] -Absolute -== Absoluto - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not connect dummy -== - -Error playing demo -== - -Failed saving the replay! -== - -Saving settings to '%s' failed -== - -Error saving settings -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Loading demo file from storage -== - -Some fonts could not be loaded. Check the local console for details. -== - -Quitting. Please wait… -== - -Restarting. Please wait… -== - -Loading background map -== - -Searching -== - -Enter Username -== - -Enter Password -== - -NOT CONNECTED -== - -Match %d of %d -== - -No results -== - -Lines %d - %d (%s) -== - -Locked -== - -Following -== - -Loading commands… -== - -Multi-View -== - -[Spectating] -Following %s -== - -[Spectating Camera Mode Icon] -AUTO -== - -Some map images could not be loaded. Check the local console for details. -== - -Some map sounds could not be loaded. Check the local console for details. -== - -Loading menu themes -== - -Press a key… -== - -Main menu -== - -Rename folder -== - -Render complete -== - -Are you sure that you want to restart? -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -There's an unsaved map in the editor, you might want to save it. -== - -Continue anyway? -== - -A demo with this name already exists -== - -A folder with this name already exists -== - -Unable to rename the folder -== - -(paused) -== - -Videos directory -== - -Video was saved to '%s' -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -%d/%d KiB (%.1f KiB/s) -== - -No local servers found (ports %d-%d) -== - -Example of usage -== - -No login required -== - -Communities -== - -No server selected -== - -Online friends (%d) -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Server filter -== - -Friends -== - -Go back the specified duration -== - -[Demo player duration] -%d min. -== - -[Demo player duration] -%d sec. -== - -Change the skip duration -== - -Go forward the specified duration -== - -Mark the beginning of a cut (right click to reset) -== - -Mark the end of a cut (right click to reset) -== - -Close the demo player -== - -Toggle auto camera -== - -Export demo cut -== - -Cut interval -== - -Cut length -== - -Render cut to video -== - -Please use a different filename -== - -All combined -== - -No demo selected -== - -Folder Link -== - -Created -== - -Netversion -== - -[Demo details] -map not included -== - -Are you sure that you want to delete the folder '%s'? -== - -Delete folder -== - -Unable to delete the folder '%s'. Make sure it's empty first. -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Loading… -== - -Ghosts directory -== - -Activate all -== - -Deactivate all -== - -[Hertz] -Hz -== - -Player info change cooldown -== - -Axis -== - -Graphics card -== - -Tee -== - -Info Messages -== - -Show local time always -== - -Authed name color in scoreboard -== - -Same clan color in scoreboard -== - -Show client IDs (scoreboard, chat, spectator) -== - -Always show chat -== - -Show only chat messages from team members -== - -Chat font size -== - -Chat width -== - -Show friend mark (♥) in name plates -== - -Show client IDs in name plates -== - -Hook Strength -== - -Show hook strength icon indicator -== - -Show hook strength number indicator -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Show own player's hook collision line -== - -Always show own player's hook collision line -== - -Always show other players' hook collision lines -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Preview 'Hook collisions' being pressed -== - -Show finish messages -== - -Default length -== - -Enable ghost -== - -Only save improvements -== - -Regular background color -== - -Entities background color -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Round %d/%d -== - -[Spectators] -%d others… -== - -[Team and size] -%d\n(%d/%d) -== - -Team %d (%d/%d) -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -Moved ingame -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/german.txt b/data/languages/german.txt deleted file mode 100644 index fcc97ffd4d..0000000000 --- a/data/languages/german.txt +++ /dev/null @@ -1,2090 +0,0 @@ -##### authors ##### -#originally created by: -# Dominik Geyer -#modified by: -# Fujnky 2010-06-03 11:30:05 -# Fujnky 2010-06-03 17:41:45 -# Fujnky 2010-06-05 23:36:52 -# Fujnky 2010-06-07 16:17:40 -# Fujnky 2010-06-11 09:50:47 -# Sworddragon 2010-11-21 14:25:00 -# Fujnky 2011-01-02 19:49:22 -# heinrich5991 2011-01-23 17:53:42 -# Sworddragon 2011-02-09 12:54:50 -# heinrich5991 2011-04-03 23:46:51 -# ghost91 2011-04-04 20:47:01 -# andi103 2011-05-02 19:12:27 -# andi103 2011-05-03 23:25:20 -# heinrich5991 2011-07-02 09:10:21 -# Yared Hufkens 2012-02-03 19:57:59 -# andi103 2012-07-14 11:31:11 -# timakro 2014-06-30 18:26:59 -# deen 2020-06-26 18:32:00 -# bluesky 2022-07-05 21:00:00 -# BlaiZephyr 2024-03-23 20:55:00 -##### /authors ##### - -##### translated strings ##### - -%ds left -== Noch %ds - -%i minute left -== Noch %i Minute - -%i minutes left -== Noch %i Minuten - -%i second left -== Noch %i Sekunde - -%i seconds left -== Noch %i Sekunden - -%s wins! -== %s gewinnt! - -Abort -== Abbrechen - -Add -== Hinzufügen - -Add Friend -== Freund hinzufügen - -Address -== Adresse - -All -== Alle - -Are you sure that you want to quit? -== Bist du sicher, dass du beenden möchtest? - -Automatically record demos -== Automatisch Aufnahmen erstellen - -Blue team -== Blaues Team - -Blue team wins! -== Blaues Team gewinnt! - -Body -== Körper - -Call vote -== Abstimmen - -Change settings -== Einstellungen ändern - -Chat -== Chat - -Clan -== Clan - -Client -== Client - -Colors of the hook collision line, in case of a possible collision with: -== Die Farbe der Hakenkollisionslinie bei einer möglichen Kollision mit: - -Connecting to -== Verbinden mit - -Connection Problems… -== Verbindungsprobleme… - -Console -== Konsole - -Controls -== Steuerung - -Count players only -== Nur Spieler zählen - -Current -== Aktuell - -Custom colors -== Eigene Farben - -Delete -== Löschen - -Delete demo -== Aufnahme löschen - -Demofile: %s -== Aufnahmedatei: %s - -Demos -== Aufnahmen - -Disconnect -== Trennen - -Disconnected -== Verbindung getrennt - -Downloading map -== Karte herunterladen - -Draw! -== Unentschieden! - -Dynamic Camera -== Dynamische Kamera - -Emoticon -== Emoticon - -Error -== Fehlgeschlagen - -Error loading demo -== Fehler beim Laden der Aufnahme, die Datei ist ungültig. - -Favorite -== Favorit - -Favorites -== Favoriten - -Feet -== Füße - -Fire -== Feuern - -Folder -== Ordner - -Force vote -== Erzwingen - -Free-View -== Freie Ansicht - -Fullscreen -== Vollbild - -Game -== Spiel - -Game info -== Spielinfo - -Game over -== Spiel vorbei - -Game paused -== Spiel pausiert - -Game type -== Spieltyp - -Game types: -== Spieltypen: - -General -== Allgemein - -Graphics -== Grafik - -Grenade -== Granate - -Hammer -== Hammer - -Has people playing -== Server nicht leer - -High Detail -== Hohe Details - -Hook -== Haken - -Invalid Demo -== Ungültige Aufnahme - -Join blue -== Zu Blau - -Join red -== Zu Rot - -Jump -== Springen - -Kick player -== Spieler kicken - -Language -== Sprache - -MOTD -== Nachricht des Tages - -Map -== Karte - -Move left -== Nach links - -Move player to spectators -== Spieler zu Zuschauer machen - -Move right -== Nach rechts - -Movement -== Bewegungen - -Mute when not active -== Stumm, wenn inaktiv - -Name -== Name - -Next weapon -== Nächste Waffe - -Nickname -== Spitzname - -No -== Nein - -No password -== Kein Passwort - -No servers found -== Keine Server gefunden - -No servers match your filter criteria -== Kein Server entspricht den Kriterien - -Ok -== OK - -Parent Folder -== Übergeordneter Ordner - -Password -== Passwort - -Password incorrect -== Passwort falsch - -Ping -== Ping - -Pistol -== Pistole - -Play background music -== Hintergrundmusik abspielen - -Player -== Spieler - -Player country: -== Spielerland: - -Players -== Spieler - -Please balance teams! -== Bitte Teams ausgleichen! - -Prev. weapon -== Vorherige Waffe - -Quit -== Beenden - -Reason: -== Grund: - -Red team -== Rotes Team - -Red team wins! -== Rotes Team gewinnt! - -Remote console -== Remote-Konsole - -Remove -== Löschen - -Remove friend -== Freund entfernen - -Rename demo -== Aufnahme umbenennen - -Reset filter -== Standardfilter - -Score -== Punkte - -Score limit -== Punktelimit - -Scoreboard -== Punktetafel - -Screenshot -== Bildschirmfoto - -Server address: -== Serveradresse: - -Server info -== Serverinfo - -Server not full -== Server nicht voll - -Shotgun -== Schrotflinte - -Show chat -== Chat anzeigen - -Show DDRace HUD -== DDRace-HUD anzeigen - -Show friends only -== Nur Freunde zeigen - -Show health, shields and ammo -== Leben, Schilde und Munition anzeigen - -Show ingame HUD -== Spiel-HUD anzeigen - -Show name plates -== Zeige Namen - -Show only chat messages from friends -== Nur Nachrichten von Freunden anzeigen - -Sound -== Ton - -Sound error -== Audiofehler - -Spectate -== Zuschauen - -Spectate next -== Nächstem zusehen - -Spectate previous -== Vorh. zusehen - -Spectator mode -== Zuschaueroptionen - -Spectators -== Zuschauer - -Stop record -== Aufnahme be. - -Strict gametype filter -== Genauer Spieltyp - -Sudden Death -== Sudden Death - -Switch weapon on pickup -== Waffe beim Aufsammeln wechseln - -Team -== Team - -Team chat -== Teamchat - -The audio device couldn't be initialised. -== Das Audiosystem konnte nicht gestartet werden. - -The server is running a non-standard tuning on a pure game type. -== Der Server läuft nicht mit Standardeinstellungen. - -Time limit -== Zeitlimit - -Time limit: %d min -== Zeitlimit: %d min - -Try again -== Nochmal versuchen - -Type -== Typ - -Unable to rename the demo -== Aufnahme konnte nicht umbenannt werden - -Use sounds -== Ton aktivieren - -Use team colors for name plates -== Teamfarben für Spielernamen benutzen - -V-Sync -== V-Sync - -Version -== Version - -Vote command: -== Befehl: - -Vote description: -== Beschreibung: - -Vote no -== Nein - -Vote yes -== Ja - -Voting -== Abstimmung - -Warmup -== Aufwärmen - -Weapon -== Waffe - -Yes -== Ja - -You must restart the game for all settings to take effect. -== Du musst das Spiel neustarten, um die Änderungen zu übernehmen. - -Name Plate -== Namensschilder - -New name: -== Neuer Name: - -Sat. -== Sätt. - -Miscellaneous -== Verschiedenes - -Internet -== Internet - -Max demos -== Maximale Anzahl an Aufnahmen - -News -== Neues - -Join game -== Beitreten - -FSAA samples -== Vollbild-Anti-Aliasing - -Sound volume -== Lautstärke - -Max Screenshots -== Maximale Anzahl an Bildschirmfotos - -Hue -== Farb. - -Record demo -== Aufnehmen - -Your skin -== Dein Skin - -Reset to defaults -== Standardeinstellung - -Lht. -== Hell. - -UI Color -== Menüfarbe - -Alpha -== Alpha - -LAN -== LAN - -Name plates size -== Größe der Spielernamen - -Ratio -== Verhältnis - -AntiPing -== Anti-Ping - -Show quads -== Quads anzeigen - -Map sound volume -== Karten-Lautstärke - -Countries -== Länder - -Types -== Typen - -Show kill messages -== Kill-Nachrichten anzeigen - -Show ghost -== Geist anzeigen - -No updates available -== Keine neuen Versionen - -Update now -== Jetzt aktualisieren - -Enable server message sound -== Ton für Server-Nachrichten aktivieren - -Show votes window after voting -== Abstimmungsfenster nach Abstimmung zeigen - -HUD -== Aussehen - -Appearance -== Aussehen - -Show names in chat in team colors -== Namen im Chat in Teamfarben anzeigen - -Enable team chat sound -== Ton für Team-Nachrichten aktivieren - -Show other players' hook collision lines -== Hakenkollisionen von anderen Spielern anzeigen - -Deaths -== Tode - -Enable game sounds -== Ton im Spiel aktivieren - -DDNet Client needs to be restarted to complete update! -== Der DDNet-Client muss neu gestartet werden, um das Update abzuschließen! - -Show others -== Andere zeigen - -Restart -== Neustart - -Browser -== Browser - -Enable gun sound -== Pistolen-Ton aktivieren - -Team message -== Team-Nachricht - -Save the best demo of each race -== Beste Aufnahme von jedem Rennen - -Are you sure that you want to disconnect? -== Bist du sicher, dass du die Verbindung trennen möchtest? - -Ghost -== Geist - -Check now -== Aktualisieren - -DDNet Client updated! -== Der DDNet-Client wurde aktualisiert! - -AntiPing: predict other players -== Anti-Ping: Andere Spieler vorberechnen - -Show other players' key presses -== Tastendrücke von anderen Spielern anzeigen - -System message -== Server-Nachricht - -DDNet %s is available: -== DDNet %s verfügbar: - -Updating… -== Aktualisieren… - -Overlay entities -== Overlay-Entitäten - -Messages -== Nachrichten - -%.2f MiB -== %.2f MiB - -Loading DDNet Client -== DDNet-Client laden - -Default zoom -== Normaler Zoom - -Show score -== Punktestand anzeigen - -%.2f KiB -== %.2f KiB - -Enable regular chat sound -== Ton für normale Nachrichten aktivieren - -DDNet -== DDNet - -Normal message -== Normale Nachricht - -AntiPing: predict grenade paths -== Anti-Ping: Granatenflugkurve vorberechnen - -Search -== Suche - -Connecting dummy -== Dummy verbindet sich - -Show clan above name plates -== Clan über Spielernamen anzeigen - -Save ghost -== Geist speichern - -Enable highlighted chat sound -== Ton für Nachrichten an dich aktivieren - -AntiPing: predict weapons -== Anti-Ping: Waffen vorberechnen - -Highlighted message -== Hervorgehobene Nachricht - -Switch weapon when out of ammo -== Waffe wechseln wenn Munition leer ist - -Grabs -== Griffe - -Automatically take game over screenshot -== Automatisches Bildschirmfoto am Spielende - -Gameplay -== Gameplay - -Laser -== Laser - -Follow -== Folgen - -Reset -== Zurücks. - -Automatically create statboard csv -== Automatisch Punktetafel-CSV erstellen - -Show tiles layers from BG map -== Kachelebenen der Hintergrundkarte zeigen - -Remove chat -== Chat entfernen - -Frags -== Abschüsse - -Automatically take statboard screenshot -== Automatisches Bildschirmfoto der Punktetafel - -Enable long pain sound (used when shooting in freeze) -== Langen Schmerzens-Ton aktivieren (benutzt, wenn beim Einfrieren geschossen wird) - -Vanilla skins only -== Nur Vanilla-Skins - -Refresh Rate -== Aktual.-Rate - -New random timeout code -== Neuer zufälliger Timeout-Code - -Suicides -== Selbstmorde - -Net -== Netzwerk - -FPM -== FPM - -Spree -== Serie - -Max CSVs -== Maximale CSVs - -Best -== Beste - -Screen -== Bildschirm - -Exclude -== Ausschließen - -Demo -== Aufnahme - -Fat skins (DDFat) -== Fette Skins (DDFat) - -Show DDNet map finishes in server browser -== DDNet-Kartenabschlüsse im Serverbrowser anzeigen - -Unfinished map -== Nicht gewonnene Karte - -Welcome to DDNet -== Willkommen bei DDNet - -may cause delay -== kann verlangsamen - -Indicate map finish -== Kartensieg anzeigen - -File already exists, do you want to overwrite it? -== Datei existiert bereits, willst du sie überschreiben? - -Clan plates size -== Größe des Clan-Namensschildes - -Friend message -== Nachricht eines Freundes - -Date -== Datum - -Skin prefix -== Skinpräfix - -Show HUD -== HUD zeigen - -9+ new mentions -== 9+ Erwähnungen - -Lock team -== Team sperren - -Zoom out -== Rauszoomen - -Are you sure that you want to disconnect your dummy? -== Bist du sicher, dass du deinen Dummy trennen willst? - -Activate -== Aktivieren - -Time -== Zeit - -Successfully saved the replay! -== Wiederholung erfolgreich gespeichert! - -Length -== Länge - -Show text entities -== Entitäten-Text - -Hook collisions -== Hakenkollisionen - -Hook Collisions -== Hakenkollisionen - -Hook collision line -== Hakenkollisionslinie - -Hook collision line opacity -== Deckkraft der Hakenkollisionslinie - -Fetch Info -== Neu laden - -DDNet %s is out! -== DDNet %s ist da! - -Save -== Speichern - -%d new mentions -== %d neue Erwähnungen - -Show all -== Alle anzeigen - -1 new mention -== 1 neue Erwähnung - -Dummy copy -== Dummy kopieren - -Downloading %s: -== Herunterladen %s: - -Show entities -== Entitäten anzeigen - -Zoom in -== Hineinzoomen - -Disconnect Dummy -== Dummy trennen - -Update failed! Check log… -== Update fehlgeschlagen! Siehe log… - -Markers -== Markierungen - -Enable replays -== Wiederholungen - -Toggle dummy -== Dummy wechseln - -Converse -== Unterhalten - -Filter connecting players -== Verbindende Spieler filtern - -Size -== Größe - -Deactivate -== Deaktivieren - -Replay feature is disabled! -== Wiederholungen sind deaktiviert! - -Replace video -== Video ersetzen - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork ist ein kooperatives Onlinespiel mit dem Ziel für dich und deine Gruppe von Tees das Ziel der Karte zu erreichen. Als Anfänger solltest du auf den Novice-Servern anfangen, auf denen die einfachsten Karten sind. Achte auf den Ping, um einen Server in deiner Nähe zu finden. - -Default length -== Standardlänge - -Pause -== Pause - -transmits your player name to info.ddnet.org -== überträgt deinen Spielernamen an info.ddnet.org - -Server best: -== Serverbeste: - -Render demo -== Demo rendern - -Hammerfly dummy -== Dummy-Hammerfly - -Connect Dummy -== Dummy verbinden - -Toggle ghost -== Geist wechseln - -Statboard -== Statstafel - -Reconnect in %d sec -== In %d Sek. wiederverbinden - -Personal best: -== Persönliche beste: - -Kill -== Kill - -Please enter your nickname below. -== Bitte gib deinen Spitznamen unten ein. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Es wird empfohlen die Einstellungen nach deinem Geschmack anzupassen bevor du einem Server beitrittst. - -Use high DPI -== Hohe DPI nutzen - -Learn -== Lernen - -Video name: -== Videoname: - -Toggle dyncam -== Dyncam wechseln - -Show others (own team only) -== Andere Spieler zeigen (eigenes Team) - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Benutze die Taste k, um neuzustarten. Benutze q, um zu pausieren und andere Spieler zu beobachten. Weitere Tastenbelegungen findet man in den Einstellungen. - -Client message -== Client-Nachricht - -Skip the main menu -== Hauptmenü überspringen - -Settings -== Einstellungen - -Run server -== Server starten - -Stop server -== Server stoppen - -Editor -== Editor - -Download skins -== Skins herunterladen - -Warning -== Warnung - -Speed -== Geschwindigkeit - -Website -== Website - -Server executable not found, can't run server -== Server-Programm nicht gefunden, kann Server nicht starten - -[Start menu] -Play -== Spielen - -%d of %d servers -== %d von %d Server - -%d of %d server -== %d von %d Server - -%d players -== %d Spieler - -%d player -== %d Spieler - -Theme -== Theme - -Demos directory -== Demo-Ordner - -Themes directory -== Theme-Ordner - -Skin Database -== Skin-Datenbank - -Skins directory -== Skin-Ordner - -Background music volume -== Hintergrundmusik-Lautst. - -Assets -== Assets - -Entities -== Entitäten - -Emoticons -== Emoticons - -Particles -== Partikel - -Assets directory -== Assets-Ordner - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/wiki/Main_Page/de - -Use current map as background -== Aktuelle Karte als Hintergrund benutzen - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Debug-Modus aktiviert. Drück Strg+Shift+D, um den Debug-Modus zu deaktivieren. - -Existing Player -== Existierender Spieler - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Dein Spitzname '%s' wird bereits genutzt (%d Punkte). Willst du ihn dennoch nutzen? - -Checking for existing player with your name -== Prüfe auf existierenden Spieler mit deinem Namen - -Game sound volume -== Spiel-Lautstärke - -Chat sound volume -== Chat-Lautstärke - -Use old chat style -== Alten Chat-Stil nutzen - -Manual -== Manuell - -Race -== Rennen - -Auto -== Auto - -Replay -== Wiederholung - -Smooth Dynamic Camera -== Weiche Dynamische Kamera - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== Die Breite von Textur %s ist nicht durch %d teilbar, oder die Höhe nicht durch %d teilbar, was Visuelle Fehler verursachen könnte. - -Dummy -== Dummy - -Preview -== Vorschau - -Background -== Hintergrund - -Chat command -== Chat-Befehl - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -AFR -== AFR - -ASI -== ASI - -AUS -== AUS - -EUR -== EUR - -NA -== NA - -SA -== SA - -CHN -== CHN - -Getting server list from master server -== Hole Serverliste vom Masterserver - -Leak IP -== IP leaken - -Windowed -== Fenster - -Windowed borderless -== Fenster ohne Rand - -Desktop fullscreen -== Desktop-Vollbild - -Nothing hookable -== nichts hookbarem - -Something hookable -== etwas hookbarem - -A Tee -== einem Tee - -Are you sure that you want to disconnect and switch to a different server? -== Bist du sicher, dass du die Verbindung trennen und zu einem anderen Server wechseln möchtest? - -Show local player's key presses -== Tastendrücke des eigenen Spielers anzeigen - -Settings file -== Einstellungen-Datei - -Config directory -== Konfigurations-Ordner - -Run on join -== Ausführen beim Betreten - -Chat command (e.g. showall 1) -== Chat-Befehl (z.B. showall 1) - -Windowed fullscreen -== Vollbild-Fenster - -The format of texture %s is not RGBA which will cause visual bugs. -== Das Format der Textur %s ist nicht RGBA was graphische Fehler verursachen wird. - -Join Tutorial Server -== Tutorial-Server betreten - -Skip Tutorial -== Tutorial überspringen - -Renderer -== Renderer - -default -== Standard - -custom -== eigene - -auto -== Auto - -Tutorial -== Tutorial - -Can't find a Tutorial server -== Kein Tutorial-Server wurde gefunden - -Choose default eyes when joining a server -== Standard-Augen beim Betreten eines Servers auswählen - -Allows maps to render with more detail -== Erlaubt es Karten mit mehr Detail zu rendern - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Wenn du die Startlinie überschreitest, wird ein Geist-Tee mit den Bewegungen deiner besten Zeit gezeigt - -Opacity -== Deckkraft - -Quads are used for background decoration -== Quads werden als Hintergrund-Dekoration benutzt - -Tries to predict other entities to give a feel of low latency -== Versucht das Verhalten anderer Entitäten vorherzusagen, um das Gefühl einer niedrigeren Latenz zu geben - -Super -== Super - -Team %d -== Team %d - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Deckkraft von Entitäten die zu einem anderen Team gehören, z.B. Tees und Namensschilder - -Position: -== Position: - -Speed: -== Geschwindigkeit: - -Angle: -== Winkel: - -Trying to determine UDP connectivity… -== Versuche UDP-Verbindungsfähigkeit festzustellen… - -UDP seems to be filtered. -== UDP scheint gefiltert zu werden. - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== UDP- und TCP-IP-Adressen scheinen unterschiedlich zu sein. Versuch VPN, Proxy oder Netzwerkbeschleuniger abzuschalten. - -No answer from server yet. -== Bisher keine Antwort vom Server. - -Download community skins -== Community-Skins runterladen - -Status -== Status - -Aim bind -== Ziel-Bind - -Mouse -== Maus - -Show dummy actions -== Dummy-Aktionen anzeigen - -Show freeze bars -== Einfrier-Balken zeigen - -Show player position -== Spielerposition zeigen - -Show player speed -== Spielergeschwindigkeit zeigen - -Show player target angle -== Zielwinkel des Spielers zeigen - -Ingame mouse sens. -== Maus-Empfind. im Spiel - -UI mouse sens. -== Maus-Empfind. im Menü - -Enable controller -== Controller aktivieren - -[Ingame controller mode] -Relative -== Relativ - -[Ingame controller mode] -Absolute -== Absolut - -Ingame controller mode -== Spiel-Controller-Modus - -Ingame controller sens. -== Controller-Empfind. im Spiel - -UI controller sens. -== Controller-Empfind. im Menü - -Controller jitter tolerance -== Jitter-Toleranz des Controllers - -Controller -== Controller - -Show jumps indicator -== Sprung-Indikator anzeigen - -Opacity of freeze bars inside freeze -== Deckkraft der Einfrier-Balken beim Einfrieren - -Normal Color -== Normale Farbe - -Highlight Color -== Hervorgehobene Farbe - -Extras -== Extras - -Preparing demo playback -== Bereite Demo-Wiedergabe vor - -Connected -== Verbunden - -Loading map file from storage -== Lade Kartendatei von Platte - -Initializing components -== Initialisiere Komponenten - -Initializing assets -== Initialisiere Assets - -Initializing map logic -== Initialisiere Kartenlogik - -Sending initial client info -== Sende initiale Client-Info - -Uploading map data to GPU -== Lade Kartendaten zur GPU hoch - -Getting game info -== Hole Spiel-Info - -Requesting to join the game -== Frage an dem Spiel beizutreten - -Loading menu images -== Lade Menü-Bilder - -Loading demo files -== Lade Demo-Dateien - -Loading ghost files -== Lade Geist-Dateien - -Loading skin files -== Lade Skin-Dateien - -DDRace HUD -== DDRace-HUD - -Your movements are not taken into account when calculating the line colors -== Deine Bewegungen werden bei der Berechnung von Linienfarben nicht berücksichtigt - -Loading assets -== Lade Assets - -Loading race demo files -== Lade Rennen-Demo-Dateien - -Loading sound files -== Lade Sound-Dateien - -Why are you slowmo replaying to read this? -== Warum spielst du das Replay in Slow-Motion um das zu lesen? - -Play the current demo -== Aktuelle Demo abspielen - -Pause the current demo -== Aktuelle Demo pausieren - -Stop the current demo -== Aktuelle Demo stoppen - -Slow down the demo -== Demo verlangsamen - -Speed up the demo -== Demo beschleunigen - -Export cut as a separate demo -== Schnitt als separate Demo exportieren - -Toggle keyboard shortcuts -== Keyboard-Shortcuts umschalten - -Weapons -== Waffen - -Rifle Laser Outline Color -== Konturfarbe Gewehr-Laser - -Rifle Laser Inner Color -== Innenfarbe Gewehr-Laser - -Shotgun Laser Outline Color -== Konturfarbe Schrotflinten-Laser - -Shotgun Laser Inner Color -== Innenfarbe Schrotflinten-Laser - -Door Laser Outline Color -== Konturfarbe Tür-Laser - -Door Laser Inner Color -== Innenfarbe Tür-Laser - -Freeze Laser Outline Color -== Konturfabe Einfrier-Laser - -Freeze Laser Inner Color -== Innenfarbe Einfrier-Laser - -Menu opened. Press Esc key again to close menu. -== Menü geöffnet. Erneut Esc-Taste drücken um Menü zu schließen. - -Set all to Rifle -== Alle auf Gewehr setzen - -Cancel -== Abbrechen - -File '%s' already exists, do you want to overwrite it? -== Datei '%s' existiert bereits, willst du sie überschreiben? - -Are you sure that you want to remove the player '%s' from your friends list? -== Willst du wirklich den Spieler '%s' aus deiner Freundesliste entfernen? - -Are you sure that you want to remove the clan '%s' from your friends list? -== Willst du wirklich den Clan '%s' aus deiner Freundesliste entfernen? - -Go back one tick -== Vorheriger Tick - -Go forward one tick -== Nächster Tick - -Go back one marker -== Vorherige Markierung - -Go forward one marker -== Nächste Markierung - -Are you sure that you want to delete the demo '%s'? -== Willst du wirklich die Demo '%s' entfernen? - -Unable to delete the demo '%s' -== Kann Demo '%s' nicht entfernen - -Reset controls -== Bedienungen zurücksetzen - -Are you sure that you want to reset the controls to their defaults? -== Willst du wirklich die Bedienungen zum Standard zurücksetzen? - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Fehler während der Initialisierung. Versuch gfx_backend zu OpenGL oder Vulkan zu ändern in settings_ddnet.cfg im Konfigurations-Ordner und versuche es erneut. - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== Kein VRAM mehr verfügbar. Versuch eigene Assets (Skins, Entitäten, usw.) zu löschen, insbesondere solche mit hoher Auflösung. - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== Ein Fehler ist währen dem Aufnahme-Befehl aufgetreten. Versuch deinen Grafiktreiber zu aktualisieren. - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== Ein Render-Befehl ist fehlgeschlagen. Versuch deinen Grafiktreiber zu aktualisieren. - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== Einreichen der Render-Befhle fehlgeschlagen. Versuch deinen Grafiktreiber zu aktualisieren. - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== Framebuffer konnten nicht getauscht werden. Versuch deinen Grafiktreiber zu aktualisieren. - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Unbekannter Fehler. Versuch gfx_backend zu OpenGL oder Vulkan zu ändern in settings_ddnet.cfg im Konfigurations-Ordner und versuche es erneut. - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== Konnte eingestelltes Grafik-Backend nicht initialisieren, setze zu Standard-Backend zurück. - -Open the directory that contains the configuration and user files -== Öffne den Ordner der die Konfigurations- und Benutzer-Dateien enthält - -Open the directory to add custom themes -== Öffne den Ordner um eigene Themes hinzuzufügen - -Open the directory to add custom skins -== Öffne den Ordner um eigene Skins hinzuzufügen - -No controller found. Plug in a controller. -== Kein Controller gefunden. Schließ einen Controller an. - -Unregister protocol and file extensions -== Entferne die Registrierungen für Protokoll- und Datei-Erweiterungen - -Open the directory to add custom assets -== Öffne den Ordner um eigene Assets hinzuzufügen - -Save power by lowering refresh rate (higher input latency) -== Spare Energie durch geringere Bildwiederholrate (höhere Inputverzögerung) - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== Konnte eingestelltes Grafik-Backend nicht initialisieren, wahrscheinlich weil du die Treiber für die integrierte Grafikkarte nicht installiert hast. - -Could not save downloaded map. Try manually deleting this file: %s -== Konnte heruntergeladene Map nicht speichern. Versuch die Datei händisch zu löschen: %s - -Copy info -== Kopier Info - -Open the directory that contains the demo files -== Öffne den Ordner der die Demo-Dateien enthält - -Open the settings file -== Öffne die Einstellungs-Datei - -Create a random skin -== Erstelle einen zufälligen Skin - -Online clanmates (%d) -== Online-Clanmitglieder (%d) - -[friends (server browser)] -Offline (%d) -== Offline (%d) - -Click to select server. Double click to join your friend. -== Klicke um den Server auszuwählen. Doppelklicke um deinem Freund beizutreten. - -Click to remove this player from your friends list. -== Klicke um diesen Spieler aus deiner Freundesliste zu entfernen. - -Click to remove this clan from your friends list. -== Klicke um diesen Clan aus deiner Freundesliste zu entfernen. - -Add Clan -== Clan hinzufügen - -A demo with this name already exists -== Eine Demo mit diesem Namen existiert bereits - -No server selected -== Kein Server ausgewählt - -Mark the beginning of a cut (right click to reset) -== Den Anfang eines Schnitts markieren (Rechtsklick zum Resetten) - -Mark the end of a cut (right click to reset) -== Das Ende eines Schnitts markieren (Rechtsklick zum Resetten) - -Close the demo player -== Den Demo-Player schließen - -Export demo cut -== Demo-Schnitt exportieren - -Cut interval -== Intervall des Schnitts - -Cut length -== Länge des Schnitts - -Axis -== Achse - -Graphics card -== Grafikkarte - -Quitting. Please wait… -== Beenden. Bitte warten… - -Restarting. Please wait… -== Neustarten. Bitte warten… - -Multi-View -== Multi-Ansicht - -Rename folder -== Ordner umbenennen - -A folder with this name already exists -== Ein Ordner mit diesem Namen existiert bereits - -Unable to rename the folder -== Kann den Ordner nicht umbenennen - -(paused) -== (pausiert) - -All combined -== Alle kombiniert - -Folder Link -== Ordner-Verknüpfung - -Are you sure that you want to delete the folder '%s'? -== Möchtest du wirklich den Ordner '%s' löschen? - -Delete folder -== Ordner löschen - -Unable to delete the folder '%s'. Make sure it's empty first. -== Kann den Ordner '%s' nicht löschen. Stell sicher dass er leer ist. - -Moved ingame -== Im Spiel bewegt - -Go back the specified duration -== Gesetzte Dauer zurück - -[Demo player duration] -%d min. -== %d Min. - -[Demo player duration] -%d sec. -== %d Sek. - -Change the skip duration -== Überspring-Dauer ändern - -Go forward the specified duration -== Gesetzte Dauer vorwärts - -Render cut to video -== Schnitt zu Video rendern - -Error playing demo -== Fehler beim Abspielen der Demo - -Some map images could not be loaded. Check the local console for details. -== Einige Karten-Bilder konnten nicht geladen werden. Prüf die lokale Konsole für Details. - -Some map sounds could not be loaded. Check the local console for details. -== Einige Karten-Töne konnten nicht geladen werden. Prüf die lokale Konsole für Details. - -Loading menu themes -== Menü-Themes laden - -Render complete -== Fertig gerendert - -Videos directory -== Video-Ordner - -Video was saved to '%s' -== Video wurde gespeichert als '%s' - -No demo selected -== Keine Demo ausgewählt - -Created -== Erstellt - -Netversion -== Netz-Version - -[Demo details] -map not included -== Karte nicht inbegriffen - -Ghosts directory -== Geister-Ordner - -Activate all -== Alle aktivieren - -Deactivate all -== Alle deaktivieren - -Enable ghost -== Geist aktivieren - -Only save improvements -== Nur Verbesserungen speichern - -Regular background color -== Normale Hintergrundfarbe - -Entities background color -== Entitäten-Hintergrundfarbe - -Saving settings to '%s' failed -== Einstellungen als '%s' speichern fehlgeschlagen - -Searching -== Suche - -Enter Username -== Benutzername eingeben - -Enter Password -== Passwort eingeben - -NOT CONNECTED -== NICHT VERBUNDEN - -Match %d of %d -== Treffer %d von %d - -No results -== Keine Ergebnisse - -Lines %d - %d (%s) -== Zeilen %d - %d (%s) - -Locked -== Gesperrt - -Following -== Folgen - -Press a key… -== Drück eine Taste… - -Are you sure that you want to restart? -== Bist du sicher dass du neustarten willst? - -There's an unsaved map in the editor, you might want to save it. -== Es gibt eine ungespeicherte Karte im Editor, du könntest sie speichern wollen. - -Continue anyway? -== Trotzdem fortfahren? - -Communities -== Gemeinschaften - -Please use a different filename -== Bitte nutz einen anderen Dateinamen - -Info Messages -== Info-Nachrichten - -Show local time always -== Immer lokale Zeit anzeigen - -Chat font size -== Chat-Schriftgröße - -Chat width -== Chat-Breite - -Authed name color in scoreboard -== Authorisierte Namensfarbe in der Punktetafel - -Same clan color in scoreboard -== Gleicher-Clan-Farbe in der Punktetafel - -Show finish messages -== Siegnachrichten anzeigen - -Failed saving the replay! -== Speichern der Wiederholung fehlgeschlagen! - -Error saving settings -== Fehler beim Speichern der Einstellungen - -Loading commands… -== Befehle laden… - -Main menu -== Hauptmenü - -Server filter -== Serverfilter - -Friends -== Freunde - -Loading… -== Laden… - -Loading demo file from storage -== Lade Demo-Datei von Platte - -No login required -== Kein Login erforderlich - -Player info change cooldown -== Abklingzeit Änderung Spieler-Info - -Always show chat -== Immer Chat anzeigen - -Show friend mark (♥) in name plates -== Freund-Zeichen (♥) im Namen anzeigen - -Show hook strength icon indicator -== Hakenstärke Icon anzeigen - -Show hook strength number indicator -== Hakenstärke Zahl anzeigen - -Show own player's hook collision line -== Eigene Hakenkollisionslinie anzeigen - -Always show own player's hook collision line -== Immer eigene Hakenkollisionslinie anzeigen - -Always show other players' hook collision lines -== Immer Hakenkollisionslinie anderer Spieler anzeigen - -%d/%d KiB (%.1f KiB/s) -== %d/%d KiB (%.1f KiB/s) - -Tee -== Tee - -Show only chat messages from team members -== Nur Nachrichten von Teammitgliedern anzeigen - -[Spectating] -Following %s -== %s folgen - -Example of usage -== Beispielnutzung - -Round %d/%d -== Runde %d/%d - -[Spectators] -%d others… -== %d andere… - -[Team and size] -%d\n(%d/%d) -== %d\n(%d/%d) - -Team %d (%d/%d) -== Team %d (%d/%d) - -Could not resolve connect address '%s'. See local console for details. -== Konnte Verbindungsadresse '%s' nicht auflösen, siehe lokale Konsole für Details. - -Connect address error -== Fehler in Verbindungsadresse - -Could not connect dummy -== Konnte Dummy nicht verbinden - -Dummy is not allowed on this server -== Dummy ist auf diesem Server nicht erlaubt - -Please wait… -== Bitte warten… - -Show client IDs (scoreboard, chat, spectator) -== Client-IDs anzeigen (Punktetafel, Chat, Beobachter) - -Are you sure that you want to delete '%s'? -== Bist du sicher dass du '%s' löschen willst? - -Delete skin -== Skin löschen - -Basic -== Einfach - -Custom -== Individuell - -Unable to delete skin -== Kann Skin nicht löschen - -Save skin -== Skin speichern - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== Willst du den Skin wirklich speichern? Wenn ein Skin mit diesem Namen bereits existiert, wird dieser ersetzt. - -Unable to save the skin -== Konnte Skin nicht speichern - -Unable to save the skin with a reserved name -== Konnte Skin nicht mit reserviertem Namen speichern - -No local servers found (ports %d-%d) -== Keine lokalen Server gefunden (Ports %d-%d) - -[Hertz] -Hz -== Hz - -[skins] -Body -== Körper - -[skins] -Marking -== Markierung - -[skins] -Decoration -== Dekoration - -[skins] -Hands -== Hände - -[skins] -Feet -== Füße - -[skins] -Eyes -== Augen - -https://wiki.ddnet.org/wiki/Mapping -== https://wiki.ddnet.org/wiki/Mapping - -Some fonts could not be loaded. Check the local console for details. -== Einige Schriften konnten nicht geladen werden. Prüf die lokale Konsole für Details. - -Online friends (%d) -== Online-Freunde (%d) - -Add friends by entering their name below or by clicking their name in the player list. -== Freunde hinzufügen durch Eingabe des Namens oder durch Klicken auf ihren Namen in Spielerliste. - -Add clanmates by entering their clan below and leaving the name blank. -== Clanmitglieder hinzufügen durch Eingabe des Clans und Leerlassen des Namens. - -Offline friends and clanmates will appear here. -== Offline-Freunde und Clanmitglieder erscheinen hier. - -Edit touch controls -== Berührungseingaben bearbeiten - -Close -== Schließen - -Save changes -== Änderungen speichern - -Error saving touch controls -== Berührungseingaben konnten nicht gespeichert werden - -Could not save touch controls to file. See local console for details. -== Konnte Berührungseingaben nicht in Datei speichern. Siehe lokale Konsole für Details. - -Unsaved changes -== Ungespeicherte Änderungen - -Discard changes -== Änderungen verwerfen - -Are you sure that you want to discard the current changes to the touch controls? -== Willst du wirklich die aktuellen Änderungen zu Berührungseingaben verwerfen? - -Are you sure that you want to reset the touch controls to default? -== Willst du wirklich die Berührungseingaben zurücksetzen? - -Import from clipboard -== Aus Zwischenablage importieren - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== Willst du wirklich Berührungseingaben aus der Zwischenablage importieren? Dies überschreibt deine aktuellen Berührungseingaben. - -Export to clipboard -== In Zwischenablage exportieren - -Direct touch input while ingame -== Direkte Berührungseingaben beim Spielen - -[Direct touch input] -Disabled -== Deaktiviert - -[Direct touch input] -Active action -== Aktive Aktion - -[Direct touch input] -Aim -== Zielen - -[Direct touch input] -Fire -== Feuern - -[Direct touch input] -Hook -== Haken - -Direct touch input while spectating -== Direkte Berührungseingaben beim Zuschauen - -Error loading touch controls -== Konnte Berührungssteuerung nicht laden - -Could not load touch controls from file. See local console for details. -== Konnte Berührungssteuerung nicht von Datei laden. Siehe Details in der lokalen Konsole. - -Could not load default touch controls from file. See local console for details. -== Konnte Standard-Berührungssteuerung nicht von Datei laden. Siehe Details in der lokalen Konsole. - -Could not load touch controls from clipboard. See local console for details. -== Konnte Berührungssteuerung nicht von Zwischenablage laden. Siehe Details in der lokalen Konsole. - -Width of your own hook collision line -== Breite der eigenen Hakenkollisionslinie - -Width of others' hook collision line -== Breite der Hakenkollisionslinie anderer - -Aim -== Zielen - -Active: Fire -== Aktiv: Feuern - -Active: Hook -== Aktiv: Haken - -Preview 'Hook collisions' being pressed -== Vorschau für 'Hakenkollisionen' gedrückt - -Loading background map -== Hintergrund-Karte laden - -[Spectating Camera Mode Icon] -AUTO -== AUTO - -Toggle auto camera -== Auto-Kamera wechseln - -https://wiki.ddnet.org/wiki/Touch_controls -== https://wiki.ddnet.org/wiki/Touch_controls - -Show client IDs in name plates -== Client-IDs in Spielernamen anzeigen - -Hook Strength -== Hakenstärke - -Size of hook strength icon and number indicator -== Größe des Hakenstärke-Symbole und der Zahl - -Key Presses -== Tastendrücke - -Size of key press icons -== Größe der Tastendruck-Symbole - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== Server konnte nicht gestartet werden. Erlaub Benachrichtigungen in den App-Einstellungen so dass der Server im Hintergrund laufen kann. - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== "%s" is nicht mit pnglite kompatibel und kann in alten DDNet-Versionen nicht geladen werden: diff --git a/data/languages/greek.txt b/data/languages/greek.txt deleted file mode 100644 index 457fdb5c5e..0000000000 --- a/data/languages/greek.txt +++ /dev/null @@ -1,2073 +0,0 @@ -##### authors ##### -#originally created by: -# Evropi -#modified by: -# -##### /authors ##### - -##### translated strings ##### - -%ds left -== %ds ακόμα - -%i minute left -== απομένει %i λεπτό - -%i minutes left -== απομένουν %i λεπτά - -%i second left -== απομένει %i δευτερόλεπτο - -%i seconds left -== απομένουν %i δευτερόλεπτα - -%s wins! -== Ο/Η %s νίκησε! - -Abort -== Ματαίωση - -Add -== Προσθήκη - -Add Friend -== Προσθήκη Φίλου - -Address -== Διεύθυνση - -All -== Όλοι - -Are you sure that you want to quit? -== Θέλετε σίγουρα να παραιτηθείτε; - -Automatically record demos -== Αυτόματη καταγραφή επιδείξεων - -Automatically take game over screenshot -== Αυτόμ. λήψη στιγμιότυπου στο τέλος παιχν. - -Blue team -== Μπλε ομάδα - -Blue team wins! -== Η μπλε ομάδα νίκησε! - -Body -== Σώμα - -Call vote -== Ψηφοφορία - -Change settings -== Αλλαγή ρυθμίσεων - -Chat -== Συνομιλία - -Clan -== Φυλή - -Client -== Πελάτης - -Connecting to -== Σύνδεση με - -Connection Problems… -== Προβλήματα Σύνδεσης… - -Console -== Κονσόλα - -Controls -== Χειρισμός - -Count players only -== Μέτρηση παικτών μόνο - -Current -== Τρέχουσα - -Custom colors -== Προσαρμοσμένα χρώματα - -Delete -== Διαγραφή - -Delete demo -== Διαγραφή επίδειξης - -Demofile: %s -== Αρχείο επίδειξης: %s - -Demos -== Επιδείξεις - -Disconnect -== Αποσύνδεση - -Disconnected -== Αποσυνδέθηκε - -Downloading map -== Λήψη χάρτη - -Draw! -== Ισοπαλία! - -Dynamic Camera -== Δυναμική Κάμερα - -Emoticon -== Emoticon - -Error -== Σφάλμα - -Error loading demo -== Σφάλμα φόρτωσης επίδειξης - -Favorite -== Αγαπημένος - -Favorites -== Αγαπημένοι - -Feet -== Πόδια - -Fire -== Πυρ - -Folder -== Φάκελος - -Force vote -== Αναγκαστική ψήφος - -Free-View -== Ελεύθερη Όψη - -Fullscreen -== Πλήρης οθόνη - -Game -== Παιχνίδι - -Game info -== Πληροφορίες παιχνιδιού - -Game over -== Τέλος παιχνιδιού - -Game paused -== Παιχνίδι εν παύση - -Game type -== Τύπος παιχνιδιού - -Game types: -== Τύποι παιχνιδιού: - -General -== Γενικά - -Graphics -== Γραφικά - -Grenade -== Εκτοξευτής - -Hammer -== Σφυρί - -Has people playing -== Έχει παίκτες μέσα - -High Detail -== Υψηλή Λεπτομέρεια - -Hook -== Γάντζος - -Invalid Demo -== Άκυρη Επίδειξη - -Join blue -== Μπλε - -Join red -== Κόκκινοι - -Jump -== Άλμα - -Kick player -== Αποβολή παίκτη - -Language -== Γλώσσα - -MOTD -== Μήνυμα της ημέρας - -Map -== Χάρτης - -Move left -== Κίνηση αριστερά - -Move player to spectators -== Μετακίνηση του παίκτη στους θεατές - -Move right -== Κίνηση δεξιά - -Movement -== Κίνηση - -Mute when not active -== Σίγαση εν αδρανεία - -Name -== Όνομα - -Next weapon -== Επόμενο όπλο - -Nickname -== Ψευδώνυμο - -No -== Όχι - -No password -== Χωρίς κωδικό - -No servers found -== Δεν βρέθηκαν διακομιστές - -No servers match your filter criteria -== Κανένας διακομιστής με αυτά τα κριτήρια - -Ok -== Εντάξει - -Parent Folder -== Επάνω - -Password -== Κωδικός - -Password incorrect -== Λανθασμένος κωδικός - -Ping -== Ping - -Pistol -== Πιστόλι - -Play background music -== Αναπαραγωγή μουσικής υπόκρουσης - -Player -== Παίκτης - -Player country: -== Χώρα παίκτη: - -Players -== Παίκτες - -Please balance teams! -== Παρακαλούμε εξισορροπήστε τις ομάδες! - -Prev. weapon -== Προηγούμενο όπλο - -Quit -== Έξοδος - -Reason: -== Αιτία: - -Red team -== Κόκκινη ομάδα - -Red team wins! -== Η κόκκινη ομάδα νίκησε! - -Remote console -== Απομακρ. κονσόλα - -Remove -== Αφαίρεση - -Remove friend -== Αφαίρεση φίλου - -Rename demo -== Μετονομασία επίδειξης - -Reset filter -== Αφαίρεση φίλτρου - -Score -== Βαθμ. - -Score limit -== Όριο βαθμολογίας - -Scoreboard -== Πίνακας βαθμ/γίας - -Screenshot -== Στιγμιότυπο οθόνης - -Server address: -== Διεύθ/ση διακομιστή: - -Server info -== Πληροφορίες - -Server not full -== Μη πλήρης διακομιστής - -Shotgun -== Καραμπίνα - -Show chat -== Προβ. συνομιλίας - -Show friends only -== Εμφάνιση φίλων μόνο - -Show ingame HUD -== Εμφάνιση μενού εντός παιχνιδιού - -Show name plates -== Προβολή ψευδωνύμων - -Show only chat messages from friends -== Προβολή μηνυμάτων μόνο από φίλους - -Sound -== Ήχος - -Sound error -== Σφάλμα ήχου - -Spectate -== Θέαση - -Spectate next -== Επόμενος - -Spectate previous -== Προηγούμενος - -Spectator mode -== Λειτουργία θέασης - -Spectators -== Θεατές - -Stop record -== Παύση καταγραφής - -Strict gametype filter -== Αυστηρό φίλτρο παιχν. - -Sudden Death -== Ξαφνικός Θάνατος - -Switch weapon on pickup -== Αλλαγή όπλου ανά μάζεμα - -Team -== Ομάδα - -Team chat -== Ομαδική συνομιλία - -The audio device couldn't be initialised. -== Η συσκευή ήχου δεν μπορούσε να ενεργοποιηθεί. - -The server is running a non-standard tuning on a pure game type. -== Ο διακομιστής εκτελεί μη-κανονικές ρυθμίσεις σε κανονικό τύπο παιχνιδιού. - -Time limit -== Όριο χρόνου - -Time limit: %d min -== Όριο χρόνου: %d λ - -Try again -== Προσπαθήστε ξανά - -Type -== Τύπος - -Unable to rename the demo -== Απέτυχε η μετονομασία της επίδειξης - -Use sounds -== Χρήση ήχων - -Use team colors for name plates -== Χρήση χρώμ. ομάδας στα ψευδώνυμα - -V-Sync -== Καθοδικός συγχρονισμός - -Version -== Έκδοση - -Vote command: -== Εντολή ψήφου: - -Vote description: -== Περιγραφή ψήφου: - -Vote no -== Ψηφίστε όχι - -Vote yes -== Ψηφίστε ναι - -Voting -== Ψηφοφορία - -Warmup -== Ζέσταμα - -Weapon -== Όπλο - -Yes -== Ναι - -You must restart the game for all settings to take effect. -== Πρέπει να επανεκκινήσετε το παιχνίδι για να εφαρμοστούν όλες οι αλλαγές. - -##### needs translation ##### - -New name: -== Νέο όνομα: - -Sat. -== Κορεσμός - -Miscellaneous -== Διάφορα - -Internet -== Διαδίκτυο - -Max demos -== Μέγιστος αριθμός επιδείξεων - -News -== Νέα - -Join game -== Συμμετοχή - -FSAA samples -== Δείγματα FSAA - -Sound volume -== Ένταση ήχου - -Max Screenshots -== Μέγιστος αριθμός στιγμιότυπων - -Laser -== Λέιζερ - -Hue -== Απόχρωση - -Record demo -== Εγγ. επίδειξης - -Your skin -== Η στολή σας - -Reset to defaults -== Επαναφορά προεπιλογών - -Lht. -== Φωτεινότ. - -UI Color -== Χρώμα Μενού - -Alpha -== Άλφα - -LAN -== Τοπικά - -Name plates size -== Μήκος ψευδωνύμου - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not save downloaded map. Try manually deleting this file: %s -== - -Could not connect dummy -== - -Error playing demo -== - -Successfully saved the replay! -== - -Failed saving the replay! -== - -Saving settings to '%s' failed -== - -Error saving settings -== - -Replay feature is disabled! -== - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -The format of texture %s is not RGBA which will cause visual bugs. -== - -Preparing demo playback -== - -Connected -== - -Loading map file from storage -== - -Loading demo file from storage -== - -Some fonts could not be loaded. Check the local console for details. -== - -Loading DDNet Client -== - -Initializing components -== - -Why are you slowmo replaying to read this? -== - -Initializing assets -== - -Initializing map logic -== - -Sending initial client info -== - -Warning -== - -Quitting. Please wait… -== - -Restarting. Please wait… -== - -Loading skin files -== - -Search -== - -Loading background map -== - -Searching -== - -Enter Username -== - -Enter Password -== - -NOT CONNECTED -== - -Match %d of %d -== - -No results -== - -Lines %d - %d (%s) -== - -Locked -== - -Following -== - -Loading commands… -== - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== - -Position: -== - -Speed: -== - -Angle: -== - -Multi-View -== - -[Spectating] -Following %s -== - -[Spectating Camera Mode Icon] -AUTO -== - -Server best: -== - -Personal best: -== - -Team %d -== - -Some map images could not be loaded. Check the local console for details. -== - -Uploading map data to GPU -== - -Some map sounds could not be loaded. Check the local console for details. -== - -Loading menu themes -== - -Reset -== - -Press a key… -== - -Settings -== - -Editor -== - -Main menu -== - -Browser -== - -Ghost -== - -Reconnect in %d sec -== - -Rename folder -== - -Render demo -== - -Render complete -== - -Restart -== - -Are you sure that you want to restart? -== - -Welcome to DDNet -== - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== - -Please enter your nickname below. -== - -Existing Player -== - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== - -Checking for existing player with your name -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -There's an unsaved map in the editor, you might want to save it. -== - -Continue anyway? -== - -A demo with this name already exists -== - -A folder with this name already exists -== - -Unable to rename the folder -== - -File '%s' already exists, do you want to overwrite it? -== - -Replace video -== - -(paused) -== - -Speed -== - -Video name: -== - -Videos directory -== - -Video was saved to '%s' -== - -Join Tutorial Server -== - -Skip Tutorial -== - -Show DDNet map finishes in server browser -== - -transmits your player name to info.ddnet.org -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -Trying to determine UDP connectivity… -== - -UDP seems to be filtered. -== - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== - -No answer from server yet. -== - -%d/%d KiB (%.1f KiB/s) -== - -Getting game info -== - -Requesting to join the game -== - -Theme -== - -Loading menu images -== - -AFR -== - -ASI -== - -AUS -== - -EUR -== - -NA -== - -SA -== - -CHN -== - -Getting server list from master server -== - -No local servers found (ports %d-%d) -== - -Example of usage -== - -Exclude -== - -%d of %d servers -== - -%d of %d server -== - -%d players -== - -%d player -== - -Are you sure that you want to disconnect and switch to a different server? -== - -No login required -== - -Filter connecting players -== - -Indicate map finish -== - -Unfinished map -== - -Countries -== - -Types -== - -Communities -== - -Copy info -== - -Leak IP -== - -No server selected -== - -Online friends (%d) -== - -Online clanmates (%d) -== - -[friends (server browser)] -Offline (%d) -== - -Click to select server. Double click to join your friend. -== - -Click to remove this player from your friends list. -== - -Click to remove this clan from your friends list. -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Are you sure that you want to remove the player '%s' from your friends list? -== - -Are you sure that you want to remove the clan '%s' from your friends list? -== - -Add Clan -== - -Server filter -== - -Friends -== - -Play the current demo -== - -Pause the current demo -== - -Stop the current demo -== - -Go back the specified duration -== - -[Demo player duration] -%d min. -== - -[Demo player duration] -%d sec. -== - -Change the skip duration -== - -Go forward the specified duration -== - -Go back one tick -== - -Go forward one tick -== - -Go back one marker -== - -Go forward one marker -== - -Slow down the demo -== - -Speed up the demo -== - -Mark the beginning of a cut (right click to reset) -== - -Mark the end of a cut (right click to reset) -== - -Export cut as a separate demo -== - -Close the demo player -== - -Toggle keyboard shortcuts -== - -Toggle auto camera -== - -Export demo cut -== - -Cut interval -== - -Cut length -== - -Remove chat -== - -Render cut to video -== - -Please use a different filename -== - -File already exists, do you want to overwrite it? -== - -Loading demo files -== - -All combined -== - -Demo -== - -Length -== - -Date -== - -No demo selected -== - -Folder Link -== - -Created -== - -Markers -== - -Netversion -== - -Size -== - -[Demo details] -map not included -== - -%.2f MiB -== - -%.2f KiB -== - -Fetch Info -== - -Demos directory -== - -Open the directory that contains the demo files -== - -Are you sure that you want to delete the folder '%s'? -== - -Are you sure that you want to delete the demo '%s'? -== - -Delete folder -== - -Unable to delete the demo '%s' -== - -Unable to delete the folder '%s'. Make sure it's empty first. -== - -Are you sure that you want to disconnect? -== - -Connect Dummy -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Connecting dummy -== - -Disconnect Dummy -== - -Are you sure that you want to disconnect your dummy? -== - -Kill -== - -Pause -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Loading… -== - -Loading ghost files -== - -Time -== - -Ghosts directory -== - -Activate all -== - -Deactivate all -== - -Deactivate -== - -Activate -== - -Save -== - -Menu opened. Press Esc key again to close menu. -== - -Smooth Dynamic Camera -== - -Switch weapon when out of ammo -== - -Skip the main menu -== - -[Hertz] -Hz -== - -Refresh Rate -== - -Save power by lowering refresh rate (higher input latency) -== - -Settings file -== - -Open the settings file -== - -Config directory -== - -Open the directory that contains the configuration and user files -== - -Themes directory -== - -Open the directory to add custom themes -== - -Automatically take statboard screenshot -== - -Automatically create statboard csv -== - -Max CSVs -== - -Dummy -== - -Player info change cooldown -== - -Download skins -== - -Download community skins -== - -Vanilla skins only -== - -Fat skins (DDFat) -== - -Skin prefix -== - -Create a random skin -== - -Choose default eyes when joining a server -== - -Skin Database -== - -Skins directory -== - -Open the directory to add custom skins -== - -Hook collisions -== - -Zoom in -== - -Zoom out -== - -Default zoom -== - -Show others -== - -Show all -== - -Toggle dyncam -== - -Toggle ghost -== - -Converse -== - -Chat command -== - -Toggle dummy -== - -Dummy copy -== - -Hammerfly dummy -== - -Statboard -== - -Lock team -== - -Show entities -== - -Show HUD -== - -Enable controller -== - -Controller -== - -Ingame controller mode -== - -[Ingame controller mode] -Relative -== - -[Ingame controller mode] -Absolute -== - -Ingame controller sens. -== - -UI controller sens. -== - -Controller jitter tolerance -== - -No controller found. Plug in a controller. -== - -Axis -== - -Status -== - -Aim bind -== - -Mouse -== - -Ingame mouse sens. -== - -UI mouse sens. -== - -Reset controls -== - -Are you sure that you want to reset the controls to their defaults? -== - -Cancel -== - -Windowed -== - -Windowed borderless -== - -Windowed fullscreen -== - -Desktop fullscreen -== - -Screen -== - -may cause delay -== - -Allows maps to render with more detail -== - -Use high DPI -== - -Renderer -== - -default -== - -custom -== - -Graphics card -== - -auto -== - -Enable game sounds -== - -Enable gun sound -== - -Enable long pain sound (used when shooting in freeze) -== - -Enable server message sound -== - -Enable regular chat sound -== - -Enable team chat sound -== - -Enable highlighted chat sound -== - -Game sound volume -== - -Chat sound volume -== - -Map sound volume -== - -Background music volume -== - -Tee -== - -Appearance -== - -DDNet -== - -Assets -== - -DDNet Client needs to be restarted to complete update! -== - -HUD -== - -Name Plate -== - -Hook Collisions -== - -Info Messages -== - -Show health, shields and ammo -== - -Show score -== - -Show local time always -== - -Show votes window after voting -== - -Authed name color in scoreboard -== - -Same clan color in scoreboard -== - -DDRace HUD -== - -Show client IDs (scoreboard, chat, spectator) -== - -Show DDRace HUD -== - -Show jumps indicator -== - -Show dummy actions -== - -Show player position -== - -Show player speed -== - -Show player target angle -== - -Show freeze bars -== - -Opacity of freeze bars inside freeze -== - -Always show chat -== - -Show names in chat in team colors -== - -Show only chat messages from team members -== - -Use old chat style -== - -Chat font size -== - -Chat width -== - -Messages -== - -System message -== - -Highlighted message -== - -Team message -== - -Friend message -== - -Normal message -== - -Client message -== - -Preview -== - -Show clan above name plates -== - -Clan plates size -== - -Show friend mark (♥) in name plates -== - -Show client IDs in name plates -== - -Hook Strength -== - -Show hook strength icon indicator -== - -Show hook strength number indicator -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Show other players' key presses -== - -Show local player's key presses -== - -Size of key press icons -== - -Hook collision line -== - -Show own player's hook collision line -== - -Always show own player's hook collision line -== - -Show other players' hook collision lines -== - -Always show other players' hook collision lines -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Hook collision line opacity -== - -Colors of the hook collision line, in case of a possible collision with: -== - -Your movements are not taken into account when calculating the line colors -== - -Nothing hookable -== - -Something hookable -== - -A Tee -== - -Preview 'Hook collisions' being pressed -== - -Show kill messages -== - -Show finish messages -== - -Normal Color -== - -Highlight Color -== - -Weapons -== - -Rifle Laser Outline Color -== - -Rifle Laser Inner Color -== - -Shotgun Laser Outline Color -== - -Shotgun Laser Inner Color -== - -Entities -== - -Door Laser Outline Color -== - -Door Laser Inner Color -== - -Freeze Laser Outline Color -== - -Freeze Laser Inner Color -== - -Set all to Rifle -== - -Save the best demo of each race -== - -Enable replays -== - -Default length -== - -Enable ghost -== - -When you cross the start line, show a ghost tee replicating the movements of your best time -== - -Show ghost -== - -Opacity -== - -Save ghost -== - -Only save improvements -== - -Gameplay -== - -Overlay entities -== - -Show text entities -== - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== - -Show others (own team only) -== - -Show quads -== - -Quads are used for background decoration -== - -AntiPing -== - -Tries to predict other entities to give a feel of low latency -== - -AntiPing: predict other players -== - -AntiPing: predict weapons -== - -AntiPing: predict grenade paths -== - -Background -== - -Regular background color -== - -Entities background color -== - -Use current map as background -== - -Show tiles layers from BG map -== - -New random timeout code -== - -Run on join -== - -Chat command (e.g. showall 1) -== - -Unregister protocol and file extensions -== - -DDNet %s is available: -== - -Update now -== - -Updating… -== - -DDNet Client updated! -== - -No updates available -== - -Check now -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Emoticons -== - -Particles -== - -Extras -== - -Loading assets -== - -Assets directory -== - -Open the directory to add custom assets -== - -Discord -== - -https://ddnet.org/discord -== - -Learn -== - -https://wiki.ddnet.org/ -== - -Tutorial -== - -Can't find a Tutorial server -== - -Website -== - -Stop server -== - -Run server -== - -[Start menu] -Play -== - -DDNet %s is out! -== - -Downloading %s: -== - -Update failed! Check log… -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Server executable not found, can't run server -== - -Loading race demo files -== - -Round %d/%d -== - -[Spectators] -%d others… -== - -Super -== - -[Team and size] -%d\n(%d/%d) -== - -Team %d (%d/%d) -== - -Manual -== - -Race -== - -Auto -== - -Replay -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Loading sound files -== - -Follow -== - -Frags -== - -Deaths -== - -Suicides -== - -Ratio -== - -Net -== - -FPM -== - -Spree -== - -Best -== - -Grabs -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -1 new mention -== - -%d new mentions -== - -9+ new mentions -== - -Moved ingame -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/hungarian.txt b/data/languages/hungarian.txt deleted file mode 100644 index 40dd77cc93..0000000000 --- a/data/languages/hungarian.txt +++ /dev/null @@ -1,2073 +0,0 @@ -##### authors ##### -#originally created by: -# Feca -#modified by: -# Boti. -# Cellegen -# bencie -##### /authors ##### - -##### translated strings ##### - -%ds left -== %ds van hátra - -%i minute left -== %i perc van hátra - -%i minutes left -== %i perc van hátra - -%i second left -== %i másodperc van hátra - -%i seconds left -== %i másodperc van hátra - -%s wins! -== %s nyert! - -Abort -== Mégse - -Add -== Hozzáadás - -Add Friend -== Barát hozzáadása - -Address -== Cím - -All -== Mindenki - -Are you sure that you want to quit? -== Biztos, hogy ki akarsz lépni? - -Automatically record demos -== Magától rögzítse a demókat - -Automatically take game over screenshot -== Magától készítsen a játék végén képet - -Blue team -== Kék csapat - -Blue team wins! -== A kék csapat nyert! - -Body -== Test - -Call vote -== Szavazás - -Change settings -== Beállítások átállítása - -Chat -== Chat - -Clan -== Klán - -Client -== Kliens - -Connecting to -== Csatlakozás… - -Connection Problems… -== Csatlakozási problémák… - -Console -== Konzol - -Controls -== Irányítások - -Count players only -== Számontartott játékosok - -Current -== Aktuális - -Custom colors -== Egyéni színek - -Delete -== Törlés - -Delete demo -== Demó törlése - -Demos -== Demók - -Disconnect -== Kilépés - -Disconnected -== Lekapcsolódott - -Downloading map -== Pálya letöltése… - -Draw! -== Döntetlen! - -Dynamic Camera -== Dinamikus kamera - -Emoticon -== Hangulatjel - -Error -== Hiba - -Error loading demo -== Hiba történt a demó betöltése közben - -Favorite -== Kedvenc - -Favorites -== Kedvencek - -Feet -== Láb - -Fire -== Tűz - -Folder -== Mappa - -Force vote -== Szavazás kényszerítése - -Free-View -== Szabad nézet - -Fullscreen -== Teljesképernyő - -Game -== Játék - -Game info -== Játék infó - -Game over -== Játék vége - -Game type -== Játékmód - -Game types: -== Játékmódok: - -General -== Általános - -Graphics -== Grafika - -Grenade -== Gránát - -Hammer -== Kalapács - -Has people playing -== Játékos játszik - -High Detail -== Jó részletek - -Hook -== Horog - -Invalid Demo -== Érvénytelen demó - -Join blue -== Kékhez lépés - -Join red -== Piroshoz lépés - -Jump -== Ugrás - -Kick player -== Játékos kirúgása - -Language -== Nyelv - -MOTD -== Napi üzenet - -Map -== Pálya - -Move left -== Balra lépés - -Move player to spectators -== Megfigyelőbe mozgatás - -Move right -== Jobbra lépés - -Movement -== Mozgás - -Mute when not active -== Letiltás ha nem aktív - -Name -== Név - -Next weapon -== Következő fegyver - -Nickname -== Becenév - -No -== Nem - -No password -== Jelszó nélküli - -No servers found -== Nem talált szervereket - -No servers match your filter criteria -== Nincs szerver ezzel a szűrőfeltétellel - -Ok -== Oké - -Parent Folder -== Főmappa - -Password -== Jelszó - -Password incorrect -== Helytelen jelszó - -Ping -== Ping - -Pistol -== Pisztoly - -Player -== Játékos - -Players -== Játékosok - -Please balance teams! -== Kérlek egyenlítsd ki a csapatokat! - -Prev. weapon -== Előző fegyver - -Quit -== Kilépés - -Reason: -== Indok: - -Red team -== Piros csapat - -Red team wins! -== A piros csapat nyert! - -Remote console -== Távoli konzol - -Remove -== Eltávolítás - -Remove friend -== Barát eltávolítása - -Rename demo -== Demó átnevezése - -Reset filter -== Szűrő visszaállítása - -Score -== Pontszám - -Score limit -== Ponthatár - -Scoreboard -== Pontszámtábla - -Screenshot -== Pillanatkép - -Server address: -== Szerver címe: - -Server info -== Szerver infó - -Server not full -== Szerver nincs tele - -Shotgun -== Sörétes puska - -Show chat -== Chat mutatása - -Show friends only -== Barátok mutatása - -Show ingame HUD -== Játék közbeni HUD mutatása - -Show name plates -== Név táblák mutatása - -Sound -== Hang - -Sound error -== Hang hiba - -Spectate -== Megfigyelés - -Spectator mode -== Néző mód - -Spectators -== Megfigyelők - -Stop record -== Demó megállítása - -Sudden Death -== Gyors halál - -Switch weapon on pickup -== Fegyverváltás felvételnél - -Team -== Csapat - -Team chat -== Csapat chat - -The audio device couldn't be initialised. -== A hangeszköz nem érzékelhető. - -The server is running a non-standard tuning on a pure game type. -== A szerver egy nem szabványos hangolást futtat a tiszta játék típuson. - -Time limit -== Időhatár - -Time limit: %d min -== Időhatár: %d perc - -Try again -== Próbáld újra - -Type -== Típus - -Unable to rename the demo -== Nem sikerült átnevezni a demót - -Use sounds -== Hangok használata - -Use team colors for name plates -== Csapat szín használata név tábláknál - -V-Sync -== V-Sync - -Version -== Verzió - -Vote command: -== Szavazás parancsa: - -Vote description: -== Szavazás leírása: - -Vote no -== Nem - -Vote yes -== Igen - -Voting -== Szavazás - -Warmup -== Felkészülés - -Weapon -== Fegyver - -Yes -== Igen - -You must restart the game for all settings to take effect. -== Újra kell indítania a játékot ahhoz, hogy minden beállítás érvénybe lépjen. - -New name: -== Új Név: - -Sat. -== Telítettség - -Internet -== Internet - -Max demos -== Maximum Demók - -News -== Hírek - -Join game -== Csatlakozás a játékhoz - -FSAA samples -== FSAA minták - -Sound volume -== Hangerő - -Max Screenshots -== Maximum Fotók - -Laser -== Lézer - -Miscellaneous -== Egyéb - -Record demo -== Demó felvétele - -Your skin -== Te Karaktered - -Reset to defaults -== Visszaállítás alapértelmezettre - -Lht. -== Fényerősség - -UI Color -== UI Szín - -Hue -== Színárnyalat - -Alpha -== Alpha - -LAN -== Helyi - -Name plates size -== Névtáblák mérete - -AntiPing -== Antiping - -Show quads -== Képek mutatása - -Map sound volume -== Pálya hangereje - -Show only chat messages from friends -== Csak barátoktól jön üzenet - -Countries -== Országok - -Reconnect in %d sec -== Újracsatlakozás %d másodperc múlva - -Grabs -== Megfog - -Show kill messages -== Halálüzenetek mutatása - -Show ghost -== Szellem mutatása - -DDNet -== DDNet - -No updates available -== Nincs elérhető frissítés - -Enable server message sound -== Szerver chat hang engedélyezése - -Show votes window after voting -== Szavazási ablak mutatása szavazás után - -HUD -== HUD - -Spectate previous -== Előző nézése - -Spectate next -== Következő nézése - -Show names in chat in team colors -== Csapatszínben jelennek meg a játékosok a chatben - -Enable team chat sound -== Csapat chat hang engedélyezése - -Show other players' hook collision lines -== Játékosok horog érintkező vonalainak mutatása - -Deaths -== Halálok - -Enable game sounds -== Játék hangok engedélyezése - -DDNet Client needs to be restarted to complete update! -== Újra kell indítani a DDNet Klienst a frissítés befejezéséhez! - -Show others -== Játékosok mutatása - -Gameplay -== Játékmód - -Restart -== Újraindítás - -Game paused -== Játék megállítva - -Browser -== Böngésző - -Play background music -== Háttérzene lejátszása - -Follow -== Követés - -Reset -== Alap - -Enable gun sound -== Fegyverhang lejátszása - -Team message -== Csapat üzenet - -Automatically create statboard csv -== Magától készítsen CSV pontszámtáblát - -Save the best demo of each race -== Mentse el a legjobb demót minden versenynél - -Show tiles layers from BG map -== Blokkok mutatása a háttérben - -Are you sure that you want to disconnect? -== Biztos, hogy le akarsz csatlakozni? - -Types -== Típusok - -Ghost -== Szellem - -Remove chat -== Chat eltüntetése - -Check now -== Nézd meg - -Frags -== Zászlók - -AntiPing: predict other players -== Antiping: játékosok előre kiszámolása - -Show other players' key presses -== Mutassa a játékosok mozgását nyilakkal - -Automatically take statboard screenshot -== Automatikusan készítsen pontszám fényképet - -System message -== Rendszer üzenet - -Enable long pain sound (used when shooting in freeze) -== Hosszú fájdalom hang lejátszása (mikor a játékos lő, ha lefagyott) - -DDNet %s is available: -== DDNet %s verzió elérhető - -Updating… -== Frissítés… - -Overlay entities -== Entitás láthatósága - -Messages -== Üzenetek - -%.2f MiB -== %.2f MiB - -Refresh Rate -== Frissítési érték - -New random timeout code -== Új random időtúllépési kód - -Suicides -== Öngyilkosságok - -Player country: -== Játékos országa: - -Net -== Net - -Loading DDNet Client -== DDNet Kliens betöltése - -FPM -== FPM - -Default zoom -== Alap nagyítás - -Show score -== Pontok mutatása - -Spree -== Szorzó - -Demofile: %s -== Demófájl: %s - -Max CSVs -== Maximum CSV-k - -%.2f KiB -== %.2f KiB - -Strict gametype filter -== Szigorú játékmód szűrő - -Best -== Legjobb - -Enable regular chat sound -== Alap chat hang lejátszása - -Normal message -== Normál üzenet - -Screen -== Képernyő - -Search -== Keresés - -Connecting dummy -== Másolat válasza… - -Clan plates size -== Klán felirat mérete - -Update now -== Frissíts most - -Show clan above name plates -== Klán mutatása a nevek fölött - -Save ghost -== Szellem mentése - -Exclude -== Kizárás - -Enable highlighted chat sound -== Kiemelt chat hang lejátszása - -AntiPing: predict weapons -== Antiping: fegyverek előre kiszámolása - -DDNet Client updated! -== DDNet Kliens frissítve van! - -Highlighted message -== Kiemelt üzenet - -Switch weapon when out of ammo -== Fegyver váltása, ha elfogy a lőszer - -AntiPing: predict grenade paths -== Antiping: gránátok útjainak előre kiszámolása - -Demo -== Demó - -Ratio -== Érték - -Friend message -== Baráti üzenet - -Fat skins (DDFat) -== Nagy karakterek (DDFat) - -may cause delay -== késleltetést okozhat - -Unfinished map -== Befejezetlen pálya - -Deactivate -== Deaktiválás - -Welcome to DDNet -== Üdvözlet a DDNet-en - -Activate -== Aktiválás - -File already exists, do you want to overwrite it? -== A fájl már létezik, szeretné felülírni? - -Indicate map finish -== Befejezett pályák - -Save -== Mentés - -Vanilla skins only -== Csak alap karakterek - -Date -== Idő - -Show DDNet map finishes in server browser -== Mutassa a befejezett pályákat a keresőben - -transmits your player name to info.ddnet.org -== továbbítja a játékosnevedet az info.ddnet.org oldalra - -Hammerfly dummy -== Másolat kalapácsolás - -Downloading %s: -== Letöltés %s: - -Time -== Idő - -Kill -== Halál - -Personal best: -== Egyéni record: - -Show entities -== Entitások mutatása - -Video name: -== Videó neve: - -Connect Dummy -== Másolat Csatlakozása - -Disconnect Dummy -== Másolat Lecsatlakozása - -Filter connecting players -== Csatlakozók szűrése - -Pause -== Nézetváltás - -Toggle dummy -== Másolat irányítása - -Fetch Info -== Minden infó - -Dummy copy -== Másolat tükrözése - -Enable replays -== Visszajátszások - -Render demo -== Demó renderelése - -Zoom in -== Nagyítás - -Show text entities -== Textúrázott entitások - -Show all -== Mutasson mindent - -Learn -== Wikipédia - -Successfully saved the replay! -== Sikeresen elmentette a visszajátszást! - -Zoom out -== Kicsinyítés - -DDNet %s is out! -== DDNet %s elérhető! - -Statboard -== Státusztábla - -Converse -== Fordítás - -Use high DPI -== Magas DPI használata - -Update failed! Check log… -== Frissítés sikertelen! nézd meg a log-ot… - -Toggle dyncam -== Dinamikus kamera - -%d new mentions -== %d új értesítés - -Default length -== Átlagos hossz - -Show HUD -== HUD mutatása - -Size -== Méret - -Server best: -== Szerver legjobb: - -1 new mention -== 1 új értesítés - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== A DDraceNetwork egy együttműködésen alapuló online játék, ahol a cél az, hogy te és a Tee csapatod elérje a célvonalat. Ha újonc vagy, a kezdő (Novice) szervereket ajánljuk, ahol a legegyszerűbb versenyeket tároljuk. Legkisebb ping választása alapján válassz egy szervert. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Ajánlott, hogy le ellenőrizd a beállításokat, hogy a kedvedre igazítsd őket, mielőtt csatlakoznál egy szerverhez. (Tipp: szűrők) - -Please enter your nickname below. -== Kérjük írja le a becenevét lent. - -9+ new mentions -== 9+ új értesítés - -Replay feature is disabled! -== Visszajátszás mód kikapcsolva! - -Lock team -== Csapat lezárása - -Hook collisions -== Horog pontossága - -Toggle ghost -== Szellem mutatása - -Markers -== Jelölések - -Replace video -== Videó lecserélése - -Length -== Hossz - -Are you sure that you want to disconnect your dummy? -== Biztos vagy benne, hogy a másolatod lecsatlakozzon? - -Warning -== Figyelmeztetés - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Debug mód bekapcsolva. Nyomd meg a Ctrl+Shift+D billentyűparancsot, hogy kikapcsold. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Használd a K gombot az újraéledéshez, Q betű a megfigyeléshez. Nézd meg a beállításokat a többi bind-ért. - -Existing Player -== Létező játékos - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== A Neved '%s' már használva volt (%d ponttal). Biztosan szeretnéd használni? - -Checking for existing player with your name -== Keresés létező játékos után a neveddel - -Speed -== Sebesség - -Theme -== Téma - -%d of %d servers -== %d a %d szerverből - -%d of %d server -== %d ből %d szerver - -%d players -== %d játékos - -%d player -== %d játékos - -Demos directory -== Demók helye - -Smooth Dynamic Camera -== Sima dinamikus kamera - -Skip the main menu -== Főmenü kihagyása - -Themes directory -== Témák helye - -Download skins -== Karakterek letöltése - -Skin prefix -== Karakter prefix - -Skin Database -== Karakter adatbázis - -Skins directory -== Karakterek helye - -Game sound volume -== Játék hangerő - -Chat sound volume -== Chat hangerő - -Background music volume -== Háttérzene hangerő - -Assets -== Galléria - -Use old chat style -== Régi chat stílus használata - -Client message -== Kliens üzenet - -Show others (own team only) -== Mások mutatása (csak csapatok) - -Use current map as background -== Jelenlegi map használta háttérként - -Entities -== Entitások - -Emoticons -== Hangulatjelek - -Particles -== Effektek - -Assets directory -== Kinézet Helye - -Website -== Weboldal - -Settings -== Beállítások - -Stop server -== Szerver leállítása - -Run server -== Szerver indítása - -Server executable not found, can't run server -== Nem sikerült elindítani a szervert - -Editor -== Szerkesztő - -[Start menu] -Play -== Játék - -Manual -== Manuális - -Race -== Verseny - -Auto -== Automatikus - -Replay -== Visszajátszás - -Getting server list from master server -== Szerverlista lekérése a fő szerverekről - -Leak IP -== IP mutatása - -Chat command -== Chat parancs - -Dummy -== Másolat - -Windowed -== Ablak - -Windowed borderless -== Keretnélküli ablak - -Desktop fullscreen -== Asztalos teljesképernyő - -Preview -== Előnézet - -Background -== Háttér - -Are you sure that you want to disconnect and switch to a different server? -== Biztos, hogy kilépsz és váltasz egy másik szerverre? - -AFR -== AFRIKA - -ASI -== ÁZSIA - -AUS -== AUSZTRÁLIA - -EUR -== EURÓPA - -NA -== ÉSZAK-A - -SA -== DÉL-A - -CHN -== KíNA - -Show local player's key presses -== Saját mozgásod nyilakkal mutatása - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ - -The format of texture %s is not RGBA which will cause visual bugs. -== A %s textúra formátuma nem RGBA, ami vizuális hibákat okozhat. (Nem megfelelően lesz elosztva a kép színvilága.) - -Join Tutorial Server -== Belépés egy Bemutató szerverre - -Skip Tutorial -== Bemutató átugrása - -Settings file -== Beállítások fájl - -Config directory -== Konfigurációs fájl helye - -Windowed fullscreen -== Ablakos teljesképernyő - -Run on join -== Futtatás belépéskor - -Chat command (e.g. showall 1) -== Chat parancs (például: "showall 1") - -Choose default eyes when joining a server -== Alapértelmezett szemek kiválasztása, amikor egy szerverre csatlakozol. - -Allows maps to render with more detail -== Engedélyezi, hogy a pályákat részletesebben jelenítse meg. - -Renderer -== Renderelő - -default -== alapértelmezett - -custom -== egyedi - -auto -== automatikus - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Amikor elkezdesz egy versenyt, rekordjaid alapján replikál egy szellemet, ami a legjobb időd alapján mozdul. - -Opacity -== Átlátszóság - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Más csapatokhoz tartozó entitások, mint például játékosok és névtáblák átláthatóságának beállítása. - -Quads are used for background decoration -== A kép keretek háttérképként lesznek használva. (Egy csak olyan keretekre vonatkozik, aminek a para x és y tengelye 0.) - -Tries to predict other entities to give a feel of low latency -== A kliens megpróbálja előre kiszámítani az entitásokat, hogy alacsony késleltetést produkáljon. - -Tutorial -== Bemutató - -Can't find a Tutorial server -== Nem található Bemutató szerver - -Super -== Szuper - -Team %d -== Csapat %d - -Position: -== Pozíció: - -Speed: -== Sebesség: - -Angle: -== Szög: - -Trying to determine UDP connectivity… -== Próbáljuk meghatározni az UDP kapcsoltatot… - -UDP seems to be filtered. -== Az UDP szűrve van. - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== Az UDP és a TCP IP címek különböznek. Próbáld meg kikapcsolni a VPN-ed, proxy-d, vagy hálózati gyorsítód. - -No answer from server yet. -== Még nincs válasz a szervertől. - -Download community skins -== Közösségi karakterek letöltése - -Enable controller -== Kontroller használata - -[Ingame controller mode] -Relative -== Relatív - -[Ingame controller mode] -Absolute -== Abszolút - -Ingame controller mode -== Játékbeli kontroller mód - -Ingame controller sens. -== Játékbeli kontroller érzékenység - -UI controller sens. -== UI kontroller érzékenység - -Controller jitter tolerance -== Kontroller jitter tolerancia - -Status -== Állapot - -Mouse -== Egér - -Ingame mouse sens. -== Játékbeli egér érzékenysége - -UI mouse sens. -== UI egér érzékenysége - -Controller -== Kontroller - -Show dummy actions -== Másolat mozgásának mutatása - -Show player position -== Játékos pozíciójának mutatása - -Show player speed -== Játékos sebességének mutatása - -Show player target angle -== Játékos célszögének mutatása - -Normal Color -== Normális szín - -Highlight Color -== Kiemelt szín - -Extras -== Extrák - -Preparing demo playback -== Demó visszajátszás előkészítése - -Connected -== Csatlakozva - -Loading map file from storage -== Pálya betöltése a tárolóban - -Initializing components -== Komponensek inicializálása - -Initializing assets -== Galléria inicializálása - -Initializing map logic -== Pálya logika inicializálása - -Sending initial client info -== Szükséges kliens infó küldése - -Uploading map data to GPU -== Pálya feltöltése a GPU-ra - -Getting game info -== Játék infó beszerzése - -Requesting to join the game -== Kérvényezés játék csatlakozására - -Loading menu images -== Menü képek betöltése - -Loading demo files -== Demó filterek betöltése - -Loading ghost files -== Szellem fájlok betöltése - -Loading skin files -== Karakter fájlok betöltése - -Aim bind -== Célzás bind - -Appearance -== Kinézet - -Name Plate -== Névtábla - -Hook Collisions -== Horog érintkező - -Show health, shields and ammo -== Mutassa az életet, a pajzsot és a töltényt - -DDRace HUD -== DDRace HUD - -Show DDRace HUD -== Mutassa a DDRace HUD-ot (Speciális HUD) - -Show jumps indicator -== Ugrás indikátor mutatása - -Show freeze bars -== Lefagyaztás töltő csík mutatása - -Opacity of freeze bars inside freeze -== Láthatósága a töltő csíknak, mikor levan fagyaztva a Tee - -Hook collision line -== Horog érintkező vonal indikátora - -Hook collision line opacity -== Horog érintkező vonal láthatósága - -Colors of the hook collision line, in case of a possible collision with: -== Horog érintkező vonal színe, ez a szín jelenik meg, mikor: - -Your movements are not taken into account when calculating the line colors -== A mozgásaid, illetve mások mozgása nem fogja befolyásolni a vonal színének kiszámítását. - -Nothing hookable -== Semmi sem akadhat meg a horgon - -Something hookable -== Meg akadhat valami a horgon - -A Tee -== Egy Tee akadhat meg a horgon - -Loading assets -== Galléria betöltése - -Loading race demo files -== Verseny demó fájlok betöltése - -Loading sound files -== Hang fájlok betöltése - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Probléma derült fel inicializálás közben. Változtasson a "gfx_backend" parancson "OpenGL"-re vagy "Vulkan"-ra a "settings_ddnet.cfg" fájlon és próbálja meg újra. - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== Probléma derült fel Virtuális Memóriával. Nincs elég Virtuális Memória Textúrák vagy képek betöltésére (Karakterek, Entitások, stb.), főként a nagy minőségű képekre vonatkozva. - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== Probléma derült fel felvétel közben. Próbálja felújítani a Videókártyája driver-ét. - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== Probléma derült fel renderelés parancsa közben. Próbálja felújítani a Videókártyája driver-ét. - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== Probléma derült fel renderelési parancs végrehajtása közben. Próbálja felújítani a Videókártyája driver-ét. - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== Probléma derült fel a framebuffer-nél. Nem sikerült framebuffer-t cserélni. Próbálja felújítani a Videókártyája driver-ét. - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Ismeretlen probléma derült fel. Változtasson a "gfx_backend" parancson "OpenGL"-re vagy "Vulkan"-ra a "settings_ddnet.cfg" fájlon és próbálja meg újra. - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== Nem sikerült inicializálni a megadott Grafikai Renderer-re (OpenGL vagy Vulkan Renderer), az eredeti Grafikai Renderer-re lesz visszaállítva a Kliens. - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== Nem sikerült inicializálni a megadott Grafikai Renderer-re (OpenGL vagy Vulkan Renderer), lehetőleg a Integrált Videókártyája driver-e nincs telepítve, vagy nem észlelhető driver rajta. - -Could not save downloaded map. Try manually deleting this file: %s -== Nem sikerült elmenteni a letöltött pályát. Próbálja meg manuális módon kitörölni a fáljt: %s. - -Why are you slowmo replaying to read this? -== Miért lassított módon rögzítesz, hogy elolvasd ezt? - -Cancel -== Vissza - -File '%s' already exists, do you want to overwrite it? -== A Fájl '%s' már létezik, szeretné felülírni a jelenlegi Fáljt? - -Copy info -== Infó Másolása - -Are you sure that you want to remove the player '%s' from your friends list? -== Biztos, hogy ki szeretnéd törölni '%s' Játékost a barátlistádból? - -Are you sure that you want to remove the clan '%s' from your friends list? -== Biztos, hogy ki szeretnéd törölni '%s' Klánt a barátlistádból? - -Play the current demo -== Jelenlegi Demó Lejátszása - -Pause the current demo -== Jelenlegi Demó Szüneteltetése - -Stop the current demo -== Jelenlegi Demó Megállítása - -Go back one tick -== Előre menni egy képet - -Go forward one tick -== Vissza menni egy képet - -Slow down the demo -== Demó Lelassítása - -Speed up the demo -== Demó Felgyorsítása - -Export cut as a separate demo -== Exportáld a vágást, mint külön Demó - -Go back one marker -== Előre menni egy jelőlésre - -Go forward one marker -== Vissza menni egy jelőlésre - -Toggle keyboard shortcuts -== Billentyűs parancsok váltása - -Open the directory that contains the demo files -== Megnyitni a Demó Fáljlok helyét - -Are you sure that you want to delete the demo '%s'? -== Biztos, hogy kiszeretnéd törölni a Demót: '%s'? - -Unable to delete the demo '%s' -== Nem sikerült kitörölni a Demót: '%s' - -Menu opened. Press Esc key again to close menu. -== Menű megnyitva. Az "Esc" gomb megnyomásával kilép a menüből. - -Save power by lowering refresh rate (higher input latency) -== Takarékoskodjon energiát azzal, hogy lejjebb veszi a frissítési értéket (magasabb késleltetés tapasztalható) - -Open the settings file -== Beállítások Fáljlának megnyitása - -Open the directory that contains the configuration and user files -== Megnyitni a Konfigurációs és Felhasználói Fáljok helyét - -Open the directory to add custom themes -== Megnyitni az egyedi témák helyét - -Create a random skin -== Random Karakter csinálása - -Open the directory to add custom skins -== Megnyitni az egyedi Karakterek helyét - -No controller found. Plug in a controller. -== Nem található Kontroller. Csatlakoztasson egyet, vagy nézze meg, hogy észlelhető. - -Reset controls -== Irányítások Visszaállítása - -Are you sure that you want to reset the controls to their defaults? -== Biztos, hogy szeretnéd visszaállítani az irányítást az eredeti értékeire? - -Weapons -== Fegyverek - -Rifle Laser Outline Color -== Lézer Külső Színe - -Rifle Laser Inner Color -== Lézer Belső Színe - -Shotgun Laser Outline Color -== Sörétes puska Külső Színe - -Shotgun Laser Inner Color -== Sörétes puska Belső Színe - -Door Laser Outline Color -== Lézer ajtó Külső Színe - -Door Laser Inner Color -== Lézer ajtó Belső Színe - -Freeze Laser Outline Color -== Fagyasztó Lézer Külső Színe - -Freeze Laser Inner Color -== Fagyasztó Lézer Belső Színe - -Set all to Rifle -== Minden színt a Lézerhez igazodva - -Unregister protocol and file extensions -== Törölje a protokoll és a fájlkiterjesztések regisztrációját - -Open the directory to add custom assets -== Megnyitni az egyedi Képek helyét - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not connect dummy -== - -Error playing demo -== - -Failed saving the replay! -== - -Saving settings to '%s' failed -== - -Error saving settings -== - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Loading demo file from storage -== - -Some fonts could not be loaded. Check the local console for details. -== - -Quitting. Please wait… -== - -Restarting. Please wait… -== - -Loading background map -== - -Searching -== - -Enter Username -== - -Enter Password -== - -NOT CONNECTED -== - -Match %d of %d -== - -No results -== - -Lines %d - %d (%s) -== - -Locked -== - -Following -== - -Loading commands… -== - -Multi-View -== - -[Spectating] -Following %s -== - -[Spectating Camera Mode Icon] -AUTO -== - -Some map images could not be loaded. Check the local console for details. -== - -Some map sounds could not be loaded. Check the local console for details. -== - -Loading menu themes -== - -Press a key… -== - -Main menu -== - -Rename folder -== - -Render complete -== - -Are you sure that you want to restart? -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -There's an unsaved map in the editor, you might want to save it. -== - -Continue anyway? -== - -A demo with this name already exists -== - -A folder with this name already exists -== - -Unable to rename the folder -== - -(paused) -== - -Videos directory -== - -Video was saved to '%s' -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -%d/%d KiB (%.1f KiB/s) -== - -No local servers found (ports %d-%d) -== - -Example of usage -== - -No login required -== - -Communities -== - -No server selected -== - -Online friends (%d) -== - -Online clanmates (%d) -== - -[friends (server browser)] -Offline (%d) -== - -Click to select server. Double click to join your friend. -== - -Click to remove this player from your friends list. -== - -Click to remove this clan from your friends list. -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Add Clan -== - -Server filter -== - -Friends -== - -Go back the specified duration -== - -[Demo player duration] -%d min. -== - -[Demo player duration] -%d sec. -== - -Change the skip duration -== - -Go forward the specified duration -== - -Mark the beginning of a cut (right click to reset) -== - -Mark the end of a cut (right click to reset) -== - -Close the demo player -== - -Toggle auto camera -== - -Export demo cut -== - -Cut interval -== - -Cut length -== - -Render cut to video -== - -Please use a different filename -== - -All combined -== - -No demo selected -== - -Folder Link -== - -Created -== - -Netversion -== - -[Demo details] -map not included -== - -Are you sure that you want to delete the folder '%s'? -== - -Delete folder -== - -Unable to delete the folder '%s'. Make sure it's empty first. -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Loading… -== - -Ghosts directory -== - -Activate all -== - -Deactivate all -== - -[Hertz] -Hz -== - -Player info change cooldown -== - -Axis -== - -Graphics card -== - -Tee -== - -Info Messages -== - -Show local time always -== - -Authed name color in scoreboard -== - -Same clan color in scoreboard -== - -Show client IDs (scoreboard, chat, spectator) -== - -Always show chat -== - -Show only chat messages from team members -== - -Chat font size -== - -Chat width -== - -Show friend mark (♥) in name plates -== - -Show client IDs in name plates -== - -Hook Strength -== - -Show hook strength icon indicator -== - -Show hook strength number indicator -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Show own player's hook collision line -== - -Always show own player's hook collision line -== - -Always show other players' hook collision lines -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Preview 'Hook collisions' being pressed -== - -Show finish messages -== - -Enable ghost -== - -Only save improvements -== - -Regular background color -== - -Entities background color -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Round %d/%d -== - -[Spectators] -%d others… -== - -[Team and size] -%d\n(%d/%d) -== - -Team %d (%d/%d) -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -Moved ingame -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/index.txt b/data/languages/index.txt deleted file mode 100644 index fe6a502b06..0000000000 --- a/data/languages/index.txt +++ /dev/null @@ -1,196 +0,0 @@ -##### language indices ##### -# Format for each language entry: -# 1. filename (in english) -# 2. name (in native language) -# 3. country code (ISO 3166-1 numeric) -# 4. language tags (RFC 3066) (multiple can be separated with semicolon) - -arabic -== ﻲﺑﺮﻋ -== 682 -== ar - -belarusian -== Беларуская -== 112 -== be - -bosnian -== Bosanski -== 70 -== bs-Latn - -brazilian_portuguese -== Português brasileiro -== 76 -== pt-BR - -bulgarian -== Български -== 100 -== bg - -catalan -== Català -== 906 -== ca - -chuvash -== Чăвашла -== 643 -== cv - -czech -== Česky -== 203 -== cs - -danish -== Dansk -== 208 -== da - -dutch -== Nederlands -== 528 -== nl - -esperanto -== Esperanto -== -1 -== eo - -estonian -== Eesti -== 233 -== ee - -finnish -== Suomi -== 246 -== fi - -french -== Français -== 250 -== fr - -galician -== Galego -== 907 -== gl - -german -== Deutsch -== 276 -== de - -greek -== Ελληνικά -== 300 -== el - -hungarian -== Magyar -== 348 -== hu - -italian -== Italiano -== 380 -== it - -japanese -== 日本語 -== 392 -== ja - -korean -== 한국어 -== 410 -== ko - -kyrgyz -== Кыргызча -== 417 -== ky - -norwegian -== Norsk -== 578 -== no;nb - -persian -== Persian -== 364 -== fa - -polish -== Polski -== 616 -== pl - -portuguese -== Português -== 620 -== pt - -romanian -== Română -== 642 -== ro - -russian -== Русский -== 643 -== ru - -serbian -== Srpski -== 688 -== sr-Latn - -serbian_cyrillic -== Српски -== 688 -== sr-Cyrl - -simplified_chinese -== 简体中文 -== 156 -== zh-Hans;zh-CN;zh-SG - -slovak -== Slovensky -== 703 -== sk - -spanish -== Español -== 724 -== es - -swedish -== Svenska -== 752 -== sv - -traditional_chinese -== 繁體中文 -== -1 -== zh-Hant;zh-HK;zh-MO;zh-TW - -turkish -== Türkçe -== 792 -== tr - -azerbaijani -== Azərbaycan -== 31 -== az - -ukrainian -== Українська -== 804 -== uk diff --git a/data/languages/italian.txt b/data/languages/italian.txt deleted file mode 100644 index e549d17c7c..0000000000 --- a/data/languages/italian.txt +++ /dev/null @@ -1,2108 +0,0 @@ -##### authors ##### -#originally created by: -# -#modified by: -# Lanta 2010-05-30 16:26:04 -# Lanta 2010-05-31 22:05:45 -# Carmine 2011-01-23 17:54:06 -# Otacon 2011-05-02 18:21:08 -# Apmox 2011-07-15 01:09:59 -# NeXus 2020-09-19 02:43:00 -# kio 2023-08-12 18:44:00 -# kio 2023-08-14 11:30:00 -##### /authors ##### - -##### translated strings ##### - -%ds left -== %ds sec. - -%i minute left -== %i minuto rimanente - -%i minutes left -== %i minuti rimanenti - -%i second left -== %i secondo rimanente - -%i seconds left -== %i secondi rimanenti - -%s wins! -== %s ha vinto! - -Abort -== Annulla - -Add -== Aggiungi - -Add Friend -== Aggiungi amico - -Address -== Indirizzo - -All -== Tutti - -Are you sure that you want to quit? -== Sicuro di voler chiudere il gioco? - -Automatically record demos -== Registra automaticamente demo - -Automatically take game over screenshot -== Cattura schermata alla fine di ogni partita - -Blue team -== Squadra blu - -Blue team wins! -== La squadra blu ha vinto! - -Body -== Corpo - -Call vote -== Vota - -Change settings -== Cambia opzioni - -Chat -== Chat - -Clan -== Clan - -Client -== Client - -Connecting to -== Connessione a - -Connection Problems… -== Problemi di connessione… - -Console -== Console - -Controls -== Comandi - -Count players only -== Conta solo giocatori - -Current -== Attuale - -Custom colors -== Colori personalizzati - -Delete -== Elimina - -Delete demo -== Elimina demo - -Demofile: %s -== Demo: %s - -Demos -== Demo - -Disconnect -== Disconnetti - -Disconnected -== Disconnesso - -Downloading map -== Scaricamento mappa in corso - -Draw! -== Pareggio! - -Dynamic Camera -== Camera dinamica - -Emoticon -== Reazioni - -Error -== Errore - -Error loading demo -== Errore caricamento demo - -Favorite -== Preferito - -Favorites -== Preferiti - -Feet -== Piedi - -Fire -== Fuoco - -Folder -== Cartella - -Force vote -== Forza voto - -Free-View -== Visione libera - -Fullscreen -== Schermo intero - -Game -== Partita - -Game info -== Info partita - -Game over -== Partita finita - -Game type -== Tipo server - -Game types: -== Tipi di server: - -General -== Generale - -Graphics -== Aspetto - -Grenade -== Lanciagranate - -Hammer -== Martello - -Has people playing -== Con giocatori - -High Detail -== Alta qualità - -Hook -== Rampino - -Invalid Demo -== Demo non valida - -Join blue -== Vai nei blu - -Join red -== Vai nei rossi - -Jump -== Salta - -Kick player -== Caccia giocatore - -Language -== Lingua - -MOTD -== MOTTO - -Map -== Mappa - -Move left -== Sinistra - -Move player to spectators -== Fai osservare il giocatore - -Move right -== Destra - -Movement -== Movimento - -Mute when not active -== Silenzioso quanto inattivo - -Name -== Nome - -Next weapon -== Arma seguente - -Nickname -== Soprannome - -No -== No - -No password -== Senza password - -No servers found -== Nessun server trovato - -No servers match your filter criteria -== Nessun server corrisponde ai tuoi criteri di ricerca - -Ok -== Ok - -Parent Folder -== Cartella superiore - -Password -== Password - -Password incorrect -== Password errata - -Ping -== Ping - -Pistol -== Pistola - -Play background music -== Riproduci musica di sottofondo - -Player -== Giocatore - -Player country: -== Filtra per paese: - -Players -== Giocatori - -Please balance teams! -== Equilibra le squadre! - -Prev. weapon -== Arma precedente - -Quit -== Chiudi - -Reason: -== Motivo: - -Red team -== Squadra rossa - -Red team wins! -== La squadra rossa ha vinto! - -Remote console -== Console remota - -Remove -== Rimuovi - -Remove friend -== Rimuovi amico - -Rename demo -== Rinomina demo - -Reset filter -== Resetta filtri - -Score -== Punti - -Score limit -== Limite punti - -Scoreboard -== Punteggi - -Screenshot -== Cattura schermata - -Server address: -== Indirizzo server: - -Server info -== Info server - -Server not full -== Server non pieno - -Shotgun -== Fucile - -Show chat -== Mostra chat - -Show friends only -== Mostra solo amici - -Show ingame HUD -== Mostra HUD in gioco - -Show name plates -== Mostra nomi - -Sound -== Suono - -Sound error -== Errore suono - -Spectate -== Osserva - -Spectate next -== Osserva succ. - -Spectate previous -== Osserva prec. - -Spectator mode -== Menu osservazione - -Spectators -== Spettatori - -Stop record -== Ferma reg. - -Strict gametype filter -== Tipo di gioco preciso - -Sudden Death -== Tempo supplementare - -Switch weapon on pickup -== Cambia arma ad ogni raccolta - -Team -== Squadra - -Team chat -== Chat di squadra - -The audio device couldn't be initialised. -== Il dispositivo audio non può essere inizializzato. - -The server is running a non-standard tuning on a pure game type. -== Il server presenta impostazioni non standard in un tipo di gioco normale. - -Time limit -== Limite di tempo - -Time limit: %d min -== Limite di tempo: %d min - -Try again -== Ritenta - -Type -== Tipo - -Unable to rename the demo -== Impossibile rinominare la demo - -Use sounds -== Attiva suoni - -Use team colors for name plates -== Usa i colori della squadra nei nomi - -V-Sync -== Sincronizzazione verticale - -Version -== Versione - -Vote command: -== Comando di voto: - -Vote description: -== Descrizione voto: - -Vote no -== Vota no - -Vote yes -== Vota sì - -Voting -== Votazione - -Warmup -== Riscaldamento - -Weapon -== Arma - -Yes -== Sì - -You must restart the game for all settings to take effect. -== Devi riavviare il gioco per rendere effettive le modifiche. - -##### needs translation ##### - -New name: -== Nuovo nome: - -Sat. -== Saturazione - -Miscellaneous -== Altro - -Internet -== Internet - -Max demos -== Numero massimo di demo - -News -== Novità - -Join game -== Entra - -FSAA samples -== Campioni FSAA - -Sound volume -== Volume suono - -Max Screenshots -== Numero massimo di catture - -Hue -== Tinta - -Record demo -== Registra demo - -Your skin -== La tua skin - -Reset to defaults -== Reimposta predefinito - -Lht. -== Luminosità - -UI Color -== Colore interfaccia - -Alpha -== Alpha - -LAN -== LAN - -Name plates size -== Dimensione nomi - -DDNet %s is out! -== DDNet %s è uscito! - -%d new mentions -== %d nuove menzioni - -Disconnect Dummy -== Disconnetti Dummy - -Are you sure that you want to disconnect your dummy? -== Sei sicuro di voler disconnettere il tuo dummy? - -Filter connecting players -== Filtra i giocatori in conness. - -9+ new mentions -== 9+ nuove menzioni - -Markers -== Marcatrici - -Disconnect Dummy -== Disconnetti il dummy - -Length -== Lunghezza - -Fetch Info -== Recuperare informazioni - -Length -== Lunghezza - -Downloading %s: -== Scaricando %s: - -Update failed! Check log… -== Aggiornamento non riuscito! Controlla registro… - -Filter connecting players -== Filtra i giocatori in conness. - -Time -== Tempo - -Downloading %s: -== Scarica %s - -Are you sure that you want to disconnect your dummy? -== Sei sicuro di voler scollegare il tuo dummy? - -1 new mention -== 1 nuova menzione - -Successfully saved the replay! -== Hai salvato il replay con successo! - -Replay feature is disabled! -== Il replay è disabilitato! - -Warning -== Attenzione - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Modalità debug attivata. Premi Ctrl+Shift+D per disattivare la modalità debug. - -Game paused -== Gioco in pausa - -Server best: -== Migliore del server - -Personal best: -== Miglior tempo personale - -Browser -== Browser - -Ghost -== Ghost - -Loading DDNet Client -== Caricando Client DDNet - -Reconnect in %d sec -== Riconnettiti in %d secondi - -Render demo -== Renderizza demo - -Replace video -== Rimpiazza video - -File already exists, do you want to overwrite it? -== Il file già esiste, vuoi sovrascriverlo? - -Are you sure that you want to disconnect? -== Sei sicuro di volerti disconnettere? - -Welcome to DDNet -== Benvenuto in DDNet - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork è un gioco online cooperativo dove l'obbiettivo è per te ed il tuo gruppo di tee di raggiungere la linea del traguardo della mappa. Da nuovo arrivato dovresti iniziare sui server Novice, dove sono ospitate le mappe più facili. Considera il ping per scegliere un server vicino a te. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Usa il tasto k per ucciderti (respawn), il tasto q per andare in modalità pausa e guardare altri giocatori. Guarda le impostazioni per gli altri tasti. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== E' raccomandato controllare le impostazioni e aggiustarle a tuo piacimento prima di entrare in un server. - -Please enter your nickname below. -== Per favore inserisci il tuo nickname qui sotto. - -Existing Player -== Giocatore esistente - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Il tuo nickname '%s' è già usato (punti %d). Vuoi comunque usarlo? - -Checking for existing player with your name -== Controllando per un giocatore esistente con il tuo nome - -Speed -== Velocità - -Video name: -== Nome del video: - -Show DDNet map finishes in server browser -== Mostra le mappe finite in DDNet nel tuo browser dei server - -transmits your player name to info.ddnet.org -== Trasmette il tuo nome da giocatore a info.ddnet.org - -Theme -== Tema - -Search -== Cerca - -Exclude -== Escludi - -%d of %d servers -== %d di %d server - -%d of %d server -== %d di %d server - -%d players -== %d giocatori - -%d player -== %d giocatore - -Indicate map finish -== Indica una mappa finita - -Unfinished map -== Mappa non finita - -Countries -== Paesi - -Types -== Tipi - -Remove chat -== Rimuovi chat - -Demo -== Demo - -Date -== Data - -Demos directory -== Cartella delle demo - -Connecting dummy -== Connettendo dummy - -Connect Dummy -== Connetti Dummy - -Kill -== Rinasci - -Pause -== Pausa - -Deactivate -== Disattiva - -Activate -== Attiva - -Save -== Salva - -Smooth Dynamic Camera -== Camera dinamica liscia - -Switch weapon when out of ammo -== Cambia arma quando senza munizioni - -Show only chat messages from friends -== Mostra solo messaggi da parte di amici - -Show clan above name plates -== Mostra clan sopra la targa dei nomi - -Clan plates size -== Grandezza della targa del clan - -Skip the main menu -== Salta il menu principale - -Refresh Rate -== Frequenza di aggiornamento - -Themes directory -== Cartella dei temi - -Automatically take statboard screenshot -== Fai una cattura di schermata automaticamente alla statboard - -Automatically create statboard csv -== Crea automaticamente massimo valore separato da virgole (CSV) in statboard - -Max CSVs -== Massimo valore separato da virgole (CSV) - -Download skins -== Scarica skin - -Vanilla skins only -== Solo skin vanilla - -Fat skins (DDFat) -== Skin grasse (DDFat) - -Skin prefix -== Prefisso skin - -Skin Database -== Database delle skin - -Skins directory -== Cartella delle skin - -Hook collisions -== Linea dell'hook - -Zoom in -== Ingrandisci in dentro - -Zoom out -== Ingrandisci in fuori - -Default zoom -== Zoom predefinito - -Show others -== Mostra altri - -Show all -== Mostra tutti - -Toggle dyncam -== Attiva/disattiva dyncam - -Toggle dummy -== Attiva/disattiva dummy - -Toggle ghost -== Attiva/disattiva ghost - -Dummy copy -== Dummy copy - -Hammerfly dummy -== Hammerfly dummy - -Laser -== Laser/cecchino - -Statboard -== Tabellone segnapunti - -Lock team -== Blocca la squadra (team) - -Show entities -== Mostra entities - -Show HUD -== Mostra interf. utente - -may cause delay -== Può esserci ritardo - -Screen -== Schermo - -Use high DPI -== Usa DPI alti - -Enable game sounds -== Abilita suoni del gioco - -Enable gun sound -== Abilita suono delle armi - -Enable long pain sound (used when shooting in freeze) -== Abilita suono di dolore (quando premi tasto sinistro nel freeze) - -Enable server message sound -== Abilita suono del messaggio del server - -Enable regular chat sound -== Abilita suono della chat normale - -Enable team chat sound -== Abilita suono della chat di squadra - -Enable highlighted chat sound -== Abilita suono della chat evidenziata - -Game sound volume -== Volume del gioco - -Chat sound volume -== Volume della chat - -Map sound volume -== Volume della mappa - -Background music volume -== Volume della musica in sottofondo - -HUD -== Interf. utente - -DDNet -== DDNet - -Assets -== Asset - -DDNet Client needs to be restarted to complete update! -== Il Client DDNet deve essere riavviato per completare l'aggiornamento! - -Show score -== Mostra punteggio/tempo - -Use old chat style -== Usa il modello della vecchia chat - -Show names in chat in team colors -== Mostra i nomi in chat nei colori delle squadre - -Show kill messages -== Mostra i messaggi delle morti - -Show votes window after voting -== Mostra la finestra del voto dopo aver votato - -Messages -== Messaggi - -System message -== Messaggio di sistema - -Reset -== Ripristina - -Highlighted message -== Messaggio evidenziato - -Team message -== Messaggio della squadra - -Friend message -== Messaggio di un amico - -Normal message -== Messaggio normale - -Client message -== Messaggio del Client - -Save the best demo of each race -== Salva la miglior demo di ogni partita - -Default length -== Lunghezza predefinita - -Enable replays -== Abilita i replay - -Show ghost -== Mostra ghost - -Save ghost -== Salva ghost - -Gameplay -== Gameplay - -Size -== Grandezza - -Show text entities -== Mostra i testi delle entità (entities) - -Show others (own team only) -== Mostra altri (solo la propria squadra) - -Show quads -== Mostra quads - -AntiPing -== AntiPing - -AntiPing: predict other players -== AntiPing: prevedi altri giocatori - -AntiPing: predict weapons -== AntiPing: prevedi le armi - -AntiPing: predict grenade paths -== AntiPing: prevedi i percorsi dei colpi del lanciagranate - -Show other players' hook collision lines -== Mostra la linea di collisione del rampino degli altri giocatori - -Show other players' key presses -== Mostra i tasti degli altri giocatori - -Use current map as background -== Usa la mappa attuale come sfondo - -Show tiles layers from BG map -== Mostra i layer dei tile dalla mappa in sfondo - -DDNet %s is available: -== DDNet %s è disponibile: - -Update now -== Aggiorna ora - -Updating… -== Aggiornamento in corso… - -DDNet Client updated! -== Client DDNet aggiornato! - -No updates available -== Non ci sono aggiornamenti disponibili - -Check now -== Controlla adesso - -New random timeout code -== Nuovo codice timeout a caso - -Entities -== Entità - -Emoticons -== Emoticon - -Particles -== Particelle - -Assets directory -== Cartella degli asset - -Learn -== Impara - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ - - -Website -== Sito web - -Settings -== Impostazioni - -Stop server -== Arresta server - -Run server -== Attiva server - -Server executable not found, can't run server -== Server eseguibile non trovato, non si può attivare il server - -Editor -== Editor - -[Start menu] -Play -== Gioca - -DDNet %s is out! -== È uscito DDNet %s! - -Restart -== Ricomincia - -Manual -== Manuale - -Race -== Gara - -Auto -== Automatico - -Replay -== Replay - -Follow -== Segui - -Frags -== Uccisioni - -Deaths -== Morti - -Suicides -== Suicidi - -Ratio -== Rapporto - -Net -== Net - -Spree -== Carneficina - -Best -== Migliore - -Grabs -== Agganci - -1 new mention -== 1 nuova menzione - -%d new mentions -== %d nuove menzioni - -9+ new mentions -== +9 nuove menzioni - -Preparing demo playback -== Preparando la riproduzione della demo - -Connected -== Connesso - -Loading map file from storage -== Caricando il file mappa dalla memoria - -Initializing components -== Inizializzando i componenti - -Initializing assets -== Inizializzando gli assets - -Initializing map logic -== Inizializzando la map logic - -Sending initial client info -== Inviando le informazioni del client - -Quitting. Please wait… -== Uscendo. Perfavore aspetta… - -Restarting. Please wait… -== Riavviando. Perfavore aspetta… - -Position: -== Posizione: - -Speed: -== Velocitá: - -Angle: -== Angolo: - -Multi-View -== Visione-Multipla - -Team %d -== Squadra %d - -Uploading map data to GPU -== Caricando dati mappa alla GPU - -Trying to determine UDP connectivity… -== Provando a determinare l'UDP connectivity… - -UDP seems to be filtered. -== UDP sembra essere filtrato. - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== UDP e TCP IP addresses sembrano essere diversi. Prova a disabilitare la VPN, proxy o network accelerators. - -No answer from server yet. -== Nessuna risposta dal server ancora - -Getting game info -== Ricevendo informazioni - -Requesting to join the game -== Richiedendo di entrare in partita - -Rename folder -== Rinomina cartella - -A demo with this name already exists -== Una demo con questo nome esiste giá - -A folder with this name already exists -== Una cartella con questo nome esiste giá - -Unable to rename the folder -== Impossibile rinominare la cartella - -File '%s' already exists, do you want to overwrite it? -== File '%s' giá esistente, vuoi sovrascriverlo? - -(paused) -== (in pausa) - -Join Tutorial Server -== Entra nel Server Tutorial - -Skip Tutorial -== Salta Tutorial - -Getting server list from master server -== Ottenere l'elenco dei server dal server principale - -Are you sure that you want to disconnect and switch to a different server? -== Sei sicuro di voler disconnetterti e passare a un altro server? - -No server selected -== Nessun server selezionato - -Online clanmates (%d) -== Compagni di clan online (%d) - -Click to select server. Double click to join your friend. -== Fare click per selezionare il server. Fai doppio click per unirti al tuo amico. - -Click to remove this player from your friends list. -== Fai click per rimuovere questo giocatore dall'elenco dei tuoi amici. - -Click to remove this clan from your friends list. -== Fai click per rimuovere questo clan dall'elenco dei tuoi amici. - -Are you sure that you want to remove the player '%s' from your friends list? -== Sei sicuro di voler rimuovere il giocatore '%s' dalla tua lista amici? - -Are you sure that you want to remove the clan '%s' from your friends list? -== Sei sicuro di voler rimuovere il clan '%s' dalla tua lista di amici? - -Add Clan -== Aggiungi Clan - -Delete folder -== Cancella cartella - -Download community skins -== Scarica skin comunitá - -Choose default eyes when joining a server -== Scegli degli occhi di default quando entri in un server - -Create a random skin -== Crea una skin randomica - -Open the directory to add custom skins -== Apri la cartella per aggiungere una skin custom - -Enable controller -== Abilitá controller - -Ingame controller mode -== Modalitá controller in gioco - -[Ingame controller mode] -Relative -== Relativo - -No controller found. Plug in a controller. -== Nessun controller trovato. Collega un controller. - -Axis -== Assi - -Status -== Stato - -Ingame mouse sens. -== Sens. mouse in gioco - -UI mouse sens. -== Sens. mouse UI - -Reset controls -== Reimposta i controlli - -Are you sure that you want to reset the controls to their defaults? -== Sei sicuro di voler ripristinare i controlli ai loro valori predefiniti? - -Cancel -== Cancella - -Windowed -== Finestra - -Windowed borderless -== Finestra senza bordi - -Windowed fullscreen -== Finestra schermo intero - -Desktop fullscreen -== Desktop schermo intero - -Graphics card -== Scheda grafica - -Hook Collisions -== Collisione Hook - -Show health, shields and ammo -== Mostra vita, scudi e munizioni - -Show DDRace HUD -== Mostra l'HUD DDRace - -Show jumps indicator -== Mostra indicatori salti - -Show dummy actions -== Mostra azioni dummy - -Show player position -== Mostra posizione player - -Show player speed -== Mostra velocitá player - -Show player target angle -== Mostra l'angolo di target del player - -Show freeze bars -== Mostra la barra freeze - -Opacity of freeze bars inside freeze -== Opacitá della barra del freeze dentro il freeze - -Preview -== Anteprima - -Show local player's key presses -== Mostra le pressioni dei tasti del giocatore locale - -Hook collision line -== Hook line collisione - -Hook collision line opacity -== Opacità hook line di collisione - -Colors of the hook collision line, in case of a possible collision with: -== Colori della linea di collisione del gancio, in caso di possibile collisione con: - -Your movements are not taken into account when calculating the line colors -== I tuoi movimenti non vengono presi in considerazione nel calcolo dei colori delle linee - -Nothing hookable -== Niente hookabile - -Something hookable -== Qualcosa hookabile - -Weapons -== Armi - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Quando attraversi la linea di partenza, mostra una maglietta fantasma che riproduce i movimenti del tuo miglior tempo - -Opacity -== Opacitá - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Regola l'opacità delle entità appartenenti ad altri team, come magliette e targhette - -Quads are used for background decoration -== I quads sono usati per decorare lo sfondo - -Tries to predict other entities to give a feel of low latency -== Provare a predirre altre entitá causa una sensazione di lag - -Background -== Sfondo - -Run on join -== Esegui quando entri - -Chat command (e.g. showall 1) -== Comando chat (es. showall 1) - -Unregister protocol and file extensions -== Protocollo ed estensioni file non registrati - -Loading assets -== Caricando assets - -Open the directory to add custom assets -== Apri la cartella per aggiungere assets custom - -Can't find a Tutorial server -== Impossibile trovare un Server Tutorial - -Loading race demo files -== Caricando i file della demo della gara - -Loading sound files -== Caricando file musica - -Moved ingame -== Spostato in gioco - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not save downloaded map. Try manually deleting this file: %s -== - -Could not connect dummy -== - -Error playing demo -== - -Failed saving the replay! -== - -Saving settings to '%s' failed -== - -Error saving settings -== - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -The format of texture %s is not RGBA which will cause visual bugs. -== - -Loading demo file from storage -== - -Some fonts could not be loaded. Check the local console for details. -== - -Why are you slowmo replaying to read this? -== - -Loading skin files -== - -Loading background map -== - -Searching -== - -Enter Username -== - -Enter Password -== - -NOT CONNECTED -== - -Match %d of %d -== - -No results -== - -Lines %d - %d (%s) -== - -Locked -== - -Following -== - -Loading commands… -== - -[Spectating] -Following %s -== - -[Spectating Camera Mode Icon] -AUTO -== - -Some map images could not be loaded. Check the local console for details. -== - -Some map sounds could not be loaded. Check the local console for details. -== - -Loading menu themes -== - -Press a key… -== - -Main menu -== - -Render complete -== - -Are you sure that you want to restart? -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -There's an unsaved map in the editor, you might want to save it. -== - -Continue anyway? -== - -Videos directory -== - -Video was saved to '%s' -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -%d/%d KiB (%.1f KiB/s) -== - -Loading menu images -== - -AFR -== - -ASI -== - -AUS -== - -EUR -== - -NA -== - -SA -== - -CHN -== - -No local servers found (ports %d-%d) -== - -Example of usage -== - -No login required -== - -Communities -== - -Copy info -== - -Leak IP -== - -Online friends (%d) -== - -[friends (server browser)] -Offline (%d) -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Server filter -== - -Friends -== - -Play the current demo -== - -Pause the current demo -== - -Stop the current demo -== - -Go back the specified duration -== - -[Demo player duration] -%d min. -== - -[Demo player duration] -%d sec. -== - -Change the skip duration -== - -Go forward the specified duration -== - -Go back one tick -== - -Go forward one tick -== - -Go back one marker -== - -Go forward one marker -== - -Slow down the demo -== - -Speed up the demo -== - -Mark the beginning of a cut (right click to reset) -== - -Mark the end of a cut (right click to reset) -== - -Export cut as a separate demo -== - -Close the demo player -== - -Toggle keyboard shortcuts -== - -Toggle auto camera -== - -Export demo cut -== - -Cut interval -== - -Cut length -== - -Render cut to video -== - -Please use a different filename -== - -Loading demo files -== - -All combined -== - -No demo selected -== - -Folder Link -== - -Created -== - -Netversion -== - -[Demo details] -map not included -== - -%.2f MiB -== - -%.2f KiB -== - -Open the directory that contains the demo files -== - -Are you sure that you want to delete the folder '%s'? -== - -Are you sure that you want to delete the demo '%s'? -== - -Unable to delete the demo '%s' -== - -Unable to delete the folder '%s'. Make sure it's empty first. -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Loading… -== - -Loading ghost files -== - -Ghosts directory -== - -Activate all -== - -Deactivate all -== - -Menu opened. Press Esc key again to close menu. -== - -[Hertz] -Hz -== - -Save power by lowering refresh rate (higher input latency) -== - -Settings file -== - -Open the settings file -== - -Config directory -== - -Open the directory that contains the configuration and user files -== - -Open the directory to add custom themes -== - -Dummy -== - -Player info change cooldown -== - -Converse -== - -Chat command -== - -Controller -== - -[Ingame controller mode] -Absolute -== - -Ingame controller sens. -== - -UI controller sens. -== - -Controller jitter tolerance -== - -Aim bind -== - -Mouse -== - -Allows maps to render with more detail -== - -Renderer -== - -default -== - -custom -== - -auto -== - -Tee -== - -Appearance -== - -Name Plate -== - -Info Messages -== - -Show local time always -== - -Authed name color in scoreboard -== - -Same clan color in scoreboard -== - -DDRace HUD -== - -Show client IDs (scoreboard, chat, spectator) -== - -Always show chat -== - -Show only chat messages from team members -== - -Chat font size -== - -Chat width -== - -Show friend mark (♥) in name plates -== - -Show client IDs in name plates -== - -Hook Strength -== - -Show hook strength icon indicator -== - -Show hook strength number indicator -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Show own player's hook collision line -== - -Always show own player's hook collision line -== - -Always show other players' hook collision lines -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -A Tee -== - -Preview 'Hook collisions' being pressed -== - -Show finish messages -== - -Normal Color -== - -Highlight Color -== - -Rifle Laser Outline Color -== - -Rifle Laser Inner Color -== - -Shotgun Laser Outline Color -== - -Shotgun Laser Inner Color -== - -Door Laser Outline Color -== - -Door Laser Inner Color -== - -Freeze Laser Outline Color -== - -Freeze Laser Inner Color -== - -Set all to Rifle -== - -Enable ghost -== - -Only save improvements -== - -Overlay entities -== - -Regular background color -== - -Entities background color -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Extras -== - -Discord -== - -https://ddnet.org/discord -== - -Tutorial -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Round %d/%d -== - -[Spectators] -%d others… -== - -Super -== - -[Team and size] -%d\n(%d/%d) -== - -Team %d (%d/%d) -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -FPM -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/japanese.txt b/data/languages/japanese.txt deleted file mode 100644 index a84ec9c6a9..0000000000 --- a/data/languages/japanese.txt +++ /dev/null @@ -1,2073 +0,0 @@ -##### authors ##### -#originally created by: -# orange -#modified by: -# 2021-06-04 Eana Hufwe -##### /authors ##### - -##### translated strings ##### - -%ds left -== 残り %d 秒 - -%i minute left -== 残り %i 分 - -%i minutes left -== 残り %i 分 - -%i second left -== 残り %i 秒 - -%i seconds left -== 残り %i 秒 - -%s wins! -== %s の勝ち! - -Abort -== 中止 - -Add -== 追加 - -Add Friend -== 友達追加 - -Address -== アドレス - -All -== 全部 - -Are you sure that you want to quit? -== 終了してもよろしいですか? - -Automatically record demos -== 自動的にデモを保存する - -Automatically take game over screenshot -== 自動的にスクリーンショットを保存する - -Blue team -== 青チーム - -Blue team wins! -== 青チームの勝ち! - -Body -== 体 - -Call vote -== 投票作成 - -Change settings -== 設定変更 - -Chat -== チャット - -Clan -== クラン - -Client -== クライアント - -Connecting to -== 接続先 - -Connection Problems… -== 接続中に問題が発生 - -Console -== コンソール - -Controls -== コントロール - -Count players only -== 実際のプレイヤー数を表示 - -Current -== 現行 - -Custom colors -== 色変更 - -Delete -== 削除 - -Delete demo -== デモを削除 - -Demofile: %s -== デモファイル: %s - -Demos -== デモ録画 - -Disconnect -== 切断 - -Disconnected -== 切断されました - -Downloading map -== マップをダウンロード中 - -Draw! -== 引き分け! - -Dynamic Camera -== 動的カメラ - -Emoticon -== 絵文字 - -Error -== エラー - -Error loading demo -== デモの読み込みに失敗しました - -Favorite -== お気に入り - -Favorites -== お気に入り - -Feet -== 足 - -Fire -== 射撃 - -Folder -== フォルダ - -Force vote -== 強制投票 - -Free-View -== 自由視点 - -Game -== ゲーム - -Game info -== ゲーム情報 - -Game over -== ゲームオーバー - -Game type -== ゲームタイプ - -Game types: -== ゲームタイプ: - -General -== 一般 - -Graphics -== グラフィック - -Grenade -== グレネード - -Hammer -== ハンマー - -Has people playing -== プレイヤーがいるサーバー - -High Detail -== 高解像度マップを表示 - -Hook -== フック - -Invalid Demo -== 無効なデモ - -Join blue -== 青チームに参加 - -Join red -== 赤チームに参加 - -Jump -== ジャンプ - -Kick player -== プレイヤーをキック - -Language -== 言語 - -MOTD -== 説明 - -Map -== マップ - -Move left -== 左移動 - -Move player to spectators -== プレイヤーを観戦席に移動 - -Move right -== 右移動 - -Movement -== 動き - -Mute when not active -== 非アクティブ時にミュート - -Name -== 名前 - -Next weapon -== 次の武器 - -Nickname -== ハンドルネーム - -No -== いいえ - -No password -== パスワードがないサーバー - -No servers found -== サーバーが見つかりません - -No servers match your filter criteria -== フィルタに適合するサーバーが見つかりません - -Ok -== Ok - -Parent Folder -== 親フォルダ - -Password -== パスワード - -Password incorrect -== パスワードが正しくありません - -Ping -== Ping - -Pistol -== ピストル - -Play background music -== BGM - -Player -== プレイヤー - -Player country: -== 所在地: - -Players -== プレーヤー - -Please balance teams! -== チーム人数が偏っています! - -Prev. weapon -== 前の武器 - -Quit -== 終了 - -Reason: -== 理由: - -Red team -== 赤チーム - -Red team wins! -== 赤チームの勝ち! - -Remote console -== リモートコンソール - -Remove -== 削除 - -Remove friend -== 友達を削除 - -Rename demo -== デモの名前変更 - -Reset filter -== フィルタをリセット - -Score -== スコア - -Score limit -== スコア上限 - -Scoreboard -== スコアボード - -Screenshot -== スクリーンショット - -Server address: -== IP アドレス: - -Server info -== サーバー情報 - -Server not full -== 空きがあるサーバー - -Shotgun -== ショットガン - -Show chat -== チャットを表示 - -Show friends only -== 友達がいるサーバー - -Show ingame HUD -== ゲーム内で HUD を表示 - -Show name plates -== 名前を表示 - -Sound -== サウンド - -Sound error -== サウンドエラー - -Spectate -== 観戦席 - -Spectate next -== 次の人を見る - -Spectate previous -== 前の人を見る - -Spectator mode -== 観戦モード - -Spectators -== 観戦者 - -Stop record -== 録画停止 - -Strict gametype filter -== ゲームタイプ完全一致検索 - -Sudden Death -== サドンデス - -Switch weapon on pickup -== 拾った武器に持ちかえる - -Team -== チーム - -Team chat -== チームチャット - -The audio device couldn't be initialised. -== オーディオデバイスの初期化に失敗しました。 - -The server is running a non-standard tuning on a pure game type. -== サーバーが MOD を導入しているようです。 - -Time limit -== 時間上限 - -Time limit: %d min -== 時間上限: %d 分 - -Try again -== もう一度 - -Type -== タイプ - -Unable to rename the demo -== デモの名前を変更できません。 - -Use sounds -== サウンド全般を使用 - -Use team colors for name plates -== 名前表示にチームカラーを使う - -V-Sync -== V-Sync - -Version -== バージョン - -Vote command: -== 投票コマンド: - -Vote description: -== 投票の説明: - -Vote no -== 反対 - -Vote yes -== 賛成 - -Voting -== 投票 - -Warmup -== 準備中 - -Weapon -== 武器 - -Yes -== はい - -You must restart the game for all settings to take effect. -== 設定を反映するためにはゲームの再起動が必要です。 - -##### needs translation ##### - -New name: -== 新しいファイル名: - -Max demos -== デモの最大数 - -Internet -== オンライン - -News -== ニュース - -Join game -== ゲームに参加 - -FSAA samples -== FSAA サンプル数 - -Sat. -== 彩度 - -LAN -== LAN - -Sound volume -== 音量 - -Record demo -== デモを録画 - -Miscellaneous -== その他 - -UI Color -== UI カラー - -Max Screenshots -== スクリーンショットの最大数 - -Hue -== 色相 - -Your skin -== あなたのスキン - -Reset to defaults -== 初期設定に戻す - -Laser -== レーザー - -Lht. -== 明るさ - -Alpha -== 透明度 - -Name plates size -== 名前表示の大きさ - -Successfully saved the replay! -== リプレイ保存完了しました! - -Replay feature is disabled! -== リプレイ機能はオフにしました! - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== テクスチ %s の幅は %d で割り切れなません、もしくは高さは %d で割り切れません。この場合、画面バグが発生する可能性があります。 - -Warning -== 注意 - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== デバッグモードをオンにしました。オフにするには、Ctrl+Shift+D を押してください。 - -Game paused -== 一時停止しました - -Server best: -== サーバー最高記録: - -Personal best: -== 個人最高記録: - -Reset -== リセット - -Browser -== サーバー - -Ghost -== ゴースト - -Loading DDNet Client -== DDNet Client 読み込み中 - -Reconnect in %d sec -== 再接続まであと %d 秒 - -Render demo -== デモを描画 - -Replace video -== 動画を変更 - -File already exists, do you want to overwrite it? -== ファイルはすでに存在しています、上書きしますか? - -Are you sure that you want to disconnect? -== 接続を切断しますか? - -Disconnect Dummy -== ダミーの接続を切断 - -Are you sure that you want to disconnect your dummy? -== ダミーへの接続を切断しますか? - -Welcome to DDNet -== DDNet へようこそ - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork は、協力型のオンラインゲームです。チーム中の Tee と協力して、マップ上のゴールを目指しましょう!初心者の方は、最も簡単なマップを使っている Novice サーバーから始めることをおすすめします。サーバー選ぶ時は ping を考慮して、近くのサーバーを選んでください。 - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== K ボタンでキル(やり直す)、Q ボタンで一時停止して観戦することができます。他のキーバインドは設定画面を参照してください。 - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== サーバーに参加する前に、設定を確認して、自分の好みに合わせて、キーバインドを調整することをお勧めします。 - -Please enter your nickname below. -== ハンドルネームを入力してください。 - -Existing Player -== 既存のプレーヤー - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== ハンドルネーム「%s」は DDNet で %d ポイントに記録があります。それでも使いたいですか? - -Checking for existing player with your name -== 既存のプレーヤーの中でハンドルネームを検索しています。 - -Speed -== 速度 - -Video name: -== 動画の名前 - -Show DDNet map finishes in server browser -== サーバー・ブラウザーで完成した DDNet マップを表示する - -transmits your player name to info.ddnet.org -== ハンドルネームを info.ddnet.org に送信します - -Theme -== テーマ - -Getting server list from master server -== マスターサーバーからサーバーリストを取得しています - -Search -== 検索キーワード - -Exclude -== 除外キーワード - -%d of %d servers -== %d / %d コのサーバー - -%d of %d server -== %d / %d コのサーバー - -%d players -== %d 人のプレーヤー - -%d player -== %d 人のプレーヤー - -Filter connecting players -== 接続中のプレーヤーをフィルタする - -Indicate map finish -== 完成したマップをハイライトする - -Unfinished map -== 未完成のマップ - -Countries -== 国 - -Types -== タイプ - -Leak IP -== IP を漏洩する - -Remove chat -== チャット履歴を削除 - -%.2f MiB -== %.2f MiB - -%.2f KiB -== %.2f KiB - -Demo -== デモ録画 - -Markers -== ブックマーク - -Length -== 長さ - -Date -== 日付 - -Fetch Info -== デモ情報 - -Demos directory -== デモ・ディレクトリー - -Connecting dummy -== ダミーを接続中 - -Connect Dummy -== ダミーに接続 - -Kill -== キル - -Pause -== 観察 - -Deactivate -== 無効にする - -Activate -== 有効にする - -Save -== 保存 - -Smooth Dynamic Camera -== 滑らかな動的カメラ - -Switch weapon when out of ammo -== 弾薬切れの時に武器を切り替え - -Show only chat messages from friends -== 友たちからのメッセージのみを表示 - -Show clan above name plates -== 名前の上に所属クランを表示 - -Clan plates size -== クラン表示サイズ - -Skip the main menu -== メインメニューをスキップ - -Refresh Rate -== リフレッシュ・レート - -Themes directory -== テーマ・ディレクトリー - -Automatically take statboard screenshot -== リザルト画面で自動スクショ - -Automatically create statboard csv -== リザルト CSV ファイルを自動生成 - -Max CSVs -== 最大 CSV ファイル数 - -Download skins -== スキンをダウンロード - -Vanilla skins only -== オリジナルスキンのみ - -Fat skins (DDFat) -== まるいスキン(DDFat) - -Skin prefix -== スキンの接頭辞 - -Skin Database -== スキン・データーベース - -Skins directory -== スキン・ディレクトリー - -Hook collisions -== フックライン - -Zoom in -== 拡大 - -Zoom out -== 縮小 - -Default zoom -== デフォルト倍率 - -Show others -== 他のプレイヤーを表示 - -Show all -== すべてのプレイヤーを表示 - -Toggle dyncam -== 動的カメラ切り替え - -Toggle dummy -== ダミー切り替え - -Toggle ghost -== ゴースト切り替え - -Dummy copy -== ダミーシンクロ - -Hammerfly dummy -== ハンマーフライモード - -Converse -== 送信先を引き継ぎ - -Statboard -== リザルト画面 - -Lock team -== チームをロック - -Show entities -== オブジェを表示 - -Show HUD -== HUD を表示 - -Chat command -== チャットコマンド - -Dummy -== ダミー - -Windowed -== ウィンドウモード - -Windowed borderless -== ウィンドウモード・枠なし - -Desktop fullscreen -== フルスクリーン - -Fullscreen -== 独占フルスクリーン - -may cause delay -== 遅延する可能性あり - -Screen -== 画面 - -Use high DPI -== 高 DPI 対応モード - -Enable game sounds -== 音声 - -Enable gun sound -== 銃声 SFX - -Enable long pain sound (used when shooting in freeze) -== フリーズ時の叫び - -Enable server message sound -== サーバーメッセージ受信音 - -Enable regular chat sound -== 普通チャット受信音 - -Enable team chat sound -== チームチャット受信音 - -Enable highlighted chat sound -== メンション・メッセージ受信音 - -Game sound volume -== ゲーム SFX 音量 - -Chat sound volume -== 受信音音量 - -Map sound volume -== マップ SFX 音量 - -Background music volume -== BGM 音量 - -HUD -== HUD - -DDNet -== DDNet - -Assets -== 素材 - -DDNet Client needs to be restarted to complete update! -== アップデートを完了するには、DDNet クライアントの再起動が必要です。 - -Show score -== スコアを表示 - -Show names in chat in team colors -== チームの色でハンドルネームを表示 - -Show kill messages -== キル情報を表示 - -Show votes window after voting -== 投票完了後にウィンドウを閉じない - -Use old chat style -== 古いチャットボックスを使用 - -Messages -== メッセージ - -System message -== システムメッセージ - -Highlighted message -== メンションメッセージ - -Team message -== チームメッセージ - -Friend message -== 友たちからのメッセージ - -Normal message -== 普通のメッセージ - -Client message -== クライアントのメッセージ - -Preview -== プレビュー - -Save the best demo of each race -== レースの最高記録のデモを保存 - -Default length -== デフォルト長さ - -Enable replays -== リプレイ機能 - -Show ghost -== ゴーストを表示 - -Save ghost -== ゴーストを保存 - -Gameplay -== ゲーム - -Overlay entities -== 重ねオブジェ - -Size -== サイズ - -Show text entities -== 文字オブジェを表示 - -Show others (own team only) -== 同チームの他のプレーヤーを表示 - -Show quads -== 背景を表示 - -AntiPing -== AntiPing - -AntiPing: predict other players -== AntiPing: 他のプレーヤーを予測 - -AntiPing: predict weapons -== AntiPing: 武器を予測 - -AntiPing: predict grenade paths -== AntiPing: 手榴弾の軌跡を予測 - -Show other players' hook collision lines -== 他のプレーヤーのフックラインを表示 - -Show other players' key presses -== 他のプレーヤーの押したキーを表示 - -Background -== 背景 - -Use current map as background -== 現在のマップを背景にする - -Show tiles layers from BG map -== 背景マップのタイル層を表示 - -New random timeout code -== ランダムにタイムアウト・コードを生成 - -DDNet %s is available: -== DDNet %s がリリースされました。 - -Update now -== 今すぐ更新 - -Updating… -== 更新中… - -DDNet Client updated! -== DDNet Client が更新しました! - -No updates available -== 新しいバージョンはありません - -Check now -== 更新を確認 - -Entities -== オブジェ - -Emoticons -== 絵文字 - -Particles -== 粒子 - -Assets directory -== 素材ディレクトリー - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -Learn -== チュートリアル - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ - -Website -== ウェブ - -Settings -== 設定 - -Stop server -== サーバーを停止 - -Run server -== サーバーを起動 - -Server executable not found, can't run server -== サーバープログラムが見つかりません。サーバー起動できません。 - -Editor -== エディター - -[Start menu] -Play -== スタート - -DDNet %s is out! -== DDNet %s がリリースされました! - -Downloading %s: -== %s をダウンロード中: - -Update failed! Check log… -== 更新に失敗しました!ログを確認してください。 - -Restart -== やり直す - -Time -== 時間 - -Manual -== 手動 - -Race -== レース - -Auto -== 自動 - -Replay -== リプレー - -Follow -== フォロー - -Frags -== キル - -Deaths -== 総キル - -Suicides -== 自殺 - -Ratio -== キル率 - -Net -== 純キル - -FPM -== キル/分 - -Spree -== コンボ - -Best -== 最高 - -Grabs -== 旗取り - -1 new mention -== 1 件の新しいメンション - -%d new mentions -== %d 件の新しいメンション - -9+ new mentions -== 9+ 件の新しいメンション - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not save downloaded map. Try manually deleting this file: %s -== - -Could not connect dummy -== - -Error playing demo -== - -Failed saving the replay! -== - -Saving settings to '%s' failed -== - -Error saving settings -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -The format of texture %s is not RGBA which will cause visual bugs. -== - -Preparing demo playback -== - -Connected -== - -Loading map file from storage -== - -Loading demo file from storage -== - -Some fonts could not be loaded. Check the local console for details. -== - -Initializing components -== - -Why are you slowmo replaying to read this? -== - -Initializing assets -== - -Initializing map logic -== - -Sending initial client info -== - -Quitting. Please wait… -== - -Restarting. Please wait… -== - -Loading skin files -== - -Loading background map -== - -Searching -== - -Enter Username -== - -Enter Password -== - -NOT CONNECTED -== - -Match %d of %d -== - -No results -== - -Lines %d - %d (%s) -== - -Locked -== - -Following -== - -Loading commands… -== - -Position: -== - -Speed: -== - -Angle: -== - -Multi-View -== - -[Spectating] -Following %s -== - -[Spectating Camera Mode Icon] -AUTO -== - -Team %d -== - -Some map images could not be loaded. Check the local console for details. -== - -Uploading map data to GPU -== - -Some map sounds could not be loaded. Check the local console for details. -== - -Loading menu themes -== - -Press a key… -== - -Main menu -== - -Rename folder -== - -Render complete -== - -Are you sure that you want to restart? -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -There's an unsaved map in the editor, you might want to save it. -== - -Continue anyway? -== - -A demo with this name already exists -== - -A folder with this name already exists -== - -Unable to rename the folder -== - -File '%s' already exists, do you want to overwrite it? -== - -(paused) -== - -Videos directory -== - -Video was saved to '%s' -== - -Join Tutorial Server -== - -Skip Tutorial -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -Trying to determine UDP connectivity… -== - -UDP seems to be filtered. -== - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== - -No answer from server yet. -== - -%d/%d KiB (%.1f KiB/s) -== - -Getting game info -== - -Requesting to join the game -== - -Loading menu images -== - -AFR -== - -ASI -== - -AUS -== - -EUR -== - -NA -== - -SA -== - -CHN -== - -No local servers found (ports %d-%d) -== - -Example of usage -== - -Are you sure that you want to disconnect and switch to a different server? -== - -No login required -== - -Communities -== - -Copy info -== - -No server selected -== - -Online friends (%d) -== - -Online clanmates (%d) -== - -[friends (server browser)] -Offline (%d) -== - -Click to select server. Double click to join your friend. -== - -Click to remove this player from your friends list. -== - -Click to remove this clan from your friends list. -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Are you sure that you want to remove the player '%s' from your friends list? -== - -Are you sure that you want to remove the clan '%s' from your friends list? -== - -Add Clan -== - -Server filter -== - -Friends -== - -Play the current demo -== - -Pause the current demo -== - -Stop the current demo -== - -Go back the specified duration -== - -[Demo player duration] -%d min. -== - -[Demo player duration] -%d sec. -== - -Change the skip duration -== - -Go forward the specified duration -== - -Go back one tick -== - -Go forward one tick -== - -Go back one marker -== - -Go forward one marker -== - -Slow down the demo -== - -Speed up the demo -== - -Mark the beginning of a cut (right click to reset) -== - -Mark the end of a cut (right click to reset) -== - -Export cut as a separate demo -== - -Close the demo player -== - -Toggle keyboard shortcuts -== - -Toggle auto camera -== - -Export demo cut -== - -Cut interval -== - -Cut length -== - -Render cut to video -== - -Please use a different filename -== - -Loading demo files -== - -All combined -== - -No demo selected -== - -Folder Link -== - -Created -== - -Netversion -== - -[Demo details] -map not included -== - -Open the directory that contains the demo files -== - -Are you sure that you want to delete the folder '%s'? -== - -Are you sure that you want to delete the demo '%s'? -== - -Delete folder -== - -Unable to delete the demo '%s' -== - -Unable to delete the folder '%s'. Make sure it's empty first. -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Loading… -== - -Loading ghost files -== - -Ghosts directory -== - -Activate all -== - -Deactivate all -== - -Menu opened. Press Esc key again to close menu. -== - -[Hertz] -Hz -== - -Save power by lowering refresh rate (higher input latency) -== - -Settings file -== - -Open the settings file -== - -Config directory -== - -Open the directory that contains the configuration and user files -== - -Open the directory to add custom themes -== - -Player info change cooldown -== - -Download community skins -== - -Create a random skin -== - -Choose default eyes when joining a server -== - -Open the directory to add custom skins -== - -Enable controller -== - -Controller -== - -Ingame controller mode -== - -[Ingame controller mode] -Relative -== - -[Ingame controller mode] -Absolute -== - -Ingame controller sens. -== - -UI controller sens. -== - -Controller jitter tolerance -== - -No controller found. Plug in a controller. -== - -Axis -== - -Status -== - -Aim bind -== - -Mouse -== - -Ingame mouse sens. -== - -UI mouse sens. -== - -Reset controls -== - -Are you sure that you want to reset the controls to their defaults? -== - -Cancel -== - -Windowed fullscreen -== - -Allows maps to render with more detail -== - -Renderer -== - -default -== - -custom -== - -Graphics card -== - -auto -== - -Tee -== - -Appearance -== - -Name Plate -== - -Hook Collisions -== - -Info Messages -== - -Show health, shields and ammo -== - -Show local time always -== - -Authed name color in scoreboard -== - -Same clan color in scoreboard -== - -DDRace HUD -== - -Show client IDs (scoreboard, chat, spectator) -== - -Show DDRace HUD -== - -Show jumps indicator -== - -Show dummy actions -== - -Show player position -== - -Show player speed -== - -Show player target angle -== - -Show freeze bars -== - -Opacity of freeze bars inside freeze -== - -Always show chat -== - -Show only chat messages from team members -== - -Chat font size -== - -Chat width -== - -Show friend mark (♥) in name plates -== - -Show client IDs in name plates -== - -Hook Strength -== - -Show hook strength icon indicator -== - -Show hook strength number indicator -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Show local player's key presses -== - -Size of key press icons -== - -Hook collision line -== - -Show own player's hook collision line -== - -Always show own player's hook collision line -== - -Always show other players' hook collision lines -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Hook collision line opacity -== - -Colors of the hook collision line, in case of a possible collision with: -== - -Your movements are not taken into account when calculating the line colors -== - -Nothing hookable -== - -Something hookable -== - -A Tee -== - -Preview 'Hook collisions' being pressed -== - -Show finish messages -== - -Normal Color -== - -Highlight Color -== - -Weapons -== - -Rifle Laser Outline Color -== - -Rifle Laser Inner Color -== - -Shotgun Laser Outline Color -== - -Shotgun Laser Inner Color -== - -Door Laser Outline Color -== - -Door Laser Inner Color -== - -Freeze Laser Outline Color -== - -Freeze Laser Inner Color -== - -Set all to Rifle -== - -Enable ghost -== - -When you cross the start line, show a ghost tee replicating the movements of your best time -== - -Opacity -== - -Only save improvements -== - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== - -Quads are used for background decoration -== - -Tries to predict other entities to give a feel of low latency -== - -Regular background color -== - -Entities background color -== - -Run on join -== - -Chat command (e.g. showall 1) -== - -Unregister protocol and file extensions -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Extras -== - -Loading assets -== - -Open the directory to add custom assets -== - -Tutorial -== - -Can't find a Tutorial server -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Loading race demo files -== - -Round %d/%d -== - -[Spectators] -%d others… -== - -Super -== - -[Team and size] -%d\n(%d/%d) -== - -Team %d (%d/%d) -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Loading sound files -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -Moved ingame -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/korean.txt b/data/languages/korean.txt deleted file mode 100644 index 5722e6f04f..0000000000 --- a/data/languages/korean.txt +++ /dev/null @@ -1,2085 +0,0 @@ -##### authors ##### -#originally created by: -# ksgcln72 -#contributors: -# Pathos -#modified by: -# 2022-03-23 CHaBek -# 2022-03-28 CHaBek -# 2022-04-21 CHaBek -# 2022-05-16 CHaBek -# 2022-06-17 CHaBek -# 2022-07-05 CHaBek -# 2022-08-17 CHaBek -# 2022-09-18 CHaBek -# 2022-10-20 CHaBek -# 2023-01-08 CHaBek -# 2023-03-28 CHaBek -##### /authors ##### - -##### translated strings ##### - -%ds left -== %d 초 남음 - -%i minute left -== %i 분 남음 - -%i minutes left -== %i 분 남음 - -%i second left -== %i 초 남음 - -%i seconds left -== %i 초 남음 - -%s wins! -== %s 승리! - -Abort -== 취소 - -Add -== 추가 - -Add Friend -== 친구 추가 - -Address -== 주소 - -All -== 모두 - -Are you sure that you want to quit? -== 종료하시겠습니까? - -Automatically record demos -== 자동으로 데모 녹화 - -Automatically take game over screenshot -== 자동으로 게임 종료 스크린샷 저장 - -Blue team -== 블루팀 - -Blue team wins! -== 블루팀 승리! - -Body -== 몸 - -Call vote -== 투표 - -Change settings -== 설정 변경 - -Chat -== 채팅 - -Clan -== 클랜 - -Client -== 클라이언트 - -Connecting to -== 연결 중 - -Connection Problems… -== 연결 문제 발생… - -Console -== 콘솔 - -Controls -== 조작 - -Count players only -== 플레이어만 세기 - -Current -== 현재 - -Custom colors -== 사용자 정의 색상 - -Delete -== 삭제 - -Delete demo -== 데모 삭제 - -Demos -== 데모 - -Disconnect -== 연결 끊기 - -Disconnected -== 연결 끊김 - -Downloading map -== 맵 다운로드 중 - -Draw! -== 무승부! - -Dynamic Camera -== 다이나믹 카메라 - -Emoticon -== 이모티콘 - -Error -== 오류 - -Error loading demo -== 데모 로딩 오류 - -Favorite -== 즐겨찾기 - -Favorites -== 즐겨찾기 - -Feet -== 발 - -Fire -== 발사 - -Folder -== 폴더 - -Force vote -== 강제 투표 - -Free-View -== 자유 시점 - -Fullscreen -== 전체화면 - -Game -== 게임 - -Game info -== 게임 정보 - -Game over -== 게임 종료 - -Game type -== 게임 종류 - -Game types: -== 게임 종류: - -General -== 일반 - -Graphics -== 그래픽 - -Grenade -== 유탄 발사기 - -Hammer -== 망치 - -Has people playing -== 플레이어가 있는 서버 - -High Detail -== 맵 세부사항 표시 - -Hook -== 갈고리 - -Invalid Demo -== 잘못된 데모 - -Join blue -== 블루팀에 참가 - -Join red -== 레드팀에 참가 - -Jump -== 점프 - -Kick player -== 플레이어 추방 - -Language -== 언어 - -MOTD -== 설명 - -Map -== 맵 - -Move left -== 왼쪽으로 이동 - -Move player to spectators -== 관전자로 플레이어 이동 - -Move right -== 오른쪽으로 이동 - -Movement -== 이동 - -Mute when not active -== 창 비활성 시 음소거 - -Name -== 이름 - -Next weapon -== 다음 무기 - -Nickname -== 닉네임 - -No -== 아니오 - -No password -== 비밀번호가 없는 서버 - -No servers found -== 서버를 찾을 수 없음 - -No servers match your filter criteria -== 필터에 일치하는 서버가 없음 - -Ok -== 확인 - -Parent Folder -== 상위 폴더 - -Password -== 비밀번호 - -Password incorrect -== 잘못된 비밀번호 - -Ping -== 핑 - -Pistol -== 권총 - -Player -== 플레이어 - -Players -== 플레이어 - -Please balance teams! -== 팀원수가 불균형함! - -Prev. weapon -== 이전 무기 - -Quit -== 종료 - -Reason: -== 이유: - -Red team -== 레드팀 - -Red team wins! -== 레드팀 승리! - -Remote console -== 원격 콘솔 - -Remove -== 제거 - -Remove friend -== 친구 제거 - -Rename demo -== 데모 이름 변경 - -Reset filter -== 필터 초기화 - -Score -== 점수 - -Score limit -== 점수 제한 - -Scoreboard -== 점수판 - -Screenshot -== 스크린샷 - -Server address: -== 서버 주소: - -Server info -== 서버 정보 - -Server not full -== 빈 자리가 있는 서버 - -Shotgun -== 산탄총 - -Show chat -== 채팅 표시 - -Show friends only -== 친구가 있는 서버 - -Show ingame HUD -== 게임 내 HUD 표시 - -Show name plates -== 이름 표시 - -Sound -== 소리 - -Sound error -== 소리 오류 - -Spectate -== 관전 - -Spectator mode -== 관전 모드 - -Spectators -== 관전자 - -Stop record -== 녹화 중지 - -Strict gametype filter -== 게임 종류 완전일치 - -Sudden Death -== 단판 승부 - -Switch weapon on pickup -== 획득한 무기로 교체 - -Team -== 팀 - -Team chat -== 팀 채팅 - -The audio device couldn't be initialised. -== 오디오 장치를 초기화하지 못했습니다. - -The server is running a non-standard tuning on a pure game type. -== 이 서버는 조정된 비표준 게임 모드를 실행하고 있습니다. - -Time limit -== 시간 제한 - -Time limit: %d min -== 시간 제한: %d 분 - -Try again -== 재시도 - -Type -== 종류 - -Unable to rename the demo -== 데모의 이름을 변경할 수 없음 - -Use sounds -== 소리 사용 - -Use team colors for name plates -== 이름에 팀 색상 사용 - -V-Sync -== V-Sync - -Version -== 버전 - -Vote command: -== 투표 명령: - -Vote description: -== 투표 설명: - -Vote no -== 반대 - -Vote yes -== 찬성 - -Voting -== 투표 - -Warmup -== 준비 - -Weapon -== 무기 - -Yes -== 예 - -You must restart the game for all settings to take effect. -== 설정을 적용하기 위해서 게임을 재시작해야 합니다. - -##### needs translation ##### - -Game paused -== 게임 일시정지 - -Play background music -== 배경 음악 - -Player country: -== 플레이어 국가: - -Show only chat messages from friends -== 친구가 보낸 메시지만 표시 - -Spectate next -== 다음 플레이어 관전 - -Spectate previous -== 이전 플레이어 관전 - -New name: -== 새 이름: - -Max demos -== 최대 데모 수 - -Internet -== 인터넷 - -News -== 뉴스 - -Join game -== 게임 참가 - -FSAA samples -== FSAA 샘플 - -Sat. -== 채도 - -LAN -== 랜 - -Sound volume -== 음량 - -Record demo -== 데모 녹화 - -Miscellaneous -== 여러가지 - -UI Color -== UI 색상 - -Your skin -== 당신의 스킨 - -Max Screenshots -== 최대 스크린샷 수 - -Hue -== 색조 - -Reset to defaults -== 설정 초기화 - -Laser -== 레이저 - -Lht. -== 명도 - -Alpha -== 투명도 - -Name plates size -== 이름 표시 크기 - -Successfully saved the replay! -== 리플레이 저장에 성공했습니다! - -Replay feature is disabled! -== 리플레이 기능을 비활성화했습니다! - -Warning -== 주의 - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== 디버그 모드를 활성화했습니다. Ctrl+Shift+D를 눌러 비활성화할 수 있습니다. - -Server best: -== 서버 최고 기록: - -Personal best: -== 개인 최고 기록: - -Reset -== 초기화 - -Browser -== 브라우저 - -Ghost -== 고스트 - -Loading DDNet Client -== DDNet 클라이언트 로딩 중 - -Reconnect in %d sec -== %d 초 후 재접속 - -Render demo -== 데모 렌더링 - -Replace video -== 동영상 변경 - -File already exists, do you want to overwrite it? -== 파일이 이미 존재합니다. 덮어쓰기하시겠습니까? - -Are you sure that you want to disconnect? -== 연결을 끊으시겠습니까? - -Disconnect Dummy -== 더미 연결 끊기 - -Are you sure that you want to disconnect your dummy? -== 더미의 연결을 끊으시겠습니까? - -Welcome to DDNet -== DDNet에 오신 것을 환영합니다 - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork는 온라인 협동 게임으로, 당신과 당신의 Tee 동료들이 맵의 결승점에 도달하는 것이 목표입니다. 당신이 초보자라면 가장 쉬운 맵들을 진행하는 Novice 서버에서 시작하는 것을 권장합니다. 핑을 고려하여 당신의 근처에 있는 서버를 선택하십시오. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== 죽기(재시작) 위해서는 K 키를 눌러야 합니다. Q 키를 눌러 일시정지하여 다른 플레이어를 관전할 수 있습니다. 다른 키 바인드는 설정 창을 참고하십시오. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== 서버 접속 전에 설정을 확인하고 여러분의 편의에 따라 조정하는 것을 권장합니다. - -Please enter your nickname below. -== 아래에 닉네임을 입력해 주십시오. - -Existing Player -== 기존 플레이어 - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== 닉네임 '%s' 은 이미 사용 중입니다 (%d 포인트). 그래도 사용하시겠습니까? - -Checking for existing player with your name -== 기존 플레이어 목록에서 닉네임 검색 중 - -Are you sure that you want to disconnect and switch to a different server? -== 연결을 끊고 다른 서버에 접속하시겠습니까? - -Speed -== 속도 - -Video name: -== 동영상 이름: - -Show DDNet map finishes in server browser -== DDNet 맵 완주를 서버 브라우저에 표시 - -transmits your player name to info.ddnet.org -== info.ddnet.org에 당신의 닉네임을 전송함 - -Theme -== 테마 - -Getting server list from master server -== 마스터 서버에서 서버 목록을 받는 중 - -Search -== 검색 - -Exclude -== 제외 - -%d of %d servers -== %d / %d 서버 - -%d of %d server -== %d / %d 서버 - -%d players -== %d 플레이어 - -%d player -== %d 플레이어 - -Filter connecting players -== 접속 중인 플레이어 제외 - -Indicate map finish -== 완주한 맵 표시 - -Unfinished map -== 미완주 맵 - -Countries -== 국가 - -Types -== 종류 - -Leak IP -== IP 노출하기 - -Remove chat -== 채팅 제거 - -Demofile: %s -== 데모 파일: %s - -Demo -== 데모 - -Markers -== 마커 - -Length -== 길이 - -Date -== 날짜 - -Fetch Info -== 정보 - -Demos directory -== 데모 폴더 - -Connect Dummy -== 더미 연결 - -Connecting dummy -== 더미 연결 중 - -Kill -== 죽기 - -Pause -== 관전 - -Time -== 시간 - -Deactivate -== 비활성화 - -Activate -== 활성화 - -Save -== 저장 - -Smooth Dynamic Camera -== 부드러운 다이나믹 카메라 - -Switch weapon when out of ammo -== 탄약 고갈 시 무기 교체 - -Show clan above name plates -== 이름 위에 클랜 표시 - -Clan plates size -== 클랜 표시 크기 - -Skip the main menu -== 메인 메뉴 건너뛰기 - -Refresh Rate -== 화면 주사율 - -Settings file -== 설정 파일 - -Config directory -== 구성 폴더 - -Themes directory -== 테마 폴더 - -Automatically take statboard screenshot -== 자동으로 통계표 스크린샷 저장 - -Automatically create statboard csv -== 자동으로 통계표 csv 파일 생성 - -Max CSVs -== 최대 CSV 파일 수 - -Download skins -== 스킨 다운로드 - -Vanilla skins only -== 원판 스킨만 표시 - -Fat skins (DDFat) -== 살찐 스킨 (DDFat) - -Skin prefix -== 스킨 접두사 - -Skin Database -== 스킨 데이터베이스 - -Skins directory -== 스킨 폴더 - -Hook collisions -== 갈고리 보조선 - -Zoom in -== 시야 확장 - -Zoom out -== 시야 축소 - -Default zoom -== 기본 시야 - -Show others -== 다른 플레이어 표시 - -Show all -== 모든 플레이어 표시 - -Toggle dyncam -== 다이나믹캠 전환 - -Toggle dummy -== 더미 전환 - -Toggle ghost -== 고스트 표시 - -Dummy copy -== 더미 동시동작 - -Hammerfly dummy -== 해머플라이 더미 - -Converse -== 비밀대화 지속 - -Statboard -== 통계표 - -Lock team -== 팀 잠금 - -Show entities -== 엔티티 표시 - -Show HUD -== HUD 표시 - -Chat command -== 채팅 명령어 - -Dummy -== 더미 - -Windowed -== 창 모드 - -Windowed borderless -== 창 모드 테두리 없음 - -Windowed fullscreen -== 창 모드 전체화면 - -Desktop fullscreen -== 데스크탑 전체화면 - -may cause delay -== 딜레이 현상 발생 가능 - -Screen -== 화면 - -Use high DPI -== 높은 DPI 사용 - -Enable game sounds -== 게임 소리 활성화 - -Enable gun sound -== 총 소리 활성화 - -Enable long pain sound (used when shooting in freeze) -== 동결 상태 비명 활성화 - -Enable server message sound -== 서버 메시지 소리 활성화 - -Enable regular chat sound -== 일반 채팅 소리 활성화 - -Enable team chat sound -== 팀 채팅 소리 활성화 - -Enable highlighted chat sound -== 언급된 채팅 소리 활성화 - -Game sound volume -== 게임 음량 - -Chat sound volume -== 채팅 음량 - -Map sound volume -== 맵 음량 - -Background music volume -== 배경 음악 음량 - -HUD -== HUD - -DDNet -== DDNet - -Assets -== 에셋 - -DDNet Client needs to be restarted to complete update! -== 업데이트 완료를 위해 DDNet 클라이언트 재시작이 필요합니다! - -Show score -== 점수 표시 - -Show names in chat in team colors -== 이름을 팀 색상으로 표시 - -Show votes window after voting -== 투표 후에도 투표 창 표시 - -Show kill messages -== 킬 메시지 표시 - -Use old chat style -== 구식 채팅 방식 사용 - -Messages -== 메시지 - -System message -== 시스템 메시지 - -Highlighted message -== 언급된 메시지 - -Team message -== 팀 메시지 - -Friend message -== 친구가 보낸 메시지 - -Normal message -== 일반 메시지 - -Client message -== 클라이언트 메시지 - -Preview -== 미리보기 - -Save the best demo of each race -== 레이스 최고 기록의 데모를 저장 - -Default length -== 기본 길이 - -Enable replays -== 리플레이 활성화 - -Show ghost -== 고스트 표시 - -Save ghost -== 고스트 저장 - -Gameplay -== 게임 플레이 - -Overlay entities -== 엔티티 중첩 표시 - -Size -== 크기 - -Show text entities -== 문자 엔티티 표시 - -Show others (own team only) -== 팀 내의 다른 플레이어 표시 - -Show quads -== 배경 표시 - -AntiPing -== 안티 핑 - -AntiPing: predict other players -== 안티 핑: 다른 플레이어 예측 - -AntiPing: predict weapons -== 안티 핑: 무기 예측 - -AntiPing: predict grenade paths -== 안티 핑: 유탄 궤적 예측 - -Show other players' hook collision lines -== 다른 플레이어의 갈고리 보조선 표시 - -Show other players' key presses -== 다른 플레이어의 키 입력 표시 - -Show local player's key presses -== 주변 플레이어의 키 입력 표시 - -Background -== 배경 - -Use current map as background -== 현재 맵을 배경으로 사용 - -Show tiles layers from BG map -== 배경 맵의 타일 레이어 표시 - -New random timeout code -== 새로운 무작위 타임아웃 코드 생성 - -Run on join -== 참가 시 실행 - -Chat command (e.g. showall 1) -== 채팅 명령어 (예시: showall 1) - -DDNet %s is available: -== DDNet %s 사용 가능: - -Update now -== 지금 업데이트하기 - -Updating… -== 업데이트 중… - -DDNet Client updated! -== DDNet 클라이언트가 업데이트되었습니다! - -No updates available -== 현재 업데이트 사항 없음 - -Check now -== 지금 확인 - -Entities -== 엔티티 - -Emoticons -== 이모티콘 - -Particles -== 파티클 - -Assets directory -== 에셋 폴더 - -Discord -== 디스코드 - -https://ddnet.org/discord -== https://ddnet.org/discord - -Learn -== 학습터 - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/wiki/Main_Page/ko - -Website -== 웹사이트 - -Settings -== 설정 - -Stop server -== 서버 정지 - -Run server -== 서버 시작 - -Server executable not found, can't run server -== 서버 실행 파일을 찾을 수 없어, 서버를 구동할 수 없습니다. - -Editor -== 맵 편집기 - -[Start menu] -Play -== 플레이 - -DDNet %s is out! -== DDNet %s 이 공개되었습니다! - -Downloading %s: -== %s 다운로드 중: - -Update failed! Check log… -== 업데이트 실패! 로그를 확인해 주십시오… - -Restart -== 재시작 - -Manual -== 수동 - -Race -== 레이스 - -Auto -== 자동 - -Replay -== 리플레이 - -Follow -== 팔로우 - -Frags -== 처치 - -Deaths -== 사망 - -Suicides -== 자살 - -Ratio -== 처치율 - -Net -== 순처치 - -FPM -== 처치/분 - -Spree -== 연속 - -Best -== 최고 - -Grabs -== 획득 - -1 new mention -== 1 건의 새 언급 - -%d new mentions -== %d 건의 새 언급 - -9+ new mentions -== 9+ 건의 새 언급 - -The format of texture %s is not RGBA which will cause visual bugs. -== 텍스처 %s 의 형식이 RGBA가 아닙니다. 이는 시각적 오류를 발생시킬 것입니다. - -Join Tutorial Server -== 튜토리얼 서버 입장 - -Skip Tutorial -== 튜토리얼 건너뛰기 - -AFR -== 아프리카 - -ASI -== 아시아 - -AUS -== 호주 - -EUR -== 유럽 - -NA -== 북미 - -SA -== 남미 - -CHN -== 중국 - -%.2f MiB -== %.2f MiB - -%.2f KiB -== %.2f KiB - -Renderer -== 렌더러 - -default -== 기본 - -custom -== 커스텀 - -auto -== 자동 - -Tutorial -== 튜토리얼 - -Can't find a Tutorial server -== 튜토리얼 서버를 찾을 수 없음 - -Choose default eyes when joining a server -== 서버 입장 시의 기본 눈을 선택합니다. - -Allows maps to render with more detail -== 맵의 세부사항을 렌더링합니다. - -When you cross the start line, show a ghost tee replicating the movements of your best time -== 출발선을 넘으면 당신의 최고 기록을 재현하는 고스트 Tee가 표시됩니다. - -Opacity -== 불투명도 - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Tee와 이름 표시 등 다른 팀에 속한 엔티티의 불투명도를 조정합니다. - -Quads are used for background decoration -== 맵 배경을 표시합니다. - -Tries to predict other entities to give a feel of low latency -== 다른 엔티티를 예측해 지연 시간을 줄입니다. - -Super -== 무적 - -Team %d -== 팀 %d - -Position: -== 위치 - -Speed: -== 속도 - -Angle: -== 각도 - -Trying to determine UDP connectivity… -== UDP 연결 확인 시도 중… - -UDP seems to be filtered. -== UDP가 필터링된 것으로 보입니다. - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== UDP와 TCP의 IP 주소가 다른 것으로 보입니다. VPN, 프록시 또는 네트워크 가속기를 비활성화하십시오. - -No answer from server yet. -== 서버로부터 응답이 아직 없습니다. - -Download community skins -== 커뮤니티 스킨 다운로드 - -Enable controller -== 컨트롤러 활성화 - -[Ingame controller mode] -Relative -== 상대적 - -[Ingame controller mode] -Absolute -== 절대적 - -Ingame controller mode -== 게임 내 컨트롤러 모드 - -Ingame controller sens. -== 게임 내 컨트롤러 감도 - -UI controller sens. -== UI 컨트롤러 감도 - -Controller jitter tolerance -== 컨트롤러 신호 오차 허용 범위 - -Status -== 상태 - -Aim bind -== 조준 바인드 - -Mouse -== 마우스 - -Ingame mouse sens. -== 게임 내 마우스 감도 - -UI mouse sens. -== UI 마우스 감도 - -Controller -== 컨트롤러 - -Show dummy actions -== 더미 동작 표시 - -Show freeze bars -== 동결 상태줄 표시 - -Show player position -== 플레이어 위치 표시 - -Show player speed -== 플레이어 속도 표시 - -Show player target angle -== 플레이어 조준 각도 표시 - -Opacity of freeze bars inside freeze -== 동결 타일 내에서의 동결 상태줄 불투명도 - -Normal Color -== 일반 메시지 색상 - -Highlight Color -== 강조 메시지 색상 - -Extras -== 기타 - -Preparing demo playback -== 데모 재생 준비 중 - -Connected -== 연결됨 - -Loading map file from storage -== 저장공간에서 맵 파일 로딩 중 - -Why are you slowmo replaying to read this? -== 왜 이것을 슬로우 모션으로 보려고 하십니까? - -Initializing components -== 구성요소 초기화 중 - -Initializing assets -== 에셋 초기화 중 - -Initializing map logic -== 맵 로직 초기화 중 - -Sending initial client info -== 초기 클라이언트 정보 전송 중 - -Uploading map data to GPU -== 맵 데이터를 GPU에 업로드 중 - -Getting game info -== 게임 정보 가져오는 중 - -Requesting to join the game -== 게임 참가 요청 중 - -Loading menu images -== 메뉴 이미지 로딩 중 - -Loading demo files -== 데모 파일 로딩 중 - -Loading ghost files -== 고스트 파일 로딩 중 - -Loading skin files -== 스킨 파일 로딩 중 - -Appearance -== 표시 - -Name Plate -== 이름 표시 - -Hook Collisions -== 갈고리 보조선 - -Show health, shields and ammo -== 체력과 방패, 탄약 표시 - -DDRace HUD -== DDRace HUD - -Show DDRace HUD -== DDRace HUD 표시 - -Show jumps indicator -== 점프 상태 표시 - -Hook collision line -== 갈고리 보조선 - -Hook collision line opacity -== 갈고리 보조선 불투명도 - -Colors of the hook collision line, in case of a possible collision with: -== 갈고리 보조선 색상: - -Your movements are not taken into account when calculating the line colors -== 움직임은 색상 추정에 고려되지 않습니다. - -Nothing hookable -== 갈고리 불가 - -Something hookable -== 갈고리 가능 - -A Tee -== Tee 대상 - -Loading assets -== 에셋 로딩 중 - -Loading race demo files -== 레이스 데모 파일 로딩 중 - -Loading sound files -== 소리 파일 로딩 중 - -Play the current demo -== 데모 재생 - -Pause the current demo -== 데모 일시정지 - -Stop the current demo -== 데모 정지 - -Slow down the demo -== 데모 속도 낮추기 - -Speed up the demo -== 데모 속도 높이기 - -Export cut as a separate demo -== 자른 부분을 다른 이름으로 저장 - -Toggle keyboard shortcuts -== 키보드 단축키 사용 선택 - -Weapons -== 무기 - -Rifle Laser Outline Color -== 소총 레이저 테두리 색상 - -Rifle Laser Inner Color -== 소총 레이저 광선 색상 - -Shotgun Laser Outline Color -== 산탄총 레이저 테두리 색상 - -Shotgun Laser Inner Color -== 산탄총 레이저 광선 색상 - -Door Laser Outline Color -== 문 레이저 테두리 색상 - -Door Laser Inner Color -== 문 레이저 광선 색상 - -Freeze Laser Outline Color -== 동결 레이저 테두리 색상 - -Freeze Laser Inner Color -== 동결 레이저 광선 색상 - -Menu opened. Press Esc key again to close menu. -== 메뉴가 열려 있습니다. Esc 키를 눌러 닫을 수 있습니다. - -Set all to Rifle -== 소총 색상으로 통일 - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== 초기화에 실패했습니다. 구성 폴더의 settings_ddnet.cfg에서 gfx_backend를 OpenGL 또는 Vulkan으로 변경 후 재시도하십시오. - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== VRAM이 부족합니다. 사용자 정의 에셋(스킨, 엔티티 등), 특히 고해상도 에셋을 제거해 보십시오. - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== 명령 기록 중 오류가 발생했습니다. GPU 드라이버를 업데이트해 보십시오. - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== 렌더링 명령에 실패했습니다. GPU 드라이버를 업데이트해 보십시오. - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== 렌더링 명령 제출에 실패했습니다. GPU 드라이버를 업데이트해 보십시오. - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== 프레임버퍼 교환에 실패했습니다. GPU 드라이버를 업데이트해 보십시오. - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== 알 수 없는 오류가 발생했습니다. 구성 폴더의 settings_ddnet.cfg에서 gfx_backend를 OpenGL 또는 Vulkan으로 변경 후 재시도하십시오. - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== 지정된 그래픽 백엔드를 초기화하지 못했습니다. 기본 백엔드로 되돌립니다. - -Cancel -== 취소 - -File '%s' already exists, do you want to overwrite it? -== 파일 '%s' 이 이미 존재합니다. 덮어쓰기하시겠습니까? - -Are you sure that you want to remove the player '%s' from your friends list? -== '%s' 님을 친구 목록에서 제거하시겠습니까? - -Are you sure that you want to remove the clan '%s' from your friends list? -== '%s' 클랜을 친구 목록에서 제거하시겠습니까? - -Go back one tick -== 1 틱 뒤로 이동 - -Go forward one tick -== 1 틱 앞으로 이동 - -Go back one marker -== 이전 마커로 이동 - -Go forward one marker -== 다음 마커로 이동 - -Open the directory that contains the demo files -== 데모 파일이 있는 폴더를 엽니다. - -Are you sure that you want to delete the demo '%s'? -== 데모 '%s' 을 삭제하시겠습니까? - -Unable to delete the demo '%s' -== 데모 '%s' 을 삭제할 수 없음 - -Save power by lowering refresh rate (higher input latency) -== 화면 주사율을 낮춰 전력 절약 (입력 지연 증가) - -Open the settings file -== 설정 파일을 엽니다. - -Open the directory that contains the configuration and user files -== 구성 파일과 사용자 파일이 있는 폴더를 엽니다. - -Open the directory to add custom themes -== 사용자 정의 테마를 추가할 폴더를 엽니다. - -Open the directory to add custom skins -== 사용자 정의 스킨을 추가할 폴더를 엽니다. - -No controller found. Plug in a controller. -== 컨트롤러가 발견되지 않았습니다. 컨트롤러를 연결해 주십시오. - -Reset controls -== 조작 초기화 - -Are you sure that you want to reset the controls to their defaults? -== 조작 설정을 초기화하시겠습니까? - -Unregister protocol and file extensions -== 프로토콜과 파일 확장자 등록 해제 - -Open the directory to add custom assets -== 사용자 정의 에셋을 추가할 폴더를 엽니다. - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== 지정된 그래픽 백엔드를 초기화하지 못했습니다. 통합 그래픽 카드 드라이버가 설치되지 않은 것이 원인일 수 있습니다. - -Could not save downloaded map. Try manually deleting this file: %s -== 다운로드한 맵을 저장하지 못했습니다. 다음 파일을 삭제해 보십시오: %s - -Copy info -== 정보 복사 - -Create a random skin -== 무작위 스킨 생성 - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not connect dummy -== - -Error playing demo -== - -Failed saving the replay! -== - -Saving settings to '%s' failed -== - -Error saving settings -== - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Loading demo file from storage -== - -Some fonts could not be loaded. Check the local console for details. -== - -Quitting. Please wait… -== - -Restarting. Please wait… -== - -Loading background map -== - -Searching -== - -Enter Username -== - -Enter Password -== - -NOT CONNECTED -== - -Match %d of %d -== - -No results -== - -Lines %d - %d (%s) -== - -Locked -== - -Following -== - -Loading commands… -== - -Multi-View -== - -[Spectating] -Following %s -== - -[Spectating Camera Mode Icon] -AUTO -== - -Some map images could not be loaded. Check the local console for details. -== - -Some map sounds could not be loaded. Check the local console for details. -== - -Loading menu themes -== - -Press a key… -== - -Main menu -== - -Rename folder -== - -Render complete -== - -Are you sure that you want to restart? -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -There's an unsaved map in the editor, you might want to save it. -== - -Continue anyway? -== - -A demo with this name already exists -== - -A folder with this name already exists -== - -Unable to rename the folder -== - -(paused) -== - -Videos directory -== - -Video was saved to '%s' -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -%d/%d KiB (%.1f KiB/s) -== - -No local servers found (ports %d-%d) -== - -Example of usage -== - -No login required -== - -Communities -== - -No server selected -== - -Online friends (%d) -== - -Online clanmates (%d) -== - -[friends (server browser)] -Offline (%d) -== - -Click to select server. Double click to join your friend. -== - -Click to remove this player from your friends list. -== - -Click to remove this clan from your friends list. -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Add Clan -== - -Server filter -== - -Friends -== - -Go back the specified duration -== - -[Demo player duration] -%d min. -== - -[Demo player duration] -%d sec. -== - -Change the skip duration -== - -Go forward the specified duration -== - -Mark the beginning of a cut (right click to reset) -== - -Mark the end of a cut (right click to reset) -== - -Close the demo player -== - -Toggle auto camera -== - -Export demo cut -== - -Cut interval -== - -Cut length -== - -Render cut to video -== - -Please use a different filename -== - -All combined -== - -No demo selected -== - -Folder Link -== - -Created -== - -Netversion -== - -[Demo details] -map not included -== - -Are you sure that you want to delete the folder '%s'? -== - -Delete folder -== - -Unable to delete the folder '%s'. Make sure it's empty first. -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Loading… -== - -Ghosts directory -== - -Activate all -== - -Deactivate all -== - -[Hertz] -Hz -== - -Player info change cooldown -== - -Axis -== - -Graphics card -== - -Tee -== - -Info Messages -== - -Show local time always -== - -Authed name color in scoreboard -== - -Same clan color in scoreboard -== - -Show client IDs (scoreboard, chat, spectator) -== - -Always show chat -== - -Show only chat messages from team members -== - -Chat font size -== - -Chat width -== - -Show friend mark (♥) in name plates -== - -Show client IDs in name plates -== - -Hook Strength -== - -Show hook strength icon indicator -== - -Show hook strength number indicator -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Show own player's hook collision line -== - -Always show own player's hook collision line -== - -Always show other players' hook collision lines -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Preview 'Hook collisions' being pressed -== - -Show finish messages -== - -Enable ghost -== - -Only save improvements -== - -Regular background color -== - -Entities background color -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Round %d/%d -== - -[Spectators] -%d others… -== - -[Team and size] -%d\n(%d/%d) -== - -Team %d (%d/%d) -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -Moved ingame -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/kyrgyz.txt b/data/languages/kyrgyz.txt deleted file mode 100644 index 420f3ec211..0000000000 --- a/data/languages/kyrgyz.txt +++ /dev/null @@ -1,2064 +0,0 @@ -##### translated strings ##### - -%ds left -== %d сек. калды - -%i minute left -== %i минута калды! - -%i minutes left -== %i минута калды! - -%i second left -== %i секунда калды! - -%i seconds left -== %i секунда калды! - -%s wins! -== %s утту! - -Abort -== Жокко чыгаруу - -Add -== Кошуу - -Add Friend -== Досту кошуу - -Address -== Дареги - -All -== Баары - -Alpha -== Тунук. - -Are you sure that you want to quit? -== Сиз чын эле оюндан чыгууну каалайсызбы? - -Automatically record demos -== Демону автоматтуу түрдө жаздыруу - -Automatically take game over screenshot -== Оюн натыйжаларын сүрөткө тартуу - -Blue team -== Көктөр - -Blue team wins! -== Көктөр утту! - -Body -== Дене - -Call vote -== Добуш берүү - -Change settings -== Ырастоолорду өзгөртүү - -Chat -== Маек - -Clan -== Кланы - -Client -== Клиент - -Connecting to -== Туташтырылууда - -Connection Problems… -== Байланыш көйгөйлөрү… - -Console -== Консоль - -Controls -== Башкаруу - -Count players only -== Оюнчуларды гана саноо - -Current -== Кезектегиси - -Custom colors -== Өз түстөрүңүз - -Delete -== Өчүрүү - -Delete demo -== Демону өчүрүү - -Demofile: %s -== Демофайлы: %s - -Demos -== Демолор - -Disconnect -== Өчүрүү - -Disconnected -== Өчүрүлдү - -Downloading map -== Карта жүктөөлүүдө - -Draw! -== Тең! - -Dynamic Camera -== Динамикалык камера - -Emoticon -== Эмоциялар - -Error -== Ката - -Error loading demo -== Демону жүктөө учурундагы ката - -FSAA samples -== FSAA сэмплдери - -Favorite -== Тандалма - -Favorites -== Тандалмалар - -Feet -== Бут - -Fire -== Атуу - -Folder -== Папка - -Force vote -== Тездетүү - -Free-View -== Эркин сереп - -Fullscreen -== Толук экран - -Game -== Оюн - -Game info -== Оюн жөнүндө - -Game over -== Оюн бүттү - -Game type -== Оюн түрү - -Game types: -== Оюн түрү: - -General -== Негизги - -Graphics -== Графика - -Grenade -== Гранатомёт - -Hammer -== Барскан - -Has people playing -== Бош эмес сервер - -High Detail -== Жогорку деталдаштыруу - -Hook -== Илмек - -Hue -== Түсү - -Internet -== Интернет - -Invalid Demo -== Жарабаган демо - -Join blue -== Көктөргө - -Join game -== Ойноо - -Join red -== Кызылдарга - -Jump -== Секирүү - -Kick player -== Оюнчуну чыгаруу - -LAN -== LAN - -Language -== Тил - -Lht. -== Ач. түс. - -MOTD -== Күндүн билдирүүсү - -Map -== Картасы - -Max Screenshots -== Сүрөттөрдүн жогорку чеги - -Max demos -== Демолордун жогорку чеги - -Miscellaneous -== Кошумча - -Move left -== Солго басуу - -Move player to spectators -== Оюнчуну байкоочуларга ташуу - -Move right -== Оңго басуу - -Movement -== Аракет - -Mute when not active -== Активдүү эмес кезде үндү өчүрүү - -Name -== Аты - -Name plates size -== Ат көрнөкчөлөрдүн өлчөмү - -New name: -== Жаңы аты: - -News -== Жаңылыктар - -Next weapon -== Кийин. курал - -Nickname -== Такма атыңыз - -No -== Жок - -No password -== Сырсөзсүз - -No servers found -== Серверлер табылган жок - -No servers match your filter criteria -== Сиздин фильтриңизге жарай турган серверлер жок - -Ok -== ОК - -Parent Folder -== Ата-энелик каталог - -Password -== Сырсөзү - -Password incorrect -== Сырсөз - -Ping -== Пинги - -Pistol -== Тапанча - -Play background music -== Фон музыкасын ойнотуу - -Player -== Оюнчу - -Player country: -== Өлкөсү: - -Players -== Оюнчулар - -Please balance teams! -== Команадаларды баланстаңыз! - -Prev. weapon -== Мурун. курал - -Quit -== Чыгуу - -Reason: -== Себеби: - -Record demo -== Демо жаздыруу - -Red team -== Кызылдар - -Red team wins! -== Кызылдар утту! - -Remote console -== Алыскы консоль - -Remove -== Өчүрүү - -Remove friend -== Досту өчүрүү - -Rename demo -== Демо атын өзгөртүү - -Reset filter -== Фильтрлерди түшүрүү - -Reset to defaults -== Жарыяланбаска түшүрүү - -Laser -== Бластер - -Sat. -== Канык. - -Score -== Упайы - -Score limit -== Упай чеги - -Scoreboard -== Табло - -Screenshot -== Сүрөт - -Server address: -== Сервер дареги: - -Server info -== Маалымат - -Server not full -== Сервер толук эмес - -Shotgun -== Мылтык - -Show chat -== Маекти көрсөтүү - -Show friends only -== Достор менен гана - -Show ingame HUD -== Оюн ичиндеги HUD'ни көрсөтүү - -Show name plates -== Оюнчулардын аттарын көрсөтүү - -Sound -== Үн - -Sound error -== Үн катасы - -Sound volume -== Үн көлөмү - -Spectate -== Байкоо - -Spectate next -== Кийин. байкоо - -Spectate previous -== Мурун. байкоо - -Spectator mode -== Байкоочу - -Spectators -== Байкоочулар - -Stop record -== Токтотуу - -Strict gametype filter -== Оюн түрүнүн так фильтри - -Sudden Death -== Тез өлүм - -Switch weapon on pickup -== Көтөрүлгөн куралга которуу - -Team -== Команда - -Team chat -== Команда маеги - -The audio device couldn't be initialised. -== Аудио түзмөгүн инициализациялап алууга мүмкүн эмес. - -The server is running a non-standard tuning on a pure game type. -== Бул сервер стандартту эмес ырастоолор менен таза оюн түрүндө иштеп жатат. - -Time limit -== Убакыт чеги - -Time limit: %d min -== Убакыт чеги: %d мин. - -Try again -== ОК - -Type -== Түрү - -UI Color -== Интерфейс түсү - -Unable to rename the demo -== Демо атын өзгөртүү мүмкүн эмес - -Use sounds -== Үндөрдү колдонуу - -Use team colors for name plates -== Аттар үчүн команданын түсүн колдонуу - -V-Sync -== Тик синхрондоштуруусу - -Version -== Версиясы - -Vote command: -== Добуш коммандасы: - -Vote description: -== Добуш баяндамасы: - -Vote no -== Каршы - -Vote yes -== Макул - -Voting -== Добуш берүү - -Warmup -== Даярдануу - -Weapon -== Курал - -Yes -== Ооба - -You must restart the game for all settings to take effect. -== Өзгөртүүлөрдү колдонуу үчүн оюнду кайта жүргүзүңүз. - -Your skin -== Териңиз - -Game paused -== Оюн бир азга токтотулду - -Show only chat messages from friends -== Достордун гана маек билдирүүлөрүн көрсөтүү - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not save downloaded map. Try manually deleting this file: %s -== - -Could not connect dummy -== - -Error playing demo -== - -Successfully saved the replay! -== - -Failed saving the replay! -== - -Saving settings to '%s' failed -== - -Error saving settings -== - -Replay feature is disabled! -== - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -The format of texture %s is not RGBA which will cause visual bugs. -== - -Preparing demo playback -== - -Connected -== - -Loading map file from storage -== - -Loading demo file from storage -== - -Some fonts could not be loaded. Check the local console for details. -== - -Loading DDNet Client -== - -Initializing components -== - -Why are you slowmo replaying to read this? -== - -Initializing assets -== - -Initializing map logic -== - -Sending initial client info -== - -Warning -== - -Quitting. Please wait… -== - -Restarting. Please wait… -== - -Loading skin files -== - -Search -== - -Loading background map -== - -Searching -== - -Enter Username -== - -Enter Password -== - -NOT CONNECTED -== - -Match %d of %d -== - -No results -== - -Lines %d - %d (%s) -== - -Locked -== - -Following -== - -Loading commands… -== - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== - -Position: -== - -Speed: -== - -Angle: -== - -Multi-View -== - -[Spectating] -Following %s -== - -[Spectating Camera Mode Icon] -AUTO -== - -Server best: -== - -Personal best: -== - -Team %d -== - -Some map images could not be loaded. Check the local console for details. -== - -Uploading map data to GPU -== - -Some map sounds could not be loaded. Check the local console for details. -== - -Loading menu themes -== - -Reset -== - -Press a key… -== - -Settings -== - -Editor -== - -Main menu -== - -Browser -== - -Ghost -== - -Reconnect in %d sec -== - -Rename folder -== - -Render demo -== - -Render complete -== - -Restart -== - -Are you sure that you want to restart? -== - -Welcome to DDNet -== - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== - -Please enter your nickname below. -== - -Existing Player -== - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== - -Checking for existing player with your name -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -There's an unsaved map in the editor, you might want to save it. -== - -Continue anyway? -== - -A demo with this name already exists -== - -A folder with this name already exists -== - -Unable to rename the folder -== - -File '%s' already exists, do you want to overwrite it? -== - -Replace video -== - -(paused) -== - -Speed -== - -Video name: -== - -Videos directory -== - -Video was saved to '%s' -== - -Join Tutorial Server -== - -Skip Tutorial -== - -Show DDNet map finishes in server browser -== - -transmits your player name to info.ddnet.org -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -Trying to determine UDP connectivity… -== - -UDP seems to be filtered. -== - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== - -No answer from server yet. -== - -%d/%d KiB (%.1f KiB/s) -== - -Getting game info -== - -Requesting to join the game -== - -Theme -== - -Loading menu images -== - -AFR -== - -ASI -== - -AUS -== - -EUR -== - -NA -== - -SA -== - -CHN -== - -Getting server list from master server -== - -No local servers found (ports %d-%d) -== - -Example of usage -== - -Exclude -== - -%d of %d servers -== - -%d of %d server -== - -%d players -== - -%d player -== - -Are you sure that you want to disconnect and switch to a different server? -== - -No login required -== - -Filter connecting players -== - -Indicate map finish -== - -Unfinished map -== - -Countries -== - -Types -== - -Communities -== - -Copy info -== - -Leak IP -== - -No server selected -== - -Online friends (%d) -== - -Online clanmates (%d) -== - -[friends (server browser)] -Offline (%d) -== - -Click to select server. Double click to join your friend. -== - -Click to remove this player from your friends list. -== - -Click to remove this clan from your friends list. -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Are you sure that you want to remove the player '%s' from your friends list? -== - -Are you sure that you want to remove the clan '%s' from your friends list? -== - -Add Clan -== - -Server filter -== - -Friends -== - -Play the current demo -== - -Pause the current demo -== - -Stop the current demo -== - -Go back the specified duration -== - -[Demo player duration] -%d min. -== - -[Demo player duration] -%d sec. -== - -Change the skip duration -== - -Go forward the specified duration -== - -Go back one tick -== - -Go forward one tick -== - -Go back one marker -== - -Go forward one marker -== - -Slow down the demo -== - -Speed up the demo -== - -Mark the beginning of a cut (right click to reset) -== - -Mark the end of a cut (right click to reset) -== - -Export cut as a separate demo -== - -Close the demo player -== - -Toggle keyboard shortcuts -== - -Toggle auto camera -== - -Export demo cut -== - -Cut interval -== - -Cut length -== - -Remove chat -== - -Render cut to video -== - -Please use a different filename -== - -File already exists, do you want to overwrite it? -== - -Loading demo files -== - -All combined -== - -Demo -== - -Length -== - -Date -== - -No demo selected -== - -Folder Link -== - -Created -== - -Markers -== - -Netversion -== - -Size -== - -[Demo details] -map not included -== - -%.2f MiB -== - -%.2f KiB -== - -Fetch Info -== - -Demos directory -== - -Open the directory that contains the demo files -== - -Are you sure that you want to delete the folder '%s'? -== - -Are you sure that you want to delete the demo '%s'? -== - -Delete folder -== - -Unable to delete the demo '%s' -== - -Unable to delete the folder '%s'. Make sure it's empty first. -== - -Are you sure that you want to disconnect? -== - -Connect Dummy -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Connecting dummy -== - -Disconnect Dummy -== - -Are you sure that you want to disconnect your dummy? -== - -Kill -== - -Pause -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Loading… -== - -Loading ghost files -== - -Time -== - -Ghosts directory -== - -Activate all -== - -Deactivate all -== - -Deactivate -== - -Activate -== - -Save -== - -Menu opened. Press Esc key again to close menu. -== - -Smooth Dynamic Camera -== - -Switch weapon when out of ammo -== - -Skip the main menu -== - -[Hertz] -Hz -== - -Refresh Rate -== - -Save power by lowering refresh rate (higher input latency) -== - -Settings file -== - -Open the settings file -== - -Config directory -== - -Open the directory that contains the configuration and user files -== - -Themes directory -== - -Open the directory to add custom themes -== - -Automatically take statboard screenshot -== - -Automatically create statboard csv -== - -Max CSVs -== - -Dummy -== - -Player info change cooldown -== - -Download skins -== - -Download community skins -== - -Vanilla skins only -== - -Fat skins (DDFat) -== - -Skin prefix -== - -Create a random skin -== - -Choose default eyes when joining a server -== - -Skin Database -== - -Skins directory -== - -Open the directory to add custom skins -== - -Hook collisions -== - -Zoom in -== - -Zoom out -== - -Default zoom -== - -Show others -== - -Show all -== - -Toggle dyncam -== - -Toggle ghost -== - -Converse -== - -Chat command -== - -Toggle dummy -== - -Dummy copy -== - -Hammerfly dummy -== - -Statboard -== - -Lock team -== - -Show entities -== - -Show HUD -== - -Enable controller -== - -Controller -== - -Ingame controller mode -== - -[Ingame controller mode] -Relative -== - -[Ingame controller mode] -Absolute -== - -Ingame controller sens. -== - -UI controller sens. -== - -Controller jitter tolerance -== - -No controller found. Plug in a controller. -== - -Axis -== - -Status -== - -Aim bind -== - -Mouse -== - -Ingame mouse sens. -== - -UI mouse sens. -== - -Reset controls -== - -Are you sure that you want to reset the controls to their defaults? -== - -Cancel -== - -Windowed -== - -Windowed borderless -== - -Windowed fullscreen -== - -Desktop fullscreen -== - -Screen -== - -may cause delay -== - -Allows maps to render with more detail -== - -Use high DPI -== - -Renderer -== - -default -== - -custom -== - -Graphics card -== - -auto -== - -Enable game sounds -== - -Enable gun sound -== - -Enable long pain sound (used when shooting in freeze) -== - -Enable server message sound -== - -Enable regular chat sound -== - -Enable team chat sound -== - -Enable highlighted chat sound -== - -Game sound volume -== - -Chat sound volume -== - -Map sound volume -== - -Background music volume -== - -Tee -== - -Appearance -== - -DDNet -== - -Assets -== - -DDNet Client needs to be restarted to complete update! -== - -HUD -== - -Name Plate -== - -Hook Collisions -== - -Info Messages -== - -Show health, shields and ammo -== - -Show score -== - -Show local time always -== - -Show votes window after voting -== - -Authed name color in scoreboard -== - -Same clan color in scoreboard -== - -DDRace HUD -== - -Show client IDs (scoreboard, chat, spectator) -== - -Show DDRace HUD -== - -Show jumps indicator -== - -Show dummy actions -== - -Show player position -== - -Show player speed -== - -Show player target angle -== - -Show freeze bars -== - -Opacity of freeze bars inside freeze -== - -Always show chat -== - -Show names in chat in team colors -== - -Show only chat messages from team members -== - -Use old chat style -== - -Chat font size -== - -Chat width -== - -Messages -== - -System message -== - -Highlighted message -== - -Team message -== - -Friend message -== - -Normal message -== - -Client message -== - -Preview -== - -Show clan above name plates -== - -Clan plates size -== - -Show friend mark (♥) in name plates -== - -Show client IDs in name plates -== - -Hook Strength -== - -Show hook strength icon indicator -== - -Show hook strength number indicator -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Show other players' key presses -== - -Show local player's key presses -== - -Size of key press icons -== - -Hook collision line -== - -Show own player's hook collision line -== - -Always show own player's hook collision line -== - -Show other players' hook collision lines -== - -Always show other players' hook collision lines -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Hook collision line opacity -== - -Colors of the hook collision line, in case of a possible collision with: -== - -Your movements are not taken into account when calculating the line colors -== - -Nothing hookable -== - -Something hookable -== - -A Tee -== - -Preview 'Hook collisions' being pressed -== - -Show kill messages -== - -Show finish messages -== - -Normal Color -== - -Highlight Color -== - -Weapons -== - -Rifle Laser Outline Color -== - -Rifle Laser Inner Color -== - -Shotgun Laser Outline Color -== - -Shotgun Laser Inner Color -== - -Entities -== - -Door Laser Outline Color -== - -Door Laser Inner Color -== - -Freeze Laser Outline Color -== - -Freeze Laser Inner Color -== - -Set all to Rifle -== - -Save the best demo of each race -== - -Enable replays -== - -Default length -== - -Enable ghost -== - -When you cross the start line, show a ghost tee replicating the movements of your best time -== - -Show ghost -== - -Opacity -== - -Save ghost -== - -Only save improvements -== - -Gameplay -== - -Overlay entities -== - -Show text entities -== - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== - -Show others (own team only) -== - -Show quads -== - -Quads are used for background decoration -== - -AntiPing -== - -Tries to predict other entities to give a feel of low latency -== - -AntiPing: predict other players -== - -AntiPing: predict weapons -== - -AntiPing: predict grenade paths -== - -Background -== - -Regular background color -== - -Entities background color -== - -Use current map as background -== - -Show tiles layers from BG map -== - -New random timeout code -== - -Run on join -== - -Chat command (e.g. showall 1) -== - -Unregister protocol and file extensions -== - -DDNet %s is available: -== - -Update now -== - -Updating… -== - -DDNet Client updated! -== - -No updates available -== - -Check now -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Emoticons -== - -Particles -== - -Extras -== - -Loading assets -== - -Assets directory -== - -Open the directory to add custom assets -== - -Discord -== - -https://ddnet.org/discord -== - -Learn -== - -https://wiki.ddnet.org/ -== - -Tutorial -== - -Can't find a Tutorial server -== - -Website -== - -Stop server -== - -Run server -== - -[Start menu] -Play -== - -DDNet %s is out! -== - -Downloading %s: -== - -Update failed! Check log… -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Server executable not found, can't run server -== - -Loading race demo files -== - -Round %d/%d -== - -[Spectators] -%d others… -== - -Super -== - -[Team and size] -%d\n(%d/%d) -== - -Team %d (%d/%d) -== - -Manual -== - -Race -== - -Auto -== - -Replay -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Loading sound files -== - -Follow -== - -Frags -== - -Deaths -== - -Suicides -== - -Ratio -== - -Net -== - -FPM -== - -Spree -== - -Best -== - -Grabs -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -1 new mention -== - -%d new mentions -== - -9+ new mentions -== - -Moved ingame -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/license.txt b/data/languages/license.txt deleted file mode 100644 index 14de607c72..0000000000 --- a/data/languages/license.txt +++ /dev/null @@ -1,2 +0,0 @@ -All content is released under CC-BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0/). -Information about the authors can be found within the according file. diff --git a/data/languages/norwegian.txt b/data/languages/norwegian.txt deleted file mode 100644 index 42d76f318c..0000000000 --- a/data/languages/norwegian.txt +++ /dev/null @@ -1,2075 +0,0 @@ -##### authors ##### -#originally created by: -# MertenNor -#modified by: -# MertenNor 2011-07-02 08:46:16 -# nuborn 2020-08-31 23:00:00 -# nuborn 2020-11-12 00:00:00 -##### /authors ##### - -##### translated strings ##### - -%ds left -== %d sekunder igjen - -%i minute left -== %i minutt igjen - -%i minutes left -== %i minutter igjen - -%i second left -== %i sekund igjen - -%i seconds left -== %i sekunder igjen - -%s wins! -== %s Vinner! - -Abort -== Avbryt - -Add -== Legg til - -Add Friend -== Legg til venn - -Address -== Adresse - -All -== Alle - -Are you sure that you want to quit? -== Er du sikker på at du vil avslutte? - -Automatically record demos -== Spill inn demoer automatisk - -Automatically take game over screenshot -== Ta skjermbilde når runden er over - -Blue team -== Blått lag - -Blue team wins! -== Blått lag vant! - -Body -== Kropp - -Call vote -== Stem - -Change settings -== Endre innstillinger - -Chat -== Chat - -Clan -== Klan - -Client -== Klient - -Connecting to -== Kobler til - -Connection Problems… -== Tilkoblingsproblemer… - -Console -== Konsoll - -Controls -== Kontroller - -Count players only -== Tell bare spillere - -Current -== Nåværende - -Custom colors -== Egendefinerte farger - -Delete -== Slett - -Delete demo -== Slett demo - -Demofile: %s -== Demo fil: %s - -Demos -== Demoer - -Disconnect -== Koble fra - -Disconnected -== Frakoblet - -Downloading map -== Laster ned banen - -Draw! -== Uavgjort! - -Dynamic Camera -== Dynamisk kamera - -Emoticon -== Uttrykksikoner - -Error -== Feil - -Error loading demo -== Kunne ikke laste in Demo`en - -Favorite -== Favoritt - -Favorites -== Favoritter - -Feet -== Føtter - -Fire -== Skyt - -Folder -== Mappe - -Force vote -== Tving valg - -Free-View -== Fri-visning - -Fullscreen -== Fullskjerm - -Game -== Spill - -Game info -== Spill-info - -Game over -== Spill avsluttet - -Game type -== Spilltype - -Game types: -== Spilltyper: - -General -== Generelt - -Graphics -== Grafikk - -Grenade -== Granat - -Hammer -== Hammer - -Has people playing -== Har folk som spiller - -High Detail -== Ekstra detaljer - -Hook -== Gripekrok - -Invalid Demo -== Ugyldig Demo - -Join blue -== Bli med blå - -Join red -== Bli med rød - -Jump -== Hopp - -Kick player -== Kast ut spiller - -Language -== Språk - -MOTD -== Dagens melding - -Map -== Bane - -Move left -== Gå til venstre - -Move player to spectators -== Gjør spiller til tilskuer - -Move right -== Gå til høyre - -Movement -== Beveglighet - -Mute when not active -== Slå av lyd når spillet ikke er aktivt - -Name -== Navn - -Next weapon -== Neste Våpen - -Nickname -== Kallenavn - -No -== Nei - -No password -== Ikke passord - -No servers found -== Ingen servere funnet - -No servers match your filter criteria -== Ingen servere tilsvarer dine filterkriterier - -Ok -== Ok - -Parent Folder -== Forrige mappe - -Password -== Passord - -Password incorrect -== Feil passord - -Ping -== Ping - -Pistol -== Pistol - -Play background music -== Spill bakgrunnsmusikk - -Player -== Spiller - -Player country: -== Spillerland: - -Players -== Spillere - -Please balance teams! -== Balanser lagene! - -Prev. weapon -== Forrige våpen - -Quit -== Avslutt - -Reason: -== Grunn: - -Red team -== Rødt lag - -Red team wins! -== Rødt lag vant! - -Remote console -== Server-konsoll - -Remove -== Fjern - -Remove friend -== Fjern venn - -Rename demo -== Gi nytt navn på demo - -Reset filter -== Tilbakestill filter - -Score -== Poeng - -Score limit -== Poenggrense - -Scoreboard -== Poengliste - -Screenshot -== Skjermbilde - -Server address: -== Serveradresse: - -Server info -== Serverinfo - -Server not full -== Server ikke full - -Shotgun -== Hagle - -Show chat -== Vis samtale - -Show friends only -== Vis kun venner - -Show ingame HUD -== Vis HUD i spillet - -Show name plates -== Vis navneskilt - -Sound -== Lyd - -Sound error -== Lydfeil - -Spectate -== Se på - -Spectate next -== Se på neste - -Spectate previous -== Se på forrige - -Spectator mode -== Tilskuermodus - -Spectators -== Tilskuere - -Stop record -== Stopp inspilling - -Strict gametype filter -== Eksakt spilltype - -Sudden Death -== Brå død - -Switch weapon on pickup -== Bytt våpen ved innsamling - -Team -== Lag - -Team chat -== Lagsamtale - -The audio device couldn't be initialised. -== Lydenheten kunne ikke initialiseres. - -The server is running a non-standard tuning on a pure game type. -== Denne serveren kjører ikke standard-innstillinger på standard spilltype. - -Time limit -== Tidsbegrensning - -Time limit: %d min -== Tidsgrense: %d min - -Try again -== Prøv igjen - -Type -== Type - -Unable to rename the demo -== Kunne ikke endre navn på demoen - -Use sounds -== Lyd på - -Use team colors for name plates -== Bruk lagfarger for navneskilt - -V-Sync -== V-Sync - -Version -== Versjon - -Vote command: -== Stemmingskommando: - -Vote description: -== Stemmebeskrivelse: - -Vote no -== Stem Nei - -Vote yes -== Stem Ja - -Voting -== Stemming - -Warmup -== Oppvarming - -Weapon -== Våpen - -Yes -== Ja - -You must restart the game for all settings to take effect. -== Du må starte spillet på nytt før alle endringene tar effekt. - -##### needs translation ##### - -New name: -== Nytt navn: - -Sat. -== Metning - -Miscellaneous -== Diverse - -Internet -== Internett - -Max demos -== Maks antall demoer - -News -== Nyheter - -Join game -== Bli med i spillet - -FSAA samples -== FSAA-sampler - -Sound volume -== Lydvolum - -Max Screenshots -== Maks antall skjermbilder - -Laser -== Laser - -Hue -== Farge - -Record demo -== Ta opp demo - -Your skin -== Ditt utseende - -Reset to defaults -== Tilbakestill standardinstillinger - -Lht. -== Lyshet - -UI Color -== Menyfarge - -Alpha -== Synlighet - -LAN -== LAN - -Name plates size -== Navneskilt-størrelse - -Successfully saved the replay! -== Opptaket ble lagret! - -Replay feature is disabled! -== Opptaksfunksjon er slått av! - -Game paused -== Spill pauset - -Server best: -== Serverens beste - -Personal best: -== Personlig beste - -Learn -== Lær - -Browser -== Servere - -Ghost -== Skygge - -Loading DDNet Client -== Laster DDNet-klient - -Reconnect in %d sec -== Koble til igjen om %d sek - -Render demo -== Rendre demo - -Replace video -== Erstatt video - -File already exists, do you want to overwrite it? -== Filen finnes allerede, vil du overskrive den? - -Are you sure that you want to disconnect? -== Er du sikker på at du vil koble fra? - -Disconnect Dummy -== Koble fra dummy - -Are you sure that you want to disconnect your dummy? -== Er du sikker på at du vil koble fra dummyen din? - -Welcome to DDNet -== Velkommen til DDNet - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork er et kooperativt onlinespill der målet er at du og gruppen din skal nå banens målstrek. Som nybegynner anbefales det at du starter på Novice-serverne, som har de letteste banene. Se på serverens ping for å finne en som er nærme deg. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Det anbefales å sjekke innstillingene og justere dem slik det passer deg før du går inn på en server. - -Please enter your nickname below. -== Skriv inn ditt ønskede kallenavn under. - -Video name: -== Navn på video: - -Show DDNet map finishes in server browser -== Vis fullførte DDNet-baner i serverlisten - -transmits your player name to info.ddnet.org -== sender spillnavnet ditt til info.ddnet.org - -Search -== Søk - -Exclude -== Ekskluder - -Filter connecting players -== Filtrer tilkoblende spillere - -Indicate map finish -== Indiker fullført bane - -Unfinished map -== Ikke fullført bane - -Countries -== Land - -Types -== Typer - -DDNet %s is out! -== DDNet %s er ute! - -Downloading %s: -== Laster ned %s: - -Update failed! Check log… -== Oppdatering mislyktes! Sjekk logg… - -DDNet Client updated! -== DDNet-klient oppdatert! - -Update now -== Oppdater nå - -Restart -== Restart - -Remove chat -== Fjern chat - -%.2f MiB -== %.2f MiB - -%.2f KiB -== %.2f KiB - -Demo -== Demo - -Markers -== Markører - -Length -== Lengde - -Date -== Dato - -Fetch Info -== Hent info - -Connecting dummy -== Kobler til dummy - -Connect Dummy -== Koble til dummy - -Deactivate -== Deaktiver - -Activate -== Aktiver - -Save -== Lagre - -Switch weapon when out of ammo -== Bytt våpen ved tom ammo - -Show only chat messages from friends -== Vis kun meldinger fra venner - -Show clan above name plates -== Vis klan over navneskilt - -Clan plates size -== Klanskilt-størrelse - -Refresh Rate -== Oppdateringsrate - -Automatically take statboard screenshot -== Automatisk ta skjermbilde av spillerstatistikk - -Automatically create statboard csv -== Automatisk generer csv fra spillerstatistikk - -Max CSVs -== Max CSV-er - -Vanilla skins only -== Kun vanilla-skins - -Fat skins (DDFat) -== Fete skins (DDFat) - -Skin prefix -== Skin-prefix - -Hook collisions -== Krok-siktelinje - -Pause -== Pause - -Kill -== Drep - -Zoom in -== Zoom inn - -Zoom out -== Zoom ut - -Default zoom -== Standard zoom - -Show others -== Vis andre - -Show all -== Vis alle - -Toggle dyncam -== Dyncam av/på - -Toggle dummy -== Bytt dummy - -Toggle ghost -== Skygge av/på - -Dummy copy -== Dummy-kopi - -Hammerfly dummy -== Dummy-hammerfly - -Converse -== Samtale - -Statboard -== Spillerstatistikk - -Lock team -== Lås lag - -Show entities -== Vis entities - -Show HUD -== Vis HUD - -may cause delay -== kan gi forsinkelse - -Screen -== Skjerm - -Use high DPI -== Bruk høy DPI - -Enable game sounds -== Aktiver spillyd - -Enable gun sound -== Aktiver pistollyd - -Enable long pain sound (used when shooting in freeze) -== Aktiver smertelyd (ved bruk av våpen i freeze) - -Enable server message sound -== Aktiver servermelding-lyd - -Enable regular chat sound -== Lyd for vanlig samtale - -Enable team chat sound -== Lyd for lagsamtale - -Enable highlighted chat sound -== Lyd for uthevet samtale - -Map sound volume -== Lydvolum bane - -HUD -== HUD - -DDNet -== DDNet - -DDNet Client needs to be restarted to complete update! -== DDNet-klienten må restartes for å fullføre oppdatering! - -Show score -== Vis poeng - -Show names in chat in team colors -== Vis lagfarger på navn i chat - -Show kill messages -== Vis dødsmeldinger - -Show votes window after voting -== Vis avstemming etter avgitt stemme - -Messages -== Meldinger - -System message -== Systemmelding - -Reset -== Tilbakestill - -Highlighted message -== Uthevet melding - -Team message -== Lagmelding - -Friend message -== Vennemelding - -Normal message -== Vanlig melding - -Save the best demo of each race -== Lagre beste demo for hvert løp - -Default length -== Standard lengde - -Enable replays -== Aktiver opptak - -Show ghost -== Vis skygge - -Save ghost -== Lagre skygge - -Gameplay -== Spillet - -Overlay entities -== Entities-overlegg - -Size -== Størrelse - -Show text entities -== Vis tekst-entities - -Show others (own team only) -== Vis andre (bare eget lag) - -Show quads -== Vis quads - -AntiPing -== AntiPing - -AntiPing: predict other players -== AntiPing: predikter andre spillere - -AntiPing: predict weapons -== AntiPing: predikter våpen - -AntiPing: predict grenade paths -== AntiPing: forutsi prosjektilbane - -Show other players' hook collision lines -== Vis andre spilleres krok-siktelinje - -Show other players' key presses -== Vis andre spilleres tastetrykk - -Show tiles layers from BG map -== Vis tile-lag fra BG-bane - -DDNet %s is available: -== DDNet %s er tilgjengelig: - -Updating… -== Oppdaterer… - -No updates available -== Ingen oppdateringer tilgjengelig - -Check now -== Sjekk nå - -New random timeout code -== Ny tilfeldig timeout-kode - -Time -== Tid - -Follow -== Følg - -Frags -== Frags - -Deaths -== Døde - -Suicides -== Selvmord - -Ratio -== Ratio - -Net -== Forskj. - -FPM -== FPM - -Spree -== Spree - -Best -== Beste - -Grabs -== Grabbinger - -1 new mention -== nevnt 1 gang - -%d new mentions -== nevnt %d ganger - -9+ new mentions -== nevnt 9+ ganger - -Manual -== Manuell - -Race -== Løp - -Auto -== Auto - -Replay -== Opptak - -Warning -== Advarsel - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Feilsøkemodus aktivert. Trykk Ctrl+Shift+D for å deaktivere feilsøkemodus. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Bruk k-tasten for å drepe (restarte), q for å pause og se på andre spillere. Se innstillinger for andre tasteoppsett. - -Existing Player -== Eksisterende Spiller - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Ditt kallenavn '%s' er allerede i bruk (%d poeng). Vil du fortsatt bruke det? - -Checking for existing player with your name -== Sjekker etter eksisterende spiller med ditt navn - -Speed -== Hastighet - -Theme -== Tema - -%d of %d servers -== %d av %d servere - -%d of %d server -== %d av %d server - -%d players -== %d spillere - -%d player -== %d spiller - -Demos directory -== Demomappe - -Smooth Dynamic Camera -== Mykt dynamisk kamera - -Skip the main menu -== Hopp over hovedmeny - -Themes directory -== Temamappe - -Download skins -== Last ned skins - -Skin Database -== Skin-database - -Skins directory -== Skinmappe - -Game sound volume -== Lydvolum spill - -Chat sound volume -== Lydvolum chat - -Background music volume -== Bakgrunnsmusikkvolum - -Assets -== Ressurser - -Use old chat style -== Bruk gammel chattestil - -Client message -== Klientmelding - -Use current map as background -== Bruk nåværende bane som bakgrunn - -Entities -== Entities - -Emoticons -== Emotikoner - -Particles -== Partikler - -Assets directory -== Ressursmappe - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ - -Website -== Webside - -Settings -== Innstillinger - -Stop server -== Stopp server - -Run server -== Start server - -Server executable not found, can't run server -== Server-programfil ikke funnet, kan ikke starte server - -Editor -== Baneredigerer - -[Start menu] -Play -== Spill - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not save downloaded map. Try manually deleting this file: %s -== - -Could not connect dummy -== - -Error playing demo -== - -Failed saving the replay! -== - -Saving settings to '%s' failed -== - -Error saving settings -== - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -The format of texture %s is not RGBA which will cause visual bugs. -== - -Preparing demo playback -== - -Connected -== - -Loading map file from storage -== - -Loading demo file from storage -== - -Some fonts could not be loaded. Check the local console for details. -== - -Initializing components -== - -Why are you slowmo replaying to read this? -== - -Initializing assets -== - -Initializing map logic -== - -Sending initial client info -== - -Quitting. Please wait… -== - -Restarting. Please wait… -== - -Loading skin files -== - -Loading background map -== - -Searching -== - -Enter Username -== - -Enter Password -== - -NOT CONNECTED -== - -Match %d of %d -== - -No results -== - -Lines %d - %d (%s) -== - -Locked -== - -Following -== - -Loading commands… -== - -Position: -== - -Speed: -== - -Angle: -== - -Multi-View -== - -[Spectating] -Following %s -== - -[Spectating Camera Mode Icon] -AUTO -== - -Team %d -== - -Some map images could not be loaded. Check the local console for details. -== - -Uploading map data to GPU -== - -Some map sounds could not be loaded. Check the local console for details. -== - -Loading menu themes -== - -Press a key… -== - -Main menu -== - -Rename folder -== - -Render complete -== - -Are you sure that you want to restart? -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -There's an unsaved map in the editor, you might want to save it. -== - -Continue anyway? -== - -A demo with this name already exists -== - -A folder with this name already exists -== - -Unable to rename the folder -== - -File '%s' already exists, do you want to overwrite it? -== - -(paused) -== - -Videos directory -== - -Video was saved to '%s' -== - -Join Tutorial Server -== - -Skip Tutorial -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -Trying to determine UDP connectivity… -== - -UDP seems to be filtered. -== - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== - -No answer from server yet. -== - -%d/%d KiB (%.1f KiB/s) -== - -Getting game info -== - -Requesting to join the game -== - -Loading menu images -== - -AFR -== - -ASI -== - -AUS -== - -EUR -== - -NA -== - -SA -== - -CHN -== - -Getting server list from master server -== - -No local servers found (ports %d-%d) -== - -Example of usage -== - -Are you sure that you want to disconnect and switch to a different server? -== - -No login required -== - -Communities -== - -Copy info -== - -Leak IP -== - -No server selected -== - -Online friends (%d) -== - -Online clanmates (%d) -== - -[friends (server browser)] -Offline (%d) -== - -Click to select server. Double click to join your friend. -== - -Click to remove this player from your friends list. -== - -Click to remove this clan from your friends list. -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Are you sure that you want to remove the player '%s' from your friends list? -== - -Are you sure that you want to remove the clan '%s' from your friends list? -== - -Add Clan -== - -Server filter -== - -Friends -== - -Play the current demo -== - -Pause the current demo -== - -Stop the current demo -== - -Go back the specified duration -== - -[Demo player duration] -%d min. -== - -[Demo player duration] -%d sec. -== - -Change the skip duration -== - -Go forward the specified duration -== - -Go back one tick -== - -Go forward one tick -== - -Go back one marker -== - -Go forward one marker -== - -Slow down the demo -== - -Speed up the demo -== - -Mark the beginning of a cut (right click to reset) -== - -Mark the end of a cut (right click to reset) -== - -Export cut as a separate demo -== - -Close the demo player -== - -Toggle keyboard shortcuts -== - -Toggle auto camera -== - -Export demo cut -== - -Cut interval -== - -Cut length -== - -Render cut to video -== - -Please use a different filename -== - -Loading demo files -== - -All combined -== - -No demo selected -== - -Folder Link -== - -Created -== - -Netversion -== - -[Demo details] -map not included -== - -Open the directory that contains the demo files -== - -Are you sure that you want to delete the folder '%s'? -== - -Are you sure that you want to delete the demo '%s'? -== - -Delete folder -== - -Unable to delete the demo '%s' -== - -Unable to delete the folder '%s'. Make sure it's empty first. -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Loading… -== - -Loading ghost files -== - -Ghosts directory -== - -Activate all -== - -Deactivate all -== - -Menu opened. Press Esc key again to close menu. -== - -[Hertz] -Hz -== - -Save power by lowering refresh rate (higher input latency) -== - -Settings file -== - -Open the settings file -== - -Config directory -== - -Open the directory that contains the configuration and user files -== - -Open the directory to add custom themes -== - -Dummy -== - -Player info change cooldown -== - -Download community skins -== - -Create a random skin -== - -Choose default eyes when joining a server -== - -Open the directory to add custom skins -== - -Chat command -== - -Enable controller -== - -Controller -== - -Ingame controller mode -== - -[Ingame controller mode] -Relative -== - -[Ingame controller mode] -Absolute -== - -Ingame controller sens. -== - -UI controller sens. -== - -Controller jitter tolerance -== - -No controller found. Plug in a controller. -== - -Axis -== - -Status -== - -Aim bind -== - -Mouse -== - -Ingame mouse sens. -== - -UI mouse sens. -== - -Reset controls -== - -Are you sure that you want to reset the controls to their defaults? -== - -Cancel -== - -Windowed -== - -Windowed borderless -== - -Windowed fullscreen -== - -Desktop fullscreen -== - -Allows maps to render with more detail -== - -Renderer -== - -default -== - -custom -== - -Graphics card -== - -auto -== - -Tee -== - -Appearance -== - -Name Plate -== - -Hook Collisions -== - -Info Messages -== - -Show health, shields and ammo -== - -Show local time always -== - -Authed name color in scoreboard -== - -Same clan color in scoreboard -== - -DDRace HUD -== - -Show client IDs (scoreboard, chat, spectator) -== - -Show DDRace HUD -== - -Show jumps indicator -== - -Show dummy actions -== - -Show player position -== - -Show player speed -== - -Show player target angle -== - -Show freeze bars -== - -Opacity of freeze bars inside freeze -== - -Always show chat -== - -Show only chat messages from team members -== - -Chat font size -== - -Chat width -== - -Preview -== - -Show friend mark (♥) in name plates -== - -Show client IDs in name plates -== - -Hook Strength -== - -Show hook strength icon indicator -== - -Show hook strength number indicator -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Show local player's key presses -== - -Size of key press icons -== - -Hook collision line -== - -Show own player's hook collision line -== - -Always show own player's hook collision line -== - -Always show other players' hook collision lines -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Hook collision line opacity -== - -Colors of the hook collision line, in case of a possible collision with: -== - -Your movements are not taken into account when calculating the line colors -== - -Nothing hookable -== - -Something hookable -== - -A Tee -== - -Preview 'Hook collisions' being pressed -== - -Show finish messages -== - -Normal Color -== - -Highlight Color -== - -Weapons -== - -Rifle Laser Outline Color -== - -Rifle Laser Inner Color -== - -Shotgun Laser Outline Color -== - -Shotgun Laser Inner Color -== - -Door Laser Outline Color -== - -Door Laser Inner Color -== - -Freeze Laser Outline Color -== - -Freeze Laser Inner Color -== - -Set all to Rifle -== - -Enable ghost -== - -When you cross the start line, show a ghost tee replicating the movements of your best time -== - -Opacity -== - -Only save improvements -== - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== - -Quads are used for background decoration -== - -Tries to predict other entities to give a feel of low latency -== - -Background -== - -Regular background color -== - -Entities background color -== - -Run on join -== - -Chat command (e.g. showall 1) -== - -Unregister protocol and file extensions -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Extras -== - -Loading assets -== - -Open the directory to add custom assets -== - -Discord -== - -https://ddnet.org/discord -== - -Tutorial -== - -Can't find a Tutorial server -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Loading race demo files -== - -Round %d/%d -== - -[Spectators] -%d others… -== - -Super -== - -[Team and size] -%d\n(%d/%d) -== - -Team %d (%d/%d) -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Loading sound files -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -Moved ingame -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/persian.txt b/data/languages/persian.txt deleted file mode 100644 index e6e68a9065..0000000000 --- a/data/languages/persian.txt +++ /dev/null @@ -1,2072 +0,0 @@ -##### authors ##### -# OneShadow 2016-03-27 -# Quick 2020-07-12 -# younesdevil 2021-12-07 -# Player 2023-01-26 -# ArAsH 2024-10-21 -##### /authors ##### - -##### translated strings ##### - -%ds left -== %ds ﻩﺪﻧﺎﻣ ﯽﻗﺎﺑ - -%i minute left -== %i ﻩﺪﻧﺎﻣ ﯽﻗﺎﺑ ﻪﻘﯿﻗﺩ - -%i minutes left -== %i ﻩﺪﻧﺎﻣ ﯽﻗﺎﺑ ىﺎﻫ ﻪﻘﯿﻗﺩ - -%i second left -== %i ﻩﺪﻧﺎﻣ ﯽﻗﺎﺑ ﻪﯿﻧﺎﺛ - -%i seconds left -== %i ﻩﺪﻧﺎﻣ ﯽﻗﺎﺑ ىﺎﻫ ﻪﯿﻧﺎﺛ - -%s wins! -== %s ﺪﺷ ﻩﺪﻧﺮﺑ! - -Abort -== ﻥﺩﺮﻛ ﺩﺭ - -Add -== ﻥﺩﺮﻛ ﻪﻓﺎﺻﺍ - -Add Friend -== ﺖﺳﻭﺩ ﻥﺩﺮﻛ ﻪﻓﺎﺻﺍ - -Address -== ﺱﺭﺩﺁ - -All -== ﻪﻤﻫ - -Are you sure that you want to quit? -== ؟ﺪﯾﻮﺷ ﺝﺭﺎﺧ ﺪﯿﻫﺍﻮﺧ ﯽﻣ ﻪﻛ ﺪﯿﺘﺴﻫ ﻦﺌﻤﻄﻣ ﺎﯾﺁ - -Automatically record demos -== ﺭﺎﻛﺩﻮﺧ ﺕﺭﻮﺻ ﻪﺑ ﻮﻣﺩ ﻂﺒﺿ - -Automatically take game over screenshot -== ﺭﺎﻛﺩﻮﺧ ﺕﺭﻮﺻ ﻪﺑ ىﺯﺎﺑ ﺯﺍ ﺲﻜﻋ ﻦﺘﻓﺮﮔ - -Blue team -== ﯽﺑﺁ ﻢﯿﺗ - -Blue team wins! -== ﺪﺷ ﻩﺪﻧﺮﺑ ﯽﺑﺁ ﻢﯿﺗ! - -Body -== ﻥﺪﺑ - -Call vote -== ﯽﺠﻨﺳﺮﻈﻧ - -Change settings -== ﺕﺎﻤﯿﻈﻨﺗ ﺮﯿﯿﻐﺗ - -Chat -== ﺖﭼ - -Clan -== ﻦﻠﻛ - -Client -== ﺖﻨﯾﻼﻛ - -Connecting to -== ﻪﺑ ﻥﺪﺷ ﻞﺻﻭ - -Connection Problems… -== …ﺪﺷ ﻪﺟﺍﻮﻣ ﻞﻜﺸﻣ ﺎﺑ ﻁﺎﺒﺗﺭﺍ - -Console -== ﻝﻮﺴﻨﻛ - -Controls -== ﺎﻫ ﻝﺮﺘﻨﻛ - -Count players only -== ﺎﻫ ﻦﻜﯾﺯﺎﺑ ﺩﺍﺪﻌﺗ - -Current -== ﯽﻠﻌﻓ - -Custom colors -== ﻩﺍﻮﺨﻟﺩ ﮓﻧﺭ - -Delete -== ﻥﺩﺮﻛ کﺎﭘ - -Delete demo -== ﻮﻣﺩ ﻥﺩﺮﻛ کﺎﭘ - -Demofile: %s -== %s :ﻮﻣﺩ ﻞﯾﺎﻓ - -Demos -== ﺎﻫ ﻮﻣﺩ - -Disconnect -== ﯼﺯﺎﺑ ﺯﺍ ﺝﻭﺮﺧ - -Disconnected -== ﺪﺷ ﻊﻄﻗ - -Downloading map -== ﭗﻣ ﺖﻓﺎﯾﺭﺩ ﻝﺎﺣ ﺭﺩ - -Draw! -== ىﻭﺎﺴﻣ! - -Dynamic Camera -== کﺮﺤﺘﻣ ﻦﯿﺑﺭﻭﺩ - -Emoticon -== ﺎﻫ ﻚﻠﻜﺷ - -Error -== ﺎﻄﺧ - -Error loading demo -== ﻮﻣﺩ ىﺭﺍﺬﮔﺭﺎﺑ ﺭﺩ ﺎﻄﺧ - -Favorite -== ﺪﻨﻣ ﻪﻗﻼﻋ - -Favorites -== ﺎﻫ ىﺪﻨﻣ ﻪﻗﻼﻋ - -Feet -== ﺎﭘ - -Fire -== ﻚﯿﻠﺷ - -Folder -== ﻪﺷﻮﭘ - -Force vote -== ىﺭﺎﺒﺟﺍ ىﺍﺭ - -Free-View -== ﺩﺍﺯﺁ-ﺪﯾﺩ - -Fullscreen -== ﻞﻣﺎﻛ ى ﻪﺤﻔﺻ - -Game -== ىﺯﺎﺑ - -Game info -== ىﺯﺎﺑ ﺕﺎﻋﻼﻃﺍ - -Game over -== ﺖﻓﺎﯾ ﻥﺎﯾﺎﭘ ىﺯﺎﺑ - -Game paused -== ﺪﺷ ﻒﻗﻮﺘﻣ ىﺯﺎﺑ - -Game type -== ىﺯﺎﺑ ﺖﻟﺎﺣ - -Game types: -== ىﺯﺎﺑ ىﺎﻫ ﺖﻟﺎﺣ: - -General -== ﯽﻣﻮﻤﻋ - -Graphics -== ﻚﯿﻓﺍﺮﮔ - -Grenade -== ﺯﺍﺪﻧﺍ ﺐﻤﺑ - -Hammer -== ﺶﻜﭼ - -Has people playing -== ﻦﻜﯾﺯﺎﺑ ىﺍﺭﺍﺩ ىﺎﻫﺭﻭﺮﺳ - -High Detail -== ﻻﺎﺑ ﺖﯿﻔﯿﻛ - -Hook -== ﺏﻼﻗ - -Invalid Demo -== ﺖﺳﺍ ﺮﺒﺘﻌﻣﺎﻧ ﻮﻣﺩ - -Join blue -== ﯽﺑﺁ ﻢﯿﺗ ﻪﺑ ﺩﻭﺭﻭ - -Join red -== ﺰﻣﺮﻗ ﻢﯿﺗ ﻪﺑ ﺩﻭﺭﻭ - -Jump -== ﺵﺮﭘ - -Kick player -== ﻦﻜﯾﺯﺎﺑ ﻦﺘﺧﺍﺪﻧﺍ ﻥﻭﺮﯿﺑ - -Language -== ﻥﺎﺑﺯ - -MOTD -== ﺕﺎﺤﯿﺿﻮﺗ - -Map -== ﭗﻣ - -Move left -== ﭗﭼ ﻪﺑ ﺖﻛﺮﺣ - -Move player to spectators -== ﺎﺷﺎﻤﺗ ﺖﻟﺎﺣ ﻪﺑ ﻦﻜﯾﺯﺎﺑ ﻝﺎﻘﺘﻧﺍ - -Move right -== ﺖﺳﺍﺭ ﻪﺑ ﺖﻛﺮﺣ - -Movement -== ﺖﻛﺮﺣ - -Mute when not active -== ﺖﺴﯿﻧ ﻝﺎﻌﻓ ﯽﺘﻗﻭ ﺍﺪﺼﯿﺑ - -Name -== ﻢﺳﺍ - -Next weapon -== ىﺪﻌﺑ ﻪﺤﻠﺳﺍ - -Nickname -== ﺭﺎﻌﺘﺴﻣ ﻢﺳﺍ - -No -== ﻪﻧ - -No password -== ﺰﻣﺭ ﻥﻭﺪﺑ - -No servers found -== ﺪﺸﻧ ﺖﻓﺎﯾ ىﺭﻭﺮﺳ - -No servers match your filter criteria -== ﺪﺸﻧ ﺖﻓﺎﯾ ﺕﺎﺼﺨﺸﻣ ﻦﯾﺍ ﺎﺑ ىﺭﻭﺮﺳ - -Ok -== ﻪﺷﺎﺑ - -Parent Folder -== ﯽﻠﺻﺍ ﻪﺷﻮﭘ - -Password -== ﺰﻣﺭ - -Password incorrect -== ﺖﺳﺍ ﻩﺎﺒﺘﺷﺍ ﺰﻣﺭ - -Ping -== ﮓﻨﯿﭘ - -Pistol -== ﺮﯿﺗ ﺖﻔﻫ - -Successfully saved the replay! -== !ﺪﺷ ﻩﺮﯿﺧﺫ ﺖﯿﻘﻓﻮﻣ ﺎﺑ ﺶﺨﭘﺯﺎﺑ - -Replay feature is disabled! -== ﺖﺳﺍ ﻝﺎﻌﻓﺮﯿﻏ ﺶﺨﭘﺯﺎﺑ - -Warning -== ﺭﺎﻄﺧﺍ - -Team -== ﻢﯿﺗ - -Sudden Death -== ﯽﯾﻮﻬﯾ گﺮﻣ - -Warmup -== ﻥﺩﺮﮐ ﻡﺮﮔ - -Please balance teams! -== ﺪﯿﻨﮐ ﻝﺩﺎﻌﺘﻣ ﺍﺭ ﺎﻫ ﻢﯿﺗ ﺎﻔﻄﻟ - -Reason: -== ﻞﯿﻟﺩ - -Vote yes -== ﺖﺒﺜﻣ ﯼﺍﺭ - -Vote no -== ﯽﻔﻨﻣ ﯼﺍﺭ - -Spectate -== ﻥﺩﺮﮐ ﺎﺷﺎﻤﺗ - -Server best: -== ﺭﻭﺮﺳ ﻦﯾﺮﺘﻬﺑ - -Reset -== ﺖﺴﯾﺭ - -News -== ﺭﺎﺒﺧﺍ - -Internet -== ﺖﻧﺮﺘﻨﯾﺍ - -LAN -== ﯽﻠﺧﺍﺩ - -Players -== ﻥﺎﻨﮑﯾﺯﺎﺑ - -Server info -== ﺭﻭﺮﺳ ﺕﺎﻋﻼﻃﺍ - -Browser -== ﻮﺠﺘﺴﺟ - -Ghost -== ﺡﻭﺭ ﺖﻟﺎﺣ - -Loading DDNet Client -== ﺖﻨﯾﺪﯾﺩ ﺖﻨﯾﻼﮐ ﻥﺩﺮﮐ ﻩﺩﺎﻣﺁ ﻝﺎﺣﺭﺩ - -Reconnect in %d sec -== ﻪﯿﻧﺎﺛ %d ﺭﺩ ﻩﺭﺎﺑﻭﺩ ﻝﺎﺼﺗﺍ - -Rename demo -== ﻮﻣﺩ ﻡﺎﻧ ﺮﯿﯿﻐﺗ - -Render demo -== ﻮﻣﺩ ﺭﺪﻧﺭ - -Replace video -== ﻮﯾﺪﯾﻭ ﻥﺩﺮﮐ ﻦﯾﺰﮕﯾﺎﺟ - -File already exists, do you want to overwrite it? -== ؟ﺪﯿﻨﮐ ﯽﺴﯾﻮﻧ ﺯﺎﺑ ﺍﺮﻧﺁ ﺪﯿﻫﺍﻮﺨﯿﻣ.ﺖﺳﺍ ﺩﻮﺟﻮﻣ ﻞﺒﻗ ﺯﺍ ﻞﯾﺎﻓ - -Remove friend -== ﺖﺳﻭﺩ ﻑﺬﺣ - -Sound error -== ﺍﺪﺻ ﯼﺎﻄﺧ - -Try again -== ﺪﯿﻨﮐ ﺵﻼﺗ ﻩﺭﺎﺑﻭﺩ - -Quit -== ﺝﻭﺮﺧ - -Are you sure that you want to disconnect? -== ؟ﯽﻨﮐ ﻝﺎﺼﺗﺍ ﻊﻄﻗ ﯼﺍﻮﺨﯿﻣ ﯽﻨﺌﻌﻤﻄﻣ -Disconnect Dummy -== ﯽﻣﺍﺩ ﻥﺩﺮﮐ ﻊﻄﻗ - -Are you sure that you want to disconnect your dummy? -== ؟ﯽﻨﮐ ﻊﻄﻗ ﻭﺭ ﯽﻣﺍﺩ ﯼﺍﻮﺨﯿﻣ ﯽﻨﺌﻤﻄﻣ - -Welcome to DDNet -== ﯼﺪﻣﺁ ﺵﻮﺧ ﺖﻨﯾﺪﯾﺩ ﻪﺑ - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== ﺪﯿﻨﮐ ﻩﺩﺎﻔﺘﺳﺍ ﺪﻫﺪﯿﻣ ﺍﺭ ﮓﻨﯿﭘ ﻦﯾﺮﺗ ﻦﯿﯾﺎﭘ ﻪﮐ ﯼﺭﻭﺮﺳ ﺎﻤﺘﺣ ﻭ ﺪﯿﻨﮑﺑ ﻥﺩﺮﮐ ﯼﺯﺎﺑ ﻪﺑ ﻉﻭﺮﺷ Novice ﯼﺎﻫ ﺭﻭﺮﺳ ﺯﺍ ﺪﯾﺎﺑ ﺪﯿﺘﺴﻫ ﺩﺭﺍﻭ ﻩﺯﺎﺗ ﻪﮐ ﺎﻤﺷ.ﺖﺳﺍ ﻥﺎﯾﺎﭘ ﻂﺧ ﻪﺑ ﻉﻭﺮﺷ ﻂﺧ ﺯﺍ ﻥﺎﺘﻤﯿﺗ ﻭ ﺎﻤﺷ ﻥﺪﯿﺳﺭ ﻥﺁ ﻑﺪﻫ ﻪﮐ ﺖﺳﺍ ﯽﻤﯿﺗ ﻦﯾﻼﻧﺁ ﯼﺯﺎﺑ ﮏﯾ DDraceNetwork - -Existing Player -== ﺩﺭﺍﺩ ﺩﻮﺟﻭ ﻦﮑﯾﺯﺎﺑ - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== ؟ﯽﻨﮐ ﻩﺩﺎﻔﺘﺳﺍ ﻡﺎﻧ ﻦﯾﺍ ﺯﺍ ﯼﺍﻮﺨﯿﻣ ﻢﻫ ﺯﻮﻨﻫ ('%2$d' ﺯﺎﯿﺘﻣﺍ )ﺖﺳﺍ ﻩﺪﺷ ﻩﺩﺎﻔﺘﺳﺍ '%1$s' ﻡﺎﻧ ﻦﯾﺍ - -Checking for existing player with your name -== ﻡﺎﻧ ﻦﯾﺍ ﺎﺑ ﺩﻮﺟﻮﻣ ﻦﮑﯾﺯﺎﺑ ﯽﺳﺮﺑ ﻝﺎﺣﺭﺩ - -Are you sure that you want to disconnect and switch to a different server? -== ؟ﻪﮕﯾﺩ ﺭﻭﺮﺳ ﻪﺑ ﯼﺮﺑ ﻭ ﯽﻨﮐ ﻊﻄﻗ ﯼﺍﻮﺨﯿﻣ ﯽﻨﺌﻤﻄﻣ - -Yes -== ﻪﻠﺑ - -Unable to rename the demo -== ﺩﺭﺍﺪﻧ ﺩﻮﺟﻭ ﻮﻣﺩ ﻡﺎﻧ ﺮﯿﯿﻐﺗ ﻥﺎﮑﻣﺍ - -New name: -== ﺪﯾﺪﺟ ﻢﺳﺍ - -Show chat -== ﺖﭼ ﺶﯾﺎﻤﻧ - -Use sounds -== ﺍﺪﺻ ﺯﺍ ﻩﺩﺎﻔﺘﺳﺍ - -Speed -== ﺖﻋﺮﺳ - -Show ingame HUD -== ﯼﺯﺎﺑ ﺭﺩ HUD ﻥﺩﺍﺩ ﻥﺎﺸﻧ - -Video name: -== ﻮﯾﺪﯾﻭ ﻢﺳﺍ - -Show DDNet map finishes in server browser -== ﺪﯾﺍ ﻩﺪﻧﺎﺳﺭ ﻡﺎﻤﺗﺍ ﻪﺑ ﻪﮐ ﯽﯾﺎﻫ ﭗﻣ ﻥﺩﺍﺩ ﻥﺎﺸﻧ - -Theme -== ﻢﺗ - -Type -== ﻉﻮﻧ - -Getting server list from master server -== ﯽﻠﺻﺍ ﺭﻭﺮﺳ ﺯﺍ ﺎﻫ ﺭﻭﺮﺳ ﺖﺴﯿﻟ ﺖﻓﺎﯾﺭﺩ - -Search -== ﻮﺠﺘﺴﺟ - -Exclude -== ﺰﺟ ﻪﺑ - -%d of %d servers -== ﺎﻫ ﺭﻭﺮﺳ %d ﺯﺍ %d - -%d of %d server -== ﺭﻭﺮﺳ %d ﺯﺍ %d - -%d players -== ﻥﺎﻨﮑﯾﺯﺎﺑ %d - -%d player -== ﻦﮑﯾﺯﺎﺑ %d - -Server address: -== ﺭﻭﺮﺳ ﺱﺭﺩﺁ - -Server not full -== ﺪﺷﺎﺒﻧ ﺮﭘ ﺭﻭﺮﺳ - -Show friends only -== ﻩﺪﺑ ﻥﺎﺸﻧ ﺍﺭ ﻥﺎﺘﺳﻭﺩ ﻂﻘﻓ - -Strict gametype filter -== ﯼﺯﺎﺑ ﻉﻮﻧ ﻪﺘﻓﺮﺸﯿﭘ ﺮﺘﻠﯿﻓ - -Player country: -== ﻦﮑﯾﺯﺎﺑ ﺭﻮﺸﮐ - -Filter connecting players -== ﻝﺎﺼﺗﺍ ﻝﺎﺣﺭﺩ ﻥﺎﻨﮑﯾﺯﺎﺑ ﻥﺩﺮﮐ ﺮﺘﻠﯿﻓ - -Indicate map finish -== ﻪﺘﻓﺎﯾ ﻥﺎﯾﺎﭘ ﭗﻣ ﻥﺩﺍﺩ ﻥﺎﺸﻧ - -Unfinished map -== ﻡﺎﻤﺗﺎﻧ ﭗﻣ - -Countries -== ﺎﻫ ﺭﻮﺸﮐ - -Types -== ﻉﺍﻮﻧﺍ - -Reset filter -== ﺮﺘﻠﯿﻓ ﻥﺩﺮﮐ ﺖﺴﯾﺭ - -Scoreboard -== ﺕﺍﺯﺎﯿﺘﻣﺍ ﯼﻮﻠﺑﺎﺗ - -Remove -== ﻥﺩﺮﮐ کﺎﭘ - -Remove chat -== ﺖﭼ ﻥﺩﺮﮐ کﺎﭘ - -Demo -== ﻮﻣﺩ - -Markers -== ﺎﻫ ﺮﮕﻧﺎﺸﻧ - -Length -== ﻝﻮﻃ - -Date -== ﺦﯾﺭﺎﺗ - -Demos directory -== ﺎﻫﻮﻣﺩ ﻪﺷﻮﭘ - -Connect Dummy -== ﯽﻣﺍﺩ ﻝﺎﺼﺗﺍ - -Connecting dummy -== ﯽﻣﺍﺩ ﻝﺎﺼﺗﺍ ﻝﺎﺣﺭﺩ - -Stop record -== ﻂﺒﺿ ﻒﻗﻮﺗ - -Record demo -== ﻮﻣﺩ ﻂﺒﺿ - -Join game -== ﯼﺯﺎﺑ ﻪﺑ ﺩﻭﺭﻭ - -Kill -== ﯽﺸﮐﺩﻮﺧ - -Pause -== ﺚﮑﻣ ﺖﻟﺎﺣ - -Player -== ﻦﮑﯾﺯﺎﺑ - -Version -== ﻪﺨﺴﻧ - -Score limit -== ﺯﺎﯿﺘﻣﺍ ﺪﺣ - -Time limit -== ﻥﺎﻣﺯ ﺪﺣ - -Vote description: -== ﯼﺍﺭ ﺕﺎﺤﯿﺿﻮﺗ - -Vote command: -== ﯼﺍﺭ ﺪﻨﻣﺎﮐ - -Time -== ﻥﺎﻣﺯ - -Deactivate -== ﻥﺩﺮﮐ ﻝﺎﻌﻓﺮﯿﻏ - -Activate -== ﻥﺩﺮﮐ ﻝﺎﻌﻓ - -Save -== ﻩﺮﯿﺧﺫ - -Smooth Dynamic Camera -== ﻥﺍﻭﺭ کﺮﺤﺘﻣ ﻦﯿﺑﺭﻭﺩ - -Switch weapon on pickup -== ﻦﺘﺷﺍﺩﺮﺑ ﻡﺎﮕﻨﻫ ﻪﺤﻠﺳﺍ ﺮﯿﯿﻐﺗ - -Switch weapon when out of ammo -== ﺕﺎﻤﻬﻣ ﻥﺪﺷ ﻡﺎﻤﺗ ﻡﺎﮕﻨﻫ ﻪﺤﻠﺳﺍ ﺮﯿﯿﻐﺗ - -Show only chat messages from friends -== ﻥﺎﺘﺳﻭﺩ ﺖﭼ ﺶﯾﺎﻤﻧ ﻂﻘﻓ - -Skip the main menu -== ﯽﻠﺻﺍ ىﻮﻨﻣ ﺯﺍ ﻥﺪﺷ ﺩﺭ - -Max demos -== ﺎﻫﻮﻣﺩ ﺮﺜﮐﺍﺪﺣ - -Max Screenshots -== ﺎﻫ ﺕﺎﺷ ﻦﯾﺮﮑﺳﺍ ﺮﺜﮐﺍﺪﺣ - -Refresh Rate -== ﯽﻧﺎﺳﺭﺯﻭﺮﺑ ﺥﺮﻧ - -Your skin -== ﺎﻤﺷ ﻦﯿﮑﺳﺍ - -Download skins -== ﻦﯿﮑﺳﺍ ﺩﻮﻠﻧﺍﺩ - -Fat skins (DDFat) -== ﻕﺎﭼ ﻦﯿﮑﺳﺍ - -Skin prefix -== ﻦﯿﮑﺳﺍ ﺪﻧﻮﺸﯿﭘ - -Skin Database -== ﻦﯿﮑﺳﺍ ﺩﻮﻠﻧﺍﺩ - -Zoom in -== ﯽﯾﺎﻤﻨﮔﺭﺰﺑ - -Zoom out -== ﯽﯾﺎﻤﻧ ﮏﭼﻮﮐ - -Default zoom -== ﺽﺮﻓ ﺶﯿﭘ ﯽﯾﺎﻤﻨﮔﺭﺰﺑ - -Show others -== ﻥﺍﺮﮕﯾﺩ ﺶﯾﺎﻤﻧ - -Show all -== ﻪﻤﻫ ﺶﯾﺎﻤﻧ - -Toggle dyncam -== کﺮﺤﺘﻣ ﻦﯿﺑﺭﻭﺩ ﺮﯿﯿﻐﺗ - -Toggle dummy -== ﯽﻣﺍﺩ ﺮﯿﯿﻐﺗ - -Shotgun -== ﻥﺎﮕﺗﺎﺷ - -Laser -== ﺭﺰﯿﻟ - -Prev. weapon -== ﯽﻠﺒﻗ ﻪﺤﻠﺳﺍ - -Team chat -== ﻢﯿﺗ ﺖﭼ - -Converse -== ﻮﮕﺘﻔﮔ - -Spectator mode -== ﺮﮔﺎﺷﺎﻤﺗ ﺖﻟﺎﺣ - -Screenshot -== ﺕﺎﺷ ﻦﯾﺮﮑﺳﺍ - -Lock team -== ﻢﯿﺗ ﻥﺩﺮﮐ ﻞﻔﻗ - -Show entities -== ﺎﻫ ﺖﯾﺩﻮﺟﻮﻣ ﺶﯾﺎﻤﻧ - -Show HUD -== HUD ﺶﯾﺎﻤﻧ - -Chat command -== ﺖﭼ ﺪﻨﻣﺎﮐ - -Weapon -== ﻪﺤﻠﺳﺍ - -Reset to defaults -== ﺽﺮﻓ ﺶﯿﭘ ﺖﻟﺎﺣ ﻪﺑ ﺖﺴﯾﺭ - -Voting -== ﻥﺩﺍﺩ ﯼﺍﺭ - -Miscellaneous -== ﻪﻗﺮﻔﺘﻣ - -Desktop fullscreen -== ﻪﺤﻔﺻ ﻡﺎﻤﺗ - -Screen -== ﻪﺤﻔﺻ - -UI Color -== ﺖﻨﯾﻼﮐ ﮓﻧﺭ - -Play background music -== ﻪﻨﯿﻣﺯ ﺲﭘ ﮏﯾﺯﻮﻣ ﺶﺨﭘ - -Enable game sounds -== ﯼﺯﺎﺑ ﯼﺍﺪﺻ ﻥﺩﻮﺑ ﻝﺎﻌﻓ - -Enable gun sound -== ﻪﺤﻠﺳﺍ ﯼﺍﺪﺻ ﻥﺩﻮﺑ ﻝﺎﻌﻓ - -Enable server message sound -== ﻡﺎﯿﭘ ﯼﺍﺪﺻ ﻥﺩﻮﺑ ﻝﺎﻌﻓ - -Enable team chat sound -== ﻢﯿﺗ ﺖﭼ ﯼﺍﺪﺻ ﻥﺩﻮﺑ ﻝﺎﻌﻓ - -Sound volume -== ﺍﺪﺻ ﻥﺍﺰﯿﻣ - -Game sound volume -== ﯼﺯﺎﺑ ﯼﺍﺪﺻ ﻥﺍﺰﯿﻣ - -Chat sound volume -== ﺖﭼ ﯼﺍﺪﺻ ﻥﺍﺰﯿﻣ - -Map sound volume -== ﭗﻣ ﯼﺍﺪﺻ ﻥﺍﺰﯿﻣ - -Background music volume -== ﻪﻨﯿﻣﺯ ﺲﭘ ﯼﺍﺪﺻ ﻥﺍﺰﯿﻣ - -Sound -== ﺍﺪﺻ - -Show score -== ﺯﺎﯿﺘﻣﺍ ﺶﯾﺎﻤﻧ - -Use old chat style -== ﺖﭼ ﯽﻤﯾﺪﻗ ﻞﯾﺎﺘﺳﺍ ﺯﺍ ﻩﺩﺎﻔﺘﺳﺍ - -Messages -== ﺎﻫ ﻡﺎﯿﭘ - -System message -== ﯽﻤﺘﺴﯿﺳ ﻡﺎﯿﭘ - -Preview -== ﺶﯾﺎﻤﻧ ﺶﯿﭘ - -Enable replays -== ﺶﺨﭘﺯﺎﺑ ﻥﺩﺮﮐ ﻦﺷﻭﺭ - -Gameplay -== ﯽﻠﭘ ﻢﯿﮔ - -Size -== ﻩﺯﺍﺪﻧﺍ - -AntiPing -== ﮓﻨﯿﭘ ﯽﺘﻧﺁ - -Background -== ﻪﻨﯿﻣﺯ ﺲﭘ - -Update now -== ﻦﮐ ﯽﻧﺎﺳﺭﺯﻭﺮﺑ ﻥﻻﺍ ﻦﯿﻤﻫ - -Updating… -== ﯽﻧﺎﺳﺭﺯﻭﺮﺑ ﻝﺎﺣﺭﺩ - -No updates available -== ﺖﺴﯿﻧ ﺱﺮﺘﺳﺩ ﺭﺩ ﯽﻧﺎﺳﺭﺯﻭﺮﺑ - -Check now -== ﻦﮐ ﮏﭼ ﻥﻻﺍ ﻦﯿﻤﻫ - -Discord -== ﺩﺭﻮﮑﺴﯾﺩ - -Learn -== ﺵﺯﻮﻣﺁ - -Website -== ﺖﯾﺎﺴﺑﻭ - -Settings -== ﺕﺎﻤﯿﻈﻨﺗ - -Stop server -== ﺭﻭﺮﺳ ﻒﻗﻮﺗ - -Run server -== ﺭﻭﺮﺳ ﯼﺍﺮﺟﺍ - -Editor -== ﺮﮕﺸﯾﺍﺮﯾﻭ - -[Start menu] -Play -== ﻥﺩﺮﮐ ﯼﺯﺎﺑ - -Downloading %s: -== %s :ﺩﻮﻠﻧﺍﺩ ﻝﺎﺣﺭﺩ - -Update failed! Check log… -== … ﺪﯿﻨﮐ ﮏﭼ ﺍﺭ گﻻ!ﻖﻓﻮﻣﺎﻧ ﯽﻧﺎﺳﺭﺯﻭﺮﺑ - -Restart -== ﺩﺪﺠﻣ ﯼﺯﺍﺪﻧﺍ ﻩﺍﺭ - -Spectators -== ﻥﺍﺮﮔﺎﺷﺎﻤﺗ - -Score -== ﺯﺎﯿﺘﻣﺍ - -Replay -== ﺶﺨﭘﺯﺎﺑ - -Red team wins! -== ﺪﺷ ﻩﺪﻧﺮﺑ ﺰﻣﺮﻗ ﻢﯿﺗ - -Red team -== ﺰﻣﺮﻗ ﻢﯿﺗ - -Follow -== ﻥﺩﺮﮐ ﻝﺎﺒﻧﺩ - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== .ﺪﯿﻨﮐ ﺵﻼﺗ ﻩﺭﺎﺑﻭﺩ ﻭ ﺪﯿﻫﺩ ﺮﯿﯿﻐﺗ Vulkan ﺎﯾ OpenGL ﻪﺑ ﺍﺭ gfx_backend ، settings_ddnet.cfg ﺭﺩ ،ﮓﯿﻔﻧﺎﮐ ﻪﺷﻮﭘ ﺭﺩ ﺪﯿﻨﮐ ﯽﻌﺳ. ﯼﺯﺍﺪﻧﺍ ﻩﺍﺭ ﻡﺎﮕﻨﻫ ﺭﺩ ﺎﻄﺧ - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== .ﺪﻧﺭﺍﺩ ﯽﯾﻻﺎﺑ ﺡﻮﺿﻭ ﻪﮐ ﯽﯾﺎﻬﻧﺁ ﺹﻮﺼﺧ ﻪﺑ ،ﺪﯿﻨﮐ ﻑﺬﺣ ﺍﺭ (ﻩﺮﯿﻏ ﻭ ﺎﻫ ﺖﯾﺩﻮﺟﻮﻣ ،ﺎﻫ ﻦﯿﮑﺳﺍ) ﯽﺷﺭﺎﻔﺳ ﯼﺎﻫ ﯽﯾﺍﺭﺍﺩ ﺪﯿﻨﮐ ﯽﻌﺳ . ﮏﯿﻓﺍﺮﮔ ﻢﺠﺣ ﺩﻮﺒﻤﮐ - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== .ﺪﯿﻨﮐ ﺖﯾﺪﭘﺁ ﺍﺭ ﮏﯿﻓﺍﺮﮔ ﯼﺎﻫ ﺭﻮﯾﺍﺭﺩ .ﻥﺎﻣﺮﻓ ﺩﺭﻮﮐﺭ ﻡﺎﮕﻨﻫ ﺭﺩ ﺎﻄﺧ - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== .ﺪﯿﻨﮐ ﺖﯾﺪﭘﺁ ﺍﺭ ﮏﯿﻓﺍﺮﮔ ﯼﺎﻫ ﺭﻮﯾﺍﺭﺩ .ﺭﺪﻧﺭ ﺭﻮﺘﺳﺩ ﺭﺩ ﺎﻄﺧ - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== .ﺪﯿﻨﮐ ﺖﯾﺪﭘﺁ ﺍﺭ ﮏﯿﻓﺍﺮﮔ ﯼﺎﻫ ﺭﻮﯾﺍﺭﺩ .ﺭﺪﻧﺭ ﺕﺍﺭﻮﺘﺳﺩ ﻝﺎﺳﺭﺍ ﺭﺩ ﺎﻄﺧ - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== .ﺪﯿﻨﮐ ﺖﯾﺪﭘﺁ ﺍﺭ ﮏﯿﻓﺍﺮﮔ ﯼﺎﻫ ﺭﻮﯾﺍﺭﺩ .ﺮﻓﺎﺑ ﻢﯾﺮﻓ ﺾﯾﻮﻌﺗ ﺭﺩ ﺎﻄﺧ - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== .ﺪﯿﻨﮐ ﺵﻼﺗ ﻩﺭﺎﺑﻭﺩ ﻭ ﺪﯿﻫﺩ ﺮﯿﯿﻐﺗ Vulkan ﺎﯾ OpenGL ﻪﺑ ﺍﺭ gfx_backend ، settings_ddnet.cfg ﺭﺩ ،ﮓﯿﻔﻧﺎﮐ ﻪﺷﻮﭘ ﺭﺩ ﺪﯿﻨﮐ ﯽﻌﺳ .ﺺﺨﺸﻣﺎﻧ ﯼﺎﻄﺧ - -Preparing demo playback -== ﻮﻣﺩ ﺶﺨﭘ ﯼﺯﺎﺳ ﻩﺩﺎﻣﺁ ﻝﺎﺣ ﺭﺩ - -Connected -== ﻞﺼﺘﻣ - -Loading map file from storage -== ﯼﺯﺎﺳ ﻩﺮﯿﺧﺫ ﺖﻤﺴﻗ ﺯﺍ ﭗﻣ ﻞﯾﺎﻓ ﯼﺮﯿﮔﺭﺎﺑ ﻝﺎﺣ ﺭﺩ - -Why are you slowmo replaying to read this? -== ؟ﺪﯿﻨﮐ ﯽﻣ ﺶﺨﭘ ﻪﺘﺴﻫﺁ ﺐﻠﻄﻣ ﻦﯾﺍ ﻥﺪﻧﺍﻮﺧ ﯼﺍﺮﺑ ﺍﺮﭼ - -Initializing components -== ﺎﻫ ﻪﻔﻟﻮﻣ ﻪﯿﻟﻭﺍ ﯽﻫﺩﺭﺍﺪﻘﻣ - -Initializing assets -== ﺎﻫ ﯽﯾﺍﺭﺍﺩ ﻥﺩﺮﮐ ﻩﺩﺎﻣﺁ - -Sending initial client info -== ﺖﻨﯾﻼﮐ ﻪﯿﻟﻭﺍ ﺕﺎﻋﻼﻃﺍ ﻝﺎﺳﺭﺍ - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== .ﺩﻮﺷ ﻝﺎﻌﻓﺮﯿﻏ ﯽﯾﺍﺩﺯ ﻝﺎﮑﺷﺍ ﺖﻟﺎﺣ ﺎﺗ ﺪﯿﻫﺩ ﺭﺎﺸﻓ ﺍﺭ Ctrl+Shift+D .ﺪﺷ ﻝﺎﻌﻓ ﯽﯾﺍﺩﺯ ﻝﺎﮑﺷﺍ ﺖﻟﺎﺣ - -Position: -== ﺖﯿﻌﻗﻮﻣ - -Speed: -== ﺖﻋﺮﺳ - -Angle: -== ﻪﯾﻭﺍﺯ - -Personal best: -== ﯽﺼﺨﺷ ﺩﺭﻮﮐﺭ ﻦﯾﺮﺘﻬﺑ - -Uploading map data to GPU -== GPU ﺭﺩ ﭗﻣ ﺕﺎﻋﻼﻃﺍ ﯼﺭﺍﺬﮔﺭﺎﺑ - -The audio device couldn't be initialised. -== .ﺩﻮﺷ ﯼﺯﺍﺪﻧﺍ ﻩﺍﺭ ﺪﻧﺍﻮﺗ ﯽﻤﻧ ﯽﺗﻮﺻ ﻩﺎﮕﺘﺳﺩ - -Trying to determine UDP connectivity… -== UDP… ﻝﺎﺼﺗﺍ ﻦﯿﯿﻌﺗ ﯼﺍﺮﺑ ﺵﻼﺗ - -UDP seems to be filtered. -== .ﺖﺳﺍ ﻩﺪﺷ ﺮﺘﻠﯿﻓ UDP ﺪﺳﺭ ﯽﻣ ﺮﻈﻧ ﻪﺑ - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== .ﺪﯿﻨﮐ ﻝﺎﻌﻓﺮﯿﻏ ﺍﺭ ﻪﮑﺒﺷ ﯼﺎﻫ ﻩﺪﻨﻫﺩ ﺏﺎﺘﺷ ﺎﯾ ﯽﺴﮐﻭﺮﭘ ،VPN .ﺪﻨﺘﺴﻫ ﺕﻭﺎﻔﺘﻣ TCP ﻭ UDP ﯼﺎﻫ ﺱﺭﺩﺁ IP ﺪﺳﺭ ﯽﻣ ﺮﻈﻧ ﻪﺑ - -No answer from server yet. -== .ﺖﺳﺍ ﻩﺪﺸﻧ ﺖﻓﺎﯾﺭﺩ ﺭﻭﺮﺳ ﺯﺍ ﯽﺨﺳﺎﭘ ﺯﻮﻨﻫ - -Getting game info -== ﯼﺯﺎﺑ ﺕﺎﻋﻼﻃﺍ ﺖﻓﺎﯾﺭﺩ - -Requesting to join the game -== ﯼﺯﺎﺑ ﻪﺑ ﻦﺘﺳﻮﯿﭘ ﯼﺍﺮﺑ ﺖﺳﺍﻮﺧﺭﺩ - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== ﺪﯿﻨﯿﺒﺑ ﺍﺭ ﺮﮕﯾﺩ ﯼﺎﻫﺪﯿﻠﮐ ﻪﺑ ﻁﻮﺑﺮﻣ ﺕﺎﻤﯿﻈﻨﺗ .ﺪﯿﻨﮐ ﻩﺩﺎﻔﺘﺳﺍ ﺮﮕﯾﺩ ﻥﺎﻨﮑﯾﺯﺎﺑ ﯼﺎﺷﺎﻤﺗ ﻭ ﺚﮑﻣ ﯼﺍﺮﺑ q ،(ﻩﺭﺎﺑﻭﺩ ﻉﻭﺮﺷ) ﯽﺸﮐﺩﻮﺧ ﯼﺍﺮﺑ k ﺪﯿﻠﮐ ﺯﺍ - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== .ﺪﯿﻨﮐ ﻢﯿﻈﻨﺗ ﺩﻮﺧ ﻞﯿﻣ ﻖﺑﺎﻄﻣ ﺍﺭ ﺎﻬﻧﺁ ﺎﺗ ﺪﯿﻨﮐ ﯽﺳﺭﺮﺑ ﺍﺭ ﺕﺎﻤﯿﻈﻨﺗ ،ﺭﻭﺮﺳ ﻪﺑ ﻦﺘﺳﻮﯿﭘ ﺯﺍ ﻞﺒﻗ ﺩﻮﺷ ﯽﻣ ﻪﯿﺻﻮﺗ - -Please enter your nickname below. -== .ﺪﯿﻨﮐ ﺩﺭﺍﻭ ﺮﯾﺯ ﺭﺩ ﺍﺭ ﺩﻮﺧ ﺭﺎﻌﺘﺴﻣ ﻡﺎﻧ ﺎﻔﻄﻟ - -Cancel -== ﻮﻐﻟ - -File '%s' already exists, do you want to overwrite it? -== ؟ﺪﯿﻨﮐ ﯽﺴﯾﻮﻧﺯﺎﺑ ﺍﺭ ﻥﺁ ﺪﯿﻫﺍﻮﺧ ﯽﻣ ﺎﯾﺁ ،ﺩﺭﺍﺩ ﺩﻮﺟﻭ ﻞﺒﻗ ﺯﺍ '%s' ﻞﯾﺎﻓ - -Join Tutorial Server -== ﺪﯾﺪﻧﻮﯿﭙﺑ ﯽﺷﺯﻮﻣﺁ ﺭﻭﺮﺳ ﻪﺑ - -Skip Tutorial -== ﺵﺯﻮﻣﺁ ﺯﺍ ﻥﺩﺮﮐ ﺭﺬﮔ - -transmits your player name to info.ddnet.org -== ﺪﻨﮐ ﯽﻣ ﻞﻘﺘﻨﻣ info.ddnet.org ﻪﺑ ﺍﺭ ﺩﻮﺧ ﺭﺎﻌﺘﺴﻣ ﻡﺎﻧ - -The server is running a non-standard tuning on a pure game type. -== .ﺖﺳﺍ ﺺﻟﺎﺧ ﯼﺯﺎﺑ ﻉﻮﻧ ﮏﯾ ﯼﻭﺭ ﺩﺭﺍﺪﻧﺎﺘﺳﺍ ﺮﯿﻏ ﻢﯿﻈﻨﺗ ﮏﯾ ﯼﺍﺮﺟﺍ ﻝﺎﺣ ﺭﺩ ﺭﻭﺮﺳ - -Loading menu images -== ﻮﻨﻣ ﺮﯾﻭﺎﺼﺗ ﻥﺩﺮﮐ ﻩﺩﺎﻣﺁ ﻝﺎﺣ ﺭﺩ - -AFR -== ﺎﻘﯾﺮﻓﺁ - -ASI -== ﺎﯿﺳﺁ - -AUS -== ﺎﯿﻟﺍﺮﺘﺳﺍ - -EUR -== ﺎﭘﻭﺭﺍ - -NA -== ﯽﻟﺎﻤﺷ ﯼﺎﮑﯾﺮﻣﺁ - -SA -== آمریکای جنوبی - -CHN -== ﻦﯿﭼ - -Leak IP -== IP ﺖﺸﻧ - -Are you sure that you want to remove the player '%s' from your friends list? -== ؟ﺪﯿﻨﮐ ﻑﺬﺣ ﺩﻮﺧ ﻥﺎﺘﺳﻭﺩ ﺖﺴﯿﻟ ﺯﺍ ﺍﺭ '%s' ﻦﮑﯾﺯﺎﺑ ﺪﯿﻫﺍﻮﺧ ﯽﻣ ﻪﮐ ﺪﯿﺘﺴﻫ ﻦﺌﻤﻄﻣ ﺎﯾﺁ - -Are you sure that you want to remove the clan '%s' from your friends list? -== ؟ﺪﯿﻨﮐ ﻑﺬﺣ ﺩﻮﺧ ﻥﺎﺘﺳﻭﺩ ﺖﺴﯿﻟ ﺯﺍ ﺍﺭ '%s' ﻦﻠﮐ ﺪﯿﻫﺍﻮﺧ ﯽﻣ ﻪﮐ ﺪﯿﺘﺴﻫ ﻦﺌﻤﻄﻣ ﺎﯾﺁ - -Play the current demo -== ﯽﻠﻌﻓ ﯼ ﻮﻣﺩ ﺶﺨﭘ - -Pause the current demo -== ﺚﮑﻣ - -Stop the current demo -== ﻒﻗﻮﺗ - -Go back one tick -== ﺩﺮﮔﺮﺑ ﺐﻘﻋ ﻪﺑ ﮏﯿﺗ ﮏﯾ - -Go forward one tick -== ﻭﺮﺑ ﻮﻠﺟ ﮏﯿﺗ ﮏﯾ - -Slow down the demo -== ﻮﻣﺩ ﺖﻋﺮﺳ ﻥﺩﺮﮐ ﻢﮐ - -Speed up the demo -== ﻮﻣﺩ ﺖﻋﺮﺳ ﻥﺩﺮﮐ ﺩﺎﯾﺯ - -Export cut as a separate demo -== ﻪﻧﺎﮔﺍﺪﺟ ﻮﻣﺩ ﻥﺍﻮﻨﻋ ﻪﺑ ﺵﺮﺑ ﻥﺩﺮﮐ ﺝﺭﺎﺧ - -Go back one marker -== ﺩﺮﮔﺮﺑ ﺐﻘﻋ ﻪﺑ ﺮﮕﻧﺎﺸﻧ ﮏﯾ - -Go forward one marker -== ﻭﺮﺑ ﻮﻠﺟ ﻪﺑ ﺮﮕﻧﺎﺸﻧ ﮏﯾ - -Toggle keyboard shortcuts -== ﺪﯿﻠﮐ ﻪﺤﻔﺻ ﺮﺒﻧﺎﯿﻣ ﯼﺎﻫﺪﯿﻠﮐ ﺮﯿﯿﻐﺗ - -Loading demo files -== ﻮﻣﺩ ﯼﺎﻫ ﻞﯾﺎﻓ ﻥﺩﺮﮐ ﻩﺩﺎﻣﺁ ﻝﺎﺣ ﺭﺩ - -%.2f MiB -== %.2f MiB - -%.2f KiB -== %.2f KiB - -Fetch Info -== ﺕﺎﻋﻼﻃﺍ ﯽﺸﮐﺍﻭ - -Open the directory that contains the demo files -== ﺪﯿﻨﮐ ﺯﺎﺑ ﺍﺭ ﺖﺴﻫ ﻮﻣﺩ ﯼﺎﻫ ﻞﯾﺎﻓ ﻞﻣﺎﺷ ﻪﮐ ﯼﺍ ﻪﺷﻮﭘ - -Are you sure that you want to delete the demo '%s'? -== ؟ﺪﯿﻨﮐ ﻑﺬﺣ ﺍﺭ '%s' ﻮﻣﺩ ﺪﯿﻫﺍﻮﺧ ﯽﻣ ﻪﮐ ﺪﯿﺘﺴﻫ ﻦﺌﻤﻄﻣ ﺎﯾﺁ - -Unable to delete the demo '%s' -== ﺩﺭﺍﺪﻧ ﺩﻮﺟﻭ '%s' ﻮﻣﺩ ﻑﺬﺣ ﻥﺎﮑﻣﺍ - -Loading ghost files -== ﺡﻭﺭ ﯼﺎﻫ ﻞﯾﺎﻓ ﻥﺩﺮﮐ ﻩﺩﺎﻣﺁ ﻝﺎﺣ ﺭﺩ - -Menu opened. Press Esc key again to close menu. -== .ﺩﻮﺷ ﻪﺘﺴﺑ ﻮﻨﻣ ﺎﺗ ﺪﯿﻫﺩ ﺭﺎﺸﻓ ﺍﺭ Esc ﺪﯿﻠﮐ ﻩﺭﺎﺑﻭﺩ ﺪﺷ ﺯﺎﺑ ﻮﻨﻣ - -Save power by lowering refresh rate (higher input latency) -== (ﺮﺗﻻﺎﺑ ﯼﺩﻭﺭﻭ ﺮﯿﺧﺄﺗ) ﯽﻧﺎﺳﺭﺯﻭﺮﺑ ﺥﺮﻧ ﺶﻫﺎﮐ ﺎﺑ ﯼﮊﺮﻧﺍ ﻑﺮﺼﻣ ﺭﺩ ﯽﯾﻮﺟ ﻪﻓﺮﺻ - -Settings file -== ﺕﺎﻤﯿﻈﻨﺗ ﻞﯾﺎﻓ - -Open the settings file -== ﺕﺎﻤﯿﻈﻨﺗ ﻞﯾﺎﻓ ﻥﺩﺮﮐ ﺯﺎﺑ - -Config directory -== ﮓﯿﻔﻧﺎﮐ ﻪﺷﻮﭘ - -Open the directory that contains the configuration and user files -== ﺪﯿﻨﮐ ﺯﺎﺑ ﺍﺭ ﯼﺮﺑﺭﺎﮐ ﯼﺎﻫ ﻞﯾﺎﻓ ﻭ ﮓﯿﻔﻧﺎﮐ ﯼﻭﺎﺣ ﻪﺷﻮﭘ - -Themes directory -== ﺎﻫ ﻢﺗ ﻪﺷﻮﭘ - -Open the directory to add custom themes -== ﺪﯿﻨﮐ ﺯﺎﺑ ﯽﺷﺭﺎﻔﺳ ﯼﺎﻫ ﻢﺗ ﻥﺩﻭﺰﻓﺍ ﯼﺍﺮﺑ ﺍﺭ ﻪﺷﻮﭘ - -Automatically take statboard screenshot -== ﺕﺎﻋﻼﻃﺍ ﻮﻠﺑﺎﺗ ﺯﺍ ﺭﺎﮐﺩﻮﺧ ﺕﺎﺷ ﻦﯾﺮﮑﺳﺍ - -Automatically create statboard csv -== ﺕﺎﻋﻼﻃﺍ ﻮﻠﺑﺎﺗ ﺯﺍ csv ﺖﻣﺮﻓ ﺭﺎﮐﺩﻮﺧ ﺩﺎﺠﯾﺍ - -Max CSVs -== ﺎﻫ csv ﺩﺍﺪﻌﺗ ﺮﺜﮐﺍﺪﺣ - -Loading skin files -== ﻦﯿﮑﺳﺍ ﯼﺎﻫ ﻞﯾﺎﻓ ﻥﺩﺮﮐ ﻩﺩﺎﻣﺁ ﻝﺎﺣ ﺭﺩ - -Download community skins -== ﻦﻤﺠﻧﺍ ﯼﺎﻫ ﻦﯿﮑﺳﺍ ﺩﻮﻠﻧﺍﺩ - -Vanilla skins only -== ﯽﻠﯿﻧﺍﻭ ﯼﺎﻫ ﻦﯿﮑﺳﺍ ﻂﻘﻓ - -Choose default eyes when joining a server -== . ﺭﻭﺮﺳ ﻪﺑ ﻦﺘﺳﻮﯿﭘ ﻡﺎﮕﻨﻫ ﺽﺮﻓ ﺶﯿﭘ ﯼﺎﻫ ﻢﺸﭼ ﺏﺎﺨﺘﻧﺍ - -Skins directory -== ﺎﻫ ﻦﯿﮑﺳﺍ ﻪﺷﻮﭘ - -Open the directory to add custom skins -== ﻦﮐ ﺯﺎﺑ ﯽﺷﺭﺎﻔﺳ ﯼﺎﻫ ﻦﯿﮑﺳﺍ ﻥﺩﻭﺰﻓﺍ ﯼﺍﺮﺑ ﺍﺭ ﺎﻫ ﻦﯿﮑﺳﺍ ﯼ ﻪﺷﻮﭘ - -Hook collisions -== ﺏﻼﻗ ﯼﺎﻫ ﺩﺭﻮﺧﺮﺑ - -Toggle ghost -== ﺡﻭﺭ ﺖﻟﺎﺣ ﻥﺩﺮﮐ ﻦﺷﻭﺭ - -Dummy copy -== ﯽﭙﮐ ﯽﻣﺍﺩ - -Hammerfly dummy -== ﯽﻣﺍﺩ ﺶﮑﭼ ﺎﺑ ﺯﺍﻭﺮﭘ - -Spectate next -== ﯼﺪﻌﺑ ﯼﺎﺷﺎﻤﺗ - -Spectate previous -== ﯽﻠﺒﻗ ﯼﺎﺷﺎﻤﺗ - -Remote console -== ﺭﻭﺩ ﻩﺍﺭ ﺯﺍ ﻝﻮﺴﻨﮐ - -Statboard -== ﺕﺎﻋﻼﻃﺍ ﻮﻠﺑﺎﺗ - -Enable controller -== ﻦﮐ ﻝﺎﻌﻓ ﺍﺭ ﺮﻟﺮﺘﻨﮐ - -[Ingame controller mode] -Relative -== ﯽﺒﺴﻧ [ﯼﺯﺎﺑ ﺮﻟﺮﺘﻨﮐ ﺖﻟﺎﺣ] - -[Ingame controller mode] -Absolute -== ﻖﻠﻄﻣ [ﯼﺯﺎﺑ ﺮﻟﺮﺘﻨﮐ ﺖﻟﺎﺣ] - -Ingame controller mode -== ﯼﺯﺎﺑ ﺮﻟﺮﺘﻨﮐ ﺖﻟﺎﺣ - -Ingame controller sens. -== ﯼﺯﺎﺑ ﺮﻟﺮﺘﻨﮐ ﺮﮕﺴﺣ - -UI controller sens. -== ﯼﺮﺑﺭﺎﮐ ﻂﺑﺍﺭ ﺮﻟﺮﺘﻨﮐ ﺮﮕﺴﺣ - -Controller jitter tolerance -== ﺮﻟﺮﺘﻨﮐ ﺵﺯﺮﻟ ﻞﻤﺤﺗ - -No controller found. Plug in a controller. -== ﺪﯿﻨﮐ ﻞﺻﻭ ﺮﻟﺮﺘﻨﮐ ﮏﯾ .ﺪﺸﻧ ﺍﺪﯿﭘ ﯼﺮﻟﺮﺘﻨﮐ ﭻﯿﻫ - -Status -== ﺖﯿﻌﺿﻭ - -Aim bind -== ﻪﻧﻮﺸﻧ ﺪﻨﯾﺎﺑ - -Mouse -== ﺱﻮﻣ - -Ingame mouse sens. -== ﯼﺯﺎﺑ ﻞﺧﺍﺩ ﺱﻮﻣ ﺮﮕﺴﺣ - -UI mouse sens. -== ﻮﻨﻣ ﺭﺩ ﺱﻮﻣ ﺮﮕﺴﺣ - -Controller -== ﺮﻟﺮﺘﻨﮐ - -Reset controls -== ﺎﻫ ﻝﺮﺘﻨﮐ ﻥﺩﺮﮐ ﺖﺴﯾﺭ - -Are you sure that you want to reset the controls to their defaults? -== ؟ﺪﯿﻧﺍﺩﺮﮔﺯﺎﺑ ﺽﺮﻓ ﺶﯿﭘ ﺖﻟﺎﺣ ﻪﺑ ﺍﺭ ﺎﻫ ﻝﺮﺘﻨﮐ ﺪﯿﻫﺍﻮﺧ ﯽﻣ ﻪﮐ ﺪﯿﺘﺴﻫ ﻦﺌﻤﻄﻣ ﺎﯾﺁ - -Dummy -== ﯽﻣﺍﺩ - -Windowed -== ﯼﺍ ﻩﺮﺠﻨﭘ - -Windowed borderless -== ﻪﯿﺷﺎﺣ ﻥﻭﺪﺑ ﯼﺍ ﻩﺮﺠﻨﭘ - -Windowed fullscreen -== ﻪﺤﻔﺻ ﻡﺎﻤﺗ ﯼﺍ ﻩﺮﺠﻨﭘ - -V-Sync -== V-Sync - -may cause delay -== ﺩﻮﺷ ﺮﯿﺧﺎﺗ ﺚﻋﺎﺑ ﺖﺳﺍ ﻦﮑﻤﻣ - -FSAA samples -== FSAA ﯼﺎﻫ ﻪﻧﻮﻤﻧ - -Allows maps to render with more detail -== ﺪﻧﻮﺷ ﺭﺪﻧﺭ ﺮﺘﺸﯿﺑ ﺕﺎﯿﺋﺰﺟ ﺎﺑ ﺎﺗ ﺪﻫﺩ ﯽﻣ ﻩﺯﺎﺟﺍ ﺎﻫ ﻪﺸﻘﻧ ﻪﺑ - -Use high DPI -== ﻻﺎﺑ DPI ﺯﺍ ﻩﺩﺎﻔﺘﺳﺍ - -Renderer -== ﻩﺪﻨﻨﮐ ﺭﺪﻧﺭ - -default -== ﺽﺮﻓ ﺶﯿﭘ - -custom -== ﯽﺷﺭﺎﻔﺳ - -auto -== ﺭﺎﮐﺩﻮﺧ - -Enable long pain sound (used when shooting in freeze) -== (ﺩﻮﺷ ﯽﻣ ﻩﺩﺎﻔﺘﺳﺍ ﺰﯾﺮﻓ ﺖﻟﺎﺣ ﺭﺩ ﮏﯿﻠﺷ ﻡﺎﮕﻨﻫ) ﺪﯿﻨﮐ ﻝﺎﻌﻓ ﺍﺭ ﯽﻧﻻﻮﻃ ﺩﺭﺩ ﯼﺍﺪﺻ - -Enable regular chat sound -== ﯽﻟﻮﻤﻌﻣ ﺖﭼ ﯼﺍﺪﺻ ﻥﺩﻮﺑ ﻝﺎﻌﻓ - -Enable highlighted chat sound -== ﻩﺪﺷ ﺖﯾﻼﯾﺎﻫ ﺖﭼ ﯼﺍﺪﺻ ﻥﺩﺮﮐ ﻦﺷﻭﺭ - -Appearance -== ﺮﻫﺎﻇ - -DDNet -== ﺖﻨﯾﺪﯾﺩ - -Assets -== ﺎﻫ ﯽﯾﺍﺭﺍﺩ - -DDNet Client needs to be restarted to complete update! -== !ﺩﻮﺷ ﺕﺭﺎﺘﺳﺍ ﯼﺭ ﺪﯾﺎﺑ ﯽﻧﺎﺳﺭﺯﻭﺭ‌ﻪﺑ ﻞﯿﻤﮑﺗ ﯼﺍﺮﺑ ﺖﻨﯾﺪﯾﺩ ﺖﻨﯾﻼﮐ - -You must restart the game for all settings to take effect. -== .ﺪﯿﻨﮐ ﯼﺯﺍﺪﻧﺍ ﻩﺍﺭ ﺍﺩﺪﺠﻣ ﺍﺭ ﯼﺯﺎﺑ ﺪﯾﺎﺑ ﺕﺎﻤﯿﻈﻨﺗ ﯽﻣﺎﻤﺗ ﻝﺎﻤﻋﺍ ﯼﺍﺮﺑ - -Hue -== ﮓﻧﺭ - -Sat. -== ﮓﻧﺭ ﺕﺪﺷ - -Lht. -== ﯽﯾﺎﻨﺷﻭﺭ ﺕﺪﺷ - -Alpha -== ﺎﻔﻟﺁ - -HUD -== HUD - -Name Plate -== ﻡﺎﻧ کﻼﭘ - -Hook Collisions -== ﺏﻼﻗ ﯼﺎﻫ ﺩﺭﻮﺧﺮﺑ - -Show health, shields and ammo -== ﺕﺎﻤﻬﻣ ﻭ ﺮﭙﺳ ،ﯽﺘﻣﻼﺳ ﺶﯾﺎﻤﻧ - -Show name plates -== ﻡﺎﻧ ﯼﺎﻫ کﻼﭘ ﺶﯾﺎﻤﻧ - -Show kill messages -== ﻥﺩﺮﻣ ﯼﺎﻫ ﻡﺎﯿﭘ ﺶﯾﺎﻤﻧ - -Show votes window after voting -== ﯼﺮﯿﮔ ﯼﺍﺭ ﺯﺍ ﺲﭘ ﺀﺍﺭﺁ ﻩﺮﺠﻨﭘ ﺶﯾﺎﻤﻧ - -DDRace HUD -== DDRace HUD - -Show DDRace HUD -== DDRace HUD ﺶﯾﺎﻤﻧ - -Show jumps indicator -== ﺎﻫ ﺵﺮﭘ ﺮﮕﻧﺎﺸﻧ ﺶﯾﺎﻤﻧ - -Show dummy actions -== ﯽﻣﺍﺩ ﯼﺎﻫ ﺖﮐﺮﺣ ﺶﯾﺎﻤﻧ - -Show player position -== ﻦﮑﯾﺯﺎﺑ ﺖﯿﻌﻗﻮﻣ ﺶﯾﺎﻤﻧ - -Show player speed -== ﻦﮑﯾﺯﺎﺑ ﺖﻋﺮﺳ ﺶﯾﺎﻤﻧ - -Show player target angle -== ﻦﮑﯾﺯﺎﺑ ﻪﻧﻮﺸﻧ ﻪﯾﻭﺍﺯ ﺶﯾﺎﻤﻧ - -Show freeze bars -== ﺰﯾﺮﻓ ﯼﺎﻫﺭﺍﻮﻧ ﺶﯾﺎﻤﻧ - -Opacity of freeze bars inside freeze -== ﺰﯾﺮﻓ ﻞﺧﺍﺩ ﺰﯾﺮﻓ ﯼﺎﻫ ﻪﻠﯿﻣ ﯼﺭﺎﺗ - -Show names in chat in team colors -== ﯽﻤﯿﺗ ﯼﺎﻫ ﮓﻧﺭ ﺎﺑ ﺖﭼ ﺭﺩ ﺎﻫ ﻡﺎﻧ ﺶﯾﺎﻤﻧ - -Highlighted message -== ﻩﺪﺷ ﺖﯾﻼﯾﺎﻫ ﻡﺎﯿﭘ - -Team message -== ﻢﯿﺗ ﻡﺎﯿﭘ - -Friend message -== ﺖﺳﻭﺩ ﻡﺎﯿﭘ - -Normal message -== ﯼﺩﺎﻋ ﻡﺎﯿﭘ - -Client message -== ﺖﻨﯾﻼﮐ ﻡﺎﯿﭘ - -Name plates size -== ﻢﺳﺍ کﻼﭘ ﻩﺯﺍﺪﻧﺍ - -Show clan above name plates -== ﻢﺳﺍ ﯼﻻﺎﺑ ﺭﺩ ﻦﻠﮐ ﺶﯾﺎﻤﻧ - -Clan plates size -== ﻦﻠﮐ ﯼﺎﻫ‌کﻼﭘ ﻩﺯﺍﺪﻧﺍ - -Use team colors for name plates -== ﻡﺎﻧ کﻼﭘ ﯼﺍﺮﺑ ﯽﻤﯿﺗ ﯼﺎﻫ ﮓﻧﺭ ﺯﺍ ﻩﺩﺎﻔﺘﺳﺍ - -Show other players' key presses -== ﺮﮕﯾﺩ ﻥﺎﻨﮑﯾﺯﺎﺑ ﺪﯿﻠﮐ ﺭﺎﺸﻓ ﺶﯾﺎﻤﻧ - -Show local player's key presses -== ﯽﻠﺤﻣ ﻥﺎﻨﮑﯾﺯﺎﺑ ﺪﯿﻠﮐ ﺭﺎﺸﻓ ﺶﯾﺎﻤﻧ - -Hook collision line -== ﺏﻼﻗ ﺩﺭﻮﺧﺮﺑ ﻂﺧ - -Show other players' hook collision lines -== ﺮﮕﯾﺩ ﻥﺎﻨﮑﯾﺯﺎﺑ ﺏﻼﻗ ﺩﺭﻮﺧﺮﺑ ﻁﻮﻄﺧ ﺶﯾﺎﻤﻧ - -Hook collision line opacity -== ﺏﻼﻗ ﺩﺭﻮﺧﺮﺑ ﻂﺧ ﺖﯿﻓﺎﻔﺷ - -Colors of the hook collision line, in case of a possible collision with: -== :ﺎﺑ ﯽﻟﺎﻤﺘﺣﺍ ﺩﺭﻮﺧﺮﺑ ﺕﺭﻮﺻ ﺭﺩ ،ﺏﻼﻗ ﺩﺭﻮﺧﺮﺑ ﻂﺧ ﯼﺎﻫ ﮓﻧﺭ - -Your movements are not taken into account when calculating the line colors -== ﺩﻮﺷ ﯽﻤﻧ ﻪﺘﻓﺮﮔ ﺮﻈﻧ ﺭﺩ ﻁﻮﻄﺧ ﮓﻧﺭ ﻪﺒﺳﺎﺤﻣ ﻡﺎﮕﻨﻫ ﺭﺩ ﺎﻤﺷ ﺕﺎﮐﺮﺣ - -Nothing hookable -== ﺮﯾﺬﭘﺎﻧ ﺏﻼﻗ - -Something hookable -== ﺮﯾﺬﭘ ﺏﻼﻗ - -A Tee -== ﯽﺗ - -Normal Color -== ﯽﻟﻮﻤﻌﻣ ﮓﻧﺭ - -Highlight Color -== ﺖﯾﻼﯾﺎﻫ ﮓﻧﺭ - -Weapons -== ﺎﻫ ﺡﻼﺳ - -Rifle Laser Outline Color -== ﺭﺰﯿﻟ ﮓﻨﻔﺗ ﯽﻧﻭﺮﯿﺑ ﻂﺧ ﮓﻧﺭ - -Rifle Laser Inner Color -== ﺭﺰﯿﻟ ﮓﻨﻔﺗ ﯽﻠﺧﺍﺩ ﮓﻧﺭ - -Shotgun Laser Outline Color -== ﻥﺎﮕﺗﺎﺷ ﺭﺰﯿﻟ ﯽﻧﻭﺮﯿﺑ ﻂﺧ ﮓﻧﺭ - -Shotgun Laser Inner Color -== ﻥﺎﮕﺗﺎﺷ ﺭﺰﯿﻟ ﯽﻠﺧﺍﺩ ﮓﻧﺭ - -Entities -== ﺎﻫ ﺖﯾﺩﻮﺟﻮﻣ - -Door Laser Outline Color -== ﺏﺭﺩ ﺭﺰﯿﻟ ﯽﻧﻭﺮﯿﺑ ﻂﺧ ﮓﻧﺭ - -Door Laser Inner Color -== ﺏﺭﺩ ﺭﺰﯿﻟ ﯽﻠﺧﺍﺩ ﮓﻧﺭ - -Freeze Laser Outline Color -== ﺰﯾﺮﻓ ﺭﺰﯿﻟ ﯽﻧﻭﺮﯿﺑ ﻂﺧ ﮓﻧﺭ - -Freeze Laser Inner Color -== ﺰﯾﺮﻓ ﺭﺰﯿﻟ ﯽﻠﺧﺍﺩ ﮓﻧﺭ - -Set all to Rifle -== ﯼﺭﺰﯿﻟ ﮓﻨﻔﺗ ﯼﻭﺭ ﻪﻤﻫ ﻢﯿﻈﻨﺗ - -Save the best demo of each race -== ﻪﻘﺑﺎﺴﻣ ﺮﻫ ﻮﻣﺩ ﻦﯾﺮﺘﻬﺑ ﻩﺮﯿﺧﺫ - -Default length -== ﺽﺮﻓ‌ﺶﯿﭘ ﻝﻮﻃ - -When you cross the start line, show a ghost tee replicating the movements of your best time -== ﺪﻨﮐ ﯽﻣ ﺭﺍﺮﮑﺗ ﺍﺭ ﺎﻤﺷ ﻥﺎﻣﺯ ﻦﯾﺮﺘﻬﺑ ﺕﺎﮐﺮﺣ ﻪﮐ ﻩﺪﺑ ﺶﯾﺎﻤﻧ ﺍﺭ ﺡﻭﺭ ،ﺪﯿﻨﮐ ﯽﻣ ﺭﻮﺒﻋ ﻉﻭﺮﺷ ﻂﺧ ﺯﺍ ﻪﮐ ﯽﻣﺎﮕﻨﻫ - -Show ghost -== ﺡﻭﺭ ﺶﯾﺎﻤﻧ - -Save ghost -== ﺡﻭﺭ ﯼ ﻩﺮﯿﺧﺫ - -Overlay entities -== ﺎﻫ ﺖﯾﺩﻮﺟﻮﻣ ﯽﻧﺎﺷﻮﭙﻤﻫ - -Show text entities -== ﯽﻨﺘﻣ ﯼﺎﻫ ﺖﯾﺩﻮﺟﻮﻣ ﺶﯾﺎﻤﻧ - -Opacity -== ﺖﯿﻓﺎﻔﺷ - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== ﺎﻬﻧﺁ ﻢﺳﺍ ﻭ ﺎﻫ ﯽﺗ ﺪﻨﻧﺎﻣ ،ﺮﮕﯾﺩ ﯼﺎﻫ‌ﻢﯿﺗ ﻪﺑ ﻖﻠﻌﺘﻣ ﯼﺎﻫ‌ﺖﯾﺩﻮﺟﻮﻣ ﺖﯿﻓﺎﻔﺷ ﻢﯿﻈﻨﺗ - -Show others (own team only) -== (ﯽﺼﺨﺷ ﻢﯿﺗ ﻂﻘﻓ) ﻥﺍﺮﮕﯾﺩ ﺶﯾﺎﻤﻧ - -Show quads -== ﺎﻫ ﯽﯾﺎﺗﺭﺎﻬﭼ ﺶﯾﺎﻤﻧ - -Quads are used for background decoration -== ﺩﻮﺷ ﯽﻣ ﻩﺩﺎﻔﺘﺳﺍ ﻪﻨﯿﻣﺯﺲﭘ ﻦﯿﯾﺰﺗ ﯼﺍﺮﺑ ﯽﯾﺎﺗﺭﺎﻬﭼ - -Tries to predict other entities to give a feel of low latency -== ﺪﻨﮐ ﺩﺎﺠﯾﺍ ﺍﺭ ﻢﮐ ﺮﯿﺧﺎﺗ ﺱﺎﺴﺣﺍ ﺎﺗ ﺪﻨﮐ ﯽﻨﯿﺑ‌ﺶﯿﭘ ﺍﺭ ﺎﻫ‌ﺖﯾﺩﻮﺟﻮﻣ ﺮﯾﺎﺳ ﺪﻨﮐ‌ﯽﻣ ﯽﻌﺳ - -AntiPing: predict other players -== ﻥﺎﻨﮑﯾﺯﺎﺑ ﺮﯾﺎﺳ ﯽﻨﯿﺑ ﺶﯿﭘ AntiPing: - -AntiPing: predict weapons -== ﺡﻼﺳ ﯽﻨﯿﺑ ﺶﯿﭘ AntiPing: - -AntiPing: predict grenade paths -== ﺎﻫ ﮏﺠﻧﺭﺎﻧ ﺮﯿﺴﻣ ﯽﻨﯿﺑ‌ﺶﯿﭘ AntiPing: - -Use current map as background -== ﺪﯿﻨﮐ ﻩﺩﺎﻔﺘﺳﺍ ﻪﻨﯿﻣﺯ ﺲﭘ ﻥﺍﻮﻨﻋ ﻪﺑ ﯽﻠﻌﻓ ﻪﺸﻘﻧ ﺯﺍ - -Show tiles layers from BG map -== BG ﭗﻣ ﺯﺍﺎﻫ ﯽﺷﺎﮐ ﯼﺎﻫ ﻪﯾﻻ ﺶﯾﺎﻤﻧ - -New random timeout code -== ﺪﯾﺪﺟ ﯽﻓﺩﺎﺼﺗ ﺕﻭﺍﻢﯾﺎﺗ ﺪﮐ - -Run on join -== ﻦﺘﺳﻮﯿﭘ ﺭﺩ ﺍﺮﺟﺍ - -Chat command (e.g. showall 1) -== (showall ١ ﻝﺎﺜﻣ ﻥﺍﻮﻨﻋ ﻪﺑ) ﺖﭼ ﻥﺎﻣﺮﻓ - -DDNet %s is available: -== :ﺖﺳﺍ ﺩﻮﺟﻮﻣ ﺖﻨﯾﺪﯾﺩ %s - -DDNet Client updated! -== !ﺪﺷ ﺯﻭﺭ ﻪﺑ ﺖﻨﯾﺪﯾﺩ ﺖﻨﯾﻼﮐ - -Emoticons -== ﺎﻫ ﮏﻠﮑﺷ - -Particles -== ﺕﺍﺭﺫ - -Extras -== ﯽﻓﺎﺿﺍ ﺩﺭﺍﻮﻣ - -Loading assets -== ﺎﻫ ﯽﯾﺍﺭﺍﺩ ﻥﺩﺮﮐ ﻩﺩﺎﻣﺁ - -Assets directory -== ﺎﻫ ﯽﯾﺍﺭﺍﺩ ﻪﺷﻮﭘ - -Open the directory to add custom assets -== ﻦﮐ ﺯﺎﺑ ﯽﺷﺭﺎﻔﺳ ﯼﺎﻫ ﯽﯾﺍﺭﺍﺩ ﻥﺩﻭﺰﻓﺍ ﯼﺍﺮﺑ ﺍﺭ ﯽﯾﺍﺭﺍﺩ ﯼ ﻪﺷﻮﭘ - -https://ddnet.org/discord -== https://ddnet.org/discord - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ - -Tutorial -== ﺵﺯﻮﻣﺁ - -Can't find a Tutorial server -== ﺪﺸﻧ ﺍﺪﯿﭘ ﯽﺷﺯﻮﻣﺁ ﺭﻭﺮﺳ - -Server executable not found, can't run server -== ﺩﺮﮐ ﺍﺮﺟﺍ ﻥﺍﻮﺗ ﯽﻤﻧ ﺍﺭ ﺭﻭﺮﺳ ،ﺪﺸﻧ ﺍﺪﯿﭘ ﺭﻭﺮﺳ ﯽﯾﺍﺮﺟﺍ ﻞﯾﺎﻓ - -DDNet %s is out! -== !ﺪﺷ ﺮﺸﺘﻨﻣ %s ﺖﻨﯾﺪﯾﺩ - -Loading race demo files -== ﻪﻘﺑﺎﺴﻣ ﯽﺸﯾﺎﻣﺯﺁ ﯼﺎﻫ ﻞﯾﺎﻓ ﻥﺩﺮﮐ ﻩﺩﺎﻣﺁ ﻝﺎﺣ ﺭﺩ - -Time limit: %d min -== ﻪﻘﯿﻗﺩ %d :ﯽﻧﺎﻣﺯ ﺖﯾﺩﻭﺪﺤﻣ - -Super -== ﺮﭘﻮﺳ - -Team %d -== %d ﻢﯿﺗ - -Manual -== ﯽﺘﺳﺩ - -Race -== ﻪﻘﺑﺎﺴﻣ - -Auto -== ﺭﺎﮐﺩﻮﺧ - -Loading sound files -== ﯽﺗﻮﺻ ﯼﺎﻫ ﻞﯾﺎﻓ ﻥﺩﺮﮐ ﻩﺩﺎﻣﺁ ﻝﺎﺣ ﺭﺩ - -Frags -== ﺎﻫ ﻪﺘﺸﮐ ﺩﺍﺪﻌﺗ - -Deaths -== ﺎﻫ گﺮﻣ - -Suicides -== ﺎﻫ ﯽﺸﮐﺩﻮﺧ - -Ratio -== ﺖﺒﺴﻧ - -Net -== ﺺﻟﺎﺧ - -Best -== ﻦﯾﺮﺘﻬﺑ - -1 new mention -== ﺪﯾﺪﺟ ﻦﺸﻨﻣ ١ - -%d new mentions -== ﺪﯾﺪﺟ ﻦﺸﻨﻣ %d - -9+ new mentions -== ﺪﯾﺪﺟ ﯼﺎﻫ ﻦﺸﻨﻣ ٩+ - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== .ﺩﻮﺷﯽﻣ ﻩﺩﺍﺩ ﺖﺸﮔﺯﺎﺑ ﺽﺮﻓﺶﯿﭘ ﻂﺑﺍﺭ ﻪﺑ ﻥﻮﻨﻛﺍ ،ﺩﺮﻛ ﻩﺩﺎﻔﺘﺳﺍ ﻩﺪﺷ ﻩﺩﺍﺩ ﯽﻜﯿﻓﺍﺮﮔ ﻂﺑﺍﺭ ﺯﺍ ﻥﺍﻮﺗﯽﻤﻧ - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== .ﺪﯾﺍ ﻩﺩﺮﻜﻧ ﺐﺼﻧ ﺍﺭ ﻚﯿﻓﺍﺮﮔ ﺕﺭﺎﻛ ﺭﻮﯾﺍﺭﺩ ﻪﻛ ﺖﺳﺍ ﻞﯿﻟﺩ ﻦﯾﺍ ﻪﺑ ًﻻﺎﻤﺘﺣﺍ ،ﺩﺮﻛ ﻪﯿﻟﻭﺍ ﯽﻫﺩﺭﺍﺪﻘﻣ ﺍﺭ ﻩﺪﺷ ﻩﺩﺍﺩ ﻚﯿﻓﺍﺮﮔ ﺪﻧﺍ ﻚﺑ ﻥﺍﻮﺗ ﯽﻤﻧ - -Could not resolve connect address '%s'. See local console for details. -== .ﺪﯿﻨﻛ ﻪﻌﺟﺍﺮﻣ ﯽﻠﺤﻣ ﻝﻮﺴﻨﻛ ﻪﺑ ﺮﺘﺸﯿﺑ ﺕﺎﯿﺋﺰﺟ ىﺍﺮﺑ .ﺩﻮﺒﻧ ﻦﻜﻤﻣ '%s' ﺱﺭﺩﺁ ﻪﺑ ﻝﺎﺼﺗﺍ - -Connect address error -== ﻝﺎﺼﺗﺍ ﺱﺭﺩﺁ ىﺎﻄﺧ - -Could not save downloaded map. Try manually deleting this file: %s -== %s :ﺪﯿﻨﻛ ﻑﺬﺣ ﺍﺭ ﻞﯾﺎﻓ ﻦﯾﺍ ﯽﺘﺳﺩ ﺕﺭﻮﺻ ﻪﺑ ﺪﯿﻨﻛ ﯽﻌﺳ .ﺪﺸﻧ ﻩﺮﯿﺧﺫ ﻩﺪﺷ ﺩﻮﻠﻧﺍﺩ ﭗﻣ - -Could not connect dummy -== ﺪﺸﻧ ﻞﺼﺘﻣ ﯽﻣﺍﺩ - -Error playing demo -== ﻮﻣﺩ ﻥﺩﺮﻛ ﺍﺮﺟﺍ ﺭﺩ ﺎﻄﺧ - -Failed saving the replay! -== !ﺩﻮﺑ ﻖﻓﻮﻣﺎﻧ ﺩﺪﺠﻣ ﺶﺨﭘ ﻥﺩﺮﻛ ﻩﺮﯿﺧﺫ - -Saving settings to '%s' failed -== ﺪﺸﻧ ﻡﺎﺠﻧﺍ "%s" ﺭﺩ ﺕﺎﻤﯿﻈﻨﺗ ﻥﺩﺮﻛ ﻩﺮﯿﺧﺫ - -Error saving settings -== ﺕﺎﻤﯿﻈﻨﺗ ﻥﺩﺮﻛ ﻩﺮﯿﺧﺫ ﺭﺩ ﺎﻄﺧ - -The format of texture %s is not RGBA which will cause visual bugs. -== .ﺩﻮﺷ ﯽﻣ ىﺮﻫﺎﻇ ﻝﺎﻜﺷﺍ ﺩﺎﺠﯾﺍ ﺚﻋﺎﺑ ﻪﻛ ﺖﺴﯿﻧ %s RGBA ﯽﻜﯿﻓﺍﺮﮔ ﺖﻟﺎﺣ ﺖﻣﺮﻓ - -Loading demo file from storage -== ﻪﻈﻓﺎﺣ ﺯﺍ ﻮﻣﺩ ﻞﯾﺎﻓ ىﺮﯿﮔﺭﺎﺑ ﻝﺎﺣ ﺭﺩ - -Initializing map logic -== ﭗﻣ ﻖﻄﻨﻣ ىﺯﺍﺪﻧﺍ ﻩﺍﺭ - -Quitting. Please wait… -== …ﺪﯿﻨﻛﺮﺒﺻ ﺎﻔﻄﻟ .ﻥﺪﺷ ﺝﺭﺎﺧ ﻝﺎﺣ ﺭﺩ - -Restarting. Please wait… -== ﺪﯿﻨﻛ ﺮﺒﺻ ﺎﻔﻄﻟ .ﺩﺪﺠﻣ ىﺯﺍﺪﻧﺍ ﻩﺍﺭ ﻝﺎﺣ ﺭﺩ - -Searching -== ﻮﺟ ﻭ ﺖﺴﺟ ﻝﺎﺣ ﺭﺩ - -Enter Username -== ﺪﯿﻨﻛ ﺩﺭﺍﻭ ﺍﺭ ىﺮﺑﺭﺎﻛ ﻡﺎﻧ - -Enter Password -== ﺪﯿﻨﻛ ﺩﺭﺍﻭ ﺍﺭ ﺭﻮﺒﻋﺰﻣﺭ - -NOT CONNECTED -== ﺪﺸﻧ ﻞﺼﺘﻣ - -Match %d of %d -== %d ﺯﺍ %d ﻪﻘﺑﺎﺴﻣ - -No results -== ﻪﺠﯿﺘﻧ ﻥﻭﺪﺑ - -Lines %d - %d (%s) -== %d - %d (%s) ﻁﻮﻄﺧ - -Locked -== ﺪﺷ ﻞﻔﻗ - -Following -== ﻥﺩﺮﻛ ﻝﺎﺒﻧﺩ - -Loading commands… -== …ﺕﺍﺭﻮﺘﺳﺩ ىﺮﯿﮔﺭﺎﺑ ﻝﺎﺣ ﺭﺩ - -Multi-View -== ﯽﻧﺎﮕﻤﻫ-ﺪﯾﺩ - -[Spectating] -Following %s -== %s ﻥﺩﺮﻛ ﻝﺎﺒﻧﺩ - -Some map images could not be loaded. Check the local console for details. -== .ﺪﯿﻨﻛ ﯽﺳﺭﺮﺑ ﺍﺭ ﯽﻠﺤﻣ ﻝﻮﺴﻨﻛ ،ﺕﺎﯿﺋﺰﺟ ىﺍﺮﺑ .ﺪﻧﺪﺸﻧ ىﺮﯿﮔﺭﺎﺑ ﭗﻣ ﺮﯾﻭﺎﺼﺗ ﺯﺍ ﯽﺧﺮ - -Some map sounds could not be loaded. Check the local console for details. -== .ﺪﯿﻨﻛ ﯽﺳﺭﺮﺑ ﺍﺭ ﯽﻠﺤﻣ ﻝﻮﺴﻨﻛ ،ﺕﺎﯿﺋﺰﺟ ىﺍﺮﺑ .ﺪﻧﺪﺸﻧ ىﺮﯿﮔﺭﺎﺑ ﭗﻣ ىﺎﻫﺍﺪﺻ ﺯﺍ ﯽﺧﺮﺑ - -Loading menu themes -== ﻮﻨﻣ ىﺎﻫ ﻢﺗ ىﺮﯿﮔﺭﺎﺑ ﻝﺎﺣ ﺭﺩ - -Press a key… -== …ﺪﯿﻫﺩ ﺭﺎﺸﻓ ﺍﺭ ﺪﯿﻠﻛ ﻚﯾ - -Main menu -== ﯽﻠﺻﺍ ىﻮﻨﻣ - -Rename folder -== ﻪﺷﻮﭘ ﻡﺎﻧ ﺮﯿﯿﻐﺗ - -Render complete -== ﺪﺷ ﻞﻣﺎﻛ ﺭﺪﻧﺭ - -Are you sure that you want to restart? -== ؟ﺪﯿﻨﻛ ىﺯﺍﺪﻧﺍ ﻩﺍﺭ ﻩﺭﺎﺑﻭﺩ ﺪﯿﻫﺍﻮﺧ ﯽﻣ ﻪﻛ ﺪﯿﺘﺴﻫ ﻦﺌﻤﻄﻣ ﺎﯾﺁ - -Save skin -== ﻦﯿﻜﺳﺍ ﻩﺮﯿﺧﺫ - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== ﺯﺍ ﻡﺎﻧ ﻦﯾﺍ ﺎﺑ ﯽﻨﯿﻜﺳﺍ ﺮﮔﺍ ؟ﺪﯿﻨﻛ ﻩﺮﯿﺧﺫ ﺍﺭ ﺩﻮﺧ ﻦﯿﻜﺳﺍ ﺪﯿﻫﺍﻮﺧ ﯽﻣ ﻪﻛ ﺪﯿﺘﺴﻫ ﻦﺌﻤﻄﻣ ﺎﯾﺁ .ﺪﺷ ﺪﻫﺍﻮﺧ ﻦﯾﺰﮕﯾﺎﺟ ،ﺪﺷﺎﺑ ﻪﺘﺷﺍﺩ ﺩﻮﺟﻭ ﻞﺒﻗ - -There's an unsaved map in the editor, you might want to save it. -== .ﺪﯿﻨﻛ ﻩﺮﯿﺧﺫ ﺍﺭ ﻥﺁ ﺪﯿﻫﺍﻮﺨﺑ ﺖﺳﺍ ﻦﻜﻤﻣ ،ﺩﺭﺍﺩ ﺩﻮﺟﻭ ﺭﻮﺘﯾﺩﺍ ﺭﺩ ﻩﺪﺸﻧ ﻩﺮﯿﺧﺫ ﭗﻣ ﻚﯾ - -Continue anyway? -== ؟ﺪﯿﻫﺩ ﻪﻣﺍﺩﺍ ﻝﺎﺣ ﺮﻫ ﻪﺑ - -A demo with this name already exists -== ﺩﺭﺍﺩ ﺩﻮﺟﻭ ﻞﺒﻗ ﺯﺍ ﻡﺎﻧ ﻦﯾﺍ ﺎﺑ ﻮﻣﺩ ﻚﯾ - -A folder with this name already exists -== ﺩﺭﺍﺩ ﺩﻮﺟﻭ ﻞﺒﻗ ﺯﺍ ﻡﺎﻧ ﻦﯾﺍ ﺎﺑ ﻪﺷﻮﭘ ﻚﯾ - -Unable to rename the folder -== ﺖﺴﯿﻧ ﻦﻜﻤﻣ ﻪﺷﻮﭘ ﻡﺎﻧ ﺮﯿﯿﻐﺗ - -(paused) -== (ﻩﺪﺷ ﺚﻜﻣ) - -Videos directory -== ﺎﻫ ﻮﯾﺪﯾﻭ ﺖﺳﺮﻬﻓ - -Video was saved to '%s' -== ﺪﺷ ﻩﺮﯿﺧﺫ "%s" ﺭﺩ ﻮﺋﺪﯾﻭ - -Unable to save the skin -== ﺩﺭﺍﺪﻧ ﺩﻮﺟﻭ ﻦﯿﻜﺳﺍ ﻩﺮﯿﺧﺫ ﻥﺎﻜﻣﺍ - -Unable to save the skin with a reserved name -== ﺩﺭﺍﺪﻧ ﺩﻮﺟﻭ ﻩﺪﺷ ﻭﺭﺯﺭ ﻡﺎﻧ ﺎﺑ ﻦﯿﻜﺳﺍ ﻩﺮﯿﺧﺫ ﻥﺎﻜﻣﺍ - -%d/%d KiB (%.1f KiB/s) -== %d/%d KiB (%.1f KiB/s) - -No local servers found (ports %d-%d) -== (%d-%d ﺕﺭﻮﭘ) ﺪﺸﻧ ﺖﻓﺎﯾ ﯽﻠﺤﻣ ﺭﻭﺮﺳ ﭻﯿﻫ - -Example of usage -== ﺩﺮﺑﺭﺎﻛ ﻪﻧﻮﻤﻧ - -No login required -== ﺪﺷﺎﺑ ﯽﻤﻧ ﺩﻭﺭﻭ ﻪﺑ ﺯﺎﯿﻧ - -Communities -== ﻊﻣﺍﻮﺟ - -Copy info -== ﺕﺎﻋﻼﻃﺍ ﯽﭙﻛ - -No server selected -== ﺖﺳﺍ ﻩﺪﺸﻧ ﺏﺎﺨﺘﻧﺍ ىﺭﻭﺮﺳ ﭻﯿﻫ - -Online clanmates (%d) -== (%d) ﻦﯾﻼﻧﺁ ىﺎﻫ ﯽﻨﻠﻛ ﻢﻫ - -[friends (server browser)] -Offline (%d) -== ﻥﺎﺘﺳﻭﺩ] (%d) ﻦﯾﻼﻓﺁ - -Click to select server. Double click to join your friend. -== .ﺪﯿﻨﻛ ﻚﯿﻠﻛ ﺭﺎﺑﻭﺩ ﺩﻮﺧ ﺖﺳﻭﺩ ﻪﺑ ﻦﺘﺳﻮﯿﭘ ىﺍﺮﺑ .ﺪﯿﻨﻛ ﻚﯿﻠﻛ ﺭﻭﺮﺳ ﺏﺎﺨﺘﻧﺍ ىﺍﺮﺑ - -Click to remove this player from your friends list. -== .ﺪﯿﻨﻛ ﻚﯿﻠﻛ ﺩﻮﺧ ﻥﺎﺘﺳﻭﺩ ﺖﺴﯿﻟ ﺯﺍ ﻦﻜﯾﺯﺎﺑ ﻦﯾﺍ ﻑﺬﺣ ىﺍﺮﺑ - -Click to remove this clan from your friends list. -== .ﺪﯿﻨﻛ ﻚﯿﻠﻛ ﺩﻮﺧ ﻥﺎﺘﺳﻭﺩ ﺖﺴﯿﻟ ﺯﺍ ﻦﻠﻛ ﻦﯾﺍ ﻑﺬﺣ ىﺍﺮﺑ - -Add Clan -== ﻦﻠﻛ ﻥﺩﺮﻛ ﻪﻓﺎﺿﺍ - -Server filter -== ﺭﻭﺮﺳ ﺮﺘﻠﯿﻓ - -Friends -== ﻥﺎﺘﺳﻭﺩ - -Go back the specified duration -== ﺪﯿﻧﺍﺩﺮﮔﺮﺑ ﺐﻘﻋ ﻪﺑ ﺍﺭ ﻩﺪﺷ ﺺﺨﺸﻣ ﻥﺎﻣﺯ ﺕﺪﻣ - -[Demo player duration] -%d min. -== ﻪﻘﯿﻗﺩ %d - -[Demo player duration] -%d sec. -== ﻪﯿﻧﺎﺛ %d - -Change the skip duration -== ﻩﺪﺷ ﭗﯿﻜﺳﺍ ﻥﺎﻣﺯ ﺕﺪﻣ ﺮﯿﯿﻐﺗ - -Go forward the specified duration -== ﻩﺪﺷ ﺺﺨﺸﻣ ﻥﺎﻣﺯ ﺕﺪﻣ ﻥﺩﺮﺑ ﻮﻠﺟ - -Mark the beginning of a cut (right click to reset) -== (ﺪﯿﻨﻛ ﺖﺳﺍﺭ ﻚﯿﻠﻛ ﺩﺪﺠﻣ ﻢﯿﻈﻨﺗ ىﺍﺮﺑ) ﺪﯿﻧﺰﺑ ﺖﻣﻼﻋ ﺍﺭ ﺵﺮﺑ ﻚﯾ ﻉﻭﺮﺷ - -Mark the end of a cut (right click to reset) -== (ﺪﯿﻨﻛ ﺖﺳﺍﺭ ﻚﯿﻠﻛ ﺩﺪﺠﻣ ﻢﯿﻈﻨﺗ ىﺍﺮﺑ) ﺪﯿﻧﺰﺑ ﺖﻣﻼﻋ ﺍﺭ ﺵﺮﺑ ﻚﯾ ىﺎﻬﺘﻧﺍ - -Close the demo player -== ﺪﯾﺪﻨﺒﺑ ﺍﺭ ﻮﻣﺩ ﻩﺪﻨﻨﻛ ﺶﺨﭘ - -Export demo cut -== ﻩﺪﺷ ﺵﺮﺑ ﻮﻣﺩ ﻥﺩﺮﻛ ﺭﺩﺎﺻ - -Cut interval -== ﺵﺮﺑ ﻪﻠﺻﺎﻓ - -Cut length -== ﺵﺮﺑ ﻝﻮﻃ - -Render cut to video -== ﻮﯾﺪﯾﻭ ﻪﺑ ﺵﺮﺑ ﺭﺪﻧﺭ - -Please use a different filename -== ﺪﯿﻨﻛ ﻩﺩﺎﻔﺘﺳﺍ ىﺮﮕﯾﺩ ﻞﯾﺎﻓ ﻡﺎﻧ ﺯﺍ ﺎﻔﻄﻟ - -All combined -== ﺪﯿﻨﻛ ﻩﺩﺎﻔﺘﺳﺍ ىﺮﮕﯾﺩ ﻞﯾﺎﻓ ﻡﺎﻧ ﺯﺍ ﺎﻔﻄﻟ - -No demo selected -== ﺖﺳﺍ ﻩﺪﺸﻧ ﺏﺎﺨﺘﻧﺍ ىﺍ ﻮﻣﺩ ﭻﯿﻫ - -Folder Link -== ﻪﺷﻮﭘ ﻚﻨﯿﻟ - -Created -== ﺪﺷ ﺩﺎﺠﯾﺍ - -Netversion -== ﺖﻧ ﻪﺨﺴﻧ - -[Demo details] -map not included -== ﺖﺳﺍ ﻩﺪﺸﻧ ﻩﺪﻧﺎﺠﻨﮔ ﭗﻣ - -Are you sure that you want to delete the folder '%s'? -== ؟ﺪﯿﻨﻛ ﻑﺬﺣ ﺍﺭ '%s' ﻪﺷﻮﭘ ﺪﯿﻫﺍﻮﺧ ﯽﻣ ﻪﻛ ﺪﯿﺘﺴﻫ ﻦﺌﻤﻄﻣ ﺎﯾﺁ - -Delete folder -== ﻪﺷﻮﭘ ﻑﺬﺣ - -Unable to delete the folder '%s'. Make sure it's empty first. -== .ﺖﺳﺍ ﯽﻟﺎﺧ ﻪﻛ ﺪﯾﻮﺷ ﻦﺌﻤﻄﻣ ﺍﺪﺘﺑﺍ .ﺖﺴﯿﻧ ﻦﻜﻤﻣ "%s" ﻪﺷﻮﭘ ﻑﺬﺣ - -Dummy is not allowed on this server -== ﺖﺴﯿﻧ ﺯﺎﺠﻣ ﺭﻭﺮﺳ ﻦﯾﺍ ﺭﺩ ﯽﻣﺍﺩ - -Please wait… -== ﺪﯿﻨﻛ ﺮﺒﺻ ﺎﻔﻄﻟ… - -Loading… -== ىﺮﯿﮔﺭﺎﺑ ﻝﺎﺣ ﺭﺩ… - -Ghosts directory -== ﯽﻠﺒﻗ ىﺎﻫ ﻥﺍﺭ ﺖﺴﯿﻟ ىﺭﻮﺘﻛﺮﯾﺍﺩﯽﻠﺒﻗ ىﺎﻫ ﻥﺍﺭ ﺖﺴﯿﻟ ىﺭﻮﺘﻛﺮﯾﺍﺩ - -Activate all -== ﻪﻤﻫ ىﺯﺎﺳ ﻝﺎﻌﻓ - -Deactivate all -== ﻪﻤﻫ ىﺯﺎﺳ ﻝﺎﻌﻓﺮﯿﻏ - -[Hertz] -Hz -== Hz - -Player info change cooldown -== اطلاعات بازیکن تغییر زمان جریمه شده - -Create a random skin -== ﯽﻓﺩﺎﺼﺗ ﻦﯿﻜﺳﺍ ﺖﺧﺎﺳ - -Axis -== ﺭﻮﺤﻣ - -Graphics card -== ﻚﯿﻓﺍﺮﮔ ﺕﺭﺎﻛ - -Tee -== ﯽﺗ - -Info Messages -== ﺎﻫ ﻡﺎﯿﭘ ﺕﺎﻋﻼﻃﺍ - -Show local time always -== ﺖﭼ ﯽﮕﺸﯿﻤﻫ ﻥﺩﺍﺩ ﻥﺎﺸﻧ - -Show client IDs (scoreboard, chat, spectator) -== (ﺮﮔﺎﺷﺎﻤﺗ ،ﺖﭼ ،ﺯﺎﯿﺘﻣﺍ) ﺖﻨﯾﻼﻛ ىﺎﻫ ﻪﺳﺎﻨﺷ ﺶﯾﺎﻤﻧ - -Always show chat -== ﺖﭼ ﯽﮕﺸﯿﻤﻫ ﻥﺩﺍﺩ ﻥﺎﺸﻧ - -Show only chat messages from team members -== ﺩﻮﺸﯿﻣ ﺖﻓﺎﯾﺭﺩ ﻢﯿﺗ ىﺎﻀﻋﺍ ﺯﺍ ﻪﻛ ﯽﯾﺎﻫ ﻡﺎﯿﭘ ﺶﯾﺎﻤﻧ - -Chat font size -== ﺖﭼ ﺖﻧﻮﻓ ﻩﺯﺍﺪﻧﺍ - -Chat width -== ﺖﭼ ﺽﺮﻋ - -Show friend mark (♥) in name plates -== ﻥﺎﻨﻜﯾﺯﺎﺑ ﻢﺳﺍ ﺭﺎﻨﻛ ﺭﺩ (♥) ﺖﺳﻭﺩ ﺖﻣﻼﻋ ﺶﯾﺎﻤﻧ - -Show hook strength icon indicator -== کﻮﻫ ﺕﺭﺪﻗ ﺩﺪﻋ ﺮﮕﻧﺎﺸﻧ ﺶﯾﺎﻤﻧ - -Show hook strength number indicator -== کﻮﻫ ﺕﺭﺪﻗ ﺩﺪﻋ ﺮﮕﻧﺎﺸﻧ ﺶﯾﺎﻤﻧ - -Authed name color in scoreboard -== ﺯﺎﯿﺘﻣﺍ ىﻮﻠﺑﺎﺗ ﺭﺩ ﻩﺪﺷ ﺪﯿﯾﺎﺗ ﻡﺎﻧ ﮓﻧﺭ - -Same clan color in scoreboard -== ﺯﺎﯿﺘﻣﺍ ىﻮﻠﺑﺎﺗ ﺭﺩ ﯽﻨﻠﻛ ﻢﻫ ﮓﻧﺭ - -Show own player's hook collision line -== ﻦﻜﯾﺯﺎﺑ کﻮﻫ ﺭﺰﯿﻟ ﺶﯾﺎﻤﻧ - -Always show own player's hook collision line -== ﻦﻜﯾﺯﺎﺑ کﻮﻫ ﺭﺰﯿﻟ ﯽﮕﺸﯿﻤﻫ ﺶﯾﺎﻤﻧ - -Always show other players' hook collision lines -== ﺮﮕﯾﺩ ﻥﺎﻨﻜﯾﺯﺎﺑ کﻮﻫ ﺭﺰﯿﻟ ﯽﮕﺸﯿﻤﻫ ﺶﯾﺎﻤﻧ - -Show finish messages -== ﭗﻣ ﻥﺎﯾﺎﭘ ىﺎﻫ ﻡﺎﯿﭘ ﺶﯾﺎﻤﻧ - -Enable ghost -== ﺡﻭﺭ ﺖﻟﺎﺣ ىﺯﺎﺳ ﻝﺎﻌﻓ - -Only save improvements -== ﺩﻮﺷ ﻩﺮﯿﺧﺫ ﺎﻫ ﺩﻮﺒﻬﺑ ﻂﻘﻓ - -Regular background color -== ﻢﻈﻨﻣ ﻪﻨﯿﻣﺯ ﺲﭘ ﮓﻧﺭ - -Entities background color -== ﺎﻫ ﺖﯾﺩﻮﺟﻮﻣ ﻪﻨﯿﻣﺯ ﺲﭘ ﮓﻧﺭ - -Unregister protocol and file extensions -== ﺖﺳﺍ ﻩﺪﺸﻧ ﺖﺒﺛ ﻞﯾﺎﻓ ﺪﻧﻮﺴﭘ ﻭ ﻞﻜﺗﻭﺮﭘ - -Basic -== ﻪﯾﺎﭘ - -Custom -== ﯽﺷﺭﺎﻔﺳ - -Are you sure that you want to delete '%s'? -== ؟ﺪﯿﻨﻛ ﻑﺬﺣ ﺍﺭ '%s' ﺪﯿﻫﺍﻮﺧ ﯽﻣ ﻪﻛ ﺪﯿﺘﺴﻫ ﻦﺌﻤﻄﻣ ﺎﯾﺁ - -Delete skin -== ﻦﯿﻜﺳﺍ ﻑﺬﺣ - -Unable to delete skin -== ﺖﺴﯿﻧ ﻦﻜﻤﻣ ﻦﯿﻜﺳﺍ ﻑﺬﺣ - -Round %d/%d -== %d/%d ﺪﻧﺍﺭ - -[Spectators] -%d others… -== ﺮﮕﯾﺩ %d - -[Team and size] -%d\n(%d/%d) -== %d\n(%d/%d) - -Team %d (%d/%d) -== %d (%d/%d) ﻢﯿﺗ - -[skins] -Body -== ﻥﺪﺑ - -[skins] -Marking -== ىﺭﺍﺬﮔ ﺖﻣﻼﻋ - -[skins] -Decoration -== ﻥﻮﯿﺳﺍﺭﻮﻛﺩ - -[skins] -Hands -== ﺎﻫ ﺖﺳﺩ - -[skins] -Feet -== ﺎﭘ - -[skins] -Eyes -== ﻢﺸﭼ - -FPM -== FPM - -Spree -== ﯽﻨﻜﺷ ﻥﻮﻧﺎﻗ - -Grabs -== ﻥﺩﺯ ﮓﻨﭼ - -Moved ingame -== ﺪﺷ ﻞﻘﺘﻨﻣ ىﺯﺎﺑ - - -https://wiki.ddnet.org/wiki/Mapping -== https://wiki.ddnet.org/wiki/Mapping - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Some fonts could not be loaded. Check the local console for details. -== - -Loading background map -== - -[Spectating Camera Mode Icon] -AUTO -== - -Online friends (%d) -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Toggle auto camera -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Show client IDs in name plates -== - -Hook Strength -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Preview 'Hook collisions' being pressed -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Aim -== - -Active: Fire -== - -Active: Hook -== diff --git a/data/languages/polish.txt b/data/languages/polish.txt deleted file mode 100644 index 44418ed763..0000000000 --- a/data/languages/polish.txt +++ /dev/null @@ -1,2079 +0,0 @@ -##### authors ##### -#originally created by: -# Łukasz D -#modified by: -# Martin Pola 2011-04-02 22:18:00 -# Tsin 2011-04-06 23:15:58 -# Shymwo 2011-07-15 01:27:45 -# Shymwo 2011-07-21 18:54:53 -# CROACH 2022-05-15 21:41:32 -# Delciak (PKP) & Shkyyl 2024-05-19 17:52:30 -# KebsCS 2024-09-30 03:33:33 -##### /authors ##### - -##### translated strings ##### - -%ds left -== Pozostało %ds - -%i minute left -== Pozostało minut: %i - -%i minutes left -== Pozostało minut: %i - -%i second left -== Pozostało sekund: %i - -%i seconds left -== Pozostało sekund: %i - -%s wins! -== Wygrał %s! - -Abort -== Anuluj - -Add -== Dodaj - -Add Friend -== Dodaj znajomego - -Address -== Adres - -All -== Wszyscy - -Are you sure that you want to quit? -== Czy na pewno chcesz opuścić grę? - -Automatically record demos -== Automatycznie nagrywaj dema - -Automatically take game over screenshot -== Automatycznie zrób zrzut ekranu końca gry - -Blue team -== Niebiescy - -Blue team wins! -== Niebiescy wygrali! - -Body -== Ciało - -Call vote -== Głosuj - -Change settings -== Zmień ustawienia - -Chat -== Czat - -Clan -== Klan - -Client -== Klient - -Connecting to -== Łączenie z - -Connection Problems… -== Problemy z połączeniem… - -Console -== Konsola - -Controls -== Sterowanie - -Count players only -== Licz tylko graczy - -Current -== Aktualny - -Custom colors -== Dostosuj kolory - -Delete -== Usuń - -Delete demo -== Usuń demo - -Demofile: %s -== Plik dema: %s - -Demos -== Dema - -Disconnect -== Rozłącz - -Disconnected -== Rozłączono - -Downloading map -== Pobieranie mapy - -Draw! -== Remis! - -Dynamic Camera -== Dynamiczna kamera - -Emoticon -== Emotikona - -Error -== Błąd - -Error loading demo -== Błąd ładowania dema - -Favorite -== Ulubiony - -Favorites -== Ulubione - -Feet -== Stopy - -Fire -== Strzał - -Folder -== Folder - -Force vote -== Wymuś głosowanie - -Free-View -== Wolna kamera - -Fullscreen -== Pełny ekran - -Game -== Gra - -Game info -== Info o grze - -Game over -== Koniec gry - -Game type -== Typ gry - -Game types: -== Typy gier: - -General -== Ogólne - -Graphics -== Grafika - -Grenade -== Granatnik - -Hammer -== Młotek - -Has people playing -== Nie pokazuj pustych - -High Detail -== Wysoka jakość - -Hook -== Hak - -Invalid Demo -== Nieprawidłowe demo - -Join blue -== Do niebieskich - -Join red -== Do czerwonych - -Jump -== Skok - -Kick player -== Wyrzuć gracza - -Language -== Język - -MOTD -== Wiadomość dnia - -Map -== Mapa - -Move left -== Ruch w lewo - -Move player to spectators -== Przenieś gracza do obserwatorów - -Move right -== Ruch w prawo - -Movement -== Ruch - -Mute when not active -== Wycisz, kiedy gra jest nieaktywna - -Name -== Nazwa - -Next weapon -== Następna broń - -Nickname -== Nick - -No -== Nie - -No password -== Bez hasła - -No servers found -== Nie znaleziono serwerów - -No servers match your filter criteria -== Nie znaleziono serwerów spełniających twoje kryteria - -Ok -== Ok - -Parent Folder -== Nadrzędny folder - -Password -== Hasło - -Password incorrect -== Błędne hasło - -Ping -== Ping - -Pistol -== Pistolet - -Play background music -== Odtwarzaj muzykę w tle - -Player -== Gracz - -Player country: -== Narodowość: - -Players -== Gracze - -Please balance teams! -== Proszę wyrównać szanse drużyn! - -Prev. weapon -== Poprzednia broń - -Quit -== Wyjście - -Reason: -== Powód: - -Red team -== Czerwoni - -Red team wins! -== Czerwoni wygrali! - -Remote console -== Zdalna konsola - -Remove -== Usuń - -Remove friend -== Usuń znajomego - -Rename demo -== Zmień nazwę dema - -Reset filter -== Przywróć domyślne - -Score -== Wynik - -Score limit -== Limit punktów - -Scoreboard -== Tabela wyników - -Screenshot -== Zrzut ekranu - -Server address: -== Adres serwera: - -Server info -== Info serwera - -Server not full -== Nie pokazuj pełnych - -Shotgun -== Shotgun - -Show chat -== Pokazuj czat - -Show friends only -== Tylko ze znajomymi - -Show ingame HUD -== Pokazuj HUD - -Show name plates -== Pokazuj nicki - -Sound -== Dźwięk - -Sound error -== Błąd dźwięku - -Spectate -== Obserwuj - -Spectate next -== Obserwuj następnego - -Spectate previous -== Obserwuj poprzedniego - -Spectator mode -== Tryb obserwatora - -Spectators -== Obserwatorzy - -Stop record -== Zakończ nagrywanie - -Strict gametype filter -== Szczegółowy filtr typu gry - -Sudden Death -== Nagła śmierć - -Switch weapon on pickup -== Zmień broń po podniesieniu - -Team -== Drużyna - -Team chat -== Czat drużynowy - -The audio device couldn't be initialised. -== Urządzenie dźwiękowe nie mogło zostać zainicjowane. - -The server is running a non-standard tuning on a pure game type. -== Ten serwer korzysta z niestandardowych ustawień. - -Time limit -== Limit czasu - -Time limit: %d min -== Limit czasu: %d min - -Try again -== Ponów próbę - -Type -== Typ - -Unable to rename the demo -== Nie można zmienić nazwy dema - -Use sounds -== Włącz dźwięki - -Use team colors for name plates -== Użyj koloru drużyn dla wyświetlania nicków - -V-Sync -== V-Sync - -Version -== Wersja - -Vote command: -== Polecenie głosowania: - -Vote description: -== Opis głosowania: - -Vote no -== Nie - -Vote yes -== Tak - -Voting -== Głosowanie - -Warmup -== Rozgrzewka - -Weapon -== Broń - -Yes -== Tak - -You must restart the game for all settings to take effect. -== Uruchom ponownie grę, aby użyć nowych ustawień. - -##### - -Demo -== Demo - -Game paused -== Gra wstrzymana - -Laser -== Laser - -Reset -== Reset - -Screen -== Ekran - -Show only chat messages from friends -== Pokazuj wiadomości tylko od znajomych - -New name: -== Nowa nazwa: - -Sat. -== Nasycenie - -Miscellaneous -== Różne - -Internet -== Internet - -Max demos -== Maksymalnie dem - -News -== Nowości - -Join game -== Dołącz - -FSAA samples -== FSAA (Antyaliasing) - -Sound volume -== Głośność ogólna - -Max Screenshots -== Maksymalnie zrzutów ekranu - -Hue -== Kolor - -Record demo -== Nagraj demo - -Your skin -== Twój wygląd - -Reset to defaults -== Przywróć domyślne - -Lht. -== Jasność - -UI Color -== Kolor menu - -Alpha -== Alfa - -LAN -== LAN - -Name plates size -== Wielkość wyświetlanych nicków - -Show others -== Pokazuj innych - -Show quads -== Pokazuj quady - -Show other players' hook collision lines -== Pokazuj linie kolizyjne innych graczy - -Show other players' key presses -== Pokazuj naciśnięcia klawiszy innych graczy - -Gameplay -== Rozgrywka - -AntiPing -== AntyPing - -AntiPing: predict other players -== AntyPing: Przewiduj ruchy graczy - -AntiPing: predict weapons -== AntyPing: Przewiduj bronie - -AntiPing: predict grenade paths -== AntyPing: Przewiduj lot granatów - -Save the best demo of each race -== Zapisuj najlepsze demo każdego wyścigu - -Ghost -== Duszek - -Save ghost -== Zapisuj duszka - -Show ghost -== Pokazuj duszka - -Default zoom -== Domyślny zoom - -Overlay entities -== Pokazuj entities - -Switch weapon when out of ammo -== Zmień broń, gdy skończy się amunicja - -Show score -== Pokazuj wyniki - -Show names in chat in team colors -== Pokazuj nicki na czacie w kolorach drużyn - -Show votes window after voting -== Nie zamykaj okna głosowania po oddaniu głosu - -Highlighted message -== Wyróżniona wiadomość - -System message -== Wiadomość systemowa - -Team message -== Wiadomość w drużynie - -Normal message -== Wiadomość standardowa - -Show kill messages -== Pokazuj wiadomości śmierci - -Countries -== Kraje - -Types -== Typy - -Exclude -== Wyklucz - -Search -== Szukaj - -Enable game sounds -== Włącz dźwięki gry - -Enable gun sound -== Włącz dźwięk pistoletu - -Enable server message sound -== Włącz dźwięk wiadomości serwerowych - -Enable regular chat sound -== Włącz dźwięk czatu standardowego - -Enable team chat sound -== Włącz dźwięk czatu drużynowego - -Enable highlighted chat sound -== Włącz dźwięk wyróżnionej wiadomości - -Map sound volume -== Głośność dźwięków mapy - -No updates available -== Brak dostępnych aktualizacji - -DDNet %s is available: -== Dostępna jest nowa wersja DDNet %s: - -Update now -== Aktualizuj - -Updating… -== Aktualizuje… - -DDNet Client updated! -== DDNet został zaktualizowany! - -Check now -== Sprawdź - -DDNet Client needs to be restarted to complete update! -== DDNet wymaga ponownego uruchomienia, aby zakończyć aktualizację! - -Connect Dummy -== Przyślij kukłę - -Disconnect Dummy -== Odeślij kukłę - -Remove chat -== Usuń czat - -Activate -== Aktywuj - -Render demo -== Renderuj demo - -Automatically take statboard screenshot -== Automatyczny zrzut ekranu tabeli wyników - -Enable replays -== Włącz powtórki - -Automatically create statboard csv -== Automatycznie utwórz plik csv z tabelą wyników - -Replay feature is disabled! -== Funkcja odtwarzania jest wyłączona! - -Fat skins (DDFat) -== Masne skiny (DDFat) - -Grabs -== Przechwycenia - -Kill -== Restart - -Messages -== Wiadomości - -Toggle dyncam -== Przełącz na dynamiczną kamerę - -Follow -== Śledź - -Deactivate -== Dezaktywuj - -Pause -== Pauza - -1 new mention -== Wspomniano o tobie 1 raz - -Welcome to DDNet -== Witaj w DDNet - -New random timeout code -== Nowy losowy kod rozłączenia - -Enable long pain sound (used when shooting in freeze) -== Włącz dźwięk długiego jęku (używany, gdy strzelasz we freezie) - -DDNet -== DDNet - -Show HUD -== Pokazuj HUD - -Frags -== Fragi - -Net -== Przechwycenia - -Suicides -== Samobójstwa - -Show clan above name plates -== Pokazuj klan nad nazwą gracza - -Loading DDNet Client -== Ładowanie klienta DDNet - -HUD -== HUD - -Update failed! Check log… -== Niepowodzenie aktualizacji! Sprawdź logi… - -Friend message -== Wiadomość od znajomego - -%.2f MiB -== %.2f MiB - -Spree -== Seria - -Clan plates size -== Wielkość nazw klanów - -Vanilla skins only -== Tylko skiny Vanilla - -Best -== Najwięcej - -Markers -== Znaczniki - -File already exists, do you want to overwrite it? -== Plik już istnieje, czy chcesz go nadpisać? - -Show entities -== Pokazuj entities - -Size -== Rozmiar - -Fetch Info -== Pobierz szczegóły - -Hammerfly dummy -== Hammerfly z kukłą - -Ratio -== Stosunek - -Browser -== Serwery - -Time -== Czas - -Learn -== Wiki - -Toggle ghost -== Przełącz duszka - -Replace video -== Zamień wideo - -Lock team -== Zablokuj drużynę - -Filter connecting players -== Filtruj dołączających graczy - -Save -== Zapisz - -Zoom out -== Oddal kamerę - -Connecting dummy -== Przyślij kukłę - -Show all -== Pokazuj wszystkich - -Use high DPI -== Użyj dużego DPI - -%.2f KiB -== %.2f KiB - -Zoom in -== Przybliż kamerę - -Hook collisions -== Kolizja haka - -Deaths -== Śmierci - -Downloading %s: -== Pobieranie %s: - -Show tiles layers from BG map -== Pokazuj warstwy płytek razem z tłem mapy - -Max CSVs -== Maksymalnie CSV - -Unfinished map -== Pokazuj tylko nieukończone mapy - -%d new mentions -== Wspomniano o tobie %d razy - -Default length -== Domyślna długość - -Refresh Rate -== Częstotliwość odświeżania - -Video name: -== Nazwa wideo - -Restart -== Restart - -Toggle dummy -== Przełącz na kukłę - -Server best: -== Rekord serwera: - -FPM -== FPM - -Are you sure that you want to disconnect? -== Czy jesteś pewien, że chcesz opuścić serwer? - -Successfully saved the replay! -== Pomyślnie zapisano powtórkę! - -Length -== Długość - -Are you sure that you want to disconnect your dummy? -== Czy jesteś pewien, że chcesz odesłać kukłę? - -DDNet %s is out! -== DDNet %s już jest! - -Converse -== Czat prywatny - -Dummy copy -== Kukła kopiuje ruchy - -9+ new mentions -== Wspomniano o tobie 9+ razy - -Statboard -== Tabela statystyk - -may cause delay -== może spowodować opóźnienia - -Date -== Data - -Personal best: -== Twój najlepszy wynik: - -Show text entities -== Pokazuj entities tekstu - -Skin prefix -== Motyw skinów - -Reconnect in %d sec -== Ponowna próba połączenia za %d sek - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork jest grą online polegającą na współpracy z innymi graczami, gdzie waszym zadaniem jest dotrzeć do mety na końcu mapy. Jako nowy gracz powinieneś zacząć od serwerów Novice, które hostują najłatwiejsze mapy. Weź pod uwagę ping, aby wybrać serwer najbliżej siebie. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Przed wejściem na serwer zaleca się sprawdzenie ustawień i dostosowanie ich do swoich preferencji. - -Please enter your nickname below. -== Proszę wpisać swój nick poniżej. - -Show DDNet map finishes in server browser -== Pokazuj ukończone mapy DDNet w wyszukiwarce - -transmits your player name to info.ddnet.org -== przesyła twój nick do info.ddnet.org - -Indicate map finish -== Pokazuj ukończenie map - -Show others (own team only) -== Pokazuj innych (tylko drużynę) - -Manual -== Manualne - -Race -== Wyścig - -Auto -== Automatyczne - -Replay -== Powtórka - -Warning -== Ostrzeżenie - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Tryb debugowania włączony. Naciśnij Ctrl+Shift+D, aby wyłączyć tryb debugowania. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Użyj klawisza K - aby zginąć (zacząć od nowa), Q - aby zapauzować postać i oglądać innych graczy. Sprawdź ustawienia dla innych kombinacji klawiszy. - -Existing Player -== Istniejący gracz - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Twój nick '%s' jest już zajęty (%d punktów). Czy na pewno chcesz go użyć? - -Checking for existing player with your name -== Sprawdzanie, czy istnieje gracz posiadający twój nick - -Speed -== Prędkość - -Theme -== Motyw - -%d of %d servers -== %d z %d serwerów - -%d of %d server -== serwer %d z %d - -%d players -== %d graczy - -%d player -== %d gracz - -Demos directory -== Folder dem - -Smooth Dynamic Camera -== Płynna dynamiczna kamera - -Skip the main menu -== Pomijaj menu główne - -Themes directory -== Folder motywów - -Download skins -== Pobieraj skiny - -Skin Database -== Lista skinów - -Skins directory -== Folder skinów - -Game sound volume -== Głośność gry - -Chat sound volume -== Głośność czatu - -Background music volume -== Głośność muzyki w tle - -Assets -== Zasoby - -Use old chat style -== Użyj klasycznego wyglądu czatu - -Client message -== Wiadomość klienta - -Use current map as background -== Użyj bieżącej mapy jako tło - -Entities -== Entities - -Emoticons -== Emotikony - -Particles -== Cząsteczki - -Assets directory -== Folder zasobów - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ - -Website -== Strona - -Settings -== Ustawienia - -Stop server -== Zatrzymaj serwer - -Run server -== Uruchom serwer - -Server executable not found, can't run server -== Nie znaleziono pliku wykonywalnego serwera, nie można uruchomić serwera - -Editor -== Edytor - -[Start menu] -Play -== Graj - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== Szerokość tekstury %s nie jest podzielna przez %d, lub wysokość nie jest podzielna przez %d, co może spowodować błędy wizualne. - -The format of texture %s is not RGBA which will cause visual bugs. -== Formatem tekstury %s nie jest RGBA, co może spowodować błędy wizualne. - -Are you sure that you want to disconnect and switch to a different server? -== Czy na pewno chcesz się rozłączyć i przełączyć na inny serwer? - -Join Tutorial Server -== Dołącz do serwera samouczkowego - -Skip Tutorial -== Pomiń samouczek - -AFR -== AFR - -ASI -== ASI - -AUS -== AUS - -EUR -== EUR - -NA -== NA - -SA -== SA - -CHN -== CHN - -Getting server list from master server -== Pobieranie listy serwerów z serwera głównego - -Leak IP -== Ujawnij adres IP - -Settings file -== Plik ustawień - -Config directory -== Folder z ustawieniami - -Choose default eyes when joining a server -== Wybierz domyślny wygląd oczu przy dołączaniu do serwera - -Chat command -== Komenda czatu - -Dummy -== Kukła - -Windowed -== W oknie - -Windowed borderless -== W oknie bez ramki - -Windowed fullscreen -== W oknie pełnoekranowym - -Desktop fullscreen -== Pełnoekranowy z przełączaniem innych okien - -Allows maps to render with more detail -== Pozwala na renderowanie map z większą ilością detali - -Renderer -== Technologia renderowania - -default -== domyślny - -custom -== niestandardowy - -auto -== automatyczny - -Preview -== Podgląd - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Po przekroczeniu linii startu, pokaż duszka z Twoim najlepszym czasem - -Opacity -== Przezroczystość - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Dopasuj przezroczystość obiektów należących do innych drużyn, takich jak duszki i nicki - -Quads are used for background decoration -== Quady są używane do dekoracji tła - -Tries to predict other entities to give a feel of low latency -== Próbuje przewidzieć inne obiekty, aby zapewnić wrażenie niskiego opóźnienia - -Show local player's key presses -== Pokazuj wciśnięte klawisze - -Background -== Tło - -Run on join -== Wykonaj po dołączeniu - -Chat command (e.g. showall 1) -== Komenda czatu (np. showall 1) - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -Tutorial -== Samouczek - -Can't find a Tutorial server -== Nie można znaleźć serwera samouczkowego - -Super -== Super - -Team %d -== Drużyna %d - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Wystąpił błąd podczas inicjalizacji. Spróbuj zmienić gfx_backend na OpenGL lub Vulkan w settings_ddnet.cfg w folderze konfiguracyjnym i spróbuj ponownie. - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== Brak pamięci VRAM. Spróbuj usunąć niestandardowe zasoby (skiny, entities, itd.), szczególnie te z dużą rozdzielczością. - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Wystąpił nieznany błąd. Spróbuj zmienić gfx_backend na OpenGL lub Vulkan w settings_ddnet.cfg w folderze konfiguracyjnym i spróbuj ponownie. - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== Nie można zainicjować podanego backendu graficznego, domyślny backend został przywrócony. - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== Nie można zainicjować podanego backendu graficznego, ponieważ prawdopodobnie nie zainstalowałeś sterowników do zintegrowanej karty graficznej. - -Could not save downloaded map. Try manually deleting this file: %s -== Nie udało się zapisać pobranej mapy. Spróbuj ręcznie usunąć ten plik: %s - -Error playing demo -== Wystąpił błąd podczas odtwarzania dema - -Failed saving the replay! -== Wystąpił błąd podczas zapisywania powtórki! - -Saving settings to '%s' failed -== Zapisywanie ustawień do '%s' nie powiodło się - -Error saving settings -== Wystąpił błąd podczas zapisywania ustawień - -Preparing demo playback -== Przygotowywanie do odtworzenia dema - -Connected -== Połączono - -Loading map file from storage -== Ładowanie pliku mapy z pamięci - -Loading demo file from storage -== Ładowanie pliku demo z pamięci - -Why are you slowmo replaying to read this? -== Dlaczego odtwarzasz w zwolnionym tempie, żeby to przeczytać? - -Initializing components -== Inicjowanie komponentów - -Initializing assets -== Inicjowanie zasobów - -Initializing map logic -== Inicjowanie logiki mapy - -Sending initial client info -== Wysyłanie wstępnych informacji o kliencie - -Quitting. Please wait… -== Zamykanie. Proszę czekać… - -Restarting. Please wait… -== Restartowanie. Proszę czekać… - -Loading skin files -== Ładowanie skinów - -Searching -== Szukanie - -Enter Username -== Wpisz nazwę użytkownika - -Enter Password -== Wpisz hasło - -NOT CONNECTED -== NIE POŁĄCZONO - -No results -== Brak wyników - -Lines %d - %d (%s) -== Linie %d - %d (%s) - -Locked -== Zablokowane - -Loading commands… -== Ładowanie komend… - -Position: -== Pozycja: - -Speed: -== Prędkość: - -Angle: -== Kąt: - -Some map images could not be loaded. Check the local console for details. -== Nie można załadować niektórych obrazów mapy. Sprawdź konsolę, aby poznać szczegóły. - -Uploading map data to GPU -== Wysyłanie danych mapy do GPU - -Some map sounds could not be loaded. Check the local console for details. -== Nie można załadować niektórych dźwięków mapy. Sprawdź konsolę, aby poznać szczegóły. - -Loading menu themes -== Ładowanie motywów menu - -Press a key… -== Naciśnij klawisz… - -Main menu -== Menu główne - -Rename folder -== Zmień nazwę folderu - -Render complete -== Zakończono renderowanie - -Are you sure that you want to restart? -== Czy na pewno chcesz uruchomić ponownie? - -There's an unsaved map in the editor, you might want to save it. -== Posiadasz niezapisaną mapą w edytorze, warto ją zapisać. - -Continue anyway? -== Kontynuować mimo to? - -A demo with this name already exists -== Demo z tą nazwą już istnieje - -A folder with this name already exists -== Folder z tą nazwą już istnieje - -Unable to rename the folder -== Nie można zmienić nazwy folderu - -File '%s' already exists, do you want to overwrite it? -== Plik '%s' już istnieje, czy chcesz go nadpisać? - -(paused) -== (zatrzymano) - -Videos directory -== Folder filmów - -Video was saved to '%s' -== Film został zapisany do '%s' - -Trying to determine UDP connectivity… -== Próba określenia łączności UDP… - -UDP seems to be filtered. -== Protokół UDP wydaje się być filtrowany. - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== Adresy IP TDP oraz UDP są różne. Spróbuj wyłączyć usługę VPN, proxy lub akcelerację sieci. - -No answer from server yet. -== Brak odpowiedzi od serwera. - -Getting game info -== Pobieranie informacji o grze - -Requesting to join the game -== Wysyłanie prośby o dołączenie do gry - -Loading menu images -== Ładowanie obrazów menu - -No login required -== Nie wymaga logowania - -Communities -== Społeczności - -Copy info -== Kopiuj info - -No server selected -== Nie wybrano serwera - -Online clanmates (%d) -== Dostępni członkowie klanu (%d) - -[friends (server browser)] -Offline (%d) -== Niedostępni (%d) - -Click to select server. Double click to join your friend. -== Kliknij, aby wybrać serwer. Kliknij dwukrotnie, aby dołączyć do znajomego. - -Click to remove this player from your friends list. -== Kliknij, aby usunąć tego gracza z listy znajomych. - -Click to remove this clan from your friends list. -== Kliknij, aby usunąć ten klan z listy znajomych. - -Are you sure that you want to remove the player '%s' from your friends list? -== Jesteś pewny, że chcesz usunąć gracza '%s' z listy znajomych? - -Are you sure that you want to remove the clan '%s' from your friends list? -== Jesteś pewny, że chcesz usunąć klan '%s' z listy znajomych? - -Add Clan -== Dodaj klan - -Server filter -== Filtr serwera - -Friends -== Znajomi - -Play the current demo -== Odtwórz bieżące demo - -Pause the current demo -== Spauzuj bieżące demo - -Stop the current demo -== Zatrzymaj bieżące demo - -Go back the specified duration -== Cofnij o określony czas - -[Demo player duration] -%d min. -== %d min. - -[Demo player duration] -%d sec. -== %d sek. - -Change the skip duration -== Zmień długość pominięcia - -Go forward the specified duration -== Przewiń o określony czas - -Go back one tick -== Cofnij o jeden tick - -Go forward one tick -== Przewiń o jeden tick - -Go back one marker -== Cofnij o jeden znacznik - -Go forward one marker -== Przewiń o jeden znacznik - -Slow down the demo -== Spowolnij demo - -Speed up the demo -== Przyśpiesz demo - -Mark the beginning of a cut (right click to reset) -== Zaznacz początek cięcia (kliknij prawy aby zresetować) - -Mark the end of a cut (right click to reset) -== Zaznacz koniec cięcia (kliknij prawy aby zresetować) - -Export cut as a separate demo -== Wyeksportuj cięcie jako osobne demo - -Close the demo player -== Zamknij odtwarzacz demo - -Toggle keyboard shortcuts -== Przełącz skróty klawiszowe - -Export demo cut -== Wyeksportuj demo cięcia - -Cut interval -== Przedział cięcia - -Render cut to video -== Wyeksportuj cięcie do pliku wideo - -Please use a different filename -== Użyj innej nazwy pliku - -Loading demo files -== Ładowanie plików demo - -No demo selected -== Nie wybrano demo - -Created -== Utworzono - -Netversion -== Wersja - -Open the directory that contains the demo files -== Otwórz folder zawierający pliki demo - -Are you sure that you want to delete the folder '%s'? -== Jesteś pewny, że chcesz usunąć folder '%s'? - -Are you sure that you want to delete the demo '%s'? -== Jesteś pewny, że chcesz usunąć demo '%s'? - -Delete folder -== Usuń folder - -Unable to delete the demo '%s' -== Nie można usunąć demo '%s' - -Unable to delete the folder '%s'. Make sure it's empty first. -== Nie można usunąć folderu '%s'. Upewnij się że jest pusty. - -Loading… -== Ładowanie… - -Loading ghost files -== Ładowanie plików duszków - -Ghosts directory -== Folder duszków - -Activate all -== Aktywuj wszystkie - -Deactivate all -== Dezaktywuj wszystkie - -Menu opened. Press Esc key again to close menu. -== Menu otwarte. Naciśnij przycisk Esc, aby zamknąć menu. - -Save power by lowering refresh rate (higher input latency) -== Oszczędzaj energię, obniżając częstotliwość odświeżania (większe opóźnienie) - -Open the settings file -== Otwórz plik ustawień - -Open the directory that contains the configuration and user files -== Otwórz folder który zawiera konfiguracje i pliki użytkownika - -Open the directory to add custom themes -== Otwórz folder z własnymi motywami - -Player info change cooldown -== Czas do zmiany informacji o graczu - -Download community skins -== Pobieraj skiny społeczności - -Create a random skin -== Wygeneruj losowy skin - -Open the directory to add custom skins -== Otwórz folder, aby dodać własne skiny - -Enable controller -== Włącz kontroler - -Controller -== Kontroler - -Ingame controller mode -== Tryb kontrolera w grze - -[Ingame controller mode] -Relative -== Relatywny - -[Ingame controller mode] -Absolute -== Absolutny - -Ingame controller sens. -== Czułość kontrolera w grze - -UI controller sens. -== Czułość kontrolera w menu - -Controller jitter tolerance -== Tolerancja drgania kontrolera - -No controller found. Plug in a controller. -== Nie znaleziono kontrolera. Podłącz go. - -Axis -== Oś - -Status -== Status - -Mouse -== Mysz - -Ingame mouse sens. -== Czułość myszy w grze - -UI mouse sens. -== Czułość myszy w menu - -Cancel -== Anuluj - -Graphics card -== Karta graficzna - -Appearance -== Wygląd - -Name Plate -== Plakietki - -Hook Collisions -== Kolizje haka - -Info Messages -== Komunikaty - -Show health, shields and ammo -== Pokazuj zdrowie, tarcze i amunicję - -Show local time always -== Pokazuj czas lokalny - -Show DDRace HUD -== Pokazuj HUD DDRace - -Show jumps indicator -== Pokazuj wskaźnik skoków - -Show dummy actions -== Pokazuj akcje kukły - -Show player position -== Pokazuj pozycję gracza - -Show player speed -== Pokazuj prędkość gracza - -Show player target angle -== Pokazuj kąt celownika gracza - -Show freeze bars -== Pokazuj pasek freeze - -Opacity of freeze bars inside freeze -== Przezroczystość paska freeze - -Always show chat -== Zawsze pokazuj czat - -Chat font size -== Rozmiar czcionki czatu - -Chat width -== Szerokość czatu - -Show friend mark (♥) in name plates -== Pokazuj ikonę znajomego (♥) w plakietce nazwy - -Show hook strength icon indicator -== Pokazuj ikonę siły haka - -Show hook strength number indicator -== Pokazuj numer siły haka - -Authed name color in scoreboard -== Kolor zweryfikowanego w tabeli wyników - -Same clan color in scoreboard -== Kolor tego samego klanu w tabeli wyników - -Hook collision line -== Linia kolizji haka - -Show own player's hook collision line -== Pokazuj swoją linię kolizyjną haka - -Always show own player's hook collision line -== Zawsze pokazuj swoją linię kolizyjną haka - -Always show other players' hook collision lines -== Zawsze pokazuj linię kolizyjną haka innych - -Hook collision line opacity -== Przezroczystość linii kolizji haka - -Colors of the hook collision line, in case of a possible collision with: -== Kolor linii kolizji haka, w przypadku kolizji z: - -Your movements are not taken into account when calculating the line colors -== Twoje ruchy nie są brane pod uwagę podczas obliczania kolorów linii - -Nothing hookable -== Niczym możliwym do złapania - -Something hookable -== Czymś możliwym do złapania - -A Tee -== Graczem - -Show finish messages -== Pokazuj wiadomości o ukończeniu - -Normal Color -== Kolor normalny - -Highlight Color -== Kolor podkreślenia - -Weapons -== Bronie - -Rifle Laser Outline Color -== Kolor zewnętrzny lasera - -Rifle Laser Inner Color -== Kolor wewnętrzny lasera - -Shotgun Laser Outline Color -== Kolor zewnętrzny shotguna - -Shotgun Laser Inner Color -== Kolor wewnętrzny shotguna - -Door Laser Outline Color -== Kolor zewnętrzny bramki - -Door Laser Inner Color -== Kolor wewnętrzny bramki - -Freeze Laser Outline Color -== Kolor zewnętrzny freeze - -Freeze Laser Inner Color -== Kolor wewnętrzny freeze - -Set all to Rifle -== Ustaw wszystkie jako laser - -Enable ghost -== Włącz duszka - -Only save improvements -== Podmieniaj duszka z lepszym czasem - -Regular background color -== Kolor tła regularny - -Entities background color -== Kolor tła entities - -Unregister protocol and file extensions -== Wyrejestruj protokoły i rozszerzenia plików - -Extras -== Dodatki - -Loading assets -== Ładowanie zasobów - -Open the directory to add custom assets -== Otwórz folder, aby dodać własne zasoby - -Loading race demo files -== Ładowanie plików demo - -Loading sound files -== Ładowanie dźwięków - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== Wystąpił błąd podczas komendy nagrywania. Spróbuj zaktualizować sterowniki karty graficznej. - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== Nie powiodła się komenda renderowania. Spróbuj zaktualizować sterowniki karty graficznej - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== Wysłanie komend renderowania nie powiodło się. Spróbuj zaktualizować sterowniki karty graficznej. - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== Nie udało się zamienić buforów ramki. Spróbuj zaktualizować sterowniki karty graficznej. - -Could not resolve connect address '%s'. See local console for details. -== Nie można nawiązać połączenia z adresem '%s'. Sprawdź konsolę, aby poznać szczegóły. - -Connect address error -== Błąd adresu połączenia - -Could not connect dummy -== Nie udało się połączyć kukły - -Match %d of %d -== Znaleziono %d z %d - -Following -== Przewijanie - -Multi-View -== Widok wieloosobowy - -[Spectating] -Following %s -== Obserwowanie %s - -Save skin -== Zapisz skina - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== Czy na pewno chcesz zapisać swojego skina? Jeśli skin o tej nazwie już istnieje, zostanie zastąpiony. - -Unable to save the skin -== Zapis skina nie powiódł się - -Unable to save the skin with a reserved name -== Nie można zapisać skina z zarezerwowaną nazwą - -%d/%d KiB (%.1f KiB/s) -== %d/%d KiB (%.1f KiB/s) - -No local servers found (ports %d-%d) -== Nie znaleziono serwerów LAN (porty %d-%d) - -Example of usage -== Przykładowe użycie - -Cut length -== Długość cięcia - -All combined -== Wszystko w jednym - -Folder Link -== Link foldera - -[Demo details] -map not included -== mapa nie została dołączona - -Dummy is not allowed on this server -== Kukła nie jest dozwolona na tym serwerze - -Please wait… -== Proszę czekać… - -[Hertz] -Hz -== Hz - -Aim bind -== Oś celowania - -Reset controls -== Resetowanie ustawień sterowania - -Are you sure that you want to reset the controls to their defaults? -== Czy na pewno chcesz zresetować ustawienia sterowania do wartości domyślnych? - -Tee -== Tee - -DDRace HUD -== HUD DDRace - -Show client IDs (scoreboard, chat, spectator) -== Pokazuj ID graczy (tabela wyników, czat, obserwatorzy) - -Show only chat messages from team members -== Pokazuj wiadomości tylko od członków drużyny - -Basic -== Domyślny - -Custom -== Niestandardowy - -Are you sure that you want to delete '%s'? -== Czy na pewno chcesz usunąć '%s'? - -Delete skin -== Usuń skina - -Unable to delete skin -== Usuwanie skina nie powiodło się - -Round %d/%d -== Runda %d/%d - -[Spectators] -%d others… -== %d innych… - -[Team and size] -%d\n(%d/%d) -== %d\n(%d/%d) - -Team %d (%d/%d) -== Drużyna %d (%d/%d) - -[skins] -Body -== Ciało - -[skins] -Marking -== Znaki - -[skins] -Decoration -== Ozdoby - -[skins] -Hands -== Ręce - -[skins] -Feet -== Stopy - -[skins] -Eyes -== Oczy - -Moved ingame -== Poruszono się w grze - -https://wiki.ddnet.org/wiki/Mapping -== https://wiki.ddnet.org/wiki/Mapping - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Some fonts could not be loaded. Check the local console for details. -== - -Loading background map -== - -[Spectating Camera Mode Icon] -AUTO -== - -Online friends (%d) -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Toggle auto camera -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Show client IDs in name plates -== - -Hook Strength -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Preview 'Hook collisions' being pressed -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Aim -== - -Active: Fire -== - -Active: Hook -== diff --git a/data/languages/portuguese.txt b/data/languages/portuguese.txt deleted file mode 100644 index 320b7dab9b..0000000000 --- a/data/languages/portuguese.txt +++ /dev/null @@ -1,2075 +0,0 @@ -##### authors ##### -#originally created by: -# HeroiAmarelo -#modified by: -# HeroiAmarelo 2011-07-15 -# HeroiAmarelo 2012-08-01 -# HeroiAmarelo 2012-10-18 -# Rockus 2018-04-06 -# rockuS 2022-02-10 -##### /authors ##### - -##### translated strings ##### - -%ds left -== faltam %ds - -%i minute left -== falta %i minuto - -%i minutes left -== faltam %i minutos - -%i second left -== falta %i segundo - -%i seconds left -== faltam %i segundos - -%s wins! -== %s ganhou! - -Abort -== Cancelar - -Add -== Adicionar - -Add Friend -== Adicionar Amigo - -Address -== Endereço - -All -== Todos - -Are you sure that you want to quit? -== Queres mesmo sair? - -Automatically record demos -== Gravar demos automaticamente - -Automatically take game over screenshot -== Tirar screenshots no final do turno autom. - -Blue team -== Equipa azul - -Blue team wins! -== A Equipa azul ganhou! - -Body -== Corpo - -Call vote -== Votação - -Change settings -== Mudar configurações - -Chat -== Conversa - -Clan -== Clã - -Client -== Cliente - -Connecting to -== A ligar ao endereço - -Connection Problems… -== Problemas na ligação! - -Console -== Console - -Controls -== Controlos - -Count players only -== Contar apenas jogadores - -Current -== Atual - -Custom colors -== Cores personalizadas - -Delete -== Eliminar - -Delete demo -== Eliminar demo - -Demo -== Demo - -Demofile: %s -== Demo: %s - -Demos -== Demos - -Disconnect -== Desconectar - -Disconnected -== Desconectado - -Downloading map -== A sacar o mapa… - -Draw! -== Empate! - -Dynamic Camera -== Câmera dinâmica - -Emoticon -== Emoticon - -Error -== Erro - -Error loading demo -== Erro a carregar a demo - -Favorite -== Favorito - -Favorites -== Favoritos - -Feet -== Pés - -Fire -== Disparar - -Folder -== Pasta - -Force vote -== Forçar a votação - -Free-View -== Vista Livre - -Fullscreen -== Ecrã inteiro - -Game -== Jogo - -Game info -== Informação sobre o jogo - -Game over -== Fim de Jogo - -Game paused -== Jogo em Pausa - -Game type -== Tipo de jogo - -Game types: -== Tipos de jogo: - -General -== Geral - -Graphics -== Gráficos - -Grenade -== Granada - -Hammer -== Martelo - -Has people playing -== Tem gente a jogar - -High Detail -== Mais detalhes (HD) - -Hook -== Gancho - -Invalid Demo -== Demo inválida - -Join blue -== Juntar à azul - -Join red -== Juntar à vermelha - -Jump -== Saltar - -Kick player -== Expulsar jogador - -Language -== Língua - -Laser -== Laser - -MOTD -== MOTD - -Map -== Mapa - -Move left -== Mover para a esquerda - -Move player to spectators -== Juntar jogador aos spectators - -Move right -== Mover para a direita - -Movement -== Movimento - -Mute when not active -== Silenciar quando inativo - -Name -== Nome - -Next weapon -== Arma Seguinte - -Nickname -== Nick - -No -== Não - -No password -== Sem password - -No servers found -== Nenhum servidor encontrado - -No servers match your filter criteria -== Não há servidores que correspondam aos critérios de procura. - -Ok -== Aceitar - -Parent Folder -== Pasta superior - -Password -== Palavra-Passe - -Password incorrect -== Palavra-Passe errada! - -Ping -== Ping - -Pistol -== Pistola - -Play background music -== Tocar a música de fundo - -Player -== Jogador - -Player country: -== País do jogador - -Players -== Jogadores - -Please balance teams! -== Equilibrem as equipas! - -Prev. weapon -== Arma anterior - -Quit -== Sair - -Reason: -== Motivo: - -Red team -== Equipa vermelha - -Red team wins! -== Ganhou a equipa vermelha! - -Remote console -== Remote console - -Remove -== Eliminar - -Remove friend -== Apagar amigo - -Rename demo -== Renomear demo - -Reset -== Reset - -Reset filter -== Reiniciar filtro - -Score -== Pontos - -Score limit -== Pontuação máxima - -Scoreboard -== Pontuação - -Screen -== Screen - -Screenshot -== Screenshot - -Server address: -== Endereço do servidor: - -Server info -== Info de servidor - -Server not full -== Servidor não cheio - -Shotgun -== Shotgun - -Show chat -== Mostrar chat - -Show friends only -== Mostrar apenas amigos - -Show ingame HUD -== Mostrar HUD do jogo - -Show name plates -== Mostrar nick's - -Show only chat messages from friends -== Mostrar apenas mensagens dos amigos no chat - -Sound -== Som - -Sound error -== Erro no som! - -Spectate -== Observar - -Spectate next -== Observar próximo - -Spectate previous -== Observar anterior - -Spectator mode -== Modo de espectador - -Spectators -== Espectadores - -Stop record -== Parar de gravar - -Strict gametype filter -== Tipo de jogo especifico - -Sudden Death -== Morte súbita - -Switch weapon on pickup -== Mudar de arma ao pegar nela - -Team -== Equipa - -Team chat -== Chat de equipa - -The audio device couldn't be initialised. -== O dispositivo de som não pode ser iniciado. - -The server is running a non-standard tuning on a pure game type. -== O servidor está a usar um tipo de jogo não oficial com o nome de um oficial. - -Time limit -== Tempo máximo - -Time limit: %d min -== Limite de tempo: %d min - -Try again -== Tenta outra vez - -Type -== Tipo - -Unable to rename the demo -== Impossivel renomear a demo - -Use sounds -== Ligar efeitos sonoros - -Use team colors for name plates -== Usar a cor da equipa para os nick's - -V-Sync -== V-Sync - -Version -== Versão - -Vote command: -== Comando de voto: - -Vote description: -== Descrição de votação: - -Vote no -== Votar não - -Vote yes -== Votar sim - -Voting -== A votar - -Warmup -== Aquecimento - -Weapon -== Arma - -Yes -== Sim - -You must restart the game for all settings to take effect. -== Para que as configurações sejam efetuadas deves reiniciar o jogo. - -Internet -== Internet - -Max demos -== Demos máximas - -News -== Notícias - -Sat. -== Sat. - -Join game -== Entrar no jogo - -New name: -== Novo nome: - -Sound volume -== Volume de som - -Max Screenshots -== Máximo de Capturas de Ecrã - -Record demo -== Gravar uma demo - -FSAA samples -== Amostras FSAA - -Miscellaneous -== Diversos - -Lht. -== Luz - -Your skin -== A tua skin - -Reset to defaults -== Restaurar predefinições - -UI Color -== Cor do menu - -Hue -== Matiz - -Alpha -== Alpha - -LAN -== LAN - -Name plates size -== Tamanho dos nick's - -AntiPing -== Antiping - -Map sound volume -== Volume de som do mapa - -Countries -== Países - -Show kill messages -== Mostrar mensagens de morte - -Show ghost -== Mostrar ghost - -DDNet -== DDNet - -No updates available -== Sem atualizações disponíveis - -Enable server message sound -== Ativar o som de mensagem do servidor - -Show votes window after voting -== Mostrar janela de voto depois de votar - -HUD -== HUD - -Show names in chat in team colors -== Mostrar nomes no chat com cores da equipa - -Enable team chat sound -== Ativar o som do chat de equipa - -Deaths -== Mortes - -Enable game sounds -== Ativar os sons do jogo - -DDNet Client needs to be restarted to complete update! -== O cliente DDNet precisa de ser reiniciado para completar a atualização! - -Show others -== Mostrar os outros - -Gameplay -== Jogabilidade - -Restart -== Reiniciar - -Browser -== Navegador - -Follow -== Seguir - -Enable gun sound -== Ativar o som da arma - -Team message -== Mensagem de equipa - -Automatically create statboard csv -== Criar automaticamente csv de statboard - -Save the best demo of each race -== Guardar a melhor demo de cada corrida - -Are you sure that you want to disconnect? -== Tens a certeza que te queres desconectar? - -Types -== Tipos - -Ghost -== Ghost - -Remove chat -== Removar o chat - -Check now -== Verifica agora - -AntiPing: predict other players -== AntiPing: prever os outros jogadores - -Automatically take statboard screenshot -== Tirar automaticamente screenshot da statboard - -System message -== Mensagem do sistema - -DDNet %s is available: -== DDNet %s está disponível: - -Updating… -== A atualizar… - -Messages -== Mensagens - -Refresh Rate -== Taxa de atualização - -New random timeout code -== Novo código aleatório de timeout - -Suicides -== Suicídios - -Loading DDNet Client -== A carregar o cliente DDNet - -Default zoom -== Zoom predefinido - -Show score -== Mostrar pontuação - -Max CSVs -== CSVs máximos - -Best -== Melhor - -Enable regular chat sound -== Ativar o som do chat regular - -Normal message -== Mensagem normal - -Search -== Procurar - -Connecting dummy -== A conectar o dummy - -Clan plates size -== Tamanho do nome do clã - -Update now -== Atualizar agora - -Show clan above name plates -== Mostrar o nome do clã por cima do nick - -Save ghost -== Guardar ghost - -Exclude -== Excluir - -Enable highlighted chat sound -== Ativar o som do chat em destaque - -AntiPing: predict weapons -== AntiPing: prever as armas - -DDNet Client updated! -== O cliente DDNet foi atualizado! - -Highlighted message -== Mensagem em destaque - -Switch weapon when out of ammo -== Mudar de arma quando ficar sem munição - -AntiPing: predict grenade paths -== Antiping: prever os caminhos da granada - -Warning -== Aviso - -Reconnect in %d sec -== Reconectar em %d seg - -File already exists, do you want to overwrite it? -== O ficheiro já existe, queres substituí-lo? - -Disconnect Dummy -== Desconectar Dummy - -Are you sure that you want to disconnect your dummy? -== Tens a certeza que queres desconectar o teu dummy? - -Welcome to DDNet -== Bem-vindo à DDNet - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== É recomendado que verifiques as definições para ajustá-las a teu gosto antes de te juntares a um servidor. - -Please enter your nickname below. -== Por favor introduz o teu nome abaixo. - -Existing Player -== Jogador Existente - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== O teu nome '%s' já está em uso (%d points). Queres usá-lo mesmo assim? - -Checking for existing player with your name -== A verificar a existência de um jogador com o teu nome - -Are you sure that you want to disconnect and switch to a different server? -== Tens a certeza que te queres desconectar e mudar para outro servidor? - -Speed -== Velocidade - -Video name: -== Nome do vídeo: - -transmits your player name to info.ddnet.org -== transmite o teu nome de jogador para info.ddnet.org - -Theme -== Tema - -%d of %d servers -== %d of %d servidores - -%d of %d server -== %d of %d servidor - -%d players -== %d jogadores - -%d player -== %d jogador - -Date -== Data - -Connect Dummy -== Conectar Dummy - -Time -== Tempo - -Deactivate -== Desativar - -Activate -== Ativar - -Save -== Guardar - -Settings file -== Ficheiro de definições - -Themes directory -== Diretório de temas - -Skins directory -== Diretório de skins - -Dummy -== Dummy - -Windowed -== Janela - -Windowed borderless -== Janela s/ bordas - -Desktop fullscreen -== Ecrã completo - -Game sound volume -== Volume do jogo - -Chat sound volume -== Volume do chat - -Background music volume -== Volume da música de fundo - -Use old chat style -== Usar o modo antigo de chat - -Friend message -== Mensagem de amigo/a - -Size -== Tamanho - -Background -== Fundo - -Particles -== Partículas - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -Learn -== Aprender - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/wiki/Main_Page/pt-br - -Website -== Website - -Settings -== Definições - -Stop server -== Parar servidor - -Editor -== Editor - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not save downloaded map. Try manually deleting this file: %s -== - -Could not connect dummy -== - -Error playing demo -== - -Successfully saved the replay! -== - -Failed saving the replay! -== - -Saving settings to '%s' failed -== - -Error saving settings -== - -Replay feature is disabled! -== - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -The format of texture %s is not RGBA which will cause visual bugs. -== - -Preparing demo playback -== - -Connected -== - -Loading map file from storage -== - -Loading demo file from storage -== - -Some fonts could not be loaded. Check the local console for details. -== - -Initializing components -== - -Why are you slowmo replaying to read this? -== - -Initializing assets -== - -Initializing map logic -== - -Sending initial client info -== - -Quitting. Please wait… -== - -Restarting. Please wait… -== - -Loading skin files -== - -Loading background map -== - -Searching -== - -Enter Username -== - -Enter Password -== - -NOT CONNECTED -== - -Match %d of %d -== - -No results -== - -Lines %d - %d (%s) -== - -Locked -== - -Following -== - -Loading commands… -== - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== - -Position: -== - -Speed: -== - -Angle: -== - -Multi-View -== - -[Spectating] -Following %s -== - -[Spectating Camera Mode Icon] -AUTO -== - -Server best: -== - -Personal best: -== - -Team %d -== - -Some map images could not be loaded. Check the local console for details. -== - -Uploading map data to GPU -== - -Some map sounds could not be loaded. Check the local console for details. -== - -Loading menu themes -== - -Press a key… -== - -Main menu -== - -Rename folder -== - -Render demo -== - -Render complete -== - -Are you sure that you want to restart? -== - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -There's an unsaved map in the editor, you might want to save it. -== - -Continue anyway? -== - -A demo with this name already exists -== - -A folder with this name already exists -== - -Unable to rename the folder -== - -File '%s' already exists, do you want to overwrite it? -== - -Replace video -== - -(paused) -== - -Videos directory -== - -Video was saved to '%s' -== - -Join Tutorial Server -== - -Skip Tutorial -== - -Show DDNet map finishes in server browser -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -Trying to determine UDP connectivity… -== - -UDP seems to be filtered. -== - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== - -No answer from server yet. -== - -%d/%d KiB (%.1f KiB/s) -== - -Getting game info -== - -Requesting to join the game -== - -Loading menu images -== - -AFR -== - -ASI -== - -AUS -== - -EUR -== - -NA -== - -SA -== - -CHN -== - -Getting server list from master server -== - -No local servers found (ports %d-%d) -== - -Example of usage -== - -No login required -== - -Filter connecting players -== - -Indicate map finish -== - -Unfinished map -== - -Communities -== - -Copy info -== - -Leak IP -== - -No server selected -== - -Online friends (%d) -== - -Online clanmates (%d) -== - -[friends (server browser)] -Offline (%d) -== - -Click to select server. Double click to join your friend. -== - -Click to remove this player from your friends list. -== - -Click to remove this clan from your friends list. -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Are you sure that you want to remove the player '%s' from your friends list? -== - -Are you sure that you want to remove the clan '%s' from your friends list? -== - -Add Clan -== - -Server filter -== - -Friends -== - -Play the current demo -== - -Pause the current demo -== - -Stop the current demo -== - -Go back the specified duration -== - -[Demo player duration] -%d min. -== - -[Demo player duration] -%d sec. -== - -Change the skip duration -== - -Go forward the specified duration -== - -Go back one tick -== - -Go forward one tick -== - -Go back one marker -== - -Go forward one marker -== - -Slow down the demo -== - -Speed up the demo -== - -Mark the beginning of a cut (right click to reset) -== - -Mark the end of a cut (right click to reset) -== - -Export cut as a separate demo -== - -Close the demo player -== - -Toggle keyboard shortcuts -== - -Toggle auto camera -== - -Export demo cut -== - -Cut interval -== - -Cut length -== - -Render cut to video -== - -Please use a different filename -== - -Loading demo files -== - -All combined -== - -Length -== - -No demo selected -== - -Folder Link -== - -Created -== - -Markers -== - -Netversion -== - -[Demo details] -map not included -== - -%.2f MiB -== - -%.2f KiB -== - -Fetch Info -== - -Demos directory -== - -Open the directory that contains the demo files -== - -Are you sure that you want to delete the folder '%s'? -== - -Are you sure that you want to delete the demo '%s'? -== - -Delete folder -== - -Unable to delete the demo '%s' -== - -Unable to delete the folder '%s'. Make sure it's empty first. -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Kill -== - -Pause -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Loading… -== - -Loading ghost files -== - -Ghosts directory -== - -Activate all -== - -Deactivate all -== - -Menu opened. Press Esc key again to close menu. -== - -Smooth Dynamic Camera -== - -Skip the main menu -== - -[Hertz] -Hz -== - -Save power by lowering refresh rate (higher input latency) -== - -Open the settings file -== - -Config directory -== - -Open the directory that contains the configuration and user files -== - -Open the directory to add custom themes -== - -Player info change cooldown -== - -Download skins -== - -Download community skins -== - -Vanilla skins only -== - -Fat skins (DDFat) -== - -Skin prefix -== - -Create a random skin -== - -Choose default eyes when joining a server -== - -Skin Database -== - -Open the directory to add custom skins -== - -Hook collisions -== - -Zoom in -== - -Zoom out -== - -Show all -== - -Toggle dyncam -== - -Toggle ghost -== - -Converse -== - -Chat command -== - -Toggle dummy -== - -Dummy copy -== - -Hammerfly dummy -== - -Statboard -== - -Lock team -== - -Show entities -== - -Show HUD -== - -Enable controller -== - -Controller -== - -Ingame controller mode -== - -[Ingame controller mode] -Relative -== - -[Ingame controller mode] -Absolute -== - -Ingame controller sens. -== - -UI controller sens. -== - -Controller jitter tolerance -== - -No controller found. Plug in a controller. -== - -Axis -== - -Status -== - -Aim bind -== - -Mouse -== - -Ingame mouse sens. -== - -UI mouse sens. -== - -Reset controls -== - -Are you sure that you want to reset the controls to their defaults? -== - -Cancel -== - -Windowed fullscreen -== - -may cause delay -== - -Allows maps to render with more detail -== - -Use high DPI -== - -Renderer -== - -default -== - -custom -== - -Graphics card -== - -auto -== - -Enable long pain sound (used when shooting in freeze) -== - -Tee -== - -Appearance -== - -Assets -== - -Name Plate -== - -Hook Collisions -== - -Info Messages -== - -Show health, shields and ammo -== - -Show local time always -== - -Authed name color in scoreboard -== - -Same clan color in scoreboard -== - -DDRace HUD -== - -Show client IDs (scoreboard, chat, spectator) -== - -Show DDRace HUD -== - -Show jumps indicator -== - -Show dummy actions -== - -Show player position -== - -Show player speed -== - -Show player target angle -== - -Show freeze bars -== - -Opacity of freeze bars inside freeze -== - -Always show chat -== - -Show only chat messages from team members -== - -Chat font size -== - -Chat width -== - -Client message -== - -Preview -== - -Show friend mark (♥) in name plates -== - -Show client IDs in name plates -== - -Hook Strength -== - -Show hook strength icon indicator -== - -Show hook strength number indicator -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Show other players' key presses -== - -Show local player's key presses -== - -Size of key press icons -== - -Hook collision line -== - -Show own player's hook collision line -== - -Always show own player's hook collision line -== - -Show other players' hook collision lines -== - -Always show other players' hook collision lines -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Hook collision line opacity -== - -Colors of the hook collision line, in case of a possible collision with: -== - -Your movements are not taken into account when calculating the line colors -== - -Nothing hookable -== - -Something hookable -== - -A Tee -== - -Preview 'Hook collisions' being pressed -== - -Show finish messages -== - -Normal Color -== - -Highlight Color -== - -Weapons -== - -Rifle Laser Outline Color -== - -Rifle Laser Inner Color -== - -Shotgun Laser Outline Color -== - -Shotgun Laser Inner Color -== - -Entities -== - -Door Laser Outline Color -== - -Door Laser Inner Color -== - -Freeze Laser Outline Color -== - -Freeze Laser Inner Color -== - -Set all to Rifle -== - -Enable replays -== - -Default length -== - -Enable ghost -== - -When you cross the start line, show a ghost tee replicating the movements of your best time -== - -Opacity -== - -Only save improvements -== - -Overlay entities -== - -Show text entities -== - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== - -Show others (own team only) -== - -Show quads -== - -Quads are used for background decoration -== - -Tries to predict other entities to give a feel of low latency -== - -Regular background color -== - -Entities background color -== - -Use current map as background -== - -Show tiles layers from BG map -== - -Run on join -== - -Chat command (e.g. showall 1) -== - -Unregister protocol and file extensions -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Emoticons -== - -Extras -== - -Loading assets -== - -Assets directory -== - -Open the directory to add custom assets -== - -Tutorial -== - -Can't find a Tutorial server -== - -Run server -== - -[Start menu] -Play -== - -DDNet %s is out! -== - -Downloading %s: -== - -Update failed! Check log… -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Server executable not found, can't run server -== - -Loading race demo files -== - -Round %d/%d -== - -[Spectators] -%d others… -== - -Super -== - -[Team and size] -%d\n(%d/%d) -== - -Team %d (%d/%d) -== - -Manual -== - -Race -== - -Auto -== - -Replay -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Loading sound files -== - -Frags -== - -Ratio -== - -Net -== - -FPM -== - -Spree -== - -Grabs -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -1 new mention -== - -%d new mentions -== - -9+ new mentions -== - -Moved ingame -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/romanian.txt b/data/languages/romanian.txt deleted file mode 100644 index d283033cbc..0000000000 --- a/data/languages/romanian.txt +++ /dev/null @@ -1,2080 +0,0 @@ -##### authors ##### -#originally created by: -# kneekoo -#modified by: -# kneekoo 2011-01-18 18:26:02 -# kneekoo 2011-02-09 12:23:47 -# kneekoo 2011-04-03 23:00:38 -# kneekoo 2011-05-25 18:36:32 -# kneekoo 2011-07-01 18:40:49 -# kneekoo 2011-07-05 23:34:34 -# kneekoo 2012-05-01 02:01:47 -# Sans 2024-12-04 02:19:00 -##### /authors ##### - -##### translated strings ##### - -%ds left -== %ds rămase - -%i minute left -== %i minut rămas - -%i minutes left -== %i minute rămase - -%i second left -== %i secundă rămasă - -%i seconds left -== %i secunde rămase - -%s wins! -== %s câștigă! - -Abort -== Anulează - -Add -== Adaugă - -Add Friend -== Adaugă prieten - -Address -== Adresa - -All -== Toți - -Are you sure that you want to quit? -== Ești sigur că vrei să ieși? - -Automatically record demos -== Înregistrează automat demo-uri - -Automatically take game over screenshot -== Fă automat o captură de ecran la final - -Blue team -== Echipa albastră - -Blue team wins! -== Echipa albastră a câștigat! - -Body -== Corp - -Call vote -== Votează - -Change settings -== Modifică setările - -Chat -== Chat - -Clan -== Clan - -Client -== Client - -Connecting to -== Conectare la - -Connection Problems… -== Probleme la conexiune… - -Console -== Consolă - -Controls -== Controale - -Count players only -== Numără doar jucătorii - -Current -== Curent - -Custom colors -== Culori personalizate - -Delete -== Șterge - -Delete demo -== Șterge demo-ul - -Demofile: %s -== Fișier demo: %s - -Demos -== Demo-uri - -Disconnect -== Deconectare - -Disconnected -== Deconectat - -Downloading map -== Se descarcă harta - -Draw! -== Egalitate! - -Dynamic Camera -== Cameră dinamică - -Emoticon -== Emoticon - -Error -== Eroare - -Error loading demo -== Eroare la încărcarea demo-ului - -Favorite -== Favorit - -Favorites -== Favorite - -Feet -== Picioare - -Fire -== Foc - -Folder -== Dosar - -Force vote -== Forțează votul - -Free-View -== Vizualizare liberă - -Fullscreen -== Ecran complet - -Game -== Joc - -Game info -== Informații joc - -Game over -== Final de joc - -Game paused -== Joc în pauză - -Game type -== Tip de joc - -Game types: -== Tipuri de joc: - -General -== General - -Graphics -== Grafică - -Grenade -== Lansator de grenade - -Hammer -== Ciocan - -Has people playing -== Are jucători activi - -High Detail -== Detalii înalte - -Hook -== Cârlig - -Invalid Demo -== Demo nevalid - -Join blue -== Intră la albaștri - -Join red -== Intră la roșii - -Jump -== Salt - -Kick player -== Dă afară jucător - -Language -== Limba - -MOTD -== Mesajul zilei - -Map -== Hartă - -Move left -== Mută la stânga - -Move player to spectators -== Mută jucătorul la spectatori - -Move right -== Mută la dreapta - -Movement -== Mișcare - -Mute when not active -== Opreşte sunetul când nu este activ - -Name -== Nume - -Next weapon -== Arma următoare - -Nickname -== Poreclă - -No -== Nu - -No password -== Fără parolă - -No servers found -== Nici un server găsit - -No servers match your filter criteria -== Nici un server nu corespunde criteriilor - -Ok -== Ok - -Parent Folder -== Dosarul părinte - -Password -== Parolă - -Password incorrect -== Parolă incorectă - -Ping -== Ping - -Pistol -== Pistol - -Play background music -== Redă muzică în fundal - -Player -== Jucător - -Player country: -== Țara jucătorului: - -Players -== Jucători - -Please balance teams! -== Echilibrați echipele! - -Prev. weapon -== Arma precedentă - -Quit -== Ieșire - -Reason: -== Motiv: - -Red team -== Echipa roșie - -Red team wins! -== Echipa roșie a câștigat! - -Remote console -== Consolă server - -Remove -== Șterge - -Remove friend -== Șterge prieten - -Rename demo -== Redenumește demo - -Reset filter -== Resetează filtrul - -Score -== Scor - -Score limit -== Limita de scor - -Scoreboard -== Tabela de scor - -Screenshot -== Captură de ecran - -Server address: -== Adresă server: - -Server info -== Info. server - -Server not full -== Server-ul nu e plin - -Shotgun -== Pușcă de vânatoare - -Show chat -== Afișare chat - -Show friends only -== Arată doar prietenii - -Show ingame HUD -== Afișează interfața din joc - -Show name plates -== Arată poreclele - -Show only chat messages from friends -== Arată doar mesaje de la prieteni în chat - -Sound -== Sunet - -Sound error -== Eroare de sunet - -Spectate -== Spectator - -Spectate next -== Vezi următorul - -Spectate previous -== Vezi anteriorul - -Spectator mode -== Mod spectator - -Spectators -== Spectatori - -Stop record -== Stop înreg. - -Strict gametype filter -== Filtru strict tip joc - -Sudden Death -== Moarte subită - -Switch weapon on pickup -== Schimbă arma la găsire - -Team -== Echipa - -Team chat -== Chat cu echipa - -The audio device couldn't be initialised. -== Dispozitivul audio nu a putut fi inițializat. - -The server is running a non-standard tuning on a pure game type. -== Serverul folosește parametri non-standard într-un joc standard. - -Time limit -== Timp limită - -Time limit: %d min -== Timp limită : %d min - -Try again -== Reîncearcă - -Type -== Tip - -Unable to rename the demo -== Nu se poate redenumi demo-ul - -Use sounds -== Folosește sunete - -Use team colors for name plates -== Folosește culorile echipelor pentru etichetele de nume - -V-Sync -== Sincronizare verticală (V-Sync) - -Version -== Versiune - -Vote command: -== Comandă votare: - -Vote description: -== Descriere votare: - -Vote no -== Votează nu - -Vote yes -== Votează da - -Voting -== Votare - -Warmup -== Încălzire - -Weapon -== Arme - -Yes -== Da - -You must restart the game for all settings to take effect. -== Trebuie să repornești jocul pentru aplicarea setărilor. - -##### needs translation ##### - -New name: -== Nume nou: - -Sat. -== Sat. - -Miscellaneous -== Diverse - -Internet -== Internet - -Max demos -== Număr maxim de demo-uri - -News -== Știri - -Join game -== Intră în joc - -FSAA samples -== Mostre FSAA - -Sound volume -== Volum sunet - -Max Screenshots -== Număr maxim de capturi de ecran - -Laser -== Laser - -Hue -== Nuanță - -Record demo -== Înreg. demo - -Your skin -== Costumul tău - -Reset to defaults -== Setări implicite - -Lht. -== Luminozitate - -UI Color -== Culoare meniu - -Alpha -== Alfa - -LAN -== Rețea - -Name plates size -== Dimensiune plăcuțe de nume - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Eșuat în timpul inițializării. Încercați să schimbați gfx_backend la OpenGL sau Vulkan în settings_ddnet.cfg din dosarul de configurare și încercați din nou. - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== Fără memorie video (VRAM). Încercați să eliminați resursele personalizate (costume, entități etc.), în special cele cu rezoluție mare. - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== A apărut o eroare în timpul înregistrării comenzii. Încercați să vă actualizați driverele plăcii grafice (GPU). - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== O comandă de randare a eșuat. Încercați să vă actualizați driverele plăcii grafice (GPU). - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== Trimiterea comenzilor de randare a eșuat. Încercați să vă actualizați driverele plăcii grafice (GPU). - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== A eșuat schimbul tamponelor de cadre. Încercați să vă actualizați driverele plăcii grafice (GPU). - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Eroare necunoscută. Încercați să schimbați gfx_backend la OpenGL sau Vulkan în settings_ddnet.cfg din dosarul de configurare și încercați din nou. - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== Nu s-a putut inițializa backend-ul grafic dat, se revine la backend-ul implicit. - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== Nu s-a putut inițializa backend-ul grafic dat, probabil pentru că nu ați instalat driverul plăcii grafice integrate. - -Could not resolve connect address '%s'. See local console for details. -== Nu s-a putut rezolva adresa de conectare '%s'. Consultați consola pentru detalii. - -Connect address error -== Eroare adresă de conectare - -Could not save downloaded map. Try manually deleting this file: %s -== Nu s-a putut salva harta descărcată. Încercați să ștergeți manual acest fișier: %s - -Could not connect dummy -== Nu s-a putut conecta manechinul - -Error playing demo -== Eroare la redarea demo-ului - -Successfully saved the replay! -== Reluare salvată cu succes! - -Failed saving the replay! -== A eșuat salvarea reluării! - -Saving settings to '%s' failed -== Salvarea setărilor în '%s' a eșuat - -Error saving settings -== Eroare la salvarea setărilor - -Replay feature is disabled! -== Funcția de reluare este dezactivată! - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== Lățimea texturii %s nu este divizibilă cu %d, sau înălțimea nu este divizibilă cu %d, ceea ce poate cauza erori vizuale. - -The format of texture %s is not RGBA which will cause visual bugs. -== Formatul texturii %s nu este RGBA, ceea ce va cauza erori vizuale. - -Preparing demo playback -== Se pregătește redarea demo-ului - -Connected -== Conectat - -Loading map file from storage -== Se încarcă fișierul de hartă din stocare - -Loading demo file from storage -== Se încarcă fișierul demo din stocare - -Some fonts could not be loaded. Check the local console for details. -== Unele fonturi nu au putut fi încărcate. Verificați consola pentru detalii. - -Loading DDNet Client -== Se încarcă client-ul DDNet - -Initializing components -== Se inițializează componentele - -Why are you slowmo replaying to read this? -== De ce re-joci în slowmo ca să citești asta? - -Initializing assets -== Se inițializează resursele - -Initializing map logic -== Se inițializează logica hărții - -Sending initial client info -== Se trimit informațiile inițiale despre client - -Warning -== Avertisment - -Quitting. Please wait… -== Ieșire. Așteptați, vă rog… - -Restarting. Please wait… -== Repornire. Așteptați, vă rog… - -Loading skin files -== Se încarcă fișiere costume - -Search -== Caută - -Searching -== Se caută - -Enter Username -== Introduceți numele de utilizator - -Enter Password -== Introduceți parola - -NOT CONNECTED -== NU ESTE CONECTAT - -Match %d of %d -== Corespunde %d din %d - -No results -== Nu există rezultate - -Lines %d - %d (%s) -== Liniile %d - %d (%s) - -Locked -== Blocat - -Following -== Urmărind - -Loading commands… -== Se încarcă comenzile… - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Modul de depanare activat. Apăsați Ctrl+Shift+D pentru a dezactiva modul de depanare. - -Position: -== Poziție: - -Speed: -== Viteză: - -Angle: -== Unghi: - -Multi-View -== Multi-vedere - -[Spectating] -Following %s -== Urmărind %s - -Server best: -== Record server: - -Personal best: -== Record personal: - -Team %d -== Echipa %d - -Some map images could not be loaded. Check the local console for details. -== Unele imagini ale hărții nu au putut fi încărcate. Verificați consola pentru detalii. - -Uploading map data to GPU -== Se încarcă datele hărții pe placa grafică (GPU) - -Some map sounds could not be loaded. Check the local console for details. -== Unele sunete ale hărții nu au putut fi încărcate. Verificați consola pentru detalii. - -Loading menu themes -== Se încarcă temele meniului - -Reset -== Resetează - -Press a key… -== Apasă o tastă… - -Settings -== Setări - -Editor -== Editor - -Main menu -== Meniul principal - -Browser -== Browser - -Ghost -== Fantomă - -Reconnect in %d sec -== Reconectare în %d sec - -Rename folder -== Redenumește dosarul - -Render demo -== Randează demo - -Render complete -== Randare completă - -Restart -== Repornire - -Are you sure that you want to restart? -== Ești sigur că vrei să repornești? - -Welcome to DDNet -== Bine ai venit pe DDNet - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork este un joc online cooperativ în care scopul tău și al grupului tău este să ajungeți la linia de sosire a hărții. Ca începător, ar trebui să începi pe serverele Novice, care găzduiesc cele mai ușoare hărți. Ține cont de ping pentru a alege un server aproape de tine. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Folosește tasta k pentru a te "ucide" (reporni), q pentru a pune pauză și a privi alți jucători. Vezi setările pentru alte taste configurabile. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Este recomandat să verifici setările pentru a le ajusta după preferințele tale înainte de a intra pe un server. - -Please enter your nickname below. -== Introdu porecla ta mai jos. - -Existing Player -== Jucător existent - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Porecla ta '%s' este deja folosită (%d puncte). Vrei totuși să o folosești? - -Checking for existing player with your name -== Se verifică existența unui jucător cu numele tău - -Save skin -== Salvează costumul - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== Ești sigur că vrei să salvezi costumul? Dacă un costum cu acest nume există deja, acesta va fi înlocuit. - -There's an unsaved map in the editor, you might want to save it. -== Există o hartă nesalvată în editor, poate vrei să o salvezi. - -Continue anyway? -== Continui oricum? - -A demo with this name already exists -== Un demo cu acest nume există deja - -A folder with this name already exists -== Un dosar cu acest nume există deja - -Unable to rename the folder -== Nu se poate redenumi dosarul - -File '%s' already exists, do you want to overwrite it? -== Fișierul '%s' există deja, vrei să-l suprascrii? - -Replace video -== Înlocuiește videoclipul - -(paused) -== (pauză) - -Speed -== Viteză - -Video name: -== Nume videoclip: - -Videos directory -== Dosar videoclipuri - -Video was saved to '%s' -== Videoclipul a fost salvat în '%s' - -Join Tutorial Server -== Intră pe serverul de tutorial - -Skip Tutorial -== Sari peste tutorial - -Show DDNet map finishes in server browser -== Afișează finalizările hărților DDNet în browserul de servere - -transmits your player name to info.ddnet.org -== transmite numele tău de jucător către info.ddnet.org - -Unable to save the skin -== Nu se poate salva costumul - -Unable to save the skin with a reserved name -== Nu se poate salva costumul cu un nume rezervat - -Trying to determine UDP connectivity… -== Se încearcă determinarea conectivității UDP… - -UDP seems to be filtered. -== UDP pare să fie filtrat. - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== Adresele IP UDP și TCP par să fie diferite. Încercați să dezactivați VPN-ul, proxy-ul sau acceleratoarele de rețea. - -No answer from server yet. -== Încă nu a răspuns serverul. - -%d/%d KiB (%.1f KiB/s) -== %d/%d KiB (%.1f KiB/s) - -Getting game info -== Se obțin informațiile jocului - -Requesting to join the game -== Se solicită intrarea în joc - -Theme -== Temă - -Loading menu images -== Se încarcă imaginile meniului - -AFR -== AFR - -ASI -== ASI - -AUS -== AUS - -EUR -== EUR - -NA -== NA - -SA -== SA - -CHN -== CHN - -Getting server list from master server -== Se obține lista serverelor de la serverul principal - -No local servers found (ports %d-%d) -== Nu s-au găsit servere locale (porturi %d-%d) - -Example of usage -== Exemplu de utilizare - -Exclude -== Exclude - -%d of %d servers -== %d din %d servere - -%d of %d server -== %d din %d server - -%d players -== %d jucători - -%d player -== %d jucător - -Are you sure that you want to disconnect and switch to a different server? -== Ești sigur că vrei să te deconectezi și să treci la un alt server? - -No login required -== Nu este necesar să te autentifici - -Filter connecting players -== Filtrează jucătorii care se conectează - -Indicate map finish -== Indică finalizarea hărții - -Unfinished map -== Hartă neterminată - -Countries -== Țări - -Types -== Tipuri - -Communities -== Comunități - -Copy info -== Copiază informațiile - -Leak IP -== Expune IP-ul - -No server selected -== Niciun server selectat - -Online friends (%d) -== Prieteni online (%d) - -Online clanmates (%d) -== Membri de clan online (%d) - -[friends (server browser)] -Offline (%d) -== Offline (%d) - -Click to select server. Double click to join your friend. -== Fă clic pentru a selecta serverul. Dublu clic pentru a te alătura prietenului tău. - -Click to remove this player from your friends list. -== Fă clic pentru a elimina acest jucător din lista de prieteni. - -Click to remove this clan from your friends list. -== Fă clic pentru a elimina acest clan din lista de prieteni. - -Add friends by entering their name below or by clicking their name in the player list. -== Adaugă prieteni introducând numele lor mai jos sau făcând clic pe numele lor în lista de jucători. - -Add clanmates by entering their clan below and leaving the name blank. -== Adaugă membri de clan introducând numele clanului mai jos și lăsând numele gol. - -Offline friends and clanmates will appear here. -== Prietenii și membrii de clan offline vor apărea aici. - -Are you sure that you want to remove the player '%s' from your friends list? -== Ești sigur că vrei să elimini jucătorul '%s' din lista de prieteni? - -Are you sure that you want to remove the clan '%s' from your friends list? -== Ești sigur că vrei să elimini clanul '%s' din lista de prieteni? - -Add Clan -== Adaugă Clan - -Server filter -== Filtru server - -Friends -== Prieteni - -Play the current demo -== Redă demo-ul curent - -Pause the current demo -== Pune pe pauză demo-ul curent - -Stop the current demo -== Oprește demo-ul curent - -Go back the specified duration -== Mergi înapoi cu durata specificată - -[Demo player duration] -%d min. -== %d min. - -[Demo player duration] -%d sec. -== %d sec. - -Change the skip duration -== Schimbă durata de sărire - -Go forward the specified duration -== Mergi înainte cu durata specificată - -Go back one tick -== Mergi înapoi un pas - -Go forward one tick -== Mergi înainte un pas - -Go back one marker -== Mergi înapoi un marcaj - -Go forward one marker -== Mergi înainte un marcaj - -Slow down the demo -== Încetinește demo-ul - -Speed up the demo -== Accelerează demo-ul - -Mark the beginning of a cut (right click to reset) -== Marchează începutul unei secțiuni (clic dreapta pentru resetare) - -Mark the end of a cut (right click to reset) -== Marchează sfârșitul unei secțiuni (clic dreapta pentru resetare) - -Export cut as a separate demo -== Exportă secțiunea ca un demo separat - -Close the demo player -== Închide player-ul demo - -Toggle keyboard shortcuts -== Comutează scurtăturile de tastatură - -Export demo cut -== Exportă secțiunea demo - -Cut interval -== Interval de tăiere - -Cut length -== Lungime secțiune - -Remove chat -== Elimină chatul - -Render cut to video -== Randează secțiunea în video - -Please use a different filename -== Folosește un alt nume de fișier - -File already exists, do you want to overwrite it? -== Fișierul există deja, vrei să-l suprascrii? - -Loading demo files -== Se încarcă fișierele demo - -All combined -== Toate combinate - -Demo -== Demo - -Length -== Lungime - -Date -== Dată - -No demo selected -== Niciun demo selectat - -Folder Link -== Link folder - -Created -== Creat - -Markers -== Marcaje - -Netversion -== Versiune rețea - -Size -== Dimensiune - -[Demo details] -map not included -== harta nu este inclusă - -%.2f MiB -== %.2f MiB - -%.2f KiB -== %.2f KiB - -Fetch Info -== Preia informații - -Demos directory -== Dosar demo-uri - -Open the directory that contains the demo files -== Deschide dosarul care conține fișierele demo - -Are you sure that you want to delete the folder '%s'? -== Ești sigur că vrei să ștergi folderul '%s'? - -Are you sure that you want to delete the demo '%s'? -== Ești sigur că vrei să ștergi demo-ul '%s'? - -Delete folder -== Șterge folderul - -Unable to delete the demo '%s' -== Nu se poate șterge demo-ul '%s' - -Unable to delete the folder '%s'. Make sure it's empty first. -== Nu se poate șterge folderul '%s'. Asigură-te mai întâi că este gol. - -Are you sure that you want to disconnect? -== Ești sigur că vrei să te deconectezi? - -Connect Dummy -== Conectează manechinul - -Dummy is not allowed on this server -== Manechinul nu este permis pe acest server - -Please wait… -== Te rog așteaptă… - -Connecting dummy -== Se conectează manechinul - -Disconnect Dummy -== Deconectează manechinul - -Are you sure that you want to disconnect your dummy? -== Ești sigur că vrei să deconectezi manechinul? - -Kill -== Ucide - -Pause -== Pauză - -Edit touch controls -== Editează controalele tactile - -Close -== Închide - -Save changes -== Salvează modificările - -Error saving touch controls -== Eroare la salvarea controalelor tactile - -Could not save touch controls to file. See local console for details. -== Nu s-au putut salva controalele tactile în fișier. Verifică consola locală pentru detalii. - -Unsaved changes -== Modificări nesalvate - -Discard changes -== Renunță la modificări - -Are you sure that you want to discard the current changes to the touch controls? -== Ești sigur că vrei să renunți la modificările curente ale controalelor tactile? - -Are you sure that you want to reset the touch controls to default? -== Ești sigur că vrei să resetezi controalele tactile la valorile implicite? - -Import from clipboard -== Importă din clipboard - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== Ești sigur că vrei să imporți controalele tactile din clipboard? Acest lucru va suprascrie setările actuale. - -Export to clipboard -== Exportă în clipboard - -Direct touch input while ingame -== Intrare tactilă directă în timpul jocului - -[Direct touch input] -Disabled -== Dezactivat - -[Direct touch input] -Active action -== Acțiune activă - -[Direct touch input] -Aim -== Țintește - -[Direct touch input] -Fire -== Trage - -[Direct touch input] -Hook -== Cârlig - -Direct touch input while spectating -== Intrare tactilă directă în timpul vizionării - -Error loading touch controls -== Eroare la încărcarea controalelor tactile - -Could not load touch controls from file. See local console for details. -== Nu s-au putut încărca controalele tactile din fișier. Verifică consola locală pentru detalii. - -Could not load default touch controls from file. See local console for details. -== Nu s-au putut încărca controalele tactile implicite din fișier. Verifică consola locală pentru detalii. - -Could not load touch controls from clipboard. See local console for details. -== Nu s-au putut încărca controalele tactile din clipboard. Verifică consola locală pentru detalii. - -Loading… -== Se încarcă… - -Loading ghost files -== Se încarcă fișierele fantomă - -Time -== Timp - -Ghosts directory -== Dosar fantome - -Activate all -== Activează toate - -Deactivate all -== Dezactivează toate - -Deactivate -== Dezactivează - -Activate -== Activează - -Save -== Salvează - -Menu opened. Press Esc key again to close menu. -== Meniul a fost deschis. Apasă tasta Esc din nou pentru a închide meniul. - -Smooth Dynamic Camera -== Cameră dinamică lină - -Switch weapon when out of ammo -== Schimbă arma când rămâi fără muniție - -Skip the main menu -== Sari peste meniul principal - -[Hertz] -Hz -== Hz - -Refresh Rate -== Rata de refresh - -Save power by lowering refresh rate (higher input latency) -== Economisește energie prin reducerea ratei de refresh (latență mai mare la intrări) - -Settings file -== Fișier de setări - -Open the settings file -== Deschide fișierul de setări - -Config directory -== Dosarul de configurare - -Open the directory that contains the configuration and user files -== Deschide dosarul care conține fișierele de configurare și utilizator - -Themes directory -== Dosar teme - -Open the directory to add custom themes -== Deschide dosarul pentru a adăuga teme personalizate - -Automatically take statboard screenshot -== Fă automat captură de ecran pentru tabela de statistici - -Automatically create statboard csv -== Creează automat fișier CSV pentru tabela de statistici - -Max CSVs -== Număr maxim de fișiere CSV - -Dummy -== Manechin - -Player info change cooldown -== Timp de așteptare pentru schimbarea informațiilor jucătorului - -Download skins -== Descarcă costume - -Download community skins -== Descarcă costume comunitare - -Vanilla skins only -== Doar costume de bază (Vanilla) - -Fat skins (DDFat) -== Costume mari (DDFat) - -Skin prefix -== Prefix costum - -Create a random skin -== Creează un costum aleatoriu - -Choose default eyes when joining a server -== Alege ochii implicați la conectarea pe un server - -Skin Database -== Baza de date a costumelor - -Skins directory -== Dosar costume - -Open the directory to add custom skins -== Deschide dosarul pentru a adăuga costume personalizate - -Hook collisions -== Coliziuni cârlig - -Zoom in -== Mărește - -Zoom out -== Micșorează - -Default zoom -== Zoom implicit - -Show others -== Arată alții - -Show all -== Arată toți - -Toggle dyncam -== Comutează camera dinamică - -Toggle ghost -== Comutează fantoma - -Converse -== Conversație - -Chat command -== Comandă chat - -Toggle dummy -== Comutează manechinul - -Dummy copy -== Copiere manechin - -Hammerfly dummy -== Manechin hammerfly - -Statboard -== Tabela de statistici - -Lock team -== Blochează echipa - -Show entities -== Arată entitățile - -Show HUD -== Arată interfața - -Enable controller -== Activează controlerul - -Controller -== Controler - -Ingame controller mode -== Mod controler în joc - -[Ingame controller mode] -Relative -== Relativ - -[Ingame controller mode] -Absolute -== Absolut - -Ingame controller sens. -== Sensibilitate controler în joc - -UI controller sens. -== Sensibilitate controler interfață - -Controller jitter tolerance -== Toleranță la zgomot controler - -No controller found. Plug in a controller. -== Nu s-a găsit niciun controler. Conectează un controler. - -Axis -== Axă - -Status -== Status - -Aim bind -== Legare țintire - -Mouse -== Mouse - -Ingame mouse sens. -== Sensibilitate mouse în joc - -UI mouse sens. -== Sensibilitate mouse interfață - -Reset controls -== Resetează controalele - -Are you sure that you want to reset the controls to their defaults? -== Ești sigur că vrei să resetezi controalele la valorile implicite? - -Cancel -== Anulează - -Windowed -== Fereastră - -Windowed borderless -== Fereastră fără margini - -Windowed fullscreen -== Fereastră pe tot ecranul - -Desktop fullscreen -== Ecran complet desktop - -Screen -== Ecran - -may cause delay -== poate cauza întârzieri - -Allows maps to render with more detail -== Permite redarea hărților cu mai multe detalii - -Use high DPI -== Folosește DPI înalt - -Renderer -== Motor grafic - -default -== implicit - -custom -== personalizat - -Graphics card -== Placă grafică - -auto -== automat - -Enable game sounds -== Activează sunetele jocului - -Enable gun sound -== Activează sunetul armelor - -Enable long pain sound (used when shooting in freeze) -== Activează sunetul lung de durere (utilizat când tragi în timp ce ești înghețat) - -Enable server message sound -== Activează sunetul mesajelor serverului - -Enable regular chat sound -== Activează sunetul chat-ului obișnuit - -Enable team chat sound -== Activează sunetul chat-ului de echipă - -Enable highlighted chat sound -== Activează sunetul pentru chat-ul evidențiat - -Game sound volume -== Volumul sunetului jocului - -Chat sound volume -== Volumul sunetului din chat - -Map sound volume -== Volumul sunetelor hărții - -Background music volume -== Volumul muzicii de fundal - -Tee -== Tee - -Appearance -== Apariție - -DDNet -== DDNet - -Assets -== Resurse - -DDNet Client needs to be restarted to complete update! -== Clientul DDNet trebuie repornit pentru a finaliza actualizarea! - -HUD -== Interfață - -Name Plate -== Etichetă de nume - -Hook Collisions -== Coliziuni cârlig - -Info Messages -== Mesaje informative - -Show health, shields and ammo -== Arată viața, scuturile și muniția - -Show score -== Arată scorul - -Show local time always -== Arată ora locală mereu - -Show votes window after voting -== Arată fereastra de voturi după votare - -DDRace HUD -== Interfață DDRace - -Show client IDs (scoreboard, chat, spectator) -== Arată ID-urile de client (tabelă, chat, spectator) - -Show DDRace HUD -== Arată interfața DDRace - -Show jumps indicator -== Arată indicatorul săriturilor - -Show dummy actions -== Arată acțiunile manechinului - -Show player position -== Arată poziția jucătorului - -Show player speed -== Arată viteza jucătorului - -Show player target angle -== Arată unghiul țintei jucătorului - -Show freeze bars -== Arată barele de îngheț - -Opacity of freeze bars inside freeze -== Opacitatea barelor de îngheț în stare de îngheț - -Always show chat -== Arată mereu chat-ul - -Show names in chat in team colors -== Arată numele în chat în culorile echipei - -Show only chat messages from team members -== Arată doar mesajele din chat de la membrii echipei - -Use old chat style -== Folosește stilul vechi de chat - -Chat font size -== Dimensiunea fontului în chat - -Chat width -== Lățimea chat-ului - -Messages -== Mesaje - -System message -== Mesaj de sistem - -Highlighted message -== Mesaj evidențiat - -Team message -== Mesaj de echipă - -Friend message -== Mesaj de prieten - -Normal message -== Mesaj normal - -Client message -== Mesaj client - -Preview -== Previzualizare - -Show clan above name plates -== Arată clanul deasupra etichetelor de nume - -Clan plates size -== Dimensiunea etichetelor de clan - -Show friend mark (♥) in name plates -== Arată semnul prietenilor (♥) pe etichetele de nume - -Show hook strength icon indicator -== Arată indicatorul de putere al cârligului - -Show hook strength number indicator -== Arată indicatorul numeric de putere al cârligului - -Show other players' key presses -== Arată tastele apăsate de alți jucători - -Show local player's key presses -== Arată tastele apăsate de jucătorul local - -Authed name color in scoreboard -== Culoarea numelui autentificat în tabela de scor - -Same clan color in scoreboard -== Culoarea comună a clanului în tabela de scor - -Hook collision line -== Linie de coliziune cârlig - -Show own player's hook collision line -== Arată linia de coliziune a cârligului propriu - -Always show own player's hook collision line -== Arată mereu linia de coliziune a cârligului propriu - -Show other players' hook collision lines -== Arată liniile de coliziune ale cârligelor altor jucători - -Always show other players' hook collision lines -== Arată mereu liniile de coliziune ale cârligelor altor jucători - -Width of your own hook collision line -== Lățimea liniei de coliziune a cârligului propriu - -Width of others' hook collision line -== Lățimea liniei de coliziune a cârligelor altor jucători - -Hook collision line opacity -== Opacitatea liniei de coliziune a cârligului - -Colors of the hook collision line, in case of a possible collision with: -== Culorile liniei de coliziune a cârligului, în cazul unei posibile coliziuni cu: - -Your movements are not taken into account when calculating the line colors -== Mișcările tale nu sunt luate în considerare la calcularea culorilor liniei - -Nothing hookable -== Nimic agățabil - -Something hookable -== Ceva agățabil - -A Tee -== Un Tee - -Preview 'Hook collisions' being pressed -== Previzualizare 'Coliziuni cârlig' în timpul apăsării - -Show kill messages -== Arată mesajele de ucidere - -Show finish messages -== Arată mesajele de finalizare - -Normal Color -== Culoare normală - -Highlight Color -== Culoare evidențiată - -Weapons -== Arme - -Rifle Laser Outline Color -== Culoarea conturului puștii - -Rifle Laser Inner Color -== Culoarea interioară a puștii - -Shotgun Laser Outline Color -== Culoarea conturului laserului puștii de vânătoare - -Shotgun Laser Inner Color -== Culoarea interioară a laserului puștii de vânătoare - -Entities -== Entități - -Door Laser Outline Color -== Culoarea conturului laserului ușii - -Door Laser Inner Color -== Culoarea interioară a laserului ușii - -Freeze Laser Outline Color -== Culoarea conturului laserului de îngheț - -Freeze Laser Inner Color -== Culoarea interioară a laserului de îngheț - -Set all to Rifle -== Setează toate pe Pușcă - -Save the best demo of each race -== Salvează cel mai bun demo al fiecărei curse - -Enable replays -== Activează reluările - -Default length -== Lungime implicită - -Enable ghost -== Activează fantoma - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Când treci linia de start, arată un Tee fantomă care reproduce mișcările celui mai bun timp al tău - -Show ghost -== Arată fantoma - -Opacity -== Opacitate - -Save ghost -== Salvează fantoma - -Only save improvements -== Salvează doar îmbunătățirile - -Gameplay -== Gameplay - -Overlay entities -== Suprapune entitățile - -Show text entities -== Arată entitățile text - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Ajustează opacitatea entităților aparținând altor echipe, cum ar fi Tee-urile și etichetele de nume - -Show others (own team only) -== Arată alții (doar echipa proprie) - -Show quads -== Arată quad-urile - -Quads are used for background decoration -== Quad-urile sunt utilizate pentru decorarea fundalului - -AntiPing -== AntiPing - -Tries to predict other entities to give a feel of low latency -== Încearcă să prezică alte entități pentru a oferi senzația de latență scăzută - -AntiPing: predict other players -== AntiPing: prezice alți jucători - -AntiPing: predict weapons -== AntiPing: prezice armele - -AntiPing: predict grenade paths -== AntiPing: prezice traiectoria grenadelor - -Background -== Fundal - -Regular background color -== Culoare de fundal obișnuită - -Entities background color -== Culoarea de fundal a entităților - -Use current map as background -== Folosește harta curentă ca fundal - -Show tiles layers from BG map -== Arată straturile de țigle din harta de fundal - -New random timeout code -== Cod nou de timeout aleatoriu - -Run on join -== Rulează la conectare - -Chat command (e.g. showall 1) -== Comandă chat (ex: showall 1) - -Unregister protocol and file extensions -== Deregistrează protocolul și extensiile fișierelor - -DDNet %s is available: -== DDNet %s este disponibil: - -Update now -== Actualizează acum - -Updating… -== Se actualizează… - -DDNet Client updated! -== Clientul DDNet a fost actualizat! - -No updates available -== Nu există actualizări disponibile - -Check now -== Verifică acum - -Basic -== Bazic - -Custom -== Personalizat - -Are you sure that you want to delete '%s'? -== Ești sigur că vrei să ștergi '%s'? - -Delete skin -== Șterge costumul - -Unable to delete skin -== Nu se poate șterge costumul - -Emoticons -== Emoticoane - -Particles -== Particule - -Extras -== Extra - -Loading assets -== Se încarcă resursele - -Assets directory -== Dosar resurse - -Open the directory to add custom assets -== Deschide dosarul pentru a adăuga resurse personalizate - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -Learn -== Învață - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ - -Tutorial -== Tutorial - -Can't find a Tutorial server -== Nu se poate găsi un server de Tutorial - -Website -== Website - -Stop server -== Oprește server - -Run server -== Rulează server - -Server executable not found, can't run server -== Executabilul serverului nu a fost găsit, nu se poate rula serverul - -[Start menu] -Play -== Joacă - -DDNet %s is out! -== DDNet %s a fost lansat! - -Downloading %s: -== Descarcă %s: - -Update failed! Check log… -== Actualizarea a eșuat! Verifică jurnalul… - -Loading race demo files -== Se încarcă fișierele demo de cursă - -Round %d/%d -== Runda %d/%d - -[Spectators] -%d others… -== %d alți spectatori… - -Super -== Super - -[Team and size] -%d\n(%d/%d) -== %d\n(%d/%d) - -Team %d (%d/%d) -== Echipa %d (%d/%d) - -Manual -== Manual - -Race -== Cursă - -Auto -== Automat - -Replay -== Repetă - -[skins] -Body -== Corp - -[skins] -Marking -== Marcaj - -[skins] -Decoration -== Decorație - -[skins] -Hands -== Mâini - -[skins] -Feet -== Picioare - -[skins] -Eyes -== Ochii - -Loading sound files -== Se încarcă fișierele audio - -Follow -== Urmărește - -Frags -== Frags - -Deaths -== Decese - -Suicides -== Sinucideri - -Ratio -== Rata - -Net -== Rețea - -FPM -== FPM - -Spree -== Serii de ucideri - -Best -== Cel mai bun - -Grabs -== Prinderi - -Aim -== Țintă - -Active: Fire -== Activ: Foc - -Active: Hook -== Activ: Cârlig - -1 new mention -== 1 mențiune nouă - -%d new mentions -== %d mențiuni noi - -9+ new mentions -== 9+ mențiuni noi - -Moved ingame -== Mutat în joc - -https://wiki.ddnet.org/wiki/Mapping -== https://wiki.ddnet.org/wiki/Mapping - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Loading background map -== - -[Spectating Camera Mode Icon] -AUTO -== - -Toggle auto camera -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Show client IDs in name plates -== - -Hook Strength -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== diff --git a/data/languages/russian.txt b/data/languages/russian.txt deleted file mode 100644 index 9e30492428..0000000000 --- a/data/languages/russian.txt +++ /dev/null @@ -1,2090 +0,0 @@ -##### authors ##### -#originally created by: -# kaddyd -#modified by: -# carzil 2011-04-05 19:19:06 -# RaZeR[RT] 2011-04-12 17:57:02 -# BotanEgg 2011-05-02 19:07:35 -# Bananbl4 2011-07-07 02:03:04 -# Arion WT 2011-07-07 09:39:05 -# Arion WT 2011-08-07 12:16:28 -# gerdoe 2020-07-01 22:04:21 -# gerdoe 2020-09-14 20:53:53 -# gerdoe 2020-09-17 22:49:22 -# Vy0x2 2021-06-08 15:48:25 -# Anime.pdf 2021-06-13 13:08:50 -# banan 2022-06-12 11:36:50 -# ban 2023-01-05 10:22:50 -# unban 2023-03-10 21:50:50 -# eblan 2023-08-07 14:27:00 -# kaban 2023-09-21 19:00:00 -# ByFox 2023-11-14 11:24:00 -# Sedonya 2024-06-20 03:18:10 -# WTF 2024-11-03 15:57:20 -# Риксед 2024-12-11 16:34:00 -##### /authors ##### - -##### translated strings ##### - -%ds left -== осталось %d сек - -%i minute left -== Осталась %i минута - -%i minutes left -== Осталось %i минут - -%i second left -== Осталась %i секунда - -%i seconds left -== Осталось %i секунд - -%s wins! -== %s победил! - -Abort -== Отмена - -Add -== Добавить - -Add Friend -== Добавить друга - -Address -== Адрес - -All -== Все - -Are you sure that you want to quit? -== Вы действительно желаете выйти? - -Automatically record demos -== Записывать демо - -Automatically take game over screenshot -== Делать снимок результатов игры - -Blue team -== Синие - -Blue team wins! -== Синие победили! - -Body -== Тело - -Call vote -== Голосование - -Change settings -== Изменить настройки - -Chat -== Чат - -Clan -== Клан - -Client -== Клиент - -Connecting to -== Подключение к - -Connection Problems… -== Проблемы со связью… - -Console -== Консоль - -Controls -== Управление - -Count players only -== Считать только игроков - -Current -== Текущий - -Custom colors -== Свои цвета - -Delete -== Удалить - -Delete demo -== Удалить демо - -Demofile: %s -== Демо: %s - -Demos -== Демо - -Disconnect -== Отключиться - -Disconnected -== Отключено - -Downloading map -== Скачивание карты - -Draw! -== Ничья! - -Dynamic Camera -== Динамическая камера - -Emoticon -== Эмоции - -Error -== Ошибка - -Error loading demo -== Ошибка при загрузке демо - -Favorite -== Избранный - -Favorites -== Избранные - -Feet -== Ноги - -Fire -== Стрелять - -Folder -== Папка - -Force vote -== Форсировать - -Free-View -== Свободный обзор - -Fullscreen -== Полноэкранный(настр.) - -Game -== Игра - -Game info -== Информация об игре - -Game over -== Игра окончена - -Game type -== Тип игры - -Game types: -== Типы игры: - -General -== Основное - -Graphics -== Графика - -Grenade -== Гранатомёт - -Hammer -== Молот - -Has people playing -== Не пустой сервер - -High Detail -== Высокая детализация - -Hook -== Крюк - -Invalid Demo -== Нерабочее демо - -Join blue -== За синих - -Join red -== За красных - -Jump -== Прыжок - -Kick player -== Выгнать игрока - -Language -== Язык - -MOTD -== MOTD - -Map -== Карта - -Move left -== Шаг влево - -Move player to spectators -== Сделать наблюдателем - -Move right -== Шаг вправо - -Movement -== Перемещение - -Mute when not active -== Глушить звуки, когда игра неактивна - -Name -== Имя - -Next weapon -== След. оружие - -Nickname -== Имя - -No -== Нет - -No password -== Без пароля - -No servers found -== Сервера не найдены - -No servers match your filter criteria -== Нет серверов, подходящих под ваш фильтр - -Ok -== ОК - -Parent Folder -== Родительский каталог - -Password -== Пароль - -Password incorrect -== Неверный пароль - -Ping -== Пинг - -Pistol -== Пистолет - -Play background music -== Включить фоновую музыку - -Player -== Игрок - -Player country: -== Страна игрока: - -Players -== Игроки - -Please balance teams! -== Сбалансируйте команды! - -Prev. weapon -== Пред. оружие - -Quit -== Выход - -Reason: -== Причина: - -Red team -== Красные - -Red team wins! -== Красные победили! - -Remote console -== Консоль сервера - -Remove -== Удалить - -Remove friend -== Удалить друга - -Rename demo -== Переименовать демо - -Reset filter -== Сбросить фильтры - -Score -== Счёт - -Score limit -== Лимит очков - -Scoreboard -== Табло - -Screenshot -== Снимок - -Server address: -== Адрес сервера: - -Server info -== Информация - -Server not full -== Сервер не заполнен - -Shotgun -== Дробовик - -Show chat -== Показывать чат - -Show friends only -== Только с друзьями - -Show ingame HUD -== Показывать внутриигровой HUD - -Show name plates -== Показывать имена игроков - -Sound -== Звук - -Sound error -== Ошибка звука - -Spectate -== Наблюдать - -Spectate next -== Наблюдать за след. - -Spectate previous -== Наблюдать за пред. - -Spectator mode -== Наблюдатель - -Spectators -== Наблюдатели - -Stop record -== Стоп - -Strict gametype filter -== Строгий фильтр р-мов - -Sudden Death -== Внезапная смерть - -Switch weapon on pickup -== Переключать оружие при подборе - -Switch weapon when out of ammo -== Переключать оружие без патронов - -Show only chat messages from friends -== Показывать только сообщения от друзей - -Show clan above name plates -== Показывать клан - -Automatically take statboard screenshot -== Делать снимок результатов - -Team -== Команда - -Team chat -== Командный чат - -The audio device couldn't be initialised. -== Аудио устройство не может быть инициализировано. - -The server is running a non-standard tuning on a pure game type. -== Сервер запущен с нестандартными настройками на стандартном типе игры. - -Time limit -== Лимит времени - -Time limit: %d min -== Лимит времени: %d - -Try again -== ОК - -Type -== Тип - -Unable to rename the demo -== Невозможно переименовать демо - -Use sounds -== Использовать звуки - -Use team colors for name plates -== Использовать командные цвета имён - -V-Sync -== V-Sync - -Version -== Версия - -Vote command: -== Команда голосования: - -Vote description: -== Описание голосования: - -Vote no -== Против - -Vote yes -== За - -Voting -== Голосование - -Warmup -== Разминка - -Weapon -== Оружие - -Yes -== Да - -You must restart the game for all settings to take effect. -== Перезапустите игру для применения изменений. - -Map sound volume -== Громк. музыки с карты - -Enable game sounds -== Звуки игры - -Enable gun sound -== Звуки оружия - -Enable server message sound -== Звуки серверных сообщений - -Enable regular chat sound -== Звуки обычных сообщений - -Enable team chat sound -== Звуки командных сообщений - -Enable highlighted chat sound -== Звуки выделенных сообщений - -Show kill messages -== Показывать сообщения о смерти - -Show score -== Показывать табло счета - -Show names in chat in team colors -== Выделять командный чат - -Show votes window after voting -== Показывать голосование после выбора - -Reset -== Сброс - -Search -== Поиск - -Ghost -== Тень - -Countries -== Страны - -Types -== Типы - -New name: -== Новое имя: - -Sat. -== Контр. - -Miscellaneous -== Дополнительно - -Internet -== Интернет - -Max demos -== Максимальное кол-во демо - -Join game -== Играть - -FSAA samples -== FSAA сэмплов - -Sound volume -== Громкость звука - -Max Screenshots -== Максимальное кол-во снимков - -Laser -== Лазер - -Hue -== Оттен. - -Record demo -== Записать демо - -Your skin -== Ваш скин - -Reset to defaults -== Сбросить настройки - -Lht. -== Ярк. - -UI Color -== Цвет интерфейса - -Alpha -== Прозр. - -LAN -== LAN - -Name plates size -== Размер имён - -Show ghost -== Показывать тень - -No updates available -== Нет доступных обновлений - -Show other players' hook collision lines -== Показывать коллизии крюка других игроков - -DDNet Client needs to be restarted to complete update! -== Перезапустите DDNet Client для завершения обновления! - -Please use a different filename -== Пожалуйста, используйте другое имя файла - -Show others -== Показ. других - -Game paused -== Пауза - -Team message -== Командное - -Automatically create statboard csv -== Записывать результаты в CSV - -Are you sure that you want to disconnect? -== Вы уверены, что хотите отключиться? - -Remove chat -== Удалить чат - -System message -== Системное - -Updating… -== Обновление… - -Messages -== Сообщения - -New random timeout code -== Сгенерировать новый тайм-аут код - -Loading DDNet Client -== Загрузка DDNet Client - -Normal message -== Обычное - -Connecting dummy -== Подключение дамми - -Update now -== Обновить сейчас - -Save ghost -== Сохранять тень - -DDNet Client updated! -== DDNet клиент обновлён! - -Highlighted message -== Выделенное - -Demo -== Демо - -Successfully saved the replay! -== Повтор сохранен! - -Replay feature is disabled! -== Функция повтора отключена! - -Server best: -== Рекорд сервера: - -Personal best: -== Ваш рекорд: - -Browser -== Браузер - -Reconnect in %d sec -== Переподключение через %d сек. - -Render demo -== Рендер - -Replace video -== Переместить - -File already exists, do you want to overwrite it? -== Файл уже существует, хотите ли Вы перезаписать его? - -Disconnect Dummy -== Отключить дамми - -Are you sure that you want to disconnect your dummy? -== Вы уверены, что хотите отключить вашего дамми? - -Welcome to DDNet -== Добро пожаловать в DDNet - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork - кооперативная онлайн-игра, где Вашей главной целью и целью вашей команды является достижение конца карты. Как новенький, Вы должны начать свой путь на Novice, на которых есть лёгкие карты. Также учитывайте пинг и выбирайте ближайший к вам сервер. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Перед посещением сервера рекомендуем изменить настройки на Ваш вкус. - -Please enter your nickname below. -== Пожалуйста, ниже укажите ваш псевдоним. - -Video name: -== Название: - -Show DDNet map finishes in server browser -== Показывать пройденные карты в браузере - -transmits your player name to info.ddnet.org -== передает ваш псевдоним на info.ddnet.org - -Exclude -== Исключить - -Filter connecting players -== Только подключившиеся - -Indicate map finish -== Показ. пройденные карты - -Unfinished map -== Только непройденные карты - -DDNet %s is out! -== Вышел DDNet %s! - -Downloading %s: -== Скачивание %s: - -Update failed! Check log… -== Не удалось обновиться! Подробности в логах… - -Restart -== Рестарт - -%.2f MiB -== %.2f МиБ - -%.2f KiB -== %.2f КиБ - -Length -== Длина - -Date -== Дата - -Fetch Info -== Показать - -Connect Dummy -== Подключить дамми - -Deactivate -== Выключить - -Activate -== Включить - -Save -== Сохранить - -Clan plates size -== Размер клана - -Refresh Rate -== Частота обн. - -Max CSVs -== Максимум CSV - -Vanilla skins only -== Только станд. скины - -Fat skins (DDFat) -== Толстые скины - -Skin prefix -== Префикс скина - -Hook collisions -== Коллизии крюка - -Pause -== Пауза - -Kill -== Респаун - -Zoom in -== Приблизить - -Zoom out -== Отдалить - -Default zoom -== Ст. масштаб - -Show all -== Показ. всех - -Toggle dyncam -== Смена дин. камеры - -Toggle dummy -== Переключение дамми - -Toggle ghost -== Переключить тень - -Dummy copy -== Повт. движений - -Hammerfly dummy -== Полёт с дамми - -Converse -== Личный чат - -Statboard -== Статистика - -Lock team -== Закрыть команду - -Show entities -== Показ. тайлы - -Show HUD -== Показ. HUD - -may cause delay -== создает задержку - -Screen -== Экран - -Use high DPI -== Использовать высокий DPI - -Enable long pain sound (used when shooting in freeze) -== Включить звук продолжительной боли (при стрельбе во фризе) - -HUD -== HUD - -DDNet -== DDNet - -Friend message -== Дружеское - -Save the best demo of each race -== Сохранять лучшее демо каждой карты - -Default length -== Станд. длина - -Enable replays -== Включить записи - -Gameplay -== Игровой процесс - -Overlay entities -== Наложение - -Size -== Разм. - -Show text entities -== Показ. текст - -Show others (own team only) -== Показ. только вашу команду - -Show quads -== Показ. квады - -AntiPing -== Антипинг - -AntiPing: predict other players -== Предсказывать положение игроков - -AntiPing: predict weapons -== Предсказывать оружия - -AntiPing: predict grenade paths -== Предсказывать траекторию гранат - -Show other players' key presses -== Показывать действия игроков - -Show tiles layers from BG map -== Показывать тайловые слои фона - -DDNet %s is available: -== Доступен DDNet %s: - -Check now -== Проверить - -Time -== Время - -Follow -== Следить - -Frags -== Убийства - -Deaths -== Смерти - -Suicides -== Респауны - -Ratio -== Соотношение - -Net -== Сальдо - -FPM -== У/мин - -Spree -== Серия - -Best -== Лучшее - -Grabs -== Захватов - -1 new mention -== 1 упоминание - -%d new mentions -== %d упоминаний - -9+ new mentions -== 9+ упоминаний - -Client message -== Клиентское - -Warning -== Предупреждение - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Используйте кнопку k, чтобы возродиться, q для паузы и наблюдения за остальными игроками. Ознакомьтесь с остальными биндами в настройках. - -Speed -== Скорость - -Markers -== Маркеры - -Skip the main menu -== Пропускать главное меню - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/wiki/Main_Page/ru - -Website -== Сайт - -Settings -== Настройки - -Stop server -== Остановить сервер - -Run server -== Запустить сервер - -Server executable not found, can't run server -== Файл сервера не найден, не удалось запустить сервер - -Editor -== Редактор - -News -== Новости - -%d of %d servers -== %d из %d серверов - -%d of %d server -== %d из %d сервера - -%d players -== %d игроков - -%d player -== %d игрок - -Download skins -== Подкачивать скины - -Learn -== Обучение - -[Start menu] -Play -== Играть - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Отладка включена. Нажмите Ctrl+Shift+D, чтобы выйти. - -Existing Player -== Существующий игрок - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Ваш псевдоним '%s' уже существует (%d поинтов). Вы уверены, что хотите использовать его? - -Checking for existing player with your name -== Проверка на наличие игрока с таким же именем - -Theme -== Тема - -Demos directory -== Папка с демо - -Smooth Dynamic Camera -== Плавная дин. камера - -Themes directory -== Папка с темами - -Skin Database -== База данных скинов - -Skins directory -== Папка со скинами - -Game sound volume -== Громкость игры - -Chat sound volume -== Громкость чата - -Background music volume -== Громкость фоновой музыки - -Assets -== Текстуры - -Use old chat style -== Использовать старый чат - -Use current map as background -== Использовать данную карту как фон - -Emoticons -== Эмоции - -Particles -== Частицы - -Assets directory -== Расп. текстур - -Manual -== Вруч. - -Race -== Забег - -Auto -== Авто - -Replay -== Запись - -Entities -== Наложение - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== Ширина текстуры %s не делится на %d или же его высота не делится на %d, что может повлиять на графику. - -Dummy -== Дамми - -Preview -== Превью - -Background -== Фон - -Chat command -== Чат-команда - -Discord -== Дискорд - -https://ddnet.org/discord -== https://ddnet.org/discord - -AFR -== AFR - -ASI -== ASI - -AUS -== AUS - -EUR -== EUR - -NA -== NA - -SA -== SA - -CHN -== CHN - -Getting server list from master server -== Получение списка серверов от мастер-сервера - -Leak IP -== Передавать IP - -Windowed -== Оконный - -Windowed borderless -== Оконный без рамки - -Desktop fullscreen -== Полноэкранный - -Are you sure that you want to disconnect and switch to a different server? -== Вы уверены, что хотите отключиться и перейти на другой сервер? - -Show local player's key presses -== Показывать нажатия клавиш игрока - -The format of texture %s is not RGBA which will cause visual bugs. -== Формат текстуры %s не соотвествует RGBA, что может повлечь артефакты. - -Join Tutorial Server -== Начать туториал - -Skip Tutorial -== Пропустить туториал - -Settings file -== Файл настроек - -Config directory -== Путь к настройкам - -Windowed fullscreen -== Оконный на весь экран - -Renderer -== Рендерер - -default -== станд. - -custom -== перс. - -auto -== авто - -Run on join -== Запускать при входе - -Chat command (e.g. showall 1) -== Чат-команда (напр. showall 1) - -Tutorial -== Туториал - -Can't find a Tutorial server -== Обучающий сервер не найден - -Position: -== Позиция - -Speed: -== Скорость - -Angle: -== Угол - -Trying to determine UDP connectivity… -== Попытка определить UDP соединение… - -UDP seems to be filtered. -== Похоже, что UDP фильтруется. - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== Похоже, что UDP и TCP IP отличаются. Попробуйте отключить VPN, прокси и ускорители сети. - -No answer from server yet. -== Сервер еще не ответил. - -Download community skins -== Вкл. скины сообщества - -Choose default eyes when joining a server -== Выберите стандартные глаза при подключении к серверу - -Enable controller -== Включить контроллер - -[Ingame controller mode] -Relative -== Относительный - -[Ingame controller mode] -Absolute -== Абсолютный - -Ingame controller mode -== Режим контроллера в игре - -Ingame controller sens. -== Чувств. в игре - -UI controller sens. -== Чувств. в меню - -Controller jitter tolerance -== Устойчивость к движению контроллера - -Status -== Состояние - -Aim bind -== Привязка оси - -Mouse -== Мышь - -Ingame mouse sens. -== Чувств. в игре - -UI mouse sens. -== Чувств. в меню - -Controller -== Контроллер - -Allows maps to render with more detail -== Позволяет более детализированную прорисовку карты - -Show dummy actions -== Показывать действия дамми - -Show player position -== Показывать позицию игрока - -Show player speed -== Показывать скорость игрока - -Show player target angle -== Показывать угол прицела игрока - -Show freeze bars -== Показывать индикатор фриза - -Opacity of freeze bars inside freeze -== Прозрачность индикатора фриза - -Normal Color -== Обычный цвет - -Highlight Color -== Цвет выделения - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Показывать тень, повторяющую лучшее прохождение, при пересечении стартовой линии - -Opacity -== Прозр. - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Регулирует прозрачность объектов другой команды, такие как Tee и имена. - -Quads are used for background decoration -== Квады используются для украшения фона - -Tries to predict other entities to give a feel of low latency -== Пытается предсказать другие объекты, чтобы придать ощущение низкой задержки - -Extras -== Доп. - -Super -== Супер - -Team %d -== Команда %d - -Preparing demo playback -== Подготовка воспроизведения демо - -Connected -== Подключено - -Loading map file from storage -== Загрузка файлов карты из памяти - -Initializing components -== Подготовка компонентов - -Initializing assets -== Подготовка ресурсов - -Initializing map logic -== Подготовка алгоритмов карты - -Sending initial client info -== Отправка начальных данных о клиенте - -Uploading map data to GPU -== Загрузка данных о карте в GPU - -Getting game info -== Получение игровых данных - -Requesting to join the game -== Запрашивается подключение к игре - -Loading menu images -== Загрузка изображений меню - -Loading demo files -== Загрузка файлов демо - -Loading ghost files -== Загрузка файлов тени - -Loading skin files -== Загрузка файлов скинов - -Appearance -== Отображение - -Name Plate -== Доп. игровая инф. - -Hook Collisions -== Крюк - -Show health, shields and ammo -== Показывать здоровье, щиты и патроны - -DDRace HUD -== DDRace HUD - -Show DDRace HUD -== Показывать DDRace HUD - -Show jumps indicator -== Показывать индикатор прыжка - -Hook collision line -== Линия коллизии крюка - -Hook collision line opacity -== Прозрачность линии - -Colors of the hook collision line, in case of a possible collision with: -== Цвет линии коллизии крюка если - -Your movements are not taken into account when calculating the line colors -== Ваше перемещение не учитывается при расчете цвета линии коллизии - -Nothing hookable -== Невозможно зацепиться - -Something hookable -== Можно зацепиться - -A Tee -== Задевает игрока - -Loading assets -== Загрузка ресурсов - -Loading race demo files -== Загрузка демо записей - -Loading sound files -== Загрузка звуковых файлов - -Why are you slowmo replaying to read this? -== Ну и зачем же ты читаешь это в слоу-мо? - -Play the current demo -== Включить демо - -Pause the current demo -== Поставить на паузу - -Stop the current demo -== Остановить демо - -Slow down the demo -== Замедлить демо - -Speed up the demo -== Ускорить демо - -Export cut as a separate demo -== Экспортировать отрезок отдельно - -Toggle keyboard shortcuts -== Включить горячие клавиши - -Weapons -== Оружия - -Rifle Laser Outline Color -== Цвет обводки лазера - -Rifle Laser Inner Color -== Цвет лазера - -Shotgun Laser Outline Color -== Цвет обводки лазера дробовика - -Shotgun Laser Inner Color -== Цвет лазера дробовика - -Door Laser Outline Color -== Цвет обводки двери - -Door Laser Inner Color -== Цвет двери - -Freeze Laser Outline Color -== Цвет обводки фриз лазера - -Freeze Laser Inner Color -== Цвет фриз лазера - -Menu opened. Press Esc key again to close menu. -== Открыто меню. Нажмите Esc, чтобы закрыть его - -Set all to Rifle -== Цвет всех как у лазера - -Cancel -== Отмена - -File '%s' already exists, do you want to overwrite it? -== Файл '%s' уже существует, хотите его перезаписать? - -Are you sure that you want to remove the player '%s' from your friends list? -== Вы уверены, что хотите удалить игрока '%s' из списка ваших друзей? - -Are you sure that you want to remove the clan '%s' from your friends list? -== Вы уверены, что хотите удалить клан '%s' из списка ваших друзей? - -Go back one tick -== Отмотать назад на один тик - -Go forward one tick -== Промотать вперед на один тик - -Go back one marker -== Вернуться назад на один маркер - -Go forward one marker -== Пройти вперед на один маркер - -Are you sure that you want to delete the demo '%s'? -== Вы уверены, что хотите удалить демо '%s'? - -Unable to delete the demo '%s' -== Невозможно удалить демо '%s' - -Reset controls -== Сброс настроек - -Are you sure that you want to reset the controls to their defaults? -== Вы уверены, что хотите сбросить игру до настроек по умолчанию? - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Ошибка во время инициализации. Попробуйте изменить gfx_backend на OpenGL или Vulkan в settings_ddnet.cfg в папке конфигурационных файлов и повторите попытку. - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== Нехватка памяти VRAM. Попробуйте удалить пользовательские ресурсы (скины, тайлы и т.д.), особенно те, которые имеют высокое разрешение. - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== Произошла ошибка во время выполнения команды записи. Попробуйте обновить драйверы видеокарты. - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== Команда рендеринга не выполнена. Попробуйте обновить драйверы видеокарты. - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== Отправка команд рендеринга не удалась. Попробуйте обновить драйверы видеокарты. - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== Не удалось выполнить подкачку кадровых буферов. Попробуйте обновить драйверы видеокарты. - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Неизвестная ошибка. Попробуйте изменить gfx_backend на OpenGL или Vulkan в settings_ddnet.cfg в папке config и повторите попытку. - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== Не удалось инициализировать заданный графический модуль, возврат к модулю по умолчанию. - -Open the directory that contains the demo files -== Открыть папку с демо записями - -Save power by lowering refresh rate (higher input latency) -== Режим экономии энергии - -Open the settings file -== Открытие файла настроек - -Open the directory that contains the configuration and user files -== Открыть папку конфигурационных файлов - -Open the directory to add custom themes -== Открыть папку пользовательских тем - -Open the directory to add custom skins -== Открыть папку пользовательских скинов - -No controller found. Plug in a controller. -== Контроллер не найден. Подключите контроллер. - -Unregister protocol and file extensions -== Отвязать протокол и расширения файлов - -Open the directory to add custom assets -== Открыть папку пользовательского контента - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== Не удалось инициализировать данный графический модуль, что, возможно, связано с тем, что вы не установили драйвер встроенной видеокарты. - -Could not save downloaded map. Try manually deleting this file: %s -== Не удалось сохранить загруженную карту. Попробуйте удалить этот файл вручную: %s - -Copy info -== Cкопировать данные - -Create a random skin -== Создать случайный скин - -Online clanmates (%d) -== Участники клана (%d) - -[friends (server browser)] -Offline (%d) -== Не в сети (%d) - -Click to select server. Double click to join your friend. -== Нажмите, чтобы выбрать сервер. Нажмите дважды, чтобы присоединиться. - -Click to remove this player from your friends list. -== Нажмите, чтобы удалить игрока из списка друзей. - -Click to remove this clan from your friends list. -== Нажмите, чтобы исключить клан из списка. - -Add Clan -== Добавить клан - -A demo with this name already exists -== Демо с таким именем уже существует - -No server selected -== Сервер не выбран - -Mark the beginning of a cut (right click to reset) -== Отметить начало отрезка (нажмите ПКМ, чтобы сбросить) - -Mark the end of a cut (right click to reset) -== Отметить конец отрезка (нажмите ПКМ, чтобы сбросить) - -Close the demo player -== Закрыть проигрыватель демо - -Export demo cut -== Экспортировать отрезок демо - -Cut interval -== Интервал отрезка - -Cut length -== Длина отрезка - -Axis -== Ось - -Graphics card -== Видеокарта - -Quitting. Please wait… -== Выход из игры. Пожалуйста, подождите… - -Restarting. Please wait… -== Перезапуск игры. Пожалуйста, подождите… - -Multi-View -== Мульти-просмотр - -Rename folder -== Переименовать папку - -A folder with this name already exists -== Папка с таким именем уже существует - -Unable to rename the folder -== Не удалось переименовать папку - -(paused) -== (приостановленно) - -All combined -== Все вместе - -Folder Link -== Ссылка на папку - -Are you sure that you want to delete the folder '%s'? -== Вы уверены, что хотите удалить папку '%s'? - -Delete folder -== Удалить папку - -Unable to delete the folder '%s'. Make sure it's empty first. -== Невозможно удалить папку '%s'. Сначала убедитесь, что она пуста. - -Moved ingame -== Перемещены в игре - -Go back the specified duration -== Отмотать назад на заданное время - -[Demo player duration] -%d min. -== %d мин. - -[Demo player duration] -%d sec. -== %d сек. - -Change the skip duration -== Изменить продолжительность шага - -Go forward the specified duration -== Промотать вперед на заданное время - -Render cut to video -== Рендеринг отрезка в видео - -Error playing demo -== Ошибка воспроизведения демо - -Some map images could not be loaded. Check the local console for details. -== Некоторые изображения на карте не удалось загрузить. Проверьте детали в локальной консоли. - -Some map sounds could not be loaded. Check the local console for details. -== Некоторые звуки на карте не удалось загрузить. Проверьте детали в локальной консоли. - -Loading menu themes -== Загрузка тем меню - -Render complete -== Рендеринг завершен - -Videos directory -== Папка с видео - -Video was saved to '%s' -== Видео было сохранено в '%s' - -No demo selected -== Демо не выбрано - -Created -== Создано - -Netversion -== Версия сети - -[Demo details] -map not included -== карта отсутствует - -Ghosts directory -== Папка теней - -Activate all -== Активировать все - -Deactivate all -== Отключить все - -Enable ghost -== Включить тень - -Only save improvements -== Сохранять только лучшее - -Regular background color -== Обычный цвет фона - -Entities background color -== Цвет фона при наложении - -Saving settings to '%s' failed -== Не получилось сохранить настройки в '%s' - -Searching -== Поиск - -Enter Username -== Введите имя - -Enter Password -== Введите пароль - -NOT CONNECTED -== НЕТ ПОДКЛЮЧЕНИЯ - -Match %d of %d -== %d совпадения из %d - -No results -== Не найдено - -Lines %d - %d (%s) -== Строки %d - %d (%s) - -Locked -== Зафиксированные - -Press a key… -== Нажмите любую кнопку… - -Are you sure that you want to restart? -== Вы уверены, что хотите начать заново? - -There's an unsaved map in the editor, you might want to save it. -== В редакторе есть несохраненная карта, возможно, вы хотите её сохранить. - -Continue anyway? -== Все равно продолжить? - -Communities -== Сообщества - -Info Messages -== Инф. Сообщения - -Show local time always -== Всегда показывать местное время - -Chat font size -== Размер шрифта в чате - -Chat width -== Ширина чата - -Authed name color in scoreboard -== Цвет администратора в табло - -Same clan color in scoreboard -== Цвет клана в табло - -Show finish messages -== Показывать сообщения о финишах - -Failed saving the replay! -== Не удалось сохранить запись! - -Error saving settings -== Ошибка при сохранении настроек - -Following -== Текущие - -Loading commands… -== Загрузка команд… - -Main menu -== Главное меню - -Server filter -== Фильтр серверов - -Friends -== Друзья - -Loading… -== Загрузка… - -Loading demo file from storage -== Загрузка демо из файлового хранилища - -%d/%d KiB (%.1f KiB/s) -== %d/%d КиБ (%.1f КиБ/с) - -No login required -== Без логина - -Player info change cooldown -== Кулдаун смены данных об игроке - -Tee -== Тии - -Always show chat -== Всегда показывать чат - -Show only chat messages from team members -== Показывать сообщения только от команды - -Show friend mark (♥) in name plates -== Показывать знак дружбы (♥) в имени друга - -Show hook strength icon indicator -== Показывать иконку индикатора силы крюка - -Show hook strength number indicator -== Показывать номер индикатора силы крюка - -Show own player's hook collision line -== Показывать линию крюка - -Always show own player's hook collision line -== Всегда показывать линию крюка - -Always show other players' hook collision lines -== Всегда показывать линию крюка других игроков - -[Spectating] -Following %s -== Наблюдение за %s - -Example of usage -== Пример использования - -Round %d/%d -== Раунд %d/%d - -[Spectators] -%d others… -== %d остальных… - -[Team and size] -%d\n(%d/%d) -== %d\n(%d/%d) - -Team %d (%d/%d) -== Команда %d (%d/%d) - -https://wiki.ddnet.org/wiki/Mapping -== https://wiki.ddnet.org/wiki/Mapping/ru - -Could not resolve connect address '%s'. See local console for details. -== Не удалось определить адрес подключения '%s'. Подробности в локальной консоли. - -Connect address error -== Ошибка адреса подключения - -Could not connect dummy -== Невозможно подключить дамми - -Dummy is not allowed on this server -== Дамми не разрешен на этом сервере - -Please wait… -== Пожалуйста, подождите… - -Show client IDs (scoreboard, chat, spectator) -== Показывать ID клиента (табло, чат, наблюдатель) - -Are you sure that you want to delete '%s'? -== Вы уверены, что хотите удалить '%s'? - -Delete skin -== Удалить скин - -Basic -== Пресеты - -Custom -== Кастомизация - -Unable to delete skin -== Невозможно удалить скин - -Some fonts could not be loaded. Check the local console for details. -== Некоторые шрифты не удалось загрузить. Проверьте детали в локальной консоли. - -Save skin -== Сохранить скин - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== Вы уверены, что хотите сохранить ваш скин? Если скин с этим именем уже существует, он будет заменен. - -Unable to save the skin -== Не удалось сохранить скин - -Unable to save the skin with a reserved name -== Не удалось сохранить скин с зарезервированным именем - -No local servers found (ports %d-%d) -== Локальные серверы не найдены (порты %d-%d) - -[Hertz] -Hz -== Гц - -[skins] -Body -== Тело - -[skins] -Marking -== Отметка - -[skins] -Decoration -== Украшение - -[skins] -Hands -== Руки - -[skins] -Feet -== Ноги - -[skins] -Eyes -== Глаза - -Online friends (%d) -== Друзья в сети (%d) - -Add friends by entering their name below or by clicking their name in the player list. -== Чтобы добавить друзей, впишите их имена ниже или нажимите по их имени в списке игроков. - -Add clanmates by entering their clan below and leaving the name blank. -== Чтобы добавить соклановцев, впишите их клан и оставьте имя пустым. - -Offline friends and clanmates will appear here. -== Друзья не в сети и соклановцы появятся здесь. - -Edit touch controls -== Изменить сенсорное управление - -Close -== Закрыть - -Save changes -== Сохранить изменение - -Error saving touch controls -== Ошибка при сохранении сенсорного управления - -Could not save touch controls to file. See local console for details. -== Не удалось сохранить сенсорное управление в файл. Просмотрите локальную консоль для подробностей. - -Unsaved changes -== Несохранённые изменения - -Discard changes -== Отменить изменения - -Are you sure that you want to discard the current changes to the touch controls? -== Вы уверены что хотите отменить изменения сенсорного управления? - -Are you sure that you want to reset the touch controls to default? -== Вы уверены, что хотите сбросить сенсорное управление - -Import from clipboard -== Импортировать из буфера обмена - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== Вы уверены, что хотите импортировать сенсорное управление из буфера обмена? Это перезапишет ваше действующее сенсорное управление. - -Export to clipboard -== Экспортировать в буфер обмена - -Direct touch input while ingame -== Сенсорный ввод напрямую пока вы находитесь в игре - -[Direct touch input] -Disabled -== Отменено - -[Direct touch input] -Active action -== Активное действие - -[Direct touch input] -Aim -== Прицеливаться - -[Direct touch input] -Fire -== Стрелять - -[Direct touch input] -Hook -== Крюк - -Direct touch input while spectating -== Сенсорный ввод напрямую пока вы в режиме наблюдателя - -Error loading touch controls -== Ошибка при загрузке сенсорного управления - -Could not load touch controls from file. See local console for details. -== Не удалось загрузить сенсорное управление из файла. Просмотрите локальную консоль для подробностей. - -Could not load default touch controls from file. See local console for details. -== Не удалось загрузить стандартное сенсорное управление из файла. Просмотрите локальную консоль для подробностей. - -Could not load touch controls from clipboard. See local console for details. -== Не удалось загрузить сенсорное управление из буфера обмена. Просмотрите локальную консоль для подробностей. - -Width of your own hook collision line -== Ширина вашей линии коллизий крюка - -Width of others' hook collision line -== Ширина чужих линий коллизий крюка - -Preview 'Hook collisions' being pressed -== Предпросмотр нажатия 'Коллизий крюка' - -Aim -== Прицеливаться - -Active: Fire -== Активно: Стрелять - -Active: Hook -== Активно: Крюк - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Loading background map -== - -[Spectating Camera Mode Icon] -AUTO -== - -Toggle auto camera -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Show client IDs in name plates -== - -Hook Strength -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== diff --git a/data/languages/serbian.txt b/data/languages/serbian.txt deleted file mode 100644 index cca046d3d1..0000000000 --- a/data/languages/serbian.txt +++ /dev/null @@ -1,2077 +0,0 @@ -##### authors ##### -#originally created by: -# DNR -#modified by: -# DNR 2011-07-15 00:36:32 -# EliteTee 2011-11-30 01:55:30 -# DNR 2011-11-30 01:57:52 -# Kingston 2020-08-18 10:57:34 -# Veljko Radovanovic (VekiPro) 2022-08-28 11:56:69 -##### /authors ##### - -##### translated strings ##### - -%ds left -== %ds je preostalo - -%i minute left -== još %i minut - -%i minutes left -== još %i minuta - -%i second left -== još %i sekund - -%i seconds left -== još samo %i sekundi - -%s wins! -== %s je pobedio! - -Abort -== Odustani - -Add -== Dodaj - -Add Friend -== Dodaj prijatelja - -Address -== Adresa - -All -== Svi - -Are you sure that you want to quit? -== Da li ste sigurni da želite da izađete? - -Automatically record demos -== Automatski snimi video - -Automatically take game over screenshot -== Automatski snimi ekran - -Blue team -== Plavi tim - -Blue team wins! -== Plavi tim je pobedio! - -Body -== Telo - -Call vote -== Glasanje - -Change settings -== Promeni Podešavanja - -Chat -== Dopisivanje - -Clan -== Klan - -Client -== Klijent - -Connecting to -== Povezujem se na - -Connection Problems… -== Problemi sa internetom - -Console -== Konzola - -Controls -== Kontrole - -Count players only -== Broj samo igrače - -Current -== Trenutno - -Custom colors -== Prilagođena boja - -Delete -== Izbriši - -Delete demo -== Obriši snimak - -Demofile: %s -== Snimak: %s - -Demos -== Snimci - -Disconnect -== Prekini vezu - -Disconnected -== Prekinuta veza - -Downloading map -== Preuzimam mapu - -Draw! -== Nerešeno! - -Dynamic Camera -== Dinamična kamera - -Emoticon -== Osećanja - -Error -== Greška - -Error loading demo -== Greška pri učitavanju snimka - -Favorite -== Omiljeno - -Favorites -== Omiljeni - -Feet -== Stopala - -Fire -== Pucaj - -Folder -== Datoteka - -Force vote -== Obavezno glasanje - -Free-View -== Slobodan pregled - -Fullscreen -== Preko celog ekrana - -Game -== Igra - -Game info -== O Igri - -Game over -== Igra je završena - -Game type -== Tip igre - -Game types: -== Tipovi igre: - -General -== Opšte - -Graphics -== Grafika - -Grenade -== Bazuka - -Hammer -== Čekić - -Has people playing -== Ima igrača - -High Detail -== Visoki detalji - -Hook -== Kuka - -Invalid Demo -== Neispravan snimak - -Join blue -== Izraj za plave - -Join red -== Izraj za crvene - -Jump -== Skok - -Kick player -== Izbaci igrača - -Language -== Jezik - -MOTD -== Vest dana - -Map -== Mapa - -Move left -== Pomeri se levo - -Move player to spectators -== Premesti igrača u razgledača - -Move right -== Pomeri se desno - -Movement -== Kretanje - -Mute when not active -== Isključi zvuk kada je neaktivan - -Name -== Ime - -Next weapon -== Sledeće oružije - -Nickname -== Nadimak - -No -== Ne - -No password -== Bez lozinke - -No servers found -== Nema pronađenih servera - -No servers match your filter criteria -== Nijedan server ne odgovara vašim filterima pretrage - -Ok -== U redu - -Parent Folder -== Prethodna datoteka - -Password -== Lozinka - -Password incorrect -== Pogrešna lozinka - -Ping -== Ping - -Pistol -== Pištolj - -Play background music -== Pozadinska muzika - -Player -== Igrač - -Player country: -== Država igrača - -Players -== Igrači - -Please balance teams! -== Uravnotežite timove! - -Prev. weapon -== Prethodno oružije - -Quit -== Izlaz - -Reason: -== Razlog: - -Red team -== Crveni tim - -Red team wins! -== Crveni tim je pobedio! - -Remote console -== Udaljena konzola - -Remove -== Obriši - -Remove friend -== Obriši prijatelja - -Rename demo -== Preimenuj snimak - -Reset filter -== Povrati filter - -Score -== Rezultat - -Score limit -== Najviše bodova - -Scoreboard -== Tabela rezultata - -Screenshot -== Snimak ekrana - -Server address: -== Adresa servera: - -Server info -== O serveru - -Server not full -== Server nije pun - -Settings -== Podešavanja - -Shotgun -== Sačmara - -Show chat -== Prikaži dopisivanje - -Show friends only -== Prikaži samo prijatelje - -Show ingame HUD -== Koristi HUD u igri - -Show name plates -== Prikaži pločice sa imenima - -Sound -== Zvuk - -Sound error -== Problem sa zvukom - -Spectate -== Razgledaj - -Spectate next -== Razgledaj sledećeg - -Spectate previous -== Razgledaj prošlog - -Spectator mode -== Mod razgledanja - -Spectators -== Razgledači - -Stop record -== Prekini snimanje - -Strict gametype filter -== Strogi filter tipa igre - -Sudden Death -== Iznenadna smrt - -Switch weapon on pickup -== Promeni oružije kad ga pokupiš - -Team -== Tim - -Team chat -== Timsko dopisivanje - -The audio device couldn't be initialised. -== Audio uređaj nije moguće pokrenuti - -The server is running a non-standard tuning on a pure game type. -== Server izvodi nestandardno podešavanje čistog tipa igre. - -Time limit -== Vremensko ograničenje - -Time limit: %d min -== Vremensko ograničenje: %d min. - -Try again -== Pokušaj ponovo - -Type -== Tip - -Unable to rename the demo -== Snimak nije moguće preimenovati - -Use sounds -== Koristi zvuk - -Use team colors for name plates -== Koristite timske boje za pločice sa imenima - -V-Sync -== V-Sync - -Version -== Verzija - -Vote command: -== Komanda za glasanje: - -Vote description: -== Opis glasanja: - -Vote no -== Protiv - -Vote yes -== Za - -Voting -== Glasanje - -Warmup -== Zagrevanje - -Weapon -== Oružje - -Yes -== Da - -You must restart the game for all settings to take effect. -== Morate ponovo pokrenuti igru da bi sva podešavanja bila primenjena - -##### needs translation ##### - -Demo -== Snimak - -Editor -== Uređivač - -Game paused -== Igra je pauzirana - -Laser -== Laser - -Length -== Dužina - -Reset -== Resetuj - -Save -== Sačuvaj - -Screen -== Ekran - -Show only chat messages from friends -== Prikaži samo poruke sa dopisivanja od prijatelja - -Size -== Veličina - -New name: -== Novo ime: - -Sat. -== Zasić. - -Miscellaneous -== Razno - -Internet -== Internet - -Max demos -== Maksimalan broj snimaka - -News -== Novosti - -Join game -== Uđi na server - -FSAA samples -== FSAA - -Sound volume -== Jačina zvuka - -Max Screenshots -== Maksimalan broj snimaka ekrana - -Hue -== Nijansa - -Record demo -== Snimi - -Your skin -== Vaša tema - -Reset to defaults -== Resetuj - -Lht. -== Svetl. - -UI Color -== Boja menija - -Alpha -== Provid. - -LAN -== Lok. mreža - -Name plates size -== Veličina pločice sa imenom - -Successfully saved the replay! -== Snimak je uspešno sačuvan! - -Replay feature is disabled! -== Funkcija ponavljanja je onemogućena! - -Warning -== Upozorenje - -Server best: -== Najbolji rekord na serveru: - -Personal best: -== Moj Najbolji rekord: - -Browser -== Pregledač - -Ghost -== Duh - -Loading DDNet Client -== Učitavam DDNet klijent - -Reconnect in %d sec -== Ponovo povezivanje za %d sekundi - -Render demo -== Renderuj demo - -Replace video -== Zameni video - -File already exists, do you want to overwrite it? -== Fajl već postoji, hoćete li da ga zamenite? - -Are you sure that you want to disconnect? -== Da li ste sigurni da želite da prekinete vezu? - -Disconnect Dummy -== Prekini kopiju - -Are you sure that you want to disconnect your dummy? -== Da li ste sigurni da želite da prekinete kopiju? - -Welcome to DDNet -== Dobro došli u DDNet - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork je kooperativna onlajn igra u kojoj je cilj da vi i vaša grupa teeova dođete do cilja na mapi. Kao novajlija trebali biste započeti na Novice serverima, na kojima se nalaze najjednostavnije mape. Razmislite o pingu da biste izabrali server koji vam je blizu. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Koristite taster k za ubijanje (ponovno pokretanje), q za pauziranje i gledanje drugih igrača. Pogledajte podešavanja za ostale prečice tastera. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Preporučuje se da proverite podešavanja kako biste ih prilagodili pre nego što se pridružite serveru. - -Please enter your nickname below. -== Molimo vas napišite vaš nadimak ispod. - -Speed -== Brzina - -Video name: -== Naziv videa: - -Show DDNet map finishes in server browser -== Prikaži završetka DDNet mape u pregledaču servera - -Theme -== Tema - -Search -== Pretraga - -Exclude -== Preskoči - -%d of %d servers -== %d od %d servera - -%d of %d server -== %d od %d servera - -%d players -== %d igrača - -%d player -== %d igrač - -Filter connecting players -== Filtriraj povezane igrače - -Indicate map finish -== Označi kao završeno - -Unfinished map -== Nedovršena mapa - -Countries -== Zemlje - -Types -== Tipovi - -Remove chat -== Ukloni dopisivanje - -%.2f MiB -== %.2f MiB - -%.2f KiB -== %.2f KiB - -Markers -== Markeri - -Date -== Datum - -Fetch Info -== Dohvati informacije - -Demos directory -== Video direktorijum - -Connecting dummy -== Povezujem kopiju - -Connect Dummy -== Poveži kopiju - -Kill -== Ubij se - -Pause -== Pauza - -Deactivate -== Deaktiviraj - -Activate -== Aktiviraj - -Switch weapon when out of ammo -== Zameni oružje kad nema municije - -Show clan above name plates -== Prikaži klan iznad pločice sa imenima - -Clan plates size -== Veličina pločice sa klanom - -Skip the main menu -== Preskoči glavni meni - -Refresh Rate -== Osvežavanje - -Themes directory -== Tema direktorijuma - -Automatically take statboard screenshot -== Automatski napravi snimak ekrana statistike - -Automatically create statboard csv -== Automatski napravi statistike csv - -Max CSVs -== Najviše csv-ova - -Download skins -== Preuzimaj teme - -Vanilla skins only -== Klasične teme - -Fat skins (DDFat) -== Debele teme - -Skin prefix -== Perfiks teme - -Skin Database -== Baza temi - -Skins directory -== Direktorijum tema - -Hook collisions -== Dodir kuke - -Zoom in -== Uvećaj - -Zoom out -== Umanji - -Default zoom -== Klasična veličina - -Show others -== Prikaži ostale - -Show all -== Prikaži sve - -Toggle dyncam -== Dinamična kamera - -Toggle dummy -== Prebaci na kopiju - -Toggle ghost -== Prebaci na duha - -Dummy copy -== Zajed. kret. kopije - -Hammerfly dummy -== Let. čekićem kop. - -Converse -== Svi dopisivanje - -Statboard -== Statistike - -Lock team -== Zaključaj tim - -Show entities -== Prikaži entities - -Show HUD -== Prikaži HUD - -may cause delay -== može prouzrokovati kašnjenje - -Use high DPI -== Koristi visoki DPI - -Enable game sounds -== Koristi zvukove igre - -Enable gun sound -== Omogući zvuk pucanja - -Enable long pain sound (used when shooting in freeze) -== Omogući dug zvuk bola (koristi se kada se puca u smrzavanju) - -Enable server message sound -== Omogući zvuk poruke servera - -Enable regular chat sound -== Omogući uobičajen zvuk dopisivanja - -Enable team chat sound -== Omogući timski zvuk dopisivanja - -Enable highlighted chat sound -== Omogući istaknuti zvuk dopisivanja - -Map sound volume -== Jačina zvuka na mapi - -HUD -== HUD - -DDNet -== DDNet - -Assets -== Sredstva - -DDNet Client needs to be restarted to complete update! -== Potrebno je ponovo pokrenuti DDNet klijent da biste dovršili ažuriranje! - -Show score -== Prikaži bodove - -Show names in chat in team colors -== Prikažite imena u dopisivanju u bojama tima - -Show kill messages -== Prikaži dopisivanje smrti - -Show votes window after voting -== Prikaži statistiku glasova nakon glasanja - -Messages -== Poruke - -System message -== Sistemska poruka - -Highlighted message -== Istaknuta poruka - -Team message -== Timska poruka - -Friend message -== Poruka prijatelja - -Normal message -== Klasična poruka - -Client message -== Poruka klijenta - -Save the best demo of each race -== Sačuvajte najbolji snimak svake trke - -Default length -== Podrazumevana dužina - -Enable replays -== Omogući ponovljene reprodukcije - -Show ghost -== Prikaži duha - -Save ghost -== Sačivaj duha - -Gameplay -== Igra - -Overlay entities -== Prekrivajući entities - -Show text entities -== Prikaži tekstualne entities - -Show others (own team only) -== Prikaži ostale (samo svoj tim) - -Show quads -== Prikaži quads - -AntiPing -== AntiPing - -AntiPing: predict other players -== AntiPing: predviđanje drugih igrača - -AntiPing: predict weapons -== AntiPing: predviđanje oružija - -AntiPing: predict grenade paths -== AntiPing: predviđanje putanje granate - -Show other players' hook collision lines -== Prikaži liniju sudara kuke drugih igrača - -Show other players' key presses -== Prikaži pritiske tastera drugih igrača - -Show tiles layers from BG map -== Prikaži slojeve pločica sa BG mape - -DDNet %s is available: -== DDNet %s je dostupan: - -Update now -== Unapredi sada - -Updating… -== Unapređujem… - -DDNet Client updated! -== DDNet klijent je unapređen! - -No updates available -== Nema dostupnih unapređenja - -Check now -== Proveri sada - -New random timeout code -== Novi slučajni kod isteka vremena - -Entities -== Текстуре - -Emoticons -== Ikonice osećanja - -Particles -== Čestice - -Assets directory -== Direktorijum sredstva - -Learn -== Uputstvo - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ - -Website -== Veb sajt - -Stop server -== Zaustavi server - -Run server -== Pokreni server - -Server executable not found, can't run server -== Izvršna datoteka servera nije pronađena, ne može se pokrenuti server - -[Start menu] -Play -== Igraj - -DDNet %s is out! -== DDNet %s je izašao! - -Downloading %s: -== Preuzimanje %s: - -Update failed! Check log… -== Ažuriranje nije uspelo! Sačekajte log… - -Restart -== Ponovo pokreni - -Time -== Vreme - -Follow -== Prati - -Frags -== Geleri - -Deaths -== Smrti - -Suicides -== Samoubitstva - -Ratio -== Odnos - -Net -== Mreža - -FPM -== FPM - -Spree -== Zaglupi - -Best -== Najbolji - -Grabs -== Hvataljke - -1 new mention -== 1 novo pominjanje - -%d new mentions -== %d novih pominjanja - -9+ new mentions -== 9+ novih pominjanja - -Manual -== Uputstvo - -Race -== Trka - -Auto -== Auto - -Replay -== Pomnovi - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== Širina teksture %s nije deljiva sa %d, ili visina nije deljiva sa %d, što će prouzrokovati vidljive greške. - -The format of texture %s is not RGBA which will cause visual bugs. -== Formate teksture %s nije C.Z.P.P.(RGBA) što će prouzrokovati vidljive greške - -Preparing demo playback -== Priprema se reprodukcija demoa - -Connected -== Povezano - -Loading map file from storage -== Učitavanje mape iz memorije - -Why are you slowmo replaying to read this? -== Zašto polako ponavljaš da bi ovo pročitao? - -Initializing assets -== Učitavam sliku - -Initializing map logic -== Učitavam logiku mape - -Sending initial client info -== Slanje učitane informacije klijenta - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Debug mod je uključen. Pritisnite Ctrl+Shift+D da ga isključite - -Position: -== Položaj: - -Speed: -== Brzina: - -Angle: -== Ugao: - -Uploading map data to GPU -== Slanje podataka mape G.J.O.~u (GPU) - -Trying to determine UDP connectivity… -== Pokušavam da odredim K.D.P.(UDP) povezanost - -UDP seems to be filtered. -== Izgleda da je K.D.P.(UDP) filtriran - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== Čini se da su K.D.P.(UDP) i TCP IP adresa različite. Pokušajte da onemogućite VPN, proksi ili mrežne akceleratore. - -No answer from server yet. -== Server još uvek ne odgovara - -Getting game info -== Dobijam info. igre - -Requesting to join the game -== Zahteva se ulazak u igru - -Existing Player -== Postojeći igrač - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Ime: '%s' se već koristi sa %d poena. Dali idalje želite da ga koristite? - -Checking for existing player with your name -== Proveravamo dali postoji igrač sa vašim imenom - -Are you sure that you want to disconnect and switch to a different server? -== Dali ste sigurni da želite da prekinete vezu? - -Join Tutorial Server -== Uđi na početnički server - -Skip Tutorial -== Preskoči uvod - -Loading menu images -== Učitavanje menu slika - -AFR -== AFR. - -ASI -== AZI. - -AUS -== AUS. - -EUR -== EVR. - -NA -== S.A. - -SA -== J.A. - -CHN -== KIN. - -Getting server list from master server -== Dobijam listu servera sa master servera - -Leak IP -== Provali adresu - -Loading demo files -== Učitavanje demoa - -Loading ghost files -== Učitavanje duhova - -Smooth Dynamic Camera -== Glatka Dinamična Kamera - -Settings file -== Fajl Podešavanja - -Config directory -== Direktorijum konfiguraciji - -Download community skins -== Preuzmi ostale teme - -Choose default eyes when joining a server -== Izberi uobičajene oči kad uđeš u server - -Loading skin files -== Učitavam fajlove tema - -Chat command -== k.jednostav.tekst.komuni.sistema - -Enable controller -== Uključi kontroler - -[Ingame controller mode] -Relative -== Relativno - -[Ingame controller mode] -Absolute -== Apsolutno - -Ingame controller mode -== Mod kontrolera u igri - -Ingame controller sens. -== Brizina kontrolera u igri - -UI controller sens. -== Brzina kontrolera u meniu - -Controller jitter tolerance -== Tolerancija kontrolera - -Status -== Status - -Aim bind -== Nišan - -Mouse -== Miš - -Ingame mouse sens. -== Brzina u igri - -UI mouse sens. -== Brzina u meniu - -Controller -== Kontroler - -Dummy -== Lutka - -Windowed -== U prozoru - -Windowed borderless -== U prozoru bez menia - -Windowed fullscreen -== U prozoru preko celog ekrana - -Desktop fullscreen -== Sistemski preko celog ekrana - -Allows maps to render with more detail -== Renderuj mapu sa više detalja - -Renderer -== Renderer - -default -== bazično - -custom -== svoje - -auto -== auto - -Game sound volume -== Igrina jačina zvuka - -Chat sound volume -== Jačina zvuka dopisivanja - -Background music volume -== Pozadinska jačina zvuka - -Appearance -== Izgled - -Name Plate -== Pločica sa imenom - -Hook Collisions -== Dodir kuke - -Show health, shields and ammo -== Prikaži živote, štitove i metkove - -DDRace HUD -== DDRace Prikaz - -Show DDRace HUD -== Prikaži DDRace Prikaz - -Show jumps indicator -== Prikaži indikator skakanja - -Show dummy actions -== Prikaži akcije lutke - -Show player position -== Prikaži pozicije igrača - -Show player speed -== Prikaži brzinu igrača - -Show player target angle -== Prikaži ciljni ugao igrača - -Show freeze bars -== Prikaži freeze bars - -Opacity of freeze bars inside freeze -== Providnost freeze bars u zaleđenom delu - -Use old chat style -== Koristi stari stil dopisivanja - -Preview -== Pregled - -Show local player's key presses -== Prikaži svoje akcije - -Hook collision line -== Dodir kuke - -Hook collision line opacity -== Providnost linije za dodir kuke - -Colors of the hook collision line, in case of a possible collision with: -== Boje linije za dodir kuke,u slučaju da možeš da se zakačiš: - -Your movements are not taken into account when calculating the line colors -== Vaši pokreti se ne uzimaju u obzir pri izračunavanju boja linija - -Nothing hookable -== Ništa zakačivo - -Something hookable -== Nešto zakačivo - -A Tee -== Igrač - -Normal Color -== Normalna boja - -Highlight Color -== Istaknuta Boja - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Kada kreneš da se trkaš, prikaži tvog najbržeg duha - -Opacity -== Providnost - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Podesite neprozirnost entiteta koji pripadaju drugim timovima, kao što su majice i natpisne pločice - -Quads are used for background decoration -== Quads su korišćeni za dekoraciju pozadine - -Tries to predict other entities to give a feel of low latency -== Pokušaj da predvidiš ostale objekte da se oseća brže - -Background -== Pozadina - -Use current map as background -== Koristi ovu mapu kao pozadinu - -Run on join -== Uradi kada uđeš - -Chat command (e.g. showall 1) -== Komanda dopisivanja (npr. /cmdlist) - -Extras -== Dodatno - -Loading assets -== Učitavanje sredstava - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -Tutorial -== Uvod - -Can't find a Tutorial server -== Nemožemo pronaći uvodni server - -Loading race demo files -== Učitavam trkačke demo fajlove - -Super -== Super - -Team %d -== Tim %d - -Loading sound files -== Učitavam zvučne fajlove - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Неуспешно за време иницијализације. Покушајте променити gfx_backend у OpenGL или Vulkan у settings_ddnet.cfg у директоријуму конфигурације и покушајте поново. - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== Недостаток ВРАМ-а. Покушајте уклонити прилагођене ресурсе (скинове, објекте итд.), особито оне са високом резолуцијом. - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== Дошло је до грешке при записивању команде. Покушајте ажурирати драјвере за вашу графичку картицу. - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== Извршена је грешка рендеринг команде. Покушајте ажурирати драјвере за вашу графичку картицу. - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== Неуспешно слање рендерних команди. Покушајте ажурирати драјвере за вашу графичку картицу. - -Could not save downloaded map. Try manually deleting this file: %s -== Није могуће сачувати преузету мапу. Покушајте ручно обрисати овај фајл: %s. - -Initializing components -== Иницијализација компоненти - -Quitting. Please wait… -== Излазим. Молим вас да почекате… - -Restarting. Please wait… -== Поновно покрећем се. Молим вас да почекате… - -Multi-View -== Мулти-поглед - -Rename folder -== Преименујте фасциклу - -A demo with this name already exists -== Демо са овим именом већ постоји. - -A folder with this name already exists -== Фасцикла са овим именом већ постоји. - -Unable to rename the folder -== Није могуће преименовати фасциклу. - -File '%s' already exists, do you want to overwrite it? -== Датотека '%s' већ постоји, желите ли да је препишете? - -(paused) -== (паузирано) - -transmits your player name to info.ddnet.org -== преноси ваше играчко име на info.ddnet.org - -Copy info -== Копирај информације - -No server selected -== Није изабран сервер - -Online clanmates (%d) -== Чланови клана на мрежи (%d) - -[friends (server browser)] -Offline (%d) -== Изван мреже (%d) - -Click to select server. Double click to join your friend. -== Кликните да бисте изабрали сервер. Дупли клик за придруживање пријатељу. - -Click to remove this player from your friends list. -== Кликните да бисте уклонили овог играча са листе пријатеља. - -Click to remove this clan from your friends list. -== Кликните да бисте уклонили овај клан са листе пријатеља. - -Are you sure that you want to remove the player '%s' from your friends list? -== Да ли сте сигурни да желите да уклоните играча '%s' са листе пријатеља? - -Are you sure that you want to remove the clan '%s' from your friends list? -== Да ли сте сигурни да желите да уклоните клан '%s' са листе пријатеља? - -Add Clan -== Додај клан - -Play the current demo -== Пусти тренутни демо запис - -Pause the current demo -== Паузирај тренутни демо запис - -Stop the current demo -== Заустави тренутни демо запис - -Go back one tick -== Иди назад један корак - -Go forward one tick -== Иди напред један корак - -Slow down the demo -== Успори демо запис - -Speed up the demo -== Убрзај демо запис - -Mark the beginning of a cut (right click to reset) -== Обележи почетак сечења (десни клик за ресетовање) - -Mark the end of a cut (right click to reset) -== Обележи крај сечења (десни клик за ресетовање) - -Export cut as a separate demo -== Извоз сечења као засебног демо записа - -Go back one marker -== Иди назад један маркер - -Go forward one marker -== Иди напред један маркер - -Close the demo player -== Затвори репродуктор демо записа - -Toggle keyboard shortcuts -== Пребациванје тастатурних пречица - -Export demo cut -== Извоз демо сечења - -Cut interval -== Интервал сечења - -Cut length -== Дужина сечења - -All combined -== Све комбиновано - -Folder Link -== Веза до фасцикле - -Open the directory that contains the demo files -== Отвори директоријум који садржи демо фајлове - -Are you sure that you want to delete the folder '%s'? -== Да ли сте сигурни да желите да обришете фасциклу '%s'? - -Are you sure that you want to delete the demo '%s'? -== Да ли сте сигурни да желите да обришете демо запис '%s'? - -Delete folder -== Обриши фасциклу - -Unable to delete the demo '%s' -== Није могуће обрисати демо запис '%s' - -Unable to delete the folder '%s'. Make sure it's empty first. -== Није могуће обрисати фасциклу '%s'. Проверите прво да ли је празна. - -Menu opened. Press Esc key again to close menu. -== Мени је отворен. Поново притисните тастер Esc да бисте затворили мени. - -Save power by lowering refresh rate (higher input latency) -== Уштедите струју смањивањем стопе освежавања (већа улазна латенција) - -Open the settings file -== Отворите датотеку са подешавањима - -Open the directory that contains the configuration and user files -== Отворите директоријум који садржи конфигурационе и корисничке датотеке. - -Open the directory to add custom themes -== Отворите директоријум за додавање прилагођених тема. - -Create a random skin -== Направите насумичан скин. - -Open the directory to add custom skins -== Отворите директоријум за додавање прилагођених скинова. - -No controller found. Plug in a controller. -== Контролер није пронађен. Прикључите контролер. - -Axis -== Оса - -Reset controls -== Ресетујте контроле - -Are you sure that you want to reset the controls to their defaults? -== Да ли сте сигурни да желите вратити контроле на њихове подразумеване вредности? - -Cancel -== Откажи - -Graphics card -== Графичка картица - -Weapons -== Оружје - -Rifle Laser Outline Color -== Боја контуре ласера за пушку - -Rifle Laser Inner Color -== Боја унутрашњости ласера за пушку - -Shotgun Laser Outline Color -== Боја контуре ласера за пушку са једним цеветом - -Shotgun Laser Inner Color -== Боја унутрашњости ласера за пушку са једним цеветом - -Door Laser Outline Color -== Боја контуре ласера за врата - -Door Laser Inner Color -== Боја унутрашњости ласера за врата - -Freeze Laser Outline Color -== Боја ободова замрзавајућег ласера - -Freeze Laser Inner Color -== Боја унутрашњости замрзавајућег ласера - -Set all to Rifle -== Постави све на пушку - -Unregister protocol and file extensions -== Отказивање протокола и проширења датотека - -Open the directory to add custom assets -== Отворите директоријум за додавање прилагођених ресурса - -Moved ingame -== Померено у игри - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not connect dummy -== - -Error playing demo -== - -Failed saving the replay! -== - -Saving settings to '%s' failed -== - -Error saving settings -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Loading demo file from storage -== - -Some fonts could not be loaded. Check the local console for details. -== - -Loading background map -== - -Searching -== - -Enter Username -== - -Enter Password -== - -NOT CONNECTED -== - -Match %d of %d -== - -No results -== - -Lines %d - %d (%s) -== - -Locked -== - -Following -== - -Loading commands… -== - -[Spectating] -Following %s -== - -[Spectating Camera Mode Icon] -AUTO -== - -Some map images could not be loaded. Check the local console for details. -== - -Some map sounds could not be loaded. Check the local console for details. -== - -Loading menu themes -== - -Press a key… -== - -Main menu -== - -Render complete -== - -Are you sure that you want to restart? -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -There's an unsaved map in the editor, you might want to save it. -== - -Continue anyway? -== - -Videos directory -== - -Video was saved to '%s' -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -%d/%d KiB (%.1f KiB/s) -== - -No local servers found (ports %d-%d) -== - -Example of usage -== - -No login required -== - -Communities -== - -Online friends (%d) -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Server filter -== - -Friends -== - -Go back the specified duration -== - -[Demo player duration] -%d min. -== - -[Demo player duration] -%d sec. -== - -Change the skip duration -== - -Go forward the specified duration -== - -Toggle auto camera -== - -Render cut to video -== - -Please use a different filename -== - -No demo selected -== - -Created -== - -Netversion -== - -[Demo details] -map not included -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Loading… -== - -Ghosts directory -== - -Activate all -== - -Deactivate all -== - -[Hertz] -Hz -== - -Player info change cooldown -== - -Tee -== - -Info Messages -== - -Show local time always -== - -Authed name color in scoreboard -== - -Same clan color in scoreboard -== - -Show client IDs (scoreboard, chat, spectator) -== - -Always show chat -== - -Show only chat messages from team members -== - -Chat font size -== - -Chat width -== - -Show friend mark (♥) in name plates -== - -Show client IDs in name plates -== - -Hook Strength -== - -Show hook strength icon indicator -== - -Show hook strength number indicator -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Show own player's hook collision line -== - -Always show own player's hook collision line -== - -Always show other players' hook collision lines -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Preview 'Hook collisions' being pressed -== - -Show finish messages -== - -Enable ghost -== - -Only save improvements -== - -Regular background color -== - -Entities background color -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Round %d/%d -== - -[Spectators] -%d others… -== - -[Team and size] -%d\n(%d/%d) -== - -Team %d (%d/%d) -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/serbian_cyrillic.txt b/data/languages/serbian_cyrillic.txt deleted file mode 100644 index 17758eac4b..0000000000 --- a/data/languages/serbian_cyrillic.txt +++ /dev/null @@ -1,2073 +0,0 @@ -##### authors ##### -#originally created by: -# Veljko Radovanovic (VekiPro) 2020-10-02 18:05:00 -#modified by: -# Veljko Radovanovic (VekiPro) 2022-08-28 11:56:69 -##### /authors ##### - -##### translated strings ##### - -%ds left -== %ds је преостало - -%i minute left -== још %i минут - -%i minutes left -== још %i минута - -%i second left -== још %i секунд - -%i seconds left -== још само %i секунди - -%s wins! -== %s је победио! - -Abort -== Одустани - -Add -== Додај - -Add Friend -== Додај пријатеља - -Address -== Адреса - -All -== Сви - -Are you sure that you want to quit? -== Да ли сте сигурни да желите да изађете? - -Automatically record demos -== Аутоматски сними видео - -Automatically take game over screenshot -== Аутоматски сними екран - -Blue team -== Плави тим - -Blue team wins! -== Плави тим је победио! - -Body -== Тело - -Call vote -== Гласање - -Change settings -== Промени Подешавања - -Chat -== Дописивање - -Clan -== Клан - -Client -== Клијент - -Connecting to -== Повезујем се на - -Connection Problems… -== Проблеми са интернетом - -Console -== Конзола - -Controls -== Контроле - -Count players only -== Број само играче - -Current -== Тренутно - -Custom colors -== Прилагођена боја - -Delete -== Избриши - -Delete demo -== Обриши снимак - -Demofile: %s -== Снимак: %s - -Demos -== Снимци - -Disconnect -== Прекини везу - -Disconnected -== Прекинута веза - -Downloading map -== Преузимам мапу - -Draw! -== Нерешено! - -Dynamic Camera -== Динамична камера - -Emoticon -== Осећања - -Error -== Грешка - -Error loading demo -== Грешка при учитавању снимка - -Favorite -== Омиљено - -Favorites -== Омиљени - -Feet -== Стопала - -Fire -== Пуцај - -Folder -== Датотека - -Force vote -== Обавезно гласање - -Free-View -== Слободан преглед - -Fullscreen -== Преко целог екрана - -Game -== Игра - -Game info -== О Игри - -Game over -== Игра је завршена - -Game type -== Тип игре - -Game types: -== Типови игре: - -General -== Опште - -Graphics -== Графика - -Grenade -== Базука - -Hammer -== Чекић - -Has people playing -== Има играча - -High Detail -== Високи детаљи - -Hook -== Кука - -Invalid Demo -== Неисправан снимак - -Join blue -== Израј за плаве - -Join red -== Израј за црвене - -Jump -== Скок - -Kick player -== Избаци играча - -Language -== Језик - -MOTD -== Вест дана - -Map -== Мапа - -Move left -== Помери се лево - -Move player to spectators -== Премести играча у разгледача - -Move right -== Помери се десно - -Movement -== Кретање - -Mute when not active -== Искључи звук када је неактиван - -Name -== Име - -Next weapon -== Следеће оружије - -Nickname -== Надимак - -No -== Не - -No password -== Без лозинке - -No servers found -== Нема пронађених сервера - -No servers match your filter criteria -== Ниједан сервер не одговара вашим филтерима претраге - -Ok -== У реду - -Parent Folder -== Претходна датотека - -Password -== Лозинка - -Password incorrect -== Погрешна лозинка - -Ping -== Пинг - -Pistol -== Пиштољ - -Play background music -== Позадинска музика - -Player -== Играч - -Player country: -== Држава играча - -Players -== Играчи - -Please balance teams! -== Уравнотежите тимове! - -Prev. weapon -== Претходно оружије - -Quit -== Излаз - -Reason: -== Разлог: - -Red team -== Црвени тим - -Red team wins! -== Црвени тим је победио! - -Remote console -== Удаљена конзола - -Remove -== Обриши - -Remove friend -== Обриши пријатеља - -Rename demo -== Преименуј снимак - -Reset filter -== Поврати филтер - -Score -== Резултат - -Score limit -== Највише бодова - -Scoreboard -== Табела резултата - -Screenshot -== Снимак екрана - -Server address: -== Адреса сервера: - -Server info -== О серверу - -Server not full -== Сервер није пун - -Settings -== Подешавања - -Shotgun -== Сачмара - -Show chat -== Прикажи дописивање - -Show friends only -== Прикажи само пријатеље - -Show ingame HUD -== Користи HUD у игри - -Show name plates -== Прикажи плочице са именима - -Sound -== Звук - -Sound error -== Проблем са звуком - -Spectate -== Разгледај - -Spectate next -== Разгледај следећег - -Spectate previous -== Разгледај прошлог - -Spectator mode -== Мод разгледања - -Spectators -== Разгледачи - -Stop record -== Прекини снимање - -Strict gametype filter -== Строги филтер типа игре - -Sudden Death -== Изненадна смрт - -Switch weapon on pickup -== Промени оружије кад га покупиш - -Team -== Тим - -Team chat -== Тимско дописивање - -The audio device couldn't be initialised. -== Аудио уређај није могуће покренути - -The server is running a non-standard tuning on a pure game type. -== Сервер изводи нестандардно подешавање чистог типа игре. - -Time limit -== Временско ограничење - -Time limit: %d min -== Временско ограничење: %d min. - -Try again -== Покушај поново - -Type -== Тип - -Unable to rename the demo -== Снимак није могуће преименовати - -Use sounds -== Користи звук - -Use team colors for name plates -== Користите тимске боје за плочице са именима - -V-Sync -== V-Sync - -Version -== Верзија - -Vote command: -== Команда за гласање: - -Vote description: -== Опис гласања: - -Vote no -== Против - -Vote yes -== За - -Voting -== Гласање - -Warmup -== Загревање - -Weapon -== Оружје - -Yes -== Да - -You must restart the game for all settings to take effect. -== Морате поново покренути игру да би сва подешавања била примењена - -##### needs translation ##### - -Demo -== Снимак - -Editor -== Уређивач - -Game paused -== Игра је паузирана - -Laser -== Ласер - -Length -== Дужина - -Reset -== Ресетуј - -Save -== Сачувај - -Screen -== Екран - -Show only chat messages from friends -== Прикажи само поруке са дописивања од пријатеља - -Size -== Величина - -New name: -== Ново име: - -Sat. -== Засић. - -Miscellaneous -== Разно - -Internet -== Интернет - -Max demos -== Максималан број снимака - -News -== Новости - -Join game -== Уђи на сервер - -FSAA samples -== FSAA - -Sound volume -== Јачина звука - -Max Screenshots -== Максималан број снимака екрана - -Hue -== Нијанса - -Record demo -== Сними - -Your skin -== Ваша тема - -Reset to defaults -== Ресетуј - -Lht. -== Светл. - -UI Color -== Боја менија - -Alpha -== Провид. - -LAN -== Лок. мрежа - -Name plates size -== Величина плочице са именом - -Successfully saved the replay! -== Снимак је успешно сачуван! - -Replay feature is disabled! -== Функција понављања је онемогућена! - -Warning -== Упозорење - -Server best: -== Најбољи рекорд на серверу: - -Personal best: -== Мој Најбољи рекорд: - -Browser -== Прегледач - -Ghost -== Дух - -Loading DDNet Client -== Учитавам DDNet клијент - -Reconnect in %d sec -== Поново повезивање за %d секунди - -Render demo -== Рендеруј демо - -Replace video -== Замени видео - -File already exists, do you want to overwrite it? -== Фајл већ постоји, хоћете ли да га замените? - -Are you sure that you want to disconnect? -== Да ли сте сигурни да желите да прекинете везу? - -Disconnect Dummy -== Прекини копију - -Are you sure that you want to disconnect your dummy? -== Да ли сте сигурни да желите да прекинете копију? - -Welcome to DDNet -== Добро дошли у DDNet - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork је кооперативна онлајн игра у којој је циљ да ви и ваша група teeova дођете до циља на мапи. Као новајлија требали бисте започети на Novice серверима, на којима се налазе најједноставније мапе. Размислите о пингу да бисте изабрали сервер који вам је близу. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Користите тастер к за убијање (поновно покретање), q за паузирање и гледање других играча. Погледајте подешавања за остале пречице тастера. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Препоручује се да проверите подешавања како бисте их прилагодили пре него што се придружите серверу. - -Please enter your nickname below. -== Молимо вас напишите ваш надимак испод. - -Speed -== Брзина - -Video name: -== Назив видеа: - -Show DDNet map finishes in server browser -== Прикажи завршетка DDNet мапе у прегледачу сервера - -transmits your player name to info.ddnet.org -== преноси име вашег играча на info.ddnet.org - -Theme -== Тема - -Search -== Претрага - -Exclude -== Прескочи - -%d of %d servers -== %d од %d сервера - -%d of %d server -== %d од %d сервера - -%d players -== %d играча - -%d player -== %d играч - -Filter connecting players -== Филтрирај повезане играче - -Indicate map finish -== Означи као завршено - -Unfinished map -== Недовршена мапа - -Countries -== Земље - -Types -== Типови - -Remove chat -== Уклони дописивање - -%.2f MiB -== %.2f MiB - -%.2f KiB -== %.2f KiB - -Markers -== Маркери - -Date -== Датум - -Fetch Info -== Дохвати информације - -Demos directory -== Видео директоријум - -Connecting dummy -== Повезујем копију - -Connect Dummy -== Повежи копију - -Kill -== Убиј се - -Pause -== Пауза - -Deactivate -== Деактивирај - -Activate -== Активирај - -Switch weapon when out of ammo -== Замени оружје кад нема муниције - -Show clan above name plates -== Прикажи клан изнад плочице са именима - -Clan plates size -== Величина плочице са кланом - -Skip the main menu -== Прескочи главни мени - -Refresh Rate -== Освежавање - -Themes directory -== Тема директоријума - -Automatically take statboard screenshot -== Аутоматски направи снимак екрана статистике - -Automatically create statboard csv -== Аутоматски направи статистике csv - -Max CSVs -== Највише csv-ова - -Download skins -== Преузимај теме - -Vanilla skins only -== Класичне теме - -Fat skins (DDFat) -== Дебеле теме - -Skin prefix -== Перфикс теме - -Skin Database -== База теми - -Skins directory -== Директоријум тема - -Hook collisions -== Додир куке - -Zoom in -== Увећај - -Zoom out -== Умањи - -Default zoom -== Класична величина - -Show others -== Прикажи остале - -Show all -== Прикажи све - -Toggle dyncam -== Динамична камера - -Toggle dummy -== Пребаци на копију - -Toggle ghost -== Пребаци на духа - -Dummy copy -== Зајед. крет. копије - -Hammerfly dummy -== Лет. чекићем коп. - -Converse -== Сви дописивање - -Statboard -== Статистике - -Lock team -== Закључај тим - -Show entities -== Прикажи entities - -Show HUD -== Прикажи HUD - -may cause delay -== може проузроковати кашњење - -Use high DPI -== Користи високи DPI - -Enable game sounds -== Користи звукове игре - -Enable gun sound -== Омогући звук пуцања - -Enable long pain sound (used when shooting in freeze) -== Омогући дуг звук бола (користи се када се пуца у смрзавању) - -Enable server message sound -== Омогући звук поруке сервера - -Enable regular chat sound -== Омогући уобичајен звук дописивања - -Enable team chat sound -== Омогући тимски звук дописивања - -Enable highlighted chat sound -== Омогући истакнути звук дописивања - -Map sound volume -== Јачина звука на мапи - -HUD -== HUD - -DDNet -== DDNet - -Assets -== Средства - -DDNet Client needs to be restarted to complete update! -== Потребно је поново покренути DDNet клијент да бисте довршили ажурирање! - -Show score -== Прикажи бодове - -Show names in chat in team colors -== Прикажите имена у дописивању у бојама тима - -Show kill messages -== Прикажи дописивање смрти - -Show votes window after voting -== Прикажи статистику гласова након гласања - -Messages -== Поруке - -System message -== Системска порука - -Highlighted message -== Истакнута порука - -Team message -== Тимска порука - -Friend message -== Порука пријатеља - -Normal message -== Класична порука - -Client message -== Порука клијента - -Save the best demo of each race -== Сачувајте најбољи снимак сваке трке - -Default length -== Подразумевана дужина - -Enable replays -== Омогући поновљене репродукције - -Show ghost -== Прикажи духа - -Save ghost -== Сачивај духа - -Gameplay -== Игра - -Overlay entities -== Прекривајући entities - -Show text entities -== Прикажи текстуалне entities - -Show others (own team only) -== Прикажи остале (само свој тим) - -Show quads -== Прикажи quads - -AntiPing -== AntiPing - -AntiPing: predict other players -== AntiPing: предвиђање других играча - -AntiPing: predict weapons -== AntiPing: предвиђање оружија - -AntiPing: predict grenade paths -== AntiPing: предвиђање путање гранате - -Show other players' hook collision lines -== Прикажи линију судара куке других играча - -Show other players' key presses -== Прикажи притиске тастера других играча - -Show tiles layers from BG map -== Прикажи слојеве плочица са BG мапе - -DDNet %s is available: -== DDNet %s је доступан: - -Update now -== Унапреди сада - -Updating… -== Унапређујем… - -DDNet Client updated! -== DDNet клијент је унапређен! - -No updates available -== Нема доступних унапређења - -Check now -== Провери сада - -New random timeout code -== Нови случајни код истека времена - -Entities -== Entities - -Emoticons -== Иконице осећања - -Particles -== Честице - -Assets directory -== Директоријум средства - -Learn -== Упутство - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ - -Website -== Веб сајт - -Stop server -== Заустави сервер - -Run server -== Покрени сервер - -Server executable not found, can't run server -== Извршна датотека сервера није пронађена, не може се покренути сервер - -[Start menu] -Play -== Играј - -DDNet %s is out! -== DDNet %s је изашао! - -Downloading %s: -== Преузимање %s: - -Update failed! Check log… -== Ажурирање није успело! Сачекајте log… - -Restart -== Поново покрени - -Time -== Време - -Follow -== Прати - -Frags -== Гелери - -Deaths -== Смрти - -Suicides -== Самоубитства - -Ratio -== Однос - -Net -== Мрежа - -FPM -== FPM - -Spree -== Заглупи - -Best -== Најбољи - -Grabs -== Хватаљке - -1 new mention -== 1 ново помињање - -%d new mentions -== %d нових помињања - -9+ new mentions -== 9+ нових помињања - -Manual -== Упутство - -Race -== Трка - -Auto -== Ауто - -Replay -== Помнови - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== Ширина текстуре %s није дељива са %d, или висина није дељива са %d, што ће проузроковати видљиве грешке. - -The format of texture %s is not RGBA which will cause visual bugs. -== Формате текстуре %s није Ц.З.П.П.(RGBA) што ће проузроковати видљиве грешке - -Preparing demo playback -== Припрема се репродукција демоа - -Connected -== Повезано - -Loading map file from storage -== Учитавање мапе из меморије - -Why are you slowmo replaying to read this? -== Зашто полако понављаш да би ово прочитао? - -Initializing assets -== Учитавам слику - -Initializing map logic -== Учитавам логику мапе - -Sending initial client info -== Слање учитане информације клијента - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Debug мод је укључен. Притисните Ctrl+Shift+D да га искључите - -Position: -== Положај: - -Speed: -== Брзина: - -Angle: -== Угао: - -Uploading map data to GPU -== Слање података мапе Г.Ј.О.~у (GPU) - -Trying to determine UDP connectivity… -== Покушавам да одредим К.Д.П.(UDP) повезаност - -UDP seems to be filtered. -== Изгледа да је К.Д.П.(UDP) филтриран - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== Чини се да су К.Д.П.(UDP) и TCP IP адреса различите. Покушајте да онемогућите VPN, прокси или мрежне акцелераторе. - -No answer from server yet. -== Сервер још увек не одговара - -Getting game info -== Добијам инфо. игре - -Requesting to join the game -== Захтева се улазак у игру - -Existing Player -== Постојећи играч - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Име: '%s' се већ користи са %d поена. Дали идаље желите да га користите? - -Checking for existing player with your name -== Проверавамо дали постоји играч са вашим именом - -Are you sure that you want to disconnect and switch to a different server? -== Дали сте сигурни да желите да прекинете везу? - -Join Tutorial Server -== Уђи на почетнички сервер - -Skip Tutorial -== Прескочи увод - -Loading menu images -== Учитавање мену слика - -AFR -== АФР. - -ASI -== АЗИ. - -AUS -== АУС. - -EUR -== ЕВР. - -NA -== С.А. - -SA -== Ј.А. - -CHN -== КИН. - -Getting server list from master server -== Добијам листу сервера са мастер сервера - -Leak IP -== Провали адресу - -Loading demo files -== Учитавање демоа - -Loading ghost files -== Учитавање духова - -Smooth Dynamic Camera -== Глатка Динамична Камера - -Settings file -== Фајл Подешавања - -Config directory -== Директоријум конфигурацији - -Download community skins -== Преузми остале теме - -Choose default eyes when joining a server -== Избери уобичајене очи кад уђеш у сервер - -Loading skin files -== Учитавам фајлове тема - -Chat command -== к.једностав.текст.комуни.система - -Enable controller -== Укључи контролер - -[Ingame controller mode] -Relative -== Релативно - -[Ingame controller mode] -Absolute -== Апсолутно - -Ingame controller mode -== Мод контролера у игри - -Ingame controller sens. -== Бризина контролера у игри - -UI controller sens. -== Брзина контролера у мениу - -Controller jitter tolerance -== Толеранција контролера - -Status -== Статус - -Aim bind -== Нишан - -Mouse -== Миш - -Ingame mouse sens. -== Брзина у игри - -UI mouse sens. -== Брзина у мениу - -Controller -== Контролер - -Dummy -== Лутка - -Windowed -== У прозору - -Windowed borderless -== У прозору без мениа - -Windowed fullscreen -== У прозору преко целог екрана - -Desktop fullscreen -== Системски преко целог екрана - -Allows maps to render with more detail -== Рендеруј мапу са више детаља - -Renderer -== Рендерер - -default -== базично - -custom -== своје - -auto -== ауто - -Game sound volume -== Игрина јачина звука - -Chat sound volume -== Јачина звука дописивања - -Background music volume -== Позадинска јачина звука - -Appearance -== Изглед - -Name Plate -== Плочица са именом - -Hook Collisions -== Додир куке - -Show health, shields and ammo -== Прикажи животе, штитове и меткове - -DDRace HUD -== DDRace Приказ - -Show DDRace HUD -== Прикажи DDRace Приказ - -Show jumps indicator -== Прикажи индикатор скакања - -Show dummy actions -== Прикажи акције лутке - -Show player position -== Прикажи позиције играча - -Show player speed -== Прикажи брзину играча - -Show player target angle -== Прикажи циљни угао играча - -Show freeze bars -== Прикажи freeze bars - -Opacity of freeze bars inside freeze -== Провидност freeze bars у залеђеном делу - -Use old chat style -== Користи стари стил дописивања - -Preview -== Преглед - -Show local player's key presses -== Прикажи своје акције - -Hook collision line -== Додир куке - -Hook collision line opacity -== Провидност линије за додир куке - -Colors of the hook collision line, in case of a possible collision with: -== Боје линије за додир куке,у случају да можеш да се закачиш: - -Your movements are not taken into account when calculating the line colors -== Ваши покрети се не узимају у обзир при израчунавању боја линија - -Nothing hookable -== Ништа закачиво - -Something hookable -== Нешто закачиво - -A Tee -== Играч - -Normal Color -== Нормална боја - -Highlight Color -== Истакнута Боја - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Када кренеш да се тркаш, прикажи твог најбржег духа - -Opacity -== Провидност - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Подесите непрозирност ентитета који припадају другим тимовима, као што су мајице и натписне плочице - -Quads are used for background decoration -== Quads су коришћени за декорацију позадине - -Tries to predict other entities to give a feel of low latency -== Покушај да предвидиш остале објекте да се осећа брже - -Background -== Позадина - -Use current map as background -== Користи ову мапу као позадину - -Run on join -== Уради када уђеш - -Chat command (e.g. showall 1) -== Команда дописивања (нпр. /cmdlist) - -Extras -== Додатно - -Loading assets -== Учитавање средстава - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -Tutorial -== Увод - -Can't find a Tutorial server -== Неможемо пронаћи уводни сервер - -Loading race demo files -== Учитавам тркачке демо фајлове - -Super -== Супер - -Team %d -== Тим %d - -Loading sound files -== Учитавам звучне фајлове - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== - -Could not resolve connect address '%s'. See local console for details. -== - -Connect address error -== - -Could not save downloaded map. Try manually deleting this file: %s -== - -Could not connect dummy -== - -Error playing demo -== - -Failed saving the replay! -== - -Saving settings to '%s' failed -== - -Error saving settings -== - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Loading demo file from storage -== - -Some fonts could not be loaded. Check the local console for details. -== - -Initializing components -== - -Quitting. Please wait… -== - -Restarting. Please wait… -== - -Loading background map -== - -Searching -== - -Enter Username -== - -Enter Password -== - -NOT CONNECTED -== - -Match %d of %d -== - -No results -== - -Lines %d - %d (%s) -== - -Locked -== - -Following -== - -Loading commands… -== - -Multi-View -== - -[Spectating] -Following %s -== - -[Spectating Camera Mode Icon] -AUTO -== - -Some map images could not be loaded. Check the local console for details. -== - -Some map sounds could not be loaded. Check the local console for details. -== - -Loading menu themes -== - -Press a key… -== - -Main menu -== - -Rename folder -== - -Render complete -== - -Are you sure that you want to restart? -== - -Save skin -== - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== - -There's an unsaved map in the editor, you might want to save it. -== - -Continue anyway? -== - -A demo with this name already exists -== - -A folder with this name already exists -== - -Unable to rename the folder -== - -File '%s' already exists, do you want to overwrite it? -== - -(paused) -== - -Videos directory -== - -Video was saved to '%s' -== - -Unable to save the skin -== - -Unable to save the skin with a reserved name -== - -%d/%d KiB (%.1f KiB/s) -== - -No local servers found (ports %d-%d) -== - -Example of usage -== - -No login required -== - -Communities -== - -Copy info -== - -No server selected -== - -Online friends (%d) -== - -Online clanmates (%d) -== - -[friends (server browser)] -Offline (%d) -== - -Click to select server. Double click to join your friend. -== - -Click to remove this player from your friends list. -== - -Click to remove this clan from your friends list. -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Are you sure that you want to remove the player '%s' from your friends list? -== - -Are you sure that you want to remove the clan '%s' from your friends list? -== - -Add Clan -== - -Server filter -== - -Friends -== - -Play the current demo -== - -Pause the current demo -== - -Stop the current demo -== - -Go back the specified duration -== - -[Demo player duration] -%d min. -== - -[Demo player duration] -%d sec. -== - -Change the skip duration -== - -Go forward the specified duration -== - -Go back one tick -== - -Go forward one tick -== - -Go back one marker -== - -Go forward one marker -== - -Slow down the demo -== - -Speed up the demo -== - -Mark the beginning of a cut (right click to reset) -== - -Mark the end of a cut (right click to reset) -== - -Export cut as a separate demo -== - -Close the demo player -== - -Toggle keyboard shortcuts -== - -Toggle auto camera -== - -Export demo cut -== - -Cut interval -== - -Cut length -== - -Render cut to video -== - -Please use a different filename -== - -All combined -== - -No demo selected -== - -Folder Link -== - -Created -== - -Netversion -== - -[Demo details] -map not included -== - -Open the directory that contains the demo files -== - -Are you sure that you want to delete the folder '%s'? -== - -Are you sure that you want to delete the demo '%s'? -== - -Delete folder -== - -Unable to delete the demo '%s' -== - -Unable to delete the folder '%s'. Make sure it's empty first. -== - -Dummy is not allowed on this server -== - -Please wait… -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Loading… -== - -Ghosts directory -== - -Activate all -== - -Deactivate all -== - -Menu opened. Press Esc key again to close menu. -== - -[Hertz] -Hz -== - -Save power by lowering refresh rate (higher input latency) -== - -Open the settings file -== - -Open the directory that contains the configuration and user files -== - -Open the directory to add custom themes -== - -Player info change cooldown -== - -Create a random skin -== - -Open the directory to add custom skins -== - -No controller found. Plug in a controller. -== - -Axis -== - -Reset controls -== - -Are you sure that you want to reset the controls to their defaults? -== - -Cancel -== - -Graphics card -== - -Tee -== - -Info Messages -== - -Show local time always -== - -Authed name color in scoreboard -== - -Same clan color in scoreboard -== - -Show client IDs (scoreboard, chat, spectator) -== - -Always show chat -== - -Show only chat messages from team members -== - -Chat font size -== - -Chat width -== - -Show friend mark (♥) in name plates -== - -Show client IDs in name plates -== - -Hook Strength -== - -Show hook strength icon indicator -== - -Show hook strength number indicator -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Show own player's hook collision line -== - -Always show own player's hook collision line -== - -Always show other players' hook collision lines -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Preview 'Hook collisions' being pressed -== - -Show finish messages -== - -Weapons -== - -Rifle Laser Outline Color -== - -Rifle Laser Inner Color -== - -Shotgun Laser Outline Color -== - -Shotgun Laser Inner Color -== - -Door Laser Outline Color -== - -Door Laser Inner Color -== - -Freeze Laser Outline Color -== - -Freeze Laser Inner Color -== - -Set all to Rifle -== - -Enable ghost -== - -Only save improvements -== - -Regular background color -== - -Entities background color -== - -Unregister protocol and file extensions -== - -Basic -== - -Custom -== - -Are you sure that you want to delete '%s'? -== - -Delete skin -== - -Unable to delete skin -== - -Open the directory to add custom assets -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Round %d/%d -== - -[Spectators] -%d others… -== - -[Team and size] -%d\n(%d/%d) -== - -Team %d (%d/%d) -== - -[skins] -Body -== - -[skins] -Marking -== - -[skins] -Decoration -== - -[skins] -Hands -== - -[skins] -Feet -== - -[skins] -Eyes -== - -Aim -== - -Active: Fire -== - -Active: Hook -== - -Moved ingame -== - -https://wiki.ddnet.org/wiki/Mapping -== diff --git a/data/languages/simplified_chinese.txt b/data/languages/simplified_chinese.txt deleted file mode 100644 index 23aae2fbca..0000000000 --- a/data/languages/simplified_chinese.txt +++ /dev/null @@ -1,2120 +0,0 @@ -##### authors ##### -#originally created by: -# MK124 -#modified by: -# 2016-02-05 CarolVlCznYu -# 2017-07-31 MC_TYH -# 2018-10-07 Yangfl -# 2019-12-16 Eki -# 2020-06-25 Night_L -# 2020-08-14 Night_L -# 2020-08-19 TsFreddie -# 2020-08-20 Dan_cao -# 2020-11-12 TsFreddie -# 2021-05-27 Momo -# 2021-06-01 TsFreddie -# 2021-11-19 cheeser0613 -# 2021-12-21 cheeser0613 -# 2022-02-07 cheeser0613 -# 2022-03-19 cheeser0613 -# 2022-03-22 cheeser0613 -# 2022-03-24 cheeser0613 -# 2022-03-29 Dan_cao -# 2022-04-01 Dan_cao -# 2022-05-14 Dan_cao -# 2022-05-14 cheeser0613 -# 2022-06-16 cheeser0613 -# 2022-06-27 cheeser0613 -# 2022-07-04 cheeser0613 -# 2022-08-08 cheeser0613 -# 2022-09-17 cheeser0613 -# 2022-10-24 cheeser0613 -# 2022-12-11 cheeser0613 -# 2023-01-11 cheeser0613 -# 2023-04-01 cheeser0613 -# 2023-05-21 RemakePower -# 2023-07-20 By -# 2023-08-11 By -# 2023-11-25 By -# 2024-01-15 By -# 2024-03-03 Bamcane -# 2024-04-21 By -# 2024-06-10 By -# 2024-07-21 By -# 2024-08-29 Pioooooo -# 2024-09-29 Pioooooo -# 2024-11-01 Pioooooo -# 2024-12-03 豆腐渣 & Pioooooo -# 2025-01-03 Pioooooo -##### /authors ##### - -##### translated strings ##### - -%ds left -== 还剩 %d 秒 - -%i minute left -== 还剩下 %i 分钟 - -%i minutes left -== 还剩下 %i 分钟 - -%i second left -== 还剩下 %i 秒钟 - -%i seconds left -== 还剩下 %i 秒钟 - -%s wins! -== %s 胜利! - -Abort -== 取消 - -Add -== 添加 - -Add Friend -== 添加好友 - -Address -== 地址 - -All -== 全体 - -Are you sure that you want to quit? -== 确定要退出吗? - -Automatically record demos -== 自动录制回放 - -Automatically take game over screenshot -== 自动对游戏结束画面截图 - -Blue team -== 蓝队 - -Blue team wins! -== 蓝队胜利! - -Body -== 身体 - -Call vote -== 发起投票 - -Change settings -== 变更设置 - -Chat -== 聊天 - -Clan -== 战队 - -Client -== 客户端 - -Connecting to -== 正在连接到 - -Connection Problems… -== 连接中断… - -Console -== 控制台 - -Controls -== 控制 - -Count players only -== 屏蔽旁观位 - -Current -== 当前 - -Custom colors -== 自定义颜色 - -Delete -== 删除 - -Delete demo -== 删除回放 - -Demofile: %s -== 回放文件:%s - -Demos -== 回放 - -Disconnect -== 断开连接 - -Disconnected -== 连接已断开 - -Downloading map -== 正在下载地图 - -Draw! -== 平局! - -Dynamic Camera -== 动态视野 - -Emoticon -== 表情 - -Error -== 错误 - -Error loading demo -== 回放加载错误 - -Favorite -== 收藏 - -Favorites -== 收藏夹 - -Feet -== 脚 - -Fire -== 开火 - -Folder -== 文件夹 - -Force vote -== 强制投票 - -Free-View -== 自由视角 - -Fullscreen -== 独占全屏 - -Game -== 游戏 - -Game info -== 游戏信息 - -Game over -== 游戏结束 - -Game paused -== 游戏已暂停 - -Game type -== 游戏模式 - -Game types: -== 游戏模式: - -General -== 常规 - -Graphics -== 图像 - -Grenade -== 榴弹枪 - -Hammer -== 锤子 - -Has people playing -== 有玩家 - -High Detail -== 显示地图细节 - -Hook -== 钩索 - -Invalid Demo -== 回放文件无效或已损坏 - -Join blue -== 加入蓝队 - -Join red -== 加入红队 - -Jump -== 跳跃 - -Kick player -== 踢出玩家 - -Language -== 语言 - -DDNet Client needs to be restarted to complete update! -== DDNet 客户端需要重新启动才能完成更新! - -MOTD -== 公告 - -Map -== 地图 - -Move left -== 向左移动 - -Move player to spectators -== 将玩家移至旁观位 - -Move right -== 向右移动 - -Movement -== 移动 - -Mute when not active -== 在后台时静音 - -Enable game sounds -== 启用游戏声音 - -Enable gun sound -== 启用手枪声音 - -Enable server message sound -== 启用服务器消息提示音 - -Enable regular chat sound -== 启用聊天消息提示音 - -Enable team chat sound -== 启用队伍聊天消息提示音 - -Enable highlighted chat sound -== 启用聊天被提及消息提示音 - -Name -== 名称 - -Next weapon -== 下一个武器 - -Nickname -== 昵称 - -No -== 否 - -No password -== 没有密码 - -No servers found -== 未检测到任何服务器 - -No servers match your filter criteria -== 没有服务器满足设置的筛选条件 - -Ok -== 确定 - -Parent Folder -== 上级目录 - -Password -== 密码 - -Password incorrect -== 密码错误 - -Ping -== 延迟 - -Pistol -== 手枪 - -Play background music -== 播放背景音乐 - -Player -== 玩家 - -HUD -== HUD - -Player country: -== 玩家国家 / 地区: - -Players -== 玩家 - -Please balance teams! -== 队伍人数不平衡! - -Prev. weapon -== 上一个武器 - -Quit -== 退出 - -Reason: -== 理由: - -Red team -== 红队 - -Red team wins! -== 红队胜利! - -Remote console -== 远程控制台 - -Remove -== 删除 - -Remove friend -== 删除好友 - -Rename demo -== 重命名回放 - -Reset filter -== 重置筛选 - -Score -== 分数 - -Score limit -== 目标得分 - -Scoreboard -== 计分板 - -Screenshot -== 截图 - -Server address: -== 服务器地址: - -Server info -== 服务器信息 - -Server not full -== 服务器未满 - -Shotgun -== 霰弹枪 - -Show chat -== 显示聊天框 - -Show friends only -== 只显示好友 - -Show ingame HUD -== 显示 HUD - -Show name plates -== 显示昵称 - -Show only chat messages from friends -== 只显示好友聊天消息 - -Sound -== 声音 - -Sound error -== 音频错误 - -Spectate -== 旁观 - -Spectate next -== 旁观下一个 - -Spectate previous -== 旁观上一个 - -Spectator mode -== 旁观者模式 - -Spectators -== 旁观者 - -Stop record -== 停止录制 - -Strict gametype filter -== 严格游戏模式筛选 - -Sudden Death -== 决胜 - -Switch weapon on pickup -== 拾取武器时自动装备 - -Switch weapon when out of ammo -== 子弹打空时自动切换武器 - -Show clan above name plates -== 显示战队名称 - -Clan plates size -== 战队名称大小 - -Team -== 队伍 - -Team chat -== 队伍聊天 - -The audio device couldn't be initialised. -== 初始化音频设备失败。 - -The server is running a non-standard tuning on a pure game type. -== 此服务器运行着经过调整的非标准游戏模式。 - -Time limit -== 规定时限 - -Time limit: %d min -== 规定时限:%d 分钟 - -Try again -== 重试 - -Type -== 模式 - -Unable to rename the demo -== 无法重命名这个回放 - -Use sounds -== 开启声音 - -Use team colors for name plates -== 用队伍颜色显示昵称 - -V-Sync -== 垂直同步 - -Version -== 版本 - -Vote command: -== 投票命令: - -Vote description: -== 投票描述: - -Vote no -== 反对 - -Vote yes -== 赞成 - -Voting -== 投票 - -Warmup -== 热身 - -Weapon -== 武器 - -Yes -== 是 - -You must restart the game for all settings to take effect. -== 你需要重启游戏来使新设置生效。 - -Demo -== 回放 - -Reset -== 重置 - -Screen -== 屏幕 - -New name: -== 新文件名: - -Sat. -== 饱和度 - -Miscellaneous -== 杂项 - -Internet -== 互联网 - -Max demos -== 最大回放数 - -News -== 新闻 - -Join game -== 加入游戏 - -FSAA samples -== 全屏抗锯齿(FSAA)采样倍数 - -Sound volume -== 音量 - -Map sound volume -== 地图音效音量 - -Max Screenshots -== 最大截图数 - -Laser -== 激光 - -Hue -== 色调 - -Record demo -== 录制回放 - -Your skin -== 你的皮肤 - -Reset to defaults -== 恢复默认设置 - -Lht. -== 亮度 - -Automatically take statboard screenshot -== 自动对统计板截图 - -UI Color -== 界面颜色 - -Alpha -== 透明度 - -LAN -== 局域网 - -Name plates size -== 昵称大小 - -Show score -== 显示分数 - -Show names in chat in team colors -== 以队伍颜色显示玩家昵称 - -Show kill messages -== 显示击杀消息 - -Show votes window after voting -== 投票后不关闭投票窗口 - -Messages -== 消息 - -System message -== 系统消息 - -Highlighted message -== 被提及消息 - -Team message -== 队伍消息 - -Normal message -== 普通消息 - -Friend message -== 好友消息 - -Save the best demo of each race -== 保存每场游戏最佳记录的回放 - -Ghost -== 影子 - -Show ghost -== 显示影子 - -Save ghost -== 保存影子 - -Gameplay -== 游戏 - -Overlay entities -== 显示实体层 - -Show others -== 显示其他玩家 - -Show quads -== 显示背景 - -Default zoom -== 默认缩放 - -AntiPing: predict other players -== 延迟补偿:预测其他玩家 - -AntiPing: predict weapons -== 延迟补偿:预测武器 - -AntiPing: predict grenade paths -== 延迟补偿:预测榴弹枪路径 - -Show other players' hook collision lines -== 显示其他玩家的钩索辅助线 - -Show other players' key presses -== 显示其他玩家的按键 - -Show tiles layers from BG map -== 显示实体层背景地图的图块层 - -DDNet %s is available: -== DDNet %s 现已可用: - -Update now -== 现在更新 - -Updating… -== 更新中… - -DDNet Client updated! -== DDNet 客户端更新成功! - -No updates available -== 没有可用的更新 - -Check now -== 检查更新 - -Loading DDNet Client -== 加载 DDNet 客户端中… - -Browser -== 浏览 - -Connecting dummy -== 正在连接分身 - -Search -== 搜索 - -Vanilla skins only -== 只显示原生皮肤 - -Fat skins (DDFat) -== 胖胖的皮肤(DDFat) - -Ratio -== K/D - -##### Ratio的算法是击杀除以死亡次数 ##### - -AntiPing -== 延迟补偿(AntiPing) - -Countries -== 国家 - -Reconnect in %d sec -== %d 秒后重新连接 - -Grabs -== 得旗数 - -DDNet -== DDNet - -Deaths -== 死亡数 - -Restart -== 重新开始 - -Follow -== 跟随 - -Automatically create statboard csv -== 自动将统计板导出为 csv 文件 - -Are you sure that you want to disconnect? -== 确定要断开连接吗? - -Types -== 模式 - -Remove chat -== 删除消息记录 - -Frags -== 击杀数 - -Enable long pain sound (used when shooting in freeze) -== 启用冻结呼叫声 - -%.2f MiB -== %.2f MiB - -Refresh Rate -== 刷新率 - -New random timeout code -== 随机生成新的超时代码(Timeout 代码) - -Suicides -== 自杀数 - -Net -== 净击杀 - -##### Net的算法是杀人+1被杀-1 ##### - -FPM -== 击杀/分 - -##### 得分速度就是效率FPM ##### - -Spree -== 连杀 - -Max CSVs -== 最大 csv 文件数 - -%.2f KiB -== %.2f KiB - -Best -== 最高 - -Exclude -== 排除 - -may cause delay -== 可能会产生延迟 - -Unfinished map -== 未完成的地图 - -Deactivate -== 停用 - -Welcome to DDNet -== 欢迎来到 DDNet - -Activate -== 启用 - -File already exists, do you want to overwrite it? -== 文件已存在,是否覆盖? - -Indicate map finish -== 标记已完成的地图 - -Save -== 保存 - -Date -== 日期 - -Show DDNet map finishes in server browser -== 在服务器浏览器中显示已完成的 DDNet 地图 - -transmits your player name to info.ddnet.org -== 将会发送你的玩家昵称到 info.ddnet.org - -Enable replays -== 启用短时回放 - -Time -== 用时 - -Show entities -== 实体层显示开关 - -Show all -== 显示所有玩家 - -Downloading %s: -== 正在下载 %s: - -%d new mentions -== %d 条新被提及消息 - -Toggle dummy -== 切换分身 - -Replay feature is disabled! -== 短时回放功能未启用! - -Are you sure that you want to disconnect your dummy? -== 确定要断开分身连接吗? - -Hook collisions -== 钩索辅助线 - -DDNet %s is out! -== DDNet %s 已经更新了! - -Markers -== 标记 - -Filter connecting players -== 筛选正在连接的玩家 - -Zoom in -== 放大视野 - -1 new mention -== 1 条新被提及消息 - -Update failed! Check log… -== 更新失败!请检查日志… - -Pause -== 暂停 - -Length -== 时长 - -Converse -== 继续私聊 - -Successfully saved the replay! -== 成功保存短时回放! - -Fetch Info -== 回放信息 - -Lock team -== 锁定队伍 - -Size -== 大小 - -Dummy copy -== 分身同步动作 - -9+ new mentions -== 9+ 条新被提及消息 - -Statboard -== 统计板 - -Disconnect Dummy -== 断开分身连接 - -Show HUD -== HUD 开关 - -Hammerfly dummy -== 分身 Hammerfly 开关 - -Default length -== 默认时长 - -Toggle ghost -== 影子记录开关 - -Kill -== 自杀 - -Zoom out -== 缩小视野 - -Show text entities -== 显示文本实体 - -Skin prefix -== 皮肤名称前缀 - -Toggle dyncam -== 动态视野开关 - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork 是一款在线合作游戏,你和你团体里的 Tee 的目标是抵达地图的终点。作为新手你应该从有着最简单的地图的简单(Novice) 服务器入门。根据延迟来选择离你相近的服务器。 - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== 建议你在进入服务器前检查一下设置并根据你的喜好进行调整。 - -Please enter your nickname below. -== 请在下方输入你的昵称。 - -Server best: -== 服务器最佳 - -Learn -== 教程 Wiki - -Use high DPI -== 使用高 DPI - -Personal best: -== 个人最佳 - -Render demo -== 渲染回放 - -Replace video -== 替换视频 - -Video name: -== 视频名称 - -Connect Dummy -== 连接分身 - -Client message -== 客户端消息 - -Show others (own team only) -== 显示其他玩家(仅同队伍) - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== 使用 K键 自杀以重新开始,使用 Q键 可以暂停以旁观他人或查看地图。在设置中可以查看其他按键绑定。 - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/wiki/Main_Page/zh - -Warning -== 警告 - -Speed -== 速度 - -Skip the main menu -== 跳过主菜单 - -Website -== 官网 - -Settings -== 设置 - -[Start menu] -Play -== 开始游戏 - -Stop server -== 停止服务器 - -Run server -== 运行服务器 - -Server executable not found, can't run server -== 未检测到服务器的可执行文件,无法运行服务器 - -Editor -== 编辑器 - -Manual -== 手动 - -Race -== 游戏 - -Auto -== 自动 - -Replay -== 回放 - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== 调试模式已启用。按 Ctrl+Shift+D 禁用调试模式。 - -Existing Player -== 玩家已存在 - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== 你使用的昵称 "%s" 在 DDNet 中有 %d 分的记录,这可能表示该昵称已经被其他玩家使用过。确认要使用这个名字吗? - -Checking for existing player with your name -== 正在查找该昵称的 DDNet 记录 - -Theme -== 主题 - -%d of %d servers -== 符合条件 %d / 总共 %d 个服务器 - -%d of %d server -== 符合条件 %d / 总共 %d 个服务器 - -%d players -== %d 在线玩家 - -%d player -== %d 在线玩家 - -Demos directory -== 回放目录 - -Smooth Dynamic Camera -== 平滑动态视野 - -Themes directory -== 主题目录 - -Download skins -== 下载官方皮肤 - -Skin Database -== 皮肤数据库 - -Skins directory -== 皮肤目录 - -Game sound volume -== 游戏音效音量 - -Chat sound volume -== 聊天提示音量 - -Background music volume -== 背景音乐音量 - -Assets -== 资源 - -Use old chat style -== 旧版聊天框 - -Use current map as background -== 使用当前地图作为实体层背景地图 - -Entities -== 实体层 - -Emoticons -== 表情 - -Particles -== 粒子 - -Assets directory -== 资源目录 - -https://ddnet.org/discord -== http://chat.teeworlds.cn/ - -Discord -== 开黑啦 - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== 纹理文件 %s 的宽度无法被 %d 整除,或者高度无法被 %d 整除,这可能会导致显示错误。 - -Chat command -== 聊天框指令(/) - -Dummy -== 分身 - -Preview -== 预览 - -Background -== 背景 - -AFR -== 非洲 - -ASI -== 亚洲 - -AUS -== 澳洲 - -EUR -== 欧洲 - -NA -== 北美 - -SA -== 南美 - -CHN -== 中国 - -Getting server list from master server -== 正在从主服务器获取服务器列表 - -Leak IP -== 暴露IP - -Windowed -== 窗口化 - -Windowed borderless -== 无边框窗口 - -Desktop fullscreen -== 无边框全屏 - -Are you sure that you want to disconnect and switch to a different server? -== 确定要断开此服务器连接并进入其他服务器吗? - -Show local player's key presses -== 显示自己的按键 - -Settings file -== 设置文件 - -Config directory -== 配置目录(cfg) - -Run on join -== 进入时执行 - -Chat command (e.g. showall 1) -== 聊天指令(例如: showall 1) - -Windowed fullscreen -== 窗口化全屏 - -The format of texture %s is not RGBA which will cause visual bugs. -== 纹理文件 %s 并非 RGBA 格式,这可能会导致显示错误。 - -Join Tutorial Server -== 进入教学服务器 - -Skip Tutorial -== 跳过教学 - -Renderer -== 渲染设置 - -default -== 默认 - -custom -== 自定义 - -auto -== 自动 - -Tutorial -== 教学 - -Can't find a Tutorial server -== 无法找到教学服务器 - -Choose default eyes when joining a server -== 进入服务器时的默认表情 - -Allows maps to render with more detail -== 允许地图渲染更多细节 - -When you cross the start line, show a ghost tee replicating the movements of your best time -== 当越过起跑线时,游戏里将有影子回放你的最佳成绩 - -Opacity -== 不透明度 - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== 调整单人区域或其他队伍中玩家的不透明度 - -Quads are used for background decoration -== 显示用作背景装饰的贴图 - -Tries to predict other entities to give a feel of low latency -== 尝试预测其他实体物以带来低延迟的游玩体验 - -Super -== 无敌 - -Team %d -== 队伍 %d - -Position: -== 坐标 - -Speed: -== 速度 - -Angle: -== 角度 - -Trying to determine UDP connectivity… -== 正在尝试检测 UDP 连接… - -UDP seems to be filtered. -== UDP 疑似被过滤 - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== UDP 与 TCP 的 IP 地址并不相同。请尝试屏蔽 VPN 、代理网络以及网络加速器。 - -No answer from server yet. -== 服务器无响应 - -Download community skins -== 下载社区皮肤 - -Enable controller -== 启用控制器 - -[Ingame controller mode] -Relative -== 相对 - -[Ingame controller mode] -Absolute -== 绝对 - -Ingame controller mode -== 游戏内控制器瞄准模式 - -Ingame controller sens. -== 摇杆灵敏度(游戏) - -UI controller sens. -== 摇杆灵敏度(界面) - -Controller jitter tolerance -== 摇杆死区 - -Status -== 状态 - -Aim bind -== 操作轴绑定 - -Mouse -== 鼠标 - -Ingame mouse sens. -== 鼠标灵敏度(游戏) - -UI mouse sens. -== 鼠标灵敏度(界面) - -Controller -== 控制器 - -Show dummy actions -== 显示分身状态 - -Show freeze bars -== 显示解冻进度条 - -Show player position -== 显示玩家坐标 - -Show player speed -== 显示玩家速度 - -Show player target angle -== 显示玩家瞄准角度 - -Opacity of freeze bars inside freeze -== 解冻进度条不透明度 - -Normal Color -== 非相关信息颜色 - -Highlight Color -== 相关信息颜色 - -Extras -== 其他 - -Preparing demo playback -== 正在准备回放 - -Connected -== 连接成功 - -Loading map file from storage -== 正在从硬盘中加载地图文件 - -Why are you slowmo replaying to read this? -== 所以你为什么要慢速回放来看这个 - -Initializing components -== 正在初始化游戏引擎 - -Initializing assets -== 正在初始化资源 - -Initializing map logic -== 正在初始化地图逻辑 - -Sending initial client info -== 正在发送初始客户端信息 - -Uploading map data to GPU -== 正在将地图数据传输至显卡 - -Getting game info -== 正在获取游戏信息 - -Requesting to join the game -== 正在请求加入游戏 - -Loading menu images -== 正在加载主菜单图片 - -Loading demo files -== 正在加载回放文件 - -Loading ghost files -== 正在加载影子文件 - -Loading skin files -== 正在加载皮肤文件 - -Appearance -== 游戏界面 - -Name Plate -== 昵称板块 - -Hook Collisions -== 瞄准辅助 - -Show health, shields and ammo -== 显示生命、护甲与弹药栏 - -DDRace HUD -== DDRace HUD - -Show DDRace HUD -== 显示 DDRace HUD - -Show jumps indicator -== 显示可跳跃次数 - -Hook collision line -== 钩索辅助线 - -Hook collision line opacity -== 辅助线不透明度 - -Colors of the hook collision line, in case of a possible collision with: -== 辅助线颜色(当瞄准以下实体物时): - -Your movements are not taken into account when calculating the line colors -== 移动所造成的瞄准偏移将不计入考量 - -Nothing hookable -== 未瞄准任何实体物 - -Something hookable -== 可钩索的方块 - -A Tee -== 其他玩家 - -Loading assets -== 正在加载资源 - -Loading race demo files -== 正在加载回放文件 - -Loading sound files -== 正在加载声音文件 - -Play the current demo -== 播放回放 - -Pause the current demo -== 暂停回放 - -Stop the current demo -== 结束回放 - -Slow down the demo -== 减慢播放速度 - -Speed up the demo -== 加快播放速度 - -Export cut as a separate demo -== 另存为新回放文件 - -Toggle keyboard shortcuts -== 启用/禁用键盘快捷键 - -Weapons -== 武器 - -Rifle Laser Outline Color -== 激光枪弹道外框颜色 - -Rifle Laser Inner Color -== 激光枪弹道实心颜色 - -Shotgun Laser Outline Color -== 霰弹枪弹道外框颜色 - -Shotgun Laser Inner Color -== 霰弹枪弹道实心颜色 - -Door Laser Outline Color -== 激光门外框颜色 - -Door Laser Inner Color -== 激光门实心颜色 - -Freeze Laser Outline Color -== 冻结激光外框颜色 - -Freeze Laser Inner Color -== 冻结激光实心颜色 - -Menu opened. Press Esc key again to close menu. -== 菜单已打开,再次点击 Esc 以关闭 - -Set all to Rifle -== 统一为激光枪颜色 - -Cancel -== 取消 - -File '%s' already exists, do you want to overwrite it? -== 文件名 "%s" 已经存在,是否要覆盖该文件? - -Are you sure that you want to remove the player '%s' from your friends list? -== 确定要将好友 "%s" 从你的好友列表中删除? - -Are you sure that you want to remove the clan '%s' from your friends list? -== 确定要将战队 "%s" 从你的好友列表中删除? - -Go back one tick -== 上一个 tick - -Go forward one tick -== 下一个 tick - -Go back one marker -== 返回上一个标记 - -Go forward one marker -== 跳至下一个标记 - -Are you sure that you want to delete the demo '%s'? -== 确定要删除回放文件 "%s" ? - -Unable to delete the demo '%s' -== 无法删除回放文件 "%s" - -Reset controls -== 恢复默认设置 - -Are you sure that you want to reset the controls to their defaults? -== 确定要将当前的控制恢复至默认设置? - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== 初始化失败。请尝试打开配置目录中的设置文件(settings_ddnet.cfg)并将 “gfx_backend” 设置为 “gfx_backend OpenGL” 或 “gfx_backend Vulkan” 再重试。 - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== 显存不足。请尝试移除自定义资源(如皮肤,实体层等等),尤其高分辨率的自定义资源。 - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== 指令记录期间检测到错误。请尝试更新显卡驱动程序。 - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== 渲染指令错误。请尝试更新显卡驱动程序 - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== 渲染指令提交失败。请尝试更新显卡驱动程序。 - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== 帧缓存交替失败。请尝试更新显卡驱动程序。 - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== 未知错误。请尝试打开配置目录中的设置文件(settings_ddnet.cfg)并将 “gfx_backend” 设置为 “gfx_backend OpenGL” 或 “gfx_backend Vulkan” 再重试。 - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== 无法初始化当前配置的图形后端,正在将配置回退至默认图形后端。 - -Open the directory that contains the demo files -== 打开存有回放文件的文件夹路径 - -Save power by lowering refresh rate (higher input latency) -== 省电模式(限制帧率上限以降低功耗但也将提高输入延迟) - -Open the settings file -== 打开设置文件 - -Open the directory that contains the configuration and user files -== 打开存有配置文件与用户文件的文件夹路径 - -Open the directory to add custom themes -== 打开用以添加自定义主题的文件夹路径 - -Open the directory to add custom skins -== 打开用以添加自定义皮肤的文件夹路径 - -No controller found. Plug in a controller. -== 未检测到任何控制器。请尝试重新连接控制器。 - -Unregister protocol and file extensions -== 解除协议与文件类型关联 - -Open the directory to add custom assets -== 打开用以添加自定义资源的文件夹路径 - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== 无法初始化当前配置的图形后端,请检查此电脑是否已安装集成显卡的驱动程序。 - -Could not save downloaded map. Try manually deleting this file: %s -== 地图下载失败,请尝试手动删除此文件:%s - -Copy info -== 复制服务器信息 - -Create a random skin -== 随机创造皮肤 - -Online clanmates (%d) -== 在线战队成员 (%d人) - -[friends (server browser)] -Offline (%d) -== 离线 (%d人) - -Click to select server. Double click to join your friend. -== 单击以选择此服务器。双击加入好友所在服务器。 - -Click to remove this player from your friends list. -== 单击从你的好友列表移除此玩家 - -Click to remove this clan from your friends list. -== 单击从你的好友列表移除此战队 - -Add Clan -== 添加战队 - -A demo with this name already exists -== 已经存在同名回放 - -No server selected -== 未选择服务器 - -Mark the beginning of a cut (right click to reset) -== 标记裁剪起点 (右键重置) - -Mark the end of a cut (right click to reset) -== 标记裁剪终点 (右键重置) - -Close the demo player -== 关闭回放 - -Export demo cut -== 另存裁剪部分 - -Cut interval -== 裁剪区间 - -Cut length -== 裁剪时长 - -Axis -== 轴 - -Graphics card -== 显卡 - -Quitting. Please wait… -== 正在退出,请稍等 - -Restarting. Please wait… -== 正在重启,请稍等 - -Multi-View -== 多人同框视角 - -Rename folder -== 重命名文件夹 - -A folder with this name already exists -== 已经存在同名文件夹 - -Unable to rename the folder -== 无法重命名这个文件夹 - -(paused) -== (暂停) - -All combined -== 全部文件 - -Folder Link -== 文件夹链接 - -Are you sure that you want to delete the folder '%s'? -== 确定要删除文件夹 "%s" ? - -Delete folder -== 删除文件夹 - -Unable to delete the folder '%s'. Make sure it's empty first. -== 无法删除 "%s" ,请确保你已清空该文件夹 - -Moved ingame -== 游戏内移动 - -Error playing demo -== 回放播放错误 - -Some map images could not be loaded. Check the local console for details. -== 未能加载某些地图图片。检查本地控制台以获取详情。 - -Some map sounds could not be loaded. Check the local console for details. -== 未能加载某些地图音效。检查本地控制台以获取详情。 - -Loading menu themes -== 正在加载主菜单主题 - -Render complete -== 渲染完毕 - -Videos directory -== 视频目录 - -Video was saved to '%s' -== 视频保存至 "%s" - -Go back the specified duration -== 快退指定时长 - -[Demo player duration] -%d min. -== %d 分 - -[Demo player duration] -%d sec. -== %d 秒 - -Change the skip duration -== 变更指定时长 - -Go forward the specified duration -== 快进指定时长 - -Render cut to video -== 渲染裁剪部分 - -No demo selected -== 未选择回放 - -Created -== 创建日期 - -Netversion -== Netversion - -[Demo details] -map not included -== 未包含地图 - -Ghosts directory -== 影子目录 - -Activate all -== 全部启用 - -Deactivate all -== 全部停用 - -Enable ghost -== 启用影子 - -Only save improvements -== 只保存更佳记录 - -Regular background color -== 原图层背景颜色 - -Entities background color -== 实体层背景颜色 - -Saving settings to '%s' failed -== 无法保存设置至 "%s" - -Searching -== 正在搜索 - -Enter Username -== 输入账号名称 - -Enter Password -== 输入密码 - -NOT CONNECTED -== 连接未成功 - -Match %d of %d -== 结果 %d / 总共 %d 则 - -No results -== 无结果 - -Lines %d - %d (%s) -== 行 %d - %d (%s) - -Locked -== 锁定 - -Following -== 当前 - -Press a key… -== 按任意键… - -Are you sure that you want to restart? -== 确定要重新开始? - -There's an unsaved map in the editor, you might want to save it. -== 编辑器中有尚未保存的地图,你或需要保存 - -Continue anyway? -== 仍要退出? - -Communities -== 社区 - -Please use a different filename -== 请使用不同的文件名 - -Info Messages -== 消息 - -Show local time always -== 始终显示本地时间 - -Chat font size -== 聊天字体大小 - -Chat width -== 聊天框宽度 - -Authed name color in scoreboard -== 管理权限者名字计分板显示颜色 - -Same clan color in scoreboard -== 相同战队计分板显示颜色 - -Show finish messages -== 显示完成消息 - -Failed saving the replay! -== 保存回放失败! - -Error saving settings -== 保存设置错误 - -Loading commands… -== 正在加载指令… - -Main menu -== 主菜单 - -Server filter -== 服务器筛选 - -Friends -== 好友 - -Loading… -== 正在加载… - -Loading demo file from storage -== 正在从硬盘中加载回放文件 - -No login required -== 无需登录 - -Player info change cooldown -== 玩家信息更改冷却时间 - -Always show chat -== 始终显示聊天框 - -Show friend mark (♥) in name plates -== 在昵称上显示好友标记 (♥) - -Show hook strength icon indicator -== 显示钩索强度图标 - -Show hook strength number indicator -== 显示钩索强度数值 - -Show own player's hook collision line -== 显示自己的钩索辅助线 - -Always show own player's hook collision line -== 始终显示自己的钩索辅助线 - -Always show other players' hook collision lines -== 始终显示其他玩家的钩索辅助线 - -%d/%d KiB (%.1f KiB/s) -== %d/%d KiB (%.1f KiB/s) - -Tee -== Tee - -Show only chat messages from team members -== 只显示队伍聊天消息 - -[Spectating] -Following %s -== 正在旁观 %s - -Example of usage -== 用途示例 - -Round %d/%d -== 轮次 %d/%d - -[Spectators] -%d others… -== %d 其他… - -[Team and size] -%d\n(%d/%d) -== %d\n(%d/%d) - -Team %d (%d/%d) -== 队伍 %d (%d/%d) - -https://wiki.ddnet.org/wiki/Mapping -== https://wiki.ddnet.org/index.php?title=Mapping/zh&variant=zh-hans - -Could not resolve connect address '%s'. See local console for details. -== 无法解析连接地址 '%s'。检查本地控制台以获取详情。 - -Connect address error -== 连接地址错误 - -Could not connect dummy -== 无法连接分身 - -Dummy is not allowed on this server -== 此服务器禁止使用分身 - -Please wait… -== 请稍等… - -Show client IDs (scoreboard, chat, spectator) -== 显示客户端 ID(计分板、聊天、观战者) - -Are you sure that you want to delete '%s'? -== 你确定要删除'%s'吗? - -Delete skin -== 删除皮肤 - -Basic -== 基本 - -Custom -== 自定义 - -Unable to delete skin -== 无法删除皮肤 - -Save skin -== 保存皮肤 - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== 你确定要保存皮肤吗?如果已经存在同名皮肤,将会被替换。 - -Unable to save the skin -== 无法保存皮肤 - -Unable to save the skin with a reserved name -== 无法保存使用保留名称的皮肤 - -No local servers found (ports %d-%d) -== 未找到本地服务器(端口 %d-%d) - -[Hertz] -Hz -== Hz - -[skins] -Body -== 身体 - -[skins] -Marking -== 标记 - -[skins] -Decoration -== 装饰 - -[skins] -Hands -== 手 - -[skins] -Feet -== 脚 - -[skins] -Eyes -== 眼睛 - -Some fonts could not be loaded. Check the local console for details. -== 未能加载某些字体。检查本地控制台以获取详情。 - -Online friends (%d) -== 在线好友 (%d人) - -Add friends by entering their name below or by clicking their name in the player list. -== 在下方输入好友名称或点击玩家列表中的好友名称即可添加好友 - -Add clanmates by entering their clan below and leaving the name blank. -== 在下方输入战队并留空名称即可添加战队 - -Offline friends and clanmates will appear here. -== 离线好友和战队会显示在这里 - -Edit touch controls -== 编辑触控设置 - -Close -== 关闭 - -Save changes -== 保存更改 - -Error saving touch controls -== 保存触控设置错误 - -Could not save touch controls to file. See local console for details. -== 无法将触控设置保存到文件。检查本地控制台以获取详情。 - -Unsaved changes -== 更改未保存 - -Discard changes -== 放弃更改 - -Are you sure that you want to discard the current changes to the touch controls? -== 确定要放弃当前对触控设置的更改吗? - -Are you sure that you want to reset the touch controls to default? -== 确定要将触控设置重置为默认设置吗? - -Import from clipboard -== 从剪贴板导入 - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== 您确定要从剪贴板导入触控设置吗?这将覆盖当前的触控设置。 - -Export to clipboard -== 导出到剪贴板 - -Direct touch input while ingame -== 游戏时直接触摸操作 - -[Direct touch input] -Disabled -== 禁用 - -[Direct touch input] -Active action -== 当前动作 - -[Direct touch input] -Aim -== 瞄准 - -[Direct touch input] -Fire -== 开火 - -[Direct touch input] -Hook -== 钩索 - -Direct touch input while spectating -== 旁观时直接触摸操作 - -Error loading touch controls -== 加载触控设置错误 - -Could not load touch controls from file. See local console for details. -== 无法从文件加载触控设置。检查本地控制台以获取详情。 - -Could not load default touch controls from file. See local console for details. -== 无法从文件加载默认触控设置。检查本地控制台以获取详情。 - -Could not load touch controls from clipboard. See local console for details. -== 无法从剪贴板加载触控设置。检查本地控制台以获取详情。 - -Width of your own hook collision line -== 自己的钩索辅助线宽度 - -Width of others' hook collision line -== 其他玩家的钩索辅助线宽度 - -Preview 'Hook collisions' being pressed -== 预览按下时的钩索辅助线 - -Aim -== 瞄准 - -Active: Fire -== 当前:开火 - -Active: Hook -== 当前:钩索 - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== "%s" 与 pnglite 不兼容,无法被旧版本 DDNet 加载 - -Loading background map -== 加载背景地图 - -[Spectating Camera Mode Icon] -AUTO -== 自动 - -Toggle auto camera -== 切换自动视角 - -https://wiki.ddnet.org/wiki/Touch_controls -== https://wiki.ddnet.org/wiki/Touch_controls/zh - -Show client IDs in name plates -== 显示客户端 ID - -Hook Strength -== 钩索强度 - -Size of hook strength icon and number indicator -== 钩索强度图标与数值的大小 - -Key Presses -== 按键显示 - -Size of key press icons -== 按键显示图标大小 - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== 服务器无法启动。请确保在应用程序设置中授予通知权限,以便服务器可以在后台运行。 diff --git a/data/languages/slovak.txt b/data/languages/slovak.txt deleted file mode 100644 index 6c2e0cb1e3..0000000000 --- a/data/languages/slovak.txt +++ /dev/null @@ -1,2074 +0,0 @@ -##### authors ##### -#originally created by: -# Limit and Petr -#modified by: -# LimiT 2011-07-02 20:24:44 -# dobrykafe 2024-09-29 00:00:00 -##### /authors ##### - -##### translated strings ##### - -%ds left -== zostáva %ds - -%i minute left -== %i zostávajúca minúta - -%i minutes left -== %i zostávajúcich minút - -%i second left -== %i zostávajúca sekunda - -%i seconds left -== %i zostávajúcich sekúnd - -%s wins! -== %s vyhráva! - -Abort -== Zrušiť - -Add -== Pridať - -Add Friend -== Pridať Priateľa - -Address -== Adresa - -All -== Všetkým - -Are you sure that you want to quit? -== Naozaj chcete ukončiť hru? - -Automatically record demos -== Automaticky nahrávať záznamy - -Automatically take game over screenshot -== Automaticky zaobstarať snímku obrazovky konca hry - -Blue team -== Modrý tím - -Blue team wins! -== Modrý tím vyhráva! - -Body -== Telo - -Call vote -== Hlasovať - -Change settings -== Zmeniť nastavenia - -Chat -== Chat - -Clan -== Klan - -Client -== Klient - -Connecting to -== Pripojujem sa k - -Connection Problems… -== Problémy s pripojením… - -Console -== Konzola - -Controls -== Ovládanie - -Count players only -== Nepočítať divákov - -Current -== Aktuálne - -Custom colors -== Vlastné farby - -Delete -== Vymazať - -Delete demo -== Vymazať záznam - -Demofile: %s -== Nahrávka: %s - -Demos -== Záznamy - -Disconnect -== Odpojiť - -Disconnected -== Prerušené spojenie - -Downloading map -== Sťahujem mapu - -Draw! -== Remíza! - -Dynamic Camera -== Dynamická kamera - -Emoticon -== Emotikon - -Error -== Chyba - -Error loading demo -== Problém s otvorením záznamu - -Favorite -== Obľúbený - -Favorites -== Obľúbené - -Feet -== Chodidlá - -Fire -== Streľba - -Folder -== Zložka - -Force vote -== Vynútiť hlasovanie - -Free-View -== Voľná Kamera - -Fullscreen -== Celá obrazovka - -Game -== Hra - -Game info -== Info o hre - -Game over -== Koniec hry - -Game type -== Herný typ - -Game types: -== Herné typy: - -General -== Hlavné - -Graphics -== Grafika - -Grenade -== Granátomet - -Hammer -== Kladivo - -Has people playing -== Nie je prázdny - -High Detail -== Detaily - -Hook -== Hák - -Invalid Demo -== Neplatný Záznam - -Join blue -== K modrým - -Join red -== K červeným - -Jump -== Skok - -Kick player -== Vyhodiť hráča - -Language -== Jazyk - -MOTD -== MOTD - -Map -== Mapa - -Move left -== Pohyb vľavo - -Move player to spectators -== Poslať hráča pozorovať - -Move right -== Pohyb vpravo - -Movement -== Pohyb - -Mute when not active -== Stlmiť pri neaktivite - -Name -== Meno - -Next weapon -== Ďalšia zbraň - -Nickname -== Prezývka - -No -== Nie - -No password -== Bez hesla - -No servers found -== Nenájdené žiadne servery - -No servers match your filter criteria -== Žiadny server nezodpovedá zadaným kritériám - -Ok -== Ok - -Parent Folder -== Nadradený Priečinok - -Password -== Heslo - -Password incorrect -== Nesprávne heslo - -Ping -== Ping - -Pistol -== Pištoľ - -Play background music -== Prehrať hudbu na pozadí - -Player -== Hráč - -Player country: -== Filter krajín: - -Players -== Hráči - -Please balance teams! -== Prosím vyrovnajte tímy! - -Prev. weapon -== Predošlá zbraň - -Quit -== Ukončiť - -Reason: -== Dôvod: - -Red team -== Červený tím - -Red team wins! -== Červený tím vyhráva! - -Remote console -== Vzdialená konzola - -Remove -== Odstrániť - -Remove friend -== Vymazať priateľa - -Rename demo -== Premenovať nahrávku - -Reset filter -== Obnoviť filter - -Score -== Skóre - -Score limit -== Limit skóre - -Scoreboard -== Tabuľka výsledkov - -Screenshot -== Screenshot - -Server address: -== Adresa servera: - -Server info -== Informácie - -Server not full -== Nie je plný - -Shotgun -== Brokovnica - -Show chat -== Ukázať chat - -Show friends only -== Ukázať priateľov - -Show ingame HUD -== Ukázať HUD - -Show name plates -== Zobrazovať menovky - -Sound -== Zvuk - -Sound error -== Zvuková chyba - -Spectate -== Pozorovať - -Spectate next -== Pozorovať ďalšieho - -Spectate previous -== Pozorovať predch. - -Spectator mode -== Mód diváka - -Spectators -== Diváci - -Stop record -== Nenahrávať - -Strict gametype filter -== Striktný filter módov - -Sudden Death -== Rýchla Smrť - -Switch weapon on pickup -== Nastavovať zdvíhanú zbraň ako aktuálnu - -Team -== Tímu - -Team chat -== Tímový chat - -The audio device couldn't be initialised. -== Zvukové zariadenie nemohlo byť inicializované. - -The server is running a non-standard tuning on a pure game type. -== Server používa neštandardné nastavenia na základnom hernom móde. - -Time limit -== Časový limit - -Time limit: %d min -== Časový limit: %d min - -Try again -== Skúsiť znovu - -Type -== Typ - -Unable to rename the demo -== Nahrávka sa nedá premenovať - -Use sounds -== Povoliť zvuky - -Use team colors for name plates -== Zafarbiť menovky podľa farieb tímov - -V-Sync -== V-Sync - -Version -== Verzia - -Vote command: -== Príkaz hlasu: - -Vote description: -== Popis hlasu: - -Vote no -== Nie - -Vote yes -== Áno - -Voting -== Hlasovanie - -Warmup -== Rozohrávka - -Weapon -== Zbrane - -Yes -== Áno - -You must restart the game for all settings to take effect. -== Zmeny sa prejavia po reštartovaní hry. - -##### needs translation ##### - -New name: -== Nové meno: - -Sat. -== Sat. - -Miscellaneous -== Ostatné - -Internet -== Internet - -Max demos -== Maximum nahrávok - -News -== Novinky - -Join game -== Hrať - -FSAA samples -== Anti-aliasing - -Sound volume -== Hlasitosť - -Max Screenshots -== Maximum obrázkov - -Laser -== Laser - -Hue -== Hue - -Record demo -== Nahrávať - -Your skin -== Váš skin - -Reset to defaults -== Vrátiť na pôvodné - -Lht. -== Lht. - -UI Color -== Farba prostredia - -Alpha -== Alpha - -LAN -== LAN - -Name plates size -== Veľkosť menoviek - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Inicializácia zlyhala. Skúste zmeniť gfx_backend na OpenGL alebo Vulkan v settings_ddnet.cfg v adresári s konfiguráciou a skúste to znova. - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== Nedostatok VRAM. Skúste odstrániť vlastné aktíva (skins, entity, atď.), najmä tie s vysokým rozlíšením. - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== Pri nahrávaní príkazu došlo k chybe. Skúste aktualizovať ovládače GPU. - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== Príkaz na vykreslenie zlyhal. Skúste aktualizovať ovládače GPU. - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== Odoslanie príkazov vykreslenia zlyhalo. Skúste aktualizovať ovládače GPU. - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== Zámena framebufferov zlyhala. Skúste aktualizovať ovládače GPU. - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Neznáma chyba. Skúste zmeniť gfx_backend na OpenGL alebo Vulkan v settings_ddnet.cfg v adresári s konfiguráciou a skúste to znova. - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== Nie je možné inicializovať daný grafický backend, vracia sa k východiskovému backendu. - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== Nie je možné inicializovať daný grafický backend, pravdepodobne preto, že ste nenainštalovali ovládač integrovanej grafickej karty. - -Could not save downloaded map. Try manually deleting this file: %s -== Stiahnutú mapu nie je možné uložiť. Skúste ručne zmazať tento súbor: %s - -Error playing demo -== Chyba prehrávania záznamu - -Successfully saved the replay! -== Záznam bol úspešne uložený! - -Failed saving the replay! -== Uloženie záznamu zlyhalo! - -Saving settings to '%s' failed -== Uloženie nastavenia do '%s' zlyhalo - -Error saving settings -== Pri ukladaní nastavení došlo k chybe - -Replay feature is disabled! -== Funkcia záznamov je zakázaná! - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== Šírka textúry %s nie je deliteľná %d alebo výška nie je deliteľná %d, čo môže spôsobiť vizuálne chyby. - -The format of texture %s is not RGBA which will cause visual bugs. -== Formát textúry %s nie je RGBA, čo spôsobí vizuálne chyby. - -Preparing demo playback -== Príprava prehrávania záznamu - -Connected -== Pripojené - -Loading map file from storage -== Načítanie súboru mapy z úložiska - -Loading DDNet Client -== Načítanie DDNet Klienta - -Why are you slowmo replaying to read this? -== Prečo prehrávate pomaly kvôli tomuto? - -Initializing components -== Inicializácia komponentov - -Initializing assets -== Inicializácia aktív - -Initializing map logic -== Inicializácia logiky mapy - -Sending initial client info -== Odoslanie prvotných informácií o klientovi - -Warning -== Varovanie - -Quitting. Please wait… -== Ukončovanie. Prosím, čakajte… - -Restarting. Please wait… -== Reštartovanie. Prosím, čakajte… - -Loading skin files -== Načítanie skin súborov - -Searching -== Hľadanie - -Enter Username -== Zadajte užívateľské meno - -Enter Password -== Zadajte heslo - -NOT CONNECTED -== NEPRIPOJENÉ - -Match %d of %d -== Zhoda %d z %d - -No results -== Žiadne výsledky - -Lines %d - %d (%s) -== Riadky %d – %d (%s) - -Locked -== Zamknuté - -Following -== Nasledovanie - -Loading commands… -== Načítanie príkazov… - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Režim ladenia povolený. Stlačením kláves Ctrl + Shift + D deaktivujte režim ladenia. - -Game paused -== Hra pozastavená - -Position: -== Pozícia: - -Speed: -== Rýchlosť: - -Angle: -== Uhol: - -Multi-View -== Multi-Pohľad - -Server best: -== Server rekord: - -Personal best: -== Osobný rekord: - -Team %d -== Tím %d - -Some map images could not be loaded. Check the local console for details. -== Niektoré obrázky mapy sa nepodarilo načítať. Podrobnosti nájdete v miestnej konzole. - -Uploading map data to GPU -== Nahrávanie dát máp do GPU - -Some map sounds could not be loaded. Check the local console for details. -== Niektoré zvuky mapy nemožno načítať. Podrobnosti nájdete v miestnej konzole. - -Loading menu themes -== Načítanie motívov menu - -Reset -== Resetovať - -Press a key… -== Stlač tlačidlo… - -Main menu -== Hlavné menu - -Browser -== Prehliadač - -Ghost -== Duch - -Settings -== Nastavenie - -Editor -== Editor - -Trying to determine UDP connectivity… -== Pokus o zistenie pripojenia UDP… - -UDP seems to be filtered. -== Zdá sa, že UDP je filtrovaný. - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== IP adresy UDP a TCP sa zdajú byť odlišné. Skúste deaktivovať VPN, proxy alebo sieťové akcelerátory. - -No answer from server yet. -== Zo servera zatiaľ žiadna odpoveď. - -Getting game info -== Získavanie informácií o hre - -Requesting to join the game -== Žiadosť o pripojenie do hry - -Reconnect in %d sec -== Opätovné pripojenie za %d sek - -Rename folder -== Premenovať zložku - -Render demo -== Vykresliť záznam - -Render complete -== Vykreslenie dokončené - -Restart -== Reštart - -Are you sure that you want to restart? -== Naozaj chcete reštartovať hru? - -Welcome to DDNet -== Vitajte na DDNete - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork je kooperatívna online hra, kde je cieľom pre vás a vašu skupinu dosiahnuť cieľovú čiaru mapy. Ako nováčik by ste mali začať na začínajúcich serveroch, ktoré hosťujú najjednoduchšie mapy. Zvážte ping a vyberte si server, ktorý je vám najbližšie. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Pomocou klávesy k sa zabijete (reštartujte), pomocou q pauznete a môžete sledovať ostatných hráčov. Otvorte nastavenie pre ďalšie klávesové skratky. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Pred pripojením k serveru sa odporúča skontrolovať nastavenia a upraviť ich podľa vašich predstáv. - -Please enter your nickname below. -== Nižšie zadajte svoju prezývku. - -Existing Player -== Existujúci hráč - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Vaša prezývka '%s' je už použitá (%d bodov). Chcete ju aj napriek tomu používať? - -Checking for existing player with your name -== Kontrola pre existujúceho hráča s vašim menom - -There's an unsaved map in the editor, you might want to save it. -== V editore je neuložená mapa, možno ju budete chcieť uložiť. - -Continue anyway? -== Napriek tomu pokračovať? - -A demo with this name already exists -== Záznam s týmto názvom už existuje - -A folder with this name already exists -== Zložka s týmto názvom už existuje - -Unable to rename the folder -== Zložku nemožno premenovať - -File '%s' already exists, do you want to overwrite it? -== Súbor '%s' už existuje, chcete ho prepísať? - -Replace video -== Nahradiť video - -(paused) -== (pozastavené) - -Speed -== Rýchlosť - -Video name: -== Názov videa: - -Videos directory -== Adresár videí - -Video was saved to '%s' -== Video bolo uložené do '%s' - -Join Tutorial Server -== Pripojiť sa k výukovému serveru - -Skip Tutorial -== Preskočiť výuku - -Show DDNet map finishes in server browser -== Zobraziť dokončenie DDNet máp v prehliadači servera - -transmits your player name to info.ddnet.org -== prenesie vaše meno hráča na info.ddnet.org - -Theme -== Téma - -Loading menu images -== Načítanie obrázkov menu - -AFR -== AFR - -ASI -== ASI - -AUS -== AUS - -EUR -== EUR - -NA -== NA - -SA -== SA - -CHN -== CHN - -Getting server list from master server -== Získavanie zoznamu serverov z hlavného servera - -Search -== Hľadať - -Exclude -== Vylúčiť - -%d of %d servers -== %d z %d serverov - -%d of %d server -== %d z %d servera - -%d players -== %d hráčov - -%d player -== %d hráč - -Are you sure that you want to disconnect and switch to a different server? -== Naozaj sa chcete odpojiť a presunúť na iný server? - -Filter connecting players -== Filtrovať pripájajúceho sa hráča - -Indicate map finish -== Indikovať dokončenie mapy - -Unfinished map -== Nedokončená mapa - -Countries -== Krajina - -Types -== Typy - -Communities -== Komunity - -Copy info -== Skopírovať info - -Leak IP -== Zobraziť IP - -No server selected -== Nie je vybraný žiadny server - -Online clanmates (%d) -== Online členovia klanu (%d) - -[friends (server browser)] -Offline (%d) -== Offline (%d) - -Click to select server. Double click to join your friend. -== Kliknutím vyberiete server. Dvojitým kliknutím sa pripojíte k priateľovi. - -Click to remove this player from your friends list. -== Kliknutím odoberiete tohto hráča zo zoznamu priateľov. - -Click to remove this clan from your friends list. -== Kliknutím odoberiete tento klan zo zoznamu priateľov. - -Are you sure that you want to remove the player '%s' from your friends list? -== Naozaj chcete odstrániť hráča '%s' zo zoznamu priateľov? - -Are you sure that you want to remove the clan '%s' from your friends list? -== Ste si istí, že chcete odstrániť klan '%s' zo svojho zoznamu priateľov? - -Add Clan -== Pridať Klan - -Server filter -== Filter servera - -Friends -== Priatelia - -Play the current demo -== Prehrať aktuálny záznam - -Pause the current demo -== Pozastaviť aktuálny záznam - -Stop the current demo -== Zastaviť aktuálny záznam - -Go back the specified duration -== Vrátiť sa o zadanú dobu - -[Demo player duration] -%d min. -== %d min. - -[Demo player duration] -%d sec. -== %d sec. - -Change the skip duration -== Zmeniť dobu preskočenia - -Go forward the specified duration -== Vpred o zadanú dobu trvania - -Go back one tick -== Vzad o jeden tick - -Go forward one tick -== Vpred o jeden tick - -Go back one marker -== Vzad o jeden marker - -Go forward one marker -== Vpred o jeden marker - -Slow down the demo -== Spomaliť záznam - -Speed up the demo -== Zrýchliť záznam - -Mark the beginning of a cut (right click to reset) -== Označiť začiatok rezu (pravý klik pre reset) - -Mark the end of a cut (right click to reset) -== Označiť koniec rezu (pravý klik pre reset) - -Export cut as a separate demo -== Exportovať rez ako samostatný záznam - -Close the demo player -== Zavrieť prehrávač záznamov - -Toggle keyboard shortcuts -== Prepnúť klávesové skratky - -Export demo cut -== Exportovať rez záznamu - -Cut interval -== Interval rezu - -Cut length -== Dĺžka rezu - -Remove chat -== Odobrať chat - -Render cut to video -== Vykresliť rez do videa - -Please use a different filename -== Použite prosím iný názov súboru - -File already exists, do you want to overwrite it? -== Súbor už existuje, chcete ho prepísať? - -Loading demo files -== Načítanie záznamov - -All combined -== Všetko dohromady - -Demo -== Záznam - -Length -== Dĺžka - -Date -== Dátum - -No demo selected -== Nie je vybraný žiadny záznam - -Folder Link -== Odkaz na zložku - -Created -== Vytvorené - -Markers -== Markery - -Netversion -== Netversion - -Size -== Veľkosť - -[Demo details] -map not included -== mapa nie je súčasťou - -%.2f MiB -== %.2f MiB - -%.2f KiB -== %.2f KiB - -Fetch Info -== Načítať informácie - -Demos directory -== Adresár záznamov - -Open the directory that contains the demo files -== Otvorte adresár, ktorý obsahuje súbory so záznamami - -Are you sure that you want to delete the folder '%s'? -== Ste si istí, že chcete zmazať zložku '%s'? - -Are you sure that you want to delete the demo '%s'? -== Ste si istí, že chcete zmazať záznam '%s'? - -Delete folder -== Zmazať zložku - -Unable to delete the demo '%s' -== Nie je možné zmazať záznam '%s' - -Unable to delete the folder '%s'. Make sure it's empty first. -== Nie je možné zmazať zložku '%s'. Najprv sa uistite, že je prázdna. - -Are you sure that you want to disconnect? -== Ste si istí, že sa chcete odpojiť? - -Connect Dummy -== Pripojiť dummyho - -Connecting dummy -== Pripájanie dummyho - -Disconnect Dummy -== Odpojiť Dummyho - -Are you sure that you want to disconnect your dummy? -== Ste si istí, že chcete odpojiť svojho dummyho? - -Kill -== Zabiť - -Pause -== Pauza - -Loading… -== Načítanie… - -Loading ghost files -== Načítanie súborov duchov - -Time -== Čas - -Ghosts directory -== Adresár duchov - -Activate all -== Aktivovať všetko - -Deactivate all -== Deaktivovať všetko - -Deactivate -== Deaktivovať - -Activate -== Aktivovať - -Save -== Uložiť - -Menu opened. Press Esc key again to close menu. -== Ponuka otvorená. Stlačením klávesy Esc ponuku zatvorte. - -Smooth Dynamic Camera -== Hladká dynamická kamera - -Switch weapon when out of ammo -== Zmeniť zbraň keď vám dôjdu náboje - -Skip the main menu -== Preskočiť hlavnú ponuku - -Refresh Rate -== Obnovovacia frekvencia - -Save power by lowering refresh rate (higher input latency) -== Šetriť energiu znížením obnovovacej frekvencie (vyššia vstupná odozva) - -Settings file -== Súbor s nastavením - -Open the settings file -== Otvoriť súbor s nastavením - -Config directory -== Adresár s konfiguráciou - -Open the directory that contains the configuration and user files -== Otvoriť adresár, ktorý obsahuje konfiguračné a užívateľské súbory - -Themes directory -== Adresár tém - -Open the directory to add custom themes -== Pre pridanie vlastných motívov otvorte adresár - -Automatically take statboard screenshot -== Automaticky zaobstarať snímku obrazovky statboardu - -Automatically create statboard csv -== Automaticky vytvoriť statboard csv - -Max CSVs -== Maximálny počet CSV - -Dummy -== Dummy - -Download skins -== Sťahovať skiny - -Download community skins -== Sťahovať komunitné skiny - -Vanilla skins only -== Iba vanilla skiny - -Fat skins (DDFat) -== Tučné skiny (DDFat) - -Skin prefix -== Skin predpona - -Create a random skin -== Vytvoriť náhodný skin - -Choose default eyes when joining a server -== Vybrať predvolené oči po pripojení k serveru - -Skin Database -== Databáza skinov - -Skins directory -== Adresár skinov - -Open the directory to add custom skins -== Pre pridanie vlastných skinov otvorte adresár - -Hook collisions -== Kolízia Háku - -Zoom in -== Priblížiť - -Zoom out -== Oddialiť - -Default zoom -== Predvolené zväčšenie - -Show others -== Ukázať ostatných - -Show all -== Ukázať všetkých - -Toggle dyncam -== Prepnúť dyncam - -Toggle ghost -== Prepnúť ducha - -Converse -== Konverzovať - -Chat command -== Chat príkaz - -Toggle dummy -== Prepnúť dummyho - -Dummy copy -== Dummy kopírovať - -Hammerfly dummy -== Dummy hammerfly - -Statboard -== Statboard - -Lock team -== Zamknúť tím - -Show entities -== Zobraziť entity - -Show HUD -== Zobraziť HUD - -Enable controller -== Povoliť ovládač - -Controller -== Ovládač - -Ingame controller mode -== Režim ovládača v hre - -[Ingame controller mode] -Relative -== Relatívny - -[Ingame controller mode] -Absolute -== Absolútny - -Ingame controller sens. -== Citlivosť ovládača v hre - -UI controller sens. -== Citlivosť ovládača v menu - -Controller jitter tolerance -== Tolerancia nervozity ovládača - -No controller found. Plug in a controller. -== Nebol nájdený žiadny ovládač. Zapojte ovládač. - -Axis -== Os - -Status -== Status - -Aim bind -== Bind mierenie - -Mouse -== Myš - -Ingame mouse sens. -== Citlivosť myši v hre - -UI mouse sens. -== Citlivosť myši v menu - -Reset controls -== Resetovať ovládanie - -Are you sure that you want to reset the controls to their defaults? -== Naozaj chcete obnoviť predvolené nastavenia ovládania? - -Cancel -== Zrušiť - -Windowed -== V okne - -Windowed borderless -== V okne bez okrajov - -Windowed fullscreen -== Celá obrazovka v okne - -Desktop fullscreen -== Celá obrazovka plochy - -Screen -== Obrazovka - -may cause delay -== môže spôsobiť oneskorenie - -Allows maps to render with more detail -== Umožňuje vykresľovať mapy s väčšími detailmi - -Use high DPI -== Použiť vysoké DPI - -Renderer -== Renderer - -default -== predvolené - -custom -== vlastné - -Graphics card -== Grafická karta - -auto -== auto - -Enable game sounds -== Povoliť zvuky hry - -Enable gun sound -== Povoliť zvuk zbrane - -Enable long pain sound (used when shooting in freeze) -== Povoliť zvuk dlhej bolesti (používa sa pri strieľaní v zmrazení) - -Enable server message sound -== Povoliť zvuk správ servera - -Enable regular chat sound -== Povoliť zvuk normálneho chatu - -Enable team chat sound -== Povoliť zvuk tímového chatu - -Enable highlighted chat sound -== Povoliť zvuk zvýraznenej správy - -Game sound volume -== Hlasitosť zvuku hry - -Chat sound volume -== Hlasitosť zvuku chatu - -Map sound volume -== Hlasitosť zvuku mapy - -Background music volume -== Hlasitosť hudby na pozadí - -Appearance -== Vzhľad - -DDNet -== DDNet - -Assets -== Aktíva - -DDNet Client needs to be restarted to complete update! -== Na dokončenie aktualizácie je nutné reštartovať klienta DDNet! - -HUD -== HUD - -Name Plate -== Menovka - -Hook Collisions -== Kolízia Háku - -Info Messages -== Informačné Správy - -Show health, shields and ammo -== Zobraziť zdravie, štíty a muníciu - -Show score -== Zobraziť skóre - -Show local time always -== Vždy zobrazovať miestny čas - -Show votes window after voting -== Zobraziť okno hlasovania po odhlasovaní - -DDRace HUD -== DDRace HUD - -Show DDRace HUD -== Zobraziť DDRace HUD - -Show jumps indicator -== Zobraziť indikátor skoku - -Show dummy actions -== Zobraziť akcie dummyho - -Show player position -== Zobraziť pozíciu hráča - -Show player speed -== Zobraziť rýchlosť hráča - -Show player target angle -== Zobraziť cieľový uhol hráča - -Show freeze bars -== Zobraziť freeze bary - -Opacity of freeze bars inside freeze -== Nepriehľadnosť freeze barov vo vnútri freeze - -Show names in chat in team colors -== Zobraziť mená v chate v tímových farbách - -Show only chat messages from friends -== Zobraziť iba správy od priateľov - -Use old chat style -== Použiť starý štýl chatu - -Chat font size -== Veľkosť písma chatu - -Chat width -== Šírka chatu - -Messages -== Správy - -System message -== Systémová správa - -Highlighted message -== Zvýraznená správa - -Team message -== Tímová správa - -Friend message -== Správa od priateľa - -Normal message -== Normálna správa - -Client message -== Správa klienta - -Preview -== Náhľad - -Show clan above name plates -== Ukázať klan nad menom - -Clan plates size -== Veľkosť menoviek klanu - -Show other players' key presses -== Zobraziť stlačenie klávesov ostatných hráčov - -Show local player's key presses -== Zobraziť stlačenie kláves miestnych hráčov - -Authed name color in scoreboard -== Farba overeného hráča vo výsledkovej tabuľke - -Same clan color in scoreboard -== Farba rovnakého klanu vo výsledkovej tabuľke - -Hook collision line -== Čiara kolízie háku - -Show other players' hook collision lines -== Zobraziť čiaru kolízie hákov ostatných hráčov - -Hook collision line opacity -== Nepriehľadnosť čiary kolízie háku - -Colors of the hook collision line, in case of a possible collision with: -== Farby čiary kolízie háku v prípade kolízie s: - -Your movements are not taken into account when calculating the line colors -== Váš pohyb sa pri výpočte farieb čiar neberie do úvahy - -Nothing hookable -== Nič na zaháknutie - -Something hookable -== Niečo na zaháknutie - -A Tee -== Hráč - -Show kill messages -== Zobraziť správy o zabití - -Show finish messages -== Zobraziť správy o dokončení - -Normal Color -== Normálna Farba - -Highlight Color -== Zvýraznená farba - -Weapons -== Zbrane - -Rifle Laser Outline Color -== Vonkajšia Farba Lasera Pušky - -Rifle Laser Inner Color -== Vnútorná Farba Lasera Pušky - -Shotgun Laser Outline Color -== Vonkajšia Farba Lasera Brokovnice - -Shotgun Laser Inner Color -== Vnútorná Farba Lasera Brokovnice - -Entities -== Entity - -Door Laser Outline Color -== Vonkajšia Farba Lasera Dverí - -Door Laser Inner Color -== Vnútorná Farba Lasera Dverí - -Freeze Laser Outline Color -== Vonkajšia Farba Freeze Lasera - -Freeze Laser Inner Color -== Vnútorná Farba Freeze Lasera - -Set all to Rifle -== Nastaviť všetko podľa Pušky - -Save the best demo of each race -== Ukladať najlepší záznam každého závodu - -Enable replays -== Povoliť záznamy - -Default length -== Predvolená dĺžka - -Enable ghost -== Povoliť ducha - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Po prekročení štartovej čiary ukázať ducha, ktorý kopíruje pohyby vášho najlepšieho času - -Show ghost -== Ukázať ducha - -Opacity -== Nepriehľadnosť - -Save ghost -== Uložiť ducha - -Only save improvements -== Ukladať iba vylepšenia - -Gameplay -== Hrateľnosť - -Overlay entities -== Prekrytie entít - -Show text entities -== Zobraziť textové entity - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Nepriehľadnosť entít patriacich iným tímom ako sú hráči a menovky - -Show others (own team only) -== Zobraziť ostatné (len vlastný tím) - -Show quads -== Zobraziť quads - -Quads are used for background decoration -== Quads sa používajú na dekoráciu pozadia - -AntiPing -== AntiPing - -Tries to predict other entities to give a feel of low latency -== Snaží sa predpovedať iné entity, aby navodil pocit nízkej odozvy - -AntiPing: predict other players -== AntiPing: predvídanie ostatných hráčov - -AntiPing: predict weapons -== AntiPing: predvídanie zbraní - -AntiPing: predict grenade paths -== AntiPing: predvídanie ciest granátov - -Background -== Pozadie - -Regular background color -== Bežná farba pozadia - -Entities background color -== Farba pozadia entít - -Use current map as background -== Použiť aktuálnu mapu ako pozadie - -Show tiles layers from BG map -== Zobraziť vrstvy dlaždíc z BG mapy - -New random timeout code -== Nový náhodný timeout kód - -Run on join -== Spustiť po pripojení - -Chat command (e.g. showall 1) -== Chat príkaz (napr. showall 1) - -Unregister protocol and file extensions -== Odregistrovať protokol a prípony súborov - -DDNet %s is available: -== DDNet %s je k dispozícii: - -Update now -== Aktualizovať teraz - -Updating… -== Aktualizácia… - -DDNet Client updated! -== DDNet Klient aktualizovaný! - -No updates available -== Nie sú k dispozícii žiadne aktualizácie - -Check now -== Skontrolovať teraz - -Emoticons -== Emotikony - -Particles -== Častice - -Extras -== Extra - -Loading assets -== Načítanie aktív - -Assets directory -== Adresár aktív - -Open the directory to add custom assets -== Pre pridanie vlastných aktív otvorte adresár - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -Learn -== Učiť sa - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ - -Tutorial -== Výuka - -Can't find a Tutorial server -== Nie je možné nájsť Výukový server - -Website -== Web stránka - -Stop server -== Zastaviť server - -Run server -== Spustiť server - -Server executable not found, can't run server -== Spustiteľný súbor servera nebol nájdený, server sa nedá spustiť - -[Start menu] -Play -== Hrať - -DDNet %s is out! -== DDNet %s je vonku! - -Downloading %s: -== Sťahovanie %s: - -Update failed! Check log… -== Aktualizácia zlyhala! Skontrolujte log… - -Loading race demo files -== Načítanie záznamov závodov - -Super -== Super - -Manual -== Manuál - -Race -== Závod - -Auto -== Auto - -Replay -== Záznam - -Loading sound files -== Načítanie zvukových súborov - -Follow -== Nasledovať - -Frags -== Fragy - -Deaths -== Smrti - -Suicides -== Samovraždy - -Ratio -== Pomer - -Net -== Net - -FPM -== FPM - -Spree -== Riadenie - -Best -== Najlepšie - -Grabs -== Chytenie - -1 new mention -== 1 nová zmienka - -%d new mentions -== %d nových zmienok - -9+ new mentions -== 9+ nových zmienok - -Moved ingame -== Presunutý v hre - -Loading demo file from storage -== Načítanie súboru záznamu z úložiska - -No login required -== Bez prihlásenia - -Player info change cooldown -== Cooldown zmeny informácií o hráči - -Always show chat -== Vždy zobraziť chat - -Show friend mark (♥) in name plates -== Zobraziť značku priateľa (♥) v menovkách - -Show hook strength icon indicator -== Zobraziť silu háku pomocou ikony - -Show hook strength number indicator -== Zobraziť silu háku pomocou čísla - -Show own player's hook collision line -== Zobraziť čiaru kolízie háku vlastného hráča - -Always show own player's hook collision line -== Vždy zobraziť čiaru kolízie háku vlastného hráča - -Always show other players' hook collision lines -== Vždy zobraziť čiaru kolízie hákov ostatných hráčov - -%d/%d KiB (%.1f KiB/s) -== %d/%d KiB (%.1f KiB/s) - -Tee -== Tee - -Show only chat messages from team members -== Zobraziť iba správy od členov tímu - -Could not resolve connect address '%s'. See local console for details. -== Nie je možné získať adresu na pripojenie '%s'. Podrobnosti nájdete v miestnej konzole. - -Connect address error -== Chyba v adrese na pripojenie - -Could not connect dummy -== Nepodarilo sa pripojiť dummyho - -[Spectating] -Following %s -== Sledujete %s - -Example of usage -== Príklad použitia - -Dummy is not allowed on this server -== Dummy nie je na tomto serveri povolený - -Please wait… -== Čakajte prosím… - -Show client IDs (scoreboard, chat, spectator) -== Zobraziť ID klientov (výsledková tabuľka, chat, divák) - -Are you sure that you want to delete '%s'? -== Ste si istí, že chcete zmazať '%s'? - -Delete skin -== Odstrániť skin - -Basic -== Základné - -Custom -== Vlastné - -Unable to delete skin -== Nedá sa odstrániť skin - -Round %d/%d -== Kolo %d/%d - -[Spectators] -%d others… -== %d ďalších… - -[Team and size] -%d\n(%d/%d) -== %d\n(%d/%d) - -Team %d (%d/%d) -== Tím %d (%d/%d) - -https://wiki.ddnet.org/wiki/Mapping -== https://wiki.ddnet.org/wiki/Mapping - -Save skin -== Uložiť skin - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== Naozaj chcete uložiť svoj skin? Ak skin s týmto názvom už existuje, bude nahradený. - -Unable to save the skin -== Nie je možné uložiť skin - -Unable to save the skin with a reserved name -== Nie je možné uložiť skin s rezervovaným názvom - -No local servers found (ports %d-%d) -== Žiadny miestny server nenájdený (porty %d-%d) - -[Hertz] -Hz -== Hz - -[skins] -Body -== Telo - -[skins] -Marking -== Značenie - -[skins] -Decoration -== Dekorácia - -[skins] -Hands -== Ruky - -[skins] -Feet -== Chodidlá - -[skins] -Eyes -== Oči - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Some fonts could not be loaded. Check the local console for details. -== - -Loading background map -== - -[Spectating Camera Mode Icon] -AUTO -== - -Online friends (%d) -== - -Add friends by entering their name below or by clicking their name in the player list. -== - -Add clanmates by entering their clan below and leaving the name blank. -== - -Offline friends and clanmates will appear here. -== - -Toggle auto camera -== - -Edit touch controls -== - -Close -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Save changes -== - -Error saving touch controls -== - -Could not save touch controls to file. See local console for details. -== - -Unsaved changes -== - -Discard changes -== - -Are you sure that you want to discard the current changes to the touch controls? -== - -Are you sure that you want to reset the touch controls to default? -== - -Import from clipboard -== - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== - -Export to clipboard -== - -Direct touch input while ingame -== - -[Direct touch input] -Disabled -== - -[Direct touch input] -Active action -== - -[Direct touch input] -Aim -== - -[Direct touch input] -Fire -== - -[Direct touch input] -Hook -== - -Direct touch input while spectating -== - -Error loading touch controls -== - -Could not load touch controls from file. See local console for details. -== - -Could not load default touch controls from file. See local console for details. -== - -Could not load touch controls from clipboard. See local console for details. -== - -Show client IDs in name plates -== - -Hook Strength -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Width of your own hook collision line -== - -Width of others' hook collision line -== - -Preview 'Hook collisions' being pressed -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== - -Aim -== - -Active: Fire -== - -Active: Hook -== diff --git a/data/languages/spanish.txt b/data/languages/spanish.txt deleted file mode 100644 index 6f1f6e0be9..0000000000 --- a/data/languages/spanish.txt +++ /dev/null @@ -1,2092 +0,0 @@ -##### authors ##### -#originally created by: -# ReGnuM -#modified by: -# Ninja Style 2011-04-06 23:22:06 -# Alexandre 2011-07-11 11:30:00 -# GaBOr 2011-07-15 01:23:39 -# HeroiAmarelo 2012-08-01 15:52:45 -# Mortcheck 2012-11-03 22:58:43 -# FeaRZ 2020-07-07 12:09:00 -# Ryozuki 2020-07-09 12:06:00 -# Headshot 2020-11-07 12:40:00 -# Headshot 2021-05-30 17:00:00 -# Deëivid! 2021-10-27 00:49:00 -# Deëivid! 2022-02-05 21:53:00 -# Deëivid! 2022-03-27 18:40:00 -# Deëivid! 2022-05-13 18:44:00 -# Deëivid! 2022-06-22 19:26:00 -# Deëivid! 2022-07-05 22:30:00 -# Deëivid! 2022-10-08 19:20:00 -# Deëivid! 2023-01-05 21:05:00 -# Deëivid! 2023-02-26 00:35:00 -# Deëivid! 2023-05-22 19:54:00 -# Deëivid! 2023-07-01 22:52:00 -##### /authors ##### - -##### translated strings ##### - -%ds left -== %ds restantes - -%i minute left -== %i minuto restante - -%i minutes left -== %i minutos restantes - -%i second left -== %i segundo restante - -%i seconds left -== %i segundos restantes - -%s wins! -== ¡%s gana! - -Abort -== Cancelar - -Add -== Añadir - -Add Friend -== Añadir amigo - -Address -== Dirección - -All -== Todos - -Are you sure that you want to quit? -== ¿Estás seguro de que quieres salir? - -Automatically record demos -== Grabar demos automáticamente - -Automatically take game over screenshot -== Captura de pantalla al final de la partida - -Blue team -== Equipo azul - -Blue team wins! -== ¡El equipo azul gana! - -Body -== Cuerpo - -Call vote -== Votar - -Change settings -== Cambiar configuración - -Chat -== Chat - -Clan -== Clan - -Client -== Cliente - -Connecting to -== Conectando con - -Connection Problems… -== Problemas de conexión… - -Console -== Consola - -Controls -== Controles - -Count players only -== Solo contar jugadores - -Current -== Actual - -Custom colors -== Colores personalizados - -Delete -== Borrar - -Delete demo -== Borrar demo - -Demofile: %s -== Archivo: %s - -Demos -== Demos - -Disconnect -== Desconectar - -Disconnected -== Desconectado - -Downloading map -== Descargando mapa - -Draw! -== ¡Empate! - -Dynamic Camera -== Cámara dinámica - -Emoticon -== Emoticon - -Error -== Error - -Error loading demo -== Error al cargar la demo - -Favorite -== Favorito - -Favorites -== Favoritos - -Feet -== Pies - -Fire -== Disparar - -Folder -== Carpeta - -Force vote -== Forzar - -Free-View -== Vista libre - -Fullscreen -== Pantalla completa - -Game -== Juego - -Game info -== Información del juego - -Game over -== Fin de la partida - -Game paused -== Juego en Pausa - -Game type -== Modo - -Game types: -== Tipos de juego: - -General -== General - -Graphics -== Gráficos - -Grenade -== Granada - -Hammer -== Martillo - -Has people playing -== Hay gente jugando - -High Detail -== Más detalles (HD) - -Hook -== Gancho - -Invalid Demo -== Demo inválida - -Join blue -== Unirse al azul - -Join red -== Unirse al rojo - -Jump -== Saltar - -Kick player -== Expulsar jugador - -Language -== Idioma - -MOTD -== MOTD - -Map -== Mapa - -Move left -== Mover a la izquierda - -Move player to spectators -== Mover jugador a espectadores - -Move right -== Mover a la derecha - -Movement -== Movimiento - -Mute when not active -== Silenciar si no está activo - -Name -== Nombre - -Next weapon -== Arma siguiente - -Nickname -== Apodo - -No -== No - -No password -== Sin contraseña - -No servers found -== Ningún servidor encontrado - -No servers match your filter criteria -== Ningún servidor corresponde a los criterios de filtrado - -Ok -== Aceptar - -Parent Folder -== Carpeta principal - -Password -== Contraseña - -Password incorrect -== Contraseña incorreta - -Ping -== Ping - -Pistol -== Pistola - -Play background music -== Reproducir música de fondo - -Player -== Jugador - -Player country: -== País del jugador - -Players -== Jugadores - -Please balance teams! -== Por favor, ¡equilibrad los equipos! - -Prev. weapon -== Arma anterior - -Quit -== Salir - -Reason: -== Motivo: - -Red team -== Equipo rojo - -Red team wins! -== ¡El equipo rojo gana! - -Remote console -== Consola remota - -Remove -== Eliminar - -Remove friend -== Eliminar amigo - -Rename demo -== Renombrar demo - -Reset filter -== Resetear filtro - -Score -== Puntos - -Score limit -== Límite puntos - -Scoreboard -== Puntuación - -Screenshot -== Captura de pantalla - -Server address: -== IP del servidor: - -Server info -== Servidor - -Server not full -== Servidor sin llenar - -Shotgun -== Escopeta - -Show chat -== Mostrar chat - -Show friends only -== Solo mostrar amigos - -Show ingame HUD -== Mostrar HUD durante el juego - -Show name plates -== Mostrar apodos - -Show only chat messages from friends -== Recibir mensajes solo de amigos - -Sound -== Sonido - -Sound error -== Error de sonido - -Spectate -== Asistir - -Spectate next -== Observar siguiente - -Spectate previous -== Observar anterior - -Spectator mode -== Modo espectador - -Spectators -== Espectadores - -Stop record -== Detener grabación - -Strict gametype filter -== Filtro de tipo de juego estricto - -Sudden Death -== Muerte súbita - -Switch weapon on pickup -== Cambiar al arma recogida - -Team -== Equipo - -Team chat -== En equipo - -The audio device couldn't be initialised. -== El dispositivo de audio no pudo ser inicializado. - -The server is running a non-standard tuning on a pure game type. -== El servidor está ejecutando una configuración no estándar en un tipo de juego puro. - -Time limit -== Tiempo límite - -Time limit: %d min -== Tiempo límite: %d minutos - -Try again -== Intentar de nuevo - -Type -== Tipo - -Unable to rename the demo -== No se pudo renombrar la demo - -Use sounds -== Usar sonidos - -Use team colors for name plates -== Usar el color de equipo en los apodos - -V-Sync -== V-Sync - -Version -== Versión - -Vote command: -== Comando de votación: - -Vote description: -== Descripción de la votación: - -Vote no -== Votar no - -Vote yes -== Votar sí - -Voting -== Votación - -Warmup -== Calentamiento - -Weapon -== Arma - -Yes -== Sí - -You must restart the game for all settings to take effect. -== Debes reiniciar el juego para que los cambios tengan efecto. - -##### needs translation ##### - -New name: -== Nuevo nombre: - -Sat. -== Sat. - -Miscellaneous -== Miscelánea - -Internet -== Internet - -Max demos -== Número máximo de demos - -News -== Noticias - -Join game -== Unirse - -FSAA samples -== Muestras FSAA - -Sound volume -== Volumen del sonido - -Max Screenshots -== Número máximo de capturas - -Laser -== Láser - -Hue -== Matiz - -Record demo -== Grabar demo - -Your skin -== Tu skin - -Reset to defaults -== Resetear por defecto - -Lht. -== Lum. - -UI Color -== Color de menú - -Alpha -== Transp. - -LAN -== LAN - -Name plates size -== Tamaño de la fuente de los apodos - -Successfully saved the replay! -== ¡Repetición guardada con éxito! - -Replay feature is disabled! -== ¡La función de repetición está desactivada! - -Server best: -== Mejor del servidor: - -Personal best: -== Mejor personal: - -Learn -== Aprender - -Browser -== Navegador - -Ghost -== Fantasma - -Loading DDNet Client -== Cargando el cliente DDNet - -Reconnect in %d sec -== Reconectando en %d seg - -Render demo -== Renderizar demo - -Replace video -== Reemplazar video - -File already exists, do you want to overwrite it? -== El archivo ya existe, ¿quieres sobrescribirlo? - -Are you sure that you want to disconnect? -== ¿Estás seguro de que quieres desconectarte? - -Disconnect Dummy -== Desconectar Dummy - -Are you sure that you want to disconnect your dummy? -== ¿Estás seguro de que quieres desconectar tu dummy? - -Welcome to DDNet -== Bienvenido a DDNet - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork es un juego cooperativo en línea donde el objetivo es que tú y vuestro grupo de tees lleguen a la meta del mapa. Como recién llegado, deberías comenzar en los servidores Novice, que alojan los mapas más fáciles. Considera el ping para elegir un servidor cercano. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Se recomienda que verifiques la configuración para ajustarla a tu gusto antes de unirte a un servidor. - -Please enter your nickname below. -== Por favor, introduzca su apodo a continuación. - -Video name: -== Nombre del video: - -Show DDNet map finishes in server browser -== Marcar los mapas DDNet acabados en el navegador de servidores - -transmits your player name to info.ddnet.org -== transmite tu nombre de jugador a info.ddnet.org - -Search -== Buscar - -Exclude -== Excluir - -Filter connecting players -== Filtrar jugadores conectándose - -Indicate map finish -== Indicar mapa acabado - -Unfinished map -== Mapa inacabado - -Countries -== Países - -Types -== Tipos - -DDNet %s is out! -== ¡DDNet %s ya está disponible! - -Downloading %s: -== Descargando %s: - -Update failed! Check log… -== ¡Actualización fallida! Comprueba el registro… - -DDNet Client updated! -== ¡Cliente DDNet actualizado! - -Update now -== Actualizar ahora - -Restart -== Reiniciar - -Remove chat -== Eliminar chat - -%.2f MiB -== %.2f MiB - -%.2f KiB -== %.2f KiB - -Demo -== Demo - -Markers -== Marcadores - -Length -== Duración - -Date -== Fecha - -Fetch Info -== Obtener info. - -Connecting dummy -== Conectando dummy - -Connect Dummy -== Conectar Dummy - -Deactivate -== Desactivar - -Activate -== Activar - -Save -== Guardar - -Switch weapon when out of ammo -== Cambiar de arma cuando se acabe la munición - -Show clan above name plates -== Mostrar el clan por encima de los nombres - -Clan plates size -== Tamaño de la fuente del clan - -Refresh Rate -== Frecuencia de actualización - -Automatically take statboard screenshot -== Tomar automáticamente la captura de pantalla del Statboard - -Automatically create statboard csv -== Crear automáticamente el csv del Statboard - -Max CSVs -== CSV máx - -Vanilla skins only -== Solo skins Vanilla - -Fat skins (DDFat) -== Skins Obesas (DDFat) - -Skin prefix -== Prefijo de skin - -Hook collisions -== Colisiones del gancho - -Pause -== Pausa - -Kill -== Matar - -Zoom in -== Acercar - -Zoom out -== Alejar - -Default zoom -== Zoom predeterm. - -Show others -== Mostrar otros - -Show all -== Mostrar todo - -Toggle dyncam -== Alt. cámara dinámica - -Toggle dummy -== Alternar dummy - -Toggle ghost -== Alternar fantasma - -Dummy copy -== Copiar dummy - -Hammerfly dummy -== Hammerfly dummy - -Converse -== Conversar - -Statboard -== Statboard - -Lock team -== Bloquear equipo - -Show entities -== Mostrar entidades - -Show HUD -== Mostrar HUD - -may cause delay -== puede causar retraso - -Screen -== Pantalla - -Use high DPI -== Usar DPI alto - -Enable game sounds -== Habilitar sonidos del juego - -Enable gun sound -== Habilitar sonido de pistola - -Enable long pain sound (used when shooting in freeze) -== Habilitar el sonido de dolor prolongado (se usa al disparar estando congelado) - -Enable server message sound -== Habilitar el sonido para mensajes del servidor - -Enable regular chat sound -== Habilitar sonido del chat normal - -Enable team chat sound -== Habilitar el sonido del chat del equipo - -Enable highlighted chat sound -== Habilitar sonido de chat resaltado - -Map sound volume -== Vol. del sonido del mapa - -HUD -== Apariencia - -DDNet -== DDNet - -DDNet Client needs to be restarted to complete update! -== ¡El Cliente DDNet debe reiniciarse para completar la actualización! - -Show score -== Mostrar puntaje - -Show names in chat in team colors -== Mostrar nombres con colores de equipo en el chat - -Show kill messages -== Mostrar mensajes de muerte - -Show votes window after voting -== Mostrar ventana de votos después de votar - -Messages -== Mensajes - -System message -== Mensaje del sistema - -Reset -== Reiniciar - -Highlighted message -== Mensaje resaltado - -Team message -== Mensaje del equipo - -Friend message -== Mensaje de un amigo - -Normal message -== Mensaje normal - -Save the best demo of each race -== Guardar la mejor demo de cada carrera - -Default length -== Duración predeterminada - -Enable replays -== Habilitar repeticiones - -Show ghost -== Mostrar fantasma - -Save ghost -== Guardar fantasma - -Gameplay -== Gameplay - -Overlay entities -== Entidades superpuestas - -Size -== Tamaño - -Show text entities -== Mostrar entidades de texto - -Show others (own team only) -== Mostrar otros (solo equipo propio) - -Show quads -== Mostrar quads - -AntiPing -== AntiPing - -AntiPing: predict other players -== AntiPing: predecir otros jugadores - -AntiPing: predict weapons -== AntiPing: predecir armas - -AntiPing: predict grenade paths -== AntiPing: predecir recorrido de granadas - -Show other players' hook collision lines -== Mostrar las líneas de colisión de gancho de otros jugadores - -Show other players' key presses -== Mostrar las pulsaciones de teclas de otros jugadores - -Show tiles layers from BG map -== Mostrar capas de tiles del mapa de fondo - -DDNet %s is available: -== DDNet %s está disponible: - -Updating… -== Actualizando… - -No updates available -== No hay actualizaciones disponibles - -Check now -== Chequear - -New random timeout code -== Nuevo código de timeout aleatorio - -Time -== Tiempo - -Follow -== Seguir - -Frags -== Asesinatos - -Deaths -== Muertes - -Suicides -== Suicidios - -Ratio -== K/D - -Net -== Ventaja - -FPM -== APM - -Spree -== Racha - -Best -== Mejor - -Grabs -== Banderas - -1 new mention -== 1 nueva mención - -%d new mentions -== %d nuevas menciones - -9+ new mentions -== 9+ nuevas menciones - -Warning -== Advertencia - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Modo debug activado. Pulsa Ctrl+Shift+D para desactivarlo. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Usa la tecla K para suicidarte (reiniciar), Q para pausar y ver a otros jugadores. Mira la configuración para otras teclas. - -Existing Player -== Este jugador ya existe - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Tu nombre '%s' ya está usado (%d puntos). ¿Deseas seguir usándolo? - -Checking for existing player with your name -== Comprobando si ya existe un jugador con tu nombre - -Speed -== Velocidad - -Theme -== Tema - -%d of %d servers -== %d de %d servidores - -%d of %d server -== %d de %d servidor - -%d players -== %d jugadores - -%d player -== %d jugador - -Demos directory -== Directorio de demos - -Smooth Dynamic Camera -== Cámara dinámica suave - -Skip the main menu -== Saltar el menú principal - -Themes directory -== Directorio de temas - -Download skins -== Descargar skins - -Skin Database -== Base de datos de skins - -Skins directory -== Directorio de skins - -Game sound volume -== Vol. del sonido del juego - -Chat sound volume -== Vol. del sonido del chat - -Background music volume -== Vol. de la música de fondo - -Assets -== Recursos - -Use old chat style -== Usar estilo antiguo del chat - -Client message -== Mensaje de cliente - -Use current map as background -== Usar mapa actual como fondo - -Entities -== Entidades - -Emoticons -== Emoticones - -Particles -== Partículas - -Assets directory -== Directorio de recursos - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/wiki/Main_Page/es - -Website -== Página web - -Settings -== Configuración - -Stop server -== Detener servidor - -Run server -== Iniciar servidor - -Server executable not found, can't run server -== Ejecutable del servidor no encontrado. No se puede iniciar el servidor - -Editor -== Editor - -[Start menu] -Play -== Jugar - -Manual -== Manual - -Race -== Carrera - -Auto -== Auto - -Replay -== Repetición - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== El ancho de la textura %s no es divisible por %d, o el alto no es divisible por %d, lo que puede causar errores visuales. - -AFR -== AFR - -ASI -== ASI - -AUS -== AUS - -EUR -== EUR - -NA -== NA - -SA -== SA - -CHN -== CHN - -Getting server list from master server -== Obteniendo lista de servidores del servidor maestro - -Leak IP -== Filtrar tu IP - -Chat command -== Comando de chat - -Dummy -== Dummy - -Windowed -== En ventana - -Windowed borderless -== Ventana sin bordes - -Desktop fullscreen -== Pantalla completa de escritorio - -Preview -== Vista previa - -Background -== Fondo - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -Are you sure that you want to disconnect and switch to a different server? -== ¿Seguro que quieres desconectarte y cambiar de servidor? - -Show local player's key presses -== Mostrar las teclas presionadas por el jugador local - -Settings file -== Archivo de configuraciones - -Config directory -== Directorio de configuración - -Run on join -== Ejec. al entrar - -Chat command (e.g. showall 1) -== Comando de chat (Ej. showall 1) - -The format of texture %s is not RGBA which will cause visual bugs. -== El formato de la textura %s no es RGBA, lo que puede causar errores visuales. - -Join Tutorial Server -== Ir a un servidor Tutorial - -Skip Tutorial -== Saltar Tutorial - -Windowed fullscreen -== Ventana a pantalla completa - -Renderer -== Renderizador - -default -== por defecto - -custom -== personalizado - -auto -== auto. - -Tutorial -== Tutorial - -Can't find a Tutorial server -== No se pudo encontrar un servidor Tutorial - -Choose default eyes when joining a server -== Escoge los ojos predeterminados al unirte a un servidor - -Allows maps to render with more detail -== Permite que los mapas tengan más detalles - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Cuando cruzas la línea de inicio, se muestra un tee fantasma replicando los movimientos de tu mejor tiempo - -Opacity -== Opacidad - -Quads are used for background decoration -== Las quads se usan para la decoración del fondo - -Tries to predict other entities to give a feel of low latency -== Intenta predecir a otras entidades para dar una sensación de baja latencia - -Super -== Súper - -Team %d -== Equipo %d - -Position: -== Posición: - -Speed: -== Velocidad: - -Angle: -== Ángulo: - -Trying to determine UDP connectivity… -== Tratando de determinar la conexión UDP… - -UDP seems to be filtered. -== UDP parece estar filtrado. - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== Las direcciones IP TCP y UDP parecen ser diferentes. Intenta desactivar cualquier VPN, proxy o acelerador de red. - -No answer from server yet. -== Aún no hay respuesta del servidor. - -Download community skins -== Descargar skins de la comunidad - -Enable controller -== Habilitar mando - -[Ingame controller mode] -Relative -== Relativo - -[Ingame controller mode] -Absolute -== Absoluto - -Ingame controller mode -== Modo del mando - -Ingame controller sens. -== Sens. del mando en el juego - -UI controller sens. -== Sens. del mando en el menú - -Controller jitter tolerance -== Tolerancia a la fluctuación del mando - -Status -== Estado - -Aim bind -== Apuntar - -Mouse -== Ratón - -Ingame mouse sens. -== Sens. del ratón en el juego - -UI mouse sens. -== Sens. del ratón en el menú - -Controller -== Mando - -Show dummy actions -== Mostrar acciones del dummy - -Show freeze bars -== Mostrar barras de freeze - -Show player position -== Mostrar la posición del jugador - -Show player speed -== Mostrar la velocidad del jugador - -Show player target angle -== Mostrar el ángulo de la mira del jugador - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Ajusta la opacidad de entidades pertenecientes a otros equipos, como los tees y los nombres. - -Opacity of freeze bars inside freeze -== Opacidad de las barras de freeze dentro del freeze - -Normal Color -== Color normal - -Highlight Color -== Color resaltado - -Extras -== Extras - -Preparing demo playback -== Preparando la reproducción de la demo - -Connected -== Conectado - -Loading map file from storage -== Cargando archivo de mapa desde el almacenamiento - -Why are you slowmo replaying to read this? -== ¿Por qué lo reproduces a cámara lenta para leer esto? - -Initializing components -== Inicializando componentes - -Initializing assets -== Inicializando recursos - -Initializing map logic -== Inicializando lógica de mapa - -Sending initial client info -== Enviando información inicial del cliente - -Uploading map data to GPU -== Cargando datos del mapa a la GPU - -Getting game info -== Obteniendo información de la partida - -Requesting to join the game -== Solicitando unión a la partida - -Loading menu images -== Cargando imágenes del menú - -Play the current demo -== Reproducir la demo actual - -Pause the current demo -== Pausar la demo actual - -Stop the current demo -== Detener la demo actual - -Slow down the demo -== Ralentizar la demo - -Speed up the demo -== Acelerar la demo - -Export cut as a separate demo -== Exportar corte como una demo diferente - -Toggle keyboard shortcuts -== Alternar atajos de teclado - -Loading demo files -== Cargando archivos de demos - -Menu opened. Press Esc key again to close menu. -== Menú abierto. Presiona la tecla Esc otra vez para cerrarlo. - -Loading ghost files -== Cargando archivos de fantasma - -Loading skin files -== Cargando archivos de skins - -Appearance -== Apariencia - -Name Plate -== Nombres - -Hook Collisions -== Colisiones del gancho - -Show health, shields and ammo -== Mostrar salud, escudos y munición - -DDRace HUD -== HUD DDRace - -Show DDRace HUD -== Mostrar el HUD DDRace - -Show jumps indicator -== Mostrar indicador de saltos - -Hook collision line -== Línea de colisión del gancho - -Hook collision line opacity -== Opacidad de la lína de colisión del gancho - -Colors of the hook collision line, in case of a possible collision with: -== Colores de la línea de colisión del gancho, en el posible caso de que colisione con: - -Your movements are not taken into account when calculating the line colors -== Tus movimientos no cuentan al calcular los colores de la línea - -Nothing hookable -== Nada enganchable - -Something hookable -== Algo enganchable - -A Tee -== Un Tee - -Weapons -== Armas - -Rifle Laser Outline Color -== Color externo del Láser de Rifle - -Rifle Laser Inner Color -== Color interno del Láser de Rifle - -Shotgun Laser Outline Color -== Color externo del Láser de la Escopeta - -Shotgun Laser Inner Color -== Color interno del Láser de la Escopeta - -Door Laser Outline Color -== Color externo de las Puertas Láser - -Door Laser Inner Color -== Color interno de las Puertas Láser - -Freeze Laser Outline Color -== Color externo del Láser Congelante - -Freeze Laser Inner Color -== Color interno del Láser Congelante - -Set all to Rifle -== Usar todos como el Rifle - -Loading assets -== Cargando recursos - -Loading race demo files -== Cargando archivos de demos de carreras - -Loading sound files -== Cargando archivos de sonido - -Cancel -== Cancelar - -File '%s' already exists, do you want to overwrite it? -== El archivo '%s' ya existe, ¿quieres sobrescribirlo? - -Are you sure that you want to remove the player '%s' from your friends list? -== ¿Estás seguro de que quieres quitar al jugador '%s' de tu lista de amigos? - -Are you sure that you want to remove the clan '%s' from your friends list? -== ¿Estás seguro de que quieres quitar al clan '%s' de tu lista de amigos? - -Go back one tick -== Retroceder un tick - -Go forward one tick -== Avanzar un tick - -Go back one marker -== Retroceder un marcador - -Go forward one marker -== Avanzar un marcador - -Are you sure that you want to delete the demo '%s'? -== ¿Estás seguro de que quieres eliminar la demo '%s'? - -Unable to delete the demo '%s' -== No se pudo eliminar la demo '%s' - -Reset controls -== Restablecer controles - -Are you sure that you want to reset the controls to their defaults? -== ¿Estás seguro de que quieres restablecer a los controles predeterminados? - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Error durante la iniciación. Intenta cambiar gfx_backend a OpenGL o Vulkan desde settings_ddnet.cfg en la carpeta de configuraciones e inténtalo otra vez. - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== La VRAM se ha llenado. Intenta quitar recursos personalizados (skins, entidades, etc.), especialmente los de resolución alta. - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== Ocurrió un error durante la grabación de comandos. Intenta actualizar los controladores de tu GPU. - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== Un comando de renderización falló. Intenta actualizar los controladores de tu GPU. - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== Error al enviar los comandos de renderización. Intenta actualizar los controladores de tu GPU. - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== Error al intercambiar búferes de fotogramas. Intenta actualizar los controladores de tu GPU. - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Error desconocido. Intenta cambiar gfx_backend a OpenGL o Vulkan desde settings_ddnet.cfg en el directorio de configuraciones e inténtalo otra vez. - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== No se pudo inicializar el backend de gráficos dado, volviendo al backend predeterminado. - -Open the directory that contains the demo files -== Abrir la carpeta que contiene los archivos de demo - -Save power by lowering refresh rate (higher input latency) -== Ahorra energía al reducir la frecuencia de actualización (mayor latencia de entrada) - -Open the settings file -== Abrir el archivo de configuraciones - -Open the directory that contains the configuration and user files -== Abrir la carpeta que contiene las configuraciones y archivos del usuario - -Open the directory to add custom themes -== Abrir la carpeta para agregar temas personalizados - -Open the directory to add custom skins -== Abrir la carpeta para agregar skins personalizadas - -No controller found. Plug in a controller. -== No se encontró un mando. Conecta uno. - -Unregister protocol and file extensions -== Anular registro de protocolo y extensiones de archivo - -Open the directory to add custom assets -== Abrir la carpeta para agregar recursos personalizados - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== No se pudo inizializar el backend de gráficos dado, probablemente debido a que los controladores de la tarjeta gráfica integrada no están instalados. - -Could not save downloaded map. Try manually deleting this file: %s -== No se pudo almacenar el mapa descargado. Intenta eliminar este archivo manualmente: %s - -Copy info -== Copiar información - -Create a random skin -== Crear skin aleatoria - -Online clanmates (%d) -== Compañeros de clan en línea (%d) - -[friends (server browser)] -Offline (%d) -== Desconectados (%d) - -Click to select server. Double click to join your friend. -== Haz clic para seleccionar el servidor. Doble clic para unirte a tu amigo. - -Click to remove this player from your friends list. -== Haz clic para quitar este jugador de tu lista de amigos. - -Click to remove this clan from your friends list. -== Haz clic para quitar este clan de tu lista de amigos. - -Add Clan -== Agregar clan - -A demo with this name already exists -== Ya existe una demo con este nombre - -No server selected -== Ningún servidor seleccionado - -Mark the beginning of a cut (right click to reset) -== Marcar el inicio de un corte (clic derecho para restablecer) - -Mark the end of a cut (right click to reset) -== Marcar el final de un corte (clic derecho para restablecer) - -Close the demo player -== Cerrar el reproductor de demos - -Export demo cut -== Exportar corte de la demo - -Cut interval -== Intervalo del corte - -Cut length -== Largo del corte - -Axis -== Eje - -Graphics card -== Tarjeta gráfica - -Quitting. Please wait… -== Saliendo. Por favor, espera… - -Restarting. Please wait… -== Reiniciando. Por favor, espera… - -Multi-View -== Vista Múltiple - -Rename folder -== Renombrar carpeta - -A folder with this name already exists -== Ya existe una carpeta con este nombre - -Unable to rename the folder -== No se pudo renombrar la carpeta - -(paused) -== (en pausa) - -All combined -== Todo combinado - -Folder Link -== Enlace de la carpeta - -Are you sure that you want to delete the folder '%s'? -== ¿Seguro que quieres eliminar la carpeta '%s'? - -Delete folder -== Eliminar carpeta - -Unable to delete the folder '%s'. Make sure it's empty first. -== No se pudo eliminar la carpeta '%s'. Asegúrate de que esté vacía primero. - -Moved ingame -== Movido dentro del juego - -Go back the specified duration -== Retroceder el tiempo especificado - -[Demo player duration] -%d min. -== %d min. - -[Demo player duration] -%d sec. -== %d seg. - -Change the skip duration -== Cambiar duración del salto - -Go forward the specified duration -== Adelantar el tiempo especificado - -Render cut to video -== Renderizar corte a vídeo - -Error playing demo -== Error al reproducir la demo - -Some map images could not be loaded. Check the local console for details. -== Algunas imágenes de mapas no se pudieron cargar. Revisa la consola local para más detalles. - -Some map sounds could not be loaded. Check the local console for details. -== Algunos sonidos de mapas no se pudieron cargar. Revisa la consola local para más detalles. - -Loading menu themes -== Cargando temas del menú - -Render complete -== Renderización completada - -Videos directory -== Carpeta de videos - -Video was saved to '%s' -== El video guardó en '%s' - -No demo selected -== Ninguna demo seleccionada - -Created -== Creado - -Netversion -== Netversion - -[Demo details] -map not included -== mapa no incluido - -Ghosts directory -== Carpeta de Fantasmas - -Activate all -== Activar todo - -Deactivate all -== Desactivar todo - -Enable ghost -== Habilitar fantasma - -Only save improvements -== Solo guardar las mejoras - -Regular background color -== Color del fondo normal - -Entities background color -== Color del fondo de entidades - -Saving settings to '%s' failed -== No se pudo guardar la configuración en '%s' - -Searching -== Buscando - -Enter Username -== Ingresa tu usuario - -Enter Password -== Ingresa tu contraseña - -NOT CONNECTED -== SIN CONECTAR - -Match %d of %d -== Coincidencia %d de %d - -No results -== Sin resultados - -Lines %d - %d (%s) -== Líneas %d - %d (%s) - -Locked -== Bloqueado - -Following -== Siguiendo - -Press a key… -== Presiona una tecla… - -Are you sure that you want to restart? -== ¿Estás seguro de que quieres reiniciar? - -There's an unsaved map in the editor, you might want to save it. -== Hay un mapa sin guardar en el editor, quizás quieras guardarlo antes. - -Continue anyway? -== ¿Continuar de todos modos? - -Communities -== Comunidades - -Please use a different filename -== Por favor, usa un nombre de archivo diferente. - -Info Messages -== Mensajes de información - -Show local time always -== Mostrar la hora local siempre - -Chat font size -== Tamaño de la fuente del chat - -Chat width -== Ancho del chat - -Authed name color in scoreboard -== Color de usuario autorizado en la tabla de puntuación - -Same clan color in scoreboard -== Color de tu clan en la tabla de puntuación - -Show finish messages -== Mostrar mensajes de llegada de meta - -Failed saving the replay! -== ¡No se pudo guardar la repetición! - -Error saving settings -== Error al guardar los ajustes - -Loading commands… -== Cargando comandos… - -Main menu -== Menú principal - -Server filter -== Filtro de servidor - -Friends -== Amigos - -Loading… -== Cargando… - -Loading demo file from storage -== Cargando archivo de demo desde el almacenamiento - -No login required -== No requiere login - -Player info change cooldown -== Tiempo para cambiar la información del jugador - -Always show chat -== Siempre mostrar chat - -Show friend mark (♥) in name plates -== Mostrar marca de amigos (♥) en los nombres - -Show hook strength icon indicator -== Mostrar indicador de fuerza del gancho - -Show hook strength number indicator -== Mostrar número indicador de fuerza del gancho - -Show own player's hook collision line -== Mostrar la línea de colisión del gancho del jugador local - -Always show own player's hook collision line -== Siempre mostrar la línea de colisión del gancho del jugador local - -Always show other players' hook collision lines -== Siempre mostrar la línea de colisión del gancho de otros jugadores - -%d/%d KiB (%.1f KiB/s) -== %d/%d KiB (%.1f KiB/s) - -Tee -== Tee - -Show only chat messages from team members -== Mostrar solo los mensajes de miembros del equipo - -[Spectating] -Following %s -== Viendo a %s - -Example of usage -== Ejemplo de uso - -Round %d/%d -== Ronda %d/%d - -[Spectators] -%d others… -== otros %d - -[Team and size] -%d\n(%d/%d) -== %d\n(%d/%d) - -Team %d (%d/%d) -== Equipo %d (%d/%d) - -https://wiki.ddnet.org/wiki/Mapping -== https://wiki.ddnet.org/wiki/Mapping/es - -Could not resolve connect address '%s'. See local console for details. -== No se pudo resolver la dirección de conexión '%s'. Ver la consola local para más detalles. - -Connect address error -== Error de dirección de conexión - -Could not connect dummy -== No se pudo conectar tu dummy - -Dummy is not allowed on this server -== No se permiten dummys en este servidor - -Please wait… -== Espera por favor… - -Show client IDs (scoreboard, chat, spectator) -== Mostrar IDs de cliente (scoreboard, chat, espectador) - -Are you sure that you want to delete '%s'? -== ¿Estás seguro de que quieres eliminar '%s'? - -Delete skin -== Eliminar skin - -Basic -== Básico - -Custom -== Personalizado - -Unable to delete skin -== No se pudo borrar la skin - -Save skin -== Guardar skin - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== ¿Estás seguro de que quieres guardar tu skin? Si una skin con este nombre ya existe, esta será reemplazada. - -Unable to save the skin -== No se pudo guardar la skin - -Unable to save the skin with a reserved name -== No se pudo guardar la skin con un nombre reservado - -No local servers found (ports %d-%d) -== No se encontraron servidores locales (puertos %d-%d) - -[Hertz] -Hz -== Hz - -[skins] -Body -== Cuerpo - -[skins] -Marking -== Marcas - -[skins] -Decoration -== Decoración - -[skins] -Hands -== Manos - -[skins] -Feet -== Pies - -[skins] -Eyes -== Ojos - -Some fonts could not be loaded. Check the local console for details. -== No se pudieron cargar algunas fuentes. Revisa la consola local para más detalles. - -Online friends (%d) -== Amigos en línea (%d) - -Add friends by entering their name below or by clicking their name in the player list. -== Agrega amigos ingresando su nombre aquí abajo o haciendo clic en su nombre en la lista de jugadores. - -Add clanmates by entering their clan below and leaving the name blank. -== Agrega compañeros de clan ingresando el nombre del clan aquí abajo y dejando el campo del nombre en blanco. - -Offline friends and clanmates will appear here. -== Tus amigos y compañeros de clan que estén desconectados aparecerán aquí. - -Edit touch controls -== Editar controles táctiles - -Close -== Cerrar - -Save changes -== Guardar cambios - -Error saving touch controls -== Error al guardar los controles táctiles - -Could not save touch controls to file. See local console for details. -== No se pudieron guardar los controles táctiles. Revisa la consola local para más detalles - -Unsaved changes -== Cambios sin guardar - -Discard changes -== Descartar cambios - -Are you sure that you want to discard the current changes to the touch controls? -== ¿Estás seguro de que quieres descartar los cambios actuales a los controles táctiles? - -Are you sure that you want to reset the touch controls to default? -== ¿Estás seguro de que quieres restablecer los controles táctiles a su configuración predeterminada? - -Import from clipboard -== Importar desde el portapapeles - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== ¿Estás seguro de que quieres importar los controles táctiles desde el portapapeles? Esto sobreescribirá tus controles táctiles actuales. - -Export to clipboard -== Exportar al portapapeles - -Direct touch input while ingame -== Entrada táctil directa dentro del juego - -[Direct touch input] -Disabled -== Desactivado - -[Direct touch input] -Active action -== Acción activa - -[Direct touch input] -Aim -== Apuntar - -[Direct touch input] -Fire -== Disparar - -[Direct touch input] -Hook -== Gancho - -Direct touch input while spectating -== Entrada táctil directa en espectador - -Error loading touch controls -== Error al cargar los controles táctiles - -Could not load touch controls from file. See local console for details. -== No se pudieron cargar los controles táctiles desde el archivo. Revisa la consola local para más detalles. - -Could not load default touch controls from file. See local console for details. -== No se pudieron cargar los controles táctiles predeterminados desde el archivo. Revisa la consola local para más detalles. - -Could not load touch controls from clipboard. See local console for details. -== No se pudieron cargar los controles táctiles desde el portapapeles. Revisa la consola local para más detalles. - -Width of your own hook collision line -== Ancho de tu propia línea de colisión del gancho - -Width of others' hook collision line -== Ancho de la línea de colisión del gancho de los demás - -Preview 'Hook collisions' being pressed -== Vista previa al presionar 'Colisiones de gancho' - -Aim -== Apuntar - -Active: Fire -== Activo: Disparar - -Active: Hook -== Activo: Gancho - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Loading background map -== - -[Spectating Camera Mode Icon] -AUTO -== - -Toggle auto camera -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Show client IDs in name plates -== - -Hook Strength -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== diff --git a/data/languages/swedish.txt b/data/languages/swedish.txt deleted file mode 100644 index a92a022f17..0000000000 --- a/data/languages/swedish.txt +++ /dev/null @@ -1,2076 +0,0 @@ -##### authors ##### -#originally created by: -# matricks -#modified by: -# Martin Pola 2011-04-02 11:17:09 -# Kottizen 2011-07-02 00:34:54 -# 3edcxzaq1 2020-06-25 00:00:00 -# cur.ie 2020-09-28 00:00:00 -# simpygirl 2022-02-20 00:00:00 -# furo 2024-12-04 00:00:00 -##### /authors ##### - -##### translated strings ##### - -%ds left -== %d sekunder kvar - -%i minute left -== %i minut kvar - -%i minutes left -== %i minuter kvar - -%i second left -== %i sekund kvar - -%i seconds left -== %i sekunder kvar - -%s wins! -== %s vinner! - -Abort -== Avbryt - -Add -== Lägg till - -Add Friend -== Lägg till kompis - -Address -== Adress - -All -== Alla - -Are you sure that you want to quit? -== Är du säker på att du vill avsluta? - -Automatically record demos -== Spela in demon automatiskt - -Automatically take game over screenshot -== Ta skärmdumpar vid matchslut - -Blue team -== Blå laget - -Blue team wins! -== Blå laget vann! - -Body -== Kropp - -Call vote -== Röstning - -Change settings -== Ändra inställningar - -Chat -== Chatt - -Clan -== Klan - -Client -== Klient - -Connecting to -== Ansluter till - -Connection Problems… -== Anslutningsproblem… - -Console -== Konsol - -Controls -== Kontroller - -Count players only -== Räkna endast spelare - -Current -== Nuvarande - -Custom colors -== Egna färger - -Delete -== Ta bort - -Delete demo -== Ta bort demo - -Demofile: %s -== Demofil: %s - -Demos -== Demon - -Disconnect -== Avsluta - -Disconnected -== Frånkopplad - -Downloading map -== Laddar ner karta - -Draw! -== Oavgjort! - -Dynamic Camera -== Dynamisk kamera - -Emoticon -== Känsloikon - -Error -== Fel - -Error loading demo -== Kunde inte ladda demot - -Favorite -== Favorit - -Favorites -== Favoriter - -Feet -== Fötter - -Fire -== Skjuta - -Folder -== Mapp - -Force vote -== Tvinga omröstning - -Free-View -== Friläge - -Fullscreen -== Fullskärm - -Game -== Spel - -Game info -== Spelinfo - -Game over -== Slutspelat - -Game type -== Speltyp - -Game types: -== Speltyper: - -General -== Generellt - -Graphics -== Grafik - -Grenade -== Granater - -Hammer -== Hammare - -Has people playing -== Inte tom - -High Detail -== Extra detaljer - -Hook -== Hook - -Invalid Demo -== Ogiltig demo - -Join blue -== Spela i blått - -Join red -== Spela i rött - -Jump -== Hoppa - -Kick player -== Kicka spelare - -Language -== Språk - -MOTD -== Meddelande - -Map -== Bana - -Move left -== Gå vänster - -Move player to spectators -== Flytta till åskådarna - -Move right -== Gå höger - -Movement -== Förflyttning - -Mute when not active -== Stäng av ljudet när spelet inte är aktivt - -Name -== Namn - -Next weapon -== Nästa vapen - -Nickname -== Smeknamn - -No -== Nej - -No password -== Inget lösenord - -No servers found -== Inga servrar hittade - -No servers match your filter criteria -== Inga servrar matchar dina filterkriterer - -Ok -== Ok - -Parent Folder -== Uppliggande mapp - -Password -== Lösenord - -Password incorrect -== Felaktigt lösenord - -Ping -== Ping - -Pistol -== Pistol - -Play background music -== Aktivera bakgrundsmusik - -Player -== Spelare - -Player country: -== Land - -Players -== Spelare - -Please balance teams! -== Balansera lagen! - -Prev. weapon -== Föregående vapen - -Quit -== Avsluta - -Reason: -== Anledning: - -Red team -== Röda laget - -Red team wins! -== Röda laget vann! - -Remote console -== Serverkonsol - -Remove -== Ta bort - -Remove friend -== Ta bort kompis - -Rename demo -== Byt namn på demo - -Reset filter -== Nollställ filter - -Score -== Poäng - -Score limit -== Poängmål - -Scoreboard -== Poänglista - -Screenshot -== Skärmdump - -Server address: -== Serveradress - -Server info -== Serverinfo - -Server not full -== Lediga platser - -Shotgun -== Hagelgevär - -Show chat -== Visa chatten - -Show friends only -== Visa kompisar - -Show ingame HUD -== Visa HUD i spel - -Show name plates -== Visa namnskyltar - -Sound -== Ljud - -Sound error -== Ljudfel - -Spectate -== Åskåda - -Spectate next -== Se på nästa - -Spectate previous -== Se på föregående - -Spectator mode -== Åskådarläge - -Spectators -== Åskådare - -Stop record -== Sluta spela in - -Strict gametype filter -== Strikt speltypsfilter - -Sudden Death -== Sudden Death - -Switch weapon on pickup -== Byt vapen vid anskaffning - -Team -== Lag - -Team chat -== Lagchatt - -The audio device couldn't be initialised. -== Ljudet kunde inte startas - -The server is running a non-standard tuning on a pure game type. -== Denna server kör inte standardinställningar på en reserverad speltyp. - -Time limit -== Tidsbegränsning - -Time limit: %d min -== Tidsgräns: %d min - -Try again -== Försök igen - -Type -== Typ - -Unable to rename the demo -== Kunde inte byta namn på demot - -Use sounds -== Aktivera ljudeffekter - -Use team colors for name plates -== Använd lagfärger i namnskyltar - -V-Sync -== V-Synk - -Version -== Version - -Vote command: -== Omröstningskommando: - -Vote description: -== Beskrivning: - -Vote no -== Rösta nej - -Vote yes -== Rösta ja - -Voting -== Röstning - -Warmup -== Uppvärmning - -Weapon -== Vapen - -Yes -== Ja - -You must restart the game for all settings to take effect. -== Du måste starta om spelet för att ändringarna skall verkställas. - -New name: -== Nytt namn: - -Sat. -== Mättnad - -Miscellaneous -== Övrigt - -Internet -== Internet - -Max demos -== Max antal demon - -News -== Nyheter - -Join game -== Spela - -FSAA samples -== FSAA-samplingar - -Sound volume -== Volym - -Max Screenshots -== Max antal skärmdumpar - -Laser -== Gevär - -Hue -== Nyans - -Record demo -== Spela in demo - -Your skin -== Ditt skin - -Reset to defaults -== Nollställ till standard - -Lht. -== Ljusstyrka - -UI Color -== Gränssnittfärg - -Alpha -== Alpha - -LAN -== LAN - -Name plates size -== Storlek på namnskyltar - -Vanilla skins only -== Bara vanilla skins - -New random timeout code -== Ny slumpad timeout kod - -Enable long pain sound (used when shooting in freeze) -== Aktivera ett långt ont ljud (använt vid sjutning i freeze) - -Default zoom -== Standard zoom - -Dummy copy -== Dummy kopiering - -Show tiles layers from BG map -== Visa tiles lager från BG bana - -Statboard -== Poänglista - -Show kill messages -== Visa döds meddelanden - -Reset -== Nollställ - -DDNet -== DDNet - -Suicides -== Självmord - -Show entities -== Visa entities - -Ratio -== Förhållande - -Render demo -== Rendera demo - -Activate -== Aktivera - -Deaths -== Döda - -Show all -== Visa alla - -Indicate map finish -== Indikera bana avklarning - -Map sound volume -== Bana ljudvolym - -Reconnect in %d sec -== Återkopplar om %d sekunder - -Successfully saved the replay! -== Lyckades med att spara repris! - -Save ghost -== Spara spöken - -Browser -== Bläddraren - -Default length -== Standard längd - -Switch weapon when out of ammo -== Byt vapen vid slut av ammunition - -Show clan above name plates -== Visa klan över namnskylt - -HUD -== HUD - -Replay feature is disabled! -== Repris funktionen är inaktiverad! - -Types -== Typer - -Enable server message sound -== Aktivera server meddelande ljud - -Show votes window after voting -== Visa röstnings fönster efter röstning - -DDNet Client needs to be restarted to complete update! -== DDNet Klienten behövs startas om för att genomföra uppdateringen! - -Kill -== Dö - -Personal best: -== Personligt bästa: - -Show DDNet map finishes in server browser -== Visa DDNet bana avklarningar i server bläddraren - -transmits your player name to info.ddnet.org -== skickar ditt spel namn till info.ddnet.org - -9+ new mentions -== 9+ nya nämningar - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork är ett kooperativ online spel där målet är för dig och en grupp av tees att nå banas mål. Som en nykomling, så borde du starta på Novice serverna, vilket har bara de enklaste banorna. Kom ihåg att använda ping till att välja en server som är nära dig. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Det är rekommenderad att du kollar igenom inställningarna och ändra dem, så de passar dig innan du ansluter till en server. - -Please enter your nickname below. -== Skriv ditt smeknamn nedanför. - -Are you sure that you want to disconnect? -== Är du säker på att du vill koppla ifrån? - -Grabs -== Grabs - -Ghost -== Spöke - -Zoom out -== Zooma ut - -Enable highlighted chat sound -== Aktivera betonad chatt ljud - -Deactivate -== Avaktivera - -Welcome to DDNet -== Välkommen till DDNet - -Use high DPI -== Använd hög DPI - -may cause delay -== kan orsaka fördröjning - -AntiPing -== AntiPing - -Messages -== Meddelanden - -Time -== Tid - -Filter connecting players -== Filtrera spelare som ansluter - -Enable game sounds -== Aktivera spel ljud - -Max CSVs -== Max CSVs - -Zoom in -== Zooma in - -Update failed! Check log… -== Updatering misslyckades! Kolla logg… - -%d new mentions -== %d nya nämningar - -Check now -== Kolla nu - -Search -== Sök - -FPM -== FPM - -System message -== System meddelande - -DDNet %s is available: -== DDNet %s har släppts: - -Markers -== Markeringar - -Connecting dummy -== Ansluter dummy - -Exclude -== Excludera - -AntiPing: predict other players -== AntiPing: predicera andra spelare - -Show text entities -== Visa text entities - -Show ghost -== Visa spöke - -1 new mention -== 1 ny nämning - -Are you sure that you want to disconnect your dummy? -== Är du säker att du vill koppla ifrån din dummy? - -Overlay entities -== Overlay entities - -Date -== Datum - -Show other players' hook collision lines -== Visa andra spelares hook kollisions linjer - -Fetch Info -== Hämta Info - -Normal message -== Normalt meddelande - -Show score -== Visa poäng - -Refresh Rate -== Uppdateringsfrekvens - -Learn -== Wiki - -No updates available -== Inga updateringar tillgängliga - -%.2f MiB -== %.2f MiB - -Follow -== Följ - -Restart -== Starta om - -Hammerfly dummy -== Hammerfly dummy - -Remove chat -== Ta bort chatt - -Enable team chat sound -== Aktivera lag chatt ljud - -Disconnect Dummy -== Koppla ifrån dummy - -Replace video -== Ersätt video - -Server best: -== Serverns bästa: - -Friend message -== Vän meddelande - -Toggle dummy -== Växla dummy - -Fat skins (DDFat) -== Feta skins (DDFat) - -Net -== Nät - -Demo -== Demo - -Show only chat messages from friends -== Visa bara chatt meddelanden från kompisar - -DDNet Client updated! -== DDNet Klienten uppdaterades! - -Converse -== Konversera - -Enable replays -== Aktivera repris - -Countries -== Länder - -Video name: -== Video namn: - -Enable gun sound -== Aktivera vapen ljud - -Downloading %s: -== Hämtar %s: - -Lock team -== Lås laget - -%.2f KiB -== %.2f KiB - -Screen -== Skärm - -Toggle dyncam -== Växla dyncam - -Save -== Spara - -AntiPing: predict grenade paths -== Antiping: predicera granat väg - -Best -== Bäst - -Updating… -== Uppdaterar… - -Clan plates size -== Klanskylt storlek - -Size -== Storlek - -Save the best demo of each race -== Spara den bästa demot av varje race - -Frags -== Frags - -DDNet %s is out! -== DDNet %s har släppts! - -Highlighted message -== Betona meddelande - -AntiPing: predict weapons -== AntiPing: predicera vapen - -Length -== Längd - -Skin prefix -== Skin prefix - -Game paused -== Spel pausad - -Automatically take statboard screenshot -== Automatiskt ta skärmdumpar av poänglistan - -Automatically create statboard csv -== Automatiskt skapa poänglista csv - -Enable regular chat sound -== Aktivera vanligt chatt ljud - -Show other players' key presses -== Visa andra spelares tangent tryck - -Gameplay -== Spelet - -Loading DDNet Client -== Laddar DDNet Klienten - -Show HUD -== Visa HUD - -Pause -== Pausa - -Spree -== Spree - -Show others -== Visa andra - -Unfinished map -== Oavklarad bana - -Show quads -== Visa quads - -Show names in chat in team colors -== Visa namn in chatten med lagets färger - -Update now -== Uppdatera nu - -Toggle ghost -== Växla spöke - -Team message -== Lag meddelande - -File already exists, do you want to overwrite it? -== Filen finns redan, vill du skriva över den? - -Hook collisions -== Hook kollisioner - -Connect Dummy -== Anslut Dummy - -Show others (own team only) -== Visa andra (eget lag endast) - -Warning -== Varning - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Använd knappen k för att dö (starta om), q för att pausa och se andra spelare. Se inställningar för andra knappbindningar. - -Speed -== Hastighet - -%d of %d servers -== %d av %d servrar - -%d of %d server -== %d av %d server - -%d players -== %d spelare - -%d player -== %d spelare - -Skip the main menu -== Skippa till huvudmenyn - -Download skins -== Ladda ner skins - -Client message -== Klientmeddelande - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ - -Website -== Hemsida - -Settings -== Inställningar - -Stop server -== Stoppa servern - -Run server -== Kör servern - -Server executable not found, can't run server -== Server exekveringsfil hittades ej, kan ej starta servern - -Editor -== Redigeraren - -[Start menu] -Play -== Spela - -Manual -== Manual - -Race -== Race - -Auto -== Auto - -Replay -== Repris - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== Bredden på texturen %s är inte delbar med %d, eller är höjden inte delbar med %d, vilket kan orsaka visuella buggar. - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Felsökningsläge är aktiverad, Klicka Ctrl+Shift+D för att stänga av felsökningsläge. - -Existing Player -== Existerande spelare - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Ditt smeknamn '%s' är redan i användning (%d poäng). Vill du använda namnet ändå? - -Checking for existing player with your name -== Söker efter en befintlig spelare med ditt namn - -Are you sure that you want to disconnect and switch to a different server? -== Är du säker på att du vill koppla ifrån och byta server? - -Theme -== Tema - -AFR -== AFR - -ASI -== ASI - -AUS -== AUS - -EUR -== EUR - -NA -== NA - -SA -== SA - -CHN -== CHN - -Getting server list from master server -== Hämtar server lista från master server - -Leak IP -== Läck IP - -Demos directory -== Demos mapp - -Smooth Dynamic Camera -== Smooth dynamisk kamera - -Settings file -== Inställningsfil - -Config directory -== Config mapp - -Themes directory -== Tema mapp - -Skin Database -== Skin databas - -Skins directory -== Skins mapp - -Chat command -== Chattkommando - -Dummy -== Dummy - -Windowed -== Windowed - -Windowed borderless -== Windowed borderless - -Windowed fullscreen -== Windowed fullscreen - -Desktop fullscreen -== Desktop fullscreen - -Game sound volume -== Spel ljudvolym - -Chat sound volume -== Chat ljudvolym - -Background music volume -== Bakgrund musik volym - -Assets -== Assets - -Use old chat style -== Använd gammal chatt stil - -Preview -== Förhandsvisning - -Show local player's key presses -== Visa egna tangent tryck - -Background -== Bakgrund - -Use current map as background -== Använd nuvarande bana som bakgrund - -Run on join -== Kör på join - -Chat command (e.g. showall 1) -== Chatt kommando (t.ex. showall 1) - -Entities -== Entities - -Emoticons -== Känsloikoner - -Particles -== Partiklar - -Assets directory -== Assets mapp - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Misslyckades under uppstart. Testa att ändra gfx_backend till OpenGL eller Vulkan i settings_ddnet.cfg i konfig nappen och försök igen. - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== Slut på VRAM. Testa att ta bort assets (skins, entities, etc.), speciellt dem i hög upplösning. - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== Ett fel uppstod under "command recording". Testa att uppdatera ditt grafikkorts drivrutiner. - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== Ett "render command" misslyckades. Testa att uppdatera ditt grafikkorts drivrutiner. - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== Inskickning av "render commands" misslyckades. Testa att uppdatera ditt grafikkorts drivrutiner. - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== Misslyckades att "swap framebuffers". Testa att uppdatera ditt grafikkorts drivrutiner. - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Okänt fel. Testa att ändra gfx_backend till OpenGL eller Vulkan i settings_ddnet.cfg i konfig nappen och försök igen. - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== Kunde inte starta den angivna grafikbackend, återgår till standard backend nu. - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== Kunde inte starta den angivna grafikbackend, detta beror någ på att du inte har installerad drivrutinerna för ditt integrerade grafikkort. - -Could not save downloaded map. Try manually deleting this file: %s -== Kunde inte spara nedladdade bana. Testa att manuellt ta bort denna fil: %s - -The format of texture %s is not RGBA which will cause visual bugs. -== Formatet av texturn %s är inte RGBA, vilket kommer att orsaka visuella buggar. - -Preparing demo playback -== Förbreder för demo uppspelning - -Connected -== Ansluten - -Loading map file from storage -== Laddar bana fil från lagring - -Why are you slowmo replaying to read this? -== Varför försöker du att läsa detta? - -Initializing components -== Initierar komponenter - -Initializing assets -== Initierar assets - -Initializing map logic -== Initierar bana logik - -Sending initial client info -== Skickar första klient info - -Quitting. Please wait… -== Lämnar. Vänligen vänta… - -Restarting. Please wait… -== Startar om. Vänligen vänta… - -Position: -== Position - -Speed: -== Hastighet: - -Angle: -== Vinkel: - -Multi-View -== Multi-Vy - -Team %d -== Lag %d - -Uploading map data to GPU -== Laddar upp bana data till grafikkortet - -Trying to determine UDP connectivity… -== Försöker att bestämma UDP anslutning… - -UDP seems to be filtered. -== UDP verkar vara filtrerad. - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== UDP och TCP IP adresser verkar vara olika. Testa att stänga av VPN, proxy eller nätverksacceleratorer. - -No answer from server yet. -== Inget svar från servern än. - -Getting game info -== Hämtar spel info - -Requesting to join the game -== Begär att få ansluta till spelet. - -Rename folder -== Döp om mapp. - -A demo with this name already exists -== Ett demo med detta namn finns redan - -A folder with this name already exists -== En mapp finns redan med detta namn - -Unable to rename the folder -== Misslyckades att döpa om mappen - -File '%s' already exists, do you want to overwrite it? -== Fil '%s' finns redan, vill du skriva över den? - -(paused) -== (pausad) - -Join Tutorial Server -== Anslut till Tutorial - -Skip Tutorial -== Skippa Tutorial - -Loading menu images -== Laddar meny bilder - -Copy info -== Kopiera info - -No server selected -== Ingen server vald - -Online clanmates (%d) -== Online klanmedlemmar (%d) - -[friends (server browser)] -Offline (%d) -== Offline (%d) - -Click to select server. Double click to join your friend. -== Klicka för att välja server. Dubbel klicka för att ansluta till din kamrat. - -Click to remove this player from your friends list. -== Klicka för att ta bort denna spelare från din kompis lista. - -Click to remove this clan from your friends list. -== Klicka för att ta bort denna klan från din kompis lista. - -Are you sure that you want to remove the player '%s' from your friends list? -== Är du säker på att du vill ta bort spelare '%s' från din kompis lista? - -Are you sure that you want to remove the clan '%s' from your friends list? -== Är du säker på att du vill ta bort klanen '%s' från din kompis lista? - -Add Clan -== Lägg till klan - -Play the current demo -== Spela demo - -Pause the current demo -== Pausa demo - -Stop the current demo -== Stoppa demo - -Go back one tick -== Gå tillbaka en tick - -Go forward one tick -== Gå framåt en tick - -Slow down the demo -== Sakta ner demot - -Speed up the demo -== Snabba up demot - -Mark the beginning of a cut (right click to reset) -== Markera start av snittet (höger klicka för att nollställa) - -Mark the end of a cut (right click to reset) -== Markera slutet av snittet (höger klicka för att nollställa) - -Export cut as a separate demo -== Exportera snitt till en seperat demo fil - -Go back one marker -== Gå tillbaka en markör - -Go forward one marker -== Gå framåt en markör - -Close the demo player -== Stäng demo spelaren - -Toggle keyboard shortcuts -== Växla kortkommandon - -Export demo cut -== Exportera demo snitt - -Cut interval -== Snitt interval - -Cut length -== Snitt längd - -Loading demo files -== Laddar demo filer - -All combined -== Alla kombinerade - -Folder Link -== Mapp länk - -Open the directory that contains the demo files -== Öppna mappen som innehåller demo filerna - -Are you sure that you want to delete the folder '%s'? -== Är du säker på att du vill ta bort mappen '%s'? - -Are you sure that you want to delete the demo '%s'? -== Är du säker på att du vill ta bort demot '%s'? - -Delete folder -== Ta bort mapp - -Unable to delete the demo '%s' -== Misslyckades att ta bort demot '%s' - -Unable to delete the folder '%s'. Make sure it's empty first. -== Misslyckades att ta bort mappen '%s'. Den måste vara tom först. - -Loading ghost files -== Laddar spök filer - -Menu opened. Press Esc key again to close menu. -== Meny öppnad. Klicka Esc igen för att stänga menyn. - -Save power by lowering refresh rate (higher input latency) -== Spara batteri genom att sänka uppdateringsfrekvensen (högre inmatnings latens) - -Open the settings file -== Öppna inställningsfil - -Open the directory that contains the configuration and user files -== Öppna mappen som innehåller konfigurationen och användarfiler - -Open the directory to add custom themes -== Öppna mappen för att lägga till egna teman - -Loading skin files -== Laddar skin filer - -Download community skins -== Ladda ner community skins - -Choose default eyes when joining a server -== Välj standard ögon när du ansluter till en server - -Create a random skin -== Skapa ett slumpad skin - -Open the directory to add custom skins -== Öppna mappen för att lägga till egna skins - -Enable controller -== Aktivera kontroller - -Controller -== Kontroller - -Ingame controller mode -== Kontroller läge under spel - -[Ingame controller mode] -Relative -== Relativ - -[Ingame controller mode] -Absolute -== Absolut - -Ingame controller sens. -== Kontroller känslighet i spelet. - -UI controller sens. -== Kontroller känslighet i menyer. - -Controller jitter tolerance -== Kontroller skaka tolerans - -No controller found. Plug in a controller. -== Ingen kontroller hittad. Anslut en kontroller. - -Axis -== Axel - -Status -== Status - -Aim bind -== Aim bind - -Mouse -== Mus - -Ingame mouse sens. -== Mus känslighet i spelet. - -UI mouse sens. -== Mus känslighet i menyer. - -Reset controls -== Nollställ kontrollerna - -Are you sure that you want to reset the controls to their defaults? -== Är du säker på att du vill nollställa kontrollerna till standard? - -Cancel -== Avbryt - -Allows maps to render with more detail -== Tillåt banor att visa mer detaljer - -Renderer -== Renderer - -default -== standard - -custom -== egna - -Graphics card -== Grafikkort - -auto -== auto - -Appearance -== Utseende - -Name Plate -== Namnskylt - -Hook Collisions -== Hook kollisioner - -Show health, shields and ammo -== Visa hälsa, sköldar och ammunition - -DDRace HUD -== DDRace HUD - -Show DDRace HUD -== Visa DDRace HUD - -Show jumps indicator -== Visa hopp indikator - -Show dummy actions -== Visa dummy actions - -Show player position -== Visa spelarens position - -Show player speed -== Visa spelarens hastighet - -Show player target angle -== Visa spelarens vinkel - -Show freeze bars -== Visa freeze bars - -Opacity of freeze bars inside freeze -== Opacitet av freeze bars i freeze - -Hook collision line -== Hook kollisions linje - -Hook collision line opacity -== Hook kollisions linje opacitet - -Colors of the hook collision line, in case of a possible collision with: -== Färger av hook kollisions linje, ifall det finns en kollision med: - -Your movements are not taken into account when calculating the line colors -== Dina rörelser tas inte med i beräkningen av linjefärgerna - -Nothing hookable -== Inget hookable - -Something hookable -== Något hookable - -A Tee -== En Tee - -Normal Color -== Normal Färg - -Highlight Color -== Betonad Färg - -Weapons -== Vapen - -Rifle Laser Outline Color -== Gevär Laser Kontur Färg - -Rifle Laser Inner Color -== Gevär Laser Inre Färg - -Shotgun Laser Outline Color -== Hagelgevär Laser Kontur Färg - -Shotgun Laser Inner Color -== Hagelgevär Inre Färg - -Door Laser Outline Color -== Dörr Laser Kontur Färg - -Door Laser Inner Color -== Dörr Laser Inre Färg - -Freeze Laser Outline Color -== Freeze Laser Kontur Färg - -Freeze Laser Inner Color -== Freeze Laser Inre Färg - -Set all to Rifle -== Sätt alla till Gevär - -When you cross the start line, show a ghost tee replicating the movements of your best time -== När du passera start linjen, visa en spök tee som visar rörelsen av din bästa tid - -Opacity -== Opacitet - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Justera opaciteten av entities som tillhör ett annat lag, som t.ex. tees och namnskyltar - -Quads are used for background decoration -== Quads används till bakgrunds decorationer - -Tries to predict other entities to give a feel of low latency -== Försöker att predicera andra entities för att ge känslan av låg latens. - -Unregister protocol and file extensions -== Avregistera protokoll och filtillägg - -Extras -== Extras - -Loading assets -== Laddar assets - -Open the directory to add custom assets -== Öppna mappen för att lägga till egna assets - -Tutorial -== Tutorial - -Can't find a Tutorial server -== Kunde inte hitta en Tutorial server - -Loading race demo files -== Laddar race demo filer - -Super -== Super - -Loading sound files -== Laddar ljud filer - -Moved ingame -== Förflyttades i spelet - -Render cut to video -== Rendera snitt till video - -Go back the specified duration -== Gå tillbaka den angivna tiden - -[Demo player duration] -%d min. -== %d min. - -[Demo player duration] -%d sec. -== %d sek. - -Change the skip duration -== Ändra tiden för framspolning - -Go forward the specified duration -== Gå framåt den angivna tiden - -Error playing demo -== Ett fel uppstod under uppspelning av demo - -Some map images could not be loaded. Check the local console for details. -== Vissa map bilder kunde inte laddas in. Se den lokala konsolen för detaljer. - -Some map sounds could not be loaded. Check the local console for details. -== Vissa map ljud kunde inte laddas in. Se den lokala konsolen för detaljer. - -Loading menu themes -== Laddar menyteman - -Render complete -== Rendering klar - -Videos directory -== Videos mapp - -Video was saved to '%s' -== Video sparades till '%s' - -No demo selected -== Ingen demo vald - -Created -== Skapad - -Netversion -== Netversion - -[Demo details] -map not included -== map inte inkluderad - -Ghosts directory -== Spök mapp - -Activate all -== Aktivera alla - -Deactivate all -== Deaktivera alla - -Enable ghost -== Aktivera spöken - -Only save improvements -== Spara bara förbättringar - -Regular background color -== Vanlig bakgrunds färg - -Entities background color -== Entities bakgrunds färg - -Saving settings to '%s' failed -== Sparning av inställningar till '%s' misslyckades - -Searching -== Söker - -Enter Username -== Ange Användarnamn - -Enter Password -== Ange Lösenord - -NOT CONNECTED -== INTE ANSLUTEN - -Match %d of %d -== Resultat %d av %d - -No results -== Inga resultat - -Lines %d - %d (%s) -== Rader %d - %d (%s) - -Locked -== Låst - -Following -== Följer - -Press a key… -== Tryck en knapp… - -Are you sure that you want to restart? -== Är du säker att du vill starta om? - -There's an unsaved map in the editor, you might want to save it. -== Det finns en osparad bana i redigeraren, du kanske vill spara den. - -Continue anyway? -== Fortsätt ändå? - -Communities -== Gemenskaper - -Please use a different filename -== Använd ett annat filnamn - -Info Messages -== Info Meddelanden - -Show local time always -== Visa alltid lokal tid - -Chat font size -== Chatt textstorlek - -Chat width -== Chatt bredd - -Authed name color in scoreboard -== Autentiserade namn färg i poänglistan - -Same clan color in scoreboard -== Samma klan färg i poänglistan - -Show finish messages -== Visa avklarnings meddelanden - -Failed saving the replay! -== Misslyckades att spara repris! - -Error saving settings -== Misslyckades att spara inställningar - -Loading commands… -== Laddar kommandon… - -Main menu -== Huvudmeny - -Server filter -== Server filter - -Friends -== Kompisar - -Loading… -== Laddar… - -Loading demo file from storage -== Laddar demo fil från lagring - -No login required -== Ingen inloggning krävs - -Player info change cooldown -== Spelarinfo ändring cooldown - -Always show chat -== Visa alltid chatt - -Show friend mark (♥) in name plates -== Visa kompis markering (♥) i namnskyltar - -Show hook strength icon indicator -== Visa hook styrka med en ikon - -Show hook strength number indicator -== Visa hook styrka med ett nummer - -Show own player's hook collision line -== Visa din egen hook kollisions linje - -Always show own player's hook collision line -== Visa alltid din egna hook kollisions linje - -Always show other players' hook collision lines -== Visa alltid andra spelares hook kollisions linjer - -%d/%d KiB (%.1f KiB/s) -== %d/%d KiB (%.1f KiB/s) - -Tee -== Tee - -Show only chat messages from team members -== Visa bara chattmeddelanden från lagkamrater - -[Spectating] -Following %s -== Följer %s - -Example of usage -== Exempel på användning - -Round %d/%d -== Runda %d/%d - -[Spectators] -%d others… -== %d andra… - -[Team and size] -%d\n(%d/%d) -== %d\n(%d/%d) - -Team %d (%d/%d) -== Lag %d (%d/%d) - -https://wiki.ddnet.org/wiki/Mapping -== https://wiki.ddnet.org/wiki/Mapping - -Could not resolve connect address '%s'. See local console for details. -== Kunde inte förstå anslutnings adress '%s'. Se den lokala konsolen för detaljer. - -Connect address error -== Anslutnings problem - -Could not connect dummy -== Kunde inte ansluta dummy - -Dummy is not allowed on this server -== Dummy är inte tillåten på denna server - -Please wait… -== Vänligen vänta… - -Show client IDs (scoreboard, chat, spectator) -== Visa klient IDen (poänglistan, chatt, åskadarmeny) - -Are you sure that you want to delete '%s'? -== Är du säker att du vill ta bort '%s'? - -Delete skin -== Ta bort skin - -Basic -== Enkel - -Custom -== Anpassa - -Unable to delete skin -== Kunde inte ta bort skin - -Save skin -== Spara skin - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== Är du säker på att du vill spara ditt skin? Om detta skin finns redan, så kommer den att ersättas. - -Unable to save the skin -== Misslyckades att spara skin - -Unable to save the skin with a reserved name -== Misslyckades med att spara skin med reserverat namn - -No local servers found (ports %d-%d) -== Inga lokala servrar hittades (portar %d-%d) - -[Hertz] -Hz -== Hz - -[skins] -Body -== Kropp - -[skins] -Marking -== Märkning - -[skins] -Decoration -== Dekoration - -[skins] -Hands -== Händer - -[skins] -Feet -== Fötter - -[skins] -Eyes -== Ögon - -Some fonts could not be loaded. Check the local console for details. -== Vissa typsnitt kunde inte laddas in. Se den lokala konsolen för detaljer. - -Online friends (%d) -== Online kompisar (%d) - -Add friends by entering their name below or by clicking their name in the player list. -== Lägg till en kompis genom att skriva in deras namn nedanför eller genom att klicka på deras namn i spellistan. - -Add clanmates by entering their clan below and leaving the name blank. -== Lägg till en klanmedlem genom att skriva in deras klan nedanför och lämna namn fältet blankt. - -Offline friends and clanmates will appear here. -== Offline kompisar och klanmedlemmar kommer att synas här. - -Edit touch controls -== Ändra pekskärms kontrollerna - -Close -== Stäng - -Save changes -== Spara ändringar - -Error saving touch controls -== Misslyckades med att spara pekskärms kontrollerna - -Could not save touch controls to file. See local console for details. -== Kunde inte spara pekskärms kontrollerna till en fil. Se den lokala konsolen för detaljer. - -Unsaved changes -== Osparade ändringar - -Discard changes -== Kasta ändringar - -Are you sure that you want to discard the current changes to the touch controls? -== Är du säker att du vill kasta de nuvarande ändringar till pekskärms kontrollerna? - -Are you sure that you want to reset the touch controls to default? -== Är du säker på att du vill nollställa pekskärms kontrollerna till standardinställningarna? - -Import from clipboard -== Importera från urklipp - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== Är du säker att du vill importera pekskärms kontrollerna från urklipp? Detta kommer att skriva över dina nuvarande inställningar. - -Export to clipboard -== Exportera till urklipp - -Direct touch input while ingame -== Direkt pekskärms kontroller medan du är i spel - -[Direct touch input] -Disabled -== Inaktiverad - -[Direct touch input] -Active action -== Aktivt läge - -[Direct touch input] -Aim -== Sikta - -[Direct touch input] -Fire -== Skjut - -[Direct touch input] -Hook -== Hook - -Direct touch input while spectating -== Direkt pekskärms kontroller medan du är i åskådarläge - -Error loading touch controls -== Misslyckades att ladda in pekskärms kontrollerna - -Could not load touch controls from file. See local console for details. -== Misslyckades att ladda in pekskärms kontrollerna från fil. Se den lokala konsolen för detaljer. - -Could not load default touch controls from file. See local console for details. -== Misslyckades att ladda in standard pekskärms kontrollerna från fil. Se den lokala konsolen för detaljer. - -Could not load touch controls from clipboard. See local console for details. -== Misslyckades att ladda in pekskärms kontrollerna från urkipp. Se den lokala konsolen för detaljer. - -Width of your own hook collision line -== Bredd av din egna hook kollisions linje - -Width of others' hook collision line -== Bredd av andras hook kollisions linjer - -Preview 'Hook collisions' being pressed -== Förhandsvisning när 'Hook kollisions' är aktivt - -Aim -== Sikta - -Active: Fire -== Läge: Skjut - -Active: Hook -== Läge: Hook - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Loading background map -== - -[Spectating Camera Mode Icon] -AUTO -== - -Toggle auto camera -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Show client IDs in name plates -== - -Hook Strength -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== diff --git a/data/languages/traditional_chinese.txt b/data/languages/traditional_chinese.txt deleted file mode 100644 index e051d5d05a..0000000000 --- a/data/languages/traditional_chinese.txt +++ /dev/null @@ -1,2109 +0,0 @@ -##### authors ##### -#originally created by: -# SiuFu -#modified by: -# 2020-08-19 TsFreddie -# 2020-08-20 Dan_cao -# 2020-11-12 TsFreddie -# 2021-06-01 TsFreddie -# 2021-11-19 cheeser0613 -# 2021-12-21 cheeser0613 -# 2022-02-07 cheeser0613 -# 2022-03-19 cheeser0613 -# 2022-03-22 cheeser0613 -# 2022-03-24 cheeser0613 -# 2022-05-14 cheeser0613 -# 2022-06-16 cheeser0613 -# 2022-06-27 cheeser0613 -# 2022-08-08 cheeser0613 -# 2022-09-17 cheeser0613 -# 2022-10-24 cheeser0613 -# 2022-12-11 cheeser0613 -# 2023-01-11 cheeser0613 -# 2023-04-01 cheeser0613 -# 2023-05-25 cheeser0613 -# 2023-07-20 By -# 2023-08-11 By -# 2023-11-25 By -# 2024-01-15 By -# 2024-03-05 By -# 2024-04-21 By -# 2024-06-10 By -# 2024-07-21 By -# 2024-08-29 Pioooooo -# 2024-09-29 Pioooooo -# 2024-11-01 Pioooooo -# 2024-12-03 豆腐渣 & Pioooooo & By -# 2025-01-03 Pioooooo -##### /authors ##### - -##### translated strings ##### - -%ds left -== 還剩%d秒 - -%i minute left -== 還剩下%i分鐘 - -%i minutes left -== 還剩下%i分鐘 - -%i second left -== 還剩下%i秒鐘 - -%i seconds left -== 還剩下%i秒鐘 - -%s wins! -== %s勝利! - -Abort -== 取消 - -Add -== 新增 - -Add Friend -== 新增好友 - -Address -== 地址 - -All -== 全部 - -Are you sure that you want to quit? -== 確定要退出嗎? - -Automatically record demos -== 自動錄製回放 - -Automatically take game over screenshot -== 自動擷取遊戲結束畫面 - -Blue team -== 藍隊 - -Blue team wins! -== 藍隊勝利! - -Body -== 身體 - -Call vote -== 發起投票 - -Change settings -== 變更設定 - -Chat -== 聊天 - -Clan -== 戰隊 - -Client -== 客戶端 - -Connecting to -== 正在連線到 - -Connection Problems… -== 連線中斷… - -Console -== 控制檯 - -Controls -== 控制 - -Count players only -== 過濾旁觀位 - -Current -== 當前 - -Custom colors -== 自定義顏色 - -Delete -== 刪除 - -Delete demo -== 刪除回放 - -Demofile: %s -== 回放檔案:%s - -Demos -== 回放 - -Disconnect -== 斷開連線 - -Disconnected -== 連線已斷開 - -Downloading map -== 正在下載地圖 - -Draw! -== 平局! - -Dynamic Camera -== 動態視距 - -Emoticon -== 表情 - -Error -== 錯誤 - -Error loading demo -== 回放載入錯誤 - -Favorite -== 收藏 - -Favorites -== 收藏 - -Feet -== 腳 - -Fire -== 開火 - -Folder -== 資料夾 - -Force vote -== 強制投票 - -Free-View -== 自由視角 - -Fullscreen -== 獨占全螢幕 - -Game -== 遊戲 - -Game info -== 遊戲資訊 - -Game over -== 遊戲結束 - -Game paused -== 遊戲已暫停 - -Game type -== 遊戲模式 - -Game types: -== 遊戲模式: - -General -== 常規 - -Graphics -== 顯示 - -Grenade -== 榴彈槍 - -Hammer -== 錘子 - -Has people playing -== 有人在玩 - -High Detail -== 顯示地圖細節 - -Hook -== 鉤索 - -Invalid Demo -== 回放檔案無效或已損壞 - -Join blue -== 加入藍隊 - -Join red -== 加入紅隊 - -Jump -== 跳躍 - -Kick player -== 踢除玩家 - -Language -== 語言 - -DDNet Client needs to be restarted to complete update! -== DDNet客戶端需要重新啟動才能完成更新! - -MOTD -== 公告 - -Map -== 地圖 - -Move left -== 向左移動 - -Move player to spectators -== 將玩家移至旁觀位 - -Move right -== 向右移動 - -Movement -== 移動 - -Mute when not active -== 在後臺時靜音 - -Enable game sounds -== 啟用遊戲聲音 - -Enable gun sound -== 啟用槍聲 - -Enable server message sound -== 啟用伺服器通知聲音 - -Enable regular chat sound -== 啟用聊天提示音 - -Enable team chat sound -== 啟用隊伍聊天提示音 - -Enable highlighted chat sound -== 啟用被提及時的提示音 - -Name -== 名稱 - -Next weapon -== 下一個武器 - -Nickname -== 暱稱 - -No -== 否 - -No password -== 沒有密碼 - -No servers found -== 未檢測到任何伺服器 - -No servers match your filter criteria -== 沒有伺服器滿足設定的過濾條件 - -Ok -== 確定 - -Parent Folder -== 上級目錄 - -Password -== 密碼 - -Password incorrect -== 密碼錯誤 - -Ping -== 延遲 - -Pistol -== 手槍 - -Play background music -== 播放背景音樂 - -Player -== 玩家 - -HUD -== HUD - -Player country: -== 玩家國家/地區: - -Players -== 玩家 - -Please balance teams! -== 隊伍人數不平衡! - -Prev. weapon -== 上一個武器 - -Quit -== 退出 - -Reason: -== 理由: - -Red team -== 紅隊 - -Red team wins! -== 紅隊勝利! - -Remote console -== 遠端控制檯 - -Remove -== 移除 - -Remove friend -== 刪除好友 - -Rename demo -== 重新命名回放 - -Reset filter -== 重置過濾器 - -Score -== 分數 - -Score limit -== 目標得分 - -Scoreboard -== 計分板 - -Screenshot -== 截圖 - -Server address: -== 伺服器地址: - -Server info -== 伺服器資訊 - -Server not full -== 伺服器未滿 - -Shotgun -== 霰彈槍 - -Show chat -== 顯示聊天框 - -Show friends only -== 只顯示好友 - -Show ingame HUD -== 顯示HUD - -Show name plates -== 顯示暱稱 - -Show only chat messages from friends -== 只顯示好友聊天訊息 - -Sound -== 聲音 - -Sound error -== 音訊錯誤 - -Spectate -== 旁觀 - -Spectate next -== 旁觀下一個 - -Spectate previous -== 旁觀上一個 - -Spectator mode -== 旁觀者模式 - -Spectators -== 旁觀者 - -Stop record -== 停止錄製 - -Strict gametype filter -== 嚴格過濾遊戲模式 - -Sudden Death -== 決勝 - -Switch weapon on pickup -== 拾取武器時自動裝備 - -Switch weapon when out of ammo -== 子彈打空時自動切換武器 - -Show clan above name plates -== 顯示戰隊名稱 - -Clan plates size -== 戰隊名稱大小 - -Team -== 隊伍 - -Team chat -== 隊伍聊天 - -The audio device couldn't be initialised. -== 初始化音訊裝置失敗。 - -The server is running a non-standard tuning on a pure game type. -== 此伺服器執行著經過調整的非標準遊戲模式。 - -Time limit -== 規定時限 - -Time limit: %d min -== 規定時限:%d 分鐘 - -Try again -== 重試 - -Type -== 模式 - -Unable to rename the demo -== 無法重新命名這個回放 - -Use sounds -== 開啟聲音 - -Use team colors for name plates -== 用隊伍顏色顯示暱稱 - -V-Sync -== 垂直同步 - -Version -== 版本 - -Vote command: -== 投票命令: - -Vote description: -== 投票描述: - -Vote no -== 反對 - -Vote yes -== 贊成 - -Voting -== 投票 - -Warmup -== 熱身 - -Weapon -== 武器 - -Yes -== 是 - -You must restart the game for all settings to take effect. -== 你需要重啟遊戲來使某些設定生效。 - -Demo -== 回放 - -Reset -== 重置 - -Screen -== 螢幕 - -New name: -== 新檔名: - -Sat. -== 飽和度 - -Miscellaneous -== 雜項 - -Internet -== 網際網路 - -Max demos -== 最大回放數 - -News -== 新聞 - -Join game -== 加入遊戲 - -FSAA samples -== 全屏抗鋸齒 (FSAA) 取樣倍數 - -Sound volume -== 音量 - -Map sound volume -== 地圖音效音量 - -Max Screenshots -== 最大截圖數 - -Laser -== 鐳射 - -Hue -== 色調 - -Record demo -== 錄製回放 - -Your skin -== 你的外觀 - -Reset to defaults -== 恢復預設設定 - -Lht. -== 亮度 - -Automatically take statboard screenshot -== 自動對統計板截圖 - -UI Color -== 介面顏色 - -Alpha -== 透明度 - -LAN -== 區域網 - -Name plates size -== 暱稱大小 - -Show score -== 顯示比分 - -Show names in chat in team colors -== 以隊伍顏色顯示玩家暱稱 - -Show kill messages -== 顯示擊殺訊息 - -Show votes window after voting -== 投票後不關閉投票視窗 - -Messages -== 訊息 - -System message -== 系統訊息 - -Highlighted message -== 被提及訊息 - -Team message -== 隊伍訊息 - -Normal message -== 普通訊息 - -Friend message -== 好友訊息 - -Save the best demo of each race -== 儲存競速模式最高記錄的回放 - -Ghost -== 影子 - -Show ghost -== 顯示影子 - -Save ghost -== 儲存影子 - -Gameplay -== 遊戲 - -Overlay entities -== 顯示實體層 - -Show others -== 顯示其他玩家 - -Show quads -== 顯示背景 - -Default zoom -== 預設縮放 - -AntiPing: predict other players -== AntiPing:預測其他玩家 - -AntiPing: predict weapons -== AntiPing:預測武器 - -AntiPing: predict grenade paths -== AntiPing:預測榴彈路徑 - -Show other players' hook collision lines -== 顯示其他玩家的鉤索輔助線 - -Show other players' key presses -== 顯示其他玩家的按鍵 - -Show tiles layers from BG map -== 顯示實體層背景地圖的圖塊層 - -DDNet %s is available: -== DDNet %s 現已可用: - -Update now -== 現在更新 - -Updating… -== 更新中… - -DDNet Client updated! -== DDNet 客戶端更新成功! - -No updates available -== 沒有可用的更新 - -Check now -== 檢查更新 - -Loading DDNet Client -== 正在載入 DDNet 客戶端 - -Browser -== 瀏覽 - -Connecting dummy -== 正在連線分身 - -Search -== 搜尋 - -Vanilla skins only -== 只顯示原生外觀 - -Fat skins (DDFat) -== 胖胖的外觀 (DDFat) - -Ratio -== F/D - -##### Ratio的演算法是擊殺除以死亡次數 ##### - -AntiPing -== AntiPing - -Countries -== 國家 - -Reconnect in %d sec -== %d 秒後重新連線 - -Grabs -== 得旗數 - -DDNet -== DDNet - -Deaths -== 死亡數 - -Restart -== 重新開始 - -Follow -== 跟隨 - -Automatically create statboard csv -== 自動將統計板匯出為csv檔案 - -Are you sure that you want to disconnect? -== 確定要斷開連線嗎? - -Types -== 模式 - -Remove chat -== 刪除訊息記錄 - -Frags -== 擊殺數 - -Enable long pain sound (used when shooting in freeze) -== 啟用在凍結時的呼救聲 - -%.2f MiB -== %.2f MiB - -Refresh Rate -== 重新整理率 - -New random timeout code -== 隨機生成新的超時還原碼 - -Suicides -== 自殺數 - -Net -== 淨擊殺 - -##### Net的演算法是殺人+1被殺-1 ##### - -FPM -== 擊殺/分 - -##### 得分速度就是效率FPM ##### - -Spree -== 連殺 - -Max CSVs -== 最大csv檔案數 - -%.2f KiB -== %.2f KiB - -Best -== 最高 - -Exclude -== 排除 - -may cause delay -== 可能會產生延遲 - -Unfinished map -== 未完成的地圖 - -Deactivate -== 停用 - -Welcome to DDNet -== 歡迎來到 DDNet - -Activate -== 啟用 - -File already exists, do you want to overwrite it? -== 檔案已存在,是否覆蓋? - -Indicate map finish -== 標記已完成地圖 - -Save -== 儲存 - -Date -== 日期 - -Show DDNet map finishes in server browser -== 在伺服器瀏覽器中顯示已完成的 DDNet 地圖 - -transmits your player name to info.ddnet.org -== 將會發送你的玩家名稱到 info.ddnet.org - -Enable replays -== 啟用短時回放 - -Time -== 用時 - -Show entities -== 實體層顯示開關 - -Show all -== 顯示所有玩家 - -Downloading %s: -== 正在下載 %s: - -%d new mentions -== %d 條新提及 - -Toggle dummy -== 切換分身 - -Replay feature is disabled! -== 短時回放功能未啟用! - -Are you sure that you want to disconnect your dummy? -== 確定要斷連分身嗎? - -Hook collisions -== 鉤索輔助線 - -DDNet %s is out! -== DDNet %s 已經更新了! - -Markers -== 標記 - -Filter connecting players -== 過濾正在連線的玩家 - -Zoom in -== 視距放大 - -1 new mention -== 1 條新提及 - -Update failed! Check log… -== 更新失敗!請檢查日誌… - -Pause -== 暫停 - -Length -== 長度 - -Converse -== 繼續會話 - -Successfully saved the replay! -== 成功儲存短時回放! - -Fetch Info -== 回放詳情 - -Lock team -== 鎖定隊伍 - -Size -== 大小 - -Dummy copy -== 分身同步動作 - -9+ new mentions -== 9+ 條新提及 - -Statboard -== 統計板 - -Disconnect Dummy -== 中斷分身的連線 - -Show HUD -== 遊戲HUD開關 - -Hammerfly dummy -== 分身Hammerfly開關 - -Default length -== 預設長度 - -Toggle ghost -== 影子記錄開關 - -Kill -== 自殺 - -Zoom out -== 視距縮小 - -Show text entities -== 顯示文字實體 - -Skin prefix -== 外觀名稱字首 - -Toggle dyncam -== 動態鏡頭開關 - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork 是以到達地圖終點為目標,單人或組隊的線上合作遊戲。如果你是新手,你可以從有入門級地圖的 Novice 伺服器開 始。記得選擇 Ping 值低的伺服器。 - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== 推薦在加入伺服器前,先將設定調整到符合你的習慣。 - -Please enter your nickname below. -== 請輸入你的暱稱。 - -Server best: -== 伺服器最佳 - -Learn -== 教程Wiki - -Use high DPI -== 使用高 DPI - -Personal best: -== 個人最佳 - -Render demo -== 渲染回放 - -Replace video -== 替換影片 - -Video name: -== 影片名稱 - -Connect Dummy -== 連線分身 - -Client message -== 客戶端訊息 - -Show others (own team only) -== 顯示其他玩家 (僅同隊伍) - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== 使用 k鍵 自殺以重新開始,使用 q鍵 可以暫停以旁觀他人或檢視地圖。 請在設定中檢視其他按鍵。 - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/wiki/Main_Page/zh - -Warning -== 警告 - -Speed -== 速度 - -Skip the main menu -== 跳過主選單 - -Website -== 網站 - -Settings -== 設定 - -[Start menu] -Play -== 開始遊戲 - -Stop server -== 停止伺服器 - -Run server -== 開啟伺服器 - -Server executable not found, can't run server -== 未檢測到伺服器的可執行檔案,無法開啟 - -Editor -== 編輯器 - -Manual -== 手動 - -Race -== 競速 - -Auto -== 自動 - -Replay -== 回放 - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== 偵錯模式已啟用。按 Ctrl+Shift+D 禁用偵錯模式。 - -Existing Player -== 玩家已存在 - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== 你使用的暱稱 "%s" 在DDNet中有%d分的記錄,這可能代表這個暱稱已經被其他人使用過。確認要使用這個名字嗎? - -Checking for existing player with your name -== 正在查詢該暱稱的DDNet記錄 - -Theme -== 主題 - -%d of %d servers -== 符合條件 %d / 總共 %d 個伺服器 - -%d of %d server -== 符合條件 %d / 總共 %d 個伺服器 - -%d players -== %d 在線玩家 - -%d player -== %d 在線玩家 - -Demos directory -== 回放目錄 - -Smooth Dynamic Camera -== 動態視距平滑化 - -Themes directory -== 主題目錄 - -Download skins -== 下載官方外觀 - -Skin Database -== 外觀數據庫 - -Skins directory -== 外觀目錄 - -Game sound volume -== 遊戲音效音量 - -Chat sound volume -== 聊天提示音量 - -Background music volume -== 背景音樂音量 - -Assets -== 材質 - -Use old chat style -== 原始聊天框 - -Use current map as background -== 使用當前地圖作爲實體層背景地圖 - -Entities -== 實體層 - -Emoticons -== 表情 - -Particles -== 粒子 - -Assets directory -== 材質目錄 - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== 紋理 %s 的寬度無法被 %d 整除,或者高度無法被 %d 整除,這可能會導致視覺錯誤。 - -AFR -== 非洲 - -ASI -== 亞洲 - -AUS -== 澳洲 - -EUR -== 歐洲 - -NA -== 北美 - -SA -== 南美 - -CHN -== 中國 - -Getting server list from master server -== 正在從主伺服器獲取伺服器列表 - -Leak IP -== 洩露IP - -Chat command -== 聊天框指令 - -Dummy -== 分身 - -Windowed -== 視窗化 - -Windowed borderless -== 無邊框視窗 - -Desktop fullscreen -== 無邊框全螢幕 - -Preview -== 預覽 - -Background -== 背景 - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -Are you sure that you want to disconnect and switch to a different server? -== 確定要中斷此伺服器并嘗試加入其他伺服器嗎? - -Show local player's key presses -== 顯示周圍玩家的按鍵輸入 - -Settings file -== 設定檔案 - -Config directory -== 配置目錄 (cfg) - -Run on join -== 加入時執行 - -Chat command (e.g. showall 1) -== 聊天指令 (例如: showall 1) - -Windowed fullscreen -== 視窗化全螢幕 - -The format of texture %s is not RGBA which will cause visual bugs. -== 紋理檔案 %s 并非 RGBA 格式,這可能會導致顯示錯誤 - -Join Tutorial Server -== 加入教學伺服器 - -Skip Tutorial -== 跳過教學 - -Renderer -== 渲染設定 - -default -== 預設 - -custom -== 自定義 - -auto -== 自動 - -Tutorial -== 教學 - -Choose default eyes when joining a server -== 加入伺服器時的預設表情 - -Allows maps to render with more detail -== 允許地圖渲染更多細節 - -When you cross the start line, show a ghost tee replicating the movements of your best time -== 當越過起跑綫時,游戲裏將有影子回放你的最佳成績 - -Opacity -== 不透明度 - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== 調整單人區域或其他隊伍中玩家的不透明度 - -Quads are used for background decoration -== 顯示用於背景裝飾的貼圖 - -Tries to predict other entities to give a feel of low latency -== 嘗試預測其他實體物以帶來低延遲的游玩體驗 - -Can't find a Tutorial server -== 無法找到教學伺服器 - -Super -== 無敵 - -Team %d -== 隊伍 %d - -Position: -== 坐標 - -Speed: -== 速度 - -Angle: -== 角度 - -Trying to determine UDP connectivity… -== 正在嘗試檢測 UDP 連接… - -UDP seems to be filtered. -== UDP 疑似被過濾 - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== UDP 與 TCP 的 IP 地址并不相同。請嘗試屏蔽 VPN 、代理網路以及網路加速器。 - -No answer from server yet. -== 伺服器無響應 - -Download community skins -== 下載社區外觀 - -Enable controller -== 啓用控制器 - -[Ingame controller mode] -Relative -== 相對 - -[Ingame controller mode] -Absolute -== 絕對 - -Ingame controller mode -== 游戲内控制器瞄準模式 - -Ingame controller sens. -== 搖桿靈敏度 (游戲) - -UI controller sens. -== 搖桿靈敏度 (界面) - -Controller jitter tolerance -== 搖桿錯位容錯 - -Status -== 狀態 - -Aim bind -== 操作軸綁定 - -Mouse -== 滑鼠 - -Ingame mouse sens. -== 滑鼠靈敏度 (游戲) - -UI mouse sens. -== 滑鼠靈敏度 (界面) - -Controller -== 控制器 - -Show dummy actions -== 顯示分身狀態 - -Show freeze bars -== 顯示解凍進度條 - -Show player position -== 顯示玩家坐標 - -Show player speed -== 顯示玩家速度 - -Show player target angle -== 顯示玩家瞄準角度 - -Opacity of freeze bars inside freeze -== 解凍進度條不透明度 - -Normal Color -== 非相關訊息顔色 - -Highlight Color -== 相關訊息顔色 - -Extras -== 其他 - -Preparing demo playback -== 正在準備回放 - -Connected -== 連接成功 - -Loading map file from storage -== 正在從硬盤中載入地圖檔案 - -Why are you slowmo replaying to read this? -== 所以你爲什麽要慢速回放來看這個? - -Initializing components -== 正在初始化游戲引擎 - -Initializing assets -== 正在初始化材質 - -Initializing map logic -== 正在初始化地圖邏輯 - -Sending initial client info -== 正在發送初始客戶端資訊 - -Uploading map data to GPU -== 正在將地圖數據傳輸至顯示卡 - -Getting game info -== 正在獲取游戲資訊 - -Requesting to join the game -== 正在請求加入游戲 - -Loading menu images -== 正在載入主菜單圖片 - -Loading demo files -== 正在載入回放檔案 - -Loading ghost files -== 正在載入影子檔案 - -Loading skin files -== 正在載入外觀檔案 - -Appearance -== 游戲界面 - -Name Plate -== 匿稱板塊 - -Hook Collisions -== 瞄準輔助 - -Show health, shields and ammo -== 顯示生命、護甲與彈藥欄 - -DDRace HUD -== DDRace HUD - -Show DDRace HUD -== 顯示 DDRace HUD - -Show jumps indicator -== 顯示跳躍次數 - -Hook collision line -== 鉤索輔助線 - -Hook collision line opacity -== 輔助線不透明度 - -Colors of the hook collision line, in case of a possible collision with: -== 輔助線顔色 (當瞄準以下實體物時): - -Your movements are not taken into account when calculating the line colors -== 移動所造成的瞄準偏移將不計入考量 - -Nothing hookable -== 未瞄準任何實體物 - -Something hookable -== 可鈎索的方塊 - -A Tee -== 其他玩家 - -Loading assets -== 正在載入材質 - -Loading race demo files -== 正在載入回放檔案 - -Loading sound files -== 正在載入聲音檔案 - -Play the current demo -== 播放回放 - -Pause the current demo -== 暫停回放 - -Stop the current demo -== 結束回放 - -Slow down the demo -== 減慢播放速度 - -Speed up the demo -== 加快播放速度 - -Export cut as a separate demo -== 另存爲新回放檔案 - -Toggle keyboard shortcuts -== 啓用/禁用鍵盤快捷鍵 - -Weapons -== 武器 - -Rifle Laser Outline Color -== 鐳射槍彈道外框顔色 - -Rifle Laser Inner Color -== 鐳射槍彈道實心顔色 - -Shotgun Laser Outline Color -== 霰彈槍彈道外框顔色 - -Shotgun Laser Inner Color -== 霰彈槍彈道實心顔色 - -Door Laser Outline Color -== 鐳射門外框顔色 - -Door Laser Inner Color -== 鐳射門實心顔色 - -Freeze Laser Outline Color -== 凍結鐳射外框顔色 - -Freeze Laser Inner Color -== 凍結鐳射實心顔色 - -Menu opened. Press Esc key again to close menu. -== 菜單已打開,再次點擊 Esc 以關閉 - -Set all to Rifle -== 統一為鐳射槍顔色 - -Cancel -== 取消 - -File '%s' already exists, do you want to overwrite it? -== 檔案名 "%s" 已經存在,是否要取代該檔案? - -Are you sure that you want to remove the player '%s' from your friends list? -== 你確定要將好友 "%s" 從你的好友列表中移除? - -Are you sure that you want to remove the clan '%s' from your friends list? -== 你確定要將戰隊 "%s" 從你的好友列表中移除? - -Go back one tick -== 上一個 tick - -Go forward one tick -== 下一個 tick - -Go back one marker -== 返回上一個標記 - -Go forward one marker -== 跳至下一個標記 - -Are you sure that you want to delete the demo '%s'? -== 確定要刪除回放檔案 "%s" ? - -Unable to delete the demo '%s' -== 無法刪除回放檔案 "%s" - -Reset controls -== 恢復預設設定 - -Are you sure that you want to reset the controls to their defaults? -== 確定要將當前的控制恢復至預設設定? - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== 初始化失敗。請嘗試打開配置目錄中的設定檔案 (settings_ddnet.cfg) 并將 “gfx_backend” 設定為 “gfx_backend OpenGL” 或 “gfx_backend Vulkan” 再重試。 - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== 顯存不足。請嘗試移除自定義材質 (如外觀,實體層等等),尤其高分辨率的自定義材質。 - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== 指令記錄期間檢測到錯誤。請嘗試更新顯示卡驅動程式。 - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== 渲染指令錯誤。請嘗試更新顯示卡驅動程式。 - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== 渲染指令提交失敗。請嘗試更新顯示卡驅動程式。 - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== 幀緩存交替失敗。請嘗試更新顯示卡驅動程式。 - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== 未知錯誤。請嘗試打開配置目錄中的設定檔案 (settings_ddnet.cfg) 并將 “gfx_backend” 設定為 “gfx_backend OpenGL” 或 “gfx_backend Vulkan” 再重試。 - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== 無法初始化當前配置的圖形後端,正在將配置回退至預設圖形後端。 - -Open the directory that contains the demo files -== 打開存有回放檔案的資料夾路徑 - -Save power by lowering refresh rate (higher input latency) -== 節能模式 (限制幀率上限以降低功耗但也將提高輸入延遲) - -Open the settings file -== 打開設定檔案 - -Open the directory that contains the configuration and user files -== 打開存有配置檔案與用戶檔案的資料夾路徑 - -Open the directory to add custom themes -== 打開用以新增自定義主題的資料夾路徑 - -Open the directory to add custom skins -== 打開用以新增自定義外觀的資料夾路徑 - -No controller found. Plug in a controller. -== 未檢測到任何控制器。請嘗試重新連接控制器。 - -Unregister protocol and file extensions -== 解除連結與檔案類型關聯 - -Open the directory to add custom assets -== 打開用以新增自定義材質的資料夾路徑 - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== 無法初始化當前配置的圖形後端,請檢查此電腦是否已安裝集成顯卡的驅動程式。 - -Could not save downloaded map. Try manually deleting this file: %s -== 地圖下載失敗,請嘗試手動刪除此檔案:%s - -Copy info -== 複製伺服器資訊 - -Create a random skin -== 隨機創造外觀 - -Online clanmates (%d) -== 在綫戰隊隊友 (%d) - -[friends (server browser)] -Offline (%d) -== 離綫(%d) - -Click to select server. Double click to join your friend. -== 點擊以選擇伺服器,雙擊以直接加入好友所在伺服器 - -Click to remove this player from your friends list. -== 點擊以將此好友從好友列表中移除 - -Click to remove this clan from your friends list. -== 點擊以將此戰隊從好友列表中移除 - -Add Clan -== 新增戰隊 - -A demo with this name already exists -== 已經存在同名回放 - -No server selected -== 未選擇伺服器 - -Mark the beginning of a cut (right click to reset) -== 標記裁切起點 (右鍵重置) - -Mark the end of a cut (right click to reset) -== 標記裁切終點 (右鍵重置) - -Close the demo player -== 關閉回放 - -Export demo cut -== 另存裁切部分 - -Cut interval -== 裁切區間 - -Cut length -== 裁切長度 - -Axis -== 軸 - -Graphics card -== 顯示卡 - -Quitting. Please wait… -== 正在退出,請稍等 - -Restarting. Please wait… -== 正在重啟,請稍等 - -Multi-View -== 多人同框視角 - -Rename folder -== 重新命名資料夾 - -A folder with this name already exists -== 已經存在同名資料夾 - -Unable to rename the folder -== 無法重新命名這個資料夾 - -(paused) -== (暫停) - -All combined -== 全部檔案 - -Folder Link -== 資料夾連結 - -Are you sure that you want to delete the folder '%s'? -== 確定要刪除資料夾 "%s" ? - -Delete folder -== 刪除資料夾 - -Unable to delete the folder '%s'. Make sure it's empty first. -== 無法刪除 "%s" ,請確保你已清空該資料夾 - -Moved ingame -== 遊戲內移動 - -Error playing demo -== 回放播放錯誤 - -Some map images could not be loaded. Check the local console for details. -== 未能載入某些地圖圖片。檢查本機控制台以取得詳情。 - -Some map sounds could not be loaded. Check the local console for details. -== 未能載入某些地圖音效。檢查本機控制台以取得詳情。 - -Loading menu themes -== 正在載入主選單主題 - -Render complete -== 渲染完畢 - -Videos directory -== 影片目錄 - -Video was saved to '%s' -== 影片儲存至 "%s" - -Go back the specified duration -== 倒轉指定時長 - -[Demo player duration] -%d min. -== %d 分 - -[Demo player duration] -%d sec. -== %d 秒 - -Change the skip duration -== 變更指定時長 - -Go forward the specified duration -== 快轉指定時長 - -Render cut to video -== 渲染裁切部分 - -No demo selected -== 未選擇回放 - -Created -== 建立日期 - -Netversion -== Netversion - -[Demo details] -map not included -== 未包含地圖 - -Ghosts directory -== 影子目錄 - -Activate all -== 全部啟用 - -Deactivate all -== 全部停用 - -Enable ghost -== 啟用影子 - -Only save improvements -== 只儲存更佳記錄 - -Regular background color -== 原圖層背景顏色 - -Entities background color -== 實體層背景顏色 - -Saving settings to '%s' failed -== 無法儲存設定至 "%s" - -Searching -== 正在搜尋 - -Enter Username -== 輸入用戶名稱 - -Enter Password -== 輸入密碼 - -NOT CONNECTED -== 連線未成功 - -Match %d of %d -== 結果 %d / 總共 %d 則 - -No results -== 無結果 - -Lines %d - %d (%s) -== 行 %d - %d (%s) - -Locked -== 鎖定 - -Following -== 當前 - -Press a key… -== 按任意鍵… - -Are you sure that you want to restart? -== 確定要重新開始? - -There's an unsaved map in the editor, you might want to save it. -== 編輯器中有尚未儲存的地圖,你或需要儲存 - -Continue anyway? -== 仍要退出? - -Communities -== 社區 - -Please use a different filename -== 請使用不同的檔案名 - -Info Messages -== 訊息 - -Show local time always -== 始終顯示本地時間 - -Chat font size -== 聊天字體大小 - -Chat width -== 聊天框寬度 - -Authed name color in scoreboard -== 管理權限人員名字計分板顯示顔色 - -Same clan color in scoreboard -== 相同戰隊計分板顯示顔色 - -Show finish messages -== 顯示完成訊息 - -Failed saving the replay! -== 儲存回放失敗! - -Error saving settings -== 儲存設定錯誤 - -Loading commands… -== 正在載入指令… - -Main menu -== 主選單 - -Server filter -== 伺服器過濾器 - -Friends -== 好友 - -Loading… -== 正在載入… - -Loading demo file from storage -== 正在從硬盤中載入回放檔案 - -No login required -== 無需登入 - -Player info change cooldown -== 玩家資訊更改冷卻時間 - -Always show chat -== 始終顯示聊天框 - -Show friend mark (♥) in name plates -== 在暱稱上顯示好友標記 (♥) - -Show hook strength icon indicator -== 顯示鉤索強度圖示 - -Show hook strength number indicator -== 顯示鉤索強度數值 - -Show own player's hook collision line -== 顯示自己的鉤索輔助線 - -Always show own player's hook collision line -== 始終顯示自己的鉤索輔助線 - -Always show other players' hook collision lines -== 始終顯示其他玩家的鉤索輔助線 - -%d/%d KiB (%.1f KiB/s) -== %d/%d KiB (%.1f KiB/s) - -Tee -== Tee - -Show only chat messages from team members -== 只顯示隊伍聊天訊息 - -[Spectating] -Following %s -== 正在旁觀 %s - -Example of usage -== 用途示例 - -Round %d/%d -== 輪次 %d/%d - -[Spectators] -%d others… -== %d 其他… - -[Team and size] -%d\n(%d/%d) -== %d\n(%d/%d) - -Team %d (%d/%d) -== 隊伍 %d (%d/%d) - -https://wiki.ddnet.org/wiki/Mapping -== https://wiki.ddnet.org/index.php?title=Mapping/zh&variant=zh-hant - -Could not resolve connect address '%s'. See local console for details. -== 無法解析連線地址 '%s'。檢查本機控制台以取得詳情。 - -Connect address error -== 連線地址錯誤 - -Could not connect dummy -== 無法連線分身 - -Dummy is not allowed on this server -== 此服務器禁止使用分身 - -Please wait… -== 請稍等… - -Show client IDs (scoreboard, chat, spectator) -== 顯示客戶端 ID(計分板、聊天、旁觀者) - -Are you sure that you want to delete '%s'? -== 你確定要刪除'%s'嗎? - -Delete skin -== 刪除外觀 - -Basic -== 基本 - -Custom -== 自定義 - -Unable to delete skin -== 無法刪除外觀 - -Save skin -== 保存外觀 - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== 你確定要保存外觀嗎?如果已存在同名外觀,將會被替換。 - -Unable to save the skin -== 無法保存外觀 - -Unable to save the skin with a reserved name -== 無法保存使用保留名稱的外觀 - -No local servers found (ports %d-%d) -== 未找到本地伺服器(端口 %d-%d) - -[Hertz] -Hz -== Hz - -[skins] -Body -== 身體 - -[skins] -Marking -== 標記 - -[skins] -Decoration -== 裝飾 - -[skins] -Hands -== 手 - -[skins] -Feet -== 腳 - -[skins] -Eyes -== 眼睛 - -Some fonts could not be loaded. Check the local console for details. -== 未能載入某些字體。檢查本機控制台以取得詳情。 - -Online friends (%d) -== 在線好友(%d人) - -Add friends by entering their name below or by clicking their name in the player list. -== 在下方輸入好友名稱或點擊玩家列表中的好友的名稱即可添加好友 - -Add clanmates by entering their clan below and leaving the name blank. -== 在下方輸入戰隊名並留空名稱即可添加戰隊 - -Offline friends and clanmates will appear here. -== 離線好友和戰隊會顯示在這裡 - -Edit touch controls -== 編輯觸控設置 - -Close -== 關閉 - -Save changes -== 保存更改 - -Error saving touch controls -== 保存觸控設置錯誤 - -Could not save touch controls to file. See local console for details. -== 無法將觸控設置保存到文件。檢查本地控制台以獲得詳情 - -Unsaved changes -== 更改未保存 - -Discard changes -== 放棄更改 - -Are you sure that you want to discard the current changes to the touch controls? -== 確定要放棄當前對觸控設置的更改嗎? - -Are you sure that you want to reset the touch controls to default? -== 確定要將觸控設置重置為默認設置嗎? - -Import from clipboard -== 從剪貼簿導入 - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== 確定要從剪貼簿導入觸控設置嗎?這將覆蓋當前的觸控設置。 - -Export to clipboard -== 導出到剪貼簿 - -Direct touch input while ingame -== 遊戲時直接觸摸操作 - -[Direct touch input] -Disabled -== 禁用 - -[Direct touch input] -Active action -== 當前行為 - -[Direct touch input] -Aim -== 瞄準 - -[Direct touch input] -Fire -== 開火 - -[Direct touch input] -Hook -== 鉤索 - -Direct touch input while spectating -== 旁觀時直接觸摸操作 - -Error loading touch controls -== 加載觸控設置錯誤 - -Could not load touch controls from file. See local console for details. -== 無法從文件加載觸控設置。檢查本機控制台以獲取詳情。 - -Could not load default touch controls from file. See local console for details. -== 無法從文件加載默認觸控設置。檢查本機控制台以獲取詳情。 - -Could not load touch controls from clipboard. See local console for details. -== 無法從剪貼板加載觸控設置。檢查本機控制台以獲取詳情。 - -Width of your own hook collision line -== 自己的鉤索輔助線寬度 - -Width of others' hook collision line -== 其他玩家的鉤索輔助線寬度 - -Preview 'Hook collisions' being pressed -== 預覽按下時的鉤索輔助線 - -Aim -== 瞄準 - -Active: Fire -== 當前:開火 - -Active: Hook -== 當前:鉤鎖 - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== "%s" 與 pnglite 不兼容,無法被舊版本 DDNet 加載 - -Loading background map -== 加載背景地圖 - -[Spectating Camera Mode Icon] -AUTO -== 自動 - -Toggle auto camera -== 切換自動視角 - -https://wiki.ddnet.org/wiki/Touch_controls -== https://wiki.ddnet.org/index.php?title=Touch_controls/zh&variant=zh-hant - -Show client IDs in name plates -== 顯示客戶端 ID - -Hook Strength -== 鉤索強度 - -Size of hook strength icon and number indicator -== 鉤索強度圖示與數值的大小 - -Key Presses -== 按鍵顯示 - -Size of key press icons -== 按鍵顯示圖示大小 - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== 伺服器無法啟動。請確保在應用程式設置中授予通知權限,以便伺服器可以在後台運行。 diff --git a/data/languages/turkish.txt b/data/languages/turkish.txt deleted file mode 100644 index 93b0641f7f..0000000000 --- a/data/languages/turkish.txt +++ /dev/null @@ -1,2089 +0,0 @@ -##### authors ##### -#originally created by: -# Learath2 -#modified by: -# Learath2 2011-06-27 18:54:08 -# Learath2 2011-08-21 00:12:50 -# Learath2 2011-09-07 15:59:20 -# Learath2 2012-01-01 22:54:29 -# ardadem 2020-08-20 00:00:00 -# ardadem 2020-08-22 00:00:00 -# h-kaan 2023-08-23 15:57:36 -# h-kaan 2023-08-30 01:52:04 -# h-kaan 2023-09-21 21:04:35 -# eghwand 2024-03-03 13:24:20 -# Gokturk 2024-04-23 01:56:10 -# Gokturk 2024-04-24 03:01:50 -# Gokturk 2024-06-09 12:00:50 -# Gokturk 2024-07-17 02:24:00 -# Gokturk 2024-08-29 23:31:00 -# Gokturk 2024-09-29 19:23:00 -# Gokturk 2024-09-29 19:23:00 -# Gokturk 2024-11-04 11:32:00 -# Gokturk 2024-12-03 16:00:00 -##### /authors ##### - -##### translated strings ##### - -%ds left -== %ds kaldı - -%i minute left -== %i dakika kaldı - -%i minutes left -== %i dakika kaldı - -%i second left -== %i saniye kaldı - -%i seconds left -== %i saniye kaldı - -%s wins! -== %s kazandı! - -Abort -== İptal - -Add -== Ekle - -Add Friend -== Arkadaş Ekle - -Address -== Adres - -All -== Hepsi - -Are you sure that you want to quit? -== Çıkmak istediğinize emin misiniz? - -Automatically record demos -== Demoları otomatik olarak kaydet - -Automatically take game over screenshot -== Oyun bittiğinde otomatik olarak ekran görüntüsü al - -Blue team -== Mavi takım - -Blue team wins! -== Mavi takım kazandı! - -Body -== Gövde - -Call vote -== Oylama - -Change settings -== Ayarları değiştir - -Chat -== Sohbet - -Clan -== Klan - -Client -== İstemci - -Connecting to -== Bağlanılıyor - -Connection Problems… -== Bağlantı Hataları… - -Console -== Konsol - -Controls -== Kontroller - -Count players only -== Sadece oyuncuları say - -Current -== Şimdiki - -Custom colors -== Özel renkler - -Delete -== Sil - -Delete demo -== Demoyu sil - -Demofile: %s -== Demo dosyası: %s - -Demos -== Demolar - -Disconnect -== Bağlantıyı kes - -Disconnected -== Bağlantı kesildi - -Downloading map -== Harita yükleniyor - -Draw! -== Berabere! - -Dynamic Camera -== Dinamik Kamera - -Emoticon -== İfade - -Error -== Hata - -Error loading demo -== Demo yüklenirken hata oluştu - -Favorite -== Favori - -Favorites -== Favoriler - -Feet -== Ayak - -Fire -== Ateş - -Folder -== Klasör - -Force vote -== Oylamayı zorla - -Free-View -== Serbest Bakış - -Fullscreen -== Tam ekran - -Game -== Oyun - -Game info -== Oyun bilgisi - -Game over -== Oyun bitti - -Game type -== Oyun türü - -Game types: -== Oyun türleri: - -General -== Genel - -Graphics -== Grafik - -Grenade -== El bombası - -Hammer -== Çekiç - -Has people playing -== Oyuncu bulunduran - -High Detail -== Yüksek Detay - -Hook -== Kanca - -Invalid Demo -== Geçersiz Demo - -Join blue -== Maviye katıl - -Join red -== Kırmızıya katıl - -Jump -== Zıpla - -Kick player -== Oyuncuyu At - -Language -== Dil - -MOTD -== MOTD - -Map -== Harita - -Move left -== Sola git - -Move player to spectators -== Seyircilere katıl - -Move right -== Sağa git - -Movement -== Hareket - -Mute when not active -== Aktif değilken sessizleştir - -Name -== İsim - -Next weapon -== Sonraki silah - -Nickname -== Takma ad - -No -== Hayır - -No password -== Şifre yok - -No servers found -== Sunucu bulunamadı - -No servers match your filter criteria -== Filtre kriterlerinize uygun sunucu bulunamadı - -Ok -== Tamam - -Parent Folder -== Üst dizin - -Password -== Şifre - -Password incorrect -== Hatalı şifre - -Ping -== Ping - -Pistol -== Tabanca - -Play background music -== Arka plan müziğini oynat - -Player -== Oyuncu - -Players -== Oyuncular - -Please balance teams! -== Takımları dengeleyin! - -Prev. weapon -== Önceki silah - -Quit -== Çıkış - -Reason: -== Neden: - -Red team -== Kırmızı takım - -Red team wins! -== Kırmızı takım kazandı! - -Remote console -== Uzak konsol - -Remove -== Çıkar - -Remove friend -== Arkadaşı sil - -Rename demo -== Demonun adını değiştir - -Reset filter -== Filtreleri sıfırla - -Score -== Skor - -Score limit -== Skor limiti - -Scoreboard -== Skor tablosu - -Screenshot -== Ekran görüntüsü - -Server address: -== Sunucu adresi: - -Server info -== Sunucu bilgisi - -Server not full -== Sunucu dolu değil - -Shotgun -== Tüfek - -Show chat -== Sohbeti göster - -Show friends only -== Sadece arkadaşları göster - -Show ingame HUD -== Oyun içi arayüzünü göster - -Show name plates -== Oyuncu isimlerini göster - -Sound -== Ses - -Sound error -== Ses hatası - -Spectate -== İzle - -Spectate next -== Sıradakini izle - -Spectate previous -== Öncekini izle - -Spectator mode -== İzleyici modu - -Spectators -== İzleyiciler - -Stop record -== Kaydı durdur - -Strict gametype filter -== Sıkı oyun türü filtresi - -Sudden Death -== Ani ölüm - -Switch weapon on pickup -== Silah alındığıda yeni silahı kullan - -Team -== Takım - -Team chat -== Takım sohbeti - -The audio device couldn't be initialised. -== Ses donanımı başlatılamadı. - -The server is running a non-standard tuning on a pure game type. -== Bu sunucu standart olmayan bir ayarı saf bir oyun türünde kullanıyor. - -Time limit -== Süre limiti - -Time limit: %d min -== Süre limiti: %d dakika - -Try again -== Tekrar dene - -Type -== Tür - -Unable to rename the demo -== Demonun ismi değiştirilemiyor - -Use sounds -== Sesleri kullan - -Use team colors for name plates -== İsim etiketlerinde takım renklerini kullan - -V-Sync -== V-Sync - -Version -== Sürüm - -Vote command: -== Komut: - -Vote description: -== Açıklama: - -Vote no -== Olumsuz - -Vote yes -== Olumlu - -Voting -== Oylama - -Warmup -== Isınma - -Weapon -== Silah - -Yes -== Evet - -You must restart the game for all settings to take effect. -== Bütün ayarların aktif olması için oyunu yeniden başlatmalısınız. - -New name: -== Yeni isim: - -Sat. -== Doygunluk - -Miscellaneous -== Çeşitli - -Internet -== İnternet - -Max demos -== Maksimum Demo Sayısı - -News -== Haberler - -Join game -== Oyuna katıl - -FSAA samples -== FSAA örnekleri - -Sound volume -== Ses seviyesi - -Max Screenshots -== Maksimum Ekran Görüntüsü Sayısı - -Laser -== Lazer - -Hue -== Renk - -Record demo -== Demo kaydet - -Your skin -== Sizin görünüşünüz - -Reset to defaults -== Varsayılanlara getir - -Lht. -== Parlaklık - -UI Color -== Menü rengi - -Alpha -== Şeffaflık - -LAN -== LAN - -Name plates size -== Boyut - -Successfully saved the replay! -== Başarıyla kaydedildi! - -Replay feature is disabled! -== Yeniden oynatma özelliği devre dışı! - -Game paused -== Oyun durduruldu - -Server best: -== Sunucu en iyi: - -Personal best: -== Bireysel en iyi: - -Learn -== Öğren - -Browser -== Sunucular - -Ghost -== Hayalet - -Loading DDNet Client -== DDNet Client yükleniyor - -Reconnect in %d sec -== %d saniye içinde yeniden bağlanılacak - -Render demo -== Demo'yu işle - -Replace video -== Video üzerine yaz - -File already exists, do you want to overwrite it? -== Dosya halihazırda mevcut, üzerine yazılsın mı? - -Are you sure that you want to disconnect? -== Ayrılmak istediğinizden emin misiniz? - -Disconnect Dummy -== Dummy Ayrıl - -Are you sure that you want to disconnect your dummy? -== Dummy'nin bağlantısını koparmak istediğinizden emin misiniz? - -Welcome to DDNet -== DDNet'e hoş geldiniz - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDRaceNetwork bitiş çizgisine en kısa sürede ulaşmayı amaçlayan oyunculardan oluşan, çevrim içi bir takım oyunudur. Çaylak olarak ilk önce kolay haritalardan yani Novice sunuculardan oynamaya başlamanı öneririz. Size uygun sunucuyu seçerken pinginizi dikkate alın. - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Ölmek (yeniden başlamak) için "k" tuşu, oyunu durdurup diğer oyuncuları izlemek için "q" tuşunu kullanabilirsin. Diğer kontrollere ayarlardan bakabilirsin. - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Sunuculara bağlanmadan önce ayarları kontrol edip kendine göre düzenlemeni öneriyoruz. - -Please enter your nickname below. -== Lütfen takma adınızı girin. - -Video name: -== Video ismi: - -Show DDNet map finishes in server browser -== Tamamlanan DDNet haritalarını sunucu listesinde göster - -transmits your player name to info.ddnet.org -== oyuncu adını info.ddnet.org ile paylaşır - -Search -== Ara - -Exclude -== Hariç - -Player country: -== Oyuncu ülkesi: - -Filter connecting players -== Bağlanan oyuncuları sayma - -Indicate map finish -== Tamamlanmış haritaları göster - -Unfinished map -== Tamamlanmamış harita - -Countries -== Ülkeler - -Types -== Türler - -DDNet %s is out! -== DDNet %s yayınlandı! - -Downloading %s: -== İndiriliyor %s: - -Update failed! Check log… -== Güncelleme sırasında hata oluştu! - -DDNet Client updated! -== DDNet Client güncellendi! - -Update now -== Güncelle - -Restart -== Yeniden başlat - -Remove chat -== Sohbeti kaldır - -%.2f MiB -== %.2f MiB - -%.2f KiB -== %.2f KiB - -Demo -== Demo - -Markers -== İşaretler - -Length -== Uzunluk - -Date -== Tarih - -Fetch Info -== Bilgileri göster - -Connecting dummy -== Dummy bağlanıyor - -Connect Dummy -== Dummy Katıl - -Deactivate -== Devre dışı bırak - -Activate -== Etkinleştir - -Save -== Kaydet - -Switch weapon when out of ammo -== Mermi kalmadığında silahı değiştir - -Show only chat messages from friends -== Sadece arkadaşlardan gelen mesajları göster - -Show clan above name plates -== Oyuncu isimlerinin üstünde klanı göster - -Clan plates size -== Boyut - -Refresh Rate -== Yenileme Hızı - -Automatically take statboard screenshot -== Otomatik olarak skor tablosunun ekran görüntüsü al - -Automatically create statboard csv -== Otomatik olarak skor tablosunu csv olarak oluştur - -Max CSVs -== Maksimum CSVs - -Vanilla skins only -== Sadece vanilla skinleri - -Fat skins (DDFat) -== Şişko skinler (DDFat) - -Skin prefix -== Skin sıfatı - -Hook collisions -== Kanca çizgisi - -Pause -== Durdur - -Kill -== Öl - -Zoom in -== Yakınlaştır - -Zoom out -== Uzaklaştır - -Default zoom -== Varsayılan yakınlaştırma - -Show others -== Diğerlerini göster - -Show all -== Herkesi göster - -Toggle dyncam -== Dinamik kamera - -Toggle dummy -== Dummy kullan - -Toggle ghost -== Hayaleti göster - -Dummy copy -== Dummy kopyala - -Hammerfly dummy -== Çekiç uçuşu dummy - -Converse -== Konuşma - -Statboard -== Skor Tablosu - -Lock team -== Takımı kilitle - -Show entities -== Yapıları göster - -Show HUD -== Arayüzü göster - -may cause delay -== gecikmelere sebep olabilir - -Screen -== Ekran - -Use high DPI -== Yüksek DPI kullan - -Enable game sounds -== Oyun sesini etkinleştir - -Enable gun sound -== Silah sesini etkinleştir - -Enable long pain sound (used when shooting in freeze) -== Uzun ağlama sesini etkinleştir (freeze iken ateş edince kullanılır) - -Enable server message sound -== Sunucu mesaj sesini etkinleştir - -Enable regular chat sound -== Genel mesaj sesini etkinleştir - -Enable team chat sound -== Takım mesajı sesini etkinleştir - -Enable highlighted chat sound -== Vurgulanmış mesaj sesini etkinleştir - -Map sound volume -== Harita ses seviyesi - -HUD -== Arayüz - -DDNet -== DDNet - -DDNet Client needs to be restarted to complete update! -== Güncellemenin tamamlanabilmesi için oyunun yeniden başlatılması lazım! - -Show score -== Skoru göster - -Show names in chat in team colors -== Sohbette isimleri takım rengine göre ayır - -Show kill messages -== Ölüm mesajlarını göster - -Show votes window after voting -== Oyladıktan sonra oylama ekranını göstermeye devam et - -Messages -== Mesajlar - -System message -== Sistem mesajı - -Reset -== Sıfırla - -Highlighted message -== Vurgulanmış mesaj - -Team message -== Takım mesajı - -Friend message -== Arkadaş mesajı - -Normal message -== Normal mesaj - -Client message -== İstemci mesajı - -Save the best demo of each race -== Her yarış için en iyi demoyu kaydet - -Default length -== Varsayılan uzunluk - -Enable replays -== Tekrar oynatmaları etkinleştir - -Show ghost -== Hayaleti göster - -Save ghost -== Hayaleti kaydet - -Gameplay -== Oyun içi - -Overlay entities -== Üst katman yapıları - -Size -== Boyut - -Show text entities -== Yazı yapılarını göster - -Show others (own team only) -== Diğerlerini göster (sadece kendi takımını) - -Show quads -== Dörtgen yapıları göster - -AntiPing -== AntiPing - -AntiPing: predict other players -== AntiPing: diğer oyuncuları tahmin et - -AntiPing: predict weapons -== AntiPing: silahları tahmin et - -AntiPing: predict grenade paths -== AntiPing: el bombası yolunu tahmin et - -Show other players' hook collision lines -== Diğer oyuncuların kanca çizgisini göster - -Show other players' key presses -== Diğer oyuncuların tuş basışlarını göster - -Show tiles layers from BG map -== Yapı katmanlarını göster - -DDNet %s is available: -== DDNet %s yayınlandı: - -Updating… -== Güncelleniyor… - -No updates available -== Güncelleme mevcut değil - -Check now -== Kontrol et - -New random timeout code -== Yeni rastgele zaman aşımı kodu - -Time -== Süre - -Follow -== Takip et - -Frags -== Parçalanma - -Deaths -== Ölümler - -Suicides -== İntiharlar - -Ratio -== Oran - -Net -== Net - -FPM -== FPM - -Spree -== Spree - -Best -== En iyi - -Grabs -== Yakalama - -1 new mention -== 1 yeni bildirim - -%d new mentions -== %d yeni bildirim - -9+ new mentions -== 9+ yeni bildirim - -Manual -== Manual - -Race -== Yarış - -Auto -== Otomatik - -Replay -== Yeniden oynatma - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/wiki/Main_Page/tr - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Başlatma başarısız oldu. Konfigürasyon klasöründeki settings_ddnet.cfg dosyasında gfx_backend ayarını OpenGL veya Vulkan olarak değiştirmeyi deneyin. - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== VRAM tükendi. Özellikle yüksek çözünürlüklü olan özel kaynakları (skinler, yapılar, vb.) silmeyi deneyin. - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== Komut kaydı sırasında hata oluştu. GPU sürücülerini güncellemeyi deneyin. - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== Render komutu başarısız oldu. GPU sürücülerini güncellemeyi deneyin. - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== Render komutları gönderilemedi. GPU sürücülerini güncellemeyi deneyin. - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== Arabellek değiştirilemedi. GPU sürücülerini güncellemeyi deneyin. - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Bilinmeyen hata. Konfigürasyon klasöründeki settings_ddnet.cfg dosyasında gfx_backend ayarını OpenGL veya Vulkan olarak değiştirmeyi deneyin. - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== Verilen grafik işleyicisi başlatılamadı, varsayılan ayarlara dönülüyor. - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== Verilen grafik işleyicisi başlatılamadı, muhtemelen dahili ekran kartının sürücülerini yüklemediğinizden kaynaklanıyor. - -Could not save downloaded map. Try manually deleting this file: %s -== İndirilen map kaydedilemedi. Bu dosyayı manuel olarak silmeyi deneyin: %s - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== %s dokusunun genişliği %d'ye veya yüksekliği %d'ye bölünmüyor, bu görsel hatalara neden olabilir. - -The format of texture %s is not RGBA which will cause visual bugs. -== %s dokusunun formatı RGBA değil, bu görsel hatalara neden olacak. - -Preparing demo playback -== Demo oynatmaya hazırlanıyor - -Connected -== Bağlanıldı - -Loading map file from storage -== Harita dosyası yükleniyor - -Why are you slowmo replaying to read this? -== Neden bunu okumak için ağır çekimde izliyorsunuz? - -Initializing components -== Bileşenler başlatılıyor - -Initializing assets -== Kaynaklar yükleniyor - -Initializing map logic -== Harita içeriği yükleniyor - -Sending initial client info -== İstemciye ilk bilgiler gönderiliyor - -Warning -== Uyarı - -Quitting. Please wait… -== Çıkılıyor. Lütfen bekleyin… - -Restarting. Please wait… -== Yeniden başlatılıyor. Lütfen bekleyin… - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Hata ayıklama modu etkinleştirildi. Devre dışı bırakmak için Ctrl+Shift+D tuşlarına basın. - -Position: -== Pozisyon: - -Speed: -== Hız: - -Angle: -== Açı: - -Multi-View -== Çoklu İzleme - -Team %d -== Takım %d - -Uploading map data to GPU -== Harita verisi GPU'ya yükleniyor - -Trying to determine UDP connectivity… -== UDP bağlantısı belirlenmeye çalışılıyor… - -UDP seems to be filtered. -== UDP filtrelenmiş görünüyor. - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== UDP ve TCP IP adresleri farklı görünüyor. Proxy, VPN veya ağ hızlandırıcılarını devre dışı bırakmayı deneyin. - -No answer from server yet. -== Henüz sunucudan cevap alınamadı. - -Getting game info -== Oyun bilgisi alınıyor - -Requesting to join the game -== Oyuna girmeye çalışıyor - -Rename folder -== Klasör ismini değiştir - -Existing Player -== Var olan oyuncu - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Takma adınız '%s' başkası tarafından kullanılıyor (%d puan). Yine de kullanmak istiyor musunuz? - -Checking for existing player with your name -== Adınıza sahip diğer oyuncular aranıyor - -A demo with this name already exists -== Bu ada sahip bir demo zaten var - -A folder with this name already exists -== Bu ada sahip bir klasör zaten var - -Unable to rename the folder -== Klasör yeniden adlandırılamıyor - -File '%s' already exists, do you want to overwrite it? -== '%s' dosyası zaten var, üzerine yazmak istiyor musunuz? - -(paused) -== (duraklatıldı) - -Speed -== Hız - -Join Tutorial Server -== Öğretici sunucuya gir - -Skip Tutorial -== Öğreticiyi atla - -Theme -== Tema - -Loading menu images -== Menü resimleri yükleniyor - -AFR -== AFR - -ASI -== ASI - -AUS -== AUS - -EUR -== EUR - -NA -== NA - -SA -== SA - -CHN -== CHN - -Getting server list from master server -== Ana sunucudan sunucu listesi alınıyor - -%d of %d servers -== %2$d sunucunun %1$d tanesi - -%d of %d server -== %2$d sunucunun %1$d tanesi - -%d players -== %d oyuncu - -%d player -== %d oyuncu - -Are you sure that you want to disconnect and switch to a different server? -== Bağlantınızı kesip başka bir sunucuya girmek istediğinizden emin misiniz? - -Copy info -== Bilgiyi kopyala - -Leak IP -== IP'yi sızdır - -No server selected -== Sunucu seçilmedi - -Online clanmates (%d) -== Çevrim içi klan arkadaşları (%d) - -[friends (server browser)] -Offline (%d) -== Çevrim dışı (%d) - -Click to select server. Double click to join your friend. -== Sunucu seçmek için tıklayın. Arkadaşınıza katılmak için çift tıklayın. - -Click to remove this player from your friends list. -== Bu oyuncuyu arkadaş listesinden silmek için tıkla. - -Click to remove this clan from your friends list. -== Bu klanı arkadaş listesinden silmek için tıkla. - -Are you sure that you want to remove the player '%s' from your friends list? -== '%s' oyuncusunu arkadaş listenizden silmek istediğinize emin misiniz? - -Are you sure that you want to remove the clan '%s' from your friends list? -== '%s' klanını arkadaş listenizden silmek istediğinize emin misiniz? - -Add Clan -== Klan ekle - -Play the current demo -== Demoyu oynat - -Pause the current demo -== Demoyu duraklat - -Stop the current demo -== Demoyu durdur - -Go back one tick -== Bir tık geri git - -Go forward one tick -== Bir tık ileri git - -Slow down the demo -== Demoyu yavaşlat - -Speed up the demo -== Demoyu hızlandır - -Mark the beginning of a cut (right click to reset) -== Bir kesitin başlangıcını işaretleyin (sıfırlamak için sağ tıkla) - -Mark the end of a cut (right click to reset) -== Bir kesitin bitişini işaretleyin (sıfırlamak için sağ tıkla) - -Export cut as a separate demo -== Kesiti ayrı bir demo olarak dışarı aktar - -Go back one marker -== Bir işaret geri git - -Go forward one marker -== Bir işaret ileri git - -Close the demo player -== Demo oynatıcısını kapat - -Toggle keyboard shortcuts -== Klavye kısayollarını kullan - -Export demo cut -== Kesiti dışarı aktar - -Cut interval -== Kesit aralığı - -Cut length -== Kesit uzunluğu - -Loading demo files -== Demo dosyaları yükleniyor - -All combined -== Hepsi birlikte - -Folder Link -== Klasör Linki - -Demos directory -== Demo klasörü - -Open the directory that contains the demo files -== Demo dosyalarını içeren klasörü aç - -Are you sure that you want to delete the folder '%s'? -== '%s' klasörünü silmek istediğine emin misin? - -Are you sure that you want to delete the demo '%s'? -== '%s' demosunu silmek istediğine emin misin? - -Delete folder -== Klasörü sil - -Unable to delete the demo '%s' -== '%s' demosu silinemiyor - -Unable to delete the folder '%s'. Make sure it's empty first. -== '%s' klasörü silinemiyor. Önce boş olduğundan emin olun. - -Loading ghost files -== Hayalet dosyaları yükleniyor - -Menu opened. Press Esc key again to close menu. -== Menü açıldı. Menüyü kapatmak için Esc tuşuna tekrar basın. - -Smooth Dynamic Camera -== Yumuşak dinamik kamera - -Skip the main menu -== Ana menüyü atla - -Save power by lowering refresh rate (higher input latency) -== Tazeleme hızını düşürerek güç tasarrufu yap (daha yüksek girdi gecikmesi) - -Settings file -== Ayarlar dosyası - -Open the settings file -== Ayarlar dosyasını aç - -Config directory -== Konfigürasyon klasörü - -Open the directory that contains the configuration and user files -== Konfigürasyon ve kullanıcı dosyalarını içeren klasörü aç - -Themes directory -== Tema klasörü - -Open the directory to add custom themes -== Özel temalar eklemek için klasörü aç - -Loading skin files -== Skin dosyaları yükleniyor - -Download skins -== Skinleri indir - -Download community skins -== Topluluk skinlerini indir - -Choose default eyes when joining a server -== Bir sunucuya girerken kullanılacak varsayılan gözleri seçin - -Create a random skin -== Rastgele skin oluştur - -Skin Database -== Skin Veri Tabanı - -Skins directory -== Skin klasörü - -Open the directory to add custom skins -== Özel skinler eklemek için klasörü açın - -Chat command -== Sohbet komutu - -Enable controller -== Kontrolcüyü etkinleştir - -Controller -== Kontrolcü - -Ingame controller mode -== Oyun içi kontrolcü modu - -[Ingame controller mode] -Relative -== Bağıl - -[Ingame controller mode] -Absolute -== Mutlak - -Ingame controller sens. -== Oyun içi kontrolcü hassasiyeti - -UI controller sens. -== Arayüz kontrolcü hassasiyeti - -Controller jitter tolerance -== Kontrolcü titreşim toleransı - -No controller found. Plug in a controller. -== Kontrolcü bulunamadı. Bir Kontrolcü bağlayın. - -Axis -== Eksen - -Status -== Durum - -Aim bind -== Nişan alma - -Mouse -== Fare - -Ingame mouse sens. -== Oyun hassasiyeti - -UI mouse sens. -== Arayüz hassasiyeti - -Reset controls -== Kontrolleri sıfırla - -Are you sure that you want to reset the controls to their defaults? -== Kontrolleri varsayılan değerlerine döndürmek istediğine emin misin? - -Cancel -== İptal et - -Dummy -== Dummy - -Windowed -== Pencereli - -Windowed borderless -== Kenarsız pencereli - -Windowed fullscreen -== Pencereli tam ekran - -Desktop fullscreen -== Masaüstü tam ekran - -Allows maps to render with more detail -== Haritaların daha detaylı işlenmesine izin ver - -Renderer -== İşleyici - -default -== varsayılan - -custom -== özel - -Graphics card -== Ekran kartı - -auto -== otomatik - -Game sound volume -== Oyun ses seviyesi - -Chat sound volume -== Sohbet ses seviyesi - -Background music volume -== Arka plan müziği ses seviyesi - -Appearance -== Görünüm - -Assets -== Kaynaklar - -Name Plate -== İsim Etiketi - -Hook Collisions -== Kanca kesişmeleri - -Show health, shields and ammo -== Can, kalkan ve cephaneyi göster - -DDRace HUD -== DDRace arayüzü - -Show DDRace HUD -== DDRace arayüzünü göster - -Show jumps indicator -== Kaç zıplama kaldığını göster - -Show dummy actions -== Dummy aksiyonlarını göster - -Show player position -== Oyuncu pozisyonunu göster - -Show player speed -== Oyuncu hızını göster - -Show player target angle -== Oyuncu hedef açısını göster - -Show freeze bars -== Freeze barını göster - -Opacity of freeze bars inside freeze -== Freeze içerisindeyken freeze barının opaklığı - -Use old chat style -== Eski sohbet stilini kullan - -Preview -== Ön izleme - -Show local player's key presses -== Yerel oyuncunun tuş basışlarını göster - -Hook collision line -== Kanca çizgisi - -Hook collision line opacity -== Kanca çizgisi opaklığı - -Colors of the hook collision line, in case of a possible collision with: -== Olası bir kesişme durumunda kanca çizgisinin renkleri: - -Your movements are not taken into account when calculating the line colors -== Çizgi renkleri hesaplanırken hareketleriniz dikkate alınmaz - -Nothing hookable -== Kanca atılamaz - -Something hookable -== Kanca atılabilir - -A Tee -== Bir tee - -Normal Color -== Normal rengi - -Highlight Color -== Vurgu rengi - -Weapons -== Silahlar - -Rifle Laser Outline Color -== Tüfeğin Lazer Dış Rengi - -Rifle Laser Inner Color -== Tüfeğin Lazer İç Rengi - -Shotgun Laser Outline Color -== Pompalı Tüfeğin Lazer Dış Rengi - -Shotgun Laser Inner Color -== Pompalı Tüfeğin Lazer İç Rengi - -Entities -== Yapılar - -Door Laser Outline Color -== Kapının Lazer Dış Rengi - -Door Laser Inner Color -== Kapının Lazer İç Rengi - -Freeze Laser Outline Color -== Freeze Lazeri Dış Rengi - -Freeze Laser Inner Color -== Freeze Lazeri İç Rengi - -Set all to Rifle -== Hepsini tüfeğe göre ayarla - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Başlangıç çizgisini geçtiğinizde en iyi zamanınızın hareketlerini kopyalayan bir hayalet tee göster - -Opacity -== Opaklık - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Teeler ve isim etiketleri gibi diğer takımlara ait varlıkların opaklığını ayarlayın - -Quads are used for background decoration -== Dörtgen yapılar arka plan dekorasyonu için kullanılır - -Tries to predict other entities to give a feel of low latency -== Düşük gecikme hissi vermek için diğer yapıları tahmin etmeye çalışır - -Background -== Arka plan - -Use current map as background -== Mevcut haritayı arka plan olarak kullan - -Run on join -== Katılınca çalıştır - -Chat command (e.g. showall 1) -== Sohbet komutu (örn. showall 1) - -Unregister protocol and file extensions -== Protokol ve dosya uzantılarının kaydını sil - -Emoticons -== İfadeler - -Particles -== Parçacıklar - -Extras -== Ekstralar - -Loading assets -== Kaynaklar yükleniyor - -Assets directory -== Kaynak klasörü - -Open the directory to add custom assets -== Özel kaynak eklemek için klasörü açın - -Discord -== Discord - -https://ddnet.org/discord -== https://ddnet.org/discord - -Tutorial -== Öğretici - -Can't find a Tutorial server -== Öğretici sunucu bulunamıyor - -Website -== Web sitesi - -Settings -== Ayarlar - -Stop server -== Sunucuyu durdur - -Run server -== Sunucu aç - -Server executable not found, can't run server -== Çalıştırılabilir sunucu bulunamadı, sunucu başlatılamıyor - -Editor -== Editör - -[Start menu] -Play -== Oyna - -Loading race demo files -== Yarış demo dosyaları yükleniyor - -Super -== Süper - -Loading sound files -== Ses dosyaları yükleniyor - -Moved ingame -== Hareket edildi - -Go back the specified duration -== Belirtilen süre kadar geri git - -[Demo player duration] -%d min. -== %d dk. - -[Demo player duration] -%d sec. -== %d sn. - -Change the skip duration -== Atlanacak süreyi değiştir - -Go forward the specified duration -== Belirtilen süre kadar ileri git - -Render cut to video -== Kesiti videoya dönüştür - -Error playing demo -== Demo oynatırken hata oluştu - -Failed saving the replay! -== Tekrar kaydedilemedi! - -Saving settings to '%s' failed -== Ayarlar '%s' dosyasına kaydedilemedi - -Error saving settings -== Ayarları kaydederken hata oluştu - -Searching -== Aranıyor - -Enter Username -== Kullanıcı adı girin - -Enter Password -== Şifre girin - -NOT CONNECTED -== BAĞLI DEĞİL - -Match %d of %d -== %d'den %d'yi eşleştir - -No results -== Sonuç yok - -Lines %d - %d (%s) -== Satır %d - %d (%s) - -Locked -== Sabit - -Following -== Takipte - -Loading commands… -== Komutlar yükleniyor… - -Some map images could not be loaded. Check the local console for details. -== Bazı görseller yüklenemedi. Detaylar için konsolu kontrol edin. - -Some map sounds could not be loaded. Check the local console for details. -== Bazı sesler yüklenemedi. Detaylar için konsolu kontrol edin. - -Loading menu themes -== Temalar yükleniyor - -Press a key… -== Bir tuşa basın… - -Main menu -== Ana menü - -Render complete -== Video işleme tamamlandı - -Are you sure that you want to restart? -== Yeniden başlatmak istediğinizden eminmisiniz? - -There's an unsaved map in the editor, you might want to save it. -== Editörde kaydedilmemiş bir harita var, kaydetmek isteyebilirsiniz - -Continue anyway? -== Yine de devam et - -Videos directory -== Video dizini - -Video was saved to '%s' -== Video '%s' yoluna kaydedildi - -Communities -== Topluluklar - -Server filter -== Sunucu filtresi - -Friends -== Arkadaşlar - -Please use a different filename -== Farklı bir dosya adı kullanın - -No demo selected -== Demo seçilmedi - -Created -== Oluşturuldu - -Loading… -== Yükleniyor… - -Ghosts directory -== Hayalet dizini - -Activate all -== Tümünü etkinleştir - -Deactivate all -== Tümünü devre dışı bırak - -Info Messages -== Bilgi Mesajları - -Show local time always -== Yerel saati her zaman göster - -Chat font size -== Yazı tipi büyüklüğü - -Chat width -== Sohbet genişliği - -Authed name color in scoreboard -== Skor tablosunda yetkili isim rengi - -Same clan color in scoreboard -== Skor tablosunda aynı klan rengi - -Show finish messages -== Bitirme mesajlarını göster - -Enable ghost -== Hayaleti etkinleştir - -Only save improvements -== Sadece iyileştirmeleri kaydet - -Regular background color -== Normal arka plan rengi - -Entities background color -== Yapı arka plan rengi - -Loading demo file from storage -== Cihazdaki demo dosyası yükleniyor - -No login required -== Giriş yapılmasına gerek yok - -Netversion -== Netversion - -Player info change cooldown -== Oyuncu bilgisini değiştirmek için bekleme süresi - -Always show chat -== Sohbeti her zaman göster - -Show friend mark (♥) in name plates -== İsim etiketlerinde arkadaşlık simgesini (♥) göster - -Show hook strength icon indicator -== Kancanın güç göstergesini göster - -Show hook strength number indicator -== Kancanın güç numarası göstergesini göster - -Show own player's hook collision line -== Karakterinin kanca çarpışma çizgini göster - -Always show own player's hook collision line -== Karakterinin her zaman kanca çarpışma çizgini göster - -Always show other players' hook collision lines -== Diğerlerinin kanca çarpışma çizgini göster - -[Demo details] -map not included -== harita dahil edilmemiş - -%d/%d KiB (%.1f KiB/s) -== %d/%d KiB (%.1f KiB/s) - -Tee -== Tee - -Show only chat messages from team members -== Sadece takım üyelerinin mesajlarını göster - -[Spectating] -Following %s -== İzleniyor %s - -Example of usage -== Kullanım örneği - -Round %d/%d -== Yuvarlak %d/%d - -[Spectators] -%d others… -== %d diğerleri… - -[Team and size] -%d\n(%d/%d) -== %d\n(%d/%d) - -Team %d (%d/%d) -== Takım %d (%d/%d) - -https://wiki.ddnet.org/wiki/Mapping -== https://wiki.ddnet.org/wiki/Mapping/tr - -Could not resolve connect address '%s'. See local console for details. -== '%s' bağlantı adresi çözümlenemedi. Detaylar için yerel konsola bakın. - -Connect address error -== Bağlantı adresi hatası - -Could not connect dummy -== Dummy bağlanamadı - -Dummy is not allowed on this server -== Bu sunucuda dummy izin verilmiyor - -Please wait… -== Lütfen bekleyin… - -Show client IDs (scoreboard, chat, spectator) -== İstemci ID'sini göster (skor tablosu, sohbet, izleyici) - -Are you sure that you want to delete '%s'? -== '%s' bunu silmek istediğine emin misin? - -Delete skin -== Skini sil - -Basic -== Basit - -Custom -== Özel - -Unable to delete skin -== Skin silinemiyor - -Save skin -== Skini kaydet - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== Skini kaydetmek istiyor musun? Bu isimde başka bir skin varsa, bu skin varolan skin yerine kaydedilecek. - -Unable to save the skin -== Skin kaydedilemiyor - -Unable to save the skin with a reserved name -== Skin kaydedilemiyor bu isimde zaten bir skin var - -No local servers found (ports %d-%d) -== Yerel sunucu bulunamadı (bağlantı noktası %d-%d) - -[Hertz] -Hz -== Hz - -[skins] -Body -== Gövde - -[skins] -Marking -== İşaretleme - -[skins] -Decoration -== Dekorasyon - -[skins] -Hands -== El - -[skins] -Feet -== Ayak - -[skins] -Eyes -== Göz - -Some fonts could not be loaded. Check the local console for details. -== Bazı fontlar yüklenemiyor. Detaylar için konsolu kontrol edin. - -Online friends (%d) -== Çevrim içi arkadaşlar (%d) - -Add friends by entering their name below or by clicking their name in the player list. -== Aşağıya isim girerek veya oyuncu listesinden isme tıklayarak arkadaş ekle. - -Add clanmates by entering their clan below and leaving the name blank. -== Klan arkadaşlarınızı klanlarını aşağıya girerek ve isimlerini boş bırakarak ekleyin. - -Offline friends and clanmates will appear here. -== Çevrim dışı arkadaşlar ve klan arkadaşları burada görünecek. - -Edit touch controls -== Dokunmatik ayarlarını düzelt - -Close -== Kapat - -Save changes -== Değişiklikleri kaydet - -Error saving touch controls -== Dokunmatik ayarları kaydedilirken bir hata oldu - -Could not save touch controls to file. See local console for details. -== Dokunmatik ayarları dosyalara kaydedilemedi. Detaylar için yerel konsola bakın. - -Unsaved changes -== Kaydedilmemiş değişiklikler - -Discard changes -== Değişiklikleri iptal et - -Are you sure that you want to discard the current changes to the touch controls? -== Dokunmatik ayarlarındaki değişiklikleri iptal etmek istediğinden emin misin? - -Are you sure that you want to reset the touch controls to default? -== Dokunmatik ayarlarını varsayılan ayarlarına döndürmek istediğinden emin misin? - -Import from clipboard -== Panodan içeri aktar - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== Dokunmatik ayarlarını panodan içeri aktarmak istediğine emin misin? Bu şu anki kontrollerin üzerine yazılacak. - -Export to clipboard -== Panodan dışarı aktar - -Direct touch input while ingame -== Oyun içindeyken doğrudan dokunmatik giriş - -[Direct touch input] -Disabled -== Devre dışı - -[Direct touch input] -Active action -== Aktif aksiyon - -[Direct touch input] -Aim -== Aim - -[Direct touch input] -Fire -== Ateş - -[Direct touch input] -Hook -== Kanca - -Direct touch input while spectating -== Gezinme modundayken dokunarak doğrudan giriş - -Error loading touch controls -== Dokunmatik ayarları yüklenirken bir hata oluştu - -Could not load touch controls from file. See local console for details. -== Dokunmatik ayarları dosyalardan yüklenemedi. Detaylar için konsola bakın. - -Could not load default touch controls from file. See local console for details. -== Varsayılan dokunmatik ayarları dosyalardan yüklenemedi. Detaylar için konsola bakın. - -Could not load touch controls from clipboard. See local console for details. -== Dokunmatik ayarları panodan yüklenemedi. Detaylar için konsola bakın. - -Width of your own hook collision line -== Kendi kancanın çarpışma çizgisi kalınlığı - -Width of others' hook collision line -== Başkalarının kancalarının çarpışma çizgisi kalınlığı - -Preview 'Hook collisions' being pressed -== Önizleme 'Kanca çarpışmaları' gösteriliyor - -Aim -== Aim - -Active: Fire -== Aktif: Ateş etme - -Active: Hook -== Aktif: Kanca - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Loading background map -== - -[Spectating Camera Mode Icon] -AUTO -== - -Toggle auto camera -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Show client IDs in name plates -== - -Hook Strength -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== diff --git a/data/languages/ukrainian.txt b/data/languages/ukrainian.txt deleted file mode 100644 index 3165c1a1c3..0000000000 --- a/data/languages/ukrainian.txt +++ /dev/null @@ -1,2073 +0,0 @@ -##### authors ##### -#originally created by: -# .ua and Ivan. REWORKED BY SwiatoslaW#2927 (09.12.2021) -#modified by: -# 404_not_found 2011-07-30 19:50:58 -# EGYT5453 (15.05.2024-04.06.2024) -# veydzh3r (31.08.2024-01.09.2024) -##### /authors ##### - -##### translated strings ##### - -%.2f KiB -== %.2f КіБ - -%.2f MiB -== %.2f МіБ - -[Demo player duration] -%d min. -== %dхв - -%d new mentions -== Нових згадок: %d - -%d of %d server -== Сервери: %d з %d - -%d of %d servers -== Сервери: %d з %d - -[Spectators] -%d others… -== ще %d… - -%d player -== Гравці: %d - -%d players -== Гравці: %d - -[Demo player duration] -%d sec. -== %dс - -%d/%d KiB (%.1f KiB/s) -== %d/%d КіБ (%.1f КіБ/с) - -[Team and size] -%d\n(%d/%d) -== %d\n(%d з %d) - -%ds left -== залишилося %dс - -%i minute left -== Залишилося: %iхв - -%i minutes left -== Залишилося: %iхв - -%i second left -== Залишилося: %iс - -%i seconds left -== Залишилося: %iс - -%s wins! -== %s перемагає! - -(paused) -== (призупинено) - -1 new mention -== Нових згадок: 1 - -9+ new mentions -== Нових згадок: 9+ - -A demo with this name already exists -== Демо з цією назвою уже існує - -A folder with this name already exists -== Тека з цією назвою уже існує - -[Graphics error] -A render command failed. Try to update your GPU drivers. -== Помилка в команді відмальовування. Спробуйте оновити драйвери відеокарти. - -A Tee -== тії - -Abort -== Скасувати - -[Ingame controller mode] -Absolute -== Абсолютний - -Activate -== Активувати - -Activate all -== Активувати усіх - -[Direct touch input] -Active action -== Поточна дія - -Active: Fire -== Поточне: Вогонь - -Active: Hook -== Поточне: Гак - -Add -== Додати - -Add Clan -== Додати клан - -Add clanmates by entering their clan below and leaving the name blank. -== Додайте співклановців, ввівши їх клан нижче і залишивши поле "Нік" пустим. - -Add Friend -== Додати друга - -Add friends by entering their name below or by clicking their name in the player list. -== Додайте друзів, ввівши їх нікнейми нижче або натиснувши на їх нікнейми у списку гравців. - -Address -== Адреса - -Adjust the opacity of entities belonging to other teams, such as tees and name plates -== Налаштуйте непрозорість сутностей інших команд, як от тії та ніків - -AFR -== АФР - -[Direct touch input] -Aim -== Прицілювання - -Aim -== Прицілювання - -Aim bind -== Прив’язка - -All -== Усі - -All combined -== Усі разом - -Allows maps to render with more detail -== Дозволяє мапам відмальовувати більше деталей - -Alpha -== Альфа - -Always show chat -== Завжди показувати чат - -Always show other players' hook collision lines -== Завжди показувати лінії зіткнення гака інших гравців - -Always show own player's hook collision line -== Завжди показувати власну лінію зіткнення гака - -[Graphics error] -An error during command recording occurred. Try to update your GPU drivers. -== Виникла помилка під час запису команд. Спробуйте оновити драйвери відеокарти. - -Angle: -== Кут: - -AntiPing -== АнтиПінг - -AntiPing: predict grenade paths -== АнтиПінг: передбачувати траєкторії гранат - -AntiPing: predict other players -== АнтиПінг: передбачувати інших гравців - -AntiPing: predict weapons -== АнтиПінг: передбачувати зброю - -Appearance -== Вигляд - -Are you sure that you want to delete '%s'? -== Ви дійсно бажаєте видалити '%s'? - -Are you sure that you want to delete the demo '%s'? -== Ви дійсно бажаєте видалити демо '%s'? - -Are you sure that you want to delete the folder '%s'? -== Ви дійсно бажаєте видалити теку '%s'? - -Are you sure that you want to discard the current changes to the touch controls? -== Ви дійсно бажаєте скасувати поточні зміни до сенсорного керування? - -Are you sure that you want to disconnect? -== Ви дійсно бажаєте від’єднатися? - -Are you sure that you want to disconnect and switch to a different server? -== Ви дійсно бажаєте від’єднатися й приєднатися до іншого сервера? - -Are you sure that you want to disconnect your dummy? -== Ви дійсно бажаєте від’єднати свого даммі? - -Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls. -== Ви дійсно бажаєте імпортувати сенсорне керування з буфера обміну? Це перезапише ваші поточні налаштування. - -Are you sure that you want to quit? -== Ви дійсно бажаєте вийти? - -Are you sure that you want to remove the clan '%s' from your friends list? -== Ви дійсно бажаєте прибрати клан '%s' зі списку друзів? - -Are you sure that you want to remove the player '%s' from your friends list? -== Ви дійсно бажаєте прибрати гравця '%s' зі списку друзів? - -Are you sure that you want to reset the controls to their defaults? -== Ви дійсно бажаєте скинути налаштування керувань до початкових значень? - -Are you sure that you want to reset the touch controls to default? -== Ви дійсно бажаєте скинути сенсорне керування до початкових значень? - -Are you sure that you want to restart? -== Ви дійсно бажаєте перезапустити? - -Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced. -== Ви дійсно бажаєте зберегти ваш скін? Якщо скін із цією назвою вже існує, його буде замінено. - -ASI -== АЗІ - -Assets -== Текстури - -Assets directory -== Тека текстур - -AUS -== АВС - -Authed name color in scoreboard -== Колір авторизованих у таблиці - -Auto -== Авто - -auto -== автоматично - -Automatically create statboard csv -== Автоматично зберігати статистику у файл CSV - -Automatically record demos -== Автоматично записувати демо - -Automatically take game over screenshot -== Автоматично робити знімки екрана кінця гри - -Automatically take statboard screenshot -== Автоматично робити знімки екрана статистики - -Axis -== Осі - -Background -== Тло - -Background music volume -== Гучність фонової музики - -Basic -== Базовий - -Best -== НКом - -Blue team -== Сині - -Blue team wins! -== Сині перемогли! - -[skins] -Body -== Тулуб - -Body -== Тулуб - -Browser -== Браузер - -Call vote -== Голосувати - -Can't find a Tutorial server -== Не вдається знайти навчальний сервер - -Cancel -== Скасувати - -Change settings -== Змінити налаштування - -Change the skip duration -== Змінити інтервал перемотки - -Chat -== Чат - -Chat command -== Команда в чат - -Chat command (e.g. showall 1) -== Команда (наприклад, showall 1) - -Chat font size -== Розмір шрифту чату - -Chat sound volume -== Гучність чату - -Chat width -== Ширина чату - -Check now -== Перевірити - -Checking for existing player with your name -== Перевірка на наявність гравця з вашим ім’ям - -CHN -== КИТ - -Choose default eyes when joining a server -== Типові очі під час приєднання до сервера - -Clan -== Клан - -Clan plates size -== Розмір назви клану - -Click to remove this clan from your friends list. -== Натисніть, щоб прибрати цей клан зі списку друзів. - -Click to remove this player from your friends list. -== Натисніть, щоб прибрати цього гравця зі списку друзів. - -Click to select server. Double click to join your friend. -== Натисніть, щоб вибрати сервер. Натисніть двічі, щоб приєднатися до свого друга. - -Client -== Клієнт - -Client message -== Повідомлення клієнта - -Close -== Закрити - -Close the demo player -== Закрити програвач демо - -Colors of the hook collision line, in case of a possible collision with: -== Кольори лінії зіткнення гака, в разі можливого зіткнення з: - -Communities -== Спільноти - -Config directory -== Тека налаштувань - -Connect address error -== Помилка адреси з’єднання - -Connect Dummy -== Під’єднати даммі - -Connected -== Під’єднано - -Connecting dummy -== Під’єднання даммі - -Connecting to -== Під’єднання до - -Connection Problems… -== Проблеми зі з’єднанням… - -Console -== Консоль - -Continue anyway? -== Усе одно продовжити? - -Controller -== Контролер - -Controller jitter tolerance -== Мертва зона - -Controls -== Керування - -Converse -== Приватний чат - -Copy info -== Скопіювати - -Could not connect dummy -== Не вдалося під’єднати даммі - -[Graphics error] -Could not initialize the given graphics backend, reverting to the default backend now. -== Не вдалося ініціалізувати заданий графічний рушій, повернення до тпового рушія. - -[Graphics error] -Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. -== Не вдалося ініціалізувати заданий графічний рушій, імовірно, ви не встановили драйвери на вбудовану відеокарту. - -Could not load default touch controls from file. See local console for details. -== Не вдалося завантажити стандартне сенсорне керування з файлу. Див. локальну консоль для подробиць. - -Could not load touch controls from clipboard. See local console for details. -== Не вдалося завантажити сенсорне керування з файлу. Див. локальну консоль для подробиць. - -Could not load touch controls from file. See local console for details. -== Не вдалося завантажити сенсорне керування з файлу. Див. локальну консоль для подробиць. - -Could not resolve connect address '%s'. See local console for details. -== Не вдалося визначити адресу з’єднання '%s'. Див. локальну консоль для подробиць. - -Could not save downloaded map. Try manually deleting this file: %s -== Не вдалося зберегти завантажену мапу. Спробуйте самостійно видалити цей файл: %s - -Could not save touch controls to file. See local console for details. -== Не вдалося зберегти сенсорне керування до файлу. Див. локальну консоль для подробиць. - -Count players only -== Рахувати лише гравців - -Countries -== Країни - -Create a random skin -== Створити випадковий скін - -Created -== Створено - -Current -== Поточні налаштування - -custom -== власний - -Custom -== Власний - -Custom colors -== Власні кольори - -Cut interval -== Інтервал - -Cut length -== Тривалість - -Date -== Дата - -DDNet -== DDNet - -DDNet %s is available: -== Доступний DDNet %s: - -DDNet %s is out! -== Вийшов DDNet %s! - -DDNet Client needs to be restarted to complete update! -== Потрібно перезапустити клієнт DDNet для завершення оновлення! - -DDNet Client updated! -== Клієнт DDNet оновлено! - -DDRace HUD -== HUD DDRace - -DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. -== DDraceNetwork — кооперативна мережева гра, ціль якої — дістатися разом зі своєю групою тії до фінішної прямої. Новачкам варто почати із серверів «Для новачків» (Novice), на яких є найпростіші мапи. Зважайте на затримку, коли вибираєте сервер. - -Deactivate -== Деактивувати - -Deactivate all -== Деактивувати всіх - -Deaths -== Смерті - -Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. -== Увімкнено режим налагодження. Натисніть Ctrl+Shift+D, щоб його вимкнути. - -[skins] -Decoration -== Прикраса - -default -== типово - -Default length -== Звичайна тривалість - -Default zoom -== Звичайний масштаб - -Delete -== Видалити - -Delete demo -== Видалити демо - -Delete folder -== Видалити теку - -Delete skin -== Видалити скін - -Demo -== Демо - -Demofile: %s -== Демо-файл: %s - -Demos -== Демо - -Demos directory -== Тека демо - -Desktop fullscreen -== Робочий стіл на весь екран - -Direct touch input while ingame -== Прямий сенсорний ввід у грі - -Direct touch input while spectating -== Прямий сенсорний ввід під час спостерігання - -[Direct touch input] -Disabled -== Вимкнено - -Discard changes -== Скасувати зміни - -Disconnect -== Від’єднатися - -Disconnect Dummy -== Від’єднати даммі - -Disconnected -== Від’єднано - -Discord -== Discord - -Door Laser Inner Color -== Колір лазерних дверей - -Door Laser Outline Color -== Колір контуру лазерних дверей - -Download community skins -== Завантажувати скіни спільноти - -Download skins -== Завантажувати скіни - -Downloading %s: -== Завантаження %s: - -Downloading map -== Завантаження мапи - -Draw! -== Нічия! - -Dummy -== Даммі - -Dummy copy -== Повторювати рухи - -Dummy is not allowed on this server -== Використання даммі заборонене на цьому сервері - -Dynamic Camera -== Динамічна камера - -Edit touch controls -== Змінити сенсорне керування - -Editor -== Редактор - -Emoticon -== Смайлик - -Emoticons -== Смайлики - -Enable controller -== Увімкнути контролер - -Enable game sounds -== Ігрові звуки - -Enable ghost -== Увімкнути привида - -Enable gun sound -== Звуки пострілів - -Enable highlighted chat sound -== Звук виділеного повідомлення - -Enable long pain sound (used when shooting in freeze) -== Довгий крик болі (при стрільбі у заморозці) - -Enable regular chat sound -== Звук звичайного повідомлення - -Enable replays -== Увімкнути повтори - -Enable server message sound -== Звук повідомлення сервера - -Enable team chat sound -== Звук повідомлення команди - -Enter Password -== Введіть пароль - -Enter Username -== Введіть ім’я користувача - -Entities -== Сутності - -Entities background color -== Колір тла сутностей - -Error -== Помилка - -Error loading demo -== Помилка завантаження демо - -Error loading touch controls -== Помилка завантаження сенсорного керування - -Error playing demo -== Помилка відтворення демо - -Error saving settings -== Помилка збереження налаштувань - -Error saving touch controls -== Помилка збереження сенсорного керування - -EUR -== ЄВР - -Example of usage -== Приклад використання - -Exclude -== Виключити - -Existing Player -== Гравець уже існує - -Export cut as a separate demo -== Експортувати фрагмент як окреме демо - -Export demo cut -== Експортувати фрагмент демо - -Export to clipboard -== Експортувати до буфера обміну - -Extras -== Додатково - -[skins] -Eyes -== Очі - -[Graphics error] -Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Помилка під час ініціалізації. Спробуйте змінити gfx_backend на OpenGL чи Vulkan у settings_ddnet.cfg у теці налаштувань і спробуйте ще раз. - -Failed saving the replay! -== Не вдалося зберегти повтор! - -[Graphics error] -Failed to swap framebuffers. Try to update your GPU drivers. -== Помилка зміни буферів кадру. Спробуйте оновити драйвери відеокарти. - -Fat skins (DDFat) -== Товсті скіни (DDFat) - -Favorite -== Улюблений - -Favorites -== Улюблені - -[skins] -Feet -== Ноги - -Feet -== Ноги - -Fetch Info -== Зчитувати все - -File '%s' already exists, do you want to overwrite it? -== Файл '%s' вже існує, бажаєте перезаписати його? - -File already exists, do you want to overwrite it? -== Файл уже існує, бажаєте перезаписати його? - -Filter connecting players -== Не врах. тих, що приєднуються - -Fire -== Вогонь - -[Direct touch input] -Fire -== Вогонь - -Folder -== Тека - -Folder Link -== Ярлик теки - -Follow -== Слідування - -Following -== Слідування - -[Spectating] -Following %s -== Cпостерігання за %s - -Force vote -== Форсувати - -FPM -== У/хв - -Frags -== У - -Free-View -== Вільна камера - -Freeze Laser Inner Color -== Колір заморожуючого лазера - -Freeze Laser Outline Color -== Колір контуру заморожуючого лазера - -Friend message -== Повідомлення друга - -Friends -== Друзі - -FSAA samples -== Вибірка FSAA - -Fullscreen -== На весь екран - -Game -== Гра - -Game info -== Інформація про гру - -Game over -== Кінець гри - -Game paused -== Гру призупинено - -Game sound volume -== Гучність ігрових звуків - -Game type -== Тип гри - -Game types: -== Типи гри: - -Gameplay -== Ігролад - -General -== Загальні - -Getting game info -== Отримання інформації про гру - -Getting server list from master server -== Отримання списку серверів з головного сервера - -Ghost -== Привид - -Ghosts directory -== Тека привидів - -Go back one marker -== Перемотати до попередньої мітки - -Go back one tick -== Перемотати вперед на один такт - -Go back the specified duration -== Перемотати назад - -Go forward one marker -== Перемотати до наступної мітки - -Go forward one tick -== Перемотати вперед на один такт - -Go forward the specified duration -== Перемотати вперед - -Grabs -== З - -Graphics -== Графіка - -Graphics card -== Відеокарта - -Grenade -== Гранатомет - -Hammer -== Молот - -Hammerfly dummy -== Гаммерфлай - -[skins] -Hands -== Руки - -Has people playing -== Має гравців - -High Detail -== Висока деталізація - -Highlight Color -== Колір виділених повідомлень - -Highlighted message -== Виділене повідомлення - -Hook -== Гак - -[Direct touch input] -Hook -== Гак - -Hook Collisions -== Зіткнення гака - -Hook collision line -== Лінія зіткнення гака - -Hook collision line opacity -== Непрозорість лінії зіткнення гака - -Hook collisions -== Зіткнення гака - -https://ddnet.org/discord -== https://ddnet.org/discord - -https://wiki.ddnet.org/ -== https://wiki.ddnet.org/ - -https://wiki.ddnet.org/wiki/Mapping -== https://wiki.ddnet.org/wiki/Mapping - -HUD -== HUD - -Hue -== Відтінок - -[Hertz] -Hz -== Гц - -Import from clipboard -== Імпортувати з буфера обміну - -Indicate map finish -== Позначати пройдені мапи - -Info Messages -== Інфо. повідомлення - -Ingame controller mode -== Режим контролера у грі - -Ingame controller sens. -== Чутливість у грі - -Ingame mouse sens. -== Чутливість у грі - -Initializing assets -== Ініціалізація текстур - -Initializing components -== Ініціалізація компонентів - -Initializing map logic -== Ініціалізація логіки мапи - -Internet -== Інтернет - -Invalid Demo -== Недійсне демо - -It's recommended that you check the settings to adjust them to your liking before joining a server. -== Перед тим, як приєднатися до сервера, рекомендуємо змінити налаштування до ваших уподобань. - -Join blue -== До синіх - -Join game -== Приєднатися - -Join red -== До червоних - -Join Tutorial Server -== Приєднатися до навчального сервера - -Jump -== Стрибок - -Kick player -== Вигнати гравця - -Kill -== Смерть - -LAN -== Локальна мережа - -Language -== Мова - -Laser -== Лазер - -Leak IP -== Витік IP - -Learn -== Вікі - -Length -== Тривалість - -Lht. -== Світл. - -Lines %d - %d (%s) -== Рядки %d—%d (%s) - -Loading… -== Завантаження… - -Loading assets -== Завантаження текстур - -Loading commands… -== Завантаження команд… - -Loading DDNet Client -== Завантаження клієнта DDNet - -Loading demo file from storage -== Завантаження демо-файлу зі сховища - -Loading demo files -== Завантаження демо-файлів - -Loading ghost files -== Завантаження файлів привида - -Loading map file from storage -== Завантаження файлу мапи зі сховища - -Loading menu images -== Завантаження зображень меню - -Loading menu themes -== Завантаження тем меню - -Loading race demo files -== Завантаження демо-файлів забігів - -Loading skin files -== Завантаження файлів скінів - -Loading sound files -== Завантаження звукових файлів - -Lock team -== Замкнути команду - -Locked -== Замкнено - -Main menu -== Головне меню - -Manual -== Уручну - -Map -== Мапа - -[Demo details] -map not included -== мапу не включено - -Map sound volume -== Гучність звуків мапи - -Mark the beginning of a cut (right click to reset) -== Позначити початок фрагмента (права кнопка миші, щоб скинути) - -Mark the end of a cut (right click to reset) -== Позначити кінець фрагмента (права кнопка миші, щоб скинути) - -Markers -== Мітки - -[skins] -Marking -== Візерунок - -Match %d of %d -== Збіг %d з %d - -Max CSVs -== Макс. кількість файлів CSV - -Max demos -== Макс. кількість демо-файлів - -Max Screenshots -== Макс. кількість знімків екрана - -may cause delay -== може спричинити затримку - -Menu opened. Press Esc key again to close menu. -== Відкрито меню. Натисніть Esc, щоб його закрити. - -Messages -== Повідомлення - -Miscellaneous -== Різне - -MOTD -== Повідомлення дня - -Mouse -== Миша - -Move left -== Вліво - -Move player to spectators -== Зробити гравця глядачем - -Move right -== Вправо - -Moved ingame -== Рух у грі - -Movement -== Рух - -Multi-View -== Мульти-камера - -Mute when not active -== Приглушувати звук поза грою - -NA -== ПНА - -Name -== Нік - -Name Plate -== Ніки - -Name plates size -== Розмір ніків - -Net -== Різн. - -Netversion -== Версія - -New name: -== Нова назва: - -New random timeout code -== Новий випадковий код тайм-ауту - -News -== Новини - -Next weapon -== Наст. зброя - -Nickname -== Нікнейм - -No -== Ні - -No answer from server yet. -== Поки що немає відповіді від сервера. - -No controller found. Plug in a controller. -== Жодного контролера не знайдено. Під’єднайте контролер. - -No demo selected -== Жодного демо не вибрано - -No local servers found (ports %d-%d) -== Не знайдено локальних серверів (порти %d—%d) - -No login required -== Без логіна - -No password -== Без пароля - -No results -== Немає результатів - -No server selected -== Жодного сервера не вибрано - -No servers found -== Не знайдено жодного сервера - -No servers match your filter criteria -== Немає серверів, що відповідають вашим критеріям - -No updates available -== Немає доступних оновлень - -Normal Color -== Колір звичайних повідомлень - -Normal message -== Звичайні повідомлення - -NOT CONNECTED -== НЕ ПІД’ЄДНАНО - -Nothing hookable -== нічим, за що можна зачепитися - -[friends (server browser)] -Offline (%d) -== Не в мережі (%d) - -Offline friends and clanmates will appear here. -== Тут з'являться друзі та співклановці не в мережі. - -Ok -== Гаразд - -Online clanmates (%d) -== Співклановці в мережі (%d) - -Online friends (%d) -== Друзі в мережі (%d) - -Only save improvements -== Зберігати лише покращення - -Opacity -== Непрозор. - -Opacity of freeze bars inside freeze -== Непрозорість смуги заморозки в заморозці - -Open the directory that contains the configuration and user files -== Відкрити теку яка містить файли налаштувань і користувацькі файли - -Open the directory that contains the demo files -== Відкрити теку, в якій зберігаються демо-файли - -Open the directory to add custom assets -== Відкрити теку текстур, щоб додати власні - -Open the directory to add custom skins -== Відкрити теку скінів, щоб додати власні - -Open the directory to add custom themes -== Відкрити теку тем, щоб додати власні - -Open the settings file -== Відкрити файл налаштувань - -[Graphics error] -Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. -== Недостатньо відеопам’яті. Спробуйте видалити власні текстури (скіни, сутності і т.д.), особливо ті, що мають високу роздільність. - -Overlay entities -== Накладати сутності - -Parent Folder -== Батьківська тека - -Particles -== Частинки - -Pause -== Пауза - -Pause the current demo -== Призупинити - -Password -== Пароль - -Password incorrect -== Неправильний пароль - -Personal best: -== Власний рекорд: - -Ping -== Пінг - -Pistol -== Пістолет - -[Start menu] -Play -== Грати - -Play background music -== Фонова музика - -Play the current demo -== Відтворити - -Player -== Гравець - -Player country: -== Має гравця з: - -Player info change cooldown -== Затримка зміни інформації про гравця - -Players -== Гравці - -Please balance teams! -== Будь ласка, збалансуйте команди! - -Please enter your nickname below. -== Будь ласка, введіть нікнейм нижче. - -Please use a different filename -== Будь ласка, назвіть файл по-іншому - -Please wait… -== Будь ласка, зачекайте… - -Position: -== Позиція: - -Preparing demo playback -== Підготовлення відтворення демо - -Press a key… -== Натисніть клавішу… - -Prev. weapon -== Попер. зброя - -Preview -== Передперегляд - -Preview 'Hook collisions' being pressed -== "Зіткнення гака" натиснуто - -Quads are used for background decoration -== Квади використовуються для декорацій - -Quit -== Вийти - -Quitting. Please wait… -== Вихід. Будь ласка, зачекайте… - -Race -== Забіг - -Ratio -== У/С - -Reason: -== Причина: - -Reconnect in %d sec -== Повторне під’єднання за %dс - -Record demo -== Запис демо - -Red team -== Червоні - -Red team wins! -== Червоні перемогли! - -Refresh Rate -== Частота кадрів - -Regular background color -== Колір звичайного тла - -[Ingame controller mode] -Relative -== Відносний - -Remote console -== Віддалена консоль - -Remove -== Прибрати - -Remove chat -== Прибрати чат - -Remove friend -== Прибрати друга - -Rename demo -== Перейменувати демо - -Rename folder -== Перейменувати теку - -Render complete -== Обробку завершено - -Render cut to video -== Обробити фрагмент - -Render demo -== Обробити демо - -Renderer -== Графічний рушій - -Replace video -== Замінити відео - -Replay -== Повтор - -Replay feature is disabled! -== Повтори вимкнено! - -Requesting to join the game -== Запит на приєднання до гри - -Reset -== Скинути - -Reset controls -== Скинути керування - -Reset filter -== Скинути фільтр - -Reset to defaults -== Скинути до типових - -Restart -== Перезапустити - -Restarting. Please wait… -== Перезапуск. Будь ласка, зачекайте… - -Rifle Laser Inner Color -== Колір лазера гвинтівки - -Round %d/%d -== Раунд %d з %d - -Rifle Laser Outline Color -== Колір контуру лазера гвинтівки - -Run on join -== Запускати при приєднанні - -Run server -== Запустити сервер - -SA -== ПДА - -Same clan color in scoreboard -== Колір співклановців у таблиці - -Sat. -== Насич. - -Save -== Зберегти - -Save changes -== Зберегти зміни - -Save ghost -== Зберігати привида - -Save power by lowering refresh rate (higher input latency) -== Економити енергію шляхом зниження частоти кадрів (вища затримка введення) - -Save skin -== Зберегти скін - -Save the best demo of each race -== Зберігати найкраще демо кожного забігу - -Saving settings to '%s' failed -== Не вдалося зберегти налаштування до '%s' - -Score -== Бали - -Score limit -== Гра до - -Scoreboard -== Таблиця - -Screen -== Екран - -Screenshot -== Знімок екрана - -Search -== Пошук - -Searching -== Пошук - -Sending initial client info -== Надсилання початкових даних клієнта - -Server address: -== Адреса сервера: - -Server best: -== Рекорд сервера: - -Server executable not found, can't run server -== Виконуваний файл сервера не знайдено, запустити сервер не вдалося - -Server filter -== Фільтр серверів - -Server info -== Інформація - -Server not full -== Неповний сервер - -Set all to Rifle -== Установити так, як у гвинтівки - -Settings -== Налаштування - -Settings file -== Файл налаштувань - -Shotgun -== Рушниця - -Shotgun Laser Inner Color -== Колір лазера рушниці - -Shotgun Laser Outline Color -== Колір контуру лазера рушниці - -Show all -== Показувати всіх - -Show chat -== Показувати чат - -Show clan above name plates -== Показувати клан над ніками - -Show client IDs (scoreboard, chat, spectator) -== Показувати ID клієнта (таблиця, чат, глядачі) - -Show DDNet map finishes in server browser -== Показувати пройдені мапи DDNet у браузері серверів - -Show DDRace HUD -== Показувати HUD DDRace - -Show dummy actions -== Показувати дії з даммі - -Show entities -== Показ сутностей - -Show finish messages -== Показувати повідомлення про фініші - -Show freeze bars -== Показувати смугу заморозки - -Show friend mark (♥) in name plates -== Показувати позначку друга (♥) біля ніків - -Show friends only -== Показувати лише з друзями - -Show ghost -== Показувати привида - -Show health, shields and ammo -== Показувати здоров’я, захист і набої - -Show hook strength icon indicator -== Показувати іконку індикатора сили гака - -Show hook strength number indicator -== Показувати числовий індикатор сили гака - -Show HUD -== Показувати HUD - -Show ingame HUD -== Показувати HUD - -Show jumps indicator -== Показувати індикатор стрибків - -Show kill messages -== Показувати повідомлення про вбивства - -Show local player's key presses -== Показувати власні натискання клавіш - -Show local time always -== Завжди показувати місцевий час - -Show name plates -== Показувати ніки - -Show names in chat in team colors -== Показувати імена в чаті в кольорах команди - -Show only chat messages from friends -== Показувати лише повідомлення від друзів - -Show only chat messages from team members -== Показувати лише повідомлення від членів команди - -Show other players' hook collision lines -== Показувати лінії зіткнення гака інших гравців - -Show other players' key presses -== Показувати натискання клавіш інших гравців - -Show others -== Показувати інших - -Show others (own team only) -== Показувати інших (лише з власної команди) - -Show own player's hook collision line -== Показувати власну лінію зіткнення гака - -Show player position -== Показувати координати - -Show player speed -== Показувати швидкість - -Show player target angle -== Показувати кут прицілювання - -Show score -== Показувати рахунок - -Show text entities -== Текстові сутності - -Show tiles layers from BG map -== Показувати плитки з мапи фону - -Show quads -== Показувати квади - -Show votes window after voting -== Показувати голосування навіть після голосу - -Size -== Розмір - -Skin Database -== Сховище скінів - -Skin prefix -== Префікс скіна - -Skins directory -== Тека скінів - -Skip the main menu -== Пропускати головне меню - -Skip Tutorial -== Пропустити посібник - -Slow down the demo -== Сповільнити - -Smooth Dynamic Camera -== Гладка динамічна камера - -Some fonts could not be loaded. Check the local console for details. -== Не вдалося завантажити деякі шрифти. Див. локальну консоль для подробиць. - -Some map images could not be loaded. Check the local console for details. -== Деякі зображення мапи не завантажилися. Див. локальну консоль для подробиць. - -Some map sounds could not be loaded. Check the local console for details. -== Деякі звуки мапи не завантажилися. Див. локальну консоль для подробиць. - -Something hookable -== чимось, за що можна зачепитися - -Sound -== Звук - -Sound error -== Помилка звуку - -Sound volume -== Гучність - -Spectate -== Спостерігати - -Spectate next -== Наст. гравець - -Spectate previous -== Попер. гравець - -Spectator mode -== Режим глядача - -Spectators -== Глядачі - -Speed -== Швидкість - -Speed up the demo -== Пришвидшити - -Speed: -== Швидкість: - -Spree -== Комбо - -Statboard -== Статистика - -Status -== Статус - -Stop record -== Зупинити запис - -Stop server -== Зупинити сервер - -Stop the current demo -== Зупинити - -Strict gametype filter -== Жорсткий фільтр типів гри - -[Graphics error] -Submitting the render commands failed. Try to update your GPU drivers. -== Помилка у відправці команд відмальовування. Спробуйте оновити драйвери відеокарти. - -Successfully saved the replay! -== Повтор успішно збережено! - -Sudden Death -== Раптова смерть - -Suicides -== СГ - -Super -== Супер - -Switch weapon on pickup -== Змінювати зброю при підхопленні - -Switch weapon when out of ammo -== Змінювати зброю при закінченні набоїв - -System message -== Повідомлення системи - -Team -== Команда - -Team %d -== Команда %d - -Team %d (%d/%d) -== Команда %d (%d з %d) - -Team chat -== Чат команди - -Team message -== Повідомлення команди - -Tee -== Тії - -The audio device couldn't be initialised. -== Не вдалося ініціалізувати звуковий пристрій. - -The format of texture %s is not RGBA which will cause visual bugs. -== Формат текстури %s — не RGBA, що спричинить візуальні дефекти. - -The server is running a non-standard tuning on a pure game type. -== На сервері застосовані нестандартні налаштування ванільного типу гри. - -The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. -== Ширина текстури %s не ділиться націло на %d, або її висота не ділиться націло на %d, що може спричинити візуальні дефекти. - -Theme -== Тема - -Themes directory -== Тека тем - -There's an unsaved map in the editor, you might want to save it. -== У редакторі є незбережена мапа, можливо ви бажаєте зберегти її. - -Time -== Час - -Time limit -== Обмеження по часу - -Time limit: %d min -== Обмеження по часу: %dхв - -Toggle dummy -== Перемкнути даммі - -Toggle dyncam -== Рухома камера - -Toggle ghost -== Привид - -Toggle keyboard shortcuts -== Перемкнути сполучення - -transmits your player name to info.ddnet.org -== передає ваш нікнейм до info.ddnet.org - -Tries to predict other entities to give a feel of low latency -== Намагається передбачувати інші сутності, щоб створити відчуття низької затримки - -Try again -== Спробувати ще раз - -Trying to determine UDP connectivity… -== Спроба визначити UDP-з’єднання… - -Tutorial -== Посібник - -Type -== Тип - -Types -== Типи - -UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. -== Здається, адреси UDP й TCP IP відрізняються. Спробуйте вимкнути VPN, проксі чи прискорювачі мережі. - -UDP seems to be filtered. -== Здається, UDP фільтрується. - -UI Color -== Колір інтерфейсу - -UI controller sens. -== Чутл. в інтерфейсі - -UI mouse sens. -== Чутл. в інтерфейсі - -Unable to delete skin -== Не вдалося видалити скін - -Unable to delete the demo '%s' -== Не вдалося видалити демо '%s' - -Unable to delete the folder '%s'. Make sure it's empty first. -== Не вдалося видалити теку '%s', тому що вона не пуста. - -Unable to rename the demo -== Не вдалося перейменувати демо - -Unable to rename the folder -== Не вдалося перейменувати теку - -Unable to save the skin -== Не вдалося зберегти скін - -Unable to save the skin with a reserved name -== Не вдалося зберегти скін із зарезервованою назвою - -Unfinished map -== Непройдені мапи - -[Graphics error] -Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. -== Невідома помилка. Спробуйте змінити gfx_backend на OpenGL чи Vulkan у settings_ddnet.cfg у теці налаштувань і спробуйте ще раз. - -Unregister protocol and file extensions -== Розреєструвати протокол і розширення файлів - -Unsaved changes -== Незбережені зміни - -Update failed! Check log… -== Помилка оновлення! Перевірте журнал… - -Update now -== Оновити - -Updating… -== Оновлення… - -Uploading map data to GPU -== Вивантаження даних мапи до відеокарти - -Use current map as background -== Використовувати поточну мапу як тло - -Use high DPI -== Високий DPI - -Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. -== Натисніть «k», щоб умерти (почати спочатку), «q», щоб спостерігати за іншими гравцями. Інші призначення клавіш дивіться у налаштуваннях. - -Use old chat style -== Старий стиль чату - -Use sounds -== Звуки - -Use team colors for name plates -== Фарбувати ніки в кольори команд - -V-Sync -== V-Sync - -Vanilla skins only -== Лише ванільні скіни - -Version -== Версія - -Video name: -== Назва відео: - -Video was saved to '%s' -== Відео збережено до '%s' - -Videos directory -== Тека відео - -Vote command: -== Команда голосування: - -Vote description: -== Опис голосування: - -Vote no -== Проти - -Vote yes -== За - -Voting -== Голосування - -Warmup -== Розминка - -Warning -== Увага! - -Weapon -== Зброя - -Weapons -== Зброя - -Website -== Вебсайт - -Welcome to DDNet -== Ласкаво просимо до DDNet - -When you cross the start line, show a ghost tee replicating the movements of your best time -== Коли ви перетинаєте лінію старту, показувати привида, який повторює рухи вашого найкращого забігу - -Why are you slowmo replaying to read this? -== Чому ви переглядаєте це у повторі? - -Width of others' hook collision line -== Товщина лінії зіткнення гака інших - -Width of your own hook collision line -== Товщина вашої лінії зіткнення гака - -Windowed -== У вікні - -Windowed borderless -== Вікно без рамок - -Windowed fullscreen -== Вікно на весь екран - -Yes -== Так - -Your movements are not taken into account when calculating the line colors -== Ваші рухи не враховуються при розранку кольору лінії - -You must restart the game for all settings to take effect. -== Щоб налаштування набули чинності, перезапустіть гру. - -Your nickname '%s' is already used (%d points). Do you still want to use it? -== Ваш нікнейм «%s» вже зайнято (%d балів). Усе ще бажаєте використовувати його? - -Your skin -== Ваш скін - -Zoom in -== Наблизити - -Zoom out -== Віддалити - -"%s" is not compatible with pnglite and cannot be loaded by old DDNet versions: -== - -Loading background map -== - -[Spectating Camera Mode Icon] -AUTO -== - -Toggle auto camera -== - -https://wiki.ddnet.org/wiki/Touch_controls -== - -Show client IDs in name plates -== - -Hook Strength -== - -Size of hook strength icon and number indicator -== - -Key Presses -== - -Size of key press icons -== - -Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background. -== diff --git a/data/mapres/basic_freeze.png b/data/mapres/basic_freeze.png deleted file mode 100644 index 84d40d524a..0000000000 Binary files a/data/mapres/basic_freeze.png and /dev/null differ diff --git a/data/mapres/bg_cloud1.png b/data/mapres/bg_cloud1.png deleted file mode 100644 index 62c3353c5c..0000000000 Binary files a/data/mapres/bg_cloud1.png and /dev/null differ diff --git a/data/mapres/bg_cloud2.png b/data/mapres/bg_cloud2.png deleted file mode 100644 index 1e6468c18a..0000000000 Binary files a/data/mapres/bg_cloud2.png and /dev/null differ diff --git a/data/mapres/bg_cloud3.png b/data/mapres/bg_cloud3.png deleted file mode 100644 index 13b302280e..0000000000 Binary files a/data/mapres/bg_cloud3.png and /dev/null differ diff --git a/data/mapres/ddmax_freeze.png b/data/mapres/ddmax_freeze.png deleted file mode 100644 index 46f61687a8..0000000000 Binary files a/data/mapres/ddmax_freeze.png and /dev/null differ diff --git a/data/mapres/ddnet_grass.png b/data/mapres/ddnet_grass.png deleted file mode 100644 index 5263c6770e..0000000000 Binary files a/data/mapres/ddnet_grass.png and /dev/null differ diff --git a/data/mapres/ddnet_start.png b/data/mapres/ddnet_start.png deleted file mode 100644 index a4ce991291..0000000000 Binary files a/data/mapres/ddnet_start.png and /dev/null differ diff --git a/data/mapres/ddnet_tiles.png b/data/mapres/ddnet_tiles.png deleted file mode 100644 index 0c4e1853b8..0000000000 Binary files a/data/mapres/ddnet_tiles.png and /dev/null differ diff --git a/data/mapres/ddnet_walls.png b/data/mapres/ddnet_walls.png deleted file mode 100644 index 9c0702e4dd..0000000000 Binary files a/data/mapres/ddnet_walls.png and /dev/null differ diff --git a/data/mapres/desert_background.png b/data/mapres/desert_background.png deleted file mode 100644 index 13e5a86edf..0000000000 Binary files a/data/mapres/desert_background.png and /dev/null differ diff --git a/data/mapres/desert_doodads.png b/data/mapres/desert_doodads.png deleted file mode 100644 index 2c15b24342..0000000000 Binary files a/data/mapres/desert_doodads.png and /dev/null differ diff --git a/data/mapres/desert_main.png b/data/mapres/desert_main.png deleted file mode 100644 index e95611b35f..0000000000 Binary files a/data/mapres/desert_main.png and /dev/null differ diff --git a/data/mapres/desert_mountains.png b/data/mapres/desert_mountains.png deleted file mode 100644 index cae28040ca..0000000000 Binary files a/data/mapres/desert_mountains.png and /dev/null differ diff --git a/data/mapres/desert_mountains2.png b/data/mapres/desert_mountains2.png deleted file mode 100644 index d1158ecdf1..0000000000 Binary files a/data/mapres/desert_mountains2.png and /dev/null differ diff --git a/data/mapres/desert_mountains_new_background.png b/data/mapres/desert_mountains_new_background.png deleted file mode 100644 index 3957e99292..0000000000 Binary files a/data/mapres/desert_mountains_new_background.png and /dev/null differ diff --git a/data/mapres/desert_mountains_new_foreground.png b/data/mapres/desert_mountains_new_foreground.png deleted file mode 100644 index e0d3ec4d32..0000000000 Binary files a/data/mapres/desert_mountains_new_foreground.png and /dev/null differ diff --git a/data/mapres/desert_sun.png b/data/mapres/desert_sun.png deleted file mode 100644 index 0b260575f7..0000000000 Binary files a/data/mapres/desert_sun.png and /dev/null differ diff --git a/data/mapres/entities.png b/data/mapres/entities.png deleted file mode 100644 index f186a380f4..0000000000 Binary files a/data/mapres/entities.png and /dev/null differ diff --git a/data/mapres/fadeout.png b/data/mapres/fadeout.png deleted file mode 100644 index 782f06fd5a..0000000000 Binary files a/data/mapres/fadeout.png and /dev/null differ diff --git a/data/mapres/font_teeworlds.png b/data/mapres/font_teeworlds.png deleted file mode 100644 index 3383d23871..0000000000 Binary files a/data/mapres/font_teeworlds.png and /dev/null differ diff --git a/data/mapres/font_teeworlds_alt.png b/data/mapres/font_teeworlds_alt.png deleted file mode 100644 index b44947519f..0000000000 Binary files a/data/mapres/font_teeworlds_alt.png and /dev/null differ diff --git a/data/mapres/generic_clear.png b/data/mapres/generic_clear.png deleted file mode 100644 index 9d347d0c57..0000000000 Binary files a/data/mapres/generic_clear.png and /dev/null differ diff --git a/data/mapres/generic_deathtiles.png b/data/mapres/generic_deathtiles.png deleted file mode 100644 index 5ca002216a..0000000000 Binary files a/data/mapres/generic_deathtiles.png and /dev/null differ diff --git a/data/mapres/generic_lamps.png b/data/mapres/generic_lamps.png deleted file mode 100644 index 6a7f832589..0000000000 Binary files a/data/mapres/generic_lamps.png and /dev/null differ diff --git a/data/mapres/generic_unhookable.png b/data/mapres/generic_unhookable.png deleted file mode 100644 index 4b014e91c8..0000000000 Binary files a/data/mapres/generic_unhookable.png and /dev/null differ diff --git a/data/mapres/generic_unhookable_0.7.png b/data/mapres/generic_unhookable_0.7.png deleted file mode 100644 index d7ba290488..0000000000 Binary files a/data/mapres/generic_unhookable_0.7.png and /dev/null differ diff --git a/data/mapres/grass_doodads.png b/data/mapres/grass_doodads.png deleted file mode 100644 index 71b0354033..0000000000 Binary files a/data/mapres/grass_doodads.png and /dev/null differ diff --git a/data/mapres/grass_doodads_0.7.png b/data/mapres/grass_doodads_0.7.png deleted file mode 100644 index 98c41d878e..0000000000 Binary files a/data/mapres/grass_doodads_0.7.png and /dev/null differ diff --git a/data/mapres/grass_main.png b/data/mapres/grass_main.png deleted file mode 100644 index 8e559b2484..0000000000 Binary files a/data/mapres/grass_main.png and /dev/null differ diff --git a/data/mapres/grass_main_0.7.png b/data/mapres/grass_main_0.7.png deleted file mode 100644 index 9f1bfec5c4..0000000000 Binary files a/data/mapres/grass_main_0.7.png and /dev/null differ diff --git a/data/mapres/jungle_background.png b/data/mapres/jungle_background.png deleted file mode 100644 index 6a2ab27d52..0000000000 Binary files a/data/mapres/jungle_background.png and /dev/null differ diff --git a/data/mapres/jungle_deathtiles.png b/data/mapres/jungle_deathtiles.png deleted file mode 100644 index 4c730f3498..0000000000 Binary files a/data/mapres/jungle_deathtiles.png and /dev/null differ diff --git a/data/mapres/jungle_doodads.png b/data/mapres/jungle_doodads.png deleted file mode 100644 index 5fbf519ee2..0000000000 Binary files a/data/mapres/jungle_doodads.png and /dev/null differ diff --git a/data/mapres/jungle_main.png b/data/mapres/jungle_main.png deleted file mode 100644 index 3035f4a415..0000000000 Binary files a/data/mapres/jungle_main.png and /dev/null differ diff --git a/data/mapres/jungle_midground.png b/data/mapres/jungle_midground.png deleted file mode 100644 index d6467beaa7..0000000000 Binary files a/data/mapres/jungle_midground.png and /dev/null differ diff --git a/data/mapres/jungle_unhookables.png b/data/mapres/jungle_unhookables.png deleted file mode 100644 index 0703d18942..0000000000 Binary files a/data/mapres/jungle_unhookables.png and /dev/null differ diff --git a/data/mapres/light.png b/data/mapres/light.png deleted file mode 100644 index 36fb14a2e1..0000000000 Binary files a/data/mapres/light.png and /dev/null differ diff --git a/data/mapres/mixed_tiles.png b/data/mapres/mixed_tiles.png deleted file mode 100644 index 621ba599d8..0000000000 Binary files a/data/mapres/mixed_tiles.png and /dev/null differ diff --git a/data/mapres/moon.png b/data/mapres/moon.png deleted file mode 100644 index 57a364b79e..0000000000 Binary files a/data/mapres/moon.png and /dev/null differ diff --git a/data/mapres/mountains.png b/data/mapres/mountains.png deleted file mode 100644 index a5ce86d91a..0000000000 Binary files a/data/mapres/mountains.png and /dev/null differ diff --git a/data/mapres/round_tiles.png b/data/mapres/round_tiles.png deleted file mode 100644 index 1f1bf5e27b..0000000000 Binary files a/data/mapres/round_tiles.png and /dev/null differ diff --git a/data/mapres/snow.png b/data/mapres/snow.png deleted file mode 100644 index d9b712c5f7..0000000000 Binary files a/data/mapres/snow.png and /dev/null differ diff --git a/data/mapres/snow_mountain.png b/data/mapres/snow_mountain.png deleted file mode 100644 index f10a14499b..0000000000 Binary files a/data/mapres/snow_mountain.png and /dev/null differ diff --git a/data/mapres/stars.png b/data/mapres/stars.png deleted file mode 100644 index 0270051def..0000000000 Binary files a/data/mapres/stars.png and /dev/null differ diff --git a/data/mapres/sun.png b/data/mapres/sun.png deleted file mode 100644 index 7337ece670..0000000000 Binary files a/data/mapres/sun.png and /dev/null differ diff --git a/data/mapres/water.png b/data/mapres/water.png deleted file mode 100644 index 9cacbaef0b..0000000000 Binary files a/data/mapres/water.png and /dev/null differ diff --git a/data/mapres/winter_doodads.png b/data/mapres/winter_doodads.png deleted file mode 100644 index dd22ba2ced..0000000000 Binary files a/data/mapres/winter_doodads.png and /dev/null differ diff --git a/data/mapres/winter_main.png b/data/mapres/winter_main.png deleted file mode 100644 index ec2095d934..0000000000 Binary files a/data/mapres/winter_main.png and /dev/null differ diff --git a/data/mapres/winter_main_0.7.png b/data/mapres/winter_main_0.7.png deleted file mode 100644 index 51564cf4e7..0000000000 Binary files a/data/mapres/winter_main_0.7.png and /dev/null differ diff --git a/data/mapres/winter_mountains.png b/data/mapres/winter_mountains.png deleted file mode 100644 index f8015e303e..0000000000 Binary files a/data/mapres/winter_mountains.png and /dev/null differ diff --git a/data/mapres/winter_mountains2.png b/data/mapres/winter_mountains2.png deleted file mode 100644 index b0492c4000..0000000000 Binary files a/data/mapres/winter_mountains2.png and /dev/null differ diff --git a/data/mapres/winter_mountains3.png b/data/mapres/winter_mountains3.png deleted file mode 100644 index 0aa7088e86..0000000000 Binary files a/data/mapres/winter_mountains3.png and /dev/null differ diff --git a/data/maps/Gold Mine.map b/data/maps/Gold Mine.map deleted file mode 100644 index f0d9f3710f..0000000000 Binary files a/data/maps/Gold Mine.map and /dev/null differ diff --git a/data/maps/LearnToPlay.map b/data/maps/LearnToPlay.map deleted file mode 100644 index b9aa4e3633..0000000000 Binary files a/data/maps/LearnToPlay.map and /dev/null differ diff --git a/data/maps/Sunny Side Up.map b/data/maps/Sunny Side Up.map deleted file mode 100644 index 3c43cfa827..0000000000 Binary files a/data/maps/Sunny Side Up.map and /dev/null differ diff --git a/data/maps/Tsunami.map b/data/maps/Tsunami.map deleted file mode 100644 index 92a1f7941b..0000000000 Binary files a/data/maps/Tsunami.map and /dev/null differ diff --git a/data/maps/Tutorial.map b/data/maps/Tutorial.map deleted file mode 100644 index 7194d26de3..0000000000 Binary files a/data/maps/Tutorial.map and /dev/null differ diff --git a/data/maps/coverage.map b/data/maps/coverage.map deleted file mode 100644 index af7113ab9f..0000000000 Binary files a/data/maps/coverage.map and /dev/null differ diff --git a/data/maps7/Gold Mine.map b/data/maps7/Gold Mine.map deleted file mode 100644 index 7a4796de15..0000000000 Binary files a/data/maps7/Gold Mine.map and /dev/null differ diff --git a/data/maps7/LearnToPlay.map b/data/maps7/LearnToPlay.map deleted file mode 100644 index 89e7ade4c0..0000000000 Binary files a/data/maps7/LearnToPlay.map and /dev/null differ diff --git a/data/maps7/Sunny Side Up.map b/data/maps7/Sunny Side Up.map deleted file mode 100644 index 16855527f0..0000000000 Binary files a/data/maps7/Sunny Side Up.map and /dev/null differ diff --git a/data/maps7/Tsunami.map b/data/maps7/Tsunami.map deleted file mode 100644 index 288da660b4..0000000000 Binary files a/data/maps7/Tsunami.map and /dev/null differ diff --git a/data/maps7/Tutorial.map b/data/maps7/Tutorial.map deleted file mode 100644 index 29b75d30fb..0000000000 Binary files a/data/maps7/Tutorial.map and /dev/null differ diff --git a/data/menuimages/demos.png b/data/menuimages/demos.png deleted file mode 100644 index 6290a12c36..0000000000 Binary files a/data/menuimages/demos.png and /dev/null differ diff --git a/data/menuimages/editor.png b/data/menuimages/editor.png deleted file mode 100644 index 1bea7797cc..0000000000 Binary files a/data/menuimages/editor.png and /dev/null differ diff --git a/data/menuimages/local_server.png b/data/menuimages/local_server.png deleted file mode 100644 index 65618eb1b0..0000000000 Binary files a/data/menuimages/local_server.png and /dev/null differ diff --git a/data/menuimages/play_game.png b/data/menuimages/play_game.png deleted file mode 100644 index d627ebfaff..0000000000 Binary files a/data/menuimages/play_game.png and /dev/null differ diff --git a/data/menuimages/settings.png b/data/menuimages/settings.png deleted file mode 100644 index c9acd326b9..0000000000 Binary files a/data/menuimages/settings.png and /dev/null differ diff --git a/data/particles.png b/data/particles.png deleted file mode 100644 index 0f3cd17499..0000000000 Binary files a/data/particles.png and /dev/null differ diff --git a/data/race_flag.png b/data/race_flag.png deleted file mode 100644 index c9ceba5b8d..0000000000 Binary files a/data/race_flag.png and /dev/null differ diff --git a/data/shader/pipeline.frag b/data/shader/pipeline.frag deleted file mode 100644 index 60b6224667..0000000000 --- a/data/shader/pipeline.frag +++ /dev/null @@ -1,35 +0,0 @@ -#ifdef TW_TEXTURED -#ifdef TW_3D_TEXTURED -uniform sampler3D gTextureSampler; -#else -uniform sampler2DArray gTextureSampler; -#endif -#endif - -#ifdef TW_MODERN_GL -#ifdef TW_TEXTURED -noperspective in vec3 oTexCoord; -#endif -noperspective in vec4 oVertColor; -out vec4 FragClr; -#endif - -void main() -{ -#ifdef TW_MODERN_GL -#ifdef TW_TEXTURED - vec4 TexColor = texture(gTextureSampler, oTexCoord.xyz).rgba; - FragClr = TexColor.rgba * oVertColor.rgba; -#else - FragClr = oVertColor.rgba; -#endif -#else -#ifdef TW_TEXTURED - vec4 TexColor = texture(gTextureSampler, gl_TexCoord[0].xyz).rgba; - gl_FragColor = TexColor.rgba * gl_Color.rgba; -#else - gl_FragColor = gl_Color.rgba; -#endif -#endif -} - diff --git a/data/shader/pipeline.vert b/data/shader/pipeline.vert deleted file mode 100644 index 048f3f4c0e..0000000000 --- a/data/shader/pipeline.vert +++ /dev/null @@ -1,32 +0,0 @@ -#ifdef TW_MODERN_GL -layout (location = 0) in vec2 inVertex; -layout (location = 1) in vec4 inVertexColor; -layout (location = 2) in vec3 inVertexTexCoord; -#endif - -uniform mat4x2 gPos; - -#ifdef TW_MODERN_GL -#ifdef TW_TEXTURED -noperspective out vec3 oTexCoord; -#endif -noperspective out vec4 oVertColor; -#endif - -void main() -{ -#ifdef TW_MODERN_GL - gl_Position = vec4(gPos * vec4(inVertex, 0.0, 1.0), 0.0, 1.0); -#ifdef TW_TEXTURED - oTexCoord = inVertexTexCoord; -#endif - oVertColor = inVertexColor; -#else - gl_Position = vec4(gPos * vec4(gl_Vertex.xy, 0.0, 1.0), 0.0, 1.0); -#ifdef TW_TEXTURED - gl_TexCoord[0] = gl_MultiTexCoord0; -#endif - gl_FrontColor = gl_Color.rgba; - gl_BackColor = gl_Color.rgba; -#endif -} diff --git a/data/shader/prim.frag b/data/shader/prim.frag deleted file mode 100644 index b96745d21a..0000000000 --- a/data/shader/prim.frag +++ /dev/null @@ -1,15 +0,0 @@ -uniform sampler2D gTextureSampler; - -noperspective in vec2 texCoord; -noperspective in vec4 vertColor; - -out vec4 FragClr; -void main() -{ -#ifdef TW_TEXTURED - vec4 tex = texture(gTextureSampler, texCoord); - FragClr = tex * vertColor; -#else - FragClr = vertColor; -#endif -} diff --git a/data/shader/prim.vert b/data/shader/prim.vert deleted file mode 100644 index ed95ae49fe..0000000000 --- a/data/shader/prim.vert +++ /dev/null @@ -1,15 +0,0 @@ -layout (location = 0) in vec2 inVertex; -layout (location = 1) in vec2 inVertexTexCoord; -layout (location = 2) in vec4 inVertexColor; - -uniform mat4x2 gPos; - -noperspective out vec2 texCoord; -noperspective out vec4 vertColor; - -void main() -{ - gl_Position = vec4(gPos * vec4(inVertex, 0.0, 1.0), 0.0, 1.0); - texCoord = inVertexTexCoord; - vertColor = inVertexColor; -} diff --git a/data/shader/primex.frag b/data/shader/primex.frag deleted file mode 100644 index ad4654b0c8..0000000000 --- a/data/shader/primex.frag +++ /dev/null @@ -1,19 +0,0 @@ -#ifdef TW_TEXTURED -uniform sampler2D gTextureSampler; -#endif - -uniform vec4 gVerticesColor; - -noperspective in vec2 texCoord; -noperspective in vec4 vertColor; - -out vec4 FragClr; -void main() -{ -#ifdef TW_TEXTURED - vec4 tex = texture(gTextureSampler, texCoord); - FragClr = tex * vertColor * gVerticesColor; -#else - FragClr = vertColor * gVerticesColor; -#endif -} diff --git a/data/shader/primex.vert b/data/shader/primex.vert deleted file mode 100644 index 58877a5ec3..0000000000 --- a/data/shader/primex.vert +++ /dev/null @@ -1,29 +0,0 @@ -layout (location = 0) in vec2 inVertex; -layout (location = 1) in vec2 inVertexTexCoord; -layout (location = 2) in vec4 inVertexColor; - -uniform mat4x2 gPos; - -#ifndef TW_ROTATIONLESS -uniform float gRotation; -#endif -uniform vec2 gCenter; - -noperspective out vec2 texCoord; -noperspective out vec4 vertColor; - -void main() -{ - vec2 FinalPos = vec2(inVertex.xy); -#ifndef TW_ROTATIONLESS - float X = FinalPos.x - gCenter.x; - float Y = FinalPos.y - gCenter.y; - - FinalPos.x = X * cos(gRotation) - Y * sin(gRotation) + gCenter.x; - FinalPos.y = X * sin(gRotation) + Y * cos(gRotation) + gCenter.y; -#endif - - gl_Position = vec4(gPos * vec4(FinalPos, 0.0, 1.0), 0.0, 1.0); - texCoord = inVertexTexCoord; - vertColor = inVertexColor; -} diff --git a/data/shader/quad.frag b/data/shader/quad.frag deleted file mode 100644 index edbf160b8d..0000000000 --- a/data/shader/quad.frag +++ /dev/null @@ -1,22 +0,0 @@ -#ifdef TW_QUAD_TEXTURED -uniform sampler2D gTextureSampler; -#endif - -uniform vec4 gVertColors[TW_MAX_QUADS]; - -noperspective in vec4 QuadColor; -flat in int QuadIndex; -#ifdef TW_QUAD_TEXTURED -noperspective in vec2 TexCoord; -#endif - -out vec4 FragClr; -void main() -{ -#ifdef TW_QUAD_TEXTURED - vec4 TexColor = texture(gTextureSampler, TexCoord); - FragClr = TexColor * QuadColor * gVertColors[QuadIndex]; -#else - FragClr = QuadColor * gVertColors[QuadIndex]; -#endif -} diff --git a/data/shader/quad.vert b/data/shader/quad.vert deleted file mode 100644 index 59cbe008e6..0000000000 --- a/data/shader/quad.vert +++ /dev/null @@ -1,44 +0,0 @@ -layout (location = 0) in vec4 inVertex; -layout (location = 1) in vec4 inColor; -#ifdef TW_QUAD_TEXTURED -layout (location = 2) in vec2 inVertexTexCoord; -#endif - -uniform mat4x2 gPos; - -uniform vec2 gOffsets[TW_MAX_QUADS]; -uniform float gRotations[TW_MAX_QUADS]; - -uniform int gQuadOffset; - -noperspective out vec4 QuadColor; -flat out int QuadIndex; -#ifdef TW_QUAD_TEXTURED -noperspective out vec2 TexCoord; -#endif - -void main() -{ - vec2 FinalPos = vec2(inVertex.xy); - - int TmpQuadIndex = int(gl_VertexID / 4) - gQuadOffset; - - if(gRotations[TmpQuadIndex] != 0.0) - { - float X = FinalPos.x - inVertex.z; - float Y = FinalPos.y - inVertex.w; - - FinalPos.x = X * cos(gRotations[TmpQuadIndex]) - Y * sin(gRotations[TmpQuadIndex]) + inVertex.z; - FinalPos.y = X * sin(gRotations[TmpQuadIndex]) + Y * cos(gRotations[TmpQuadIndex]) + inVertex.w; - } - - FinalPos.x = FinalPos.x / 1024.0 + gOffsets[TmpQuadIndex].x; - FinalPos.y = FinalPos.y / 1024.0 + gOffsets[TmpQuadIndex].y; - - gl_Position = vec4(gPos * vec4(FinalPos, 0.0, 1.0), 0.0, 1.0); - QuadColor = inColor; - QuadIndex = TmpQuadIndex; -#ifdef TW_QUAD_TEXTURED - TexCoord = inVertexTexCoord; -#endif -} diff --git a/data/shader/spritemulti.frag b/data/shader/spritemulti.frag deleted file mode 100644 index 787cc7d683..0000000000 --- a/data/shader/spritemulti.frag +++ /dev/null @@ -1,13 +0,0 @@ -uniform sampler2D gTextureSampler; - -uniform vec4 gVerticesColor; - -noperspective in vec2 texCoord; -noperspective in vec4 vertColor; - -out vec4 FragClr; -void main() -{ - vec4 tex = texture(gTextureSampler, texCoord); - FragClr = tex * vertColor * gVerticesColor; -} diff --git a/data/shader/spritemulti.vert b/data/shader/spritemulti.vert deleted file mode 100644 index 9e1d06ad1c..0000000000 --- a/data/shader/spritemulti.vert +++ /dev/null @@ -1,34 +0,0 @@ -layout (location = 0) in vec2 inVertex; -layout (location = 1) in vec2 inVertexTexCoord; -layout (location = 2) in vec4 inVertexColor; - -uniform mat4x2 gPos; - -uniform vec4 gRSP[228]; -uniform vec2 gCenter; - -noperspective out vec2 texCoord; -noperspective out vec4 vertColor; - -void main() -{ - vec2 FinalPos = vec2(inVertex.xy); - if(gRSP[gl_InstanceID].w != 0.0) - { - float X = FinalPos.x - gCenter.x; - float Y = FinalPos.y - gCenter.y; - - FinalPos.x = X * cos(gRSP[gl_InstanceID].w) - Y * sin(gRSP[gl_InstanceID].w) + gCenter.x; - FinalPos.y = X * sin(gRSP[gl_InstanceID].w) + Y * cos(gRSP[gl_InstanceID].w) + gCenter.y; - } - - FinalPos.x *= gRSP[gl_InstanceID].z; - FinalPos.y *= gRSP[gl_InstanceID].z; - - FinalPos.x += gRSP[gl_InstanceID].x; - FinalPos.y += gRSP[gl_InstanceID].y; - - gl_Position = vec4(gPos * vec4(FinalPos, 0.0, 1.0), 0.0, 1.0); - texCoord = inVertexTexCoord; - vertColor = inVertexColor; -} diff --git a/data/shader/text.frag b/data/shader/text.frag deleted file mode 100644 index 526314087e..0000000000 --- a/data/shader/text.frag +++ /dev/null @@ -1,37 +0,0 @@ -uniform sampler2D gTextSampler; -uniform sampler2D gTextOutlineSampler; - -uniform vec4 gVertColor; -uniform vec4 gVertOutlineColor; - -noperspective in vec2 texCoord; -noperspective in vec4 outVertColor; - -out vec4 FragClr; -void main() -{ - vec4 textColor = gVertColor * outVertColor * vec4(1.0, 1.0, 1.0, texture(gTextSampler, texCoord).r); - vec4 textOutlineTex = gVertOutlineColor * vec4(1.0, 1.0, 1.0, texture(gTextOutlineSampler, texCoord).r); - - // ratio between the two textures - float OutlineBlend = (1.0 - textColor.a); - - // since the outline is always black, or even if it has decent colors, it can be just added to the actual color - // without losing any or too much color - - // lerp isn't commutative, so add the color the fragment looses by lerping - // this reduces the chance of false color calculation if the text is transparent - - // first get the right color - vec4 textOutlineFrag = vec4(textOutlineTex.rgb * textOutlineTex.a, textOutlineTex.a) * OutlineBlend; - vec3 textFrag = (textColor.rgb * textColor.a); - vec3 finalFragColor = textOutlineFrag.rgb + textFrag; - - float RealAlpha = (textOutlineFrag.a + textColor.a); - - // simply add the color we will loose through blending - if(RealAlpha > 0.0) - FragClr = vec4(finalFragColor / RealAlpha, RealAlpha); - else - FragClr = vec4(0.0, 0.0, 0.0, 0.0); -} diff --git a/data/shader/text.vert b/data/shader/text.vert deleted file mode 100644 index b27e768828..0000000000 --- a/data/shader/text.vert +++ /dev/null @@ -1,17 +0,0 @@ -layout (location = 0) in vec2 inVertex; -layout (location = 1) in vec2 inVertexTexCoord; -layout (location = 2) in vec4 inVertexColor; - -uniform mat4x2 gPos; -uniform float gTextureSize; - -noperspective out vec2 texCoord; -noperspective out vec4 outVertColor; - -void main() -{ - gl_Position = vec4(gPos * vec4(inVertex, 0.0, 1.0), 0.0, 1.0); - - texCoord = vec2(inVertexTexCoord.x / gTextureSize, inVertexTexCoord.y / gTextureSize); - outVertColor = inVertexColor; -} diff --git a/data/shader/tile.frag b/data/shader/tile.frag deleted file mode 100644 index 9e2f483e22..0000000000 --- a/data/shader/tile.frag +++ /dev/null @@ -1,24 +0,0 @@ -#ifdef TW_TILE_TEXTURED -#ifdef TW_TILE_3D_TEXTURED -uniform sampler3D gTextureSampler; -#else -uniform sampler2DArray gTextureSampler; -#endif -#endif - -uniform vec4 gVertColor; - -#ifdef TW_TILE_TEXTURED -noperspective in vec3 TexCoord; -#endif - -out vec4 FragClr; -void main() -{ -#ifdef TW_TILE_TEXTURED - vec4 TexColor = texture(gTextureSampler, TexCoord.xyz); - FragClr = TexColor * gVertColor; -#else - FragClr = gVertColor; -#endif -} diff --git a/data/shader/tile.vert b/data/shader/tile.vert deleted file mode 100644 index 6288371e99..0000000000 --- a/data/shader/tile.vert +++ /dev/null @@ -1,19 +0,0 @@ -layout (location = 0) in vec2 inVertex; -#ifdef TW_TILE_TEXTURED -layout (location = 1) in uvec4 inVertexTexCoord; -#endif - -uniform mat4x2 gPos; - -#ifdef TW_TILE_TEXTURED -noperspective out vec3 TexCoord; -#endif - -void main() -{ - gl_Position = vec4(gPos * vec4(inVertex, 0.0, 1.0), 0.0, 1.0); - -#ifdef TW_TILE_TEXTURED - TexCoord = vec3(inVertexTexCoord.xyz); -#endif -} diff --git a/data/shader/tile_border.frag b/data/shader/tile_border.frag deleted file mode 100644 index 2182dd9796..0000000000 --- a/data/shader/tile_border.frag +++ /dev/null @@ -1,28 +0,0 @@ -#ifdef TW_TILE_TEXTURED -#ifdef TW_TILE_3D_TEXTURED -uniform sampler3D gTextureSampler; -#else -uniform sampler2DArray gTextureSampler; -#endif -#endif - -uniform vec4 gVertColor; - -#ifdef TW_TILE_TEXTURED -noperspective centroid in vec3 TexCoord; -#endif - -out vec4 FragClr; - -void main() -{ -#ifdef TW_TILE_TEXTURED - vec3 realTexCoords = vec3(fract(TexCoord.xy), TexCoord.z); - vec2 dx = dFdx(TexCoord.xy); - vec2 dy = dFdy(TexCoord.xy); - vec4 tex = textureGrad(gTextureSampler, realTexCoords, dx, dy); - FragClr = tex * gVertColor; -#else - FragClr = gVertColor; -#endif -} diff --git a/data/shader/tile_border.vert b/data/shader/tile_border.vert deleted file mode 100644 index f8f71ebda5..0000000000 --- a/data/shader/tile_border.vert +++ /dev/null @@ -1,28 +0,0 @@ -layout (location = 0) in vec2 inVertex; -#ifdef TW_TILE_TEXTURED -layout (location = 1) in uvec4 inVertexTexCoord; -#endif - -uniform mat4x2 gPos; - -uniform vec2 gOffset; -uniform vec2 gScale; - -#ifdef TW_TILE_TEXTURED -noperspective out vec3 TexCoord; -#endif - -void main() -{ - // scale then position vertex - vec2 VertexPos = (inVertex * gScale) + gOffset; - gl_Position = vec4(gPos * vec4(VertexPos, 0.0, 1.0), 0.0, 1.0); - -#ifdef TW_TILE_TEXTURED - // scale the texture coordinates too - vec2 TexScale = gScale; - if (float(inVertexTexCoord.w) > 0.0) - TexScale = gScale.yx; - TexCoord = vec3(vec2(inVertexTexCoord.xy) * TexScale, float(inVertexTexCoord.z)); -#endif -} diff --git a/data/shader/vulkan/prim.frag b/data/shader/vulkan/prim.frag deleted file mode 100644 index 4fc7ac7311..0000000000 --- a/data/shader/vulkan/prim.frag +++ /dev/null @@ -1,20 +0,0 @@ -#version 450 -#extension GL_ARB_separate_shader_objects : enable - -#ifdef TW_TEXTURED -layout(binding = 0) uniform sampler2D gTextureSampler; -#endif - -layout(location = 0) noperspective in vec2 texCoord; -layout(location = 1) noperspective in vec4 vertColor; - -layout(location = 0) out vec4 FragClr; -void main() -{ -#ifdef TW_TEXTURED - vec4 tex = texture(gTextureSampler, texCoord); - FragClr = tex * vertColor; -#else - FragClr = vertColor; -#endif -} diff --git a/data/shader/vulkan/prim.vert b/data/shader/vulkan/prim.vert deleted file mode 100644 index 550c7c1ead..0000000000 --- a/data/shader/vulkan/prim.vert +++ /dev/null @@ -1,20 +0,0 @@ -#version 450 -#extension GL_ARB_separate_shader_objects : enable - -layout (location = 0) in vec2 inVertex; -layout (location = 1) in vec2 inVertexTexCoord; -layout (location = 2) in vec4 inVertexColor; - -layout(push_constant) uniform SPosBO { - layout(offset = 0) mat4x2 gPos; -} gPosBO; - -layout (location = 0) noperspective out vec2 texCoord; -layout (location = 1) noperspective out vec4 vertColor; - -void main() -{ - gl_Position = vec4(gPosBO.gPos * vec4(inVertex, 0.0, 1.0), 0.0, 1.0); - texCoord = inVertexTexCoord; - vertColor = vec4(inVertexColor); -} diff --git a/data/shader/vulkan/prim3d.frag b/data/shader/vulkan/prim3d.frag deleted file mode 100644 index 5f2fa275f5..0000000000 --- a/data/shader/vulkan/prim3d.frag +++ /dev/null @@ -1,24 +0,0 @@ -#version 450 -#extension GL_ARB_separate_shader_objects : enable - -#ifdef TW_TEXTURED -layout (binding = 0) uniform sampler2DArray gTextureSampler; -#endif - -layout (location = 0) noperspective in vec4 oVertColor; -#ifdef TW_TEXTURED -layout (location = 1) noperspective in vec3 oTexCoord; -#endif - -layout (location = 0) out vec4 FragClr; - -void main() -{ -#ifdef TW_TEXTURED - vec4 TexColor = texture(gTextureSampler, oTexCoord.xyz).rgba; - FragClr = TexColor.rgba * oVertColor.rgba; -#else - FragClr = oVertColor.rgba; -#endif -} - diff --git a/data/shader/vulkan/prim3d.vert b/data/shader/vulkan/prim3d.vert deleted file mode 100644 index 07f2cf3348..0000000000 --- a/data/shader/vulkan/prim3d.vert +++ /dev/null @@ -1,24 +0,0 @@ -#version 450 -#extension GL_ARB_separate_shader_objects : enable - -layout (location = 0) in vec2 inVertex; -layout (location = 1) in vec4 inVertexColor; -layout (location = 2) in vec3 inVertexTexCoord; - -layout(push_constant) uniform SPosBO { - layout(offset = 0) mat4x2 gPos; -} gPosBO; - -layout (location = 0) noperspective out vec4 oVertColor; -#ifdef TW_TEXTURED -layout (location = 1) noperspective out vec3 oTexCoord; -#endif - -void main() -{ - gl_Position = vec4(gPosBO.gPos * vec4(inVertex, 0.0, 1.0), 0.0, 1.0); -#ifdef TW_TEXTURED - oTexCoord = inVertexTexCoord; -#endif - oVertColor = inVertexColor; -} diff --git a/data/shader/vulkan/primex.frag b/data/shader/vulkan/primex.frag deleted file mode 100644 index 05e02ed069..0000000000 --- a/data/shader/vulkan/primex.frag +++ /dev/null @@ -1,24 +0,0 @@ -#version 450 -#extension GL_ARB_separate_shader_objects : enable - -#ifdef TW_TEXTURED -layout(binding = 0) uniform sampler2D gTextureSampler; -#endif - -layout(push_constant) uniform SVertexColorBO { - layout(offset = 48) vec4 gVerticesColor; -} gColorBO; - -layout (location = 0) noperspective in vec2 texCoord; -layout (location = 1) noperspective in vec4 vertColor; - -layout (location = 0) out vec4 FragClr; -void main() -{ -#ifdef TW_TEXTURED - vec4 tex = texture(gTextureSampler, texCoord); - FragClr = tex * vertColor * gColorBO.gVerticesColor; -#else - FragClr = vertColor * gColorBO.gVerticesColor; -#endif -} diff --git a/data/shader/vulkan/primex.vert b/data/shader/vulkan/primex.vert deleted file mode 100644 index b16cb6283a..0000000000 --- a/data/shader/vulkan/primex.vert +++ /dev/null @@ -1,33 +0,0 @@ -#version 450 -#extension GL_ARB_separate_shader_objects : enable - -layout (location = 0) in vec2 inVertex; -layout (location = 1) in vec2 inVertexTexCoord; -layout (location = 2) in vec4 inVertexColor; - -layout(push_constant) uniform SPosBO { - layout(offset = 0) mat4x2 gPos; -#ifndef TW_ROTATIONLESS - layout(offset = 32) vec2 gCenter; - layout(offset = 40) float gRotation; -#endif -} gPosBO; - -layout (location = 0) noperspective out vec2 texCoord; -layout (location = 1) noperspective out vec4 vertColor; - -void main() -{ - vec2 FinalPos = vec2(inVertex.xy); -#ifndef TW_ROTATIONLESS - float X = FinalPos.x - gPosBO.gCenter.x; - float Y = FinalPos.y - gPosBO.gCenter.y; - - FinalPos.x = X * cos(gPosBO.gRotation) - Y * sin(gPosBO.gRotation) + gPosBO.gCenter.x; - FinalPos.y = X * sin(gPosBO.gRotation) + Y * cos(gPosBO.gRotation) + gPosBO.gCenter.y; -#endif - - gl_Position = vec4(gPosBO.gPos * vec4(FinalPos, 0.0, 1.0), 0.0, 1.0); - texCoord = inVertexTexCoord; - vertColor = inVertexColor; -} diff --git a/data/shader/vulkan/quad.frag b/data/shader/vulkan/quad.frag deleted file mode 100644 index 2d577993f2..0000000000 --- a/data/shader/vulkan/quad.frag +++ /dev/null @@ -1,62 +0,0 @@ -#version 450 -#extension GL_ARB_separate_shader_objects : enable - -#ifdef TW_QUAD_TEXTURED -layout (set = 0, binding = 0) uniform sampler2D gTextureSampler; -#endif - -#ifdef TW_QUAD_TEXTURED -#define UBOSetIndex 1 -#else -#define UBOSetIndex 0 -#endif - -struct SQuadUniformEl { - vec4 gVertColor; - vec2 gOffset; - float gRotation; -}; - -#ifndef TW_PUSH_CONST -#define TW_MAX_QUADS 256 - -layout (std140, set = UBOSetIndex, binding = 1) uniform SOffBO { - uniform SQuadUniformEl gUniEls[TW_MAX_QUADS]; -} gQuadBO; -#else -#define gQuadBO gPosBO -#define QuadIndex 0 -#endif - -layout(push_constant) uniform SPosBO { - layout(offset = 0) uniform mat4x2 gPos; -#ifdef TW_PUSH_CONST - layout(offset = 32) uniform SQuadUniformEl gUniEls[1]; - layout(offset = 64) uniform int gQuadOffset; -#else - layout(offset = 32) uniform int gQuadOffset; -#endif -} gPosBO; - -layout (location = 0) noperspective in vec4 QuadColor; -#ifndef TW_PUSH_CONST -layout (location = 1) flat in int QuadIndex; -#endif -#ifdef TW_QUAD_TEXTURED -#ifndef TW_PUSH_CONST -layout (location = 2) noperspective in vec2 TexCoord; -#else -layout (location = 1) noperspective in vec2 TexCoord; -#endif -#endif - -layout (location = 0) out vec4 FragClr; -void main() -{ -#ifdef TW_QUAD_TEXTURED - vec4 TexColor = texture(gTextureSampler, TexCoord); - FragClr = TexColor * QuadColor * gQuadBO.gUniEls[QuadIndex].gVertColor; -#else - FragClr = QuadColor * gQuadBO.gUniEls[QuadIndex].gVertColor; -#endif -} diff --git a/data/shader/vulkan/quad.vert b/data/shader/vulkan/quad.vert deleted file mode 100644 index 3a3f7f2426..0000000000 --- a/data/shader/vulkan/quad.vert +++ /dev/null @@ -1,83 +0,0 @@ -#version 450 -#extension GL_ARB_separate_shader_objects : enable - -layout (location = 0) in vec4 inVertex; -layout (location = 1) in vec4 inColor; -#ifdef TW_QUAD_TEXTURED -layout (location = 2) in vec2 inVertexTexCoord; -#endif - -#ifdef TW_QUAD_TEXTURED -#define UBOSetIndex 1 -#else -#define UBOSetIndex 0 -#endif - -struct SQuadUniformEl { - vec4 gVertColor; - vec2 gOffset; - float gRotation; -}; - -#ifndef TW_PUSH_CONST -#define TW_MAX_QUADS 256 - -layout (std140, set = UBOSetIndex, binding = 1) uniform SOffBO { - uniform SQuadUniformEl gUniEls[TW_MAX_QUADS]; -} gQuadBO; -#else -#define gQuadBO gPosBO -#define TmpQuadIndex 0 -#endif - -layout(push_constant) uniform SPosBO { - layout(offset = 0) uniform mat4x2 gPos; -#ifdef TW_PUSH_CONST - layout(offset = 32) uniform SQuadUniformEl gUniEls[1]; - layout(offset = 64) uniform int gQuadOffset; -#else - layout(offset = 32) uniform int gQuadOffset; -#endif -} gPosBO; - -layout (location = 0) noperspective out vec4 QuadColor; -#ifndef TW_PUSH_CONST -layout (location = 1) flat out int QuadIndex; -#endif -#ifdef TW_QUAD_TEXTURED -#ifndef TW_PUSH_CONST -layout (location = 2) noperspective out vec2 TexCoord; -#else -layout (location = 1) noperspective out vec2 TexCoord; -#endif -#endif - -void main() -{ - vec2 FinalPos = vec2(inVertex.xy); - -#ifndef TW_PUSH_CONST - int TmpQuadIndex = int(gl_VertexIndex / 4) - gPosBO.gQuadOffset; -#endif - - if(gQuadBO.gUniEls[TmpQuadIndex].gRotation != 0.0) - { - float X = FinalPos.x - inVertex.z; - float Y = FinalPos.y - inVertex.w; - - FinalPos.x = X * cos(gQuadBO.gUniEls[TmpQuadIndex].gRotation) - Y * sin(gQuadBO.gUniEls[TmpQuadIndex].gRotation) + inVertex.z; - FinalPos.y = X * sin(gQuadBO.gUniEls[TmpQuadIndex].gRotation) + Y * cos(gQuadBO.gUniEls[TmpQuadIndex].gRotation) + inVertex.w; - } - - FinalPos.x = FinalPos.x / 1024.0 + gQuadBO.gUniEls[TmpQuadIndex].gOffset.x; - FinalPos.y = FinalPos.y / 1024.0 + gQuadBO.gUniEls[TmpQuadIndex].gOffset.y; - - gl_Position = vec4(gPosBO.gPos * vec4(FinalPos, 0.0, 1.0), 0.0, 1.0); - QuadColor = inColor; -#ifndef TW_PUSH_CONST - QuadIndex = TmpQuadIndex; -#endif -#ifdef TW_QUAD_TEXTURED - TexCoord = inVertexTexCoord; -#endif -} diff --git a/data/shader/vulkan/quadbo.vertfrag b/data/shader/vulkan/quadbo.vertfrag deleted file mode 100644 index 0fc7c51b67..0000000000 --- a/data/shader/vulkan/quadbo.vertfrag +++ /dev/null @@ -1,13 +0,0 @@ - -struct SQuadUniformEl { - vec4 gVertColor; - vec2 gOffset; - float gRotation; -}; - -#define TW_MAX_QUADS 256 - -layout (std140, set = 2, binding = 2) uniform SOffBO { - uniform SQuadUniformEl gUniEls[TW_MAX_QUADS]; -} gQuadBO; - diff --git a/data/shader/vulkan/spritemulti.frag b/data/shader/vulkan/spritemulti.frag deleted file mode 100644 index 05dcdcac6e..0000000000 --- a/data/shader/vulkan/spritemulti.frag +++ /dev/null @@ -1,23 +0,0 @@ -#version 450 -#extension GL_ARB_separate_shader_objects : enable - -layout (set = 0, binding = 0) uniform sampler2D gTextureSampler; - -layout(push_constant) uniform SVertexColorBO { -#ifdef TW_PUSH_CONST - layout(offset = 64) vec4 gVerticesColor; -#else - layout(offset = 48) vec4 gVerticesColor; -#endif -} gColorBO; - -layout (location = 0) noperspective in vec2 texCoord; -layout (location = 1) noperspective in vec4 vertColor; - -layout (location = 0) out vec4 FragClr; - -void main() -{ - vec4 tex = texture(gTextureSampler, texCoord); - FragClr = tex * vertColor * gColorBO.gVerticesColor; -} diff --git a/data/shader/vulkan/spritemulti.vert b/data/shader/vulkan/spritemulti.vert deleted file mode 100644 index 6bfc42b088..0000000000 --- a/data/shader/vulkan/spritemulti.vert +++ /dev/null @@ -1,50 +0,0 @@ -#version 450 -#extension GL_ARB_separate_shader_objects : enable - -layout (location = 0) in vec2 inVertex; -layout (location = 1) in vec2 inVertexTexCoord; -layout (location = 2) in vec4 inVertexColor; - -layout(push_constant) uniform SPosBO { - layout(offset = 0) uniform mat4x2 gPos; - layout(offset = 32) uniform vec2 gCenter; -#ifdef TW_PUSH_CONST - layout(offset = 48) uniform vec4 gRSP[1]; -#endif -} gPosBO; - -#ifndef TW_PUSH_CONST -layout (std140, set = 1, binding = 1) uniform SRSPBO { - vec4 gRSP[512]; -} gRSPBO; -#define RSPIndex gl_InstanceIndex -#else -#define gRSPBO gPosBO -#define RSPIndex 0 -#endif - -layout (location = 0) noperspective out vec2 texCoord; -layout (location = 1) noperspective out vec4 vertColor; - -void main() -{ - vec2 FinalPos = vec2(inVertex.xy); - if(gRSPBO.gRSP[RSPIndex].w != 0.0) - { - float X = FinalPos.x - gPosBO.gCenter.x; - float Y = FinalPos.y - gPosBO.gCenter.y; - - FinalPos.x = X * cos(gRSPBO.gRSP[RSPIndex].w) - Y * sin(gRSPBO.gRSP[RSPIndex].w) + gPosBO.gCenter.x; - FinalPos.y = X * sin(gRSPBO.gRSP[RSPIndex].w) + Y * cos(gRSPBO.gRSP[RSPIndex].w) + gPosBO.gCenter.y; - } - - FinalPos.x *= gRSPBO.gRSP[RSPIndex].z; - FinalPos.y *= gRSPBO.gRSP[RSPIndex].z; - - FinalPos.x += gRSPBO.gRSP[RSPIndex].x; - FinalPos.y += gRSPBO.gRSP[RSPIndex].y; - - gl_Position = vec4(gPosBO.gPos * vec4(FinalPos, 0.0, 1.0), 0.0, 1.0); - texCoord = inVertexTexCoord; - vertColor = inVertexColor; -} diff --git a/data/shader/vulkan/text.frag b/data/shader/vulkan/text.frag deleted file mode 100644 index dca356cb6e..0000000000 --- a/data/shader/vulkan/text.frag +++ /dev/null @@ -1,43 +0,0 @@ -#version 450 -#extension GL_ARB_separate_shader_objects : enable - -layout(binding = 0) uniform sampler2D gTextSampler; -layout(binding = 1) uniform sampler2D gTextOutlineSampler; - -layout(push_constant) uniform SFragConstBO { - layout(offset = 48) uniform vec4 gVertColor; - layout(offset = 64) uniform vec4 gVertOutlineColor; -} gFragConst; - -layout (location = 0) noperspective in vec2 texCoord; -layout (location = 1) noperspective in vec4 outVertColor; - -layout(location = 0) out vec4 FragClr; - -void main() -{ - vec4 textColor = gFragConst.gVertColor * outVertColor * vec4(1.0, 1.0, 1.0, texture(gTextSampler, texCoord).r); - vec4 textOutlineTex = gFragConst.gVertOutlineColor * vec4(1.0, 1.0, 1.0, texture(gTextOutlineSampler, texCoord).r); - - // ratio between the two textures - float OutlineBlend = (1.0 - textColor.a); - - // since the outline is always black, or even if it has decent colors, it can be just added to the actual color - // without losing any or too much color - - // lerp isn't commutative, so add the color the fragment looses by lerping - // this reduces the chance of false color calculation if the text is transparent - - // first get the right color - vec4 textOutlineFrag = vec4(textOutlineTex.rgb * textOutlineTex.a, textOutlineTex.a) * OutlineBlend; - vec3 textFrag = (textColor.rgb * textColor.a); - vec3 finalFragColor = textOutlineFrag.rgb + textFrag; - - float RealAlpha = (textOutlineFrag.a + textColor.a); - - // simply add the color we will loose through blending - if(RealAlpha > 0.0) - FragClr = vec4(finalFragColor / RealAlpha, RealAlpha); - else - FragClr = vec4(0.0, 0.0, 0.0, 0.0); -} diff --git a/data/shader/vulkan/text.vert b/data/shader/vulkan/text.vert deleted file mode 100644 index 1daf509037..0000000000 --- a/data/shader/vulkan/text.vert +++ /dev/null @@ -1,22 +0,0 @@ -#version 450 -#extension GL_ARB_separate_shader_objects : enable - -layout (location = 0) in vec2 inVertex; -layout (location = 1) in vec2 inVertexTexCoord; -layout (location = 2) in vec4 inVertexColor; - -layout(push_constant) uniform SPosBO { - layout(offset = 0) mat4x2 gPos; - layout(offset = 32) float gTextureSize; -} gPosBO; - -layout (location = 0) noperspective out vec2 texCoord; -layout (location = 1) noperspective out vec4 outVertColor; - -void main() -{ - gl_Position = vec4(gPosBO.gPos * vec4(inVertex, 0.0, 1.0), 0.0, 1.0); - - texCoord = vec2(inVertexTexCoord.x / gPosBO.gTextureSize, inVertexTexCoord.y / gPosBO.gTextureSize); - outVertColor = inVertexColor; -} diff --git a/data/shader/vulkan/tile.frag b/data/shader/vulkan/tile.frag deleted file mode 100644 index 85205bcd75..0000000000 --- a/data/shader/vulkan/tile.frag +++ /dev/null @@ -1,25 +0,0 @@ -#version 450 -#extension GL_ARB_separate_shader_objects : enable - -#ifdef TW_TILE_TEXTURED -layout(binding = 0) uniform sampler2DArray gTextureSampler; -#endif - -layout(push_constant) uniform SVertexColorBO { - layout(offset = 64) uniform vec4 gVertColor; -} gColorBO; - -#ifdef TW_TILE_TEXTURED -layout (location = 0) noperspective in vec3 TexCoord; -#endif - -layout (location = 0) out vec4 FragClr; -void main() -{ -#ifdef TW_TILE_TEXTURED - vec4 TexColor = texture(gTextureSampler, TexCoord.xyz); - FragClr = TexColor * gColorBO.gVertColor; -#else - FragClr = gColorBO.gVertColor; -#endif -} diff --git a/data/shader/vulkan/tile.vert b/data/shader/vulkan/tile.vert deleted file mode 100644 index 7dd9d35fdc..0000000000 --- a/data/shader/vulkan/tile.vert +++ /dev/null @@ -1,24 +0,0 @@ -#version 450 -#extension GL_ARB_separate_shader_objects : enable - -layout (location = 0) in vec2 inVertex; -#ifdef TW_TILE_TEXTURED -layout (location = 1) in uvec4 inVertexTexCoord; -#endif - -layout(push_constant) uniform SPosBO { - layout(offset = 0) uniform mat4x2 gPos; -} gPosBO; - -#ifdef TW_TILE_TEXTURED -layout (location = 0) noperspective out vec3 TexCoord; -#endif - -void main() -{ - gl_Position = vec4(gPosBO.gPos * vec4(inVertex, 0.0, 1.0), 0.0, 1.0); - -#ifdef TW_TILE_TEXTURED - TexCoord = vec3(inVertexTexCoord.xyz); -#endif -} diff --git a/data/shader/vulkan/tile_border.frag b/data/shader/vulkan/tile_border.frag deleted file mode 100644 index 841a3f4d4d..0000000000 --- a/data/shader/vulkan/tile_border.frag +++ /dev/null @@ -1,28 +0,0 @@ -#version 450 -#extension GL_ARB_separate_shader_objects : enable - -#ifdef TW_TILE_TEXTURED -layout(binding = 0) uniform sampler2DArray gTextureSampler; -#endif - -layout(push_constant) uniform SVertexColorBO { - layout(offset = 64) uniform vec4 gVertColor; -} gColorBO; - -#ifdef TW_TILE_TEXTURED -layout (location = 0) noperspective centroid in vec3 TexCoord; -#endif - -layout (location = 0) out vec4 FragClr; -void main() -{ -#ifdef TW_TILE_TEXTURED - vec3 realTexCoords = vec3(fract(TexCoord.xy), TexCoord.z); - vec2 dx = dFdx(TexCoord.xy); - vec2 dy = dFdy(TexCoord.xy); - vec4 tex = textureGrad(gTextureSampler, realTexCoords, dx, dy); - FragClr = tex * gColorBO.gVertColor; -#else - FragClr = gColorBO.gVertColor; -#endif -} diff --git a/data/shader/vulkan/tile_border.vert b/data/shader/vulkan/tile_border.vert deleted file mode 100644 index 5463fdf39e..0000000000 --- a/data/shader/vulkan/tile_border.vert +++ /dev/null @@ -1,33 +0,0 @@ -#version 450 -#extension GL_ARB_separate_shader_objects : enable - -layout (location = 0) in vec2 inVertex; -#ifdef TW_TILE_TEXTURED -layout (location = 1) in uvec4 inVertexTexCoord; -#endif - -layout(push_constant) uniform SPosBO { - layout(offset = 0) uniform mat4x2 gPos; - - layout(offset = 32) uniform vec2 gOffset; - layout(offset = 40) uniform vec2 gScale; -} gPosBO; - -#ifdef TW_TILE_TEXTURED -layout (location = 0) noperspective out vec3 TexCoord; -#endif - -void main() -{ - // scale then position vertex - vec2 VertexPos = (inVertex * gPosBO.gScale) + gPosBO.gOffset; - gl_Position = vec4(gPosBO.gPos * vec4(VertexPos, 0.0, 1.0), 0.0, 1.0); - -#ifdef TW_TILE_TEXTURED - // scale the texture coordinates too - vec2 TexScale = gPosBO.gScale; - if (inVertexTexCoord.w > 0) - TexScale = gPosBO.gScale.yx; - TexCoord = vec3(vec2(inVertexTexCoord.xy) * TexScale, float(inVertexTexCoord.z)); -#endif -} diff --git a/data/skins/PaladiN.png b/data/skins/PaladiN.png deleted file mode 100644 index c1ef2d06bc..0000000000 Binary files a/data/skins/PaladiN.png and /dev/null differ diff --git a/data/skins/antiantey.png b/data/skins/antiantey.png deleted file mode 100644 index 9d3dfa78ab..0000000000 Binary files a/data/skins/antiantey.png and /dev/null differ diff --git a/data/skins/beast.png b/data/skins/beast.png deleted file mode 100644 index 2ebb71d9fa..0000000000 Binary files a/data/skins/beast.png and /dev/null differ diff --git a/data/skins/blacktee.png b/data/skins/blacktee.png deleted file mode 100644 index 297e5921e0..0000000000 Binary files a/data/skins/blacktee.png and /dev/null differ diff --git a/data/skins/bluekitty.png b/data/skins/bluekitty.png deleted file mode 100644 index 6a83a91ebf..0000000000 Binary files a/data/skins/bluekitty.png and /dev/null differ diff --git a/data/skins/bluestripe.png b/data/skins/bluestripe.png deleted file mode 100644 index adc5f4b2c9..0000000000 Binary files a/data/skins/bluestripe.png and /dev/null differ diff --git a/data/skins/bomb.png b/data/skins/bomb.png deleted file mode 100644 index 489fe32df5..0000000000 Binary files a/data/skins/bomb.png and /dev/null differ diff --git a/data/skins/brownbear.png b/data/skins/brownbear.png deleted file mode 100644 index 31166ec9d4..0000000000 Binary files a/data/skins/brownbear.png and /dev/null differ diff --git a/data/skins/cammo.png b/data/skins/cammo.png deleted file mode 100644 index a64c0b1b70..0000000000 Binary files a/data/skins/cammo.png and /dev/null differ diff --git a/data/skins/cammostripes.png b/data/skins/cammostripes.png deleted file mode 100644 index 0a7a0b8ef3..0000000000 Binary files a/data/skins/cammostripes.png and /dev/null differ diff --git a/data/skins/chinese_by_whis.png b/data/skins/chinese_by_whis.png deleted file mode 100644 index 3abd8f5d8f..0000000000 Binary files a/data/skins/chinese_by_whis.png and /dev/null differ diff --git a/data/skins/coala.png b/data/skins/coala.png deleted file mode 100644 index 078f1bb324..0000000000 Binary files a/data/skins/coala.png and /dev/null differ diff --git a/data/skins/coala_bluekitty.png b/data/skins/coala_bluekitty.png deleted file mode 100644 index 7aae439ac6..0000000000 Binary files a/data/skins/coala_bluekitty.png and /dev/null differ diff --git a/data/skins/coala_bluestripe.png b/data/skins/coala_bluestripe.png deleted file mode 100644 index 4b3f7032a9..0000000000 Binary files a/data/skins/coala_bluestripe.png and /dev/null differ diff --git a/data/skins/coala_cammo.png b/data/skins/coala_cammo.png deleted file mode 100644 index 28aaf48128..0000000000 Binary files a/data/skins/coala_cammo.png and /dev/null differ diff --git a/data/skins/coala_cammostripes.png b/data/skins/coala_cammostripes.png deleted file mode 100644 index f0a4153236..0000000000 Binary files a/data/skins/coala_cammostripes.png and /dev/null differ diff --git a/data/skins/coala_default.png b/data/skins/coala_default.png deleted file mode 100644 index 56039405fd..0000000000 Binary files a/data/skins/coala_default.png and /dev/null differ diff --git a/data/skins/coala_limekitty.png b/data/skins/coala_limekitty.png deleted file mode 100644 index fef4efbe77..0000000000 Binary files a/data/skins/coala_limekitty.png and /dev/null differ diff --git a/data/skins/coala_pinky.png b/data/skins/coala_pinky.png deleted file mode 100644 index 3da330444c..0000000000 Binary files a/data/skins/coala_pinky.png and /dev/null differ diff --git a/data/skins/coala_redbopp.png b/data/skins/coala_redbopp.png deleted file mode 100644 index 05366ce813..0000000000 Binary files a/data/skins/coala_redbopp.png and /dev/null differ diff --git a/data/skins/coala_redstripe.png b/data/skins/coala_redstripe.png deleted file mode 100644 index acb93c34d3..0000000000 Binary files a/data/skins/coala_redstripe.png and /dev/null differ diff --git a/data/skins/coala_saddo.png b/data/skins/coala_saddo.png deleted file mode 100644 index f7bc2b6d68..0000000000 Binary files a/data/skins/coala_saddo.png and /dev/null differ diff --git a/data/skins/coala_toptri.png b/data/skins/coala_toptri.png deleted file mode 100644 index b21353bfc8..0000000000 Binary files a/data/skins/coala_toptri.png and /dev/null differ diff --git a/data/skins/coala_twinbop.png b/data/skins/coala_twinbop.png deleted file mode 100644 index a5659b96fe..0000000000 Binary files a/data/skins/coala_twinbop.png and /dev/null differ diff --git a/data/skins/coala_twintri.png b/data/skins/coala_twintri.png deleted file mode 100644 index eb389b65f6..0000000000 Binary files a/data/skins/coala_twintri.png and /dev/null differ diff --git a/data/skins/coala_warpaint.png b/data/skins/coala_warpaint.png deleted file mode 100644 index 1aeab20007..0000000000 Binary files a/data/skins/coala_warpaint.png and /dev/null differ diff --git a/data/skins/coala_x_ninja.png b/data/skins/coala_x_ninja.png deleted file mode 100644 index 32b393b51b..0000000000 Binary files a/data/skins/coala_x_ninja.png and /dev/null differ diff --git a/data/skins/default.png b/data/skins/default.png deleted file mode 100644 index 6c881d76d3..0000000000 Binary files a/data/skins/default.png and /dev/null differ diff --git a/data/skins/demonlimekitty.png b/data/skins/demonlimekitty.png deleted file mode 100644 index 39569a4701..0000000000 Binary files a/data/skins/demonlimekitty.png and /dev/null differ diff --git a/data/skins/dino.png b/data/skins/dino.png deleted file mode 100644 index dc9b41a1f6..0000000000 Binary files a/data/skins/dino.png and /dev/null differ diff --git a/data/skins/dragon.png b/data/skins/dragon.png deleted file mode 100644 index daf837bfba..0000000000 Binary files a/data/skins/dragon.png and /dev/null differ diff --git a/data/skins/evil.png b/data/skins/evil.png deleted file mode 100644 index 8db8b4f04f..0000000000 Binary files a/data/skins/evil.png and /dev/null differ diff --git a/data/skins/evilwolfe.png b/data/skins/evilwolfe.png deleted file mode 100644 index 766f5aafa1..0000000000 Binary files a/data/skins/evilwolfe.png and /dev/null differ diff --git a/data/skins/ghost.png b/data/skins/ghost.png deleted file mode 100644 index 2c6f600dcc..0000000000 Binary files a/data/skins/ghost.png and /dev/null differ diff --git a/data/skins/ghostjtj.png b/data/skins/ghostjtj.png deleted file mode 100644 index 97b744d8df..0000000000 Binary files a/data/skins/ghostjtj.png and /dev/null differ diff --git a/data/skins/giraffe.png b/data/skins/giraffe.png deleted file mode 100644 index 74546cd107..0000000000 Binary files a/data/skins/giraffe.png and /dev/null differ diff --git a/data/skins/greensward.png b/data/skins/greensward.png deleted file mode 100644 index bf2bd78a7f..0000000000 Binary files a/data/skins/greensward.png and /dev/null differ diff --git a/data/skins/greyfox.png b/data/skins/greyfox.png deleted file mode 100644 index 798178b782..0000000000 Binary files a/data/skins/greyfox.png and /dev/null differ diff --git a/data/skins/greyfox_2.png b/data/skins/greyfox_2.png deleted file mode 100644 index 0fa635db1b..0000000000 Binary files a/data/skins/greyfox_2.png and /dev/null differ diff --git a/data/skins/hammie-chew.png b/data/skins/hammie-chew.png deleted file mode 100644 index 02d8c0d2e2..0000000000 Binary files a/data/skins/hammie-chew.png and /dev/null differ diff --git a/data/skins/hammie-whis.png b/data/skins/hammie-whis.png deleted file mode 100644 index c92b61e373..0000000000 Binary files a/data/skins/hammie-whis.png and /dev/null differ diff --git a/data/skins/jeet.png b/data/skins/jeet.png deleted file mode 100644 index 944ed9dff5..0000000000 Binary files a/data/skins/jeet.png and /dev/null differ diff --git a/data/skins/kintaro_2.png b/data/skins/kintaro_2.png deleted file mode 100644 index 8d808f5fcb..0000000000 Binary files a/data/skins/kintaro_2.png and /dev/null differ diff --git a/data/skins/kitty_bluestripe.png b/data/skins/kitty_bluestripe.png deleted file mode 100644 index 4ee79da693..0000000000 Binary files a/data/skins/kitty_bluestripe.png and /dev/null differ diff --git a/data/skins/kitty_brownbear.png b/data/skins/kitty_brownbear.png deleted file mode 100644 index dcd5b6fa29..0000000000 Binary files a/data/skins/kitty_brownbear.png and /dev/null differ diff --git a/data/skins/kitty_cammo.png b/data/skins/kitty_cammo.png deleted file mode 100644 index cc980793c8..0000000000 Binary files a/data/skins/kitty_cammo.png and /dev/null differ diff --git a/data/skins/kitty_cammostripes.png b/data/skins/kitty_cammostripes.png deleted file mode 100644 index 1f7549ad67..0000000000 Binary files a/data/skins/kitty_cammostripes.png and /dev/null differ diff --git a/data/skins/kitty_coala.png b/data/skins/kitty_coala.png deleted file mode 100644 index 3ebb4045f9..0000000000 Binary files a/data/skins/kitty_coala.png and /dev/null differ diff --git a/data/skins/kitty_default.png b/data/skins/kitty_default.png deleted file mode 100644 index 28cef14b02..0000000000 Binary files a/data/skins/kitty_default.png and /dev/null differ diff --git a/data/skins/kitty_pinky.png b/data/skins/kitty_pinky.png deleted file mode 100644 index 3b3ff64900..0000000000 Binary files a/data/skins/kitty_pinky.png and /dev/null differ diff --git a/data/skins/kitty_redbopp.png b/data/skins/kitty_redbopp.png deleted file mode 100644 index b794fd5254..0000000000 Binary files a/data/skins/kitty_redbopp.png and /dev/null differ diff --git a/data/skins/kitty_redstripe.png b/data/skins/kitty_redstripe.png deleted file mode 100644 index 472f10698d..0000000000 Binary files a/data/skins/kitty_redstripe.png and /dev/null differ diff --git a/data/skins/kitty_saddo.png b/data/skins/kitty_saddo.png deleted file mode 100644 index 3d16dc5221..0000000000 Binary files a/data/skins/kitty_saddo.png and /dev/null differ diff --git a/data/skins/kitty_toptri.png b/data/skins/kitty_toptri.png deleted file mode 100644 index 7f530bcb15..0000000000 Binary files a/data/skins/kitty_toptri.png and /dev/null differ diff --git a/data/skins/kitty_twinbop.png b/data/skins/kitty_twinbop.png deleted file mode 100644 index 224893e4e3..0000000000 Binary files a/data/skins/kitty_twinbop.png and /dev/null differ diff --git a/data/skins/kitty_twintri.png b/data/skins/kitty_twintri.png deleted file mode 100644 index 145138d12d..0000000000 Binary files a/data/skins/kitty_twintri.png and /dev/null differ diff --git a/data/skins/kitty_warpaint.png b/data/skins/kitty_warpaint.png deleted file mode 100644 index 9573da4306..0000000000 Binary files a/data/skins/kitty_warpaint.png and /dev/null differ diff --git a/data/skins/kitty_x_ninja.png b/data/skins/kitty_x_ninja.png deleted file mode 100644 index d7734b6034..0000000000 Binary files a/data/skins/kitty_x_ninja.png and /dev/null differ diff --git a/data/skins/license.txt b/data/skins/license.txt deleted file mode 100644 index 1a4164c594..0000000000 --- a/data/skins/license.txt +++ /dev/null @@ -1,47 +0,0 @@ -bluekitty, bluestripe, brownbear, cammo, cammostripes, coala, default, -limekitty, pinky, redbopp, redstripe, saddo, toptri, twinbop, twintri, -warpaint: -Copyright Magnus Auvinen -zlib license - -antiantey, beast, chinese_by_whis, dino, evil, evilwolfe, ghostjtj, ghost, -giraffe, greensward, greyfox, hammie-chew, hammie-whis, jeet, kintaro_2, -mermydon-coala, mermydon, mouse, musmann, nanami, oldman, oldschool, PaladiN, -penguin, random, veteran, voodoo_tee, whis: -Copyright Whis -CC-BY license - -coala_bluekitty, coala_bluestripe, coala_cammo, coala_cammostripes, -coala_default, coala_limekitty, coala_pinky, coala_redbopp, coala_redstripe, -coala_saddo, coala_toptri, coala_twinbop, coala_twintri, coala_warpaint, -coala_x_ninja: -Copyright DanilBest -CC-BY-SA license - -santa_bluekitty, santa_bluestripe, santa_brownbear, santa_cammo, santa_coala, -santa_default, santa_limekitty, santa_pinky, santa_redbopp, santa_redstripe, -santa_saddo, santa_toptri, santa_twinbop, santa_twintri, santa_warpaint: -Copyright forsaken -CC-BY-SA license - -bomb, kitty_bluekitty, kitty_bluestripe, kitty_brownbear, kitty_cammo, -kitty_coala, kitty_default, kitty_limekitty, kitty_pinky, kitty_redbopp, -kitty_redstripe, kitty_saddo, kitty_toptri, kitty_twinbop, kitty_twintri, -kitty_warpaint: -Copyright Ravie -CC0 license - -kitty_x_ninja: -Copyright patwo.* -CC0 license - -demonlimekitty, nanas, nersif: -Copyright Miper -CC-BY-SA license - -wartee: -Copyright Obst -zlib license - -All other skins: -All content is released under CC-BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0/). diff --git a/data/skins/limekitty.png b/data/skins/limekitty.png deleted file mode 100644 index 3763cb3699..0000000000 Binary files a/data/skins/limekitty.png and /dev/null differ diff --git a/data/skins/mermydon-coala.png b/data/skins/mermydon-coala.png deleted file mode 100644 index f61c246c41..0000000000 Binary files a/data/skins/mermydon-coala.png and /dev/null differ diff --git a/data/skins/mermydon.png b/data/skins/mermydon.png deleted file mode 100644 index a2bf2c7256..0000000000 Binary files a/data/skins/mermydon.png and /dev/null differ diff --git a/data/skins/mouse.png b/data/skins/mouse.png deleted file mode 100644 index 5e2746c7c6..0000000000 Binary files a/data/skins/mouse.png and /dev/null differ diff --git a/data/skins/musmann.png b/data/skins/musmann.png deleted file mode 100644 index 997ebaca13..0000000000 Binary files a/data/skins/musmann.png and /dev/null differ diff --git a/data/skins/nanami.png b/data/skins/nanami.png deleted file mode 100644 index 76ff87ee24..0000000000 Binary files a/data/skins/nanami.png and /dev/null differ diff --git a/data/skins/nanas.png b/data/skins/nanas.png deleted file mode 100644 index ced0d03245..0000000000 Binary files a/data/skins/nanas.png and /dev/null differ diff --git a/data/skins/nersif.png b/data/skins/nersif.png deleted file mode 100644 index 0e5e3214d2..0000000000 Binary files a/data/skins/nersif.png and /dev/null differ diff --git a/data/skins/oldman.png b/data/skins/oldman.png deleted file mode 100644 index 172966c639..0000000000 Binary files a/data/skins/oldman.png and /dev/null differ diff --git a/data/skins/oldschool.png b/data/skins/oldschool.png deleted file mode 100644 index d7aa36625a..0000000000 Binary files a/data/skins/oldschool.png and /dev/null differ diff --git a/data/skins/penguin.png b/data/skins/penguin.png deleted file mode 100644 index bbd6ea4d7c..0000000000 Binary files a/data/skins/penguin.png and /dev/null differ diff --git a/data/skins/pinky.png b/data/skins/pinky.png deleted file mode 100644 index b67c956a0d..0000000000 Binary files a/data/skins/pinky.png and /dev/null differ diff --git a/data/skins/random.png b/data/skins/random.png deleted file mode 100644 index 76a2155cdb..0000000000 Binary files a/data/skins/random.png and /dev/null differ diff --git a/data/skins/redbopp.png b/data/skins/redbopp.png deleted file mode 100644 index 0a8e06a59e..0000000000 Binary files a/data/skins/redbopp.png and /dev/null differ diff --git a/data/skins/redstripe.png b/data/skins/redstripe.png deleted file mode 100644 index 770307ed49..0000000000 Binary files a/data/skins/redstripe.png and /dev/null differ diff --git a/data/skins/saddo.png b/data/skins/saddo.png deleted file mode 100644 index d9d9eb61cd..0000000000 Binary files a/data/skins/saddo.png and /dev/null differ diff --git a/data/skins/santa_bluekitty.png b/data/skins/santa_bluekitty.png deleted file mode 100644 index b1f0ae2b93..0000000000 Binary files a/data/skins/santa_bluekitty.png and /dev/null differ diff --git a/data/skins/santa_bluestripe.png b/data/skins/santa_bluestripe.png deleted file mode 100644 index 194a8ff275..0000000000 Binary files a/data/skins/santa_bluestripe.png and /dev/null differ diff --git a/data/skins/santa_brownbear.png b/data/skins/santa_brownbear.png deleted file mode 100644 index 32509af1f2..0000000000 Binary files a/data/skins/santa_brownbear.png and /dev/null differ diff --git a/data/skins/santa_cammo.png b/data/skins/santa_cammo.png deleted file mode 100644 index b5ed343938..0000000000 Binary files a/data/skins/santa_cammo.png and /dev/null differ diff --git a/data/skins/santa_cammostripes.png b/data/skins/santa_cammostripes.png deleted file mode 100644 index 311be6f774..0000000000 Binary files a/data/skins/santa_cammostripes.png and /dev/null differ diff --git a/data/skins/santa_coala.png b/data/skins/santa_coala.png deleted file mode 100644 index 1f23ac5a73..0000000000 Binary files a/data/skins/santa_coala.png and /dev/null differ diff --git a/data/skins/santa_default.png b/data/skins/santa_default.png deleted file mode 100644 index ed52331f23..0000000000 Binary files a/data/skins/santa_default.png and /dev/null differ diff --git a/data/skins/santa_limekitty.png b/data/skins/santa_limekitty.png deleted file mode 100644 index d0aef32342..0000000000 Binary files a/data/skins/santa_limekitty.png and /dev/null differ diff --git a/data/skins/santa_pinky.png b/data/skins/santa_pinky.png deleted file mode 100644 index 77356af86b..0000000000 Binary files a/data/skins/santa_pinky.png and /dev/null differ diff --git a/data/skins/santa_redbopp.png b/data/skins/santa_redbopp.png deleted file mode 100644 index 4f74711c11..0000000000 Binary files a/data/skins/santa_redbopp.png and /dev/null differ diff --git a/data/skins/santa_redstripe.png b/data/skins/santa_redstripe.png deleted file mode 100644 index c2ed91d92e..0000000000 Binary files a/data/skins/santa_redstripe.png and /dev/null differ diff --git a/data/skins/santa_saddo.png b/data/skins/santa_saddo.png deleted file mode 100644 index 0b7ba361d6..0000000000 Binary files a/data/skins/santa_saddo.png and /dev/null differ diff --git a/data/skins/santa_toptri.png b/data/skins/santa_toptri.png deleted file mode 100644 index f29110b5c6..0000000000 Binary files a/data/skins/santa_toptri.png and /dev/null differ diff --git a/data/skins/santa_twinbop.png b/data/skins/santa_twinbop.png deleted file mode 100644 index 9e09fddf5e..0000000000 Binary files a/data/skins/santa_twinbop.png and /dev/null differ diff --git a/data/skins/santa_twintri.png b/data/skins/santa_twintri.png deleted file mode 100644 index ea2a613df8..0000000000 Binary files a/data/skins/santa_twintri.png and /dev/null differ diff --git a/data/skins/santa_warpaint.png b/data/skins/santa_warpaint.png deleted file mode 100644 index ab9efa8a63..0000000000 Binary files a/data/skins/santa_warpaint.png and /dev/null differ diff --git a/data/skins/teerasta.png b/data/skins/teerasta.png deleted file mode 100644 index 2c0e3b549b..0000000000 Binary files a/data/skins/teerasta.png and /dev/null differ diff --git a/data/skins/toptri.png b/data/skins/toptri.png deleted file mode 100644 index d3c66e8583..0000000000 Binary files a/data/skins/toptri.png and /dev/null differ diff --git a/data/skins/twinbop.png b/data/skins/twinbop.png deleted file mode 100644 index 2be1543ccc..0000000000 Binary files a/data/skins/twinbop.png and /dev/null differ diff --git a/data/skins/twintri.png b/data/skins/twintri.png deleted file mode 100644 index 108944a258..0000000000 Binary files a/data/skins/twintri.png and /dev/null differ diff --git a/data/skins/veteran.png b/data/skins/veteran.png deleted file mode 100644 index 546c3dfde0..0000000000 Binary files a/data/skins/veteran.png and /dev/null differ diff --git a/data/skins/voodoo_tee.png b/data/skins/voodoo_tee.png deleted file mode 100644 index 3b8006edf5..0000000000 Binary files a/data/skins/voodoo_tee.png and /dev/null differ diff --git a/data/skins/warpaint.png b/data/skins/warpaint.png deleted file mode 100644 index 02bc76f2b9..0000000000 Binary files a/data/skins/warpaint.png and /dev/null differ diff --git a/data/skins/wartee.png b/data/skins/wartee.png deleted file mode 100644 index a97db81b17..0000000000 Binary files a/data/skins/wartee.png and /dev/null differ diff --git a/data/skins/whis.png b/data/skins/whis.png deleted file mode 100644 index 66f907c157..0000000000 Binary files a/data/skins/whis.png and /dev/null differ diff --git a/data/skins/x_ninja.png b/data/skins/x_ninja.png deleted file mode 100644 index 16ab882b7b..0000000000 Binary files a/data/skins/x_ninja.png and /dev/null differ diff --git a/data/skins/x_spec.png b/data/skins/x_spec.png deleted file mode 100644 index 6e75cba28d..0000000000 Binary files a/data/skins/x_spec.png and /dev/null differ diff --git a/data/skins7/beaver.json b/data/skins7/beaver.json deleted file mode 100644 index a9a3c4bfea..0000000000 --- a/data/skins7/beaver.json +++ /dev/null @@ -1,38 +0,0 @@ -{"skin": { - "body": { - "filename": "beaver", - "custom_colors": "true", - "hue": 19, - "sat": 105, - "lgt": 85 - }, - "marking": { - "filename": "twinbelly", - "custom_colors": "true", - "hue": 32, - "sat": 59, - "lgt": 209, - "alp": 198 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 16, - "sat": 133, - "lgt": 121 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 17, - "sat": 129, - "lgt": 38 - }, - "eyes": { - "filename": "colorable", - "custom_colors": "true", - "hue": 23, - "sat": 202, - "lgt": 45 - }} -} diff --git a/data/skins7/bluekitty.json b/data/skins7/bluekitty.json deleted file mode 100644 index 6951315b99..0000000000 --- a/data/skins7/bluekitty.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "skin": { - "body": { - "filename": "kitty", - "custom_colors": true, - "hue": 132, - "sat": 118, - "lgt": 184 - }, - "marking": { - "filename": "whisker", - "custom_colors": true, - "hue": 130, - "sat": 109, - "lgt": 219, - "alp": 255 - }, - "hands": { - "filename": "standard", - "custom_colors": true, - "hue": 120, - "sat": 82, - "lgt": 235 - }, - "feet": { - "filename": "standard", - "custom_colors": true, - "hue": 135, - "sat": 82, - "lgt": 233 - }, - "eyes": { - "filename": "negative", - "custom_colors": true, - "hue": 137, - "sat": 255, - "lgt": 0 - } - } -} diff --git a/data/skins7/bluestripe.json b/data/skins7/bluestripe.json deleted file mode 100644 index f2f90f48c8..0000000000 --- a/data/skins7/bluestripe.json +++ /dev/null @@ -1,31 +0,0 @@ -{"skin": { - "body": { - "filename": "standard", - "custom_colors": "true", - "hue": 155, - "sat": 116, - "lgt": 122 - }, - "marking": { - "filename": "stripes", - "custom_colors": "false" - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 11, - "sat": 117, - "lgt": 0 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 29, - "sat": 173, - "lgt": 87 - }, - "eyes": { - "filename": "standard", - "custom_colors": "false" - }} -} diff --git a/data/skins7/body/bat.png b/data/skins7/body/bat.png deleted file mode 100644 index 1e9da2647f..0000000000 Binary files a/data/skins7/body/bat.png and /dev/null differ diff --git a/data/skins7/body/bear.png b/data/skins7/body/bear.png deleted file mode 100644 index f4ad63ed51..0000000000 Binary files a/data/skins7/body/bear.png and /dev/null differ diff --git a/data/skins7/body/beaver.png b/data/skins7/body/beaver.png deleted file mode 100644 index 4e9e7c492a..0000000000 Binary files a/data/skins7/body/beaver.png and /dev/null differ diff --git a/data/skins7/body/dog.png b/data/skins7/body/dog.png deleted file mode 100644 index e099368614..0000000000 Binary files a/data/skins7/body/dog.png and /dev/null differ diff --git a/data/skins7/body/force.png b/data/skins7/body/force.png deleted file mode 100644 index 00fe21c862..0000000000 Binary files a/data/skins7/body/force.png and /dev/null differ diff --git a/data/skins7/body/fox.png b/data/skins7/body/fox.png deleted file mode 100644 index d379814669..0000000000 Binary files a/data/skins7/body/fox.png and /dev/null differ diff --git a/data/skins7/body/greensward.png b/data/skins7/body/greensward.png deleted file mode 100644 index 87dbd52a84..0000000000 Binary files a/data/skins7/body/greensward.png and /dev/null differ diff --git a/data/skins7/body/hippo.png b/data/skins7/body/hippo.png deleted file mode 100644 index 35370aaef9..0000000000 Binary files a/data/skins7/body/hippo.png and /dev/null differ diff --git a/data/skins7/body/kitty.png b/data/skins7/body/kitty.png deleted file mode 100644 index d1bfaf7420..0000000000 Binary files a/data/skins7/body/kitty.png and /dev/null differ diff --git a/data/skins7/body/koala.png b/data/skins7/body/koala.png deleted file mode 100644 index 85d58d2559..0000000000 Binary files a/data/skins7/body/koala.png and /dev/null differ diff --git a/data/skins7/body/monkey.png b/data/skins7/body/monkey.png deleted file mode 100644 index 361d9a1530..0000000000 Binary files a/data/skins7/body/monkey.png and /dev/null differ diff --git a/data/skins7/body/mouse.png b/data/skins7/body/mouse.png deleted file mode 100644 index 1784adc0fb..0000000000 Binary files a/data/skins7/body/mouse.png and /dev/null differ diff --git a/data/skins7/body/piglet.png b/data/skins7/body/piglet.png deleted file mode 100644 index 935bb12bcb..0000000000 Binary files a/data/skins7/body/piglet.png and /dev/null differ diff --git a/data/skins7/body/raccoon.png b/data/skins7/body/raccoon.png deleted file mode 100644 index bab32b4cba..0000000000 Binary files a/data/skins7/body/raccoon.png and /dev/null differ diff --git a/data/skins7/body/spiky.png b/data/skins7/body/spiky.png deleted file mode 100644 index 2fa3cf8575..0000000000 Binary files a/data/skins7/body/spiky.png and /dev/null differ diff --git a/data/skins7/body/standard.png b/data/skins7/body/standard.png deleted file mode 100644 index 6f0bcfcf6f..0000000000 Binary files a/data/skins7/body/standard.png and /dev/null differ diff --git a/data/skins7/body/x_ninja.png b/data/skins7/body/x_ninja.png deleted file mode 100644 index aff5afbf36..0000000000 Binary files a/data/skins7/body/x_ninja.png and /dev/null differ diff --git a/data/skins7/bot.png b/data/skins7/bot.png deleted file mode 100644 index 8b8ac416b8..0000000000 Binary files a/data/skins7/bot.png and /dev/null differ diff --git a/data/skins7/brownbear.json b/data/skins7/brownbear.json deleted file mode 100644 index 09bbd0332a..0000000000 --- a/data/skins7/brownbear.json +++ /dev/null @@ -1,39 +0,0 @@ -{"skin": { - "body": { - "filename": "bear", - "custom_colors": "true", - "hue": 16, - "sat": 133, - "lgt": 121 - }, - "marking": { - "filename": "bear", - "custom_colors": "true", - "hue": 17, - "sat": 110, - "lgt": 168, - "alp": 255 - }, - "decoration": { - "filename": "hair", - "custom_colors": "false" - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 16, - "sat": 133, - "lgt": 121 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 17, - "sat": 129, - "lgt": 38 - }, - "eyes": { - "filename": "standard", - "custom_colors": "false" - }} -} diff --git a/data/skins7/bumbler.json b/data/skins7/bumbler.json deleted file mode 100644 index 069d545897..0000000000 --- a/data/skins7/bumbler.json +++ /dev/null @@ -1,38 +0,0 @@ -{"skin": { - "body": { - "filename": "raccoon", - "custom_colors": "true", - "hue": 150, - "sat": 16, - "lgt": 29 - }, - "marking": { - "filename": "setisu", - "custom_colors": "true", - "hue": 34, - "sat": 183, - "lgt": 220, - "alp": 96 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 27, - "sat": 138, - "lgt": 158 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 28, - "sat": 103, - "lgt": 143 - }, - "eyes": { - "filename": "colorable", - "custom_colors": "true", - "hue": 28, - "sat": 107, - "lgt": 54 - }} -} diff --git a/data/skins7/cammo.json b/data/skins7/cammo.json deleted file mode 100644 index c28689c1b9..0000000000 --- a/data/skins7/cammo.json +++ /dev/null @@ -1,35 +0,0 @@ -{"skin": { - "body": { - "filename": "standard", - "custom_colors": "true", - "hue": 81, - "sat": 101, - "lgt": 70 - }, - "marking": { - "filename": "cammo2", - "custom_colors": "true", - "hue": 76, - "sat": 97, - "lgt": 45, - "alp": 255 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 11, - "sat": 117, - "lgt": 0 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 29, - "sat": 173, - "lgt": 87 - }, - "eyes": { - "filename": "standard", - "custom_colors": "false" - }} -} diff --git a/data/skins7/cammostripes.json b/data/skins7/cammostripes.json deleted file mode 100644 index 71d6d4186a..0000000000 --- a/data/skins7/cammostripes.json +++ /dev/null @@ -1,35 +0,0 @@ -{"skin": { - "body": { - "filename": "standard", - "custom_colors": "true", - "hue": 81, - "sat": 101, - "lgt": 70 - }, - "marking": { - "filename": "cammostripes", - "custom_colors": "true", - "hue": 29, - "sat": 142, - "lgt": 0, - "alp": 255 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 11, - "sat": 117, - "lgt": 0 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 29, - "sat": 173, - "lgt": 87 - }, - "eyes": { - "filename": "standard", - "custom_colors": "false" - }} -} diff --git a/data/skins7/cavebat.json b/data/skins7/cavebat.json deleted file mode 100644 index e2d72dafb0..0000000000 --- a/data/skins7/cavebat.json +++ /dev/null @@ -1,38 +0,0 @@ -{"skin": { - "body": { - "filename": "bat", - "custom_colors": "true", - "hue": 16, - "sat": 167, - "lgt": 185 - }, - "marking": { - "filename": "belly2", - "custom_colors": "true", - "hue": 10, - "sat": 39, - "lgt": 45, - "alp": 152 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 10, - "sat": 45, - "lgt": 72 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 14, - "sat": 123, - "lgt": 156 - }, - "eyes": { - "filename": "colorable", - "custom_colors": "true", - "hue": 8, - "sat": 112, - "lgt": 47 - }} -} diff --git a/data/skins7/decoration/hair.png b/data/skins7/decoration/hair.png deleted file mode 100644 index d7b97d5d43..0000000000 Binary files a/data/skins7/decoration/hair.png and /dev/null differ diff --git a/data/skins7/decoration/twinbopp.png b/data/skins7/decoration/twinbopp.png deleted file mode 100644 index 5c1de1a87d..0000000000 Binary files a/data/skins7/decoration/twinbopp.png and /dev/null differ diff --git a/data/skins7/decoration/twinmello.png b/data/skins7/decoration/twinmello.png deleted file mode 100644 index 677e091548..0000000000 Binary files a/data/skins7/decoration/twinmello.png and /dev/null differ diff --git a/data/skins7/decoration/twinpen.png b/data/skins7/decoration/twinpen.png deleted file mode 100644 index 9c640f37fc..0000000000 Binary files a/data/skins7/decoration/twinpen.png and /dev/null differ diff --git a/data/skins7/decoration/unibop.png b/data/skins7/decoration/unibop.png deleted file mode 100644 index 6b6435d509..0000000000 Binary files a/data/skins7/decoration/unibop.png and /dev/null differ diff --git a/data/skins7/decoration/unimelo.png b/data/skins7/decoration/unimelo.png deleted file mode 100644 index 2b86882edb..0000000000 Binary files a/data/skins7/decoration/unimelo.png and /dev/null differ diff --git a/data/skins7/decoration/unipento.png b/data/skins7/decoration/unipento.png deleted file mode 100644 index 9f39b858a7..0000000000 Binary files a/data/skins7/decoration/unipento.png and /dev/null differ diff --git a/data/skins7/default.json b/data/skins7/default.json deleted file mode 100644 index c43f9fa7ec..0000000000 --- a/data/skins7/default.json +++ /dev/null @@ -1,27 +0,0 @@ -{"skin": { - "body": { - "filename": "standard", - "custom_colors": "true", - "hue": 27, - "sat": 111, - "lgt": 116 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 27, - "sat": 117, - "lgt": 158 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 28, - "sat": 135, - "lgt": 62 - }, - "eyes": { - "filename": "standard", - "custom_colors": "false" - }} -} diff --git a/data/skins7/eyes/colorable.png b/data/skins7/eyes/colorable.png deleted file mode 100644 index 3b2cad4a87..0000000000 Binary files a/data/skins7/eyes/colorable.png and /dev/null differ diff --git a/data/skins7/eyes/negative.png b/data/skins7/eyes/negative.png deleted file mode 100644 index 411188be73..0000000000 Binary files a/data/skins7/eyes/negative.png and /dev/null differ diff --git a/data/skins7/eyes/standard.png b/data/skins7/eyes/standard.png deleted file mode 100644 index eebee95a9f..0000000000 Binary files a/data/skins7/eyes/standard.png and /dev/null differ diff --git a/data/skins7/eyes/standardreal.png b/data/skins7/eyes/standardreal.png deleted file mode 100644 index 2c1fa80bd9..0000000000 Binary files a/data/skins7/eyes/standardreal.png and /dev/null differ diff --git a/data/skins7/eyes/x_ninja.png b/data/skins7/eyes/x_ninja.png deleted file mode 100644 index 615acbc925..0000000000 Binary files a/data/skins7/eyes/x_ninja.png and /dev/null differ diff --git a/data/skins7/feet/standard.png b/data/skins7/feet/standard.png deleted file mode 100644 index 004fd5d762..0000000000 Binary files a/data/skins7/feet/standard.png and /dev/null differ diff --git a/data/skins7/force.json b/data/skins7/force.json deleted file mode 100644 index da511e6c40..0000000000 --- a/data/skins7/force.json +++ /dev/null @@ -1,38 +0,0 @@ -{"skin": { - "body": { - "filename": "force", - "custom_colors": "true", - "hue": 24, - "sat": 19, - "lgt": 52 - }, - "marking": { - "filename": "wildpaint", - "custom_colors": "true", - "hue": 30, - "sat": 54, - "lgt": 3, - "alp": 54 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 27, - "sat": 0, - "lgt": 63 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 28, - "sat": 0, - "lgt": 0 - }, - "eyes": { - "filename": "standard", - "custom_colors": "true", - "hue": 0, - "sat": 0, - "lgt": 0 - }} -} diff --git a/data/skins7/fox.json b/data/skins7/fox.json deleted file mode 100644 index c54419959d..0000000000 --- a/data/skins7/fox.json +++ /dev/null @@ -1,38 +0,0 @@ -{"skin": { - "body": { - "filename": "fox", - "custom_colors": "true", - "hue": 16, - "sat": 210, - "lgt": 107 - }, - "marking": { - "filename": "fox", - "custom_colors": "true", - "hue": 16, - "sat": 255, - "lgt": 242, - "alp": 227 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 16, - "sat": 180, - "lgt": 99 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 16, - "sat": 210, - "lgt": 114 - }, - "eyes": { - "filename": "colorable", - "custom_colors": "true", - "hue": 21, - "sat": 255, - "lgt": 96 - }} -} diff --git a/data/skins7/greensward.json b/data/skins7/greensward.json deleted file mode 100644 index 69b59f2e0b..0000000000 --- a/data/skins7/greensward.json +++ /dev/null @@ -1,29 +0,0 @@ -{"skin": { - "body": { - "filename": "greensward", - "custom_colors": "true", - "hue": 85, - "sat": 255, - "lgt": 0 - }, - "marking": { - "filename": "duodonny", - "custom_colors": "true", - "hue": 85, - "sat": 255, - "lgt": 20, - "alp": 255 - }, - "hands": { - "filename": "standard", - "custom_colors": "false" - }, - "feet": { - "filename": "standard", - "custom_colors": "false" - }, - "eyes": { - "filename": "standard", - "custom_colors": "false" - }} -} diff --git a/data/skins7/greycoon.json b/data/skins7/greycoon.json deleted file mode 100644 index 44a9fa8250..0000000000 --- a/data/skins7/greycoon.json +++ /dev/null @@ -1,38 +0,0 @@ -{"skin": { - "body": { - "filename": "raccoon", - "custom_colors": "true", - "hue": 14, - "sat": 0, - "lgt": 147 - }, - "marking": { - "filename": "coonfluff", - "custom_colors": "true", - "hue": 23, - "sat": 0, - "lgt": 105, - "alp": 255 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 27, - "sat": 0, - "lgt": 171 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 19, - "sat": 0, - "lgt": 152 - }, - "eyes": { - "filename": "standard", - "custom_colors": "true", - "hue": 16, - "sat": 143, - "lgt": 50 - }} -} diff --git a/data/skins7/greyfox.json b/data/skins7/greyfox.json deleted file mode 100644 index 24068f7f03..0000000000 --- a/data/skins7/greyfox.json +++ /dev/null @@ -1,38 +0,0 @@ -{"skin": { - "body": { - "filename": "fox", - "custom_colors": "true", - "hue": 16, - "sat": 10, - "lgt": 67 - }, - "marking": { - "filename": "cammostripes", - "custom_colors": "true", - "hue": 23, - "sat": 21, - "lgt": 191, - "alp": 32 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 156, - "sat": 28, - "lgt": 19 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 32, - "sat": 12, - "lgt": 56 - }, - "eyes": { - "filename": "colorable", - "custom_colors": "true", - "hue": 28, - "sat": 90, - "lgt": 65 - }} -} diff --git a/data/skins7/hands/standard.png b/data/skins7/hands/standard.png deleted file mode 100644 index 791ad0b3f7..0000000000 Binary files a/data/skins7/hands/standard.png and /dev/null differ diff --git a/data/skins7/hippo.json b/data/skins7/hippo.json deleted file mode 100644 index 0d2f41a9d3..0000000000 --- a/data/skins7/hippo.json +++ /dev/null @@ -1,42 +0,0 @@ -{"skin": { - "body": { - "filename": "hippo", - "custom_colors": "true", - "hue": 174, - "sat": 176, - "lgt": 183 - }, - "marking": { - "filename": "hipbel", - "custom_colors": "true", - "hue": 191, - "sat": 0, - "lgt": 255, - "alp": 178 - }, - "decoration": { - "filename": "hair", - "custom_colors": "false" - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 189, - "sat": 72, - "lgt": 160 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 209, - "sat": 50, - "lgt": 36 - }, - "eyes": { - "filename": "standard", - "custom_colors": "true", - "hue": 198, - "sat": 196, - "lgt": 45 - }} -} diff --git a/data/skins7/koala.json b/data/skins7/koala.json deleted file mode 100644 index 08b3cadb7f..0000000000 --- a/data/skins7/koala.json +++ /dev/null @@ -1,35 +0,0 @@ -{"skin": { - "body": { - "filename": "koala", - "custom_colors": "true", - "hue": 0, - "sat": 0, - "lgt": 184 - }, - "marking": { - "filename": "twinbelly", - "custom_colors": "true", - "hue": 21, - "sat": 12, - "lgt": 226, - "alp": 255 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 0, - "sat": 0, - "lgt": 184 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 149, - "sat": 4, - "lgt": 71 - }, - "eyes": { - "filename": "standard", - "custom_colors": "false" - }} -} diff --git a/data/skins7/limedog.json b/data/skins7/limedog.json deleted file mode 100644 index e9e7727979..0000000000 --- a/data/skins7/limedog.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "skin": { - "body": { - "filename": "dog", - "custom_colors": true, - "hue": 36, - "sat": 185, - "lgt": 169 - }, - "marking": { - "filename": "whisker", - "custom_colors": true, - "hue": 0, - "sat": 153, - "lgt": 255, - "alp": 255 - }, - "hands": { - "filename": "standard", - "custom_colors": true, - "hue": 12, - "sat": 178, - "lgt": 136 - }, - "feet": { - "filename": "standard", - "custom_colors": true, - "hue": 14, - "sat": 205, - "lgt": 112 - }, - "eyes": { - "filename": "negative", - "custom_colors": true, - "hue": 18, - "sat": 180, - "lgt": 118 - } - } -} diff --git a/data/skins7/limekitty.json b/data/skins7/limekitty.json deleted file mode 100644 index ae66e4ff64..0000000000 --- a/data/skins7/limekitty.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "skin": { - "body": { - "filename": "kitty", - "custom_colors": true, - "hue": 70, - "sat": 98, - "lgt": 195 - }, - "marking": { - "filename": "whisker", - "custom_colors": true, - "hue": 69, - "sat": 98, - "lgt": 224, - "alp": 255 - }, - "hands": { - "filename": "standard", - "custom_colors": true, - "hue": 58, - "sat": 104, - "lgt": 239 - }, - "feet": { - "filename": "standard", - "custom_colors": true, - "hue": 58, - "sat": 104, - "lgt": 239 - }, - "eyes": { - "filename": "negative", - "custom_colors": true, - "hue": 125, - "sat": 250, - "lgt": 0 - } - } -} diff --git a/data/skins7/marking/bear.png b/data/skins7/marking/bear.png deleted file mode 100644 index 06c805ed99..0000000000 Binary files a/data/skins7/marking/bear.png and /dev/null differ diff --git a/data/skins7/marking/belly1.png b/data/skins7/marking/belly1.png deleted file mode 100644 index 65eb8d4d0d..0000000000 Binary files a/data/skins7/marking/belly1.png and /dev/null differ diff --git a/data/skins7/marking/belly2.png b/data/skins7/marking/belly2.png deleted file mode 100644 index 1c6cdc93b4..0000000000 Binary files a/data/skins7/marking/belly2.png and /dev/null differ diff --git a/data/skins7/marking/blush.png b/data/skins7/marking/blush.png deleted file mode 100644 index e579d53038..0000000000 Binary files a/data/skins7/marking/blush.png and /dev/null differ diff --git a/data/skins7/marking/bug.png b/data/skins7/marking/bug.png deleted file mode 100644 index bfd7e2cf67..0000000000 Binary files a/data/skins7/marking/bug.png and /dev/null differ diff --git a/data/skins7/marking/cammo1.png b/data/skins7/marking/cammo1.png deleted file mode 100644 index adbfb55662..0000000000 Binary files a/data/skins7/marking/cammo1.png and /dev/null differ diff --git a/data/skins7/marking/cammo2.png b/data/skins7/marking/cammo2.png deleted file mode 100644 index e194a0367f..0000000000 Binary files a/data/skins7/marking/cammo2.png and /dev/null differ diff --git a/data/skins7/marking/cammostripes.png b/data/skins7/marking/cammostripes.png deleted file mode 100644 index c0519778ef..0000000000 Binary files a/data/skins7/marking/cammostripes.png and /dev/null differ diff --git a/data/skins7/marking/coonfluff.png b/data/skins7/marking/coonfluff.png deleted file mode 100644 index fa59bbb88f..0000000000 Binary files a/data/skins7/marking/coonfluff.png and /dev/null differ diff --git a/data/skins7/marking/donny.png b/data/skins7/marking/donny.png deleted file mode 100644 index 69197bcb10..0000000000 Binary files a/data/skins7/marking/donny.png and /dev/null differ diff --git a/data/skins7/marking/downdony.png b/data/skins7/marking/downdony.png deleted file mode 100644 index e489e21923..0000000000 Binary files a/data/skins7/marking/downdony.png and /dev/null differ diff --git a/data/skins7/marking/duodonny.png b/data/skins7/marking/duodonny.png deleted file mode 100644 index 7d3b0e9426..0000000000 Binary files a/data/skins7/marking/duodonny.png and /dev/null differ diff --git a/data/skins7/marking/fox.png b/data/skins7/marking/fox.png deleted file mode 100644 index a36ac49daa..0000000000 Binary files a/data/skins7/marking/fox.png and /dev/null differ diff --git a/data/skins7/marking/hipbel.png b/data/skins7/marking/hipbel.png deleted file mode 100644 index 703dd4eb6c..0000000000 Binary files a/data/skins7/marking/hipbel.png and /dev/null differ diff --git a/data/skins7/marking/lowcross.png b/data/skins7/marking/lowcross.png deleted file mode 100644 index 559dd24b7e..0000000000 Binary files a/data/skins7/marking/lowcross.png and /dev/null differ diff --git a/data/skins7/marking/lowpaint.png b/data/skins7/marking/lowpaint.png deleted file mode 100644 index eeb5bd83a7..0000000000 Binary files a/data/skins7/marking/lowpaint.png and /dev/null differ diff --git a/data/skins7/marking/marksman.png b/data/skins7/marking/marksman.png deleted file mode 100644 index ef7c108957..0000000000 Binary files a/data/skins7/marking/marksman.png and /dev/null differ diff --git a/data/skins7/marking/mice.png b/data/skins7/marking/mice.png deleted file mode 100644 index 1607b00f30..0000000000 Binary files a/data/skins7/marking/mice.png and /dev/null differ diff --git a/data/skins7/marking/mixture1.png b/data/skins7/marking/mixture1.png deleted file mode 100644 index 65a3b825b8..0000000000 Binary files a/data/skins7/marking/mixture1.png and /dev/null differ diff --git a/data/skins7/marking/mixture2.png b/data/skins7/marking/mixture2.png deleted file mode 100644 index b0741ff06a..0000000000 Binary files a/data/skins7/marking/mixture2.png and /dev/null differ diff --git a/data/skins7/marking/monkey.png b/data/skins7/marking/monkey.png deleted file mode 100644 index c4cb6fe52c..0000000000 Binary files a/data/skins7/marking/monkey.png and /dev/null differ diff --git a/data/skins7/marking/panda1.png b/data/skins7/marking/panda1.png deleted file mode 100644 index 0517a8935d..0000000000 Binary files a/data/skins7/marking/panda1.png and /dev/null differ diff --git a/data/skins7/marking/panda2.png b/data/skins7/marking/panda2.png deleted file mode 100644 index c4aaa615aa..0000000000 Binary files a/data/skins7/marking/panda2.png and /dev/null differ diff --git a/data/skins7/marking/purelove.png b/data/skins7/marking/purelove.png deleted file mode 100644 index 447553526d..0000000000 Binary files a/data/skins7/marking/purelove.png and /dev/null differ diff --git a/data/skins7/marking/saddo.png b/data/skins7/marking/saddo.png deleted file mode 100644 index 0540a0c8a7..0000000000 Binary files a/data/skins7/marking/saddo.png and /dev/null differ diff --git a/data/skins7/marking/setisu.png b/data/skins7/marking/setisu.png deleted file mode 100644 index 6b4196ac90..0000000000 Binary files a/data/skins7/marking/setisu.png and /dev/null differ diff --git a/data/skins7/marking/sidemarks.png b/data/skins7/marking/sidemarks.png deleted file mode 100644 index c0ab944639..0000000000 Binary files a/data/skins7/marking/sidemarks.png and /dev/null differ diff --git a/data/skins7/marking/singu.png b/data/skins7/marking/singu.png deleted file mode 100644 index 56e6c432a0..0000000000 Binary files a/data/skins7/marking/singu.png and /dev/null differ diff --git a/data/skins7/marking/stripe.png b/data/skins7/marking/stripe.png deleted file mode 100644 index 5fb8d26932..0000000000 Binary files a/data/skins7/marking/stripe.png and /dev/null differ diff --git a/data/skins7/marking/striped.png b/data/skins7/marking/striped.png deleted file mode 100644 index c5ccaf7c59..0000000000 Binary files a/data/skins7/marking/striped.png and /dev/null differ diff --git a/data/skins7/marking/stripes.png b/data/skins7/marking/stripes.png deleted file mode 100644 index 77bd4dd0e0..0000000000 Binary files a/data/skins7/marking/stripes.png and /dev/null differ diff --git a/data/skins7/marking/stripes2.png b/data/skins7/marking/stripes2.png deleted file mode 100644 index adf0120d16..0000000000 Binary files a/data/skins7/marking/stripes2.png and /dev/null differ diff --git a/data/skins7/marking/thunder.png b/data/skins7/marking/thunder.png deleted file mode 100644 index d15b03916c..0000000000 Binary files a/data/skins7/marking/thunder.png and /dev/null differ diff --git a/data/skins7/marking/tiger1.png b/data/skins7/marking/tiger1.png deleted file mode 100644 index 83303a0e03..0000000000 Binary files a/data/skins7/marking/tiger1.png and /dev/null differ diff --git a/data/skins7/marking/tiger2.png b/data/skins7/marking/tiger2.png deleted file mode 100644 index aed2bffe19..0000000000 Binary files a/data/skins7/marking/tiger2.png and /dev/null differ diff --git a/data/skins7/marking/toptri.png b/data/skins7/marking/toptri.png deleted file mode 100644 index 25549ae3d8..0000000000 Binary files a/data/skins7/marking/toptri.png and /dev/null differ diff --git a/data/skins7/marking/triangular.png b/data/skins7/marking/triangular.png deleted file mode 100644 index 3eef5a07b4..0000000000 Binary files a/data/skins7/marking/triangular.png and /dev/null differ diff --git a/data/skins7/marking/tricircular.png b/data/skins7/marking/tricircular.png deleted file mode 100644 index 18df603791..0000000000 Binary files a/data/skins7/marking/tricircular.png and /dev/null differ diff --git a/data/skins7/marking/tripledon.png b/data/skins7/marking/tripledon.png deleted file mode 100644 index 5b899d5d1c..0000000000 Binary files a/data/skins7/marking/tripledon.png and /dev/null differ diff --git a/data/skins7/marking/tritri.png b/data/skins7/marking/tritri.png deleted file mode 100644 index 28d90a60ac..0000000000 Binary files a/data/skins7/marking/tritri.png and /dev/null differ diff --git a/data/skins7/marking/twinbelly.png b/data/skins7/marking/twinbelly.png deleted file mode 100644 index 7d5d519274..0000000000 Binary files a/data/skins7/marking/twinbelly.png and /dev/null differ diff --git a/data/skins7/marking/twincross.png b/data/skins7/marking/twincross.png deleted file mode 100644 index 9a47093c9f..0000000000 Binary files a/data/skins7/marking/twincross.png and /dev/null differ diff --git a/data/skins7/marking/twintri.png b/data/skins7/marking/twintri.png deleted file mode 100644 index 61da03ce2b..0000000000 Binary files a/data/skins7/marking/twintri.png and /dev/null differ diff --git a/data/skins7/marking/uppy.png b/data/skins7/marking/uppy.png deleted file mode 100644 index 9a31ddd507..0000000000 Binary files a/data/skins7/marking/uppy.png and /dev/null differ diff --git a/data/skins7/marking/warpaint.png b/data/skins7/marking/warpaint.png deleted file mode 100644 index e403b5adfd..0000000000 Binary files a/data/skins7/marking/warpaint.png and /dev/null differ diff --git a/data/skins7/marking/warstripes.png b/data/skins7/marking/warstripes.png deleted file mode 100644 index bed937b080..0000000000 Binary files a/data/skins7/marking/warstripes.png and /dev/null differ diff --git a/data/skins7/marking/whisker.png b/data/skins7/marking/whisker.png deleted file mode 100644 index a96b1c9208..0000000000 Binary files a/data/skins7/marking/whisker.png and /dev/null differ diff --git a/data/skins7/marking/wildpaint.png b/data/skins7/marking/wildpaint.png deleted file mode 100644 index ccad83538a..0000000000 Binary files a/data/skins7/marking/wildpaint.png and /dev/null differ diff --git a/data/skins7/marking/wildpatch.png b/data/skins7/marking/wildpatch.png deleted file mode 100644 index 9b1a03d49f..0000000000 Binary files a/data/skins7/marking/wildpatch.png and /dev/null differ diff --git a/data/skins7/marking/yinyang.png b/data/skins7/marking/yinyang.png deleted file mode 100644 index caf6a6e878..0000000000 Binary files a/data/skins7/marking/yinyang.png and /dev/null differ diff --git a/data/skins7/monkey.json b/data/skins7/monkey.json deleted file mode 100644 index 224fbdd108..0000000000 --- a/data/skins7/monkey.json +++ /dev/null @@ -1,42 +0,0 @@ -{"skin": { - "body": { - "filename": "monkey", - "custom_colors": "true", - "hue": 21, - "sat": 175, - "lgt": 196 - }, - "marking": { - "filename": "monkey", - "custom_colors": "true", - "hue": 22, - "sat": 132, - "lgt": 50, - "alp": 255 - }, - "decoration": { - "filename": "hair", - "custom_colors": "true", - "hue": 35, - "sat": 230, - "lgt": 155 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 25, - "sat": 82, - "lgt": 144 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 19, - "sat": 113, - "lgt": 175 - }, - "eyes": { - "filename": "standard", - "custom_colors": "false" - }} -} diff --git a/data/skins7/paintgre.json b/data/skins7/paintgre.json deleted file mode 100644 index d534c2eb70..0000000000 --- a/data/skins7/paintgre.json +++ /dev/null @@ -1,35 +0,0 @@ -{"skin": { - "body": { - "filename": "standard", - "custom_colors": "true", - "hue": 36, - "sat": 154, - "lgt": 106 - }, - "marking": { - "filename": "lowpaint", - "custom_colors": "true", - "hue": 52, - "sat": 255, - "lgt": 255, - "alp": 255 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 39, - "sat": 171, - "lgt": 139 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 32, - "sat": 132, - "lgt": 59 - }, - "eyes": { - "filename": "standard", - "custom_colors": "false" - }} -} diff --git a/data/skins7/pandabear.json b/data/skins7/pandabear.json deleted file mode 100644 index 11caa10292..0000000000 --- a/data/skins7/pandabear.json +++ /dev/null @@ -1,42 +0,0 @@ -{"skin": { - "body": { - "filename": "bear", - "custom_colors": "true", - "hue": 150, - "sat": 16, - "lgt": 78 - }, - "marking": { - "filename": "panda1", - "custom_colors": "true", - "hue": 158, - "sat": 42, - "lgt": 233, - "alp": 255 - }, - "decoration": { - "filename": "hair", - "custom_colors": "false" - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 27, - "sat": 0, - "lgt": 158 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 28, - "sat": 0, - "lgt": 62 - }, - "eyes": { - "filename": "standard", - "custom_colors": "true", - "hue": 0, - "sat": 160, - "lgt": 255 - }} -} diff --git a/data/skins7/panther.json b/data/skins7/panther.json deleted file mode 100644 index 844a28608a..0000000000 --- a/data/skins7/panther.json +++ /dev/null @@ -1,38 +0,0 @@ -{"skin": { - "body": { - "filename": "kitty", - "custom_colors": "true", - "hue": 165, - "sat": 0, - "lgt": 0 - }, - "marking": { - "filename": "wildpaint", - "custom_colors": "true", - "hue": 0, - "sat": 255, - "lgt": 255, - "alp": 43 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 27, - "sat": 0, - "lgt": 16 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 28, - "sat": 0, - "lgt": 54 - }, - "eyes": { - "filename": "negative", - "custom_colors": "true", - "hue": 32, - "sat": 255, - "lgt": 59 - }} -} diff --git a/data/skins7/pento.json b/data/skins7/pento.json deleted file mode 100644 index 20b7921e84..0000000000 --- a/data/skins7/pento.json +++ /dev/null @@ -1,42 +0,0 @@ -{"skin": { - "body": { - "filename": "standard", - "custom_colors": "true", - "hue": 158, - "sat": 178, - "lgt": 123 - }, - "marking": { - "filename": "triplate", - "custom_colors": "true", - "hue": 0, - "sat": 255, - "lgt": 255, - "alp": 209 - }, - "decoration": { - "filename": "unipento", - "custom_colors": "true", - "hue": 158, - "sat": 178, - "lgt": 123 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 0, - "sat": 0, - "lgt": 184 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 152, - "sat": 137, - "lgt": 157 - }, - "eyes": { - "filename": "standard", - "custom_colors": "false" - }} -} diff --git a/data/skins7/piggy.json b/data/skins7/piggy.json deleted file mode 100644 index c1deb4cf64..0000000000 --- a/data/skins7/piggy.json +++ /dev/null @@ -1,38 +0,0 @@ -{"skin": { - "body": { - "filename": "piglet", - "custom_colors": "true", - "hue": 251, - "sat": 220, - "lgt": 180 - }, - "marking": { - "filename": "hipbel", - "custom_colors": "true", - "hue": 3, - "sat": 101, - "lgt": 112, - "alp": 171 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 249, - "sat": 189, - "lgt": 147 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 252, - "sat": 180, - "lgt": 143 - }, - "eyes": { - "filename": "colorable", - "custom_colors": "true", - "hue": 0, - "sat": 255, - "lgt": 128 - }} -} diff --git a/data/skins7/pinky.json b/data/skins7/pinky.json deleted file mode 100644 index c6a68e8050..0000000000 --- a/data/skins7/pinky.json +++ /dev/null @@ -1,35 +0,0 @@ -{"skin": { - "body": { - "filename": "standard", - "custom_colors": "true", - "hue": 242, - "sat": 201, - "lgt": 187 - }, - "marking": { - "filename": "whisker", - "custom_colors": "true", - "hue": 243, - "sat": 198, - "lgt": 214, - "alp": 255 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 229, - "sat": 137, - "lgt": 218 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 229, - "sat": 137, - "lgt": 218 - }, - "eyes": { - "filename": "standard", - "custom_colors": "false" - }} -} diff --git a/data/skins7/raccoon.json b/data/skins7/raccoon.json deleted file mode 100644 index 44a82f4da6..0000000000 --- a/data/skins7/raccoon.json +++ /dev/null @@ -1,38 +0,0 @@ -{"skin": { - "body": { - "filename": "raccoon", - "custom_colors": "true", - "hue": 16, - "sat": 133, - "lgt": 121 - }, - "marking": { - "filename": "coonfluff", - "custom_colors": "true", - "hue": 17, - "sat": 110, - "lgt": 54, - "alp": 255 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 16, - "sat": 133, - "lgt": 121 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 17, - "sat": 129, - "lgt": 38 - }, - "eyes": { - "filename": "standard", - "custom_colors": "true", - "hue": 23, - "sat": 196, - "lgt": 45 - }} -} diff --git a/data/skins7/redbopp.json b/data/skins7/redbopp.json deleted file mode 100644 index db74aca513..0000000000 --- a/data/skins7/redbopp.json +++ /dev/null @@ -1,42 +0,0 @@ -{"skin": { - "body": { - "filename": "standard", - "custom_colors": "true", - "hue": 246, - "sat": 216, - "lgt": 108 - }, - "marking": { - "filename": "donny", - "custom_colors": "true", - "hue": 2, - "sat": 217, - "lgt": 202, - "alp": 255 - }, - "decoration": { - "filename": "unibop", - "custom_colors": "true", - "hue": 246, - "sat": 216, - "lgt": 108 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 246, - "sat": 216, - "lgt": 108 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 116, - "sat": 85, - "lgt": 233 - }, - "eyes": { - "filename": "standard", - "custom_colors": "false" - }} -} diff --git a/data/skins7/redstripe.json b/data/skins7/redstripe.json deleted file mode 100644 index 1950ddaf6a..0000000000 --- a/data/skins7/redstripe.json +++ /dev/null @@ -1,31 +0,0 @@ -{"skin": { - "body": { - "filename": "standard", - "custom_colors": "true", - "hue": 248, - "sat": 214, - "lgt": 123 - }, - "marking": { - "filename": "stripe", - "custom_colors": "false" - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 0, - "sat": 0, - "lgt": 184 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 149, - "sat": 4, - "lgt": 71 - }, - "eyes": { - "filename": "standard", - "custom_colors": "false" - }} -} diff --git a/data/skins7/saddo.json b/data/skins7/saddo.json deleted file mode 100644 index e3acbdde71..0000000000 --- a/data/skins7/saddo.json +++ /dev/null @@ -1,35 +0,0 @@ -{"skin": { - "body": { - "filename": "standard", - "custom_colors": "true", - "hue": 109, - "sat": 109, - "lgt": 127 - }, - "marking": { - "filename": "saddo", - "custom_colors": "true", - "hue": 108, - "sat": 54, - "lgt": 68, - "alp": 255 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 55, - "sat": 141, - "lgt": 170 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 88, - "sat": 97, - "lgt": 119 - }, - "eyes": { - "filename": "standard", - "custom_colors": "false" - }} -} diff --git a/data/skins7/setisu.json b/data/skins7/setisu.json deleted file mode 100644 index b841f4aecc..0000000000 --- a/data/skins7/setisu.json +++ /dev/null @@ -1,42 +0,0 @@ -{"skin": { - "body": { - "filename": "standard", - "custom_colors": "true", - "hue": 12, - "sat": 255, - "lgt": 52 - }, - "marking": { - "filename": "setisu", - "custom_colors": "true", - "hue": 34, - "sat": 255, - "lgt": 198, - "alp": 178 - }, - "decoration": { - "filename": "hair", - "custom_colors": "true", - "hue": 25, - "sat": 70, - "lgt": 41 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 30, - "sat": 147, - "lgt": 63 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 25, - "sat": 154, - "lgt": 76 - }, - "eyes": { - "filename": "standard", - "custom_colors": "false" - }} -} diff --git a/data/skins7/snowti.json b/data/skins7/snowti.json deleted file mode 100644 index ca8636042d..0000000000 --- a/data/skins7/snowti.json +++ /dev/null @@ -1,38 +0,0 @@ -{"skin": { - "body": { - "filename": "kitty", - "custom_colors": "true", - "hue": 23, - "sat": 0, - "lgt": 255 - }, - "marking": { - "filename": "tiger2", - "custom_colors": "true", - "hue": 28, - "sat": 107, - "lgt": 0, - "alp": 204 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 22, - "sat": 0, - "lgt": 173 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 22, - "sat": 0, - "lgt": 192 - }, - "eyes": { - "filename": "colorable", - "custom_colors": "true", - "hue": 28, - "sat": 147, - "lgt": 42 - }} -} diff --git a/data/skins7/spiky.json b/data/skins7/spiky.json deleted file mode 100644 index 8b7b9c3f0e..0000000000 --- a/data/skins7/spiky.json +++ /dev/null @@ -1,38 +0,0 @@ -{"skin": { - "body": { - "filename": "spiky", - "custom_colors": "true", - "hue": 28, - "sat": 0, - "lgt": 255 - }, - "marking": { - "filename": "warstripes", - "custom_colors": "true", - "hue": 0, - "sat": 0, - "lgt": 0, - "alp": 255 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 27, - "sat": 0, - "lgt": 255 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 28, - "sat": 135, - "lgt": 255 - }, - "eyes": { - "filename": "colorable", - "custom_colors": "true", - "hue": 0, - "sat": 0, - "lgt": 28 - }} -} diff --git a/data/skins7/swardy.json b/data/skins7/swardy.json deleted file mode 100644 index 4c1e31902c..0000000000 --- a/data/skins7/swardy.json +++ /dev/null @@ -1,38 +0,0 @@ -{"skin": { - "body": { - "filename": "spiky", - "custom_colors": "true", - "hue": 75, - "sat": 171, - "lgt": 32 - }, - "marking": { - "filename": "duodonny", - "custom_colors": "true", - "hue": 85, - "sat": 52, - "lgt": 189, - "alp": 96 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 85, - "sat": 112, - "lgt": 0 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 85, - "sat": 87, - "lgt": 156 - }, - "eyes": { - "filename": "standard", - "custom_colors": "true", - "hue": 28, - "sat": 178, - "lgt": 94 - }} -} diff --git a/data/skins7/tiger.json b/data/skins7/tiger.json deleted file mode 100644 index c759e5a9f8..0000000000 --- a/data/skins7/tiger.json +++ /dev/null @@ -1,38 +0,0 @@ -{"skin": { - "body": { - "filename": "kitty", - "custom_colors": "true", - "hue": 22, - "sat": 210, - "lgt": 107 - }, - "marking": { - "filename": "tiger1", - "custom_colors": "true", - "hue": 19, - "sat": 255, - "lgt": 219, - "alp": 220 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 22, - "sat": 180, - "lgt": 99 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 22, - "sat": 210, - "lgt": 114 - }, - "eyes": { - "filename": "colorable", - "custom_colors": "true", - "hue": 28, - "sat": 255, - "lgt": 0 - }} -} diff --git a/data/skins7/tooxy.json b/data/skins7/tooxy.json deleted file mode 100644 index 1a8a0b54eb..0000000000 --- a/data/skins7/tooxy.json +++ /dev/null @@ -1,42 +0,0 @@ -{"skin": { - "body": { - "filename": "standard", - "custom_colors": "true", - "hue": 72, - "sat": 214, - "lgt": 123 - }, - "marking": { - "filename": "wildpaint", - "custom_colors": "true", - "hue": 65, - "sat": 0, - "lgt": 128, - "alp": 218 - }, - "decoration": { - "filename": "unimelo", - "custom_colors": "true", - "hue": 244, - "sat": 0, - "lgt": 140 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 0, - "sat": 0, - "lgt": 184 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 149, - "sat": 4, - "lgt": 71 - }, - "eyes": { - "filename": "standard", - "custom_colors": "false" - }} -} diff --git a/data/skins7/toptri.json b/data/skins7/toptri.json deleted file mode 100644 index e74314f554..0000000000 --- a/data/skins7/toptri.json +++ /dev/null @@ -1,31 +0,0 @@ -{"skin": { - "body": { - "filename": "standard", - "custom_colors": "true", - "hue": 93, - "sat": 95, - "lgt": 163 - }, - "marking": { - "filename": "toptri", - "custom_colors": "false" - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 55, - "sat": 141, - "lgt": 170 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 88, - "sat": 97, - "lgt": 119 - }, - "eyes": { - "filename": "standard", - "custom_colors": "false" - }} -} diff --git a/data/skins7/twinbop.json b/data/skins7/twinbop.json deleted file mode 100644 index 98d4619210..0000000000 --- a/data/skins7/twinbop.json +++ /dev/null @@ -1,42 +0,0 @@ -{"skin": { - "body": { - "filename": "standard", - "custom_colors": "true", - "hue": 233, - "sat": 158, - "lgt": 183 - }, - "marking": { - "filename": "duodonny", - "custom_colors": "true", - "hue": 231, - "sat": 146, - "lgt": 218, - "alp": 255 - }, - "decoration": { - "filename": "twinbopp", - "custom_colors": "true", - "hue": 233, - "sat": 158, - "lgt": 183 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 233, - "sat": 158, - "lgt": 183 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 0, - "sat": 146, - "lgt": 224 - }, - "eyes": { - "filename": "standard", - "custom_colors": "false" - }} -} diff --git a/data/skins7/twintri.json b/data/skins7/twintri.json deleted file mode 100644 index 440b9d3184..0000000000 --- a/data/skins7/twintri.json +++ /dev/null @@ -1,35 +0,0 @@ -{"skin": { - "body": { - "filename": "standard", - "custom_colors": "true", - "hue": 52, - "sat": 156, - "lgt": 124 - }, - "marking": { - "filename": "twintri", - "custom_colors": "true", - "hue": 40, - "sat": 222, - "lgt": 227, - "alp": 255 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 0, - "sat": 0, - "lgt": 185 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 147, - "sat": 4, - "lgt": 72 - }, - "eyes": { - "filename": "standard", - "custom_colors": "false" - }} -} diff --git a/data/skins7/warmouse.json b/data/skins7/warmouse.json deleted file mode 100644 index ecc15c354e..0000000000 --- a/data/skins7/warmouse.json +++ /dev/null @@ -1,38 +0,0 @@ -{"skin": { - "body": { - "filename": "mouse", - "custom_colors": "true", - "hue": 28, - "sat": 0, - "lgt": 213 - }, - "marking": { - "filename": "mice", - "custom_colors": "true", - "hue": 0, - "sat": 0, - "lgt": 255, - "alp": 255 - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 27, - "sat": 0, - "lgt": 255 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 28, - "sat": 135, - "lgt": 255 - }, - "eyes": { - "filename": "negative", - "custom_colors": "true", - "hue": 0, - "sat": 200, - "lgt": 28 - }} -} diff --git a/data/skins7/warpaint.json b/data/skins7/warpaint.json deleted file mode 100644 index b4543ef148..0000000000 --- a/data/skins7/warpaint.json +++ /dev/null @@ -1,31 +0,0 @@ -{"skin": { - "body": { - "filename": "standard", - "custom_colors": "true", - "hue": 29, - "sat": 173, - "lgt": 87 - }, - "marking": { - "filename": "warpaint", - "custom_colors": "false" - }, - "hands": { - "filename": "standard", - "custom_colors": "true", - "hue": 11, - "sat": 115, - "lgt": 1 - }, - "feet": { - "filename": "standard", - "custom_colors": "true", - "hue": 29, - "sat": 173, - "lgt": 87 - }, - "eyes": { - "filename": "standard", - "custom_colors": "false" - }} -} diff --git a/data/skins7/x_ninja.json b/data/skins7/x_ninja.json deleted file mode 100644 index 595a729f5b..0000000000 --- a/data/skins7/x_ninja.json +++ /dev/null @@ -1,29 +0,0 @@ -{"skin": { - "body": { - "filename": "x_ninja", - "custom_colors": "true", - "hue": 0, - "sat": 0, - "lgt": 0 - }, - "marking": { - "filename": "uppy", - "custom_colors": "true", - "hue": 0, - "sat": 0, - "lgt": 64, - "alp": 255 - }, - "hands": { - "filename": "standard", - "custom_colors": "false" - }, - "feet": { - "filename": "standard", - "custom_colors": "false" - }, - "eyes": { - "filename": "x_ninja", - "custom_colors": "false" - }} -} diff --git a/data/skins7/xmas_hat.png b/data/skins7/xmas_hat.png deleted file mode 100644 index 28c0b022f3..0000000000 Binary files a/data/skins7/xmas_hat.png and /dev/null differ diff --git a/data/strong_weak.png b/data/strong_weak.png deleted file mode 100644 index 26cc529247..0000000000 Binary files a/data/strong_weak.png and /dev/null differ diff --git a/data/themes/auto.png b/data/themes/auto.png deleted file mode 100644 index 63e7401f2c..0000000000 Binary files a/data/themes/auto.png and /dev/null differ diff --git a/data/themes/autumn.png b/data/themes/autumn.png deleted file mode 100644 index 865957e6e4..0000000000 Binary files a/data/themes/autumn.png and /dev/null differ diff --git a/data/themes/autumn_day.map b/data/themes/autumn_day.map deleted file mode 100644 index 99affc9501..0000000000 Binary files a/data/themes/autumn_day.map and /dev/null differ diff --git a/data/themes/autumn_night.map b/data/themes/autumn_night.map deleted file mode 100644 index bfcc73d885..0000000000 Binary files a/data/themes/autumn_night.map and /dev/null differ diff --git a/data/themes/heavens.png b/data/themes/heavens.png deleted file mode 100644 index 6302bbc4d6..0000000000 Binary files a/data/themes/heavens.png and /dev/null differ diff --git a/data/themes/heavens_day.map b/data/themes/heavens_day.map deleted file mode 100644 index 29a6718ad0..0000000000 Binary files a/data/themes/heavens_day.map and /dev/null differ diff --git a/data/themes/heavens_night.map b/data/themes/heavens_night.map deleted file mode 100644 index 3f2fa2895a..0000000000 Binary files a/data/themes/heavens_night.map and /dev/null differ diff --git a/data/themes/jungle.png b/data/themes/jungle.png deleted file mode 100644 index 8f9a96d15c..0000000000 Binary files a/data/themes/jungle.png and /dev/null differ diff --git a/data/themes/jungle_day.map b/data/themes/jungle_day.map deleted file mode 100644 index 37612fa464..0000000000 Binary files a/data/themes/jungle_day.map and /dev/null differ diff --git a/data/themes/jungle_night.map b/data/themes/jungle_night.map deleted file mode 100644 index d8b09f21c3..0000000000 Binary files a/data/themes/jungle_night.map and /dev/null differ diff --git a/data/themes/newyear.map b/data/themes/newyear.map deleted file mode 100644 index d959445a3f..0000000000 Binary files a/data/themes/newyear.map and /dev/null differ diff --git a/data/themes/newyear.png b/data/themes/newyear.png deleted file mode 100644 index 4797ba0415..0000000000 Binary files a/data/themes/newyear.png and /dev/null differ diff --git a/data/themes/none.png b/data/themes/none.png deleted file mode 100644 index 9eea79db6c..0000000000 Binary files a/data/themes/none.png and /dev/null differ diff --git a/data/themes/rand.png b/data/themes/rand.png deleted file mode 100644 index 8fc054bf49..0000000000 Binary files a/data/themes/rand.png and /dev/null differ diff --git a/data/themes/winter.png b/data/themes/winter.png deleted file mode 100644 index 6197922425..0000000000 Binary files a/data/themes/winter.png and /dev/null differ diff --git a/data/themes/winter_day.map b/data/themes/winter_day.map deleted file mode 100644 index a2c13e04d5..0000000000 Binary files a/data/themes/winter_day.map and /dev/null differ diff --git a/data/themes/winter_night.map b/data/themes/winter_night.map deleted file mode 100644 index 89061c0ba4..0000000000 Binary files a/data/themes/winter_night.map and /dev/null differ diff --git a/data/touch_controls.json b/data/touch_controls.json deleted file mode 100644 index 5d4aa431b6..0000000000 --- a/data/touch_controls.json +++ /dev/null @@ -1,311 +0,0 @@ -{ - "direct-touch-ingame": "action", - "direct-touch-spectate": "aim", - "touch-buttons": [ - { - "x": 0, - "y": 833333, - "w": 200000, - "h": 166667, - "shape": "rect", - "visibilities": [ - "ingame" - ], - "behavior": { - "type": "bind", - "label": "Move left", - "label-type": "localized", - "command": "+left" - } - }, - { - "x": 200000, - "y": 833333, - "w": 200000, - "h": 166667, - "shape": "rect", - "visibilities": [ - "ingame" - ], - "behavior": { - "type": "bind", - "label": "Move right", - "label-type": "localized", - "command": "+right" - } - }, - { - "x": 100000, - "y": 666667, - "w": 200000, - "h": 166667, - "shape": "rect", - "visibilities": [ - "ingame" - ], - "behavior": { - "type": "bind", - "label": "Jump", - "label-type": "localized", - "command": "+jump" - } - }, - { - "x": 116667, - "y": 16667, - "w": 83333, - "h": 83333, - "shape": "rect", - "visibilities": [ - "ingame" - ], - "behavior": { - "type": "bind", - "label": "Prev. weapon", - "label-type": "localized", - "command": "+prevweapon" - } - }, - { - "x": 200000, - "y": 16667, - "w": 83333, - "h": 83333, - "shape": "rect", - "visibilities": [ - "ingame" - ], - "behavior": { - "type": "bind", - "label": "Next weapon", - "label-type": "localized", - "command": "+nextweapon" - } - }, - { - "x": 16667, - "y": 16667, - "w": 83333, - "h": 83333, - "shape": "rect", - "visibilities": [ - ], - "behavior": { - "type": "predefined", - "id": "extra-menu", - "number": 1 - } - }, - { - "x": 300000, - "y": 16667, - "w": 83333, - "h": 83333, - "shape": "rect", - "visibilities": [ - "extra-menu", - "zoom-allowed" - ], - "behavior": { - "type": "bind", - "label": "Zoom out", - "label-type": "localized", - "command": "zoom-" - } - }, - { - "x": 383333, - "y": 16667, - "w": 83333, - "h": 83333, - "shape": "rect", - "visibilities": [ - "extra-menu", - "zoom-allowed" - ], - "behavior": { - "type": "bind", - "label": "Default zoom", - "label-type": "localized", - "command": "zoom" - } - }, - { - "x": 466666, - "y": 16667, - "w": 83333, - "h": 83333, - "shape": "rect", - "visibilities": [ - "extra-menu", - "zoom-allowed" - ], - "behavior": { - "type": "bind", - "label": "Zoom in", - "label-type": "localized", - "command": "zoom+" - } - }, - { - "x": 16667, - "y": 133333, - "w": 83333, - "h": 66667, - "shape": "rect", - "visibilities": [ - "extra-menu" - ], - "behavior": { - "type": "bind", - "label": "Scoreboard", - "label-type": "localized", - "command": "+scoreboard" - } - }, - { - "x": 116667, - "y": 133333, - "w": 83333, - "h": 66667, - "shape": "rect", - "visibilities": [ - "ingame", - "extra-menu" - ], - "behavior": { - "type": "predefined", - "id": "emoticon" - } - }, - { - "x": 116667, - "y": 133333, - "w": 83333, - "h": 66667, - "shape": "rect", - "visibilities": [ - "-ingame", - "extra-menu" - ], - "behavior": { - "type": "predefined", - "id": "spectate" - } - }, - { - "x": 216667, - "y": 133333, - "w": 83333, - "h": 66667, - "shape": "rect", - "visibilities": [ - "extra-menu", - "-demo-player" - ], - "behavior": { - "type": "bind", - "label": "Chat", - "label-type": "localized", - "command": "chat all" - } - }, - { - "x": 316667, - "y": 133333, - "w": 83333, - "h": 66667, - "shape": "rect", - "visibilities": [ - "extra-menu", - "-demo-player" - ], - "behavior": { - "type": "bind", - "label": "Team chat", - "label-type": "localized", - "command": "chat team" - } - }, - { - "x": 16667, - "y": 333333, - "w": 83333, - "h": 66667, - "shape": "rect", - "visibilities": [ - "extra-menu", - "vote-active", - "-demo-player" - ], - "behavior": { - "type": "bind", - "label": "Vote yes", - "label-type": "localized", - "command": "vote yes" - } - }, - { - "x": 116667, - "y": 333333, - "w": 83333, - "h": 66667, - "shape": "rect", - "visibilities": [ - "extra-menu", - "vote-active", - "-demo-player" - ], - "behavior": { - "type": "bind", - "label": "Vote no", - "label-type": "localized", - "command": "vote no" - } - }, - { - "x": 766667, - "y": 16667, - "w": 100000, - "h": 100000, - "shape": "rect", - "visibilities": [ - "dummy-connected" - ], - "behavior": { - "type": "bind", - "label": "Toggle dummy", - "label-type": "localized", - "command": "toggle cl_dummy 0 1" - } - }, - { - "x": 883333, - "y": 16667, - "w": 100000, - "h": 100000, - "shape": "rect", - "visibilities": [ - "ingame" - ], - "behavior": { - "type": "predefined", - "id": "swap-action" - } - }, - { - "x": 755000, - "y": 580000, - "w": 225000, - "h": 400000, - "shape": "circle", - "visibilities": [ - "ingame" - ], - "behavior": { - "type": "predefined", - "id": "joystick-action" - } - } - ] -} diff --git a/datasrc/compile.py b/datasrc/compile.py index fa8522aa39..4f1a0f69e1 100644 --- a/datasrc/compile.py +++ b/datasrc/compile.py @@ -368,7 +368,7 @@ def gen_network_source(): def gen_common_content_types_header(): # print some includes - print('#include ') + # print('#include ') # emit the type declarations with open("datasrc/content.py", "rb") as content_file: diff --git a/datasrc/datatypes.py b/datasrc/datatypes.py index 8d3ce023be..32a0a66164 100644 --- a/datasrc/datatypes.py +++ b/datasrc/datatypes.py @@ -172,9 +172,9 @@ def EmitDefinition(self, _name): class TextureHandle(BaseType): def __init__(self): - BaseType.__init__(self, "IGraphics::CTextureHandle") + BaseType.__init__(self, "int") def EmitDefinition(self, _name): - return ["IGraphics::CTextureHandle()"] + return ["0"] # helper functions diff --git a/datasrc/seven/compile.py b/datasrc/seven/compile.py index 75616ca609..4d77997812 100644 --- a/datasrc/seven/compile.py +++ b/datasrc/seven/compile.py @@ -59,7 +59,7 @@ def main(): if gen_client_content_header or gen_server_content_header: # print some includes - print('#include ') + # print('#include ') print('#include "data_types.h"') print("namespace client_data7 {") diff --git a/datasrc/seven/datatypes.py b/datasrc/seven/datatypes.py index bb3b75c33b..b3e53c2187 100644 --- a/datasrc/seven/datatypes.py +++ b/datasrc/seven/datatypes.py @@ -172,9 +172,9 @@ def EmitDefinition(self, _name): class TextureHandle(BaseType): def __init__(self): - BaseType.__init__(self, "IGraphics::CTextureHandle") + BaseType.__init__(self, "int") def EmitDefinition(self, _name): - return ["IGraphics::CTextureHandle()"] + return ["0"] class SampleHandle(BaseType): def __init__(self): diff --git a/ddnet-libs b/ddnet-libs index 7f9799bc0a..d887952db3 160000 --- a/ddnet-libs +++ b/ddnet-libs @@ -1 +1 @@ -Subproject commit 7f9799bc0a4d4c21a91e9659799f5ac6076d4367 +Subproject commit d887952db3fb589349f532049497720923f1c154 diff --git a/deny.toml b/deny.toml deleted file mode 100644 index bb2881b17b..0000000000 --- a/deny.toml +++ /dev/null @@ -1,6 +0,0 @@ -[licenses] -allow = [ - "Apache-2.0", - "MIT", - "Zlib" -] diff --git a/license.txt b/license.txt index d8f1626e10..a6085fb78a 100644 --- a/license.txt +++ b/license.txt @@ -20,48 +20,9 @@ freely, subject to the following restrictions: ------------------------------------------------------------------------ -All content under 'data' except the assets, font, language & skin files, -(which have their own licenses) are released under +All content under 'data' are released under CC-BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0/). -DejaVuSans.ttf: ---------------- - -Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. -Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) - -Font_Awesome_6_Free-Solid-900.otf: ----------------------------------- - -Copyright (c) 2023 Fonticons, Inc. (https://fontawesome.com) -with Reserved Font Name: "Font Awesome". - -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 - -GlowSansJ-Compressed-Book.otf: ------------------------------- - -© 2020 Project Wêlai - -Developer: Celestial Phineas - -Glow Sans fonts are released under SIL Open Font License 1.1. - -SourceHanSans.ttc: ------------------- - -Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font -Name 'Source'. Source is a trademark of Adobe in the United States -and/or other countries. - -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 - ------------------------------------------------------------------------ IMPORTANT NOTE! The source under src/engine/external are stripped @@ -72,189 +33,3 @@ check the individual libraries. With that being said, contact us if there is anything you want to do that the license does not permit. - ------------------------------------------------------------------------- - - -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. - - -Bitstream Vera Fonts Copyright ------------------------------- - -Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is -a trademark of Bitstream, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of the fonts accompanying this license ("Fonts") and associated -documentation files (the "Font Software"), to reproduce and distribute the -Font Software, including without limitation the rights to use, copy, merge, -publish, distribute, and/or sell copies of the Font Software, and to permit -persons to whom the Font Software is furnished to do so, subject to the -following conditions: - -The above copyright and trademark notices and this permission notice shall -be included in all copies of one or more of the Font Software typefaces. - -The Font Software may be modified, altered, or added to, and in particular -the designs of glyphs or characters in the Fonts may be modified and -additional glyphs or characters may be added to the Fonts, only if the fonts -are renamed to names not containing either the words "Bitstream" or the word -"Vera". - -This License becomes null and void to the extent applicable to Fonts or Font -Software that has been modified and is distributed under the "Bitstream -Vera" names. - -The Font Software may be sold as part of a larger software package but no -copy of one or more of the Font Software typefaces may be sold by itself. - -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 BITSTREAM OR THE GNOME -FOUNDATION 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. - -Except as contained in this notice, the names of Gnome, the Gnome -Foundation, and Bitstream Inc., shall not be used in advertising or -otherwise to promote the sale, use or other dealings in this Font Software -without prior written authorization from the Gnome Foundation or Bitstream -Inc., respectively. For further information, contact: fonts at gnome dot -org. - -Arev Fonts Copyright ------------------------------- - -Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of the fonts accompanying this license ("Fonts") and -associated documentation files (the "Font Software"), to reproduce -and distribute the modifications to the Bitstream Vera Font Software, -including without limitation the rights to use, copy, merge, publish, -distribute, and/or sell copies of the Font Software, and to permit -persons to whom the Font Software is furnished to do so, subject to -the following conditions: - -The above copyright and trademark notices and this permission notice -shall be included in all copies of one or more of the Font Software -typefaces. - -The Font Software may be modified, altered, or added to, and in -particular the designs of glyphs or characters in the Fonts may be -modified and additional glyphs or characters may be added to the -Fonts, only if the fonts are renamed to names not containing either -the words "Tavmjong Bah" or the word "Arev". - -This License becomes null and void to the extent applicable to Fonts -or Font Software that has been modified and is distributed under the -"Tavmjong Bah Arev" names. - -The Font Software may be sold as part of a larger software package but -no copy of one or more of the Font Software typefaces may be sold by -itself. - -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 -TAVMJONG BAH 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. - -Except as contained in this notice, the name of Tavmjong Bah shall not -be used in advertising or otherwise to promote the sale, use or other -dealings in this Font Software without prior written authorization -from Tavmjong Bah. For further information, contact: tavmjong @ free -. fr. diff --git a/man/DDNet.6 b/man/DDNet.6 deleted file mode 100644 index 24c4d2cfd7..0000000000 --- a/man/DDNet.6 +++ /dev/null @@ -1,135 +0,0 @@ -'\" t -.\" Title: DDNet -.\" Author: DDNet Contributors -.\" Generator: DocBook XSL Stylesheets v1.79.1 -.\" Date: v1.0.0 -.\" Manual: DDNet Manual -.\" Source: DDNet 11.7.2 -.\" Language: English -.\" -.TH "DDNET" "6" "v1\&.0\&.0" "DDNet 11\&.7\&.2" "DDNet Manual" -.\" ----------------------------------------------------------------- -.\" * Define some portability stuff -.\" ----------------------------------------------------------------- -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.\" http://bugs.debian.org/507673 -.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.ie \n(.g .ds Aq \(aq -.el .ds Aq ' -.\" ----------------------------------------------------------------- -.\" * set default formatting -.\" ----------------------------------------------------------------- -.\" disable hyphenation -.nh -.\" disable justification (adjust text to left margin only) -.ad l -.\" ----------------------------------------------------------------- -.\" * MAIN CONTENT STARTS HERE * -.\" ----------------------------------------------------------------- -.SH "NAME" -DDNet \- Starts the DDNet client\&. -.SH "SYNOPSIS" -.sp -\fBDDNet\fR [\fIOPTION\fR]\&... [\-f \fICONFIG_FILE\fR]\&... -.SH "DESCRIPTION" -.sp -DDraceNetwork (DDNet) is an actively maintained version of \fBDDRace\fR, a \fBTeeworlds\fR modification with a unique cooperative gameplay\&. -.SH "EXAMPLES" -.sp -\fBDDNet\fR \-f myfile\&.cfg -.sp -\fBDDNet\fR \-f myfile\&.cfg \-f myfile2\&.cfg -.sp -\fBDDNet\fR \*(Aqcl_showhud 0\*(Aq \*(Aqplayer_name "nameless tee"\*(Aq -.SH "OPTIONS" -.SS "Configuration file" -.PP -\fB\-f\fR \fICONFIGURATION_FILE\fR -.RS 4 -Load -\fICONFIGURATION_FILE\fR -instead of default -\fIsettings_ddnet\&.cfg\fR -.RE -.SS "Other options" -.sp -All options can be found here: https://ddnet\&.org/settingscommands/ -.SH "RESOURCES" -.sp -.RS 4 -.ie n \{\ -\h'-04'\(bu\h'+03'\c -.\} -.el \{\ -.sp -1 -.IP \(bu 2.3 -.\} -\fBWebsite\fR: -https://ddnet\&.org/ -.RE -.sp -.RS 4 -.ie n \{\ -\h'-04'\(bu\h'+03'\c -.\} -.el \{\ -.sp -1 -.IP \(bu 2.3 -.\} -\fBRSS\fR: -https://ddnet\&.org/feed/ -.RE -.sp -.RS 4 -.ie n \{\ -\h'-04'\(bu\h'+03'\c -.\} -.el \{\ -.sp -1 -.IP \(bu 2.3 -.\} -\fBForum\fR: -https://forum\&.ddnet\&.org/ -.RE -.sp -.RS 4 -.ie n \{\ -\h'-04'\(bu\h'+03'\c -.\} -.el \{\ -.sp -1 -.IP \(bu 2.3 -.\} -\fBDiscord\fR: -https://ddnet\&.org/discord -.RE -.sp -.RS 4 -.ie n \{\ -\h'-04'\(bu\h'+03'\c -.\} -.el \{\ -.sp -1 -.IP \(bu 2.3 -.\} -\fBSource\fR: -https://github\&.com/ddnet/ddnet -.RE -.SH "REPORTING BUGS" -.sp -Report any issues here: https://github\&.com/ddnet/ddnet/issues -.SH "CONTRIBUTING" -.sp -You can contribute by opening a pull request here: https://github\&.com/ddnet/ddnet/pulls -.SH "COPYRIGHT" -.sp -Free use of this software is granted under the terms of the MIT License\&. -.sp -You can read the license here: https://github\&.com/ddnet/ddnet/blob/master/license\&.txt -.SH "AUTHOR" -.PP -\fBDDNet Contributors\fR -.RS 4 -Author. -.RE diff --git a/man/DDNet.adoc b/man/DDNet.adoc deleted file mode 100644 index f2f07018c3..0000000000 --- a/man/DDNet.adoc +++ /dev/null @@ -1,56 +0,0 @@ -= DDNet(6) -DDNet Contributors -v1.0.0 -// User defined variables -:ddnet-version: 11.7.2 -// man page variables -:doctype: manpage -:man manual: DDNet Manual -:man source: DDNet -:man version: {ddnet-version} -:page-layout: base -:man-linkstyle: pass:[blue R < >] - -== NAME -DDNet - Starts the DDNet client. - -== SYNOPSIS -*DDNet* [_OPTION_]... [-f _CONFIG_FILE_]... - -== DESCRIPTION -DDraceNetwork (DDNet) is an actively maintained version of *DDRace*, -a *Teeworlds* modification with a unique cooperative gameplay. - -== EXAMPLES -*DDNet* -f myfile.cfg - -*DDNet* -f myfile.cfg -f myfile2.cfg - -*DDNet* \'cl_showhud 0' \'player_name "nameless tee"' - -== Options - -=== Configuration file -*-f* _CONFIGURATION_FILE_:: -Load _CONFIGURATION_FILE_ instead of default _settings_ddnet.cfg_ - -=== Other options -All options can be found here: https://ddnet.org/settingscommands/ - -== RESOURCES -- *Website*: https://ddnet.org/ -- *RSS*: https://ddnet.org/feed/ -- *Forum*: https://forum.ddnet.org/ -- *Discord*: https://ddnet.org/discord -- *Source*: https://github.com/ddnet/ddnet - -== REPORTING BUGS -Report any issues here: https://github.com/ddnet/ddnet/issues - -== CONTRIBUTING -You can contribute by opening a pull request here: https://github.com/ddnet/ddnet/pulls - -== COPYRIGHT -Free use of this software is granted under the terms of the MIT License. - -You can read the license here: https://github.com/ddnet/ddnet/blob/master/license.txt \ No newline at end of file diff --git a/man/generate.sh b/man/generate.sh index 88accc6c22..619c48ccd8 100755 --- a/man/generate.sh +++ b/man/generate.sh @@ -13,10 +13,8 @@ set -ex : << 'EOF' for FORMAT in 'epub' 'htmlhelp' 'manpage' 'pdf' 'text' 'xhtml' 'dvi' 'ps' 'tex' 'docbook' do - a2x --doctype manpage --format $FORMAT DDNet.adoc a2x --doctype manpage --format $FORMAT DDNetServer.adoc done EOF -a2x --doctype manpage --format manpage DDNet.adoc a2x --doctype manpage --format manpage DDNetServer.adoc diff --git a/other/bundle/client/Info.plist.in b/other/bundle/client/Info.plist.in deleted file mode 100644 index 525a2aa319..0000000000 --- a/other/bundle/client/Info.plist.in +++ /dev/null @@ -1,64 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ${CLIENT_EXECUTABLE} - CFBundleIconFile - ${CLIENT_EXECUTABLE} - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - APPL - CFBundleSignature - ???? - CFBundleVersion - ${PROJECT_VERSION} - CFBundleIdentifier - org.DDNetClient.app - CFBundleURLTypes - - - CFBundleURLName - DDNet server link - CFBundleURLSchemes - - ddnet - - - - CFBundleDocumentTypes - - - CFBundleTypeName - DDNet demo - CFBundleTypeRole - DDNet demo viewer - LSItemContentTypes - - dyn.ah62d4rv4ge80k3prr6 - public.data - - CFBundleTypeName - DDNet map - CFBundleTypeRole - DDNet map editor - LSItemContentTypes - - dyn.ah62d4rv4ge8042pu - public.data - - - - NSHighResolutionCapable - - NSPrefersDisplaySafeAreaCompatibilityMode - - LSApplicationCategoryType - public.app-category.games - NSQualityOfService - NSQualityOfServiceUserInteractive - - diff --git a/other/bundle/client/PkgInfo b/other/bundle/client/PkgInfo deleted file mode 100644 index 6f749b0f37..0000000000 --- a/other/bundle/client/PkgInfo +++ /dev/null @@ -1 +0,0 @@ -APPL???? diff --git a/other/ddnet.desktop b/other/ddnet.desktop deleted file mode 100644 index ab497ae4d0..0000000000 --- a/other/ddnet.desktop +++ /dev/null @@ -1,11 +0,0 @@ -[Desktop Entry] -Type=Application -Name=DDNet -GenericName=Platform Game -Exec=DDNet %u -Icon=ddnet -Terminal=false -Keywords=game;multiplayer; -Categories=Game;ArcadeGame; -MimeType=x-scheme-handler/ddnet; -Comment=Launch DDNet diff --git a/other/dmgsettings.py b/other/dmgsettings.py index 5549e6ac75..86f24225a0 100644 --- a/other/dmgsettings.py +++ b/other/dmgsettings.py @@ -21,9 +21,7 @@ def read_plist(path): # .. Useful stuff .............................................................. -application_client = defines.get('client', 'DDNet.app') application_server = defines.get('server', 'DDNet-Server.app') -appname_client = os.path.basename(application_client) appname_server = os.path.basename(application_server) def icon_from_app(app_path): @@ -54,7 +52,7 @@ def icon_from_app(app_path): size = defines.get('size', None) # Files to include -files = [ application_client, application_server ] +files = [ application_server ] # Symlinks to create symlinks = { 'Applications': '/Applications' } @@ -63,7 +61,7 @@ def icon_from_app(app_path): # hide = [ 'Secret.data' ] # Files to hide the extension of -hide_extension = [ appname_client, appname_server ] +hide_extension = [ appname_server ] # Volume icon # @@ -73,12 +71,10 @@ def icon_from_app(app_path): # pyobjc-framework-Quartz. # #icon = '/path/to/icon.icns' -badge_icon_client = icon_from_app(application_client) badge_icon_server = icon_from_app(application_server) # Where to put the icons icon_locations = { - appname_client: (128, 288), appname_server: (272, 288), 'Applications': (512, 288) } diff --git a/other/emscripten/minimal.html b/other/emscripten/minimal.html deleted file mode 100644 index 969a6d130f..0000000000 --- a/other/emscripten/minimal.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - -

- - - - diff --git a/other/icons/DDNet.icns b/other/icons/DDNet.icns deleted file mode 100644 index 43d6321b0f..0000000000 Binary files a/other/icons/DDNet.icns and /dev/null differ diff --git a/other/icons/DDNet.ico b/other/icons/DDNet.ico deleted file mode 100644 index f4a461df5f..0000000000 Binary files a/other/icons/DDNet.ico and /dev/null differ diff --git a/other/icons/DDNet.rc b/other/icons/DDNet.rc deleted file mode 100644 index 072c60a694..0000000000 --- a/other/icons/DDNet.rc +++ /dev/null @@ -1 +0,0 @@ -ID ICON "DDNet.ico" diff --git a/other/icons/DDNet_16x16x32.png b/other/icons/DDNet_16x16x32.png deleted file mode 100644 index 7658abc7cf..0000000000 Binary files a/other/icons/DDNet_16x16x32.png and /dev/null differ diff --git a/other/icons/DDNet_256x256x32.png b/other/icons/DDNet_256x256x32.png deleted file mode 100644 index a0e8f2063f..0000000000 Binary files a/other/icons/DDNet_256x256x32.png and /dev/null differ diff --git a/other/icons/DDNet_32x32x32.png b/other/icons/DDNet_32x32x32.png deleted file mode 100644 index e314cf2c65..0000000000 Binary files a/other/icons/DDNet_32x32x32.png and /dev/null differ diff --git a/other/icons/DDNet_48x48x32.png b/other/icons/DDNet_48x48x32.png deleted file mode 100644 index 11dc008e5e..0000000000 Binary files a/other/icons/DDNet_48x48x32.png and /dev/null differ diff --git a/other/manifest/client.manifest.in b/other/manifest/client.manifest.in deleted file mode 100644 index dca4cf522e..0000000000 --- a/other/manifest/client.manifest.in +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - True/PM - - - - diff --git a/other/manifest/client.rc b/other/manifest/client.rc deleted file mode 100644 index 4c76cbc9d2..0000000000 --- a/other/manifest/client.rc +++ /dev/null @@ -1,2 +0,0 @@ -#include "winuser.h" -1 RT_MANIFEST client.manifest diff --git a/other/vscode/README.md b/other/vscode/README.md index 3550ec5c87..ce30563885 100644 --- a/other/vscode/README.md +++ b/other/vscode/README.md @@ -5,7 +5,6 @@ Requirements: - clang-tidy - lldb - cmake -- rustup (for the rust extension) Optional: - mold (linker), needs to be in PATH - ninja diff --git a/other/vscode/ddnet.code-workspace b/other/vscode/ddnet.code-workspace index 1a585d85ac..2e8221c59d 100644 --- a/other/vscode/ddnet.code-workspace +++ b/other/vscode/ddnet.code-workspace @@ -81,9 +81,6 @@ "lldb.launch.expressions": "native", "lldb.launch.initCommands": ["target stop-hook add --one-liner \"command script import ${workspaceFolder}/other/vscode/lldbinit.py\""], "editor.defaultFormatter": "xaver.clang-format", - "[rust]": { - "editor.defaultFormatter": "rust-lang.rust-analyzer", - }, "editor.formatOnSave": true, "cmake.additionalKits": [ "${workspaceFolder}/other/vscode/ddnet-cmake-tools-kits.json" @@ -175,27 +172,12 @@ "llvm-vs-code-extensions.vscode-clangd", "twxs.cmake", "ms-vscode.cmake-tools", - "vadimcn.vscode-lldb", - "rust-lang.rust-analyzer" + "vadimcn.vscode-lldb" ] }, "tasks": { "version": "2.0.0", "tasks": [ - { - "type": "cmake", - "label": "CMake: build client", - "command": "build", - "targets": [ - "DDNet" - ], - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": [], - "detail": "Build client targets" - }, { "type": "cmake", "label": "CMake: build server", @@ -215,18 +197,6 @@ "launch": { "version": "0.2.0", "configurations": [ - { - "type": "lldb", - "request": "launch", - "name": "Launch client", - "program": "${workspaceFolder}/build/DDNet", - "preLaunchTask": "CMake: build client", - // use dbg configs like this - // "args": [ "dbg_gfx 0" ], - // enable this to start the debugger with TSAN - // "environment": [ { "name":"TSAN_OPTIONS","value":"ignore_noninstrumented_modules=1" }], - "cwd": "${workspaceFolder}/build", - }, { "type": "lldb", "request": "launch", @@ -234,26 +204,6 @@ "program": "${workspaceFolder}/build/DDNet-Server", "preLaunchTask": "CMake: build server", "cwd": "${workspaceFolder}/build" - }, - // useful for cross debugging the windows (wine) client - // for these you need the microsoft cpp extension - // start the wine executable like this: - // winedbg --gdb --no-start --port 55555 DDNet.exe - { - "type": "cppdbg", - "request": "launch", - "name": "Attach to wine gdbserver", - "program": "${workspaceFolder}/build_win/DDNet.exe", - "miDebuggerServerAddress": "localhost:55555", - "cwd": "${workspaceFolder}/build_win/", - "MIMode": "gdb", - "setupCommands": [ - { - "description": "Auto styling for \"gdb\"", - "text": "-enable-pretty-printing", - "ignoreFailures": true - } - ] } ] } diff --git a/scripts/SDL_scancode.h b/scripts/SDL_scancode.h deleted file mode 100644 index a960a7991c..0000000000 --- a/scripts/SDL_scancode.h +++ /dev/null @@ -1,438 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2023 Sam Lantinga - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/** - * \file SDL_scancode.h - * - * Defines keyboard scancodes. - */ - -#ifndef SDL_scancode_h_ -#define SDL_scancode_h_ - -#include "SDL_stdinc.h" - -/** - * \brief The SDL keyboard scancode representation. - * - * Values of this type are used to represent keyboard keys, among other places - * in the \link SDL_Keysym::scancode key.keysym.scancode \endlink field of the - * SDL_Event structure. - * - * The values in this enumeration are based on the USB usage page standard: - * https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf - */ -typedef enum -{ - SDL_SCANCODE_UNKNOWN = 0, - - /** - * \name Usage page 0x07 - * - * These values are from usage page 0x07 (USB keyboard page). - */ - /* @{ */ - - SDL_SCANCODE_A = 4, - SDL_SCANCODE_B = 5, - SDL_SCANCODE_C = 6, - SDL_SCANCODE_D = 7, - SDL_SCANCODE_E = 8, - SDL_SCANCODE_F = 9, - SDL_SCANCODE_G = 10, - SDL_SCANCODE_H = 11, - SDL_SCANCODE_I = 12, - SDL_SCANCODE_J = 13, - SDL_SCANCODE_K = 14, - SDL_SCANCODE_L = 15, - SDL_SCANCODE_M = 16, - SDL_SCANCODE_N = 17, - SDL_SCANCODE_O = 18, - SDL_SCANCODE_P = 19, - SDL_SCANCODE_Q = 20, - SDL_SCANCODE_R = 21, - SDL_SCANCODE_S = 22, - SDL_SCANCODE_T = 23, - SDL_SCANCODE_U = 24, - SDL_SCANCODE_V = 25, - SDL_SCANCODE_W = 26, - SDL_SCANCODE_X = 27, - SDL_SCANCODE_Y = 28, - SDL_SCANCODE_Z = 29, - - SDL_SCANCODE_1 = 30, - SDL_SCANCODE_2 = 31, - SDL_SCANCODE_3 = 32, - SDL_SCANCODE_4 = 33, - SDL_SCANCODE_5 = 34, - SDL_SCANCODE_6 = 35, - SDL_SCANCODE_7 = 36, - SDL_SCANCODE_8 = 37, - SDL_SCANCODE_9 = 38, - SDL_SCANCODE_0 = 39, - - SDL_SCANCODE_RETURN = 40, - SDL_SCANCODE_ESCAPE = 41, - SDL_SCANCODE_BACKSPACE = 42, - SDL_SCANCODE_TAB = 43, - SDL_SCANCODE_SPACE = 44, - - SDL_SCANCODE_MINUS = 45, - SDL_SCANCODE_EQUALS = 46, - SDL_SCANCODE_LEFTBRACKET = 47, - SDL_SCANCODE_RIGHTBRACKET = 48, - SDL_SCANCODE_BACKSLASH = 49, /**< Located at the lower left of the return - * key on ISO keyboards and at the right end - * of the QWERTY row on ANSI keyboards. - * Produces REVERSE SOLIDUS (backslash) and - * VERTICAL LINE in a US layout, REVERSE - * SOLIDUS and VERTICAL LINE in a UK Mac - * layout, NUMBER SIGN and TILDE in a UK - * Windows layout, DOLLAR SIGN and POUND SIGN - * in a Swiss German layout, NUMBER SIGN and - * APOSTROPHE in a German layout, GRAVE - * ACCENT and POUND SIGN in a French Mac - * layout, and ASTERISK and MICRO SIGN in a - * French Windows layout. - */ - SDL_SCANCODE_NONUSHASH = 50, /**< ISO USB keyboards actually use this code - * instead of 49 for the same key, but all - * OSes I've seen treat the two codes - * identically. So, as an implementor, unless - * your keyboard generates both of those - * codes and your OS treats them differently, - * you should generate SDL_SCANCODE_BACKSLASH - * instead of this code. As a user, you - * should not rely on this code because SDL - * will never generate it with most (all?) - * keyboards. - */ - SDL_SCANCODE_SEMICOLON = 51, - SDL_SCANCODE_APOSTROPHE = 52, - SDL_SCANCODE_GRAVE = 53, /**< Located in the top left corner (on both ANSI - * and ISO keyboards). Produces GRAVE ACCENT and - * TILDE in a US Windows layout and in US and UK - * Mac layouts on ANSI keyboards, GRAVE ACCENT - * and NOT SIGN in a UK Windows layout, SECTION - * SIGN and PLUS-MINUS SIGN in US and UK Mac - * layouts on ISO keyboards, SECTION SIGN and - * DEGREE SIGN in a Swiss German layout (Mac: - * only on ISO keyboards), CIRCUMFLEX ACCENT and - * DEGREE SIGN in a German layout (Mac: only on - * ISO keyboards), SUPERSCRIPT TWO and TILDE in a - * French Windows layout, COMMERCIAL AT and - * NUMBER SIGN in a French Mac layout on ISO - * keyboards, and LESS-THAN SIGN and GREATER-THAN - * SIGN in a Swiss German, German, or French Mac - * layout on ANSI keyboards. - */ - SDL_SCANCODE_COMMA = 54, - SDL_SCANCODE_PERIOD = 55, - SDL_SCANCODE_SLASH = 56, - - SDL_SCANCODE_CAPSLOCK = 57, - - SDL_SCANCODE_F1 = 58, - SDL_SCANCODE_F2 = 59, - SDL_SCANCODE_F3 = 60, - SDL_SCANCODE_F4 = 61, - SDL_SCANCODE_F5 = 62, - SDL_SCANCODE_F6 = 63, - SDL_SCANCODE_F7 = 64, - SDL_SCANCODE_F8 = 65, - SDL_SCANCODE_F9 = 66, - SDL_SCANCODE_F10 = 67, - SDL_SCANCODE_F11 = 68, - SDL_SCANCODE_F12 = 69, - - SDL_SCANCODE_PRINTSCREEN = 70, - SDL_SCANCODE_SCROLLLOCK = 71, - SDL_SCANCODE_PAUSE = 72, - SDL_SCANCODE_INSERT = 73, /**< insert on PC, help on some Mac keyboards (but - does send code 73, not 117) */ - SDL_SCANCODE_HOME = 74, - SDL_SCANCODE_PAGEUP = 75, - SDL_SCANCODE_DELETE = 76, - SDL_SCANCODE_END = 77, - SDL_SCANCODE_PAGEDOWN = 78, - SDL_SCANCODE_RIGHT = 79, - SDL_SCANCODE_LEFT = 80, - SDL_SCANCODE_DOWN = 81, - SDL_SCANCODE_UP = 82, - - SDL_SCANCODE_NUMLOCKCLEAR = 83, /**< num lock on PC, clear on Mac keyboards - */ - SDL_SCANCODE_KP_DIVIDE = 84, - SDL_SCANCODE_KP_MULTIPLY = 85, - SDL_SCANCODE_KP_MINUS = 86, - SDL_SCANCODE_KP_PLUS = 87, - SDL_SCANCODE_KP_ENTER = 88, - SDL_SCANCODE_KP_1 = 89, - SDL_SCANCODE_KP_2 = 90, - SDL_SCANCODE_KP_3 = 91, - SDL_SCANCODE_KP_4 = 92, - SDL_SCANCODE_KP_5 = 93, - SDL_SCANCODE_KP_6 = 94, - SDL_SCANCODE_KP_7 = 95, - SDL_SCANCODE_KP_8 = 96, - SDL_SCANCODE_KP_9 = 97, - SDL_SCANCODE_KP_0 = 98, - SDL_SCANCODE_KP_PERIOD = 99, - - SDL_SCANCODE_NONUSBACKSLASH = 100, /**< This is the additional key that ISO - * keyboards have over ANSI ones, - * located between left shift and Y. - * Produces GRAVE ACCENT and TILDE in a - * US or UK Mac layout, REVERSE SOLIDUS - * (backslash) and VERTICAL LINE in a - * US or UK Windows layout, and - * LESS-THAN SIGN and GREATER-THAN SIGN - * in a Swiss German, German, or French - * layout. */ - SDL_SCANCODE_APPLICATION = 101, /**< windows contextual menu, compose */ - SDL_SCANCODE_POWER = 102, /**< The USB document says this is a status flag, - * not a physical key - but some Mac keyboards - * do have a power key. */ - SDL_SCANCODE_KP_EQUALS = 103, - SDL_SCANCODE_F13 = 104, - SDL_SCANCODE_F14 = 105, - SDL_SCANCODE_F15 = 106, - SDL_SCANCODE_F16 = 107, - SDL_SCANCODE_F17 = 108, - SDL_SCANCODE_F18 = 109, - SDL_SCANCODE_F19 = 110, - SDL_SCANCODE_F20 = 111, - SDL_SCANCODE_F21 = 112, - SDL_SCANCODE_F22 = 113, - SDL_SCANCODE_F23 = 114, - SDL_SCANCODE_F24 = 115, - SDL_SCANCODE_EXECUTE = 116, - SDL_SCANCODE_HELP = 117, /**< AL Integrated Help Center */ - SDL_SCANCODE_MENU = 118, /**< Menu (show menu) */ - SDL_SCANCODE_SELECT = 119, - SDL_SCANCODE_STOP = 120, /**< AC Stop */ - SDL_SCANCODE_AGAIN = 121, /**< AC Redo/Repeat */ - SDL_SCANCODE_UNDO = 122, /**< AC Undo */ - SDL_SCANCODE_CUT = 123, /**< AC Cut */ - SDL_SCANCODE_COPY = 124, /**< AC Copy */ - SDL_SCANCODE_PASTE = 125, /**< AC Paste */ - SDL_SCANCODE_FIND = 126, /**< AC Find */ - SDL_SCANCODE_MUTE = 127, - SDL_SCANCODE_VOLUMEUP = 128, - SDL_SCANCODE_VOLUMEDOWN = 129, -/* not sure whether there's a reason to enable these */ -/* SDL_SCANCODE_LOCKINGCAPSLOCK = 130, */ -/* SDL_SCANCODE_LOCKINGNUMLOCK = 131, */ -/* SDL_SCANCODE_LOCKINGSCROLLLOCK = 132, */ - SDL_SCANCODE_KP_COMMA = 133, - SDL_SCANCODE_KP_EQUALSAS400 = 134, - - SDL_SCANCODE_INTERNATIONAL1 = 135, /**< used on Asian keyboards, see - footnotes in USB doc */ - SDL_SCANCODE_INTERNATIONAL2 = 136, - SDL_SCANCODE_INTERNATIONAL3 = 137, /**< Yen */ - SDL_SCANCODE_INTERNATIONAL4 = 138, - SDL_SCANCODE_INTERNATIONAL5 = 139, - SDL_SCANCODE_INTERNATIONAL6 = 140, - SDL_SCANCODE_INTERNATIONAL7 = 141, - SDL_SCANCODE_INTERNATIONAL8 = 142, - SDL_SCANCODE_INTERNATIONAL9 = 143, - SDL_SCANCODE_LANG1 = 144, /**< Hangul/English toggle */ - SDL_SCANCODE_LANG2 = 145, /**< Hanja conversion */ - SDL_SCANCODE_LANG3 = 146, /**< Katakana */ - SDL_SCANCODE_LANG4 = 147, /**< Hiragana */ - SDL_SCANCODE_LANG5 = 148, /**< Zenkaku/Hankaku */ - SDL_SCANCODE_LANG6 = 149, /**< reserved */ - SDL_SCANCODE_LANG7 = 150, /**< reserved */ - SDL_SCANCODE_LANG8 = 151, /**< reserved */ - SDL_SCANCODE_LANG9 = 152, /**< reserved */ - - SDL_SCANCODE_ALTERASE = 153, /**< Erase-Eaze */ - SDL_SCANCODE_SYSREQ = 154, - SDL_SCANCODE_CANCEL = 155, /**< AC Cancel */ - SDL_SCANCODE_CLEAR = 156, - SDL_SCANCODE_PRIOR = 157, - SDL_SCANCODE_RETURN2 = 158, - SDL_SCANCODE_SEPARATOR = 159, - SDL_SCANCODE_OUT = 160, - SDL_SCANCODE_OPER = 161, - SDL_SCANCODE_CLEARAGAIN = 162, - SDL_SCANCODE_CRSEL = 163, - SDL_SCANCODE_EXSEL = 164, - - SDL_SCANCODE_KP_00 = 176, - SDL_SCANCODE_KP_000 = 177, - SDL_SCANCODE_THOUSANDSSEPARATOR = 178, - SDL_SCANCODE_DECIMALSEPARATOR = 179, - SDL_SCANCODE_CURRENCYUNIT = 180, - SDL_SCANCODE_CURRENCYSUBUNIT = 181, - SDL_SCANCODE_KP_LEFTPAREN = 182, - SDL_SCANCODE_KP_RIGHTPAREN = 183, - SDL_SCANCODE_KP_LEFTBRACE = 184, - SDL_SCANCODE_KP_RIGHTBRACE = 185, - SDL_SCANCODE_KP_TAB = 186, - SDL_SCANCODE_KP_BACKSPACE = 187, - SDL_SCANCODE_KP_A = 188, - SDL_SCANCODE_KP_B = 189, - SDL_SCANCODE_KP_C = 190, - SDL_SCANCODE_KP_D = 191, - SDL_SCANCODE_KP_E = 192, - SDL_SCANCODE_KP_F = 193, - SDL_SCANCODE_KP_XOR = 194, - SDL_SCANCODE_KP_POWER = 195, - SDL_SCANCODE_KP_PERCENT = 196, - SDL_SCANCODE_KP_LESS = 197, - SDL_SCANCODE_KP_GREATER = 198, - SDL_SCANCODE_KP_AMPERSAND = 199, - SDL_SCANCODE_KP_DBLAMPERSAND = 200, - SDL_SCANCODE_KP_VERTICALBAR = 201, - SDL_SCANCODE_KP_DBLVERTICALBAR = 202, - SDL_SCANCODE_KP_COLON = 203, - SDL_SCANCODE_KP_HASH = 204, - SDL_SCANCODE_KP_SPACE = 205, - SDL_SCANCODE_KP_AT = 206, - SDL_SCANCODE_KP_EXCLAM = 207, - SDL_SCANCODE_KP_MEMSTORE = 208, - SDL_SCANCODE_KP_MEMRECALL = 209, - SDL_SCANCODE_KP_MEMCLEAR = 210, - SDL_SCANCODE_KP_MEMADD = 211, - SDL_SCANCODE_KP_MEMSUBTRACT = 212, - SDL_SCANCODE_KP_MEMMULTIPLY = 213, - SDL_SCANCODE_KP_MEMDIVIDE = 214, - SDL_SCANCODE_KP_PLUSMINUS = 215, - SDL_SCANCODE_KP_CLEAR = 216, - SDL_SCANCODE_KP_CLEARENTRY = 217, - SDL_SCANCODE_KP_BINARY = 218, - SDL_SCANCODE_KP_OCTAL = 219, - SDL_SCANCODE_KP_DECIMAL = 220, - SDL_SCANCODE_KP_HEXADECIMAL = 221, - - SDL_SCANCODE_LCTRL = 224, - SDL_SCANCODE_LSHIFT = 225, - SDL_SCANCODE_LALT = 226, /**< alt, option */ - SDL_SCANCODE_LGUI = 227, /**< windows, command (apple), meta */ - SDL_SCANCODE_RCTRL = 228, - SDL_SCANCODE_RSHIFT = 229, - SDL_SCANCODE_RALT = 230, /**< alt gr, option */ - SDL_SCANCODE_RGUI = 231, /**< windows, command (apple), meta */ - - SDL_SCANCODE_MODE = 257, /**< I'm not sure if this is really not covered - * by any of the above, but since there's a - * special KMOD_MODE for it I'm adding it here - */ - - /* @} *//* Usage page 0x07 */ - - /** - * \name Usage page 0x0C - * - * These values are mapped from usage page 0x0C (USB consumer page). - * See https://usb.org/sites/default/files/hut1_2.pdf - * - * There are way more keys in the spec than we can represent in the - * current scancode range, so pick the ones that commonly come up in - * real world usage. - */ - /* @{ */ - - SDL_SCANCODE_AUDIONEXT = 258, - SDL_SCANCODE_AUDIOPREV = 259, - SDL_SCANCODE_AUDIOSTOP = 260, - SDL_SCANCODE_AUDIOPLAY = 261, - SDL_SCANCODE_AUDIOMUTE = 262, - SDL_SCANCODE_MEDIASELECT = 263, - SDL_SCANCODE_WWW = 264, /**< AL Internet Browser */ - SDL_SCANCODE_MAIL = 265, - SDL_SCANCODE_CALCULATOR = 266, /**< AL Calculator */ - SDL_SCANCODE_COMPUTER = 267, - SDL_SCANCODE_AC_SEARCH = 268, /**< AC Search */ - SDL_SCANCODE_AC_HOME = 269, /**< AC Home */ - SDL_SCANCODE_AC_BACK = 270, /**< AC Back */ - SDL_SCANCODE_AC_FORWARD = 271, /**< AC Forward */ - SDL_SCANCODE_AC_STOP = 272, /**< AC Stop */ - SDL_SCANCODE_AC_REFRESH = 273, /**< AC Refresh */ - SDL_SCANCODE_AC_BOOKMARKS = 274, /**< AC Bookmarks */ - - /* @} *//* Usage page 0x0C */ - - /** - * \name Walther keys - * - * These are values that Christian Walther added (for mac keyboard?). - */ - /* @{ */ - - SDL_SCANCODE_BRIGHTNESSDOWN = 275, - SDL_SCANCODE_BRIGHTNESSUP = 276, - SDL_SCANCODE_DISPLAYSWITCH = 277, /**< display mirroring/dual display - switch, video mode switch */ - SDL_SCANCODE_KBDILLUMTOGGLE = 278, - SDL_SCANCODE_KBDILLUMDOWN = 279, - SDL_SCANCODE_KBDILLUMUP = 280, - SDL_SCANCODE_EJECT = 281, - SDL_SCANCODE_SLEEP = 282, /**< SC System Sleep */ - - SDL_SCANCODE_APP1 = 283, - SDL_SCANCODE_APP2 = 284, - - /* @} *//* Walther keys */ - - /** - * \name Usage page 0x0C (additional media keys) - * - * These values are mapped from usage page 0x0C (USB consumer page). - */ - /* @{ */ - - SDL_SCANCODE_AUDIOREWIND = 285, - SDL_SCANCODE_AUDIOFASTFORWARD = 286, - - /* @} *//* Usage page 0x0C (additional media keys) */ - - /** - * \name Mobile keys - * - * These are values that are often used on mobile phones. - */ - /* @{ */ - - SDL_SCANCODE_SOFTLEFT = 287, /**< Usually situated below the display on phones and - used as a multi-function feature key for selecting - a software defined function shown on the bottom left - of the display. */ - SDL_SCANCODE_SOFTRIGHT = 288, /**< Usually situated below the display on phones and - used as a multi-function feature key for selecting - a software defined function shown on the bottom right - of the display. */ - SDL_SCANCODE_CALL = 289, /**< Used for accepting phone calls. */ - SDL_SCANCODE_ENDCALL = 290, /**< Used for rejecting phone calls. */ - - /* @} *//* Mobile keys */ - - /* Add any other keys here. */ - - SDL_NUM_SCANCODES = 512 /**< not a key, just marks the number of scancodes - for array bounds */ -} SDL_Scancode; - -#endif /* SDL_scancode_h_ */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/scripts/android/README.md b/scripts/android/README.md deleted file mode 100644 index 7bd362affa..0000000000 --- a/scripts/android/README.md +++ /dev/null @@ -1,196 +0,0 @@ -Requirements for building for Android on Linux -============================================== - -- At least 10-15 GiB of free disk space. -- First follow the general instructions for setting up https://github.com/ddnet/ddnet for building on Linux. -- Note: Use a stable version of Rust. Using the nightly version results in linking errors. -- Install the Android NDK (version 26) in the same location - where Android Studio would unpack it (`~/Android/Sdk/ndk/`): - ```shell - mkdir ~/Android - cd ~/Android - mkdir Sdk - cd Sdk - mkdir ndk - cd ndk - wget https://dl.google.com/android/repository/android-ndk-r26d-linux.zip - unzip android-ndk-r26d-linux.zip - unlink android-ndk-r26d-linux.zip - ``` -- Install the Android SDK build tools (version 30.0.3) in the same location - where Android Studio would unpack them (`~/Android/Sdk/build-tools/`): - ```shell - # Assuming you already created the Android/Sdk folders in the previous step - cd ~/Android/Sdk - mkdir build-tools - cd build-tools - wget https://dl.google.com/android/repository/build-tools_r30.0.3-linux.zip - unzip build-tools_r30.0.3-linux.zip - unlink build-tools_r30.0.3-linux.zip - mv android-11 30.0.3 - ``` -- Install the Android command-line tools and accept the licenses using the SDK manager, - otherwise the Gradle build will fail if the licenses have not been accepted: - ```shell - # Assuming you already created the Android/Sdk folders in the previous step - cd ~/Android/Sdk - mkdir cmdline-tools - cd cmdline-tools - wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip - unzip commandlinetools-linux-11076708_latest.zip - unlink commandlinetools-linux-11076708_latest.zip - mv cmdline-tools latest - yes | latest/bin/sdkmanager --licenses - ``` -- Install cargo-ndk and add Android targets to rustup to build Rust with the Android NDK: - ```shell - cargo install cargo-ndk - rustup target add armv7-linux-androideabi - rustup target add i686-linux-android - rustup target add aarch64-linux-android - rustup target add x86_64-linux-android - ``` -- Install OpenJDK 21: - ```shell - sudo apt install openjdk-21-jdk - ``` -- Install ninja: - ```shell - sudo apt install ninja-build - ``` -- Install curl: - ```shell - sudo apt install curl - ``` -- *(macOS only)* Install coreutils so `nproc` is available: - ```shell - brew install coreutils - ``` -- Build the `ddnet-libs` for Android (see below). Follow all above steps first. - Alternatively, use the precompiled libraries from https://github.com/ddnet/ddnet-libs/. - -Requirements for building for Android on Windows using MSYS2 -============================================================ - -- At least 50 GiB of free disk space if you start from scratch. -- First install MSYS2 (https://www.msys2.org/wiki/MSYS2-installation/) as well as all required packages for building DDNet using MSYS2 on Windows. - (There is currently no more detailed guide for this.) -- Install cargo-ndk and add Android targets to rustup to build Rust with the Android NDK: - ```shell - cargo install cargo-ndk - rustup target add armv7-linux-androideabi - rustup target add i686-linux-android - rustup target add aarch64-linux-android - rustup target add x86_64-linux-android - ``` -- Install JDK 21, e.g. from https://adoptium.net/temurin/releases/?package=jdk&os=windows&version=21 -- Install ninja: - ```shell - pacman -S mingw-w64-x86_64-ninja - ``` -- Install curl: - ```shell - pacman -S mingw-w64-x86_64-curl - ``` -- Install coreutils so `nproc` is available: - ```shell - pacman -S coreutils - ``` -- Compiling the libraries is not supported on Windows yet. Use the precompiled libraries from https://github.com/ddnet/ddnet-libs/, - i.e. make sure to also clone the ddnet-libs submodule, or compile the libraries on a separate Linux system. -- Set the `ANDROID_HOME` environment variable to override the location where the Android SDK will be installed, e.g. `C:/Android/SDK`. Make sure to only use forward slashes. -- Install either Android Studio (which includes an SDK manager GUI) from https://developer.android.com/studio or the standalone command-line tools (which include the `sdkmanager` tool) from https://developer.android.com/studio/#command-line-tools-only. -- When using the command-line tools: Ensure the command-line tools are installed at the expected location, so `%ANDROID_HOME%/cmdline-tools/latest/bin` should contain `sdkmanager.bat`. -Accept the licenses using the SDK manager, otherwise the Gradle build will fail if the licenses have not been accepted: - ```shell - yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager.bat --licenses - ``` -- Install the following using the SDK Manager in Android Studio (Tools menu) or the `sdkmanager` command-line tool: - - SDK Platform for API Level 34 - - NDK (Side by side) - - Android SDK Build-Tools (latest version) - -How to build the `ddnet-libs` for Android -========================================= - -- Note: This has only been tested on Linux. -- Install 7-Zip: - ```shell - sudo apt install p7zip-full - ``` -- There is a script to automatically download and build all repositories, - this requires an active internet connection and can take around 30 minutes: - ```shell - mkdir build-android-libs - scripts/compile_libs/gen_libs.sh build-android-libs android - ``` - **Warning**: Do not choose a directory inside the `src` folder! -- If you see several red error messages in the first few minutes, - abort the compilation with repeated Ctrl+C presses. - Examine the output and ensure that you installed the NDK to the correct location. -- After the script finished executing, it should have created a `ddnet-libs` directory - in your selected output folder, which contains all libraries in the correct directory - format and can be merged with the `ddnet-libs` folder in the source directory: - ```shell - cp -r build-android-libs/ddnet-libs/. ddnet-libs/ - ``` - -How to build the DDNet client for Android -========================================= - -- These steps are identical on Linux and Windows, except on Windows `bash` must be used as terminal and not `cmd.exe` or PowerShell. -- Open a terminal inside the `ddnet` project root directory and run the following: - ```shell - scripts/android/cmake_android.sh - ``` - - The first parameter denotes the architecture. - Use `all` to compile for all architectures. - Note that all architectures will be compiled in parallel. - For testing, only compile for one architecture initially to get readable output. - - The second parameter denotes the APK name, which must be equal to the library name. - If you want to rename the APK, do it after the build. - - The third parameter denotes the package name of the APK. - - The fourth parameter denotes the build type. - - The fifth parameter denotes the build folder. -- Example to build only for `x86_64` architecture in debug mode: - ```shell - scripts/android/cmake_android.sh x86_64 DDNet org.ddnet.client Debug build-android-debug - ``` -- To build a signed APK, generate a signing key and export environment variables before running the build script: - ```shell - keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias - export TW_KEY_NAME= - export TW_KEY_PW= - export TW_KEY_ALIAS= - ``` -- By default, the version code and name of the APK will be determined automatically - based on the definitions in `src/game/version.h`. - You can also specify the build version code and name manually before running the build script, e.g.: - ```shell - export TW_VERSION_CODE=20210819 - export TW_VERSION_NAME="1.0" - ``` - The version code must increase for newer version in order for users to automatically update to them. - The version name is the string that will be displayed to the user, e.g. `1.2.3-snapshot4`. -- Example to build a signed APK in release mode for all architectures: - ```shell - keytool -genkey -v -keystore Teeworlds.jks -keyalg RSA -keysize 2048 -validity 10000 -alias Teeworlds-Key - # It will prompt for the password, input for example "mypassword" - export TW_KEY_NAME=Teeworlds.jks - export TW_KEY_PW=mypassword - export TW_KEY_ALIAS=Teeworlds-Key - # Version code and name will be determined automatically - scripts/android/cmake_android.sh all DDNet org.ddnet.client Release build-android-release - ``` -- Note that you should only generate a signing key once (and make backups). - Users can only update apps automatically if the same package name and signing key have been used, - else they must manually uninstall the old app. - -Common problems and solutions -============================= - -- If the Gradle build fails with errors messages indicating bugs relating to files in the Gradle cache, try to clear the Gradle cache by deleting the contents of the folder `~/.gradle/caches` (`%USERPROFILE%/.gradle/caches` on Windows). -- The Gradle build may show a message that the JDK version could not be determined but this can safely be ignored. -- The Gradle build will fail with errors messages indicating an unsupported class file version if a different version of the JDK is used than specified in `build.gradle`. - When incrementing the supported JDK version, the Gradle version also has to be incremented according to https://docs.gradle.org/current/userguide/compatibility.html. - If you have multiple JDKs installed, you can set the JDK version for Gradle using the property `org.gradle.java.home` in the `gradle.properties` file in your Gradle home directory. diff --git a/scripts/android/cmake_android.sh b/scripts/android/cmake_android.sh deleted file mode 100755 index a8b7ad0cea..0000000000 --- a/scripts/android/cmake_android.sh +++ /dev/null @@ -1,288 +0,0 @@ -#!/bin/bash -set -e - -# Ensure that binaries from MSYS2 are preferred over Windows-native commands like find and sort which work differently. -PATH="/usr/bin/:$PATH" - -# $ANDROID_HOME can be used-defined, else the default location is used. Important notes: -# - The path must not contain spaces on Windows. -# - $HOME must be used instead of ~ else cargo-ndk cannot find the folder. -ANDROID_HOME="${ANDROID_HOME:-$HOME/Android/Sdk}" -export ANDROID_HOME - -BUILD_FLAGS="${BUILD_FLAGS:--j$(nproc)}" -export BUILD_FLAGS - -ANDROID_NDK_VERSION="$(cd "$ANDROID_HOME/ndk" && find . -maxdepth 1 | sort -n | tail -1)" -ANDROID_NDK_VERSION="${ANDROID_NDK_VERSION:2}" -# ANDROID_NDK_HOME must be exported for cargo-ndk -export ANDROID_NDK_HOME="$ANDROID_HOME/ndk/$ANDROID_NDK_VERSION" - -# ANDROID_API_LEVEL must specify the _minimum_ supported SDK version, otherwise this will cause linking errors at launch -ANDROID_API_LEVEL=24 -ANDROID_SUB_BUILD_DIR=build_arch - -COLOR_RED="\e[1;31m" -COLOR_YELLOW="\e[1;33m" -COLOR_CYAN="\e[1;36m" -COLOR_RESET="\e[0m" - -SHOW_USAGE_INFO=0 - -log_info() { - printf "${COLOR_CYAN}%s${COLOR_RESET}\n" "$1" -} - -log_warn() { - printf "${COLOR_YELLOW}%s${COLOR_RESET}\n" "$1" 1>&2 -} - -log_error() { - printf "${COLOR_RED}%s${COLOR_RESET}\n" "$1" 1>&2 -} - -if [ -z ${1+x} ]; then - SHOW_USAGE_INFO=1 - log_error "Did not pass Android build type" -else - ANDROID_BUILD=$1 - if [[ "${ANDROID_BUILD}" == "x64" ]]; then - ANDROID_BUILD="x86_64" - fi - log_warn "Android build type: ${ANDROID_BUILD}" -fi - -if [ -z ${2+x} ]; then - SHOW_USAGE_INFO=1 - log_error "Did not pass game name" -else - GAME_NAME=$2 - log_warn "Game name: ${GAME_NAME}" -fi - -if [ -z ${3+x} ]; then - SHOW_USAGE_INFO=1 - log_error "Did not pass package name" -else - PACKAGE_NAME=$3 - log_warn "Package name: ${PACKAGE_NAME}" -fi - -if [ -z ${4+x} ]; then - SHOW_USAGE_INFO=1 - log_error "Did not pass build type" -else - BUILD_TYPE=$4 - log_warn "Build type: ${BUILD_TYPE}" -fi - -if [ -z ${5+x} ]; then - SHOW_USAGE_INFO=1 - log_error "Did not pass build folder" -else - BUILD_FOLDER=$5 - log_warn "Build folder: ${BUILD_FOLDER}" -fi - -if [ $SHOW_USAGE_INFO == 1 ]; then - log_error "Usage: ./cmake_android.sh " - exit 1 -fi - -# These are the properties of the default Android debug key. The debug key will -# automatically be created during the Gradle build if it does not exist already, -# so you don't need to create it yourself. -DEFAULT_KEY_NAME=~/.android/debug.keystore -DEFAULT_KEY_PW=android -DEFAULT_KEY_ALIAS=androiddebugkey - -if [ -z ${TW_KEY_NAME+x} ]; then - log_warn "Did not pass a key path for the APK signer, using default: ${DEFAULT_KEY_NAME}" -else - DEFAULT_KEY_NAME=$TW_KEY_NAME -fi -if [ -z ${TW_KEY_PW+x} ]; then - log_warn "Did not pass a key password for the APK signer, using default: ${DEFAULT_KEY_PW}" -else - DEFAULT_KEY_PW=$TW_KEY_PW -fi -if [ -z ${TW_KEY_ALIAS+x} ]; then - log_warn "Did not pass a key alias for the APK signer, using default: ${DEFAULT_KEY_ALIAS}" -else - DEFAULT_KEY_ALIAS=$TW_KEY_ALIAS -fi - -export TW_KEY_NAME="${DEFAULT_KEY_NAME}" -export TW_KEY_PW=$DEFAULT_KEY_PW -export TW_KEY_ALIAS=$DEFAULT_KEY_ALIAS - -ANDROID_VERSION_CODE=1 -if [ -z ${TW_VERSION_CODE+x} ]; then - ANDROID_VERSION_CODE=$(grep '#define DDNET_VERSION_NUMBER' src/game/version.h | awk '{print $3}') - if [ -z ${ANDROID_VERSION_CODE+x} ]; then - ANDROID_VERSION_CODE=1 - fi - log_warn "Did not pass a version code, using default: ${ANDROID_VERSION_CODE}" -else - ANDROID_VERSION_CODE=$TW_VERSION_CODE -fi - -export TW_VERSION_CODE=$ANDROID_VERSION_CODE - -ANDROID_VERSION_NAME="1.0" -if [ -z ${TW_VERSION_NAME+x} ]; then - ANDROID_VERSION_NAME="$(grep '#define GAME_RELEASE_VERSION' src/game/version.h | awk '{print $3}' | tr -d '"')" - if [ -z ${ANDROID_VERSION_NAME+x} ]; then - ANDROID_VERSION_NAME="1.0" - fi - log_warn "Did not pass a version name, using default: ${ANDROID_VERSION_NAME}" -else - ANDROID_VERSION_NAME=$TW_VERSION_NAME -fi - -export TW_VERSION_NAME=$ANDROID_VERSION_NAME - -function build_for_type() { - cmake \ - -H. \ - -G "Ninja" \ - -DPREFER_BUNDLED_LIBS=ON \ - -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ - -DANDROID_PLATFORM="android-${ANDROID_API_LEVEL}" \ - -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake" \ - -DANDROID_NDK="$ANDROID_NDK_HOME" \ - -DANDROID_ABI="${2}" \ - -DANDROID_ARM_NEON=TRUE \ - -DANDROID_PACKAGE_NAME="${PACKAGE_NAME//./_}" \ - -DCMAKE_ANDROID_NDK="$ANDROID_NDK_HOME" \ - -DCMAKE_SYSTEM_NAME=Android \ - -DCMAKE_SYSTEM_VERSION="$ANDROID_API_LEVEL" \ - -DCMAKE_ANDROID_ARCH_ABI="${2}" \ - -DCARGO_NDK_TARGET="${3}" \ - -DCARGO_NDK_API="$ANDROID_API_LEVEL" \ - -B"${BUILD_FOLDER}/$ANDROID_SUB_BUILD_DIR/$1" \ - -DSERVER=ON \ - -DTOOLS=OFF \ - -DDEV=TRUE \ - -DCMAKE_CROSSCOMPILING=ON \ - -DVULKAN=ON \ - -DVIDEORECORDER=OFF - ( - cd "${BUILD_FOLDER}/$ANDROID_SUB_BUILD_DIR/$1" || exit 1 - # We want word splitting - # shellcheck disable=SC2086 - cmake --build . --target game-client game-server $BUILD_FLAGS - ) -} - -mkdir -p "${BUILD_FOLDER}" - -if [[ "${ANDROID_BUILD}" == "arm" || "${ANDROID_BUILD}" == "all" ]]; then - log_info "Building cmake (arm)..." - build_for_type arm armeabi-v7a armv7-linux-androideabi -fi - -if [[ "${ANDROID_BUILD}" == "arm64" || "${ANDROID_BUILD}" == "all" ]]; then - log_info "Building cmake (arm64)..." - build_for_type arm64 arm64-v8a aarch64-linux-android -fi - -if [[ "${ANDROID_BUILD}" == "x86" || "${ANDROID_BUILD}" == "all" ]]; then - log_info "Building cmake (x86)..." - build_for_type x86 x86 i686-linux-android -fi - -if [[ "${ANDROID_BUILD}" == "x86_64" || "${ANDROID_BUILD}" == "all" ]]; then - log_info "Building cmake (x86_64)..." - build_for_type x86_64 x86_64 x86_64-linux-android -fi - -log_info "Copying project files..." - -cd "${BUILD_FOLDER}" || exit 1 - -mkdir -p src/main -mkdir -p src/main/res/values -mkdir -p src/main/res/xml -mkdir -p src/main/res/mipmap - -function copy_dummy_files() { - rm -f ./"$2" - cp ../"$1" "$2" -} - -copy_dummy_files scripts/android/files/build.sh build.sh -copy_dummy_files scripts/android/files/gradle-wrapper.jar gradle-wrapper.jar -copy_dummy_files scripts/android/files/build.gradle build.gradle -copy_dummy_files scripts/android/files/gradle-wrapper.properties gradle-wrapper.properties -copy_dummy_files scripts/android/files/gradle.properties gradle.properties -copy_dummy_files scripts/android/files/proguard-rules.pro proguard-rules.pro -copy_dummy_files scripts/android/files/settings.gradle settings.gradle -copy_dummy_files scripts/android/files/AndroidManifest.xml src/main/AndroidManifest.xml -copy_dummy_files scripts/android/files/res/values/strings.xml src/main/res/values/strings.xml -copy_dummy_files scripts/android/files/res/xml/shortcuts.xml src/main/res/xml/shortcuts.xml -copy_dummy_files other/icons/DDNet_256x256x32.png src/main/res/mipmap/ic_launcher.png -copy_dummy_files other/icons/DDNet_256x256x32.png src/main/res/mipmap/ic_launcher_round.png - -log_info "Copying libraries..." - -function copy_libs() { - mkdir -p "lib/$2" - cp "$ANDROID_SUB_BUILD_DIR/$1/libDDNet.so" "lib/$2" || exit 1 - cp "$ANDROID_SUB_BUILD_DIR/$1/libDDNet-Server.so" "lib/$2" || exit 1 -} - -if [[ "${ANDROID_BUILD}" == "arm" || "${ANDROID_BUILD}" == "all" ]]; then - copy_libs arm armeabi-v7a -fi - -if [[ "${ANDROID_BUILD}" == "arm64" || "${ANDROID_BUILD}" == "all" ]]; then - copy_libs arm64 arm64-v8a -fi - -if [[ "${ANDROID_BUILD}" == "x86" || "${ANDROID_BUILD}" == "all" ]]; then - copy_libs x86 x86 -fi - -if [[ "${ANDROID_BUILD}" == "x86_64" || "${ANDROID_BUILD}" == "all" ]]; then - copy_libs x86_64 x86_64 -fi - -ANDROID_BUILD_DUMMY=$ANDROID_BUILD -if [[ "${ANDROID_BUILD}" == "all" ]]; then - ANDROID_BUILD_DUMMY=arm -fi - -log_info "Copying data folder..." -mkdir -p assets/asset_integrity_files -cp -R "$ANDROID_SUB_BUILD_DIR/$ANDROID_BUILD_DUMMY/data" ./assets/asset_integrity_files - -log_info "Downloading certificate..." -curl -s -S --remote-name --time-cond cacert.pem https://curl.se/ca/cacert.pem -cp ./cacert.pem ./assets/asset_integrity_files/data/cacert.pem || exit 1 - -log_info "Creating integrity index file..." -( - cd assets/asset_integrity_files || exit 1 - tmpfile="$(mktemp /tmp/hash_strings.XXX)" - find data -iname "*" -type f -print0 | xargs -0 sha256sum | awk '{gsub(/^\*/, "", $2); print substr($0, index($0, $2)), $1}' > "$tmpfile" - full_hash="$(sha256sum "$tmpfile" | cut -d' ' -f 1)" - - rm -f "integrity.txt" - { - echo "$full_hash" - cat "$tmpfile" - } > "integrity.txt" -) - -log_info "Preparing gradle build..." - -rm -R -f src/main/java/org -mkdir -p src/main/java -cp -R ../scripts/android/files/java/org src/main/java/ -cp -R ../ddnet-libs/sdl/java/org src/main/java/ - -# shellcheck disable=SC1091 -source ./build.sh "$GAME_NAME" "$PACKAGE_NAME" "$BUILD_TYPE" - -cd .. diff --git a/scripts/android/files/AndroidManifest.xml b/scripts/android/files/AndroidManifest.xml deleted file mode 100644 index e4ac45733a..0000000000 --- a/scripts/android/files/AndroidManifest.xml +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/scripts/android/files/build.gradle b/scripts/android/files/build.gradle deleted file mode 100644 index 5789fe0412..0000000000 --- a/scripts/android/files/build.gradle +++ /dev/null @@ -1,79 +0,0 @@ -apply plugin: 'com.android.application' - -buildscript { - repositories { - google() - mavenCentral() - } - dependencies { - classpath 'com.android.tools.build:gradle:8.3.0' - } -} - -java { - toolchain { - languageVersion.set(JavaLanguageVersion.of(21)) - } -} - -android { - compileSdkVersion 34 - defaultConfig { - applicationId "org.ddnet.client" - namespace("org.ddnet.client") - minSdkVersion 24 - targetSdkVersion 34 - versionCode TW_VERSION_CODE - versionName "TW_VERSION_NAME" - } - signingConfigs { - release { - storeFile file("TW_KEY_NAME") - storePassword "TW_KEY_PW" - keyAlias "TW_KEY_ALIAS" - keyPassword "TW_KEY_PW" - } - } - buildTypes { - release { - signingConfig signingConfigs.release - minifyEnabled true - shrinkResources true - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - debug { - debuggable true - minifyEnabled false - shrinkResources false - } - } - packagingOptions { - jniLibs { - useLegacyPackaging = true - } - } - sourceSets { - main { - assets.srcDirs = ['assets'] - jniLibs.srcDirs = ['lib'] - } - } - lintOptions { - abortOnError false - } - dependencies { - implementation 'androidx.core:core:1.13.1' - } -} - -allprojects { - repositories { - google() - mavenCentral() - } - gradle.projectsEvaluated { - tasks.withType(JavaCompile) { - options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" - } - } -} diff --git a/scripts/android/files/build.sh b/scripts/android/files/build.sh deleted file mode 100644 index 7d0859a495..0000000000 --- a/scripts/android/files/build.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/bash - -COLOR_RED="\e[1;31m" -COLOR_RESET="\e[0m" - -if [ -z ${1+x} ]; then - printf "${COLOR_RED}%s${COLOR_RESET}\n" "Did not pass APK name to build script" - exit 1 -fi - -if [ -z ${2+x} ]; then - printf "${COLOR_RED}%s${COLOR_RESET}\n" "Did not pass package name to build script" - exit 1 -fi - -if [ -z ${3+x} ]; then - printf "${COLOR_RED}%s${COLOR_RESET}\n" "Did not pass build type to build script: Debug, Release" - exit 1 -fi - -APK_BASENAME="$1" -APK_PACKAGE_NAME="$2" -APK_BUILD_TYPE="$3" - -if [[ "${APK_BUILD_TYPE}" == "Debug" ]]; then - RELEASE_TYPE_NAME=debug -elif [[ "${APK_BUILD_TYPE}" == "Release" ]]; then - RELEASE_TYPE_NAME=release -else - printf "${COLOR_RED}%s${COLOR_RESET}\n" "Did not pass build type to build script: Debug, Release" - exit 1 -fi - -APK_PACKAGE_FOLDER=$(echo "$APK_PACKAGE_NAME" | sed 's/\./\//g') - -sed -i "s/DDNet/${APK_BASENAME}/g" settings.gradle - -sed -i "s/org.ddnet.client/${APK_PACKAGE_NAME}/g" build.gradle - -TW_KEY_NAME_ESCAPED=$(echo "$TW_KEY_NAME" | sed 's/\//\\\//g') -TW_KEY_PW_ESCAPED=$(echo "$TW_KEY_PW" | sed 's/\//\\\//g') -TW_KEY_ALIAS_ESCAPED=$(echo "$TW_KEY_ALIAS" | sed 's/\//\\\//g') - -sed -i "s/TW_KEY_NAME/${TW_KEY_NAME_ESCAPED}/g" build.gradle -sed -i "s/TW_KEY_PW/${TW_KEY_PW_ESCAPED}/g" build.gradle -sed -i "s/TW_KEY_ALIAS/${TW_KEY_ALIAS_ESCAPED}/g" build.gradle - -sed -i "s/TW_VERSION_CODE/${TW_VERSION_CODE}/g" build.gradle -sed -i "s/TW_VERSION_NAME/${TW_VERSION_NAME}/g" build.gradle - -sed -i "s/DDNet/${APK_BASENAME}/g" src/main/res/values/strings.xml - -sed -i "s/org.ddnet.client/${APK_PACKAGE_NAME}/g" src/main/res/xml/shortcuts.xml - -sed -i "s/\"DDNet\"/\"${APK_BASENAME}\"/g" src/main/AndroidManifest.xml -sed -i "s/org.ddnet.client/${APK_PACKAGE_NAME}/g" src/main/AndroidManifest.xml - -if [ "${APK_PACKAGE_FOLDER}" != "org/ddnet/client" ]; then - mv src/main/java/org/ddnet/client src/main/java/"${APK_PACKAGE_FOLDER}" -fi - -sed -i "s/org.ddnet.client/${APK_PACKAGE_NAME}/g" src/main/java/"${APK_PACKAGE_FOLDER}"/ClientActivity.java -sed -i "s/org.ddnet.client/${APK_PACKAGE_NAME}/g" src/main/java/"${APK_PACKAGE_FOLDER}"/ServerService.java -sed -i "s/org.ddnet.client/${APK_PACKAGE_NAME}/g" proguard-rules.pro - -# disable hid manager for now -sed -i "s/mHIDDeviceManager = HIDDeviceManager.acquire(this);/mHIDDeviceManager=null;/g" src/main/java/org/libsdl/app/SDLActivity.java - -if [[ "${APK_BUILD_TYPE}" == "Debug" ]]; then - sed -i "s/android.enableR8.fullMode=true/android.enableR8.fullMode=false/g" gradle.properties -fi - -function build_gradle() { - java "-Dorg.gradle.appname=Gradle" -classpath gradle-wrapper.jar org.gradle.wrapper.GradleWrapperMain --warning-mode all "$1" -} - -if [[ "${APK_BUILD_TYPE}" == "Debug" ]]; then - build_gradle builddebug - build_gradle assembleDebug -else - build_gradle buildrelease - build_gradle assembleRelease -fi -cp build/outputs/apk/"$RELEASE_TYPE_NAME"/"$APK_BASENAME"-"$RELEASE_TYPE_NAME".apk "$APK_BASENAME".apk - -if [[ "${APK_BUILD_TYPE}" == "Release" ]]; then - build_gradle bundleRelease - cp build/outputs/bundle/"$RELEASE_TYPE_NAME"/"$APK_BASENAME"-"$RELEASE_TYPE_NAME".aab "$APK_BASENAME".aab -fi diff --git a/scripts/android/files/gradle-wrapper.jar b/scripts/android/files/gradle-wrapper.jar deleted file mode 100644 index 7454180f2a..0000000000 Binary files a/scripts/android/files/gradle-wrapper.jar and /dev/null differ diff --git a/scripts/android/files/gradle-wrapper.properties b/scripts/android/files/gradle-wrapper.properties deleted file mode 100644 index a595206642..0000000000 --- a/scripts/android/files/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/scripts/android/files/gradle.properties b/scripts/android/files/gradle.properties deleted file mode 100644 index 815386e521..0000000000 --- a/scripts/android/files/gradle.properties +++ /dev/null @@ -1,22 +0,0 @@ -# Project-wide Gradle settings. -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx3536m -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app's APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true -# Automatically convert third-party libraries to use AndroidX -android.enableJetifier=true -# Kotlin code style for this project: "official" or "obsolete": -kotlin.code.style=official -android.enableR8.fullMode=true diff --git a/scripts/android/files/java/org/ddnet/client/ClientActivity.java b/scripts/android/files/java/org/ddnet/client/ClientActivity.java deleted file mode 100644 index e51d9c1b7f..0000000000 --- a/scripts/android/files/java/org/ddnet/client/ClientActivity.java +++ /dev/null @@ -1,133 +0,0 @@ -package org.ddnet.client; - -import android.app.NativeActivity; -import android.content.*; -import android.content.pm.ActivityInfo; -import android.os.*; - -import androidx.core.content.ContextCompat; - -import org.libsdl.app.SDLActivity; - -public class ClientActivity extends SDLActivity { - - private static final int COMMAND_RESTART_APP = SDLActivity.COMMAND_USER + 1; - - private String[] launchArguments = new String[0]; - - private final Object serverServiceMonitor = new Object(); - private Messenger serverServiceMessenger = null; - private final ServiceConnection serverServiceConnection = new ServiceConnection() { - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - synchronized(serverServiceMonitor) { - serverServiceMessenger = new Messenger(service); - } - } - - @Override - public void onServiceDisconnected(ComponentName name) { - synchronized(serverServiceMonitor) { - serverServiceMessenger = null; - } - } - }; - - @Override - protected String[] getLibraries() { - return new String[] { - "DDNet", - }; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); - - Intent intent = getIntent(); - if(intent != null) { - String gfxBackend = intent.getStringExtra("gfx-backend"); - if(gfxBackend != null) { - if(gfxBackend.equals("Vulkan")) { - launchArguments = new String[] {"gfx_backend Vulkan"}; - } else if(gfxBackend.equals("GLES")) { - launchArguments = new String[] {"gfx_backend GLES"}; - } - } - } - - super.onCreate(savedInstanceState); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - synchronized(serverServiceMonitor) { - if(serverServiceMessenger != null) { - unbindService(serverServiceConnection); - } - } - } - - @Override - protected String[] getArguments() { - return launchArguments; - } - - @Override - protected boolean onUnhandledMessage(int command, Object param) { - switch(command) { - case COMMAND_RESTART_APP: - restartApp(); - return true; - } - return false; - } - - private void restartApp() { - Intent restartIntent = - Intent.makeRestartActivityTask( - getPackageManager().getLaunchIntentForPackage( - getPackageName() - ).getComponent() - ); - restartIntent.setPackage(getPackageName()); - startActivity(restartIntent); - } - - // Called from native code, see android_main.cpp - public void startServer() { - synchronized(serverServiceMonitor) { - if(serverServiceMessenger != null) { - return; - } - Intent startIntent = new Intent(this, ServerService.class); - ContextCompat.startForegroundService(this, startIntent); - bindService(startIntent, serverServiceConnection, 0); - } - } - - // Called from native code, see android_main.cpp - public void executeCommand(String command) { - synchronized(serverServiceMonitor) { - if(serverServiceMessenger == null) { - return; - } - try { - Message message = Message.obtain(null, ServerService.MESSAGE_CODE_EXECUTE_COMMAND, 0, 0); - message.getData().putString(ServerService.MESSAGE_EXTRA_COMMAND, command); - serverServiceMessenger.send(message); - } catch (RemoteException e) { - // Connection broken - unbindService(serverServiceConnection); - } - } - } - - // Called from native code, see android_main.cpp - public boolean isServerRunning() { - synchronized(serverServiceMonitor) { - return serverServiceMessenger != null; - } - } -} diff --git a/scripts/android/files/java/org/ddnet/client/ServerService.java b/scripts/android/files/java/org/ddnet/client/ServerService.java deleted file mode 100644 index 00b42e903a..0000000000 --- a/scripts/android/files/java/org/ddnet/client/ServerService.java +++ /dev/null @@ -1,310 +0,0 @@ -package org.ddnet.client; - -import java.io.File; - -import androidx.core.app.NotificationCompat; -import androidx.core.app.RemoteInput; -import androidx.core.app.ServiceCompat; - -import android.app.*; -import android.content.*; -import android.content.pm.ServiceInfo; -import android.os.*; -import android.util.*; -import android.widget.Toast; - -public class ServerService extends Service { - - private static final String NOTIFICATION_CHANNEL_ID = "LOCAL_SERVER_CHANNEL_ID"; - private static final int NOTIFICATION_ID = 1; - - public static final int MESSAGE_CODE_EXECUTE_COMMAND = 1; - public static final String MESSAGE_EXTRA_COMMAND = "command"; - - public static final String INTENT_ACTION_EXECUTE = "execute"; - public static final String INTENT_EXTRA_COMMAND = "command"; - private static final String KEY_EXECUTE_TEXT_REPLY = "execute-command-reply"; - - static { - System.loadLibrary("DDNet-Server"); - } - - private class IncomingHandler extends Handler { - - IncomingHandler(Context context) { - super(context.getMainLooper()); - } - - @Override - public void handleMessage(Message message) { - switch(message.what) { - case MESSAGE_CODE_EXECUTE_COMMAND: - String command = message.getData().getString(MESSAGE_EXTRA_COMMAND); - if(command != null) { - executeCommand(command); - } - break; - default: - super.handleMessage(message); - break; - } - } - } - - private Messenger messenger; - private NotificationManager notificationManager; - private NativeServerThread thread; - private boolean stopping = false; - - @Override - public void onCreate() { - super.onCreate(); - - notificationManager = getSystemService(NotificationManager.class); - - createNotificationChannel(); - - ServiceCompat.startForeground( - this, - NOTIFICATION_ID, - createRunningNotification(), - ServiceInfo.FOREGROUND_SERVICE_TYPE_MANIFEST - ); - - thread = new NativeServerThread(this); - thread.start(); - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - if(intent != null) { - String action = intent.getAction(); - if(INTENT_ACTION_EXECUTE.equals(action)) { - Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); - if(remoteInput != null) { - CharSequence remoteCommand = remoteInput.getCharSequence(KEY_EXECUTE_TEXT_REPLY); - if(remoteCommand != null) { - executeCommand(remoteCommand.toString()); - } - if(!stopping) { - // Need to send the notification again to acknowledge that we got the remote input, - // otherwise the remote input will not be completed. - notificationManager.notify(NOTIFICATION_ID, createRunningNotification()); - } - } else { - String command = intent.getStringExtra(INTENT_EXTRA_COMMAND); - if(command != null) { - executeCommand(command); - } - } - } - } - return START_NOT_STICKY; - } - - public void onDestroy() { - super.onDestroy(); - executeCommand("shutdown"); - stopForeground(0); - if(thread != null) { - try { - thread.join(2500); - if(thread.isAlive()) { - // Native server is not reacting to the shutdown command, force stop. - System.exit(0); - } - } catch (InterruptedException e) { - } - thread = null; - } - } - - @Override - public IBinder onBind(Intent intent) { - messenger = new Messenger(new IncomingHandler(this)); - return messenger.getBinder(); - } - - @Override - public boolean onUnbind(Intent intent) { - // Ensure server is stopped when the client is unbound from this service, - // which covers the case where the client activity is killed while in the - // background, which is otherwise not possible to detect. - executeCommand("shutdown"); - return false; - } - - private void createNotificationChannel() { - if(Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { - return; - } - NotificationChannel channel = new NotificationChannel( - NOTIFICATION_CHANNEL_ID, - getString(R.string.server_name), - NotificationManager.IMPORTANCE_DEFAULT - ); - channel.setDescription(getString(R.string.server_notification_channel_description)); - notificationManager.createNotificationChannel(channel); - } - - private Notification createRunningNotification() { - Intent activityIntent = new Intent(this, ClientActivity.class); - - PendingIntent activityActionIntent = PendingIntent.getActivity( - this, - 0, // request code (unused) - activityIntent, - PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE - ); - - Intent stopIntent = new Intent(this, ServerService.class); - stopIntent.setAction(INTENT_ACTION_EXECUTE); - stopIntent.putExtra(INTENT_EXTRA_COMMAND, "shutdown"); - - PendingIntent stopActionIntent = PendingIntent.getService( - this, - 0, // request code (unused) - stopIntent, - PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE - ); - - NotificationCompat.Action stopAction = - new NotificationCompat.Action.Builder( - android.R.drawable.ic_menu_view, - getString(R.string.server_notification_action_stop), - stopActionIntent - ).setAuthenticationRequired(true) // not allowed from lock screen - .build(); - - Intent executeCommandIntent = new Intent(this, ServerService.class); - executeCommandIntent.setAction(INTENT_ACTION_EXECUTE); - - PendingIntent executeCommandActionIntent = PendingIntent.getService( - this, - 0, // request code (unused) - executeCommandIntent, - PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE - ); - - RemoteInput remoteInput = - new RemoteInput.Builder(KEY_EXECUTE_TEXT_REPLY) - .setLabel(getString(R.string.server_notification_action_run_command)) - .build(); - - NotificationCompat.Action executeAction = - new NotificationCompat.Action.Builder( - android.R.drawable.ic_menu_view, - getString(R.string.server_notification_action_run_command), - executeCommandActionIntent - ).setAuthenticationRequired(true) // not allowed from lock screen - .addRemoteInput(remoteInput) - .build(); - - // TODO: Update the notification text (setContentText) while server is running: - // show our LAN IP, show current player count, show last executed command - return new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID) - .setOngoing(true) - .setAutoCancel(false) - .setContentTitle(getString(R.string.server_notification_description_default)) - .setSmallIcon(R.mipmap.ic_launcher) - .setPriority(NotificationCompat.PRIORITY_DEFAULT) - .setAllowSystemGeneratedContextualActions(false) - .setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE) - .setContentIntent(activityActionIntent) // clicking on the notification opens the activity - .setDeleteIntent(stopActionIntent) // deleting the notification will also stop the server - .addAction(stopAction) - .addAction(executeAction) - .build(); - } - - private Notification createStoppingNotification() { - return new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID) - .setOngoing(true) - .setContentTitle(getString(R.string.server_notification_description_stopping)) - .setSmallIcon(R.mipmap.ic_launcher) - .setPriority(NotificationCompat.PRIORITY_DEFAULT) - .setAllowSystemGeneratedContextualActions(false) - .build(); - } - - private void executeCommand(String command) { - if(thread == null) { - return; - } - // Detect simple case where the server is being stopped to update the notification - if("shutdown".equalsIgnoreCase(command)) { - if(stopping) { - return; - } - stopping = true; - notificationManager.notify(NOTIFICATION_ID, createStoppingNotification()); - } - NativeServer.executeCommand(command); - } -} - -/** - * Thread that runs the native server's main function. This thread is necessary so - * we don't block the service's main thread which is responsible for handling the - * service's lifecycle. - */ -class NativeServerThread extends Thread { - - private final Context applicationContext; - - public NativeServerThread(Context context) { - this.applicationContext = context.getApplicationContext(); - } - - @Override - public void run() { - File workingDirectory = applicationContext.getExternalFilesDir(null); - if(workingDirectory == null) { - new Handler(applicationContext.getMainLooper()).post(() -> { - Toast.makeText(applicationContext, R.string.server_error_external_files_inaccessible, Toast.LENGTH_LONG).show(); - terminateProcess(); - }); - return; - } - - int Result = NativeServer.runServer(workingDirectory.getAbsolutePath()); - new Handler(applicationContext.getMainLooper()).post(() -> { - if(Result != 0) { - Toast.makeText(applicationContext, applicationContext.getString(R.string.server_error_exit_code, Result), Toast.LENGTH_LONG).show(); - } - terminateProcess(); - }); - } - - private static void terminateProcess() { - // Forcefully terminate the entire process, to ensure that static variables will - // be initialized correctly when the server is started again after being stopped. - System.exit(0); - } -} - -/** - * Wrapper for functions that are implemented using JNI in engine/server/main.cpp. - */ -class NativeServer { - - private NativeServer() { - throw new AssertionError(); - } - - /** - * Runs the native server main function in the current thread and returns the - * exit code on completion. - * - * @param workingDirectory The working directory for the server, which must be the - * external storage directory of the app and already contains all data files. - */ - public static native int runServer(String workingDirectory); - - /** - * Adds a command to the execution queue of the native server. - * - * @param command The command to add to the queue. - */ - public static native void executeCommand(String command); -} diff --git a/scripts/android/files/proguard-rules.pro b/scripts/android/files/proguard-rules.pro deleted file mode 100644 index 4f105e51fd..0000000000 --- a/scripts/android/files/proguard-rules.pro +++ /dev/null @@ -1,35 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. --keepattributes SourceFile,LineNumberTable - --keepclassmembers, allowoptimization public class org.ddnet.client.* { - *; -} - --keepclassmembers, allowoptimization public class org.libsdl.app.* { - *; -} - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile -############################################ -## OUR -############################################ -############################################ -## OTHER -############################################ diff --git a/scripts/android/files/res/values/strings.xml b/scripts/android/files/res/values/strings.xml deleted file mode 100644 index f8021c6d64..0000000000 --- a/scripts/android/files/res/values/strings.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - DDNet - Play (Vulkan) - Play (OpenGL ES) - DDNet-Server - DDNet-Server is running… - DDNet-Server is stopping… - Stop - Run command - Notification to control the local DDNet-Server while it\'s running. - Error starting DDNet-Server: could not access external files directory. - DDNet-Server stopped with error code \'%1$d\'. - diff --git a/scripts/android/files/res/xml/shortcuts.xml b/scripts/android/files/res/xml/shortcuts.xml deleted file mode 100644 index c2ebe2357d..0000000000 --- a/scripts/android/files/res/xml/shortcuts.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - diff --git a/scripts/android/files/settings.gradle b/scripts/android/files/settings.gradle deleted file mode 100644 index bf5183cb21..0000000000 --- a/scripts/android/files/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name='DDNet' diff --git a/scripts/check_dilate.sh b/scripts/check_dilate.sh deleted file mode 100755 index 63672d07e3..0000000000 --- a/scripts/check_dilate.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -#set -x -result= - -dil_path=$1 - -result=$(find "$2" -iname '*.png' -print0 | while IFS= read -r -d $'\0' file; do - new_file=$(mktemp --tmpdir "$(basename "$file" .png).XXX.png") - cp "$file" "$new_file" - convert "$new_file" "${new_file}_old.bmp" > /dev/null - "${dil_path}"/dilate "$new_file" > /dev/null - convert "$new_file" "${new_file}_new.bmp" > /dev/null - orig_hash=$(identify -quiet -format "%#" "${new_file}_old.bmp") - new_hash=$(identify -quiet -format "%#" "${new_file}_new.bmp") - rm "$new_file" - rm "${new_file}_old.bmp" - rm "${new_file}_new.bmp" - if [ "$orig_hash" != "$new_hash" ]; then - echo "$file is not dilated" - fi -done) - -if [[ "$result" != "" ]]; then - echo -n "$result" - exit 1 -fi - -exit 0 diff --git a/scripts/checksum.py b/scripts/checksum.py deleted file mode 100644 index e16af41506..0000000000 --- a/scripts/checksum.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python3 -import argparse -import hashlib -import os - -os.chdir(os.path.dirname(__file__) + "/..") - -def hash_bytes(b): - return f"0x{hashlib.sha256(b).hexdigest()[:8]}" - -def hash_file(filename): - with open(filename, "rb") as f: - return hash_bytes(f.read()) - -def main(): - p = argparse.ArgumentParser(description="Checksums source files") - p.add_argument("list_file", metavar="LIST_FILE", help="File listing all the files to hash") - p.add_argument("extra_file", metavar="EXTRA_FILE", help="File containing extra strings to be hashed") - args = p.parse_args() - - with open(args.list_file, encoding="utf-8") as f: - files = f.read().splitlines() - with open(args.extra_file, "rb") as f: - extra = f.read().splitlines() - hashes_files = [hash_file(file) for file in files] - hashes_extra = [hash_bytes(line) for line in extra] - hashes = hashes_files + hashes_extra - print("""\ -#include - -void CChecksumData::InitFiles() -{ -""", end="") - print(f"\tm_NumFiles = {len(hashes_files)};") - print(f"\tm_NumExtra = {len(hashes_extra)};") - for i, h in enumerate(hashes): - print(f"\tm_aFiles[0x{i:03x}] = {h};") - print("}") - -if __name__ == "__main__": - main() diff --git a/scripts/compile_libs/cmake_lib_compile.sh b/scripts/compile_libs/cmake_lib_compile.sh deleted file mode 100755 index 72c3ee741d..0000000000 --- a/scripts/compile_libs/cmake_lib_compile.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/bash - -ANDROID_HOME=~/Android/Sdk -ANDROID_NDK_HOME="$(find "$ANDROID_HOME/ndk" -maxdepth 1 | sort -n | tail -1)" -export ANDROID_NDK_HOME - -MAKEFLAGS=-j$(nproc) -export MAKEFLAGS - -if [[ "${2}" == "webasm" ]]; then - COMPILEFLAGS="-pthread -O3 -g -s USE_PTHREADS=1" - LINKFLAGS="-pthread -O3 -g -s USE_PTHREADS=1 -s ASYNCIFY=1" -fi - -COMPILEFLAGS=$3 -LINKFLAGS=$4 - -function compile_source_android() { - cmake \ - -H. \ - -G "Unix Makefiles" \ - -DCMAKE_BUILD_TYPE=Release \ - -DANDROID_PLATFORM="android-$1" \ - -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake" \ - -DANDROID_NDK="$ANDROID_NDK_HOME" \ - -DANDROID_ABI="${3}" \ - -DANDROID_ARM_NEON=TRUE \ - -DCMAKE_ANDROID_NDK="$ANDROID_NDK_HOME" \ - -DCMAKE_SYSTEM_NAME=Android \ - -DCMAKE_SYSTEM_VERSION="$1" \ - -DCMAKE_ANDROID_ARCH_ABI="${3}" \ - -DCMAKE_C_FLAGS="$COMPILEFLAGS" -DCMAKE_CXX_FLAGS="$COMPILEFLAGS" -DCMAKE_CXX_FLAGS_RELEASE="$COMPILEFLAGS" -DCMAKE_C_FLAGS_RELEASE="$COMPILEFLAGS" \ - -DCMAKE_SHARED_LINKER_FLAGS="$LINKFLAGS" -DCMAKE_SHARED_LINKER_FLAGS_RELEASE="$LINKFLAGS" \ - -B"$2" \ - -DBUILD_SHARED_LIBS=OFF \ - -DHIDAPI_SKIP_LIBUSB=TRUE \ - -DCURL_USE_OPENSSL=ON \ - -DSDL_HIDAPI=OFF \ - -DOP_DISABLE_HTTP=ON \ - -DOP_DISABLE_EXAMPLES=ON \ - -DOP_DISABLE_DOCS=ON \ - -DOPENSSL_ROOT_DIR="$PWD"/../openssl/"$2" \ - -DOPENSSL_CRYPTO_LIBRARY="$PWD"/../openssl/"$2"/libcrypto.a \ - -DOPENSSL_SSL_LIBRARY="$PWD"/../openssl/"$2"/libssl.a \ - -DOPENSSL_INCLUDE_DIR="${PWD}/../openssl/include;${PWD}/../openssl/${2}/include" - ( - cd "$2" || exit 1 - cmake --build . - ) -} - -function compile_source_webasm() { - emcmake cmake \ - -H. \ - -DCMAKE_BUILD_TYPE=Release \ - -B"$2" \ - -DSDL_STATIC=TRUE \ - -DFT_DISABLE_HARFBUZZ=ON \ - -DFT_DISABLE_BZIP2=ON \ - -DFT_DISABLE_BROTLI=ON \ - -DFT_REQUIRE_ZLIB=TRUE \ - -DCMAKE_C_FLAGS="$COMPILEFLAGS -DGLEW_STATIC" -DCMAKE_CXX_FLAGS="$COMPILEFLAGS" -DCMAKE_CXX_FLAGS_RELEASE="$COMPILEFLAGS" -DCMAKE_C_FLAGS_RELEASE="$COMPILEFLAGS" \ - -DCMAKE_SHARED_LINKER_FLAGS="$LINKFLAGS" -DCMAKE_SHARED_LINKER_FLAGS_RELEASE="$LINKFLAGS" \ - -DSDL_PTHREADS=ON -DSDL_THREADS=ON \ - -DCURL_USE_OPENSSL=ON \ - -DOPUS_HARDENING=OFF \ - -DOPUS_STACK_PROTECTOR=OFF \ - -DOPENSSL_ROOT_DIR="$PWD"/../openssl/"$2" \ - -DOPENSSL_CRYPTO_LIBRARY="$PWD"/../openssl/"$2"/libcrypto.a \ - -DOPENSSL_SSL_LIBRARY="$PWD"/../openssl/"$2"/libssl.a \ - -DOPENSSL_INCLUDE_DIR="${PWD}/../openssl/include;${PWD}/../openssl/${2}/include" \ - -DZLIB_LIBRARY="${PWD}/../zlib/${2}/libz.a" -DZLIB_INCLUDE_DIR="${PWD}/../zlib;${PWD}/../zlib/${2}" - ( - cd "$2" || exit 1 - cmake --build . - ) -} - -if [[ "${2}" == "android" ]]; then - compile_source_android "$1" build_android_arm armeabi-v7a & - compile_source_android "$1" build_android_arm64 arm64-v8a & - compile_source_android "$1" build_android_x86 x86 & - compile_source_android "$1" build_android_x86_64 x86_64 & -elif [[ "${2}" == "webasm" ]]; then - sed -i "s/include(CheckSizes)//g" CMakeLists.txt - compile_source_webasm "$1" build_webasm_wasm wasm & -fi - -wait diff --git a/scripts/compile_libs/gen_libs.sh b/scripts/compile_libs/gen_libs.sh deleted file mode 100755 index 9ba0a460ba..0000000000 --- a/scripts/compile_libs/gen_libs.sh +++ /dev/null @@ -1,225 +0,0 @@ -#!/bin/bash - -CURDIR="$PWD" -if [ -z ${1+x} ]; then - echo "Give a destination path where to run this script, please choose a path other than in the source directory" - exit 1 -fi - -if [ -z ${2+x} ]; then - echo "Specify the target system: android, linux, window, webasm" - exit 1 -fi - -OS_NAME=$2 - -COMPILEFLAGS="-fPIC" -LINKFLAGS="-fPIC" -if [[ "${OS_NAME}" == "webasm" ]]; then - COMPILEFLAGS="-pthread -O3 -g -s USE_PTHREADS=1" - LINKFLAGS="-pthread -O3 -g -s USE_PTHREADS=1 -s ASYNCIFY=1 -s WASM=1" -fi - -COMP_HAS_ARM32=0 -COMP_HAS_ARM64=0 -COMP_HAS_x86=0 -COMP_HAS_x64=0 -COMP_HAS_WEBASM=0 - -if [[ "${OS_NAME}" == "android" ]]; then - COMP_HAS_ARM32=1 - COMP_HAS_ARM64=1 - COMP_HAS_x86=1 - COMP_HAS_x64=1 -elif [[ "${OS_NAME}" == "linux" ]]; then - COMP_HAS_x64=1 -elif [[ "${OS_NAME}" == "windows" ]]; then - COMP_HAS_x86=1 - COMP_HAS_x64=1 -elif [[ "${OS_NAME}" == "webasm" ]]; then - COMP_HAS_WEBASM=1 -else - echo "Specify the target system: android, linux, window, webasm" - exit 1 -fi - -mkdir -p "$1" -cd "$1" || exit 1 - -# ANDROID_API_LEVEL must specify the _minimum_ supported SDK version, otherwise this will cause linking errors at launch -ANDROID_API_LEVEL=24 - -function build_cmake_lib() { - if [ ! -d "${1}" ]; then - if [ -z ${3+x} ]; then - git clone "${2}" "${1}" - else - git clone --single-branch --branch "${3}" "${2}" "${1}" - fi - fi - ( - cd "${1}" || exit 1 - cp "${CURDIR}"/scripts/compile_libs/cmake_lib_compile.sh cmake_lib_compile.sh - ./cmake_lib_compile.sh "$ANDROID_API_LEVEL" "$OS_NAME" "$COMPILEFLAGS" "$LINKFLAGS" - ) -} - -mkdir -p compile_libs -cd compile_libs || exit 1 - -# start with openssl -( - if [ ! -d "openssl" ]; then - git clone https://github.com/openssl/openssl openssl - fi - ( - cd openssl || exit 1 - cp "${CURDIR}"/scripts/compile_libs/make_lib_openssl.sh make_lib_openssl.sh - ./make_lib_openssl.sh "$ANDROID_API_LEVEL" "$OS_NAME" "$COMPILEFLAGS" "$LINKFLAGS" - ) -) - -build_cmake_lib zlib https://github.com/madler/zlib -build_cmake_lib png https://github.com/glennrp/libpng -build_cmake_lib curl https://github.com/curl/curl "curl-8_8_0" -build_cmake_lib freetype2 https://gitlab.freedesktop.org/freetype/freetype -build_cmake_lib sdl https://github.com/libsdl-org/SDL SDL2 -build_cmake_lib ogg https://github.com/xiph/ogg -build_cmake_lib opus https://github.com/xiph/opus - -( - _WAS_THERE_OPUSFILE=1 - if [ ! -d "opusfile" ]; then - git clone https://github.com/xiph/opusfile opusfile - _WAS_THERE_OPUSFILE=0 - fi - cd opusfile || exit 1 - if [[ "$_WAS_THERE_OPUSFILE" == 0 ]]; then - ./autogen.sh - fi - cp "${CURDIR}"/scripts/compile_libs/make_lib_opusfile.sh make_lib_opusfile.sh - ./make_lib_opusfile.sh "$ANDROID_API_LEVEL" "$OS_NAME" "$COMPILEFLAGS" "$LINKFLAGS" -) - -# SQLite, just download and built by hand -if [ ! -d "sqlite3" ]; then - wget https://www.sqlite.org/2021/sqlite-amalgamation-3360000.zip - 7z e sqlite-amalgamation-3360000.zip -osqlite3 -fi - -( - cd sqlite3 || exit 1 - cp "${CURDIR}"/scripts/compile_libs/make_lib_sqlite3.sh make_lib_sqlite3.sh - ./make_lib_sqlite3.sh "$ANDROID_API_LEVEL" "$OS_NAME" "$COMPILEFLAGS" "$LINKFLAGS" -) - -cd .. -mkdir -p ddnet-libs - -function copy_arches_for_lib() { - if [[ "$COMP_HAS_ARM32" == "1" ]]; then - ${1} arm arm - fi - if [[ "$COMP_HAS_ARM64" == "1" ]]; then - ${1} arm64 arm64 - fi - if [[ "$COMP_HAS_x86" == "1" ]]; then - ${1} x86 32 - fi - if [[ "$COMP_HAS_x64" == "1" ]]; then - ${1} x86_64 64 - fi - if [[ "$COMP_HAS_WEBASM" == "1" ]]; then - ${1} wasm wasm - fi -} - -function _copy_curl() { - mkdir -p ddnet-libs/curl/"$OS_NAME"/lib"$2" - cp compile_libs/curl/build_"$OS_NAME"_"$1"/lib/libcurl.a ddnet-libs/curl/"$OS_NAME"/lib"$2"/libcurl.a -} -copy_arches_for_lib _copy_curl - -function _copy_freetype2() { - mkdir -p ddnet-libs/freetype/"$OS_NAME"/lib"$2" - cp compile_libs/freetype2/build_"$OS_NAME"_"$1"/libfreetype.a ddnet-libs/freetype/"$OS_NAME"/lib"$2"/libfreetype.a -} -copy_arches_for_lib _copy_freetype2 - -function _copy_sdl() { - mkdir -p ddnet-libs/sdl/"$OS_NAME"/lib"$2" - cp compile_libs/sdl/build_"$OS_NAME"_"$1"/libSDL2.a ddnet-libs/sdl/"$OS_NAME"/lib"$2"/libSDL2.a - cp compile_libs/sdl/build_"$OS_NAME"_"$1"/libSDL2main.a ddnet-libs/sdl/"$OS_NAME"/lib"$2"/libSDL2main.a - mkdir -p ddnet-libs/sdl/include/"$OS_NAME" - cp -R compile_libs/sdl/include/* ddnet-libs/sdl/include/"$OS_NAME" -} -copy_arches_for_lib _copy_sdl - -# copy java code from SDL2 -if [[ "$OS_NAME" == "android" ]]; then - rm -R ddnet-libs/sdl/java - mkdir -p ddnet-libs/sdl/java - cp -R compile_libs/sdl/android-project/app/src/main/java/org ddnet-libs/sdl/java/ -fi - -function _copy_ogg() { - mkdir -p ddnet-libs/opus/"$OS_NAME"/lib"$2" - cp compile_libs/ogg/build_"$OS_NAME"_"$1"/libogg.a ddnet-libs/opus/"$OS_NAME"/lib"$2"/libogg.a -} -copy_arches_for_lib _copy_ogg - -function _copy_opus() { - mkdir -p ddnet-libs/opus/"$OS_NAME"/lib"$2" - cp compile_libs/opus/build_"$OS_NAME"_"$1"/libopus.a ddnet-libs/opus/"$OS_NAME"/lib"$2"/libopus.a -} -copy_arches_for_lib _copy_opus - -function _copy_opusfile() { - mkdir -p ddnet-libs/opus/"$OS_NAME"/lib"$2" - cp compile_libs/opusfile/build_"$OS_NAME"_"$1"/libopusfile.a ddnet-libs/opus/"$OS_NAME"/lib"$2"/libopusfile.a -} -copy_arches_for_lib _copy_opusfile - -function _copy_sqlite3() { - mkdir -p ddnet-libs/sqlite3/"$OS_NAME"/lib"$2" - cp compile_libs/sqlite3/build_"$OS_NAME"_"$1"/sqlite3.a ddnet-libs/sqlite3/"$OS_NAME"/lib"$2"/libsqlite3.a -} -copy_arches_for_lib _copy_sqlite3 - -function _copy_openssl() { - mkdir -p ddnet-libs/openssl/"$OS_NAME"/lib"$2" - mkdir -p ddnet-libs/openssl/include - mkdir -p ddnet-libs/openssl/include/"$OS_NAME" - cp compile_libs/openssl/build_"$OS_NAME"_"$1"/libcrypto.a ddnet-libs/openssl/"$OS_NAME"/lib"$2"/libcrypto.a - cp compile_libs/openssl/build_"$OS_NAME"_"$1"/libssl.a ddnet-libs/openssl/"$OS_NAME"/lib"$2"/libssl.a - cp -R compile_libs/openssl/build_"$OS_NAME"_"$1"/include/* ddnet-libs/openssl/include/"$OS_NAME" - cp -R compile_libs/openssl/include/* ddnet-libs/openssl/include -} -copy_arches_for_lib _copy_openssl - -function _copy_zlib() { - # copy headers - ( - cd compile_libs/zlib || exit 1 - find . -maxdepth 1 -iname '*.h' -print0 | while IFS= read -r -d $'\0' file; do - mkdir -p ../../ddnet-libs/zlib/include/"$(dirname "$file")" - cp "$file" ../../ddnet-libs/zlib/include/"$(dirname "$file")" - done - - cd build_"$OS_NAME"_"$1" || exit 1 - find . -maxdepth 1 -iname '*.h' -print0 | while IFS= read -r -d $'\0' file; do - mkdir -p ../../../ddnet-libs/zlib/include/"$OS_NAME"/"$(dirname "$file")" - cp "$file" ../../../ddnet-libs/zlib/include/"$OS_NAME"/"$(dirname "$file")" - done - ) - - mkdir -p ddnet-libs/zlib/"$OS_NAME"/lib"$2" - cp compile_libs/zlib/build_"$OS_NAME"_"$1"/libz.a ddnet-libs/zlib/"$OS_NAME"/lib"$2"/libz.a -} -copy_arches_for_lib _copy_zlib - -function _copy_png() { - mkdir -p ddnet-libs/png/"$OS_NAME"/lib"$2" - cp compile_libs/png/build_"$OS_NAME"_"$1"/libpng16.a ddnet-libs/png/"$OS_NAME"/lib"$2"/libpng16.a -} -copy_arches_for_lib _copy_png diff --git a/scripts/compile_libs/make_lib_openssl.sh b/scripts/compile_libs/make_lib_openssl.sh deleted file mode 100755 index c634064a0c..0000000000 --- a/scripts/compile_libs/make_lib_openssl.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash - -ANDROID_HOME=~/Android/Sdk -ANDROID_NDK="$(find "$ANDROID_HOME/ndk" -maxdepth 1 | sort -n | tail -1)" - -export MAKEFLAGS=-j32 - -export CXXFLAGS="$3" -export CFLAGS="$3" -export CPPFLAGS="$4" -export LDFLAGS="$4" - -export ANDROID_NDK_ROOT=$ANDROID_NDK -PATH=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH - -function buid_openssl() { - _EXISTS_PROJECT=0 - if [ -d "$1" ]; then - _EXISTS_PROJECT=1 - else - mkdir "$1" - fi - ( - cd "$1" || exit 1 - if [[ "$_EXISTS_PROJECT" == "0" ]]; then - if [[ "${4}" == "webasm" ]]; then - emconfigure ../Configure "$2" -no-tests -no-asm -static -no-afalgeng -DOPENSSL_SYS_NETWARE -DSIG_DFL=0 -DSIG_IGN=0 -DHAVE_FORK=0 -DOPENSSL_NO_AFALGENG=1 --with-rand-seed=getrandom - - sed -i 's|^CROSS_COMPILE.*$|CROSS_COMPILE=|g' Makefile - else - ../Configure "$2" no-asm no-shared - fi - fi - ${5} make $MAKEFLAGS build_generated - ${5} make $MAKEFLAGS libcrypto.a - ${5} make $MAKEFLAGS libssl.a - cd .. - ) -} - -if [[ "${2}" == "android" ]]; then - buid_openssl build_"$2"_arm android-arm "$1" "$2" "" - buid_openssl build_"$2"_arm64 android-arm64 "$1" "$2" "" - buid_openssl build_"$2"_x86 android-x86 "$1" "$2" "" - buid_openssl build_"$2"_x86_64 android-x86_64 "$1" "$2" "" -elif [[ "${2}" == "webasm" ]]; then - buid_openssl build_"$2"_wasm linux-generic64 "$1" "$2" emmake -fi diff --git a/scripts/compile_libs/make_lib_opusfile.sh b/scripts/compile_libs/make_lib_opusfile.sh deleted file mode 100755 index 09e11009c6..0000000000 --- a/scripts/compile_libs/make_lib_opusfile.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/bash - -ANDROID_HOME=~/Android/Sdk -ANDROID_NDK="$(find "$ANDROID_HOME/ndk" -maxdepth 1 | sort -n | tail -1)" - -export MAKEFLAGS=-j32 - -export CXXFLAGS="$3" -export CFLAGS="$3" -export CPPFLAGS="$4" -export LDFLAGS="$4" - -export ANDROID_NDK_ROOT="$ANDROID_NDK" - -function make_opusfile() { - _EXISTS_PROJECT=0 - if [ -d "$1" ]; then - _EXISTS_PROJECT=1 - else - mkdir "$1" - fi - ( - cd "$1" || exit 1 - if [[ "$_EXISTS_PROJECT" == 0 ]]; then - #not nice but doesn't matter - cp -R ../../ogg/include . - cp -R ../../opus/include . - cp -R ../../ogg/"$2"/include/ogg/* include/ogg/ - cp ../../ogg/"$2"/libogg.a libogg.a - cp ../../opus/"$2"/libopus.a libopus.a - fi - - TMP_COMPILER="" - TMP_AR="" - if [[ "${5}" == "android" ]]; then - TMP_COMPILER="$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin/$3$4-clang" - TMP_AR="$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar" - elif [[ "${5}" == "webasm" ]]; then - TMP_COMPILER="emcc" - TMP_AR="emar" - fi - - ${TMP_COMPILER} \ - -c \ - -fPIC \ - -I"${PWD}"/../include \ - -I"${PWD}"/include \ - ../src/opusfile.c \ - ../src/info.c \ - ../src/internal.c - ${TMP_COMPILER} \ - -c \ - -fPIC \ - -I"${PWD}"/../include \ - -I"${PWD}"/include \ - -include stdio.h \ - ../src/stream.c - ${TMP_AR} \ - rvs \ - libopusfile.a \ - opusfile.o \ - info.o \ - stream.o \ - internal.o - ) -} - -function compile_all_opusfile() { - if [[ "${2}" == "android" ]]; then - make_opusfile build_"$2"_arm build_"$2"_arm armv7a-linux-androideabi "$1" "$2" - make_opusfile build_"$2"_arm64 build_"$2"_arm64 aarch64-linux-android "$1" "$2" - make_opusfile build_"$2"_x86 build_"$2"_x86 i686-linux-android "$1" "$2" - make_opusfile build_"$2"_x86_64 build_"$2"_x86_64 x86_64-linux-android "$1" "$2" - elif [[ "${2}" == "webasm" ]]; then - make_opusfile build_"$2"_wasm build_"$2"_wasm "" "$1" "$2" - fi -} - -compile_all_opusfile "$1" "$2" diff --git a/scripts/compile_libs/make_lib_sqlite3.sh b/scripts/compile_libs/make_lib_sqlite3.sh deleted file mode 100755 index 82fcb00e8d..0000000000 --- a/scripts/compile_libs/make_lib_sqlite3.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/bash - -ANDROID_HOME=~/Android/Sdk -ANDROID_NDK="$(find "$ANDROID_HOME/ndk" -maxdepth 1 | sort -n | tail -1)" - -export MAKEFLAGS=-j32 - -export CXXFLAGS="$3" -export CFLAGS="$3" -export CPPFLAGS="$4" -LINKER_FLAGS="$4" - -export ANDROID_NDK_ROOT="$ANDROID_NDK" -PATH="$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH" -_LD_LIBRARY_PATH=".:$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$LD_LIBRARY_PATH" - -function make_sqlite3() { - ( - mkdir -p "$1" - cd "$1" || exit 1 - - TMP_COMPILER="" - TMP_AR="" - if [[ "${5}" == "android" ]]; then - TMP_COMPILER="$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin/$3$4-clang" - TMP_AR="$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar" - elif [[ "${5}" == "webasm" ]]; then - TMP_COMPILER="emcc" - TMP_AR="emar" - fi - - LDFLAGS="${LINKER_FLAGS} -L./" \ - LD_LIBRARY_PATH="$_LD_LIBRARY_PATH" \ - ${TMP_COMPILER} \ - -c \ - -fPIC \ - -DSQLITE_ENABLE_ATOMIC_WRITE=1 \ - -DSQLITE_ENABLE_BATCH_ATOMIC_WRITE=1 \ - -DSQLITE_ENABLE_MULTITHREADED_CHECKS=1 \ - -DSQLITE_THREADSAFE=1 \ - ../sqlite3.c \ - -o sqlite3.o - - LDFLAGS="${LINKER_FLAGS} -L./" \ - LD_LIBRARY_PATH="$_LD_LIBRARY_PATH" \ - ${TMP_AR} \ - rvs \ - sqlite3.a \ - sqlite3.o - ) -} - -function compile_all_sqlite3() { - if [[ "${2}" == "android" ]]; then - make_sqlite3 build_"$2"_arm build_"$2"_arm armv7a-linux-androideabi "$1" "$2" - make_sqlite3 build_"$2"_arm64 build_"$2"_arm64 aarch64-linux-android "$1" "$2" - make_sqlite3 build_"$2"_x86 build_"$2"_x86 i686-linux-android "$1" "$2" - make_sqlite3 build_"$2"_x86_64 build_"$2"_x86_64 x86_64-linux-android "$1" "$2" - elif [[ "${2}" == "webasm" ]]; then - make_sqlite3 build_"$2"_wasm build_"$2"_wasm "" "$1" "$2" - fi -} - -compile_all_sqlite3 "$1" "$2" diff --git a/scripts/gen_keys.py b/scripts/gen_keys.py deleted file mode 100644 index 09407eb948..0000000000 --- a/scripts/gen_keys.py +++ /dev/null @@ -1,131 +0,0 @@ -# pylint: skip-file -# generate keys.h file -f = open("src/engine/keys.h", "w") - -keynames = [] -for i in range(0, 512): - keynames += [f"&{int(i)}"] - -print("#ifndef ENGINE_KEYS_H", file=f) -print("#define ENGINE_KEYS_H", file=f) - -# KEY_EXECUTE already exists on windows platforms -print("#if defined(CONF_FAMILY_WINDOWS)", file=f) -print(" #undef KEY_EXECUTE", file=f) -print("#endif", file=f) - -print('/* AUTO GENERATED! DO NOT EDIT MANUALLY! */', file=f) -print("enum", file=f) -print("{", file=f) - -print("\tKEY_FIRST = 0,", file=f) - -highestid = 0 -for line in open("scripts/SDL_scancode.h"): - l = line.strip().split("=") - if len(l) == 2 and "SDL_SCANCODE_" in line: - key = l[0].strip().replace("SDL_SCANCODE_", "KEY_") - value = int(l[1].split(",")[0].strip()) - if key[0:2] == "/*": - continue - print(f"\t{key} = {int(value)},", file=f) - - keynames[value] = key.replace("KEY_", "").lower() - - if value > highestid: - highestid = value - -highestid += 1 -print("", file=f) -print(f"\tKEY_MOUSE_1 = {int(highestid)},", file=f); keynames[highestid] = "mouse1"; highestid += 1 -print(f"\tKEY_MOUSE_2 = {int(highestid)},", file=f); keynames[highestid] = "mouse2"; highestid += 1 -print(f"\tKEY_MOUSE_3 = {int(highestid)},", file=f); keynames[highestid] = "mouse3"; highestid += 1 -print(f"\tKEY_MOUSE_4 = {int(highestid)},", file=f); keynames[highestid] = "mouse4"; highestid += 1 -print(f"\tKEY_MOUSE_5 = {int(highestid)},", file=f); keynames[highestid] = "mouse5"; highestid += 1 -print(f"\tKEY_MOUSE_6 = {int(highestid)},", file=f); keynames[highestid] = "mouse6"; highestid += 1 -print(f"\tKEY_MOUSE_7 = {int(highestid)},", file=f); keynames[highestid] = "mouse7"; highestid += 1 -print(f"\tKEY_MOUSE_8 = {int(highestid)},", file=f); keynames[highestid] = "mouse8"; highestid += 1 -print(f"\tKEY_MOUSE_9 = {int(highestid)},", file=f); keynames[highestid] = "mouse9"; highestid += 1 -print(f"\tKEY_MOUSE_WHEEL_UP = {int(highestid)},", file=f); keynames[highestid] = "mousewheelup"; highestid += 1 -print(f"\tKEY_MOUSE_WHEEL_DOWN = {int(highestid)},", file=f); keynames[highestid] = "mousewheeldown"; highestid += 1 -print(f"\tKEY_MOUSE_WHEEL_LEFT = {int(highestid)},", file=f); keynames[highestid] = "mousewheelleft"; highestid += 1 -print(f"\tKEY_MOUSE_WHEEL_RIGHT = {int(highestid)},", file=f); keynames[highestid] = "mousewheelright"; highestid += 1 -print("", file=f) -print(f"\tKEY_JOYSTICK_BUTTON_0 = {int(highestid)},", file=f); keynames[highestid] = "joystick0"; highestid += 1 -print(f"\tKEY_JOYSTICK_BUTTON_1 = {int(highestid)},", file=f); keynames[highestid] = "joystick1"; highestid += 1 -print(f"\tKEY_JOYSTICK_BUTTON_2 = {int(highestid)},", file=f); keynames[highestid] = "joystick2"; highestid += 1 -print(f"\tKEY_JOYSTICK_BUTTON_3 = {int(highestid)},", file=f); keynames[highestid] = "joystick3"; highestid += 1 -print(f"\tKEY_JOYSTICK_BUTTON_4 = {int(highestid)},", file=f); keynames[highestid] = "joystick4"; highestid += 1 -print(f"\tKEY_JOYSTICK_BUTTON_5 = {int(highestid)},", file=f); keynames[highestid] = "joystick5"; highestid += 1 -print(f"\tKEY_JOYSTICK_BUTTON_6 = {int(highestid)},", file=f); keynames[highestid] = "joystick6"; highestid += 1 -print(f"\tKEY_JOYSTICK_BUTTON_7 = {int(highestid)},", file=f); keynames[highestid] = "joystick7"; highestid += 1 -print(f"\tKEY_JOYSTICK_BUTTON_8 = {int(highestid)},", file=f); keynames[highestid] = "joystick8"; highestid += 1 -print(f"\tKEY_JOYSTICK_BUTTON_9 = {int(highestid)},", file=f); keynames[highestid] = "joystick9"; highestid += 1 -print(f"\tKEY_JOYSTICK_BUTTON_10 = {int(highestid)},", file=f); keynames[highestid] = "joystick10"; highestid += 1 -print(f"\tKEY_JOYSTICK_BUTTON_11 = {int(highestid)},", file=f); keynames[highestid] = "joystick11"; highestid += 1 -print("", file=f) -print(f"\tKEY_JOY_HAT0_UP = {int(highestid)},", file=f); keynames[highestid] = "joy_hat0_up"; highestid += 1 -print(f"\tKEY_JOY_HAT0_LEFT = {int(highestid)},", file=f); keynames[highestid] = "joy_hat0_left"; highestid += 1 -print(f"\tKEY_JOY_HAT0_RIGHT = {int(highestid)},", file=f); keynames[highestid] = "joy_hat0_right"; highestid += 1 -print(f"\tKEY_JOY_HAT0_DOWN = {int(highestid)},", file=f); keynames[highestid] = "joy_hat0_down"; highestid += 1 -print(f"\tKEY_JOY_HAT1_UP = {int(highestid)},", file=f); keynames[highestid] = "joy_hat1_up"; highestid += 1 -print(f"\tKEY_JOY_HAT1_LEFT = {int(highestid)},", file=f); keynames[highestid] = "joy_hat1_left"; highestid += 1 -print(f"\tKEY_JOY_HAT1_RIGHT = {int(highestid)},", file=f); keynames[highestid] = "joy_hat1_right"; highestid += 1 -print(f"\tKEY_JOY_HAT1_DOWN = {int(highestid)},", file=f); keynames[highestid] = "joy_hat1_down"; highestid += 1 -print("", file=f) -print(f"\tKEY_JOY_AXIS_0_LEFT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis0_left"; highestid += 1 -print(f"\tKEY_JOY_AXIS_0_RIGHT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis0_right"; highestid += 1 -print(f"\tKEY_JOY_AXIS_1_LEFT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis1_left"; highestid += 1 -print(f"\tKEY_JOY_AXIS_1_RIGHT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis1_right"; highestid += 1 -print(f"\tKEY_JOY_AXIS_2_LEFT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis2_left"; highestid += 1 -print(f"\tKEY_JOY_AXIS_2_RIGHT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis2_right"; highestid += 1 -print(f"\tKEY_JOY_AXIS_3_LEFT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis3_left"; highestid += 1 -print(f"\tKEY_JOY_AXIS_3_RIGHT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis3_right"; highestid += 1 -print(f"\tKEY_JOY_AXIS_4_LEFT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis4_left"; highestid += 1 -print(f"\tKEY_JOY_AXIS_4_RIGHT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis4_right"; highestid += 1 -print(f"\tKEY_JOY_AXIS_5_LEFT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis5_left"; highestid += 1 -print(f"\tKEY_JOY_AXIS_5_RIGHT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis5_right"; highestid += 1 -print(f"\tKEY_JOY_AXIS_6_LEFT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis6_left"; highestid += 1 -print(f"\tKEY_JOY_AXIS_6_RIGHT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis6_right"; highestid += 1 -print(f"\tKEY_JOY_AXIS_7_LEFT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis7_left"; highestid += 1 -print(f"\tKEY_JOY_AXIS_7_RIGHT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis7_right"; highestid += 1 -print(f"\tKEY_JOY_AXIS_8_LEFT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis8_left"; highestid += 1 -print(f"\tKEY_JOY_AXIS_8_RIGHT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis8_right"; highestid += 1 -print(f"\tKEY_JOY_AXIS_9_LEFT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis9_left"; highestid += 1 -print(f"\tKEY_JOY_AXIS_9_RIGHT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis9_right"; highestid += 1 -print(f"\tKEY_JOY_AXIS_10_LEFT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis10_left"; highestid += 1 -print(f"\tKEY_JOY_AXIS_10_RIGHT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis10_right"; highestid += 1 -print(f"\tKEY_JOY_AXIS_11_LEFT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis11_left"; highestid += 1 -print(f"\tKEY_JOY_AXIS_11_RIGHT = {int(highestid)},", file=f); keynames[highestid] = "joy_axis11_right"; highestid += 1 -print("", file=f) -print("\tKEY_LAST = 512,", file=f) -print("", file=f) -print("\tNUM_JOYSTICK_BUTTONS = KEY_JOYSTICK_BUTTON_11 - KEY_JOYSTICK_BUTTON_0 + 1,", file=f) -print("\tNUM_JOYSTICK_AXES_BUTTONS = KEY_JOY_AXIS_11_RIGHT - KEY_JOY_AXIS_0_LEFT + 1,", file=f) -print("\tNUM_JOYSTICK_BUTTONS_PER_AXIS = KEY_JOY_AXIS_0_RIGHT - KEY_JOY_AXIS_0_LEFT + 1,", file=f) -print("\tNUM_JOYSTICK_AXES = NUM_JOYSTICK_AXES_BUTTONS / NUM_JOYSTICK_BUTTONS_PER_AXIS,", file=f) -print("\tNUM_JOYSTICK_HAT_BUTTONS = KEY_JOY_HAT1_DOWN - KEY_JOY_HAT0_UP + 1,", file=f) -print("\tNUM_JOYSTICK_BUTTONS_PER_HAT = KEY_JOY_HAT1_DOWN - KEY_JOY_HAT1_UP + 1,", file=f) -print("\tNUM_JOYSTICK_HATS = NUM_JOYSTICK_HAT_BUTTONS / NUM_JOYSTICK_BUTTONS_PER_HAT,", file=f) - -print("};", file=f) -print("", file=f) -print("#endif", file=f) - -# generate keynames.c file -f = open("src/engine/client/keynames.h", "w") -print('/* AUTO GENERATED! DO NOT EDIT MANUALLY! */', file=f) -print('', file=f) -print('#ifndef KEYS_INCLUDE', file=f) -print('#error do not include this header!', file=f) -print('#endif', file=f) -print('', file=f) -print("const char g_aaKeyStrings[512][20] = // NOLINT(misc-definitions-in-headers)", file=f) -print("{", file=f) -for n in keynames: - print(f'\t"{n}",', file=f) - -print("};", file=f) -print("", file=f) - -f.close() diff --git a/scripts/integration_test.sh b/scripts/integration_test.sh deleted file mode 100755 index ac1f764f93..0000000000 --- a/scripts/integration_test.sh +++ /dev/null @@ -1,393 +0,0 @@ -#!/bin/bash - -arg_verbose=0 -arg_valgrind_memcheck=0 - -for arg in "$@"; do - if [ "$arg" == "-h" ] || [ "$arg" == "--help" ]; then - echo "usage: $(basename "$0") [OPTION..]" - echo "description:" - echo " Runs a simple integration test of the client and server" - echo " binaries from the current build directory." - echo "options:" - echo " --help|-h show this help" - echo " --verbose|-v verbose output" - echo " --valgrind-memcheck use valgrind's memcheck to run server and client" - exit 0 - elif [ "$arg" == "-v" ] || [ "$arg" == "--verbose" ]; then - arg_verbose=1 - elif [ "$arg" == "--valgrind-memcheck" ]; then - arg_valgrind_memcheck=1 - else - echo "Error: unknown argument '$arg'" - exit 1 - fi -done - -if [ ! -f DDNet ]; then - echo "[-] Error: client binary 'DDNet' not found" - exit 1 -fi -if [ ! -f DDNet-Server ]; then - echo "[-] Error: server binary 'DDNet-Server' not found" - exit 1 -fi - -echo "[*] Setup" -got_killed=0 - -function kill_all() { - # needed to fix hang fifo with additional ctrl+c - if [ "$got_killed" == "1" ]; then - exit - fi - got_killed=1 - - if [ "$arg_verbose" == "1" ]; then - echo "[*] Shutting down test clients and server" - fi - sleep 1 - - if [[ ! -f fail_server.txt ]]; then - echo "[*] Shutting down server" - if ! timeout 3 sh -c "echo shutdown > server.fifo"; then - echo "[-] shutdown server timed out" - fi - fi - sleep 1 - - local i - for ((i = 1; i < 3; i++)); do - if [[ ! -f fail_client$i.txt ]]; then - echo "[*] Shutting down client$i" - if ! timeout 3 sh -c "echo quit > \"client$i.fifo\""; then - echo "[-] shutdown client $i timed out" - fi - fi - done - sleep 1 -} - -function cleanup() { - kill_all -} - -trap cleanup EXIT - -function fail() { - sleep 1 - tail -n2 "$1".log > fail_"$1".txt - echo "$1 exited with code $2" >> fail_"$1".txt - echo "[-] $1 exited with code $2" -} - -# Get unused port from the system by binding to port 0 and immediately closing the socket again -port=$(python3 -c 'import socket; s=socket.socket(); s.bind(("", 0)); print(s.getsockname()[1]); s.close()') - -if [[ $OSTYPE == 'darwin'* ]]; then - DETECT_LEAKS=0 -else - DETECT_LEAKS=1 -fi - -export UBSAN_OPTIONS=suppressions=../ubsan.supp:log_path=./SAN:print_stacktrace=1:halt_on_errors=0 -export ASAN_OPTIONS=log_path=./SAN:print_stacktrace=1:check_initialization_order=1:detect_leaks=$DETECT_LEAKS:halt_on_errors=0 -export LSAN_OPTIONS=suppressions=../lsan.supp:print_suppressions=0 - -function check_asan_and_valgrind_results() { - if [ "$arg_valgrind_memcheck" == "1" ]; then - # Wait to ensure that the error summary was written to the stderr files because valgrind takes some time - # TODO: Instead wait for all started processes to finish - sleep 20 - if grep "== ERROR SUMMARY: " stderr_server.txt stderr_client1.txt stderr_client2.txt | grep -q -v "ERROR SUMMARY: 0"; then - echo "[-] Error: Valgrind has detected the following errors:" - grep "^==" stderr_server.txt stderr_client1.txt stderr_client2.txt - return 1 - fi - else - if test -n "$(find . -maxdepth 1 -name 'SAN.*' -print -quit)"; then - echo "[-] Error: ASAN has detected the following errors:" - cat SAN.* - return 1 - fi - fi - return 0 -} - -print_results() { - for logfile in client1.log client2.log server.log; do - if [ "$arg_valgrind_memcheck" == "1" ]; then - break - fi - if [ ! -f "$logfile" ]; then - echo "[-] Error: logfile '$logfile' not found" - touch fail_logs.txt - continue - fi - logdiff="$(diff -u <(grep -v "console: .* access for .* is now .*abled" "$logfile" | sort) <(sort "stdout_$(basename "$logfile" .log).txt"))" - if [ "$logdiff" != "" ]; then - echo "[-] Error: logfile '$logfile' differs from stdout" - echo "$logdiff" - echo "[-] Error: logfile '$logfile' differs from stdout" >> fail_logs.txt - echo "$logdiff" >> fail_logs.txt - fi - done - - for stderr in ./stderr_*.txt; do - if [ ! -f "$stderr" ]; then - continue - fi - if [ "$(cat "$stderr")" == "" ]; then - continue - fi - echo "[!] Warning: $stderr" - cat "$stderr" - done - - if test -n "$(find . -maxdepth 1 -name 'fail_*' -print -quit)"; then - for fail in fail_*; do - cat "$fail" - done - check_asan_and_valgrind_results - echo "[-] Test failed. See errors above" - exit 1 - fi - - echo "[*] All tests passed" - check_asan_and_valgrind_results || exit 1 -} - -function fifo() { - local cmd="$1" - local fifo_file="$2" - if [ -f fail_fifo_timeout.txt ]; then - echo "[fifo] skipping because of timeout cmd: $cmd" - return - fi - if [ "$arg_verbose" == "1" ]; then - echo "[fifo] $cmd >> $fifo_file" - fi - if printf '%s' "$cmd" | grep -q '[`'"'"']'; then - echo "[-] fifo commands can not contain backticks or single quotes" - echo "[-] invalid fifo command: $cmd" - exit 1 - fi - if ! timeout 3 sh -c "printf '%s\n' '$cmd' >> \"$fifo_file\""; then - fifo_error="[-] fifo command timeout: $cmd >> $fifo_file" - printf '%s\n' "$fifo_error" - printf '%s\n' "$fifo_error" >> fail_fifo_timeout.txt - kill_all - print_results - exit 1 - fi -} - -rm -rf integration_test -mkdir -p integration_test/data/maps -cp data/maps/coverage.map integration_test/data/maps -cp data/maps/Tutorial.map integration_test/data/maps -cd integration_test || exit 1 - -{ - echo $'add_path $CURRENTDIR' - echo $'add_path $USERDIR' - echo $'add_path $DATADIR' - echo $'add_path ../data' -} > storage.cfg - -tool="" -client_args="cl_download_skins 0; - gfx_fullscreen 0; - snd_enable 0;" - -if [ "$arg_valgrind_memcheck" == "1" ]; then - tool="valgrind --tool=memcheck --gen-suppressions=all --suppressions=../memcheck.supp --track-origins=yes" - client_args="$client_args cl_menu_map \"\";" -fi - -function wait_for_fifo() { - local fifo="$1" - local tries="$2" - local fails=0 - # give the server/client time to launch and create the fifo file - # but assume after X secs that the server/client crashed before - # being able to create the file - while [[ ! -p "$fifo" ]]; do - fails="$((fails + 1))" - if [ "$arg_verbose" == "1" ]; then - echo "[!] Note: $fifo not found (attempts $fails/$tries)" - fi - if [ "$fails" -gt "$tries" ]; then - echo "[-] Error: $(basename "$fifo" .fifo) possibly crashed on launch" - kill_all - print_results - exit 1 - fi - sleep 0.1 - done -} - -function wait_for_launch() { - local fifo="$1" - local baseDuration="$2" - if [ "$arg_valgrind_memcheck" == "1" ]; then - wait_for_fifo "$fifo" $((400 * baseDuration)) - sleep $((8 * baseDuration)) - else - wait_for_fifo "$fifo" $((100 * baseDuration)) - sleep "$baseDuration" - fi -} - -echo "[*] Launch server" -$tool ../DDNet-Server \ - "sv_input_fifo server.fifo; - sv_rcon_password rcon; - sv_map coverage; - sv_sqlite_file ddnet-server.sqlite; - logfile server.log; - sv_register 0; - sv_port $port" > stdout_server.txt 2> stderr_server.txt || fail server "$?" & - -wait_for_launch server.fifo 1 - -echo "[*] Launch client 1" -$tool ../DDNet \ - "cl_input_fifo client1.fifo; - player_name client1; - logfile client1.log; - $client_args - connect localhost:$port" > stdout_client1.txt 2> stderr_client1.txt || fail client1 "$?" & - -wait_for_launch client1.fifo 3 - -echo "[*] Start demo recording" -fifo "record server" server.fifo -fifo "record client1" client1.fifo - -echo "[*] Launch client 2" -$tool ../DDNet \ - "cl_input_fifo client2.fifo; - player_name client2; - logfile client2.log; - $client_args - connect localhost:$port" > stdout_client2.txt 2> stderr_client2.txt || fail client2 "$?" & - -wait_for_launch client2.fifo 5 - -# wait for tees to finish -sleep 15 - -echo "[*] Test chat and chat commands" -fifo "say hello world" client1.fifo -fifo "rcon_auth rcon" client1.fifo -sleep 1 -fifo "$( - tr -d '\n' << EOF -say "/mc -;top5 -;rank -;team 512 -;emote happy -999 -;pause -;points -;mapinfo -;list -;whisper client2 hi -;kill -;settings cheats -;timeout 123 -;timer broadcast -;cmdlist -;saytime" -EOF -)" client1.fifo - -sleep 10 - -echo "[*] Test rcon commands" -fifo "$( - tr -d '\n' << EOF -rcon say hello from admin; -rcon broadcast test; -rcon status; -rcon echo test; -muteid 1 900 spam; -unban_all; -EOF -)" client1.fifo -sleep 5 - -echo "[*] Stop demo recording" -fifo "stoprecord" server.fifo -fifo "stoprecord" client1.fifo -sleep 1 - -echo "[*] Test map change" -fifo "rcon sv_map Tutorial" client1.fifo -if [ "$arg_valgrind_memcheck" == "1" ]; then - sleep 60 -else - sleep 15 -fi - -echo "[*] Play demos" -fifo "play demos/server.demo" client1.fifo -fifo "play demos/client1.demo" client2.fifo -if [ "$arg_valgrind_memcheck" == "1" ]; then - sleep 40 -else - sleep 10 -fi - -# Kill all processes first so all outputs are fully written -kill_all - -if ! grep -qE '^[0-9]{4}-[0-9]{2}-[0-9]{2} ([0-9]{2}:){2}[0-9]{2} I chat: 0:-2:client1: hello world$' server.log; then - touch fail_chat.txt - echo "[-] Error: chat message not found in server log" -fi - -if ! grep -q 'cmdlist' client1.log || - ! grep -q 'pause' client1.log || - ! grep -q 'rank' client1.log || - ! grep -q 'points' client1.log; then - touch fail_chatcommand.txt - echo "[-] Error: did not find output of /cmdlist command" -fi - -if ! grep -q "hello from admin" server.log; then - touch fail_rcon.txt - echo "[-] Error: admin message not found in server log" -fi - -if ! grep -q "demo_player: Stopped playback" client1.log; then - touch fail_demo_server.txt - echo "[-] Error: demo playback of server demo in client 1 was not started/finished" -fi -if ! grep -q "demo_player: Stopped playback" client2.log; then - touch fail_demo_client.txt - echo "[-] Error: demo playback of client demo in client 2 was not started/finished" -fi - -ranks="$(sqlite3 -init /dev/null -cmd '.timeout 10000' ddnet-server.sqlite < <(echo "select * from record_race;"))" -rank_time="$(echo "$ranks" | awk -F '|' '{ print "player:", $2, "time:", $4, "cps:", $6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28 }')" -expected_times="\ -player: client2 time: 1020.98 cps: 0.02 0.1 0.2 0.26 0.32 600.36 600.42 600.46 600.5 1020.54 1020.58 1020.6 1020.64 1020.66 1020.7 1020.72 1020.76 1020.78 1020.8 1020.84 1020.86 1020.88 1020.9 -player: client2 time: 1020.38 cps: 1021.34 0.02 0.04 0.04 0.06 600.08 600.1 600.12 600.12 1020.14 1020.16 1020.18 1020.2 1020.2 1020.22 1020.24 1020.26 1020.26 1020.28 1020.3 1020.3 1020.32 1020.34 -player: client1 time: 6248.56 cps: 0.42 0.5 0.0 0.66 0.92 0.02 300.18 300.46 300.76 300.88 300.98 301.02 301.04 301.06 301.08 301.18 301.38 301.66 307.34 308.08 308.1 308.14 308.44 -player: client1 time: 168300.5 cps: 0.02 0.06 0.12 15300.14 15300.18 30600.2 30600.22 45900.24 45900.26 61200.28 61200.3 76500.32 76500.34 91800.36 91800.36 107100.38 107100.4 122400.42 122400.42 137700.44 137700.45 137700.45 153000.48 -player: client2 time: 302.02 cps: 0.42 0.5 0.0 0.66 0.92 0.02 300.18 300.46 300.76 300.88 300.98 301.16 301.24 301.28 301.3 301.86 301.96 0.0 0.0 0.0 0.0 0.0 0.0" - -# require at least one rank in all cases. Exact finishes only with valgrind disabled -if [ "$ranks" == "" ]; then - touch fail_ranks.txt - echo "[-] Error: no ranks found in database" -elif [ "$arg_valgrind_memcheck" != "1" ] && [ "$rank_time" != "$expected_times" ]; then - touch fail_ranks.txt - echo "[-] Error: unexpected finish time" - echo " expected: $expected_times" - echo " got: $rank_time" -fi - -print_results diff --git a/scripts/languages/analyze.py b/scripts/languages/analyze.py deleted file mode 100755 index 06dcd0d874..0000000000 --- a/scripts/languages/analyze.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python3 -import os -import sys -import twlang - -os.chdir(os.path.dirname(__file__) + "/../..") - -if len(sys.argv) > 1: - langs = sys.argv[1:] -else: - langs = twlang.languages() -local = twlang.localizes() -table = [] -for lang in langs: - trans = twlang.translations(lang) - empty = 0 - supported = 0 - unused = 0 - for tran, (_, expr, _) in trans.items(): - if not expr: - empty += 1 - else: - if tran in local: - supported += 1 - else: - unused += 1 - table.append([lang, len(trans), empty, len(local)-supported, unused]) - -table.sort(key=lambda l: l[3]) -table = [["filename", "total", "empty", "missing", "unused"]] + table -s = [[str(e) for e in row] for row in table] -lens = [max(map(len, col)) for col in zip(*s)] -fmt = " ".join(f"{{:{x}}}" for x in lens) -t = [fmt.format(*row) for row in s] -print("\n".join(t)) diff --git a/scripts/languages/copy_fix.py b/scripts/languages/copy_fix.py deleted file mode 100755 index 944f16c57e..0000000000 --- a/scripts/languages/copy_fix.py +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env python3 -import os -import sys - -import twlang - -def copy_fix(infile, delete_unused, append_missing, delete_empty): - with open(infile, encoding="utf-8") as f: - content = f.readlines() - trans = twlang.translations(infile) - if delete_unused or append_missing: - local = twlang.localizes() - else: - local = [] - supported = [] - for tran, (start, expr, end) in trans.items(): - if delete_unused and tran not in local: - content[start:end] = [None]*(end-start) - if append_missing and tran in local: - if expr or (not expr and delete_empty): - supported.append(local.index(tran)) - else: - content[start:end] = [None]*(end-start) - if delete_empty and not expr: - content[start:end] = [None]*(end-start) - content = [line for line in content if line is not None] - if append_missing: - missing = [index for index in range(len(local)) if index not in supported] - if missing: - if content[-1] != "\n": - content.append("\n") - for miss in missing: - if local[miss][1] != "": - content.append("["+local[miss][1]+"]\n") - content.append(local[miss][0]+"\n== \n\n") - content[-1] = content[-1][:-1] - return "".join(content) - -def main(argv): - os.chdir(os.path.dirname(__file__) + "/../..") - - if len(argv) < 3: - print("usage: python copy_fix.py [--delete-unused] [--append-missing] [--delete-empty]") - sys.exit() - infile = argv[1] - outfile = argv[2] - args = argv[3:] - delete_unused = False - append_missing = False - delete_empty = False - for arg in args: - if arg == "--delete-unused": - delete_unused = True - elif arg == "--append-missing": - append_missing = True - elif arg == "--delete-empty": - delete_empty = True - else: - print("No such argument '"+arg+"'.") - sys.exit() - - content = copy_fix(infile, delete_unused, append_missing, delete_empty) - - with open(outfile, "w", encoding="utf-8") as f: - f.write("".join(content)) - print("Successfully created '" + outfile + "'.") - -if __name__ == '__main__': - main(sys.argv) diff --git a/scripts/languages/find_unchanged.py b/scripts/languages/find_unchanged.py deleted file mode 100755 index cdeb06a3f3..0000000000 --- a/scripts/languages/find_unchanged.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env python3 -import os -import sys -import twlang - -os.chdir(os.path.dirname(__file__) + "/../..") - -if len(sys.argv) < 2: - print("usage: python find_unchanged.py ") - sys.exit() -infile = sys.argv[1] - -trans = twlang.translations(infile) -for tran, (_, expr, _) in trans.items(): - if tran == expr: - print(tran) diff --git a/scripts/languages/readme.txt b/scripts/languages/readme.txt deleted file mode 100644 index d3dede247d..0000000000 --- a/scripts/languages/readme.txt +++ /dev/null @@ -1,45 +0,0 @@ -Teeworlds language scripts by timakro - -These scripts can help you to improve the language files. This is a short tutorial -about how to use the scripts. - - -You can start by analyzing the current languages using analyze.py -$ ./analyze.py - -analyze.py outputs several columns. The column 'total' is the number of -translations in the file. 'empty' is the number of untranslated phrases in the -file. The 2nd and 3rd columns are calculated by looking into the source. The script -searches through the source for all phrases. 'missing' is the number of phrases in -the source but not in the file. 'unused' is the number of phrases in the file but -not in the source. - - -To update a language you should first copy it using the copy_fix.py script. -$ ./copy_fix.py ../spanish.txt newspanish.txt --delete-unused --append-missing - -Then you can start to modify newspanish.txt. Search in the file for the following -line and remove it: -##### generated by copy_fix.py, please translate this ##### - -Every phrase below this line should be empty. Now you can fill in the translations -you know. It's also okay to write just the same phrase as in english for words like -'Hookcollision' or 'Screenshot'. If you don't know how to translate something just -remove it. - -That's all, you improved the translation. If you want you can add your name at the -start of the file. Now you can move the file back to its original location. -$ mv newspanish.txt ../spanish.txt - - -Often people know better phrases for translations where the english phrase was just -copied. To find these you can use find_unchanged.py -$ ./find_unchanged.py ../spanish.txt - -To update all languages: - -$ ./update_all.py - -To get a statistic of how complete the translation is: - -$ for i in data/languages/*.txt; do COVERED=$(cat $i|grep "^== "|grep -v "^== $"|wc -l); TOTAL=$(cat $i|grep "^== "|wc -l); [ "${i:t}" != "license.txt" ] && [ "${i:t}" != "index.txt" ] && echo "$(($COVERED*100/$TOTAL))% ${i:r:t}"; done | sort -n -r diff --git a/scripts/languages/twlang.py b/scripts/languages/twlang.py deleted file mode 100644 index 3374431cfd..0000000000 --- a/scripts/languages/twlang.py +++ /dev/null @@ -1,90 +0,0 @@ -import functools -import os -import re -from collections import OrderedDict - -class LanguageDecodeError(Exception): - def __init__(self, message, filename, line): - error = f"File \"{filename}\", line {line+1}: {message}" - super().__init__(error) - -def decode(fileobj, elements_per_key): - data = {} - current_context = "" - current_key = None - index = -1 - for index, line in enumerate(fileobj): - line = line.encode("utf-8").decode("utf-8-sig") - line = line[:-1] - if line and line[-1] == "\r": - line = line[:-1] - if not line or line[:1] == "#": - current_context = "" - continue - - if line[0] == "[": - if line[-1] != "]": - raise LanguageDecodeError("Invalid context string", fileobj.name, index) - current_context = line[1:-1] - elif line[:3] == "== ": - if len(data[current_key]) >= 1+elements_per_key: - raise LanguageDecodeError("Wrong number of elements per key", fileobj.name, index) - if current_key: - translation = line[3:] - data[current_key].extend([translation]) - else: - raise LanguageDecodeError("Element before key given", fileobj.name, index) - else: - if current_key: - if len(data[current_key]) != 1+elements_per_key: - raise LanguageDecodeError("Wrong number of elements per key", fileobj.name, index) - data[current_key].append(index - 1 if current_context else index) - if line in data: - raise LanguageDecodeError("Key defined multiple times: " + line, fileobj.name, index) - data[(line, current_context)] = [index - 1 if current_context else index] - current_key = (line, current_context) - if len(data[current_key]) != 1+elements_per_key: - raise LanguageDecodeError("Wrong number of elements per key", fileobj.name, index) - data[current_key].append(index+1) - new_data = {} - for key, value in data.items(): - if key[0]: - new_data[key] = value - return new_data - - -def check_file(path): - with open(path, encoding="utf-8") as fileobj: - matches = re.findall(r"(Localize|Localizable)\s*\(\s*\"((?:(?:\\\")|[^\"])+)\"(?:\s*,\s*\"((?:(?:\\\")|[^\"])+)\")?\s*\)", fileobj.read()) - return matches - - -@functools.lru_cache(None) -def check_folder(path): - englishlist = OrderedDict() - for path2, dirs, files in os.walk(path): - dirs.sort() - for f in sorted(files): - if not any(f.endswith(x) for x in [".cpp", ".c", ".h"]): - continue - for sentence in check_file(os.path.join(path2, f)): - key = (sentence[1:][0].replace("\\\"", "\""), sentence[1:][1].replace("\\\"", "\"")) - englishlist[key] = None - return englishlist - - -def languages(): - with open("data/languages/index.txt", encoding="utf-8") as f: - index = decode(f, 3) - langs = {"data/languages/"+key[0]+".txt" : [key[0]]+elements for key, elements in index.items()} - return langs - - -def translations(filename): - with open(filename, encoding="utf-8") as f: - return decode(f, 1) - - -def localizes(): - englishlist = list(check_folder("src")) - return englishlist diff --git a/scripts/languages/update_all.py b/scripts/languages/update_all.py deleted file mode 100755 index 9b64d243df..0000000000 --- a/scripts/languages/update_all.py +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env python3 -import os -from copy_fix import copy_fix -import twlang - -os.chdir(os.path.dirname(__file__) + "/../..") - -for lang in twlang.languages(): - content = copy_fix(lang, delete_unused=True, append_missing=True, delete_empty=False) - with open(lang, "w", encoding="utf-8") as f: - f.write(content) diff --git a/scripts/languages/validate.py b/scripts/languages/validate.py deleted file mode 100755 index fe214bdb1b..0000000000 --- a/scripts/languages/validate.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python3 -import os -import sys -import re -import twlang - -os.chdir(os.path.dirname(__file__) + "/../..") - -# Taken from https://stackoverflow.com/questions/30011379/how-can-i-parse-a-c-format-string-in-python -cfmt = ''' -( # start of capture group 1 -% # literal "%" -(?: # first option -(?:[-+0 #]{0,5}) # optional flags -(?:\\d+|\\*)? # width -(?:\\.(?:\\d+|\\*))? # precision -(?:h|l|ll|w|I|I32|I64)? # size -[cCdiouxXeEfgGaAnpsSZ] # type -) | # OR -%%) # literal "%%" -''' - -total_errors = 0 - -def print_validation_error(error, filename, error_line): - print(f"Invalid: {translated}") - print(f"- {error} in {filename}:{error_line + 1}\n") - global total_errors - total_errors += 1 - -if len(sys.argv) > 1: - languages = sys.argv[1:] -else: - languages = twlang.languages() -local = twlang.localizes() - -for language in languages: - translations = twlang.translations(language) - - for (english, _), (line, translated, _) in translations.items(): - if not translated: - continue - - # Validate c format strings. Strings that move the formatters are not validated. - if re.findall(cfmt, english, flags=re.X) != re.findall(cfmt, translated, flags=re.X) and not "1$" in translated: - print_validation_error("Non-matching formatting", language, line) - - # Check for elipisis - if "…" in english and "..." in translated: - print_validation_error("Usage of ... instead of the … character", language, line) - -if total_errors: - print(f"Found {total_errors} {'error' if total_errors == 1 else 'errors'} ") - sys.exit(1) diff --git a/src/android/android_main.cpp b/src/android/android_main.cpp deleted file mode 100644 index 00571b3c40..0000000000 --- a/src/android/android_main.cpp +++ /dev/null @@ -1,293 +0,0 @@ -#include "android_main.h" - -#include -#include -#include - -#include - -#include -#include - -#include - -#include - -static bool UnpackAsset(const char *pFilename) -{ - char aAssetFilename[IO_MAX_PATH_LENGTH]; - str_copy(aAssetFilename, "asset_integrity_files/"); - str_append(aAssetFilename, pFilename); - - // This uses SDL_RWFromFile because it can read Android assets, - // which are files stored in the app's APK file. All data files - // are stored as assets and unpacked to the external storage. - SDL_RWops *pAssetFile = SDL_RWFromFile(aAssetFilename, "rb"); - if(!pAssetFile) - { - log_error("android", "Failed to open asset '%s' for reading", pFilename); - return false; - } - - const long int FileLength = SDL_RWsize(pAssetFile); - if(FileLength < 0) - { - SDL_RWclose(pAssetFile); - log_error("android", "Failed to determine length of asset '%s'", pFilename); - return false; - } - - char *pData = static_cast(malloc(FileLength)); - const size_t ReadLength = SDL_RWread(pAssetFile, pData, 1, FileLength); - SDL_RWclose(pAssetFile); - - if(ReadLength != (size_t)FileLength) - { - free(pData); - log_error("android", "Failed to read asset '%s' (read %" PRIzu ", wanted %ld)", pFilename, ReadLength, FileLength); - return false; - } - - IOHANDLE TargetFile = io_open(pFilename, IOFLAG_WRITE); - if(!TargetFile) - { - free(pData); - log_error("android", "Failed to open '%s' for writing", pFilename); - return false; - } - - const size_t WriteLength = io_write(TargetFile, pData, FileLength); - io_close(TargetFile); - free(pData); - - if(WriteLength != (size_t)FileLength) - { - log_error("android", "Failed to write data to '%s' (wrote %" PRIzu ", wanted %ld)", pFilename, WriteLength, FileLength); - return false; - } - - return true; -} - -constexpr const char *INTEGRITY_INDEX = "integrity.txt"; -constexpr const char *INTEGRITY_INDEX_SAVE = "integrity_save.txt"; - -// The first line of each integrity file contains the combined hash for all files, -// if the hashes match then we assume that the unpacked data folder is up-to-date. -static bool EqualIntegrityFiles(const char *pAssetFilename, const char *pStorageFilename) -{ - IOHANDLE StorageFile = io_open(pStorageFilename, IOFLAG_READ); - if(!StorageFile) - { - return false; - } - - char aStorageMainSha256[SHA256_MAXSTRSIZE]; - const size_t StorageReadLength = io_read(StorageFile, aStorageMainSha256, sizeof(aStorageMainSha256) - 1); - io_close(StorageFile); - if(StorageReadLength != sizeof(aStorageMainSha256) - 1) - { - return false; - } - aStorageMainSha256[sizeof(aStorageMainSha256) - 1] = '\0'; - - char aAssetFilename[IO_MAX_PATH_LENGTH]; - str_copy(aAssetFilename, "asset_integrity_files/"); - str_append(aAssetFilename, pAssetFilename); - - SDL_RWops *pAssetFile = SDL_RWFromFile(aAssetFilename, "rb"); - if(!pAssetFile) - { - return false; - } - - char aAssetMainSha256[SHA256_MAXSTRSIZE]; - const size_t AssetReadLength = SDL_RWread(pAssetFile, aAssetMainSha256, 1, sizeof(aAssetMainSha256) - 1); - SDL_RWclose(pAssetFile); - if(AssetReadLength != sizeof(aAssetMainSha256) - 1) - { - return false; - } - aAssetMainSha256[sizeof(aAssetMainSha256) - 1] = '\0'; - - return str_comp(aStorageMainSha256, aAssetMainSha256) == 0; -} - -class CIntegrityFileLine -{ -public: - char m_aFilename[IO_MAX_PATH_LENGTH]; - SHA256_DIGEST m_Sha256; -}; - -static std::vector ReadIntegrityFile(const char *pFilename) -{ - CLineReader LineReader; - if(!LineReader.OpenFile(io_open(pFilename, IOFLAG_READ))) - { - return {}; - } - - std::vector vLines; - while(const char *pReadLine = LineReader.Get()) - { - const char *pSpaceInLine = str_rchr(pReadLine, ' '); - CIntegrityFileLine Line; - char aSha256[SHA256_MAXSTRSIZE]; - if(pSpaceInLine == nullptr) - { - if(!vLines.empty()) - { - // Only the first line is allowed to not contain a filename - log_error("android", "Failed to parse line %" PRIzu " of '%s': line does not contain space", vLines.size() + 1, pFilename); - return {}; - } - Line.m_aFilename[0] = '\0'; - str_copy(aSha256, pReadLine); - } - else - { - str_truncate(Line.m_aFilename, sizeof(Line.m_aFilename), pReadLine, pSpaceInLine - pReadLine); - str_copy(aSha256, pSpaceInLine + 1); - } - if(sha256_from_str(&Line.m_Sha256, aSha256) != 0) - { - log_error("android", "Failed to parse line %" PRIzu " of '%s': invalid SHA256 string", vLines.size() + 1, pFilename); - return {}; - } - vLines.emplace_back(std::move(Line)); - } - - return vLines; -} - -const char *InitAndroid() -{ - // Change current working directory to our external storage location - const char *pPath = SDL_AndroidGetExternalStoragePath(); - if(pPath == nullptr) - { - return "The external storage is not available."; - } - if(fs_chdir(pPath) != 0) - { - return "Failed to change current directory to external storage."; - } - log_info("android", "Changed current directory to '%s'", pPath); - - if(fs_makedir("data") != 0 || fs_makedir("user") != 0) - { - return "Failed to create 'data' and 'user' directories in external storage."; - } - - if(EqualIntegrityFiles(INTEGRITY_INDEX, INTEGRITY_INDEX_SAVE)) - { - return nullptr; - } - - if(!UnpackAsset(INTEGRITY_INDEX)) - { - return "Failed to unpack the integrity index file. Consider reinstalling the app."; - } - - std::vector vIntegrityLines = ReadIntegrityFile(INTEGRITY_INDEX); - if(vIntegrityLines.empty()) - { - return "Failed to load the integrity index file. Consider reinstalling the app."; - } - - std::vector vIntegritySaveLines = ReadIntegrityFile(INTEGRITY_INDEX_SAVE); - - // The remaining lines of each integrity file list all assets and their hashes - for(size_t i = 1; i < vIntegrityLines.size(); ++i) - { - const CIntegrityFileLine &IntegrityLine = vIntegrityLines[i]; - - // Check if the asset is unchanged from the last unpacking - const auto IntegritySaveLine = std::find_if(vIntegritySaveLines.begin(), vIntegritySaveLines.end(), [&](const CIntegrityFileLine &Line) { - return str_comp(Line.m_aFilename, IntegrityLine.m_aFilename) == 0; - }); - if(IntegritySaveLine != vIntegritySaveLines.end() && IntegritySaveLine->m_Sha256 == IntegrityLine.m_Sha256) - { - continue; - } - - if(fs_makedir_rec_for(IntegrityLine.m_aFilename) != 0 || !UnpackAsset(IntegrityLine.m_aFilename)) - { - return "Failed to unpack game assets, consider reinstalling the app."; - } - } - - // The integrity file will be unpacked every time when launching, - // so we can simply rename it to update the saved integrity file. - if((fs_is_file(INTEGRITY_INDEX_SAVE) && fs_remove(INTEGRITY_INDEX_SAVE) != 0) || fs_rename(INTEGRITY_INDEX, INTEGRITY_INDEX_SAVE) != 0) - { - return "Failed to update the saved integrity index file."; - } - - return nullptr; -} - -// See ClientActivity.java -constexpr uint32_t COMMAND_USER = 0x8000; -constexpr uint32_t COMMAND_RESTART_APP = COMMAND_USER + 1; - -void RestartAndroidApp() -{ - SDL_AndroidSendMessage(COMMAND_RESTART_APP, 0); -} - -bool StartAndroidServer() -{ - // We need the notification-permission to show a notification for the foreground service. - // We use SDL for this instead of doing it on the Java side because this function blocks - // until the user made a choice, which is easier to handle. Only Android 13 (API 33) and - // newer support requesting this permission at runtime. - if(SDL_GetAndroidSDKVersion() >= 33 && !SDL_AndroidRequestPermission("android.permission.POST_NOTIFICATIONS")) - { - return false; - } - - JNIEnv *pEnv = static_cast(SDL_AndroidGetJNIEnv()); - jobject Activity = (jobject)SDL_AndroidGetActivity(); - jclass ActivityClass = pEnv->GetObjectClass(Activity); - - jmethodID MethodId = pEnv->GetMethodID(ActivityClass, "startServer", "()V"); - pEnv->CallVoidMethod(Activity, MethodId); - - pEnv->DeleteLocalRef(Activity); - pEnv->DeleteLocalRef(ActivityClass); - - return true; -} - -void ExecuteAndroidServerCommand(const char *pCommand) -{ - JNIEnv *pEnv = static_cast(SDL_AndroidGetJNIEnv()); - jobject Activity = (jobject)SDL_AndroidGetActivity(); - jclass ActivityClass = pEnv->GetObjectClass(Activity); - - jstring Command = pEnv->NewStringUTF(pCommand); - - jmethodID MethodId = pEnv->GetMethodID(ActivityClass, "executeCommand", "(Ljava/lang/String;)V"); - pEnv->CallVoidMethod(Activity, MethodId, Command); - - pEnv->DeleteLocalRef(Command); - pEnv->DeleteLocalRef(Activity); - pEnv->DeleteLocalRef(ActivityClass); -} - -bool IsAndroidServerRunning() -{ - JNIEnv *pEnv = static_cast(SDL_AndroidGetJNIEnv()); - jobject Activity = (jobject)SDL_AndroidGetActivity(); - jclass ActivityClass = pEnv->GetObjectClass(Activity); - - jmethodID MethodId = pEnv->GetMethodID(ActivityClass, "isServerRunning", "()Z"); - const bool Result = pEnv->CallBooleanMethod(Activity, MethodId); - - pEnv->DeleteLocalRef(Activity); - pEnv->DeleteLocalRef(ActivityClass); - - return Result; -} diff --git a/src/android/android_main.h b/src/android/android_main.h deleted file mode 100644 index 02fcf8f18c..0000000000 --- a/src/android/android_main.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef ANDROID_ANDROID_MAIN_H -#define ANDROID_ANDROID_MAIN_H - -#include -#if !defined(CONF_PLATFORM_ANDROID) -#error "This header should only be included when compiling for Android" -#endif - -/** - * @defgroup Android - * - * Android-specific functions to interact with the ClientActivity. - * - * Important note: These functions may only be called from the main native thread - * which is created by the SDLActivity (super class of ClientActivity), otherwise - * JNI calls are not possible because the JNI environment is not attached to that - * thread. See https://developer.android.com/training/articles/perf-jni#threads - */ - -/** - * Initializes the Android storage. Must be called on Android-systems - * before using any of the I/O and storage functions. - * - * @ingroup Android - * - * This will change the current working directory to the app specific external - * storage location and unpack the assets from the APK file to the `data` folder. - * The folder `user` is created in the external storage to store the user data. - * - * Failure must be handled by exiting the app. - * - * @return `nullptr` on success, error message on failure. - */ -const char *InitAndroid(); - -/** - * Sends an intent to the Android system to restart the app. - * - * @ingroup Android - * - * This will restart the main activity in a new task. The current process - * must immediately terminate after this function is called. - */ -void RestartAndroidApp(); - -/** - * Starts the local server as an Android service. - * - * @ingroup Android - * - * This will request the notification-permission as it is required for - * foreground services to show a notification. - * - * @return `true` on success, `false` on error. - */ -bool StartAndroidServer(); - -/** - * Adds a command to the execution queue of the local server. - * - * @ingroup Android - * - * @param pCommand The command to enqueue. - */ -void ExecuteAndroidServerCommand(const char *pCommand); - -/** - * Returns whether the local server and its Android service are running. - * - * @ingroup Android - * - * @return `true` if the server is running, `false` if the server is stopped. - */ -bool IsAndroidServerRunning(); - -#endif // ANDROID_ANDROID_MAIN_H diff --git a/src/base/Cargo.toml b/src/base/Cargo.toml deleted file mode 100644 index c72aa91b3a..0000000000 --- a/src/base/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "ddnet-base" -version = "0.0.1" -edition = "2021" -publish = false -license = "Zlib" - -[lib] -path = "lib.rs" - -[dependencies] -cxx = "1.0" - -[dev-dependencies] -ddnet-test = { path = "../rust-bridge/test", features = ["link-test-libraries"] } diff --git a/src/base/color.rs b/src/base/color.rs deleted file mode 100644 index 5514c7e475..0000000000 --- a/src/base/color.rs +++ /dev/null @@ -1,77 +0,0 @@ -/// Color, in RGBA format. Corresponds to the C++ type `ColorRGBA`. -/// -/// The color is represented by red, green, blue and alpha values between `0.0` -/// and `1.0`. -/// -/// See also . -/// -/// # Examples -/// -/// ``` -/// use ddnet_base::ColorRGBA; -/// -/// let white = ColorRGBA { r: 1.0, g: 1.0, b: 1.0, a: 1.0 }; -/// let black = ColorRGBA { r: 0.0, g: 0.0, b: 0.0, a: 1.0 }; -/// let red = ColorRGBA { r: 1.0, g: 0.0, b: 0.0, a: 1.0 }; -/// let transparent = ColorRGBA { r: 0.0, g: 0.0, b: 0.0, a: 0.0 }; -/// -/// // #ffa500 -/// let ddnet_logo_color = ColorRGBA { r: 1.0, g: 0.6470588235294118, b: 0.0, a: 1.0 }; -/// ``` -#[derive(Clone, Copy, Debug, PartialEq)] -#[repr(C)] -pub struct ColorRGBA { - /// Red - pub r: f32, - /// Green - pub g: f32, - /// Blue - pub b: f32, - /// Alpha (i.e. opacity. `0.0` means fully transparent, `1.0` - /// nontransparent). - pub a: f32, -} - -unsafe impl cxx::ExternType for ColorRGBA { - type Id = cxx::type_id!("ColorRGBA"); - type Kind = cxx::kind::Trivial; -} - -/// Color, in HSLA format. Corresponds to the C++ type `ColorHSLA`. -/// -/// The color is represented by hue, saturation, lightness and alpha values -/// between `0.0` and `1.0`. -/// -/// See also . -/// -/// # Examples -/// -/// ``` -/// use ddnet_base::ColorHSLA; -/// -/// let white = ColorHSLA { h: 0.0, s: 0.0, l: 1.0, a: 1.0 }; -/// let black = ColorHSLA { h: 0.0, s: 0.0, l: 0.0, a: 1.0 }; -/// let red = ColorHSLA { h: 0.0, s: 1.0, l: 0.5, a: 1.0 }; -/// let transparent = ColorHSLA { h: 0.0, s: 0.0, l: 0.0, a: 0.0 }; -/// -/// // #ffa500 -/// let ddnet_logo_color = ColorHSLA { h: 0.10784314, s: 1.0, l: 0.5, a: 1.0 }; -/// ``` -#[derive(Clone, Copy, Debug, PartialEq)] -#[repr(C)] -pub struct ColorHSLA { - /// Hue - pub h: f32, - /// Saturation - pub s: f32, - /// Lightness - pub l: f32, - /// Alpha (i.e. opacity. `0.0` means fully transparent, `1.0` - /// nontransparent). - pub a: f32, -} - -unsafe impl cxx::ExternType for ColorHSLA { - type Id = cxx::type_id!("ColorHSLA"); - type Kind = cxx::kind::Trivial; -} diff --git a/src/base/lib.rs b/src/base/lib.rs deleted file mode 100644 index 1816e4655d..0000000000 --- a/src/base/lib.rs +++ /dev/null @@ -1,19 +0,0 @@ -//! DDNet's base library, Rust part. -//! -//! DDNet's code base is separated into three major parts, `base`, `engine` and -//! `game`. -//! -//! The base library consists of operating system abstractions, and -//! game-independent data structures such as color handling and math vectors. -//! Additionally, it contains some types to support the C++-Rust-translation. - -#![warn(missing_docs)] - -#[cfg(test)] -extern crate ddnet_test; - -mod color; -mod rust; - -pub use color::*; -pub use rust::*; diff --git a/src/base/rust.h b/src/base/rust.h deleted file mode 100644 index a1c41c1186..0000000000 --- a/src/base/rust.h +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef BASE_RUST_H -#define BASE_RUST_H -typedef const char *StrRef; -typedef void *UserPtr; -#endif // BASE_RUST_H diff --git a/src/base/rust.rs b/src/base/rust.rs deleted file mode 100644 index b666f11818..0000000000 --- a/src/base/rust.rs +++ /dev/null @@ -1,268 +0,0 @@ -use std::cmp; -use std::ffi::CStr; -use std::fmt; -use std::marker::PhantomData; -use std::ops; -use std::os::raw::c_char; -use std::ptr; -use std::str; - -/// User pointer, as used in callbacks. Corresponds to the C++ type `void *`. -/// -/// Callbacks in C are usually represented by a function pointer and some -/// "userdata" pointer that is also passed to the function pointer. This allows -/// to hand data to the callback. This type represents such a userdata pointer. -/// -/// It is `unsafe` to convert the `UserPtr` back to its original pointer using -/// [`UserPtr::cast`] because its lifetime and type information was lost. -/// -/// When dealing with Rust code exclusively, closures are preferred. -/// -/// # Examples -/// -/// ``` -/// use ddnet_base::UserPtr; -/// -/// struct CallbackData { -/// favorite_color: &'static str, -/// } -/// -/// let data = CallbackData { -/// favorite_color: "green", -/// }; -/// -/// callback(UserPtr::from(&data)); -/// -/// fn callback(pointer: UserPtr) { -/// let data: &CallbackData = unsafe { pointer.cast() }; -/// println!("favorite color: {}", data.favorite_color); -/// } -/// ``` -#[repr(transparent)] -#[derive(Debug, Eq, Ord, PartialEq, PartialOrd)] -pub struct UserPtr(*mut ()); - -unsafe impl cxx::ExternType for UserPtr { - type Id = cxx::type_id!("UserPtr"); - type Kind = cxx::kind::Trivial; -} - -impl UserPtr { - /// Create a null `UserPtr`. - /// - /// # Examples - /// - /// ``` - /// use ddnet_base::UserPtr; - /// - /// // Can't do anything useful with this. - /// let _user = UserPtr::null(); - /// ``` - pub fn null() -> UserPtr { - UserPtr(ptr::null_mut()) - } - - /// Cast `UserPtr` back to a reference to its real type. - /// - /// # Safety - /// - /// The caller is responsible for checking type and lifetime correctness. - /// Also, they must make sure that there are only immutable references or at - /// most one mutable reference live at the same time. - /// - /// # Examples - /// - /// ``` - /// use ddnet_base::UserPtr; - /// - /// let the_answer = 42; - /// let user = UserPtr::from(&the_answer); - /// - /// assert_eq!(unsafe { *user.cast::() }, 42); - /// ``` - pub unsafe fn cast(&self) -> &T { - &*(self.0 as *const _) - } - - /// Cast `UserPtr` back to a mutable reference to its real type. - /// - /// See [`UserPtr`] documentation for details and an example. - /// - /// # Safety - /// - /// The caller is responsible for checking type and lifetime correctness. - /// Also, they must make sure that there are only immutable references or at - /// most one mutable reference live at the same time. - /// - /// # Examples - /// - /// ``` - /// use ddnet_base::UserPtr; - /// - /// let mut seen_it = false; - /// let mut user = UserPtr::from(&mut seen_it); - /// - /// unsafe { - /// *user.cast_mut() = true; - /// } - /// - /// assert_eq!(seen_it, true); - /// ``` - pub unsafe fn cast_mut(&mut self) -> &mut T { - &mut *(self.0 as *mut _) - } -} - -impl<'a, T> From<&'a T> for UserPtr { - fn from(t: &'a T) -> UserPtr { - UserPtr(t as *const _ as *mut _) - } -} - -impl<'a, T> From<&'a mut T> for UserPtr { - fn from(t: &'a mut T) -> UserPtr { - UserPtr(t as *mut _ as *mut _) - } -} - -/// C-style string pointer to UTF-8 data. Corresponds to the C++ type `const -/// char *`. -/// -/// The lifetime is the lifetime of the underlying string. -/// -/// This is a separate type from [`std::ffi::CStr`] because that type is not -/// FFI-safe and does not guarantee UTF-8. -/// -/// In Rust code, [`String`] is preferred. For constructing C strings, -/// [`std::ffi::CString`] or this crate's [`s!`](`crate::s!`) macro can be used. -/// -/// # Examples -/// -/// ``` -/// # fn some_c_function(_: StrRef<'_>) {} -/// use ddnet_base::StrRef; -/// use ddnet_base::s; -/// use std::ffi::CStr; -/// use std::ffi::CString; -/// use std::process; -/// -/// some_c_function(CStr::from_bytes_with_nul(b"Hello!\0").unwrap().into()); -/// -/// let string = CString::new(format!("Current PID is {}.", process::id())).unwrap(); -/// some_c_function(string.as_ref().into()); -/// -/// fn c_function_wrapper(s: &CStr) { -/// some_c_function(s.into()); -/// } -/// -/// some_c_function(s!("こんにちはC言語")); -/// ``` -#[repr(transparent)] -#[derive(Eq)] -pub struct StrRef<'a>(*const c_char, PhantomData<&'a ()>); - -unsafe impl<'a> cxx::ExternType for StrRef<'a> { - type Id = cxx::type_id!("StrRef"); - type Kind = cxx::kind::Trivial; -} - -impl<'a> StrRef<'a> { - /// Get the wrapped string reference. - /// - /// This does the same as the `Deref` implementation, differing only in the - /// returned lifetime. `Deref`'s return type is bound by `self`'s lifetime, - /// this returns the more correct and longer lifetime. - /// - /// This is an O(n) operation as it needs to calculate the length of a C - /// string by finding the first NUL byte. - /// - /// # Examples - /// - /// ``` - /// use ddnet_base::s; - /// - /// let str1: &'static str = s!("static string").to_str(); - /// ``` - /// - /// ```compile_fail - /// use ddnet_base::s; - /// - /// // Wrong lifetime. - /// let str2: &'static str = &*s!("another static string"); - /// ``` - /// - pub fn to_str(&self) -> &'a str { - unsafe { str::from_utf8_unchecked(CStr::from_ptr(self.0).to_bytes()) } - } -} - -impl<'a> From<&'a CStr> for StrRef<'a> { - fn from(s: &'a CStr) -> StrRef<'a> { - let bytes = s.to_bytes_with_nul(); - str::from_utf8(bytes).expect("valid UTF-8"); - StrRef(bytes.as_ptr() as *const _, PhantomData) - } -} - -impl<'a> fmt::Debug for StrRef<'a> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - self.to_str().fmt(f) - } -} - -impl<'a> fmt::Display for StrRef<'a> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - self.to_str().fmt(f) - } -} - -impl<'a> cmp::PartialEq for StrRef<'a> { - fn eq(&self, other: &StrRef<'a>) -> bool { - self.to_str().eq(other.to_str()) - } -} - -impl<'a> cmp::PartialEq<&'a str> for StrRef<'a> { - fn eq(&self, other: &&'a str) -> bool { - self.to_str().eq(*other) - } -} - -impl<'a> cmp::PartialOrd for StrRef<'a> { - fn partial_cmp(&self, other: &StrRef<'a>) -> Option { - self.to_str().partial_cmp(other.to_str()) - } -} - -impl<'a> cmp::Ord for StrRef<'a> { - fn cmp(&self, other: &StrRef<'a>) -> cmp::Ordering { - self.to_str().cmp(other.to_str()) - } -} - -impl<'a> ops::Deref for StrRef<'a> { - type Target = str; - fn deref(&self) -> &str { - self.to_str() - } -} - -/// Construct a [`StrRef`] statically. -/// -/// # Examples -/// -/// ``` -/// use ddnet_base::StrRef; -/// use ddnet_base::s; -/// -/// let greeting: StrRef<'static> = s!("Hallöchen, C!"); -/// let status: StrRef<'static> = s!(concat!("Current file: ", file!())); -/// ``` -#[macro_export] -macro_rules! s { - ($str:expr) => { - ::ddnet_base::StrRef::from( - ::std::ffi::CStr::from_bytes_with_nul(::std::concat!($str, "\0").as_bytes()).unwrap(), - ) - }; -} diff --git a/src/engine/Cargo.toml b/src/engine/Cargo.toml deleted file mode 100644 index 48eab28c4e..0000000000 --- a/src/engine/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "ddnet-engine" -version = "0.0.1" -edition = "2021" -publish = false -license = "Zlib" - -[lib] -path = "lib.rs" - -[dependencies] -ddnet-base = { path = "../base" } - -cxx = "1.0" - -[dev-dependencies] -ddnet-engine-shared = { path = "shared" } -ddnet-test = { path = "../rust-bridge/test", features = ["link-test-libraries"] } diff --git a/src/engine/client.h b/src/engine/client.h deleted file mode 100644 index 753568ffc2..0000000000 --- a/src/engine/client.h +++ /dev/null @@ -1,400 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef ENGINE_CLIENT_H -#define ENGINE_CLIENT_H -#include "kernel.h" - -#include "graphics.h" -#include "message.h" -#include - -#include -#include -#include - -#include -#include - -#include -#include - -struct SWarning; - -enum -{ - RECORDER_MANUAL = 0, - RECORDER_AUTO = 1, - RECORDER_RACE = 2, - RECORDER_REPLAYS = 3, - RECORDER_MAX = 4, -}; - -typedef bool (*CLIENTFUNC_FILTER)(const void *pData, int DataSize, void *pUser); -struct CChecksumData; - -class IClient : public IInterface -{ - MACRO_INTERFACE("client") -public: - /* Constants: Client States - STATE_OFFLINE - The client is offline. - STATE_CONNECTING - The client is trying to connect to a server. - STATE_LOADING - The client has connected to a server and is loading resources. - STATE_ONLINE - The client is connected to a server and running the game. - STATE_DEMOPLAYBACK - The client is playing a demo - STATE_QUITTING - The client is quitting. - */ - - enum EClientState - { - STATE_OFFLINE = 0, - STATE_CONNECTING, - STATE_LOADING, - STATE_ONLINE, - STATE_DEMOPLAYBACK, - STATE_QUITTING, - STATE_RESTARTING, - }; - - /** - * More precise state for @see STATE_LOADING - * Sets what is actually happening in the client right now - */ - enum ELoadingStateDetail - { - LOADING_STATE_DETAIL_INITIAL, - LOADING_STATE_DETAIL_LOADING_MAP, - LOADING_STATE_DETAIL_LOADING_DEMO, - LOADING_STATE_DETAIL_SENDING_READY, - LOADING_STATE_DETAIL_GETTING_READY, - }; - - enum ELoadingCallbackDetail - { - LOADING_CALLBACK_DETAIL_MAP, - LOADING_CALLBACK_DETAIL_DEMO, - }; - typedef std::function TLoadingCallback; - CTranslationContext m_TranslationContext; - -protected: - // quick access to state of the client - EClientState m_State = IClient::STATE_OFFLINE; - ELoadingStateDetail m_LoadingStateDetail = LOADING_STATE_DETAIL_INITIAL; - int64_t m_StateStartTime; - - // quick access to time variables - int m_aPrevGameTick[NUM_DUMMIES] = {0, 0}; - int m_aCurGameTick[NUM_DUMMIES] = {0, 0}; - float m_aGameIntraTick[NUM_DUMMIES] = {0.0f, 0.0f}; - float m_aGameTickTime[NUM_DUMMIES] = {0.0f, 0.0f}; - float m_aGameIntraTickSincePrev[NUM_DUMMIES] = {0.0f, 0.0f}; - - int m_aPredTick[NUM_DUMMIES] = {0, 0}; - float m_aPredIntraTick[NUM_DUMMIES] = {0.0f, 0.0f}; - - float m_LocalTime = 0.0f; - float m_GlobalTime = 0.0f; - float m_RenderFrameTime = 0.0001f; - float m_FrameTimeAvg = 0.0001f; - - TLoadingCallback m_LoadingCallback = nullptr; - - char m_aNews[3000] = ""; - int m_Points = -1; - int64_t m_ReconnectTime = 0; - -public: - class CSnapItem - { - public: - int m_Type; - int m_Id; - const void *m_pData; - int m_DataSize; - }; - - enum - { - CONN_MAIN = 0, - CONN_DUMMY, - CONN_CONTACT, - NUM_CONNS, - }; - - enum - { - CONNECTIVITY_UNKNOWN, - CONNECTIVITY_CHECKING, - CONNECTIVITY_UNREACHABLE, - CONNECTIVITY_REACHABLE, - // Different global IP address has been detected for UDP and - // TCP connections. - CONNECTIVITY_DIFFERING_UDP_TCP_IP_ADDRESSES, - }; - - // - inline EClientState State() const { return m_State; } - inline ELoadingStateDetail LoadingStateDetail() const { return m_LoadingStateDetail; } - inline int64_t StateStartTime() const { return m_StateStartTime; } - void SetLoadingStateDetail(ELoadingStateDetail LoadingStateDetail) { m_LoadingStateDetail = LoadingStateDetail; } - - void SetLoadingCallback(TLoadingCallback &&Func) { m_LoadingCallback = std::move(Func); } - - // tick time access - inline int PrevGameTick(int Conn) const { return m_aPrevGameTick[Conn]; } - inline int GameTick(int Conn) const { return m_aCurGameTick[Conn]; } - inline int PredGameTick(int Conn) const { return m_aPredTick[Conn]; } - inline float IntraGameTick(int Conn) const { return m_aGameIntraTick[Conn]; } - inline float PredIntraGameTick(int Conn) const { return m_aPredIntraTick[Conn]; } - inline float IntraGameTickSincePrev(int Conn) const { return m_aGameIntraTickSincePrev[Conn]; } - inline float GameTickTime(int Conn) const { return m_aGameTickTime[Conn]; } - inline int GameTickSpeed() const { return SERVER_TICK_SPEED; } - - // other time access - inline float RenderFrameTime() const { return m_RenderFrameTime; } - inline float LocalTime() const { return m_LocalTime; } - inline float GlobalTime() const { return m_GlobalTime; } - inline float FrameTimeAvg() const { return m_FrameTimeAvg; } - - // actions - virtual void Connect(const char *pAddress, const char *pPassword = nullptr) = 0; - virtual void Disconnect() = 0; - - // dummy - virtual void DummyDisconnect(const char *pReason) = 0; - virtual void DummyConnect() = 0; - virtual bool DummyConnected() const = 0; - virtual bool DummyConnecting() const = 0; - virtual bool DummyConnectingDelayed() const = 0; - virtual bool DummyAllowed() const = 0; - - virtual void Restart() = 0; - virtual void Quit() = 0; - virtual const char *DemoPlayer_Play(const char *pFilename, int StorageType) = 0; -#if defined(CONF_VIDEORECORDER) - virtual const char *DemoPlayer_Render(const char *pFilename, int StorageType, const char *pVideoName, int SpeedIndex, bool StartPaused = false) = 0; -#endif - virtual void DemoRecorder_Start(const char *pFilename, bool WithTimestamp, int Recorder, bool Verbose = false) = 0; - virtual void DemoRecorder_HandleAutoStart() = 0; - virtual void DemoRecorder_UpdateReplayRecorder() = 0; - virtual class IDemoRecorder *DemoRecorder(int Recorder) = 0; - virtual void AutoScreenshot_Start() = 0; - virtual void AutoStatScreenshot_Start() = 0; - virtual void AutoCSV_Start() = 0; - virtual void ServerBrowserUpdate() = 0; - - // gfx - virtual void SwitchWindowScreen(int Index) = 0; - virtual void SetWindowParams(int FullscreenMode, bool IsBorderless) = 0; - virtual void ToggleWindowVSync() = 0; - virtual void Notify(const char *pTitle, const char *pMessage) = 0; - virtual void OnWindowResize() = 0; - - virtual void UpdateAndSwap() = 0; - - // networking - virtual void EnterGame(int Conn) = 0; - - // - virtual const NETADDR &ServerAddress() const = 0; - virtual int ConnectNetTypes() const = 0; - virtual const char *ConnectAddressString() const = 0; - virtual const char *MapDownloadName() const = 0; - virtual int MapDownloadAmount() const = 0; - virtual int MapDownloadTotalsize() const = 0; - - // input - virtual int *GetInput(int Tick, int IsDummy = 0) const = 0; - - // remote console - virtual void RconAuth(const char *pUsername, const char *pPassword, bool Dummy) = 0; - virtual bool RconAuthed() const = 0; - virtual bool UseTempRconCommands() const = 0; - virtual void Rcon(const char *pLine) = 0; - virtual bool ReceivingRconCommands() const = 0; - virtual float GotRconCommandsPercentage() const = 0; - - // server info - virtual void GetServerInfo(class CServerInfo *pServerInfo) const = 0; - virtual bool ServerCapAnyPlayerFlag() const = 0; - - virtual int GetPredictionTime() = 0; - - // snapshot interface - - enum - { - SNAP_CURRENT = 0, - SNAP_PREV = 1, - NUM_SNAPSHOT_TYPES = 2, - }; - - // TODO: Refactor: should redo this a bit i think, too many virtual calls - virtual int SnapNumItems(int SnapId) const = 0; - virtual const void *SnapFindItem(int SnapId, int Type, int Id) const = 0; - virtual CSnapItem SnapGetItem(int SnapId, int Index) const = 0; - - virtual void SnapSetStaticsize(int ItemType, int Size) = 0; - virtual void SnapSetStaticsize7(int ItemType, int Size) = 0; - - virtual int SendMsg(int Conn, CMsgPacker *pMsg, int Flags) = 0; - virtual int SendMsgActive(CMsgPacker *pMsg, int Flags) = 0; - - template - int SendPackMsgActive(T *pMsg, int Flags, bool NoTranslate = false) - { - CMsgPacker Packer(T::ms_MsgId, false, NoTranslate); - if(pMsg->Pack(&Packer)) - return -1; - return SendMsgActive(&Packer, Flags); - } - - template - int SendPackMsg(int Conn, T *pMsg, int Flags, bool NoTranslate = false) - { - CMsgPacker Packer(T::ms_MsgId, false, NoTranslate); - if(pMsg->Pack(&Packer)) - return -1; - return SendMsg(Conn, &Packer, Flags); - } - - // - virtual const char *PlayerName() const = 0; - virtual const char *DummyName() = 0; - virtual const char *ErrorString() const = 0; - virtual const char *LatestVersion() const = 0; - virtual bool ConnectionProblems() const = 0; - - virtual IGraphics::CTextureHandle GetDebugFont() const = 0; // TODO: remove this function - - //DDRace - - virtual const char *GetCurrentMap() const = 0; - virtual const char *GetCurrentMapPath() const = 0; - virtual SHA256_DIGEST GetCurrentMapSha256() const = 0; - virtual unsigned GetCurrentMapCrc() const = 0; - - const char *News() const { return m_aNews; } - int Points() const { return m_Points; } - int64_t ReconnectTime() const { return m_ReconnectTime; } - void SetReconnectTime(int64_t ReconnectTime) { m_ReconnectTime = ReconnectTime; } - - virtual bool IsSixup() const = 0; - - virtual void RaceRecord_Start(const char *pFilename) = 0; - virtual void RaceRecord_Stop() = 0; - virtual bool RaceRecord_IsRecording() = 0; - - virtual void DemoSliceBegin() = 0; - virtual void DemoSliceEnd() = 0; - virtual void DemoSlice(const char *pDstPath, CLIENTFUNC_FILTER pfnFilter, void *pUser) = 0; - - virtual void RequestDDNetInfo() = 0; - virtual bool EditorHasUnsavedData() const = 0; - - virtual void GenerateTimeoutSeed() = 0; - - virtual IFriends *Foes() = 0; - - virtual void GetSmoothTick(int *pSmoothTick, float *pSmoothIntraTick, float MixAmount) = 0; - - virtual void AddWarning(const SWarning &Warning) = 0; - virtual std::optional CurrentWarning() = 0; - - virtual CChecksumData *ChecksumData() = 0; - virtual int UdpConnectivity(int NetType) = 0; - - /** - * Opens a link in the browser. - * - * @param pLink The link to open in a browser. - * - * @return `true` on success, `false` on failure. - * - * @remark This may not be called with untrusted input or it'll result in arbitrary code execution, especially on Windows. - */ - virtual bool ViewLink(const char *pLink) = 0; - /** - * Opens a file or directory with the default program. - * - * @param pFilename The file or folder to open with the default program. - * - * @return `true` on success, `false` on failure. - * - * @remark This may not be called with untrusted input or it'll result in arbitrary code execution, especially on Windows. - */ - virtual bool ViewFile(const char *pFilename) = 0; - -#if defined(CONF_FAMILY_WINDOWS) - virtual void ShellRegister() = 0; - virtual void ShellUnregister() = 0; -#endif - - enum EMessageBoxType - { - MESSAGE_BOX_TYPE_ERROR, - MESSAGE_BOX_TYPE_WARNING, - MESSAGE_BOX_TYPE_INFO, - }; - virtual void ShowMessageBox(const char *pTitle, const char *pMessage, EMessageBoxType Type = MESSAGE_BOX_TYPE_ERROR) = 0; - virtual void GetGpuInfoString(char (&aGpuInfo)[256]) = 0; -}; - -class IGameClient : public IInterface -{ - MACRO_INTERFACE("gameclient") -protected: -public: - virtual void OnConsoleInit() = 0; - - virtual void OnRconType(bool UsernameReq) = 0; - virtual void OnRconLine(const char *pLine) = 0; - virtual void OnInit() = 0; - virtual void InvalidateSnapshot() = 0; - virtual void OnNewSnapshot() = 0; - virtual void OnEnterGame() = 0; - virtual void OnShutdown() = 0; - virtual void OnRender() = 0; - virtual void OnUpdate() = 0; - virtual void OnStateChange(int NewState, int OldState) = 0; - virtual void OnConnected() = 0; - virtual void OnMessage(int MsgId, CUnpacker *pUnpacker, int Conn, bool Dummy) = 0; - virtual void OnPredict() = 0; - virtual void OnActivateEditor() = 0; - virtual void OnWindowResize() = 0; - - virtual int OnSnapInput(int *pData, bool Dummy, bool Force) = 0; - virtual void OnDummySwap() = 0; - virtual void SendDummyInfo(bool Start) = 0; - - virtual const char *GetItemName(int Type) const = 0; - virtual const char *Version() const = 0; - virtual const char *NetVersion() const = 0; - virtual const char *NetVersion7() const = 0; - virtual int DDNetVersion() const = 0; - virtual const char *DDNetVersionStr() const = 0; - - virtual void OnDummyDisconnect() = 0; - virtual void DummyResetInput() = 0; - virtual void Echo(const char *pString) = 0; - - virtual bool CanDisplayWarning() const = 0; - virtual void RenderShutdownMessage() = 0; - - virtual CNetObjHandler *GetNetObjHandler() = 0; - virtual protocol7::CNetObjHandler *GetNetObjHandler7() = 0; - - virtual int ClientVersion7() const = 0; - - virtual void ApplySkin7InfoFromSnapObj(const protocol7::CNetObj_De_ClientInfo *pObj, int ClientId) = 0; - virtual int OnDemoRecSnap7(class CSnapshot *pFrom, class CSnapshot *pTo, int Conn) = 0; - virtual int TranslateSnap(class CSnapshot *pSnapDstSix, class CSnapshot *pSnapSrcSeven, int Conn, bool Dummy) = 0; - - virtual void InitializeLanguage() = 0; -}; - -void SnapshotRemoveExtraProjectileInfo(class CSnapshot *pSnap); - -extern IGameClient *CreateGameClient(); -#endif diff --git a/src/engine/client/backend/backend_base.cpp b/src/engine/client/backend/backend_base.cpp deleted file mode 100644 index 37d3b31784..0000000000 --- a/src/engine/client/backend/backend_base.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "backend_base.h" -#include - -bool CCommandProcessorFragment_GLBase::Texture2DTo3D(uint8_t *pImageBuffer, int ImageWidth, int ImageHeight, size_t PixelSize, int SplitCountWidth, int SplitCountHeight, uint8_t *pTarget3DImageData, int &Target3DImageWidth, int &Target3DImageHeight) -{ - Target3DImageWidth = ImageWidth / SplitCountWidth; - Target3DImageHeight = ImageHeight / SplitCountHeight; - - const size_t FullImageWidth = (size_t)ImageWidth * PixelSize; - - for(int Y = 0; Y < SplitCountHeight; ++Y) - { - for(int X = 0; X < SplitCountWidth; ++X) - { - for(int Y3D = 0; Y3D < Target3DImageHeight; ++Y3D) - { - int DepthIndex = X + Y * SplitCountWidth; - - size_t TargetImageFullWidth = (size_t)Target3DImageWidth * PixelSize; - size_t TargetImageFullSize = TargetImageFullWidth * Target3DImageHeight; - ptrdiff_t ImageOffset = (ptrdiff_t)(((size_t)Y * FullImageWidth * (size_t)Target3DImageHeight) + ((size_t)Y3D * FullImageWidth) + ((size_t)X * TargetImageFullWidth)); - ptrdiff_t TargetImageOffset = (ptrdiff_t)(TargetImageFullSize * (size_t)DepthIndex + ((size_t)Y3D * TargetImageFullWidth)); - mem_copy(pTarget3DImageData + TargetImageOffset, pImageBuffer + ImageOffset, TargetImageFullWidth); - } - } - } - - return true; -} diff --git a/src/engine/client/backend/backend_base.h b/src/engine/client/backend/backend_base.h deleted file mode 100644 index 516fb91df1..0000000000 --- a/src/engine/client/backend/backend_base.h +++ /dev/null @@ -1,179 +0,0 @@ -#ifndef ENGINE_CLIENT_BACKEND_BACKEND_BASE_H -#define ENGINE_CLIENT_BACKEND_BACKEND_BASE_H - -#include - -#include - -#include - -#include -#include -#include -#include -#include - -struct SBackendCapabilites; - -enum EDebugGfxModes -{ - DEBUG_GFX_MODE_NONE = 0, - DEBUG_GFX_MODE_MINIMUM, - DEBUG_GFX_MODE_AFFECTS_PERFORMANCE, - DEBUG_GFX_MODE_VERBOSE, - DEBUG_GFX_MODE_ALL, -}; - -enum ERunCommandReturnTypes -{ - RUN_COMMAND_COMMAND_HANDLED = 0, - RUN_COMMAND_COMMAND_UNHANDLED, - RUN_COMMAND_COMMAND_WARNING, - RUN_COMMAND_COMMAND_ERROR, -}; - -enum EGfxErrorType -{ - GFX_ERROR_TYPE_NONE = 0, - GFX_ERROR_TYPE_INIT, - GFX_ERROR_TYPE_OUT_OF_MEMORY_IMAGE, - GFX_ERROR_TYPE_OUT_OF_MEMORY_BUFFER, - GFX_ERROR_TYPE_OUT_OF_MEMORY_STAGING, - GFX_ERROR_TYPE_RENDER_RECORDING, - GFX_ERROR_TYPE_RENDER_CMD_FAILED, - GFX_ERROR_TYPE_RENDER_SUBMIT_FAILED, - GFX_ERROR_TYPE_SWAP_FAILED, - GFX_ERROR_TYPE_UNKNOWN, -}; - -enum EGfxWarningType -{ - GFX_WARNING_TYPE_NONE = 0, - GFX_WARNING_TYPE_INIT_FAILED, - GFX_WARNING_TYPE_INIT_FAILED_MISSING_INTEGRATED_GPU_DRIVER, - GFX_WARNING_LOW_ON_MEMORY, - GFX_WARNING_MISSING_EXTENSION, - GFX_WARNING_TYPE_UNKNOWN, -}; - -struct SGfxErrorContainer -{ - struct SError - { - bool m_RequiresTranslation; - std::string m_Err; - - bool operator==(const SError &Other) const - { - return m_RequiresTranslation == Other.m_RequiresTranslation && m_Err == Other.m_Err; - } - }; - EGfxErrorType m_ErrorType = EGfxErrorType::GFX_ERROR_TYPE_NONE; - std::vector m_vErrors; -}; - -struct SGfxWarningContainer -{ - EGfxWarningType m_WarningType = EGfxWarningType::GFX_WARNING_TYPE_NONE; - std::vector m_vWarnings; -}; - -class CCommandProcessorFragment_GLBase -{ -protected: - SGfxErrorContainer m_Error; - SGfxWarningContainer m_Warning; - - static bool Texture2DTo3D(uint8_t *pImageBuffer, int ImageWidth, int ImageHeight, size_t PixelSize, int SplitCountWidth, int SplitCountHeight, uint8_t *pTarget3DImageData, int &Target3DImageWidth, int &Target3DImageHeight); - - virtual bool GetPresentedImageData(uint32_t &Width, uint32_t &Height, CImageInfo::EImageFormat &Format, std::vector &vDstData) = 0; - -public: - virtual ~CCommandProcessorFragment_GLBase() = default; - virtual ERunCommandReturnTypes RunCommand(const CCommandBuffer::SCommand *pBaseCommand) = 0; - - virtual void StartCommands(size_t CommandCount, size_t EstimatedRenderCallCount) {} - virtual void EndCommands() {} - - const SGfxErrorContainer &GetError() { return m_Error; } - virtual void ErroneousCleanup() {} - - const SGfxWarningContainer &GetWarning() { return m_Warning; } - - enum - { - CMD_PRE_INIT = CCommandBuffer::CMDGROUP_PLATFORM_GL, - CMD_INIT, - CMD_SHUTDOWN, - CMD_POST_SHUTDOWN, - }; - - struct SCommand_PreInit : public CCommandBuffer::SCommand - { - SCommand_PreInit() : - SCommand(CMD_PRE_INIT) {} - - SDL_Window *m_pWindow; - uint32_t m_Width; - uint32_t m_Height; - - char *m_pVendorString; - char *m_pVersionString; - char *m_pRendererString; - - TTwGraphicsGpuList *m_pGpuList; - }; - - struct SCommand_Init : public CCommandBuffer::SCommand - { - SCommand_Init() : - SCommand(CMD_INIT) {} - - SDL_Window *m_pWindow; - uint32_t m_Width; - uint32_t m_Height; - - class IStorage *m_pStorage; - std::atomic *m_pTextureMemoryUsage; - std::atomic *m_pBufferMemoryUsage; - std::atomic *m_pStreamMemoryUsage; - std::atomic *m_pStagingMemoryUsage; - - TTwGraphicsGpuList *m_pGpuList; - - TGLBackendReadPresentedImageData *m_pReadPresentedImageDataFunc; - - SBackendCapabilites *m_pCapabilities; - int *m_pInitError; - - const char **m_pErrStringPtr; - - char *m_pVendorString; - char *m_pVersionString; - char *m_pRendererString; - - int m_RequestedMajor; - int m_RequestedMinor; - int m_RequestedPatch; - - EBackendType m_RequestedBackend; - - int m_GlewMajor; - int m_GlewMinor; - int m_GlewPatch; - }; - - struct SCommand_Shutdown : public CCommandBuffer::SCommand - { - SCommand_Shutdown() : - SCommand(CMD_SHUTDOWN) {} - }; - - struct SCommand_PostShutdown : public CCommandBuffer::SCommand - { - SCommand_PostShutdown() : - SCommand(CMD_POST_SHUTDOWN) {} - }; -}; - -#endif diff --git a/src/engine/client/backend/glsl_shader_compiler.cpp b/src/engine/client/backend/glsl_shader_compiler.cpp deleted file mode 100644 index f4c6fa095d..0000000000 --- a/src/engine/client/backend/glsl_shader_compiler.cpp +++ /dev/null @@ -1,246 +0,0 @@ -#include "glsl_shader_compiler.h" - -#include -#include - -CGLSLCompiler::CGLSLCompiler(int OpenGLVersionMajor, int OpenGLVersionMinor, int OpenGLVersionPatch, bool IsOpenGLES, float TextureLODBias) -{ - m_OpenGLVersionMajor = OpenGLVersionMajor; - m_OpenGLVersionMinor = OpenGLVersionMinor; - m_OpenGLVersionPatch = OpenGLVersionPatch; - - m_IsOpenGLES = IsOpenGLES; - - m_TextureLODBias = TextureLODBias; - - m_HasTextureArray = false; - m_TextureReplaceType = 0; -} - -void CGLSLCompiler::AddDefine(const std::string &DefineName, const std::string &DefineValue) -{ - m_vDefines.emplace_back(DefineName, DefineValue); -} - -void CGLSLCompiler::AddDefine(const char *pDefineName, const char *pDefineValue) -{ - AddDefine(std::string(pDefineName), std::string(pDefineValue)); -} - -void CGLSLCompiler::ClearDefines() -{ - m_vDefines.clear(); -} - -void CGLSLCompiler::ParseLine(std::string &Line, const char *pReadLine, EGLSLShaderCompilerType Type) -{ - EBackendType BackendType = m_IsOpenGLES ? BACKEND_TYPE_OPENGL_ES : BACKEND_TYPE_OPENGL; - bool IsNewOpenGL = (BackendType == BACKEND_TYPE_OPENGL ? (m_OpenGLVersionMajor >= 4 || (m_OpenGLVersionMajor == 3 && m_OpenGLVersionMinor == 3)) : m_OpenGLVersionMajor >= 3); - if(!IsNewOpenGL) - { - const char *pBuff = pReadLine; - char aTmpStr[1024]; - size_t TmpStrSize = 0; - while(*pBuff) - { - while(*pBuff && str_isspace(*pBuff)) - { - Line.append(1, *pBuff); - ++pBuff; - } - - while(*pBuff && !str_isspace(*pBuff) && *pBuff != '(' && *pBuff != '.') - { - aTmpStr[TmpStrSize++] = *pBuff; - ++pBuff; - } - - if(TmpStrSize > 0) - { - aTmpStr[TmpStrSize] = 0; - TmpStrSize = 0; - if(str_comp(aTmpStr, "layout") == 0) - { - //search for ' in' - while(*pBuff && (*pBuff != ' ' || (*(pBuff + 1) && *(pBuff + 1) != 'i') || *(pBuff + 2) != 'n')) - { - ++pBuff; - } - - if(*pBuff == ' ' && *(pBuff + 1) == 'i' && *(pBuff + 2) == 'n') - { - pBuff += 3; - Line.append("attribute"); - Line.append(pBuff); - return; - } - else - { - dbg_msg("shadercompiler", "Fix shader for older OpenGL versions."); - } - } - else if(str_comp(aTmpStr, "noperspective") == 0 || str_comp(aTmpStr, "smooth") == 0 || str_comp(aTmpStr, "flat") == 0) - { - //search for 'in' or 'out' - while(*pBuff && ((*pBuff != 'i' || *(pBuff + 1) != 'n') && (*pBuff != 'o' || (*(pBuff + 1) && *(pBuff + 1) != 'u') || *(pBuff + 2) != 't'))) - { - // append anything that is inbetween noperspective & in/out vars - Line.push_back(*pBuff); - ++pBuff; - } - - bool Found = false; - if(*pBuff) - { - if(*pBuff == 'i' && *(pBuff + 1) == 'n') - { - pBuff += 2; - Found = true; - } - else if(*pBuff == 'o' && *(pBuff + 1) == 'u' && *(pBuff + 2) == 't') - { - pBuff += 3; - Found = true; - } - } - - if(!Found) - { - dbg_msg("shadercompiler", "Fix shader for older OpenGL versions."); - } - - Line.append("varying"); - Line.append(pBuff); - return; - } - else if(str_comp(aTmpStr, "out") == 0 || str_comp(aTmpStr, "in") == 0) - { - if(Type == GLSL_SHADER_COMPILER_TYPE_FRAGMENT && str_comp(aTmpStr, "out") == 0) - return; - Line.append("varying"); - Line.append(pBuff); - return; - } - else if(str_comp(aTmpStr, "FragClr") == 0) - { - Line.append("gl_FragColor"); - Line.append(pBuff); - return; - } - else if(str_comp(aTmpStr, "texture") == 0) - { - if(m_TextureReplaceType == GLSL_COMPILER_TEXTURE_REPLACE_TYPE_2D) - Line.append("texture2D"); - else if(m_TextureReplaceType == GLSL_COMPILER_TEXTURE_REPLACE_TYPE_3D) - Line.append("texture3D"); - else if(m_TextureReplaceType == GLSL_COMPILER_TEXTURE_REPLACE_TYPE_2D_ARRAY) - Line.append("texture2DArray"); - std::string RestLine; - ParseLine(RestLine, pBuff, Type); - Line.append(RestLine); - return; - } - else - { - Line.append(aTmpStr); - } - } - - if(*pBuff) - { - Line.append(1, *pBuff); - ++pBuff; - } - } - } - else - { - if(BackendType == BACKEND_TYPE_OPENGL_ES) - { - const char *pBuff = pReadLine; - char aTmpStr[1024]; - size_t TmpStrSize = 0; - while(*pBuff) - { - while(*pBuff && str_isspace(*pBuff)) - { - Line.append(1, *pBuff); - ++pBuff; - } - - while(*pBuff && !str_isspace(*pBuff) && *pBuff != '(' && *pBuff != '.') - { - aTmpStr[TmpStrSize++] = *pBuff; - ++pBuff; - } - - if(TmpStrSize > 0) - { - aTmpStr[TmpStrSize] = 0; - TmpStrSize = 0; - - if(str_comp(aTmpStr, "noperspective") == 0) - { - Line.append("smooth"); - Line.append(pBuff); - return; - } - // since GLES doesn't support texture LOD bias as global state, use the shader function instead(since GLES 3.0 uses shaders only anyway) - else if(str_comp(aTmpStr, "texture") == 0) - { - Line.append("texture"); - // check opening and closing brackets to find the end - int CurBrackets = 1; - while(*pBuff && *pBuff != '(') - { - Line.append(1, *pBuff); - - ++pBuff; - } - - if(*pBuff) - { - Line.append(1, *pBuff); - ++pBuff; - } - - while(*pBuff) - { - if(*pBuff == '(') - ++CurBrackets; - if(*pBuff == ')') - --CurBrackets; - - if(CurBrackets == 0) - { - // found end - Line.append(std::string(", ") + std::to_string(m_TextureLODBias) + ")"); - ++pBuff; - break; - } - else - Line.append(1, *pBuff); - ++pBuff; - } - - Line.append(pBuff); - - return; - } - else - { - Line.append(aTmpStr); - } - } - - if(*pBuff) - { - Line.append(1, *pBuff); - ++pBuff; - } - } - } - else - Line = pReadLine; - } -} diff --git a/src/engine/client/backend/glsl_shader_compiler.h b/src/engine/client/backend/glsl_shader_compiler.h deleted file mode 100644 index d3917f46c9..0000000000 --- a/src/engine/client/backend/glsl_shader_compiler.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef ENGINE_CLIENT_BACKEND_GLSL_SHADER_COMPILER_H -#define ENGINE_CLIENT_BACKEND_GLSL_SHADER_COMPILER_H - -#include -#include - -enum EGLSLShaderCompilerType -{ - GLSL_SHADER_COMPILER_TYPE_VERTEX = 0, - GLSL_SHADER_COMPILER_TYPE_FRAGMENT, -}; - -class CGLSLCompiler -{ -private: - friend class CGLSL; - - struct SGLSLCompilerDefine - { - SGLSLCompilerDefine(const std::string &DefineName, const std::string &DefineValue) - { - m_DefineName = DefineName; - m_DefineValue = DefineValue; - } - std::string m_DefineName; - std::string m_DefineValue; - }; - - std::vector m_vDefines; - - int m_OpenGLVersionMajor; - int m_OpenGLVersionMinor; - int m_OpenGLVersionPatch; - - bool m_IsOpenGLES; - - float m_TextureLODBias; - - bool m_HasTextureArray; - int m_TextureReplaceType; // @see EGLSLCompilerTextureReplaceType -public: - CGLSLCompiler(int OpenGLVersionMajor, int OpenGLVersionMinor, int OpenGLVersionPatch, bool IsOpenGLES, float TextureLODBias); - void SetHasTextureArray(bool TextureArray) { m_HasTextureArray = TextureArray; } - void SetTextureReplaceType(int TextureReplaceType) { m_TextureReplaceType = TextureReplaceType; } - - void AddDefine(const std::string &DefineName, const std::string &DefineValue); - void AddDefine(const char *pDefineName, const char *pDefineValue); - void ClearDefines(); - - void ParseLine(std::string &Line, const char *pReadLine, EGLSLShaderCompilerType Type); - - enum EGLSLCompilerTextureReplaceType - { - GLSL_COMPILER_TEXTURE_REPLACE_TYPE_2D = 0, - GLSL_COMPILER_TEXTURE_REPLACE_TYPE_3D, - GLSL_COMPILER_TEXTURE_REPLACE_TYPE_2D_ARRAY, - }; -}; - -#endif diff --git a/src/engine/client/backend/null/backend_null.cpp b/src/engine/client/backend/null/backend_null.cpp deleted file mode 100644 index 409b6661b3..0000000000 --- a/src/engine/client/backend/null/backend_null.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include "backend_null.h" - -#include - -ERunCommandReturnTypes CCommandProcessorFragment_Null::RunCommand(const CCommandBuffer::SCommand *pBaseCommand) -{ - switch(pBaseCommand->m_Cmd) - { - case CCommandProcessorFragment_Null::CMD_INIT: - Cmd_Init(static_cast(pBaseCommand)); - break; - case CCommandBuffer::CMD_TEXTURE_CREATE: - Cmd_Texture_Create(static_cast(pBaseCommand)); - break; - case CCommandBuffer::CMD_TEXT_TEXTURES_CREATE: - Cmd_TextTextures_Create(static_cast(pBaseCommand)); - break; - case CCommandBuffer::CMD_TEXT_TEXTURE_UPDATE: - Cmd_TextTexture_Update(static_cast(pBaseCommand)); - break; - } - return ERunCommandReturnTypes::RUN_COMMAND_COMMAND_HANDLED; -} - -bool CCommandProcessorFragment_Null::Cmd_Init(const SCommand_Init *pCommand) -{ - pCommand->m_pCapabilities->m_TileBuffering = false; - pCommand->m_pCapabilities->m_QuadBuffering = false; - pCommand->m_pCapabilities->m_TextBuffering = false; - pCommand->m_pCapabilities->m_QuadContainerBuffering = false; - - pCommand->m_pCapabilities->m_MipMapping = false; - pCommand->m_pCapabilities->m_NPOTTextures = false; - pCommand->m_pCapabilities->m_3DTextures = false; - pCommand->m_pCapabilities->m_2DArrayTextures = false; - pCommand->m_pCapabilities->m_2DArrayTexturesAsExtension = false; - pCommand->m_pCapabilities->m_ShaderSupport = false; - - pCommand->m_pCapabilities->m_TrianglesAsQuads = false; - - pCommand->m_pCapabilities->m_ContextMajor = 0; - pCommand->m_pCapabilities->m_ContextMinor = 0; - pCommand->m_pCapabilities->m_ContextPatch = 0; - return false; -} - -void CCommandProcessorFragment_Null::Cmd_Texture_Create(const CCommandBuffer::SCommand_Texture_Create *pCommand) -{ - free(pCommand->m_pData); -} - -void CCommandProcessorFragment_Null::Cmd_TextTextures_Create(const CCommandBuffer::SCommand_TextTextures_Create *pCommand) -{ - free(pCommand->m_pTextData); - free(pCommand->m_pTextOutlineData); -} - -void CCommandProcessorFragment_Null::Cmd_TextTexture_Update(const CCommandBuffer::SCommand_TextTexture_Update *pCommand) -{ - free(pCommand->m_pData); -} diff --git a/src/engine/client/backend/null/backend_null.h b/src/engine/client/backend/null/backend_null.h deleted file mode 100644 index dd76703670..0000000000 --- a/src/engine/client/backend/null/backend_null.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef ENGINE_CLIENT_BACKEND_NULL_BACKEND_NULL_H -#define ENGINE_CLIENT_BACKEND_NULL_BACKEND_NULL_H - -#include - -class CCommandProcessorFragment_Null : public CCommandProcessorFragment_GLBase -{ - bool GetPresentedImageData(uint32_t &Width, uint32_t &Height, CImageInfo::EImageFormat &Format, std::vector &vDstData) override { return false; }; - ERunCommandReturnTypes RunCommand(const CCommandBuffer::SCommand *pBaseCommand) override; - bool Cmd_Init(const SCommand_Init *pCommand); - virtual void Cmd_Texture_Create(const CCommandBuffer::SCommand_Texture_Create *pCommand); - virtual void Cmd_TextTextures_Create(const CCommandBuffer::SCommand_TextTextures_Create *pCommand); - virtual void Cmd_TextTexture_Update(const CCommandBuffer::SCommand_TextTexture_Update *pCommand); -}; - -#endif diff --git a/src/engine/client/backend/opengl/backend_opengl.cpp b/src/engine/client/backend/opengl/backend_opengl.cpp deleted file mode 100644 index 3ca11ff59e..0000000000 --- a/src/engine/client/backend/opengl/backend_opengl.cpp +++ /dev/null @@ -1,2102 +0,0 @@ -#include "backend_opengl.h" - -#include - -#include - -#include -#include - -#if defined(BACKEND_AS_OPENGL_ES) || !defined(CONF_BACKEND_OPENGL_ES) - -#include -#include -#include - -#include - -#include - -#ifndef BACKEND_AS_OPENGL_ES -#include -#else -#include -#define GL_TEXTURE_2D_ARRAY_EXT GL_TEXTURE_2D_ARRAY -// GLES doesn't support GL_QUADS, but the code is also never executed -#define GL_QUADS GL_TRIANGLES -#ifndef CONF_BACKEND_OPENGL_ES3 -#include -#define glOrtho glOrthof -#else -#define BACKEND_GL_MODERN_API 1 -#endif -#endif - -// ------------ CCommandProcessorFragment_OpenGL -void CCommandProcessorFragment_OpenGL::Cmd_Update_Viewport(const CCommandBuffer::SCommand_Update_Viewport *pCommand) -{ - if(pCommand->m_ByResize) - { - m_CanvasWidth = (uint32_t)pCommand->m_Width; - m_CanvasHeight = (uint32_t)pCommand->m_Height; - } - glViewport(pCommand->m_X, pCommand->m_Y, pCommand->m_Width, pCommand->m_Height); -} - -size_t CCommandProcessorFragment_OpenGL::GLFormatToPixelSize(int GLFormat) -{ - switch(GLFormat) - { - case GL_RGBA: return 4; - case GL_RGB: return 3; - case GL_RED: return 1; - case GL_ALPHA: return 1; - default: return 4; - } -} - -bool CCommandProcessorFragment_OpenGL::IsTexturedState(const CCommandBuffer::SState &State) -{ - return State.m_Texture >= 0 && State.m_Texture < (int)m_vTextures.size(); -} - -void CCommandProcessorFragment_OpenGL::SetState(const CCommandBuffer::SState &State, bool Use2DArrayTextures) -{ -#ifndef BACKEND_GL_MODERN_API - // blend - switch(State.m_BlendMode) - { - case CCommandBuffer::BLEND_NONE: - glDisable(GL_BLEND); - break; - case CCommandBuffer::BLEND_ALPHA: - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - break; - case CCommandBuffer::BLEND_ADDITIVE: - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE); - break; - default: - dbg_msg("render", "unknown blendmode %d\n", State.m_BlendMode); - }; - m_LastBlendMode = State.m_BlendMode; - - // clip - if(State.m_ClipEnable) - { - glScissor(State.m_ClipX, State.m_ClipY, State.m_ClipW, State.m_ClipH); - glEnable(GL_SCISSOR_TEST); - m_LastClipEnable = true; - } - else if(m_LastClipEnable) - { - // Don't disable it always - glDisable(GL_SCISSOR_TEST); - m_LastClipEnable = false; - } - - glDisable(GL_TEXTURE_2D); - if(!m_HasShaders) - { - if(m_Has3DTextures) - glDisable(GL_TEXTURE_3D); - if(m_Has2DArrayTextures) - { - glDisable(m_2DArrayTarget); - } - } - - if(m_HasShaders && IsNewApi()) - { - glBindSampler(0, 0); - } - - // texture - if(IsTexturedState(State)) - { - if(!Use2DArrayTextures) - { - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, m_vTextures[State.m_Texture].m_Tex); - - if(m_vTextures[State.m_Texture].m_LastWrapMode != State.m_WrapMode) - { - switch(State.m_WrapMode) - { - case CCommandBuffer::WRAP_REPEAT: - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - break; - case CCommandBuffer::WRAP_CLAMP: - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - break; - default: - dbg_msg("render", "unknown wrapmode %d\n", State.m_WrapMode); - }; - m_vTextures[State.m_Texture].m_LastWrapMode = State.m_WrapMode; - } - } - else - { - if(m_Has2DArrayTextures) - { - if(!m_HasShaders) - glEnable(m_2DArrayTarget); - glBindTexture(m_2DArrayTarget, m_vTextures[State.m_Texture].m_Tex2DArray); - } - else if(m_Has3DTextures) - { - if(!m_HasShaders) - glEnable(GL_TEXTURE_3D); - glBindTexture(GL_TEXTURE_3D, m_vTextures[State.m_Texture].m_Tex2DArray); - } - else - { - dbg_msg("opengl", "ERROR: this call should not happen."); - } - } - } - - // screen mapping - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(State.m_ScreenTL.x, State.m_ScreenBR.x, State.m_ScreenBR.y, State.m_ScreenTL.y, -10.0f, 10.f); -#endif -} - -static void ParseVersionString(EBackendType BackendType, const char *pStr, int &VersionMajor, int &VersionMinor, int &VersionPatch) -{ - if(pStr) - { - // if backend is GLES, it starts with "OpenGL ES " or OpenGL ES-CM for older contexts, rest is the same - if(BackendType == BACKEND_TYPE_OPENGL_ES) - { - int StrLenGLES = str_length("OpenGL ES "); - int StrLenGLESCM = str_length("OpenGL ES-CM "); - if(str_comp_num(pStr, "OpenGL ES ", StrLenGLES) == 0) - pStr += StrLenGLES; - else if(str_comp_num(pStr, "OpenGL ES-CM ", StrLenGLESCM) == 0) - pStr += StrLenGLESCM; - } - - char aCurNumberStr[32]; - size_t CurNumberStrLen = 0; - size_t TotalNumbersPassed = 0; - int aNumbers[3] = {0}; - bool LastWasNumber = false; - while(*pStr && TotalNumbersPassed < 3) - { - if(str_isnum(*pStr)) - { - aCurNumberStr[CurNumberStrLen++] = (char)*pStr; - LastWasNumber = true; - } - else if(LastWasNumber && (*pStr == '.' || *pStr == ' ')) - { - if(CurNumberStrLen > 0) - { - aCurNumberStr[CurNumberStrLen] = 0; - aNumbers[TotalNumbersPassed++] = str_toint(aCurNumberStr); - CurNumberStrLen = 0; - } - - LastWasNumber = false; - - if(*pStr != '.') - break; - } - else - { - break; - } - - ++pStr; - } - - VersionMajor = aNumbers[0]; - VersionMinor = aNumbers[1]; - VersionPatch = aNumbers[2]; - } -} - -#ifndef BACKEND_AS_OPENGL_ES -static const char *GetGLErrorName(GLenum Type) -{ - if(Type == GL_DEBUG_TYPE_ERROR) - return "ERROR"; - else if(Type == GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR) - return "DEPRECATED BEHAVIOR"; - else if(Type == GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR) - return "UNDEFINED BEHAVIOR"; - else if(Type == GL_DEBUG_TYPE_PORTABILITY) - return "PORTABILITY"; - else if(Type == GL_DEBUG_TYPE_PERFORMANCE) - return "PERFORMANCE"; - else if(Type == GL_DEBUG_TYPE_OTHER) - return "OTHER"; - else if(Type == GL_DEBUG_TYPE_MARKER) - return "MARKER"; - else if(Type == GL_DEBUG_TYPE_PUSH_GROUP) - return "PUSH_GROUP"; - else if(Type == GL_DEBUG_TYPE_POP_GROUP) - return "POP_GROUP"; - return "UNKNOWN"; -}; - -static const char *GetGLSeverity(GLenum Type) -{ - if(Type == GL_DEBUG_SEVERITY_HIGH) - return "high"; // All OpenGL Errors, shader compilation/linking errors, or highly-dangerous undefined behavior - else if(Type == GL_DEBUG_SEVERITY_MEDIUM) - return "medium"; // Major performance warnings, shader compilation/linking warnings, or the use of deprecated functionality - else if(Type == GL_DEBUG_SEVERITY_LOW) - return "low"; // Redundant state change performance warning, or unimportant undefined behavior - else if(Type == GL_DEBUG_SEVERITY_NOTIFICATION) - return "notification"; // Anything that isn't an error or performance issue. - - return "unknown"; -} - -static void GLAPIENTRY -GfxOpenGLMessageCallback(GLenum Source, - GLenum Type, - GLuint Id, - GLenum Severity, - GLsizei Length, - const GLchar *pMsg, - const void *pUserParam) -{ - dbg_msg("gfx", "[%s] (importance: %s) %s", GetGLErrorName(Type), GetGLSeverity(Severity), pMsg); -} -#endif - -bool CCommandProcessorFragment_OpenGL::GetPresentedImageData(uint32_t &Width, uint32_t &Height, CImageInfo::EImageFormat &Format, std::vector &vDstData) -{ - if(m_CanvasWidth == 0 || m_CanvasHeight == 0) - { - return false; - } - else - { - Width = m_CanvasWidth; - Height = m_CanvasHeight; - Format = CImageInfo::FORMAT_RGBA; - vDstData.resize((size_t)Width * (Height + 1) * 4); // +1 for flipping image - glReadBuffer(GL_FRONT); - GLint Alignment; - glGetIntegerv(GL_PACK_ALIGNMENT, &Alignment); - glPixelStorei(GL_PACK_ALIGNMENT, 1); - glReadPixels(0, 0, m_CanvasWidth, m_CanvasHeight, GL_RGBA, GL_UNSIGNED_BYTE, vDstData.data()); - glPixelStorei(GL_PACK_ALIGNMENT, Alignment); - - uint8_t *pTempRow = vDstData.data() + Width * Height * 4; - for(uint32_t Y = 0; Y < Height / 2; ++Y) - { - mem_copy(pTempRow, vDstData.data() + Y * Width * 4, Width * 4); - mem_copy(vDstData.data() + Y * Width * 4, vDstData.data() + ((Height - Y) - 1) * Width * 4, Width * 4); - mem_copy(vDstData.data() + ((Height - Y) - 1) * Width * 4, pTempRow, Width * 4); - } - - return true; - } -} - -bool CCommandProcessorFragment_OpenGL::InitOpenGL(const SCommand_Init *pCommand) -{ - m_IsOpenGLES = pCommand->m_RequestedBackend == BACKEND_TYPE_OPENGL_ES; - - *pCommand->m_pReadPresentedImageDataFunc = [this](uint32_t &Width, uint32_t &Height, CImageInfo::EImageFormat &Format, std::vector &vDstData) { - return GetPresentedImageData(Width, Height, Format, vDstData); - }; - - const char *pVendorString = (const char *)glGetString(GL_VENDOR); - dbg_msg("opengl", "Vendor string: %s", pVendorString); - - // check what this context can do - const char *pVersionString = (const char *)glGetString(GL_VERSION); - dbg_msg("opengl", "Version string: %s", pVersionString); - - const char *pRendererString = (const char *)glGetString(GL_RENDERER); - - str_copy(pCommand->m_pVendorString, pVendorString, gs_GpuInfoStringSize); - str_copy(pCommand->m_pVersionString, pVersionString, gs_GpuInfoStringSize); - str_copy(pCommand->m_pRendererString, pRendererString, gs_GpuInfoStringSize); - - // parse version string - ParseVersionString(pCommand->m_RequestedBackend, pVersionString, pCommand->m_pCapabilities->m_ContextMajor, pCommand->m_pCapabilities->m_ContextMinor, pCommand->m_pCapabilities->m_ContextPatch); - - *pCommand->m_pInitError = 0; - - int BlocklistMajor = -1, BlocklistMinor = -1, BlocklistPatch = -1; - bool RequiresWarning = false; - const char *pErrString = ParseBlocklistDriverVersions(pVendorString, pVersionString, BlocklistMajor, BlocklistMinor, BlocklistPatch, RequiresWarning); - // if the driver is buggy, and the requested GL version is the default, fallback - if(pErrString != NULL && pCommand->m_RequestedMajor == 3 && pCommand->m_RequestedMinor == 0 && pCommand->m_RequestedPatch == 0) - { - // if not already in the error state, set the GL version - if(g_Config.m_GfxDriverIsBlocked == 0) - { - // fallback to known good GL version - pCommand->m_pCapabilities->m_ContextMajor = BlocklistMajor; - pCommand->m_pCapabilities->m_ContextMinor = BlocklistMinor; - pCommand->m_pCapabilities->m_ContextPatch = BlocklistPatch; - - // set backend error string - if(RequiresWarning) - *pCommand->m_pErrStringPtr = pErrString; - *pCommand->m_pInitError = -2; - - g_Config.m_GfxDriverIsBlocked = 1; - } - } - // if the driver was in a blocked error state, but is not anymore, reset all config variables - else if(pErrString == NULL && g_Config.m_GfxDriverIsBlocked == 1) - { - pCommand->m_pCapabilities->m_ContextMajor = 3; - pCommand->m_pCapabilities->m_ContextMinor = 0; - pCommand->m_pCapabilities->m_ContextPatch = 0; - - // tell the caller to reinitialize the context - *pCommand->m_pInitError = -2; - - g_Config.m_GfxDriverIsBlocked = 0; - } - - int MajorV = pCommand->m_pCapabilities->m_ContextMajor; - - if(pCommand->m_RequestedBackend == BACKEND_TYPE_OPENGL) - { -#ifndef BACKEND_AS_OPENGL_ES - int MinorV = pCommand->m_pCapabilities->m_ContextMinor; - if(*pCommand->m_pInitError == 0) - { - if(MajorV < pCommand->m_RequestedMajor) - { - *pCommand->m_pInitError = -2; - } - else if(MajorV == pCommand->m_RequestedMajor) - { - if(MinorV < pCommand->m_RequestedMinor) - { - *pCommand->m_pInitError = -2; - } - else if(MinorV == pCommand->m_RequestedMinor) - { - int PatchV = pCommand->m_pCapabilities->m_ContextPatch; - if(PatchV < pCommand->m_RequestedPatch) - { - *pCommand->m_pInitError = -2; - } - } - } - } - - if(*pCommand->m_pInitError == 0) - { - MajorV = pCommand->m_RequestedMajor; - MinorV = pCommand->m_RequestedMinor; - - pCommand->m_pCapabilities->m_2DArrayTexturesAsExtension = false; - pCommand->m_pCapabilities->m_NPOTTextures = true; - pCommand->m_pCapabilities->m_TrianglesAsQuads = false; - - if(MajorV >= 4 || (MajorV == 3 && MinorV == 3)) - { - pCommand->m_pCapabilities->m_TileBuffering = true; - pCommand->m_pCapabilities->m_QuadBuffering = true; - pCommand->m_pCapabilities->m_TextBuffering = true; - pCommand->m_pCapabilities->m_QuadContainerBuffering = true; - pCommand->m_pCapabilities->m_ShaderSupport = true; - - pCommand->m_pCapabilities->m_MipMapping = true; - pCommand->m_pCapabilities->m_3DTextures = true; - pCommand->m_pCapabilities->m_2DArrayTextures = true; - - pCommand->m_pCapabilities->m_TrianglesAsQuads = true; - } - else if(MajorV == 3) - { - pCommand->m_pCapabilities->m_MipMapping = true; - // check for context native 2D array texture size - pCommand->m_pCapabilities->m_3DTextures = false; - pCommand->m_pCapabilities->m_2DArrayTextures = false; - pCommand->m_pCapabilities->m_ShaderSupport = true; - - int TextureLayers = 0; - glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &TextureLayers); - if(TextureLayers >= 256) - { - pCommand->m_pCapabilities->m_2DArrayTextures = true; - } - - int Texture3DSize = 0; - glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE, &Texture3DSize); - if(Texture3DSize >= 256) - { - pCommand->m_pCapabilities->m_3DTextures = true; - } - - if(!pCommand->m_pCapabilities->m_3DTextures && !pCommand->m_pCapabilities->m_2DArrayTextures) - { - *pCommand->m_pInitError = -2; - pCommand->m_pCapabilities->m_ContextMajor = 1; - pCommand->m_pCapabilities->m_ContextMinor = 5; - pCommand->m_pCapabilities->m_ContextPatch = 0; - } - - pCommand->m_pCapabilities->m_TileBuffering = pCommand->m_pCapabilities->m_2DArrayTextures; - pCommand->m_pCapabilities->m_QuadBuffering = false; - pCommand->m_pCapabilities->m_TextBuffering = false; - pCommand->m_pCapabilities->m_QuadContainerBuffering = false; - } - else if(MajorV == 2) - { - pCommand->m_pCapabilities->m_MipMapping = true; - // check for context extension: 2D array texture and its max size - pCommand->m_pCapabilities->m_3DTextures = false; - pCommand->m_pCapabilities->m_2DArrayTextures = false; - - pCommand->m_pCapabilities->m_ShaderSupport = false; - - int Texture3DSize = 0; - glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE, &Texture3DSize); - if(Texture3DSize >= 256) - { - pCommand->m_pCapabilities->m_3DTextures = true; - } - - pCommand->m_pCapabilities->m_TileBuffering = false; - pCommand->m_pCapabilities->m_QuadBuffering = false; - pCommand->m_pCapabilities->m_TextBuffering = false; - pCommand->m_pCapabilities->m_QuadContainerBuffering = false; - - pCommand->m_pCapabilities->m_NPOTTextures = GLEW_ARB_texture_non_power_of_two || pCommand->m_GlewMajor > 2; - - if(!pCommand->m_pCapabilities->m_NPOTTextures || (!pCommand->m_pCapabilities->m_3DTextures && !pCommand->m_pCapabilities->m_2DArrayTextures)) - { - *pCommand->m_pInitError = -2; - pCommand->m_pCapabilities->m_ContextMajor = 1; - pCommand->m_pCapabilities->m_ContextMinor = 5; - pCommand->m_pCapabilities->m_ContextPatch = 0; - } - } - else if(MajorV < 2) - { - pCommand->m_pCapabilities->m_TileBuffering = false; - pCommand->m_pCapabilities->m_QuadBuffering = false; - pCommand->m_pCapabilities->m_TextBuffering = false; - pCommand->m_pCapabilities->m_QuadContainerBuffering = false; - pCommand->m_pCapabilities->m_ShaderSupport = false; - - pCommand->m_pCapabilities->m_MipMapping = false; - pCommand->m_pCapabilities->m_3DTextures = false; - pCommand->m_pCapabilities->m_2DArrayTextures = false; - pCommand->m_pCapabilities->m_NPOTTextures = false; - } - } -#endif - } - else if(pCommand->m_RequestedBackend == BACKEND_TYPE_OPENGL_ES) - { - if(MajorV < 3) - { - pCommand->m_pCapabilities->m_TileBuffering = false; - pCommand->m_pCapabilities->m_QuadBuffering = false; - pCommand->m_pCapabilities->m_TextBuffering = false; - pCommand->m_pCapabilities->m_QuadContainerBuffering = false; - pCommand->m_pCapabilities->m_ShaderSupport = false; - - pCommand->m_pCapabilities->m_MipMapping = false; - pCommand->m_pCapabilities->m_3DTextures = false; - pCommand->m_pCapabilities->m_2DArrayTextures = false; - pCommand->m_pCapabilities->m_NPOTTextures = false; - - pCommand->m_pCapabilities->m_TrianglesAsQuads = false; - } - else - { - pCommand->m_pCapabilities->m_TileBuffering = true; - pCommand->m_pCapabilities->m_QuadBuffering = true; - pCommand->m_pCapabilities->m_TextBuffering = true; - pCommand->m_pCapabilities->m_QuadContainerBuffering = true; - pCommand->m_pCapabilities->m_ShaderSupport = true; - - pCommand->m_pCapabilities->m_MipMapping = true; - pCommand->m_pCapabilities->m_3DTextures = true; - pCommand->m_pCapabilities->m_2DArrayTextures = true; - pCommand->m_pCapabilities->m_NPOTTextures = true; - - pCommand->m_pCapabilities->m_TrianglesAsQuads = true; - } - } - - if(*pCommand->m_pInitError != -2) - { - // set some default settings - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glDisable(GL_CULL_FACE); - glDisable(GL_DEPTH_TEST); - -#ifndef BACKEND_GL_MODERN_API - if(!IsNewApi()) - { - glAlphaFunc(GL_GREATER, 0); - glEnable(GL_ALPHA_TEST); - } -#endif - - glDepthMask(0); - -#ifndef BACKEND_AS_OPENGL_ES - if(g_Config.m_DbgGfx != DEBUG_GFX_MODE_NONE) - { - if(GLEW_KHR_debug || GLEW_ARB_debug_output) - { - // During init, enable debug output - if(GLEW_KHR_debug) - { - glEnable(GL_DEBUG_OUTPUT); - glDebugMessageCallback((GLDEBUGPROC)GfxOpenGLMessageCallback, 0); - } - else if(GLEW_ARB_debug_output) - { - glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB); - glDebugMessageCallbackARB((GLDEBUGPROC)GfxOpenGLMessageCallback, 0); - } - dbg_msg("gfx", "Enabled OpenGL debug mode"); - } - else - dbg_msg("gfx", "Requested OpenGL debug mode, but the driver does not support the required extension"); - } -#endif - - return true; - } - else - return false; -} - -bool CCommandProcessorFragment_OpenGL::Cmd_Init(const SCommand_Init *pCommand) -{ - if(!InitOpenGL(pCommand)) - return false; - - m_pTextureMemoryUsage = pCommand->m_pTextureMemoryUsage; - m_pTextureMemoryUsage->store(0, std::memory_order_relaxed); - m_MaxTexSize = -1; - - m_OpenGLTextureLodBIAS = 0; - - m_Has2DArrayTextures = pCommand->m_pCapabilities->m_2DArrayTextures; - if(pCommand->m_pCapabilities->m_2DArrayTexturesAsExtension) - { - m_Has2DArrayTexturesAsExtension = true; - m_2DArrayTarget = GL_TEXTURE_2D_ARRAY_EXT; - } - else - { - m_Has2DArrayTexturesAsExtension = false; - m_2DArrayTarget = GL_TEXTURE_2D_ARRAY; - } - - m_Has3DTextures = pCommand->m_pCapabilities->m_3DTextures; - m_HasMipMaps = pCommand->m_pCapabilities->m_MipMapping; - m_HasNPOTTextures = pCommand->m_pCapabilities->m_NPOTTextures; - - m_LastBlendMode = CCommandBuffer::BLEND_ALPHA; - m_LastClipEnable = false; - - return true; -} - -void CCommandProcessorFragment_OpenGL::TextureUpdate(int Slot, int X, int Y, int Width, int Height, int GLFormat, uint8_t *pTexData) -{ - glBindTexture(GL_TEXTURE_2D, m_vTextures[Slot].m_Tex); - - if(!m_HasNPOTTextures) - { - float ResizeW = m_vTextures[Slot].m_ResizeWidth; - float ResizeH = m_vTextures[Slot].m_ResizeHeight; - if(ResizeW > 0 && ResizeH > 0) - { - int ResizedW = (int)(Width * ResizeW); - int ResizedH = (int)(Height * ResizeH); - - uint8_t *pTmpData = ResizeImage(pTexData, Width, Height, ResizedW, ResizedH, GLFormatToPixelSize(GLFormat)); - free(pTexData); - pTexData = pTmpData; - - Width = ResizedW; - Height = ResizedH; - } - } - - if(m_vTextures[Slot].m_RescaleCount > 0) - { - int OldWidth = Width; - int OldHeight = Height; - for(int i = 0; i < m_vTextures[Slot].m_RescaleCount; ++i) - { - Width >>= 1; - Height >>= 1; - - X /= 2; - Y /= 2; - } - - uint8_t *pTmpData = ResizeImage(pTexData, OldWidth, OldHeight, Width, Height, GLFormatToPixelSize(GLFormat)); - free(pTexData); - pTexData = pTmpData; - } - - glTexSubImage2D(GL_TEXTURE_2D, 0, X, Y, Width, Height, GLFormat, GL_UNSIGNED_BYTE, pTexData); - free(pTexData); -} - -void CCommandProcessorFragment_OpenGL::DestroyTexture(int Slot) -{ - m_pTextureMemoryUsage->store(m_pTextureMemoryUsage->load(std::memory_order_relaxed) - m_vTextures[Slot].m_MemSize, std::memory_order_relaxed); - - if(m_vTextures[Slot].m_Tex != 0) - { - glDeleteTextures(1, &m_vTextures[Slot].m_Tex); - } - - if(m_vTextures[Slot].m_Tex2DArray != 0) - { - glDeleteTextures(1, &m_vTextures[Slot].m_Tex2DArray); - } - - if(IsNewApi()) - { - if(m_vTextures[Slot].m_Sampler != 0) - { - glDeleteSamplers(1, &m_vTextures[Slot].m_Sampler); - } - if(m_vTextures[Slot].m_Sampler2DArray != 0) - { - glDeleteSamplers(1, &m_vTextures[Slot].m_Sampler2DArray); - } - } - - m_vTextures[Slot].m_Tex = 0; - m_vTextures[Slot].m_Sampler = 0; - m_vTextures[Slot].m_Tex2DArray = 0; - m_vTextures[Slot].m_Sampler2DArray = 0; - m_vTextures[Slot].m_LastWrapMode = CCommandBuffer::WRAP_REPEAT; -} - -void CCommandProcessorFragment_OpenGL::Cmd_Texture_Destroy(const CCommandBuffer::SCommand_Texture_Destroy *pCommand) -{ - DestroyTexture(pCommand->m_Slot); -} - -void CCommandProcessorFragment_OpenGL::TextureCreate(int Slot, int Width, int Height, int GLFormat, int GLStoreFormat, int Flags, uint8_t *pTexData) -{ -#ifndef BACKEND_GL_MODERN_API - - if(m_MaxTexSize == -1) - { - // fix the alignment to allow even 1byte changes, e.g. for alpha components - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - glGetIntegerv(GL_MAX_TEXTURE_SIZE, &m_MaxTexSize); - } - - while(Slot >= (int)m_vTextures.size()) - m_vTextures.resize(m_vTextures.size() * 2); - - m_vTextures[Slot].m_ResizeWidth = -1.f; - m_vTextures[Slot].m_ResizeHeight = -1.f; - - if(!m_HasNPOTTextures) - { - int PowerOfTwoWidth = HighestBit(Width); - int PowerOfTwoHeight = HighestBit(Height); - if(Width != PowerOfTwoWidth || Height != PowerOfTwoHeight) - { - uint8_t *pTmpData = ResizeImage(pTexData, Width, Height, PowerOfTwoWidth, PowerOfTwoHeight, GLFormatToPixelSize(GLFormat)); - free(pTexData); - pTexData = pTmpData; - - m_vTextures[Slot].m_ResizeWidth = (float)PowerOfTwoWidth / (float)Width; - m_vTextures[Slot].m_ResizeHeight = (float)PowerOfTwoHeight / (float)Height; - - Width = PowerOfTwoWidth; - Height = PowerOfTwoHeight; - } - } - - int RescaleCount = 0; - if(GLFormat == GL_RGBA) - { - int OldWidth = Width; - int OldHeight = Height; - bool NeedsResize = false; - - if(Width > m_MaxTexSize || Height > m_MaxTexSize) - { - do - { - Width >>= 1; - Height >>= 1; - ++RescaleCount; - } while(Width > m_MaxTexSize || Height > m_MaxTexSize); - NeedsResize = true; - } - - if(NeedsResize) - { - uint8_t *pTmpData = ResizeImage(pTexData, OldWidth, OldHeight, Width, Height, GLFormatToPixelSize(GLFormat)); - free(pTexData); - pTexData = pTmpData; - } - } - m_vTextures[Slot].m_Width = Width; - m_vTextures[Slot].m_Height = Height; - m_vTextures[Slot].m_RescaleCount = RescaleCount; - - const size_t PixelSize = GLFormatToPixelSize(GLFormat); - - if((Flags & CCommandBuffer::TEXFLAG_NO_2D_TEXTURE) == 0) - { - glGenTextures(1, &m_vTextures[Slot].m_Tex); - glBindTexture(GL_TEXTURE_2D, m_vTextures[Slot].m_Tex); - } - - if(Flags & CCommandBuffer::TEXFLAG_NOMIPMAPS || !m_HasMipMaps) - { - if((Flags & CCommandBuffer::TEXFLAG_NO_2D_TEXTURE) == 0) - { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, GLStoreFormat, Width, Height, 0, GLFormat, GL_UNSIGNED_BYTE, pTexData); - } - } - else - { - if((Flags & CCommandBuffer::TEXFLAG_NO_2D_TEXTURE) == 0) - { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); - -#ifndef BACKEND_AS_OPENGL_ES - if(m_OpenGLTextureLodBIAS != 0 && !m_IsOpenGLES) - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, ((GLfloat)m_OpenGLTextureLodBIAS / 1000.0f)); -#endif - - glTexImage2D(GL_TEXTURE_2D, 0, GLStoreFormat, Width, Height, 0, GLFormat, GL_UNSIGNED_BYTE, pTexData); - } - - int Flag2DArrayTexture = CCommandBuffer::TEXFLAG_TO_2D_ARRAY_TEXTURE; - int Flag3DTexture = CCommandBuffer::TEXFLAG_TO_3D_TEXTURE; - if((Flags & (Flag2DArrayTexture | Flag3DTexture)) != 0) - { - bool Is3DTexture = (Flags & Flag3DTexture) != 0; - - glGenTextures(1, &m_vTextures[Slot].m_Tex2DArray); - - GLenum Target = GL_TEXTURE_3D; - - if(Is3DTexture) - { - Target = GL_TEXTURE_3D; - } - else - { - Target = m_2DArrayTarget; - } - - glBindTexture(Target, m_vTextures[Slot].m_Tex2DArray); - - if(IsNewApi()) - { - glGenSamplers(1, &m_vTextures[Slot].m_Sampler2DArray); - glBindSampler(0, m_vTextures[Slot].m_Sampler2DArray); - } - - glTexParameteri(Target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - if(Is3DTexture) - { - glTexParameteri(Target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - if(IsNewApi()) - glSamplerParameteri(m_vTextures[Slot].m_Sampler2DArray, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - } - else - { - glTexParameteri(Target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - glTexParameteri(Target, GL_GENERATE_MIPMAP, GL_TRUE); - if(IsNewApi()) - glSamplerParameteri(m_vTextures[Slot].m_Sampler2DArray, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - } - - glTexParameteri(Target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(Target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(Target, GL_TEXTURE_WRAP_R, GL_MIRRORED_REPEAT); - -#ifndef BACKEND_AS_OPENGL_ES - if(m_OpenGLTextureLodBIAS != 0 && !m_IsOpenGLES) - glTexParameterf(Target, GL_TEXTURE_LOD_BIAS, ((GLfloat)m_OpenGLTextureLodBIAS / 1000.0f)); -#endif - - if(IsNewApi()) - { - glSamplerParameteri(m_vTextures[Slot].m_Sampler2DArray, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glSamplerParameteri(m_vTextures[Slot].m_Sampler2DArray, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glSamplerParameteri(m_vTextures[Slot].m_Sampler2DArray, GL_TEXTURE_WRAP_R, GL_MIRRORED_REPEAT); - -#ifndef BACKEND_AS_OPENGL_ES - if(m_OpenGLTextureLodBIAS != 0 && !m_IsOpenGLES) - glSamplerParameterf(m_vTextures[Slot].m_Sampler2DArray, GL_TEXTURE_LOD_BIAS, ((GLfloat)m_OpenGLTextureLodBIAS / 1000.0f)); -#endif - - glBindSampler(0, 0); - } - - uint8_t *p3DImageData = static_cast(malloc((size_t)Width * Height * PixelSize)); - int Image3DWidth, Image3DHeight; - - int ConvertWidth = Width; - int ConvertHeight = Height; - - if(ConvertWidth == 0 || (ConvertWidth % 16) != 0 || ConvertHeight == 0 || (ConvertHeight % 16) != 0) - { - dbg_msg("gfx", "3D/2D array texture was resized"); - int NewWidth = maximum(HighestBit(ConvertWidth), 16); - int NewHeight = maximum(HighestBit(ConvertHeight), 16); - uint8_t *pNewTexData = ResizeImage(pTexData, ConvertWidth, ConvertHeight, NewWidth, NewHeight, GLFormatToPixelSize(GLFormat)); - - ConvertWidth = NewWidth; - ConvertHeight = NewHeight; - - free(pTexData); - pTexData = pNewTexData; - } - - if(Texture2DTo3D(pTexData, ConvertWidth, ConvertHeight, PixelSize, 16, 16, p3DImageData, Image3DWidth, Image3DHeight)) - { - glTexImage3D(Target, 0, GLStoreFormat, Image3DWidth, Image3DHeight, 256, 0, GLFormat, GL_UNSIGNED_BYTE, p3DImageData); - } - - free(p3DImageData); - } - } - - // This is the initial value for the wrap modes - m_vTextures[Slot].m_LastWrapMode = CCommandBuffer::WRAP_REPEAT; - - // calculate memory usage - m_vTextures[Slot].m_MemSize = (size_t)Width * Height * PixelSize; - while(Width > 2 && Height > 2) - { - Width >>= 1; - Height >>= 1; - m_vTextures[Slot].m_MemSize += (size_t)Width * Height * PixelSize; - } - m_pTextureMemoryUsage->store(m_pTextureMemoryUsage->load(std::memory_order_relaxed) + m_vTextures[Slot].m_MemSize, std::memory_order_relaxed); - - free(pTexData); -#endif -} - -void CCommandProcessorFragment_OpenGL::Cmd_Texture_Create(const CCommandBuffer::SCommand_Texture_Create *pCommand) -{ - TextureCreate(pCommand->m_Slot, pCommand->m_Width, pCommand->m_Height, GL_RGBA, GL_RGBA, pCommand->m_Flags, pCommand->m_pData); -} - -void CCommandProcessorFragment_OpenGL::Cmd_TextTexture_Update(const CCommandBuffer::SCommand_TextTexture_Update *pCommand) -{ - TextureUpdate(pCommand->m_Slot, pCommand->m_X, pCommand->m_Y, pCommand->m_Width, pCommand->m_Height, GL_ALPHA, pCommand->m_pData); -} - -void CCommandProcessorFragment_OpenGL::Cmd_TextTextures_Destroy(const CCommandBuffer::SCommand_TextTextures_Destroy *pCommand) -{ - DestroyTexture(pCommand->m_Slot); - DestroyTexture(pCommand->m_SlotOutline); -} - -void CCommandProcessorFragment_OpenGL::Cmd_TextTextures_Create(const CCommandBuffer::SCommand_TextTextures_Create *pCommand) -{ - TextureCreate(pCommand->m_Slot, pCommand->m_Width, pCommand->m_Height, GL_ALPHA, GL_ALPHA, CCommandBuffer::TEXFLAG_NOMIPMAPS, pCommand->m_pTextData); - TextureCreate(pCommand->m_SlotOutline, pCommand->m_Width, pCommand->m_Height, GL_ALPHA, GL_ALPHA, CCommandBuffer::TEXFLAG_NOMIPMAPS, pCommand->m_pTextOutlineData); -} - -void CCommandProcessorFragment_OpenGL::Cmd_Clear(const CCommandBuffer::SCommand_Clear *pCommand) -{ - // if clip is still active, force disable it for clearing, enable it again afterwards - bool ClipWasEnabled = m_LastClipEnable; - if(ClipWasEnabled) - { - glDisable(GL_SCISSOR_TEST); - } - glClearColor(pCommand->m_Color.r, pCommand->m_Color.g, pCommand->m_Color.b, 0.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - if(ClipWasEnabled) - { - glEnable(GL_SCISSOR_TEST); - } -} - -void CCommandProcessorFragment_OpenGL::Cmd_Render(const CCommandBuffer::SCommand_Render *pCommand) -{ -#ifndef BACKEND_GL_MODERN_API - SetState(pCommand->m_State); - - glVertexPointer(2, GL_FLOAT, sizeof(CCommandBuffer::SVertex), (char *)pCommand->m_pVertices); - glTexCoordPointer(2, GL_FLOAT, sizeof(CCommandBuffer::SVertex), (char *)pCommand->m_pVertices + sizeof(float) * 2); - glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(CCommandBuffer::SVertex), (char *)pCommand->m_pVertices + sizeof(float) * 4); - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); - - switch(pCommand->m_PrimType) - { - case CCommandBuffer::PRIMTYPE_QUADS: -#ifndef BACKEND_AS_OPENGL_ES - glDrawArrays(GL_QUADS, 0, pCommand->m_PrimCount * 4); -#endif - break; - case CCommandBuffer::PRIMTYPE_LINES: - glDrawArrays(GL_LINES, 0, pCommand->m_PrimCount * 2); - break; - case CCommandBuffer::PRIMTYPE_TRIANGLES: - glDrawArrays(GL_TRIANGLES, 0, pCommand->m_PrimCount * 3); - break; - default: - dbg_msg("render", "unknown primtype %d\n", pCommand->m_PrimType); - }; -#endif -} - -void CCommandProcessorFragment_OpenGL::Cmd_ReadPixel(const CCommandBuffer::SCommand_TrySwapAndReadPixel *pCommand) -{ - // get size of viewport - GLint aViewport[4] = {0, 0, 0, 0}; - glGetIntegerv(GL_VIEWPORT, aViewport); - const int h = aViewport[3]; - - // fetch the pixel - uint8_t aPixelData[3]; - GLint Alignment; - glGetIntegerv(GL_PACK_ALIGNMENT, &Alignment); - glPixelStorei(GL_PACK_ALIGNMENT, 1); - glReadPixels(pCommand->m_Position.x, h - 1 - pCommand->m_Position.y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, aPixelData); - glPixelStorei(GL_PACK_ALIGNMENT, Alignment); - - // fill in the information - *pCommand->m_pColor = ColorRGBA(aPixelData[0] / 255.0f, aPixelData[1] / 255.0f, aPixelData[2] / 255.0f, 1.0f); -} - -void CCommandProcessorFragment_OpenGL::Cmd_Screenshot(const CCommandBuffer::SCommand_TrySwapAndScreenshot *pCommand) -{ - // fetch image data - GLint aViewport[4] = {0, 0, 0, 0}; - glGetIntegerv(GL_VIEWPORT, aViewport); - - int w = aViewport[2]; - int h = aViewport[3]; - - // we allocate one more row to use when we are flipping the texture - unsigned char *pPixelData = (unsigned char *)malloc((size_t)w * (h + 1) * 4); - unsigned char *pTempRow = pPixelData + w * h * 4; - - // fetch the pixels - GLint Alignment; - glGetIntegerv(GL_PACK_ALIGNMENT, &Alignment); - glPixelStorei(GL_PACK_ALIGNMENT, 1); - glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pPixelData); - glPixelStorei(GL_PACK_ALIGNMENT, Alignment); - - // flip the pixel because opengl works from bottom left corner - for(int y = 0; y < h / 2; y++) - { - mem_copy(pTempRow, pPixelData + y * w * 4, w * 4); - mem_copy(pPixelData + y * w * 4, pPixelData + (h - y - 1) * w * 4, w * 4); - mem_copy(pPixelData + (h - y - 1) * w * 4, pTempRow, w * 4); - for(int x = 0; x < w; x++) - { - pPixelData[y * w * 4 + x * 4 + 3] = 255; - pPixelData[(h - y - 1) * w * 4 + x * 4 + 3] = 255; - } - } - - // fill in the information - pCommand->m_pImage->m_Width = w; - pCommand->m_pImage->m_Height = h; - pCommand->m_pImage->m_Format = CImageInfo::FORMAT_RGBA; - pCommand->m_pImage->m_pData = pPixelData; -} - -CCommandProcessorFragment_OpenGL::CCommandProcessorFragment_OpenGL() -{ - m_vTextures.resize(CCommandBuffer::MAX_TEXTURES); - m_HasShaders = false; -} - -ERunCommandReturnTypes CCommandProcessorFragment_OpenGL::RunCommand(const CCommandBuffer::SCommand *pBaseCommand) -{ - switch(pBaseCommand->m_Cmd) - { - case CCommandProcessorFragment_OpenGL::CMD_INIT: - Cmd_Init(static_cast(pBaseCommand)); - break; - case CCommandProcessorFragment_OpenGL::CMD_SHUTDOWN: - Cmd_Shutdown(static_cast(pBaseCommand)); - break; - case CCommandBuffer::CMD_TEXTURE_CREATE: - Cmd_Texture_Create(static_cast(pBaseCommand)); - break; - case CCommandBuffer::CMD_TEXTURE_DESTROY: - Cmd_Texture_Destroy(static_cast(pBaseCommand)); - break; - case CCommandBuffer::CMD_TEXT_TEXTURES_CREATE: - Cmd_TextTextures_Create(static_cast(pBaseCommand)); - break; - case CCommandBuffer::CMD_TEXT_TEXTURES_DESTROY: - Cmd_TextTextures_Destroy(static_cast(pBaseCommand)); - break; - case CCommandBuffer::CMD_TEXT_TEXTURE_UPDATE: - Cmd_TextTexture_Update(static_cast(pBaseCommand)); - break; - case CCommandBuffer::CMD_CLEAR: - Cmd_Clear(static_cast(pBaseCommand)); - break; - case CCommandBuffer::CMD_RENDER: - Cmd_Render(static_cast(pBaseCommand)); - break; - case CCommandBuffer::CMD_RENDER_TEX3D: - Cmd_RenderTex3D(static_cast(pBaseCommand)); - break; - case CCommandBuffer::CMD_TRY_SWAP_AND_READ_PIXEL: - Cmd_ReadPixel(static_cast(pBaseCommand)); - break; - case CCommandBuffer::CMD_TRY_SWAP_AND_SCREENSHOT: - Cmd_Screenshot(static_cast(pBaseCommand)); - break; - case CCommandBuffer::CMD_UPDATE_VIEWPORT: - Cmd_Update_Viewport(static_cast(pBaseCommand)); - break; - - case CCommandBuffer::CMD_CREATE_BUFFER_OBJECT: Cmd_CreateBufferObject(static_cast(pBaseCommand)); break; - case CCommandBuffer::CMD_UPDATE_BUFFER_OBJECT: Cmd_UpdateBufferObject(static_cast(pBaseCommand)); break; - case CCommandBuffer::CMD_RECREATE_BUFFER_OBJECT: Cmd_RecreateBufferObject(static_cast(pBaseCommand)); break; - case CCommandBuffer::CMD_COPY_BUFFER_OBJECT: Cmd_CopyBufferObject(static_cast(pBaseCommand)); break; - case CCommandBuffer::CMD_DELETE_BUFFER_OBJECT: Cmd_DeleteBufferObject(static_cast(pBaseCommand)); break; - - case CCommandBuffer::CMD_CREATE_BUFFER_CONTAINER: Cmd_CreateBufferContainer(static_cast(pBaseCommand)); break; - case CCommandBuffer::CMD_UPDATE_BUFFER_CONTAINER: Cmd_UpdateBufferContainer(static_cast(pBaseCommand)); break; - case CCommandBuffer::CMD_DELETE_BUFFER_CONTAINER: Cmd_DeleteBufferContainer(static_cast(pBaseCommand)); break; - case CCommandBuffer::CMD_INDICES_REQUIRED_NUM_NOTIFY: Cmd_IndicesRequiredNumNotify(static_cast(pBaseCommand)); break; - - case CCommandBuffer::CMD_RENDER_TILE_LAYER: Cmd_RenderTileLayer(static_cast(pBaseCommand)); break; - case CCommandBuffer::CMD_RENDER_BORDER_TILE: Cmd_RenderBorderTile(static_cast(pBaseCommand)); break; - case CCommandBuffer::CMD_RENDER_QUAD_LAYER: Cmd_RenderQuadLayer(static_cast(pBaseCommand)); break; - case CCommandBuffer::CMD_RENDER_TEXT: Cmd_RenderText(static_cast(pBaseCommand)); break; - case CCommandBuffer::CMD_RENDER_QUAD_CONTAINER: Cmd_RenderQuadContainer(static_cast(pBaseCommand)); break; - case CCommandBuffer::CMD_RENDER_QUAD_CONTAINER_EX: Cmd_RenderQuadContainerEx(static_cast(pBaseCommand)); break; - case CCommandBuffer::CMD_RENDER_QUAD_CONTAINER_SPRITE_MULTIPLE: Cmd_RenderQuadContainerAsSpriteMultiple(static_cast(pBaseCommand)); break; - default: return ERunCommandReturnTypes::RUN_COMMAND_COMMAND_UNHANDLED; - } - - return ERunCommandReturnTypes::RUN_COMMAND_COMMAND_HANDLED; -} - -// ------------ CCommandProcessorFragment_OpenGL2 - -void CCommandProcessorFragment_OpenGL2::UseProgram(CGLSLTWProgram *pProgram) -{ - pProgram->UseProgram(); -} - -void CCommandProcessorFragment_OpenGL2::SetState(const CCommandBuffer::SState &State, CGLSLTWProgram *pProgram, bool Use2DArrayTextures) -{ - if(m_LastBlendMode == CCommandBuffer::BLEND_NONE) - { - m_LastBlendMode = CCommandBuffer::BLEND_ALPHA; - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - } - if(State.m_BlendMode != m_LastBlendMode && State.m_BlendMode != CCommandBuffer::BLEND_NONE) - { - // blend - switch(State.m_BlendMode) - { - case CCommandBuffer::BLEND_NONE: - // We don't really need this anymore - // glDisable(GL_BLEND); - break; - case CCommandBuffer::BLEND_ALPHA: - // glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - break; - case CCommandBuffer::BLEND_ADDITIVE: - // glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE); - break; - default: - dbg_msg("render", "unknown blendmode %d\n", State.m_BlendMode); - }; - - m_LastBlendMode = State.m_BlendMode; - } - - // clip - if(State.m_ClipEnable) - { - glScissor(State.m_ClipX, State.m_ClipY, State.m_ClipW, State.m_ClipH); - glEnable(GL_SCISSOR_TEST); - m_LastClipEnable = true; - } - else if(m_LastClipEnable) - { - // Don't disable it always - glDisable(GL_SCISSOR_TEST); - m_LastClipEnable = false; - } - - if(!IsNewApi()) - { - glDisable(GL_TEXTURE_2D); - if(!m_HasShaders) - { - if(m_Has3DTextures) - glDisable(GL_TEXTURE_3D); - if(m_Has2DArrayTextures) - { - glDisable(m_2DArrayTarget); - } - } - } - - // texture - if(IsTexturedState(State)) - { - int Slot = 0; - if(!Use2DArrayTextures) - { - if(!IsNewApi() && !m_HasShaders) - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, m_vTextures[State.m_Texture].m_Tex); - if(IsNewApi()) - glBindSampler(Slot, m_vTextures[State.m_Texture].m_Sampler); - } - else - { - if(!m_Has2DArrayTextures) - { - if(!IsNewApi() && !m_HasShaders) - glEnable(GL_TEXTURE_3D); - glBindTexture(GL_TEXTURE_3D, m_vTextures[State.m_Texture].m_Tex2DArray); - if(IsNewApi()) - glBindSampler(Slot, m_vTextures[State.m_Texture].m_Sampler2DArray); - } - else - { - if(!IsNewApi() && !m_HasShaders) - glEnable(m_2DArrayTarget); - glBindTexture(m_2DArrayTarget, m_vTextures[State.m_Texture].m_Tex2DArray); - if(IsNewApi()) - glBindSampler(Slot, m_vTextures[State.m_Texture].m_Sampler2DArray); - } - } - - if(pProgram->m_LastTextureSampler != Slot) - { - pProgram->SetUniform(pProgram->m_LocTextureSampler, Slot); - pProgram->m_LastTextureSampler = Slot; - } - - if(m_vTextures[State.m_Texture].m_LastWrapMode != State.m_WrapMode && !Use2DArrayTextures) - { - switch(State.m_WrapMode) - { - case CCommandBuffer::WRAP_REPEAT: - if(IsNewApi()) - { - glSamplerParameteri(m_vTextures[State.m_Texture].m_Sampler, GL_TEXTURE_WRAP_S, GL_REPEAT); - glSamplerParameteri(m_vTextures[State.m_Texture].m_Sampler, GL_TEXTURE_WRAP_T, GL_REPEAT); - } - break; - case CCommandBuffer::WRAP_CLAMP: - if(IsNewApi()) - { - glSamplerParameteri(m_vTextures[State.m_Texture].m_Sampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glSamplerParameteri(m_vTextures[State.m_Texture].m_Sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - } - break; - default: - dbg_msg("render", "unknown wrapmode %d\n", State.m_WrapMode); - }; - m_vTextures[State.m_Texture].m_LastWrapMode = State.m_WrapMode; - } - } - - if(pProgram->m_LastScreenTL != State.m_ScreenTL || pProgram->m_LastScreenBR != State.m_ScreenBR) - { - pProgram->m_LastScreenTL = State.m_ScreenTL; - pProgram->m_LastScreenBR = State.m_ScreenBR; - - // screen mapping - // orthographic projection matrix - // the z coordinate is the same for every vertex, so just ignore the z coordinate and set it in the shaders - float m[2 * 4] = { - 2.f / (State.m_ScreenBR.x - State.m_ScreenTL.x), - 0, - 0, - -((State.m_ScreenBR.x + State.m_ScreenTL.x) / (State.m_ScreenBR.x - State.m_ScreenTL.x)), - 0, - (2.f / (State.m_ScreenTL.y - State.m_ScreenBR.y)), - 0, - -((State.m_ScreenTL.y + State.m_ScreenBR.y) / (State.m_ScreenTL.y - State.m_ScreenBR.y)), - }; - - // transpose bcs of column-major order of opengl - glUniformMatrix4x2fv(pProgram->m_LocPos, 1, true, (float *)&m); - } -} - -#ifndef BACKEND_GL_MODERN_API -bool CCommandProcessorFragment_OpenGL2::DoAnalyzeStep(size_t CheckCount, size_t VerticesCount, uint8_t aFakeTexture[], size_t SingleImageSize) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - int Slot = 0; - if(m_HasShaders) - { - CGLSLTWProgram *pProgram = m_pPrimitive3DProgramTextured; - UseProgram(pProgram); - - pProgram->SetUniform(pProgram->m_LocTextureSampler, Slot); - - float m[2 * 4] = { - 1, 0, 0, 0, - 0, 1, 0, 0}; - - // transpose bcs of column-major order of opengl - glUniformMatrix4x2fv(pProgram->m_LocPos, 1, true, (float *)&m); - } - else - { - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(-1, 1, -1, 1, -10.0f, 10.f); - } - - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - - glVertexPointer(2, GL_FLOAT, sizeof(m_aStreamVertices[0]), m_aStreamVertices); - glColorPointer(4, GL_FLOAT, sizeof(m_aStreamVertices[0]), (uint8_t *)m_aStreamVertices + (ptrdiff_t)(sizeof(vec2))); - glTexCoordPointer(3, GL_FLOAT, sizeof(m_aStreamVertices[0]), (uint8_t *)m_aStreamVertices + (ptrdiff_t)(sizeof(vec2) + sizeof(vec4))); - - glDrawArrays(GL_QUADS, 0, VerticesCount); - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - - if(m_HasShaders) - { - glUseProgram(0); - } - - glFinish(); - - GLint aViewport[4] = {0, 0, 0, 0}; - glGetIntegerv(GL_VIEWPORT, aViewport); - - int w = aViewport[2]; - int h = aViewport[3]; - - size_t PixelDataSize = (size_t)w * h * 3; - if(PixelDataSize == 0) - return false; - uint8_t *pPixelData = (uint8_t *)malloc(PixelDataSize); - - // fetch the pixels - GLint Alignment; - glGetIntegerv(GL_PACK_ALIGNMENT, &Alignment); - glPixelStorei(GL_PACK_ALIGNMENT, 1); - glReadPixels(0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE, pPixelData); - glPixelStorei(GL_PACK_ALIGNMENT, Alignment); - - // now analyse the image data - bool CheckFailed = false; - int WidthTile = w / 16; - int HeightTile = h / 16; - int StartX = WidthTile / 2; - int StartY = HeightTile / 2; - for(size_t d = 0; d < CheckCount; ++d) - { - int CurX = (int)d % 16; - int CurY = (int)d / 16; - - int CheckX = StartX + CurX * WidthTile; - int CheckY = StartY + CurY * HeightTile; - - ptrdiff_t OffsetPixelData = (CheckY * (w * 3)) + (CheckX * 3); - ptrdiff_t OffsetFakeTexture = SingleImageSize * d; - OffsetPixelData = clamp(OffsetPixelData, 0, (ptrdiff_t)PixelDataSize); - OffsetFakeTexture = clamp(OffsetFakeTexture, 0, (ptrdiff_t)(SingleImageSize * CheckCount)); - uint8_t *pPixel = pPixelData + OffsetPixelData; - uint8_t *pPixelTex = aFakeTexture + OffsetFakeTexture; - for(size_t i = 0; i < 3; ++i) - { - if((pPixel[i] < pPixelTex[i] - 25) || (pPixel[i] > pPixelTex[i] + 25)) - { - CheckFailed = true; - break; - } - } - } - - free(pPixelData); - return !CheckFailed; -} - -bool CCommandProcessorFragment_OpenGL2::IsTileMapAnalysisSucceeded() -{ - glClearColor(0, 0, 0, 1); - - // create fake texture 1024x1024 - const size_t ImageWidth = 1024; - const size_t ImageHeight = 1024; - uint8_t *pFakeTexture = (uint8_t *)malloc(sizeof(uint8_t) * ImageWidth * ImageHeight * 4); - // fill by colors stepping by 50 => (255 / 50 ~ 5) => 5 times 3(color channels) = 5 ^ 3 = 125 possibilities to check - size_t CheckCount = 5 * 5 * 5; - // always fill 4 pixels of the texture, so the sampling is accurate - int aCurColor[4] = {25, 25, 25, 255}; - const size_t SingleImageWidth = 64; - const size_t SingleImageHeight = 64; - size_t SingleImageSize = SingleImageWidth * SingleImageHeight * 4; - for(size_t d = 0; d < CheckCount; ++d) - { - uint8_t *pCurFakeTexture = pFakeTexture + (ptrdiff_t)(SingleImageSize * d); - - uint8_t aCurColorUint8[SingleImageWidth * SingleImageHeight * 4]; - for(size_t y = 0; y < SingleImageHeight; ++y) - { - for(size_t x = 0; x < SingleImageWidth; ++x) - { - for(size_t i = 0; i < 4; ++i) - { - aCurColorUint8[(y * SingleImageWidth * 4) + (x * 4) + i] = (uint8_t)aCurColor[i]; - } - } - } - mem_copy(pCurFakeTexture, aCurColorUint8, sizeof(aCurColorUint8)); - - aCurColor[2] += 50; - if(aCurColor[2] > 225) - { - aCurColor[2] -= 250; - aCurColor[1] += 50; - } - if(aCurColor[1] > 225) - { - aCurColor[1] -= 250; - aCurColor[0] += 50; - } - if(aCurColor[0] > 225) - { - break; - } - } - - // upload the texture - GLuint FakeTexture; - glGenTextures(1, &FakeTexture); - - GLenum Target = GL_TEXTURE_3D; - if(m_Has2DArrayTextures) - { - Target = m_2DArrayTarget; - } - - glBindTexture(Target, FakeTexture); - glTexParameteri(Target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - if(!m_Has2DArrayTextures) - { - glTexParameteri(Target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - } - else - { - glTexParameteri(Target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - glTexParameteri(Target, GL_GENERATE_MIPMAP, GL_TRUE); - } - - glTexParameteri(Target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(Target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(Target, GL_TEXTURE_WRAP_R, GL_MIRRORED_REPEAT); - - glTexImage3D(Target, 0, GL_RGBA, ImageWidth / 16, ImageHeight / 16, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, pFakeTexture); - - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glDisable(GL_SCISSOR_TEST); - - if(!m_HasShaders) - { - glDisable(GL_TEXTURE_2D); - if(m_Has3DTextures) - glDisable(GL_TEXTURE_3D); - if(m_Has2DArrayTextures) - { - glDisable(m_2DArrayTarget); - } - - if(!m_Has2DArrayTextures) - { - glEnable(GL_TEXTURE_3D); - glBindTexture(GL_TEXTURE_3D, FakeTexture); - } - else - { - glEnable(m_2DArrayTarget); - glBindTexture(m_2DArrayTarget, FakeTexture); - } - } - - static_assert(sizeof(m_aStreamVertices) / sizeof(m_aStreamVertices[0]) >= 256 * 4, "Keep the number of stream vertices >= 256 * 4."); - - size_t VertexCount = 0; - for(size_t i = 0; i < CheckCount; ++i) - { - float XPos = (float)(i % 16); - float YPos = (float)(i / 16); - - GL_SVertexTex3D *pVertex = &m_aStreamVertices[VertexCount++]; - GL_SVertexTex3D *pVertexBefore = pVertex; - pVertex->m_Pos.x = XPos / 16.f; - pVertex->m_Pos.y = YPos / 16.f; - pVertex->m_Color.r = 1; - pVertex->m_Color.g = 1; - pVertex->m_Color.b = 1; - pVertex->m_Color.a = 1; - pVertex->m_Tex.u = 0; - pVertex->m_Tex.v = 0; - - pVertex = &m_aStreamVertices[VertexCount++]; - pVertex->m_Pos.x = XPos / 16.f + 1.f / 16.f; - pVertex->m_Pos.y = YPos / 16.f; - pVertex->m_Color.r = 1; - pVertex->m_Color.g = 1; - pVertex->m_Color.b = 1; - pVertex->m_Color.a = 1; - pVertex->m_Tex.u = 1; - pVertex->m_Tex.v = 0; - - pVertex = &m_aStreamVertices[VertexCount++]; - pVertex->m_Pos.x = XPos / 16.f + 1.f / 16.f; - pVertex->m_Pos.y = YPos / 16.f + 1.f / 16.f; - pVertex->m_Color.r = 1; - pVertex->m_Color.g = 1; - pVertex->m_Color.b = 1; - pVertex->m_Color.a = 1; - pVertex->m_Tex.u = 1; - pVertex->m_Tex.v = 1; - - pVertex = &m_aStreamVertices[VertexCount++]; - pVertex->m_Pos.x = XPos / 16.f; - pVertex->m_Pos.y = YPos / 16.f + 1.f / 16.f; - pVertex->m_Color.r = 1; - pVertex->m_Color.g = 1; - pVertex->m_Color.b = 1; - pVertex->m_Color.a = 1; - pVertex->m_Tex.u = 0; - pVertex->m_Tex.v = 1; - - for(size_t n = 0; n < 4; ++n) - { - pVertexBefore[n].m_Pos.x *= 2; - pVertexBefore[n].m_Pos.x -= 1; - pVertexBefore[n].m_Pos.y *= 2; - pVertexBefore[n].m_Pos.y -= 1; - if(m_Has2DArrayTextures) - { - pVertexBefore[n].m_Tex.w = i; - } - else - { - pVertexBefore[n].m_Tex.w = (i + 0.5f) / 256.f; - } - } - } - - // everything build up, now do the analyze steps - bool NoError = DoAnalyzeStep(CheckCount, VertexCount, pFakeTexture, SingleImageSize); - - glDeleteTextures(1, &FakeTexture); - free(pFakeTexture); - - return NoError; -} - -bool CCommandProcessorFragment_OpenGL2::Cmd_Init(const SCommand_Init *pCommand) -{ - if(!CCommandProcessorFragment_OpenGL::Cmd_Init(pCommand)) - return false; - - m_pTileProgram = nullptr; - m_pTileProgramTextured = nullptr; - m_pPrimitive3DProgram = nullptr; - m_pPrimitive3DProgramTextured = nullptr; - - m_OpenGLTextureLodBIAS = g_Config.m_GfxGLTextureLODBIAS; - - m_HasShaders = pCommand->m_pCapabilities->m_ShaderSupport; - - bool HasAllFunc = true; -#ifndef BACKEND_AS_OPENGL_ES - if(m_HasShaders) - { - HasAllFunc &= (glUniformMatrix4x2fv != NULL) && (glGenBuffers != NULL); - HasAllFunc &= (glBindBuffer != NULL) && (glBufferData != NULL); - HasAllFunc &= (glEnableVertexAttribArray != NULL) && (glVertexAttribPointer != NULL) && (glVertexAttribIPointer != NULL); - HasAllFunc &= (glDisableVertexAttribArray != NULL) && (glDeleteBuffers != NULL); - HasAllFunc &= (glUseProgram != NULL) && (glTexImage3D != NULL); - HasAllFunc &= (glBindAttribLocation != NULL) && (glTexImage3D != NULL); - HasAllFunc &= (glBufferSubData != NULL) && (glGetUniformLocation != NULL); - HasAllFunc &= (glUniform1i != NULL) && (glUniform1f != NULL); - HasAllFunc &= (glUniform1ui != NULL) && (glUniform1i != NULL); - HasAllFunc &= (glUniform1fv != NULL) && (glUniform2fv != NULL); - HasAllFunc &= (glUniform4fv != NULL) && (glGetAttachedShaders != NULL); - HasAllFunc &= (glGetProgramInfoLog != NULL) && (glGetProgramiv != NULL); - HasAllFunc &= (glLinkProgram != NULL) && (glDetachShader != NULL); - HasAllFunc &= (glAttachShader != NULL) && (glDeleteProgram != NULL); - HasAllFunc &= (glCreateProgram != NULL) && (glShaderSource != NULL); - HasAllFunc &= (glCompileShader != NULL) && (glGetShaderiv != NULL); - HasAllFunc &= (glGetShaderInfoLog != NULL) && (glDeleteShader != NULL); - HasAllFunc &= (glCreateShader != NULL); - } -#endif - - bool AnalysisCorrect = true; - if(HasAllFunc) - { - if(m_HasShaders) - { - m_pTileProgram = new CGLSLTileProgram; - m_pTileProgramTextured = new CGLSLTileProgram; - m_pBorderTileProgram = new CGLSLTileProgram; - m_pBorderTileProgramTextured = new CGLSLTileProgram; - m_pPrimitive3DProgram = new CGLSLPrimitiveProgram; - m_pPrimitive3DProgramTextured = new CGLSLPrimitiveProgram; - - CGLSLCompiler ShaderCompiler(g_Config.m_GfxGLMajor, g_Config.m_GfxGLMinor, g_Config.m_GfxGLPatch, m_IsOpenGLES, m_OpenGLTextureLodBIAS / 1000.0f); - ShaderCompiler.SetHasTextureArray(pCommand->m_pCapabilities->m_2DArrayTextures); - - if(pCommand->m_pCapabilities->m_2DArrayTextures) - ShaderCompiler.SetTextureReplaceType(CGLSLCompiler::GLSL_COMPILER_TEXTURE_REPLACE_TYPE_2D_ARRAY); - else - ShaderCompiler.SetTextureReplaceType(CGLSLCompiler::GLSL_COMPILER_TEXTURE_REPLACE_TYPE_3D); - { - CGLSL PrimitiveVertexShader; - CGLSL PrimitiveFragmentShader; - PrimitiveVertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/pipeline.vert", GL_VERTEX_SHADER); - PrimitiveFragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/pipeline.frag", GL_FRAGMENT_SHADER); - - m_pPrimitive3DProgram->CreateProgram(); - m_pPrimitive3DProgram->AddShader(&PrimitiveVertexShader); - m_pPrimitive3DProgram->AddShader(&PrimitiveFragmentShader); - m_pPrimitive3DProgram->LinkProgram(); - - UseProgram(m_pPrimitive3DProgram); - - m_pPrimitive3DProgram->m_LocPos = m_pPrimitive3DProgram->GetUniformLoc("gPos"); - } - - if(pCommand->m_pCapabilities->m_2DArrayTextures) - ShaderCompiler.SetTextureReplaceType(CGLSLCompiler::GLSL_COMPILER_TEXTURE_REPLACE_TYPE_2D_ARRAY); - else - ShaderCompiler.SetTextureReplaceType(CGLSLCompiler::GLSL_COMPILER_TEXTURE_REPLACE_TYPE_3D); - { - CGLSL PrimitiveVertexShader; - CGLSL PrimitiveFragmentShader; - ShaderCompiler.AddDefine("TW_TEXTURED", ""); - if(!pCommand->m_pCapabilities->m_2DArrayTextures) - ShaderCompiler.AddDefine("TW_3D_TEXTURED", ""); - PrimitiveVertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/pipeline.vert", GL_VERTEX_SHADER); - PrimitiveFragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/pipeline.frag", GL_FRAGMENT_SHADER); - ShaderCompiler.ClearDefines(); - - m_pPrimitive3DProgramTextured->CreateProgram(); - m_pPrimitive3DProgramTextured->AddShader(&PrimitiveVertexShader); - m_pPrimitive3DProgramTextured->AddShader(&PrimitiveFragmentShader); - m_pPrimitive3DProgramTextured->LinkProgram(); - - UseProgram(m_pPrimitive3DProgramTextured); - - m_pPrimitive3DProgramTextured->m_LocPos = m_pPrimitive3DProgramTextured->GetUniformLoc("gPos"); - m_pPrimitive3DProgramTextured->m_LocTextureSampler = m_pPrimitive3DProgramTextured->GetUniformLoc("gTextureSampler"); - } - if(pCommand->m_pCapabilities->m_2DArrayTextures) - ShaderCompiler.SetTextureReplaceType(CGLSLCompiler::GLSL_COMPILER_TEXTURE_REPLACE_TYPE_2D_ARRAY); - else - ShaderCompiler.SetTextureReplaceType(CGLSLCompiler::GLSL_COMPILER_TEXTURE_REPLACE_TYPE_3D); - { - CGLSL VertexShader; - CGLSL FragmentShader; - VertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/tile.vert", GL_VERTEX_SHADER); - FragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/tile.frag", GL_FRAGMENT_SHADER); - - m_pTileProgram->CreateProgram(); - m_pTileProgram->AddShader(&VertexShader); - m_pTileProgram->AddShader(&FragmentShader); - - glBindAttribLocation(m_pTileProgram->GetProgramId(), 0, "inVertex"); - - m_pTileProgram->LinkProgram(); - - UseProgram(m_pTileProgram); - - m_pTileProgram->m_LocPos = m_pTileProgram->GetUniformLoc("gPos"); - m_pTileProgram->m_LocColor = m_pTileProgram->GetUniformLoc("gVertColor"); - } - if(pCommand->m_pCapabilities->m_2DArrayTextures) - ShaderCompiler.SetTextureReplaceType(CGLSLCompiler::GLSL_COMPILER_TEXTURE_REPLACE_TYPE_2D_ARRAY); - else - ShaderCompiler.SetTextureReplaceType(CGLSLCompiler::GLSL_COMPILER_TEXTURE_REPLACE_TYPE_3D); - { - CGLSL VertexShader; - CGLSL FragmentShader; - ShaderCompiler.AddDefine("TW_TILE_TEXTURED", ""); - if(!pCommand->m_pCapabilities->m_2DArrayTextures) - ShaderCompiler.AddDefine("TW_TILE_3D_TEXTURED", ""); - VertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/tile.vert", GL_VERTEX_SHADER); - FragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/tile.frag", GL_FRAGMENT_SHADER); - ShaderCompiler.ClearDefines(); - - m_pTileProgramTextured->CreateProgram(); - m_pTileProgramTextured->AddShader(&VertexShader); - m_pTileProgramTextured->AddShader(&FragmentShader); - - glBindAttribLocation(m_pTileProgram->GetProgramId(), 0, "inVertex"); - glBindAttribLocation(m_pTileProgram->GetProgramId(), 1, "inVertexTexCoord"); - - m_pTileProgramTextured->LinkProgram(); - - UseProgram(m_pTileProgramTextured); - - m_pTileProgramTextured->m_LocPos = m_pTileProgramTextured->GetUniformLoc("gPos"); - m_pTileProgramTextured->m_LocTextureSampler = m_pTileProgramTextured->GetUniformLoc("gTextureSampler"); - m_pTileProgramTextured->m_LocColor = m_pTileProgramTextured->GetUniformLoc("gVertColor"); - } - if(pCommand->m_pCapabilities->m_2DArrayTextures) - ShaderCompiler.SetTextureReplaceType(CGLSLCompiler::GLSL_COMPILER_TEXTURE_REPLACE_TYPE_2D_ARRAY); - else - ShaderCompiler.SetTextureReplaceType(CGLSLCompiler::GLSL_COMPILER_TEXTURE_REPLACE_TYPE_3D); - { - CGLSL VertexShader; - CGLSL FragmentShader; - VertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/tile_border.vert", GL_VERTEX_SHADER); - FragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/tile_border.frag", GL_FRAGMENT_SHADER); - ShaderCompiler.ClearDefines(); - - m_pBorderTileProgram->CreateProgram(); - m_pBorderTileProgram->AddShader(&VertexShader); - m_pBorderTileProgram->AddShader(&FragmentShader); - - glBindAttribLocation(m_pBorderTileProgram->GetProgramId(), 0, "inVertex"); - - m_pBorderTileProgram->LinkProgram(); - - UseProgram(m_pBorderTileProgram); - - m_pBorderTileProgram->m_LocPos = m_pBorderTileProgram->GetUniformLoc("gPos"); - m_pBorderTileProgram->m_LocColor = m_pBorderTileProgram->GetUniformLoc("gVertColor"); - m_pBorderTileProgram->m_LocOffset = m_pBorderTileProgram->GetUniformLoc("gOffset"); - m_pBorderTileProgram->m_LocScale = m_pBorderTileProgram->GetUniformLoc("gScale"); - } - if(pCommand->m_pCapabilities->m_2DArrayTextures) - ShaderCompiler.SetTextureReplaceType(CGLSLCompiler::GLSL_COMPILER_TEXTURE_REPLACE_TYPE_2D_ARRAY); - else - ShaderCompiler.SetTextureReplaceType(CGLSLCompiler::GLSL_COMPILER_TEXTURE_REPLACE_TYPE_3D); - { - CGLSL VertexShader; - CGLSL FragmentShader; - ShaderCompiler.AddDefine("TW_TILE_TEXTURED", ""); - if(!pCommand->m_pCapabilities->m_2DArrayTextures) - ShaderCompiler.AddDefine("TW_TILE_3D_TEXTURED", ""); - VertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/tile_border.vert", GL_VERTEX_SHADER); - FragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/tile_border.frag", GL_FRAGMENT_SHADER); - ShaderCompiler.ClearDefines(); - - m_pBorderTileProgramTextured->CreateProgram(); - m_pBorderTileProgramTextured->AddShader(&VertexShader); - m_pBorderTileProgramTextured->AddShader(&FragmentShader); - - glBindAttribLocation(m_pBorderTileProgramTextured->GetProgramId(), 0, "inVertex"); - glBindAttribLocation(m_pBorderTileProgramTextured->GetProgramId(), 1, "inVertexTexCoord"); - - m_pBorderTileProgramTextured->LinkProgram(); - - UseProgram(m_pBorderTileProgramTextured); - - m_pBorderTileProgramTextured->m_LocPos = m_pBorderTileProgramTextured->GetUniformLoc("gPos"); - m_pBorderTileProgramTextured->m_LocTextureSampler = m_pBorderTileProgramTextured->GetUniformLoc("gTextureSampler"); - m_pBorderTileProgramTextured->m_LocColor = m_pBorderTileProgramTextured->GetUniformLoc("gVertColor"); - m_pBorderTileProgramTextured->m_LocOffset = m_pBorderTileProgramTextured->GetUniformLoc("gOffset"); - m_pBorderTileProgramTextured->m_LocScale = m_pBorderTileProgramTextured->GetUniformLoc("gScale"); - } - - glUseProgram(0); - } - - if(g_Config.m_Gfx3DTextureAnalysisRan == 0 || str_comp(g_Config.m_Gfx3DTextureAnalysisRenderer, pCommand->m_pRendererString) != 0 || str_comp(g_Config.m_Gfx3DTextureAnalysisVersion, pCommand->m_pVersionString) != 0) - { - AnalysisCorrect = IsTileMapAnalysisSucceeded(); - if(AnalysisCorrect) - { - g_Config.m_Gfx3DTextureAnalysisRan = 1; - str_copy(g_Config.m_Gfx3DTextureAnalysisRenderer, pCommand->m_pRendererString); - str_copy(g_Config.m_Gfx3DTextureAnalysisVersion, pCommand->m_pVersionString); - } - } - } - - if(!AnalysisCorrect || !HasAllFunc) - { - // downgrade to opengl 1.5 - *pCommand->m_pInitError = -2; - pCommand->m_pCapabilities->m_ContextMajor = 1; - pCommand->m_pCapabilities->m_ContextMinor = 5; - pCommand->m_pCapabilities->m_ContextPatch = 0; - - return false; - } - - return true; -} - -void CCommandProcessorFragment_OpenGL2::Cmd_Shutdown(const SCommand_Shutdown *pCommand) -{ - // TODO: cleanup the OpenGL context too - delete m_pTileProgram; - delete m_pTileProgramTextured; - delete m_pPrimitive3DProgram; - delete m_pPrimitive3DProgramTextured; - for(auto &BufferObject : m_vBufferObjectIndices) - free(BufferObject.m_pData); -} - -void CCommandProcessorFragment_OpenGL2::Cmd_RenderTex3D(const CCommandBuffer::SCommand_RenderTex3D *pCommand) -{ - if(m_HasShaders) - { - CGLSLPrimitiveProgram *pProgram = NULL; - if(IsTexturedState(pCommand->m_State)) - { - pProgram = m_pPrimitive3DProgramTextured; - } - else - pProgram = m_pPrimitive3DProgram; - - UseProgram(pProgram); - - SetState(pCommand->m_State, pProgram, true); - } - else - { - CCommandProcessorFragment_OpenGL::SetState(pCommand->m_State, true); - } - - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - - glVertexPointer(2, GL_FLOAT, sizeof(pCommand->m_pVertices[0]), pCommand->m_pVertices); - glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(pCommand->m_pVertices[0]), (uint8_t *)pCommand->m_pVertices + (ptrdiff_t)(sizeof(vec2))); - glTexCoordPointer(3, GL_FLOAT, sizeof(pCommand->m_pVertices[0]), (uint8_t *)pCommand->m_pVertices + (ptrdiff_t)(sizeof(vec2) + sizeof(unsigned char) * 4)); - - switch(pCommand->m_PrimType) - { - case CCommandBuffer::PRIMTYPE_QUADS: - glDrawArrays(GL_QUADS, 0, pCommand->m_PrimCount * 4); - break; - case CCommandBuffer::PRIMTYPE_TRIANGLES: - glDrawArrays(GL_TRIANGLES, 0, pCommand->m_PrimCount * 3); - break; - default: - dbg_msg("render", "unknown primtype %d\n", pCommand->m_PrimType); - }; - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - - if(m_HasShaders) - { - glUseProgram(0); - } -} - -void CCommandProcessorFragment_OpenGL2::Cmd_CreateBufferObject(const CCommandBuffer::SCommand_CreateBufferObject *pCommand) -{ - void *pUploadData = pCommand->m_pUploadData; - int Index = pCommand->m_BufferIndex; - // create necessary space - if((size_t)Index >= m_vBufferObjectIndices.size()) - { - for(int i = m_vBufferObjectIndices.size(); i < Index + 1; ++i) - { - m_vBufferObjectIndices.emplace_back(0); - } - } - - GLuint VertBufferId = 0; - - glGenBuffers(1, &VertBufferId); - glBindBuffer(GL_ARRAY_BUFFER, VertBufferId); - glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)(pCommand->m_DataSize), pUploadData, GL_STATIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); - - SBufferObject &BufferObject = m_vBufferObjectIndices[Index]; - BufferObject.m_BufferObjectId = VertBufferId; - BufferObject.m_DataSize = pCommand->m_DataSize; - BufferObject.m_pData = static_cast(malloc(pCommand->m_DataSize)); - if(pUploadData) - mem_copy(BufferObject.m_pData, pUploadData, pCommand->m_DataSize); - - if(pCommand->m_DeletePointer) - free(pUploadData); -} - -void CCommandProcessorFragment_OpenGL2::Cmd_RecreateBufferObject(const CCommandBuffer::SCommand_RecreateBufferObject *pCommand) -{ - void *pUploadData = pCommand->m_pUploadData; - int Index = pCommand->m_BufferIndex; - SBufferObject &BufferObject = m_vBufferObjectIndices[Index]; - - glBindBuffer(GL_ARRAY_BUFFER, BufferObject.m_BufferObjectId); - glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)(pCommand->m_DataSize), pUploadData, GL_STATIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); - - BufferObject.m_DataSize = pCommand->m_DataSize; - free(BufferObject.m_pData); - BufferObject.m_pData = static_cast(malloc(pCommand->m_DataSize)); - if(pUploadData) - mem_copy(BufferObject.m_pData, pUploadData, pCommand->m_DataSize); - - if(pCommand->m_DeletePointer) - free(pUploadData); -} - -void CCommandProcessorFragment_OpenGL2::Cmd_UpdateBufferObject(const CCommandBuffer::SCommand_UpdateBufferObject *pCommand) -{ - void *pUploadData = pCommand->m_pUploadData; - int Index = pCommand->m_BufferIndex; - SBufferObject &BufferObject = m_vBufferObjectIndices[Index]; - - glBindBuffer(GL_ARRAY_BUFFER, BufferObject.m_BufferObjectId); - glBufferSubData(GL_ARRAY_BUFFER, (GLintptr)(pCommand->m_pOffset), (GLsizeiptr)(pCommand->m_DataSize), pUploadData); - glBindBuffer(GL_ARRAY_BUFFER, 0); - - if(pUploadData) - mem_copy(BufferObject.m_pData + (ptrdiff_t)pCommand->m_pOffset, pUploadData, pCommand->m_DataSize); - - if(pCommand->m_DeletePointer) - free(pUploadData); -} - -void CCommandProcessorFragment_OpenGL2::Cmd_CopyBufferObject(const CCommandBuffer::SCommand_CopyBufferObject *pCommand) -{ - int WriteIndex = pCommand->m_WriteBufferIndex; - int ReadIndex = pCommand->m_ReadBufferIndex; - - SBufferObject &ReadBufferObject = m_vBufferObjectIndices[ReadIndex]; - SBufferObject &WriteBufferObject = m_vBufferObjectIndices[WriteIndex]; - - mem_copy(WriteBufferObject.m_pData + (ptrdiff_t)pCommand->m_WriteOffset, ReadBufferObject.m_pData + (ptrdiff_t)pCommand->m_ReadOffset, pCommand->m_CopySize); - - glBindBuffer(GL_ARRAY_BUFFER, WriteBufferObject.m_BufferObjectId); - glBufferSubData(GL_ARRAY_BUFFER, (GLintptr)(pCommand->m_WriteOffset), (GLsizeiptr)(pCommand->m_CopySize), WriteBufferObject.m_pData + (ptrdiff_t)pCommand->m_WriteOffset); - glBindBuffer(GL_ARRAY_BUFFER, 0); -} - -void CCommandProcessorFragment_OpenGL2::Cmd_DeleteBufferObject(const CCommandBuffer::SCommand_DeleteBufferObject *pCommand) -{ - int Index = pCommand->m_BufferIndex; - SBufferObject &BufferObject = m_vBufferObjectIndices[Index]; - - glDeleteBuffers(1, &BufferObject.m_BufferObjectId); - - free(BufferObject.m_pData); - BufferObject.m_pData = NULL; -} - -void CCommandProcessorFragment_OpenGL2::Cmd_CreateBufferContainer(const CCommandBuffer::SCommand_CreateBufferContainer *pCommand) -{ - int Index = pCommand->m_BufferContainerIndex; - // create necessary space - if((size_t)Index >= m_vBufferContainers.size()) - { - for(int i = m_vBufferContainers.size(); i < Index + 1; ++i) - { - SBufferContainer Container; - Container.m_ContainerInfo.m_Stride = 0; - Container.m_ContainerInfo.m_VertBufferBindingIndex = -1; - m_vBufferContainers.push_back(Container); - } - } - - SBufferContainer &BufferContainer = m_vBufferContainers[Index]; - - for(size_t i = 0; i < pCommand->m_AttrCount; ++i) - { - BufferContainer.m_ContainerInfo.m_vAttributes.push_back(pCommand->m_pAttributes[i]); - } - - BufferContainer.m_ContainerInfo.m_Stride = pCommand->m_Stride; - BufferContainer.m_ContainerInfo.m_VertBufferBindingIndex = pCommand->m_VertBufferBindingIndex; -} - -void CCommandProcessorFragment_OpenGL2::Cmd_UpdateBufferContainer(const CCommandBuffer::SCommand_UpdateBufferContainer *pCommand) -{ - SBufferContainer &BufferContainer = m_vBufferContainers[pCommand->m_BufferContainerIndex]; - - BufferContainer.m_ContainerInfo.m_vAttributes.clear(); - - for(size_t i = 0; i < pCommand->m_AttrCount; ++i) - { - BufferContainer.m_ContainerInfo.m_vAttributes.push_back(pCommand->m_pAttributes[i]); - } - - BufferContainer.m_ContainerInfo.m_Stride = pCommand->m_Stride; - BufferContainer.m_ContainerInfo.m_VertBufferBindingIndex = pCommand->m_VertBufferBindingIndex; -} - -void CCommandProcessorFragment_OpenGL2::Cmd_DeleteBufferContainer(const CCommandBuffer::SCommand_DeleteBufferContainer *pCommand) -{ - SBufferContainer &BufferContainer = m_vBufferContainers[pCommand->m_BufferContainerIndex]; - - if(pCommand->m_DestroyAllBO) - { - int VertBufferId = BufferContainer.m_ContainerInfo.m_VertBufferBindingIndex; - if(VertBufferId != -1) - { - glDeleteBuffers(1, &m_vBufferObjectIndices[VertBufferId].m_BufferObjectId); - - free(m_vBufferObjectIndices[VertBufferId].m_pData); - m_vBufferObjectIndices[VertBufferId].m_pData = NULL; - } - } - - BufferContainer.m_ContainerInfo.m_vAttributes.clear(); -} - -void CCommandProcessorFragment_OpenGL2::Cmd_IndicesRequiredNumNotify(const CCommandBuffer::SCommand_IndicesRequiredNumNotify *pCommand) -{ -} - -void CCommandProcessorFragment_OpenGL2::Cmd_RenderBorderTile(const CCommandBuffer::SCommand_RenderBorderTile *pCommand) -{ - int Index = pCommand->m_BufferContainerIndex; - // if space not there return - if((size_t)Index >= m_vBufferContainers.size()) - return; - - SBufferContainer &BufferContainer = m_vBufferContainers[Index]; - - CGLSLTileProgram *pProgram = NULL; - if(IsTexturedState(pCommand->m_State)) - pProgram = m_pBorderTileProgramTextured; - else - pProgram = m_pBorderTileProgram; - UseProgram(pProgram); - - SetState(pCommand->m_State, pProgram, true); - pProgram->SetUniformVec4(pProgram->m_LocColor, 1, (float *)&pCommand->m_Color); - - pProgram->SetUniformVec2(pProgram->m_LocOffset, 1, (float *)&pCommand->m_Offset); - pProgram->SetUniformVec2(pProgram->m_LocScale, 1, (float *)&pCommand->m_Scale); - - bool IsTextured = BufferContainer.m_ContainerInfo.m_vAttributes.size() == 2; - - SBufferObject &BufferObject = m_vBufferObjectIndices[(size_t)BufferContainer.m_ContainerInfo.m_VertBufferBindingIndex]; - - glBindBuffer(GL_ARRAY_BUFFER, BufferObject.m_BufferObjectId); - - glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 2, GL_FLOAT, false, BufferContainer.m_ContainerInfo.m_Stride, BufferContainer.m_ContainerInfo.m_vAttributes[0].m_pOffset); - if(IsTextured) - { - glEnableVertexAttribArray(1); - glVertexAttribIPointer(1, 4, GL_UNSIGNED_BYTE, BufferContainer.m_ContainerInfo.m_Stride, BufferContainer.m_ContainerInfo.m_vAttributes[1].m_pOffset); - } - - size_t RealDrawCount = pCommand->m_DrawNum * 4; - GLint RealOffset = (GLint)((((size_t)(uintptr_t)(pCommand->m_pIndicesOffset)) / (6 * sizeof(unsigned int))) * 4); - glDrawArrays(GL_QUADS, RealOffset, RealDrawCount); - - glDisableVertexAttribArray(0); - if(IsTextured) - glDisableVertexAttribArray(1); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glUseProgram(0); -} - -void CCommandProcessorFragment_OpenGL2::Cmd_RenderTileLayer(const CCommandBuffer::SCommand_RenderTileLayer *pCommand) -{ - int Index = pCommand->m_BufferContainerIndex; - // if space not there return - if((size_t)Index >= m_vBufferContainers.size()) - return; - - SBufferContainer &BufferContainer = m_vBufferContainers[Index]; - - if(pCommand->m_IndicesDrawNum == 0) - { - return; // nothing to draw - } - - CGLSLTileProgram *pProgram = NULL; - if(IsTexturedState(pCommand->m_State)) - { - pProgram = m_pTileProgramTextured; - } - else - pProgram = m_pTileProgram; - - UseProgram(pProgram); - - SetState(pCommand->m_State, pProgram, true); - pProgram->SetUniformVec4(pProgram->m_LocColor, 1, (float *)&pCommand->m_Color); - - bool IsTextured = BufferContainer.m_ContainerInfo.m_vAttributes.size() == 2; - - SBufferObject &BufferObject = m_vBufferObjectIndices[(size_t)BufferContainer.m_ContainerInfo.m_VertBufferBindingIndex]; - - glBindBuffer(GL_ARRAY_BUFFER, BufferObject.m_BufferObjectId); - - glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 2, GL_FLOAT, false, BufferContainer.m_ContainerInfo.m_Stride, BufferContainer.m_ContainerInfo.m_vAttributes[0].m_pOffset); - if(IsTextured) - { - glEnableVertexAttribArray(1); - glVertexAttribIPointer(1, 4, GL_UNSIGNED_BYTE, BufferContainer.m_ContainerInfo.m_Stride, BufferContainer.m_ContainerInfo.m_vAttributes[1].m_pOffset); - } - - for(int i = 0; i < pCommand->m_IndicesDrawNum; ++i) - { - size_t RealDrawCount = (pCommand->m_pDrawCount[i] / 6) * 4; - GLint RealOffset = (GLint)((((size_t)(uintptr_t)(pCommand->m_pIndicesOffsets[i])) / (6 * sizeof(unsigned int))) * 4); - glDrawArrays(GL_QUADS, RealOffset, RealDrawCount); - } - - glDisableVertexAttribArray(0); - if(IsTextured) - glDisableVertexAttribArray(1); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glUseProgram(0); -} - -#undef BACKEND_GL_MODERN_API - -#endif - -#endif diff --git a/src/engine/client/backend/opengl/backend_opengl.h b/src/engine/client/backend/opengl/backend_opengl.h deleted file mode 100644 index f0d833cc48..0000000000 --- a/src/engine/client/backend/opengl/backend_opengl.h +++ /dev/null @@ -1,205 +0,0 @@ -// This file can be included several times. -#if(!defined(BACKEND_AS_OPENGL_ES) && !defined(ENGINE_CLIENT_BACKEND_OPENGL_BACKEND_OPENGL_H)) || \ - (defined(BACKEND_AS_OPENGL_ES) && !defined(ENGINE_CLIENT_BACKEND_OPENGL_BACKEND_OPENGL_H_AS_ES)) - -#if !defined(BACKEND_AS_OPENGL_ES) && !defined(ENGINE_CLIENT_BACKEND_OPENGL_BACKEND_OPENGL_H) -#define ENGINE_CLIENT_BACKEND_OPENGL_BACKEND_OPENGL_H -#endif - -#if defined(BACKEND_AS_OPENGL_ES) && !defined(ENGINE_CLIENT_BACKEND_OPENGL_BACKEND_OPENGL_H_AS_ES) -#define ENGINE_CLIENT_BACKEND_OPENGL_BACKEND_OPENGL_H_AS_ES -#endif - -#include - -#include - -#include - -class CGLSLTWProgram; -class CGLSLPrimitiveProgram; -class CGLSLTileProgram; - -#if defined(BACKEND_AS_OPENGL_ES) && defined(CONF_BACKEND_OPENGL_ES3) -#define BACKEND_GL_MODERN_API 1 -#endif - -// takes care of opengl related rendering -class CCommandProcessorFragment_OpenGL : public CCommandProcessorFragment_GLBase -{ -protected: - struct CTexture - { - CTexture() : - m_Tex(0), m_Tex2DArray(0), m_Sampler(0), m_Sampler2DArray(0), m_LastWrapMode(CCommandBuffer::WRAP_REPEAT), m_MemSize(0), m_Width(0), m_Height(0), m_RescaleCount(0), m_ResizeWidth(0), m_ResizeHeight(0) - { - } - - TWGLuint m_Tex; - TWGLuint m_Tex2DArray; // or 3D texture as fallback - TWGLuint m_Sampler; - TWGLuint m_Sampler2DArray; // or 3D texture as fallback - int m_LastWrapMode; - - int m_MemSize; - - int m_Width; - int m_Height; - int m_RescaleCount; - float m_ResizeWidth; - float m_ResizeHeight; - }; - std::vector m_vTextures; - std::atomic *m_pTextureMemoryUsage; - - uint32_t m_CanvasWidth = 0; - uint32_t m_CanvasHeight = 0; - - TWGLint m_MaxTexSize; - - bool m_Has2DArrayTextures; - bool m_Has2DArrayTexturesAsExtension; - TWGLenum m_2DArrayTarget; - bool m_Has3DTextures; - bool m_HasMipMaps; - bool m_HasNPOTTextures; - - bool m_HasShaders; - int m_LastBlendMode; // avoid all possible opengl state changes - bool m_LastClipEnable; - - int m_OpenGLTextureLodBIAS; - - bool m_IsOpenGLES; - - bool IsTexturedState(const CCommandBuffer::SState &State); - - bool InitOpenGL(const SCommand_Init *pCommand); - - void SetState(const CCommandBuffer::SState &State, bool Use2DArrayTexture = false); - virtual bool IsNewApi() { return false; } - void DestroyTexture(int Slot); - - bool GetPresentedImageData(uint32_t &Width, uint32_t &Height, CImageInfo::EImageFormat &Format, std::vector &vDstData) override; - - static size_t GLFormatToPixelSize(int GLFormat); - - void TextureUpdate(int Slot, int X, int Y, int Width, int Height, int GLFormat, uint8_t *pTexData); - void TextureCreate(int Slot, int Width, int Height, int GLFormat, int GLStoreFormat, int Flags, uint8_t *pTexData); - - virtual bool Cmd_Init(const SCommand_Init *pCommand); - virtual void Cmd_Shutdown(const SCommand_Shutdown *pCommand) {} - virtual void Cmd_Texture_Destroy(const CCommandBuffer::SCommand_Texture_Destroy *pCommand); - virtual void Cmd_Texture_Create(const CCommandBuffer::SCommand_Texture_Create *pCommand); - virtual void Cmd_TextTexture_Update(const CCommandBuffer::SCommand_TextTexture_Update *pCommand); - virtual void Cmd_TextTextures_Destroy(const CCommandBuffer::SCommand_TextTextures_Destroy *pCommand); - virtual void Cmd_TextTextures_Create(const CCommandBuffer::SCommand_TextTextures_Create *pCommand); - virtual void Cmd_Clear(const CCommandBuffer::SCommand_Clear *pCommand); - virtual void Cmd_Render(const CCommandBuffer::SCommand_Render *pCommand); - virtual void Cmd_RenderTex3D(const CCommandBuffer::SCommand_RenderTex3D *pCommand) { dbg_assert(false, "Call of unsupported Cmd_RenderTex3D"); } - virtual void Cmd_ReadPixel(const CCommandBuffer::SCommand_TrySwapAndReadPixel *pCommand); - virtual void Cmd_Screenshot(const CCommandBuffer::SCommand_TrySwapAndScreenshot *pCommand); - - virtual void Cmd_Update_Viewport(const CCommandBuffer::SCommand_Update_Viewport *pCommand); - - virtual void Cmd_CreateBufferObject(const CCommandBuffer::SCommand_CreateBufferObject *pCommand) { dbg_assert(false, "Call of unsupported Cmd_CreateBufferObject"); } - virtual void Cmd_RecreateBufferObject(const CCommandBuffer::SCommand_RecreateBufferObject *pCommand) { dbg_assert(false, "Call of unsupported Cmd_RecreateBufferObject"); } - virtual void Cmd_UpdateBufferObject(const CCommandBuffer::SCommand_UpdateBufferObject *pCommand) { dbg_assert(false, "Call of unsupported Cmd_UpdateBufferObject"); } - virtual void Cmd_CopyBufferObject(const CCommandBuffer::SCommand_CopyBufferObject *pCommand) { dbg_assert(false, "Call of unsupported Cmd_CopyBufferObject"); } - virtual void Cmd_DeleteBufferObject(const CCommandBuffer::SCommand_DeleteBufferObject *pCommand) { dbg_assert(false, "Call of unsupported Cmd_DeleteBufferObject"); } - - virtual void Cmd_CreateBufferContainer(const CCommandBuffer::SCommand_CreateBufferContainer *pCommand) { dbg_assert(false, "Call of unsupported Cmd_CreateBufferContainer"); } - virtual void Cmd_UpdateBufferContainer(const CCommandBuffer::SCommand_UpdateBufferContainer *pCommand) { dbg_assert(false, "Call of unsupported Cmd_UpdateBufferContainer"); } - virtual void Cmd_DeleteBufferContainer(const CCommandBuffer::SCommand_DeleteBufferContainer *pCommand) { dbg_assert(false, "Call of unsupported Cmd_DeleteBufferContainer"); } - virtual void Cmd_IndicesRequiredNumNotify(const CCommandBuffer::SCommand_IndicesRequiredNumNotify *pCommand) { dbg_assert(false, "Call of unsupported Cmd_IndicesRequiredNumNotify"); } - - virtual void Cmd_RenderTileLayer(const CCommandBuffer::SCommand_RenderTileLayer *pCommand) { dbg_assert(false, "Call of unsupported Cmd_RenderTileLayer"); } - virtual void Cmd_RenderBorderTile(const CCommandBuffer::SCommand_RenderBorderTile *pCommand) { dbg_assert(false, "Call of unsupported Cmd_RenderBorderTile"); } - virtual void Cmd_RenderQuadLayer(const CCommandBuffer::SCommand_RenderQuadLayer *pCommand) { dbg_assert(false, "Call of unsupported Cmd_RenderQuadLayer"); } - virtual void Cmd_RenderText(const CCommandBuffer::SCommand_RenderText *pCommand) { dbg_assert(false, "Call of unsupported Cmd_RenderText"); } - virtual void Cmd_RenderQuadContainer(const CCommandBuffer::SCommand_RenderQuadContainer *pCommand) { dbg_assert(false, "Call of unsupported Cmd_RenderQuadContainer"); } - virtual void Cmd_RenderQuadContainerEx(const CCommandBuffer::SCommand_RenderQuadContainerEx *pCommand) { dbg_assert(false, "Call of unsupported Cmd_RenderQuadContainerEx"); } - virtual void Cmd_RenderQuadContainerAsSpriteMultiple(const CCommandBuffer::SCommand_RenderQuadContainerAsSpriteMultiple *pCommand) { dbg_assert(false, "Call of unsupported Cmd_RenderQuadContainerAsSpriteMultiple"); } - -public: - CCommandProcessorFragment_OpenGL(); - virtual ~CCommandProcessorFragment_OpenGL() = default; - - ERunCommandReturnTypes RunCommand(const CCommandBuffer::SCommand *pBaseCommand) override; -}; - -class CCommandProcessorFragment_OpenGL2 : public CCommandProcessorFragment_OpenGL -{ - struct SBufferContainer - { - SBufferContainerInfo m_ContainerInfo; - }; - std::vector m_vBufferContainers; - -#ifndef BACKEND_AS_OPENGL_ES - GL_SVertexTex3D m_aStreamVertices[1024 * 4]; -#endif - - struct SBufferObject - { - SBufferObject(TWGLuint BufferObjectId) : - m_BufferObjectId(BufferObjectId) - { - m_pData = NULL; - m_DataSize = 0; - } - TWGLuint m_BufferObjectId; - uint8_t *m_pData; - size_t m_DataSize; - }; - - std::vector m_vBufferObjectIndices; - -#ifndef BACKEND_GL_MODERN_API - bool DoAnalyzeStep(size_t CheckCount, size_t VerticesCount, uint8_t aFakeTexture[], size_t SingleImageSize); - bool IsTileMapAnalysisSucceeded(); -#endif - - void UseProgram(CGLSLTWProgram *pProgram); - -protected: - void SetState(const CCommandBuffer::SState &State, CGLSLTWProgram *pProgram, bool Use2DArrayTextures = false); - -#ifndef BACKEND_GL_MODERN_API - bool Cmd_Init(const SCommand_Init *pCommand) override; - void Cmd_Shutdown(const SCommand_Shutdown *pCommand) override; - - void Cmd_RenderTex3D(const CCommandBuffer::SCommand_RenderTex3D *pCommand) override; - - void Cmd_CreateBufferObject(const CCommandBuffer::SCommand_CreateBufferObject *pCommand) override; - void Cmd_RecreateBufferObject(const CCommandBuffer::SCommand_RecreateBufferObject *pCommand) override; - void Cmd_UpdateBufferObject(const CCommandBuffer::SCommand_UpdateBufferObject *pCommand) override; - void Cmd_CopyBufferObject(const CCommandBuffer::SCommand_CopyBufferObject *pCommand) override; - void Cmd_DeleteBufferObject(const CCommandBuffer::SCommand_DeleteBufferObject *pCommand) override; - - void Cmd_CreateBufferContainer(const CCommandBuffer::SCommand_CreateBufferContainer *pCommand) override; - void Cmd_UpdateBufferContainer(const CCommandBuffer::SCommand_UpdateBufferContainer *pCommand) override; - void Cmd_DeleteBufferContainer(const CCommandBuffer::SCommand_DeleteBufferContainer *pCommand) override; - void Cmd_IndicesRequiredNumNotify(const CCommandBuffer::SCommand_IndicesRequiredNumNotify *pCommand) override; - - void Cmd_RenderTileLayer(const CCommandBuffer::SCommand_RenderTileLayer *pCommand) override; - void Cmd_RenderBorderTile(const CCommandBuffer::SCommand_RenderBorderTile *pCommand) override; -#endif - - CGLSLTileProgram *m_pTileProgram; - CGLSLTileProgram *m_pTileProgramTextured; - CGLSLTileProgram *m_pBorderTileProgram; - CGLSLTileProgram *m_pBorderTileProgramTextured; - CGLSLPrimitiveProgram *m_pPrimitive3DProgram; - CGLSLPrimitiveProgram *m_pPrimitive3DProgramTextured; -}; - -class CCommandProcessorFragment_OpenGL3 : public CCommandProcessorFragment_OpenGL2 -{ -}; - -#if defined(BACKEND_AS_OPENGL_ES) && defined(CONF_BACKEND_OPENGL_ES3) -#undef BACKEND_GL_MODERN_API -#endif - -#endif diff --git a/src/engine/client/backend/opengl/backend_opengl3.cpp b/src/engine/client/backend/opengl/backend_opengl3.cpp deleted file mode 100644 index 95dbf3d366..0000000000 --- a/src/engine/client/backend/opengl/backend_opengl3.cpp +++ /dev/null @@ -1,1361 +0,0 @@ -#include "backend_opengl3.h" - -#include - -#if defined(BACKEND_AS_OPENGL_ES) || !defined(CONF_BACKEND_OPENGL_ES) - -#ifndef BACKEND_AS_OPENGL_ES -#include -#else -#include -#endif - -#include - -#include -#include - -#include - -#include - -#ifdef CONF_WEBASM -// WebGL2 defines the type of a buffer at the first bind to a buffer target -// this is different to GLES 3 (https://www.khronos.org/registry/webgl/specs/latest/2.0/#5.1) -static constexpr GLenum BUFFER_INIT_INDEX_TARGET = GL_ELEMENT_ARRAY_BUFFER; -static constexpr GLenum BUFFER_INIT_VERTEX_TARGET = GL_ARRAY_BUFFER; -#else -static constexpr GLenum BUFFER_INIT_INDEX_TARGET = GL_COPY_WRITE_BUFFER; -static constexpr GLenum BUFFER_INIT_VERTEX_TARGET = GL_COPY_WRITE_BUFFER; -#endif - -// ------------ CCommandProcessorFragment_OpenGL3_3 -void CCommandProcessorFragment_OpenGL3_3::UseProgram(CGLSLTWProgram *pProgram) -{ - if(m_LastProgramId != pProgram->GetProgramId()) - { - pProgram->UseProgram(); - m_LastProgramId = pProgram->GetProgramId(); - } -} - -void CCommandProcessorFragment_OpenGL3_3::InitPrimExProgram(CGLSLPrimitiveExProgram *pProgram, CGLSLCompiler *pCompiler, IStorage *pStorage, bool Textured, bool Rotationless) -{ - CGLSL PrimitiveVertexShader; - CGLSL PrimitiveFragmentShader; - if(Textured) - pCompiler->AddDefine("TW_TEXTURED", ""); - if(Rotationless) - pCompiler->AddDefine("TW_ROTATIONLESS", ""); - PrimitiveVertexShader.LoadShader(pCompiler, pStorage, "shader/primex.vert", GL_VERTEX_SHADER); - PrimitiveFragmentShader.LoadShader(pCompiler, pStorage, "shader/primex.frag", GL_FRAGMENT_SHADER); - if(Textured || Rotationless) - pCompiler->ClearDefines(); - - pProgram->CreateProgram(); - pProgram->AddShader(&PrimitiveVertexShader); - pProgram->AddShader(&PrimitiveFragmentShader); - pProgram->LinkProgram(); - - UseProgram(pProgram); - - pProgram->m_LocPos = pProgram->GetUniformLoc("gPos"); - pProgram->m_LocTextureSampler = pProgram->GetUniformLoc("gTextureSampler"); - pProgram->m_LocRotation = pProgram->GetUniformLoc("gRotation"); - pProgram->m_LocCenter = pProgram->GetUniformLoc("gCenter"); - pProgram->m_LocVertciesColor = pProgram->GetUniformLoc("gVerticesColor"); - - pProgram->SetUniform(pProgram->m_LocRotation, 0.0f); - float aCenter[2] = {0.f, 0.f}; - pProgram->SetUniformVec2(pProgram->m_LocCenter, 1, aCenter); -} - -bool CCommandProcessorFragment_OpenGL3_3::Cmd_Init(const SCommand_Init *pCommand) -{ - if(!InitOpenGL(pCommand)) - return false; - - m_OpenGLTextureLodBIAS = g_Config.m_GfxGLTextureLODBIAS; - - glActiveTexture(GL_TEXTURE0); - - m_Has2DArrayTextures = true; - m_Has2DArrayTexturesAsExtension = false; - m_2DArrayTarget = GL_TEXTURE_2D_ARRAY; - m_Has3DTextures = false; - m_HasMipMaps = true; - m_HasNPOTTextures = true; - m_HasShaders = true; - - m_pTextureMemoryUsage = pCommand->m_pTextureMemoryUsage; - m_pTextureMemoryUsage->store(0, std::memory_order_relaxed); - m_LastBlendMode = CCommandBuffer::BLEND_ALPHA; - m_LastClipEnable = false; - m_pPrimitiveProgram = new CGLSLPrimitiveProgram; - m_pPrimitiveProgramTextured = new CGLSLPrimitiveProgram; - m_pTileProgram = new CGLSLTileProgram; - m_pTileProgramTextured = new CGLSLTileProgram; - m_pPrimitive3DProgram = new CGLSLPrimitiveProgram; - m_pPrimitive3DProgramTextured = new CGLSLPrimitiveProgram; - m_pBorderTileProgram = new CGLSLTileProgram; - m_pBorderTileProgramTextured = new CGLSLTileProgram; - m_pQuadProgram = new CGLSLQuadProgram; - m_pQuadProgramTextured = new CGLSLQuadProgram; - m_pTextProgram = new CGLSLTextProgram; - m_pPrimitiveExProgram = new CGLSLPrimitiveExProgram; - m_pPrimitiveExProgramTextured = new CGLSLPrimitiveExProgram; - m_pPrimitiveExProgramRotationless = new CGLSLPrimitiveExProgram; - m_pPrimitiveExProgramTexturedRotationless = new CGLSLPrimitiveExProgram; - m_pSpriteProgramMultiple = new CGLSLSpriteMultipleProgram; - m_LastProgramId = 0; - - CGLSLCompiler ShaderCompiler(g_Config.m_GfxGLMajor, g_Config.m_GfxGLMinor, g_Config.m_GfxGLPatch, m_IsOpenGLES, m_OpenGLTextureLodBIAS / 1000.0f); - - GLint CapVal; - glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS, &CapVal); - - m_MaxQuadsAtOnce = minimum(((CapVal - 20) / (3 * 4)), ms_MaxQuadsPossible); - - { - CGLSL PrimitiveVertexShader; - CGLSL PrimitiveFragmentShader; - PrimitiveVertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/prim.vert", GL_VERTEX_SHADER); - PrimitiveFragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/prim.frag", GL_FRAGMENT_SHADER); - - m_pPrimitiveProgram->CreateProgram(); - m_pPrimitiveProgram->AddShader(&PrimitiveVertexShader); - m_pPrimitiveProgram->AddShader(&PrimitiveFragmentShader); - m_pPrimitiveProgram->LinkProgram(); - - UseProgram(m_pPrimitiveProgram); - - m_pPrimitiveProgram->m_LocPos = m_pPrimitiveProgram->GetUniformLoc("gPos"); - m_pPrimitiveProgram->m_LocTextureSampler = m_pPrimitiveProgram->GetUniformLoc("gTextureSampler"); - } - { - CGLSL PrimitiveVertexShader; - CGLSL PrimitiveFragmentShader; - ShaderCompiler.AddDefine("TW_TEXTURED", ""); - PrimitiveVertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/prim.vert", GL_VERTEX_SHADER); - PrimitiveFragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/prim.frag", GL_FRAGMENT_SHADER); - ShaderCompiler.ClearDefines(); - - m_pPrimitiveProgramTextured->CreateProgram(); - m_pPrimitiveProgramTextured->AddShader(&PrimitiveVertexShader); - m_pPrimitiveProgramTextured->AddShader(&PrimitiveFragmentShader); - m_pPrimitiveProgramTextured->LinkProgram(); - - UseProgram(m_pPrimitiveProgramTextured); - - m_pPrimitiveProgramTextured->m_LocPos = m_pPrimitiveProgramTextured->GetUniformLoc("gPos"); - m_pPrimitiveProgramTextured->m_LocTextureSampler = m_pPrimitiveProgramTextured->GetUniformLoc("gTextureSampler"); - } - - { - CGLSL PrimitiveVertexShader; - CGLSL PrimitiveFragmentShader; - ShaderCompiler.AddDefine("TW_MODERN_GL", ""); - PrimitiveVertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/pipeline.vert", GL_VERTEX_SHADER); - PrimitiveFragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/pipeline.frag", GL_FRAGMENT_SHADER); - ShaderCompiler.ClearDefines(); - - m_pPrimitive3DProgram->CreateProgram(); - m_pPrimitive3DProgram->AddShader(&PrimitiveVertexShader); - m_pPrimitive3DProgram->AddShader(&PrimitiveFragmentShader); - m_pPrimitive3DProgram->LinkProgram(); - - UseProgram(m_pPrimitive3DProgram); - - m_pPrimitive3DProgram->m_LocPos = m_pPrimitive3DProgram->GetUniformLoc("gPos"); - } - { - CGLSL PrimitiveVertexShader; - CGLSL PrimitiveFragmentShader; - ShaderCompiler.AddDefine("TW_MODERN_GL", ""); - ShaderCompiler.AddDefine("TW_TEXTURED", ""); - if(!pCommand->m_pCapabilities->m_2DArrayTextures) - ShaderCompiler.AddDefine("TW_3D_TEXTURED", ""); - PrimitiveVertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/pipeline.vert", GL_VERTEX_SHADER); - PrimitiveFragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/pipeline.frag", GL_FRAGMENT_SHADER); - ShaderCompiler.ClearDefines(); - - m_pPrimitive3DProgramTextured->CreateProgram(); - m_pPrimitive3DProgramTextured->AddShader(&PrimitiveVertexShader); - m_pPrimitive3DProgramTextured->AddShader(&PrimitiveFragmentShader); - m_pPrimitive3DProgramTextured->LinkProgram(); - - UseProgram(m_pPrimitive3DProgramTextured); - - m_pPrimitive3DProgramTextured->m_LocPos = m_pPrimitive3DProgramTextured->GetUniformLoc("gPos"); - m_pPrimitive3DProgramTextured->m_LocTextureSampler = m_pPrimitive3DProgramTextured->GetUniformLoc("gTextureSampler"); - } - - { - CGLSL VertexShader; - CGLSL FragmentShader; - VertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/tile.vert", GL_VERTEX_SHADER); - FragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/tile.frag", GL_FRAGMENT_SHADER); - - m_pTileProgram->CreateProgram(); - m_pTileProgram->AddShader(&VertexShader); - m_pTileProgram->AddShader(&FragmentShader); - m_pTileProgram->LinkProgram(); - - UseProgram(m_pTileProgram); - - m_pTileProgram->m_LocPos = m_pTileProgram->GetUniformLoc("gPos"); - m_pTileProgram->m_LocColor = m_pTileProgram->GetUniformLoc("gVertColor"); - } - { - CGLSL VertexShader; - CGLSL FragmentShader; - ShaderCompiler.AddDefine("TW_TILE_TEXTURED", ""); - VertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/tile.vert", GL_VERTEX_SHADER); - FragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/tile.frag", GL_FRAGMENT_SHADER); - ShaderCompiler.ClearDefines(); - - m_pTileProgramTextured->CreateProgram(); - m_pTileProgramTextured->AddShader(&VertexShader); - m_pTileProgramTextured->AddShader(&FragmentShader); - m_pTileProgramTextured->LinkProgram(); - - UseProgram(m_pTileProgramTextured); - - m_pTileProgramTextured->m_LocPos = m_pTileProgramTextured->GetUniformLoc("gPos"); - m_pTileProgramTextured->m_LocTextureSampler = m_pTileProgramTextured->GetUniformLoc("gTextureSampler"); - m_pTileProgramTextured->m_LocColor = m_pTileProgramTextured->GetUniformLoc("gVertColor"); - } - { - CGLSL VertexShader; - CGLSL FragmentShader; - VertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/tile_border.vert", GL_VERTEX_SHADER); - FragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/tile_border.frag", GL_FRAGMENT_SHADER); - ShaderCompiler.ClearDefines(); - - m_pBorderTileProgram->CreateProgram(); - m_pBorderTileProgram->AddShader(&VertexShader); - m_pBorderTileProgram->AddShader(&FragmentShader); - m_pBorderTileProgram->LinkProgram(); - - UseProgram(m_pBorderTileProgram); - - m_pBorderTileProgram->m_LocPos = m_pBorderTileProgram->GetUniformLoc("gPos"); - m_pBorderTileProgram->m_LocColor = m_pBorderTileProgram->GetUniformLoc("gVertColor"); - m_pBorderTileProgram->m_LocOffset = m_pBorderTileProgram->GetUniformLoc("gOffset"); - m_pBorderTileProgram->m_LocScale = m_pBorderTileProgram->GetUniformLoc("gScale"); - } - { - CGLSL VertexShader; - CGLSL FragmentShader; - ShaderCompiler.AddDefine("TW_TILE_TEXTURED", ""); - VertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/tile_border.vert", GL_VERTEX_SHADER); - FragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/tile_border.frag", GL_FRAGMENT_SHADER); - ShaderCompiler.ClearDefines(); - - m_pBorderTileProgramTextured->CreateProgram(); - m_pBorderTileProgramTextured->AddShader(&VertexShader); - m_pBorderTileProgramTextured->AddShader(&FragmentShader); - m_pBorderTileProgramTextured->LinkProgram(); - - UseProgram(m_pBorderTileProgramTextured); - - m_pBorderTileProgramTextured->m_LocPos = m_pBorderTileProgramTextured->GetUniformLoc("gPos"); - m_pBorderTileProgramTextured->m_LocTextureSampler = m_pBorderTileProgramTextured->GetUniformLoc("gTextureSampler"); - m_pBorderTileProgramTextured->m_LocColor = m_pBorderTileProgramTextured->GetUniformLoc("gVertColor"); - m_pBorderTileProgramTextured->m_LocOffset = m_pBorderTileProgramTextured->GetUniformLoc("gOffset"); - m_pBorderTileProgramTextured->m_LocScale = m_pBorderTileProgramTextured->GetUniformLoc("gScale"); - } - { - CGLSL VertexShader; - CGLSL FragmentShader; - ShaderCompiler.AddDefine("TW_MAX_QUADS", std::to_string(m_MaxQuadsAtOnce).c_str()); - VertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/quad.vert", GL_VERTEX_SHADER); - FragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/quad.frag", GL_FRAGMENT_SHADER); - ShaderCompiler.ClearDefines(); - - m_pQuadProgram->CreateProgram(); - m_pQuadProgram->AddShader(&VertexShader); - m_pQuadProgram->AddShader(&FragmentShader); - m_pQuadProgram->LinkProgram(); - - UseProgram(m_pQuadProgram); - - m_pQuadProgram->m_LocPos = m_pQuadProgram->GetUniformLoc("gPos"); - m_pQuadProgram->m_LocColors = m_pQuadProgram->GetUniformLoc("gVertColors"); - m_pQuadProgram->m_LocRotations = m_pQuadProgram->GetUniformLoc("gRotations"); - m_pQuadProgram->m_LocOffsets = m_pQuadProgram->GetUniformLoc("gOffsets"); - m_pQuadProgram->m_LocQuadOffset = m_pQuadProgram->GetUniformLoc("gQuadOffset"); - } - { - CGLSL VertexShader; - CGLSL FragmentShader; - ShaderCompiler.AddDefine("TW_QUAD_TEXTURED", ""); - ShaderCompiler.AddDefine("TW_MAX_QUADS", std::to_string(m_MaxQuadsAtOnce).c_str()); - VertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/quad.vert", GL_VERTEX_SHADER); - FragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/quad.frag", GL_FRAGMENT_SHADER); - ShaderCompiler.ClearDefines(); - - m_pQuadProgramTextured->CreateProgram(); - m_pQuadProgramTextured->AddShader(&VertexShader); - m_pQuadProgramTextured->AddShader(&FragmentShader); - m_pQuadProgramTextured->LinkProgram(); - - UseProgram(m_pQuadProgramTextured); - - m_pQuadProgramTextured->m_LocPos = m_pQuadProgramTextured->GetUniformLoc("gPos"); - m_pQuadProgramTextured->m_LocTextureSampler = m_pQuadProgramTextured->GetUniformLoc("gTextureSampler"); - m_pQuadProgramTextured->m_LocColors = m_pQuadProgramTextured->GetUniformLoc("gVertColors"); - m_pQuadProgramTextured->m_LocRotations = m_pQuadProgramTextured->GetUniformLoc("gRotations"); - m_pQuadProgramTextured->m_LocOffsets = m_pQuadProgramTextured->GetUniformLoc("gOffsets"); - m_pQuadProgramTextured->m_LocQuadOffset = m_pQuadProgramTextured->GetUniformLoc("gQuadOffset"); - } - { - CGLSL VertexShader; - CGLSL FragmentShader; - VertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/text.vert", GL_VERTEX_SHADER); - FragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/text.frag", GL_FRAGMENT_SHADER); - - m_pTextProgram->CreateProgram(); - m_pTextProgram->AddShader(&VertexShader); - m_pTextProgram->AddShader(&FragmentShader); - m_pTextProgram->LinkProgram(); - - UseProgram(m_pTextProgram); - - m_pTextProgram->m_LocPos = m_pTextProgram->GetUniformLoc("gPos"); - m_pTextProgram->m_LocTextureSampler = -1; - m_pTextProgram->m_LocTextSampler = m_pTextProgram->GetUniformLoc("gTextSampler"); - m_pTextProgram->m_LocTextOutlineSampler = m_pTextProgram->GetUniformLoc("gTextOutlineSampler"); - m_pTextProgram->m_LocColor = m_pTextProgram->GetUniformLoc("gVertColor"); - m_pTextProgram->m_LocOutlineColor = m_pTextProgram->GetUniformLoc("gVertOutlineColor"); - m_pTextProgram->m_LocTextureSize = m_pTextProgram->GetUniformLoc("gTextureSize"); - } - InitPrimExProgram(m_pPrimitiveExProgram, &ShaderCompiler, pCommand->m_pStorage, false, false); - InitPrimExProgram(m_pPrimitiveExProgramTextured, &ShaderCompiler, pCommand->m_pStorage, true, false); - InitPrimExProgram(m_pPrimitiveExProgramRotationless, &ShaderCompiler, pCommand->m_pStorage, false, true); - InitPrimExProgram(m_pPrimitiveExProgramTexturedRotationless, &ShaderCompiler, pCommand->m_pStorage, true, true); - { - CGLSL PrimitiveVertexShader; - CGLSL PrimitiveFragmentShader; - PrimitiveVertexShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/spritemulti.vert", GL_VERTEX_SHADER); - PrimitiveFragmentShader.LoadShader(&ShaderCompiler, pCommand->m_pStorage, "shader/spritemulti.frag", GL_FRAGMENT_SHADER); - - m_pSpriteProgramMultiple->CreateProgram(); - m_pSpriteProgramMultiple->AddShader(&PrimitiveVertexShader); - m_pSpriteProgramMultiple->AddShader(&PrimitiveFragmentShader); - m_pSpriteProgramMultiple->LinkProgram(); - - UseProgram(m_pSpriteProgramMultiple); - - m_pSpriteProgramMultiple->m_LocPos = m_pSpriteProgramMultiple->GetUniformLoc("gPos"); - m_pSpriteProgramMultiple->m_LocTextureSampler = m_pSpriteProgramMultiple->GetUniformLoc("gTextureSampler"); - m_pSpriteProgramMultiple->m_LocRSP = m_pSpriteProgramMultiple->GetUniformLoc("gRSP[0]"); - m_pSpriteProgramMultiple->m_LocCenter = m_pSpriteProgramMultiple->GetUniformLoc("gCenter"); - m_pSpriteProgramMultiple->m_LocVertciesColor = m_pSpriteProgramMultiple->GetUniformLoc("gVerticesColor"); - - float aCenter[2] = {0.f, 0.f}; - m_pSpriteProgramMultiple->SetUniformVec2(m_pSpriteProgramMultiple->m_LocCenter, 1, aCenter); - } - - m_LastStreamBuffer = 0; - - glGenBuffers(MAX_STREAM_BUFFER_COUNT, m_aPrimitiveDrawBufferId); - glGenVertexArrays(MAX_STREAM_BUFFER_COUNT, m_aPrimitiveDrawVertexId); - glGenBuffers(1, &m_PrimitiveDrawBufferIdTex3D); - glGenVertexArrays(1, &m_PrimitiveDrawVertexIdTex3D); - - for(int i = 0; i < MAX_STREAM_BUFFER_COUNT; ++i) - { - glBindBuffer(GL_ARRAY_BUFFER, m_aPrimitiveDrawBufferId[i]); - glBindVertexArray(m_aPrimitiveDrawVertexId[i]); - glEnableVertexAttribArray(0); - glEnableVertexAttribArray(1); - glEnableVertexAttribArray(2); - - glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(CCommandBuffer::SVertex), 0); - glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(CCommandBuffer::SVertex), (void *)(sizeof(float) * 2)); - glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(CCommandBuffer::SVertex), (void *)(sizeof(float) * 4)); - - m_aLastIndexBufferBound[i] = 0; - } - - glBindBuffer(GL_ARRAY_BUFFER, m_PrimitiveDrawBufferIdTex3D); - glBindVertexArray(m_PrimitiveDrawVertexIdTex3D); - glEnableVertexAttribArray(0); - glEnableVertexAttribArray(1); - glEnableVertexAttribArray(2); - - glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(CCommandBuffer::SVertexTex3DStream), 0); - glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(CCommandBuffer::SVertexTex3DStream), (void *)(sizeof(float) * 2)); - glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(CCommandBuffer::SVertexTex3DStream), (void *)(sizeof(float) * 2 + sizeof(unsigned char) * 4)); - - // query the image max size only once - glGetIntegerv(GL_MAX_TEXTURE_SIZE, &m_MaxTexSize); - - glBindVertexArray(0); - glGenBuffers(1, &m_QuadDrawIndexBufferId); - glBindBuffer(BUFFER_INIT_INDEX_TARGET, m_QuadDrawIndexBufferId); - - unsigned int aIndices[CCommandBuffer::MAX_VERTICES / 4 * 6]; - int Primq = 0; - for(int i = 0; i < CCommandBuffer::MAX_VERTICES / 4 * 6; i += 6) - { - aIndices[i] = Primq; - aIndices[i + 1] = Primq + 1; - aIndices[i + 2] = Primq + 2; - aIndices[i + 3] = Primq; - aIndices[i + 4] = Primq + 2; - aIndices[i + 5] = Primq + 3; - Primq += 4; - } - glBufferData(BUFFER_INIT_INDEX_TARGET, sizeof(unsigned int) * CCommandBuffer::MAX_VERTICES / 4 * 6, aIndices, GL_STATIC_DRAW); - - m_CurrentIndicesInBuffer = CCommandBuffer::MAX_VERTICES / 4 * 6; - - m_vTextures.resize(CCommandBuffer::MAX_TEXTURES); - - m_ClearColor.r = m_ClearColor.g = m_ClearColor.b = -1.f; - - // fix the alignment to allow even 1byte changes, e.g. for alpha components - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - - return true; -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_Shutdown(const SCommand_Shutdown *pCommand) -{ - glUseProgram(0); - - m_pPrimitiveProgram->DeleteProgram(); - m_pPrimitiveProgramTextured->DeleteProgram(); - m_pBorderTileProgram->DeleteProgram(); - m_pBorderTileProgramTextured->DeleteProgram(); - m_pQuadProgram->DeleteProgram(); - m_pQuadProgramTextured->DeleteProgram(); - m_pTileProgram->DeleteProgram(); - m_pTileProgramTextured->DeleteProgram(); - m_pPrimitive3DProgram->DeleteProgram(); - m_pPrimitive3DProgramTextured->DeleteProgram(); - m_pTextProgram->DeleteProgram(); - m_pPrimitiveExProgram->DeleteProgram(); - m_pPrimitiveExProgramTextured->DeleteProgram(); - m_pPrimitiveExProgramRotationless->DeleteProgram(); - m_pPrimitiveExProgramTexturedRotationless->DeleteProgram(); - m_pSpriteProgramMultiple->DeleteProgram(); - - // clean up everything - delete m_pPrimitiveProgram; - delete m_pPrimitiveProgramTextured; - delete m_pBorderTileProgram; - delete m_pBorderTileProgramTextured; - delete m_pQuadProgram; - delete m_pQuadProgramTextured; - delete m_pTileProgram; - delete m_pTileProgramTextured; - delete m_pPrimitive3DProgram; - delete m_pPrimitive3DProgramTextured; - delete m_pTextProgram; - delete m_pPrimitiveExProgram; - delete m_pPrimitiveExProgramTextured; - delete m_pPrimitiveExProgramRotationless; - delete m_pPrimitiveExProgramTexturedRotationless; - delete m_pSpriteProgramMultiple; - - glBindVertexArray(0); - glDeleteBuffers(MAX_STREAM_BUFFER_COUNT, m_aPrimitiveDrawBufferId); - glDeleteBuffers(1, &m_QuadDrawIndexBufferId); - glDeleteVertexArrays(MAX_STREAM_BUFFER_COUNT, m_aPrimitiveDrawVertexId); - glDeleteBuffers(1, &m_PrimitiveDrawBufferIdTex3D); - glDeleteVertexArrays(1, &m_PrimitiveDrawVertexIdTex3D); - - for(int i = 0; i < (int)m_vTextures.size(); ++i) - { - DestroyTexture(i); - } - - for(size_t i = 0; i < m_vBufferContainers.size(); ++i) - { - DestroyBufferContainer(i); - } - - m_vBufferContainers.clear(); -} - -void CCommandProcessorFragment_OpenGL3_3::TextureUpdate(int Slot, int X, int Y, int Width, int Height, int GLFormat, uint8_t *pTexData) -{ - glBindTexture(GL_TEXTURE_2D, m_vTextures[Slot].m_Tex); - - if(m_vTextures[Slot].m_RescaleCount > 0) - { - for(int i = 0; i < m_vTextures[Slot].m_RescaleCount; ++i) - { - Width >>= 1; - Height >>= 1; - - X /= 2; - Y /= 2; - } - - uint8_t *pTmpData = ResizeImage(pTexData, Width, Height, Width, Height, GLFormatToPixelSize(GLFormat)); - free(pTexData); - pTexData = pTmpData; - } - - glTexSubImage2D(GL_TEXTURE_2D, 0, X, Y, Width, Height, GLFormat, GL_UNSIGNED_BYTE, pTexData); - free(pTexData); -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_Texture_Destroy(const CCommandBuffer::SCommand_Texture_Destroy *pCommand) -{ - int Slot = 0; - glBindTexture(GL_TEXTURE_2D, 0); - glBindSampler(Slot, 0); - DestroyTexture(pCommand->m_Slot); -} - -void CCommandProcessorFragment_OpenGL3_3::TextureCreate(int Slot, int Width, int Height, int GLFormat, int GLStoreFormat, int Flags, uint8_t *pTexData) -{ - while(Slot >= (int)m_vTextures.size()) - m_vTextures.resize(m_vTextures.size() * 2); - - // resample if needed - int RescaleCount = 0; - if(GLFormat == GL_RGBA) - { - if(Width > m_MaxTexSize || Height > m_MaxTexSize) - { - do - { - Width >>= 1; - Height >>= 1; - ++RescaleCount; - } while(Width > m_MaxTexSize || Height > m_MaxTexSize); - - uint8_t *pTmpData = ResizeImage(pTexData, Width, Height, Width, Height, GLFormatToPixelSize(GLFormat)); - free(pTexData); - pTexData = pTmpData; - } - } - m_vTextures[Slot].m_Width = Width; - m_vTextures[Slot].m_Height = Height; - m_vTextures[Slot].m_RescaleCount = RescaleCount; - - if(GLStoreFormat == GL_RED) - GLStoreFormat = GL_R8; - const size_t PixelSize = GLFormatToPixelSize(GLFormat); - - int SamplerSlot = 0; - - if((Flags & CCommandBuffer::TEXFLAG_NO_2D_TEXTURE) == 0) - { - glGenTextures(1, &m_vTextures[Slot].m_Tex); - glBindTexture(GL_TEXTURE_2D, m_vTextures[Slot].m_Tex); - - glGenSamplers(1, &m_vTextures[Slot].m_Sampler); - glBindSampler(SamplerSlot, m_vTextures[Slot].m_Sampler); - } - - if(Flags & CCommandBuffer::TEXFLAG_NOMIPMAPS) - { - if((Flags & CCommandBuffer::TEXFLAG_NO_2D_TEXTURE) == 0) - { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glSamplerParameteri(m_vTextures[Slot].m_Sampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glSamplerParameteri(m_vTextures[Slot].m_Sampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, GLStoreFormat, Width, Height, 0, GLFormat, GL_UNSIGNED_BYTE, pTexData); - } - } - else - { - if((Flags & CCommandBuffer::TEXFLAG_NO_2D_TEXTURE) == 0) - { - glSamplerParameteri(m_vTextures[Slot].m_Sampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glSamplerParameteri(m_vTextures[Slot].m_Sampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - -#ifndef BACKEND_AS_OPENGL_ES - if(m_OpenGLTextureLodBIAS != 0 && !m_IsOpenGLES) - glSamplerParameterf(m_vTextures[Slot].m_Sampler, GL_TEXTURE_LOD_BIAS, ((GLfloat)m_OpenGLTextureLodBIAS / 1000.0f)); -#endif - - // prevent mipmap display bugs, when zooming out far - if(Width >= 1024 && Height >= 1024) - { - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 5.f); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, 5); - } - glTexImage2D(GL_TEXTURE_2D, 0, GLStoreFormat, Width, Height, 0, GLFormat, GL_UNSIGNED_BYTE, pTexData); - glGenerateMipmap(GL_TEXTURE_2D); - } - - if((Flags & (CCommandBuffer::TEXFLAG_TO_2D_ARRAY_TEXTURE)) != 0) - { - glGenTextures(1, &m_vTextures[Slot].m_Tex2DArray); - glBindTexture(GL_TEXTURE_2D_ARRAY, m_vTextures[Slot].m_Tex2DArray); - - glGenSamplers(1, &m_vTextures[Slot].m_Sampler2DArray); - glBindSampler(SamplerSlot, m_vTextures[Slot].m_Sampler2DArray); - glSamplerParameteri(m_vTextures[Slot].m_Sampler2DArray, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glSamplerParameteri(m_vTextures[Slot].m_Sampler2DArray, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - glSamplerParameteri(m_vTextures[Slot].m_Sampler2DArray, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glSamplerParameteri(m_vTextures[Slot].m_Sampler2DArray, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glSamplerParameteri(m_vTextures[Slot].m_Sampler2DArray, GL_TEXTURE_WRAP_R, GL_MIRRORED_REPEAT); - -#ifndef BACKEND_AS_OPENGL_ES - if(m_OpenGLTextureLodBIAS != 0 && !m_IsOpenGLES) - glSamplerParameterf(m_vTextures[Slot].m_Sampler2DArray, GL_TEXTURE_LOD_BIAS, ((GLfloat)m_OpenGLTextureLodBIAS / 1000.0f)); -#endif - - uint8_t *p3DImageData = static_cast(malloc((size_t)Width * Height * PixelSize)); - int Image3DWidth, Image3DHeight; - - int ConvertWidth = Width; - int ConvertHeight = Height; - - if(ConvertWidth == 0 || (ConvertWidth % 16) != 0 || ConvertHeight == 0 || (ConvertHeight % 16) != 0) - { - dbg_msg("gfx", "3D/2D array texture was resized"); - int NewWidth = maximum(HighestBit(ConvertWidth), 16); - int NewHeight = maximum(HighestBit(ConvertHeight), 16); - uint8_t *pNewTexData = ResizeImage(pTexData, ConvertWidth, ConvertHeight, NewWidth, NewHeight, GLFormatToPixelSize(GLFormat)); - - ConvertWidth = NewWidth; - ConvertHeight = NewHeight; - - free(pTexData); - pTexData = pNewTexData; - } - - if(Texture2DTo3D(pTexData, ConvertWidth, ConvertHeight, PixelSize, 16, 16, p3DImageData, Image3DWidth, Image3DHeight)) - { - glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GLStoreFormat, Image3DWidth, Image3DHeight, 256, 0, GLFormat, GL_UNSIGNED_BYTE, p3DImageData); - glGenerateMipmap(GL_TEXTURE_2D_ARRAY); - } - - free(p3DImageData); - } - } - - // This is the initial value for the wrap modes - m_vTextures[Slot].m_LastWrapMode = CCommandBuffer::WRAP_REPEAT; - - // calculate memory usage - m_vTextures[Slot].m_MemSize = (size_t)Width * Height * PixelSize; - while(Width > 2 && Height > 2) - { - Width >>= 1; - Height >>= 1; - m_vTextures[Slot].m_MemSize += (size_t)Width * Height * PixelSize; - } - m_pTextureMemoryUsage->store(m_pTextureMemoryUsage->load(std::memory_order_relaxed) + m_vTextures[Slot].m_MemSize, std::memory_order_relaxed); - - free(pTexData); -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_Texture_Create(const CCommandBuffer::SCommand_Texture_Create *pCommand) -{ - TextureCreate(pCommand->m_Slot, pCommand->m_Width, pCommand->m_Height, GL_RGBA, GL_RGBA, pCommand->m_Flags, pCommand->m_pData); -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_TextTexture_Update(const CCommandBuffer::SCommand_TextTexture_Update *pCommand) -{ - TextureUpdate(pCommand->m_Slot, pCommand->m_X, pCommand->m_Y, pCommand->m_Width, pCommand->m_Height, GL_RED, pCommand->m_pData); -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_TextTextures_Destroy(const CCommandBuffer::SCommand_TextTextures_Destroy *pCommand) -{ - DestroyTexture(pCommand->m_Slot); - DestroyTexture(pCommand->m_SlotOutline); -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_TextTextures_Create(const CCommandBuffer::SCommand_TextTextures_Create *pCommand) -{ - TextureCreate(pCommand->m_Slot, pCommand->m_Width, pCommand->m_Height, GL_RED, GL_RED, CCommandBuffer::TEXFLAG_NOMIPMAPS, pCommand->m_pTextData); - TextureCreate(pCommand->m_SlotOutline, pCommand->m_Width, pCommand->m_Height, GL_RED, GL_RED, CCommandBuffer::TEXFLAG_NOMIPMAPS, pCommand->m_pTextOutlineData); -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_Clear(const CCommandBuffer::SCommand_Clear *pCommand) -{ - // if clip is still active, force disable it for clearing, enable it again afterwards - bool ClipWasEnabled = m_LastClipEnable; - if(ClipWasEnabled) - { - glDisable(GL_SCISSOR_TEST); - } - if(pCommand->m_Color.r != m_ClearColor.r || pCommand->m_Color.g != m_ClearColor.g || pCommand->m_Color.b != m_ClearColor.b) - { - glClearColor(pCommand->m_Color.r, pCommand->m_Color.g, pCommand->m_Color.b, 0.0f); - m_ClearColor = pCommand->m_Color; - } - glClear(GL_COLOR_BUFFER_BIT); - if(ClipWasEnabled) - { - glEnable(GL_SCISSOR_TEST); - } -} - -void CCommandProcessorFragment_OpenGL3_3::UploadStreamBufferData(unsigned int PrimitiveType, const void *pVertices, size_t VertSize, unsigned int PrimitiveCount, bool AsTex3D) -{ - int Count = 0; - switch(PrimitiveType) - { - case CCommandBuffer::PRIMTYPE_LINES: - Count = PrimitiveCount * 2; - break; - case CCommandBuffer::PRIMTYPE_TRIANGLES: - Count = PrimitiveCount * 3; - break; - case CCommandBuffer::PRIMTYPE_QUADS: - Count = PrimitiveCount * 4; - break; - default: - return; - }; - - if(AsTex3D) - glBindBuffer(GL_ARRAY_BUFFER, m_PrimitiveDrawBufferIdTex3D); - else - glBindBuffer(GL_ARRAY_BUFFER, m_aPrimitiveDrawBufferId[m_LastStreamBuffer]); - - glBufferData(GL_ARRAY_BUFFER, VertSize * Count, pVertices, GL_STREAM_DRAW); -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_Render(const CCommandBuffer::SCommand_Render *pCommand) -{ - CGLSLTWProgram *pProgram = m_pPrimitiveProgram; - if(IsTexturedState(pCommand->m_State)) - pProgram = m_pPrimitiveProgramTextured; - UseProgram(pProgram); - SetState(pCommand->m_State, pProgram); - - UploadStreamBufferData(pCommand->m_PrimType, pCommand->m_pVertices, sizeof(CCommandBuffer::SVertex), pCommand->m_PrimCount); - - glBindVertexArray(m_aPrimitiveDrawVertexId[m_LastStreamBuffer]); - - switch(pCommand->m_PrimType) - { - // We don't support GL_QUADS due to core profile - case CCommandBuffer::PRIMTYPE_LINES: - glDrawArrays(GL_LINES, 0, pCommand->m_PrimCount * 2); - break; - case CCommandBuffer::PRIMTYPE_TRIANGLES: - glDrawArrays(GL_TRIANGLES, 0, pCommand->m_PrimCount * 3); - break; - case CCommandBuffer::PRIMTYPE_QUADS: - if(m_aLastIndexBufferBound[m_LastStreamBuffer] != m_QuadDrawIndexBufferId) - { - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_QuadDrawIndexBufferId); - m_aLastIndexBufferBound[m_LastStreamBuffer] = m_QuadDrawIndexBufferId; - } - glDrawElements(GL_TRIANGLES, pCommand->m_PrimCount * 6, GL_UNSIGNED_INT, 0); - break; - default: - dbg_msg("render", "unknown primtype %d\n", pCommand->m_PrimType); - }; - - m_LastStreamBuffer = (m_LastStreamBuffer + 1 >= MAX_STREAM_BUFFER_COUNT ? 0 : m_LastStreamBuffer + 1); -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_RenderTex3D(const CCommandBuffer::SCommand_RenderTex3D *pCommand) -{ - CGLSLPrimitiveProgram *pProg = m_pPrimitive3DProgram; - if(IsTexturedState(pCommand->m_State)) - pProg = m_pPrimitive3DProgramTextured; - UseProgram(pProg); - SetState(pCommand->m_State, pProg, true); - - UploadStreamBufferData(pCommand->m_PrimType, pCommand->m_pVertices, sizeof(CCommandBuffer::SVertexTex3DStream), pCommand->m_PrimCount, true); - - glBindVertexArray(m_PrimitiveDrawVertexIdTex3D); - - switch(pCommand->m_PrimType) - { - // We don't support GL_QUADS due to core profile - case CCommandBuffer::PRIMTYPE_LINES: - glDrawArrays(GL_LINES, 0, pCommand->m_PrimCount * 2); - break; - case CCommandBuffer::PRIMTYPE_QUADS: - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_QuadDrawIndexBufferId); - glDrawElements(GL_TRIANGLES, pCommand->m_PrimCount * 6, GL_UNSIGNED_INT, 0); - break; - default: - dbg_msg("render", "unknown primtype %d\n", pCommand->m_PrimType); - }; -} - -void CCommandProcessorFragment_OpenGL3_3::DestroyBufferContainer(int Index, bool DeleteBOs) -{ - SBufferContainer &BufferContainer = m_vBufferContainers[Index]; - if(BufferContainer.m_VertArrayId != 0) - glDeleteVertexArrays(1, &BufferContainer.m_VertArrayId); - - // all buffer objects can deleted automatically, so the program doesn't need to deal with them (e.g. causing crashes because of driver bugs) - if(DeleteBOs) - { - int VertBufferId = BufferContainer.m_ContainerInfo.m_VertBufferBindingIndex; - if(VertBufferId != -1) - { - glDeleteBuffers(1, &m_vBufferObjectIndices[VertBufferId]); - } - } - - BufferContainer.m_LastIndexBufferBound = 0; - BufferContainer.m_ContainerInfo.m_vAttributes.clear(); -} - -void CCommandProcessorFragment_OpenGL3_3::AppendIndices(unsigned int NewIndicesCount) -{ - if(NewIndicesCount <= m_CurrentIndicesInBuffer) - return; - unsigned int AddCount = NewIndicesCount - m_CurrentIndicesInBuffer; - unsigned int *pIndices = new unsigned int[AddCount]; - int Primq = (m_CurrentIndicesInBuffer / 6) * 4; - for(unsigned int i = 0; i < AddCount; i += 6) - { - pIndices[i] = Primq; - pIndices[i + 1] = Primq + 1; - pIndices[i + 2] = Primq + 2; - pIndices[i + 3] = Primq; - pIndices[i + 4] = Primq + 2; - pIndices[i + 5] = Primq + 3; - Primq += 4; - } - - glBindBuffer(GL_COPY_READ_BUFFER, m_QuadDrawIndexBufferId); - GLuint NewIndexBufferId; - glGenBuffers(1, &NewIndexBufferId); - glBindBuffer(BUFFER_INIT_INDEX_TARGET, NewIndexBufferId); - GLsizeiptr size = sizeof(unsigned int); - glBufferData(BUFFER_INIT_INDEX_TARGET, (GLsizeiptr)NewIndicesCount * size, NULL, GL_STATIC_DRAW); - glCopyBufferSubData(GL_COPY_READ_BUFFER, BUFFER_INIT_INDEX_TARGET, 0, 0, (GLsizeiptr)m_CurrentIndicesInBuffer * size); - glBufferSubData(BUFFER_INIT_INDEX_TARGET, (GLsizeiptr)m_CurrentIndicesInBuffer * size, (GLsizeiptr)AddCount * size, pIndices); - glBindBuffer(BUFFER_INIT_INDEX_TARGET, 0); - glBindBuffer(GL_COPY_READ_BUFFER, 0); - - glDeleteBuffers(1, &m_QuadDrawIndexBufferId); - m_QuadDrawIndexBufferId = NewIndexBufferId; - - for(unsigned int &i : m_aLastIndexBufferBound) - i = 0; - for(auto &BufferContainer : m_vBufferContainers) - { - BufferContainer.m_LastIndexBufferBound = 0; - } - - m_CurrentIndicesInBuffer = NewIndicesCount; - delete[] pIndices; -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_CreateBufferObject(const CCommandBuffer::SCommand_CreateBufferObject *pCommand) -{ - void *pUploadData = pCommand->m_pUploadData; - int Index = pCommand->m_BufferIndex; - // create necessary space - if((size_t)Index >= m_vBufferObjectIndices.size()) - { - for(int i = m_vBufferObjectIndices.size(); i < Index + 1; ++i) - { - m_vBufferObjectIndices.push_back(0); - } - } - - GLuint VertBufferId = 0; - - glGenBuffers(1, &VertBufferId); - glBindBuffer(BUFFER_INIT_VERTEX_TARGET, VertBufferId); - glBufferData(BUFFER_INIT_VERTEX_TARGET, (GLsizeiptr)(pCommand->m_DataSize), pUploadData, GL_STATIC_DRAW); - - m_vBufferObjectIndices[Index] = VertBufferId; - - if(pCommand->m_DeletePointer) - free(pUploadData); -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_RecreateBufferObject(const CCommandBuffer::SCommand_RecreateBufferObject *pCommand) -{ - void *pUploadData = pCommand->m_pUploadData; - int Index = pCommand->m_BufferIndex; - - glBindBuffer(BUFFER_INIT_VERTEX_TARGET, m_vBufferObjectIndices[Index]); - glBufferData(BUFFER_INIT_VERTEX_TARGET, (GLsizeiptr)(pCommand->m_DataSize), pUploadData, GL_STATIC_DRAW); - - if(pCommand->m_DeletePointer) - free(pUploadData); -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_UpdateBufferObject(const CCommandBuffer::SCommand_UpdateBufferObject *pCommand) -{ - void *pUploadData = pCommand->m_pUploadData; - int Index = pCommand->m_BufferIndex; - - glBindBuffer(BUFFER_INIT_VERTEX_TARGET, m_vBufferObjectIndices[Index]); - glBufferSubData(BUFFER_INIT_VERTEX_TARGET, (GLintptr)(pCommand->m_pOffset), (GLsizeiptr)(pCommand->m_DataSize), pUploadData); - - if(pCommand->m_DeletePointer) - free(pUploadData); -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_CopyBufferObject(const CCommandBuffer::SCommand_CopyBufferObject *pCommand) -{ - int WriteIndex = pCommand->m_WriteBufferIndex; - int ReadIndex = pCommand->m_ReadBufferIndex; - - glBindBuffer(GL_COPY_WRITE_BUFFER, m_vBufferObjectIndices[WriteIndex]); - glBindBuffer(GL_COPY_READ_BUFFER, m_vBufferObjectIndices[ReadIndex]); - glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, (GLsizeiptr)(pCommand->m_ReadOffset), (GLsizeiptr)(pCommand->m_WriteOffset), (GLsizeiptr)pCommand->m_CopySize); -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_DeleteBufferObject(const CCommandBuffer::SCommand_DeleteBufferObject *pCommand) -{ - int Index = pCommand->m_BufferIndex; - - glDeleteBuffers(1, &m_vBufferObjectIndices[Index]); -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_CreateBufferContainer(const CCommandBuffer::SCommand_CreateBufferContainer *pCommand) -{ - int Index = pCommand->m_BufferContainerIndex; - // create necessary space - if((size_t)Index >= m_vBufferContainers.size()) - { - for(int i = m_vBufferContainers.size(); i < Index + 1; ++i) - { - SBufferContainer Container; - Container.m_ContainerInfo.m_Stride = 0; - Container.m_ContainerInfo.m_VertBufferBindingIndex = -1; - m_vBufferContainers.push_back(Container); - } - } - - SBufferContainer &BufferContainer = m_vBufferContainers[Index]; - glGenVertexArrays(1, &BufferContainer.m_VertArrayId); - glBindVertexArray(BufferContainer.m_VertArrayId); - - BufferContainer.m_LastIndexBufferBound = 0; - - for(size_t i = 0; i < pCommand->m_AttrCount; ++i) - { - glEnableVertexAttribArray((GLuint)i); - - glBindBuffer(GL_ARRAY_BUFFER, m_vBufferObjectIndices[pCommand->m_VertBufferBindingIndex]); - - SBufferContainerInfo::SAttribute &Attr = pCommand->m_pAttributes[i]; - - if(Attr.m_FuncType == 0) - glVertexAttribPointer((GLuint)i, Attr.m_DataTypeCount, Attr.m_Type, (GLboolean)Attr.m_Normalized, pCommand->m_Stride, Attr.m_pOffset); - else if(Attr.m_FuncType == 1) - glVertexAttribIPointer((GLuint)i, Attr.m_DataTypeCount, Attr.m_Type, pCommand->m_Stride, Attr.m_pOffset); - - BufferContainer.m_ContainerInfo.m_vAttributes.push_back(Attr); - } - - BufferContainer.m_ContainerInfo.m_VertBufferBindingIndex = pCommand->m_VertBufferBindingIndex; - BufferContainer.m_ContainerInfo.m_Stride = pCommand->m_Stride; -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_UpdateBufferContainer(const CCommandBuffer::SCommand_UpdateBufferContainer *pCommand) -{ - SBufferContainer &BufferContainer = m_vBufferContainers[pCommand->m_BufferContainerIndex]; - - glBindVertexArray(BufferContainer.m_VertArrayId); - - // disable all old attributes - for(size_t i = 0; i < BufferContainer.m_ContainerInfo.m_vAttributes.size(); ++i) - { - glDisableVertexAttribArray((GLuint)i); - } - BufferContainer.m_ContainerInfo.m_vAttributes.clear(); - - for(size_t i = 0; i < pCommand->m_AttrCount; ++i) - { - glEnableVertexAttribArray((GLuint)i); - - glBindBuffer(GL_ARRAY_BUFFER, m_vBufferObjectIndices[pCommand->m_VertBufferBindingIndex]); - SBufferContainerInfo::SAttribute &Attr = pCommand->m_pAttributes[i]; - if(Attr.m_FuncType == 0) - glVertexAttribPointer((GLuint)i, Attr.m_DataTypeCount, Attr.m_Type, Attr.m_Normalized, pCommand->m_Stride, Attr.m_pOffset); - else if(Attr.m_FuncType == 1) - glVertexAttribIPointer((GLuint)i, Attr.m_DataTypeCount, Attr.m_Type, pCommand->m_Stride, Attr.m_pOffset); - - BufferContainer.m_ContainerInfo.m_vAttributes.push_back(Attr); - } - - BufferContainer.m_ContainerInfo.m_VertBufferBindingIndex = pCommand->m_VertBufferBindingIndex; - BufferContainer.m_ContainerInfo.m_Stride = pCommand->m_Stride; -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_DeleteBufferContainer(const CCommandBuffer::SCommand_DeleteBufferContainer *pCommand) -{ - DestroyBufferContainer(pCommand->m_BufferContainerIndex, pCommand->m_DestroyAllBO); -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_IndicesRequiredNumNotify(const CCommandBuffer::SCommand_IndicesRequiredNumNotify *pCommand) -{ - if(pCommand->m_RequiredIndicesNum > m_CurrentIndicesInBuffer) - AppendIndices(pCommand->m_RequiredIndicesNum); -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_RenderBorderTile(const CCommandBuffer::SCommand_RenderBorderTile *pCommand) -{ - int Index = pCommand->m_BufferContainerIndex; - // if space not there return - if((size_t)Index >= m_vBufferContainers.size()) - return; - - SBufferContainer &BufferContainer = m_vBufferContainers[Index]; - if(BufferContainer.m_VertArrayId == 0) - return; - - CGLSLTileProgram *pProgram = NULL; - if(IsTexturedState(pCommand->m_State)) - pProgram = m_pBorderTileProgramTextured; - else - pProgram = m_pBorderTileProgram; - UseProgram(pProgram); - - SetState(pCommand->m_State, pProgram, true); - pProgram->SetUniformVec4(pProgram->m_LocColor, 1, (float *)&pCommand->m_Color); - - pProgram->SetUniformVec2(pProgram->m_LocOffset, 1, (float *)&pCommand->m_Offset); - pProgram->SetUniformVec2(pProgram->m_LocScale, 1, (float *)&pCommand->m_Scale); - - glBindVertexArray(BufferContainer.m_VertArrayId); - if(BufferContainer.m_LastIndexBufferBound != m_QuadDrawIndexBufferId) - { - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_QuadDrawIndexBufferId); - BufferContainer.m_LastIndexBufferBound = m_QuadDrawIndexBufferId; - } - glDrawElements(GL_TRIANGLES, pCommand->m_DrawNum * 6, GL_UNSIGNED_INT, pCommand->m_pIndicesOffset); -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_RenderTileLayer(const CCommandBuffer::SCommand_RenderTileLayer *pCommand) -{ - int Index = pCommand->m_BufferContainerIndex; - // if space not there return - if((size_t)Index >= m_vBufferContainers.size()) - return; - - SBufferContainer &BufferContainer = m_vBufferContainers[Index]; - if(BufferContainer.m_VertArrayId == 0) - return; - - if(pCommand->m_IndicesDrawNum == 0) - { - return; // nothing to draw - } - - CGLSLTileProgram *pProgram = NULL; - if(IsTexturedState(pCommand->m_State)) - { - pProgram = m_pTileProgramTextured; - } - else - pProgram = m_pTileProgram; - - UseProgram(pProgram); - - SetState(pCommand->m_State, pProgram, true); - pProgram->SetUniformVec4(pProgram->m_LocColor, 1, (float *)&pCommand->m_Color); - - glBindVertexArray(BufferContainer.m_VertArrayId); - if(BufferContainer.m_LastIndexBufferBound != m_QuadDrawIndexBufferId) - { - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_QuadDrawIndexBufferId); - BufferContainer.m_LastIndexBufferBound = m_QuadDrawIndexBufferId; - } - for(int i = 0; i < pCommand->m_IndicesDrawNum; ++i) - { - glDrawElements(GL_TRIANGLES, pCommand->m_pDrawCount[i], GL_UNSIGNED_INT, pCommand->m_pIndicesOffsets[i]); - } -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_RenderQuadLayer(const CCommandBuffer::SCommand_RenderQuadLayer *pCommand) -{ - int Index = pCommand->m_BufferContainerIndex; - // if space not there return - if((size_t)Index >= m_vBufferContainers.size()) - return; - - SBufferContainer &BufferContainer = m_vBufferContainers[Index]; - if(BufferContainer.m_VertArrayId == 0) - return; - - if(pCommand->m_QuadNum == 0) - { - return; // nothing to draw - } - - CGLSLQuadProgram *pProgram = NULL; - if(IsTexturedState(pCommand->m_State)) - { - pProgram = m_pQuadProgramTextured; - } - else - pProgram = m_pQuadProgram; - - UseProgram(pProgram); - SetState(pCommand->m_State, pProgram); - - glBindVertexArray(BufferContainer.m_VertArrayId); - if(BufferContainer.m_LastIndexBufferBound != m_QuadDrawIndexBufferId) - { - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_QuadDrawIndexBufferId); - BufferContainer.m_LastIndexBufferBound = m_QuadDrawIndexBufferId; - } - - int QuadsLeft = pCommand->m_QuadNum; - size_t QuadOffset = 0; - // the extra offset is not related to the information from the command, but an actual offset in the buffer - size_t QuadOffsetExtra = pCommand->m_QuadOffset; - - vec4 aColors[ms_MaxQuadsPossible]; - vec2 aOffsets[ms_MaxQuadsPossible]; - float aRotations[ms_MaxQuadsPossible]; - - while(QuadsLeft > 0) - { - int ActualQuadCount = minimum(QuadsLeft, m_MaxQuadsAtOnce); - - for(size_t i = 0; i < (size_t)ActualQuadCount; ++i) - { - aColors[i] = pCommand->m_pQuadInfo[i + QuadOffset].m_Color; - aOffsets[i] = pCommand->m_pQuadInfo[i + QuadOffset].m_Offsets; - aRotations[i] = pCommand->m_pQuadInfo[i + QuadOffset].m_Rotation; - } - - pProgram->SetUniformVec4(pProgram->m_LocColors, ActualQuadCount, (float *)aColors); - pProgram->SetUniformVec2(pProgram->m_LocOffsets, ActualQuadCount, (float *)aOffsets); - pProgram->SetUniform(pProgram->m_LocRotations, ActualQuadCount, (float *)aRotations); - pProgram->SetUniform(pProgram->m_LocQuadOffset, (int)(QuadOffset + QuadOffsetExtra)); - glDrawElements(GL_TRIANGLES, ActualQuadCount * 6, GL_UNSIGNED_INT, (void *)((QuadOffset + QuadOffsetExtra) * 6 * sizeof(unsigned int))); - - QuadsLeft -= ActualQuadCount; - QuadOffset += (size_t)ActualQuadCount; - } -} - -void CCommandProcessorFragment_OpenGL3_3::RenderText(const CCommandBuffer::SState &State, int DrawNum, int TextTextureIndex, int TextOutlineTextureIndex, int TextureSize, const ColorRGBA &TextColor, const ColorRGBA &TextOutlineColor) -{ - if(DrawNum == 0) - { - return; // nothing to draw - } - - UseProgram(m_pTextProgram); - - int SlotText = 0; - int SlotTextOutline = 1; - glBindTexture(GL_TEXTURE_2D, m_vTextures[TextTextureIndex].m_Tex); - glBindSampler(SlotText, m_vTextures[TextTextureIndex].m_Sampler); - glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, m_vTextures[TextOutlineTextureIndex].m_Tex); - glBindSampler(SlotTextOutline, m_vTextures[TextOutlineTextureIndex].m_Sampler); - glActiveTexture(GL_TEXTURE0); - - if(m_pTextProgram->m_LastTextSampler != SlotText) - { - m_pTextProgram->SetUniform(m_pTextProgram->m_LocTextSampler, SlotText); - m_pTextProgram->m_LastTextSampler = SlotText; - } - - if(m_pTextProgram->m_LastTextOutlineSampler != SlotTextOutline) - { - m_pTextProgram->SetUniform(m_pTextProgram->m_LocTextOutlineSampler, SlotTextOutline); - m_pTextProgram->m_LastTextOutlineSampler = SlotTextOutline; - } - - SetState(State, m_pTextProgram); - - if(m_pTextProgram->m_LastTextureSize != TextureSize) - { - m_pTextProgram->SetUniform(m_pTextProgram->m_LocTextureSize, (float)TextureSize); - m_pTextProgram->m_LastTextureSize = TextureSize; - } - - if(m_pTextProgram->m_LastOutlineColor != TextOutlineColor) - { - m_pTextProgram->SetUniformVec4(m_pTextProgram->m_LocOutlineColor, 1, (float *)&TextOutlineColor); - m_pTextProgram->m_LastOutlineColor = TextOutlineColor; - } - - if(m_pTextProgram->m_LastColor != TextColor) - { - m_pTextProgram->SetUniformVec4(m_pTextProgram->m_LocColor, 1, (float *)&TextColor); - m_pTextProgram->m_LastColor = TextColor; - } - - glDrawElements(GL_TRIANGLES, DrawNum, GL_UNSIGNED_INT, (void *)(0)); -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_RenderText(const CCommandBuffer::SCommand_RenderText *pCommand) -{ - int Index = pCommand->m_BufferContainerIndex; - // if space not there return - if((size_t)Index >= m_vBufferContainers.size()) - return; - - SBufferContainer &BufferContainer = m_vBufferContainers[Index]; - if(BufferContainer.m_VertArrayId == 0) - return; - - glBindVertexArray(BufferContainer.m_VertArrayId); - if(BufferContainer.m_LastIndexBufferBound != m_QuadDrawIndexBufferId) - { - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_QuadDrawIndexBufferId); - BufferContainer.m_LastIndexBufferBound = m_QuadDrawIndexBufferId; - } - - RenderText(pCommand->m_State, pCommand->m_DrawNum, pCommand->m_TextTextureIndex, pCommand->m_TextOutlineTextureIndex, pCommand->m_TextureSize, pCommand->m_TextColor, pCommand->m_TextOutlineColor); -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_RenderQuadContainer(const CCommandBuffer::SCommand_RenderQuadContainer *pCommand) -{ - if(pCommand->m_DrawNum == 0) - { - return; // nothing to draw - } - - int Index = pCommand->m_BufferContainerIndex; - // if space not there return - if((size_t)Index >= m_vBufferContainers.size()) - return; - - SBufferContainer &BufferContainer = m_vBufferContainers[Index]; - if(BufferContainer.m_VertArrayId == 0) - return; - - glBindVertexArray(BufferContainer.m_VertArrayId); - if(BufferContainer.m_LastIndexBufferBound != m_QuadDrawIndexBufferId) - { - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_QuadDrawIndexBufferId); - BufferContainer.m_LastIndexBufferBound = m_QuadDrawIndexBufferId; - } - - CGLSLTWProgram *pProgram = m_pPrimitiveProgram; - if(IsTexturedState(pCommand->m_State)) - pProgram = m_pPrimitiveProgramTextured; - UseProgram(pProgram); - SetState(pCommand->m_State, pProgram); - - glDrawElements(GL_TRIANGLES, pCommand->m_DrawNum, GL_UNSIGNED_INT, pCommand->m_pOffset); -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_RenderQuadContainerEx(const CCommandBuffer::SCommand_RenderQuadContainerEx *pCommand) -{ - if(pCommand->m_DrawNum == 0) - { - return; // nothing to draw - } - - int Index = pCommand->m_BufferContainerIndex; - // if space not there return - if((size_t)Index >= m_vBufferContainers.size()) - return; - - SBufferContainer &BufferContainer = m_vBufferContainers[Index]; - if(BufferContainer.m_VertArrayId == 0) - return; - - glBindVertexArray(BufferContainer.m_VertArrayId); - if(BufferContainer.m_LastIndexBufferBound != m_QuadDrawIndexBufferId) - { - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_QuadDrawIndexBufferId); - BufferContainer.m_LastIndexBufferBound = m_QuadDrawIndexBufferId; - } - - CGLSLPrimitiveExProgram *pProgram = m_pPrimitiveExProgramRotationless; - if(IsTexturedState(pCommand->m_State)) - { - if(pCommand->m_Rotation != 0.0f) - pProgram = m_pPrimitiveExProgramTextured; - else - pProgram = m_pPrimitiveExProgramTexturedRotationless; - } - else - { - if(pCommand->m_Rotation != 0.0f) - pProgram = m_pPrimitiveExProgram; - } - - UseProgram(pProgram); - SetState(pCommand->m_State, pProgram); - - if(pCommand->m_Rotation != 0.0f && pProgram->m_LastCenter != pCommand->m_Center) - { - pProgram->SetUniformVec2(pProgram->m_LocCenter, 1, (float *)&pCommand->m_Center); - pProgram->m_LastCenter = pCommand->m_Center; - } - - if(pProgram->m_LastRotation != pCommand->m_Rotation) - { - pProgram->SetUniform(pProgram->m_LocRotation, pCommand->m_Rotation); - pProgram->m_LastRotation = pCommand->m_Rotation; - } - - if(pProgram->m_LastVerticesColor != pCommand->m_VertexColor) - { - pProgram->SetUniformVec4(pProgram->m_LocVertciesColor, 1, (float *)&pCommand->m_VertexColor); - pProgram->m_LastVerticesColor = pCommand->m_VertexColor; - } - - glDrawElements(GL_TRIANGLES, pCommand->m_DrawNum, GL_UNSIGNED_INT, pCommand->m_pOffset); -} - -void CCommandProcessorFragment_OpenGL3_3::Cmd_RenderQuadContainerAsSpriteMultiple(const CCommandBuffer::SCommand_RenderQuadContainerAsSpriteMultiple *pCommand) -{ - if(pCommand->m_DrawNum == 0 || pCommand->m_DrawCount == 0) - { - return; // nothing to draw - } - - int Index = pCommand->m_BufferContainerIndex; - // if space not there return - if((size_t)Index >= m_vBufferContainers.size()) - return; - - SBufferContainer &BufferContainer = m_vBufferContainers[Index]; - if(BufferContainer.m_VertArrayId == 0) - return; - - glBindVertexArray(BufferContainer.m_VertArrayId); - if(BufferContainer.m_LastIndexBufferBound != m_QuadDrawIndexBufferId) - { - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_QuadDrawIndexBufferId); - BufferContainer.m_LastIndexBufferBound = m_QuadDrawIndexBufferId; - } - - UseProgram(m_pSpriteProgramMultiple); - SetState(pCommand->m_State, m_pSpriteProgramMultiple); - - if(m_pSpriteProgramMultiple->m_LastCenter != pCommand->m_Center) - { - m_pSpriteProgramMultiple->SetUniformVec2(m_pSpriteProgramMultiple->m_LocCenter, 1, (float *)&pCommand->m_Center); - m_pSpriteProgramMultiple->m_LastCenter = pCommand->m_Center; - } - - if(m_pSpriteProgramMultiple->m_LastVerticesColor != pCommand->m_VertexColor) - { - m_pSpriteProgramMultiple->SetUniformVec4(m_pSpriteProgramMultiple->m_LocVertciesColor, 1, (float *)&pCommand->m_VertexColor); - m_pSpriteProgramMultiple->m_LastVerticesColor = pCommand->m_VertexColor; - } - - int DrawCount = pCommand->m_DrawCount; - size_t RenderOffset = 0; - - // 4 for the center (always use vec4) and 16 for the matrix(just to be sure), 4 for the sampler and vertex color - const int RSPCount = 256 - 4 - 16 - 8; - - while(DrawCount > 0) - { - int UniformCount = (DrawCount > RSPCount ? RSPCount : DrawCount); - - m_pSpriteProgramMultiple->SetUniformVec4(m_pSpriteProgramMultiple->m_LocRSP, UniformCount, (float *)(pCommand->m_pRenderInfo + RenderOffset)); - - glDrawElementsInstanced(GL_TRIANGLES, pCommand->m_DrawNum, GL_UNSIGNED_INT, pCommand->m_pOffset, UniformCount); - - RenderOffset += RSPCount; - DrawCount -= RSPCount; - } -} - -#endif diff --git a/src/engine/client/backend/opengl/backend_opengl3.h b/src/engine/client/backend/opengl/backend_opengl3.h deleted file mode 100644 index 7b68d813d0..0000000000 --- a/src/engine/client/backend/opengl/backend_opengl3.h +++ /dev/null @@ -1,117 +0,0 @@ -// This file can be included several times. -#if(!defined(BACKEND_AS_OPENGL_ES) && !defined(ENGINE_CLIENT_BACKEND_OPENGL_BACKEND_OPENGL3_H)) || \ - (defined(BACKEND_AS_OPENGL_ES) && !defined(ENGINE_CLIENT_BACKEND_OPENGL_BACKEND_OPENGL3_H_AS_ES)) - -#if !defined(BACKEND_AS_OPENGL_ES) && !defined(ENGINE_CLIENT_BACKEND_OPENGL_BACKEND_OPENGL3_H) -#define ENGINE_CLIENT_BACKEND_OPENGL_BACKEND_OPENGL3_H -#endif - -#if defined(BACKEND_AS_OPENGL_ES) && !defined(ENGINE_CLIENT_BACKEND_OPENGL_BACKEND_OPENGL3_H_AS_ES) -#define ENGINE_CLIENT_BACKEND_OPENGL_BACKEND_OPENGL3_H_AS_ES -#endif - -#include "backend_opengl.h" - -class CGLSLPrimitiveExProgram; -class CGLSLQuadProgram; -class CGLSLSpriteMultipleProgram; -class CGLSLTextProgram; - -#define MAX_STREAM_BUFFER_COUNT 10 - -// takes care of opengl 3.3+ related rendering -class CCommandProcessorFragment_OpenGL3_3 : public CCommandProcessorFragment_OpenGL3 -{ -protected: - int m_MaxQuadsAtOnce; - static const int ms_MaxQuadsPossible = 256; - - CGLSLPrimitiveProgram *m_pPrimitiveProgram; - CGLSLPrimitiveProgram *m_pPrimitiveProgramTextured; - CGLSLQuadProgram *m_pQuadProgram; - CGLSLQuadProgram *m_pQuadProgramTextured; - CGLSLTextProgram *m_pTextProgram; - CGLSLPrimitiveExProgram *m_pPrimitiveExProgram; - CGLSLPrimitiveExProgram *m_pPrimitiveExProgramTextured; - CGLSLPrimitiveExProgram *m_pPrimitiveExProgramRotationless; - CGLSLPrimitiveExProgram *m_pPrimitiveExProgramTexturedRotationless; - CGLSLSpriteMultipleProgram *m_pSpriteProgramMultiple; - - TWGLuint m_LastProgramId; - - TWGLuint m_aPrimitiveDrawVertexId[MAX_STREAM_BUFFER_COUNT]; - TWGLuint m_PrimitiveDrawVertexIdTex3D; - TWGLuint m_aPrimitiveDrawBufferId[MAX_STREAM_BUFFER_COUNT]; - TWGLuint m_PrimitiveDrawBufferIdTex3D; - - TWGLuint m_aLastIndexBufferBound[MAX_STREAM_BUFFER_COUNT]; - - int m_LastStreamBuffer; - - TWGLuint m_QuadDrawIndexBufferId; - unsigned int m_CurrentIndicesInBuffer; - - void DestroyBufferContainer(int Index, bool DeleteBOs = true); - - void AppendIndices(unsigned int NewIndicesCount); - - struct SBufferContainer - { - SBufferContainer() : - m_VertArrayId(0), m_LastIndexBufferBound(0) {} - TWGLuint m_VertArrayId; - TWGLuint m_LastIndexBufferBound; - SBufferContainerInfo m_ContainerInfo; - }; - std::vector m_vBufferContainers; - - std::vector m_vBufferObjectIndices; - - CCommandBuffer::SColorf m_ClearColor; - - void InitPrimExProgram(CGLSLPrimitiveExProgram *pProgram, class CGLSLCompiler *pCompiler, class IStorage *pStorage, bool Textured, bool Rotationless); - - bool IsNewApi() override { return true; } - - void UseProgram(CGLSLTWProgram *pProgram); - void UploadStreamBufferData(unsigned int PrimitiveType, const void *pVertices, size_t VertSize, unsigned int PrimitiveCount, bool AsTex3D = false); - void RenderText(const CCommandBuffer::SState &State, int DrawNum, int TextTextureIndex, int TextOutlineTextureIndex, int TextureSize, const ColorRGBA &TextColor, const ColorRGBA &TextOutlineColor); - - void TextureUpdate(int Slot, int X, int Y, int Width, int Height, int GLFormat, uint8_t *pTexData); - void TextureCreate(int Slot, int Width, int Height, int GLFormat, int GLStoreFormat, int Flags, uint8_t *pTexData); - - bool Cmd_Init(const SCommand_Init *pCommand) override; - void Cmd_Shutdown(const SCommand_Shutdown *pCommand) override; - void Cmd_Texture_Destroy(const CCommandBuffer::SCommand_Texture_Destroy *pCommand) override; - void Cmd_Texture_Create(const CCommandBuffer::SCommand_Texture_Create *pCommand) override; - void Cmd_TextTexture_Update(const CCommandBuffer::SCommand_TextTexture_Update *pCommand) override; - void Cmd_TextTextures_Destroy(const CCommandBuffer::SCommand_TextTextures_Destroy *pCommand) override; - void Cmd_TextTextures_Create(const CCommandBuffer::SCommand_TextTextures_Create *pCommand) override; - void Cmd_Clear(const CCommandBuffer::SCommand_Clear *pCommand) override; - void Cmd_Render(const CCommandBuffer::SCommand_Render *pCommand) override; - void Cmd_RenderTex3D(const CCommandBuffer::SCommand_RenderTex3D *pCommand) override; - - void Cmd_CreateBufferObject(const CCommandBuffer::SCommand_CreateBufferObject *pCommand) override; - void Cmd_RecreateBufferObject(const CCommandBuffer::SCommand_RecreateBufferObject *pCommand) override; - void Cmd_UpdateBufferObject(const CCommandBuffer::SCommand_UpdateBufferObject *pCommand) override; - void Cmd_CopyBufferObject(const CCommandBuffer::SCommand_CopyBufferObject *pCommand) override; - void Cmd_DeleteBufferObject(const CCommandBuffer::SCommand_DeleteBufferObject *pCommand) override; - - void Cmd_CreateBufferContainer(const CCommandBuffer::SCommand_CreateBufferContainer *pCommand) override; - void Cmd_UpdateBufferContainer(const CCommandBuffer::SCommand_UpdateBufferContainer *pCommand) override; - void Cmd_DeleteBufferContainer(const CCommandBuffer::SCommand_DeleteBufferContainer *pCommand) override; - void Cmd_IndicesRequiredNumNotify(const CCommandBuffer::SCommand_IndicesRequiredNumNotify *pCommand) override; - - void Cmd_RenderTileLayer(const CCommandBuffer::SCommand_RenderTileLayer *pCommand) override; - void Cmd_RenderBorderTile(const CCommandBuffer::SCommand_RenderBorderTile *pCommand) override; - void Cmd_RenderQuadLayer(const CCommandBuffer::SCommand_RenderQuadLayer *pCommand) override; - void Cmd_RenderText(const CCommandBuffer::SCommand_RenderText *pCommand) override; - void Cmd_RenderQuadContainer(const CCommandBuffer::SCommand_RenderQuadContainer *pCommand) override; - void Cmd_RenderQuadContainerEx(const CCommandBuffer::SCommand_RenderQuadContainerEx *pCommand) override; - void Cmd_RenderQuadContainerAsSpriteMultiple(const CCommandBuffer::SCommand_RenderQuadContainerAsSpriteMultiple *pCommand) override; - -public: - CCommandProcessorFragment_OpenGL3_3() = default; -}; - -#endif diff --git a/src/engine/client/backend/opengl/opengl_sl.cpp b/src/engine/client/backend/opengl/opengl_sl.cpp deleted file mode 100644 index a8b16c6af5..0000000000 --- a/src/engine/client/backend/opengl/opengl_sl.cpp +++ /dev/null @@ -1,161 +0,0 @@ -#include "opengl_sl.h" - -#include - -#if defined(BACKEND_AS_OPENGL_ES) || !defined(CONF_BACKEND_OPENGL_ES) - -#include -#include -#include -#include -#include - -#include -#include - -#ifndef BACKEND_AS_OPENGL_ES -#include -#else -#include -#endif - -bool CGLSL::LoadShader(CGLSLCompiler *pCompiler, IStorage *pStorage, const char *pFile, int Type) -{ - if(m_IsLoaded) - return true; - - CLineReader LineReader; - std::vector vLines; - if(LineReader.OpenFile(pStorage->OpenFile(pFile, IOFLAG_READ, IStorage::TYPE_ALL))) - { - EBackendType BackendType = pCompiler->m_IsOpenGLES ? BACKEND_TYPE_OPENGL_ES : BACKEND_TYPE_OPENGL; - bool IsNewOpenGL = (BackendType == BACKEND_TYPE_OPENGL ? (pCompiler->m_OpenGLVersionMajor >= 4 || (pCompiler->m_OpenGLVersionMajor == 3 && pCompiler->m_OpenGLVersionMinor == 3)) : pCompiler->m_OpenGLVersionMajor >= 3); - std::string GLShaderStringPostfix = std::string(" core\r\n"); - if(BackendType == BACKEND_TYPE_OPENGL_ES) - GLShaderStringPostfix = std::string(" es\r\n"); - //add compiler specific values - if(IsNewOpenGL) - vLines.push_back(std::string("#version ") + std::string(std::to_string(pCompiler->m_OpenGLVersionMajor)) + std::string(std::to_string(pCompiler->m_OpenGLVersionMinor)) + std::string(std::to_string(pCompiler->m_OpenGLVersionPatch)) + GLShaderStringPostfix); - else - { - if(pCompiler->m_OpenGLVersionMajor == 3) - { - if(pCompiler->m_OpenGLVersionMinor == 0) - vLines.emplace_back("#version 130 \r\n"); - if(pCompiler->m_OpenGLVersionMinor == 1) - vLines.emplace_back("#version 140 \r\n"); - if(pCompiler->m_OpenGLVersionMinor == 2) - vLines.emplace_back("#version 150 \r\n"); - } - else if(pCompiler->m_OpenGLVersionMajor == 2) - { - if(pCompiler->m_OpenGLVersionMinor == 0) - vLines.emplace_back("#version 110 \r\n"); - if(pCompiler->m_OpenGLVersionMinor == 1) - vLines.emplace_back("#version 120 \r\n"); - } - } - - if(BackendType == BACKEND_TYPE_OPENGL_ES) - { - if(Type == GL_FRAGMENT_SHADER) - { - vLines.emplace_back("precision highp float; \r\n"); - vLines.emplace_back("precision highp sampler2D; \r\n"); - vLines.emplace_back("precision highp sampler3D; \r\n"); - vLines.emplace_back("precision highp samplerCube; \r\n"); - vLines.emplace_back("precision highp samplerCubeShadow; \r\n"); - vLines.emplace_back("precision highp sampler2DShadow; \r\n"); - vLines.emplace_back("precision highp sampler2DArray; \r\n"); - vLines.emplace_back("precision highp sampler2DArrayShadow; \r\n"); - } - } - - for(const CGLSLCompiler::SGLSLCompilerDefine &Define : pCompiler->m_vDefines) - { - vLines.push_back(std::string("#define ") + Define.m_DefineName + std::string(" ") + Define.m_DefineValue + std::string("\r\n")); - } - - if(Type == GL_FRAGMENT_SHADER && !IsNewOpenGL && pCompiler->m_OpenGLVersionMajor <= 3 && pCompiler->m_HasTextureArray) - { - vLines.emplace_back("#extension GL_EXT_texture_array : enable\r\n"); - } - - while(const char *pReadLine = LineReader.Get()) - { - std::string Line; - pCompiler->ParseLine(Line, pReadLine, Type == GL_FRAGMENT_SHADER ? GLSL_SHADER_COMPILER_TYPE_FRAGMENT : GLSL_SHADER_COMPILER_TYPE_VERTEX); - Line.append("\r\n"); - vLines.push_back(Line); - } - - const char **ShaderCode = new const char *[vLines.size()]; - - for(size_t i = 0; i < vLines.size(); ++i) - { - ShaderCode[i] = vLines[i].c_str(); - } - - TWGLuint shader = glCreateShader(Type); - - glShaderSource(shader, vLines.size(), ShaderCode, NULL); - glCompileShader(shader); - - delete[] ShaderCode; - - int CompilationStatus; - glGetShaderiv(shader, GL_COMPILE_STATUS, &CompilationStatus); - - if(CompilationStatus == GL_FALSE) - { - char aBuf[3000]; - - TWGLint maxLength = 0; - glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength); - - glGetShaderInfoLog(shader, maxLength, &maxLength, aBuf); - - dbg_msg("glsl", "%s: %s", pFile, aBuf); - glDeleteShader(shader); - return false; - } - m_Type = Type; - m_IsLoaded = true; - - m_ShaderId = shader; - - return true; - } - else - return false; -} - -void CGLSL::DeleteShader() -{ - if(!IsLoaded()) - return; - m_IsLoaded = false; - glDeleteShader(m_ShaderId); -} - -bool CGLSL::IsLoaded() const -{ - return m_IsLoaded; -} - -TWGLuint CGLSL::GetShaderId() const -{ - return m_ShaderId; -} - -CGLSL::CGLSL() -{ - m_IsLoaded = false; -} - -CGLSL::~CGLSL() -{ - DeleteShader(); -} - -#endif diff --git a/src/engine/client/backend/opengl/opengl_sl.h b/src/engine/client/backend/opengl/opengl_sl.h deleted file mode 100644 index 79024af8ee..0000000000 --- a/src/engine/client/backend/opengl/opengl_sl.h +++ /dev/null @@ -1,35 +0,0 @@ -// This file can be included several times. -#if(!defined(BACKEND_AS_OPENGL_ES) && !defined(ENGINE_CLIENT_BACKEND_OPENGL_OPENGL_SL_H)) || \ - (defined(BACKEND_AS_OPENGL_ES) && !defined(ENGINE_CLIENT_BACKEND_OPENGL_OPENGL_SL_H_AS_ES)) - -#if !defined(BACKEND_AS_OPENGL_ES) && !defined(ENGINE_CLIENT_BACKEND_OPENGL_OPENGL_SL_H) -#define ENGINE_CLIENT_BACKEND_OPENGL_OPENGL_SL_H -#endif - -#if defined(BACKEND_AS_OPENGL_ES) && !defined(ENGINE_CLIENT_BACKEND_OPENGL_OPENGL_SL_H_AS_ES) -#define ENGINE_CLIENT_BACKEND_OPENGL_OPENGL_SL_H_AS_ES -#endif - -#include - -class CGLSLCompiler; - -class CGLSL -{ -public: - bool LoadShader(CGLSLCompiler *pCompiler, class IStorage *pStorage, const char *pFile, int Type); - void DeleteShader(); - - bool IsLoaded() const; - TWGLuint GetShaderId() const; - - CGLSL(); - virtual ~CGLSL(); - -private: - TWGLuint m_ShaderId; - int m_Type; - bool m_IsLoaded; -}; - -#endif diff --git a/src/engine/client/backend/opengl/opengl_sl_program.cpp b/src/engine/client/backend/opengl/opengl_sl_program.cpp deleted file mode 100644 index 0ad2e2ed37..0000000000 --- a/src/engine/client/backend/opengl/opengl_sl_program.cpp +++ /dev/null @@ -1,148 +0,0 @@ -#include "opengl_sl_program.h" -#include "opengl_sl.h" -#include - -#include - -#if defined(BACKEND_AS_OPENGL_ES) || !defined(CONF_BACKEND_OPENGL_ES) - -#ifndef BACKEND_AS_OPENGL_ES -#include -#else -#include -#endif - -void CGLSLProgram::CreateProgram() -{ - m_ProgramId = glCreateProgram(); -} - -void CGLSLProgram::DeleteProgram() -{ - if(!m_IsLinked) - return; - m_IsLinked = false; - glDeleteProgram(m_ProgramId); -} - -bool CGLSLProgram::AddShader(CGLSL *pShader) const -{ - if(pShader->IsLoaded()) - { - glAttachShader(m_ProgramId, pShader->GetShaderId()); - return true; - } - return false; -} - -void CGLSLProgram::DetachShader(CGLSL *pShader) const -{ - if(pShader->IsLoaded()) - { - DetachShaderById(pShader->GetShaderId()); - } -} - -void CGLSLProgram::DetachShaderById(TWGLuint ShaderId) const -{ - glDetachShader(m_ProgramId, ShaderId); -} - -void CGLSLProgram::LinkProgram() -{ - glLinkProgram(m_ProgramId); - int LinkStatus; - glGetProgramiv(m_ProgramId, GL_LINK_STATUS, &LinkStatus); - m_IsLinked = LinkStatus == GL_TRUE; - if(!m_IsLinked) - { - char aInfoLog[1024]; - char aFinalMessage[1536]; - int LogLength; - glGetProgramInfoLog(m_ProgramId, 1024, &LogLength, aInfoLog); - str_format(aFinalMessage, sizeof(aFinalMessage), "Error! Shader program wasn't linked! The linker returned:\n\n%s", aInfoLog); - dbg_msg("glslprogram", "%s", aFinalMessage); - } - - //detach all shaders attached to this program - DetachAllShaders(); -} - -void CGLSLProgram::DetachAllShaders() const -{ - TWGLuint aShaders[100]; - GLsizei ReturnedCount = 0; - while(true) - { - glGetAttachedShaders(m_ProgramId, 100, &ReturnedCount, aShaders); - - if(ReturnedCount > 0) - { - for(GLsizei i = 0; i < ReturnedCount; ++i) - { - DetachShaderById(aShaders[i]); - } - } - - if(ReturnedCount < 100) - break; - } -} - -void CGLSLProgram::SetUniformVec4(int Loc, int Count, const float *pValues) -{ - glUniform4fv(Loc, Count, pValues); -} - -void CGLSLProgram::SetUniformVec2(int Loc, int Count, const float *pValues) -{ - glUniform2fv(Loc, Count, pValues); -} - -void CGLSLProgram::SetUniform(int Loc, int Count, const float *pValues) -{ - glUniform1fv(Loc, Count, pValues); -} - -void CGLSLProgram::SetUniform(int Loc, const int Value) -{ - glUniform1i(Loc, Value); -} - -void CGLSLProgram::SetUniform(int Loc, const float Value) -{ - glUniform1f(Loc, Value); -} - -void CGLSLProgram::SetUniform(int Loc, const bool Value) -{ - glUniform1i(Loc, (int)Value); -} - -int CGLSLProgram::GetUniformLoc(const char *pName) const -{ - return glGetUniformLocation(m_ProgramId, pName); -} - -void CGLSLProgram::UseProgram() const -{ - if(m_IsLinked) - glUseProgram(m_ProgramId); -} - -TWGLuint CGLSLProgram::GetProgramId() const -{ - return m_ProgramId; -} - -CGLSLProgram::CGLSLProgram() -{ - m_IsLinked = false; -} - -CGLSLProgram::~CGLSLProgram() -{ - DeleteProgram(); -} - -#endif diff --git a/src/engine/client/backend/opengl/opengl_sl_program.h b/src/engine/client/backend/opengl/opengl_sl_program.h deleted file mode 100644 index 404c7a6f08..0000000000 --- a/src/engine/client/backend/opengl/opengl_sl_program.h +++ /dev/null @@ -1,163 +0,0 @@ -// This file can be included several times. -#if(!defined(BACKEND_AS_OPENGL_ES) && !defined(ENGINE_CLIENT_BACKEND_OPENGL_OPENGL_SL_PROGRAM_H)) || \ - (defined(BACKEND_AS_OPENGL_ES) && !defined(ENGINE_CLIENT_BACKEND_OPENGL_OPENGL_SL_PROGRAM_H_AS_ES)) - -#if !defined(BACKEND_AS_OPENGL_ES) && !defined(ENGINE_CLIENT_BACKEND_OPENGL_OPENGL_SL_PROGRAM_H) -#define ENGINE_CLIENT_BACKEND_OPENGL_OPENGL_SL_PROGRAM_H -#endif - -#if defined(BACKEND_AS_OPENGL_ES) && !defined(ENGINE_CLIENT_BACKEND_OPENGL_OPENGL_SL_PROGRAM_H_AS_ES) -#define ENGINE_CLIENT_BACKEND_OPENGL_OPENGL_SL_PROGRAM_H_AS_ES -#endif - -#include -#include -#include - -class CGLSL; - -class CGLSLProgram -{ -public: - void CreateProgram(); - void DeleteProgram(); - - bool AddShader(CGLSL *pShader) const; - - void LinkProgram(); - void UseProgram() const; - TWGLuint GetProgramId() const; - - void DetachShader(CGLSL *pShader) const; - void DetachShaderById(TWGLuint ShaderId) const; - void DetachAllShaders() const; - - //Support various types - void SetUniformVec2(int Loc, int Count, const float *pValue); - void SetUniformVec4(int Loc, int Count, const float *pValue); - void SetUniform(int Loc, int Value); - void SetUniform(int Loc, bool Value); - void SetUniform(int Loc, float Value); - void SetUniform(int Loc, int Count, const float *pValues); - - //for performance reason we do not use SetUniform with using strings... save the Locations of the variables instead - int GetUniformLoc(const char *pName) const; - - CGLSLProgram(); - virtual ~CGLSLProgram(); - -protected: - TWGLuint m_ProgramId; - bool m_IsLinked; -}; - -class CGLSLTWProgram : public CGLSLProgram -{ -public: - CGLSLTWProgram() : - m_LocPos(-1), m_LocTextureSampler(-1), m_LastTextureSampler(-1), m_LastIsTextured(-1) - { - m_LastScreenTL = m_LastScreenBR = vec2(-1, -1); - } - - int m_LocPos; - int m_LocTextureSampler; - - int m_LastTextureSampler; - int m_LastIsTextured; - vec2 m_LastScreenTL; - vec2 m_LastScreenBR; -}; - -class CGLSLTextProgram : public CGLSLTWProgram -{ -public: - CGLSLTextProgram() - - { - m_LastColor[0] = m_LastColor[1] = m_LastColor[2] = m_LastColor[3] = -1.f; - m_LastOutlineColor[0] = m_LastOutlineColor[1] = m_LastOutlineColor[2] = m_LastOutlineColor[3] = -1.f; - m_LastTextSampler = m_LastTextOutlineSampler = -1; - m_LastTextureSize = -1; - } - - int m_LocColor; - int m_LocOutlineColor; - int m_LocTextSampler; - int m_LocTextOutlineSampler; - int m_LocTextureSize; - - ColorRGBA m_LastColor; - ColorRGBA m_LastOutlineColor; - int m_LastTextSampler; - int m_LastTextOutlineSampler; - int m_LastTextureSize; -}; - -class CGLSLPrimitiveProgram : public CGLSLTWProgram -{ -public: -}; - -class CGLSLPrimitiveExProgram : public CGLSLTWProgram -{ -public: - CGLSLPrimitiveExProgram() - - { - m_LastRotation = 0.f; - m_LastCenter = vec2(0, 0); - m_LastVerticesColor = ColorRGBA(-1, -1, -1, -1); - } - - int m_LocRotation; - int m_LocCenter; - int m_LocVertciesColor; - - float m_LastRotation; - vec2 m_LastCenter; - ColorRGBA m_LastVerticesColor; -}; - -class CGLSLSpriteMultipleProgram : public CGLSLTWProgram -{ -public: - CGLSLSpriteMultipleProgram() - - { - m_LastCenter = vec2(0, 0); - m_LastVerticesColor = ColorRGBA(-1, -1, -1, -1); - } - - int m_LocRSP; - int m_LocCenter; - int m_LocVertciesColor; - - vec2 m_LastCenter; - ColorRGBA m_LastVerticesColor; -}; - -class CGLSLQuadProgram : public CGLSLTWProgram -{ -public: - int m_LocColors; - int m_LocOffsets; - int m_LocRotations; - int m_LocQuadOffset; -}; - -class CGLSLTileProgram : public CGLSLTWProgram -{ -public: - CGLSLTileProgram() : - m_LocColor(-1), m_LocOffset(-1), m_LocDir(-1), m_LocNum(-1), m_LocJumpIndex(-1) {} - - int m_LocColor; - int m_LocOffset; - int m_LocDir; - int m_LocScale = -1; - int m_LocNum; - int m_LocJumpIndex; -}; - -#endif diff --git a/src/engine/client/backend/opengles/backend_opengles.cpp b/src/engine/client/backend/opengles/backend_opengles.cpp deleted file mode 100644 index e2797c6a02..0000000000 --- a/src/engine/client/backend/opengles/backend_opengles.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include - -#if defined(CONF_BACKEND_OPENGL_ES) || defined(CONF_BACKEND_OPENGL_ES3) - -#define GLES_CLASS_DEFINES_DO_DEFINE -#include "gles_class_defines.h" -#undef GLES_CLASS_DEFINES_DO_DEFINE - -#define BACKEND_AS_OPENGL_ES 1 - -#include - -#undef BACKEND_AS_OPENGL_ES - -#include "gles_class_defines.h" - -#endif diff --git a/src/engine/client/backend/opengles/backend_opengles3.cpp b/src/engine/client/backend/opengles/backend_opengles3.cpp deleted file mode 100644 index 2b60a0ac5e..0000000000 --- a/src/engine/client/backend/opengles/backend_opengles3.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include - -#if defined(CONF_BACKEND_OPENGL_ES) || defined(CONF_BACKEND_OPENGL_ES3) - -#define GLES_CLASS_DEFINES_DO_DEFINE -#include "gles_class_defines.h" -#undef GLES_CLASS_DEFINES_DO_DEFINE - -#define BACKEND_AS_OPENGL_ES 1 - -#include - -#undef BACKEND_AS_OPENGL_ES - -#include "gles_class_defines.h" - -#endif diff --git a/src/engine/client/backend/opengles/backend_opengles3.h b/src/engine/client/backend/opengles/backend_opengles3.h deleted file mode 100644 index 6e2227b678..0000000000 --- a/src/engine/client/backend/opengles/backend_opengles3.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef ENGINE_CLIENT_BACKEND_OPENGLES_BACKEND_OPENGLES3_H -#define ENGINE_CLIENT_BACKEND_OPENGLES_BACKEND_OPENGLES3_H - -#include - -#if defined(CONF_BACKEND_OPENGL_ES) || defined(CONF_BACKEND_OPENGL_ES3) -#include - -#define GLES_CLASS_DEFINES_DO_DEFINE -#include "gles_class_defines.h" -#undef GLES_CLASS_DEFINES_DO_DEFINE - -#define BACKEND_AS_OPENGL_ES 1 - -#include - -#undef BACKEND_AS_OPENGL_ES - -#include "gles_class_defines.h" - -#endif - -#endif diff --git a/src/engine/client/backend/opengles/gles_class_defines.h b/src/engine/client/backend/opengles/gles_class_defines.h deleted file mode 100644 index 8f538f7e68..0000000000 --- a/src/engine/client/backend/opengles/gles_class_defines.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef ENGINE_CLIENT_BACKEND_OPENGLES_GLES_CLASS_DEFINES_H -#define ENGINE_CLIENT_BACKEND_OPENGLES_GLES_CLASS_DEFINES_H -#undef ENGINE_CLIENT_BACKEND_OPENGLES_GLES_CLASS_DEFINES_H -#endif - -#ifdef GLES_CLASS_DEFINES_DO_DEFINE -#define CCommandProcessorFragment_OpenGL3_3 CCommandProcessorFragment_OpenGLES3 -#define CCommandProcessorFragment_OpenGL3 CCommandProcessorFragment_OpenGLES3Wrapper -#define CCommandProcessorFragment_OpenGL2 CCommandProcessorFragment_OpenGLES2 -#define CCommandProcessorFragment_OpenGL CCommandProcessorFragment_OpenGLES - -#define CGLSL CGLSL_ES -#define CGLSLProgram CGLSL_ESProgram -#define CGLSLTWProgram CGLSL_ESTWProgram -#define CGLSLTextProgram CGLSL_ESTextProgram -#define CGLSLPrimitiveProgram CGLSL_ESPrimitiveProgram -#define CGLSLPrimitiveExProgram CGLSL_ESPrimitiveExProgram -#define CGLSLSpriteMultipleProgram CGLSL_ESSpriteMultipleProgram -#define CGLSLQuadProgram CGLSL_ESQuadProgram -#define CGLSLTileProgram CGLSL_ESTileProgram -#else -#undef CCommandProcessorFragment_OpenGL3_3 -#undef CCommandProcessorFragment_OpenGL3 -#undef CCommandProcessorFragment_OpenGL2 -#undef CCommandProcessorFragment_OpenGL - -#undef CGLSL -#undef CGLSLProgram -#undef CGLSLTWProgram -#undef CGLSLTextProgram -#undef CGLSLPrimitiveProgram -#undef CGLSLPrimitiveExProgram -#undef CGLSLSpriteMultipleProgram -#undef CGLSLQuadProgram -#undef CGLSLTileProgram -#endif diff --git a/src/engine/client/backend/opengles/opengles_sl.cpp b/src/engine/client/backend/opengles/opengles_sl.cpp deleted file mode 100644 index 3509fe844e..0000000000 --- a/src/engine/client/backend/opengles/opengles_sl.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include - -#if defined(CONF_BACKEND_OPENGL_ES) || defined(CONF_BACKEND_OPENGL_ES3) -#define GLES_CLASS_DEFINES_DO_DEFINE -#include "gles_class_defines.h" -#undef GLES_CLASS_DEFINES_DO_DEFINE - -#define BACKEND_AS_OPENGL_ES 1 - -#include - -#undef BACKEND_AS_OPENGL_ES - -#include "gles_class_defines.h" - -#endif diff --git a/src/engine/client/backend/opengles/opengles_sl_program.cpp b/src/engine/client/backend/opengles/opengles_sl_program.cpp deleted file mode 100644 index cdcbe73c2d..0000000000 --- a/src/engine/client/backend/opengles/opengles_sl_program.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include - -#if defined(CONF_BACKEND_OPENGL_ES) || defined(CONF_BACKEND_OPENGL_ES3) -#define GLES_CLASS_DEFINES_DO_DEFINE -#include "gles_class_defines.h" -#undef GLES_CLASS_DEFINES_DO_DEFINE - -#define BACKEND_AS_OPENGL_ES 1 - -#include - -#undef BACKEND_AS_OPENGL_ES - -#include "gles_class_defines.h" - -#endif diff --git a/src/engine/client/backend/vulkan/backend_vulkan.cpp b/src/engine/client/backend/vulkan/backend_vulkan.cpp deleted file mode 100644 index 149858cc67..0000000000 --- a/src/engine/client/backend/vulkan/backend_vulkan.cpp +++ /dev/null @@ -1,7671 +0,0 @@ -#if defined(CONF_BACKEND_VULKAN) - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -#ifndef VK_API_VERSION_MAJOR -#define VK_API_VERSION_MAJOR VK_VERSION_MAJOR -#define VK_API_VERSION_MINOR VK_VERSION_MINOR -#define VK_API_VERSION_PATCH VK_VERSION_PATCH -#endif - -using namespace std::chrono_literals; - -class CCommandProcessorFragment_Vulkan : public CCommandProcessorFragment_GLBase -{ - enum EMemoryBlockUsage - { - MEMORY_BLOCK_USAGE_TEXTURE = 0, - MEMORY_BLOCK_USAGE_BUFFER, - MEMORY_BLOCK_USAGE_STREAM, - MEMORY_BLOCK_USAGE_STAGING, - - // whenever dummy is used, make sure to deallocate all memory - MEMORY_BLOCK_USAGE_DUMMY, - }; - - [[nodiscard]] bool IsVerbose() - { - return g_Config.m_DbgGfx == DEBUG_GFX_MODE_VERBOSE || g_Config.m_DbgGfx == DEBUG_GFX_MODE_ALL; - } - - void VerboseAllocatedMemory(VkDeviceSize Size, size_t FrameImageIndex, EMemoryBlockUsage MemUsage) const - { - const char *pUsage = "unknown"; - switch(MemUsage) - { - case MEMORY_BLOCK_USAGE_TEXTURE: - pUsage = "texture"; - break; - case MEMORY_BLOCK_USAGE_BUFFER: - pUsage = "buffer"; - break; - case MEMORY_BLOCK_USAGE_STREAM: - pUsage = "stream"; - break; - case MEMORY_BLOCK_USAGE_STAGING: - pUsage = "staging buffer"; - break; - default: break; - } - dbg_msg("vulkan", "allocated chunk of memory with size: %" PRIzu " for frame %" PRIzu " (%s)", (size_t)Size, (size_t)m_CurImageIndex, pUsage); - } - - void VerboseDeallocatedMemory(VkDeviceSize Size, size_t FrameImageIndex, EMemoryBlockUsage MemUsage) const - { - const char *pUsage = "unknown"; - switch(MemUsage) - { - case MEMORY_BLOCK_USAGE_TEXTURE: - pUsage = "texture"; - break; - case MEMORY_BLOCK_USAGE_BUFFER: - pUsage = "buffer"; - break; - case MEMORY_BLOCK_USAGE_STREAM: - pUsage = "stream"; - break; - case MEMORY_BLOCK_USAGE_STAGING: - pUsage = "staging buffer"; - break; - default: break; - } - dbg_msg("vulkan", "deallocated chunk of memory with size: %" PRIzu " for frame %" PRIzu " (%s)", (size_t)Size, (size_t)m_CurImageIndex, pUsage); - } - - /************************ - * STRUCT DEFINITIONS - ************************/ - - static constexpr size_t s_StagingBufferCacheId = 0; - static constexpr size_t s_StagingBufferImageCacheId = 1; - static constexpr size_t s_VertexBufferCacheId = 2; - static constexpr size_t s_ImageBufferCacheId = 3; - - struct SDeviceMemoryBlock - { - VkDeviceMemory m_Mem = VK_NULL_HANDLE; - VkDeviceSize m_Size = 0; - EMemoryBlockUsage m_UsageType; - }; - - struct SDeviceDescriptorPools; - - struct SDeviceDescriptorSet - { - VkDescriptorSet m_Descriptor = VK_NULL_HANDLE; - SDeviceDescriptorPools *m_pPools = nullptr; - size_t m_PoolIndex = std::numeric_limits::max(); - }; - - struct SDeviceDescriptorPool - { - VkDescriptorPool m_Pool; - VkDeviceSize m_Size = 0; - VkDeviceSize m_CurSize = 0; - }; - - struct SDeviceDescriptorPools - { - std::vector m_vPools; - VkDeviceSize m_DefaultAllocSize = 0; - bool m_IsUniformPool = false; - }; - - // some mix of queue and binary tree - struct SMemoryHeap - { - struct SMemoryHeapElement; - struct SMemoryHeapQueueElement - { - size_t m_AllocationSize; - // only useful information for the heap - size_t m_OffsetInHeap; - // useful for the user of this element - size_t m_OffsetToAlign; - SMemoryHeapElement *m_pElementInHeap; - [[nodiscard]] bool operator>(const SMemoryHeapQueueElement &Other) const { return m_AllocationSize > Other.m_AllocationSize; } - struct SMemoryHeapQueueElementFind - { - // respects alignment requirements - constexpr bool operator()(const SMemoryHeapQueueElement &Val, const std::pair &Other) const - { - auto AllocSize = Other.first; - auto AllocAlignment = Other.second; - size_t ExtraSizeAlign = Val.m_OffsetInHeap % AllocAlignment; - if(ExtraSizeAlign != 0) - ExtraSizeAlign = AllocAlignment - ExtraSizeAlign; - size_t RealAllocSize = AllocSize + ExtraSizeAlign; - return Val.m_AllocationSize < RealAllocSize; - } - }; - }; - - typedef std::multiset> TMemoryHeapQueue; - - struct SMemoryHeapElement - { - size_t m_AllocationSize; - size_t m_Offset; - SMemoryHeapElement *m_pParent; - std::unique_ptr m_pLeft; - std::unique_ptr m_pRight; - - bool m_InUse; - TMemoryHeapQueue::iterator m_InQueue; - }; - - SMemoryHeapElement m_Root; - TMemoryHeapQueue m_Elements; - - void Init(size_t Size, size_t Offset) - { - m_Root.m_AllocationSize = Size; - m_Root.m_Offset = Offset; - m_Root.m_pParent = nullptr; - m_Root.m_InUse = false; - - SMemoryHeapQueueElement QueueEl; - QueueEl.m_AllocationSize = Size; - QueueEl.m_OffsetInHeap = Offset; - QueueEl.m_OffsetToAlign = Offset; - QueueEl.m_pElementInHeap = &m_Root; - m_Root.m_InQueue = m_Elements.insert(QueueEl); - } - - [[nodiscard]] bool Allocate(size_t AllocSize, size_t AllocAlignment, SMemoryHeapQueueElement &AllocatedMemory) - { - if(m_Elements.empty()) - { - return false; - } - else - { - // check if there is enough space in this instance - if(SMemoryHeapQueueElement::SMemoryHeapQueueElementFind{}(*m_Elements.begin(), std::make_pair(AllocSize, AllocAlignment))) - { - return false; - } - else - { - // see SMemoryHeapQueueElement::operator> - SMemoryHeapQueueElement FindAllocSize; - FindAllocSize.m_AllocationSize = AllocSize; - // find upper bound for a allocation size - auto Upper = m_Elements.upper_bound(FindAllocSize); - // then find the first entry that respects alignment, this is a linear search! - auto FoundEl = std::lower_bound(std::make_reverse_iterator(Upper), m_Elements.rend(), std::make_pair(AllocSize, AllocAlignment), SMemoryHeapQueueElement::SMemoryHeapQueueElementFind{}); - - auto TopEl = *FoundEl; - m_Elements.erase(TopEl.m_pElementInHeap->m_InQueue); - - TopEl.m_pElementInHeap->m_InUse = true; - - // calculate the real alloc size + alignment offset - size_t ExtraSizeAlign = TopEl.m_OffsetInHeap % AllocAlignment; - if(ExtraSizeAlign != 0) - ExtraSizeAlign = AllocAlignment - ExtraSizeAlign; - size_t RealAllocSize = AllocSize + ExtraSizeAlign; - - // the heap element gets children - TopEl.m_pElementInHeap->m_pLeft = std::make_unique(); - TopEl.m_pElementInHeap->m_pLeft->m_AllocationSize = RealAllocSize; - TopEl.m_pElementInHeap->m_pLeft->m_Offset = TopEl.m_OffsetInHeap; - TopEl.m_pElementInHeap->m_pLeft->m_pParent = TopEl.m_pElementInHeap; - TopEl.m_pElementInHeap->m_pLeft->m_InUse = true; - - if(RealAllocSize < TopEl.m_AllocationSize) - { - SMemoryHeapQueueElement RemainingEl; - RemainingEl.m_OffsetInHeap = TopEl.m_OffsetInHeap + RealAllocSize; - RemainingEl.m_AllocationSize = TopEl.m_AllocationSize - RealAllocSize; - - TopEl.m_pElementInHeap->m_pRight = std::make_unique(); - TopEl.m_pElementInHeap->m_pRight->m_AllocationSize = RemainingEl.m_AllocationSize; - TopEl.m_pElementInHeap->m_pRight->m_Offset = RemainingEl.m_OffsetInHeap; - TopEl.m_pElementInHeap->m_pRight->m_pParent = TopEl.m_pElementInHeap; - TopEl.m_pElementInHeap->m_pRight->m_InUse = false; - - RemainingEl.m_pElementInHeap = TopEl.m_pElementInHeap->m_pRight.get(); - RemainingEl.m_pElementInHeap->m_InQueue = m_Elements.insert(RemainingEl); - } - - AllocatedMemory.m_pElementInHeap = TopEl.m_pElementInHeap->m_pLeft.get(); - AllocatedMemory.m_AllocationSize = RealAllocSize; - AllocatedMemory.m_OffsetInHeap = TopEl.m_OffsetInHeap; - AllocatedMemory.m_OffsetToAlign = TopEl.m_OffsetInHeap + ExtraSizeAlign; - return true; - } - } - } - - void Free(const SMemoryHeapQueueElement &AllocatedMemory) - { - bool ContinueFree = true; - SMemoryHeapQueueElement ThisEl = AllocatedMemory; - while(ContinueFree) - { - // first check if the other block is in use, if not merge them again - SMemoryHeapElement *pThisHeapObj = ThisEl.m_pElementInHeap; - SMemoryHeapElement *pThisParent = pThisHeapObj->m_pParent; - pThisHeapObj->m_InUse = false; - SMemoryHeapElement *pOtherHeapObj = nullptr; - if(pThisParent != nullptr && pThisHeapObj == pThisParent->m_pLeft.get()) - pOtherHeapObj = pThisHeapObj->m_pParent->m_pRight.get(); - else if(pThisParent != nullptr) - pOtherHeapObj = pThisHeapObj->m_pParent->m_pLeft.get(); - - if((pThisParent != nullptr && pOtherHeapObj == nullptr) || (pOtherHeapObj != nullptr && !pOtherHeapObj->m_InUse)) - { - // merge them - if(pOtherHeapObj != nullptr) - { - m_Elements.erase(pOtherHeapObj->m_InQueue); - pOtherHeapObj->m_InUse = false; - } - - SMemoryHeapQueueElement ParentEl; - ParentEl.m_OffsetInHeap = pThisParent->m_Offset; - ParentEl.m_AllocationSize = pThisParent->m_AllocationSize; - ParentEl.m_pElementInHeap = pThisParent; - - pThisParent->m_pLeft = nullptr; - pThisParent->m_pRight = nullptr; - - ThisEl = ParentEl; - } - else - { - // else just put this back into queue - ThisEl.m_pElementInHeap->m_InQueue = m_Elements.insert(ThisEl); - ContinueFree = false; - } - } - } - - [[nodiscard]] bool IsUnused() const - { - return !m_Root.m_InUse; - } - }; - - template - struct SMemoryBlock - { - SMemoryHeap::SMemoryHeapQueueElement m_HeapData; - - VkDeviceSize m_UsedSize; - - // optional - VkBuffer m_Buffer; - - SDeviceMemoryBlock m_BufferMem; - void *m_pMappedBuffer; - - bool m_IsCached; - SMemoryHeap *m_pHeap; - }; - - template - struct SMemoryImageBlock : public SMemoryBlock - { - uint32_t m_ImageMemoryBits; - }; - - template - struct SMemoryBlockCache - { - struct SMemoryCacheType - { - struct SMemoryCacheHeap - { - SMemoryHeap m_Heap; - VkBuffer m_Buffer; - - SDeviceMemoryBlock m_BufferMem; - void *m_pMappedBuffer; - }; - std::vector m_vpMemoryHeaps; - }; - SMemoryCacheType m_MemoryCaches; - std::vector>> m_vvFrameDelayedCachedBufferCleanup; - - bool m_CanShrink = false; - - void Init(size_t SwapChainImageCount) - { - m_vvFrameDelayedCachedBufferCleanup.resize(SwapChainImageCount); - } - - void DestroyFrameData(size_t ImageCount) - { - for(size_t i = 0; i < ImageCount; ++i) - Cleanup(i); - m_vvFrameDelayedCachedBufferCleanup.clear(); - } - - void Destroy(VkDevice &Device) - { - for(auto it = m_MemoryCaches.m_vpMemoryHeaps.begin(); it != m_MemoryCaches.m_vpMemoryHeaps.end();) - { - auto *pHeap = *it; - if(pHeap->m_pMappedBuffer != nullptr) - vkUnmapMemory(Device, pHeap->m_BufferMem.m_Mem); - if(pHeap->m_Buffer != VK_NULL_HANDLE) - vkDestroyBuffer(Device, pHeap->m_Buffer, nullptr); - vkFreeMemory(Device, pHeap->m_BufferMem.m_Mem, nullptr); - - delete pHeap; - it = m_MemoryCaches.m_vpMemoryHeaps.erase(it); - } - - m_MemoryCaches.m_vpMemoryHeaps.clear(); - m_vvFrameDelayedCachedBufferCleanup.clear(); - } - - void Cleanup(size_t ImgIndex) - { - for(auto &MemBlock : m_vvFrameDelayedCachedBufferCleanup[ImgIndex]) - { - MemBlock.m_UsedSize = 0; - MemBlock.m_pHeap->Free(MemBlock.m_HeapData); - - m_CanShrink = true; - } - m_vvFrameDelayedCachedBufferCleanup[ImgIndex].clear(); - } - - void FreeMemBlock(SMemoryBlock &Block, size_t ImgIndex) - { - m_vvFrameDelayedCachedBufferCleanup[ImgIndex].push_back(Block); - } - - // returns the total free'd memory - size_t Shrink(VkDevice &Device) - { - size_t FreeedMemory = 0; - if(m_CanShrink) - { - m_CanShrink = false; - if(m_MemoryCaches.m_vpMemoryHeaps.size() > 1) - { - for(auto it = m_MemoryCaches.m_vpMemoryHeaps.begin(); it != m_MemoryCaches.m_vpMemoryHeaps.end();) - { - auto *pHeap = *it; - if(pHeap->m_Heap.IsUnused()) - { - if(pHeap->m_pMappedBuffer != nullptr) - vkUnmapMemory(Device, pHeap->m_BufferMem.m_Mem); - if(pHeap->m_Buffer != VK_NULL_HANDLE) - vkDestroyBuffer(Device, pHeap->m_Buffer, nullptr); - vkFreeMemory(Device, pHeap->m_BufferMem.m_Mem, nullptr); - FreeedMemory += pHeap->m_BufferMem.m_Size; - - delete pHeap; - it = m_MemoryCaches.m_vpMemoryHeaps.erase(it); - if(m_MemoryCaches.m_vpMemoryHeaps.size() == 1) - break; - } - else - ++it; - } - } - } - - return FreeedMemory; - } - }; - - struct CTexture - { - VkImage m_Img = VK_NULL_HANDLE; - SMemoryImageBlock m_ImgMem; - VkImageView m_ImgView = VK_NULL_HANDLE; - VkSampler m_aSamplers[2] = {VK_NULL_HANDLE, VK_NULL_HANDLE}; - - VkImage m_Img3D = VK_NULL_HANDLE; - SMemoryImageBlock m_Img3DMem; - VkImageView m_Img3DView = VK_NULL_HANDLE; - VkSampler m_Sampler3D = VK_NULL_HANDLE; - - uint32_t m_Width = 0; - uint32_t m_Height = 0; - uint32_t m_RescaleCount = 0; - - uint32_t m_MipMapCount = 1; - - std::array m_aVKStandardTexturedDescrSets; - SDeviceDescriptorSet m_VKStandard3DTexturedDescrSet; - SDeviceDescriptorSet m_VKTextDescrSet; - }; - - struct SBufferObject - { - SMemoryBlock m_Mem; - }; - - struct SBufferObjectFrame - { - SBufferObject m_BufferObject; - - // since stream buffers can be used the cur buffer should always be used for rendering - bool m_IsStreamedBuffer = false; - VkBuffer m_CurBuffer = VK_NULL_HANDLE; - size_t m_CurBufferOffset = 0; - }; - - struct SBufferContainer - { - int m_BufferObjectIndex; - }; - - struct SFrameBuffers - { - VkBuffer m_Buffer; - SDeviceMemoryBlock m_BufferMem; - size_t m_OffsetInBuffer = 0; - size_t m_Size; - size_t m_UsedSize; - uint8_t *m_pMappedBufferData; - - SFrameBuffers(VkBuffer Buffer, SDeviceMemoryBlock BufferMem, size_t OffsetInBuffer, size_t Size, size_t UsedSize, uint8_t *pMappedBufferData) : - m_Buffer(Buffer), m_BufferMem(BufferMem), m_OffsetInBuffer(OffsetInBuffer), m_Size(Size), m_UsedSize(UsedSize), m_pMappedBufferData(pMappedBufferData) - { - } - }; - - struct SFrameUniformBuffers : public SFrameBuffers - { - std::array m_aUniformSets; - - SFrameUniformBuffers(VkBuffer Buffer, SDeviceMemoryBlock BufferMem, size_t OffsetInBuffer, size_t Size, size_t UsedSize, uint8_t *pMappedBufferData) : - SFrameBuffers(Buffer, BufferMem, OffsetInBuffer, Size, UsedSize, pMappedBufferData) {} - }; - - template - struct SStreamMemory - { - typedef std::vector> TBufferObjectsOfFrame; - typedef std::vector> TMemoryMapRangesOfFrame; - typedef std::vector TStreamUseCount; - TBufferObjectsOfFrame m_vvBufferObjectsOfFrame; - TMemoryMapRangesOfFrame m_vvBufferObjectsOfFrameRangeData; - TStreamUseCount m_vCurrentUsedCount; - - std::vector &GetBuffers(size_t FrameImageIndex) - { - return m_vvBufferObjectsOfFrame[FrameImageIndex]; - } - - std::vector &GetRanges(size_t FrameImageIndex) - { - return m_vvBufferObjectsOfFrameRangeData[FrameImageIndex]; - } - - size_t GetUsedCount(size_t FrameImageIndex) - { - return m_vCurrentUsedCount[FrameImageIndex]; - } - - void IncreaseUsedCount(size_t FrameImageIndex) - { - ++m_vCurrentUsedCount[FrameImageIndex]; - } - - [[nodiscard]] bool IsUsed(size_t FrameImageIndex) - { - return GetUsedCount(FrameImageIndex) > 0; - } - - void ResetFrame(size_t FrameImageIndex) - { - m_vCurrentUsedCount[FrameImageIndex] = 0; - } - - void Init(size_t FrameImageCount) - { - m_vvBufferObjectsOfFrame.resize(FrameImageCount); - m_vvBufferObjectsOfFrameRangeData.resize(FrameImageCount); - m_vCurrentUsedCount.resize(FrameImageCount); - } - - typedef std::function TDestroyBufferFunc; - - void Destroy(TDestroyBufferFunc &&DestroyBuffer) - { - size_t ImageIndex = 0; - for(auto &vBuffersOfFrame : m_vvBufferObjectsOfFrame) - { - for(auto &BufferOfFrame : vBuffersOfFrame) - { - VkDeviceMemory BufferMem = BufferOfFrame.m_BufferMem.m_Mem; - DestroyBuffer(ImageIndex, BufferOfFrame); - - // delete similar buffers - for(auto &BufferOfFrameDel : vBuffersOfFrame) - { - if(BufferOfFrameDel.m_BufferMem.m_Mem == BufferMem) - { - BufferOfFrameDel.m_Buffer = VK_NULL_HANDLE; - BufferOfFrameDel.m_BufferMem.m_Mem = VK_NULL_HANDLE; - } - } - } - ++ImageIndex; - } - m_vvBufferObjectsOfFrame.clear(); - m_vvBufferObjectsOfFrameRangeData.clear(); - m_vCurrentUsedCount.clear(); - } - }; - - struct SShaderModule - { - VkShaderModule m_VertShaderModule = VK_NULL_HANDLE; - VkShaderModule m_FragShaderModule = VK_NULL_HANDLE; - - VkDevice m_VKDevice = VK_NULL_HANDLE; - - ~SShaderModule() - { - if(m_VKDevice != VK_NULL_HANDLE) - { - if(m_VertShaderModule != VK_NULL_HANDLE) - vkDestroyShaderModule(m_VKDevice, m_VertShaderModule, nullptr); - - if(m_FragShaderModule != VK_NULL_HANDLE) - vkDestroyShaderModule(m_VKDevice, m_FragShaderModule, nullptr); - } - } - }; - - enum EVulkanBackendAddressModes - { - VULKAN_BACKEND_ADDRESS_MODE_REPEAT = 0, - VULKAN_BACKEND_ADDRESS_MODE_CLAMP_EDGES, - - VULKAN_BACKEND_ADDRESS_MODE_COUNT, - }; - - enum EVulkanBackendBlendModes - { - VULKAN_BACKEND_BLEND_MODE_ALPHA = 0, - VULKAN_BACKEND_BLEND_MODE_NONE, - VULKAN_BACKEND_BLEND_MODE_ADDITATIVE, - - VULKAN_BACKEND_BLEND_MODE_COUNT, - }; - - enum EVulkanBackendClipModes - { - VULKAN_BACKEND_CLIP_MODE_NONE = 0, - VULKAN_BACKEND_CLIP_MODE_DYNAMIC_SCISSOR_AND_VIEWPORT, - - VULKAN_BACKEND_CLIP_MODE_COUNT, - }; - - enum EVulkanBackendTextureModes - { - VULKAN_BACKEND_TEXTURE_MODE_NOT_TEXTURED = 0, - VULKAN_BACKEND_TEXTURE_MODE_TEXTURED, - - VULKAN_BACKEND_TEXTURE_MODE_COUNT, - }; - - struct SPipelineContainer - { - // 3 blend modes - 2 viewport & scissor modes - 2 texture modes - std::array, VULKAN_BACKEND_CLIP_MODE_COUNT>, VULKAN_BACKEND_BLEND_MODE_COUNT> m_aaaPipelineLayouts; - std::array, VULKAN_BACKEND_CLIP_MODE_COUNT>, VULKAN_BACKEND_BLEND_MODE_COUNT> m_aaaPipelines; - - SPipelineContainer() - { - for(auto &aaPipeLayouts : m_aaaPipelineLayouts) - { - for(auto &aPipeLayouts : aaPipeLayouts) - { - for(auto &PipeLayout : aPipeLayouts) - { - PipeLayout = VK_NULL_HANDLE; - } - } - } - for(auto &aaPipe : m_aaaPipelines) - { - for(auto &aPipe : aaPipe) - { - for(auto &Pipe : aPipe) - { - Pipe = VK_NULL_HANDLE; - } - } - } - } - - void Destroy(VkDevice &Device) - { - for(auto &aaPipeLayouts : m_aaaPipelineLayouts) - { - for(auto &aPipeLayouts : aaPipeLayouts) - { - for(auto &PipeLayout : aPipeLayouts) - { - if(PipeLayout != VK_NULL_HANDLE) - vkDestroyPipelineLayout(Device, PipeLayout, nullptr); - PipeLayout = VK_NULL_HANDLE; - } - } - } - for(auto &aaPipe : m_aaaPipelines) - { - for(auto &aPipe : aaPipe) - { - for(auto &Pipe : aPipe) - { - if(Pipe != VK_NULL_HANDLE) - vkDestroyPipeline(Device, Pipe, nullptr); - Pipe = VK_NULL_HANDLE; - } - } - } - } - }; - - /******************************* - * UNIFORM PUSH CONSTANT LAYOUTS - ********************************/ - - struct SUniformGPos - { - float m_aPos[4 * 2]; - }; - - struct SUniformGTextPos - { - float m_aPos[4 * 2]; - float m_TextureSize; - }; - - typedef vec3 SUniformTextGFragmentOffset; - - struct SUniformTextGFragmentConstants - { - ColorRGBA m_TextColor; - ColorRGBA m_TextOutlineColor; - }; - - struct SUniformTextFragment - { - SUniformTextGFragmentConstants m_Constants; - }; - - struct SUniformTileGPos - { - float m_aPos[4 * 2]; - }; - - struct SUniformTileGPosBorder : public SUniformTileGPos - { - vec2 m_Offset; - vec2 m_Scale; - }; - - typedef ColorRGBA SUniformTileGVertColor; - - struct SUniformTileGVertColorAlign - { - float m_aPad[(64 - 48) / 4]; - }; - - struct SUniformPrimExGPosRotationless - { - float m_aPos[4 * 2]; - }; - - struct SUniformPrimExGPos : public SUniformPrimExGPosRotationless - { - vec2 m_Center; - float m_Rotation; - }; - - typedef ColorRGBA SUniformPrimExGVertColor; - - struct SUniformPrimExGVertColorAlign - { - float m_aPad[(48 - 44) / 4]; - }; - - struct SUniformSpriteMultiGPos - { - float m_aPos[4 * 2]; - vec2 m_Center; - }; - - typedef ColorRGBA SUniformSpriteMultiGVertColor; - - struct SUniformSpriteMultiGVertColorAlign - { - float m_aPad[(48 - 40) / 4]; - }; - - struct SUniformSpriteMultiPushGPosBase - { - float m_aPos[4 * 2]; - vec2 m_Center; - vec2 m_Padding; - }; - - struct SUniformSpriteMultiPushGPos : public SUniformSpriteMultiPushGPosBase - { - vec4 m_aPSR[1]; - }; - - typedef ColorRGBA SUniformSpriteMultiPushGVertColor; - - struct SUniformQuadGPosBase - { - float m_aPos[4 * 2]; - int32_t m_QuadOffset; - }; - - struct SUniformQuadPushGBufferObject - { - vec4 m_VertColor; - vec2 m_Offset; - float m_Rotation; - float m_Padding; - }; - - struct SUniformQuadPushGPos - { - float m_aPos[4 * 2]; - SUniformQuadPushGBufferObject m_BOPush; - int32_t m_QuadOffset; - }; - - struct SUniformQuadGPos - { - float m_aPos[4 * 2]; - int32_t m_QuadOffset; - }; - - enum ESupportedSamplerTypes - { - SUPPORTED_SAMPLER_TYPE_REPEAT = 0, - SUPPORTED_SAMPLER_TYPE_CLAMP_TO_EDGE, - SUPPORTED_SAMPLER_TYPE_2D_TEXTURE_ARRAY, - - SUPPORTED_SAMPLER_TYPE_COUNT, - }; - - struct SShaderFileCache - { - std::vector m_vBinary; - }; - - struct SSwapImgViewportExtent - { - VkExtent2D m_SwapImageViewport; - bool m_HasForcedViewport = false; - VkExtent2D m_ForcedViewport; - - // the viewport of the resulting presented image on the screen - // if there is a forced viewport the resulting image is smaller - // than the full swap image size - VkExtent2D GetPresentedImageViewport() const - { - uint32_t ViewportWidth = m_SwapImageViewport.width; - uint32_t ViewportHeight = m_SwapImageViewport.height; - if(m_HasForcedViewport) - { - ViewportWidth = m_ForcedViewport.width; - ViewportHeight = m_ForcedViewport.height; - } - - return {ViewportWidth, ViewportHeight}; - } - }; - - struct SSwapChainMultiSampleImage - { - VkImage m_Image = VK_NULL_HANDLE; - SMemoryImageBlock m_ImgMem; - VkImageView m_ImgView = VK_NULL_HANDLE; - }; - - /************************ - * MEMBER VARIABLES - ************************/ - - std::unordered_map m_ShaderFiles; - - SMemoryBlockCache m_StagingBufferCache; - SMemoryBlockCache m_StagingBufferCacheImage; - SMemoryBlockCache m_VertexBufferCache; - std::map> m_ImageBufferCaches; - - std::vector m_vNonFlushedStagingBufferRange; - - std::vector m_vTextures; - - std::atomic *m_pTextureMemoryUsage; - std::atomic *m_pBufferMemoryUsage; - std::atomic *m_pStreamMemoryUsage; - std::atomic *m_pStagingMemoryUsage; - - TTwGraphicsGpuList *m_pGpuList; - - int m_GlobalTextureLodBIAS; - uint32_t m_MultiSamplingCount = 1; - - uint32_t m_NextMultiSamplingCount = std::numeric_limits::max(); - - bool m_RecreateSwapChain = false; - bool m_SwapchainCreated = false; - bool m_RenderingPaused = false; - bool m_HasDynamicViewport = false; - VkOffset2D m_DynamicViewportOffset; - VkExtent2D m_DynamicViewportSize; - - bool m_AllowsLinearBlitting = false; - bool m_OptimalSwapChainImageBlitting = false; - bool m_OptimalRGBAImageBlitting = false; - bool m_LinearRGBAImageBlitting = false; - - VkBuffer m_IndexBuffer; - SDeviceMemoryBlock m_IndexBufferMemory; - - VkBuffer m_RenderIndexBuffer; - SDeviceMemoryBlock m_RenderIndexBufferMemory; - size_t m_CurRenderIndexPrimitiveCount; - - VkDeviceSize m_NonCoherentMemAlignment; - VkDeviceSize m_OptimalImageCopyMemAlignment; - uint32_t m_MaxTextureSize; - uint32_t m_MaxSamplerAnisotropy; - VkSampleCountFlags m_MaxMultiSample; - - uint32_t m_MinUniformAlign; - - std::vector m_vReadPixelHelper; - std::vector m_vScreenshotHelper; - - SDeviceMemoryBlock m_GetPresentedImgDataHelperMem; - VkImage m_GetPresentedImgDataHelperImage = VK_NULL_HANDLE; - uint8_t *m_pGetPresentedImgDataHelperMappedMemory = nullptr; - VkDeviceSize m_GetPresentedImgDataHelperMappedLayoutOffset = 0; - VkDeviceSize m_GetPresentedImgDataHelperMappedLayoutPitch = 0; - uint32_t m_GetPresentedImgDataHelperWidth = 0; - uint32_t m_GetPresentedImgDataHelperHeight = 0; - VkFence m_GetPresentedImgDataHelperFence = VK_NULL_HANDLE; - - std::array m_aSamplers; - - class IStorage *m_pStorage; - - struct SDelayedBufferCleanupItem - { - VkBuffer m_Buffer; - SDeviceMemoryBlock m_Mem; - void *m_pMappedData = nullptr; - }; - - std::vector> m_vvFrameDelayedBufferCleanup; - std::vector> m_vvFrameDelayedTextureCleanup; - std::vector>> m_vvFrameDelayedTextTexturesCleanup; - - size_t m_ThreadCount = 1; - static constexpr size_t MAIN_THREAD_INDEX = 0; - size_t m_CurCommandInPipe = 0; - size_t m_CurRenderCallCountInPipe = 0; - size_t m_CommandsInPipe = 0; - size_t m_RenderCallsInPipe = 0; - size_t m_LastCommandsInPipeThreadIndex = 0; - - struct SRenderThread - { - bool m_IsRendering = false; - std::thread m_Thread; - std::mutex m_Mutex; - std::condition_variable m_Cond; - bool m_Finished = false; - bool m_Started = false; - }; - std::vector> m_vpRenderThreads; - -private: - std::vector m_vSwapChainImageViewList; - std::vector m_vSwapChainMultiSamplingImages; - std::vector m_vFramebufferList; - std::vector m_vMainDrawCommandBuffers; - - std::vector> m_vvThreadDrawCommandBuffers; - std::vector m_vHelperThreadDrawCommandBuffers; - std::vector> m_vvUsedThreadDrawCommandBuffer; - - std::vector m_vMemoryCommandBuffers; - std::vector m_vUsedMemoryCommandBuffer; - - // swapped by use case - std::vector m_vWaitSemaphores; - std::vector m_vSigSemaphores; - - std::vector m_vFrameFences; - std::vector m_vImagesFences; - - uint64_t m_CurFrame = 0; - std::vector m_vImageLastFrameCheck; - - uint32_t m_LastPresentedSwapChainImageIndex; - - std::vector m_vBufferObjects; - - std::vector m_vBufferContainers; - - VkInstance m_VKInstance; - VkPhysicalDevice m_VKGPU; - uint32_t m_VKGraphicsQueueIndex = std::numeric_limits::max(); - VkDevice m_VKDevice; - VkQueue m_VKGraphicsQueue, m_VKPresentQueue; - VkSurfaceKHR m_VKPresentSurface; - SSwapImgViewportExtent m_VKSwapImgAndViewportExtent; - -#ifdef VK_EXT_debug_utils - VkDebugUtilsMessengerEXT m_DebugMessenger; -#endif - - VkDescriptorSetLayout m_StandardTexturedDescriptorSetLayout; - VkDescriptorSetLayout m_Standard3DTexturedDescriptorSetLayout; - - VkDescriptorSetLayout m_TextDescriptorSetLayout; - - VkDescriptorSetLayout m_SpriteMultiUniformDescriptorSetLayout; - VkDescriptorSetLayout m_QuadUniformDescriptorSetLayout; - - SPipelineContainer m_StandardPipeline; - SPipelineContainer m_StandardLinePipeline; - SPipelineContainer m_Standard3DPipeline; - SPipelineContainer m_TextPipeline; - SPipelineContainer m_TilePipeline; - SPipelineContainer m_TileBorderPipeline; - SPipelineContainer m_PrimExPipeline; - SPipelineContainer m_PrimExRotationlessPipeline; - SPipelineContainer m_SpriteMultiPipeline; - SPipelineContainer m_SpriteMultiPushPipeline; - SPipelineContainer m_QuadPipeline; - SPipelineContainer m_QuadPushPipeline; - - std::vector m_vLastPipeline; - - std::vector m_vCommandPools; - - VkRenderPass m_VKRenderPass; - - VkSurfaceFormatKHR m_VKSurfFormat; - - SDeviceDescriptorPools m_StandardTextureDescrPool; - SDeviceDescriptorPools m_TextTextureDescrPool; - - std::vector m_vUniformBufferDescrPools; - - VkSwapchainKHR m_VKSwapChain = VK_NULL_HANDLE; - std::vector m_vSwapChainImages; - uint32_t m_SwapChainImageCount = 0; - - std::vector> m_vStreamedVertexBuffers; - std::vector> m_vStreamedUniformBuffers; - - uint32_t m_CurFrameSyncObject = 0; - uint32_t m_CurImageIndex = 0; - - uint32_t m_CanvasWidth; - uint32_t m_CanvasHeight; - - SDL_Window *m_pWindow; - - std::array m_aClearColor = {0, 0, 0, 0}; - - struct SRenderCommandExecuteBuffer - { - CCommandBuffer::ECommandBufferCMD m_Command; - const CCommandBuffer::SCommand *m_pRawCommand; - uint32_t m_ThreadIndex; - - // must be calculated when the buffer gets filled - size_t m_EstimatedRenderCallCount = 0; - - // useful data - VkBuffer m_Buffer; - size_t m_BufferOff; - std::array m_aDescriptors; - - VkBuffer m_IndexBuffer; - - bool m_ClearColorInRenderThread = false; - - bool m_HasDynamicState = false; - VkViewport m_Viewport; - VkRect2D m_Scissor; - }; - - typedef std::vector TCommandList; - typedef std::vector TThreadCommandList; - - TThreadCommandList m_vvThreadCommandLists; - std::vector m_vThreadHelperHadCommands; - - typedef std::function TCommandBufferCommandCallback; - typedef std::function TCommandBufferFillExecuteBufferFunc; - - struct SCommandCallback - { - bool m_IsRenderCommand; - TCommandBufferFillExecuteBufferFunc m_FillExecuteBuffer; - TCommandBufferCommandCallback m_CommandCB; - // command should be considered handled after it executed - bool m_CMDIsHandled = true; - }; - std::array m_aCommandCallbacks; - -protected: - /************************ - * ERROR MANAGEMENT - ************************/ - std::mutex m_ErrWarnMutex; - std::string m_ErrorHelper; - - bool m_HasError = false; - bool m_CanAssert = false; - - /** - * After an error occurred, the rendering stop as soon as possible - * Always stop the current code execution after a call to this function (e.g. return false) - */ - void SetError(EGfxErrorType ErrType, const char *pErr, const char *pErrStrExtra = nullptr) - { - std::unique_lock Lock(m_ErrWarnMutex); - SGfxErrorContainer::SError Err = {false, pErr}; - if(std::find(m_Error.m_vErrors.begin(), m_Error.m_vErrors.end(), Err) == m_Error.m_vErrors.end()) - m_Error.m_vErrors.emplace_back(Err); - if(pErrStrExtra != nullptr) - { - SGfxErrorContainer::SError ErrExtra = {false, pErrStrExtra}; - if(std::find(m_Error.m_vErrors.begin(), m_Error.m_vErrors.end(), ErrExtra) == m_Error.m_vErrors.end()) - m_Error.m_vErrors.emplace_back(ErrExtra); - } - if(m_CanAssert) - { - if(pErrStrExtra != nullptr) - dbg_msg("vulkan", "vulkan error: %s: %s", pErr, pErrStrExtra); - else - dbg_msg("vulkan", "vulkan error: %s", pErr); - m_HasError = true; - m_Error.m_ErrorType = ErrType; - } - else - { - Lock.unlock(); - // during initialization vulkan should not throw any errors but warnings instead - // since most code in the swapchain is shared with runtime code, add this extra code path - SetWarning(EGfxWarningType::GFX_WARNING_TYPE_INIT_FAILED, pErr); - } - } - - void SetWarningPreMsg(const char *pWarningPre) - { - std::unique_lock Lock(m_ErrWarnMutex); - if(std::find(m_Warning.m_vWarnings.begin(), m_Warning.m_vWarnings.end(), pWarningPre) == m_Warning.m_vWarnings.end()) - m_Warning.m_vWarnings.emplace(m_Warning.m_vWarnings.begin(), pWarningPre); - } - - void SetWarning(EGfxWarningType WarningType, const char *pWarning) - { - std::unique_lock Lock(m_ErrWarnMutex); - dbg_msg("vulkan", "vulkan warning: %s", pWarning); - if(std::find(m_Warning.m_vWarnings.begin(), m_Warning.m_vWarnings.end(), pWarning) == m_Warning.m_vWarnings.end()) - m_Warning.m_vWarnings.emplace_back(pWarning); - m_Warning.m_WarningType = WarningType; - } - - const char *GetMemoryUsageShort() - { - m_ErrorHelper = std::string("Staging: ") + - std::to_string(m_pStagingMemoryUsage->load(std::memory_order_relaxed) / 1024) + - " KB, Buffer: " + - std::to_string(m_pBufferMemoryUsage->load(std::memory_order_relaxed) / 1024) + - " KB, Texture: " + - std::to_string(m_pTextureMemoryUsage->load(std::memory_order_relaxed) / 1024) + - " KB, Stream: " + - std::to_string(m_pStreamMemoryUsage->load(std::memory_order_relaxed) / 1024) + - " KB"; - return m_ErrorHelper.c_str(); - } - - const char *CheckVulkanCriticalError(VkResult CallResult) - { - const char *pCriticalError = nullptr; - switch(CallResult) - { - case VK_ERROR_OUT_OF_HOST_MEMORY: - pCriticalError = "host ran out of memory"; - dbg_msg("vulkan", "%s", pCriticalError); - break; - case VK_ERROR_OUT_OF_DEVICE_MEMORY: - pCriticalError = "device ran out of memory"; - dbg_msg("vulkan", "%s", pCriticalError); - break; - case VK_ERROR_DEVICE_LOST: - pCriticalError = "device lost"; - dbg_msg("vulkan", "%s", pCriticalError); - break; - case VK_ERROR_OUT_OF_DATE_KHR: - { - if(IsVerbose()) - { - dbg_msg("vulkan", "queueing swap chain recreation because the current is out of date"); - } - m_RecreateSwapChain = true; - break; - } - case VK_ERROR_SURFACE_LOST_KHR: - dbg_msg("vulkan", "surface lost"); - break; - /*case VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT: - dbg_msg("vulkan", "fullscreen exclusive mode lost"); - break;*/ - case VK_ERROR_INCOMPATIBLE_DRIVER: - pCriticalError = "no compatible driver found. Vulkan 1.1 is required."; - dbg_msg("vulkan", "%s", pCriticalError); - break; - case VK_ERROR_INITIALIZATION_FAILED: - pCriticalError = "initialization failed for unknown reason."; - dbg_msg("vulkan", "%s", pCriticalError); - break; - case VK_ERROR_LAYER_NOT_PRESENT: - SetWarning(EGfxWarningType::GFX_WARNING_MISSING_EXTENSION, "One Vulkan layer was not present. (try to disable them)"); - break; - case VK_ERROR_EXTENSION_NOT_PRESENT: - SetWarning(EGfxWarningType::GFX_WARNING_MISSING_EXTENSION, "One Vulkan extension was not present. (try to disable them)"); - break; - case VK_ERROR_NATIVE_WINDOW_IN_USE_KHR: - dbg_msg("vulkan", "native window in use"); - break; - case VK_SUCCESS: - break; - case VK_SUBOPTIMAL_KHR: - if(IsVerbose()) - { - dbg_msg("vulkan", "queueing swap chain recreation because the current is sub optimal"); - } - m_RecreateSwapChain = true; - break; - default: - m_ErrorHelper = "unknown error: "; - m_ErrorHelper.append(std::to_string(CallResult)); - pCriticalError = m_ErrorHelper.c_str(); - break; - } - - return pCriticalError; - } - - void ErroneousCleanup() override - { - CleanupVulkanSDL(); - } - - /************************ - * COMMAND CALLBACKS - ************************/ - - size_t CommandBufferCMDOff(CCommandBuffer::ECommandBufferCMD CommandBufferCMD) - { - return (size_t)CommandBufferCMD - CCommandBuffer::ECommandBufferCMD::CMD_FIRST; - } - - void RegisterCommands() - { - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_TEXTURE_CREATE)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_Texture_Create(static_cast(pBaseCommand)); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_TEXTURE_DESTROY)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_Texture_Destroy(static_cast(pBaseCommand)); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_TEXT_TEXTURES_CREATE)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_TextTextures_Create(static_cast(pBaseCommand)); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_TEXT_TEXTURES_DESTROY)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_TextTextures_Destroy(static_cast(pBaseCommand)); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_TEXT_TEXTURE_UPDATE)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_TextTexture_Update(static_cast(pBaseCommand)); }}; - - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_CLEAR)] = {true, [this](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) { Cmd_Clear_FillExecuteBuffer(ExecBuffer, static_cast(pBaseCommand)); }, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_Clear(ExecBuffer, static_cast(pBaseCommand)); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_RENDER)] = {true, [this](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) { Cmd_Render_FillExecuteBuffer(ExecBuffer, static_cast(pBaseCommand)); }, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_Render(static_cast(pBaseCommand), ExecBuffer); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_RENDER_TEX3D)] = {true, [this](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) { Cmd_RenderTex3D_FillExecuteBuffer(ExecBuffer, static_cast(pBaseCommand)); }, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_RenderTex3D(static_cast(pBaseCommand), ExecBuffer); }}; - - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_CREATE_BUFFER_OBJECT)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_CreateBufferObject(static_cast(pBaseCommand)); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_RECREATE_BUFFER_OBJECT)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_RecreateBufferObject(static_cast(pBaseCommand)); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_UPDATE_BUFFER_OBJECT)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_UpdateBufferObject(static_cast(pBaseCommand)); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_COPY_BUFFER_OBJECT)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_CopyBufferObject(static_cast(pBaseCommand)); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_DELETE_BUFFER_OBJECT)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_DeleteBufferObject(static_cast(pBaseCommand)); }}; - - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_CREATE_BUFFER_CONTAINER)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_CreateBufferContainer(static_cast(pBaseCommand)); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_DELETE_BUFFER_CONTAINER)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_DeleteBufferContainer(static_cast(pBaseCommand)); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_UPDATE_BUFFER_CONTAINER)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_UpdateBufferContainer(static_cast(pBaseCommand)); }}; - - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_INDICES_REQUIRED_NUM_NOTIFY)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_IndicesRequiredNumNotify(static_cast(pBaseCommand)); }}; - - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_RENDER_TILE_LAYER)] = {true, [this](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) { Cmd_RenderTileLayer_FillExecuteBuffer(ExecBuffer, static_cast(pBaseCommand)); }, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_RenderTileLayer(static_cast(pBaseCommand), ExecBuffer); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_RENDER_BORDER_TILE)] = {true, [this](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) { Cmd_RenderBorderTile_FillExecuteBuffer(ExecBuffer, static_cast(pBaseCommand)); }, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_RenderBorderTile(static_cast(pBaseCommand), ExecBuffer); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_RENDER_QUAD_LAYER)] = {true, [this](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) { Cmd_RenderQuadLayer_FillExecuteBuffer(ExecBuffer, static_cast(pBaseCommand)); }, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_RenderQuadLayer(static_cast(pBaseCommand), ExecBuffer); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_RENDER_TEXT)] = {true, [this](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) { Cmd_RenderText_FillExecuteBuffer(ExecBuffer, static_cast(pBaseCommand)); }, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_RenderText(static_cast(pBaseCommand), ExecBuffer); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_RENDER_QUAD_CONTAINER)] = {true, [this](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) { Cmd_RenderQuadContainer_FillExecuteBuffer(ExecBuffer, static_cast(pBaseCommand)); }, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_RenderQuadContainer(static_cast(pBaseCommand), ExecBuffer); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_RENDER_QUAD_CONTAINER_EX)] = {true, [this](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) { Cmd_RenderQuadContainerEx_FillExecuteBuffer(ExecBuffer, static_cast(pBaseCommand)); }, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_RenderQuadContainerEx(static_cast(pBaseCommand), ExecBuffer); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_RENDER_QUAD_CONTAINER_SPRITE_MULTIPLE)] = {true, [this](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) { Cmd_RenderQuadContainerAsSpriteMultiple_FillExecuteBuffer(ExecBuffer, static_cast(pBaseCommand)); }, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_RenderQuadContainerAsSpriteMultiple(static_cast(pBaseCommand), ExecBuffer); }}; - - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_SWAP)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_Swap(static_cast(pBaseCommand)); }}; - - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_VSYNC)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_VSync(static_cast(pBaseCommand)); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_MULTISAMPLING)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_MultiSampling(static_cast(pBaseCommand)); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_TRY_SWAP_AND_READ_PIXEL)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_ReadPixel(static_cast(pBaseCommand)); }}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_TRY_SWAP_AND_SCREENSHOT)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_Screenshot(static_cast(pBaseCommand)); }}; - - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_UPDATE_VIEWPORT)] = {false, [this](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) { Cmd_Update_Viewport_FillExecuteBuffer(ExecBuffer, static_cast(pBaseCommand)); }, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_Update_Viewport(static_cast(pBaseCommand)); }}; - - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_WINDOW_CREATE_NTF)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_WindowCreateNtf(static_cast(pBaseCommand)); }, false}; - m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_WINDOW_DESTROY_NTF)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_WindowDestroyNtf(static_cast(pBaseCommand)); }, false}; - - for(auto &Callback : m_aCommandCallbacks) - { - if(!(bool)Callback.m_CommandCB) - Callback = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return true; }}; - } - } - - /***************************** - * VIDEO AND SCREENSHOT HELPER - ******************************/ - - [[nodiscard]] bool PreparePresentedImageDataImage(uint8_t *&pResImageData, uint32_t Width, uint32_t Height) - { - bool NeedsNewImg = Width != m_GetPresentedImgDataHelperWidth || Height != m_GetPresentedImgDataHelperHeight; - if(m_GetPresentedImgDataHelperImage == VK_NULL_HANDLE || NeedsNewImg) - { - if(m_GetPresentedImgDataHelperImage != VK_NULL_HANDLE) - { - DeletePresentedImageDataImage(); - } - m_GetPresentedImgDataHelperWidth = Width; - m_GetPresentedImgDataHelperHeight = Height; - - VkImageCreateInfo ImageInfo{}; - ImageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; - ImageInfo.imageType = VK_IMAGE_TYPE_2D; - ImageInfo.extent.width = Width; - ImageInfo.extent.height = Height; - ImageInfo.extent.depth = 1; - ImageInfo.mipLevels = 1; - ImageInfo.arrayLayers = 1; - ImageInfo.format = VK_FORMAT_R8G8B8A8_UNORM; - ImageInfo.tiling = VK_IMAGE_TILING_LINEAR; - ImageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; - ImageInfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT; - ImageInfo.samples = VK_SAMPLE_COUNT_1_BIT; - ImageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - - vkCreateImage(m_VKDevice, &ImageInfo, nullptr, &m_GetPresentedImgDataHelperImage); - // Create memory to back up the image - VkMemoryRequirements MemRequirements; - vkGetImageMemoryRequirements(m_VKDevice, m_GetPresentedImgDataHelperImage, &MemRequirements); - - VkMemoryAllocateInfo MemAllocInfo{}; - MemAllocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; - MemAllocInfo.allocationSize = MemRequirements.size; - MemAllocInfo.memoryTypeIndex = FindMemoryType(m_VKGPU, MemRequirements.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT); - - vkAllocateMemory(m_VKDevice, &MemAllocInfo, nullptr, &m_GetPresentedImgDataHelperMem.m_Mem); - vkBindImageMemory(m_VKDevice, m_GetPresentedImgDataHelperImage, m_GetPresentedImgDataHelperMem.m_Mem, 0); - - if(!ImageBarrier(m_GetPresentedImgDataHelperImage, 0, 1, 0, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL)) - return false; - - VkImageSubresource SubResource{VK_IMAGE_ASPECT_COLOR_BIT, 0, 0}; - VkSubresourceLayout SubResourceLayout; - vkGetImageSubresourceLayout(m_VKDevice, m_GetPresentedImgDataHelperImage, &SubResource, &SubResourceLayout); - - vkMapMemory(m_VKDevice, m_GetPresentedImgDataHelperMem.m_Mem, 0, VK_WHOLE_SIZE, 0, (void **)&m_pGetPresentedImgDataHelperMappedMemory); - m_GetPresentedImgDataHelperMappedLayoutOffset = SubResourceLayout.offset; - m_GetPresentedImgDataHelperMappedLayoutPitch = SubResourceLayout.rowPitch; - m_pGetPresentedImgDataHelperMappedMemory += m_GetPresentedImgDataHelperMappedLayoutOffset; - - VkFenceCreateInfo FenceInfo{}; - FenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; - FenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT; - vkCreateFence(m_VKDevice, &FenceInfo, nullptr, &m_GetPresentedImgDataHelperFence); - } - pResImageData = m_pGetPresentedImgDataHelperMappedMemory; - return true; - } - - void DeletePresentedImageDataImage() - { - if(m_GetPresentedImgDataHelperImage != VK_NULL_HANDLE) - { - vkDestroyFence(m_VKDevice, m_GetPresentedImgDataHelperFence, nullptr); - - m_GetPresentedImgDataHelperFence = VK_NULL_HANDLE; - - vkDestroyImage(m_VKDevice, m_GetPresentedImgDataHelperImage, nullptr); - vkUnmapMemory(m_VKDevice, m_GetPresentedImgDataHelperMem.m_Mem); - vkFreeMemory(m_VKDevice, m_GetPresentedImgDataHelperMem.m_Mem, nullptr); - - m_GetPresentedImgDataHelperImage = VK_NULL_HANDLE; - m_GetPresentedImgDataHelperMem = {}; - m_pGetPresentedImgDataHelperMappedMemory = nullptr; - - m_GetPresentedImgDataHelperWidth = 0; - m_GetPresentedImgDataHelperHeight = 0; - } - } - - [[nodiscard]] bool GetPresentedImageDataImpl(uint32_t &Width, uint32_t &Height, CImageInfo::EImageFormat &Format, std::vector &vDstData, bool ResetAlpha, std::optional PixelOffset) - { - bool IsB8G8R8A8 = m_VKSurfFormat.format == VK_FORMAT_B8G8R8A8_UNORM; - bool UsesRGBALikeFormat = m_VKSurfFormat.format == VK_FORMAT_R8G8B8A8_UNORM || IsB8G8R8A8; - if(UsesRGBALikeFormat && m_LastPresentedSwapChainImageIndex != std::numeric_limits::max()) - { - auto Viewport = m_VKSwapImgAndViewportExtent.GetPresentedImageViewport(); - VkOffset3D SrcOffset; - if(PixelOffset.has_value()) - { - SrcOffset.x = PixelOffset.value().x; - SrcOffset.y = PixelOffset.value().y; - Width = 1; - Height = 1; - } - else - { - SrcOffset.x = 0; - SrcOffset.y = 0; - Width = Viewport.width; - Height = Viewport.height; - } - SrcOffset.z = 0; - Format = CImageInfo::FORMAT_RGBA; - - const size_t ImageTotalSize = (size_t)Width * Height * CImageInfo::PixelSize(Format); - - uint8_t *pResImageData; - if(!PreparePresentedImageDataImage(pResImageData, Width, Height)) - return false; - - VkCommandBuffer *pCommandBuffer; - if(!GetMemoryCommandBuffer(pCommandBuffer)) - return false; - VkCommandBuffer &CommandBuffer = *pCommandBuffer; - - auto &SwapImg = m_vSwapChainImages[m_LastPresentedSwapChainImageIndex]; - - if(!ImageBarrier(m_GetPresentedImgDataHelperImage, 0, 1, 0, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)) - return false; - if(!ImageBarrier(SwapImg, 0, 1, 0, 1, m_VKSurfFormat.format, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL)) - return false; - - // If source and destination support blit we'll blit as this also does automatic format conversion (e.g. from BGR to RGB) - if(m_OptimalSwapChainImageBlitting && m_LinearRGBAImageBlitting) - { - VkOffset3D BlitSize; - BlitSize.x = Width; - BlitSize.y = Height; - BlitSize.z = 1; - - VkImageBlit ImageBlitRegion{}; - ImageBlitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - ImageBlitRegion.srcSubresource.layerCount = 1; - ImageBlitRegion.srcOffsets[0] = SrcOffset; - ImageBlitRegion.srcOffsets[1] = {SrcOffset.x + BlitSize.x, SrcOffset.y + BlitSize.y, SrcOffset.z + BlitSize.z}; - ImageBlitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - ImageBlitRegion.dstSubresource.layerCount = 1; - ImageBlitRegion.dstOffsets[1] = BlitSize; - - // Issue the blit command - vkCmdBlitImage(CommandBuffer, SwapImg, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - m_GetPresentedImgDataHelperImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 1, &ImageBlitRegion, VK_FILTER_NEAREST); - - // transformed to RGBA - IsB8G8R8A8 = false; - } - else - { - // Otherwise use image copy (requires us to manually flip components) - VkImageCopy ImageCopyRegion{}; - ImageCopyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - ImageCopyRegion.srcSubresource.layerCount = 1; - ImageCopyRegion.srcOffset = SrcOffset; - ImageCopyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - ImageCopyRegion.dstSubresource.layerCount = 1; - ImageCopyRegion.extent.width = Width; - ImageCopyRegion.extent.height = Height; - ImageCopyRegion.extent.depth = 1; - - // Issue the copy command - vkCmdCopyImage(CommandBuffer, SwapImg, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - m_GetPresentedImgDataHelperImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 1, &ImageCopyRegion); - } - - if(!ImageBarrier(m_GetPresentedImgDataHelperImage, 0, 1, 0, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL)) - return false; - if(!ImageBarrier(SwapImg, 0, 1, 0, 1, m_VKSurfFormat.format, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)) - return false; - - vkEndCommandBuffer(CommandBuffer); - m_vUsedMemoryCommandBuffer[m_CurImageIndex] = false; - - VkSubmitInfo SubmitInfo{}; - SubmitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - SubmitInfo.commandBufferCount = 1; - SubmitInfo.pCommandBuffers = &CommandBuffer; - - vkResetFences(m_VKDevice, 1, &m_GetPresentedImgDataHelperFence); - vkQueueSubmit(m_VKGraphicsQueue, 1, &SubmitInfo, m_GetPresentedImgDataHelperFence); - vkWaitForFences(m_VKDevice, 1, &m_GetPresentedImgDataHelperFence, VK_TRUE, std::numeric_limits::max()); - - VkMappedMemoryRange MemRange{}; - MemRange.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; - MemRange.memory = m_GetPresentedImgDataHelperMem.m_Mem; - MemRange.offset = m_GetPresentedImgDataHelperMappedLayoutOffset; - MemRange.size = VK_WHOLE_SIZE; - vkInvalidateMappedMemoryRanges(m_VKDevice, 1, &MemRange); - - size_t RealFullImageSize = maximum(ImageTotalSize, (size_t)(Height * m_GetPresentedImgDataHelperMappedLayoutPitch)); - size_t ExtraRowSize = Width * 4; - if(vDstData.size() < RealFullImageSize + ExtraRowSize) - vDstData.resize(RealFullImageSize + ExtraRowSize); - - mem_copy(vDstData.data(), pResImageData, RealFullImageSize); - - // pack image data together without any offset that the driver might require - if(Width * 4 < m_GetPresentedImgDataHelperMappedLayoutPitch) - { - for(uint32_t Y = 0; Y < Height; ++Y) - { - size_t OffsetImagePacked = (Y * Width * 4); - size_t OffsetImageUnpacked = (Y * m_GetPresentedImgDataHelperMappedLayoutPitch); - mem_copy(vDstData.data() + RealFullImageSize, vDstData.data() + OffsetImageUnpacked, Width * 4); - mem_copy(vDstData.data() + OffsetImagePacked, vDstData.data() + RealFullImageSize, Width * 4); - } - } - - if(IsB8G8R8A8 || ResetAlpha) - { - // swizzle - for(uint32_t Y = 0; Y < Height; ++Y) - { - for(uint32_t X = 0; X < Width; ++X) - { - size_t ImgOff = (Y * Width * 4) + (X * 4); - if(IsB8G8R8A8) - { - std::swap(vDstData[ImgOff], vDstData[ImgOff + 2]); - } - vDstData[ImgOff + 3] = 255; - } - } - } - - return true; - } - else - { - if(!UsesRGBALikeFormat) - { - dbg_msg("vulkan", "swap chain image was not in a RGBA like format."); - } - else - { - dbg_msg("vulkan", "swap chain image was not ready to be copied."); - } - return false; - } - } - - [[nodiscard]] bool GetPresentedImageData(uint32_t &Width, uint32_t &Height, CImageInfo::EImageFormat &Format, std::vector &vDstData) override - { - return GetPresentedImageDataImpl(Width, Height, Format, vDstData, false, {}); - } - - /************************ - * MEMORY MANAGEMENT - ************************/ - - [[nodiscard]] bool AllocateVulkanMemory(const VkMemoryAllocateInfo *pAllocateInfo, VkDeviceMemory *pMemory) - { - VkResult Res = vkAllocateMemory(m_VKDevice, pAllocateInfo, nullptr, pMemory); - if(Res != VK_SUCCESS) - { - dbg_msg("vulkan", "vulkan memory allocation failed, trying to recover."); - if(Res == VK_ERROR_OUT_OF_HOST_MEMORY || Res == VK_ERROR_OUT_OF_DEVICE_MEMORY) - { - // aggressivly try to get more memory - vkDeviceWaitIdle(m_VKDevice); - for(size_t i = 0; i < m_SwapChainImageCount + 1; ++i) - { - if(!NextFrame()) - return false; - } - Res = vkAllocateMemory(m_VKDevice, pAllocateInfo, nullptr, pMemory); - } - if(Res != VK_SUCCESS) - { - dbg_msg("vulkan", "vulkan memory allocation failed."); - return false; - } - } - return true; - } - - [[nodiscard]] bool GetBufferImpl(VkDeviceSize RequiredSize, EMemoryBlockUsage MemUsage, VkBuffer &Buffer, SDeviceMemoryBlock &BufferMemory, VkBufferUsageFlags BufferUsage, VkMemoryPropertyFlags BufferProperties) - { - return CreateBuffer(RequiredSize, MemUsage, BufferUsage, BufferProperties, Buffer, BufferMemory); - } - - template - [[nodiscard]] bool GetBufferBlockImpl(SMemoryBlock &RetBlock, SMemoryBlockCache &MemoryCache, VkBufferUsageFlags BufferUsage, VkMemoryPropertyFlags BufferProperties, const void *pBufferData, VkDeviceSize RequiredSize, VkDeviceSize TargetAlignment) - { - bool Res = true; - - auto &&CreateCacheBlock = [&]() -> bool { - bool FoundAllocation = false; - SMemoryHeap::SMemoryHeapQueueElement AllocatedMem; - SDeviceMemoryBlock TmpBufferMemory; - typename SMemoryBlockCache::SMemoryCacheType::SMemoryCacheHeap *pCacheHeap = nullptr; - auto &Heaps = MemoryCache.m_MemoryCaches.m_vpMemoryHeaps; - for(size_t i = 0; i < Heaps.size(); ++i) - { - auto *pHeap = Heaps[i]; - if(pHeap->m_Heap.Allocate(RequiredSize, TargetAlignment, AllocatedMem)) - { - TmpBufferMemory = pHeap->m_BufferMem; - FoundAllocation = true; - pCacheHeap = pHeap; - break; - } - } - if(!FoundAllocation) - { - typename SMemoryBlockCache::SMemoryCacheType::SMemoryCacheHeap *pNewHeap = new typename SMemoryBlockCache::SMemoryCacheType::SMemoryCacheHeap(); - - VkBuffer TmpBuffer; - if(!GetBufferImpl(MemoryBlockSize * BlockCount, RequiresMapping ? MEMORY_BLOCK_USAGE_STAGING : MEMORY_BLOCK_USAGE_BUFFER, TmpBuffer, TmpBufferMemory, BufferUsage, BufferProperties)) - { - delete pNewHeap; - return false; - } - - void *pMapData = nullptr; - - if(RequiresMapping) - { - if(vkMapMemory(m_VKDevice, TmpBufferMemory.m_Mem, 0, VK_WHOLE_SIZE, 0, &pMapData) != VK_SUCCESS) - { - SetError(RequiresMapping ? EGfxErrorType::GFX_ERROR_TYPE_OUT_OF_MEMORY_STAGING : EGfxErrorType::GFX_ERROR_TYPE_OUT_OF_MEMORY_BUFFER, "Failed to map buffer block memory.", - GetMemoryUsageShort()); - delete pNewHeap; - return false; - } - } - - pNewHeap->m_Buffer = TmpBuffer; - - pNewHeap->m_BufferMem = TmpBufferMemory; - pNewHeap->m_pMappedBuffer = pMapData; - - pCacheHeap = pNewHeap; - Heaps.emplace_back(pNewHeap); - Heaps.back()->m_Heap.Init(MemoryBlockSize * BlockCount, 0); - if(!Heaps.back()->m_Heap.Allocate(RequiredSize, TargetAlignment, AllocatedMem)) - { - SetError(RequiresMapping ? EGfxErrorType::GFX_ERROR_TYPE_OUT_OF_MEMORY_STAGING : EGfxErrorType::GFX_ERROR_TYPE_OUT_OF_MEMORY_BUFFER, "Heap allocation failed directly after creating fresh heap.", - GetMemoryUsageShort()); - return false; - } - } - - RetBlock.m_Buffer = pCacheHeap->m_Buffer; - RetBlock.m_BufferMem = TmpBufferMemory; - if(RequiresMapping) - RetBlock.m_pMappedBuffer = ((uint8_t *)pCacheHeap->m_pMappedBuffer) + AllocatedMem.m_OffsetToAlign; - else - RetBlock.m_pMappedBuffer = nullptr; - RetBlock.m_IsCached = true; - RetBlock.m_pHeap = &pCacheHeap->m_Heap; - RetBlock.m_HeapData = AllocatedMem; - RetBlock.m_UsedSize = RequiredSize; - - if(RequiresMapping) - mem_copy(RetBlock.m_pMappedBuffer, pBufferData, RequiredSize); - - return true; - }; - - if(RequiredSize < (VkDeviceSize)MemoryBlockSize) - { - Res = CreateCacheBlock(); - } - else - { - VkBuffer TmpBuffer; - SDeviceMemoryBlock TmpBufferMemory; - if(!GetBufferImpl(RequiredSize, RequiresMapping ? MEMORY_BLOCK_USAGE_STAGING : MEMORY_BLOCK_USAGE_BUFFER, TmpBuffer, TmpBufferMemory, BufferUsage, BufferProperties)) - return false; - - void *pMapData = nullptr; - if(RequiresMapping) - { - vkMapMemory(m_VKDevice, TmpBufferMemory.m_Mem, 0, VK_WHOLE_SIZE, 0, &pMapData); - mem_copy(pMapData, pBufferData, static_cast(RequiredSize)); - } - - RetBlock.m_Buffer = TmpBuffer; - RetBlock.m_BufferMem = TmpBufferMemory; - RetBlock.m_pMappedBuffer = pMapData; - RetBlock.m_pHeap = nullptr; - RetBlock.m_IsCached = false; - RetBlock.m_HeapData.m_OffsetToAlign = 0; - RetBlock.m_HeapData.m_AllocationSize = RequiredSize; - RetBlock.m_UsedSize = RequiredSize; - } - - return Res; - } - - [[nodiscard]] bool GetStagingBuffer(SMemoryBlock &ResBlock, const void *pBufferData, VkDeviceSize RequiredSize) - { - return GetBufferBlockImpl(ResBlock, m_StagingBufferCache, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT, pBufferData, RequiredSize, maximum(m_NonCoherentMemAlignment, 16)); - } - - [[nodiscard]] bool GetStagingBufferImage(SMemoryBlock &ResBlock, const void *pBufferData, VkDeviceSize RequiredSize) - { - return GetBufferBlockImpl(ResBlock, m_StagingBufferCacheImage, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT, pBufferData, RequiredSize, maximum(m_OptimalImageCopyMemAlignment, maximum(m_NonCoherentMemAlignment, 16))); - } - - template - void PrepareStagingMemRange(SMemoryBlock &Block) - { - VkMappedMemoryRange UploadRange{}; - UploadRange.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; - UploadRange.memory = Block.m_BufferMem.m_Mem; - UploadRange.offset = Block.m_HeapData.m_OffsetToAlign; - - auto AlignmentMod = ((VkDeviceSize)Block.m_HeapData.m_AllocationSize % m_NonCoherentMemAlignment); - auto AlignmentReq = (m_NonCoherentMemAlignment - AlignmentMod); - if(AlignmentMod == 0) - AlignmentReq = 0; - UploadRange.size = Block.m_HeapData.m_AllocationSize + AlignmentReq; - - if(UploadRange.offset + UploadRange.size > Block.m_BufferMem.m_Size) - UploadRange.size = VK_WHOLE_SIZE; - - m_vNonFlushedStagingBufferRange.push_back(UploadRange); - } - - void UploadAndFreeStagingMemBlock(SMemoryBlock &Block) - { - PrepareStagingMemRange(Block); - if(!Block.m_IsCached) - { - m_vvFrameDelayedBufferCleanup[m_CurImageIndex].push_back({Block.m_Buffer, Block.m_BufferMem, Block.m_pMappedBuffer}); - } - else - { - m_StagingBufferCache.FreeMemBlock(Block, m_CurImageIndex); - } - } - - void UploadAndFreeStagingImageMemBlock(SMemoryBlock &Block) - { - PrepareStagingMemRange(Block); - if(!Block.m_IsCached) - { - m_vvFrameDelayedBufferCleanup[m_CurImageIndex].push_back({Block.m_Buffer, Block.m_BufferMem, Block.m_pMappedBuffer}); - } - else - { - m_StagingBufferCacheImage.FreeMemBlock(Block, m_CurImageIndex); - } - } - - [[nodiscard]] bool GetVertexBuffer(SMemoryBlock &ResBlock, VkDeviceSize RequiredSize) - { - return GetBufferBlockImpl(ResBlock, m_VertexBufferCache, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, nullptr, RequiredSize, 16); - } - - void FreeVertexMemBlock(SMemoryBlock &Block) - { - if(!Block.m_IsCached) - { - m_vvFrameDelayedBufferCleanup[m_CurImageIndex].push_back({Block.m_Buffer, Block.m_BufferMem, nullptr}); - } - else - { - m_VertexBufferCache.FreeMemBlock(Block, m_CurImageIndex); - } - } - - static size_t ImageMipLevelCount(size_t Width, size_t Height, size_t Depth) - { - return std::floor(std::log2(maximum(Width, maximum(Height, Depth)))) + 1; - } - - static size_t ImageMipLevelCount(const VkExtent3D &ImgExtent) - { - return ImageMipLevelCount(ImgExtent.width, ImgExtent.height, ImgExtent.depth); - } - - // good approximation of 1024x1024 image with mipmaps - static constexpr int64_t s_1024x1024ImgSize = (1024 * 1024 * 4) * 2; - - [[nodiscard]] bool GetImageMemoryImpl(VkDeviceSize RequiredSize, uint32_t RequiredMemoryTypeBits, SDeviceMemoryBlock &BufferMemory, VkMemoryPropertyFlags BufferProperties) - { - VkMemoryAllocateInfo MemAllocInfo{}; - MemAllocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; - MemAllocInfo.allocationSize = RequiredSize; - MemAllocInfo.memoryTypeIndex = FindMemoryType(m_VKGPU, RequiredMemoryTypeBits, BufferProperties); - - BufferMemory.m_Size = RequiredSize; - m_pTextureMemoryUsage->store(m_pTextureMemoryUsage->load(std::memory_order_relaxed) + RequiredSize, std::memory_order_relaxed); - - if(IsVerbose()) - { - VerboseAllocatedMemory(RequiredSize, m_CurImageIndex, MEMORY_BLOCK_USAGE_TEXTURE); - } - - if(!AllocateVulkanMemory(&MemAllocInfo, &BufferMemory.m_Mem)) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_OUT_OF_MEMORY_IMAGE, "Allocation for image memory failed.", - GetMemoryUsageShort()); - return false; - } - - BufferMemory.m_UsageType = MEMORY_BLOCK_USAGE_TEXTURE; - - return true; - } - - template - [[nodiscard]] bool GetImageMemoryBlockImpl(SMemoryImageBlock &RetBlock, SMemoryBlockCache &MemoryCache, VkMemoryPropertyFlags BufferProperties, VkDeviceSize RequiredSize, VkDeviceSize RequiredAlignment, uint32_t RequiredMemoryTypeBits) - { - auto &&CreateCacheBlock = [&]() -> bool { - bool FoundAllocation = false; - SMemoryHeap::SMemoryHeapQueueElement AllocatedMem; - SDeviceMemoryBlock TmpBufferMemory; - typename SMemoryBlockCache::SMemoryCacheType::SMemoryCacheHeap *pCacheHeap = nullptr; - for(size_t i = 0; i < MemoryCache.m_MemoryCaches.m_vpMemoryHeaps.size(); ++i) - { - auto *pHeap = MemoryCache.m_MemoryCaches.m_vpMemoryHeaps[i]; - if(pHeap->m_Heap.Allocate(RequiredSize, RequiredAlignment, AllocatedMem)) - { - TmpBufferMemory = pHeap->m_BufferMem; - FoundAllocation = true; - pCacheHeap = pHeap; - break; - } - } - if(!FoundAllocation) - { - typename SMemoryBlockCache::SMemoryCacheType::SMemoryCacheHeap *pNewHeap = new typename SMemoryBlockCache::SMemoryCacheType::SMemoryCacheHeap(); - - if(!GetImageMemoryImpl(MemoryBlockSize * BlockCount, RequiredMemoryTypeBits, TmpBufferMemory, BufferProperties)) - { - delete pNewHeap; - return false; - } - - pNewHeap->m_Buffer = VK_NULL_HANDLE; - - pNewHeap->m_BufferMem = TmpBufferMemory; - pNewHeap->m_pMappedBuffer = nullptr; - - auto &Heaps = MemoryCache.m_MemoryCaches.m_vpMemoryHeaps; - pCacheHeap = pNewHeap; - Heaps.emplace_back(pNewHeap); - Heaps.back()->m_Heap.Init(MemoryBlockSize * BlockCount, 0); - if(!Heaps.back()->m_Heap.Allocate(RequiredSize, RequiredAlignment, AllocatedMem)) - { - dbg_assert(false, "Heap allocation failed directly after creating fresh heap for image"); - } - } - - RetBlock.m_Buffer = VK_NULL_HANDLE; - RetBlock.m_BufferMem = TmpBufferMemory; - RetBlock.m_pMappedBuffer = nullptr; - RetBlock.m_IsCached = true; - RetBlock.m_pHeap = &pCacheHeap->m_Heap; - RetBlock.m_HeapData = AllocatedMem; - RetBlock.m_UsedSize = RequiredSize; - - return true; - }; - - if(RequiredSize < (VkDeviceSize)MemoryBlockSize) - { - if(!CreateCacheBlock()) - return false; - } - else - { - SDeviceMemoryBlock TmpBufferMemory; - if(!GetImageMemoryImpl(RequiredSize, RequiredMemoryTypeBits, TmpBufferMemory, BufferProperties)) - return false; - - RetBlock.m_Buffer = VK_NULL_HANDLE; - RetBlock.m_BufferMem = TmpBufferMemory; - RetBlock.m_pMappedBuffer = nullptr; - RetBlock.m_IsCached = false; - RetBlock.m_pHeap = nullptr; - RetBlock.m_HeapData.m_OffsetToAlign = 0; - RetBlock.m_HeapData.m_AllocationSize = RequiredSize; - RetBlock.m_UsedSize = RequiredSize; - } - - RetBlock.m_ImageMemoryBits = RequiredMemoryTypeBits; - - return true; - } - - [[nodiscard]] bool GetImageMemory(SMemoryImageBlock &RetBlock, VkDeviceSize RequiredSize, VkDeviceSize RequiredAlignment, uint32_t RequiredMemoryTypeBits) - { - auto it = m_ImageBufferCaches.find(RequiredMemoryTypeBits); - if(it == m_ImageBufferCaches.end()) - { - it = m_ImageBufferCaches.insert({RequiredMemoryTypeBits, {}}).first; - - it->second.Init(m_SwapChainImageCount); - } - return GetImageMemoryBlockImpl(RetBlock, it->second, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, RequiredSize, RequiredAlignment, RequiredMemoryTypeBits); - } - - void FreeImageMemBlock(SMemoryImageBlock &Block) - { - if(!Block.m_IsCached) - { - m_vvFrameDelayedBufferCleanup[m_CurImageIndex].push_back({Block.m_Buffer, Block.m_BufferMem, nullptr}); - } - else - { - m_ImageBufferCaches[Block.m_ImageMemoryBits].FreeMemBlock(Block, m_CurImageIndex); - } - } - - template - void UploadStreamedBuffer(SStreamMemory &StreamedBuffer) - { - size_t RangeUpdateCount = 0; - if(StreamedBuffer.IsUsed(m_CurImageIndex)) - { - for(size_t i = 0; i < StreamedBuffer.GetUsedCount(m_CurImageIndex); ++i) - { - auto &BufferOfFrame = StreamedBuffer.GetBuffers(m_CurImageIndex)[i]; - auto &MemRange = StreamedBuffer.GetRanges(m_CurImageIndex)[RangeUpdateCount++]; - MemRange.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; - MemRange.memory = BufferOfFrame.m_BufferMem.m_Mem; - MemRange.offset = BufferOfFrame.m_OffsetInBuffer; - auto AlignmentMod = ((VkDeviceSize)BufferOfFrame.m_UsedSize % m_NonCoherentMemAlignment); - auto AlignmentReq = (m_NonCoherentMemAlignment - AlignmentMod); - if(AlignmentMod == 0) - AlignmentReq = 0; - MemRange.size = BufferOfFrame.m_UsedSize + AlignmentReq; - - if(MemRange.offset + MemRange.size > BufferOfFrame.m_BufferMem.m_Size) - MemRange.size = VK_WHOLE_SIZE; - - BufferOfFrame.m_UsedSize = 0; - } - if(RangeUpdateCount > 0 && FlushForRendering) - { - vkFlushMappedMemoryRanges(m_VKDevice, RangeUpdateCount, StreamedBuffer.GetRanges(m_CurImageIndex).data()); - } - } - StreamedBuffer.ResetFrame(m_CurImageIndex); - } - - void CleanBufferPair(size_t ImageIndex, VkBuffer &Buffer, SDeviceMemoryBlock &BufferMem) - { - bool IsBuffer = Buffer != VK_NULL_HANDLE; - if(IsBuffer) - { - vkDestroyBuffer(m_VKDevice, Buffer, nullptr); - - Buffer = VK_NULL_HANDLE; - } - if(BufferMem.m_Mem != VK_NULL_HANDLE) - { - vkFreeMemory(m_VKDevice, BufferMem.m_Mem, nullptr); - if(BufferMem.m_UsageType == MEMORY_BLOCK_USAGE_BUFFER) - m_pBufferMemoryUsage->store(m_pBufferMemoryUsage->load(std::memory_order_relaxed) - BufferMem.m_Size, std::memory_order_relaxed); - else if(BufferMem.m_UsageType == MEMORY_BLOCK_USAGE_TEXTURE) - m_pTextureMemoryUsage->store(m_pTextureMemoryUsage->load(std::memory_order_relaxed) - BufferMem.m_Size, std::memory_order_relaxed); - else if(BufferMem.m_UsageType == MEMORY_BLOCK_USAGE_STREAM) - m_pStreamMemoryUsage->store(m_pStreamMemoryUsage->load(std::memory_order_relaxed) - BufferMem.m_Size, std::memory_order_relaxed); - else if(BufferMem.m_UsageType == MEMORY_BLOCK_USAGE_STAGING) - m_pStagingMemoryUsage->store(m_pStagingMemoryUsage->load(std::memory_order_relaxed) - BufferMem.m_Size, std::memory_order_relaxed); - - if(IsVerbose()) - { - VerboseDeallocatedMemory(BufferMem.m_Size, ImageIndex, BufferMem.m_UsageType); - } - - BufferMem.m_Mem = VK_NULL_HANDLE; - } - } - - void DestroyTexture(CTexture &Texture) - { - if(Texture.m_Img != VK_NULL_HANDLE) - { - FreeImageMemBlock(Texture.m_ImgMem); - vkDestroyImage(m_VKDevice, Texture.m_Img, nullptr); - - vkDestroyImageView(m_VKDevice, Texture.m_ImgView, nullptr); - } - - if(Texture.m_Img3D != VK_NULL_HANDLE) - { - FreeImageMemBlock(Texture.m_Img3DMem); - vkDestroyImage(m_VKDevice, Texture.m_Img3D, nullptr); - - vkDestroyImageView(m_VKDevice, Texture.m_Img3DView, nullptr); - } - - DestroyTexturedStandardDescriptorSets(Texture, 0); - DestroyTexturedStandardDescriptorSets(Texture, 1); - - DestroyTextured3DStandardDescriptorSets(Texture); - } - - void DestroyTextTexture(CTexture &Texture, CTexture &TextureOutline) - { - if(Texture.m_Img != VK_NULL_HANDLE) - { - FreeImageMemBlock(Texture.m_ImgMem); - vkDestroyImage(m_VKDevice, Texture.m_Img, nullptr); - - vkDestroyImageView(m_VKDevice, Texture.m_ImgView, nullptr); - } - - if(TextureOutline.m_Img != VK_NULL_HANDLE) - { - FreeImageMemBlock(TextureOutline.m_ImgMem); - vkDestroyImage(m_VKDevice, TextureOutline.m_Img, nullptr); - - vkDestroyImageView(m_VKDevice, TextureOutline.m_ImgView, nullptr); - } - - DestroyTextDescriptorSets(Texture, TextureOutline); - } - - void ClearFrameData(size_t FrameImageIndex) - { - UploadStagingBuffers(); - - // clear pending buffers, that require deletion - for(auto &BufferPair : m_vvFrameDelayedBufferCleanup[FrameImageIndex]) - { - if(BufferPair.m_pMappedData != nullptr) - { - vkUnmapMemory(m_VKDevice, BufferPair.m_Mem.m_Mem); - } - CleanBufferPair(FrameImageIndex, BufferPair.m_Buffer, BufferPair.m_Mem); - } - m_vvFrameDelayedBufferCleanup[FrameImageIndex].clear(); - - // clear pending textures, that require deletion - for(auto &Texture : m_vvFrameDelayedTextureCleanup[FrameImageIndex]) - { - DestroyTexture(Texture); - } - m_vvFrameDelayedTextureCleanup[FrameImageIndex].clear(); - - for(auto &TexturePair : m_vvFrameDelayedTextTexturesCleanup[FrameImageIndex]) - { - DestroyTextTexture(TexturePair.first, TexturePair.second); - } - m_vvFrameDelayedTextTexturesCleanup[FrameImageIndex].clear(); - - m_StagingBufferCache.Cleanup(FrameImageIndex); - m_StagingBufferCacheImage.Cleanup(FrameImageIndex); - m_VertexBufferCache.Cleanup(FrameImageIndex); - for(auto &ImageBufferCache : m_ImageBufferCaches) - ImageBufferCache.second.Cleanup(FrameImageIndex); - } - - void ShrinkUnusedCaches() - { - size_t FreeedMemory = 0; - FreeedMemory += m_StagingBufferCache.Shrink(m_VKDevice); - FreeedMemory += m_StagingBufferCacheImage.Shrink(m_VKDevice); - if(FreeedMemory > 0) - { - m_pStagingMemoryUsage->store(m_pStagingMemoryUsage->load(std::memory_order_relaxed) - FreeedMemory, std::memory_order_relaxed); - if(IsVerbose()) - { - dbg_msg("vulkan", "deallocated chunks of memory with size: %" PRIzu " from all frames (staging buffer)", FreeedMemory); - } - } - FreeedMemory = 0; - FreeedMemory += m_VertexBufferCache.Shrink(m_VKDevice); - if(FreeedMemory > 0) - { - m_pBufferMemoryUsage->store(m_pBufferMemoryUsage->load(std::memory_order_relaxed) - FreeedMemory, std::memory_order_relaxed); - if(IsVerbose()) - { - dbg_msg("vulkan", "deallocated chunks of memory with size: %" PRIzu " from all frames (buffer)", FreeedMemory); - } - } - FreeedMemory = 0; - for(auto &ImageBufferCache : m_ImageBufferCaches) - FreeedMemory += ImageBufferCache.second.Shrink(m_VKDevice); - if(FreeedMemory > 0) - { - m_pTextureMemoryUsage->store(m_pTextureMemoryUsage->load(std::memory_order_relaxed) - FreeedMemory, std::memory_order_relaxed); - if(IsVerbose()) - { - dbg_msg("vulkan", "deallocated chunks of memory with size: %" PRIzu " from all frames (texture)", FreeedMemory); - } - } - } - - [[nodiscard]] bool MemoryBarrier(VkBuffer Buffer, VkDeviceSize Offset, VkDeviceSize Size, VkAccessFlags BufferAccessType, bool BeforeCommand) - { - VkCommandBuffer *pMemCommandBuffer; - if(!GetMemoryCommandBuffer(pMemCommandBuffer)) - return false; - auto &MemCommandBuffer = *pMemCommandBuffer; - - VkBufferMemoryBarrier Barrier{}; - Barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER; - Barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - Barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - Barrier.buffer = Buffer; - Barrier.offset = Offset; - Barrier.size = Size; - - VkPipelineStageFlags SourceStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; - VkPipelineStageFlags DestinationStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - - if(BeforeCommand) - { - Barrier.srcAccessMask = BufferAccessType; - Barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - - SourceStage = VK_PIPELINE_STAGE_VERTEX_INPUT_BIT; - DestinationStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - } - else - { - Barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - Barrier.dstAccessMask = BufferAccessType; - - SourceStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - DestinationStage = VK_PIPELINE_STAGE_VERTEX_INPUT_BIT; - } - - vkCmdPipelineBarrier( - MemCommandBuffer, - SourceStage, DestinationStage, - 0, - 0, nullptr, - 1, &Barrier, - 0, nullptr); - - return true; - } - - /************************ - * SWAPPING MECHANISM - ************************/ - - void StartRenderThread(size_t ThreadIndex) - { - auto &List = m_vvThreadCommandLists[ThreadIndex]; - if(!List.empty()) - { - m_vThreadHelperHadCommands[ThreadIndex] = true; - auto *pThread = m_vpRenderThreads[ThreadIndex].get(); - std::unique_lock Lock(pThread->m_Mutex); - pThread->m_IsRendering = true; - pThread->m_Cond.notify_one(); - } - } - - void FinishRenderThreads() - { - if(m_ThreadCount > 1) - { - // execute threads - - for(size_t ThreadIndex = 0; ThreadIndex < m_ThreadCount - 1; ++ThreadIndex) - { - if(!m_vThreadHelperHadCommands[ThreadIndex]) - { - StartRenderThread(ThreadIndex); - } - } - - for(size_t ThreadIndex = 0; ThreadIndex < m_ThreadCount - 1; ++ThreadIndex) - { - if(m_vThreadHelperHadCommands[ThreadIndex]) - { - auto &pRenderThread = m_vpRenderThreads[ThreadIndex]; - m_vThreadHelperHadCommands[ThreadIndex] = false; - std::unique_lock Lock(pRenderThread->m_Mutex); - pRenderThread->m_Cond.wait(Lock, [&pRenderThread] { return !pRenderThread->m_IsRendering; }); - m_vLastPipeline[ThreadIndex + 1] = VK_NULL_HANDLE; - } - } - } - } - - void ExecuteMemoryCommandBuffer() - { - if(m_vUsedMemoryCommandBuffer[m_CurImageIndex]) - { - auto &MemoryCommandBuffer = m_vMemoryCommandBuffers[m_CurImageIndex]; - vkEndCommandBuffer(MemoryCommandBuffer); - - VkSubmitInfo SubmitInfo{}; - SubmitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - - SubmitInfo.commandBufferCount = 1; - SubmitInfo.pCommandBuffers = &MemoryCommandBuffer; - vkQueueSubmit(m_VKGraphicsQueue, 1, &SubmitInfo, VK_NULL_HANDLE); - vkQueueWaitIdle(m_VKGraphicsQueue); - - m_vUsedMemoryCommandBuffer[m_CurImageIndex] = false; - } - } - - void ClearFrameMemoryUsage() - { - ClearFrameData(m_CurImageIndex); - ShrinkUnusedCaches(); - } - - [[nodiscard]] bool WaitFrame() - { - FinishRenderThreads(); - m_LastCommandsInPipeThreadIndex = 0; - - UploadNonFlushedBuffers(); - - auto &CommandBuffer = GetMainGraphicCommandBuffer(); - - // render threads - if(m_ThreadCount > 1) - { - size_t ThreadedCommandsUsedCount = 0; - size_t RenderThreadCount = m_ThreadCount - 1; - for(size_t i = 0; i < RenderThreadCount; ++i) - { - if(m_vvUsedThreadDrawCommandBuffer[i + 1][m_CurImageIndex]) - { - const auto &GraphicThreadCommandBuffer = m_vvThreadDrawCommandBuffers[i + 1][m_CurImageIndex]; - m_vHelperThreadDrawCommandBuffers[ThreadedCommandsUsedCount++] = GraphicThreadCommandBuffer; - - m_vvUsedThreadDrawCommandBuffer[i + 1][m_CurImageIndex] = false; - } - } - if(ThreadedCommandsUsedCount > 0) - { - vkCmdExecuteCommands(CommandBuffer, ThreadedCommandsUsedCount, m_vHelperThreadDrawCommandBuffers.data()); - } - - // special case if swap chain was not completed in one runbuffer call - - if(m_vvUsedThreadDrawCommandBuffer[0][m_CurImageIndex]) - { - auto &GraphicThreadCommandBuffer = m_vvThreadDrawCommandBuffers[0][m_CurImageIndex]; - vkEndCommandBuffer(GraphicThreadCommandBuffer); - - vkCmdExecuteCommands(CommandBuffer, 1, &GraphicThreadCommandBuffer); - - m_vvUsedThreadDrawCommandBuffer[0][m_CurImageIndex] = false; - } - } - - vkCmdEndRenderPass(CommandBuffer); - - if(vkEndCommandBuffer(CommandBuffer) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_RENDER_RECORDING, "Command buffer cannot be ended anymore."); - return false; - } - - VkSemaphore WaitSemaphore = m_vWaitSemaphores[m_CurFrameSyncObject]; - - VkSubmitInfo SubmitInfo{}; - SubmitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - - SubmitInfo.commandBufferCount = 1; - SubmitInfo.pCommandBuffers = &CommandBuffer; - - std::array aCommandBuffers = {}; - - if(m_vUsedMemoryCommandBuffer[m_CurImageIndex]) - { - auto &MemoryCommandBuffer = m_vMemoryCommandBuffers[m_CurImageIndex]; - vkEndCommandBuffer(MemoryCommandBuffer); - - aCommandBuffers[0] = MemoryCommandBuffer; - aCommandBuffers[1] = CommandBuffer; - SubmitInfo.commandBufferCount = 2; - SubmitInfo.pCommandBuffers = aCommandBuffers.data(); - - m_vUsedMemoryCommandBuffer[m_CurImageIndex] = false; - } - - std::array aWaitSemaphores = {WaitSemaphore}; - std::array aWaitStages = {(VkPipelineStageFlags)VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT}; - SubmitInfo.waitSemaphoreCount = aWaitSemaphores.size(); - SubmitInfo.pWaitSemaphores = aWaitSemaphores.data(); - SubmitInfo.pWaitDstStageMask = aWaitStages.data(); - - std::array aSignalSemaphores = {m_vSigSemaphores[m_CurFrameSyncObject]}; - SubmitInfo.signalSemaphoreCount = aSignalSemaphores.size(); - SubmitInfo.pSignalSemaphores = aSignalSemaphores.data(); - - vkResetFences(m_VKDevice, 1, &m_vFrameFences[m_CurFrameSyncObject]); - - VkResult QueueSubmitRes = vkQueueSubmit(m_VKGraphicsQueue, 1, &SubmitInfo, m_vFrameFences[m_CurFrameSyncObject]); - if(QueueSubmitRes != VK_SUCCESS) - { - const char *pCritErrorMsg = CheckVulkanCriticalError(QueueSubmitRes); - if(pCritErrorMsg != nullptr) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_RENDER_SUBMIT_FAILED, "Submitting to graphics queue failed.", pCritErrorMsg); - return false; - } - } - - std::swap(m_vWaitSemaphores[m_CurFrameSyncObject], m_vSigSemaphores[m_CurFrameSyncObject]); - - VkPresentInfoKHR PresentInfo{}; - PresentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; - - PresentInfo.waitSemaphoreCount = aSignalSemaphores.size(); - PresentInfo.pWaitSemaphores = aSignalSemaphores.data(); - - std::array aSwapChains = {m_VKSwapChain}; - PresentInfo.swapchainCount = aSwapChains.size(); - PresentInfo.pSwapchains = aSwapChains.data(); - - PresentInfo.pImageIndices = &m_CurImageIndex; - - m_LastPresentedSwapChainImageIndex = m_CurImageIndex; - - VkResult QueuePresentRes = vkQueuePresentKHR(m_VKPresentQueue, &PresentInfo); - if(QueuePresentRes != VK_SUCCESS && QueuePresentRes != VK_SUBOPTIMAL_KHR) - { - const char *pCritErrorMsg = CheckVulkanCriticalError(QueuePresentRes); - if(pCritErrorMsg != nullptr) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_SWAP_FAILED, "Presenting graphics queue failed.", pCritErrorMsg); - return false; - } - } - - m_CurFrameSyncObject = (m_CurFrameSyncObject + 1) % m_vWaitSemaphores.size(); - return true; - } - - [[nodiscard]] bool PrepareFrame() - { - if(m_RecreateSwapChain) - { - m_RecreateSwapChain = false; - if(IsVerbose()) - { - dbg_msg("vulkan", "recreating swap chain requested by user (prepare frame)."); - } - RecreateSwapChain(); - } - - auto AcqResult = vkAcquireNextImageKHR(m_VKDevice, m_VKSwapChain, std::numeric_limits::max(), m_vSigSemaphores[m_CurFrameSyncObject], VK_NULL_HANDLE, &m_CurImageIndex); - if(AcqResult != VK_SUCCESS) - { - if(AcqResult == VK_ERROR_OUT_OF_DATE_KHR || m_RecreateSwapChain) - { - m_RecreateSwapChain = false; - if(IsVerbose()) - { - dbg_msg("vulkan", "recreating swap chain requested by acquire next image (prepare frame)."); - } - RecreateSwapChain(); - return PrepareFrame(); - } - else - { - if(AcqResult != VK_SUBOPTIMAL_KHR) - dbg_msg("vulkan", "acquire next image failed %d", (int)AcqResult); - - const char *pCritErrorMsg = CheckVulkanCriticalError(AcqResult); - if(pCritErrorMsg != nullptr) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_SWAP_FAILED, "Acquiring next image failed.", pCritErrorMsg); - return false; - } - else if(AcqResult == VK_ERROR_SURFACE_LOST_KHR) - { - m_RenderingPaused = true; - return true; - } - } - } - std::swap(m_vWaitSemaphores[m_CurFrameSyncObject], m_vSigSemaphores[m_CurFrameSyncObject]); - - if(m_vImagesFences[m_CurImageIndex] != VK_NULL_HANDLE) - { - vkWaitForFences(m_VKDevice, 1, &m_vImagesFences[m_CurImageIndex], VK_TRUE, std::numeric_limits::max()); - } - m_vImagesFences[m_CurImageIndex] = m_vFrameFences[m_CurFrameSyncObject]; - - // next frame - m_CurFrame++; - m_vImageLastFrameCheck[m_CurImageIndex] = m_CurFrame; - - // check if older frames weren't used in a long time - for(size_t FrameImageIndex = 0; FrameImageIndex < m_vImageLastFrameCheck.size(); ++FrameImageIndex) - { - auto LastFrame = m_vImageLastFrameCheck[FrameImageIndex]; - if(m_CurFrame - LastFrame > (uint64_t)m_SwapChainImageCount) - { - if(m_vImagesFences[FrameImageIndex] != VK_NULL_HANDLE) - { - vkWaitForFences(m_VKDevice, 1, &m_vImagesFences[FrameImageIndex], VK_TRUE, std::numeric_limits::max()); - ClearFrameData(FrameImageIndex); - m_vImagesFences[FrameImageIndex] = VK_NULL_HANDLE; - } - m_vImageLastFrameCheck[FrameImageIndex] = m_CurFrame; - } - } - - // clear frame's memory data - ClearFrameMemoryUsage(); - - // clear frame - vkResetCommandBuffer(GetMainGraphicCommandBuffer(), VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT); - - auto &CommandBuffer = GetMainGraphicCommandBuffer(); - VkCommandBufferBeginInfo BeginInfo{}; - BeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - BeginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - - if(vkBeginCommandBuffer(CommandBuffer, &BeginInfo) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_RENDER_RECORDING, "Command buffer cannot be filled anymore."); - return false; - } - - VkRenderPassBeginInfo RenderPassInfo{}; - RenderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; - RenderPassInfo.renderPass = m_VKRenderPass; - RenderPassInfo.framebuffer = m_vFramebufferList[m_CurImageIndex]; - RenderPassInfo.renderArea.offset = {0, 0}; - RenderPassInfo.renderArea.extent = m_VKSwapImgAndViewportExtent.m_SwapImageViewport; - - VkClearValue ClearColorVal = {{{m_aClearColor[0], m_aClearColor[1], m_aClearColor[2], m_aClearColor[3]}}}; - RenderPassInfo.clearValueCount = 1; - RenderPassInfo.pClearValues = &ClearColorVal; - - vkCmdBeginRenderPass(CommandBuffer, &RenderPassInfo, m_ThreadCount > 1 ? VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS : VK_SUBPASS_CONTENTS_INLINE); - - for(auto &LastPipe : m_vLastPipeline) - LastPipe = VK_NULL_HANDLE; - - return true; - } - - void UploadStagingBuffers() - { - if(!m_vNonFlushedStagingBufferRange.empty()) - { - vkFlushMappedMemoryRanges(m_VKDevice, m_vNonFlushedStagingBufferRange.size(), m_vNonFlushedStagingBufferRange.data()); - - m_vNonFlushedStagingBufferRange.clear(); - } - } - - template - void UploadNonFlushedBuffers() - { - // streamed vertices - for(auto &StreamVertexBuffer : m_vStreamedVertexBuffers) - UploadStreamedBuffer(StreamVertexBuffer); - // now the buffer objects - for(auto &StreamUniformBuffer : m_vStreamedUniformBuffers) - UploadStreamedBuffer(StreamUniformBuffer); - - UploadStagingBuffers(); - } - - [[nodiscard]] bool PureMemoryFrame() - { - ExecuteMemoryCommandBuffer(); - - // reset streamed data - UploadNonFlushedBuffers(); - - ClearFrameMemoryUsage(); - - return true; - } - - [[nodiscard]] bool NextFrame() - { - if(!m_RenderingPaused) - { - if(!WaitFrame()) - return false; - if(!PrepareFrame()) - return false; - } - // else only execute the memory command buffer - else - { - if(!PureMemoryFrame()) - return false; - } - - return true; - } - - /************************ - * TEXTURES - ************************/ - - size_t VulkanFormatToPixelSize(VkFormat Format) - { - if(Format == VK_FORMAT_R8G8B8_UNORM) - return 3; - else if(Format == VK_FORMAT_R8G8B8A8_UNORM) - return 4; - else if(Format == VK_FORMAT_R8_UNORM) - return 1; - return 4; - } - - [[nodiscard]] bool UpdateTexture(size_t TextureSlot, VkFormat Format, uint8_t *&pData, int64_t XOff, int64_t YOff, size_t Width, size_t Height) - { - const size_t ImageSize = Width * Height * VulkanFormatToPixelSize(Format); - SMemoryBlock StagingBuffer; - if(!GetStagingBufferImage(StagingBuffer, pData, ImageSize)) - return false; - - auto &Tex = m_vTextures[TextureSlot]; - - if(Tex.m_RescaleCount > 0) - { - for(uint32_t i = 0; i < Tex.m_RescaleCount; ++i) - { - Width >>= 1; - Height >>= 1; - - XOff /= 2; - YOff /= 2; - } - - uint8_t *pTmpData = ResizeImage(pData, Width, Height, Width, Height, VulkanFormatToPixelSize(Format)); - free(pData); - pData = pTmpData; - } - - if(!ImageBarrier(Tex.m_Img, 0, Tex.m_MipMapCount, 0, 1, Format, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)) - return false; - if(!CopyBufferToImage(StagingBuffer.m_Buffer, StagingBuffer.m_HeapData.m_OffsetToAlign, Tex.m_Img, XOff, YOff, Width, Height, 1)) - return false; - - if(Tex.m_MipMapCount > 1) - { - if(!BuildMipmaps(Tex.m_Img, Format, Width, Height, 1, Tex.m_MipMapCount)) - return false; - } - else - { - if(!ImageBarrier(Tex.m_Img, 0, 1, 0, 1, Format, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)) - return false; - } - - UploadAndFreeStagingImageMemBlock(StagingBuffer); - - return true; - } - - [[nodiscard]] bool CreateTextureCMD( - int Slot, - int Width, - int Height, - VkFormat Format, - VkFormat StoreFormat, - int Flags, - uint8_t *&pData) - { - size_t ImageIndex = (size_t)Slot; - const size_t PixelSize = VulkanFormatToPixelSize(Format); - - while(ImageIndex >= m_vTextures.size()) - { - m_vTextures.resize((m_vTextures.size() * 2) + 1); - } - - // resample if needed - uint32_t RescaleCount = 0; - if((size_t)Width > m_MaxTextureSize || (size_t)Height > m_MaxTextureSize) - { - do - { - Width >>= 1; - Height >>= 1; - ++RescaleCount; - } while((size_t)Width > m_MaxTextureSize || (size_t)Height > m_MaxTextureSize); - - uint8_t *pTmpData = ResizeImage(pData, Width, Height, Width, Height, PixelSize); - free(pData); - pData = pTmpData; - } - - bool Requires2DTexture = (Flags & CCommandBuffer::TEXFLAG_NO_2D_TEXTURE) == 0; - bool Requires2DTextureArray = (Flags & (CCommandBuffer::TEXFLAG_TO_2D_ARRAY_TEXTURE)) != 0; - bool RequiresMipMaps = (Flags & CCommandBuffer::TEXFLAG_NOMIPMAPS) == 0; - size_t MipMapLevelCount = 1; - if(RequiresMipMaps) - { - VkExtent3D ImgSize{(uint32_t)Width, (uint32_t)Height, 1}; - MipMapLevelCount = ImageMipLevelCount(ImgSize); - if(!m_OptimalRGBAImageBlitting) - MipMapLevelCount = 1; - } - - CTexture &Texture = m_vTextures[ImageIndex]; - - Texture.m_Width = Width; - Texture.m_Height = Height; - Texture.m_RescaleCount = RescaleCount; - Texture.m_MipMapCount = MipMapLevelCount; - - if(Requires2DTexture) - { - if(!CreateTextureImage(ImageIndex, Texture.m_Img, Texture.m_ImgMem, pData, Format, Width, Height, 1, PixelSize, MipMapLevelCount)) - return false; - VkFormat ImgFormat = Format; - VkImageView ImgView = CreateTextureImageView(Texture.m_Img, ImgFormat, VK_IMAGE_VIEW_TYPE_2D, 1, MipMapLevelCount); - Texture.m_ImgView = ImgView; - VkSampler ImgSampler = GetTextureSampler(SUPPORTED_SAMPLER_TYPE_REPEAT); - Texture.m_aSamplers[0] = ImgSampler; - ImgSampler = GetTextureSampler(SUPPORTED_SAMPLER_TYPE_CLAMP_TO_EDGE); - Texture.m_aSamplers[1] = ImgSampler; - - if(!CreateNewTexturedStandardDescriptorSets(ImageIndex, 0)) - return false; - if(!CreateNewTexturedStandardDescriptorSets(ImageIndex, 1)) - return false; - } - - if(Requires2DTextureArray) - { - int Image3DWidth = Width; - int Image3DHeight = Height; - - int ConvertWidth = Width; - int ConvertHeight = Height; - - if(ConvertWidth == 0 || (ConvertWidth % 16) != 0 || ConvertHeight == 0 || (ConvertHeight % 16) != 0) - { - dbg_msg("vulkan", "3D/2D array texture was resized"); - int NewWidth = maximum(HighestBit(ConvertWidth), 16); - int NewHeight = maximum(HighestBit(ConvertHeight), 16); - uint8_t *pNewTexData = ResizeImage(pData, ConvertWidth, ConvertHeight, NewWidth, NewHeight, PixelSize); - - ConvertWidth = NewWidth; - ConvertHeight = NewHeight; - - free(pData); - pData = pNewTexData; - } - - bool Needs3DTexDel = false; - uint8_t *p3DTexData = static_cast(malloc((size_t)PixelSize * ConvertWidth * ConvertHeight)); - if(!Texture2DTo3D(pData, ConvertWidth, ConvertHeight, PixelSize, 16, 16, p3DTexData, Image3DWidth, Image3DHeight)) - { - free(p3DTexData); - p3DTexData = nullptr; - } - Needs3DTexDel = true; - - if(p3DTexData != nullptr) - { - const size_t ImageDepth2DArray = (size_t)16 * 16; - VkExtent3D ImgSize{(uint32_t)Image3DWidth, (uint32_t)Image3DHeight, 1}; - if(RequiresMipMaps) - { - MipMapLevelCount = ImageMipLevelCount(ImgSize); - if(!m_OptimalRGBAImageBlitting) - MipMapLevelCount = 1; - } - - if(!CreateTextureImage(ImageIndex, Texture.m_Img3D, Texture.m_Img3DMem, p3DTexData, Format, Image3DWidth, Image3DHeight, ImageDepth2DArray, PixelSize, MipMapLevelCount)) - return false; - VkFormat ImgFormat = Format; - VkImageView ImgView = CreateTextureImageView(Texture.m_Img3D, ImgFormat, VK_IMAGE_VIEW_TYPE_2D_ARRAY, ImageDepth2DArray, MipMapLevelCount); - Texture.m_Img3DView = ImgView; - VkSampler ImgSampler = GetTextureSampler(SUPPORTED_SAMPLER_TYPE_2D_TEXTURE_ARRAY); - Texture.m_Sampler3D = ImgSampler; - - if(!CreateNew3DTexturedStandardDescriptorSets(ImageIndex)) - return false; - - if(Needs3DTexDel) - free(p3DTexData); - } - } - return true; - } - - [[nodiscard]] bool BuildMipmaps(VkImage Image, VkFormat ImageFormat, size_t Width, size_t Height, size_t Depth, size_t MipMapLevelCount) - { - VkCommandBuffer *pMemCommandBuffer; - if(!GetMemoryCommandBuffer(pMemCommandBuffer)) - return false; - auto &MemCommandBuffer = *pMemCommandBuffer; - - VkImageMemoryBarrier Barrier{}; - Barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - Barrier.image = Image; - Barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - Barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - Barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - Barrier.subresourceRange.levelCount = 1; - Barrier.subresourceRange.baseArrayLayer = 0; - Barrier.subresourceRange.layerCount = Depth; - - int32_t TmpMipWidth = (int32_t)Width; - int32_t TmpMipHeight = (int32_t)Height; - - for(size_t i = 1; i < MipMapLevelCount; ++i) - { - Barrier.subresourceRange.baseMipLevel = i - 1; - Barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; - Barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; - Barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - Barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - - vkCmdPipelineBarrier(MemCommandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1, &Barrier); - - VkImageBlit Blit{}; - Blit.srcOffsets[0] = {0, 0, 0}; - Blit.srcOffsets[1] = {TmpMipWidth, TmpMipHeight, 1}; - Blit.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - Blit.srcSubresource.mipLevel = i - 1; - Blit.srcSubresource.baseArrayLayer = 0; - Blit.srcSubresource.layerCount = Depth; - Blit.dstOffsets[0] = {0, 0, 0}; - Blit.dstOffsets[1] = {TmpMipWidth > 1 ? TmpMipWidth / 2 : 1, TmpMipHeight > 1 ? TmpMipHeight / 2 : 1, 1}; - Blit.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - Blit.dstSubresource.mipLevel = i; - Blit.dstSubresource.baseArrayLayer = 0; - Blit.dstSubresource.layerCount = Depth; - - vkCmdBlitImage(MemCommandBuffer, - Image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - Image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 1, &Blit, - m_AllowsLinearBlitting ? VK_FILTER_LINEAR : VK_FILTER_NEAREST); - - Barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; - Barrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - Barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - Barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - - vkCmdPipelineBarrier(MemCommandBuffer, - VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, - 0, nullptr, - 0, nullptr, - 1, &Barrier); - - if(TmpMipWidth > 1) - TmpMipWidth /= 2; - if(TmpMipHeight > 1) - TmpMipHeight /= 2; - } - - Barrier.subresourceRange.baseMipLevel = MipMapLevelCount - 1; - Barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; - Barrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - Barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - Barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - - vkCmdPipelineBarrier(MemCommandBuffer, - VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, - 0, nullptr, - 0, nullptr, - 1, &Barrier); - - return true; - } - - [[nodiscard]] bool CreateTextureImage(size_t ImageIndex, VkImage &NewImage, SMemoryImageBlock &NewImgMem, const uint8_t *pData, VkFormat Format, size_t Width, size_t Height, size_t Depth, size_t PixelSize, size_t MipMapLevelCount) - { - VkDeviceSize ImageSize = Width * Height * Depth * PixelSize; - - SMemoryBlock StagingBuffer; - if(!GetStagingBufferImage(StagingBuffer, pData, ImageSize)) - return false; - - VkFormat ImgFormat = Format; - - if(!CreateImage(Width, Height, Depth, MipMapLevelCount, ImgFormat, VK_IMAGE_TILING_OPTIMAL, NewImage, NewImgMem)) - return false; - - if(!ImageBarrier(NewImage, 0, MipMapLevelCount, 0, Depth, ImgFormat, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)) - return false; - if(!CopyBufferToImage(StagingBuffer.m_Buffer, StagingBuffer.m_HeapData.m_OffsetToAlign, NewImage, 0, 0, static_cast(Width), static_cast(Height), Depth)) - return false; - - UploadAndFreeStagingImageMemBlock(StagingBuffer); - - if(MipMapLevelCount > 1) - { - if(!BuildMipmaps(NewImage, ImgFormat, Width, Height, Depth, MipMapLevelCount)) - return false; - } - else - { - if(!ImageBarrier(NewImage, 0, 1, 0, Depth, ImgFormat, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)) - return false; - } - - return true; - } - - VkImageView CreateTextureImageView(VkImage TexImage, VkFormat ImgFormat, VkImageViewType ViewType, size_t Depth, size_t MipMapLevelCount) - { - return CreateImageView(TexImage, ImgFormat, ViewType, Depth, MipMapLevelCount); - } - - [[nodiscard]] bool CreateTextureSamplersImpl(VkSampler &CreatedSampler, VkSamplerAddressMode AddrModeU, VkSamplerAddressMode AddrModeV, VkSamplerAddressMode AddrModeW) - { - VkSamplerCreateInfo SamplerInfo{}; - SamplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; - SamplerInfo.magFilter = VK_FILTER_LINEAR; - SamplerInfo.minFilter = VK_FILTER_LINEAR; - SamplerInfo.addressModeU = AddrModeU; - SamplerInfo.addressModeV = AddrModeV; - SamplerInfo.addressModeW = AddrModeW; - SamplerInfo.anisotropyEnable = VK_FALSE; - SamplerInfo.maxAnisotropy = m_MaxSamplerAnisotropy; - SamplerInfo.borderColor = VK_BORDER_COLOR_INT_OPAQUE_BLACK; - SamplerInfo.unnormalizedCoordinates = VK_FALSE; - SamplerInfo.compareEnable = VK_FALSE; - SamplerInfo.compareOp = VK_COMPARE_OP_ALWAYS; - SamplerInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR; - SamplerInfo.mipLodBias = (m_GlobalTextureLodBIAS / 1000.0f); - SamplerInfo.minLod = -1000; - SamplerInfo.maxLod = 1000; - - if(vkCreateSampler(m_VKDevice, &SamplerInfo, nullptr, &CreatedSampler) != VK_SUCCESS) - { - dbg_msg("vulkan", "failed to create texture sampler!"); - return false; - } - return true; - } - - [[nodiscard]] bool CreateTextureSamplers() - { - bool Ret = true; - Ret &= CreateTextureSamplersImpl(m_aSamplers[SUPPORTED_SAMPLER_TYPE_REPEAT], VkSamplerAddressMode::VK_SAMPLER_ADDRESS_MODE_REPEAT, VkSamplerAddressMode::VK_SAMPLER_ADDRESS_MODE_REPEAT, VkSamplerAddressMode::VK_SAMPLER_ADDRESS_MODE_REPEAT); - Ret &= CreateTextureSamplersImpl(m_aSamplers[SUPPORTED_SAMPLER_TYPE_CLAMP_TO_EDGE], VkSamplerAddressMode::VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, VkSamplerAddressMode::VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, VkSamplerAddressMode::VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE); - Ret &= CreateTextureSamplersImpl(m_aSamplers[SUPPORTED_SAMPLER_TYPE_2D_TEXTURE_ARRAY], VkSamplerAddressMode::VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, VkSamplerAddressMode::VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, VkSamplerAddressMode::VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT); - return Ret; - } - - void DestroyTextureSamplers() - { - vkDestroySampler(m_VKDevice, m_aSamplers[SUPPORTED_SAMPLER_TYPE_REPEAT], nullptr); - vkDestroySampler(m_VKDevice, m_aSamplers[SUPPORTED_SAMPLER_TYPE_CLAMP_TO_EDGE], nullptr); - vkDestroySampler(m_VKDevice, m_aSamplers[SUPPORTED_SAMPLER_TYPE_2D_TEXTURE_ARRAY], nullptr); - } - - VkSampler GetTextureSampler(ESupportedSamplerTypes SamplerType) - { - return m_aSamplers[SamplerType]; - } - - VkImageView CreateImageView(VkImage Image, VkFormat Format, VkImageViewType ViewType, size_t Depth, size_t MipMapLevelCount) - { - VkImageViewCreateInfo ViewCreateInfo{}; - ViewCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; - ViewCreateInfo.image = Image; - ViewCreateInfo.viewType = ViewType; - ViewCreateInfo.format = Format; - ViewCreateInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - ViewCreateInfo.subresourceRange.baseMipLevel = 0; - ViewCreateInfo.subresourceRange.levelCount = MipMapLevelCount; - ViewCreateInfo.subresourceRange.baseArrayLayer = 0; - ViewCreateInfo.subresourceRange.layerCount = Depth; - - VkImageView ImageView; - if(vkCreateImageView(m_VKDevice, &ViewCreateInfo, nullptr, &ImageView) != VK_SUCCESS) - { - return VK_NULL_HANDLE; - } - - return ImageView; - } - - [[nodiscard]] bool CreateImage(uint32_t Width, uint32_t Height, uint32_t Depth, size_t MipMapLevelCount, VkFormat Format, VkImageTiling Tiling, VkImage &Image, SMemoryImageBlock &ImageMemory, VkImageUsageFlags ImageUsage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT) - { - VkImageCreateInfo ImageInfo{}; - ImageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; - ImageInfo.imageType = VK_IMAGE_TYPE_2D; - ImageInfo.extent.width = Width; - ImageInfo.extent.height = Height; - ImageInfo.extent.depth = 1; - ImageInfo.mipLevels = MipMapLevelCount; - ImageInfo.arrayLayers = Depth; - ImageInfo.format = Format; - ImageInfo.tiling = Tiling; - ImageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; - ImageInfo.usage = ImageUsage; - ImageInfo.samples = (ImageUsage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) == 0 ? VK_SAMPLE_COUNT_1_BIT : GetSampleCount(); - ImageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - - if(vkCreateImage(m_VKDevice, &ImageInfo, nullptr, &Image) != VK_SUCCESS) - { - dbg_msg("vulkan", "failed to create image!"); - } - - VkMemoryRequirements MemRequirements; - vkGetImageMemoryRequirements(m_VKDevice, Image, &MemRequirements); - - if(!GetImageMemory(ImageMemory, MemRequirements.size, MemRequirements.alignment, MemRequirements.memoryTypeBits)) - return false; - - vkBindImageMemory(m_VKDevice, Image, ImageMemory.m_BufferMem.m_Mem, ImageMemory.m_HeapData.m_OffsetToAlign); - - return true; - } - - [[nodiscard]] bool ImageBarrier(const VkImage &Image, size_t MipMapBase, size_t MipMapCount, size_t LayerBase, size_t LayerCount, VkFormat Format, VkImageLayout OldLayout, VkImageLayout NewLayout) - { - VkCommandBuffer *pMemCommandBuffer; - if(!GetMemoryCommandBuffer(pMemCommandBuffer)) - return false; - auto &MemCommandBuffer = *pMemCommandBuffer; - - VkImageMemoryBarrier Barrier{}; - Barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - Barrier.oldLayout = OldLayout; - Barrier.newLayout = NewLayout; - Barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - Barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - Barrier.image = Image; - Barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - Barrier.subresourceRange.baseMipLevel = MipMapBase; - Barrier.subresourceRange.levelCount = MipMapCount; - Barrier.subresourceRange.baseArrayLayer = LayerBase; - Barrier.subresourceRange.layerCount = LayerCount; - - VkPipelineStageFlags SourceStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; - VkPipelineStageFlags DestinationStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - - if(OldLayout == VK_IMAGE_LAYOUT_UNDEFINED && NewLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) - { - Barrier.srcAccessMask = 0; - Barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - - SourceStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; - DestinationStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - } - else if(OldLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL && NewLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) - { - Barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - Barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - - SourceStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - DestinationStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; - } - else if(OldLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL && NewLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) - { - Barrier.srcAccessMask = VK_ACCESS_SHADER_READ_BIT; - Barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - - SourceStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; - DestinationStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - } - else if(OldLayout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL && NewLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR) - { - Barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - Barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; - - SourceStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - DestinationStage = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; - } - else if(OldLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR && NewLayout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL) - { - Barrier.srcAccessMask = VK_ACCESS_MEMORY_READ_BIT; - Barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - - SourceStage = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; - DestinationStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - } - else if(OldLayout == VK_IMAGE_LAYOUT_UNDEFINED && NewLayout == VK_IMAGE_LAYOUT_GENERAL) - { - Barrier.srcAccessMask = 0; - Barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; - - SourceStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; - DestinationStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - } - else if(OldLayout == VK_IMAGE_LAYOUT_GENERAL && NewLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) - { - Barrier.srcAccessMask = VK_ACCESS_MEMORY_READ_BIT; - Barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - - SourceStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - DestinationStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - } - else if(OldLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL && NewLayout == VK_IMAGE_LAYOUT_GENERAL) - { - Barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - Barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; - - SourceStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - DestinationStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - } - else - { - dbg_msg("vulkan", "unsupported layout transition!"); - } - - vkCmdPipelineBarrier( - MemCommandBuffer, - SourceStage, DestinationStage, - 0, - 0, nullptr, - 0, nullptr, - 1, &Barrier); - - return true; - } - - [[nodiscard]] bool CopyBufferToImage(VkBuffer Buffer, VkDeviceSize BufferOffset, VkImage Image, int32_t X, int32_t Y, uint32_t Width, uint32_t Height, size_t Depth) - { - VkCommandBuffer *pCommandBuffer; - if(!GetMemoryCommandBuffer(pCommandBuffer)) - return false; - auto &CommandBuffer = *pCommandBuffer; - - VkBufferImageCopy Region{}; - Region.bufferOffset = BufferOffset; - Region.bufferRowLength = 0; - Region.bufferImageHeight = 0; - Region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - Region.imageSubresource.mipLevel = 0; - Region.imageSubresource.baseArrayLayer = 0; - Region.imageSubresource.layerCount = Depth; - Region.imageOffset = {X, Y, 0}; - Region.imageExtent = { - Width, - Height, - 1}; - - vkCmdCopyBufferToImage(CommandBuffer, Buffer, Image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &Region); - - return true; - } - - /************************ - * BUFFERS - ************************/ - - [[nodiscard]] bool CreateBufferObject(size_t BufferIndex, const void *pUploadData, VkDeviceSize BufferDataSize, bool IsOneFrameBuffer) - { - std::vector UploadDataTmp; - if(pUploadData == nullptr) - { - UploadDataTmp.resize(BufferDataSize); - pUploadData = UploadDataTmp.data(); - } - - while(BufferIndex >= m_vBufferObjects.size()) - { - m_vBufferObjects.resize((m_vBufferObjects.size() * 2) + 1); - } - auto &BufferObject = m_vBufferObjects[BufferIndex]; - - VkBuffer VertexBuffer; - size_t BufferOffset = 0; - if(!IsOneFrameBuffer) - { - SMemoryBlock StagingBuffer; - if(!GetStagingBuffer(StagingBuffer, pUploadData, BufferDataSize)) - return false; - - SMemoryBlock Mem; - if(!GetVertexBuffer(Mem, BufferDataSize)) - return false; - - BufferObject.m_BufferObject.m_Mem = Mem; - VertexBuffer = Mem.m_Buffer; - BufferOffset = Mem.m_HeapData.m_OffsetToAlign; - - if(!MemoryBarrier(VertexBuffer, Mem.m_HeapData.m_OffsetToAlign, BufferDataSize, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, true)) - return false; - if(!CopyBuffer(StagingBuffer.m_Buffer, VertexBuffer, StagingBuffer.m_HeapData.m_OffsetToAlign, Mem.m_HeapData.m_OffsetToAlign, BufferDataSize)) - return false; - if(!MemoryBarrier(VertexBuffer, Mem.m_HeapData.m_OffsetToAlign, BufferDataSize, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, false)) - return false; - UploadAndFreeStagingMemBlock(StagingBuffer); - } - else - { - SDeviceMemoryBlock VertexBufferMemory; - if(!CreateStreamVertexBuffer(MAIN_THREAD_INDEX, VertexBuffer, VertexBufferMemory, BufferOffset, pUploadData, BufferDataSize)) - return false; - } - BufferObject.m_IsStreamedBuffer = IsOneFrameBuffer; - BufferObject.m_CurBuffer = VertexBuffer; - BufferObject.m_CurBufferOffset = BufferOffset; - - return true; - } - - void DeleteBufferObject(size_t BufferIndex) - { - auto &BufferObject = m_vBufferObjects[BufferIndex]; - if(!BufferObject.m_IsStreamedBuffer) - { - FreeVertexMemBlock(BufferObject.m_BufferObject.m_Mem); - } - BufferObject = {}; - } - - [[nodiscard]] bool CopyBuffer(VkBuffer SrcBuffer, VkBuffer DstBuffer, VkDeviceSize SrcOffset, VkDeviceSize DstOffset, VkDeviceSize CopySize) - { - VkCommandBuffer *pCommandBuffer; - if(!GetMemoryCommandBuffer(pCommandBuffer)) - return false; - auto &CommandBuffer = *pCommandBuffer; - VkBufferCopy CopyRegion{}; - CopyRegion.srcOffset = SrcOffset; - CopyRegion.dstOffset = DstOffset; - CopyRegion.size = CopySize; - vkCmdCopyBuffer(CommandBuffer, SrcBuffer, DstBuffer, 1, &CopyRegion); - - return true; - } - - /************************ - * RENDER STATES - ************************/ - - void GetStateMatrix(const CCommandBuffer::SState &State, std::array &Matrix) - { - Matrix = { - // column 1 - 2.f / (State.m_ScreenBR.x - State.m_ScreenTL.x), - 0, - // column 2 - 0, - 2.f / (State.m_ScreenBR.y - State.m_ScreenTL.y), - // column 3 - 0, - 0, - // column 4 - -((State.m_ScreenTL.x + State.m_ScreenBR.x) / (State.m_ScreenBR.x - State.m_ScreenTL.x)), - -((State.m_ScreenTL.y + State.m_ScreenBR.y) / (State.m_ScreenBR.y - State.m_ScreenTL.y)), - }; - } - - [[nodiscard]] bool GetIsTextured(const CCommandBuffer::SState &State) - { - return State.m_Texture != -1; - } - - size_t GetAddressModeIndex(const CCommandBuffer::SState &State) - { - return State.m_WrapMode == CCommandBuffer::WRAP_REPEAT ? VULKAN_BACKEND_ADDRESS_MODE_REPEAT : VULKAN_BACKEND_ADDRESS_MODE_CLAMP_EDGES; - } - - size_t GetBlendModeIndex(const CCommandBuffer::SState &State) - { - return State.m_BlendMode == CCommandBuffer::BLEND_ADDITIVE ? VULKAN_BACKEND_BLEND_MODE_ADDITATIVE : (State.m_BlendMode == CCommandBuffer::BLEND_NONE ? VULKAN_BACKEND_BLEND_MODE_NONE : VULKAN_BACKEND_BLEND_MODE_ALPHA); - } - - size_t GetDynamicModeIndexFromState(const CCommandBuffer::SState &State) const - { - return (State.m_ClipEnable || m_HasDynamicViewport || m_VKSwapImgAndViewportExtent.m_HasForcedViewport) ? VULKAN_BACKEND_CLIP_MODE_DYNAMIC_SCISSOR_AND_VIEWPORT : VULKAN_BACKEND_CLIP_MODE_NONE; - } - - size_t GetDynamicModeIndexFromExecBuffer(const SRenderCommandExecuteBuffer &ExecBuffer) - { - return (ExecBuffer.m_HasDynamicState) ? VULKAN_BACKEND_CLIP_MODE_DYNAMIC_SCISSOR_AND_VIEWPORT : VULKAN_BACKEND_CLIP_MODE_NONE; - } - - VkPipeline &GetPipeline(SPipelineContainer &Container, bool IsTextured, size_t BlendModeIndex, size_t DynamicIndex) - { - return Container.m_aaaPipelines[BlendModeIndex][DynamicIndex][(size_t)IsTextured]; - } - - VkPipelineLayout &GetPipeLayout(SPipelineContainer &Container, bool IsTextured, size_t BlendModeIndex, size_t DynamicIndex) - { - return Container.m_aaaPipelineLayouts[BlendModeIndex][DynamicIndex][(size_t)IsTextured]; - } - - VkPipelineLayout &GetStandardPipeLayout(bool IsLineGeometry, bool IsTextured, size_t BlendModeIndex, size_t DynamicIndex) - { - if(IsLineGeometry) - return GetPipeLayout(m_StandardLinePipeline, IsTextured, BlendModeIndex, DynamicIndex); - else - return GetPipeLayout(m_StandardPipeline, IsTextured, BlendModeIndex, DynamicIndex); - } - - VkPipeline &GetStandardPipe(bool IsLineGeometry, bool IsTextured, size_t BlendModeIndex, size_t DynamicIndex) - { - if(IsLineGeometry) - return GetPipeline(m_StandardLinePipeline, IsTextured, BlendModeIndex, DynamicIndex); - else - return GetPipeline(m_StandardPipeline, IsTextured, BlendModeIndex, DynamicIndex); - } - - VkPipelineLayout &GetTileLayerPipeLayout(bool IsBorder, bool IsTextured, size_t BlendModeIndex, size_t DynamicIndex) - { - if(!IsBorder) - return GetPipeLayout(m_TilePipeline, IsTextured, BlendModeIndex, DynamicIndex); - else - return GetPipeLayout(m_TileBorderPipeline, IsTextured, BlendModeIndex, DynamicIndex); - } - - VkPipeline &GetTileLayerPipe(bool IsBorder, bool IsTextured, size_t BlendModeIndex, size_t DynamicIndex) - { - if(!IsBorder) - return GetPipeline(m_TilePipeline, IsTextured, BlendModeIndex, DynamicIndex); - else - return GetPipeline(m_TileBorderPipeline, IsTextured, BlendModeIndex, DynamicIndex); - } - - void GetStateIndices(const SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SState &State, bool &IsTextured, size_t &BlendModeIndex, size_t &DynamicIndex, size_t &AddressModeIndex) - { - IsTextured = GetIsTextured(State); - AddressModeIndex = GetAddressModeIndex(State); - BlendModeIndex = GetBlendModeIndex(State); - DynamicIndex = GetDynamicModeIndexFromExecBuffer(ExecBuffer); - } - - void ExecBufferFillDynamicStates(const CCommandBuffer::SState &State, SRenderCommandExecuteBuffer &ExecBuffer) - { - size_t DynamicStateIndex = GetDynamicModeIndexFromState(State); - if(DynamicStateIndex == VULKAN_BACKEND_CLIP_MODE_DYNAMIC_SCISSOR_AND_VIEWPORT) - { - VkViewport Viewport; - if(m_HasDynamicViewport) - { - Viewport.x = (float)m_DynamicViewportOffset.x; - Viewport.y = (float)m_DynamicViewportOffset.y; - Viewport.width = (float)m_DynamicViewportSize.width; - Viewport.height = (float)m_DynamicViewportSize.height; - Viewport.minDepth = 0.0f; - Viewport.maxDepth = 1.0f; - } - // else check if there is a forced viewport - else if(m_VKSwapImgAndViewportExtent.m_HasForcedViewport) - { - Viewport.x = 0.0f; - Viewport.y = 0.0f; - Viewport.width = (float)m_VKSwapImgAndViewportExtent.m_ForcedViewport.width; - Viewport.height = (float)m_VKSwapImgAndViewportExtent.m_ForcedViewport.height; - Viewport.minDepth = 0.0f; - Viewport.maxDepth = 1.0f; - } - else - { - Viewport.x = 0.0f; - Viewport.y = 0.0f; - Viewport.width = (float)m_VKSwapImgAndViewportExtent.m_SwapImageViewport.width; - Viewport.height = (float)m_VKSwapImgAndViewportExtent.m_SwapImageViewport.height; - Viewport.minDepth = 0.0f; - Viewport.maxDepth = 1.0f; - } - - VkRect2D Scissor; - // convert from OGL to vulkan clip - - // the scissor always assumes the presented viewport, because the front-end keeps the calculation - // for the forced viewport in sync - auto ScissorViewport = m_VKSwapImgAndViewportExtent.GetPresentedImageViewport(); - if(State.m_ClipEnable) - { - int32_t ScissorY = (int32_t)ScissorViewport.height - ((int32_t)State.m_ClipY + (int32_t)State.m_ClipH); - uint32_t ScissorH = (int32_t)State.m_ClipH; - Scissor.offset = {(int32_t)State.m_ClipX, ScissorY}; - Scissor.extent = {(uint32_t)State.m_ClipW, ScissorH}; - } - else - { - Scissor.offset = {0, 0}; - Scissor.extent = {ScissorViewport.width, ScissorViewport.height}; - } - - // if there is a dynamic viewport make sure the scissor data is scaled down to that - if(m_HasDynamicViewport) - { - Scissor.offset.x = (int32_t)(((float)Scissor.offset.x / (float)ScissorViewport.width) * (float)m_DynamicViewportSize.width) + m_DynamicViewportOffset.x; - Scissor.offset.y = (int32_t)(((float)Scissor.offset.y / (float)ScissorViewport.height) * (float)m_DynamicViewportSize.height) + m_DynamicViewportOffset.y; - Scissor.extent.width = (uint32_t)(((float)Scissor.extent.width / (float)ScissorViewport.width) * (float)m_DynamicViewportSize.width); - Scissor.extent.height = (uint32_t)(((float)Scissor.extent.height / (float)ScissorViewport.height) * (float)m_DynamicViewportSize.height); - } - - Viewport.x = clamp(Viewport.x, 0.0f, std::numeric_limits::max()); - Viewport.y = clamp(Viewport.y, 0.0f, std::numeric_limits::max()); - - Scissor.offset.x = clamp(Scissor.offset.x, 0, std::numeric_limits::max()); - Scissor.offset.y = clamp(Scissor.offset.y, 0, std::numeric_limits::max()); - - ExecBuffer.m_HasDynamicState = true; - ExecBuffer.m_Viewport = Viewport; - ExecBuffer.m_Scissor = Scissor; - } - else - { - ExecBuffer.m_HasDynamicState = false; - } - } - - void BindPipeline(size_t RenderThreadIndex, VkCommandBuffer &CommandBuffer, SRenderCommandExecuteBuffer &ExecBuffer, VkPipeline &BindingPipe, const CCommandBuffer::SState &State) - { - if(m_vLastPipeline[RenderThreadIndex] != BindingPipe) - { - vkCmdBindPipeline(CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, BindingPipe); - m_vLastPipeline[RenderThreadIndex] = BindingPipe; - } - - size_t DynamicStateIndex = GetDynamicModeIndexFromExecBuffer(ExecBuffer); - if(DynamicStateIndex == VULKAN_BACKEND_CLIP_MODE_DYNAMIC_SCISSOR_AND_VIEWPORT) - { - vkCmdSetViewport(CommandBuffer, 0, 1, &ExecBuffer.m_Viewport); - vkCmdSetScissor(CommandBuffer, 0, 1, &ExecBuffer.m_Scissor); - } - } - - /************************** - * RENDERING IMPLEMENTATION - ***************************/ - - void RenderTileLayer_FillExecuteBuffer(SRenderCommandExecuteBuffer &ExecBuffer, size_t DrawCalls, const CCommandBuffer::SState &State, size_t BufferContainerIndex) - { - size_t BufferObjectIndex = (size_t)m_vBufferContainers[BufferContainerIndex].m_BufferObjectIndex; - const auto &BufferObject = m_vBufferObjects[BufferObjectIndex]; - - ExecBuffer.m_Buffer = BufferObject.m_CurBuffer; - ExecBuffer.m_BufferOff = BufferObject.m_CurBufferOffset; - - bool IsTextured = GetIsTextured(State); - if(IsTextured) - { - ExecBuffer.m_aDescriptors[0] = m_vTextures[State.m_Texture].m_VKStandard3DTexturedDescrSet; - } - - ExecBuffer.m_IndexBuffer = m_RenderIndexBuffer; - - ExecBuffer.m_EstimatedRenderCallCount = DrawCalls; - - ExecBufferFillDynamicStates(State, ExecBuffer); - } - - [[nodiscard]] bool RenderTileLayer(SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SState &State, bool IsBorder, const GL_SColorf &Color, const vec2 &Scale, const vec2 &Off, size_t IndicesDrawNum, char *const *pIndicesOffsets, const unsigned int *pDrawCount) - { - std::array m; - GetStateMatrix(State, m); - - bool IsTextured; - size_t BlendModeIndex; - size_t DynamicIndex; - size_t AddressModeIndex; - GetStateIndices(ExecBuffer, State, IsTextured, BlendModeIndex, DynamicIndex, AddressModeIndex); - auto &PipeLayout = GetTileLayerPipeLayout(IsBorder, IsTextured, BlendModeIndex, DynamicIndex); - auto &PipeLine = GetTileLayerPipe(IsBorder, IsTextured, BlendModeIndex, DynamicIndex); - - VkCommandBuffer *pCommandBuffer; - if(!GetGraphicCommandBuffer(pCommandBuffer, ExecBuffer.m_ThreadIndex)) - return false; - auto &CommandBuffer = *pCommandBuffer; - - BindPipeline(ExecBuffer.m_ThreadIndex, CommandBuffer, ExecBuffer, PipeLine, State); - - std::array aVertexBuffers = {ExecBuffer.m_Buffer}; - std::array aOffsets = {(VkDeviceSize)ExecBuffer.m_BufferOff}; - vkCmdBindVertexBuffers(CommandBuffer, 0, 1, aVertexBuffers.data(), aOffsets.data()); - - if(IsTextured) - { - vkCmdBindDescriptorSets(CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, PipeLayout, 0, 1, &ExecBuffer.m_aDescriptors[0].m_Descriptor, 0, nullptr); - } - - SUniformTileGPosBorder VertexPushConstants; - size_t VertexPushConstantSize = sizeof(SUniformTileGPos); - SUniformTileGVertColor FragPushConstants; - size_t FragPushConstantSize = sizeof(SUniformTileGVertColor); - - mem_copy(VertexPushConstants.m_aPos, m.data(), m.size() * sizeof(float)); - FragPushConstants = Color; - - if(IsBorder) - { - VertexPushConstants.m_Scale = Scale; - VertexPushConstants.m_Offset = Off; - VertexPushConstantSize = sizeof(SUniformTileGPosBorder); - } - - vkCmdPushConstants(CommandBuffer, PipeLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, VertexPushConstantSize, &VertexPushConstants); - vkCmdPushConstants(CommandBuffer, PipeLayout, VK_SHADER_STAGE_FRAGMENT_BIT, sizeof(SUniformTileGPosBorder) + sizeof(SUniformTileGVertColorAlign), FragPushConstantSize, &FragPushConstants); - - size_t DrawCount = IndicesDrawNum; - vkCmdBindIndexBuffer(CommandBuffer, ExecBuffer.m_IndexBuffer, 0, VK_INDEX_TYPE_UINT32); - for(size_t i = 0; i < DrawCount; ++i) - { - VkDeviceSize IndexOffset = (VkDeviceSize)((ptrdiff_t)pIndicesOffsets[i] / sizeof(uint32_t)); - - vkCmdDrawIndexed(CommandBuffer, static_cast(pDrawCount[i]), 1, IndexOffset, 0, 0); - } - - return true; - } - - template - [[nodiscard]] bool RenderStandard(SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SState &State, int PrimType, const TName *pVertices, int PrimitiveCount) - { - std::array m; - GetStateMatrix(State, m); - - bool IsLineGeometry = PrimType == CCommandBuffer::PRIMTYPE_LINES; - - bool IsTextured; - size_t BlendModeIndex; - size_t DynamicIndex; - size_t AddressModeIndex; - GetStateIndices(ExecBuffer, State, IsTextured, BlendModeIndex, DynamicIndex, AddressModeIndex); - auto &PipeLayout = Is3DTextured ? GetPipeLayout(m_Standard3DPipeline, IsTextured, BlendModeIndex, DynamicIndex) : GetStandardPipeLayout(IsLineGeometry, IsTextured, BlendModeIndex, DynamicIndex); - auto &PipeLine = Is3DTextured ? GetPipeline(m_Standard3DPipeline, IsTextured, BlendModeIndex, DynamicIndex) : GetStandardPipe(IsLineGeometry, IsTextured, BlendModeIndex, DynamicIndex); - - VkCommandBuffer *pCommandBuffer; - if(!GetGraphicCommandBuffer(pCommandBuffer, ExecBuffer.m_ThreadIndex)) - return false; - auto &CommandBuffer = *pCommandBuffer; - - BindPipeline(ExecBuffer.m_ThreadIndex, CommandBuffer, ExecBuffer, PipeLine, State); - - size_t VertPerPrim = 2; - bool IsIndexed = false; - if(PrimType == CCommandBuffer::PRIMTYPE_QUADS) - { - VertPerPrim = 4; - IsIndexed = true; - } - else if(PrimType == CCommandBuffer::PRIMTYPE_TRIANGLES) - { - VertPerPrim = 3; - } - - VkBuffer VKBuffer; - SDeviceMemoryBlock VKBufferMem; - size_t BufferOff = 0; - if(!CreateStreamVertexBuffer(ExecBuffer.m_ThreadIndex, VKBuffer, VKBufferMem, BufferOff, pVertices, VertPerPrim * sizeof(TName) * PrimitiveCount)) - return false; - - std::array aVertexBuffers = {VKBuffer}; - std::array aOffsets = {(VkDeviceSize)BufferOff}; - vkCmdBindVertexBuffers(CommandBuffer, 0, 1, aVertexBuffers.data(), aOffsets.data()); - - if(IsIndexed) - vkCmdBindIndexBuffer(CommandBuffer, ExecBuffer.m_IndexBuffer, 0, VK_INDEX_TYPE_UINT32); - - if(IsTextured) - { - vkCmdBindDescriptorSets(CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, PipeLayout, 0, 1, &ExecBuffer.m_aDescriptors[0].m_Descriptor, 0, nullptr); - } - - vkCmdPushConstants(CommandBuffer, PipeLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(SUniformGPos), m.data()); - - if(IsIndexed) - vkCmdDrawIndexed(CommandBuffer, static_cast(PrimitiveCount * 6), 1, 0, 0, 0); - else - vkCmdDraw(CommandBuffer, static_cast(PrimitiveCount * VertPerPrim), 1, 0, 0); - - return true; - } - -public: - CCommandProcessorFragment_Vulkan() - { - m_vTextures.reserve(CCommandBuffer::MAX_TEXTURES); - } - - /************************ - * VULKAN SETUP CODE - ************************/ - - [[nodiscard]] bool GetVulkanExtensions(SDL_Window *pWindow, std::vector &vVKExtensions) - { - unsigned int ExtCount = 0; - if(!SDL_Vulkan_GetInstanceExtensions(pWindow, &ExtCount, nullptr)) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Could not get instance extensions from SDL."); - return false; - } - - std::vector vExtensionList(ExtCount); - if(!SDL_Vulkan_GetInstanceExtensions(pWindow, &ExtCount, vExtensionList.data())) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Could not get instance extensions from SDL."); - return false; - } - - for(uint32_t i = 0; i < ExtCount; i++) - { - vVKExtensions.emplace_back(vExtensionList[i]); - } - - return true; - } - - std::set OurVKLayers() - { - std::set OurLayers; - - if(g_Config.m_DbgGfx == DEBUG_GFX_MODE_MINIMUM || g_Config.m_DbgGfx == DEBUG_GFX_MODE_ALL) - { - OurLayers.emplace("VK_LAYER_KHRONOS_validation"); - // deprecated, but VK_LAYER_KHRONOS_validation was released after vulkan 1.1 - OurLayers.emplace("VK_LAYER_LUNARG_standard_validation"); - } - - return OurLayers; - } - - std::set OurDeviceExtensions() - { - std::set OurExt; - OurExt.emplace(VK_KHR_SWAPCHAIN_EXTENSION_NAME); - return OurExt; - } - - std::vector OurImageUsages() - { - std::vector vImgUsages; - - vImgUsages.emplace_back(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); - vImgUsages.emplace_back(VK_IMAGE_USAGE_TRANSFER_SRC_BIT); - - return vImgUsages; - } - - [[nodiscard]] bool GetVulkanLayers(std::vector &vVKLayers) - { - uint32_t LayerCount = 0; - VkResult Res = vkEnumerateInstanceLayerProperties(&LayerCount, NULL); - if(Res != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Could not get vulkan layers."); - return false; - } - - std::vector vVKInstanceLayers(LayerCount); - Res = vkEnumerateInstanceLayerProperties(&LayerCount, vVKInstanceLayers.data()); - if(Res != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Could not get vulkan layers."); - return false; - } - - std::set ReqLayerNames = OurVKLayers(); - vVKLayers.clear(); - for(const auto &LayerName : vVKInstanceLayers) - { - auto it = ReqLayerNames.find(std::string(LayerName.layerName)); - if(it != ReqLayerNames.end()) - { - vVKLayers.emplace_back(LayerName.layerName); - } - } - - return true; - } - - bool IsGpuDenied(uint32_t Vendor, uint32_t DriverVersion, uint32_t ApiMajor, uint32_t ApiMinor, uint32_t ApiPatch) - { -#ifdef CONF_FAMILY_WINDOWS - // AMD - if(0x1002 == Vendor) - { - auto Major = (DriverVersion >> 22); - auto Minor = (DriverVersion >> 12) & 0x3ff; - auto Patch = DriverVersion & 0xfff; - - return Major == 2 && Minor == 0 && Patch > 137 && Patch < 220 && ((ApiMajor <= 1 && ApiMinor < 3) || (ApiMajor <= 1 && ApiMinor == 3 && ApiPatch < 206)); - } -#endif - return false; - } - - [[nodiscard]] bool CreateVulkanInstance(const std::vector &vVKLayers, const std::vector &vVKExtensions, bool TryDebugExtensions) - { - std::vector vLayersCStr; - vLayersCStr.reserve(vVKLayers.size()); - for(const auto &Layer : vVKLayers) - vLayersCStr.emplace_back(Layer.c_str()); - - std::vector vExtCStr; - vExtCStr.reserve(vVKExtensions.size() + 1); - for(const auto &Ext : vVKExtensions) - vExtCStr.emplace_back(Ext.c_str()); - -#ifdef VK_EXT_debug_utils - if(TryDebugExtensions && (g_Config.m_DbgGfx == DEBUG_GFX_MODE_MINIMUM || g_Config.m_DbgGfx == DEBUG_GFX_MODE_ALL)) - { - // debug message support - vExtCStr.emplace_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); - } -#endif - - VkApplicationInfo VKAppInfo = {}; - VKAppInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; - VKAppInfo.pNext = NULL; - VKAppInfo.pApplicationName = "DDNet"; - VKAppInfo.applicationVersion = 1; - VKAppInfo.pEngineName = "DDNet-Vulkan"; - VKAppInfo.engineVersion = 1; - VKAppInfo.apiVersion = VK_API_VERSION_1_1; - - void *pExt = nullptr; -#if defined(VK_EXT_validation_features) && VK_EXT_VALIDATION_FEATURES_SPEC_VERSION >= 5 - VkValidationFeaturesEXT Features = {}; - std::array aEnables = {VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT, VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT}; - if(TryDebugExtensions && (g_Config.m_DbgGfx == DEBUG_GFX_MODE_AFFECTS_PERFORMANCE || g_Config.m_DbgGfx == DEBUG_GFX_MODE_ALL)) - { - Features.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT; - Features.enabledValidationFeatureCount = aEnables.size(); - Features.pEnabledValidationFeatures = aEnables.data(); - - pExt = &Features; - } -#endif - - VkInstanceCreateInfo VKInstanceInfo = {}; - VKInstanceInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; - VKInstanceInfo.pNext = pExt; - VKInstanceInfo.flags = 0; - VKInstanceInfo.pApplicationInfo = &VKAppInfo; - VKInstanceInfo.enabledExtensionCount = static_cast(vExtCStr.size()); - VKInstanceInfo.ppEnabledExtensionNames = vExtCStr.data(); - VKInstanceInfo.enabledLayerCount = static_cast(vLayersCStr.size()); - VKInstanceInfo.ppEnabledLayerNames = vLayersCStr.data(); - - bool TryAgain = false; - - VkResult Res = vkCreateInstance(&VKInstanceInfo, NULL, &m_VKInstance); - const char *pCritErrorMsg = CheckVulkanCriticalError(Res); - if(pCritErrorMsg != nullptr) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Creating instance failed.", pCritErrorMsg); - return false; - } - else if(Res == VK_ERROR_LAYER_NOT_PRESENT || Res == VK_ERROR_EXTENSION_NOT_PRESENT) - TryAgain = true; - - if(TryAgain && TryDebugExtensions) - return CreateVulkanInstance(vVKLayers, vVKExtensions, false); - - return true; - } - - STWGraphicGpu::ETWGraphicsGpuType VKGPUTypeToGraphicsGpuType(VkPhysicalDeviceType VKGPUType) - { - if(VKGPUType == VkPhysicalDeviceType::VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) - return STWGraphicGpu::ETWGraphicsGpuType::GRAPHICS_GPU_TYPE_DISCRETE; - else if(VKGPUType == VkPhysicalDeviceType::VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU) - return STWGraphicGpu::ETWGraphicsGpuType::GRAPHICS_GPU_TYPE_INTEGRATED; - else if(VKGPUType == VkPhysicalDeviceType::VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU) - return STWGraphicGpu::ETWGraphicsGpuType::GRAPHICS_GPU_TYPE_VIRTUAL; - else if(VKGPUType == VkPhysicalDeviceType::VK_PHYSICAL_DEVICE_TYPE_CPU) - return STWGraphicGpu::ETWGraphicsGpuType::GRAPHICS_GPU_TYPE_CPU; - - return STWGraphicGpu::ETWGraphicsGpuType::GRAPHICS_GPU_TYPE_CPU; - } - - // from: https://github.com/SaschaWillems/vulkan.gpuinfo.org/blob/5c3986798afc39d736b825bf8a5fbf92b8d9ed49/includes/functions.php#L364 - const char *GetDriverVerson(char (&aBuff)[256], uint32_t DriverVersion, uint32_t VendorId) - { - // NVIDIA - if(VendorId == 4318) - { - str_format(aBuff, std::size(aBuff), "%d.%d.%d.%d", - (DriverVersion >> 22) & 0x3ff, - (DriverVersion >> 14) & 0x0ff, - (DriverVersion >> 6) & 0x0ff, - (DriverVersion)&0x003f); - } -#ifdef CONF_FAMILY_WINDOWS - // windows only - else if(VendorId == 0x8086) - { - str_format(aBuff, std::size(aBuff), - "%d.%d", - (DriverVersion >> 14), - (DriverVersion)&0x3fff); - } -#endif - else - { - // Use Vulkan version conventions if vendor mapping is not available - str_format(aBuff, std::size(aBuff), - "%d.%d.%d", - (DriverVersion >> 22), - (DriverVersion >> 12) & 0x3ff, - DriverVersion & 0xfff); - } - - return aBuff; - } - - [[nodiscard]] bool SelectGpu(char *pRendererName, char *pVendorName, char *pVersionName) - { - uint32_t DevicesCount = 0; - auto Res = vkEnumeratePhysicalDevices(m_VKInstance, &DevicesCount, nullptr); - if(Res != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, CheckVulkanCriticalError(Res)); - return false; - } - if(DevicesCount == 0) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "No vulkan compatible devices found."); - return false; - } - - std::vector vDeviceList(DevicesCount); - Res = vkEnumeratePhysicalDevices(m_VKInstance, &DevicesCount, vDeviceList.data()); - if(Res != VK_SUCCESS && Res != VK_INCOMPLETE) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, CheckVulkanCriticalError(Res)); - return false; - } - if(DevicesCount == 0) - { - SetWarning(EGfxWarningType::GFX_WARNING_TYPE_INIT_FAILED_MISSING_INTEGRATED_GPU_DRIVER, "No vulkan compatible devices found."); - return false; - } - // make sure to use the correct amount of devices available - // the amount of physical devices can be smaller than the amount of devices reported - // see vkEnumeratePhysicalDevices for details - vDeviceList.resize(DevicesCount); - - size_t Index = 0; - std::vector vDevicePropList(vDeviceList.size()); - m_pGpuList->m_vGpus.reserve(vDeviceList.size()); - - size_t FoundDeviceIndex = 0; - - STWGraphicGpu::ETWGraphicsGpuType AutoGpuType = STWGraphicGpu::ETWGraphicsGpuType::GRAPHICS_GPU_TYPE_INVALID; - - bool IsAutoGpu = str_comp(g_Config.m_GfxGpuName, "auto") == 0; - - bool UserSelectedGpuChosen = false; - for(auto &CurDevice : vDeviceList) - { - vkGetPhysicalDeviceProperties(CurDevice, &(vDevicePropList[Index])); - - auto &DeviceProp = vDevicePropList[Index]; - - STWGraphicGpu::ETWGraphicsGpuType GPUType = VKGPUTypeToGraphicsGpuType(DeviceProp.deviceType); - - int DevApiMajor = (int)VK_API_VERSION_MAJOR(DeviceProp.apiVersion); - int DevApiMinor = (int)VK_API_VERSION_MINOR(DeviceProp.apiVersion); - int DevApiPatch = (int)VK_API_VERSION_PATCH(DeviceProp.apiVersion); - - auto IsDenied = CCommandProcessorFragment_Vulkan::IsGpuDenied(DeviceProp.vendorID, DeviceProp.driverVersion, DevApiMajor, DevApiMinor, DevApiPatch); - if((DevApiMajor > gs_BackendVulkanMajor || (DevApiMajor == gs_BackendVulkanMajor && DevApiMinor >= gs_BackendVulkanMinor)) && !IsDenied) - { - STWGraphicGpu::STWGraphicGpuItem NewGpu; - str_copy(NewGpu.m_aName, DeviceProp.deviceName); - NewGpu.m_GpuType = GPUType; - m_pGpuList->m_vGpus.push_back(NewGpu); - - // We always decide what the 'auto' GPU would be, even if user is forcing a GPU by name in config - // Reminder: A worse GPU enumeration has a higher value than a better GPU enumeration, thus the '>' - if(AutoGpuType > STWGraphicGpu::ETWGraphicsGpuType::GRAPHICS_GPU_TYPE_INTEGRATED) - { - str_copy(m_pGpuList->m_AutoGpu.m_aName, DeviceProp.deviceName); - m_pGpuList->m_AutoGpu.m_GpuType = GPUType; - - AutoGpuType = GPUType; - - if(IsAutoGpu) - FoundDeviceIndex = Index; - } - // We only select the first GPU that matches, because it comes first in the enumeration array, it's preferred by the system - // Reminder: We can't break the cycle here if the name matches because we need to choose the best GPU for 'auto' mode - if(!IsAutoGpu && !UserSelectedGpuChosen && str_comp(DeviceProp.deviceName, g_Config.m_GfxGpuName) == 0) - { - FoundDeviceIndex = Index; - UserSelectedGpuChosen = true; - } - } - Index++; - } - - if(m_pGpuList->m_vGpus.empty()) - { - dbg_msg("vulkan", "no devices with required vulkan version found."); - return false; - } - - { - auto &DeviceProp = vDevicePropList[FoundDeviceIndex]; - - int DevApiMajor = (int)VK_API_VERSION_MAJOR(DeviceProp.apiVersion); - int DevApiMinor = (int)VK_API_VERSION_MINOR(DeviceProp.apiVersion); - int DevApiPatch = (int)VK_API_VERSION_PATCH(DeviceProp.apiVersion); - - str_copy(pRendererName, DeviceProp.deviceName, gs_GpuInfoStringSize); - const char *pVendorNameStr = NULL; - switch(DeviceProp.vendorID) - { - case 0x1002: - pVendorNameStr = "AMD"; - break; - case 0x1010: - pVendorNameStr = "ImgTec"; - break; - case 0x106B: - pVendorNameStr = "Apple"; - break; - case 0x10DE: - pVendorNameStr = "NVIDIA"; - break; - case 0x13B5: - pVendorNameStr = "ARM"; - break; - case 0x5143: - pVendorNameStr = "Qualcomm"; - break; - case 0x8086: - pVendorNameStr = "INTEL"; - break; - case 0x10005: - pVendorNameStr = "Mesa"; - break; - default: - dbg_msg("vulkan", "unknown gpu vendor %u", DeviceProp.vendorID); - pVendorNameStr = "unknown"; - break; - } - - char aBuff[256]; - str_copy(pVendorName, pVendorNameStr, gs_GpuInfoStringSize); - str_format(pVersionName, gs_GpuInfoStringSize, "Vulkan %d.%d.%d (driver: %s)", DevApiMajor, DevApiMinor, DevApiPatch, GetDriverVerson(aBuff, DeviceProp.driverVersion, DeviceProp.vendorID)); - - // get important device limits - m_NonCoherentMemAlignment = DeviceProp.limits.nonCoherentAtomSize; - m_OptimalImageCopyMemAlignment = DeviceProp.limits.optimalBufferCopyOffsetAlignment; - m_MaxTextureSize = DeviceProp.limits.maxImageDimension2D; - m_MaxSamplerAnisotropy = DeviceProp.limits.maxSamplerAnisotropy; - - m_MinUniformAlign = DeviceProp.limits.minUniformBufferOffsetAlignment; - m_MaxMultiSample = DeviceProp.limits.framebufferColorSampleCounts; - - if(IsVerbose()) - { - dbg_msg("vulkan", "device prop: non-coherent align: %" PRIzu ", optimal image copy align: %" PRIzu ", max texture size: %u, max sampler anisotropy: %u", (size_t)m_NonCoherentMemAlignment, (size_t)m_OptimalImageCopyMemAlignment, m_MaxTextureSize, m_MaxSamplerAnisotropy); - dbg_msg("vulkan", "device prop: min uniform align: %u, multi sample: %u", m_MinUniformAlign, (uint32_t)m_MaxMultiSample); - } - } - - VkPhysicalDevice CurDevice = vDeviceList[FoundDeviceIndex]; - - uint32_t FamQueueCount = 0; - vkGetPhysicalDeviceQueueFamilyProperties(CurDevice, &FamQueueCount, nullptr); - if(FamQueueCount == 0) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "No vulkan queue family properties found."); - return false; - } - - std::vector vQueuePropList(FamQueueCount); - vkGetPhysicalDeviceQueueFamilyProperties(CurDevice, &FamQueueCount, vQueuePropList.data()); - - uint32_t QueueNodeIndex = std::numeric_limits::max(); - for(uint32_t i = 0; i < FamQueueCount; i++) - { - if(vQueuePropList[i].queueCount > 0 && (vQueuePropList[i].queueFlags & VK_QUEUE_GRAPHICS_BIT)) - { - QueueNodeIndex = i; - } - /*if(vQueuePropList[i].queueCount > 0 && (vQueuePropList[i].queueFlags & VK_QUEUE_COMPUTE_BIT)) - { - QueueNodeIndex = i; - }*/ - } - - if(QueueNodeIndex == std::numeric_limits::max()) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "No vulkan queue found that matches the requirements: graphics queue."); - return false; - } - - m_VKGPU = CurDevice; - m_VKGraphicsQueueIndex = QueueNodeIndex; - return true; - } - - [[nodiscard]] bool CreateLogicalDevice(const std::vector &vVKLayers) - { - std::vector vLayerCNames; - vLayerCNames.reserve(vVKLayers.size()); - for(const auto &Layer : vVKLayers) - vLayerCNames.emplace_back(Layer.c_str()); - - uint32_t DevPropCount = 0; - if(vkEnumerateDeviceExtensionProperties(m_VKGPU, NULL, &DevPropCount, NULL) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Querying logical device extension properties failed."); - return false; - } - - std::vector vDevPropList(DevPropCount); - if(vkEnumerateDeviceExtensionProperties(m_VKGPU, NULL, &DevPropCount, vDevPropList.data()) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Querying logical device extension properties failed."); - return false; - } - - std::vector vDevPropCNames; - std::set OurDevExt = OurDeviceExtensions(); - - for(const auto &CurExtProp : vDevPropList) - { - auto it = OurDevExt.find(std::string(CurExtProp.extensionName)); - if(it != OurDevExt.end()) - { - vDevPropCNames.emplace_back(CurExtProp.extensionName); - } - } - - VkDeviceQueueCreateInfo VKQueueCreateInfo; - VKQueueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; - VKQueueCreateInfo.queueFamilyIndex = m_VKGraphicsQueueIndex; - VKQueueCreateInfo.queueCount = 1; - float QueuePrio = 1.0f; - VKQueueCreateInfo.pQueuePriorities = &QueuePrio; - VKQueueCreateInfo.pNext = NULL; - VKQueueCreateInfo.flags = 0; - - VkDeviceCreateInfo VKCreateInfo; - VKCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; - VKCreateInfo.queueCreateInfoCount = 1; - VKCreateInfo.pQueueCreateInfos = &VKQueueCreateInfo; - VKCreateInfo.ppEnabledLayerNames = vLayerCNames.data(); - VKCreateInfo.enabledLayerCount = static_cast(vLayerCNames.size()); - VKCreateInfo.ppEnabledExtensionNames = vDevPropCNames.data(); - VKCreateInfo.enabledExtensionCount = static_cast(vDevPropCNames.size()); - VKCreateInfo.pNext = NULL; - VKCreateInfo.pEnabledFeatures = NULL; - VKCreateInfo.flags = 0; - - VkResult res = vkCreateDevice(m_VKGPU, &VKCreateInfo, nullptr, &m_VKDevice); - if(res != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Logical device could not be created."); - return false; - } - - return true; - } - - [[nodiscard]] bool CreateSurface(SDL_Window *pWindow) - { - if(!SDL_Vulkan_CreateSurface(pWindow, m_VKInstance, &m_VKPresentSurface)) - { - dbg_msg("vulkan", "error from sdl: %s", SDL_GetError()); - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Creating a vulkan surface for the SDL window failed."); - return false; - } - - VkBool32 IsSupported = false; - vkGetPhysicalDeviceSurfaceSupportKHR(m_VKGPU, m_VKGraphicsQueueIndex, m_VKPresentSurface, &IsSupported); - if(!IsSupported) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "The device surface does not support presenting the framebuffer to a screen. (maybe the wrong GPU was selected?)"); - return false; - } - - return true; - } - - void DestroySurface() - { - vkDestroySurfaceKHR(m_VKInstance, m_VKPresentSurface, nullptr); - } - - [[nodiscard]] bool GetPresentationMode(VkPresentModeKHR &VKIOMode) - { - uint32_t PresentModeCount = 0; - if(vkGetPhysicalDeviceSurfacePresentModesKHR(m_VKGPU, m_VKPresentSurface, &PresentModeCount, NULL) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "The device surface presentation modes could not be fetched."); - return false; - } - - std::vector vPresentModeList(PresentModeCount); - if(vkGetPhysicalDeviceSurfacePresentModesKHR(m_VKGPU, m_VKPresentSurface, &PresentModeCount, vPresentModeList.data()) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "The device surface presentation modes could not be fetched."); - return false; - } - - VKIOMode = g_Config.m_GfxVsync ? VK_PRESENT_MODE_FIFO_KHR : VK_PRESENT_MODE_IMMEDIATE_KHR; - for(const auto &Mode : vPresentModeList) - { - if(Mode == VKIOMode) - return true; - } - - dbg_msg("vulkan", "warning: requested presentation mode was not available. falling back to mailbox / fifo relaxed."); - VKIOMode = g_Config.m_GfxVsync ? VK_PRESENT_MODE_FIFO_RELAXED_KHR : VK_PRESENT_MODE_MAILBOX_KHR; - for(const auto &Mode : vPresentModeList) - { - if(Mode == VKIOMode) - return true; - } - - dbg_msg("vulkan", "warning: requested presentation mode was not available. using first available."); - if(PresentModeCount > 0) - VKIOMode = vPresentModeList[0]; - - return true; - } - - [[nodiscard]] bool GetSurfaceProperties(VkSurfaceCapabilitiesKHR &VKSurfCapabilities) - { - if(vkGetPhysicalDeviceSurfaceCapabilitiesKHR(m_VKGPU, m_VKPresentSurface, &VKSurfCapabilities) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "The device surface capabilities could not be fetched."); - return false; - } - return true; - } - - uint32_t GetNumberOfSwapImages(const VkSurfaceCapabilitiesKHR &VKCapabilities) - { - uint32_t ImgNumber = VKCapabilities.minImageCount + 1; - if(IsVerbose()) - { - dbg_msg("vulkan", "minimal swap image count %u", VKCapabilities.minImageCount); - } - return (VKCapabilities.maxImageCount > 0 && ImgNumber > VKCapabilities.maxImageCount) ? VKCapabilities.maxImageCount : ImgNumber; - } - - SSwapImgViewportExtent GetSwapImageSize(const VkSurfaceCapabilitiesKHR &VKCapabilities) - { - VkExtent2D RetSize = {m_CanvasWidth, m_CanvasHeight}; - - if(VKCapabilities.currentExtent.width == std::numeric_limits::max()) - { - RetSize.width = clamp(RetSize.width, VKCapabilities.minImageExtent.width, VKCapabilities.maxImageExtent.width); - RetSize.height = clamp(RetSize.height, VKCapabilities.minImageExtent.height, VKCapabilities.maxImageExtent.height); - } - else - { - RetSize = VKCapabilities.currentExtent; - } - - VkExtent2D AutoViewportExtent = RetSize; - bool UsesForcedViewport = false; - // keep this in sync with graphics_threaded AdjustViewport's check - if(AutoViewportExtent.height > 4 * AutoViewportExtent.width / 5) - { - AutoViewportExtent.height = 4 * AutoViewportExtent.width / 5; - UsesForcedViewport = true; - } - - SSwapImgViewportExtent Ext; - Ext.m_SwapImageViewport = RetSize; - Ext.m_ForcedViewport = AutoViewportExtent; - Ext.m_HasForcedViewport = UsesForcedViewport; - - return Ext; - } - - [[nodiscard]] bool GetImageUsage(const VkSurfaceCapabilitiesKHR &VKCapabilities, VkImageUsageFlags &VKOutUsage) - { - std::vector vOurImgUsages = OurImageUsages(); - if(vOurImgUsages.empty()) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Framebuffer image attachment types not supported."); - return false; - } - - VKOutUsage = vOurImgUsages[0]; - - for(const auto &ImgUsage : vOurImgUsages) - { - VkImageUsageFlags ImgUsageFlags = ImgUsage & VKCapabilities.supportedUsageFlags; - if(ImgUsageFlags != ImgUsage) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Framebuffer image attachment types not supported."); - return false; - } - - VKOutUsage = (VKOutUsage | ImgUsage); - } - - return true; - } - - VkSurfaceTransformFlagBitsKHR GetTransform(const VkSurfaceCapabilitiesKHR &VKCapabilities) - { - if(VKCapabilities.supportedTransforms & VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR) - return VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; - return VKCapabilities.currentTransform; - } - - [[nodiscard]] bool GetFormat() - { - uint32_t SurfFormats = 0; - VkResult Res = vkGetPhysicalDeviceSurfaceFormatsKHR(m_VKGPU, m_VKPresentSurface, &SurfFormats, nullptr); - if(Res != VK_SUCCESS && Res != VK_INCOMPLETE) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "The device surface format fetching failed."); - return false; - } - - std::vector vSurfFormatList(SurfFormats); - Res = vkGetPhysicalDeviceSurfaceFormatsKHR(m_VKGPU, m_VKPresentSurface, &SurfFormats, vSurfFormatList.data()); - if(Res != VK_SUCCESS && Res != VK_INCOMPLETE) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "The device surface format fetching failed."); - return false; - } - - if(Res == VK_INCOMPLETE) - { - dbg_msg("vulkan", "warning: not all surface formats are requestable with your current settings."); - } - - if(vSurfFormatList.size() == 1 && vSurfFormatList[0].format == VK_FORMAT_UNDEFINED) - { - m_VKSurfFormat.format = VK_FORMAT_B8G8R8A8_UNORM; - m_VKSurfFormat.colorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; - dbg_msg("vulkan", "warning: surface format was undefined. This can potentially cause bugs."); - return true; - } - - for(const auto &FindFormat : vSurfFormatList) - { - if(FindFormat.format == VK_FORMAT_B8G8R8A8_UNORM && FindFormat.colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) - { - m_VKSurfFormat = FindFormat; - return true; - } - else if(FindFormat.format == VK_FORMAT_R8G8B8A8_UNORM && FindFormat.colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) - { - m_VKSurfFormat = FindFormat; - return true; - } - } - - dbg_msg("vulkan", "warning: surface format was not RGBA(or variants of it). This can potentially cause weird looking images(too bright etc.)."); - m_VKSurfFormat = vSurfFormatList[0]; - return true; - } - - [[nodiscard]] bool CreateSwapChain(VkSwapchainKHR &OldSwapChain) - { - VkSurfaceCapabilitiesKHR VKSurfCap; - if(!GetSurfaceProperties(VKSurfCap)) - return false; - - VkPresentModeKHR PresentMode = VK_PRESENT_MODE_IMMEDIATE_KHR; - if(!GetPresentationMode(PresentMode)) - return false; - - uint32_t SwapImgCount = GetNumberOfSwapImages(VKSurfCap); - - m_VKSwapImgAndViewportExtent = GetSwapImageSize(VKSurfCap); - - VkImageUsageFlags UsageFlags; - if(!GetImageUsage(VKSurfCap, UsageFlags)) - return false; - - VkSurfaceTransformFlagBitsKHR TransformFlagBits = GetTransform(VKSurfCap); - - if(!GetFormat()) - return false; - - OldSwapChain = m_VKSwapChain; - - VkSwapchainCreateInfoKHR SwapInfo; - SwapInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; - SwapInfo.pNext = nullptr; - SwapInfo.flags = 0; - SwapInfo.surface = m_VKPresentSurface; - SwapInfo.minImageCount = SwapImgCount; - SwapInfo.imageFormat = m_VKSurfFormat.format; - SwapInfo.imageColorSpace = m_VKSurfFormat.colorSpace; - SwapInfo.imageExtent = m_VKSwapImgAndViewportExtent.m_SwapImageViewport; - SwapInfo.imageArrayLayers = 1; - SwapInfo.imageUsage = UsageFlags; - SwapInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE; - SwapInfo.queueFamilyIndexCount = 0; - SwapInfo.pQueueFamilyIndices = nullptr; - SwapInfo.preTransform = TransformFlagBits; - SwapInfo.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; - SwapInfo.presentMode = PresentMode; - SwapInfo.clipped = true; - SwapInfo.oldSwapchain = OldSwapChain; - - m_VKSwapChain = VK_NULL_HANDLE; - VkResult SwapchainCreateRes = vkCreateSwapchainKHR(m_VKDevice, &SwapInfo, nullptr, &m_VKSwapChain); - const char *pCritErrorMsg = CheckVulkanCriticalError(SwapchainCreateRes); - if(pCritErrorMsg != nullptr) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Creating the swap chain failed.", pCritErrorMsg); - return false; - } - else if(SwapchainCreateRes == VK_ERROR_NATIVE_WINDOW_IN_USE_KHR) - return false; - - return true; - } - - void DestroySwapChain(bool ForceDestroy) - { - if(ForceDestroy) - { - vkDestroySwapchainKHR(m_VKDevice, m_VKSwapChain, nullptr); - m_VKSwapChain = VK_NULL_HANDLE; - } - } - - [[nodiscard]] bool GetSwapChainImageHandles() - { - uint32_t ImgCount = 0; - VkResult res = vkGetSwapchainImagesKHR(m_VKDevice, m_VKSwapChain, &ImgCount, nullptr); - if(res != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Could not get swap chain images."); - return false; - } - - m_SwapChainImageCount = ImgCount; - - m_vSwapChainImages.resize(ImgCount); - if(vkGetSwapchainImagesKHR(m_VKDevice, m_VKSwapChain, &ImgCount, m_vSwapChainImages.data()) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Could not get swap chain images."); - return false; - } - - return true; - } - - void ClearSwapChainImageHandles() - { - m_vSwapChainImages.clear(); - } - - void GetDeviceQueue() - { - vkGetDeviceQueue(m_VKDevice, m_VKGraphicsQueueIndex, 0, &m_VKGraphicsQueue); - vkGetDeviceQueue(m_VKDevice, m_VKGraphicsQueueIndex, 0, &m_VKPresentQueue); - } - -#ifdef VK_EXT_debug_utils - static VKAPI_ATTR VkBool32 VKAPI_CALL VKDebugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT MessageSeverity, VkDebugUtilsMessageTypeFlagsEXT MessageType, const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, void *pUserData) - { - if((MessageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) != 0) - { - dbg_msg("vulkan_debug", "validation error: %s", pCallbackData->pMessage); - } - else - { - dbg_msg("vulkan_debug", "%s", pCallbackData->pMessage); - } - - return VK_FALSE; - } - - VkResult CreateDebugUtilsMessengerEXT(const VkDebugUtilsMessengerCreateInfoEXT *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDebugUtilsMessengerEXT *pDebugMessenger) - { - auto func = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(m_VKInstance, "vkCreateDebugUtilsMessengerEXT"); - if(func != nullptr) - { - return func(m_VKInstance, pCreateInfo, pAllocator, pDebugMessenger); - } - else - { - return VK_ERROR_EXTENSION_NOT_PRESENT; - } - } - - void DestroyDebugUtilsMessengerEXT(VkDebugUtilsMessengerEXT &DebugMessenger) - { - auto func = (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(m_VKInstance, "vkDestroyDebugUtilsMessengerEXT"); - if(func != nullptr) - { - func(m_VKInstance, DebugMessenger, nullptr); - } - } -#endif - - void SetupDebugCallback() - { -#ifdef VK_EXT_debug_utils - VkDebugUtilsMessengerCreateInfoEXT CreateInfo = {}; - CreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; - CreateInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; - CreateInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT; // | VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT <- too annoying - CreateInfo.pfnUserCallback = VKDebugCallback; - - if(CreateDebugUtilsMessengerEXT(&CreateInfo, nullptr, &m_DebugMessenger) != VK_SUCCESS) - { - m_DebugMessenger = VK_NULL_HANDLE; - dbg_msg("vulkan", "didn't find vulkan debug layer."); - } - else - { - dbg_msg("vulkan", "enabled vulkan debug context."); - } -#endif - } - - void UnregisterDebugCallback() - { -#ifdef VK_EXT_debug_utils - if(m_DebugMessenger != VK_NULL_HANDLE) - DestroyDebugUtilsMessengerEXT(m_DebugMessenger); -#endif - } - - [[nodiscard]] bool CreateImageViews() - { - m_vSwapChainImageViewList.resize(m_SwapChainImageCount); - - for(size_t i = 0; i < m_SwapChainImageCount; i++) - { - VkImageViewCreateInfo CreateInfo{}; - CreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; - CreateInfo.image = m_vSwapChainImages[i]; - CreateInfo.viewType = VK_IMAGE_VIEW_TYPE_2D; - CreateInfo.format = m_VKSurfFormat.format; - CreateInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY; - CreateInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY; - CreateInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY; - CreateInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY; - CreateInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - CreateInfo.subresourceRange.baseMipLevel = 0; - CreateInfo.subresourceRange.levelCount = 1; - CreateInfo.subresourceRange.baseArrayLayer = 0; - CreateInfo.subresourceRange.layerCount = 1; - - if(vkCreateImageView(m_VKDevice, &CreateInfo, nullptr, &m_vSwapChainImageViewList[i]) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Could not create image views for the swap chain framebuffers."); - return false; - } - } - - return true; - } - - void DestroyImageViews() - { - for(auto &ImageView : m_vSwapChainImageViewList) - { - vkDestroyImageView(m_VKDevice, ImageView, nullptr); - } - - m_vSwapChainImageViewList.clear(); - } - - [[nodiscard]] bool CreateMultiSamplerImageAttachments() - { - m_vSwapChainMultiSamplingImages.resize(m_SwapChainImageCount); - if(HasMultiSampling()) - { - for(size_t i = 0; i < m_SwapChainImageCount; ++i) - { - if(!CreateImage(m_VKSwapImgAndViewportExtent.m_SwapImageViewport.width, m_VKSwapImgAndViewportExtent.m_SwapImageViewport.height, 1, 1, m_VKSurfFormat.format, VK_IMAGE_TILING_OPTIMAL, m_vSwapChainMultiSamplingImages[i].m_Image, m_vSwapChainMultiSamplingImages[i].m_ImgMem, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)) - return false; - m_vSwapChainMultiSamplingImages[i].m_ImgView = CreateImageView(m_vSwapChainMultiSamplingImages[i].m_Image, m_VKSurfFormat.format, VK_IMAGE_VIEW_TYPE_2D, 1, 1); - } - } - - return true; - } - - void DestroyMultiSamplerImageAttachments() - { - if(HasMultiSampling()) - { - m_vSwapChainMultiSamplingImages.resize(m_SwapChainImageCount); - for(size_t i = 0; i < m_SwapChainImageCount; ++i) - { - vkDestroyImage(m_VKDevice, m_vSwapChainMultiSamplingImages[i].m_Image, nullptr); - vkDestroyImageView(m_VKDevice, m_vSwapChainMultiSamplingImages[i].m_ImgView, nullptr); - FreeImageMemBlock(m_vSwapChainMultiSamplingImages[i].m_ImgMem); - } - } - m_vSwapChainMultiSamplingImages.clear(); - } - - [[nodiscard]] bool CreateRenderPass(bool ClearAttachs) - { - bool HasMultiSamplingTargets = HasMultiSampling(); - VkAttachmentDescription MultiSamplingColorAttachment{}; - MultiSamplingColorAttachment.format = m_VKSurfFormat.format; - MultiSamplingColorAttachment.samples = GetSampleCount(); - MultiSamplingColorAttachment.loadOp = ClearAttachs ? VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_DONT_CARE; - MultiSamplingColorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - MultiSamplingColorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - MultiSamplingColorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - MultiSamplingColorAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; - MultiSamplingColorAttachment.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - - VkAttachmentDescription ColorAttachment{}; - ColorAttachment.format = m_VKSurfFormat.format; - ColorAttachment.samples = VK_SAMPLE_COUNT_1_BIT; - ColorAttachment.loadOp = ClearAttachs && !HasMultiSamplingTargets ? VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_DONT_CARE; - ColorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; - ColorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - ColorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - ColorAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; - ColorAttachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; - - VkAttachmentReference MultiSamplingColorAttachmentRef{}; - MultiSamplingColorAttachmentRef.attachment = 0; - MultiSamplingColorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - - VkAttachmentReference ColorAttachmentRef{}; - ColorAttachmentRef.attachment = HasMultiSamplingTargets ? 1 : 0; - ColorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - - VkSubpassDescription Subpass{}; - Subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; - Subpass.colorAttachmentCount = 1; - Subpass.pColorAttachments = HasMultiSamplingTargets ? &MultiSamplingColorAttachmentRef : &ColorAttachmentRef; - Subpass.pResolveAttachments = HasMultiSamplingTargets ? &ColorAttachmentRef : nullptr; - - std::array aAttachments; - aAttachments[0] = MultiSamplingColorAttachment; - aAttachments[1] = ColorAttachment; - - VkSubpassDependency Dependency{}; - Dependency.srcSubpass = VK_SUBPASS_EXTERNAL; - Dependency.dstSubpass = 0; - Dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - Dependency.srcAccessMask = 0; - Dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - Dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - - VkRenderPassCreateInfo CreateRenderPassInfo{}; - CreateRenderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; - CreateRenderPassInfo.attachmentCount = HasMultiSamplingTargets ? 2 : 1; - CreateRenderPassInfo.pAttachments = HasMultiSamplingTargets ? aAttachments.data() : aAttachments.data() + 1; - CreateRenderPassInfo.subpassCount = 1; - CreateRenderPassInfo.pSubpasses = &Subpass; - CreateRenderPassInfo.dependencyCount = 1; - CreateRenderPassInfo.pDependencies = &Dependency; - - if(vkCreateRenderPass(m_VKDevice, &CreateRenderPassInfo, nullptr, &m_VKRenderPass) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Creating the render pass failed."); - return false; - } - - return true; - } - - void DestroyRenderPass() - { - vkDestroyRenderPass(m_VKDevice, m_VKRenderPass, nullptr); - } - - [[nodiscard]] bool CreateFramebuffers() - { - m_vFramebufferList.resize(m_SwapChainImageCount); - - for(size_t i = 0; i < m_SwapChainImageCount; i++) - { - std::array aAttachments = { - m_vSwapChainMultiSamplingImages[i].m_ImgView, - m_vSwapChainImageViewList[i]}; - - bool HasMultiSamplingTargets = HasMultiSampling(); - - VkFramebufferCreateInfo FramebufferInfo{}; - FramebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; - FramebufferInfo.renderPass = m_VKRenderPass; - FramebufferInfo.attachmentCount = HasMultiSamplingTargets ? aAttachments.size() : aAttachments.size() - 1; - FramebufferInfo.pAttachments = HasMultiSamplingTargets ? aAttachments.data() : aAttachments.data() + 1; - FramebufferInfo.width = m_VKSwapImgAndViewportExtent.m_SwapImageViewport.width; - FramebufferInfo.height = m_VKSwapImgAndViewportExtent.m_SwapImageViewport.height; - FramebufferInfo.layers = 1; - - if(vkCreateFramebuffer(m_VKDevice, &FramebufferInfo, nullptr, &m_vFramebufferList[i]) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Creating the framebuffers failed."); - return false; - } - } - - return true; - } - - void DestroyFramebuffers() - { - for(auto &FrameBuffer : m_vFramebufferList) - { - vkDestroyFramebuffer(m_VKDevice, FrameBuffer, nullptr); - } - - m_vFramebufferList.clear(); - } - - [[nodiscard]] bool CreateShaderModule(const std::vector &vCode, VkShaderModule &ShaderModule) - { - VkShaderModuleCreateInfo CreateInfo{}; - CreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - CreateInfo.codeSize = vCode.size(); - CreateInfo.pCode = (const uint32_t *)(vCode.data()); - - if(vkCreateShaderModule(m_VKDevice, &CreateInfo, nullptr, &ShaderModule) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Shader module was not created."); - return false; - } - - return true; - } - - [[nodiscard]] bool CreateDescriptorSetLayouts() - { - VkDescriptorSetLayoutBinding SamplerLayoutBinding{}; - SamplerLayoutBinding.binding = 0; - SamplerLayoutBinding.descriptorCount = 1; - SamplerLayoutBinding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - SamplerLayoutBinding.pImmutableSamplers = nullptr; - SamplerLayoutBinding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; - - std::array aBindings = {SamplerLayoutBinding}; - VkDescriptorSetLayoutCreateInfo LayoutInfo{}; - LayoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - LayoutInfo.bindingCount = aBindings.size(); - LayoutInfo.pBindings = aBindings.data(); - - if(vkCreateDescriptorSetLayout(m_VKDevice, &LayoutInfo, nullptr, &m_StandardTexturedDescriptorSetLayout) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Creating descriptor layout failed."); - return false; - } - - if(vkCreateDescriptorSetLayout(m_VKDevice, &LayoutInfo, nullptr, &m_Standard3DTexturedDescriptorSetLayout) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Creating descriptor layout failed."); - return false; - } - return true; - } - - void DestroyDescriptorSetLayouts() - { - vkDestroyDescriptorSetLayout(m_VKDevice, m_StandardTexturedDescriptorSetLayout, nullptr); - vkDestroyDescriptorSetLayout(m_VKDevice, m_Standard3DTexturedDescriptorSetLayout, nullptr); - } - - [[nodiscard]] bool LoadShader(const char *pFileName, std::vector *&pvShaderData) - { - auto it = m_ShaderFiles.find(pFileName); - if(it == m_ShaderFiles.end()) - { - void *pShaderBuff; - unsigned FileSize; - if(!m_pStorage->ReadFile(pFileName, IStorage::TYPE_ALL, &pShaderBuff, &FileSize)) - return false; - - std::vector vShaderBuff; - vShaderBuff.resize(FileSize); - mem_copy(vShaderBuff.data(), pShaderBuff, FileSize); - free(pShaderBuff); - - it = m_ShaderFiles.insert({pFileName, {std::move(vShaderBuff)}}).first; - } - - pvShaderData = &it->second.m_vBinary; - - return true; - } - - [[nodiscard]] bool CreateShaders(const char *pVertName, const char *pFragName, VkPipelineShaderStageCreateInfo (&aShaderStages)[2], SShaderModule &ShaderModule) - { - bool ShaderLoaded = true; - - std::vector *pvVertBuff; - std::vector *pvFragBuff; - ShaderLoaded &= LoadShader(pVertName, pvVertBuff); - ShaderLoaded &= LoadShader(pFragName, pvFragBuff); - - ShaderModule.m_VKDevice = m_VKDevice; - - if(!ShaderLoaded) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "A shader file could not load correctly."); - return false; - } - - if(!CreateShaderModule(*pvVertBuff, ShaderModule.m_VertShaderModule)) - return false; - - if(!CreateShaderModule(*pvFragBuff, ShaderModule.m_FragShaderModule)) - return false; - - VkPipelineShaderStageCreateInfo &VertShaderStageInfo = aShaderStages[0]; - VertShaderStageInfo = {}; - VertShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; - VertShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT; - VertShaderStageInfo.module = ShaderModule.m_VertShaderModule; - VertShaderStageInfo.pName = "main"; - - VkPipelineShaderStageCreateInfo &FragShaderStageInfo = aShaderStages[1]; - FragShaderStageInfo = {}; - FragShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; - FragShaderStageInfo.stage = VK_SHADER_STAGE_FRAGMENT_BIT; - FragShaderStageInfo.module = ShaderModule.m_FragShaderModule; - FragShaderStageInfo.pName = "main"; - return true; - } - - bool GetStandardPipelineInfo(VkPipelineInputAssemblyStateCreateInfo &InputAssembly, - VkViewport &Viewport, - VkRect2D &Scissor, - VkPipelineViewportStateCreateInfo &ViewportState, - VkPipelineRasterizationStateCreateInfo &Rasterizer, - VkPipelineMultisampleStateCreateInfo &Multisampling, - VkPipelineColorBlendAttachmentState &ColorBlendAttachment, - VkPipelineColorBlendStateCreateInfo &ColorBlending) const - { - InputAssembly.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; - InputAssembly.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; - InputAssembly.primitiveRestartEnable = VK_FALSE; - - Viewport.x = 0.0f; - Viewport.y = 0.0f; - Viewport.width = (float)m_VKSwapImgAndViewportExtent.m_SwapImageViewport.width; - Viewport.height = (float)m_VKSwapImgAndViewportExtent.m_SwapImageViewport.height; - Viewport.minDepth = 0.0f; - Viewport.maxDepth = 1.0f; - - Scissor.offset = {0, 0}; - Scissor.extent = m_VKSwapImgAndViewportExtent.m_SwapImageViewport; - - ViewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; - ViewportState.viewportCount = 1; - ViewportState.pViewports = &Viewport; - ViewportState.scissorCount = 1; - ViewportState.pScissors = &Scissor; - - Rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; - Rasterizer.depthClampEnable = VK_FALSE; - Rasterizer.rasterizerDiscardEnable = VK_FALSE; - Rasterizer.polygonMode = VK_POLYGON_MODE_FILL; - Rasterizer.lineWidth = 1.0f; - Rasterizer.cullMode = VK_CULL_MODE_NONE; - Rasterizer.frontFace = VK_FRONT_FACE_CLOCKWISE; - Rasterizer.depthBiasEnable = VK_FALSE; - - Multisampling.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; - Multisampling.sampleShadingEnable = VK_FALSE; - Multisampling.rasterizationSamples = GetSampleCount(); - - ColorBlendAttachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; - ColorBlendAttachment.blendEnable = VK_TRUE; - - ColorBlendAttachment.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA; - ColorBlendAttachment.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; - ColorBlendAttachment.colorBlendOp = VK_BLEND_OP_ADD; - ColorBlendAttachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA; - ColorBlendAttachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; - ColorBlendAttachment.alphaBlendOp = VK_BLEND_OP_ADD; - - ColorBlending.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; - ColorBlending.logicOpEnable = VK_FALSE; - ColorBlending.logicOp = VK_LOGIC_OP_COPY; - ColorBlending.attachmentCount = 1; - ColorBlending.pAttachments = &ColorBlendAttachment; - ColorBlending.blendConstants[0] = 0.0f; - ColorBlending.blendConstants[1] = 0.0f; - ColorBlending.blendConstants[2] = 0.0f; - ColorBlending.blendConstants[3] = 0.0f; - - return true; - } - - template - [[nodiscard]] bool CreateGraphicsPipeline(const char *pVertName, const char *pFragName, SPipelineContainer &PipeContainer, uint32_t Stride, std::array &aInputAttr, - std::array &aSetLayouts, std::array &aPushConstants, EVulkanBackendTextureModes TexMode, - EVulkanBackendBlendModes BlendMode, EVulkanBackendClipModes DynamicMode, bool IsLinePrim = false) - { - VkPipelineShaderStageCreateInfo aShaderStages[2]; - SShaderModule Module; - if(!CreateShaders(pVertName, pFragName, aShaderStages, Module)) - return false; - - bool HasSampler = TexMode == VULKAN_BACKEND_TEXTURE_MODE_TEXTURED; - - VkPipelineVertexInputStateCreateInfo VertexInputInfo{}; - VertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; - VkVertexInputBindingDescription BindingDescription{}; - BindingDescription.binding = 0; - BindingDescription.stride = Stride; - BindingDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; - - VertexInputInfo.vertexBindingDescriptionCount = 1; - VertexInputInfo.vertexAttributeDescriptionCount = aInputAttr.size(); - VertexInputInfo.pVertexBindingDescriptions = &BindingDescription; - VertexInputInfo.pVertexAttributeDescriptions = aInputAttr.data(); - - VkPipelineInputAssemblyStateCreateInfo InputAssembly{}; - VkViewport Viewport{}; - VkRect2D Scissor{}; - VkPipelineViewportStateCreateInfo ViewportState{}; - VkPipelineRasterizationStateCreateInfo Rasterizer{}; - VkPipelineMultisampleStateCreateInfo Multisampling{}; - VkPipelineColorBlendAttachmentState ColorBlendAttachment{}; - VkPipelineColorBlendStateCreateInfo ColorBlending{}; - - GetStandardPipelineInfo(InputAssembly, Viewport, Scissor, ViewportState, Rasterizer, Multisampling, ColorBlendAttachment, ColorBlending); - InputAssembly.topology = IsLinePrim ? VK_PRIMITIVE_TOPOLOGY_LINE_LIST : VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; - - VkPipelineLayoutCreateInfo PipelineLayoutInfo{}; - PipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; - PipelineLayoutInfo.setLayoutCount = (HasSampler || ForceRequireDescriptors) ? aSetLayouts.size() : 0; - PipelineLayoutInfo.pSetLayouts = (HasSampler || ForceRequireDescriptors) && !aSetLayouts.empty() ? aSetLayouts.data() : nullptr; - - PipelineLayoutInfo.pushConstantRangeCount = aPushConstants.size(); - PipelineLayoutInfo.pPushConstantRanges = !aPushConstants.empty() ? aPushConstants.data() : nullptr; - - VkPipelineLayout &PipeLayout = GetPipeLayout(PipeContainer, HasSampler, size_t(BlendMode), size_t(DynamicMode)); - VkPipeline &Pipeline = GetPipeline(PipeContainer, HasSampler, size_t(BlendMode), size_t(DynamicMode)); - - if(vkCreatePipelineLayout(m_VKDevice, &PipelineLayoutInfo, nullptr, &PipeLayout) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Creating pipeline layout failed."); - return false; - } - - VkGraphicsPipelineCreateInfo PipelineInfo{}; - PipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; - PipelineInfo.stageCount = 2; - PipelineInfo.pStages = aShaderStages; - PipelineInfo.pVertexInputState = &VertexInputInfo; - PipelineInfo.pInputAssemblyState = &InputAssembly; - PipelineInfo.pViewportState = &ViewportState; - PipelineInfo.pRasterizationState = &Rasterizer; - PipelineInfo.pMultisampleState = &Multisampling; - PipelineInfo.pColorBlendState = &ColorBlending; - PipelineInfo.layout = PipeLayout; - PipelineInfo.renderPass = m_VKRenderPass; - PipelineInfo.subpass = 0; - PipelineInfo.basePipelineHandle = VK_NULL_HANDLE; - - std::array aDynamicStates = { - VK_DYNAMIC_STATE_VIEWPORT, - VK_DYNAMIC_STATE_SCISSOR, - }; - - VkPipelineDynamicStateCreateInfo DynamicStateCreate{}; - DynamicStateCreate.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; - DynamicStateCreate.dynamicStateCount = aDynamicStates.size(); - DynamicStateCreate.pDynamicStates = aDynamicStates.data(); - - if(DynamicMode == VULKAN_BACKEND_CLIP_MODE_DYNAMIC_SCISSOR_AND_VIEWPORT) - { - PipelineInfo.pDynamicState = &DynamicStateCreate; - } - - if(vkCreateGraphicsPipelines(m_VKDevice, VK_NULL_HANDLE, 1, &PipelineInfo, nullptr, &Pipeline) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Creating the graphic pipeline failed."); - return false; - } - - return true; - } - - [[nodiscard]] bool CreateStandardGraphicsPipelineImpl(const char *pVertName, const char *pFragName, SPipelineContainer &PipeContainer, EVulkanBackendTextureModes TexMode, EVulkanBackendBlendModes BlendMode, EVulkanBackendClipModes DynamicMode, bool IsLinePrim) - { - std::array aAttributeDescriptions = {}; - - aAttributeDescriptions[0] = {0, 0, VK_FORMAT_R32G32_SFLOAT, 0}; - aAttributeDescriptions[1] = {1, 0, VK_FORMAT_R32G32_SFLOAT, sizeof(float) * 2}; - aAttributeDescriptions[2] = {2, 0, VK_FORMAT_R8G8B8A8_UNORM, sizeof(float) * (2 + 2)}; - - std::array aSetLayouts = {m_StandardTexturedDescriptorSetLayout}; - - std::array aPushConstants{}; - aPushConstants[0] = {VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(SUniformGPos)}; - - return CreateGraphicsPipeline(pVertName, pFragName, PipeContainer, sizeof(float) * (2 + 2) + sizeof(uint8_t) * 4, aAttributeDescriptions, aSetLayouts, aPushConstants, TexMode, BlendMode, DynamicMode, IsLinePrim); - } - - [[nodiscard]] bool CreateStandardGraphicsPipeline(const char *pVertName, const char *pFragName, bool HasSampler, bool IsLinePipe) - { - bool Ret = true; - - EVulkanBackendTextureModes TexMode = HasSampler ? VULKAN_BACKEND_TEXTURE_MODE_TEXTURED : VULKAN_BACKEND_TEXTURE_MODE_NOT_TEXTURED; - - for(size_t i = 0; i < VULKAN_BACKEND_BLEND_MODE_COUNT; ++i) - { - for(size_t j = 0; j < VULKAN_BACKEND_CLIP_MODE_COUNT; ++j) - { - Ret &= CreateStandardGraphicsPipelineImpl(pVertName, pFragName, IsLinePipe ? m_StandardLinePipeline : m_StandardPipeline, TexMode, EVulkanBackendBlendModes(i), EVulkanBackendClipModes(j), IsLinePipe); - } - } - - return Ret; - } - - [[nodiscard]] bool CreateStandard3DGraphicsPipelineImpl(const char *pVertName, const char *pFragName, SPipelineContainer &PipeContainer, EVulkanBackendTextureModes TexMode, EVulkanBackendBlendModes BlendMode, EVulkanBackendClipModes DynamicMode) - { - std::array aAttributeDescriptions = {}; - - aAttributeDescriptions[0] = {0, 0, VK_FORMAT_R32G32_SFLOAT, 0}; - aAttributeDescriptions[1] = {1, 0, VK_FORMAT_R8G8B8A8_UNORM, sizeof(float) * 2}; - aAttributeDescriptions[2] = {2, 0, VK_FORMAT_R32G32B32_SFLOAT, sizeof(float) * 2 + sizeof(uint8_t) * 4}; - - std::array aSetLayouts = {m_Standard3DTexturedDescriptorSetLayout}; - - std::array aPushConstants{}; - aPushConstants[0] = {VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(SUniformGPos)}; - - return CreateGraphicsPipeline(pVertName, pFragName, PipeContainer, sizeof(float) * 2 + sizeof(uint8_t) * 4 + sizeof(float) * 3, aAttributeDescriptions, aSetLayouts, aPushConstants, TexMode, BlendMode, DynamicMode); - } - - [[nodiscard]] bool CreateStandard3DGraphicsPipeline(const char *pVertName, const char *pFragName, bool HasSampler) - { - bool Ret = true; - - EVulkanBackendTextureModes TexMode = HasSampler ? VULKAN_BACKEND_TEXTURE_MODE_TEXTURED : VULKAN_BACKEND_TEXTURE_MODE_NOT_TEXTURED; - - for(size_t i = 0; i < VULKAN_BACKEND_BLEND_MODE_COUNT; ++i) - { - for(size_t j = 0; j < VULKAN_BACKEND_CLIP_MODE_COUNT; ++j) - { - Ret &= CreateStandard3DGraphicsPipelineImpl(pVertName, pFragName, m_Standard3DPipeline, TexMode, EVulkanBackendBlendModes(i), EVulkanBackendClipModes(j)); - } - } - - return Ret; - } - - [[nodiscard]] bool CreateTextDescriptorSetLayout() - { - VkDescriptorSetLayoutBinding SamplerLayoutBinding{}; - SamplerLayoutBinding.binding = 0; - SamplerLayoutBinding.descriptorCount = 1; - SamplerLayoutBinding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - SamplerLayoutBinding.pImmutableSamplers = nullptr; - SamplerLayoutBinding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; - - auto SamplerLayoutBinding2 = SamplerLayoutBinding; - SamplerLayoutBinding2.binding = 1; - - std::array aBindings = {SamplerLayoutBinding, SamplerLayoutBinding2}; - VkDescriptorSetLayoutCreateInfo LayoutInfo{}; - LayoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - LayoutInfo.bindingCount = aBindings.size(); - LayoutInfo.pBindings = aBindings.data(); - - if(vkCreateDescriptorSetLayout(m_VKDevice, &LayoutInfo, nullptr, &m_TextDescriptorSetLayout) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Creating descriptor layout failed."); - return false; - } - - return true; - } - - void DestroyTextDescriptorSetLayout() - { - vkDestroyDescriptorSetLayout(m_VKDevice, m_TextDescriptorSetLayout, nullptr); - } - - [[nodiscard]] bool CreateTextGraphicsPipelineImpl(const char *pVertName, const char *pFragName, SPipelineContainer &PipeContainer, EVulkanBackendTextureModes TexMode, EVulkanBackendBlendModes BlendMode, EVulkanBackendClipModes DynamicMode) - { - std::array aAttributeDescriptions = {}; - aAttributeDescriptions[0] = {0, 0, VK_FORMAT_R32G32_SFLOAT, 0}; - aAttributeDescriptions[1] = {1, 0, VK_FORMAT_R32G32_SFLOAT, sizeof(float) * 2}; - aAttributeDescriptions[2] = {2, 0, VK_FORMAT_R8G8B8A8_UNORM, sizeof(float) * (2 + 2)}; - - std::array aSetLayouts = {m_TextDescriptorSetLayout}; - - std::array aPushConstants{}; - aPushConstants[0] = {VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(SUniformGTextPos)}; - aPushConstants[1] = {VK_SHADER_STAGE_FRAGMENT_BIT, sizeof(SUniformGTextPos) + sizeof(SUniformTextGFragmentOffset), sizeof(SUniformTextGFragmentConstants)}; - - return CreateGraphicsPipeline(pVertName, pFragName, PipeContainer, sizeof(float) * (2 + 2) + sizeof(uint8_t) * 4, aAttributeDescriptions, aSetLayouts, aPushConstants, TexMode, BlendMode, DynamicMode); - } - - [[nodiscard]] bool CreateTextGraphicsPipeline(const char *pVertName, const char *pFragName) - { - bool Ret = true; - - EVulkanBackendTextureModes TexMode = VULKAN_BACKEND_TEXTURE_MODE_TEXTURED; - - for(size_t i = 0; i < VULKAN_BACKEND_BLEND_MODE_COUNT; ++i) - { - for(size_t j = 0; j < VULKAN_BACKEND_CLIP_MODE_COUNT; ++j) - { - Ret &= CreateTextGraphicsPipelineImpl(pVertName, pFragName, m_TextPipeline, TexMode, EVulkanBackendBlendModes(i), EVulkanBackendClipModes(j)); - } - } - - return Ret; - } - - template - [[nodiscard]] bool CreateTileGraphicsPipelineImpl(const char *pVertName, const char *pFragName, bool IsBorder, SPipelineContainer &PipeContainer, EVulkanBackendTextureModes TexMode, EVulkanBackendBlendModes BlendMode, EVulkanBackendClipModes DynamicMode) - { - std::array aAttributeDescriptions = {}; - aAttributeDescriptions[0] = {0, 0, VK_FORMAT_R32G32_SFLOAT, 0}; - if(HasSampler) - aAttributeDescriptions[1] = {1, 0, VK_FORMAT_R8G8B8A8_UINT, sizeof(float) * 2}; - - std::array aSetLayouts; - aSetLayouts[0] = m_Standard3DTexturedDescriptorSetLayout; - - uint32_t VertPushConstantSize = sizeof(SUniformTileGPos); - if(IsBorder) - VertPushConstantSize = sizeof(SUniformTileGPosBorder); - - uint32_t FragPushConstantSize = sizeof(SUniformTileGVertColor); - - std::array aPushConstants{}; - aPushConstants[0] = {VK_SHADER_STAGE_VERTEX_BIT, 0, VertPushConstantSize}; - aPushConstants[1] = {VK_SHADER_STAGE_FRAGMENT_BIT, sizeof(SUniformTileGPosBorder) + sizeof(SUniformTileGVertColorAlign), FragPushConstantSize}; - - return CreateGraphicsPipeline(pVertName, pFragName, PipeContainer, HasSampler ? (sizeof(float) * 2 + sizeof(uint8_t) * 4) : (sizeof(float) * 2), aAttributeDescriptions, aSetLayouts, aPushConstants, TexMode, BlendMode, DynamicMode); - } - - template - [[nodiscard]] bool CreateTileGraphicsPipeline(const char *pVertName, const char *pFragName, bool IsBorder) - { - bool Ret = true; - - EVulkanBackendTextureModes TexMode = HasSampler ? VULKAN_BACKEND_TEXTURE_MODE_TEXTURED : VULKAN_BACKEND_TEXTURE_MODE_NOT_TEXTURED; - - for(size_t i = 0; i < VULKAN_BACKEND_BLEND_MODE_COUNT; ++i) - { - for(size_t j = 0; j < VULKAN_BACKEND_CLIP_MODE_COUNT; ++j) - { - Ret &= CreateTileGraphicsPipelineImpl(pVertName, pFragName, IsBorder, !IsBorder ? m_TilePipeline : m_TileBorderPipeline, TexMode, EVulkanBackendBlendModes(i), EVulkanBackendClipModes(j)); - } - } - - return Ret; - } - - [[nodiscard]] bool CreatePrimExGraphicsPipelineImpl(const char *pVertName, const char *pFragName, bool Rotationless, SPipelineContainer &PipeContainer, EVulkanBackendTextureModes TexMode, EVulkanBackendBlendModes BlendMode, EVulkanBackendClipModes DynamicMode) - { - std::array aAttributeDescriptions = {}; - aAttributeDescriptions[0] = {0, 0, VK_FORMAT_R32G32_SFLOAT, 0}; - aAttributeDescriptions[1] = {1, 0, VK_FORMAT_R32G32_SFLOAT, sizeof(float) * 2}; - aAttributeDescriptions[2] = {2, 0, VK_FORMAT_R8G8B8A8_UNORM, sizeof(float) * (2 + 2)}; - - std::array aSetLayouts; - aSetLayouts[0] = m_StandardTexturedDescriptorSetLayout; - uint32_t VertPushConstantSize = sizeof(SUniformPrimExGPos); - if(Rotationless) - VertPushConstantSize = sizeof(SUniformPrimExGPosRotationless); - - uint32_t FragPushConstantSize = sizeof(SUniformPrimExGVertColor); - - std::array aPushConstants{}; - aPushConstants[0] = {VK_SHADER_STAGE_VERTEX_BIT, 0, VertPushConstantSize}; - aPushConstants[1] = {VK_SHADER_STAGE_FRAGMENT_BIT, sizeof(SUniformPrimExGPos) + sizeof(SUniformPrimExGVertColorAlign), FragPushConstantSize}; - - return CreateGraphicsPipeline(pVertName, pFragName, PipeContainer, sizeof(float) * (2 + 2) + sizeof(uint8_t) * 4, aAttributeDescriptions, aSetLayouts, aPushConstants, TexMode, BlendMode, DynamicMode); - } - - [[nodiscard]] bool CreatePrimExGraphicsPipeline(const char *pVertName, const char *pFragName, bool HasSampler, bool Rotationless) - { - bool Ret = true; - - EVulkanBackendTextureModes TexMode = HasSampler ? VULKAN_BACKEND_TEXTURE_MODE_TEXTURED : VULKAN_BACKEND_TEXTURE_MODE_NOT_TEXTURED; - - for(size_t i = 0; i < VULKAN_BACKEND_BLEND_MODE_COUNT; ++i) - { - for(size_t j = 0; j < VULKAN_BACKEND_CLIP_MODE_COUNT; ++j) - { - Ret &= CreatePrimExGraphicsPipelineImpl(pVertName, pFragName, Rotationless, Rotationless ? m_PrimExRotationlessPipeline : m_PrimExPipeline, TexMode, EVulkanBackendBlendModes(i), EVulkanBackendClipModes(j)); - } - } - - return Ret; - } - - [[nodiscard]] bool CreateUniformDescriptorSetLayout(VkDescriptorSetLayout &SetLayout, VkShaderStageFlags StageFlags) - { - VkDescriptorSetLayoutBinding SamplerLayoutBinding{}; - SamplerLayoutBinding.binding = 1; - SamplerLayoutBinding.descriptorCount = 1; - SamplerLayoutBinding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - SamplerLayoutBinding.pImmutableSamplers = nullptr; - SamplerLayoutBinding.stageFlags = StageFlags; - - std::array aBindings = {SamplerLayoutBinding}; - VkDescriptorSetLayoutCreateInfo LayoutInfo{}; - LayoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - LayoutInfo.bindingCount = aBindings.size(); - LayoutInfo.pBindings = aBindings.data(); - - if(vkCreateDescriptorSetLayout(m_VKDevice, &LayoutInfo, nullptr, &SetLayout) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Creating descriptor layout failed."); - return false; - } - return true; - } - - [[nodiscard]] bool CreateSpriteMultiUniformDescriptorSetLayout() - { - return CreateUniformDescriptorSetLayout(m_SpriteMultiUniformDescriptorSetLayout, VK_SHADER_STAGE_VERTEX_BIT); - } - - [[nodiscard]] bool CreateQuadUniformDescriptorSetLayout() - { - return CreateUniformDescriptorSetLayout(m_QuadUniformDescriptorSetLayout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT); - } - - void DestroyUniformDescriptorSetLayouts() - { - vkDestroyDescriptorSetLayout(m_VKDevice, m_QuadUniformDescriptorSetLayout, nullptr); - vkDestroyDescriptorSetLayout(m_VKDevice, m_SpriteMultiUniformDescriptorSetLayout, nullptr); - } - - [[nodiscard]] bool CreateUniformDescriptorSets(size_t RenderThreadIndex, VkDescriptorSetLayout &SetLayout, SDeviceDescriptorSet *pSets, size_t SetCount, VkBuffer BindBuffer, size_t SingleBufferInstanceSize, VkDeviceSize MemoryOffset) - { - VkDescriptorPool RetDescr; - if(!GetDescriptorPoolForAlloc(RetDescr, m_vUniformBufferDescrPools[RenderThreadIndex], pSets, SetCount)) - return false; - VkDescriptorSetAllocateInfo DesAllocInfo{}; - DesAllocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - DesAllocInfo.descriptorSetCount = 1; - DesAllocInfo.pSetLayouts = &SetLayout; - for(size_t i = 0; i < SetCount; ++i) - { - DesAllocInfo.descriptorPool = pSets[i].m_pPools->m_vPools[pSets[i].m_PoolIndex].m_Pool; - if(vkAllocateDescriptorSets(m_VKDevice, &DesAllocInfo, &pSets[i].m_Descriptor) != VK_SUCCESS) - { - return false; - } - - VkDescriptorBufferInfo BufferInfo{}; - BufferInfo.buffer = BindBuffer; - BufferInfo.offset = MemoryOffset + SingleBufferInstanceSize * i; - BufferInfo.range = SingleBufferInstanceSize; - - std::array aDescriptorWrites{}; - - aDescriptorWrites[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - aDescriptorWrites[0].dstSet = pSets[i].m_Descriptor; - aDescriptorWrites[0].dstBinding = 1; - aDescriptorWrites[0].dstArrayElement = 0; - aDescriptorWrites[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - aDescriptorWrites[0].descriptorCount = 1; - aDescriptorWrites[0].pBufferInfo = &BufferInfo; - - vkUpdateDescriptorSets(m_VKDevice, static_cast(aDescriptorWrites.size()), aDescriptorWrites.data(), 0, nullptr); - } - - return true; - } - - void DestroyUniformDescriptorSets(SDeviceDescriptorSet *pSets, size_t SetCount) - { - for(size_t i = 0; i < SetCount; ++i) - { - vkFreeDescriptorSets(m_VKDevice, pSets[i].m_pPools->m_vPools[pSets[i].m_PoolIndex].m_Pool, 1, &pSets[i].m_Descriptor); - pSets[i].m_Descriptor = VK_NULL_HANDLE; - } - } - - [[nodiscard]] bool CreateSpriteMultiGraphicsPipelineImpl(const char *pVertName, const char *pFragName, SPipelineContainer &PipeContainer, EVulkanBackendTextureModes TexMode, EVulkanBackendBlendModes BlendMode, EVulkanBackendClipModes DynamicMode) - { - std::array aAttributeDescriptions = {}; - aAttributeDescriptions[0] = {0, 0, VK_FORMAT_R32G32_SFLOAT, 0}; - aAttributeDescriptions[1] = {1, 0, VK_FORMAT_R32G32_SFLOAT, sizeof(float) * 2}; - aAttributeDescriptions[2] = {2, 0, VK_FORMAT_R8G8B8A8_UNORM, sizeof(float) * (2 + 2)}; - - std::array aSetLayouts; - aSetLayouts[0] = m_StandardTexturedDescriptorSetLayout; - aSetLayouts[1] = m_SpriteMultiUniformDescriptorSetLayout; - - uint32_t VertPushConstantSize = sizeof(SUniformSpriteMultiGPos); - uint32_t FragPushConstantSize = sizeof(SUniformSpriteMultiGVertColor); - - std::array aPushConstants{}; - aPushConstants[0] = {VK_SHADER_STAGE_VERTEX_BIT, 0, VertPushConstantSize}; - aPushConstants[1] = {VK_SHADER_STAGE_FRAGMENT_BIT, sizeof(SUniformSpriteMultiGPos) + sizeof(SUniformSpriteMultiGVertColorAlign), FragPushConstantSize}; - - return CreateGraphicsPipeline(pVertName, pFragName, PipeContainer, sizeof(float) * (2 + 2) + sizeof(uint8_t) * 4, aAttributeDescriptions, aSetLayouts, aPushConstants, TexMode, BlendMode, DynamicMode); - } - - [[nodiscard]] bool CreateSpriteMultiGraphicsPipeline(const char *pVertName, const char *pFragName) - { - bool Ret = true; - - EVulkanBackendTextureModes TexMode = VULKAN_BACKEND_TEXTURE_MODE_TEXTURED; - - for(size_t i = 0; i < VULKAN_BACKEND_BLEND_MODE_COUNT; ++i) - { - for(size_t j = 0; j < VULKAN_BACKEND_CLIP_MODE_COUNT; ++j) - { - Ret &= CreateSpriteMultiGraphicsPipelineImpl(pVertName, pFragName, m_SpriteMultiPipeline, TexMode, EVulkanBackendBlendModes(i), EVulkanBackendClipModes(j)); - } - } - - return Ret; - } - - [[nodiscard]] bool CreateSpriteMultiPushGraphicsPipelineImpl(const char *pVertName, const char *pFragName, SPipelineContainer &PipeContainer, EVulkanBackendTextureModes TexMode, EVulkanBackendBlendModes BlendMode, EVulkanBackendClipModes DynamicMode) - { - std::array aAttributeDescriptions = {}; - aAttributeDescriptions[0] = {0, 0, VK_FORMAT_R32G32_SFLOAT, 0}; - aAttributeDescriptions[1] = {1, 0, VK_FORMAT_R32G32_SFLOAT, sizeof(float) * 2}; - aAttributeDescriptions[2] = {2, 0, VK_FORMAT_R8G8B8A8_UNORM, sizeof(float) * (2 + 2)}; - - std::array aSetLayouts; - aSetLayouts[0] = m_StandardTexturedDescriptorSetLayout; - - uint32_t VertPushConstantSize = sizeof(SUniformSpriteMultiPushGPos); - uint32_t FragPushConstantSize = sizeof(SUniformSpriteMultiPushGVertColor); - - std::array aPushConstants{}; - aPushConstants[0] = {VK_SHADER_STAGE_VERTEX_BIT, 0, VertPushConstantSize}; - aPushConstants[1] = {VK_SHADER_STAGE_FRAGMENT_BIT, sizeof(SUniformSpriteMultiPushGPos), FragPushConstantSize}; - - return CreateGraphicsPipeline(pVertName, pFragName, PipeContainer, sizeof(float) * (2 + 2) + sizeof(uint8_t) * 4, aAttributeDescriptions, aSetLayouts, aPushConstants, TexMode, BlendMode, DynamicMode); - } - - [[nodiscard]] bool CreateSpriteMultiPushGraphicsPipeline(const char *pVertName, const char *pFragName) - { - bool Ret = true; - - EVulkanBackendTextureModes TexMode = VULKAN_BACKEND_TEXTURE_MODE_TEXTURED; - - for(size_t i = 0; i < VULKAN_BACKEND_BLEND_MODE_COUNT; ++i) - { - for(size_t j = 0; j < VULKAN_BACKEND_CLIP_MODE_COUNT; ++j) - { - Ret &= CreateSpriteMultiPushGraphicsPipelineImpl(pVertName, pFragName, m_SpriteMultiPushPipeline, TexMode, EVulkanBackendBlendModes(i), EVulkanBackendClipModes(j)); - } - } - - return Ret; - } - - template - [[nodiscard]] bool CreateQuadGraphicsPipelineImpl(const char *pVertName, const char *pFragName, SPipelineContainer &PipeContainer, EVulkanBackendTextureModes TexMode, EVulkanBackendBlendModes BlendMode, EVulkanBackendClipModes DynamicMode) - { - std::array aAttributeDescriptions = {}; - aAttributeDescriptions[0] = {0, 0, VK_FORMAT_R32G32B32A32_SFLOAT, 0}; - aAttributeDescriptions[1] = {1, 0, VK_FORMAT_R8G8B8A8_UNORM, sizeof(float) * 4}; - if(IsTextured) - aAttributeDescriptions[2] = {2, 0, VK_FORMAT_R32G32_SFLOAT, sizeof(float) * 4 + sizeof(uint8_t) * 4}; - - std::array aSetLayouts; - if(IsTextured) - { - aSetLayouts[0] = m_StandardTexturedDescriptorSetLayout; - aSetLayouts[1] = m_QuadUniformDescriptorSetLayout; - } - else - { - aSetLayouts[0] = m_QuadUniformDescriptorSetLayout; - } - - uint32_t PushConstantSize = sizeof(SUniformQuadGPos); - - std::array aPushConstants{}; - aPushConstants[0] = {VK_SHADER_STAGE_VERTEX_BIT, 0, PushConstantSize}; - - return CreateGraphicsPipeline(pVertName, pFragName, PipeContainer, sizeof(float) * 4 + sizeof(uint8_t) * 4 + (IsTextured ? (sizeof(float) * 2) : 0), aAttributeDescriptions, aSetLayouts, aPushConstants, TexMode, BlendMode, DynamicMode); - } - - template - [[nodiscard]] bool CreateQuadGraphicsPipeline(const char *pVertName, const char *pFragName) - { - bool Ret = true; - - EVulkanBackendTextureModes TexMode = HasSampler ? VULKAN_BACKEND_TEXTURE_MODE_TEXTURED : VULKAN_BACKEND_TEXTURE_MODE_NOT_TEXTURED; - - for(size_t i = 0; i < VULKAN_BACKEND_BLEND_MODE_COUNT; ++i) - { - for(size_t j = 0; j < VULKAN_BACKEND_CLIP_MODE_COUNT; ++j) - { - Ret &= CreateQuadGraphicsPipelineImpl(pVertName, pFragName, m_QuadPipeline, TexMode, EVulkanBackendBlendModes(i), EVulkanBackendClipModes(j)); - } - } - - return Ret; - } - - template - [[nodiscard]] bool CreateQuadPushGraphicsPipelineImpl(const char *pVertName, const char *pFragName, SPipelineContainer &PipeContainer, EVulkanBackendTextureModes TexMode, EVulkanBackendBlendModes BlendMode, EVulkanBackendClipModes DynamicMode) - { - std::array aAttributeDescriptions = {}; - aAttributeDescriptions[0] = {0, 0, VK_FORMAT_R32G32B32A32_SFLOAT, 0}; - aAttributeDescriptions[1] = {1, 0, VK_FORMAT_R8G8B8A8_UNORM, sizeof(float) * 4}; - if(IsTextured) - aAttributeDescriptions[2] = {2, 0, VK_FORMAT_R32G32_SFLOAT, sizeof(float) * 4 + sizeof(uint8_t) * 4}; - - std::array aSetLayouts; - aSetLayouts[0] = m_StandardTexturedDescriptorSetLayout; - - uint32_t PushConstantSize = sizeof(SUniformQuadPushGPos); - - std::array aPushConstants{}; - aPushConstants[0] = {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, PushConstantSize}; - - return CreateGraphicsPipeline(pVertName, pFragName, PipeContainer, sizeof(float) * 4 + sizeof(uint8_t) * 4 + (IsTextured ? (sizeof(float) * 2) : 0), aAttributeDescriptions, aSetLayouts, aPushConstants, TexMode, BlendMode, DynamicMode); - } - - template - [[nodiscard]] bool CreateQuadPushGraphicsPipeline(const char *pVertName, const char *pFragName) - { - bool Ret = true; - - EVulkanBackendTextureModes TexMode = HasSampler ? VULKAN_BACKEND_TEXTURE_MODE_TEXTURED : VULKAN_BACKEND_TEXTURE_MODE_NOT_TEXTURED; - - for(size_t i = 0; i < VULKAN_BACKEND_BLEND_MODE_COUNT; ++i) - { - for(size_t j = 0; j < VULKAN_BACKEND_CLIP_MODE_COUNT; ++j) - { - Ret &= CreateQuadPushGraphicsPipelineImpl(pVertName, pFragName, m_QuadPushPipeline, TexMode, EVulkanBackendBlendModes(i), EVulkanBackendClipModes(j)); - } - } - - return Ret; - } - - [[nodiscard]] bool CreateCommandPool() - { - VkCommandPoolCreateInfo CreatePoolInfo{}; - CreatePoolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; - CreatePoolInfo.queueFamilyIndex = m_VKGraphicsQueueIndex; - CreatePoolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; - - m_vCommandPools.resize(m_ThreadCount); - for(size_t i = 0; i < m_ThreadCount; ++i) - { - if(vkCreateCommandPool(m_VKDevice, &CreatePoolInfo, nullptr, &m_vCommandPools[i]) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Creating the command pool failed."); - return false; - } - } - return true; - } - - void DestroyCommandPool() - { - for(size_t i = 0; i < m_ThreadCount; ++i) - { - vkDestroyCommandPool(m_VKDevice, m_vCommandPools[i], nullptr); - } - } - - [[nodiscard]] bool CreateCommandBuffers() - { - m_vMainDrawCommandBuffers.resize(m_SwapChainImageCount); - if(m_ThreadCount > 1) - { - m_vvThreadDrawCommandBuffers.resize(m_ThreadCount); - m_vvUsedThreadDrawCommandBuffer.resize(m_ThreadCount); - m_vHelperThreadDrawCommandBuffers.resize(m_ThreadCount); - for(auto &ThreadDrawCommandBuffers : m_vvThreadDrawCommandBuffers) - { - ThreadDrawCommandBuffers.resize(m_SwapChainImageCount); - } - for(auto &UsedThreadDrawCommandBuffer : m_vvUsedThreadDrawCommandBuffer) - { - UsedThreadDrawCommandBuffer.resize(m_SwapChainImageCount, false); - } - } - m_vMemoryCommandBuffers.resize(m_SwapChainImageCount); - m_vUsedMemoryCommandBuffer.resize(m_SwapChainImageCount, false); - - VkCommandBufferAllocateInfo AllocInfo{}; - AllocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; - AllocInfo.commandPool = m_vCommandPools[0]; - AllocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; - AllocInfo.commandBufferCount = (uint32_t)m_vMainDrawCommandBuffers.size(); - - if(vkAllocateCommandBuffers(m_VKDevice, &AllocInfo, m_vMainDrawCommandBuffers.data()) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Allocating command buffers failed."); - return false; - } - - AllocInfo.commandBufferCount = (uint32_t)m_vMemoryCommandBuffers.size(); - - if(vkAllocateCommandBuffers(m_VKDevice, &AllocInfo, m_vMemoryCommandBuffers.data()) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Allocating memory command buffers failed."); - return false; - } - - if(m_ThreadCount > 1) - { - size_t Count = 0; - for(auto &ThreadDrawCommandBuffers : m_vvThreadDrawCommandBuffers) - { - AllocInfo.commandPool = m_vCommandPools[Count]; - ++Count; - AllocInfo.commandBufferCount = (uint32_t)ThreadDrawCommandBuffers.size(); - AllocInfo.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY; - if(vkAllocateCommandBuffers(m_VKDevice, &AllocInfo, ThreadDrawCommandBuffers.data()) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Allocating thread command buffers failed."); - return false; - } - } - } - - return true; - } - - void DestroyCommandBuffer() - { - if(m_ThreadCount > 1) - { - size_t Count = 0; - for(auto &ThreadDrawCommandBuffers : m_vvThreadDrawCommandBuffers) - { - vkFreeCommandBuffers(m_VKDevice, m_vCommandPools[Count], static_cast(ThreadDrawCommandBuffers.size()), ThreadDrawCommandBuffers.data()); - ++Count; - } - } - - vkFreeCommandBuffers(m_VKDevice, m_vCommandPools[0], static_cast(m_vMemoryCommandBuffers.size()), m_vMemoryCommandBuffers.data()); - vkFreeCommandBuffers(m_VKDevice, m_vCommandPools[0], static_cast(m_vMainDrawCommandBuffers.size()), m_vMainDrawCommandBuffers.data()); - - m_vvThreadDrawCommandBuffers.clear(); - m_vvUsedThreadDrawCommandBuffer.clear(); - m_vHelperThreadDrawCommandBuffers.clear(); - - m_vMainDrawCommandBuffers.clear(); - m_vMemoryCommandBuffers.clear(); - m_vUsedMemoryCommandBuffer.clear(); - } - - [[nodiscard]] bool CreateSyncObjects() - { - // Create one more sync object than there are frames in flight - auto SyncObjectCount = m_SwapChainImageCount + 1; - m_vWaitSemaphores.resize(SyncObjectCount); - m_vSigSemaphores.resize(SyncObjectCount); - - m_vFrameFences.resize(SyncObjectCount); - m_vImagesFences.resize(m_SwapChainImageCount, VK_NULL_HANDLE); - - VkSemaphoreCreateInfo CreateSemaphoreInfo{}; - CreateSemaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; - - VkFenceCreateInfo FenceInfo{}; - FenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; - FenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT; - - for(size_t i = 0; i < SyncObjectCount; i++) - { - if(vkCreateSemaphore(m_VKDevice, &CreateSemaphoreInfo, nullptr, &m_vWaitSemaphores[i]) != VK_SUCCESS || - vkCreateSemaphore(m_VKDevice, &CreateSemaphoreInfo, nullptr, &m_vSigSemaphores[i]) != VK_SUCCESS || - vkCreateFence(m_VKDevice, &FenceInfo, nullptr, &m_vFrameFences[i]) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Creating swap chain sync objects(fences, semaphores) failed."); - return false; - } - } - - return true; - } - - void DestroySyncObjects() - { - for(size_t i = 0; i < m_vWaitSemaphores.size(); i++) - { - vkDestroySemaphore(m_VKDevice, m_vWaitSemaphores[i], nullptr); - vkDestroySemaphore(m_VKDevice, m_vSigSemaphores[i], nullptr); - vkDestroyFence(m_VKDevice, m_vFrameFences[i], nullptr); - } - - m_vWaitSemaphores.clear(); - m_vSigSemaphores.clear(); - - m_vFrameFences.clear(); - m_vImagesFences.clear(); - - m_CurFrameSyncObject = 0; - } - - void DestroyBufferOfFrame(size_t ImageIndex, SFrameBuffers &Buffer) - { - CleanBufferPair(ImageIndex, Buffer.m_Buffer, Buffer.m_BufferMem); - } - - void DestroyUniBufferOfFrame(size_t ImageIndex, SFrameUniformBuffers &Buffer) - { - CleanBufferPair(ImageIndex, Buffer.m_Buffer, Buffer.m_BufferMem); - for(auto &DescrSet : Buffer.m_aUniformSets) - { - if(DescrSet.m_Descriptor != VK_NULL_HANDLE) - { - DestroyUniformDescriptorSets(&DescrSet, 1); - } - } - } - - /************* - * SWAP CHAIN - **************/ - - void CleanupVulkanSwapChain(bool ForceSwapChainDestruct) - { - m_StandardPipeline.Destroy(m_VKDevice); - m_StandardLinePipeline.Destroy(m_VKDevice); - m_Standard3DPipeline.Destroy(m_VKDevice); - m_TextPipeline.Destroy(m_VKDevice); - m_TilePipeline.Destroy(m_VKDevice); - m_TileBorderPipeline.Destroy(m_VKDevice); - m_PrimExPipeline.Destroy(m_VKDevice); - m_PrimExRotationlessPipeline.Destroy(m_VKDevice); - m_SpriteMultiPipeline.Destroy(m_VKDevice); - m_SpriteMultiPushPipeline.Destroy(m_VKDevice); - m_QuadPipeline.Destroy(m_VKDevice); - m_QuadPushPipeline.Destroy(m_VKDevice); - - DestroyFramebuffers(); - - DestroyRenderPass(); - - DestroyMultiSamplerImageAttachments(); - - DestroyImageViews(); - ClearSwapChainImageHandles(); - - DestroySwapChain(ForceSwapChainDestruct); - - m_SwapchainCreated = false; - } - - template - void CleanupVulkan(size_t SwapchainCount) - { - if(IsLastCleanup) - { - if(m_SwapchainCreated) - CleanupVulkanSwapChain(true); - - // clean all images, buffers, buffer containers - for(auto &Texture : m_vTextures) - { - if(Texture.m_VKTextDescrSet.m_Descriptor != VK_NULL_HANDLE && IsVerbose()) - { - dbg_msg("vulkan", "text textures not cleared over cmd."); - } - DestroyTexture(Texture); - } - - for(auto &BufferObject : m_vBufferObjects) - { - if(!BufferObject.m_IsStreamedBuffer) - FreeVertexMemBlock(BufferObject.m_BufferObject.m_Mem); - } - - m_vBufferContainers.clear(); - } - - m_vImageLastFrameCheck.clear(); - - m_vLastPipeline.clear(); - - for(size_t i = 0; i < m_ThreadCount; ++i) - { - m_vStreamedVertexBuffers[i].Destroy([&](size_t ImageIndex, SFrameBuffers &Buffer) { DestroyBufferOfFrame(ImageIndex, Buffer); }); - m_vStreamedUniformBuffers[i].Destroy([&](size_t ImageIndex, SFrameUniformBuffers &Buffer) { DestroyUniBufferOfFrame(ImageIndex, Buffer); }); - } - m_vStreamedVertexBuffers.clear(); - m_vStreamedUniformBuffers.clear(); - - for(size_t i = 0; i < SwapchainCount; ++i) - { - ClearFrameData(i); - } - - m_vvFrameDelayedBufferCleanup.clear(); - m_vvFrameDelayedTextureCleanup.clear(); - m_vvFrameDelayedTextTexturesCleanup.clear(); - - m_StagingBufferCache.DestroyFrameData(SwapchainCount); - m_StagingBufferCacheImage.DestroyFrameData(SwapchainCount); - m_VertexBufferCache.DestroyFrameData(SwapchainCount); - for(auto &ImageBufferCache : m_ImageBufferCaches) - ImageBufferCache.second.DestroyFrameData(SwapchainCount); - - if(IsLastCleanup) - { - m_StagingBufferCache.Destroy(m_VKDevice); - m_StagingBufferCacheImage.Destroy(m_VKDevice); - m_VertexBufferCache.Destroy(m_VKDevice); - for(auto &ImageBufferCache : m_ImageBufferCaches) - ImageBufferCache.second.Destroy(m_VKDevice); - - m_ImageBufferCaches.clear(); - - DestroyTextureSamplers(); - DestroyDescriptorPools(); - - DeletePresentedImageDataImage(); - } - - DestroySyncObjects(); - DestroyCommandBuffer(); - - if(IsLastCleanup) - { - DestroyCommandPool(); - } - - if(IsLastCleanup) - { - DestroyUniformDescriptorSetLayouts(); - DestroyTextDescriptorSetLayout(); - DestroyDescriptorSetLayouts(); - } - } - - void CleanupVulkanSDL() - { - if(m_VKInstance != VK_NULL_HANDLE) - { - DestroySurface(); - vkDestroyDevice(m_VKDevice, nullptr); - - if(g_Config.m_DbgGfx == DEBUG_GFX_MODE_MINIMUM || g_Config.m_DbgGfx == DEBUG_GFX_MODE_ALL) - { - UnregisterDebugCallback(); - } - vkDestroyInstance(m_VKInstance, nullptr); - m_VKInstance = VK_NULL_HANDLE; - } - } - - int RecreateSwapChain() - { - int Ret = 0; - vkDeviceWaitIdle(m_VKDevice); - - if(IsVerbose()) - { - dbg_msg("vulkan", "recreating swap chain."); - } - - VkSwapchainKHR OldSwapChain = VK_NULL_HANDLE; - uint32_t OldSwapChainImageCount = m_SwapChainImageCount; - - if(m_SwapchainCreated) - CleanupVulkanSwapChain(false); - - // set new multi sampling if it was requested - if(m_NextMultiSamplingCount != std::numeric_limits::max()) - { - m_MultiSamplingCount = m_NextMultiSamplingCount; - m_NextMultiSamplingCount = std::numeric_limits::max(); - } - - if(!m_SwapchainCreated) - Ret = InitVulkanSwapChain(OldSwapChain); - - if(OldSwapChainImageCount != m_SwapChainImageCount) - { - CleanupVulkan(OldSwapChainImageCount); - InitVulkan(); - } - - if(OldSwapChain != VK_NULL_HANDLE) - { - vkDestroySwapchainKHR(m_VKDevice, OldSwapChain, nullptr); - } - - if(Ret != 0 && IsVerbose()) - { - dbg_msg("vulkan", "recreating swap chain failed."); - } - - return Ret; - } - - int InitVulkanSDL(SDL_Window *pWindow, uint32_t CanvasWidth, uint32_t CanvasHeight, char *pRendererString, char *pVendorString, char *pVersionString) - { - std::vector vVKExtensions; - std::vector vVKLayers; - - m_CanvasWidth = CanvasWidth; - m_CanvasHeight = CanvasHeight; - - if(!GetVulkanExtensions(pWindow, vVKExtensions)) - return -1; - - if(!GetVulkanLayers(vVKLayers)) - return -1; - - if(!CreateVulkanInstance(vVKLayers, vVKExtensions, true)) - return -1; - - if(g_Config.m_DbgGfx == DEBUG_GFX_MODE_MINIMUM || g_Config.m_DbgGfx == DEBUG_GFX_MODE_ALL) - { - SetupDebugCallback(); - - for(auto &VKLayer : vVKLayers) - { - dbg_msg("vulkan", "Validation layer: %s", VKLayer.c_str()); - } - } - - if(!SelectGpu(pRendererString, pVendorString, pVersionString)) - return -1; - - if(!CreateLogicalDevice(vVKLayers)) - return -1; - - GetDeviceQueue(); - - if(!CreateSurface(pWindow)) - return -1; - - return 0; - } - - /************************ - * MEMORY MANAGEMENT - ************************/ - - uint32_t FindMemoryType(VkPhysicalDevice PhyDevice, uint32_t TypeFilter, VkMemoryPropertyFlags Properties) - { - VkPhysicalDeviceMemoryProperties MemProperties; - vkGetPhysicalDeviceMemoryProperties(PhyDevice, &MemProperties); - - for(uint32_t i = 0; i < MemProperties.memoryTypeCount; i++) - { - if((TypeFilter & (1 << i)) && (MemProperties.memoryTypes[i].propertyFlags & Properties) == Properties) - { - return i; - } - } - - return 0; - } - - [[nodiscard]] bool CreateBuffer(VkDeviceSize BufferSize, EMemoryBlockUsage MemUsage, VkBufferUsageFlags BufferUsage, VkMemoryPropertyFlags MemoryProperties, VkBuffer &VKBuffer, SDeviceMemoryBlock &VKBufferMemory) - { - VkBufferCreateInfo BufferInfo{}; - BufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; - BufferInfo.size = BufferSize; - BufferInfo.usage = BufferUsage; - BufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - - if(vkCreateBuffer(m_VKDevice, &BufferInfo, nullptr, &VKBuffer) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_OUT_OF_MEMORY_BUFFER, "Buffer creation failed.", - GetMemoryUsageShort()); - return false; - } - - VkMemoryRequirements MemRequirements; - vkGetBufferMemoryRequirements(m_VKDevice, VKBuffer, &MemRequirements); - - VkMemoryAllocateInfo MemAllocInfo{}; - MemAllocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; - MemAllocInfo.allocationSize = MemRequirements.size; - MemAllocInfo.memoryTypeIndex = FindMemoryType(m_VKGPU, MemRequirements.memoryTypeBits, MemoryProperties); - - VKBufferMemory.m_Size = MemRequirements.size; - - if(MemUsage == MEMORY_BLOCK_USAGE_BUFFER) - m_pBufferMemoryUsage->store(m_pBufferMemoryUsage->load(std::memory_order_relaxed) + MemRequirements.size, std::memory_order_relaxed); - else if(MemUsage == MEMORY_BLOCK_USAGE_STAGING) - m_pStagingMemoryUsage->store(m_pStagingMemoryUsage->load(std::memory_order_relaxed) + MemRequirements.size, std::memory_order_relaxed); - else if(MemUsage == MEMORY_BLOCK_USAGE_STREAM) - m_pStreamMemoryUsage->store(m_pStreamMemoryUsage->load(std::memory_order_relaxed) + MemRequirements.size, std::memory_order_relaxed); - - if(IsVerbose()) - { - VerboseAllocatedMemory(MemRequirements.size, m_CurImageIndex, MemUsage); - } - - if(!AllocateVulkanMemory(&MemAllocInfo, &VKBufferMemory.m_Mem)) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_OUT_OF_MEMORY_BUFFER, "Allocation for buffer object failed.", - GetMemoryUsageShort()); - return false; - } - - VKBufferMemory.m_UsageType = MemUsage; - - if(vkBindBufferMemory(m_VKDevice, VKBuffer, VKBufferMemory.m_Mem, 0) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_OUT_OF_MEMORY_BUFFER, "Binding memory to buffer failed.", - GetMemoryUsageShort()); - return false; - } - - return true; - } - - [[nodiscard]] bool AllocateDescriptorPool(SDeviceDescriptorPools &DescriptorPools, size_t AllocPoolSize) - { - SDeviceDescriptorPool NewPool; - NewPool.m_Size = AllocPoolSize; - - VkDescriptorPoolSize PoolSize{}; - if(DescriptorPools.m_IsUniformPool) - PoolSize.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - else - PoolSize.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - PoolSize.descriptorCount = AllocPoolSize; - - VkDescriptorPoolCreateInfo PoolInfo{}; - PoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; - PoolInfo.poolSizeCount = 1; - PoolInfo.pPoolSizes = &PoolSize; - PoolInfo.maxSets = AllocPoolSize; - PoolInfo.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; - - if(vkCreateDescriptorPool(m_VKDevice, &PoolInfo, nullptr, &NewPool.m_Pool) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_INIT, "Creating the descriptor pool failed."); - return false; - } - - DescriptorPools.m_vPools.push_back(NewPool); - - return true; - } - - [[nodiscard]] bool CreateDescriptorPools() - { - m_StandardTextureDescrPool.m_IsUniformPool = false; - m_StandardTextureDescrPool.m_DefaultAllocSize = 1024; - m_TextTextureDescrPool.m_IsUniformPool = false; - m_TextTextureDescrPool.m_DefaultAllocSize = 8; - - m_vUniformBufferDescrPools.resize(m_ThreadCount); - for(auto &UniformBufferDescrPool : m_vUniformBufferDescrPools) - { - UniformBufferDescrPool.m_IsUniformPool = true; - UniformBufferDescrPool.m_DefaultAllocSize = 512; - } - - bool Ret = AllocateDescriptorPool(m_StandardTextureDescrPool, CCommandBuffer::MAX_TEXTURES); - Ret |= AllocateDescriptorPool(m_TextTextureDescrPool, 8); - - for(auto &UniformBufferDescrPool : m_vUniformBufferDescrPools) - { - Ret |= AllocateDescriptorPool(UniformBufferDescrPool, 64); - } - - return Ret; - } - - void DestroyDescriptorPools() - { - for(auto &DescrPool : m_StandardTextureDescrPool.m_vPools) - vkDestroyDescriptorPool(m_VKDevice, DescrPool.m_Pool, nullptr); - for(auto &DescrPool : m_TextTextureDescrPool.m_vPools) - vkDestroyDescriptorPool(m_VKDevice, DescrPool.m_Pool, nullptr); - - for(auto &UniformBufferDescrPool : m_vUniformBufferDescrPools) - { - for(auto &DescrPool : UniformBufferDescrPool.m_vPools) - vkDestroyDescriptorPool(m_VKDevice, DescrPool.m_Pool, nullptr); - } - m_vUniformBufferDescrPools.clear(); - } - - [[nodiscard]] bool GetDescriptorPoolForAlloc(VkDescriptorPool &RetDescr, SDeviceDescriptorPools &DescriptorPools, SDeviceDescriptorSet *pSets, size_t AllocNum) - { - size_t CurAllocNum = AllocNum; - size_t CurAllocOffset = 0; - RetDescr = VK_NULL_HANDLE; - - while(CurAllocNum > 0) - { - size_t AllocatedInThisRun = 0; - - bool Found = false; - size_t DescriptorPoolIndex = std::numeric_limits::max(); - for(size_t i = 0; i < DescriptorPools.m_vPools.size(); ++i) - { - auto &Pool = DescriptorPools.m_vPools[i]; - if(Pool.m_CurSize + CurAllocNum < Pool.m_Size) - { - AllocatedInThisRun = CurAllocNum; - Pool.m_CurSize += CurAllocNum; - Found = true; - if(RetDescr == VK_NULL_HANDLE) - RetDescr = Pool.m_Pool; - DescriptorPoolIndex = i; - break; - } - else - { - size_t RemainingPoolCount = Pool.m_Size - Pool.m_CurSize; - if(RemainingPoolCount > 0) - { - AllocatedInThisRun = RemainingPoolCount; - Pool.m_CurSize += RemainingPoolCount; - Found = true; - if(RetDescr == VK_NULL_HANDLE) - RetDescr = Pool.m_Pool; - DescriptorPoolIndex = i; - break; - } - } - } - - if(!Found) - { - DescriptorPoolIndex = DescriptorPools.m_vPools.size(); - - if(!AllocateDescriptorPool(DescriptorPools, DescriptorPools.m_DefaultAllocSize)) - return false; - - AllocatedInThisRun = minimum((size_t)DescriptorPools.m_DefaultAllocSize, CurAllocNum); - - auto &Pool = DescriptorPools.m_vPools.back(); - Pool.m_CurSize += AllocatedInThisRun; - if(RetDescr == VK_NULL_HANDLE) - RetDescr = Pool.m_Pool; - } - - for(size_t i = CurAllocOffset; i < CurAllocOffset + AllocatedInThisRun; ++i) - { - pSets[i].m_pPools = &DescriptorPools; - pSets[i].m_PoolIndex = DescriptorPoolIndex; - } - CurAllocOffset += AllocatedInThisRun; - CurAllocNum -= AllocatedInThisRun; - } - - return true; - } - - void FreeDescriptorSetFromPool(SDeviceDescriptorSet &DescrSet) - { - if(DescrSet.m_PoolIndex != std::numeric_limits::max()) - { - vkFreeDescriptorSets(m_VKDevice, DescrSet.m_pPools->m_vPools[DescrSet.m_PoolIndex].m_Pool, 1, &DescrSet.m_Descriptor); - DescrSet.m_pPools->m_vPools[DescrSet.m_PoolIndex].m_CurSize -= 1; - } - } - - [[nodiscard]] bool CreateNewTexturedStandardDescriptorSets(size_t TextureSlot, size_t DescrIndex) - { - auto &Texture = m_vTextures[TextureSlot]; - - auto &DescrSet = Texture.m_aVKStandardTexturedDescrSets[DescrIndex]; - - VkDescriptorSetAllocateInfo DesAllocInfo{}; - DesAllocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - if(!GetDescriptorPoolForAlloc(DesAllocInfo.descriptorPool, m_StandardTextureDescrPool, &DescrSet, 1)) - return false; - DesAllocInfo.descriptorSetCount = 1; - DesAllocInfo.pSetLayouts = &m_StandardTexturedDescriptorSetLayout; - - if(vkAllocateDescriptorSets(m_VKDevice, &DesAllocInfo, &DescrSet.m_Descriptor) != VK_SUCCESS) - { - return false; - } - - VkDescriptorImageInfo ImageInfo{}; - ImageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - ImageInfo.imageView = Texture.m_ImgView; - ImageInfo.sampler = Texture.m_aSamplers[DescrIndex]; - - std::array aDescriptorWrites{}; - - aDescriptorWrites[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - aDescriptorWrites[0].dstSet = DescrSet.m_Descriptor; - aDescriptorWrites[0].dstBinding = 0; - aDescriptorWrites[0].dstArrayElement = 0; - aDescriptorWrites[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - aDescriptorWrites[0].descriptorCount = 1; - aDescriptorWrites[0].pImageInfo = &ImageInfo; - - vkUpdateDescriptorSets(m_VKDevice, static_cast(aDescriptorWrites.size()), aDescriptorWrites.data(), 0, nullptr); - - return true; - } - - void DestroyTexturedStandardDescriptorSets(CTexture &Texture, size_t DescrIndex) - { - auto &DescrSet = Texture.m_aVKStandardTexturedDescrSets[DescrIndex]; - FreeDescriptorSetFromPool(DescrSet); - DescrSet = {}; - } - - [[nodiscard]] bool CreateNew3DTexturedStandardDescriptorSets(size_t TextureSlot) - { - auto &Texture = m_vTextures[TextureSlot]; - - auto &DescrSet = Texture.m_VKStandard3DTexturedDescrSet; - - VkDescriptorSetAllocateInfo DesAllocInfo{}; - DesAllocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - if(!GetDescriptorPoolForAlloc(DesAllocInfo.descriptorPool, m_StandardTextureDescrPool, &DescrSet, 1)) - return false; - DesAllocInfo.descriptorSetCount = 1; - DesAllocInfo.pSetLayouts = &m_Standard3DTexturedDescriptorSetLayout; - - if(vkAllocateDescriptorSets(m_VKDevice, &DesAllocInfo, &DescrSet.m_Descriptor) != VK_SUCCESS) - { - return false; - } - - VkDescriptorImageInfo ImageInfo{}; - ImageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - ImageInfo.imageView = Texture.m_Img3DView; - ImageInfo.sampler = Texture.m_Sampler3D; - - std::array aDescriptorWrites{}; - - aDescriptorWrites[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - aDescriptorWrites[0].dstSet = DescrSet.m_Descriptor; - aDescriptorWrites[0].dstBinding = 0; - aDescriptorWrites[0].dstArrayElement = 0; - aDescriptorWrites[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - aDescriptorWrites[0].descriptorCount = 1; - aDescriptorWrites[0].pImageInfo = &ImageInfo; - - vkUpdateDescriptorSets(m_VKDevice, static_cast(aDescriptorWrites.size()), aDescriptorWrites.data(), 0, nullptr); - - return true; - } - - void DestroyTextured3DStandardDescriptorSets(CTexture &Texture) - { - auto &DescrSet = Texture.m_VKStandard3DTexturedDescrSet; - FreeDescriptorSetFromPool(DescrSet); - } - - [[nodiscard]] bool CreateNewTextDescriptorSets(size_t Texture, size_t TextureOutline) - { - auto &TextureText = m_vTextures[Texture]; - auto &TextureTextOutline = m_vTextures[TextureOutline]; - auto &DescrSetText = TextureText.m_VKTextDescrSet; - - VkDescriptorSetAllocateInfo DesAllocInfo{}; - DesAllocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - if(!GetDescriptorPoolForAlloc(DesAllocInfo.descriptorPool, m_TextTextureDescrPool, &DescrSetText, 1)) - return false; - DesAllocInfo.descriptorSetCount = 1; - DesAllocInfo.pSetLayouts = &m_TextDescriptorSetLayout; - - if(vkAllocateDescriptorSets(m_VKDevice, &DesAllocInfo, &DescrSetText.m_Descriptor) != VK_SUCCESS) - { - return false; - } - - std::array aImageInfo{}; - aImageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - aImageInfo[0].imageView = TextureText.m_ImgView; - aImageInfo[0].sampler = TextureText.m_aSamplers[0]; - aImageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - aImageInfo[1].imageView = TextureTextOutline.m_ImgView; - aImageInfo[1].sampler = TextureTextOutline.m_aSamplers[0]; - - std::array aDescriptorWrites{}; - - aDescriptorWrites[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - aDescriptorWrites[0].dstSet = DescrSetText.m_Descriptor; - aDescriptorWrites[0].dstBinding = 0; - aDescriptorWrites[0].dstArrayElement = 0; - aDescriptorWrites[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - aDescriptorWrites[0].descriptorCount = 1; - aDescriptorWrites[0].pImageInfo = aImageInfo.data(); - aDescriptorWrites[1] = aDescriptorWrites[0]; - aDescriptorWrites[1].dstBinding = 1; - aDescriptorWrites[1].pImageInfo = &aImageInfo[1]; - - vkUpdateDescriptorSets(m_VKDevice, static_cast(aDescriptorWrites.size()), aDescriptorWrites.data(), 0, nullptr); - - return true; - } - - void DestroyTextDescriptorSets(CTexture &Texture, CTexture &TextureOutline) - { - auto &DescrSet = Texture.m_VKTextDescrSet; - FreeDescriptorSetFromPool(DescrSet); - } - - [[nodiscard]] bool HasMultiSampling() const - { - return GetSampleCount() != VK_SAMPLE_COUNT_1_BIT; - } - - VkSampleCountFlagBits GetMaxSampleCount() const - { - if(m_MaxMultiSample & VK_SAMPLE_COUNT_64_BIT) - return VK_SAMPLE_COUNT_64_BIT; - else if(m_MaxMultiSample & VK_SAMPLE_COUNT_32_BIT) - return VK_SAMPLE_COUNT_32_BIT; - else if(m_MaxMultiSample & VK_SAMPLE_COUNT_16_BIT) - return VK_SAMPLE_COUNT_16_BIT; - else if(m_MaxMultiSample & VK_SAMPLE_COUNT_8_BIT) - return VK_SAMPLE_COUNT_8_BIT; - else if(m_MaxMultiSample & VK_SAMPLE_COUNT_4_BIT) - return VK_SAMPLE_COUNT_4_BIT; - else if(m_MaxMultiSample & VK_SAMPLE_COUNT_2_BIT) - return VK_SAMPLE_COUNT_2_BIT; - - return VK_SAMPLE_COUNT_1_BIT; - } - - VkSampleCountFlagBits GetSampleCount() const - { - auto MaxSampleCount = GetMaxSampleCount(); - if(m_MultiSamplingCount >= 64 && MaxSampleCount >= VK_SAMPLE_COUNT_64_BIT) - return VK_SAMPLE_COUNT_64_BIT; - else if(m_MultiSamplingCount >= 32 && MaxSampleCount >= VK_SAMPLE_COUNT_32_BIT) - return VK_SAMPLE_COUNT_32_BIT; - else if(m_MultiSamplingCount >= 16 && MaxSampleCount >= VK_SAMPLE_COUNT_16_BIT) - return VK_SAMPLE_COUNT_16_BIT; - else if(m_MultiSamplingCount >= 8 && MaxSampleCount >= VK_SAMPLE_COUNT_8_BIT) - return VK_SAMPLE_COUNT_8_BIT; - else if(m_MultiSamplingCount >= 4 && MaxSampleCount >= VK_SAMPLE_COUNT_4_BIT) - return VK_SAMPLE_COUNT_4_BIT; - else if(m_MultiSamplingCount >= 2 && MaxSampleCount >= VK_SAMPLE_COUNT_2_BIT) - return VK_SAMPLE_COUNT_2_BIT; - - return VK_SAMPLE_COUNT_1_BIT; - } - - int InitVulkanSwapChain(VkSwapchainKHR &OldSwapChain) - { - OldSwapChain = VK_NULL_HANDLE; - if(!CreateSwapChain(OldSwapChain)) - return -1; - - if(!GetSwapChainImageHandles()) - return -1; - - if(!CreateImageViews()) - return -1; - - if(!CreateMultiSamplerImageAttachments()) - { - return -1; - } - - m_LastPresentedSwapChainImageIndex = std::numeric_limits::max(); - - if(!CreateRenderPass(true)) - return -1; - - if(!CreateFramebuffers()) - return -1; - - if(!CreateStandardGraphicsPipeline("shader/vulkan/prim.vert.spv", "shader/vulkan/prim.frag.spv", false, false)) - return -1; - - if(!CreateStandardGraphicsPipeline("shader/vulkan/prim_textured.vert.spv", "shader/vulkan/prim_textured.frag.spv", true, false)) - return -1; - - if(!CreateStandardGraphicsPipeline("shader/vulkan/prim.vert.spv", "shader/vulkan/prim.frag.spv", false, true)) - return -1; - - if(!CreateStandard3DGraphicsPipeline("shader/vulkan/prim3d.vert.spv", "shader/vulkan/prim3d.frag.spv", false)) - return -1; - - if(!CreateStandard3DGraphicsPipeline("shader/vulkan/prim3d_textured.vert.spv", "shader/vulkan/prim3d_textured.frag.spv", true)) - return -1; - - if(!CreateTextGraphicsPipeline("shader/vulkan/text.vert.spv", "shader/vulkan/text.frag.spv")) - return -1; - - if(!CreateTileGraphicsPipeline("shader/vulkan/tile.vert.spv", "shader/vulkan/tile.frag.spv", false)) - return -1; - - if(!CreateTileGraphicsPipeline("shader/vulkan/tile_textured.vert.spv", "shader/vulkan/tile_textured.frag.spv", false)) - return -1; - - if(!CreateTileGraphicsPipeline("shader/vulkan/tile_border.vert.spv", "shader/vulkan/tile_border.frag.spv", true)) - return -1; - - if(!CreateTileGraphicsPipeline("shader/vulkan/tile_border_textured.vert.spv", "shader/vulkan/tile_border_textured.frag.spv", true)) - return -1; - - if(!CreatePrimExGraphicsPipeline("shader/vulkan/primex_rotationless.vert.spv", "shader/vulkan/primex_rotationless.frag.spv", false, true)) - return -1; - - if(!CreatePrimExGraphicsPipeline("shader/vulkan/primex_tex_rotationless.vert.spv", "shader/vulkan/primex_tex_rotationless.frag.spv", true, true)) - return -1; - - if(!CreatePrimExGraphicsPipeline("shader/vulkan/primex.vert.spv", "shader/vulkan/primex.frag.spv", false, false)) - return -1; - - if(!CreatePrimExGraphicsPipeline("shader/vulkan/primex_tex.vert.spv", "shader/vulkan/primex_tex.frag.spv", true, false)) - return -1; - - if(!CreateSpriteMultiGraphicsPipeline("shader/vulkan/spritemulti.vert.spv", "shader/vulkan/spritemulti.frag.spv")) - return -1; - - if(!CreateSpriteMultiPushGraphicsPipeline("shader/vulkan/spritemulti_push.vert.spv", "shader/vulkan/spritemulti_push.frag.spv")) - return -1; - - if(!CreateQuadGraphicsPipeline("shader/vulkan/quad.vert.spv", "shader/vulkan/quad.frag.spv")) - return -1; - - if(!CreateQuadGraphicsPipeline("shader/vulkan/quad_textured.vert.spv", "shader/vulkan/quad_textured.frag.spv")) - return -1; - - if(!CreateQuadPushGraphicsPipeline("shader/vulkan/quad_push.vert.spv", "shader/vulkan/quad_push.frag.spv")) - return -1; - - if(!CreateQuadPushGraphicsPipeline("shader/vulkan/quad_push_textured.vert.spv", "shader/vulkan/quad_push_textured.frag.spv")) - return -1; - - m_SwapchainCreated = true; - return 0; - } - - template - int InitVulkan() - { - if(IsFirstInitialization) - { - if(!CreateDescriptorSetLayouts()) - return -1; - - if(!CreateTextDescriptorSetLayout()) - return -1; - - if(!CreateSpriteMultiUniformDescriptorSetLayout()) - return -1; - - if(!CreateQuadUniformDescriptorSetLayout()) - return -1; - - VkSwapchainKHR OldSwapChain = VK_NULL_HANDLE; - if(InitVulkanSwapChain(OldSwapChain) != 0) - return -1; - } - - if(IsFirstInitialization) - { - if(!CreateCommandPool()) - return -1; - } - - if(!CreateCommandBuffers()) - return -1; - - if(!CreateSyncObjects()) - return -1; - - if(IsFirstInitialization) - { - if(!CreateDescriptorPools()) - return -1; - - if(!CreateTextureSamplers()) - return -1; - } - - m_vStreamedVertexBuffers.resize(m_ThreadCount); - m_vStreamedUniformBuffers.resize(m_ThreadCount); - for(size_t i = 0; i < m_ThreadCount; ++i) - { - m_vStreamedVertexBuffers[i].Init(m_SwapChainImageCount); - m_vStreamedUniformBuffers[i].Init(m_SwapChainImageCount); - } - - m_vLastPipeline.resize(m_ThreadCount, VK_NULL_HANDLE); - - m_vvFrameDelayedBufferCleanup.resize(m_SwapChainImageCount); - m_vvFrameDelayedTextureCleanup.resize(m_SwapChainImageCount); - m_vvFrameDelayedTextTexturesCleanup.resize(m_SwapChainImageCount); - m_StagingBufferCache.Init(m_SwapChainImageCount); - m_StagingBufferCacheImage.Init(m_SwapChainImageCount); - m_VertexBufferCache.Init(m_SwapChainImageCount); - for(auto &ImageBufferCache : m_ImageBufferCaches) - ImageBufferCache.second.Init(m_SwapChainImageCount); - - m_vImageLastFrameCheck.resize(m_SwapChainImageCount, 0); - - if(IsFirstInitialization) - { - // check if image format supports linear blitting - VkFormatProperties FormatProperties; - vkGetPhysicalDeviceFormatProperties(m_VKGPU, VK_FORMAT_R8G8B8A8_UNORM, &FormatProperties); - if((FormatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) != 0) - { - m_AllowsLinearBlitting = true; - } - if((FormatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_BLIT_SRC_BIT) != 0 && (FormatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_BLIT_DST_BIT) != 0) - { - m_OptimalRGBAImageBlitting = true; - } - // check if image format supports blitting to linear tiled images - if((FormatProperties.linearTilingFeatures & VK_FORMAT_FEATURE_BLIT_DST_BIT) != 0) - { - m_LinearRGBAImageBlitting = true; - } - - vkGetPhysicalDeviceFormatProperties(m_VKGPU, m_VKSurfFormat.format, &FormatProperties); - if((FormatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_BLIT_SRC_BIT) != 0) - { - m_OptimalSwapChainImageBlitting = true; - } - } - - return 0; - } - - [[nodiscard]] bool GetMemoryCommandBuffer(VkCommandBuffer *&pMemCommandBuffer) - { - auto &MemCommandBuffer = m_vMemoryCommandBuffers[m_CurImageIndex]; - if(!m_vUsedMemoryCommandBuffer[m_CurImageIndex]) - { - m_vUsedMemoryCommandBuffer[m_CurImageIndex] = true; - - vkResetCommandBuffer(MemCommandBuffer, VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT); - - VkCommandBufferBeginInfo BeginInfo{}; - BeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - BeginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - if(vkBeginCommandBuffer(MemCommandBuffer, &BeginInfo) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_RENDER_RECORDING, "Command buffer cannot be filled anymore."); - return false; - } - } - pMemCommandBuffer = &MemCommandBuffer; - return true; - } - - [[nodiscard]] bool GetGraphicCommandBuffer(VkCommandBuffer *&pDrawCommandBuffer, size_t RenderThreadIndex) - { - if(m_ThreadCount < 2) - { - pDrawCommandBuffer = &m_vMainDrawCommandBuffers[m_CurImageIndex]; - return true; - } - else - { - auto &DrawCommandBuffer = m_vvThreadDrawCommandBuffers[RenderThreadIndex][m_CurImageIndex]; - if(!m_vvUsedThreadDrawCommandBuffer[RenderThreadIndex][m_CurImageIndex]) - { - m_vvUsedThreadDrawCommandBuffer[RenderThreadIndex][m_CurImageIndex] = true; - - vkResetCommandBuffer(DrawCommandBuffer, VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT); - - VkCommandBufferBeginInfo BeginInfo{}; - BeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - BeginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT; - - VkCommandBufferInheritanceInfo InheretInfo{}; - InheretInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO; - InheretInfo.framebuffer = m_vFramebufferList[m_CurImageIndex]; - InheretInfo.occlusionQueryEnable = VK_FALSE; - InheretInfo.renderPass = m_VKRenderPass; - InheretInfo.subpass = 0; - - BeginInfo.pInheritanceInfo = &InheretInfo; - - if(vkBeginCommandBuffer(DrawCommandBuffer, &BeginInfo) != VK_SUCCESS) - { - SetError(EGfxErrorType::GFX_ERROR_TYPE_RENDER_RECORDING, "Thread draw command buffer cannot be filled anymore."); - return false; - } - } - pDrawCommandBuffer = &DrawCommandBuffer; - return true; - } - } - - VkCommandBuffer &GetMainGraphicCommandBuffer() - { - return m_vMainDrawCommandBuffers[m_CurImageIndex]; - } - - /************************ - * STREAM BUFFERS SETUP - ************************/ - - typedef std::function TNewMemFunc; - - // returns true, if the stream memory was just allocated - template - [[nodiscard]] bool CreateStreamBuffer(TStreamMemName *&pBufferMem, TNewMemFunc &&NewMemFunc, SStreamMemory &StreamUniformBuffer, VkBufferUsageFlagBits Usage, VkBuffer &NewBuffer, SDeviceMemoryBlock &NewBufferMem, size_t &BufferOffset, const void *pData, size_t DataSize) - { - VkBuffer Buffer = VK_NULL_HANDLE; - SDeviceMemoryBlock BufferMem; - size_t Offset = 0; - - uint8_t *pMem = nullptr; - - size_t it = 0; - if(UsesCurrentCountOffset) - it = StreamUniformBuffer.GetUsedCount(m_CurImageIndex); - for(; it < StreamUniformBuffer.GetBuffers(m_CurImageIndex).size(); ++it) - { - auto &BufferOfFrame = StreamUniformBuffer.GetBuffers(m_CurImageIndex)[it]; - if(BufferOfFrame.m_Size >= DataSize + BufferOfFrame.m_UsedSize) - { - if(BufferOfFrame.m_UsedSize == 0) - StreamUniformBuffer.IncreaseUsedCount(m_CurImageIndex); - Buffer = BufferOfFrame.m_Buffer; - BufferMem = BufferOfFrame.m_BufferMem; - Offset = BufferOfFrame.m_UsedSize; - BufferOfFrame.m_UsedSize += DataSize; - pMem = BufferOfFrame.m_pMappedBufferData; - pBufferMem = &BufferOfFrame; - break; - } - } - - if(BufferMem.m_Mem == VK_NULL_HANDLE) - { - // create memory - VkBuffer StreamBuffer; - SDeviceMemoryBlock StreamBufferMemory; - const VkDeviceSize NewBufferSingleSize = sizeof(TInstanceTypeName) * InstanceTypeCount; - const VkDeviceSize NewBufferSize = NewBufferSingleSize * BufferCreateCount; - if(!CreateBuffer(NewBufferSize, MEMORY_BLOCK_USAGE_STREAM, Usage, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT, StreamBuffer, StreamBufferMemory)) - return false; - - void *pMappedData = nullptr; - vkMapMemory(m_VKDevice, StreamBufferMemory.m_Mem, 0, VK_WHOLE_SIZE, 0, &pMappedData); - - size_t NewBufferIndex = StreamUniformBuffer.GetBuffers(m_CurImageIndex).size(); - for(size_t i = 0; i < BufferCreateCount; ++i) - { - StreamUniformBuffer.GetBuffers(m_CurImageIndex).push_back(TStreamMemName(StreamBuffer, StreamBufferMemory, NewBufferSingleSize * i, NewBufferSingleSize, 0, ((uint8_t *)pMappedData) + (NewBufferSingleSize * i))); - StreamUniformBuffer.GetRanges(m_CurImageIndex).push_back({}); - if(!NewMemFunc(StreamUniformBuffer.GetBuffers(m_CurImageIndex).back(), StreamBuffer, NewBufferSingleSize * i)) - return false; - } - auto &NewStreamBuffer = StreamUniformBuffer.GetBuffers(m_CurImageIndex)[NewBufferIndex]; - - Buffer = StreamBuffer; - BufferMem = StreamBufferMemory; - - pBufferMem = &NewStreamBuffer; - pMem = NewStreamBuffer.m_pMappedBufferData; - Offset = NewStreamBuffer.m_OffsetInBuffer; - NewStreamBuffer.m_UsedSize += DataSize; - - StreamUniformBuffer.IncreaseUsedCount(m_CurImageIndex); - } - - { - mem_copy(pMem + Offset, pData, DataSize); - } - - NewBuffer = Buffer; - NewBufferMem = BufferMem; - BufferOffset = Offset; - - return true; - } - - [[nodiscard]] bool CreateStreamVertexBuffer(size_t RenderThreadIndex, VkBuffer &NewBuffer, SDeviceMemoryBlock &NewBufferMem, size_t &BufferOffset, const void *pData, size_t DataSize) - { - SFrameBuffers *pStreamBuffer; - return CreateStreamBuffer( - pStreamBuffer, [](SFrameBuffers &, VkBuffer, VkDeviceSize) { return true; }, m_vStreamedVertexBuffers[RenderThreadIndex], VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, NewBuffer, NewBufferMem, BufferOffset, pData, DataSize); - } - - template - [[nodiscard]] bool GetUniformBufferObjectImpl(size_t RenderThreadIndex, bool RequiresSharedStagesDescriptor, SStreamMemory &StreamUniformBuffer, SDeviceDescriptorSet &DescrSet, const void *pData, size_t DataSize) - { - VkBuffer NewBuffer; - SDeviceMemoryBlock NewBufferMem; - size_t BufferOffset; - SFrameUniformBuffers *pMem; - if(!CreateStreamBuffer( - pMem, - [this, RenderThreadIndex](SFrameBuffers &Mem, VkBuffer Buffer, VkDeviceSize MemOffset) { - if(!CreateUniformDescriptorSets(RenderThreadIndex, m_SpriteMultiUniformDescriptorSetLayout, ((SFrameUniformBuffers *)(&Mem))->m_aUniformSets.data(), 1, Buffer, InstanceMaxParticleCount * sizeof(TName), MemOffset)) - return false; - if(!CreateUniformDescriptorSets(RenderThreadIndex, m_QuadUniformDescriptorSetLayout, &((SFrameUniformBuffers *)(&Mem))->m_aUniformSets[1], 1, Buffer, InstanceMaxParticleCount * sizeof(TName), MemOffset)) - return false; - return true; - }, - StreamUniformBuffer, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, NewBuffer, NewBufferMem, BufferOffset, pData, DataSize)) - return false; - - DescrSet = pMem->m_aUniformSets[RequiresSharedStagesDescriptor ? 1 : 0]; - return true; - } - - [[nodiscard]] bool GetUniformBufferObject(size_t RenderThreadIndex, bool RequiresSharedStagesDescriptor, SDeviceDescriptorSet &DescrSet, size_t ParticleCount, const void *pData, size_t DataSize) - { - return GetUniformBufferObjectImpl(RenderThreadIndex, RequiresSharedStagesDescriptor, m_vStreamedUniformBuffers[RenderThreadIndex], DescrSet, pData, DataSize); - } - - [[nodiscard]] bool CreateIndexBuffer(void *pData, size_t DataSize, VkBuffer &Buffer, SDeviceMemoryBlock &Memory) - { - VkDeviceSize BufferDataSize = DataSize; - - SMemoryBlock StagingBuffer; - if(!GetStagingBuffer(StagingBuffer, pData, DataSize)) - return false; - - SDeviceMemoryBlock VertexBufferMemory; - VkBuffer VertexBuffer; - if(!CreateBuffer(BufferDataSize, MEMORY_BLOCK_USAGE_BUFFER, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VertexBuffer, VertexBufferMemory)) - return false; - - if(!MemoryBarrier(VertexBuffer, 0, BufferDataSize, VK_ACCESS_INDEX_READ_BIT, true)) - return false; - if(!CopyBuffer(StagingBuffer.m_Buffer, VertexBuffer, StagingBuffer.m_HeapData.m_OffsetToAlign, 0, BufferDataSize)) - return false; - if(!MemoryBarrier(VertexBuffer, 0, BufferDataSize, VK_ACCESS_INDEX_READ_BIT, false)) - return false; - - UploadAndFreeStagingMemBlock(StagingBuffer); - - Buffer = VertexBuffer; - Memory = VertexBufferMemory; - return true; - } - - void DestroyIndexBuffer(VkBuffer &Buffer, SDeviceMemoryBlock &Memory) - { - CleanBufferPair(0, Buffer, Memory); - } - - /************************ - * COMMAND IMPLEMENTATION - ************************/ - template - [[nodiscard]] static bool IsInCommandRange(TName CMD, TName Min, TName Max) - { - return CMD >= Min && CMD < Max; - } - - [[nodiscard]] ERunCommandReturnTypes RunCommand(const CCommandBuffer::SCommand *pBaseCommand) override - { - if(m_HasError) - { - // ignore all further commands - return ERunCommandReturnTypes::RUN_COMMAND_COMMAND_ERROR; - } - - if(IsInCommandRangem_Cmd)>(pBaseCommand->m_Cmd, CCommandBuffer::CMD_FIRST, CCommandBuffer::CMD_COUNT)) - { - auto &CallbackObj = m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::ECommandBufferCMD(pBaseCommand->m_Cmd))]; - SRenderCommandExecuteBuffer Buffer; - Buffer.m_Command = (CCommandBuffer::ECommandBufferCMD)pBaseCommand->m_Cmd; - Buffer.m_pRawCommand = pBaseCommand; - Buffer.m_ThreadIndex = 0; - - if(m_CurCommandInPipe + 1 == m_CommandsInPipe) - { - m_LastCommandsInPipeThreadIndex = std::numeric_limits::max(); - } - - bool CanStartThread = false; - if(CallbackObj.m_IsRenderCommand) - { - bool ForceSingleThread = m_LastCommandsInPipeThreadIndex == std::numeric_limits::max(); - - size_t PotentiallyNextThread = (((m_CurCommandInPipe * (m_ThreadCount - 1)) / m_CommandsInPipe) + 1); - if(PotentiallyNextThread - 1 > m_LastCommandsInPipeThreadIndex) - { - CanStartThread = true; - m_LastCommandsInPipeThreadIndex = PotentiallyNextThread - 1; - } - Buffer.m_ThreadIndex = m_ThreadCount > 1 && !ForceSingleThread ? (m_LastCommandsInPipeThreadIndex + 1) : 0; - CallbackObj.m_FillExecuteBuffer(Buffer, pBaseCommand); - m_CurRenderCallCountInPipe += Buffer.m_EstimatedRenderCallCount; - } - bool Ret = true; - if(!CallbackObj.m_IsRenderCommand || (Buffer.m_ThreadIndex == 0 && !m_RenderingPaused)) - { - Ret = CallbackObj.m_CMDIsHandled; - if(!CallbackObj.m_CommandCB(pBaseCommand, Buffer)) - { - // an error occurred, stop this command and ignore all further commands - return ERunCommandReturnTypes::RUN_COMMAND_COMMAND_ERROR; - } - } - else if(!m_RenderingPaused) - { - if(CanStartThread) - { - StartRenderThread(m_LastCommandsInPipeThreadIndex - 1); - } - m_vvThreadCommandLists[Buffer.m_ThreadIndex - 1].push_back(Buffer); - } - - ++m_CurCommandInPipe; - return Ret ? ERunCommandReturnTypes::RUN_COMMAND_COMMAND_HANDLED : ERunCommandReturnTypes::RUN_COMMAND_COMMAND_UNHANDLED; - } - - if(m_CurCommandInPipe + 1 == m_CommandsInPipe) - { - m_LastCommandsInPipeThreadIndex = std::numeric_limits::max(); - } - ++m_CurCommandInPipe; - - switch(pBaseCommand->m_Cmd) - { - case CCommandProcessorFragment_GLBase::CMD_INIT: - if(!Cmd_Init(static_cast(pBaseCommand))) - { - SetWarningPreMsg("Could not initialize Vulkan: "); - return RUN_COMMAND_COMMAND_WARNING; - } - break; - case CCommandProcessorFragment_GLBase::CMD_SHUTDOWN: - if(!Cmd_Shutdown(static_cast(pBaseCommand))) - { - SetWarningPreMsg("Could not shutdown Vulkan: "); - return RUN_COMMAND_COMMAND_WARNING; - } - break; - - case CCommandProcessorFragment_GLBase::CMD_PRE_INIT: - if(!Cmd_PreInit(static_cast(pBaseCommand))) - { - SetWarningPreMsg("Could not initialize Vulkan: "); - return RUN_COMMAND_COMMAND_WARNING; - } - break; - case CCommandProcessorFragment_GLBase::CMD_POST_SHUTDOWN: - if(!Cmd_PostShutdown(static_cast(pBaseCommand))) - { - SetWarningPreMsg("Could not shutdown Vulkan: "); - return RUN_COMMAND_COMMAND_WARNING; - } - break; - default: - return ERunCommandReturnTypes::RUN_COMMAND_COMMAND_UNHANDLED; - } - - return ERunCommandReturnTypes::RUN_COMMAND_COMMAND_HANDLED; - } - - [[nodiscard]] bool Cmd_Init(const SCommand_Init *pCommand) - { - pCommand->m_pCapabilities->m_TileBuffering = true; - pCommand->m_pCapabilities->m_QuadBuffering = true; - pCommand->m_pCapabilities->m_TextBuffering = true; - pCommand->m_pCapabilities->m_QuadContainerBuffering = true; - pCommand->m_pCapabilities->m_ShaderSupport = true; - - pCommand->m_pCapabilities->m_MipMapping = true; - pCommand->m_pCapabilities->m_3DTextures = false; - pCommand->m_pCapabilities->m_2DArrayTextures = true; - pCommand->m_pCapabilities->m_NPOTTextures = true; - - pCommand->m_pCapabilities->m_ContextMajor = 1; - pCommand->m_pCapabilities->m_ContextMinor = 1; - pCommand->m_pCapabilities->m_ContextPatch = 0; - - pCommand->m_pCapabilities->m_TrianglesAsQuads = true; - - m_GlobalTextureLodBIAS = g_Config.m_GfxGLTextureLODBIAS; - m_pTextureMemoryUsage = pCommand->m_pTextureMemoryUsage; - m_pBufferMemoryUsage = pCommand->m_pBufferMemoryUsage; - m_pStreamMemoryUsage = pCommand->m_pStreamMemoryUsage; - m_pStagingMemoryUsage = pCommand->m_pStagingMemoryUsage; - - m_MultiSamplingCount = (g_Config.m_GfxFsaaSamples & 0xFFFFFFFE); // ignore the uneven bit, only even multi sampling works - - *pCommand->m_pReadPresentedImageDataFunc = [this](uint32_t &Width, uint32_t &Height, CImageInfo::EImageFormat &Format, std::vector &vDstData) { - return GetPresentedImageData(Width, Height, Format, vDstData); - }; - - m_pWindow = pCommand->m_pWindow; - - *pCommand->m_pInitError = m_VKInstance != VK_NULL_HANDLE ? 0 : -1; - - if(m_VKInstance == VK_NULL_HANDLE) - { - *pCommand->m_pInitError = -2; - return false; - } - - m_pStorage = pCommand->m_pStorage; - if(InitVulkan() != 0) - { - *pCommand->m_pInitError = -2; - return false; - } - - std::array aIndices; - int Primq = 0; - for(int i = 0; i < CCommandBuffer::MAX_VERTICES / 4 * 6; i += 6) - { - aIndices[i] = Primq; - aIndices[i + 1] = Primq + 1; - aIndices[i + 2] = Primq + 2; - aIndices[i + 3] = Primq; - aIndices[i + 4] = Primq + 2; - aIndices[i + 5] = Primq + 3; - Primq += 4; - } - - if(!PrepareFrame()) - return false; - if(m_HasError) - { - *pCommand->m_pInitError = -2; - return false; - } - - if(!CreateIndexBuffer(aIndices.data(), sizeof(uint32_t) * aIndices.size(), m_IndexBuffer, m_IndexBufferMemory)) - { - *pCommand->m_pInitError = -2; - return false; - } - if(!CreateIndexBuffer(aIndices.data(), sizeof(uint32_t) * aIndices.size(), m_RenderIndexBuffer, m_RenderIndexBufferMemory)) - { - *pCommand->m_pInitError = -2; - return false; - } - m_CurRenderIndexPrimitiveCount = CCommandBuffer::MAX_VERTICES / 4; - - m_CanAssert = true; - - return true; - } - - [[nodiscard]] bool Cmd_Shutdown(const SCommand_Shutdown *pCommand) - { - vkDeviceWaitIdle(m_VKDevice); - - DestroyIndexBuffer(m_IndexBuffer, m_IndexBufferMemory); - DestroyIndexBuffer(m_RenderIndexBuffer, m_RenderIndexBufferMemory); - - CleanupVulkan(m_SwapChainImageCount); - - return true; - } - - [[nodiscard]] bool Cmd_Texture_Destroy(const CCommandBuffer::SCommand_Texture_Destroy *pCommand) - { - size_t ImageIndex = (size_t)pCommand->m_Slot; - auto &Texture = m_vTextures[ImageIndex]; - - m_vvFrameDelayedTextureCleanup[m_CurImageIndex].push_back(Texture); - - Texture = CTexture{}; - - return true; - } - - [[nodiscard]] bool Cmd_Texture_Create(const CCommandBuffer::SCommand_Texture_Create *pCommand) - { - int Slot = pCommand->m_Slot; - int Width = pCommand->m_Width; - int Height = pCommand->m_Height; - int Flags = pCommand->m_Flags; - uint8_t *pData = pCommand->m_pData; - - if(!CreateTextureCMD(Slot, Width, Height, VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM, Flags, pData)) - return false; - - free(pData); - - return true; - } - - [[nodiscard]] bool Cmd_TextTextures_Create(const CCommandBuffer::SCommand_TextTextures_Create *pCommand) - { - int Slot = pCommand->m_Slot; - int SlotOutline = pCommand->m_SlotOutline; - int Width = pCommand->m_Width; - int Height = pCommand->m_Height; - - uint8_t *pTmpData = pCommand->m_pTextData; - uint8_t *pTmpData2 = pCommand->m_pTextOutlineData; - - if(!CreateTextureCMD(Slot, Width, Height, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, CCommandBuffer::TEXFLAG_NOMIPMAPS, pTmpData)) - return false; - if(!CreateTextureCMD(SlotOutline, Width, Height, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, CCommandBuffer::TEXFLAG_NOMIPMAPS, pTmpData2)) - return false; - - if(!CreateNewTextDescriptorSets(Slot, SlotOutline)) - return false; - - free(pTmpData); - free(pTmpData2); - - return true; - } - - [[nodiscard]] bool Cmd_TextTextures_Destroy(const CCommandBuffer::SCommand_TextTextures_Destroy *pCommand) - { - size_t ImageIndex = (size_t)pCommand->m_Slot; - size_t ImageIndexOutline = (size_t)pCommand->m_SlotOutline; - auto &Texture = m_vTextures[ImageIndex]; - auto &TextureOutline = m_vTextures[ImageIndexOutline]; - - m_vvFrameDelayedTextTexturesCleanup[m_CurImageIndex].emplace_back(Texture, TextureOutline); - - Texture = {}; - TextureOutline = {}; - - return true; - } - - [[nodiscard]] bool Cmd_TextTexture_Update(const CCommandBuffer::SCommand_TextTexture_Update *pCommand) - { - size_t IndexTex = pCommand->m_Slot; - uint8_t *pData = pCommand->m_pData; - - if(!UpdateTexture(IndexTex, VK_FORMAT_R8_UNORM, pData, pCommand->m_X, pCommand->m_Y, pCommand->m_Width, pCommand->m_Height)) - return false; - - free(pData); - - return true; - } - - void Cmd_Clear_FillExecuteBuffer(SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand_Clear *pCommand) - { - if(!pCommand->m_ForceClear) - { - bool ColorChanged = m_aClearColor[0] != pCommand->m_Color.r || m_aClearColor[1] != pCommand->m_Color.g || - m_aClearColor[2] != pCommand->m_Color.b || m_aClearColor[3] != pCommand->m_Color.a; - m_aClearColor[0] = pCommand->m_Color.r; - m_aClearColor[1] = pCommand->m_Color.g; - m_aClearColor[2] = pCommand->m_Color.b; - m_aClearColor[3] = pCommand->m_Color.a; - if(ColorChanged) - ExecBuffer.m_ClearColorInRenderThread = true; - } - else - { - ExecBuffer.m_ClearColorInRenderThread = true; - } - ExecBuffer.m_EstimatedRenderCallCount = 0; - } - - [[nodiscard]] bool Cmd_Clear(const SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand_Clear *pCommand) - { - if(ExecBuffer.m_ClearColorInRenderThread) - { - std::array aAttachments = {VkClearAttachment{VK_IMAGE_ASPECT_COLOR_BIT, 0, VkClearValue{VkClearColorValue{{pCommand->m_Color.r, pCommand->m_Color.g, pCommand->m_Color.b, pCommand->m_Color.a}}}}}; - std::array aClearRects = {VkClearRect{{{0, 0}, m_VKSwapImgAndViewportExtent.m_SwapImageViewport}, 0, 1}}; - - VkCommandBuffer *pCommandBuffer; - if(!GetGraphicCommandBuffer(pCommandBuffer, ExecBuffer.m_ThreadIndex)) - return false; - auto &CommandBuffer = *pCommandBuffer; - vkCmdClearAttachments(CommandBuffer, aAttachments.size(), aAttachments.data(), aClearRects.size(), aClearRects.data()); - } - - return true; - } - - void Cmd_Render_FillExecuteBuffer(SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand_Render *pCommand) - { - bool IsTextured = GetIsTextured(pCommand->m_State); - if(IsTextured) - { - size_t AddressModeIndex = GetAddressModeIndex(pCommand->m_State); - ExecBuffer.m_aDescriptors[0] = m_vTextures[pCommand->m_State.m_Texture].m_aVKStandardTexturedDescrSets[AddressModeIndex]; - } - - ExecBuffer.m_IndexBuffer = m_IndexBuffer; - - ExecBuffer.m_EstimatedRenderCallCount = 1; - - ExecBufferFillDynamicStates(pCommand->m_State, ExecBuffer); - } - - [[nodiscard]] bool Cmd_Render(const CCommandBuffer::SCommand_Render *pCommand, SRenderCommandExecuteBuffer &ExecBuffer) - { - return RenderStandard(ExecBuffer, pCommand->m_State, pCommand->m_PrimType, pCommand->m_pVertices, pCommand->m_PrimCount); - } - - [[nodiscard]] bool Cmd_ReadPixel(const CCommandBuffer::SCommand_TrySwapAndReadPixel *pCommand) - { - if(!*pCommand->m_pSwapped && !NextFrame()) - return false; - *pCommand->m_pSwapped = true; - - uint32_t Width; - uint32_t Height; - CImageInfo::EImageFormat Format; - if(GetPresentedImageDataImpl(Width, Height, Format, m_vReadPixelHelper, false, pCommand->m_Position)) - { - *pCommand->m_pColor = ColorRGBA(m_vReadPixelHelper[0] / 255.0f, m_vReadPixelHelper[1] / 255.0f, m_vReadPixelHelper[2] / 255.0f, 1.0f); - } - else - { - *pCommand->m_pColor = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - } - - return true; - } - - [[nodiscard]] bool Cmd_Screenshot(const CCommandBuffer::SCommand_TrySwapAndScreenshot *pCommand) - { - if(!*pCommand->m_pSwapped && !NextFrame()) - return false; - *pCommand->m_pSwapped = true; - - uint32_t Width; - uint32_t Height; - CImageInfo::EImageFormat Format; - if(GetPresentedImageDataImpl(Width, Height, Format, m_vScreenshotHelper, true, {})) - { - const size_t ImgSize = (size_t)Width * (size_t)Height * CImageInfo::PixelSize(Format); - pCommand->m_pImage->m_pData = static_cast(malloc(ImgSize)); - mem_copy(pCommand->m_pImage->m_pData, m_vScreenshotHelper.data(), ImgSize); - } - else - { - pCommand->m_pImage->m_pData = nullptr; - } - pCommand->m_pImage->m_Width = (int)Width; - pCommand->m_pImage->m_Height = (int)Height; - pCommand->m_pImage->m_Format = Format; - - return true; - } - - void Cmd_RenderTex3D_FillExecuteBuffer(SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand_RenderTex3D *pCommand) - { - bool IsTextured = GetIsTextured(pCommand->m_State); - if(IsTextured) - { - ExecBuffer.m_aDescriptors[0] = m_vTextures[pCommand->m_State.m_Texture].m_VKStandard3DTexturedDescrSet; - } - - ExecBuffer.m_IndexBuffer = m_IndexBuffer; - - ExecBuffer.m_EstimatedRenderCallCount = 1; - - ExecBufferFillDynamicStates(pCommand->m_State, ExecBuffer); - } - - [[nodiscard]] bool Cmd_RenderTex3D(const CCommandBuffer::SCommand_RenderTex3D *pCommand, SRenderCommandExecuteBuffer &ExecBuffer) - { - return RenderStandard(ExecBuffer, pCommand->m_State, pCommand->m_PrimType, pCommand->m_pVertices, pCommand->m_PrimCount); - } - - void Cmd_Update_Viewport_FillExecuteBuffer(SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand_Update_Viewport *pCommand) - { - ExecBuffer.m_EstimatedRenderCallCount = 0; - } - - [[nodiscard]] bool Cmd_Update_Viewport(const CCommandBuffer::SCommand_Update_Viewport *pCommand) - { - if(pCommand->m_ByResize) - { - if(IsVerbose()) - { - dbg_msg("vulkan", "queueing swap chain recreation because the viewport changed"); - } - m_CanvasWidth = (uint32_t)pCommand->m_Width; - m_CanvasHeight = (uint32_t)pCommand->m_Height; - m_RecreateSwapChain = true; - } - else - { - auto Viewport = m_VKSwapImgAndViewportExtent.GetPresentedImageViewport(); - if(pCommand->m_X != 0 || pCommand->m_Y != 0 || (uint32_t)pCommand->m_Width != Viewport.width || (uint32_t)pCommand->m_Height != Viewport.height) - { - m_HasDynamicViewport = true; - - // convert viewport from OGL to vulkan - int32_t ViewportY = (int32_t)Viewport.height - ((int32_t)pCommand->m_Y + (int32_t)pCommand->m_Height); - uint32_t ViewportH = (int32_t)pCommand->m_Height; - m_DynamicViewportOffset = {(int32_t)pCommand->m_X, ViewportY}; - m_DynamicViewportSize = {(uint32_t)pCommand->m_Width, ViewportH}; - } - else - { - m_HasDynamicViewport = false; - } - } - - return true; - } - - [[nodiscard]] bool Cmd_VSync(const CCommandBuffer::SCommand_VSync *pCommand) - { - if(IsVerbose()) - { - dbg_msg("vulkan", "queueing swap chain recreation because vsync was changed"); - } - m_RecreateSwapChain = true; - *pCommand->m_pRetOk = true; - - return true; - } - - [[nodiscard]] bool Cmd_MultiSampling(const CCommandBuffer::SCommand_MultiSampling *pCommand) - { - if(IsVerbose()) - { - dbg_msg("vulkan", "queueing swap chain recreation because multi sampling was changed"); - } - m_RecreateSwapChain = true; - - uint32_t MSCount = (std::min(pCommand->m_RequestedMultiSamplingCount, (uint32_t)GetMaxSampleCount()) & 0xFFFFFFFE); // ignore the uneven bits - m_NextMultiSamplingCount = MSCount; - - *pCommand->m_pRetMultiSamplingCount = MSCount; - *pCommand->m_pRetOk = true; - - return true; - } - - [[nodiscard]] bool Cmd_Swap(const CCommandBuffer::SCommand_Swap *pCommand) - { - return NextFrame(); - } - - [[nodiscard]] bool Cmd_CreateBufferObject(const CCommandBuffer::SCommand_CreateBufferObject *pCommand) - { - bool IsOneFrameBuffer = (pCommand->m_Flags & IGraphics::EBufferObjectCreateFlags::BUFFER_OBJECT_CREATE_FLAGS_ONE_TIME_USE_BIT) != 0; - if(!CreateBufferObject((size_t)pCommand->m_BufferIndex, pCommand->m_pUploadData, (VkDeviceSize)pCommand->m_DataSize, IsOneFrameBuffer)) - return false; - if(pCommand->m_DeletePointer) - free(pCommand->m_pUploadData); - - return true; - } - - [[nodiscard]] bool Cmd_UpdateBufferObject(const CCommandBuffer::SCommand_UpdateBufferObject *pCommand) - { - size_t BufferIndex = (size_t)pCommand->m_BufferIndex; - bool DeletePointer = pCommand->m_DeletePointer; - VkDeviceSize Offset = (VkDeviceSize)((intptr_t)pCommand->m_pOffset); - void *pUploadData = pCommand->m_pUploadData; - VkDeviceSize DataSize = (VkDeviceSize)pCommand->m_DataSize; - - SMemoryBlock StagingBuffer; - if(!GetStagingBuffer(StagingBuffer, pUploadData, DataSize)) - return false; - - const auto &MemBlock = m_vBufferObjects[BufferIndex].m_BufferObject.m_Mem; - VkBuffer VertexBuffer = MemBlock.m_Buffer; - if(!MemoryBarrier(VertexBuffer, Offset + MemBlock.m_HeapData.m_OffsetToAlign, DataSize, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, true)) - return false; - if(!CopyBuffer(StagingBuffer.m_Buffer, VertexBuffer, StagingBuffer.m_HeapData.m_OffsetToAlign, Offset + MemBlock.m_HeapData.m_OffsetToAlign, DataSize)) - return false; - if(!MemoryBarrier(VertexBuffer, Offset + MemBlock.m_HeapData.m_OffsetToAlign, DataSize, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, false)) - return false; - - UploadAndFreeStagingMemBlock(StagingBuffer); - - if(DeletePointer) - free(pUploadData); - - return true; - } - - [[nodiscard]] bool Cmd_RecreateBufferObject(const CCommandBuffer::SCommand_RecreateBufferObject *pCommand) - { - DeleteBufferObject((size_t)pCommand->m_BufferIndex); - bool IsOneFrameBuffer = (pCommand->m_Flags & IGraphics::EBufferObjectCreateFlags::BUFFER_OBJECT_CREATE_FLAGS_ONE_TIME_USE_BIT) != 0; - return CreateBufferObject((size_t)pCommand->m_BufferIndex, pCommand->m_pUploadData, (VkDeviceSize)pCommand->m_DataSize, IsOneFrameBuffer); - } - - [[nodiscard]] bool Cmd_CopyBufferObject(const CCommandBuffer::SCommand_CopyBufferObject *pCommand) - { - size_t ReadBufferIndex = (size_t)pCommand->m_ReadBufferIndex; - size_t WriteBufferIndex = (size_t)pCommand->m_WriteBufferIndex; - auto &ReadMemBlock = m_vBufferObjects[ReadBufferIndex].m_BufferObject.m_Mem; - auto &WriteMemBlock = m_vBufferObjects[WriteBufferIndex].m_BufferObject.m_Mem; - VkBuffer ReadBuffer = ReadMemBlock.m_Buffer; - VkBuffer WriteBuffer = WriteMemBlock.m_Buffer; - - VkDeviceSize DataSize = (VkDeviceSize)pCommand->m_CopySize; - VkDeviceSize ReadOffset = (VkDeviceSize)pCommand->m_ReadOffset + ReadMemBlock.m_HeapData.m_OffsetToAlign; - VkDeviceSize WriteOffset = (VkDeviceSize)pCommand->m_WriteOffset + WriteMemBlock.m_HeapData.m_OffsetToAlign; - - if(!MemoryBarrier(ReadBuffer, ReadOffset, DataSize, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, true)) - return false; - if(!MemoryBarrier(WriteBuffer, WriteOffset, DataSize, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, true)) - return false; - if(!CopyBuffer(ReadBuffer, WriteBuffer, ReadOffset, WriteOffset, DataSize)) - return false; - if(!MemoryBarrier(WriteBuffer, WriteOffset, DataSize, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, false)) - return false; - if(!MemoryBarrier(ReadBuffer, ReadOffset, DataSize, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, false)) - return false; - - return true; - } - - [[nodiscard]] bool Cmd_DeleteBufferObject(const CCommandBuffer::SCommand_DeleteBufferObject *pCommand) - { - size_t BufferIndex = (size_t)pCommand->m_BufferIndex; - DeleteBufferObject(BufferIndex); - - return true; - } - - [[nodiscard]] bool Cmd_CreateBufferContainer(const CCommandBuffer::SCommand_CreateBufferContainer *pCommand) - { - size_t ContainerIndex = (size_t)pCommand->m_BufferContainerIndex; - while(ContainerIndex >= m_vBufferContainers.size()) - m_vBufferContainers.resize((m_vBufferContainers.size() * 2) + 1); - - m_vBufferContainers[ContainerIndex].m_BufferObjectIndex = pCommand->m_VertBufferBindingIndex; - - return true; - } - - [[nodiscard]] bool Cmd_UpdateBufferContainer(const CCommandBuffer::SCommand_UpdateBufferContainer *pCommand) - { - size_t ContainerIndex = (size_t)pCommand->m_BufferContainerIndex; - m_vBufferContainers[ContainerIndex].m_BufferObjectIndex = pCommand->m_VertBufferBindingIndex; - - return true; - } - - [[nodiscard]] bool Cmd_DeleteBufferContainer(const CCommandBuffer::SCommand_DeleteBufferContainer *pCommand) - { - size_t ContainerIndex = (size_t)pCommand->m_BufferContainerIndex; - bool DeleteAllBO = pCommand->m_DestroyAllBO; - if(DeleteAllBO) - { - size_t BufferIndex = (size_t)m_vBufferContainers[ContainerIndex].m_BufferObjectIndex; - DeleteBufferObject(BufferIndex); - } - - return true; - } - - [[nodiscard]] bool Cmd_IndicesRequiredNumNotify(const CCommandBuffer::SCommand_IndicesRequiredNumNotify *pCommand) - { - size_t IndicesCount = pCommand->m_RequiredIndicesNum; - if(m_CurRenderIndexPrimitiveCount < IndicesCount / 6) - { - m_vvFrameDelayedBufferCleanup[m_CurImageIndex].push_back({m_RenderIndexBuffer, m_RenderIndexBufferMemory}); - std::vector vIndices(IndicesCount); - uint32_t Primq = 0; - for(size_t i = 0; i < IndicesCount; i += 6) - { - vIndices[i] = Primq; - vIndices[i + 1] = Primq + 1; - vIndices[i + 2] = Primq + 2; - vIndices[i + 3] = Primq; - vIndices[i + 4] = Primq + 2; - vIndices[i + 5] = Primq + 3; - Primq += 4; - } - if(!CreateIndexBuffer(vIndices.data(), vIndices.size() * sizeof(uint32_t), m_RenderIndexBuffer, m_RenderIndexBufferMemory)) - return false; - m_CurRenderIndexPrimitiveCount = IndicesCount / 6; - } - - return true; - } - - void Cmd_RenderTileLayer_FillExecuteBuffer(SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand_RenderTileLayer *pCommand) - { - RenderTileLayer_FillExecuteBuffer(ExecBuffer, pCommand->m_IndicesDrawNum, pCommand->m_State, pCommand->m_BufferContainerIndex); - } - - [[nodiscard]] bool Cmd_RenderTileLayer(const CCommandBuffer::SCommand_RenderTileLayer *pCommand, SRenderCommandExecuteBuffer &ExecBuffer) - { - vec2 Scale{}; - vec2 Off{}; - return RenderTileLayer(ExecBuffer, pCommand->m_State, false, pCommand->m_Color, Scale, Off, (size_t)pCommand->m_IndicesDrawNum, pCommand->m_pIndicesOffsets, pCommand->m_pDrawCount); - } - - void Cmd_RenderBorderTile_FillExecuteBuffer(SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand_RenderBorderTile *pCommand) - { - RenderTileLayer_FillExecuteBuffer(ExecBuffer, 1, pCommand->m_State, pCommand->m_BufferContainerIndex); - } - - [[nodiscard]] bool Cmd_RenderBorderTile(const CCommandBuffer::SCommand_RenderBorderTile *pCommand, SRenderCommandExecuteBuffer &ExecBuffer) - { - vec2 Scale = pCommand->m_Scale; - vec2 Off = pCommand->m_Offset; - unsigned int DrawNum = pCommand->m_DrawNum * 6; - return RenderTileLayer(ExecBuffer, pCommand->m_State, true, pCommand->m_Color, Scale, Off, 1, &pCommand->m_pIndicesOffset, &DrawNum); - } - - void Cmd_RenderQuadLayer_FillExecuteBuffer(SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand_RenderQuadLayer *pCommand) - { - size_t BufferContainerIndex = (size_t)pCommand->m_BufferContainerIndex; - size_t BufferObjectIndex = (size_t)m_vBufferContainers[BufferContainerIndex].m_BufferObjectIndex; - const auto &BufferObject = m_vBufferObjects[BufferObjectIndex]; - - ExecBuffer.m_Buffer = BufferObject.m_CurBuffer; - ExecBuffer.m_BufferOff = BufferObject.m_CurBufferOffset; - - bool IsTextured = GetIsTextured(pCommand->m_State); - if(IsTextured) - { - size_t AddressModeIndex = GetAddressModeIndex(pCommand->m_State); - ExecBuffer.m_aDescriptors[0] = m_vTextures[pCommand->m_State.m_Texture].m_aVKStandardTexturedDescrSets[AddressModeIndex]; - } - - ExecBuffer.m_IndexBuffer = m_RenderIndexBuffer; - - ExecBuffer.m_EstimatedRenderCallCount = ((pCommand->m_QuadNum - 1) / gs_GraphicsMaxQuadsRenderCount) + 1; - - ExecBufferFillDynamicStates(pCommand->m_State, ExecBuffer); - } - - [[nodiscard]] bool Cmd_RenderQuadLayer(const CCommandBuffer::SCommand_RenderQuadLayer *pCommand, SRenderCommandExecuteBuffer &ExecBuffer) - { - std::array m; - GetStateMatrix(pCommand->m_State, m); - - bool CanBePushed = pCommand->m_QuadNum == 1; - - bool IsTextured; - size_t BlendModeIndex; - size_t DynamicIndex; - size_t AddressModeIndex; - GetStateIndices(ExecBuffer, pCommand->m_State, IsTextured, BlendModeIndex, DynamicIndex, AddressModeIndex); - auto &PipeLayout = GetPipeLayout(CanBePushed ? m_QuadPushPipeline : m_QuadPipeline, IsTextured, BlendModeIndex, DynamicIndex); - auto &PipeLine = GetPipeline(CanBePushed ? m_QuadPushPipeline : m_QuadPipeline, IsTextured, BlendModeIndex, DynamicIndex); - - VkCommandBuffer *pCommandBuffer; - if(!GetGraphicCommandBuffer(pCommandBuffer, ExecBuffer.m_ThreadIndex)) - return false; - auto &CommandBuffer = *pCommandBuffer; - - BindPipeline(ExecBuffer.m_ThreadIndex, CommandBuffer, ExecBuffer, PipeLine, pCommand->m_State); - - std::array aVertexBuffers = {ExecBuffer.m_Buffer}; - std::array aOffsets = {(VkDeviceSize)ExecBuffer.m_BufferOff}; - vkCmdBindVertexBuffers(CommandBuffer, 0, 1, aVertexBuffers.data(), aOffsets.data()); - - vkCmdBindIndexBuffer(CommandBuffer, ExecBuffer.m_IndexBuffer, 0, VK_INDEX_TYPE_UINT32); - - if(IsTextured) - { - vkCmdBindDescriptorSets(CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, PipeLayout, 0, 1, &ExecBuffer.m_aDescriptors[0].m_Descriptor, 0, nullptr); - } - - if(CanBePushed) - { - SUniformQuadPushGPos PushConstantVertex; - - mem_copy(&PushConstantVertex.m_BOPush, &pCommand->m_pQuadInfo[0], sizeof(PushConstantVertex.m_BOPush)); - - mem_copy(PushConstantVertex.m_aPos, m.data(), sizeof(PushConstantVertex.m_aPos)); - PushConstantVertex.m_QuadOffset = pCommand->m_QuadOffset; - - vkCmdPushConstants(CommandBuffer, PipeLayout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(SUniformQuadPushGPos), &PushConstantVertex); - } - else - { - SUniformQuadGPos PushConstantVertex; - mem_copy(PushConstantVertex.m_aPos, m.data(), sizeof(PushConstantVertex.m_aPos)); - PushConstantVertex.m_QuadOffset = pCommand->m_QuadOffset; - - vkCmdPushConstants(CommandBuffer, PipeLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(PushConstantVertex), &PushConstantVertex); - } - - uint32_t DrawCount = (uint32_t)pCommand->m_QuadNum; - size_t RenderOffset = 0; - - while(DrawCount > 0) - { - uint32_t RealDrawCount = (DrawCount > gs_GraphicsMaxQuadsRenderCount ? gs_GraphicsMaxQuadsRenderCount : DrawCount); - - VkDeviceSize IndexOffset = (VkDeviceSize)((ptrdiff_t)(pCommand->m_QuadOffset + RenderOffset) * 6); - if(!CanBePushed) - { - // create uniform buffer - SDeviceDescriptorSet UniDescrSet; - if(!GetUniformBufferObject(ExecBuffer.m_ThreadIndex, true, UniDescrSet, RealDrawCount, (const float *)(pCommand->m_pQuadInfo + RenderOffset), RealDrawCount * sizeof(SQuadRenderInfo))) - return false; - - vkCmdBindDescriptorSets(CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, PipeLayout, IsTextured ? 1 : 0, 1, &UniDescrSet.m_Descriptor, 0, nullptr); - if(RenderOffset > 0) - { - int32_t QuadOffset = pCommand->m_QuadOffset + RenderOffset; - vkCmdPushConstants(CommandBuffer, PipeLayout, VK_SHADER_STAGE_VERTEX_BIT, sizeof(SUniformQuadGPos) - sizeof(int32_t), sizeof(int32_t), &QuadOffset); - } - } - - vkCmdDrawIndexed(CommandBuffer, static_cast(RealDrawCount * 6), 1, IndexOffset, 0, 0); - - RenderOffset += RealDrawCount; - DrawCount -= RealDrawCount; - } - - return true; - } - - void Cmd_RenderText_FillExecuteBuffer(SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand_RenderText *pCommand) - { - size_t BufferContainerIndex = (size_t)pCommand->m_BufferContainerIndex; - size_t BufferObjectIndex = (size_t)m_vBufferContainers[BufferContainerIndex].m_BufferObjectIndex; - const auto &BufferObject = m_vBufferObjects[BufferObjectIndex]; - - ExecBuffer.m_Buffer = BufferObject.m_CurBuffer; - ExecBuffer.m_BufferOff = BufferObject.m_CurBufferOffset; - - ExecBuffer.m_aDescriptors[0] = m_vTextures[pCommand->m_TextTextureIndex].m_VKTextDescrSet; - - ExecBuffer.m_IndexBuffer = m_RenderIndexBuffer; - - ExecBuffer.m_EstimatedRenderCallCount = 1; - - ExecBufferFillDynamicStates(pCommand->m_State, ExecBuffer); - } - - [[nodiscard]] bool Cmd_RenderText(const CCommandBuffer::SCommand_RenderText *pCommand, SRenderCommandExecuteBuffer &ExecBuffer) - { - std::array m; - GetStateMatrix(pCommand->m_State, m); - - bool IsTextured; - size_t BlendModeIndex; - size_t DynamicIndex; - size_t AddressModeIndex; - GetStateIndices(ExecBuffer, pCommand->m_State, IsTextured, BlendModeIndex, DynamicIndex, AddressModeIndex); - IsTextured = true; // text is always textured - auto &PipeLayout = GetPipeLayout(m_TextPipeline, IsTextured, BlendModeIndex, DynamicIndex); - auto &PipeLine = GetPipeline(m_TextPipeline, IsTextured, BlendModeIndex, DynamicIndex); - - VkCommandBuffer *pCommandBuffer; - if(!GetGraphicCommandBuffer(pCommandBuffer, ExecBuffer.m_ThreadIndex)) - return false; - auto &CommandBuffer = *pCommandBuffer; - - BindPipeline(ExecBuffer.m_ThreadIndex, CommandBuffer, ExecBuffer, PipeLine, pCommand->m_State); - - std::array aVertexBuffers = {ExecBuffer.m_Buffer}; - std::array aOffsets = {(VkDeviceSize)ExecBuffer.m_BufferOff}; - vkCmdBindVertexBuffers(CommandBuffer, 0, 1, aVertexBuffers.data(), aOffsets.data()); - - vkCmdBindIndexBuffer(CommandBuffer, ExecBuffer.m_IndexBuffer, 0, VK_INDEX_TYPE_UINT32); - - vkCmdBindDescriptorSets(CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, PipeLayout, 0, 1, &ExecBuffer.m_aDescriptors[0].m_Descriptor, 0, nullptr); - - SUniformGTextPos PosTexSizeConstant; - mem_copy(PosTexSizeConstant.m_aPos, m.data(), m.size() * sizeof(float)); - PosTexSizeConstant.m_TextureSize = pCommand->m_TextureSize; - - vkCmdPushConstants(CommandBuffer, PipeLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(SUniformGTextPos), &PosTexSizeConstant); - - SUniformTextFragment FragmentConstants; - - FragmentConstants.m_Constants.m_TextColor = pCommand->m_TextColor; - FragmentConstants.m_Constants.m_TextOutlineColor = pCommand->m_TextOutlineColor; - vkCmdPushConstants(CommandBuffer, PipeLayout, VK_SHADER_STAGE_FRAGMENT_BIT, sizeof(SUniformGTextPos) + sizeof(SUniformTextGFragmentOffset), sizeof(SUniformTextFragment), &FragmentConstants); - - vkCmdDrawIndexed(CommandBuffer, static_cast(pCommand->m_DrawNum), 1, 0, 0, 0); - - return true; - } - - void BufferContainer_FillExecuteBuffer(SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SState &State, size_t BufferContainerIndex, size_t DrawCalls) - { - size_t BufferObjectIndex = (size_t)m_vBufferContainers[BufferContainerIndex].m_BufferObjectIndex; - const auto &BufferObject = m_vBufferObjects[BufferObjectIndex]; - - ExecBuffer.m_Buffer = BufferObject.m_CurBuffer; - ExecBuffer.m_BufferOff = BufferObject.m_CurBufferOffset; - - bool IsTextured = GetIsTextured(State); - if(IsTextured) - { - size_t AddressModeIndex = GetAddressModeIndex(State); - ExecBuffer.m_aDescriptors[0] = m_vTextures[State.m_Texture].m_aVKStandardTexturedDescrSets[AddressModeIndex]; - } - - ExecBuffer.m_IndexBuffer = m_RenderIndexBuffer; - - ExecBuffer.m_EstimatedRenderCallCount = DrawCalls; - - ExecBufferFillDynamicStates(State, ExecBuffer); - } - - void Cmd_RenderQuadContainer_FillExecuteBuffer(SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand_RenderQuadContainer *pCommand) - { - BufferContainer_FillExecuteBuffer(ExecBuffer, pCommand->m_State, (size_t)pCommand->m_BufferContainerIndex, 1); - } - - [[nodiscard]] bool Cmd_RenderQuadContainer(const CCommandBuffer::SCommand_RenderQuadContainer *pCommand, SRenderCommandExecuteBuffer &ExecBuffer) - { - std::array m; - GetStateMatrix(pCommand->m_State, m); - - bool IsTextured; - size_t BlendModeIndex; - size_t DynamicIndex; - size_t AddressModeIndex; - GetStateIndices(ExecBuffer, pCommand->m_State, IsTextured, BlendModeIndex, DynamicIndex, AddressModeIndex); - auto &PipeLayout = GetStandardPipeLayout(false, IsTextured, BlendModeIndex, DynamicIndex); - auto &PipeLine = GetStandardPipe(false, IsTextured, BlendModeIndex, DynamicIndex); - - VkCommandBuffer *pCommandBuffer; - if(!GetGraphicCommandBuffer(pCommandBuffer, ExecBuffer.m_ThreadIndex)) - return false; - auto &CommandBuffer = *pCommandBuffer; - - BindPipeline(ExecBuffer.m_ThreadIndex, CommandBuffer, ExecBuffer, PipeLine, pCommand->m_State); - - std::array aVertexBuffers = {ExecBuffer.m_Buffer}; - std::array aOffsets = {(VkDeviceSize)ExecBuffer.m_BufferOff}; - vkCmdBindVertexBuffers(CommandBuffer, 0, 1, aVertexBuffers.data(), aOffsets.data()); - - VkDeviceSize IndexOffset = (VkDeviceSize)((ptrdiff_t)pCommand->m_pOffset); - - vkCmdBindIndexBuffer(CommandBuffer, ExecBuffer.m_IndexBuffer, IndexOffset, VK_INDEX_TYPE_UINT32); - - if(IsTextured) - { - vkCmdBindDescriptorSets(CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, PipeLayout, 0, 1, &ExecBuffer.m_aDescriptors[0].m_Descriptor, 0, nullptr); - } - - vkCmdPushConstants(CommandBuffer, PipeLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(SUniformGPos), m.data()); - - vkCmdDrawIndexed(CommandBuffer, static_cast(pCommand->m_DrawNum), 1, 0, 0, 0); - - return true; - } - - void Cmd_RenderQuadContainerEx_FillExecuteBuffer(SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand_RenderQuadContainerEx *pCommand) - { - BufferContainer_FillExecuteBuffer(ExecBuffer, pCommand->m_State, (size_t)pCommand->m_BufferContainerIndex, 1); - } - - [[nodiscard]] bool Cmd_RenderQuadContainerEx(const CCommandBuffer::SCommand_RenderQuadContainerEx *pCommand, SRenderCommandExecuteBuffer &ExecBuffer) - { - std::array m; - GetStateMatrix(pCommand->m_State, m); - - bool IsRotationless = !(pCommand->m_Rotation != 0); - bool IsTextured; - size_t BlendModeIndex; - size_t DynamicIndex; - size_t AddressModeIndex; - GetStateIndices(ExecBuffer, pCommand->m_State, IsTextured, BlendModeIndex, DynamicIndex, AddressModeIndex); - auto &PipeLayout = GetPipeLayout(IsRotationless ? m_PrimExRotationlessPipeline : m_PrimExPipeline, IsTextured, BlendModeIndex, DynamicIndex); - auto &PipeLine = GetPipeline(IsRotationless ? m_PrimExRotationlessPipeline : m_PrimExPipeline, IsTextured, BlendModeIndex, DynamicIndex); - - VkCommandBuffer *pCommandBuffer; - if(!GetGraphicCommandBuffer(pCommandBuffer, ExecBuffer.m_ThreadIndex)) - return false; - auto &CommandBuffer = *pCommandBuffer; - - BindPipeline(ExecBuffer.m_ThreadIndex, CommandBuffer, ExecBuffer, PipeLine, pCommand->m_State); - - std::array aVertexBuffers = {ExecBuffer.m_Buffer}; - std::array aOffsets = {(VkDeviceSize)ExecBuffer.m_BufferOff}; - vkCmdBindVertexBuffers(CommandBuffer, 0, 1, aVertexBuffers.data(), aOffsets.data()); - - VkDeviceSize IndexOffset = (VkDeviceSize)((ptrdiff_t)pCommand->m_pOffset); - - vkCmdBindIndexBuffer(CommandBuffer, ExecBuffer.m_IndexBuffer, IndexOffset, VK_INDEX_TYPE_UINT32); - - if(IsTextured) - { - vkCmdBindDescriptorSets(CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, PipeLayout, 0, 1, &ExecBuffer.m_aDescriptors[0].m_Descriptor, 0, nullptr); - } - - SUniformPrimExGVertColor PushConstantColor; - SUniformPrimExGPos PushConstantVertex; - size_t VertexPushConstantSize = sizeof(PushConstantVertex); - - PushConstantColor = pCommand->m_VertexColor; - mem_copy(PushConstantVertex.m_aPos, m.data(), sizeof(PushConstantVertex.m_aPos)); - - if(!IsRotationless) - { - PushConstantVertex.m_Rotation = pCommand->m_Rotation; - PushConstantVertex.m_Center = {pCommand->m_Center.x, pCommand->m_Center.y}; - } - else - { - VertexPushConstantSize = sizeof(SUniformPrimExGPosRotationless); - } - - vkCmdPushConstants(CommandBuffer, PipeLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, VertexPushConstantSize, &PushConstantVertex); - vkCmdPushConstants(CommandBuffer, PipeLayout, VK_SHADER_STAGE_FRAGMENT_BIT, sizeof(SUniformPrimExGPos) + sizeof(SUniformPrimExGVertColorAlign), sizeof(PushConstantColor), &PushConstantColor); - - vkCmdDrawIndexed(CommandBuffer, static_cast(pCommand->m_DrawNum), 1, 0, 0, 0); - - return true; - } - - void Cmd_RenderQuadContainerAsSpriteMultiple_FillExecuteBuffer(SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand_RenderQuadContainerAsSpriteMultiple *pCommand) - { - BufferContainer_FillExecuteBuffer(ExecBuffer, pCommand->m_State, (size_t)pCommand->m_BufferContainerIndex, ((pCommand->m_DrawCount - 1) / gs_GraphicsMaxParticlesRenderCount) + 1); - } - - [[nodiscard]] bool Cmd_RenderQuadContainerAsSpriteMultiple(const CCommandBuffer::SCommand_RenderQuadContainerAsSpriteMultiple *pCommand, SRenderCommandExecuteBuffer &ExecBuffer) - { - std::array m; - GetStateMatrix(pCommand->m_State, m); - - bool CanBePushed = pCommand->m_DrawCount <= 1; - - bool IsTextured; - size_t BlendModeIndex; - size_t DynamicIndex; - size_t AddressModeIndex; - GetStateIndices(ExecBuffer, pCommand->m_State, IsTextured, BlendModeIndex, DynamicIndex, AddressModeIndex); - auto &PipeLayout = GetPipeLayout(CanBePushed ? m_SpriteMultiPushPipeline : m_SpriteMultiPipeline, IsTextured, BlendModeIndex, DynamicIndex); - auto &PipeLine = GetPipeline(CanBePushed ? m_SpriteMultiPushPipeline : m_SpriteMultiPipeline, IsTextured, BlendModeIndex, DynamicIndex); - - VkCommandBuffer *pCommandBuffer; - if(!GetGraphicCommandBuffer(pCommandBuffer, ExecBuffer.m_ThreadIndex)) - return false; - auto &CommandBuffer = *pCommandBuffer; - - BindPipeline(ExecBuffer.m_ThreadIndex, CommandBuffer, ExecBuffer, PipeLine, pCommand->m_State); - - std::array aVertexBuffers = {ExecBuffer.m_Buffer}; - std::array aOffsets = {(VkDeviceSize)ExecBuffer.m_BufferOff}; - vkCmdBindVertexBuffers(CommandBuffer, 0, 1, aVertexBuffers.data(), aOffsets.data()); - - VkDeviceSize IndexOffset = (VkDeviceSize)((ptrdiff_t)pCommand->m_pOffset); - vkCmdBindIndexBuffer(CommandBuffer, ExecBuffer.m_IndexBuffer, IndexOffset, VK_INDEX_TYPE_UINT32); - - vkCmdBindDescriptorSets(CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, PipeLayout, 0, 1, &ExecBuffer.m_aDescriptors[0].m_Descriptor, 0, nullptr); - - if(CanBePushed) - { - SUniformSpriteMultiPushGVertColor PushConstantColor; - SUniformSpriteMultiPushGPos PushConstantVertex; - - PushConstantColor = pCommand->m_VertexColor; - - mem_copy(PushConstantVertex.m_aPos, m.data(), sizeof(PushConstantVertex.m_aPos)); - PushConstantVertex.m_Center = pCommand->m_Center; - - for(size_t i = 0; i < pCommand->m_DrawCount; ++i) - PushConstantVertex.m_aPSR[i] = vec4(pCommand->m_pRenderInfo[i].m_Pos.x, pCommand->m_pRenderInfo[i].m_Pos.y, pCommand->m_pRenderInfo[i].m_Scale, pCommand->m_pRenderInfo[i].m_Rotation); - - vkCmdPushConstants(CommandBuffer, PipeLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(SUniformSpriteMultiPushGPosBase) + sizeof(vec4) * pCommand->m_DrawCount, &PushConstantVertex); - vkCmdPushConstants(CommandBuffer, PipeLayout, VK_SHADER_STAGE_FRAGMENT_BIT, sizeof(SUniformSpriteMultiPushGPos), sizeof(PushConstantColor), &PushConstantColor); - } - else - { - SUniformSpriteMultiGVertColor PushConstantColor; - SUniformSpriteMultiGPos PushConstantVertex; - - PushConstantColor = pCommand->m_VertexColor; - - mem_copy(PushConstantVertex.m_aPos, m.data(), sizeof(PushConstantVertex.m_aPos)); - PushConstantVertex.m_Center = pCommand->m_Center; - - vkCmdPushConstants(CommandBuffer, PipeLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(PushConstantVertex), &PushConstantVertex); - vkCmdPushConstants(CommandBuffer, PipeLayout, VK_SHADER_STAGE_FRAGMENT_BIT, sizeof(SUniformSpriteMultiGPos) + sizeof(SUniformSpriteMultiGVertColorAlign), sizeof(PushConstantColor), &PushConstantColor); - } - - const int RSPCount = 512; - int DrawCount = pCommand->m_DrawCount; - size_t RenderOffset = 0; - - while(DrawCount > 0) - { - int UniformCount = (DrawCount > RSPCount ? RSPCount : DrawCount); - - if(!CanBePushed) - { - // create uniform buffer - SDeviceDescriptorSet UniDescrSet; - if(!GetUniformBufferObject(ExecBuffer.m_ThreadIndex, false, UniDescrSet, UniformCount, (const float *)(pCommand->m_pRenderInfo + RenderOffset), UniformCount * sizeof(IGraphics::SRenderSpriteInfo))) - return false; - - vkCmdBindDescriptorSets(CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, PipeLayout, 1, 1, &UniDescrSet.m_Descriptor, 0, nullptr); - } - - vkCmdDrawIndexed(CommandBuffer, static_cast(pCommand->m_DrawNum), UniformCount, 0, 0, 0); - - RenderOffset += RSPCount; - DrawCount -= RSPCount; - } - - return true; - } - - [[nodiscard]] bool Cmd_WindowCreateNtf(const CCommandBuffer::SCommand_WindowCreateNtf *pCommand) - { - log_debug("vulkan", "creating new surface."); - m_pWindow = SDL_GetWindowFromID(pCommand->m_WindowId); - if(m_RenderingPaused) - { -#ifdef CONF_PLATFORM_ANDROID - if(!CreateSurface(m_pWindow)) - return false; - m_RecreateSwapChain = true; -#endif - m_RenderingPaused = false; - if(!PureMemoryFrame()) - return false; - if(!PrepareFrame()) - return false; - } - - return true; - } - - [[nodiscard]] bool Cmd_WindowDestroyNtf(const CCommandBuffer::SCommand_WindowDestroyNtf *pCommand) - { - log_debug("vulkan", "surface got destroyed."); - if(!m_RenderingPaused) - { - if(!WaitFrame()) - return false; - m_RenderingPaused = true; - vkDeviceWaitIdle(m_VKDevice); -#ifdef CONF_PLATFORM_ANDROID - CleanupVulkanSwapChain(true); -#endif - } - - return true; - } - - [[nodiscard]] bool Cmd_PreInit(const CCommandProcessorFragment_GLBase::SCommand_PreInit *pCommand) - { - m_pGpuList = pCommand->m_pGpuList; - if(InitVulkanSDL(pCommand->m_pWindow, pCommand->m_Width, pCommand->m_Height, pCommand->m_pRendererString, pCommand->m_pVendorString, pCommand->m_pVersionString) != 0) - { - m_VKInstance = VK_NULL_HANDLE; - } - - RegisterCommands(); - - m_ThreadCount = g_Config.m_GfxRenderThreadCount; - if(m_ThreadCount <= 1) - m_ThreadCount = 1; - else - { - m_ThreadCount = clamp(m_ThreadCount, 3, std::max(3, std::thread::hardware_concurrency())); - } - - // start threads - dbg_assert(m_ThreadCount != 2, "Either use 1 main thread or at least 2 extra rendering threads."); - if(m_ThreadCount > 1) - { - m_vvThreadCommandLists.resize(m_ThreadCount - 1); - m_vThreadHelperHadCommands.resize(m_ThreadCount - 1, false); - for(auto &ThreadCommandList : m_vvThreadCommandLists) - { - ThreadCommandList.reserve(256); - } - - for(size_t i = 0; i < m_ThreadCount - 1; ++i) - { - auto *pRenderThread = new SRenderThread(); - std::unique_lock Lock(pRenderThread->m_Mutex); - m_vpRenderThreads.emplace_back(pRenderThread); - pRenderThread->m_Thread = std::thread([this, i]() { RunThread(i); }); - // wait until thread started - pRenderThread->m_Cond.wait(Lock, [pRenderThread]() -> bool { return pRenderThread->m_Started; }); - } - } - - return true; - } - - [[nodiscard]] bool Cmd_PostShutdown(const CCommandProcessorFragment_GLBase::SCommand_PostShutdown *pCommand) - { - for(size_t i = 0; i < m_ThreadCount - 1; ++i) - { - auto *pThread = m_vpRenderThreads[i].get(); - { - std::unique_lock Lock(pThread->m_Mutex); - pThread->m_Finished = true; - pThread->m_Cond.notify_one(); - } - pThread->m_Thread.join(); - } - m_vpRenderThreads.clear(); - m_vvThreadCommandLists.clear(); - m_vThreadHelperHadCommands.clear(); - - m_ThreadCount = 1; - - CleanupVulkanSDL(); - - return true; - } - - void StartCommands(size_t CommandCount, size_t EstimatedRenderCallCount) override - { - m_CommandsInPipe = CommandCount; - m_RenderCallsInPipe = EstimatedRenderCallCount; - m_CurCommandInPipe = 0; - m_CurRenderCallCountInPipe = 0; - } - - void EndCommands() override - { - FinishRenderThreads(); - m_CommandsInPipe = 0; - m_RenderCallsInPipe = 0; - } - - /**************** - * RENDER THREADS - *****************/ - - void RunThread(size_t ThreadIndex) - { - auto *pThread = m_vpRenderThreads[ThreadIndex].get(); - std::unique_lock Lock(pThread->m_Mutex); - pThread->m_Started = true; - pThread->m_Cond.notify_one(); - - while(!pThread->m_Finished) - { - pThread->m_Cond.wait(Lock, [pThread]() -> bool { return pThread->m_IsRendering || pThread->m_Finished; }); - pThread->m_Cond.notify_one(); - - // set this to true, if you want to benchmark the render thread times - static constexpr bool s_BenchmarkRenderThreads = false; - std::chrono::nanoseconds ThreadRenderTime = 0ns; - if(IsVerbose() && s_BenchmarkRenderThreads) - { - ThreadRenderTime = time_get_nanoseconds(); - } - - if(!pThread->m_Finished) - { - bool HasErrorFromCmd = false; - for(auto &NextCmd : m_vvThreadCommandLists[ThreadIndex]) - { - if(!m_aCommandCallbacks[CommandBufferCMDOff(NextCmd.m_Command)].m_CommandCB(NextCmd.m_pRawCommand, NextCmd)) - { - // an error occurred, the thread will not continue execution - HasErrorFromCmd = true; - break; - } - } - m_vvThreadCommandLists[ThreadIndex].clear(); - - if(!HasErrorFromCmd && m_vvUsedThreadDrawCommandBuffer[ThreadIndex + 1][m_CurImageIndex]) - { - auto &GraphicThreadCommandBuffer = m_vvThreadDrawCommandBuffers[ThreadIndex + 1][m_CurImageIndex]; - vkEndCommandBuffer(GraphicThreadCommandBuffer); - } - } - - if(IsVerbose() && s_BenchmarkRenderThreads) - { - dbg_msg("vulkan", "render thread %" PRIzu " took %d ns to finish", ThreadIndex, (int)(time_get_nanoseconds() - ThreadRenderTime).count()); - } - - pThread->m_IsRendering = false; - } - } -}; - -CCommandProcessorFragment_GLBase *CreateVulkanCommandProcessorFragment() -{ - return new CCommandProcessorFragment_Vulkan(); -} - -#endif diff --git a/src/engine/client/backend/vulkan/backend_vulkan.h b/src/engine/client/backend/vulkan/backend_vulkan.h deleted file mode 100644 index 272414dd4b..0000000000 --- a/src/engine/client/backend/vulkan/backend_vulkan.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef ENGINE_CLIENT_BACKEND_VULKAN_BACKEND_VULKAN_H -#define ENGINE_CLIENT_BACKEND_VULKAN_BACKEND_VULKAN_H - -class CCommandProcessorFragment_GLBase; - -static constexpr int gs_BackendVulkanMajor = 1; -static constexpr int gs_BackendVulkanMinor = 1; - -CCommandProcessorFragment_GLBase *CreateVulkanCommandProcessorFragment(); - -#endif diff --git a/src/engine/client/backend_sdl.cpp b/src/engine/client/backend_sdl.cpp deleted file mode 100644 index cb42a1cfcf..0000000000 --- a/src/engine/client/backend_sdl.cpp +++ /dev/null @@ -1,1647 +0,0 @@ -#include - -#ifndef CONF_BACKEND_OPENGL_ES -#include -#endif - -#include -#include - -#include -#include - -#include -#include - -#include - -#if defined(CONF_VIDEORECORDER) -#include -#endif - -#include "backend_sdl.h" - -#if defined(CONF_HEADLESS_CLIENT) -#include "backend/null/backend_null.h" -#endif - -#if !defined(CONF_BACKEND_OPENGL_ES) -#include "backend/opengl/backend_opengl3.h" -#endif - -#if defined(CONF_BACKEND_OPENGL_ES3) || defined(CONF_BACKEND_OPENGL_ES) -#include "backend/opengles/backend_opengles3.h" -#endif - -#if defined(CONF_BACKEND_VULKAN) -#include "backend/vulkan/backend_vulkan.h" -#endif - -#include "graphics_threaded.h" - -#include - -class IStorage; - -// ------------ CGraphicsBackend_Threaded - -void CGraphicsBackend_Threaded::ThreadFunc(void *pUser) -{ - auto *pSelf = (CGraphicsBackend_Threaded *)pUser; - std::unique_lock Lock(pSelf->m_BufferSwapMutex); - // notify, that the thread started - pSelf->m_Started = true; - pSelf->m_BufferSwapCond.notify_all(); - while(!pSelf->m_Shutdown) - { - pSelf->m_BufferSwapCond.wait(Lock, [&pSelf] { return pSelf->m_pBuffer != nullptr || pSelf->m_Shutdown; }); - if(pSelf->m_pBuffer) - { -#ifdef CONF_PLATFORM_MACOS - CAutoreleasePool AutoreleasePool; -#endif - pSelf->m_pProcessor->RunBuffer(pSelf->m_pBuffer); - - pSelf->m_pBuffer = nullptr; - pSelf->m_BufferInProcess.store(false, std::memory_order_relaxed); - pSelf->m_BufferSwapCond.notify_all(); - -#if defined(CONF_VIDEORECORDER) - if(IVideo::Current()) - IVideo::Current()->NextVideoFrameThread(); -#endif - } - } -} - -CGraphicsBackend_Threaded::CGraphicsBackend_Threaded(TTranslateFunc &&TranslateFunc) : - m_TranslateFunc(std::move(TranslateFunc)) -{ - m_pBuffer = nullptr; - m_pProcessor = nullptr; - m_Shutdown = true; - m_BufferInProcess.store(false, std::memory_order_relaxed); -} - -void CGraphicsBackend_Threaded::StartProcessor(ICommandProcessor *pProcessor) -{ - dbg_assert(m_Shutdown, "Processor was already not shut down."); - m_Shutdown = false; - m_pProcessor = pProcessor; - std::unique_lock Lock(m_BufferSwapMutex); - m_pThread = thread_init(ThreadFunc, this, "Graphics thread"); - // wait for the thread to start - m_BufferSwapCond.wait(Lock, [this]() -> bool { return m_Started; }); -} - -void CGraphicsBackend_Threaded::StopProcessor() -{ - dbg_assert(!m_Shutdown, "Processor was already shut down."); - m_Shutdown = true; - { - std::unique_lock Lock(m_BufferSwapMutex); - m_Warning = m_pProcessor->GetWarning(); - m_BufferSwapCond.notify_all(); - } - thread_wait(m_pThread); -} - -void CGraphicsBackend_Threaded::RunBuffer(CCommandBuffer *pBuffer) -{ - SGfxErrorContainer Error; -#ifdef CONF_WEBASM - // run everything single threaded for now, context binding in a thread seems to not work as of now - Error = m_pProcessor->GetError(); - if(Error.m_ErrorType == GFX_ERROR_TYPE_NONE) - { - RunBufferSingleThreadedUnsafe(pBuffer); - } -#else - WaitForIdle(); - { - std::unique_lock Lock(m_BufferSwapMutex); - Error = m_pProcessor->GetError(); - if(Error.m_ErrorType == GFX_ERROR_TYPE_NONE) - { - m_pBuffer = pBuffer; - m_BufferInProcess.store(true, std::memory_order_relaxed); - m_BufferSwapCond.notify_all(); - } - } -#endif - - // Process error after lock is released to prevent deadlock - if(Error.m_ErrorType != GFX_ERROR_TYPE_NONE) - { - ProcessError(Error); - } -} - -void CGraphicsBackend_Threaded::RunBufferSingleThreadedUnsafe(CCommandBuffer *pBuffer) -{ - m_pProcessor->RunBuffer(pBuffer); -} - -bool CGraphicsBackend_Threaded::IsIdle() const -{ - return !m_BufferInProcess.load(std::memory_order_relaxed); -} - -void CGraphicsBackend_Threaded::WaitForIdle() -{ - std::unique_lock Lock(m_BufferSwapMutex); - m_BufferSwapCond.wait(Lock, [this]() { return m_pBuffer == nullptr; }); -} - -void CGraphicsBackend_Threaded::ProcessError(const SGfxErrorContainer &Error) -{ - std::string VerboseStr = "Graphics Assertion:"; - for(const auto &ErrStr : Error.m_vErrors) - { - VerboseStr.append("\n"); - if(ErrStr.m_RequiresTranslation) - VerboseStr.append(m_TranslateFunc(ErrStr.m_Err.c_str(), "")); - else - VerboseStr.append(ErrStr.m_Err); - } - dbg_assert(false, VerboseStr.c_str()); -} - -bool CGraphicsBackend_Threaded::GetWarning(std::vector &WarningStrings) -{ - if(m_Warning.m_WarningType != GFX_WARNING_TYPE_NONE) - { - m_Warning.m_WarningType = GFX_WARNING_TYPE_NONE; - WarningStrings = m_Warning.m_vWarnings; - return true; - } - return false; -} - -// ------------ CCommandProcessorFragment_General - -void CCommandProcessorFragment_General::Cmd_Signal(const CCommandBuffer::SCommand_Signal *pCommand) -{ - pCommand->m_pSemaphore->Signal(); -} - -bool CCommandProcessorFragment_General::RunCommand(const CCommandBuffer::SCommand *pBaseCommand) -{ - switch(pBaseCommand->m_Cmd) - { - case CCommandBuffer::CMD_NOP: break; - case CCommandBuffer::CMD_SIGNAL: Cmd_Signal(static_cast(pBaseCommand)); break; - default: return false; - } - - return true; -} - -// ------------ CCommandProcessorFragment_SDL -void CCommandProcessorFragment_SDL::Cmd_Init(const SCommand_Init *pCommand) -{ - m_GLContext = pCommand->m_GLContext; - m_pWindow = pCommand->m_pWindow; - if(m_GLContext) - SDL_GL_MakeCurrent(m_pWindow, m_GLContext); -} - -void CCommandProcessorFragment_SDL::Cmd_Shutdown(const SCommand_Shutdown *pCommand) -{ - if(m_GLContext) - SDL_GL_MakeCurrent(NULL, NULL); -} - -void CCommandProcessorFragment_SDL::Cmd_Swap(const CCommandBuffer::SCommand_Swap *pCommand) -{ - if(m_GLContext) - SDL_GL_SwapWindow(m_pWindow); -} - -void CCommandProcessorFragment_SDL::Cmd_VSync(const CCommandBuffer::SCommand_VSync *pCommand) -{ - if(m_GLContext) - *pCommand->m_pRetOk = SDL_GL_SetSwapInterval(pCommand->m_VSync) == 0; -} - -void CCommandProcessorFragment_SDL::Cmd_WindowCreateNtf(const CCommandBuffer::SCommand_WindowCreateNtf *pCommand) -{ - m_pWindow = SDL_GetWindowFromID(pCommand->m_WindowId); - // Android destroys windows when they are not visible, so we get the new one and work with that - // The graphic context does not need to be recreated, just unbound see @see SCommand_WindowDestroyNtf -#ifdef CONF_PLATFORM_ANDROID - if(m_GLContext) - SDL_GL_MakeCurrent(m_pWindow, m_GLContext); - dbg_msg("gfx", "render surface created."); -#endif -} - -void CCommandProcessorFragment_SDL::Cmd_WindowDestroyNtf(const CCommandBuffer::SCommand_WindowDestroyNtf *pCommand) -{ - // Unbind the graphic context from the window, so it does not get destroyed -#ifdef CONF_PLATFORM_ANDROID - dbg_msg("gfx", "render surface destroyed."); - if(m_GLContext) - SDL_GL_MakeCurrent(NULL, NULL); -#endif -} - -CCommandProcessorFragment_SDL::CCommandProcessorFragment_SDL() = default; - -bool CCommandProcessorFragment_SDL::RunCommand(const CCommandBuffer::SCommand *pBaseCommand) -{ - switch(pBaseCommand->m_Cmd) - { - case CCommandBuffer::CMD_WINDOW_CREATE_NTF: Cmd_WindowCreateNtf(static_cast(pBaseCommand)); break; - case CCommandBuffer::CMD_WINDOW_DESTROY_NTF: Cmd_WindowDestroyNtf(static_cast(pBaseCommand)); break; - case CCommandBuffer::CMD_SWAP: Cmd_Swap(static_cast(pBaseCommand)); break; - case CCommandBuffer::CMD_VSYNC: Cmd_VSync(static_cast(pBaseCommand)); break; - case CCommandBuffer::CMD_MULTISAMPLING: break; - case CMD_INIT: Cmd_Init(static_cast(pBaseCommand)); break; - case CMD_SHUTDOWN: Cmd_Shutdown(static_cast(pBaseCommand)); break; - case CCommandProcessorFragment_GLBase::CMD_PRE_INIT: break; - case CCommandProcessorFragment_GLBase::CMD_POST_SHUTDOWN: break; - default: return false; - } - - return true; -} - -// ------------ CCommandProcessor_SDL_GL - -void CCommandProcessor_SDL_GL::HandleError() -{ - switch(m_Error.m_ErrorType) - { - case GFX_ERROR_TYPE_INIT: - m_Error.m_vErrors.emplace_back(SGfxErrorContainer::SError{true, Localizable("Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again.", "Graphics error")}); - break; - case GFX_ERROR_TYPE_OUT_OF_MEMORY_IMAGE: - [[fallthrough]]; - case GFX_ERROR_TYPE_OUT_OF_MEMORY_BUFFER: - [[fallthrough]]; - case GFX_ERROR_TYPE_OUT_OF_MEMORY_STAGING: - m_Error.m_vErrors.emplace_back(SGfxErrorContainer::SError{true, Localizable("Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution.", "Graphics error")}); - break; - case GFX_ERROR_TYPE_RENDER_RECORDING: - m_Error.m_vErrors.emplace_back(SGfxErrorContainer::SError{true, Localizable("An error during command recording occurred. Try to update your GPU drivers.", "Graphics error")}); - break; - case GFX_ERROR_TYPE_RENDER_CMD_FAILED: - m_Error.m_vErrors.emplace_back(SGfxErrorContainer::SError{true, Localizable("A render command failed. Try to update your GPU drivers.", "Graphics error")}); - break; - case GFX_ERROR_TYPE_RENDER_SUBMIT_FAILED: - m_Error.m_vErrors.emplace_back(SGfxErrorContainer::SError{true, Localizable("Submitting the render commands failed. Try to update your GPU drivers.", "Graphics error")}); - break; - case GFX_ERROR_TYPE_SWAP_FAILED: - m_Error.m_vErrors.emplace_back(SGfxErrorContainer::SError{true, Localizable("Failed to swap framebuffers. Try to update your GPU drivers.", "Graphics error")}); - break; - case GFX_ERROR_TYPE_UNKNOWN: - [[fallthrough]]; - default: - m_Error.m_vErrors.emplace_back(SGfxErrorContainer::SError{true, Localizable("Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again.", "Graphics error")}); - break; - } -} - -void CCommandProcessor_SDL_GL::HandleWarning() -{ - switch(m_Warning.m_WarningType) - { - case GFX_WARNING_TYPE_INIT_FAILED: - m_Warning.m_vWarnings.emplace_back(Localizable("Could not initialize the given graphics backend, reverting to the default backend now.", "Graphics error")); - break; - case GFX_WARNING_TYPE_INIT_FAILED_MISSING_INTEGRATED_GPU_DRIVER: - m_Warning.m_vWarnings.emplace_back(Localizable("Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.", "Graphics error")); - break; - case GFX_WARNING_MISSING_EXTENSION: - // ignore this warning for now - return; - case GFX_WARNING_LOW_ON_MEMORY: - // ignore this warning for now - return; - default: - dbg_msg("gfx", "unhandled warning %d", (int)m_Warning.m_WarningType); - break; - } -} - -void CCommandProcessor_SDL_GL::RunBuffer(CCommandBuffer *pBuffer) -{ - m_pGLBackend->StartCommands(pBuffer->m_CommandCount, pBuffer->m_RenderCallCount); - - for(CCommandBuffer::SCommand *pCommand = pBuffer->Head(); pCommand; pCommand = pCommand->m_pNext) - { - auto Res = m_pGLBackend->RunCommand(pCommand); - if(Res == ERunCommandReturnTypes::RUN_COMMAND_COMMAND_HANDLED) - { - continue; - } - else if(Res == ERunCommandReturnTypes::RUN_COMMAND_COMMAND_ERROR) - { - m_Error = m_pGLBackend->GetError(); - HandleError(); - return; - } - else if(Res == ERunCommandReturnTypes::RUN_COMMAND_COMMAND_WARNING) - { - m_Warning = m_pGLBackend->GetWarning(); - HandleWarning(); - return; - } - - if(m_SDL.RunCommand(pCommand)) - continue; - - if(m_General.RunCommand(pCommand)) - continue; - - dbg_msg("gfx", "unknown command %d", pCommand->m_Cmd); - } - - m_pGLBackend->EndCommands(); -} - -CCommandProcessor_SDL_GL::CCommandProcessor_SDL_GL(EBackendType BackendType, int GLMajor, int GLMinor, int GLPatch) -{ - m_BackendType = BackendType; - -#if defined(CONF_HEADLESS_CLIENT) - m_pGLBackend = new CCommandProcessorFragment_Null(); -#else - if(BackendType == BACKEND_TYPE_OPENGL_ES) - { -#if defined(CONF_BACKEND_OPENGL_ES) || defined(CONF_BACKEND_OPENGL_ES3) - if(GLMajor < 3) - { - m_pGLBackend = new CCommandProcessorFragment_OpenGLES(); - } - else - { - m_pGLBackend = new CCommandProcessorFragment_OpenGLES3(); - } -#endif - } - else if(BackendType == BACKEND_TYPE_OPENGL) - { -#if !defined(CONF_BACKEND_OPENGL_ES) - if(GLMajor < 2) - { - m_pGLBackend = new CCommandProcessorFragment_OpenGL(); - } - if(GLMajor == 2) - { - m_pGLBackend = new CCommandProcessorFragment_OpenGL2(); - } - if(GLMajor == 3 && GLMinor == 0) - { - m_pGLBackend = new CCommandProcessorFragment_OpenGL3(); - } - else if((GLMajor == 3 && GLMinor == 3) || GLMajor >= 4) - { - m_pGLBackend = new CCommandProcessorFragment_OpenGL3_3(); - } -#endif - } - else if(BackendType == BACKEND_TYPE_VULKAN) - { -#if defined(CONF_BACKEND_VULKAN) - m_pGLBackend = CreateVulkanCommandProcessorFragment(); -#endif - } -#endif -} - -CCommandProcessor_SDL_GL::~CCommandProcessor_SDL_GL() -{ - delete m_pGLBackend; -} - -const SGfxErrorContainer &CCommandProcessor_SDL_GL::GetError() const -{ - return m_Error; -} - -void CCommandProcessor_SDL_GL::ErroneousCleanup() -{ - m_pGLBackend->ErroneousCleanup(); -} - -const SGfxWarningContainer &CCommandProcessor_SDL_GL::GetWarning() const -{ - return m_Warning; -} - -// ------------ CGraphicsBackend_SDL_GL - -static bool BackendInitGlew(EBackendType BackendType, int &GlewMajor, int &GlewMinor, int &GlewPatch) -{ - if(BackendType == BACKEND_TYPE_OPENGL) - { -#ifndef CONF_BACKEND_OPENGL_ES - // support graphic cards that are pretty old(and linux) - glewExperimental = GL_TRUE; -#ifdef CONF_GLEW_HAS_CONTEXT_INIT - if(GLEW_OK != glewContextInit()) -#else - GLenum InitResult = glewInit(); - const char *pVideoDriver = SDL_GetCurrentVideoDriver(); - if(GLEW_OK != InitResult && pVideoDriver && !str_comp(pVideoDriver, "wayland") && GLEW_ERROR_NO_GLX_DISPLAY != InitResult) -#endif - return false; - -#ifdef GLEW_VERSION_4_6 - if(GLEW_VERSION_4_6) - { - GlewMajor = 4; - GlewMinor = 6; - GlewPatch = 0; - return true; - } -#endif -#ifdef GLEW_VERSION_4_5 - if(GLEW_VERSION_4_5) - { - GlewMajor = 4; - GlewMinor = 5; - GlewPatch = 0; - return true; - } -#endif -// Don't allow GL 3.3, if the driver doesn't support at least OpenGL 4.5 -#ifndef CONF_FAMILY_WINDOWS - if(GLEW_VERSION_4_4) - { - GlewMajor = 4; - GlewMinor = 4; - GlewPatch = 0; - return true; - } - if(GLEW_VERSION_4_3) - { - GlewMajor = 4; - GlewMinor = 3; - GlewPatch = 0; - return true; - } - if(GLEW_VERSION_4_2) - { - GlewMajor = 4; - GlewMinor = 2; - GlewPatch = 0; - return true; - } - if(GLEW_VERSION_4_1) - { - GlewMajor = 4; - GlewMinor = 1; - GlewPatch = 0; - return true; - } - if(GLEW_VERSION_4_0) - { - GlewMajor = 4; - GlewMinor = 0; - GlewPatch = 0; - return true; - } - if(GLEW_VERSION_3_3) - { - GlewMajor = 3; - GlewMinor = 3; - GlewPatch = 0; - return true; - } -#endif - if(GLEW_VERSION_3_0) - { - GlewMajor = 3; - GlewMinor = 0; - GlewPatch = 0; - return true; - } - if(GLEW_VERSION_2_1) - { - GlewMajor = 2; - GlewMinor = 1; - GlewPatch = 0; - return true; - } - if(GLEW_VERSION_2_0) - { - GlewMajor = 2; - GlewMinor = 0; - GlewPatch = 0; - return true; - } - if(GLEW_VERSION_1_5) - { - GlewMajor = 1; - GlewMinor = 5; - GlewPatch = 0; - return true; - } - if(GLEW_VERSION_1_4) - { - GlewMajor = 1; - GlewMinor = 4; - GlewPatch = 0; - return true; - } - if(GLEW_VERSION_1_3) - { - GlewMajor = 1; - GlewMinor = 3; - GlewPatch = 0; - return true; - } - if(GLEW_VERSION_1_2_1) - { - GlewMajor = 1; - GlewMinor = 2; - GlewPatch = 1; - return true; - } - if(GLEW_VERSION_1_2) - { - GlewMajor = 1; - GlewMinor = 2; - GlewPatch = 0; - return true; - } - if(GLEW_VERSION_1_1) - { - GlewMajor = 1; - GlewMinor = 1; - GlewPatch = 0; - return true; - } -#endif - } - else if(BackendType == BACKEND_TYPE_OPENGL_ES) - { - // just assume the version we need - GlewMajor = 3; - GlewMinor = 0; - GlewPatch = 0; - - return true; - } - - return true; -} - -static int IsVersionSupportedGlew(EBackendType BackendType, int VersionMajor, int VersionMinor, int VersionPatch, int GlewMajor, int GlewMinor, int GlewPatch) -{ - int InitError = 0; - - if(BackendType == BACKEND_TYPE_OPENGL) - { - if(VersionMajor >= 4 && GlewMajor < 4) - { - InitError = -1; - } - else if(VersionMajor >= 3 && GlewMajor < 3) - { - InitError = -1; - } - else if(VersionMajor == 3 && GlewMajor == 3) - { - if(VersionMinor >= 3 && GlewMinor < 3) - { - InitError = -1; - } - if(VersionMinor >= 2 && GlewMinor < 2) - { - InitError = -1; - } - if(VersionMinor >= 1 && GlewMinor < 1) - { - InitError = -1; - } - if(VersionMinor >= 0 && GlewMinor < 0) - { - InitError = -1; - } - } - else if(VersionMajor >= 2 && GlewMajor < 2) - { - InitError = -1; - } - else if(VersionMajor == 2 && GlewMajor == 2) - { - if(VersionMinor >= 1 && GlewMinor < 1) - { - InitError = -1; - } - if(VersionMinor >= 0 && GlewMinor < 0) - { - InitError = -1; - } - } - else if(VersionMajor >= 1 && GlewMajor < 1) - { - InitError = -1; - } - else if(VersionMajor == 1 && GlewMajor == 1) - { - if(VersionMinor >= 5 && GlewMinor < 5) - { - InitError = -1; - } - if(VersionMinor >= 4 && GlewMinor < 4) - { - InitError = -1; - } - if(VersionMinor >= 3 && GlewMinor < 3) - { - InitError = -1; - } - if(VersionMinor >= 2 && GlewMinor < 2) - { - InitError = -1; - } - else if(VersionMinor == 2 && GlewMinor == 2) - { - if(VersionPatch >= 1 && GlewPatch < 1) - { - InitError = -1; - } - if(VersionPatch >= 0 && GlewPatch < 0) - { - InitError = -1; - } - } - if(VersionMinor >= 1 && GlewMinor < 1) - { - InitError = -1; - } - if(VersionMinor >= 0 && GlewMinor < 0) - { - InitError = -1; - } - } - } - - return InitError; -} - -EBackendType CGraphicsBackend_SDL_GL::DetectBackend() -{ - EBackendType RetBackendType = BACKEND_TYPE_OPENGL; -#if defined(CONF_BACKEND_VULKAN) - const char *pEnvDriver = SDL_getenv("DDNET_DRIVER"); - if(pEnvDriver && str_comp_nocase(pEnvDriver, "GLES") == 0) - RetBackendType = BACKEND_TYPE_OPENGL_ES; - else if(pEnvDriver && str_comp_nocase(pEnvDriver, "Vulkan") == 0) - RetBackendType = BACKEND_TYPE_VULKAN; - else if(pEnvDriver && str_comp_nocase(pEnvDriver, "OpenGL") == 0) - RetBackendType = BACKEND_TYPE_OPENGL; - else if(pEnvDriver == nullptr) - { - // load the config backend - const char *pConfBackend = g_Config.m_GfxBackend; - if(str_comp_nocase(pConfBackend, "GLES") == 0) - RetBackendType = BACKEND_TYPE_OPENGL_ES; - else if(str_comp_nocase(pConfBackend, "Vulkan") == 0) - RetBackendType = BACKEND_TYPE_VULKAN; - else if(str_comp_nocase(pConfBackend, "OpenGL") == 0) - RetBackendType = BACKEND_TYPE_OPENGL; - } -#else - RetBackendType = BACKEND_TYPE_OPENGL; -#endif -#if !defined(CONF_BACKEND_OPENGL_ES) && !defined(CONF_BACKEND_OPENGL_ES3) - if(RetBackendType == BACKEND_TYPE_OPENGL_ES) - RetBackendType = BACKEND_TYPE_OPENGL; -#elif defined(CONF_BACKEND_OPENGL_ES) - if(RetBackendType == BACKEND_TYPE_OPENGL) - RetBackendType = BACKEND_TYPE_OPENGL_ES; -#endif - return RetBackendType; -} - -void CGraphicsBackend_SDL_GL::ClampDriverVersion(EBackendType BackendType) -{ - if(BackendType == BACKEND_TYPE_OPENGL) - { - // clamp the versions to existing versions(only for OpenGL major <= 3) - if(g_Config.m_GfxGLMajor == 1) - { - g_Config.m_GfxGLMinor = clamp(g_Config.m_GfxGLMinor, 1, 5); - if(g_Config.m_GfxGLMinor == 2) - g_Config.m_GfxGLPatch = clamp(g_Config.m_GfxGLPatch, 0, 1); - else - g_Config.m_GfxGLPatch = 0; - } - else if(g_Config.m_GfxGLMajor == 2) - { - g_Config.m_GfxGLMinor = clamp(g_Config.m_GfxGLMinor, 0, 1); - g_Config.m_GfxGLPatch = 0; - } - else if(g_Config.m_GfxGLMajor == 3) - { - g_Config.m_GfxGLMinor = clamp(g_Config.m_GfxGLMinor, 0, 3); - if(g_Config.m_GfxGLMinor < 3) - g_Config.m_GfxGLMinor = 0; - g_Config.m_GfxGLPatch = 0; - } - } - else if(BackendType == BACKEND_TYPE_OPENGL_ES) - { -#if !defined(CONF_BACKEND_OPENGL_ES3) - // Make sure GLES is set to 1.0 (which is equivalent to OpenGL 1.3), if its not set to >= 3.0(which is equivalent to OpenGL 3.3) - if(g_Config.m_GfxGLMajor < 3) - { - g_Config.m_GfxGLMajor = 1; - g_Config.m_GfxGLMinor = 0; - g_Config.m_GfxGLPatch = 0; - - // GLES also doesn't know GL_QUAD - g_Config.m_GfxQuadAsTriangle = 1; - } -#else - g_Config.m_GfxGLMajor = 3; - g_Config.m_GfxGLMinor = 0; - g_Config.m_GfxGLPatch = 0; -#endif - } - else if(BackendType == BACKEND_TYPE_VULKAN) - { -#if defined(CONF_BACKEND_VULKAN) - g_Config.m_GfxGLMajor = gs_BackendVulkanMajor; - g_Config.m_GfxGLMinor = gs_BackendVulkanMinor; - g_Config.m_GfxGLPatch = 0; -#endif - } -} - -bool CGraphicsBackend_SDL_GL::ShowMessageBox(unsigned Type, const char *pTitle, const char *pMsg) -{ - if(m_pProcessor != nullptr) - { - m_pProcessor->ErroneousCleanup(); - } - // TODO: Remove this workaround when https://github.com/libsdl-org/SDL/issues/3750 is - // fixed and pass the window to SDL_ShowSimpleMessageBox to make the popup modal instead - // of destroying the window before opening the popup. - if(m_pWindow != nullptr) - { - SDL_DestroyWindow(m_pWindow); - m_pWindow = nullptr; - } - return SDL_ShowSimpleMessageBox(Type, pTitle, pMsg, nullptr) == 0; -} - -bool CGraphicsBackend_SDL_GL::IsModernAPI(EBackendType BackendType) -{ - if(BackendType == BACKEND_TYPE_OPENGL) - return (g_Config.m_GfxGLMajor == 3 && g_Config.m_GfxGLMinor == 3) || g_Config.m_GfxGLMajor >= 4; - else if(BackendType == BACKEND_TYPE_OPENGL_ES) - return g_Config.m_GfxGLMajor >= 3; - else if(BackendType == BACKEND_TYPE_VULKAN) - return true; - - return false; -} - -bool CGraphicsBackend_SDL_GL::GetDriverVersion(EGraphicsDriverAgeType DriverAgeType, int &Major, int &Minor, int &Patch, const char *&pName, EBackendType BackendType) -{ - if(BackendType == BACKEND_TYPE_AUTO) - BackendType = m_BackendType; - if(BackendType == BACKEND_TYPE_OPENGL) - { - pName = "OpenGL"; -#ifndef CONF_BACKEND_OPENGL_ES - if(DriverAgeType == GRAPHICS_DRIVER_AGE_TYPE_LEGACY) - { - Major = 1; - Minor = 4; - Patch = 0; - return true; - } - else if(DriverAgeType == GRAPHICS_DRIVER_AGE_TYPE_DEFAULT) - { - Major = 3; - Minor = 0; - Patch = 0; - return true; - } - else if(DriverAgeType == GRAPHICS_DRIVER_AGE_TYPE_MODERN) - { - Major = 3; - Minor = 3; - Patch = 0; - return true; - } -#endif - } - else if(BackendType == BACKEND_TYPE_OPENGL_ES) - { - pName = "GLES"; -#ifdef CONF_BACKEND_OPENGL_ES - if(DriverAgeType == GRAPHICS_DRIVER_AGE_TYPE_LEGACY) - { - Major = 1; - Minor = 0; - Patch = 0; - return true; - } - else if(DriverAgeType == GRAPHICS_DRIVER_AGE_TYPE_DEFAULT) - { - Major = 3; - Minor = 0; - Patch = 0; - // there isn't really a default one - return false; - } -#endif -#ifdef CONF_BACKEND_OPENGL_ES3 - if(DriverAgeType == GRAPHICS_DRIVER_AGE_TYPE_MODERN) - { - Major = 3; - Minor = 0; - Patch = 0; - return true; - } -#endif - } - else if(BackendType == BACKEND_TYPE_VULKAN) - { - pName = "Vulkan"; -#ifdef CONF_BACKEND_VULKAN - if(DriverAgeType == GRAPHICS_DRIVER_AGE_TYPE_DEFAULT) - { - Major = gs_BackendVulkanMajor; - Minor = gs_BackendVulkanMinor; - Patch = 0; - return true; - } -#else - return false; -#endif - } - return false; -} - -const char *CGraphicsBackend_SDL_GL::GetScreenName(int Screen) const -{ - const char *pName = SDL_GetDisplayName(Screen); - return pName == nullptr ? "unknown/error" : pName; -} - -static void DisplayToVideoMode(CVideoMode *pVMode, SDL_DisplayMode *pMode, int HiDPIScale, int RefreshRate) -{ - pVMode->m_CanvasWidth = pMode->w * HiDPIScale; - pVMode->m_CanvasHeight = pMode->h * HiDPIScale; - pVMode->m_WindowWidth = pMode->w; - pVMode->m_WindowHeight = pMode->h; - pVMode->m_RefreshRate = RefreshRate; - pVMode->m_Red = SDL_BITSPERPIXEL(pMode->format); - pVMode->m_Green = SDL_BITSPERPIXEL(pMode->format); - pVMode->m_Blue = SDL_BITSPERPIXEL(pMode->format); - pVMode->m_Format = pMode->format; -} - -void CGraphicsBackend_SDL_GL::GetVideoModes(CVideoMode *pModes, int MaxModes, int *pNumModes, int HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int ScreenId) -{ - SDL_DisplayMode DesktopMode; - int MaxModesAvailable = SDL_GetNumDisplayModes(ScreenId); - - // Only collect fullscreen modes when requested, that makes sure in windowed mode no refresh rates are shown that aren't supported without - // fullscreen anyway(except fullscreen desktop) - bool IsFullscreenDestkop = m_pWindow != NULL && (((SDL_GetWindowFlags(m_pWindow) & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP) || g_Config.m_GfxFullscreen == 3); - bool CollectFullscreenModes = m_pWindow == NULL || ((SDL_GetWindowFlags(m_pWindow) & SDL_WINDOW_FULLSCREEN) != 0 && !IsFullscreenDestkop); - - if(SDL_GetDesktopDisplayMode(ScreenId, &DesktopMode) < 0) - { - dbg_msg("gfx", "unable to get display mode: %s", SDL_GetError()); - } - - constexpr int ModeCount = 256; - SDL_DisplayMode aModes[ModeCount]; - int NumModes = 0; - for(int i = 0; i < MaxModesAvailable && NumModes < ModeCount; i++) - { - SDL_DisplayMode Mode; - if(SDL_GetDisplayMode(ScreenId, i, &Mode) < 0) - { - dbg_msg("gfx", "unable to get display mode: %s", SDL_GetError()); - continue; - } - - aModes[NumModes] = Mode; - ++NumModes; - } - - int NumModesInserted = 0; - auto &&ModeInsert = [&](SDL_DisplayMode &Mode) { - if(NumModesInserted < MaxModes) - { - // if last mode was equal, ignore this one --- in fullscreen this can really only happen if the screen - // supports different color modes - // in non fullscren these are the modes that show different refresh rate, but are basically the same - if(NumModesInserted > 0 && pModes[NumModesInserted - 1].m_WindowWidth == Mode.w && pModes[NumModesInserted - 1].m_WindowHeight == Mode.h && (pModes[NumModesInserted - 1].m_RefreshRate == Mode.refresh_rate || (Mode.refresh_rate != DesktopMode.refresh_rate && !CollectFullscreenModes))) - return; - - DisplayToVideoMode(&pModes[NumModesInserted], &Mode, HiDPIScale, !CollectFullscreenModes ? DesktopMode.refresh_rate : Mode.refresh_rate); - NumModesInserted++; - } - }; - - for(int i = 0; i < NumModes; i++) - { - SDL_DisplayMode &Mode = aModes[i]; - - if(Mode.w > MaxWindowWidth || Mode.h > MaxWindowHeight) - continue; - - ModeInsert(Mode); - - if(IsFullscreenDestkop) - break; - - if(NumModesInserted >= MaxModes) - break; - } - *pNumModes = NumModesInserted; -} - -void CGraphicsBackend_SDL_GL::GetCurrentVideoMode(CVideoMode &CurMode, int HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int ScreenId) -{ - SDL_DisplayMode DpMode; - // if "real" fullscreen, obtain the video mode for that - if((SDL_GetWindowFlags(m_pWindow) & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN) - { - if(SDL_GetCurrentDisplayMode(ScreenId, &DpMode)) - { - dbg_msg("gfx", "unable to get display mode: %s", SDL_GetError()); - } - } - else - { - if(SDL_GetDesktopDisplayMode(ScreenId, &DpMode) < 0) - { - dbg_msg("gfx", "unable to get display mode: %s", SDL_GetError()); - } - else - { - int Width = 0; - int Height = 0; - SDL_GL_GetDrawableSize(m_pWindow, &Width, &Height); - DpMode.w = Width; - DpMode.h = Height; - } - } - DisplayToVideoMode(&CurMode, &DpMode, HiDPIScale, DpMode.refresh_rate); -} - -CGraphicsBackend_SDL_GL::CGraphicsBackend_SDL_GL(TTranslateFunc &&TranslateFunc) : - CGraphicsBackend_Threaded(std::move(TranslateFunc)) -{ - mem_zero(m_aErrorString, std::size(m_aErrorString)); -} - -int CGraphicsBackend_SDL_GL::Init(const char *pName, int *pScreen, int *pWidth, int *pHeight, int *pRefreshRate, int *pFsaaSamples, int Flags, int *pDesktopWidth, int *pDesktopHeight, int *pCurrentWidth, int *pCurrentHeight, IStorage *pStorage) -{ -#if defined(CONF_HEADLESS_CLIENT) - int InitError = 0; - const char *pErrorStr = NULL; - int GlewMajor = 0; - int GlewMinor = 0; - int GlewPatch = 0; - IsVersionSupportedGlew(m_BackendType, g_Config.m_GfxGLMajor, g_Config.m_GfxGLMinor, g_Config.m_GfxGLPatch, GlewMajor, GlewMinor, GlewPatch); - BackendInitGlew(m_BackendType, GlewMajor, GlewMinor, GlewPatch); -#else - // print sdl version - { - SDL_version Compiled; - SDL_version Linked; - - SDL_VERSION(&Compiled); - SDL_GetVersion(&Linked); - dbg_msg("sdl", "SDL version %d.%d.%d (compiled = %d.%d.%d)", Linked.major, Linked.minor, Linked.patch, - Compiled.major, Compiled.minor, Compiled.patch); - -#if CONF_PLATFORM_LINUX && SDL_VERSION_ATLEAST(2, 0, 22) - // needed to workaround SDL from forcing exclusively X11 if linking against the GLX flavour of GLEW instead of the EGL one - // w/o this on Wayland systems (no XWayland support) SDL's Video subsystem will fail to load (starting from SDL2.30+) - if(Linked.major == 2 && Linked.minor >= 30) - SDL_SetHint(SDL_HINT_VIDEODRIVER, "x11,wayland"); -#endif - } - - if(!SDL_WasInit(SDL_INIT_VIDEO)) - { - if(SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) - { - dbg_msg("gfx", "unable to init SDL video: %s", SDL_GetError()); - return EGraphicsBackendErrorCodes::GRAPHICS_BACKEND_ERROR_CODE_SDL_INIT_FAILED; - } - } - - EBackendType OldBackendType = m_BackendType; - m_BackendType = DetectBackend(); - // little fallback for Vulkan - if(OldBackendType != BACKEND_TYPE_AUTO) - { - if(m_BackendType == BACKEND_TYPE_VULKAN) - { - // try default opengl settings - str_copy(g_Config.m_GfxBackend, "OpenGL"); - g_Config.m_GfxGLMajor = 3; - g_Config.m_GfxGLMinor = 0; - g_Config.m_GfxGLPatch = 0; - // do another analysis round too, just in case - g_Config.m_Gfx3DTextureAnalysisRan = 0; - g_Config.m_GfxDriverIsBlocked = 0; - - SDL_setenv("DDNET_DRIVER", "OpenGL", 1); - m_BackendType = DetectBackend(); - } - } - - ClampDriverVersion(m_BackendType); - - bool UseModernGL = IsModernAPI(m_BackendType); - - bool IsOpenGLFamilyBackend = m_BackendType == BACKEND_TYPE_OPENGL || m_BackendType == BACKEND_TYPE_OPENGL_ES; - - if(IsOpenGLFamilyBackend) - { - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, g_Config.m_GfxGLMajor); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, g_Config.m_GfxGLMinor); - } - - dbg_msg("gfx", "Created %s %d.%d context.", ((m_BackendType == BACKEND_TYPE_VULKAN) ? "Vulkan" : "OpenGL"), g_Config.m_GfxGLMajor, g_Config.m_GfxGLMinor); - - if(m_BackendType == BACKEND_TYPE_OPENGL) - { - if(g_Config.m_GfxGLMajor == 3 && g_Config.m_GfxGLMinor == 0) - { - SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY); - } - else if(UseModernGL) - { - SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); - } - } - else if(m_BackendType == BACKEND_TYPE_OPENGL_ES) - { - SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); - } - - if(IsOpenGLFamilyBackend) - { - *pFsaaSamples = std::clamp(*pFsaaSamples, 0, 8); - } - - // set screen - SDL_Rect ScreenPos; - m_NumScreens = SDL_GetNumVideoDisplays(); - if(m_NumScreens > 0) - { - *pScreen = clamp(*pScreen, 0, m_NumScreens - 1); - if(SDL_GetDisplayBounds(*pScreen, &ScreenPos) != 0) - { - dbg_msg("gfx", "unable to retrieve screen information: %s", SDL_GetError()); - return EGraphicsBackendErrorCodes::GRAPHICS_BACKEND_ERROR_CODE_SDL_SCREEN_INFO_REQUEST_FAILED; - } - } - else - { - dbg_msg("gfx", "unable to retrieve number of screens: %s", SDL_GetError()); - return EGraphicsBackendErrorCodes::GRAPHICS_BACKEND_ERROR_CODE_SDL_SCREEN_REQUEST_FAILED; - } - - // store desktop resolution for settings reset button - SDL_DisplayMode DisplayMode; - if(SDL_GetDesktopDisplayMode(*pScreen, &DisplayMode)) - { - dbg_msg("gfx", "unable to get desktop resolution: %s", SDL_GetError()); - return EGraphicsBackendErrorCodes::GRAPHICS_BACKEND_ERROR_CODE_SDL_SCREEN_RESOLUTION_REQUEST_FAILED; - } - - bool IsDesktopChanged = *pDesktopWidth == 0 || *pDesktopHeight == 0 || *pDesktopWidth != DisplayMode.w || *pDesktopHeight != DisplayMode.h; - - *pDesktopWidth = DisplayMode.w; - *pDesktopHeight = DisplayMode.h; - - // fetch supported video modes - bool SupportedResolution = false; - - CVideoMode aModes[256]; - int ModesCount = 0; - int IndexOfResolution = -1; - GetVideoModes(aModes, std::size(aModes), &ModesCount, 1, *pDesktopWidth, *pDesktopHeight, *pScreen); - - for(int i = 0; i < ModesCount; i++) - { - if(*pWidth == aModes[i].m_WindowWidth && *pHeight == aModes[i].m_WindowHeight && (*pRefreshRate == aModes[i].m_RefreshRate || *pRefreshRate == 0)) - { - SupportedResolution = true; - IndexOfResolution = i; - break; - } - } - - // set flags - int SdlFlags = SDL_WINDOW_INPUT_GRABBED | SDL_WINDOW_INPUT_FOCUS | SDL_WINDOW_MOUSE_FOCUS; - SdlFlags |= (IsOpenGLFamilyBackend) ? SDL_WINDOW_OPENGL : SDL_WINDOW_VULKAN; - if(Flags & IGraphicsBackend::INITFLAG_HIGHDPI) - SdlFlags |= SDL_WINDOW_ALLOW_HIGHDPI; - if(Flags & IGraphicsBackend::INITFLAG_RESIZABLE) - SdlFlags |= SDL_WINDOW_RESIZABLE; - if(Flags & IGraphicsBackend::INITFLAG_BORDERLESS) - SdlFlags |= SDL_WINDOW_BORDERLESS; - if(Flags & IGraphicsBackend::INITFLAG_FULLSCREEN) - SdlFlags |= SDL_WINDOW_FULLSCREEN; - else if(Flags & (IGraphicsBackend::INITFLAG_DESKTOP_FULLSCREEN)) - SdlFlags |= SDL_WINDOW_FULLSCREEN_DESKTOP; - - bool IsFullscreen = (SdlFlags & SDL_WINDOW_FULLSCREEN) != 0 || g_Config.m_GfxFullscreen == 3; - // use desktop resolution as default resolution, clamp resolution if users's display is smaller than we remembered - // if the user starts in fullscreen, and the resolution was not found use the desktop one - if((IsFullscreen && !SupportedResolution) || *pWidth == 0 || *pHeight == 0 || (IsDesktopChanged && (!SupportedResolution || !IsFullscreen) && (*pWidth > *pDesktopWidth || *pHeight > *pDesktopHeight))) - { - *pWidth = *pDesktopWidth; - *pHeight = *pDesktopHeight; - *pRefreshRate = DisplayMode.refresh_rate; - } - - // if in fullscreen and refresh rate wasn't set yet, just use the one from the found list - if(*pRefreshRate == 0 && SupportedResolution) - { - *pRefreshRate = aModes[IndexOfResolution].m_RefreshRate; - } - else if(*pRefreshRate == 0) - { - *pRefreshRate = DisplayMode.refresh_rate; - } - - // set gl attributes - if(IsOpenGLFamilyBackend) - { - SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - if(*pFsaaSamples) - { - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, *pFsaaSamples); - } - else - { - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0); - } - } - - m_pWindow = SDL_CreateWindow( - pName, - SDL_WINDOWPOS_CENTERED_DISPLAY(*pScreen), - SDL_WINDOWPOS_CENTERED_DISPLAY(*pScreen), - *pWidth, - *pHeight, - SdlFlags); - - // set caption - if(m_pWindow == NULL) - { - dbg_msg("gfx", "unable to create window: %s", SDL_GetError()); - if(m_BackendType == BACKEND_TYPE_VULKAN) - return EGraphicsBackendErrorCodes::GRAPHICS_BACKEND_ERROR_CODE_GL_CONTEXT_FAILED; - else - return EGraphicsBackendErrorCodes::GRAPHICS_BACKEND_ERROR_CODE_SDL_WINDOW_CREATE_FAILED; - } - - int GlewMajor = 0; - int GlewMinor = 0; - int GlewPatch = 0; - - if(IsOpenGLFamilyBackend) - { - m_GLContext = SDL_GL_CreateContext(m_pWindow); - - if(m_GLContext == NULL) - { - SDL_DestroyWindow(m_pWindow); - m_pWindow = nullptr; - dbg_msg("gfx", "unable to create graphic context: %s", SDL_GetError()); - return EGraphicsBackendErrorCodes::GRAPHICS_BACKEND_ERROR_CODE_GL_CONTEXT_FAILED; - } - - if(!BackendInitGlew(m_BackendType, GlewMajor, GlewMinor, GlewPatch)) - { - SDL_GL_DeleteContext(m_GLContext); - SDL_DestroyWindow(m_pWindow); - m_pWindow = nullptr; - return EGraphicsBackendErrorCodes::GRAPHICS_BACKEND_ERROR_CODE_UNKNOWN; - } - } - - int InitError = 0; - const char *pErrorStr = NULL; - - InitError = IsVersionSupportedGlew(m_BackendType, g_Config.m_GfxGLMajor, g_Config.m_GfxGLMinor, g_Config.m_GfxGLPatch, GlewMajor, GlewMinor, GlewPatch); - - // SDL_GL_GetDrawableSize reports HiDPI resolution even with SDL_WINDOW_ALLOW_HIGHDPI not set, which is wrong - if(SdlFlags & SDL_WINDOW_ALLOW_HIGHDPI && IsOpenGLFamilyBackend) - SDL_GL_GetDrawableSize(m_pWindow, pCurrentWidth, pCurrentHeight); - else - SDL_GetWindowSize(m_pWindow, pCurrentWidth, pCurrentHeight); - - if(IsOpenGLFamilyBackend) - { - SDL_GL_SetSwapInterval(Flags & IGraphicsBackend::INITFLAG_VSYNC ? 1 : 0); - SDL_GL_MakeCurrent(NULL, NULL); - } - - if(InitError != 0) - { - if(m_GLContext) - SDL_GL_DeleteContext(m_GLContext); - SDL_DestroyWindow(m_pWindow); - m_pWindow = nullptr; - - // try setting to glew supported version - g_Config.m_GfxGLMajor = GlewMajor; - g_Config.m_GfxGLMinor = GlewMinor; - g_Config.m_GfxGLPatch = GlewPatch; - - return EGraphicsBackendErrorCodes::GRAPHICS_BACKEND_ERROR_CODE_GL_VERSION_FAILED; - } -#endif // CONF_HEADLESS_CLIENT - - // start the command processor - dbg_assert(m_pProcessor == nullptr, "Processor was not cleaned up properly."); - m_pProcessor = new CCommandProcessor_SDL_GL(m_BackendType, g_Config.m_GfxGLMajor, g_Config.m_GfxGLMinor, g_Config.m_GfxGLPatch); - StartProcessor(m_pProcessor); - - // issue init commands for OpenGL and SDL - CCommandBuffer CmdBuffer(1024, 512); - CCommandProcessorFragment_GLBase::SCommand_PreInit CmdPre; - CmdPre.m_pWindow = m_pWindow; - CmdPre.m_Width = *pCurrentWidth; - CmdPre.m_Height = *pCurrentHeight; - CmdPre.m_pVendorString = m_aVendorString; - CmdPre.m_pVersionString = m_aVersionString; - CmdPre.m_pRendererString = m_aRendererString; - CmdPre.m_pGpuList = &m_GpuList; - CmdBuffer.AddCommandUnsafe(CmdPre); - RunBufferSingleThreadedUnsafe(&CmdBuffer); - CmdBuffer.Reset(); - - // run sdl first to have the context in the thread - CCommandProcessorFragment_SDL::SCommand_Init CmdSDL; - CmdSDL.m_pWindow = m_pWindow; - CmdSDL.m_GLContext = m_GLContext; - CmdBuffer.AddCommandUnsafe(CmdSDL); - RunBuffer(&CmdBuffer); - WaitForIdle(); - CmdBuffer.Reset(); - - if(InitError == 0) - { - CCommandProcessorFragment_GLBase::SCommand_Init CmdGL; - CmdGL.m_pWindow = m_pWindow; - CmdGL.m_Width = *pCurrentWidth; - CmdGL.m_Height = *pCurrentHeight; - CmdGL.m_pTextureMemoryUsage = &m_TextureMemoryUsage; - CmdGL.m_pBufferMemoryUsage = &m_BufferMemoryUsage; - CmdGL.m_pStreamMemoryUsage = &m_StreamMemoryUsage; - CmdGL.m_pStagingMemoryUsage = &m_StagingMemoryUsage; - CmdGL.m_pGpuList = &m_GpuList; - CmdGL.m_pReadPresentedImageDataFunc = &m_ReadPresentedImageDataFunc; - CmdGL.m_pStorage = pStorage; - CmdGL.m_pCapabilities = &m_Capabilites; - CmdGL.m_pInitError = &InitError; - CmdGL.m_RequestedMajor = g_Config.m_GfxGLMajor; - CmdGL.m_RequestedMinor = g_Config.m_GfxGLMinor; - CmdGL.m_RequestedPatch = g_Config.m_GfxGLPatch; - CmdGL.m_GlewMajor = GlewMajor; - CmdGL.m_GlewMinor = GlewMinor; - CmdGL.m_GlewPatch = GlewPatch; - CmdGL.m_pErrStringPtr = &pErrorStr; - CmdGL.m_pVendorString = m_aVendorString; - CmdGL.m_pVersionString = m_aVersionString; - CmdGL.m_pRendererString = m_aRendererString; - CmdGL.m_RequestedBackend = m_BackendType; - CmdBuffer.AddCommandUnsafe(CmdGL); - - RunBuffer(&CmdBuffer); - WaitForIdle(); - CmdBuffer.Reset(); - } - - if(InitError != 0) - { - if(InitError != -2) - { - // shutdown the context, as it might have been initialized - CCommandProcessorFragment_GLBase::SCommand_Shutdown CmdGL; - CmdBuffer.AddCommandUnsafe(CmdGL); - RunBuffer(&CmdBuffer); - WaitForIdle(); - CmdBuffer.Reset(); - } - - CCommandProcessorFragment_SDL::SCommand_Shutdown Cmd; - CmdBuffer.AddCommandUnsafe(Cmd); - RunBuffer(&CmdBuffer); - WaitForIdle(); - CmdBuffer.Reset(); - - CCommandProcessorFragment_GLBase::SCommand_PostShutdown CmdPost; - CmdBuffer.AddCommandUnsafe(CmdPost); - RunBufferSingleThreadedUnsafe(&CmdBuffer); - CmdBuffer.Reset(); - - // stop and delete the processor - StopProcessor(); - delete m_pProcessor; - m_pProcessor = nullptr; - - if(m_GLContext) - SDL_GL_DeleteContext(m_GLContext); - SDL_DestroyWindow(m_pWindow); - m_pWindow = nullptr; - - // try setting to version string's supported version - if(InitError == -2) - { - g_Config.m_GfxGLMajor = m_Capabilites.m_ContextMajor; - g_Config.m_GfxGLMinor = m_Capabilites.m_ContextMinor; - g_Config.m_GfxGLPatch = m_Capabilites.m_ContextPatch; - } - - if(pErrorStr != NULL) - { - str_copy(m_aErrorString, pErrorStr); - } - - return EGraphicsBackendErrorCodes::GRAPHICS_BACKEND_ERROR_CODE_GL_VERSION_FAILED; - } - - { - CCommandBuffer::SCommand_Update_Viewport CmdSDL2; - CmdSDL2.m_X = 0; - CmdSDL2.m_Y = 0; - - CmdSDL2.m_Width = *pCurrentWidth; - CmdSDL2.m_Height = *pCurrentHeight; - CmdSDL2.m_ByResize = true; - CmdBuffer.AddCommandUnsafe(CmdSDL2); - RunBuffer(&CmdBuffer); - WaitForIdle(); - CmdBuffer.Reset(); - } - - // return - return EGraphicsBackendErrorCodes::GRAPHICS_BACKEND_ERROR_CODE_NONE; -} - -int CGraphicsBackend_SDL_GL::Shutdown() -{ - // issue a shutdown command - CCommandBuffer CmdBuffer(1024, 512); - CCommandProcessorFragment_GLBase::SCommand_Shutdown CmdGL; - CmdBuffer.AddCommandUnsafe(CmdGL); - RunBuffer(&CmdBuffer); - WaitForIdle(); - CmdBuffer.Reset(); - - CCommandProcessorFragment_SDL::SCommand_Shutdown Cmd; - CmdBuffer.AddCommandUnsafe(Cmd); - RunBuffer(&CmdBuffer); - WaitForIdle(); - CmdBuffer.Reset(); - - CCommandProcessorFragment_GLBase::SCommand_PostShutdown CmdPost; - CmdBuffer.AddCommandUnsafe(CmdPost); - RunBufferSingleThreadedUnsafe(&CmdBuffer); - CmdBuffer.Reset(); - - // stop and delete the processor - StopProcessor(); - delete m_pProcessor; - m_pProcessor = nullptr; - - if(m_GLContext != nullptr) - SDL_GL_DeleteContext(m_GLContext); - SDL_DestroyWindow(m_pWindow); - m_pWindow = nullptr; - - SDL_QuitSubSystem(SDL_INIT_VIDEO); - return 0; -} - -uint64_t CGraphicsBackend_SDL_GL::TextureMemoryUsage() const -{ - return m_TextureMemoryUsage; -} - -uint64_t CGraphicsBackend_SDL_GL::BufferMemoryUsage() const -{ - return m_BufferMemoryUsage; -} - -uint64_t CGraphicsBackend_SDL_GL::StreamedMemoryUsage() const -{ - return m_StreamMemoryUsage; -} - -uint64_t CGraphicsBackend_SDL_GL::StagingMemoryUsage() const -{ - return m_StagingMemoryUsage; -} - -const TTwGraphicsGpuList &CGraphicsBackend_SDL_GL::GetGpus() const -{ - return m_GpuList; -} - -void CGraphicsBackend_SDL_GL::Minimize() -{ - SDL_MinimizeWindow(m_pWindow); -} - -void CGraphicsBackend_SDL_GL::Maximize() -{ - // TODO: SDL -} - -void CGraphicsBackend_SDL_GL::SetWindowParams(int FullscreenMode, bool IsBorderless) -{ - if(FullscreenMode > 0) - { - bool IsDesktopFullscreen = FullscreenMode == 2; -#ifndef CONF_FAMILY_WINDOWS - // special mode for windows only - IsDesktopFullscreen |= FullscreenMode == 3; -#endif - if(FullscreenMode == 1) - { -#if defined(CONF_PLATFORM_MACOS) || defined(CONF_PLATFORM_HAIKU) - // Todo SDL: remove this when fixed (game freezes when losing focus in fullscreen) - SDL_SetWindowFullscreen(m_pWindow, SDL_WINDOW_FULLSCREEN_DESKTOP); -#else - SDL_SetWindowFullscreen(m_pWindow, SDL_WINDOW_FULLSCREEN); -#endif - SDL_SetWindowResizable(m_pWindow, SDL_TRUE); - } - else if(IsDesktopFullscreen) - { - SDL_SetWindowFullscreen(m_pWindow, SDL_WINDOW_FULLSCREEN_DESKTOP); - SDL_SetWindowResizable(m_pWindow, SDL_TRUE); - } - else - { - SDL_SetWindowFullscreen(m_pWindow, 0); - SDL_SetWindowBordered(m_pWindow, SDL_TRUE); - SDL_SetWindowResizable(m_pWindow, SDL_FALSE); - SDL_DisplayMode DpMode; - if(SDL_GetDesktopDisplayMode(g_Config.m_GfxScreen, &DpMode) < 0) - { - dbg_msg("gfx", "unable to get display mode: %s", SDL_GetError()); - } - else - { - ResizeWindow(DpMode.w, DpMode.h, DpMode.refresh_rate); - SDL_SetWindowPosition(m_pWindow, SDL_WINDOWPOS_CENTERED_DISPLAY(g_Config.m_GfxScreen), SDL_WINDOWPOS_CENTERED_DISPLAY(g_Config.m_GfxScreen)); - } - } - } - else - { - SDL_SetWindowFullscreen(m_pWindow, 0); - SDL_SetWindowBordered(m_pWindow, SDL_bool(!IsBorderless)); - SDL_SetWindowResizable(m_pWindow, SDL_TRUE); - } -} - -bool CGraphicsBackend_SDL_GL::SetWindowScreen(int Index) -{ - if(Index < 0 || Index >= m_NumScreens) - { - return false; - } - - SDL_Rect ScreenPos; - if(SDL_GetDisplayBounds(Index, &ScreenPos) != 0) - { - return false; - } - // Todo SDL: remove this when fixed (changing screen when in fullscreen is bugged) - SDL_SetWindowBordered(m_pWindow, SDL_TRUE); //fixing primary monitor goes black when switch screen (borderless OpenGL) - - SDL_SetWindowPosition(m_pWindow, - SDL_WINDOWPOS_CENTERED_DISPLAY(Index), - SDL_WINDOWPOS_CENTERED_DISPLAY(Index)); - - return UpdateDisplayMode(Index); -} - -bool CGraphicsBackend_SDL_GL::UpdateDisplayMode(int Index) -{ - SDL_DisplayMode DisplayMode; - if(SDL_GetDesktopDisplayMode(Index, &DisplayMode) < 0) - { - dbg_msg("gfx", "unable to get display mode: %s", SDL_GetError()); - return false; - } - - g_Config.m_GfxScreen = Index; - g_Config.m_GfxDesktopWidth = DisplayMode.w; - g_Config.m_GfxDesktopHeight = DisplayMode.h; - - return true; -} - -int CGraphicsBackend_SDL_GL::GetWindowScreen() -{ - return SDL_GetWindowDisplayIndex(m_pWindow); -} - -int CGraphicsBackend_SDL_GL::WindowActive() -{ - return m_pWindow && SDL_GetWindowFlags(m_pWindow) & SDL_WINDOW_INPUT_FOCUS; -} - -int CGraphicsBackend_SDL_GL::WindowOpen() -{ - return m_pWindow && SDL_GetWindowFlags(m_pWindow) & SDL_WINDOW_SHOWN; -} - -void CGraphicsBackend_SDL_GL::SetWindowGrab(bool Grab) -{ - SDL_SetWindowGrab(m_pWindow, Grab ? SDL_TRUE : SDL_FALSE); -} - -bool CGraphicsBackend_SDL_GL::ResizeWindow(int w, int h, int RefreshRate) -{ - // don't call resize events when the window is at fullscreen desktop - if(!m_pWindow || (SDL_GetWindowFlags(m_pWindow) & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP) - return false; - - // if the window is at fullscreen use SDL_SetWindowDisplayMode instead, suggested by SDL - if(SDL_GetWindowFlags(m_pWindow) & SDL_WINDOW_FULLSCREEN) - { -#ifdef CONF_FAMILY_WINDOWS - // in windows make the window windowed mode first, this prevents strange window glitches (other games probably do something similar) - SetWindowParams(0, true); -#endif - SDL_DisplayMode SetMode = {}; - SDL_DisplayMode ClosestMode = {}; - SetMode.format = 0; - SetMode.w = w; - SetMode.h = h; - SetMode.refresh_rate = RefreshRate; - SDL_SetWindowDisplayMode(m_pWindow, SDL_GetClosestDisplayMode(g_Config.m_GfxScreen, &SetMode, &ClosestMode)); -#ifdef CONF_FAMILY_WINDOWS - // now change it back to fullscreen, this will restore the above set state, bcs SDL saves fullscreen modes apart from other video modes (as of SDL 2.0.16) - // see implementation of SDL_SetWindowDisplayMode - SetWindowParams(1, false); -#endif - return true; - } - else - { - SDL_SetWindowSize(m_pWindow, w, h); - if(SDL_GetWindowFlags(m_pWindow) & SDL_WINDOW_MAXIMIZED) - // remove maximize flag - SDL_RestoreWindow(m_pWindow); - } - - return false; -} - -void CGraphicsBackend_SDL_GL::GetViewportSize(int &w, int &h) -{ - SDL_GL_GetDrawableSize(m_pWindow, &w, &h); -} - -void CGraphicsBackend_SDL_GL::NotifyWindow() -{ - // Minimum version 2.0.16, after version 2.0.22 the naming is changed to 2.24.0 etc. -#if SDL_MAJOR_VERSION > 2 || (SDL_MAJOR_VERSION == 2 && SDL_MINOR_VERSION == 0 && SDL_PATCHLEVEL >= 16) || (SDL_MAJOR_VERSION == 2 && SDL_MINOR_VERSION > 0) - if(SDL_FlashWindow(m_pWindow, SDL_FlashOperation::SDL_FLASH_UNTIL_FOCUSED) != 0) - { - // fails if SDL hasn't implemented it - return; - } -#endif -} - -void CGraphicsBackend_SDL_GL::WindowDestroyNtf(uint32_t WindowId) -{ -} - -void CGraphicsBackend_SDL_GL::WindowCreateNtf(uint32_t WindowId) -{ - m_pWindow = SDL_GetWindowFromID(WindowId); -} - -TGLBackendReadPresentedImageData &CGraphicsBackend_SDL_GL::GetReadPresentedImageDataFuncUnsafe() -{ - return m_ReadPresentedImageDataFunc; -} - -IGraphicsBackend *CreateGraphicsBackend(TTranslateFunc &&TranslateFunc) { return new CGraphicsBackend_SDL_GL(std::move(TranslateFunc)); } diff --git a/src/engine/client/backend_sdl.h b/src/engine/client/backend_sdl.h deleted file mode 100644 index de04f7e593..0000000000 --- a/src/engine/client/backend_sdl.h +++ /dev/null @@ -1,307 +0,0 @@ -#ifndef ENGINE_CLIENT_BACKEND_SDL_H -#define ENGINE_CLIENT_BACKEND_SDL_H - -#include - -#include - -#include - -#include - -#include - -#include -#include -#include -#include -#include -#include - -#if defined(CONF_PLATFORM_MACOS) -#include - -class CAutoreleasePool -{ -private: - id m_Pool; - -public: - CAutoreleasePool() - { - Class NSAutoreleasePoolClass = (Class)objc_getClass("NSAutoreleasePool"); - m_Pool = class_createInstance(NSAutoreleasePoolClass, 0); - SEL selector = sel_registerName("init"); - ((id(*)(id, SEL))objc_msgSend)(m_Pool, selector); - } - - ~CAutoreleasePool() - { - SEL selector = sel_registerName("drain"); - ((id(*)(id, SEL))objc_msgSend)(m_Pool, selector); - } -}; -#endif - -// basic threaded backend, abstract, missing init and shutdown functions -class CGraphicsBackend_Threaded : public IGraphicsBackend -{ -private: - TTranslateFunc m_TranslateFunc; - SGfxWarningContainer m_Warning; - -public: - // constructed on the main thread, the rest of the functions is run on the render thread - class ICommandProcessor - { - public: - virtual ~ICommandProcessor() = default; - virtual void RunBuffer(CCommandBuffer *pBuffer) = 0; - - virtual const SGfxErrorContainer &GetError() const = 0; - virtual void ErroneousCleanup() = 0; - - virtual const SGfxWarningContainer &GetWarning() const = 0; - }; - - CGraphicsBackend_Threaded(TTranslateFunc &&TranslateFunc); - - void RunBuffer(CCommandBuffer *pBuffer) override; - void RunBufferSingleThreadedUnsafe(CCommandBuffer *pBuffer) override; - bool IsIdle() const override; - void WaitForIdle() override; - - void ProcessError(const SGfxErrorContainer &Error); - -protected: - void StartProcessor(ICommandProcessor *pProcessor); - void StopProcessor(); - - bool HasWarning() - { - return m_Warning.m_WarningType != GFX_WARNING_TYPE_NONE; - } - -private: - ICommandProcessor *m_pProcessor; - std::mutex m_BufferSwapMutex; - std::condition_variable m_BufferSwapCond; - CCommandBuffer *m_pBuffer; - std::atomic_bool m_Shutdown; - bool m_Started = false; - std::atomic_bool m_BufferInProcess; - void *m_pThread; - - static void ThreadFunc(void *pUser); - -public: - bool GetWarning(std::vector &WarningStrings) override; -}; - -// takes care of implementation independent operations -class CCommandProcessorFragment_General -{ - void Cmd_Nop(); - void Cmd_Signal(const CCommandBuffer::SCommand_Signal *pCommand); - -public: - bool RunCommand(const CCommandBuffer::SCommand *pBaseCommand); -}; - -struct SBackendCapabilites -{ - bool m_TileBuffering; - bool m_QuadBuffering; - bool m_TextBuffering; - bool m_QuadContainerBuffering; - - bool m_MipMapping; - bool m_NPOTTextures; - bool m_3DTextures; - bool m_2DArrayTextures; - bool m_2DArrayTexturesAsExtension; - bool m_ShaderSupport; - - // use quads as much as possible, even if the user config says otherwise - bool m_TrianglesAsQuads; - - int m_ContextMajor; - int m_ContextMinor; - int m_ContextPatch; -}; - -// takes care of sdl related commands -class CCommandProcessorFragment_SDL -{ - // SDL stuff - SDL_Window *m_pWindow = nullptr; - SDL_GLContext m_GLContext = nullptr; - -public: - enum - { - CMD_INIT = CCommandBuffer::CMDGROUP_PLATFORM_SDL, - CMD_SHUTDOWN, - }; - - struct SCommand_Init : public CCommandBuffer::SCommand - { - SCommand_Init() : - SCommand(CMD_INIT) {} - SDL_Window *m_pWindow; - SDL_GLContext m_GLContext; - }; - - struct SCommand_Shutdown : public CCommandBuffer::SCommand - { - SCommand_Shutdown() : - SCommand(CMD_SHUTDOWN) {} - }; - -private: - void Cmd_Init(const SCommand_Init *pCommand); - void Cmd_Shutdown(const SCommand_Shutdown *pCommand); - void Cmd_Swap(const CCommandBuffer::SCommand_Swap *pCommand); - void Cmd_VSync(const CCommandBuffer::SCommand_VSync *pCommand); - void Cmd_WindowCreateNtf(const CCommandBuffer::SCommand_WindowCreateNtf *pCommand); - void Cmd_WindowDestroyNtf(const CCommandBuffer::SCommand_WindowDestroyNtf *pCommand); - -public: - CCommandProcessorFragment_SDL(); - - bool RunCommand(const CCommandBuffer::SCommand *pBaseCommand); -}; - -// command processor implementation, uses the fragments to combine into one processor -class CCommandProcessor_SDL_GL : public CGraphicsBackend_Threaded::ICommandProcessor -{ - CCommandProcessorFragment_GLBase *m_pGLBackend; - CCommandProcessorFragment_SDL m_SDL; - CCommandProcessorFragment_General m_General; - - EBackendType m_BackendType; - - SGfxErrorContainer m_Error; - SGfxWarningContainer m_Warning; - -public: - CCommandProcessor_SDL_GL(EBackendType BackendType, int GLMajor, int GLMinor, int GLPatch); - virtual ~CCommandProcessor_SDL_GL(); - void RunBuffer(CCommandBuffer *pBuffer) override; - - const SGfxErrorContainer &GetError() const override; - void ErroneousCleanup() override; - - const SGfxWarningContainer &GetWarning() const override; - - void HandleError(); - void HandleWarning(); -}; - -static constexpr size_t gs_GpuInfoStringSize = 256; - -// graphics backend implemented with SDL and the graphics library @see EBackendType -class CGraphicsBackend_SDL_GL : public CGraphicsBackend_Threaded -{ - SDL_Window *m_pWindow = nullptr; - SDL_GLContext m_GLContext = nullptr; - ICommandProcessor *m_pProcessor = nullptr; - std::atomic m_TextureMemoryUsage{0}; - std::atomic m_BufferMemoryUsage{0}; - std::atomic m_StreamMemoryUsage{0}; - std::atomic m_StagingMemoryUsage{0}; - - TTwGraphicsGpuList m_GpuList; - - TGLBackendReadPresentedImageData m_ReadPresentedImageDataFunc; - - int m_NumScreens; - - SBackendCapabilites m_Capabilites; - - char m_aVendorString[gs_GpuInfoStringSize] = {}; - char m_aVersionString[gs_GpuInfoStringSize] = {}; - char m_aRendererString[gs_GpuInfoStringSize] = {}; - - EBackendType m_BackendType = BACKEND_TYPE_AUTO; - - char m_aErrorString[256]; - - static EBackendType DetectBackend(); - static void ClampDriverVersion(EBackendType BackendType); - -public: - CGraphicsBackend_SDL_GL(TTranslateFunc &&TranslateFunc); - int Init(const char *pName, int *pScreen, int *pWidth, int *pHeight, int *pRefreshRate, int *pFsaaSamples, int Flags, int *pDesktopWidth, int *pDesktopHeight, int *pCurrentWidth, int *pCurrentHeight, class IStorage *pStorage) override; - int Shutdown() override; - - uint64_t TextureMemoryUsage() const override; - uint64_t BufferMemoryUsage() const override; - uint64_t StreamedMemoryUsage() const override; - uint64_t StagingMemoryUsage() const override; - - const TTwGraphicsGpuList &GetGpus() const override; - - int GetNumScreens() const override { return m_NumScreens; } - const char *GetScreenName(int Screen) const override; - - void GetVideoModes(CVideoMode *pModes, int MaxModes, int *pNumModes, int HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int ScreenId) override; - void GetCurrentVideoMode(CVideoMode &CurMode, int HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int ScreenId) override; - - void Minimize() override; - void Maximize() override; - void SetWindowParams(int FullscreenMode, bool IsBorderless) override; - bool SetWindowScreen(int Index) override; - bool UpdateDisplayMode(int Index) override; - int GetWindowScreen() override; - int WindowActive() override; - int WindowOpen() override; - void SetWindowGrab(bool Grab) override; - bool ResizeWindow(int w, int h, int RefreshRate) override; - void GetViewportSize(int &w, int &h) override; - void NotifyWindow() override; - - void WindowDestroyNtf(uint32_t WindowId) override; - void WindowCreateNtf(uint32_t WindowId) override; - - bool GetDriverVersion(EGraphicsDriverAgeType DriverAgeType, int &Major, int &Minor, int &Patch, const char *&pName, EBackendType BackendType) override; - bool IsConfigModernAPI() override { return IsModernAPI(m_BackendType); } - bool UseTrianglesAsQuad() override { return m_Capabilites.m_TrianglesAsQuads; } - bool HasTileBuffering() override { return m_Capabilites.m_TileBuffering; } - bool HasQuadBuffering() override { return m_Capabilites.m_QuadBuffering; } - bool HasTextBuffering() override { return m_Capabilites.m_TextBuffering; } - bool HasQuadContainerBuffering() override { return m_Capabilites.m_QuadContainerBuffering; } - bool Uses2DTextureArrays() override { return m_Capabilites.m_2DArrayTextures; } - bool HasTextureArraysSupport() override { return m_Capabilites.m_2DArrayTextures || m_Capabilites.m_3DTextures; } - - const char *GetErrorString() override - { - if(m_aErrorString[0] != '\0') - return m_aErrorString; - - return NULL; - } - - const char *GetVendorString() override - { - return m_aVendorString; - } - - const char *GetVersionString() override - { - return m_aVersionString; - } - - const char *GetRendererString() override - { - return m_aRendererString; - } - - TGLBackendReadPresentedImageData &GetReadPresentedImageDataFuncUnsafe() override; - - bool ShowMessageBox(unsigned Type, const char *pTitle, const char *pMsg) override; - - static bool IsModernAPI(EBackendType BackendType); -}; - -#endif // ENGINE_CLIENT_BACKEND_SDL_H diff --git a/src/engine/client/blocklist_driver.cpp b/src/engine/client/blocklist_driver.cpp deleted file mode 100644 index 4e3feb6f70..0000000000 --- a/src/engine/client/blocklist_driver.cpp +++ /dev/null @@ -1,112 +0,0 @@ -#include "blocklist_driver.h" - -#include - -#include - -#define VERSION_PARTS 4 - -struct SVersion -{ - int m_aParts[VERSION_PARTS]; - - bool operator<=(const SVersion &Other) const - { - for(int i = 0; i < VERSION_PARTS; i++) - { - if(m_aParts[i] < Other.m_aParts[i]) - return true; - if(m_aParts[i] > Other.m_aParts[i]) - return false; - } - return true; - } -}; - -enum EBackendDriverBlockListType -{ - BACKEND_DRIVER_BLOCKLIST_TYPE_VERSION = 0, - BACKEND_DRIVER_BLOCKLIST_TYPE_VENDOR, -}; - -/* TODO: generalize it more for other drivers / vendors */ -struct SBackEndDriverBlockList -{ - EBackendDriverBlockListType m_BlockListType; - - SVersion m_VersionMin; - SVersion m_VersionMax; - - const char *m_pVendorName; - - // the OpenGL version, that is supported - int m_AllowedMajor; - int m_AllowedMinor; - int m_AllowedPatch; - - const char *m_pReason; - - bool m_DisplayReason; - const char *m_pOSName; -}; - -static SBackEndDriverBlockList gs_aBlockList[] = { - {BACKEND_DRIVER_BLOCKLIST_TYPE_VENDOR, {26, 20, 100, 7800}, {27, 20, 100, 8853}, "Intel", 2, 0, 0, "This Intel driver version can cause crashes, please update it to a newer version.", false, "windows"}}; - -const char *ParseBlocklistDriverVersions(const char *pVendorStr, const char *pVersionStr, int &BlocklistMajor, int &BlocklistMinor, int &BlocklistPatch, bool &RequiresWarning) -{ - if(str_find_nocase(pVendorStr, "Intel") == NULL) - return NULL; - - const char *pVersionStrStart = str_find_nocase(pVersionStr, "Build "); - if(pVersionStrStart == NULL) - return NULL; - - // ignore "Build ", after that, it should directly start with the driver version - pVersionStrStart += (ptrdiff_t)str_length("Build "); - - char aVersionStrHelper[512]; // the size is random, but shouldn't be too small probably - - SVersion Version; - for(int &VersionPart : Version.m_aParts) - { - pVersionStrStart = str_next_token(pVersionStrStart, ".", aVersionStrHelper, sizeof(aVersionStrHelper)); - if(pVersionStrStart == NULL) - return NULL; - - VersionPart = str_toint(aVersionStrHelper); - } - - for(const auto &BlockListItem : gs_aBlockList) - { - if(str_comp(BlockListItem.m_pOSName, CONF_FAMILY_STRING) == 0) - { - bool DriverBlocked = false; - if(BlockListItem.m_BlockListType == BACKEND_DRIVER_BLOCKLIST_TYPE_VENDOR) - { - if(str_find_nocase(pVendorStr, BlockListItem.m_pVendorName) != NULL) - { - DriverBlocked = true; - } - } - else if(BlockListItem.m_BlockListType == BACKEND_DRIVER_BLOCKLIST_TYPE_VERSION) - { - if(BlockListItem.m_VersionMin <= Version && Version <= BlockListItem.m_VersionMax) - { - DriverBlocked = true; - } - } - - if(DriverBlocked) - { - RequiresWarning = BlockListItem.m_DisplayReason; - BlocklistMajor = BlockListItem.m_AllowedMajor; - BlocklistMinor = BlockListItem.m_AllowedMinor; - BlocklistPatch = BlockListItem.m_AllowedPatch; - return BlockListItem.m_pReason; - } - } - } - - return NULL; -} diff --git a/src/engine/client/blocklist_driver.h b/src/engine/client/blocklist_driver.h deleted file mode 100644 index 7dddec31ad..0000000000 --- a/src/engine/client/blocklist_driver.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef ENGINE_CLIENT_BLOCKLIST_DRIVER_H -#define ENGINE_CLIENT_BLOCKLIST_DRIVER_H - -const char *ParseBlocklistDriverVersions(const char *pVendorStr, const char *pVersionStr, int &BlocklistMajor, int &BlocklistMinor, int &BlocklistPatch, bool &RequiresWarning); - -#endif // ENGINE_CLIENT_BLOCKLIST_DRIVER_H diff --git a/src/engine/client/checksum.h b/src/engine/client/checksum.h deleted file mode 100644 index 94173f8802..0000000000 --- a/src/engine/client/checksum.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef ENGINE_CLIENT_CHECKSUM_H -#define ENGINE_CLIENT_CHECKSUM_H - -#include - -struct CChecksumData -{ - int m_SizeofData; - char m_aVersionStr[128]; - int m_Version; - char m_aOsVersion[256]; - int64_t m_Start; - int m_Random; - int m_SizeofClient; - int m_SizeofGameClient; - float m_Zoom; - int m_SizeofConfig; - CConfig m_Config; - int m_NumCommands; - int m_aCommandsChecksum[1024]; - int m_NumComponents; - int m_aComponentsChecksum[64]; - int m_NumFiles; - int m_NumExtra; - unsigned m_aFiles[1024]; - - void InitFiles(); -}; - -union CChecksum -{ - char m_aBytes[sizeof(CChecksumData)]; - CChecksumData m_Data; -}; - -#endif // ENGINE_CLIENT_CHECKSUM_H diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp deleted file mode 100644 index 51f17dfdcd..0000000000 --- a/src/engine/client/client.cpp +++ /dev/null @@ -1,5215 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -#include -#include - -#include "client.h" -#include "demoedit.h" -#include "friends.h" -#include "notifications.h" -#include "serverbrowser.h" - -#if defined(CONF_VIDEORECORDER) -#include "video.h" -#endif - -#if defined(CONF_PLATFORM_ANDROID) -#include -#endif - -#include "SDL.h" -#ifdef main -#undef main -#endif - -#include -#include -#include -#include -#include -#include - -using namespace std::chrono_literals; - -static const ColorRGBA gs_ClientNetworkPrintColor{0.7f, 1, 0.7f, 1.0f}; -static const ColorRGBA gs_ClientNetworkErrPrintColor{1.0f, 0.25f, 0.25f, 1.0f}; - -CClient::CClient() : - m_DemoPlayer(&m_SnapshotDelta, true, [&]() { UpdateDemoIntraTimers(); }), - m_InputtimeMarginGraph(128), - m_aGametimeMarginGraphs{128, 128}, - m_FpsGraph(4096) -{ - m_StateStartTime = time_get(); - for(auto &DemoRecorder : m_aDemoRecorder) - DemoRecorder = CDemoRecorder(&m_SnapshotDelta); - m_LastRenderTime = time_get(); - mem_zero(m_aInputs, sizeof(m_aInputs)); - mem_zero(m_aapSnapshots, sizeof(m_aapSnapshots)); - for(auto &SnapshotStorage : m_aSnapshotStorage) - SnapshotStorage.Init(); - mem_zero(m_aDemorecSnapshotHolders, sizeof(m_aDemorecSnapshotHolders)); - mem_zero(&m_CurrentServerInfo, sizeof(m_CurrentServerInfo)); - mem_zero(&m_Checksum, sizeof(m_Checksum)); - for(auto &GameTime : m_aGameTime) - GameTime.Init(0); - m_PredictedTime.Init(0); - - m_Sixup = false; -} - -// ----- send functions ----- -static inline bool RepackMsg(const CMsgPacker *pMsg, CPacker &Packer, bool Sixup) -{ - int MsgId = pMsg->m_MsgId; - Packer.Reset(); - - if(Sixup && !pMsg->m_NoTranslate) - { - if(pMsg->m_System) - { - if(MsgId >= OFFSET_UUID) - ; - else if(MsgId == NETMSG_INFO || MsgId == NETMSG_REQUEST_MAP_DATA) - ; - else if(MsgId == NETMSG_READY) - MsgId = protocol7::NETMSG_READY; - else if(MsgId == NETMSG_RCON_CMD) - MsgId = protocol7::NETMSG_RCON_CMD; - else if(MsgId == NETMSG_ENTERGAME) - MsgId = protocol7::NETMSG_ENTERGAME; - else if(MsgId == NETMSG_INPUT) - MsgId = protocol7::NETMSG_INPUT; - else if(MsgId == NETMSG_RCON_AUTH) - MsgId = protocol7::NETMSG_RCON_AUTH; - else if(MsgId == NETMSGTYPE_CL_SETTEAM) - MsgId = protocol7::NETMSGTYPE_CL_SETTEAM; - else if(MsgId == NETMSGTYPE_CL_VOTE) - MsgId = protocol7::NETMSGTYPE_CL_VOTE; - else if(MsgId == NETMSG_PING) - MsgId = protocol7::NETMSG_PING; - else - { - dbg_msg("net", "0.7 DROP send sys %d", MsgId); - return true; - } - } - else - { - if(MsgId >= 0 && MsgId < OFFSET_UUID) - MsgId = Msg_SixToSeven(MsgId); - - if(MsgId < 0) - return true; - } - } - - if(pMsg->m_MsgId < OFFSET_UUID) - { - Packer.AddInt((MsgId << 1) | (pMsg->m_System ? 1 : 0)); - } - else - { - Packer.AddInt(pMsg->m_System ? 1 : 0); // NETMSG_EX, NETMSGTYPE_EX - g_UuidManager.PackUuid(pMsg->m_MsgId, &Packer); - } - Packer.AddRaw(pMsg->Data(), pMsg->Size()); - - return false; -} - -int CClient::SendMsg(int Conn, CMsgPacker *pMsg, int Flags) -{ - CNetChunk Packet; - - if(State() == IClient::STATE_OFFLINE) - return 0; - - // repack message (inefficient) - CPacker Pack; - if(RepackMsg(pMsg, Pack, IsSixup())) - return 0; - - mem_zero(&Packet, sizeof(CNetChunk)); - Packet.m_ClientId = 0; - Packet.m_pData = Pack.Data(); - Packet.m_DataSize = Pack.Size(); - - if(Flags & MSGFLAG_VITAL) - Packet.m_Flags |= NETSENDFLAG_VITAL; - if(Flags & MSGFLAG_FLUSH) - Packet.m_Flags |= NETSENDFLAG_FLUSH; - - if((Flags & MSGFLAG_RECORD) && Conn == g_Config.m_ClDummy) - { - for(auto &i : m_aDemoRecorder) - if(i.IsRecording()) - i.RecordMessage(Packet.m_pData, Packet.m_DataSize); - } - - if(!(Flags & MSGFLAG_NOSEND)) - { - m_aNetClient[Conn].Send(&Packet); - } - - return 0; -} - -int CClient::SendMsgActive(CMsgPacker *pMsg, int Flags) -{ - return SendMsg(g_Config.m_ClDummy, pMsg, Flags); -} - -void CClient::SendInfo(int Conn) -{ - CMsgPacker MsgVer(NETMSG_CLIENTVER, true); - MsgVer.AddRaw(&m_ConnectionId, sizeof(m_ConnectionId)); - MsgVer.AddInt(GameClient()->DDNetVersion()); - MsgVer.AddString(GameClient()->DDNetVersionStr()); - SendMsg(Conn, &MsgVer, MSGFLAG_VITAL); - - if(IsSixup()) - { - CMsgPacker Msg(NETMSG_INFO, true); - Msg.AddString(GAME_NETVERSION7, 128); - Msg.AddString(Config()->m_Password); - Msg.AddInt(GameClient()->ClientVersion7()); - SendMsg(Conn, &Msg, MSGFLAG_VITAL | MSGFLAG_FLUSH); - return; - } - - CMsgPacker Msg(NETMSG_INFO, true); - Msg.AddString(GameClient()->NetVersion()); - Msg.AddString(m_aPassword); - SendMsg(Conn, &Msg, MSGFLAG_VITAL | MSGFLAG_FLUSH); -} - -void CClient::SendEnterGame(int Conn) -{ - CMsgPacker Msg(NETMSG_ENTERGAME, true); - SendMsg(Conn, &Msg, MSGFLAG_VITAL | MSGFLAG_FLUSH); -} - -void CClient::SendReady(int Conn) -{ - CMsgPacker Msg(NETMSG_READY, true); - SendMsg(Conn, &Msg, MSGFLAG_VITAL | MSGFLAG_FLUSH); -} - -void CClient::SendMapRequest() -{ - dbg_assert(!m_MapdownloadFileTemp, "Map download already in progress"); - m_MapdownloadFileTemp = Storage()->OpenFile(m_aMapdownloadFilenameTemp, IOFLAG_WRITE, IStorage::TYPE_SAVE); - if(IsSixup()) - { - CMsgPacker MsgP(protocol7::NETMSG_REQUEST_MAP_DATA, true, true); - SendMsg(CONN_MAIN, &MsgP, MSGFLAG_VITAL | MSGFLAG_FLUSH); - } - else - { - CMsgPacker Msg(NETMSG_REQUEST_MAP_DATA, true); - Msg.AddInt(m_MapdownloadChunk); - SendMsg(CONN_MAIN, &Msg, MSGFLAG_VITAL | MSGFLAG_FLUSH); - } -} - -void CClient::RconAuth(const char *pName, const char *pPassword, bool Dummy) -{ - if(m_aRconAuthed[Dummy] != 0) - return; - - if(pName != m_aRconUsername) - str_copy(m_aRconUsername, pName); - if(pPassword != m_aRconPassword) - str_copy(m_aRconPassword, pPassword); - - if(IsSixup()) - { - CMsgPacker Msg7(protocol7::NETMSG_RCON_AUTH, true, true); - Msg7.AddString(pPassword); - SendMsg(Dummy, &Msg7, MSGFLAG_VITAL); - return; - } - - CMsgPacker Msg(NETMSG_RCON_AUTH, true); - Msg.AddString(pName); - Msg.AddString(pPassword); - Msg.AddInt(1); - SendMsg(Dummy, &Msg, MSGFLAG_VITAL); -} - -void CClient::Rcon(const char *pCmd) -{ - CMsgPacker Msg(NETMSG_RCON_CMD, true); - Msg.AddString(pCmd); - SendMsgActive(&Msg, MSGFLAG_VITAL); -} - -float CClient::GotRconCommandsPercentage() const -{ - if(m_ExpectedRconCommands < 1) - return -1.0f; - if(m_GotRconCommands > m_ExpectedRconCommands) - return -1.0f; - - return (float)m_GotRconCommands / (float)m_ExpectedRconCommands; -} - -bool CClient::ConnectionProblems() const -{ - return m_aNetClient[g_Config.m_ClDummy].GotProblems(MaxLatencyTicks() * time_freq() / GameTickSpeed()) != 0; -} - -void CClient::SendInput() -{ - int64_t Now = time_get(); - - if(m_aPredTick[g_Config.m_ClDummy] <= 0) - return; - - bool Force = false; - // fetch input - for(int Dummy = 0; Dummy < NUM_DUMMIES; Dummy++) - { - if(!DummyConnected() && Dummy != 0) - { - break; - } - int i = g_Config.m_ClDummy ^ Dummy; - int Size = GameClient()->OnSnapInput(m_aInputs[i][m_aCurrentInput[i]].m_aData, Dummy, Force); - - if(Size) - { - // pack input - CMsgPacker Msg(NETMSG_INPUT, true); - Msg.AddInt(m_aAckGameTick[i]); - Msg.AddInt(m_aPredTick[g_Config.m_ClDummy]); - Msg.AddInt(Size); - - m_aInputs[i][m_aCurrentInput[i]].m_Tick = m_aPredTick[g_Config.m_ClDummy]; - m_aInputs[i][m_aCurrentInput[i]].m_PredictedTime = m_PredictedTime.Get(Now); - m_aInputs[i][m_aCurrentInput[i]].m_PredictionMargin = PredictionMargin() * time_freq() / 1000; - m_aInputs[i][m_aCurrentInput[i]].m_Time = Now; - - // pack it - for(int k = 0; k < Size / 4; k++) - { - static const int FlagsOffset = offsetof(CNetObj_PlayerInput, m_PlayerFlags) / sizeof(int); - if(k == FlagsOffset && IsSixup()) - { - int PlayerFlags = m_aInputs[i][m_aCurrentInput[i]].m_aData[k]; - Msg.AddInt(PlayerFlags_SixToSeven(PlayerFlags)); - } - else - { - Msg.AddInt(m_aInputs[i][m_aCurrentInput[i]].m_aData[k]); - } - } - - m_aCurrentInput[i]++; - m_aCurrentInput[i] %= 200; - - SendMsg(i, &Msg, MSGFLAG_FLUSH); - // ugly workaround for dummy. we need to send input with dummy to prevent - // prediction time resets. but if we do it too often, then it's - // impossible to use grenade with frozen dummy that gets hammered... - if(g_Config.m_ClDummyCopyMoves || m_aCurrentInput[i] % 2) - Force = true; - } - } -} - -const char *CClient::LatestVersion() const -{ - return m_aVersionStr; -} - -// TODO: OPT: do this a lot smarter! -int *CClient::GetInput(int Tick, int IsDummy) const -{ - int Best = -1; - const int d = IsDummy ^ g_Config.m_ClDummy; - for(int i = 0; i < 200; i++) - { - if(m_aInputs[d][i].m_Tick != -1 && m_aInputs[d][i].m_Tick <= Tick && (Best == -1 || m_aInputs[d][Best].m_Tick < m_aInputs[d][i].m_Tick)) - Best = i; - } - - if(Best != -1) - return (int *)m_aInputs[d][Best].m_aData; - return 0; -} - -// ------ state handling ----- -void CClient::SetState(EClientState State) -{ - if(m_State == IClient::STATE_QUITTING || m_State == IClient::STATE_RESTARTING) - return; - if(m_State == State) - return; - - if(g_Config.m_Debug) - { - char aBuf[64]; - str_format(aBuf, sizeof(aBuf), "state change. last=%d current=%d", m_State, State); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client", aBuf); - } - - const EClientState OldState = m_State; - m_State = State; - - m_StateStartTime = time_get(); - GameClient()->OnStateChange(m_State, OldState); - - if(State == IClient::STATE_OFFLINE && m_ReconnectTime == 0) - { - if(g_Config.m_ClReconnectFull > 0 && (str_find_nocase(ErrorString(), "full") || str_find_nocase(ErrorString(), "reserved"))) - m_ReconnectTime = time_get() + time_freq() * g_Config.m_ClReconnectFull; - else if(g_Config.m_ClReconnectTimeout > 0 && (str_find_nocase(ErrorString(), "Timeout") || str_find_nocase(ErrorString(), "Too weak connection"))) - m_ReconnectTime = time_get() + time_freq() * g_Config.m_ClReconnectTimeout; - } - - if(State == IClient::STATE_ONLINE) - { - const bool AnnounceAddr = m_ServerBrowser.IsRegistered(ServerAddress()); - Discord()->SetGameInfo(ServerAddress(), m_aCurrentMap, AnnounceAddr); - Steam()->SetGameInfo(ServerAddress(), m_aCurrentMap, AnnounceAddr); - } - else if(OldState == IClient::STATE_ONLINE) - { - Discord()->ClearGameInfo(); - Steam()->ClearGameInfo(); - } -} - -// called when the map is loaded and we should init for a new round -void CClient::OnEnterGame(bool Dummy) -{ - // reset input - for(int i = 0; i < 200; i++) - { - m_aInputs[Dummy][i].m_Tick = -1; - } - m_aCurrentInput[Dummy] = 0; - - // reset snapshots - m_aapSnapshots[Dummy][SNAP_CURRENT] = nullptr; - m_aapSnapshots[Dummy][SNAP_PREV] = nullptr; - m_aSnapshotStorage[Dummy].PurgeAll(); - m_aReceivedSnapshots[Dummy] = 0; - m_aSnapshotParts[Dummy] = 0; - m_aSnapshotIncomingDataSize[Dummy] = 0; - m_SnapCrcErrors = 0; - // Also make gameclient aware that snapshots have been purged - GameClient()->InvalidateSnapshot(); - - // reset times - m_aAckGameTick[Dummy] = -1; - m_aCurrentRecvTick[Dummy] = 0; - m_aPrevGameTick[Dummy] = 0; - m_aCurGameTick[Dummy] = 0; - m_aGameIntraTick[Dummy] = 0.0f; - m_aGameTickTime[Dummy] = 0.0f; - m_aGameIntraTickSincePrev[Dummy] = 0.0f; - m_aPredTick[Dummy] = 0; - m_aPredIntraTick[Dummy] = 0.0f; - m_aGameTime[Dummy].Init(0); - m_PredictedTime.Init(0); - - if(!Dummy) - { - m_LastDummyConnectTime = 0.0f; - } - - GameClient()->OnEnterGame(); -} - -void CClient::EnterGame(int Conn) -{ - if(State() == IClient::STATE_DEMOPLAYBACK) - return; - - m_aCodeRunAfterJoin[Conn] = false; - - // now we will wait for two snapshots - // to finish the connection - SendEnterGame(Conn); - OnEnterGame(Conn); - - ServerInfoRequest(); // fresh one for timeout protection - m_CurrentServerNextPingTime = time_get() + time_freq() / 2; -} - -void GenerateTimeoutCode(char *pBuffer, unsigned Size, char *pSeed, const NETADDR *pAddrs, int NumAddrs, bool Dummy) -{ - MD5_CTX Md5; - md5_init(&Md5); - const char *pDummy = Dummy ? "dummy" : "normal"; - md5_update(&Md5, (unsigned char *)pDummy, str_length(pDummy) + 1); - md5_update(&Md5, (unsigned char *)pSeed, str_length(pSeed) + 1); - for(int i = 0; i < NumAddrs; i++) - { - md5_update(&Md5, (unsigned char *)&pAddrs[i], sizeof(pAddrs[i])); - } - MD5_DIGEST Digest = md5_finish(&Md5); - - unsigned short aRandom[8]; - mem_copy(aRandom, Digest.data, sizeof(aRandom)); - generate_password(pBuffer, Size, aRandom, 8); -} - -void CClient::GenerateTimeoutSeed() -{ - secure_random_password(g_Config.m_ClTimeoutSeed, sizeof(g_Config.m_ClTimeoutSeed), 16); -} - -void CClient::GenerateTimeoutCodes(const NETADDR *pAddrs, int NumAddrs) -{ - if(g_Config.m_ClTimeoutSeed[0]) - { - for(int i = 0; i < 2; i++) - { - GenerateTimeoutCode(m_aTimeoutCodes[i], sizeof(m_aTimeoutCodes[i]), g_Config.m_ClTimeoutSeed, pAddrs, NumAddrs, i); - - char aBuf[64]; - str_format(aBuf, sizeof(aBuf), "timeout code '%s' (%s)", m_aTimeoutCodes[i], i == 0 ? "normal" : "dummy"); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client", aBuf); - } - } - else - { - str_copy(m_aTimeoutCodes[0], g_Config.m_ClTimeoutCode); - str_copy(m_aTimeoutCodes[1], g_Config.m_ClDummyTimeoutCode); - } -} - -void CClient::Connect(const char *pAddress, const char *pPassword) -{ - // Disconnect will not change the state if we are already quitting/restarting - if(m_State == IClient::STATE_QUITTING || m_State == IClient::STATE_RESTARTING) - return; - Disconnect(); - dbg_assert(m_State == IClient::STATE_OFFLINE, "Disconnect must ensure that client is offline"); - - char aLastAddr[NETADDR_MAXSTRSIZE]; - net_addr_str(&ServerAddress(), aLastAddr, sizeof(aLastAddr), true); - - if(pAddress != m_aConnectAddressStr) - str_copy(m_aConnectAddressStr, pAddress); - - char aMsg[512]; - str_format(aMsg, sizeof(aMsg), "connecting to '%s'", m_aConnectAddressStr); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", aMsg, gs_ClientNetworkPrintColor); - - int NumConnectAddrs = 0; - NETADDR aConnectAddrs[MAX_SERVER_ADDRESSES]; - mem_zero(aConnectAddrs, sizeof(aConnectAddrs)); - const char *pNextAddr = pAddress; - char aBuffer[128]; - bool OnlySixup = true; - while((pNextAddr = str_next_token(pNextAddr, ",", aBuffer, sizeof(aBuffer)))) - { - NETADDR NextAddr; - char aHost[128]; - int url = net_addr_from_url(&NextAddr, aBuffer, aHost, sizeof(aHost)); - bool Sixup = NextAddr.type & NETTYPE_TW7; - if(url > 0) - str_copy(aHost, aBuffer); - - if(net_host_lookup(aHost, &NextAddr, m_aNetClient[CONN_MAIN].NetType()) != 0) - { - log_error("client", "could not find address of %s", aHost); - continue; - } - if(NumConnectAddrs == (int)std::size(aConnectAddrs)) - { - log_warn("client", "too many connect addresses, ignoring %s", aHost); - continue; - } - if(NextAddr.port == 0) - { - NextAddr.port = 8303; - } - char aNextAddr[NETADDR_MAXSTRSIZE]; - if(Sixup) - NextAddr.type |= NETTYPE_TW7; - else - OnlySixup = false; - net_addr_str(&NextAddr, aNextAddr, sizeof(aNextAddr), true); - log_debug("client", "resolved connect address '%s' to %s", aBuffer, aNextAddr); - - if(!str_comp(aNextAddr, aLastAddr)) - { - m_SendPassword = true; - } - - aConnectAddrs[NumConnectAddrs] = NextAddr; - NumConnectAddrs += 1; - } - - if(NumConnectAddrs == 0) - { - log_error("client", "could not find any connect address"); - char aWarning[256]; - str_format(aWarning, sizeof(aWarning), Localize("Could not resolve connect address '%s'. See local console for details."), m_aConnectAddressStr); - SWarning Warning(Localize("Connect address error"), aWarning); - Warning.m_AutoHide = false; - AddWarning(Warning); - return; - } - - m_ConnectionId = RandomUuid(); - ServerInfoRequest(); - - if(m_SendPassword) - { - str_copy(m_aPassword, g_Config.m_Password); - m_SendPassword = false; - } - else if(!pPassword) - m_aPassword[0] = 0; - else - str_copy(m_aPassword, pPassword); - - m_CanReceiveServerCapabilities = true; - - m_Sixup = OnlySixup; - if(m_Sixup) - { - m_aNetClient[CONN_MAIN].Connect7(aConnectAddrs, NumConnectAddrs); - } - else - m_aNetClient[CONN_MAIN].Connect(aConnectAddrs, NumConnectAddrs); - - m_aNetClient[CONN_MAIN].RefreshStun(); - SetState(IClient::STATE_CONNECTING); - - m_InputtimeMarginGraph.Init(-150.0f, 150.0f); - m_aGametimeMarginGraphs[CONN_MAIN].Init(-150.0f, 150.0f); - - GenerateTimeoutCodes(aConnectAddrs, NumConnectAddrs); -} - -void CClient::DisconnectWithReason(const char *pReason) -{ - if(pReason != nullptr && pReason[0] == '\0') - pReason = nullptr; - - DummyDisconnect(pReason); - - char aBuf[512]; - str_format(aBuf, sizeof(aBuf), "disconnecting. reason='%s'", pReason ? pReason : "unknown"); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", aBuf, gs_ClientNetworkPrintColor); - - // stop demo playback and recorder - // make sure to remove replay tmp demo - m_DemoPlayer.Stop(); - for(int Recorder = 0; Recorder < RECORDER_MAX; Recorder++) - { - DemoRecorder(Recorder)->Stop(Recorder == RECORDER_REPLAYS ? IDemoRecorder::EStopMode::REMOVE_FILE : IDemoRecorder::EStopMode::KEEP_FILE); - } - - m_aRconAuthed[0] = 0; - mem_zero(m_aRconUsername, sizeof(m_aRconUsername)); - mem_zero(m_aRconPassword, sizeof(m_aRconPassword)); - m_MapDetailsPresent = false; - m_ServerSentCapabilities = false; - m_UseTempRconCommands = 0; - m_ExpectedRconCommands = -1; - m_GotRconCommands = 0; - m_pConsole->DeregisterTempAll(); - m_aNetClient[CONN_MAIN].Disconnect(pReason); - SetState(IClient::STATE_OFFLINE); - m_pMap->Unload(); - m_CurrentServerPingInfoType = -1; - m_CurrentServerPingBasicToken = -1; - m_CurrentServerPingToken = -1; - mem_zero(&m_CurrentServerPingUuid, sizeof(m_CurrentServerPingUuid)); - m_CurrentServerCurrentPingTime = -1; - m_CurrentServerNextPingTime = -1; - - ResetMapDownload(true); - - // clear the current server info - mem_zero(&m_CurrentServerInfo, sizeof(m_CurrentServerInfo)); - - // clear snapshots - m_aapSnapshots[0][SNAP_CURRENT] = 0; - m_aapSnapshots[0][SNAP_PREV] = 0; - m_aReceivedSnapshots[0] = 0; - m_LastDummy = false; - - // 0.7 - m_TranslationContext.Reset(); - m_Sixup = false; -} - -void CClient::Disconnect() -{ - if(m_State != IClient::STATE_OFFLINE) - { - DisconnectWithReason(nullptr); - } -} - -bool CClient::DummyConnected() const -{ - return m_DummyConnected; -} - -bool CClient::DummyConnecting() const -{ - return m_DummyConnecting; -} - -bool CClient::DummyConnectingDelayed() const -{ - return !DummyConnected() && !DummyConnecting() && m_LastDummyConnectTime > 0.0f && m_LastDummyConnectTime + 5.0f > GlobalTime(); -} - -void CClient::DummyConnect() -{ - if(m_aNetClient[CONN_MAIN].State() != NETSTATE_ONLINE) - { - log_info("client", "Not online."); - return; - } - - if(!DummyAllowed()) - { - log_info("client", "Dummy is not allowed on this server."); - return; - } - if(DummyConnecting()) - { - log_info("client", "Dummy is already connecting."); - return; - } - if(DummyConnected()) - { - // causes log spam with connect+swap binds - // https://github.com/ddnet/ddnet/issues/9426 - // log_info("client", "Dummy is already connected."); - return; - } - if(DummyConnectingDelayed()) - { - log_info("client", "Wait before connecting dummy again."); - return; - } - - m_LastDummyConnectTime = GlobalTime(); - m_aRconAuthed[1] = 0; - m_DummySendConnInfo = true; - - g_Config.m_ClDummyCopyMoves = 0; - g_Config.m_ClDummyHammer = 0; - - m_DummyConnecting = true; - // connect to the server - if(IsSixup()) - m_aNetClient[CONN_DUMMY].Connect7(m_aNetClient[CONN_MAIN].ServerAddress(), 1); - else - m_aNetClient[CONN_DUMMY].Connect(m_aNetClient[CONN_MAIN].ServerAddress(), 1); - - m_aGametimeMarginGraphs[CONN_DUMMY].Init(-150.0f, 150.0f); -} - -void CClient::DummyDisconnect(const char *pReason) -{ - m_aNetClient[CONN_DUMMY].Disconnect(pReason); - g_Config.m_ClDummy = 0; - - m_aRconAuthed[1] = 0; - m_aapSnapshots[1][SNAP_CURRENT] = 0; - m_aapSnapshots[1][SNAP_PREV] = 0; - m_aReceivedSnapshots[1] = 0; - m_DummyConnected = false; - m_DummyConnecting = false; - m_DummyReconnectOnReload = false; - m_DummyDeactivateOnReconnect = false; - GameClient()->OnDummyDisconnect(); -} - -bool CClient::DummyAllowed() const -{ - return m_ServerCapabilities.m_AllowDummy; -} - -void CClient::GetServerInfo(CServerInfo *pServerInfo) const -{ - mem_copy(pServerInfo, &m_CurrentServerInfo, sizeof(m_CurrentServerInfo)); -} - -void CClient::ServerInfoRequest() -{ - mem_zero(&m_CurrentServerInfo, sizeof(m_CurrentServerInfo)); - m_CurrentServerInfoRequestTime = 0; -} - -void CClient::LoadDebugFont() -{ - m_DebugFont = Graphics()->LoadTexture("debug_font.png", IStorage::TYPE_ALL); -} - -// --- - -IClient::CSnapItem CClient::SnapGetItem(int SnapId, int Index) const -{ - dbg_assert(SnapId >= 0 && SnapId < NUM_SNAPSHOT_TYPES, "invalid SnapId"); - const CSnapshot *pSnapshot = m_aapSnapshots[g_Config.m_ClDummy][SnapId]->m_pAltSnap; - const CSnapshotItem *pSnapshotItem = pSnapshot->GetItem(Index); - CSnapItem Item; - Item.m_Type = pSnapshot->GetItemType(Index); - Item.m_Id = pSnapshotItem->Id(); - Item.m_pData = pSnapshotItem->Data(); - Item.m_DataSize = pSnapshot->GetItemSize(Index); - return Item; -} - -const void *CClient::SnapFindItem(int SnapId, int Type, int Id) const -{ - if(!m_aapSnapshots[g_Config.m_ClDummy][SnapId]) - return nullptr; - - return m_aapSnapshots[g_Config.m_ClDummy][SnapId]->m_pAltSnap->FindItem(Type, Id); -} - -int CClient::SnapNumItems(int SnapId) const -{ - dbg_assert(SnapId >= 0 && SnapId < NUM_SNAPSHOT_TYPES, "invalid SnapId"); - if(!m_aapSnapshots[g_Config.m_ClDummy][SnapId]) - return 0; - return m_aapSnapshots[g_Config.m_ClDummy][SnapId]->m_pAltSnap->NumItems(); -} - -void CClient::SnapSetStaticsize(int ItemType, int Size) -{ - m_SnapshotDelta.SetStaticsize(ItemType, Size); -} - -void CClient::SnapSetStaticsize7(int ItemType, int Size) -{ - m_SnapshotDelta.SetStaticsize7(ItemType, Size); -} - -void CClient::DebugRender() -{ - if(!g_Config.m_Debug) - return; - - static NETSTATS s_Prev, s_Current; - static int64_t s_LastSnapTime = 0; - static float s_FrameTimeAvg = 0; - char aBuffer[512]; - - Graphics()->TextureSet(m_DebugFont); - Graphics()->MapScreen(0, 0, Graphics()->ScreenWidth(), Graphics()->ScreenHeight()); - Graphics()->QuadsBegin(); - - if(time_get() - s_LastSnapTime > time_freq()) - { - s_LastSnapTime = time_get(); - s_Prev = s_Current; - net_stats(&s_Current); - } - - /* - eth = 14 - ip = 20 - udp = 8 - total = 42 - */ - s_FrameTimeAvg = s_FrameTimeAvg * 0.9f + m_RenderFrameTime * 0.1f; - str_format(aBuffer, sizeof(aBuffer), "ticks: %8d %8d gfx mem(tex/buff/stream/staging): (%" PRIu64 " KiB/%" PRIu64 " KiB/%" PRIu64 " KiB/%" PRIu64 " KiB) fps: %3d", - m_aCurGameTick[g_Config.m_ClDummy], m_aPredTick[g_Config.m_ClDummy], - (Graphics()->TextureMemoryUsage() / 1024), - (Graphics()->BufferMemoryUsage() / 1024), - (Graphics()->StreamedMemoryUsage() / 1024), - (Graphics()->StagingMemoryUsage() / 1024), - (int)(1.0f / s_FrameTimeAvg + 0.5f)); - Graphics()->QuadsText(2, 2, 16, aBuffer); - - { - uint64_t SendPackets = (s_Current.sent_packets - s_Prev.sent_packets); - uint64_t SendBytes = (s_Current.sent_bytes - s_Prev.sent_bytes); - uint64_t SendTotal = SendBytes + SendPackets * 42; - uint64_t RecvPackets = (s_Current.recv_packets - s_Prev.recv_packets); - uint64_t RecvBytes = (s_Current.recv_bytes - s_Prev.recv_bytes); - uint64_t RecvTotal = RecvBytes + RecvPackets * 42; - - if(!SendPackets) - SendPackets++; - if(!RecvPackets) - RecvPackets++; - str_format(aBuffer, sizeof(aBuffer), "send: %3" PRIu64 " %5" PRIu64 "+%4" PRIu64 "=%5" PRIu64 " (%3" PRIu64 " Kibit/s) avg: %5" PRIu64 "\nrecv: %3" PRIu64 " %5" PRIu64 "+%4" PRIu64 "=%5" PRIu64 " (%3" PRIu64 " Kibit/s) avg: %5" PRIu64, - SendPackets, SendBytes, SendPackets * 42, SendTotal, (SendTotal * 8) / 1024, SendBytes / SendPackets, - RecvPackets, RecvBytes, RecvPackets * 42, RecvTotal, (RecvTotal * 8) / 1024, RecvBytes / RecvPackets); - Graphics()->QuadsText(2, 14, 16, aBuffer); - } - - // render rates - { - int y = 0; - str_format(aBuffer, sizeof(aBuffer), "%5s %20s: %8s %8s %8s", "ID", "Name", "Rate", "Updates", "R/U"); - Graphics()->QuadsText(2, 100 + y * 12, 16, aBuffer); - y++; - for(int i = 0; i < NUM_NETOBJTYPES; i++) - { - if(m_SnapshotDelta.GetDataRate(i)) - { - str_format( - aBuffer, - sizeof(aBuffer), - "%5d %20s: %8" PRIu64 " %8" PRIu64 " %8" PRIu64, - i, - GameClient()->GetItemName(i), - m_SnapshotDelta.GetDataRate(i) / 8, m_SnapshotDelta.GetDataUpdates(i), - (m_SnapshotDelta.GetDataRate(i) / m_SnapshotDelta.GetDataUpdates(i)) / 8); - Graphics()->QuadsText(2, 100 + y * 12, 16, aBuffer); - y++; - } - } - for(int i = CSnapshot::MAX_TYPE; i > (CSnapshot::MAX_TYPE - 64); i--) - { - if(m_SnapshotDelta.GetDataRate(i) && m_aapSnapshots[g_Config.m_ClDummy][IClient::SNAP_CURRENT]) - { - int Type = m_aapSnapshots[g_Config.m_ClDummy][IClient::SNAP_CURRENT]->m_pAltSnap->GetExternalItemType(i); - if(Type == UUID_INVALID) - { - str_format( - aBuffer, - sizeof(aBuffer), - "%5d %20s: %8" PRIu64 " %8" PRIu64 " %8" PRIu64, - i, - "Unknown UUID", - m_SnapshotDelta.GetDataRate(i) / 8, - m_SnapshotDelta.GetDataUpdates(i), - (m_SnapshotDelta.GetDataRate(i) / m_SnapshotDelta.GetDataUpdates(i)) / 8); - Graphics()->QuadsText(2, 100 + y * 12, 16, aBuffer); - y++; - } - else if(Type != i) - { - str_format( - aBuffer, - sizeof(aBuffer), - "%5d %20s: %8" PRIu64 " %8" PRIu64 " %8" PRIu64, - Type, - GameClient()->GetItemName(Type), - m_SnapshotDelta.GetDataRate(i) / 8, - m_SnapshotDelta.GetDataUpdates(i), - (m_SnapshotDelta.GetDataRate(i) / m_SnapshotDelta.GetDataUpdates(i)) / 8); - Graphics()->QuadsText(2, 100 + y * 12, 16, aBuffer); - y++; - } - } - } - } - - str_format(aBuffer, sizeof(aBuffer), "pred: %d ms", GetPredictionTime()); - Graphics()->QuadsText(2, 70, 16, aBuffer); - Graphics()->QuadsEnd(); - - // render graphs - if(g_Config.m_DbgGraphs) - { - float w = Graphics()->ScreenWidth() / 4.0f; - float h = Graphics()->ScreenHeight() / 6.0f; - float sp = Graphics()->ScreenWidth() / 100.0f; - float x = Graphics()->ScreenWidth() - w - sp; - - m_FpsGraph.Scale(time_freq()); - m_FpsGraph.Render(Graphics(), TextRender(), x, sp * 5, w, h, "FPS"); - m_InputtimeMarginGraph.Scale(5 * time_freq()); - m_InputtimeMarginGraph.Render(Graphics(), TextRender(), x, sp * 6 + h, w, h, "Prediction Margin"); - m_aGametimeMarginGraphs[g_Config.m_ClDummy].Scale(5 * time_freq()); - m_aGametimeMarginGraphs[g_Config.m_ClDummy].Render(Graphics(), TextRender(), x, sp * 7 + h * 2, w, h, "Gametime Margin"); - } -} - -void CClient::Restart() -{ - SetState(IClient::STATE_RESTARTING); -} - -void CClient::Quit() -{ - SetState(IClient::STATE_QUITTING); -} - -const char *CClient::PlayerName() const -{ - if(g_Config.m_PlayerName[0]) - { - return g_Config.m_PlayerName; - } - if(g_Config.m_SteamName[0]) - { - return g_Config.m_SteamName; - } - return "nameless tee"; -} - -const char *CClient::DummyName() -{ - if(g_Config.m_ClDummyName[0]) - { - return g_Config.m_ClDummyName; - } - const char *pBase = 0; - if(g_Config.m_PlayerName[0]) - { - pBase = g_Config.m_PlayerName; - } - else if(g_Config.m_SteamName[0]) - { - pBase = g_Config.m_SteamName; - } - if(pBase) - { - str_format(m_aAutomaticDummyName, sizeof(m_aAutomaticDummyName), "[D] %s", pBase); - return m_aAutomaticDummyName; - } - return "brainless tee"; -} - -const char *CClient::ErrorString() const -{ - return m_aNetClient[CONN_MAIN].ErrorString(); -} - -void CClient::Render() -{ - if(g_Config.m_ClOverlayEntities) - { - ColorRGBA bg = color_cast(ColorHSLA(g_Config.m_ClBackgroundEntitiesColor)); - Graphics()->Clear(bg.r, bg.g, bg.b); - } - else - { - ColorRGBA bg = color_cast(ColorHSLA(g_Config.m_ClBackgroundColor)); - Graphics()->Clear(bg.r, bg.g, bg.b); - } - - GameClient()->OnRender(); - DebugRender(); - - if(State() == IClient::STATE_ONLINE && g_Config.m_ClAntiPingLimit) - { - int64_t Now = time_get(); - g_Config.m_ClAntiPing = (m_PredictedTime.Get(Now) - m_aGameTime[g_Config.m_ClDummy].Get(Now)) * 1000 / (float)time_freq() > g_Config.m_ClAntiPingLimit; - } -} - -const char *CClient::LoadMap(const char *pName, const char *pFilename, SHA256_DIGEST *pWantedSha256, unsigned WantedCrc) -{ - static char s_aErrorMsg[128]; - - SetState(IClient::STATE_LOADING); - SetLoadingStateDetail(IClient::LOADING_STATE_DETAIL_LOADING_MAP); - if((bool)m_LoadingCallback) - m_LoadingCallback(IClient::LOADING_CALLBACK_DETAIL_MAP); - - if(!m_pMap->Load(pFilename)) - { - str_format(s_aErrorMsg, sizeof(s_aErrorMsg), "map '%s' not found", pFilename); - return s_aErrorMsg; - } - - if(pWantedSha256 && m_pMap->Sha256() != *pWantedSha256) - { - char aWanted[SHA256_MAXSTRSIZE]; - char aGot[SHA256_MAXSTRSIZE]; - sha256_str(*pWantedSha256, aWanted, sizeof(aWanted)); - sha256_str(m_pMap->Sha256(), aGot, sizeof(aWanted)); - str_format(s_aErrorMsg, sizeof(s_aErrorMsg), "map differs from the server. %s != %s", aGot, aWanted); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client", s_aErrorMsg); - m_pMap->Unload(); - return s_aErrorMsg; - } - - // Only check CRC if we don't have the secure SHA256. - if(!pWantedSha256 && m_pMap->Crc() != WantedCrc) - { - str_format(s_aErrorMsg, sizeof(s_aErrorMsg), "map differs from the server. %08x != %08x", m_pMap->Crc(), WantedCrc); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client", s_aErrorMsg); - m_pMap->Unload(); - return s_aErrorMsg; - } - - // stop demo recording if we loaded a new map - for(int Recorder = 0; Recorder < RECORDER_MAX; Recorder++) - { - DemoRecorder(Recorder)->Stop(Recorder == RECORDER_REPLAYS ? IDemoRecorder::EStopMode::REMOVE_FILE : IDemoRecorder::EStopMode::KEEP_FILE); - } - - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "loaded map '%s'", pFilename); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client", aBuf); - - str_copy(m_aCurrentMap, pName); - str_copy(m_aCurrentMapPath, pFilename); - - return 0; -} - -static void FormatMapDownloadFilename(const char *pName, const SHA256_DIGEST *pSha256, int Crc, bool Temp, char *pBuffer, int BufferSize) -{ - char aSuffix[32]; - if(Temp) - { - IStorage::FormatTmpPath(aSuffix, sizeof(aSuffix), ""); - } - else - { - str_copy(aSuffix, ".map"); - } - - if(pSha256) - { - char aSha256[SHA256_MAXSTRSIZE]; - sha256_str(*pSha256, aSha256, sizeof(aSha256)); - str_format(pBuffer, BufferSize, "downloadedmaps/%s_%s%s", pName, aSha256, aSuffix); - } - else - { - str_format(pBuffer, BufferSize, "downloadedmaps/%s_%08x%s", pName, Crc, aSuffix); - } -} - -const char *CClient::LoadMapSearch(const char *pMapName, SHA256_DIGEST *pWantedSha256, int WantedCrc) -{ - char aBuf[512]; - char aWanted[SHA256_MAXSTRSIZE + 16]; - aWanted[0] = 0; - if(pWantedSha256) - { - char aWantedSha256[SHA256_MAXSTRSIZE]; - sha256_str(*pWantedSha256, aWantedSha256, sizeof(aWantedSha256)); - str_format(aWanted, sizeof(aWanted), "sha256=%s ", aWantedSha256); - } - str_format(aBuf, sizeof(aBuf), "loading map, map=%s wanted %scrc=%08x", pMapName, aWanted, WantedCrc); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client", aBuf); - - // try the normal maps folder - str_format(aBuf, sizeof(aBuf), "maps/%s.map", pMapName); - const char *pError = LoadMap(pMapName, aBuf, pWantedSha256, WantedCrc); - if(!pError) - return nullptr; - - // try the downloaded maps - FormatMapDownloadFilename(pMapName, pWantedSha256, WantedCrc, false, aBuf, sizeof(aBuf)); - pError = LoadMap(pMapName, aBuf, pWantedSha256, WantedCrc); - if(!pError) - return nullptr; - - // backward compatibility with old names - if(pWantedSha256) - { - FormatMapDownloadFilename(pMapName, 0, WantedCrc, false, aBuf, sizeof(aBuf)); - pError = LoadMap(pMapName, aBuf, pWantedSha256, WantedCrc); - if(!pError) - return nullptr; - } - - // search for the map within subfolders - char aFilename[IO_MAX_PATH_LENGTH]; - str_format(aFilename, sizeof(aFilename), "%s.map", pMapName); - if(Storage()->FindFile(aFilename, "maps", IStorage::TYPE_ALL, aBuf, sizeof(aBuf))) - { - pError = LoadMap(pMapName, aBuf, pWantedSha256, WantedCrc); - if(!pError) - return nullptr; - } - - static char s_aErrorMsg[256]; - str_format(s_aErrorMsg, sizeof(s_aErrorMsg), "Could not find map '%s'", pMapName); - return s_aErrorMsg; -} - -void CClient::ProcessConnlessPacket(CNetChunk *pPacket) -{ - // server info - if(pPacket->m_DataSize >= (int)sizeof(SERVERBROWSE_INFO)) - { - int Type = -1; - if(mem_comp(pPacket->m_pData, SERVERBROWSE_INFO, sizeof(SERVERBROWSE_INFO)) == 0) - Type = SERVERINFO_VANILLA; - else if(mem_comp(pPacket->m_pData, SERVERBROWSE_INFO_EXTENDED, sizeof(SERVERBROWSE_INFO_EXTENDED)) == 0) - Type = SERVERINFO_EXTENDED; - else if(mem_comp(pPacket->m_pData, SERVERBROWSE_INFO_EXTENDED_MORE, sizeof(SERVERBROWSE_INFO_EXTENDED_MORE)) == 0) - Type = SERVERINFO_EXTENDED_MORE; - - if(Type != -1) - { - void *pData = (unsigned char *)pPacket->m_pData + sizeof(SERVERBROWSE_INFO); - int DataSize = pPacket->m_DataSize - sizeof(SERVERBROWSE_INFO); - ProcessServerInfo(Type, &pPacket->m_Address, pData, DataSize); - } - } -} - -static int SavedServerInfoType(int Type) -{ - if(Type == SERVERINFO_EXTENDED_MORE) - return SERVERINFO_EXTENDED; - - return Type; -} - -void CClient::ProcessServerInfo(int RawType, NETADDR *pFrom, const void *pData, int DataSize) -{ - CServerBrowser::CServerEntry *pEntry = m_ServerBrowser.Find(*pFrom); - - CServerInfo Info = {0}; - int SavedType = SavedServerInfoType(RawType); - if(SavedType == SERVERINFO_EXTENDED && pEntry && pEntry->m_GotInfo && SavedType == pEntry->m_Info.m_Type) - { - Info = pEntry->m_Info; - } - else - { - Info.m_NumAddresses = 1; - Info.m_aAddresses[0] = *pFrom; - } - - Info.m_Type = SavedType; - - net_addr_str(pFrom, Info.m_aAddress, sizeof(Info.m_aAddress), true); - - CUnpacker Up; - Up.Reset(pData, DataSize); - -#define GET_STRING(array) str_copy(array, Up.GetString(CUnpacker::SANITIZE_CC | CUnpacker::SKIP_START_WHITESPACES), sizeof(array)) -#define GET_INT(integer) (integer) = str_toint(Up.GetString()) - - int Token; - int PacketNo = 0; // Only used if SavedType == SERVERINFO_EXTENDED - - GET_INT(Token); - if(RawType != SERVERINFO_EXTENDED_MORE) - { - GET_STRING(Info.m_aVersion); - GET_STRING(Info.m_aName); - GET_STRING(Info.m_aMap); - - if(SavedType == SERVERINFO_EXTENDED) - { - GET_INT(Info.m_MapCrc); - GET_INT(Info.m_MapSize); - } - - GET_STRING(Info.m_aGameType); - GET_INT(Info.m_Flags); - GET_INT(Info.m_NumPlayers); - GET_INT(Info.m_MaxPlayers); - GET_INT(Info.m_NumClients); - GET_INT(Info.m_MaxClients); - - // don't add invalid info to the server browser list - if(Info.m_NumClients < 0 || Info.m_MaxClients < 0 || - Info.m_NumPlayers < 0 || Info.m_MaxPlayers < 0 || - Info.m_NumPlayers > Info.m_NumClients || Info.m_MaxPlayers > Info.m_MaxClients) - { - return; - } - - m_ServerBrowser.UpdateServerCommunity(&Info); - m_ServerBrowser.UpdateServerRank(&Info); - - switch(SavedType) - { - case SERVERINFO_VANILLA: - if(Info.m_MaxPlayers > VANILLA_MAX_CLIENTS || - Info.m_MaxClients > VANILLA_MAX_CLIENTS) - { - return; - } - break; - case SERVERINFO_64_LEGACY: - if(Info.m_MaxPlayers > MAX_CLIENTS || - Info.m_MaxClients > MAX_CLIENTS) - { - return; - } - break; - case SERVERINFO_EXTENDED: - if(Info.m_NumPlayers > Info.m_NumClients) - return; - break; - default: - dbg_assert(false, "unknown serverinfo type"); - } - - if(SavedType == SERVERINFO_EXTENDED) - PacketNo = 0; - } - else - { - GET_INT(PacketNo); - // 0 needs to be excluded because that's reserved for the main packet. - if(PacketNo <= 0 || PacketNo >= 64) - return; - } - - bool DuplicatedPacket = false; - if(SavedType == SERVERINFO_EXTENDED) - { - Up.GetString(); // extra info, reserved - - uint64_t Flag = (uint64_t)1 << PacketNo; - DuplicatedPacket = Info.m_ReceivedPackets & Flag; - Info.m_ReceivedPackets |= Flag; - } - - bool IgnoreError = false; - for(int i = 0; i < MAX_CLIENTS && Info.m_NumReceivedClients < MAX_CLIENTS && !Up.Error(); i++) - { - CServerInfo::CClient *pClient = &Info.m_aClients[Info.m_NumReceivedClients]; - GET_STRING(pClient->m_aName); - if(Up.Error()) - { - // Packet end, no problem unless it happens during one - // player info, so ignore the error. - IgnoreError = true; - break; - } - GET_STRING(pClient->m_aClan); - GET_INT(pClient->m_Country); - GET_INT(pClient->m_Score); - GET_INT(pClient->m_Player); - if(SavedType == SERVERINFO_EXTENDED) - { - Up.GetString(); // extra info, reserved - } - if(!Up.Error()) - { - if(SavedType == SERVERINFO_64_LEGACY) - { - uint64_t Flag = (uint64_t)1 << i; - if(!(Info.m_ReceivedPackets & Flag)) - { - Info.m_ReceivedPackets |= Flag; - Info.m_NumReceivedClients++; - } - } - else - { - Info.m_NumReceivedClients++; - } - } - } - - str_clean_whitespaces(Info.m_aName); - - if(!Up.Error() || IgnoreError) - { - if(!DuplicatedPacket && (!pEntry || !pEntry->m_GotInfo || SavedType >= pEntry->m_Info.m_Type)) - { - m_ServerBrowser.OnServerInfoUpdate(*pFrom, Token, &Info); - } - - // Player info is irrelevant for the client (while connected), - // it gets its info from elsewhere. - // - // SERVERINFO_EXTENDED_MORE doesn't carry any server - // information, so just skip it. - if(net_addr_comp(&ServerAddress(), pFrom) == 0 && RawType != SERVERINFO_EXTENDED_MORE) - { - // Only accept server info that has a type that is - // newer or equal to something the server already sent - // us. - if(SavedType >= m_CurrentServerInfo.m_Type) - { - m_CurrentServerInfo = Info; - m_CurrentServerInfoRequestTime = -1; - } - - bool ValidPong = false; - if(!m_ServerCapabilities.m_PingEx && m_CurrentServerCurrentPingTime >= 0 && SavedType >= m_CurrentServerPingInfoType) - { - if(RawType == SERVERINFO_VANILLA) - { - ValidPong = Token == m_CurrentServerPingBasicToken; - } - else if(RawType == SERVERINFO_EXTENDED) - { - ValidPong = Token == m_CurrentServerPingToken; - } - } - if(ValidPong) - { - int LatencyMs = (time_get() - m_CurrentServerCurrentPingTime) * 1000 / time_freq(); - m_ServerBrowser.SetCurrentServerPing(ServerAddress(), LatencyMs); - m_CurrentServerPingInfoType = SavedType; - m_CurrentServerCurrentPingTime = -1; - - char aBuf[64]; - str_format(aBuf, sizeof(aBuf), "got pong from current server, latency=%dms", LatencyMs); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", aBuf); - } - } - } - -#undef GET_STRING -#undef GET_INT -} - -static CServerCapabilities GetServerCapabilities(int Version, int Flags, bool Sixup) -{ - CServerCapabilities Result; - bool DDNet = false; - if(Version >= 1) - { - DDNet = Flags & SERVERCAPFLAG_DDNET; - } - Result.m_ChatTimeoutCode = DDNet; - Result.m_AnyPlayerFlag = !Sixup; - Result.m_PingEx = false; - Result.m_AllowDummy = true; - Result.m_SyncWeaponInput = false; - if(Version >= 1) - { - Result.m_ChatTimeoutCode = Flags & SERVERCAPFLAG_CHATTIMEOUTCODE; - } - if(Version >= 2) - { - Result.m_AnyPlayerFlag = Flags & SERVERCAPFLAG_ANYPLAYERFLAG; - } - if(Version >= 3) - { - Result.m_PingEx = Flags & SERVERCAPFLAG_PINGEX; - } - if(Version >= 4) - { - Result.m_AllowDummy = Flags & SERVERCAPFLAG_ALLOWDUMMY; - } - if(Version >= 5) - { - Result.m_SyncWeaponInput = Flags & SERVERCAPFLAG_SYNCWEAPONINPUT; - } - return Result; -} - -void CClient::ProcessServerPacket(CNetChunk *pPacket, int Conn, bool Dummy) -{ - CUnpacker Unpacker; - Unpacker.Reset(pPacket->m_pData, pPacket->m_DataSize); - CMsgPacker Packer(NETMSG_EX, true); - - // unpack msgid and system flag - int Msg; - bool Sys; - CUuid Uuid; - - int Result = UnpackMessageId(&Msg, &Sys, &Uuid, &Unpacker, &Packer); - if(Result == UNPACKMESSAGE_ERROR) - { - return; - } - else if(Result == UNPACKMESSAGE_ANSWER) - { - SendMsg(Conn, &Packer, MSGFLAG_VITAL); - } - - // allocates the memory for the translated data - CPacker Packer6; - if(IsSixup()) - { - bool IsExMsg = false; - int Success = !TranslateSysMsg(&Msg, Sys, &Unpacker, &Packer6, pPacket, &IsExMsg); - if(Msg < 0) - return; - if(Success && !IsExMsg) - { - Unpacker.Reset(Packer6.Data(), Packer6.Size()); - } - } - - if(Sys) - { - // system message - if(Conn == CONN_MAIN && (pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_MAP_DETAILS) - { - const char *pMap = Unpacker.GetString(CUnpacker::SANITIZE_CC | CUnpacker::SKIP_START_WHITESPACES); - SHA256_DIGEST *pMapSha256 = (SHA256_DIGEST *)Unpacker.GetRaw(sizeof(*pMapSha256)); - int MapCrc = Unpacker.GetInt(); - int MapSize = Unpacker.GetInt(); - if(Unpacker.Error()) - { - return; - } - - const char *pMapUrl = Unpacker.GetString(CUnpacker::SANITIZE_CC); - if(Unpacker.Error()) - { - pMapUrl = ""; - } - - m_MapDetailsPresent = true; - (void)MapSize; - str_copy(m_aMapDetailsName, pMap); - m_MapDetailsSha256 = *pMapSha256; - m_MapDetailsCrc = MapCrc; - str_copy(m_aMapDetailsUrl, pMapUrl); - } - else if(Conn == CONN_MAIN && (pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_CAPABILITIES) - { - if(!m_CanReceiveServerCapabilities) - { - return; - } - int Version = Unpacker.GetInt(); - int Flags = Unpacker.GetInt(); - if(Unpacker.Error() || Version <= 0) - { - return; - } - m_ServerCapabilities = GetServerCapabilities(Version, Flags, IsSixup()); - m_CanReceiveServerCapabilities = false; - m_ServerSentCapabilities = true; - } - else if(Conn == CONN_MAIN && (pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_MAP_CHANGE) - { - if(m_CanReceiveServerCapabilities) - { - m_ServerCapabilities = GetServerCapabilities(0, 0, IsSixup()); - m_CanReceiveServerCapabilities = false; - } - bool MapDetailsWerePresent = m_MapDetailsPresent; - m_MapDetailsPresent = false; - - const char *pMap = Unpacker.GetString(CUnpacker::SANITIZE_CC | CUnpacker::SKIP_START_WHITESPACES); - int MapCrc = Unpacker.GetInt(); - int MapSize = Unpacker.GetInt(); - if(Unpacker.Error()) - { - return; - } - if(MapSize < 0 || MapSize > 1024 * 1024 * 1024) // 1 GiB - { - DisconnectWithReason("invalid map size"); - return; - } - - for(int i = 0; pMap[i]; i++) // protect the player from nasty map names - { - if(pMap[i] == '/' || pMap[i] == '\\') - { - DisconnectWithReason("strange character in map name"); - return; - } - } - - if(m_DummyConnected && !m_DummyReconnectOnReload) - { - DummyDisconnect(0); - } - - ResetMapDownload(true); - - SHA256_DIGEST *pMapSha256 = nullptr; - const char *pMapUrl = nullptr; - if(MapDetailsWerePresent && str_comp(m_aMapDetailsName, pMap) == 0 && m_MapDetailsCrc == MapCrc) - { - pMapSha256 = &m_MapDetailsSha256; - pMapUrl = m_aMapDetailsUrl[0] ? m_aMapDetailsUrl : nullptr; - } - - if(LoadMapSearch(pMap, pMapSha256, MapCrc) == nullptr) - { - m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client/network", "loading done"); - SetLoadingStateDetail(IClient::LOADING_STATE_DETAIL_SENDING_READY); - SendReady(CONN_MAIN); - } - else - { - // start map download - FormatMapDownloadFilename(pMap, pMapSha256, MapCrc, false, m_aMapdownloadFilename, sizeof(m_aMapdownloadFilename)); - FormatMapDownloadFilename(pMap, pMapSha256, MapCrc, true, m_aMapdownloadFilenameTemp, sizeof(m_aMapdownloadFilenameTemp)); - - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "starting to download map to '%s'", m_aMapdownloadFilenameTemp); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client/network", aBuf); - - str_copy(m_aMapdownloadName, pMap); - m_MapdownloadSha256Present = (bool)pMapSha256; - m_MapdownloadSha256 = pMapSha256 ? *pMapSha256 : SHA256_ZEROED; - m_MapdownloadCrc = MapCrc; - m_MapdownloadTotalsize = MapSize; - - if(pMapSha256) - { - char aUrl[256]; - char aEscaped[256]; - EscapeUrl(aEscaped, m_aMapdownloadFilename + 15); // cut off downloadedmaps/ - bool UseConfigUrl = str_comp(g_Config.m_ClMapDownloadUrl, "https://maps.ddnet.org") != 0 || m_aMapDownloadUrl[0] == '\0'; - str_format(aUrl, sizeof(aUrl), "%s/%s", UseConfigUrl ? g_Config.m_ClMapDownloadUrl : m_aMapDownloadUrl, aEscaped); - - m_pMapdownloadTask = HttpGetFile(pMapUrl ? pMapUrl : aUrl, Storage(), m_aMapdownloadFilenameTemp, IStorage::TYPE_SAVE); - m_pMapdownloadTask->Timeout(CTimeout{g_Config.m_ClMapDownloadConnectTimeoutMs, 0, g_Config.m_ClMapDownloadLowSpeedLimit, g_Config.m_ClMapDownloadLowSpeedTime}); - m_pMapdownloadTask->MaxResponseSize(MapSize); - m_pMapdownloadTask->ExpectSha256(*pMapSha256); - Http()->Run(m_pMapdownloadTask); - } - else - { - SendMapRequest(); - } - } - } - else if(Conn == CONN_MAIN && Msg == NETMSG_MAP_DATA) - { - if(!m_MapdownloadFileTemp) - { - return; - } - int Last = -1; - int MapCRC = -1; - int Chunk = -1; - int Size = -1; - - if(IsSixup()) - { - MapCRC = m_MapdownloadCrc; - Chunk = m_MapdownloadChunk; - Size = minimum(m_TranslationContext.m_MapDownloadChunkSize, m_TranslationContext.m_MapdownloadTotalsize - m_MapdownloadAmount); - } - else - { - Last = Unpacker.GetInt(); - MapCRC = Unpacker.GetInt(); - Chunk = Unpacker.GetInt(); - Size = Unpacker.GetInt(); - } - - const unsigned char *pData = Unpacker.GetRaw(Size); - if(Unpacker.Error() || Size <= 0 || MapCRC != m_MapdownloadCrc || Chunk != m_MapdownloadChunk) - { - return; - } - - io_write(m_MapdownloadFileTemp, pData, Size); - - m_MapdownloadAmount += Size; - - if(IsSixup()) - Last = m_MapdownloadAmount == m_TranslationContext.m_MapdownloadTotalsize; - - if(Last) - { - if(m_MapdownloadFileTemp) - { - io_close(m_MapdownloadFileTemp); - m_MapdownloadFileTemp = 0; - } - FinishMapDownload(); - } - else - { - // request new chunk - m_MapdownloadChunk++; - - if(IsSixup() && (m_MapdownloadChunk % m_TranslationContext.m_MapDownloadChunksPerRequest == 0)) - { - CMsgPacker MsgP(protocol7::NETMSG_REQUEST_MAP_DATA, true, true); - SendMsg(CONN_MAIN, &MsgP, MSGFLAG_VITAL | MSGFLAG_FLUSH); - } - else - { - CMsgPacker MsgP(NETMSG_REQUEST_MAP_DATA, true); - MsgP.AddInt(m_MapdownloadChunk); - SendMsg(CONN_MAIN, &MsgP, MSGFLAG_VITAL | MSGFLAG_FLUSH); - } - - if(g_Config.m_Debug) - { - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "requested chunk %d", m_MapdownloadChunk); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client/network", aBuf); - } - } - } - else if(Conn == CONN_MAIN && (pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_MAP_RELOAD) - { - if(m_DummyConnected) - { - m_DummyReconnectOnReload = true; - m_DummyDeactivateOnReconnect = g_Config.m_ClDummy == 0; - g_Config.m_ClDummy = 0; - } - else - m_DummyDeactivateOnReconnect = false; - } - else if(Conn == CONN_MAIN && (pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_CON_READY) - { - GameClient()->OnConnected(); - if(m_DummyReconnectOnReload) - { - m_DummySendConnInfo = true; - m_DummyReconnectOnReload = false; - } - } - else if(Conn == CONN_DUMMY && Msg == NETMSG_CON_READY) - { - m_DummyConnected = true; - m_DummyConnecting = false; - g_Config.m_ClDummy = 1; - Rcon("crashmeplx"); - if(m_aRconAuthed[0] && !m_aRconAuthed[1]) - RconAuth(m_aRconUsername, m_aRconPassword); - } - else if(Msg == NETMSG_PING) - { - CMsgPacker MsgP(NETMSG_PING_REPLY, true); - int Vital = (pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 ? MSGFLAG_VITAL : 0; - SendMsg(Conn, &MsgP, MSGFLAG_FLUSH | Vital); - } - else if(Msg == NETMSG_PINGEX) - { - CUuid *pId = (CUuid *)Unpacker.GetRaw(sizeof(*pId)); - if(Unpacker.Error()) - { - return; - } - CMsgPacker MsgP(NETMSG_PONGEX, true); - MsgP.AddRaw(pId, sizeof(*pId)); - int Vital = (pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 ? MSGFLAG_VITAL : 0; - SendMsg(Conn, &MsgP, MSGFLAG_FLUSH | Vital); - } - else if(Conn == CONN_MAIN && Msg == NETMSG_PONGEX) - { - CUuid *pId = (CUuid *)Unpacker.GetRaw(sizeof(*pId)); - if(Unpacker.Error()) - { - return; - } - if(m_ServerCapabilities.m_PingEx && m_CurrentServerCurrentPingTime >= 0 && *pId == m_CurrentServerPingUuid) - { - int LatencyMs = (time_get() - m_CurrentServerCurrentPingTime) * 1000 / time_freq(); - m_ServerBrowser.SetCurrentServerPing(ServerAddress(), LatencyMs); - m_CurrentServerCurrentPingTime = -1; - - char aBuf[64]; - str_format(aBuf, sizeof(aBuf), "got pong from current server, latency=%dms", LatencyMs); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", aBuf); - } - } - else if(Msg == NETMSG_CHECKSUM_REQUEST) - { - CUuid *pUuid = (CUuid *)Unpacker.GetRaw(sizeof(*pUuid)); - if(Unpacker.Error()) - { - return; - } - int ResultCheck = HandleChecksum(Conn, *pUuid, &Unpacker); - if(ResultCheck) - { - CMsgPacker MsgP(NETMSG_CHECKSUM_ERROR, true); - MsgP.AddRaw(pUuid, sizeof(*pUuid)); - MsgP.AddInt(ResultCheck); - SendMsg(Conn, &MsgP, MSGFLAG_VITAL); - } - } - else if(Msg == NETMSG_REDIRECT) - { - int RedirectPort = Unpacker.GetInt(); - if(Unpacker.Error()) - { - return; - } - char aAddr[NETADDR_MAXSTRSIZE]; - NETADDR ServerAddr = ServerAddress(); - ServerAddr.port = RedirectPort; - net_addr_str(&ServerAddr, aAddr, sizeof(aAddr), true); - Connect(aAddr); - } - else if(Conn == CONN_MAIN && (pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_RCON_CMD_ADD) - { - const char *pName = Unpacker.GetString(CUnpacker::SANITIZE_CC); - const char *pHelp = Unpacker.GetString(CUnpacker::SANITIZE_CC); - const char *pParams = Unpacker.GetString(CUnpacker::SANITIZE_CC); - if(!Unpacker.Error()) - { - m_pConsole->RegisterTemp(pName, pParams, CFGFLAG_SERVER, pHelp); - } - m_GotRconCommands++; - } - else if(Conn == CONN_MAIN && (pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_RCON_CMD_REM) - { - const char *pName = Unpacker.GetString(CUnpacker::SANITIZE_CC); - if(!Unpacker.Error()) - { - m_pConsole->DeregisterTemp(pName); - } - } - else if((pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_RCON_AUTH_STATUS) - { - int ResultInt = Unpacker.GetInt(); - if(!Unpacker.Error()) - { - m_aRconAuthed[Conn] = ResultInt; - - if(m_aRconAuthed[Conn]) - RconAuth(m_aRconUsername, m_aRconPassword, g_Config.m_ClDummy ^ 1); - } - if(Conn == CONN_MAIN) - { - int Old = m_UseTempRconCommands; - m_UseTempRconCommands = Unpacker.GetInt(); - if(Unpacker.Error()) - { - m_UseTempRconCommands = 0; - } - if(Old != 0 && m_UseTempRconCommands == 0) - { - m_pConsole->DeregisterTempAll(); - m_ExpectedRconCommands = -1; - } - } - } - else if(!Dummy && (pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_RCON_LINE) - { - const char *pLine = Unpacker.GetString(); - if(!Unpacker.Error()) - { - GameClient()->OnRconLine(pLine); - } - } - else if(Conn == CONN_MAIN && Msg == NETMSG_PING_REPLY) - { - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "latency %.2f", (time_get() - m_PingStartTime) * 1000 / (float)time_freq()); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client/network", aBuf); - } - else if(Msg == NETMSG_INPUTTIMING) - { - int InputPredTick = Unpacker.GetInt(); - int TimeLeft = Unpacker.GetInt(); - if(Unpacker.Error()) - { - return; - } - - int64_t Now = time_get(); - - // adjust our prediction time - int64_t Target = 0; - for(int k = 0; k < 200; k++) - { - if(m_aInputs[Conn][k].m_Tick == InputPredTick) - { - Target = m_aInputs[Conn][k].m_PredictedTime + (Now - m_aInputs[Conn][k].m_Time); - Target = Target - (int64_t)((TimeLeft / 1000.0f) * time_freq()); - break; - } - } - - if(Target) - m_PredictedTime.Update(&m_InputtimeMarginGraph, Target, TimeLeft, CSmoothTime::ADJUSTDIRECTION_UP); - } - else if(Msg == NETMSG_SNAP || Msg == NETMSG_SNAPSINGLE || Msg == NETMSG_SNAPEMPTY) - { - // we are not allowed to process snapshot yet - if(State() < IClient::STATE_LOADING) - { - return; - } - - int GameTick = Unpacker.GetInt(); - int DeltaTick = GameTick - Unpacker.GetInt(); - - int NumParts = 1; - int Part = 0; - if(Msg == NETMSG_SNAP) - { - NumParts = Unpacker.GetInt(); - Part = Unpacker.GetInt(); - } - - unsigned int Crc = 0; - int PartSize = 0; - if(Msg != NETMSG_SNAPEMPTY) - { - Crc = Unpacker.GetInt(); - PartSize = Unpacker.GetInt(); - } - - const char *pData = (const char *)Unpacker.GetRaw(PartSize); - if(Unpacker.Error() || NumParts < 1 || NumParts > CSnapshot::MAX_PARTS || Part < 0 || Part >= NumParts || PartSize < 0 || PartSize > MAX_SNAPSHOT_PACKSIZE) - { - return; - } - - // Check m_aAckGameTick to see if we already got a snapshot for that tick - if(GameTick >= m_aCurrentRecvTick[Conn] && GameTick > m_aAckGameTick[Conn]) - { - if(GameTick != m_aCurrentRecvTick[Conn]) - { - m_aSnapshotParts[Conn] = 0; - m_aCurrentRecvTick[Conn] = GameTick; - m_aSnapshotIncomingDataSize[Conn] = 0; - } - - mem_copy((char *)m_aaSnapshotIncomingData[Conn] + Part * MAX_SNAPSHOT_PACKSIZE, pData, clamp(PartSize, 0, (int)sizeof(m_aaSnapshotIncomingData[Conn]) - Part * MAX_SNAPSHOT_PACKSIZE)); - m_aSnapshotParts[Conn] |= (uint64_t)(1) << Part; - - if(Part == NumParts - 1) - { - m_aSnapshotIncomingDataSize[Conn] = (NumParts - 1) * MAX_SNAPSHOT_PACKSIZE + PartSize; - } - - if((NumParts < CSnapshot::MAX_PARTS && m_aSnapshotParts[Conn] == (((uint64_t)(1) << NumParts) - 1)) || - (NumParts == CSnapshot::MAX_PARTS && m_aSnapshotParts[Conn] == std::numeric_limits::max())) - { - unsigned char aTmpBuffer2[CSnapshot::MAX_SIZE]; - unsigned char aTmpBuffer3[CSnapshot::MAX_SIZE]; - CSnapshot *pTmpBuffer3 = (CSnapshot *)aTmpBuffer3; // Fix compiler warning for strict-aliasing - - // reset snapshoting - m_aSnapshotParts[Conn] = 0; - - // find snapshot that we should use as delta - const CSnapshot *pDeltaShot = CSnapshot::EmptySnapshot(); - if(DeltaTick >= 0) - { - int DeltashotSize = m_aSnapshotStorage[Conn].Get(DeltaTick, nullptr, &pDeltaShot, nullptr); - - if(DeltashotSize < 0) - { - // couldn't find the delta snapshots that the server used - // to compress this snapshot. force the server to resync - if(g_Config.m_Debug) - { - m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client", "error, couldn't find the delta snapshot"); - } - - // ack snapshot - m_aAckGameTick[Conn] = -1; - SendInput(); - return; - } - } - - // decompress snapshot - const void *pDeltaData = m_SnapshotDelta.EmptyDelta(); - int DeltaSize = sizeof(int) * 3; - - if(m_aSnapshotIncomingDataSize[Conn]) - { - int IntSize = CVariableInt::Decompress(m_aaSnapshotIncomingData[Conn], m_aSnapshotIncomingDataSize[Conn], aTmpBuffer2, sizeof(aTmpBuffer2)); - - if(IntSize < 0) // failure during decompression - return; - - pDeltaData = aTmpBuffer2; - DeltaSize = IntSize; - } - - // unpack delta - const int SnapSize = m_SnapshotDelta.UnpackDelta(pDeltaShot, pTmpBuffer3, pDeltaData, DeltaSize, IsSixup()); - if(SnapSize < 0) - { - dbg_msg("client", "delta unpack failed. error=%d", SnapSize); - return; - } - if(!pTmpBuffer3->IsValid(SnapSize)) - { - dbg_msg("client", "snapshot invalid. SnapSize=%d, DeltaSize=%d", SnapSize, DeltaSize); - return; - } - - if(Msg != NETMSG_SNAPEMPTY && pTmpBuffer3->Crc() != Crc) - { - log_error("client", "snapshot crc error #%d - tick=%d wantedcrc=%d gotcrc=%d compressed_size=%d delta_tick=%d", - m_SnapCrcErrors, GameTick, Crc, pTmpBuffer3->Crc(), m_aSnapshotIncomingDataSize[Conn], DeltaTick); - - m_SnapCrcErrors++; - if(m_SnapCrcErrors > 10) - { - // to many errors, send reset - m_aAckGameTick[Conn] = -1; - SendInput(); - m_SnapCrcErrors = 0; - } - return; - } - else - { - if(m_SnapCrcErrors) - m_SnapCrcErrors--; - } - - // purge old snapshots - int PurgeTick = DeltaTick; - if(m_aapSnapshots[Conn][SNAP_PREV] && m_aapSnapshots[Conn][SNAP_PREV]->m_Tick < PurgeTick) - PurgeTick = m_aapSnapshots[Conn][SNAP_PREV]->m_Tick; - if(m_aapSnapshots[Conn][SNAP_CURRENT] && m_aapSnapshots[Conn][SNAP_CURRENT]->m_Tick < PurgeTick) - PurgeTick = m_aapSnapshots[Conn][SNAP_CURRENT]->m_Tick; - m_aSnapshotStorage[Conn].PurgeUntil(PurgeTick); - - // create a verified and unpacked snapshot - int AltSnapSize = -1; - unsigned char aAltSnapBuffer[CSnapshot::MAX_SIZE]; - CSnapshot *pAltSnapBuffer = (CSnapshot *)aAltSnapBuffer; - - if(IsSixup()) - { - unsigned char aTmpTransSnapBuffer[CSnapshot::MAX_SIZE]; - CSnapshot *pTmpTransSnapBuffer = (CSnapshot *)aTmpTransSnapBuffer; - mem_copy(pTmpTransSnapBuffer, pTmpBuffer3, CSnapshot::MAX_SIZE); - AltSnapSize = GameClient()->TranslateSnap(pAltSnapBuffer, pTmpTransSnapBuffer, Conn, Dummy); - } - else - { - AltSnapSize = UnpackAndValidateSnapshot(pTmpBuffer3, pAltSnapBuffer); - } - - if(AltSnapSize < 0) - { - dbg_msg("client", "unpack snapshot and validate failed. error=%d", AltSnapSize); - return; - } - - // add new - m_aSnapshotStorage[Conn].Add(GameTick, time_get(), SnapSize, pTmpBuffer3, AltSnapSize, pAltSnapBuffer); - - if(!Dummy) - { - // for antiping: if the projectile netobjects from the server contains extra data, this is removed and the original content restored before recording demo - SnapshotRemoveExtraProjectileInfo(pTmpBuffer3); - - unsigned char aSnapSeven[CSnapshot::MAX_SIZE]; - CSnapshot *pSnapSeven = (CSnapshot *)aSnapSeven; - int DemoSnapSize = SnapSize; - if(IsSixup()) - { - DemoSnapSize = GameClient()->OnDemoRecSnap7(pTmpBuffer3, pSnapSeven, Conn); - if(DemoSnapSize < 0) - { - dbg_msg("sixup", "demo snapshot failed. error=%d", DemoSnapSize); - } - } - - if(DemoSnapSize >= 0) - { - // add snapshot to demo - for(auto &DemoRecorder : m_aDemoRecorder) - { - if(DemoRecorder.IsRecording()) - { - // write snapshot - DemoRecorder.RecordSnapshot(GameTick, IsSixup() ? pSnapSeven : pTmpBuffer3, DemoSnapSize); - } - } - } - } - - // apply snapshot, cycle pointers - m_aReceivedSnapshots[Conn]++; - - // we got two snapshots until we see us self as connected - if(m_aReceivedSnapshots[Conn] == 2) - { - // start at 200ms and work from there - if(!Dummy) - { - m_PredictedTime.Init(GameTick * time_freq() / GameTickSpeed()); - m_PredictedTime.SetAdjustSpeed(CSmoothTime::ADJUSTDIRECTION_UP, 1000.0f); - m_PredictedTime.UpdateMargin(PredictionMargin() * time_freq() / 1000); - } - m_aGameTime[Conn].Init((GameTick - 1) * time_freq() / GameTickSpeed()); - m_aapSnapshots[Conn][SNAP_PREV] = m_aSnapshotStorage[Conn].m_pFirst; - m_aapSnapshots[Conn][SNAP_CURRENT] = m_aSnapshotStorage[Conn].m_pLast; - m_aPrevGameTick[Conn] = m_aapSnapshots[Conn][SNAP_PREV]->m_Tick; - m_aCurGameTick[Conn] = m_aapSnapshots[Conn][SNAP_CURRENT]->m_Tick; - if(Conn == CONN_MAIN) - { - m_LocalStartTime = time_get(); -#if defined(CONF_VIDEORECORDER) - IVideo::SetLocalStartTime(m_LocalStartTime); -#endif - } - if(!Dummy) - { - GameClient()->OnNewSnapshot(); - } - SetState(IClient::STATE_ONLINE); - if(!Dummy) - { - DemoRecorder_HandleAutoStart(); - } - } - - // adjust game time - if(m_aReceivedSnapshots[Conn] > 2) - { - int64_t Now = m_aGameTime[Conn].Get(time_get()); - int64_t TickStart = GameTick * time_freq() / GameTickSpeed(); - int64_t TimeLeft = (TickStart - Now) * 1000 / time_freq(); - m_aGameTime[Conn].Update(&m_aGametimeMarginGraphs[Conn], (GameTick - 1) * time_freq() / GameTickSpeed(), TimeLeft, CSmoothTime::ADJUSTDIRECTION_DOWN); - } - - if(m_aReceivedSnapshots[Conn] > GameTickSpeed() && !m_aCodeRunAfterJoin[Conn]) - { - if(m_ServerCapabilities.m_ChatTimeoutCode) - { - char aBuf[128]; - char aBufMsg[256]; - if(!g_Config.m_ClRunOnJoin[0] && !g_Config.m_ClDummyDefaultEyes && !g_Config.m_ClPlayerDefaultEyes) - str_format(aBufMsg, sizeof(aBufMsg), "/timeout %s", m_aTimeoutCodes[Conn]); - else - str_format(aBufMsg, sizeof(aBufMsg), "/mc;timeout %s", m_aTimeoutCodes[Conn]); - - if(g_Config.m_ClRunOnJoin[0]) - { - str_format(aBuf, sizeof(aBuf), ";%s", g_Config.m_ClRunOnJoin); - str_append(aBufMsg, aBuf); - } - if(g_Config.m_ClDummyDefaultEyes || g_Config.m_ClPlayerDefaultEyes) - { - int Emote = ((g_Config.m_ClDummy) ? !Dummy : Dummy) ? g_Config.m_ClDummyDefaultEyes : g_Config.m_ClPlayerDefaultEyes; - char aBufEmote[128]; - aBufEmote[0] = '\0'; - switch(Emote) - { - case EMOTE_NORMAL: - break; - case EMOTE_PAIN: - str_format(aBufEmote, sizeof(aBufEmote), "emote pain %d", g_Config.m_ClEyeDuration); - break; - case EMOTE_HAPPY: - str_format(aBufEmote, sizeof(aBufEmote), "emote happy %d", g_Config.m_ClEyeDuration); - break; - case EMOTE_SURPRISE: - str_format(aBufEmote, sizeof(aBufEmote), "emote surprise %d", g_Config.m_ClEyeDuration); - break; - case EMOTE_ANGRY: - str_format(aBufEmote, sizeof(aBufEmote), "emote angry %d", g_Config.m_ClEyeDuration); - break; - case EMOTE_BLINK: - str_format(aBufEmote, sizeof(aBufEmote), "emote blink %d", g_Config.m_ClEyeDuration); - break; - } - if(aBufEmote[0]) - { - str_format(aBuf, sizeof(aBuf), ";%s", aBufEmote); - str_append(aBufMsg, aBuf); - } - } - if(IsSixup()) - { - protocol7::CNetMsg_Cl_Say Msg7; - Msg7.m_Mode = protocol7::CHAT_ALL; - Msg7.m_Target = -1; - Msg7.m_pMessage = aBufMsg; - SendPackMsg(Conn, &Msg7, MSGFLAG_VITAL, true); - } - else - { - CNetMsg_Cl_Say MsgP; - MsgP.m_Team = 0; - MsgP.m_pMessage = aBufMsg; - CMsgPacker PackerTimeout(&MsgP); - MsgP.Pack(&PackerTimeout); - SendMsg(Conn, &PackerTimeout, MSGFLAG_VITAL); - } - } - m_aCodeRunAfterJoin[Conn] = true; - } - - // ack snapshot - m_aAckGameTick[Conn] = GameTick; - } - } - } - else if(Conn == CONN_MAIN && Msg == NETMSG_RCONTYPE) - { - bool UsernameReq = Unpacker.GetInt() & 1; - if(!Unpacker.Error()) - { - GameClient()->OnRconType(UsernameReq); - } - } - else if(Conn == CONN_MAIN && (pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_RCON_CMD_GROUP_START) - { - int ExpectedRconCommands = Unpacker.GetInt(); - if(Unpacker.Error()) - return; - - m_ExpectedRconCommands = ExpectedRconCommands; - m_GotRconCommands = 0; - } - else if(Conn == CONN_MAIN && (pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_RCON_CMD_GROUP_END) - { - m_ExpectedRconCommands = -1; - } - } - else if((pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0) - { - // game message - if(!Dummy) - { - for(auto &DemoRecorder : m_aDemoRecorder) - if(DemoRecorder.IsRecording()) - DemoRecorder.RecordMessage(pPacket->m_pData, pPacket->m_DataSize); - } - - GameClient()->OnMessage(Msg, &Unpacker, Conn, Dummy); - } -} - -int CClient::UnpackAndValidateSnapshot(CSnapshot *pFrom, CSnapshot *pTo) -{ - CUnpacker Unpacker; - CSnapshotBuilder Builder; - Builder.Init(); - CNetObjHandler *pNetObjHandler = GameClient()->GetNetObjHandler(); - - int Num = pFrom->NumItems(); - for(int Index = 0; Index < Num; Index++) - { - const CSnapshotItem *pFromItem = pFrom->GetItem(Index); - const int FromItemSize = pFrom->GetItemSize(Index); - const int ItemType = pFrom->GetItemType(Index); - const void *pData = pFromItem->Data(); - Unpacker.Reset(pData, FromItemSize); - - void *pRawObj = pNetObjHandler->SecureUnpackObj(ItemType, &Unpacker); - if(!pRawObj) - { - if(g_Config.m_Debug && ItemType != UUID_UNKNOWN) - { - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "dropped weird object '%s' (%d), failed on '%s'", pNetObjHandler->GetObjName(ItemType), ItemType, pNetObjHandler->FailedObjOn()); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client", aBuf); - } - continue; - } - const int ItemSize = pNetObjHandler->GetUnpackedObjSize(ItemType); - - void *pObj = Builder.NewItem(pFromItem->Type(), pFromItem->Id(), ItemSize); - if(!pObj) - return -4; - - mem_copy(pObj, pRawObj, ItemSize); - } - - return Builder.Finish(pTo); -} - -void CClient::ResetMapDownload(bool ResetActive) -{ - if(m_pMapdownloadTask) - { - m_pMapdownloadTask->Abort(); - m_pMapdownloadTask = nullptr; - } - - if(m_MapdownloadFileTemp) - { - io_close(m_MapdownloadFileTemp); - m_MapdownloadFileTemp = 0; - } - - if(Storage()->FileExists(m_aMapdownloadFilenameTemp, IStorage::TYPE_SAVE)) - { - Storage()->RemoveFile(m_aMapdownloadFilenameTemp, IStorage::TYPE_SAVE); - } - - if(ResetActive) - { - m_MapdownloadChunk = 0; - m_MapdownloadSha256Present = false; - m_MapdownloadSha256 = SHA256_ZEROED; - m_MapdownloadCrc = 0; - m_MapdownloadTotalsize = -1; - m_MapdownloadAmount = 0; - m_aMapdownloadFilename[0] = '\0'; - m_aMapdownloadFilenameTemp[0] = '\0'; - m_aMapdownloadName[0] = '\0'; - } -} - -void CClient::FinishMapDownload() -{ - m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client/network", "download complete, loading map"); - - SHA256_DIGEST *pSha256 = m_MapdownloadSha256Present ? &m_MapdownloadSha256 : nullptr; - - bool FileSuccess = true; - if(Storage()->FileExists(m_aMapdownloadFilename, IStorage::TYPE_SAVE)) - FileSuccess &= Storage()->RemoveFile(m_aMapdownloadFilename, IStorage::TYPE_SAVE); - FileSuccess &= Storage()->RenameFile(m_aMapdownloadFilenameTemp, m_aMapdownloadFilename, IStorage::TYPE_SAVE); - if(!FileSuccess) - { - char aError[128 + IO_MAX_PATH_LENGTH]; - str_format(aError, sizeof(aError), Localize("Could not save downloaded map. Try manually deleting this file: %s"), m_aMapdownloadFilename); - DisconnectWithReason(aError); - return; - } - - const char *pError = LoadMap(m_aMapdownloadName, m_aMapdownloadFilename, pSha256, m_MapdownloadCrc); - if(!pError) - { - ResetMapDownload(true); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client/network", "loading done"); - SendReady(CONN_MAIN); - } - else if(m_pMapdownloadTask) // fallback - { - ResetMapDownload(false); - SendMapRequest(); - } - else - { - DisconnectWithReason(pError); - } -} - -void CClient::ResetDDNetInfoTask() -{ - if(m_pDDNetInfoTask) - { - m_pDDNetInfoTask->Abort(); - m_pDDNetInfoTask = NULL; - } -} - -void CClient::FinishDDNetInfo() -{ - if(m_ServerBrowser.DDNetInfoSha256() == m_pDDNetInfoTask->ResultSha256()) - { - log_debug("client/info", "DDNet info already up-to-date"); - return; - } - - char aTempFilename[IO_MAX_PATH_LENGTH]; - IStorage::FormatTmpPath(aTempFilename, sizeof(aTempFilename), DDNET_INFO_FILE); - IOHANDLE File = Storage()->OpenFile(aTempFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE); - if(!File) - { - log_error("client/info", "Failed to open temporary DDNet info '%s' for writing", aTempFilename); - return; - } - - unsigned char *pResult; - size_t ResultLength; - m_pDDNetInfoTask->Result(&pResult, &ResultLength); - bool Error = io_write(File, pResult, ResultLength) != ResultLength; - Error |= io_close(File) != 0; - if(Error) - { - log_error("client/info", "Error writing temporary DDNet info to file '%s'", aTempFilename); - return; - } - - if(Storage()->FileExists(DDNET_INFO_FILE, IStorage::TYPE_SAVE) && !Storage()->RemoveFile(DDNET_INFO_FILE, IStorage::TYPE_SAVE)) - { - log_error("client/info", "Failed to remove old DDNet info '%s'", DDNET_INFO_FILE); - Storage()->RemoveFile(aTempFilename, IStorage::TYPE_SAVE); - return; - } - if(!Storage()->RenameFile(aTempFilename, DDNET_INFO_FILE, IStorage::TYPE_SAVE)) - { - log_error("client/info", "Failed to rename temporary DDNet info '%s' to '%s'", aTempFilename, DDNET_INFO_FILE); - Storage()->RemoveFile(aTempFilename, IStorage::TYPE_SAVE); - return; - } - - log_debug("client/info", "Loading new DDNet info"); - LoadDDNetInfo(); -} - -typedef std::tuple TVersion; -static const TVersion gs_InvalidVersion = std::make_tuple(-1, -1, -1); - -TVersion ToVersion(char *pStr) -{ - int aVersion[3] = {0, 0, 0}; - const char *p = strtok(pStr, "."); - - for(int i = 0; i < 3 && p; ++i) - { - if(!str_isallnum(p)) - return gs_InvalidVersion; - - aVersion[i] = str_toint(p); - p = strtok(NULL, "."); - } - - if(p) - return gs_InvalidVersion; - - return std::make_tuple(aVersion[0], aVersion[1], aVersion[2]); -} - -void CClient::LoadDDNetInfo() -{ - const json_value *pDDNetInfo = m_ServerBrowser.LoadDDNetInfo(); - - if(!pDDNetInfo) - return; - - const json_value &DDNetInfo = *pDDNetInfo; - const json_value &CurrentVersion = DDNetInfo["version"]; - if(CurrentVersion.type == json_string) - { - char aNewVersionStr[64]; - str_copy(aNewVersionStr, CurrentVersion); - char aCurVersionStr[64]; - str_copy(aCurVersionStr, GAME_RELEASE_VERSION); - if(ToVersion(aNewVersionStr) > ToVersion(aCurVersionStr)) - { - str_copy(m_aVersionStr, CurrentVersion); - } - else - { - m_aVersionStr[0] = '0'; - m_aVersionStr[1] = '\0'; - } - } - - const json_value &News = DDNetInfo["news"]; - if(News.type == json_string) - { - // Only mark news button if something new was added to the news - if(m_aNews[0] && str_find(m_aNews, News) == nullptr) - g_Config.m_UiUnreadNews = true; - - str_copy(m_aNews, News); - } - - const json_value &MapDownloadUrl = DDNetInfo["map-download-url"]; - if(MapDownloadUrl.type == json_string) - { - str_copy(m_aMapDownloadUrl, MapDownloadUrl); - } - - const json_value &Points = DDNetInfo["points"]; - if(Points.type == json_integer) - { - m_Points = Points.u.integer; - } - - const json_value &StunServersIpv6 = DDNetInfo["stun-servers-ipv6"]; - if(StunServersIpv6.type == json_array && StunServersIpv6[0].type == json_string) - { - NETADDR Addr; - if(!net_addr_from_str(&Addr, StunServersIpv6[0])) - { - m_aNetClient[CONN_MAIN].FeedStunServer(Addr); - } - } - const json_value &StunServersIpv4 = DDNetInfo["stun-servers-ipv4"]; - if(StunServersIpv4.type == json_array && StunServersIpv4[0].type == json_string) - { - NETADDR Addr; - if(!net_addr_from_str(&Addr, StunServersIpv4[0])) - { - m_aNetClient[CONN_MAIN].FeedStunServer(Addr); - } - } - const json_value &ConnectingIp = DDNetInfo["connecting-ip"]; - if(ConnectingIp.type == json_string) - { - NETADDR Addr; - if(!net_addr_from_str(&Addr, ConnectingIp)) - { - m_HaveGlobalTcpAddr = true; - m_GlobalTcpAddr = Addr; - log_debug("info", "got global tcp ip address: %s", (const char *)ConnectingIp); - } - } - const json_value &WarnPngliteIncompatibleImages = DDNetInfo["warn-pnglite-incompatible-images"]; - Graphics()->WarnPngliteIncompatibleImages(WarnPngliteIncompatibleImages.type == json_boolean && (bool)WarnPngliteIncompatibleImages); -} - -int CClient::ConnectNetTypes() const -{ - const NETADDR *pConnectAddrs; - int NumConnectAddrs; - m_aNetClient[CONN_MAIN].ConnectAddresses(&pConnectAddrs, &NumConnectAddrs); - int NetType = 0; - for(int i = 0; i < NumConnectAddrs; i++) - { - NetType |= pConnectAddrs[i].type; - } - return NetType; -} - -void CClient::PumpNetwork() -{ - for(auto &NetClient : m_aNetClient) - { - NetClient.Update(); - } - - if(State() != IClient::STATE_DEMOPLAYBACK) - { - // check for errors of main and dummy - if(State() != IClient::STATE_OFFLINE && State() < IClient::STATE_QUITTING) - { - if(m_aNetClient[CONN_MAIN].State() == NETSTATE_OFFLINE) - { - // This will also disconnect the dummy, so the branch below is an `else if` - Disconnect(); - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "offline error='%s'", m_aNetClient[CONN_MAIN].ErrorString()); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", aBuf, gs_ClientNetworkErrPrintColor); - } - else if((DummyConnecting() || DummyConnected()) && m_aNetClient[CONN_DUMMY].State() == NETSTATE_OFFLINE) - { - const bool WasConnecting = DummyConnecting(); - DummyDisconnect(nullptr); - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "offline dummy error='%s'", m_aNetClient[CONN_DUMMY].ErrorString()); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", aBuf, gs_ClientNetworkErrPrintColor); - if(WasConnecting) - { - str_format(aBuf, sizeof(aBuf), "%s: %s", Localize("Could not connect dummy"), m_aNetClient[CONN_DUMMY].ErrorString()); - GameClient()->Echo(aBuf); - } - } - } - - // check if main was connected - if(State() == IClient::STATE_CONNECTING && m_aNetClient[CONN_MAIN].State() == NETSTATE_ONLINE) - { - // we switched to online - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", "connected, sending info", gs_ClientNetworkPrintColor); - SetState(IClient::STATE_LOADING); - SetLoadingStateDetail(IClient::LOADING_STATE_DETAIL_INITIAL); - SendInfo(CONN_MAIN); - } - } - - // process packets - CNetChunk Packet; - SECURITY_TOKEN ResponseToken; - for(int Conn = 0; Conn < NUM_CONNS; Conn++) - { - while(m_aNetClient[Conn].Recv(&Packet, &ResponseToken, IsSixup())) - { - if(Packet.m_ClientId == -1) - { - ProcessConnlessPacket(&Packet); - continue; - } - if(Conn == CONN_MAIN || Conn == CONN_DUMMY) - { - ProcessServerPacket(&Packet, Conn, g_Config.m_ClDummy ^ Conn); - } - } - } -} - -void CClient::OnDemoPlayerSnapshot(void *pData, int Size) -{ - // update ticks, they could have changed - const CDemoPlayer::CPlaybackInfo *pInfo = m_DemoPlayer.Info(); - m_aCurGameTick[0] = pInfo->m_Info.m_CurrentTick; - m_aPrevGameTick[0] = pInfo->m_PreviousTick; - - // create a verified and unpacked snapshot - unsigned char aAltSnapBuffer[CSnapshot::MAX_SIZE]; - CSnapshot *pAltSnapBuffer = (CSnapshot *)aAltSnapBuffer; - int AltSnapSize; - - if(IsSixup()) - { - AltSnapSize = GameClient()->TranslateSnap(pAltSnapBuffer, (CSnapshot *)pData, CONN_MAIN, false); - if(AltSnapSize < 0) - { - dbg_msg("sixup", "failed to translate snapshot. error=%d", AltSnapSize); - return; - } - } - else - { - AltSnapSize = UnpackAndValidateSnapshot((CSnapshot *)pData, pAltSnapBuffer); - if(AltSnapSize < 0) - { - dbg_msg("client", "unpack snapshot and validate failed. error=%d", AltSnapSize); - return; - } - } - - // handle snapshots after validation - std::swap(m_aapSnapshots[0][SNAP_PREV], m_aapSnapshots[0][SNAP_CURRENT]); - mem_copy(m_aapSnapshots[0][SNAP_CURRENT]->m_pSnap, pData, Size); - mem_copy(m_aapSnapshots[0][SNAP_CURRENT]->m_pAltSnap, pAltSnapBuffer, AltSnapSize); - - GameClient()->OnNewSnapshot(); -} - -void CClient::OnDemoPlayerMessage(void *pData, int Size) -{ - CUnpacker Unpacker; - Unpacker.Reset(pData, Size); - CMsgPacker Packer(NETMSG_EX, true); - - // unpack msgid and system flag - int Msg; - bool Sys; - CUuid Uuid; - - int Result = UnpackMessageId(&Msg, &Sys, &Uuid, &Unpacker, &Packer); - if(Result == UNPACKMESSAGE_ERROR) - { - return; - } - - if(!Sys) - GameClient()->OnMessage(Msg, &Unpacker, CONN_MAIN, false); -} - -void CClient::UpdateDemoIntraTimers() -{ - // update timers - const CDemoPlayer::CPlaybackInfo *pInfo = m_DemoPlayer.Info(); - m_aCurGameTick[0] = pInfo->m_Info.m_CurrentTick; - m_aPrevGameTick[0] = pInfo->m_PreviousTick; - m_aGameIntraTick[0] = pInfo->m_IntraTick; - m_aGameTickTime[0] = pInfo->m_TickTime; - m_aGameIntraTickSincePrev[0] = pInfo->m_IntraTickSincePrev; -}; - -void CClient::Update() -{ - PumpNetwork(); - - if(State() == IClient::STATE_DEMOPLAYBACK) - { - if(m_DemoPlayer.IsPlaying()) - { -#if defined(CONF_VIDEORECORDER) - if(IVideo::Current()) - { - IVideo::Current()->NextVideoFrame(); - IVideo::Current()->NextAudioFrameTimeline([this](short *pFinalOut, unsigned Frames) { - Sound()->Mix(pFinalOut, Frames); - }); - } -#endif - - m_DemoPlayer.Update(); - - // update timers - const CDemoPlayer::CPlaybackInfo *pInfo = m_DemoPlayer.Info(); - m_aCurGameTick[0] = pInfo->m_Info.m_CurrentTick; - m_aPrevGameTick[0] = pInfo->m_PreviousTick; - m_aGameIntraTick[0] = pInfo->m_IntraTick; - m_aGameTickTime[0] = pInfo->m_TickTime; - } - else - { - // Disconnect when demo playback stopped, either due to playback error - // or because the end of the demo was reached when rendering it. - DisconnectWithReason(m_DemoPlayer.ErrorMessage()); - if(m_DemoPlayer.ErrorMessage()[0] != '\0') - { - SWarning Warning(Localize("Error playing demo"), m_DemoPlayer.ErrorMessage()); - Warning.m_AutoHide = false; - AddWarning(Warning); - } - } - } - else if(State() == IClient::STATE_ONLINE) - { - if(m_LastDummy != (bool)g_Config.m_ClDummy) - { - // Invalidate references to !m_ClDummy snapshots - GameClient()->InvalidateSnapshot(); - GameClient()->OnDummySwap(); - } - - if(m_aapSnapshots[!g_Config.m_ClDummy][SNAP_CURRENT]) - { - // switch dummy snapshot - int64_t Now = m_aGameTime[!g_Config.m_ClDummy].Get(time_get()); - while(true) - { - if(!m_aapSnapshots[!g_Config.m_ClDummy][SNAP_CURRENT]->m_pNext) - break; - int64_t TickStart = m_aapSnapshots[!g_Config.m_ClDummy][SNAP_CURRENT]->m_Tick * time_freq() / GameTickSpeed(); - if(TickStart >= Now) - break; - - m_aapSnapshots[!g_Config.m_ClDummy][SNAP_PREV] = m_aapSnapshots[!g_Config.m_ClDummy][SNAP_CURRENT]; - m_aapSnapshots[!g_Config.m_ClDummy][SNAP_CURRENT] = m_aapSnapshots[!g_Config.m_ClDummy][SNAP_CURRENT]->m_pNext; - - // set ticks - m_aCurGameTick[!g_Config.m_ClDummy] = m_aapSnapshots[!g_Config.m_ClDummy][SNAP_CURRENT]->m_Tick; - m_aPrevGameTick[!g_Config.m_ClDummy] = m_aapSnapshots[!g_Config.m_ClDummy][SNAP_PREV]->m_Tick; - } - } - - if(m_aapSnapshots[g_Config.m_ClDummy][SNAP_CURRENT]) - { - // switch snapshot - bool Repredict = false; - int64_t Now = m_aGameTime[g_Config.m_ClDummy].Get(time_get()); - int64_t PredNow = m_PredictedTime.Get(time_get()); - - if(m_LastDummy != (bool)g_Config.m_ClDummy && m_aapSnapshots[g_Config.m_ClDummy][SNAP_PREV]) - { - // Load snapshot for m_ClDummy - GameClient()->OnNewSnapshot(); - Repredict = true; - } - - while(true) - { - if(!m_aapSnapshots[g_Config.m_ClDummy][SNAP_CURRENT]->m_pNext) - break; - int64_t TickStart = m_aapSnapshots[g_Config.m_ClDummy][SNAP_CURRENT]->m_Tick * time_freq() / GameTickSpeed(); - if(TickStart >= Now) - break; - - m_aapSnapshots[g_Config.m_ClDummy][SNAP_PREV] = m_aapSnapshots[g_Config.m_ClDummy][SNAP_CURRENT]; - m_aapSnapshots[g_Config.m_ClDummy][SNAP_CURRENT] = m_aapSnapshots[g_Config.m_ClDummy][SNAP_CURRENT]->m_pNext; - - // set ticks - m_aCurGameTick[g_Config.m_ClDummy] = m_aapSnapshots[g_Config.m_ClDummy][SNAP_CURRENT]->m_Tick; - m_aPrevGameTick[g_Config.m_ClDummy] = m_aapSnapshots[g_Config.m_ClDummy][SNAP_PREV]->m_Tick; - - GameClient()->OnNewSnapshot(); - Repredict = true; - } - - if(m_aapSnapshots[g_Config.m_ClDummy][SNAP_PREV]) - { - int64_t CurTickStart = m_aapSnapshots[g_Config.m_ClDummy][SNAP_CURRENT]->m_Tick * time_freq() / GameTickSpeed(); - int64_t PrevTickStart = m_aapSnapshots[g_Config.m_ClDummy][SNAP_PREV]->m_Tick * time_freq() / GameTickSpeed(); - int PrevPredTick = (int)(PredNow * GameTickSpeed() / time_freq()); - int NewPredTick = PrevPredTick + 1; - - m_aGameIntraTick[g_Config.m_ClDummy] = (Now - PrevTickStart) / (float)(CurTickStart - PrevTickStart); - m_aGameTickTime[g_Config.m_ClDummy] = (Now - PrevTickStart) / (float)time_freq(); - m_aGameIntraTickSincePrev[g_Config.m_ClDummy] = (Now - PrevTickStart) / (float)(time_freq() / GameTickSpeed()); - - int64_t CurPredTickStart = NewPredTick * time_freq() / GameTickSpeed(); - int64_t PrevPredTickStart = PrevPredTick * time_freq() / GameTickSpeed(); - m_aPredIntraTick[g_Config.m_ClDummy] = (PredNow - PrevPredTickStart) / (float)(CurPredTickStart - PrevPredTickStart); - - if(absolute(NewPredTick - m_aapSnapshots[g_Config.m_ClDummy][SNAP_PREV]->m_Tick) > MaxLatencyTicks()) - { - m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client", "prediction time reset!"); - m_PredictedTime.Init(CurTickStart + 2 * time_freq() / GameTickSpeed()); - } - - if(NewPredTick > m_aPredTick[g_Config.m_ClDummy]) - { - m_aPredTick[g_Config.m_ClDummy] = NewPredTick; - Repredict = true; - - // send input - SendInput(); - } - } - - // only do sane predictions - if(Repredict) - { - if(m_aPredTick[g_Config.m_ClDummy] > m_aCurGameTick[g_Config.m_ClDummy] && m_aPredTick[g_Config.m_ClDummy] < m_aCurGameTick[g_Config.m_ClDummy] + MaxLatencyTicks()) - GameClient()->OnPredict(); - } - - // fetch server info if we don't have it - if(m_CurrentServerInfoRequestTime >= 0 && - time_get() > m_CurrentServerInfoRequestTime) - { - m_ServerBrowser.RequestCurrentServer(ServerAddress()); - m_CurrentServerInfoRequestTime = time_get() + time_freq() * 2; - } - - // periodically ping server - if(m_CurrentServerNextPingTime >= 0 && - time_get() > m_CurrentServerNextPingTime) - { - int64_t NowPing = time_get(); - int64_t Freq = time_freq(); - - char aBuf[64]; - str_format(aBuf, sizeof(aBuf), "pinging current server%s", !m_ServerCapabilities.m_PingEx ? ", using fallback via server info" : ""); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client", aBuf); - - m_CurrentServerPingUuid = RandomUuid(); - if(!m_ServerCapabilities.m_PingEx) - { - m_ServerBrowser.RequestCurrentServerWithRandomToken(ServerAddress(), &m_CurrentServerPingBasicToken, &m_CurrentServerPingToken); - } - else - { - CMsgPacker Msg(NETMSG_PINGEX, true); - Msg.AddRaw(&m_CurrentServerPingUuid, sizeof(m_CurrentServerPingUuid)); - SendMsg(CONN_MAIN, &Msg, MSGFLAG_FLUSH); - } - m_CurrentServerCurrentPingTime = NowPing; - m_CurrentServerNextPingTime = NowPing + 600 * Freq; // ping every 10 minutes - } - } - - if(m_DummyDeactivateOnReconnect && g_Config.m_ClDummy == 1) - { - m_DummyDeactivateOnReconnect = false; - g_Config.m_ClDummy = 0; - } - else if(!m_DummyConnected && m_DummyDeactivateOnReconnect) - { - m_DummyDeactivateOnReconnect = false; - } - - m_LastDummy = (bool)g_Config.m_ClDummy; - } - - // STRESS TEST: join the server again -#ifdef CONF_DEBUG - if(g_Config.m_DbgStress) - { - static int64_t s_ActionTaken = 0; - int64_t Now = time_get(); - if(State() == IClient::STATE_OFFLINE) - { - if(Now > s_ActionTaken + time_freq() * 2) - { - m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "stress", "reconnecting!"); - Connect(g_Config.m_DbgStressServer); - s_ActionTaken = Now; - } - } - else - { - if(Now > s_ActionTaken + time_freq() * (10 + g_Config.m_DbgStress)) - { - m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "stress", "disconnecting!"); - Disconnect(); - s_ActionTaken = Now; - } - } - } -#endif - - if(m_pMapdownloadTask) - { - if(m_pMapdownloadTask->State() == EHttpState::DONE) - FinishMapDownload(); - else if(m_pMapdownloadTask->State() == EHttpState::ERROR || m_pMapdownloadTask->State() == EHttpState::ABORTED) - { - dbg_msg("webdl", "http failed, falling back to gameserver"); - ResetMapDownload(false); - SendMapRequest(); - } - } - - if(m_pDDNetInfoTask) - { - if(m_pDDNetInfoTask->State() == EHttpState::DONE) - { - FinishDDNetInfo(); - ResetDDNetInfoTask(); - } - else if(m_pDDNetInfoTask->State() == EHttpState::ERROR || m_pDDNetInfoTask->State() == EHttpState::ABORTED) - { - ResetDDNetInfoTask(); - } - } - - if(State() == IClient::STATE_ONLINE) - { - if(!m_EditJobs.empty()) - { - std::shared_ptr pJob = m_EditJobs.front(); - if(pJob->State() == IJob::STATE_DONE) - { - char aBuf[IO_MAX_PATH_LENGTH + 64]; - if(pJob->Success()) - { - str_format(aBuf, sizeof(aBuf), "Successfully saved the replay to '%s'!", pJob->Destination()); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "replay", aBuf); - - GameClient()->Echo(Localize("Successfully saved the replay!")); - } - else - { - str_format(aBuf, sizeof(aBuf), "Failed saving the replay to '%s'...", pJob->Destination()); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "replay", aBuf); - - GameClient()->Echo(Localize("Failed saving the replay!")); - } - m_EditJobs.pop_front(); - } - } - } - - // update the server browser - m_ServerBrowser.Update(); - - // update editor/gameclient - if(m_EditorActive) - m_pEditor->OnUpdate(); - else - GameClient()->OnUpdate(); - - Discord()->Update(); - Steam()->Update(); - if(Steam()->GetConnectAddress()) - { - HandleConnectAddress(Steam()->GetConnectAddress()); - Steam()->ClearConnectAddress(); - } - - if(m_ReconnectTime > 0 && time_get() > m_ReconnectTime) - { - if(State() != STATE_ONLINE) - Connect(m_aConnectAddressStr); - m_ReconnectTime = 0; - } - - m_PredictedTime.UpdateMargin(PredictionMargin() * time_freq() / 1000); -} - -void CClient::RegisterInterfaces() -{ - Kernel()->RegisterInterface(static_cast(&m_aDemoRecorder[RECORDER_MANUAL]), false); - Kernel()->RegisterInterface(static_cast(&m_DemoPlayer), false); - Kernel()->RegisterInterface(static_cast(&m_GhostRecorder), false); - Kernel()->RegisterInterface(static_cast(&m_GhostLoader), false); - Kernel()->RegisterInterface(static_cast(&m_ServerBrowser), false); -#if defined(CONF_AUTOUPDATE) - Kernel()->RegisterInterface(static_cast(&m_Updater), false); -#endif - Kernel()->RegisterInterface(static_cast(&m_Friends), false); - Kernel()->ReregisterInterface(static_cast(&m_Foes)); - Kernel()->RegisterInterface(static_cast(&m_Http), false); -} - -void CClient::InitInterfaces() -{ - // fetch interfaces - m_pEngine = Kernel()->RequestInterface(); - m_pEditor = Kernel()->RequestInterface(); - m_pFavorites = Kernel()->RequestInterface(); - m_pSound = Kernel()->RequestInterface(); - m_pGameClient = Kernel()->RequestInterface(); - m_pInput = Kernel()->RequestInterface(); - m_pMap = Kernel()->RequestInterface(); - m_pConfigManager = Kernel()->RequestInterface(); - m_pConfig = m_pConfigManager->Values(); -#if defined(CONF_AUTOUPDATE) - m_pUpdater = Kernel()->RequestInterface(); -#endif - m_pDiscord = Kernel()->RequestInterface(); - m_pSteam = Kernel()->RequestInterface(); - m_pNotifications = Kernel()->RequestInterface(); - m_pStorage = Kernel()->RequestInterface(); - - m_DemoEditor.Init(&m_SnapshotDelta, m_pConsole, m_pStorage); - - m_ServerBrowser.SetBaseInfo(&m_aNetClient[CONN_CONTACT], m_pGameClient->NetVersion()); - -#if defined(CONF_AUTOUPDATE) - m_Updater.Init(&m_Http); -#endif - - m_pConfigManager->RegisterCallback(IFavorites::ConfigSaveCallback, m_pFavorites); - m_Friends.Init(); - m_Foes.Init(true); - - m_GhostRecorder.Init(); - m_GhostLoader.Init(); -} - -void CClient::Run() -{ - m_LocalStartTime = m_GlobalStartTime = time_get(); -#if defined(CONF_VIDEORECORDER) - IVideo::SetLocalStartTime(m_LocalStartTime); -#endif - m_aSnapshotParts[0] = 0; - m_aSnapshotParts[1] = 0; - - if(m_GenerateTimeoutSeed) - { - GenerateTimeoutSeed(); - } - - unsigned int Seed; - secure_random_fill(&Seed, sizeof(Seed)); - srand(Seed); - - if(g_Config.m_Debug) - { - g_UuidManager.DebugDump(); - } - -#ifndef CONF_WEBASM - char aNetworkError[256]; - if(!InitNetworkClient(aNetworkError, sizeof(aNetworkError))) - { - log_error("client", "%s", aNetworkError); - ShowMessageBox("Network Error", aNetworkError); - return; - } -#endif - - if(!m_Http.Init(std::chrono::seconds{1})) - { - const char *pErrorMessage = "Failed to initialize the HTTP client."; - log_error("client", "%s", pErrorMessage); - ShowMessageBox("HTTP Error", pErrorMessage); - return; - } - - // init graphics - m_pGraphics = CreateEngineGraphicsThreaded(); - Kernel()->RegisterInterface(m_pGraphics); // IEngineGraphics - Kernel()->RegisterInterface(static_cast(m_pGraphics), false); - if(m_pGraphics->Init() != 0) - { - log_error("client", "couldn't init graphics"); - ShowMessageBox("Graphics Error", "The graphics could not be initialized."); - return; - } - - // make sure the first frame just clears everything to prevent undesired colors when waiting for io - Graphics()->Clear(0, 0, 0); - Graphics()->Swap(); - - // init localization first, making sure all errors during init can be localized - GameClient()->InitializeLanguage(); - - // init sound, allowed to fail - const bool SoundInitFailed = Sound()->Init() != 0; - -#if defined(CONF_VIDEORECORDER) - // init video recorder aka ffmpeg - CVideo::Init(); -#endif - - // init text render - m_pTextRender = Kernel()->RequestInterface(); - m_pTextRender->Init(); - - // init the input - Input()->Init(); - - // init the editor - m_pEditor->Init(); - - m_ServerBrowser.OnInit(); - // loads the existing ddnet info file if it exists - LoadDDNetInfo(); - - LoadDebugFont(); - - if(Steam()->GetPlayerName()) - { - str_copy(g_Config.m_SteamName, Steam()->GetPlayerName()); - } - - Graphics()->AddWindowResizeListener([this] { OnWindowResize(); }); - - GameClient()->OnInit(); - - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", "version " GAME_RELEASE_VERSION " on " CONF_PLATFORM_STRING " " CONF_ARCH_STRING, ColorRGBA(0.7f, 0.7f, 1.0f, 1.0f)); - if(GIT_SHORTREV_HASH) - { - char aBuf[64]; - str_format(aBuf, sizeof(aBuf), "git revision hash: %s", GIT_SHORTREV_HASH); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", aBuf, ColorRGBA(0.7f, 0.7f, 1.0f, 1.0f)); - } - - // - m_FpsGraph.Init(0.0f, 120.0f); - - // never start with the editor - g_Config.m_ClEditor = 0; - - // process pending commands - m_pConsole->StoreCommands(false); - - m_Fifo.Init(m_pConsole, g_Config.m_ClInputFifo, CFGFLAG_CLIENT); - - InitChecksum(); - m_pConsole->InitChecksum(ChecksumData()); - - // request the new ddnet info from server if already past the welcome dialog - if(g_Config.m_ClShowWelcome) - g_Config.m_ClShowWelcome = 0; - else - RequestDDNetInfo(); - - if(SoundInitFailed) - { - SWarning Warning(Localize("Sound error"), Localize("The audio device couldn't be initialised.")); - Warning.m_AutoHide = false; - AddWarning(Warning); - } - - bool LastD = false; - bool LastE = false; - bool LastG = false; - - auto LastTime = time_get_nanoseconds(); - int64_t LastRenderTime = time_get(); - - while(true) - { - set_new_tick(); - - // handle pending connects - if(m_aCmdConnect[0]) - { - str_copy(g_Config.m_UiServerAddress, m_aCmdConnect); - Connect(m_aCmdConnect); - m_aCmdConnect[0] = 0; - } - - // handle pending demo play - if(m_aCmdPlayDemo[0]) - { - const char *pError = DemoPlayer_Play(m_aCmdPlayDemo, IStorage::TYPE_ALL_OR_ABSOLUTE); - if(pError) - log_error("demo_player", "playing passed demo file '%s' failed: %s", m_aCmdPlayDemo, pError); - m_aCmdPlayDemo[0] = 0; - } - - // handle pending map edits - if(m_aCmdEditMap[0]) - { - int Result = m_pEditor->HandleMapDrop(m_aCmdEditMap, IStorage::TYPE_ALL_OR_ABSOLUTE); - if(Result) - g_Config.m_ClEditor = true; - else - log_error("editor", "editing passed map file '%s' failed", m_aCmdEditMap); - m_aCmdEditMap[0] = 0; - } - - // progress on dummy connect when the connection is online - if(m_DummySendConnInfo && m_aNetClient[CONN_DUMMY].State() == NETSTATE_ONLINE) - { - m_DummySendConnInfo = false; - SendInfo(CONN_DUMMY); - m_aNetClient[CONN_DUMMY].Update(); - SendReady(CONN_DUMMY); - GameClient()->SendDummyInfo(true); - SendEnterGame(CONN_DUMMY); - } - - // update input - if(Input()->Update()) - { - if(State() == IClient::STATE_QUITTING) - break; - else - SetState(IClient::STATE_QUITTING); // SDL_QUIT - } - - char aFile[IO_MAX_PATH_LENGTH]; - if(Input()->GetDropFile(aFile, sizeof(aFile))) - { - if(str_startswith(aFile, CONNECTLINK_NO_SLASH)) - HandleConnectLink(aFile); - else if(str_endswith(aFile, ".demo")) - HandleDemoPath(aFile); - else if(str_endswith(aFile, ".map")) - HandleMapPath(aFile); - } - -#if defined(CONF_AUTOUPDATE) - Updater()->Update(); -#endif - - // update sound - Sound()->Update(); - - if(CtrlShiftKey(KEY_D, LastD)) - g_Config.m_Debug ^= 1; - - if(CtrlShiftKey(KEY_G, LastG)) - g_Config.m_DbgGraphs ^= 1; - - if(CtrlShiftKey(KEY_E, LastE)) - { - if(g_Config.m_ClEditor) - m_pEditor->OnClose(); - g_Config.m_ClEditor = g_Config.m_ClEditor ^ 1; - } - - // render - { - if(g_Config.m_ClEditor) - { - if(!m_EditorActive) - { - Input()->MouseModeRelative(); - GameClient()->OnActivateEditor(); - m_pEditor->OnActivate(); - m_EditorActive = true; - } - } - else if(m_EditorActive) - { - m_EditorActive = false; - } - - Update(); - int64_t Now = time_get(); - - bool IsRenderActive = (g_Config.m_GfxBackgroundRender || m_pGraphics->WindowOpen()); - - bool AsyncRenderOld = g_Config.m_GfxAsyncRenderOld; - - int GfxRefreshRate = g_Config.m_GfxRefreshRate; - -#if defined(CONF_VIDEORECORDER) - // keep rendering synced - if(IVideo::Current()) - { - AsyncRenderOld = false; - GfxRefreshRate = 0; - } -#endif - - if(IsRenderActive && - (!AsyncRenderOld || m_pGraphics->IsIdle()) && - (!GfxRefreshRate || (time_freq() / (int64_t)g_Config.m_GfxRefreshRate) <= Now - LastRenderTime)) - { - // update frametime - m_RenderFrameTime = (Now - m_LastRenderTime) / (float)time_freq(); - m_FpsGraph.Add(1.0f / m_RenderFrameTime); - - if(m_BenchmarkFile) - { - char aBuf[64]; - str_format(aBuf, sizeof(aBuf), "Frametime %d us\n", (int)(m_RenderFrameTime * 1000000)); - io_write(m_BenchmarkFile, aBuf, str_length(aBuf)); - if(time_get() > m_BenchmarkStopTime) - { - io_close(m_BenchmarkFile); - m_BenchmarkFile = 0; - Quit(); - } - } - - m_FrameTimeAvg = m_FrameTimeAvg * 0.9f + m_RenderFrameTime * 0.1f; - - // keep the overflow time - it's used to make sure the gfx refreshrate is reached - int64_t AdditionalTime = g_Config.m_GfxRefreshRate ? ((Now - LastRenderTime) - (time_freq() / (int64_t)g_Config.m_GfxRefreshRate)) : 0; - // if the value is over the frametime of a 60 fps frame, reset the additional time (drop the frames, that are lost already) - if(AdditionalTime > (time_freq() / 60)) - AdditionalTime = (time_freq() / 60); - LastRenderTime = Now - AdditionalTime; - m_LastRenderTime = Now; - - if(!m_EditorActive) - Render(); - else - { - m_pEditor->OnRender(); - DebugRender(); - } - m_pGraphics->Swap(); - } - else if(!IsRenderActive) - { - // if the client does not render, it should reset its render time to a time where it would render the first frame, when it wakes up again - LastRenderTime = g_Config.m_GfxRefreshRate ? (Now - (time_freq() / (int64_t)g_Config.m_GfxRefreshRate)) : Now; - } - } - - AutoScreenshot_Cleanup(); - AutoStatScreenshot_Cleanup(); - AutoCSV_Cleanup(); - - m_Fifo.Update(); - - if(State() == IClient::STATE_QUITTING || State() == IClient::STATE_RESTARTING) - break; - - // beNice - auto Now = time_get_nanoseconds(); - decltype(Now) SleepTimeInNanoSeconds{0}; - bool Slept = false; - if(g_Config.m_ClRefreshRateInactive && !m_pGraphics->WindowActive()) - { - SleepTimeInNanoSeconds = (std::chrono::nanoseconds(1s) / (int64_t)g_Config.m_ClRefreshRateInactive) - (Now - LastTime); - std::this_thread::sleep_for(SleepTimeInNanoSeconds); - Slept = true; - } - else if(g_Config.m_ClRefreshRate) - { - SleepTimeInNanoSeconds = (std::chrono::nanoseconds(1s) / (int64_t)g_Config.m_ClRefreshRate) - (Now - LastTime); - auto SleepTimeInNanoSecondsInner = SleepTimeInNanoSeconds; - auto NowInner = Now; - while((SleepTimeInNanoSecondsInner / std::chrono::nanoseconds(1us).count()) > 0ns) - { - net_socket_read_wait(m_aNetClient[CONN_MAIN].m_Socket, SleepTimeInNanoSecondsInner); - auto NowInnerCalc = time_get_nanoseconds(); - SleepTimeInNanoSecondsInner -= (NowInnerCalc - NowInner); - NowInner = NowInnerCalc; - } - Slept = true; - } - if(Slept) - { - // if the diff gets too small it shouldn't get even smaller (drop the updates, that could not be handled) - if(SleepTimeInNanoSeconds < -16666666ns) - SleepTimeInNanoSeconds = -16666666ns; - // don't go higher than the frametime of a 60 fps frame - else if(SleepTimeInNanoSeconds > 16666666ns) - SleepTimeInNanoSeconds = 16666666ns; - // the time diff between the time that was used actually used and the time the thread should sleep/wait - // will be calculated in the sleep time of the next update tick by faking the time it should have slept/wait. - // so two cases (and the case it slept exactly the time it should): - // - the thread slept/waited too long, then it adjust the time to sleep/wait less in the next update tick - // - the thread slept/waited too less, then it adjust the time to sleep/wait more in the next update tick - LastTime = Now + SleepTimeInNanoSeconds; - } - else - LastTime = Now; - - // update local and global time - m_LocalTime = (time_get() - m_LocalStartTime) / (float)time_freq(); - m_GlobalTime = (time_get() - m_GlobalStartTime) / (float)time_freq(); - } - - GameClient()->RenderShutdownMessage(); - Disconnect(); - - if(!m_pConfigManager->Save()) - { - char aError[128]; - str_format(aError, sizeof(aError), Localize("Saving settings to '%s' failed"), CONFIG_FILE); - m_vQuittingWarnings.emplace_back(Localize("Error saving settings"), aError); - } - - m_Fifo.Shutdown(); - m_Http.Shutdown(); - Engine()->ShutdownJobs(); - - GameClient()->RenderShutdownMessage(); - GameClient()->OnShutdown(); - delete m_pEditor; - - // close sockets - for(unsigned int i = 0; i < std::size(m_aNetClient); i++) - m_aNetClient[i].Close(); - - // shutdown text render while graphics are still available - m_pTextRender->Shutdown(); -} - -bool CClient::InitNetworkClient(char *pError, size_t ErrorSize) -{ - NETADDR BindAddr; - if(g_Config.m_Bindaddr[0] == '\0') - { - mem_zero(&BindAddr, sizeof(BindAddr)); - } - else if(net_host_lookup(g_Config.m_Bindaddr, &BindAddr, NETTYPE_ALL) != 0) - { - str_format(pError, ErrorSize, "The configured bindaddr '%s' cannot be resolved.", g_Config.m_Bindaddr); - return false; - } - BindAddr.type = NETTYPE_ALL; - for(unsigned int i = 0; i < std::size(m_aNetClient); i++) - { - int &PortRef = i == CONN_MAIN ? g_Config.m_ClPort : i == CONN_DUMMY ? g_Config.m_ClDummyPort : g_Config.m_ClContactPort; - if(PortRef < 1024) // Reject users setting ports that we don't want to use - { - PortRef = 0; - } - BindAddr.port = PortRef; - unsigned RemainingAttempts = 25; - while(BindAddr.port == 0 || !m_aNetClient[i].Open(BindAddr)) - { - if(BindAddr.port != 0) - { - --RemainingAttempts; - if(RemainingAttempts == 0) - { - if(g_Config.m_Bindaddr[0]) - str_format(pError, ErrorSize, "Could not open the network client, try changing or unsetting the bindaddr '%s'.", g_Config.m_Bindaddr); - else - str_copy(pError, "Could not open the network client.", ErrorSize); - return false; - } - } - BindAddr.port = (secure_rand() % 64511) + 1024; - } - } - return true; -} - -bool CClient::CtrlShiftKey(int Key, bool &Last) -{ - if(Input()->ModifierIsPressed() && Input()->ShiftIsPressed() && !Last && Input()->KeyIsPressed(Key)) - { - Last = true; - return true; - } - else if(Last && !Input()->KeyIsPressed(Key)) - Last = false; - - return false; -} - -void CClient::Con_Connect(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pSelf->HandleConnectLink(pResult->GetString(0)); -} - -void CClient::Con_Disconnect(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pSelf->Disconnect(); -} - -void CClient::Con_DummyConnect(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pSelf->DummyConnect(); -} - -void CClient::Con_DummyDisconnect(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pSelf->DummyDisconnect(nullptr); -} - -void CClient::Con_DummyResetInput(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pSelf->GameClient()->DummyResetInput(); -} - -void CClient::Con_Quit(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pSelf->Quit(); -} - -void CClient::Con_Restart(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pSelf->Restart(); -} - -void CClient::Con_Minimize(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pSelf->Graphics()->Minimize(); -} - -void CClient::Con_Ping(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - - CMsgPacker Msg(NETMSG_PING, true); - pSelf->SendMsg(CONN_MAIN, &Msg, MSGFLAG_FLUSH); - pSelf->m_PingStartTime = time_get(); -} - -void CClient::AutoScreenshot_Start() -{ - if(g_Config.m_ClAutoScreenshot) - { - Graphics()->TakeScreenshot("auto/autoscreen"); - m_AutoScreenshotRecycle = true; - } -} - -void CClient::AutoStatScreenshot_Start() -{ - if(g_Config.m_ClAutoStatboardScreenshot) - { - Graphics()->TakeScreenshot("auto/stats/autoscreen"); - m_AutoStatScreenshotRecycle = true; - } -} - -void CClient::AutoScreenshot_Cleanup() -{ - if(m_AutoScreenshotRecycle) - { - if(g_Config.m_ClAutoScreenshotMax) - { - // clean up auto taken screens - CFileCollection AutoScreens; - AutoScreens.Init(Storage(), "screenshots/auto", "autoscreen", ".png", g_Config.m_ClAutoScreenshotMax); - } - m_AutoScreenshotRecycle = false; - } -} - -void CClient::AutoStatScreenshot_Cleanup() -{ - if(m_AutoStatScreenshotRecycle) - { - if(g_Config.m_ClAutoStatboardScreenshotMax) - { - // clean up auto taken screens - CFileCollection AutoScreens; - AutoScreens.Init(Storage(), "screenshots/auto/stats", "autoscreen", ".png", g_Config.m_ClAutoStatboardScreenshotMax); - } - m_AutoStatScreenshotRecycle = false; - } -} - -void CClient::AutoCSV_Start() -{ - if(g_Config.m_ClAutoCSV) - m_AutoCSVRecycle = true; -} - -void CClient::AutoCSV_Cleanup() -{ - if(m_AutoCSVRecycle) - { - if(g_Config.m_ClAutoCSVMax) - { - // clean up auto csvs - CFileCollection AutoRecord; - AutoRecord.Init(Storage(), "record/csv", "autorecord", ".csv", g_Config.m_ClAutoCSVMax); - } - m_AutoCSVRecycle = false; - } -} - -void CClient::Con_Screenshot(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pSelf->Graphics()->TakeScreenshot(0); -} - -#if defined(CONF_VIDEORECORDER) - -void CClient::Con_StartVideo(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = static_cast(pUserData); - - if(pResult->NumArguments()) - { - pSelf->StartVideo(pResult->GetString(0), false); - } - else - { - pSelf->StartVideo("video", true); - } -} - -void CClient::StartVideo(const char *pFilename, bool WithTimestamp) -{ - if(State() != IClient::STATE_DEMOPLAYBACK) - { - log_error("videorecorder", "Video can only be recorded in demo player."); - return; - } - - if(IVideo::Current()) - { - log_error("videorecorder", "Already recording."); - return; - } - - char aFilename[IO_MAX_PATH_LENGTH]; - if(WithTimestamp) - { - char aTimestamp[20]; - str_timestamp(aTimestamp, sizeof(aTimestamp)); - str_format(aFilename, sizeof(aFilename), "videos/%s_%s.mp4", pFilename, aTimestamp); - } - else - { - str_format(aFilename, sizeof(aFilename), "videos/%s.mp4", pFilename); - } - - // wait for idle, so there is no data race - Graphics()->WaitForIdle(); - // pause the sound device while creating the video instance - Sound()->PauseAudioDevice(); - new CVideo(Graphics(), Sound(), Storage(), Graphics()->ScreenWidth(), Graphics()->ScreenHeight(), aFilename); - Sound()->UnpauseAudioDevice(); - if(!IVideo::Current()->Start()) - { - log_error("videorecorder", "Failed to start recording to '%s'", aFilename); - m_DemoPlayer.Stop("Failed to start video recording. See local console for details."); - return; - } - if(m_DemoPlayer.Info()->m_Info.m_Paused) - { - IVideo::Current()->Pause(true); - } - log_info("videorecorder", "Recording to '%s'", aFilename); -} - -void CClient::Con_StopVideo(IConsole::IResult *pResult, void *pUserData) -{ - if(!IVideo::Current()) - { - log_error("videorecorder", "Not recording."); - return; - } - - IVideo::Current()->Stop(); - log_info("videorecorder", "Stopped recording."); -} - -#endif - -void CClient::Con_Rcon(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pSelf->Rcon(pResult->GetString(0)); -} - -void CClient::Con_RconAuth(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pSelf->RconAuth("", pResult->GetString(0)); -} - -void CClient::Con_RconLogin(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pSelf->RconAuth(pResult->GetString(0), pResult->GetString(1)); -} - -void CClient::Con_BeginFavoriteGroup(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - if(pSelf->m_FavoritesGroup) - { - log_error("client", "opening favorites group while there is already one, discarding old one"); - for(int i = 0; i < pSelf->m_FavoritesGroupNum; i++) - { - char aAddr[NETADDR_MAXSTRSIZE]; - net_addr_str(&pSelf->m_aFavoritesGroupAddresses[i], aAddr, sizeof(aAddr), true); - log_warn("client", "discarding %s", aAddr); - } - } - pSelf->m_FavoritesGroup = true; - pSelf->m_FavoritesGroupAllowPing = false; - pSelf->m_FavoritesGroupNum = 0; -} - -void CClient::Con_EndFavoriteGroup(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - if(!pSelf->m_FavoritesGroup) - { - log_error("client", "closing favorites group while there is none, ignoring"); - return; - } - log_info("client", "adding group of %d favorites", pSelf->m_FavoritesGroupNum); - pSelf->m_pFavorites->Add(pSelf->m_aFavoritesGroupAddresses, pSelf->m_FavoritesGroupNum); - if(pSelf->m_FavoritesGroupAllowPing) - { - pSelf->m_pFavorites->AllowPing(pSelf->m_aFavoritesGroupAddresses, pSelf->m_FavoritesGroupNum, true); - } - pSelf->m_FavoritesGroup = false; -} - -void CClient::Con_AddFavorite(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - NETADDR Addr; - - if(net_addr_from_url(&Addr, pResult->GetString(0), nullptr, 0) != 0 && net_addr_from_str(&Addr, pResult->GetString(0)) != 0) - { - char aBuf[128]; - str_format(aBuf, sizeof(aBuf), "invalid address '%s'", pResult->GetString(0)); - pSelf->m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", aBuf); - return; - } - bool AllowPing = pResult->NumArguments() > 1 && str_find(pResult->GetString(1), "allow_ping"); - char aAddr[NETADDR_MAXSTRSIZE]; - net_addr_str(&Addr, aAddr, sizeof(aAddr), true); - if(pSelf->m_FavoritesGroup) - { - if(pSelf->m_FavoritesGroupNum == (int)std::size(pSelf->m_aFavoritesGroupAddresses)) - { - log_error("client", "discarding %s because groups can have at most a size of %d", aAddr, pSelf->m_FavoritesGroupNum); - return; - } - log_info("client", "adding %s to favorites group", aAddr); - pSelf->m_aFavoritesGroupAddresses[pSelf->m_FavoritesGroupNum] = Addr; - pSelf->m_FavoritesGroupAllowPing = pSelf->m_FavoritesGroupAllowPing || AllowPing; - pSelf->m_FavoritesGroupNum += 1; - } - else - { - log_info("client", "adding %s to favorites", aAddr); - pSelf->m_pFavorites->Add(&Addr, 1); - if(AllowPing) - { - pSelf->m_pFavorites->AllowPing(&Addr, 1, true); - } - } -} - -void CClient::Con_RemoveFavorite(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - NETADDR Addr; - if(net_addr_from_str(&Addr, pResult->GetString(0)) == 0) - pSelf->m_pFavorites->Remove(&Addr, 1); -} - -void CClient::DemoSliceBegin() -{ - const CDemoPlayer::CPlaybackInfo *pInfo = m_DemoPlayer.Info(); - g_Config.m_ClDemoSliceBegin = pInfo->m_Info.m_CurrentTick; -} - -void CClient::DemoSliceEnd() -{ - const CDemoPlayer::CPlaybackInfo *pInfo = m_DemoPlayer.Info(); - g_Config.m_ClDemoSliceEnd = pInfo->m_Info.m_CurrentTick; -} - -void CClient::Con_DemoSliceBegin(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pSelf->DemoSliceBegin(); -} - -void CClient::Con_DemoSliceEnd(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pSelf->DemoSliceEnd(); -} - -void CClient::Con_SaveReplay(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - if(pResult->NumArguments()) - { - int Length = pResult->GetInteger(0); - if(Length <= 0) - pSelf->m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "replay", "ERROR: length must be greater than 0 second."); - else - { - if(pResult->NumArguments() >= 2) - pSelf->SaveReplay(Length, pResult->GetString(1)); - else - pSelf->SaveReplay(Length); - } - } - else - pSelf->SaveReplay(g_Config.m_ClReplayLength); -} - -void CClient::SaveReplay(const int Length, const char *pFilename) -{ - if(!g_Config.m_ClReplays) - { - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "replay", "Feature is disabled. Please enable it via configuration."); - GameClient()->Echo(Localize("Replay feature is disabled!")); - return; - } - - if(!DemoRecorder(RECORDER_REPLAYS)->IsRecording()) - { - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "replay", "ERROR: demorecorder isn't recording. Try to rejoin to fix that."); - } - else if(DemoRecorder(RECORDER_REPLAYS)->Length() < 1) - { - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "replay", "ERROR: demorecorder isn't recording for at least 1 second."); - } - else - { - char aFilename[IO_MAX_PATH_LENGTH]; - if(pFilename[0] == '\0') - { - char aTimestamp[20]; - str_timestamp(aTimestamp, sizeof(aTimestamp)); - str_format(aFilename, sizeof(aFilename), "demos/replays/%s_%s_(replay).demo", m_aCurrentMap, aTimestamp); - } - else - { - str_format(aFilename, sizeof(aFilename), "demos/replays/%s.demo", pFilename); - IOHANDLE Handle = m_pStorage->OpenFile(aFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE); - if(!Handle) - { - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "replay", "ERROR: invalid filename. Try a different one!"); - return; - } - io_close(Handle); - m_pStorage->RemoveFile(aFilename, IStorage::TYPE_SAVE); - } - - // Stop the recorder to correctly slice the demo after - DemoRecorder(RECORDER_REPLAYS)->Stop(IDemoRecorder::EStopMode::KEEP_FILE); - - // Slice the demo to get only the last cl_replay_length seconds - const char *pSrc = m_aDemoRecorder[RECORDER_REPLAYS].CurrentFilename(); - const int EndTick = GameTick(g_Config.m_ClDummy); - const int StartTick = EndTick - Length * GameTickSpeed(); - - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "replay", "Saving replay..."); - - // Create a job to do this slicing in background because it can be a bit long depending on the file size - std::shared_ptr pDemoEditTask = std::make_shared(GameClient()->NetVersion(), &m_SnapshotDelta, m_pStorage, pSrc, aFilename, StartTick, EndTick); - Engine()->AddJob(pDemoEditTask); - m_EditJobs.push_back(pDemoEditTask); - - // And we restart the recorder - DemoRecorder_UpdateReplayRecorder(); - } -} - -void CClient::DemoSlice(const char *pDstPath, CLIENTFUNC_FILTER pfnFilter, void *pUser) -{ - if(m_DemoPlayer.IsPlaying()) - { - m_DemoEditor.Slice(m_DemoPlayer.Filename(), pDstPath, g_Config.m_ClDemoSliceBegin, g_Config.m_ClDemoSliceEnd, pfnFilter, pUser); - } -} - -const char *CClient::DemoPlayer_Play(const char *pFilename, int StorageType) -{ - // Don't disconnect unless the file exists (only for play command) - if(!Storage()->FileExists(pFilename, StorageType)) - return "No demo with this filename exists"; - - Disconnect(); - m_aNetClient[CONN_MAIN].ResetErrorString(); - - SetState(IClient::STATE_LOADING); - SetLoadingStateDetail(IClient::LOADING_STATE_DETAIL_LOADING_DEMO); - if((bool)m_LoadingCallback) - m_LoadingCallback(IClient::LOADING_CALLBACK_DETAIL_DEMO); - - // try to start playback - m_DemoPlayer.SetListener(this); - if(m_DemoPlayer.Load(Storage(), m_pConsole, pFilename, StorageType)) - { - DisconnectWithReason(m_DemoPlayer.ErrorMessage()); - return m_DemoPlayer.ErrorMessage(); - } - - m_Sixup = m_DemoPlayer.IsSixup(); - - // load map - const CMapInfo *pMapInfo = m_DemoPlayer.GetMapInfo(); - int Crc = pMapInfo->m_Crc; - SHA256_DIGEST Sha = pMapInfo->m_Sha256; - const char *pError = LoadMapSearch(pMapInfo->m_aName, Sha != SHA256_ZEROED ? &Sha : nullptr, Crc); - if(pError) - { - if(!m_DemoPlayer.ExtractMap(Storage())) - { - DisconnectWithReason(pError); - return pError; - } - - Sha = m_DemoPlayer.GetMapInfo()->m_Sha256; - pError = LoadMapSearch(pMapInfo->m_aName, &Sha, Crc); - if(pError) - { - DisconnectWithReason(pError); - return pError; - } - } - - // setup current server info - mem_zero(&m_CurrentServerInfo, sizeof(m_CurrentServerInfo)); - str_copy(m_CurrentServerInfo.m_aMap, pMapInfo->m_aName); - m_CurrentServerInfo.m_MapCrc = pMapInfo->m_Crc; - m_CurrentServerInfo.m_MapSize = pMapInfo->m_Size; - - GameClient()->OnConnected(); - - // setup buffers - mem_zero(m_aaaDemorecSnapshotData, sizeof(m_aaaDemorecSnapshotData)); - - for(int SnapshotType = 0; SnapshotType < NUM_SNAPSHOT_TYPES; SnapshotType++) - { - m_aapSnapshots[0][SnapshotType] = &m_aDemorecSnapshotHolders[SnapshotType]; - m_aapSnapshots[0][SnapshotType]->m_pSnap = (CSnapshot *)&m_aaaDemorecSnapshotData[SnapshotType][0]; - m_aapSnapshots[0][SnapshotType]->m_pAltSnap = (CSnapshot *)&m_aaaDemorecSnapshotData[SnapshotType][1]; - m_aapSnapshots[0][SnapshotType]->m_SnapSize = 0; - m_aapSnapshots[0][SnapshotType]->m_AltSnapSize = 0; - m_aapSnapshots[0][SnapshotType]->m_Tick = -1; - } - - // enter demo playback state - SetState(IClient::STATE_DEMOPLAYBACK); - - m_DemoPlayer.Play(); - GameClient()->OnEnterGame(); - - return 0; -} - -#if defined(CONF_VIDEORECORDER) -const char *CClient::DemoPlayer_Render(const char *pFilename, int StorageType, const char *pVideoName, int SpeedIndex, bool StartPaused) -{ - const char *pError = DemoPlayer_Play(pFilename, StorageType); - if(pError) - return pError; - - StartVideo(pVideoName, false); - m_DemoPlayer.SetSpeedIndex(SpeedIndex); - if(StartPaused) - { - m_DemoPlayer.Pause(); - } - return nullptr; -} -#endif - -void CClient::Con_Play(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pSelf->HandleDemoPath(pResult->GetString(0)); -} - -void CClient::Con_DemoPlay(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - if(pSelf->m_DemoPlayer.IsPlaying()) - { - if(pSelf->m_DemoPlayer.BaseInfo()->m_Paused) - { - pSelf->m_DemoPlayer.Unpause(); - } - else - { - pSelf->m_DemoPlayer.Pause(); - } - } -} - -void CClient::Con_DemoSpeed(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pSelf->m_DemoPlayer.SetSpeed(pResult->GetFloat(0)); -} - -void CClient::DemoRecorder_Start(const char *pFilename, bool WithTimestamp, int Recorder, bool Verbose) -{ - if(State() != IClient::STATE_ONLINE) - { - if(Verbose) - { - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demorec/record", "client is not online"); - } - } - else - { - char aFilename[IO_MAX_PATH_LENGTH]; - if(WithTimestamp) - { - char aTimestamp[20]; - str_timestamp(aTimestamp, sizeof(aTimestamp)); - str_format(aFilename, sizeof(aFilename), "demos/%s_%s.demo", pFilename, aTimestamp); - } - else - { - str_format(aFilename, sizeof(aFilename), "demos/%s.demo", pFilename); - } - - m_aDemoRecorder[Recorder].Start( - Storage(), - m_pConsole, - aFilename, - IsSixup() ? GameClient()->NetVersion7() : GameClient()->NetVersion(), - m_aCurrentMap, - m_pMap->Sha256(), - m_pMap->Crc(), - "client", - m_pMap->MapSize(), - 0, - m_pMap->File(), - nullptr, - nullptr); - } -} - -void CClient::DemoRecorder_HandleAutoStart() -{ - if(g_Config.m_ClAutoDemoRecord) - { - DemoRecorder(RECORDER_AUTO)->Stop(IDemoRecorder::EStopMode::KEEP_FILE); - - char aFilename[IO_MAX_PATH_LENGTH]; - str_format(aFilename, sizeof(aFilename), "auto/%s", m_aCurrentMap); - DemoRecorder_Start(aFilename, true, RECORDER_AUTO); - - if(g_Config.m_ClAutoDemoMax) - { - // clean up auto recorded demos - CFileCollection AutoDemos; - AutoDemos.Init(Storage(), "demos/auto", "" /* empty for wild card */, ".demo", g_Config.m_ClAutoDemoMax); - } - } - - DemoRecorder_UpdateReplayRecorder(); -} - -void CClient::DemoRecorder_UpdateReplayRecorder() -{ - if(!g_Config.m_ClReplays && DemoRecorder(RECORDER_REPLAYS)->IsRecording()) - { - DemoRecorder(RECORDER_REPLAYS)->Stop(IDemoRecorder::EStopMode::REMOVE_FILE); - } - - if(g_Config.m_ClReplays && !DemoRecorder(RECORDER_REPLAYS)->IsRecording()) - { - char aFilename[IO_MAX_PATH_LENGTH]; - str_format(aFilename, sizeof(aFilename), "replays/replay_tmp_%s", m_aCurrentMap); - DemoRecorder_Start(aFilename, true, RECORDER_REPLAYS); - } -} - -void CClient::DemoRecorder_AddDemoMarker(int Recorder) -{ - m_aDemoRecorder[Recorder].AddDemoMarker(); -} - -class IDemoRecorder *CClient::DemoRecorder(int Recorder) -{ - return &m_aDemoRecorder[Recorder]; -} - -void CClient::Con_Record(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - - if(pSelf->m_aDemoRecorder[RECORDER_MANUAL].IsRecording()) - { - pSelf->m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_recorder", "Demo recorder already recording"); - return; - } - - if(pResult->NumArguments()) - pSelf->DemoRecorder_Start(pResult->GetString(0), false, RECORDER_MANUAL, true); - else - pSelf->DemoRecorder_Start(pSelf->m_aCurrentMap, true, RECORDER_MANUAL, true); -} - -void CClient::Con_StopRecord(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pSelf->DemoRecorder(RECORDER_MANUAL)->Stop(IDemoRecorder::EStopMode::KEEP_FILE); -} - -void CClient::Con_AddDemoMarker(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - for(int Recorder = 0; Recorder < RECORDER_MAX; Recorder++) - pSelf->DemoRecorder_AddDemoMarker(Recorder); -} - -void CClient::Con_BenchmarkQuit(IConsole::IResult *pResult, void *pUserData) -{ - CClient *pSelf = (CClient *)pUserData; - int Seconds = pResult->GetInteger(0); - const char *pFilename = pResult->GetString(1); - pSelf->BenchmarkQuit(Seconds, pFilename); -} - -void CClient::BenchmarkQuit(int Seconds, const char *pFilename) -{ - char aBuf[IO_MAX_PATH_LENGTH]; - m_BenchmarkFile = Storage()->OpenFile(pFilename, IOFLAG_WRITE, IStorage::TYPE_ABSOLUTE, aBuf, sizeof(aBuf)); - m_BenchmarkStopTime = time_get() + time_freq() * Seconds; -} - -void CClient::UpdateAndSwap() -{ - Input()->Update(); - Graphics()->Swap(); - Graphics()->Clear(0, 0, 0); - m_GlobalTime = (time_get() - m_GlobalStartTime) / (float)time_freq(); -} - -void CClient::ServerBrowserUpdate() -{ - m_ServerBrowser.RequestResort(); -} - -void CClient::ConchainServerBrowserUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - pfnCallback(pResult, pCallbackUserData); - if(pResult->NumArguments()) - ((CClient *)pUserData)->ServerBrowserUpdate(); -} - -void CClient::InitChecksum() -{ - CChecksumData *pData = &m_Checksum.m_Data; - pData->m_SizeofData = sizeof(*pData); - str_copy(pData->m_aVersionStr, GAME_NAME " " GAME_RELEASE_VERSION " (" CONF_PLATFORM_STRING "; " CONF_ARCH_STRING ")"); - pData->m_Start = time_get(); - os_version_str(pData->m_aOsVersion, sizeof(pData->m_aOsVersion)); - secure_random_fill(&pData->m_Random, sizeof(pData->m_Random)); - pData->m_Version = GameClient()->DDNetVersion(); - pData->m_SizeofClient = sizeof(*this); - pData->m_SizeofConfig = sizeof(pData->m_Config); - pData->InitFiles(); -} - -#ifndef DDNET_CHECKSUM_SALT -// salt@checksum.ddnet.tw: db877f2b-2ddb-3ba6-9f67-a6d169ec671d -#define DDNET_CHECKSUM_SALT \ - { \ - { \ - 0xdb, 0x87, 0x7f, 0x2b, 0x2d, 0xdb, 0x3b, 0xa6, \ - 0x9f, 0x67, 0xa6, 0xd1, 0x69, 0xec, 0x67, 0x1d, \ - } \ - } -#endif - -int CClient::HandleChecksum(int Conn, CUuid Uuid, CUnpacker *pUnpacker) -{ - int Start = pUnpacker->GetInt(); - int Length = pUnpacker->GetInt(); - if(pUnpacker->Error()) - { - return 1; - } - if(Start < 0 || Length < 0 || Start > std::numeric_limits::max() - Length) - { - return 2; - } - int End = Start + Length; - int ChecksumBytesEnd = minimum(End, (int)sizeof(m_Checksum.m_aBytes)); - int FileStart = maximum(Start, (int)sizeof(m_Checksum.m_aBytes)); - unsigned char aStartBytes[sizeof(int32_t)]; - unsigned char aEndBytes[sizeof(int32_t)]; - uint_to_bytes_be(aStartBytes, Start); - uint_to_bytes_be(aEndBytes, End); - - if(Start <= (int)sizeof(m_Checksum.m_aBytes)) - { - mem_zero(&m_Checksum.m_Data.m_Config, sizeof(m_Checksum.m_Data.m_Config)); -#define CHECKSUM_RECORD(Flags) (((Flags)&CFGFLAG_CLIENT) == 0 || ((Flags)&CFGFLAG_INSENSITIVE) != 0) -#define MACRO_CONFIG_INT(Name, ScriptName, Def, Min, Max, Flags, Desc) \ - if(CHECKSUM_RECORD(Flags)) \ - { \ - m_Checksum.m_Data.m_Config.m_##Name = g_Config.m_##Name; \ - } -#define MACRO_CONFIG_COL(Name, ScriptName, Def, Flags, Desc) \ - if(CHECKSUM_RECORD(Flags)) \ - { \ - m_Checksum.m_Data.m_Config.m_##Name = g_Config.m_##Name; \ - } -#define MACRO_CONFIG_STR(Name, ScriptName, Len, Def, Flags, Desc) \ - if(CHECKSUM_RECORD(Flags)) \ - { \ - str_copy(m_Checksum.m_Data.m_Config.m_##Name, g_Config.m_##Name, sizeof(m_Checksum.m_Data.m_Config.m_##Name)); \ - } -#include -#undef CHECKSUM_RECORD -#undef MACRO_CONFIG_INT -#undef MACRO_CONFIG_COL -#undef MACRO_CONFIG_STR - } - if(End > (int)sizeof(m_Checksum.m_aBytes)) - { - if(m_OwnExecutableSize == 0) - { - m_OwnExecutable = io_current_exe(); - // io_length returns -1 on error. - m_OwnExecutableSize = m_OwnExecutable ? io_length(m_OwnExecutable) : -1; - } - // Own executable not available. - if(m_OwnExecutableSize < 0) - { - return 3; - } - if(End - (int)sizeof(m_Checksum.m_aBytes) > m_OwnExecutableSize) - { - return 4; - } - } - - SHA256_CTX Sha256Ctxt; - sha256_init(&Sha256Ctxt); - CUuid Salt = DDNET_CHECKSUM_SALT; - sha256_update(&Sha256Ctxt, &Salt, sizeof(Salt)); - sha256_update(&Sha256Ctxt, &Uuid, sizeof(Uuid)); - sha256_update(&Sha256Ctxt, aStartBytes, sizeof(aStartBytes)); - sha256_update(&Sha256Ctxt, aEndBytes, sizeof(aEndBytes)); - if(Start < (int)sizeof(m_Checksum.m_aBytes)) - { - sha256_update(&Sha256Ctxt, m_Checksum.m_aBytes + Start, ChecksumBytesEnd - Start); - } - if(End > (int)sizeof(m_Checksum.m_aBytes)) - { - unsigned char aBuf[2048]; - if(io_seek(m_OwnExecutable, FileStart - sizeof(m_Checksum.m_aBytes), IOSEEK_START)) - { - return 5; - } - for(int i = FileStart; i < End; i += sizeof(aBuf)) - { - int Read = io_read(m_OwnExecutable, aBuf, minimum((int)sizeof(aBuf), End - i)); - sha256_update(&Sha256Ctxt, aBuf, Read); - } - } - SHA256_DIGEST Sha256 = sha256_finish(&Sha256Ctxt); - - CMsgPacker Msg(NETMSG_CHECKSUM_RESPONSE, true); - Msg.AddRaw(&Uuid, sizeof(Uuid)); - Msg.AddRaw(&Sha256, sizeof(Sha256)); - SendMsg(Conn, &Msg, MSGFLAG_VITAL); - - return 0; -} - -void CClient::SwitchWindowScreen(int Index) -{ - //Tested on windows 11 64 bit (gtx 1660 super, intel UHD 630 opengl 1.2.0, 3.3.0 and vulkan 1.1.0) - int IsFullscreen = g_Config.m_GfxFullscreen; - int IsBorderless = g_Config.m_GfxBorderless; - - if(!Graphics()->SetWindowScreen(Index)) - { - return; - } - - SetWindowParams(3, false); // prevent DDNet to get stretch on monitors - - CVideoMode CurMode; - Graphics()->GetCurrentVideoMode(CurMode, Index); - - const int Depth = CurMode.m_Red + CurMode.m_Green + CurMode.m_Blue > 16 ? 24 : 16; - g_Config.m_GfxColorDepth = Depth; - g_Config.m_GfxScreenWidth = CurMode.m_WindowWidth; - g_Config.m_GfxScreenHeight = CurMode.m_WindowHeight; - g_Config.m_GfxScreenRefreshRate = CurMode.m_RefreshRate; - - Graphics()->ResizeToScreen(); - - SetWindowParams(IsFullscreen, IsBorderless); -} - -void CClient::ConchainWindowScreen(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - CClient *pSelf = (CClient *)pUserData; - if(pSelf->Graphics() && pResult->NumArguments()) - { - if(g_Config.m_GfxScreen != pResult->GetInteger(0)) - pSelf->SwitchWindowScreen(pResult->GetInteger(0)); - } - else - pfnCallback(pResult, pCallbackUserData); -} - -void CClient::SetWindowParams(int FullscreenMode, bool IsBorderless) -{ - g_Config.m_GfxFullscreen = clamp(FullscreenMode, 0, 3); - g_Config.m_GfxBorderless = (int)IsBorderless; - Graphics()->SetWindowParams(FullscreenMode, IsBorderless); -} - -void CClient::ConchainFullscreen(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - CClient *pSelf = (CClient *)pUserData; - if(pSelf->Graphics() && pResult->NumArguments()) - { - if(g_Config.m_GfxFullscreen != pResult->GetInteger(0)) - pSelf->SetWindowParams(pResult->GetInteger(0), g_Config.m_GfxBorderless); - } - else - pfnCallback(pResult, pCallbackUserData); -} - -void CClient::ConchainWindowBordered(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - CClient *pSelf = (CClient *)pUserData; - if(pSelf->Graphics() && pResult->NumArguments()) - { - if(!g_Config.m_GfxFullscreen && (g_Config.m_GfxBorderless != pResult->GetInteger(0))) - pSelf->SetWindowParams(g_Config.m_GfxFullscreen, !g_Config.m_GfxBorderless); - } - else - pfnCallback(pResult, pCallbackUserData); -} - -void CClient::ToggleWindowVSync() -{ - if(Graphics()->SetVSync(g_Config.m_GfxVsync ^ 1)) - g_Config.m_GfxVsync ^= 1; -} - -void CClient::Notify(const char *pTitle, const char *pMessage) -{ - if(m_pGraphics->WindowActive() || !g_Config.m_ClShowNotifications) - return; - - Notifications()->Notify(pTitle, pMessage); - Graphics()->NotifyWindow(); -} - -void CClient::OnWindowResize() -{ - TextRender()->OnPreWindowResize(); - GameClient()->OnWindowResize(); - m_pEditor->OnWindowResize(); - TextRender()->OnWindowResize(); -} - -void CClient::ConchainWindowVSync(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - CClient *pSelf = (CClient *)pUserData; - if(pSelf->Graphics() && pResult->NumArguments()) - { - if(g_Config.m_GfxVsync != pResult->GetInteger(0)) - pSelf->ToggleWindowVSync(); - } - else - pfnCallback(pResult, pCallbackUserData); -} - -void CClient::ConchainWindowResize(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pfnCallback(pResult, pCallbackUserData); - if(pSelf->Graphics() && pResult->NumArguments()) - { - pSelf->Graphics()->ResizeToScreen(); - } -} - -void CClient::ConchainTimeoutSeed(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pfnCallback(pResult, pCallbackUserData); - if(pResult->NumArguments()) - pSelf->m_GenerateTimeoutSeed = false; -} - -void CClient::ConchainPassword(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pfnCallback(pResult, pCallbackUserData); - if(pResult->NumArguments() && pSelf->m_LocalStartTime) //won't set m_SendPassword before game has started - pSelf->m_SendPassword = true; -} - -void CClient::ConchainReplays(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pfnCallback(pResult, pCallbackUserData); - if(pResult->NumArguments()) - { - pSelf->DemoRecorder_UpdateReplayRecorder(); - } -} - -void CClient::ConchainLoglevel(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pfnCallback(pResult, pCallbackUserData); - if(pResult->NumArguments()) - { - pSelf->m_pFileLogger->SetFilter(CLogFilter{IConsole::ToLogLevelFilter(g_Config.m_Loglevel)}); - } -} - -void CClient::ConchainStdoutOutputLevel(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - CClient *pSelf = (CClient *)pUserData; - pfnCallback(pResult, pCallbackUserData); - if(pResult->NumArguments() && pSelf->m_pStdoutLogger) - { - pSelf->m_pStdoutLogger->SetFilter(CLogFilter{IConsole::ToLogLevelFilter(g_Config.m_StdoutOutputLevel)}); - } -} - -void CClient::RegisterCommands() -{ - m_pConsole = Kernel()->RequestInterface(); - - m_pConsole->Register("dummy_connect", "", CFGFLAG_CLIENT, Con_DummyConnect, this, "Connect dummy"); - m_pConsole->Register("dummy_disconnect", "", CFGFLAG_CLIENT, Con_DummyDisconnect, this, "Disconnect dummy"); - m_pConsole->Register("dummy_reset", "", CFGFLAG_CLIENT, Con_DummyResetInput, this, "Reset dummy"); - - m_pConsole->Register("quit", "", CFGFLAG_CLIENT | CFGFLAG_STORE, Con_Quit, this, "Quit the client"); - m_pConsole->Register("exit", "", CFGFLAG_CLIENT | CFGFLAG_STORE, Con_Quit, this, "Quit the client"); - m_pConsole->Register("restart", "", CFGFLAG_CLIENT | CFGFLAG_STORE, Con_Restart, this, "Restart the client"); - m_pConsole->Register("minimize", "", CFGFLAG_CLIENT | CFGFLAG_STORE, Con_Minimize, this, "Minimize the client"); - m_pConsole->Register("connect", "r[host|ip]", CFGFLAG_CLIENT, Con_Connect, this, "Connect to the specified host/ip"); - m_pConsole->Register("disconnect", "", CFGFLAG_CLIENT, Con_Disconnect, this, "Disconnect from the server"); - m_pConsole->Register("ping", "", CFGFLAG_CLIENT, Con_Ping, this, "Ping the current server"); - m_pConsole->Register("screenshot", "", CFGFLAG_CLIENT | CFGFLAG_STORE, Con_Screenshot, this, "Take a screenshot"); - -#if defined(CONF_VIDEORECORDER) - m_pConsole->Register("start_video", "?r[file]", CFGFLAG_CLIENT, Con_StartVideo, this, "Start recording a video"); - m_pConsole->Register("stop_video", "", CFGFLAG_CLIENT, Con_StopVideo, this, "Stop recording a video"); -#endif - - m_pConsole->Register("rcon", "r[rcon-command]", CFGFLAG_CLIENT, Con_Rcon, this, "Send specified command to rcon"); - m_pConsole->Register("rcon_auth", "r[password]", CFGFLAG_CLIENT, Con_RconAuth, this, "Authenticate to rcon"); - m_pConsole->Register("rcon_login", "s[username] r[password]", CFGFLAG_CLIENT, Con_RconLogin, this, "Authenticate to rcon with a username"); - m_pConsole->Register("play", "r[file]", CFGFLAG_CLIENT | CFGFLAG_STORE, Con_Play, this, "Play back a demo"); - m_pConsole->Register("record", "?r[file]", CFGFLAG_CLIENT, Con_Record, this, "Start recording a demo"); - m_pConsole->Register("stoprecord", "", CFGFLAG_CLIENT, Con_StopRecord, this, "Stop recording a demo"); - m_pConsole->Register("add_demomarker", "", CFGFLAG_CLIENT, Con_AddDemoMarker, this, "Add demo timeline marker"); - m_pConsole->Register("begin_favorite_group", "", CFGFLAG_CLIENT, Con_BeginFavoriteGroup, this, "Use this before `add_favorite` to group favorites. End with `end_favorite_group`"); - m_pConsole->Register("end_favorite_group", "", CFGFLAG_CLIENT, Con_EndFavoriteGroup, this, "Use this after `add_favorite` to group favorites. Start with `begin_favorite_group`"); - m_pConsole->Register("add_favorite", "s[host|ip] ?s['allow_ping']", CFGFLAG_CLIENT, Con_AddFavorite, this, "Add a server as a favorite"); - m_pConsole->Register("remove_favorite", "r[host|ip]", CFGFLAG_CLIENT, Con_RemoveFavorite, this, "Remove a server from favorites"); - m_pConsole->Register("demo_slice_start", "", CFGFLAG_CLIENT, Con_DemoSliceBegin, this, "Mark the beginning of a demo cut"); - m_pConsole->Register("demo_slice_end", "", CFGFLAG_CLIENT, Con_DemoSliceEnd, this, "Mark the end of a demo cut"); - m_pConsole->Register("demo_play", "", CFGFLAG_CLIENT, Con_DemoPlay, this, "Play/pause the current demo"); - m_pConsole->Register("demo_speed", "f[speed]", CFGFLAG_CLIENT, Con_DemoSpeed, this, "Set current demo speed"); - - m_pConsole->Register("save_replay", "?i[length] ?r[filename]", CFGFLAG_CLIENT, Con_SaveReplay, this, "Save a replay of the last defined amount of seconds"); - m_pConsole->Register("benchmark_quit", "i[seconds] r[file]", CFGFLAG_CLIENT | CFGFLAG_STORE, Con_BenchmarkQuit, this, "Benchmark frame times for number of seconds to file, then quit"); - - RustVersionRegister(*m_pConsole); - - m_pConsole->Chain("cl_timeout_seed", ConchainTimeoutSeed, this); - m_pConsole->Chain("cl_replays", ConchainReplays, this); - - m_pConsole->Chain("password", ConchainPassword, this); - - // used for server browser update - m_pConsole->Chain("br_filter_string", ConchainServerBrowserUpdate, this); - m_pConsole->Chain("br_exclude_string", ConchainServerBrowserUpdate, this); - m_pConsole->Chain("br_filter_full", ConchainServerBrowserUpdate, this); - m_pConsole->Chain("br_filter_empty", ConchainServerBrowserUpdate, this); - m_pConsole->Chain("br_filter_spectators", ConchainServerBrowserUpdate, this); - m_pConsole->Chain("br_filter_friends", ConchainServerBrowserUpdate, this); - m_pConsole->Chain("br_filter_country", ConchainServerBrowserUpdate, this); - m_pConsole->Chain("br_filter_country_index", ConchainServerBrowserUpdate, this); - m_pConsole->Chain("br_filter_pw", ConchainServerBrowserUpdate, this); - m_pConsole->Chain("br_filter_gametype", ConchainServerBrowserUpdate, this); - m_pConsole->Chain("br_filter_gametype_strict", ConchainServerBrowserUpdate, this); - m_pConsole->Chain("br_filter_connecting_players", ConchainServerBrowserUpdate, this); - m_pConsole->Chain("br_filter_serveraddress", ConchainServerBrowserUpdate, this); - m_pConsole->Chain("br_filter_unfinished_map", ConchainServerBrowserUpdate, this); - m_pConsole->Chain("br_filter_login", ConchainServerBrowserUpdate, this); - m_pConsole->Chain("add_favorite", ConchainServerBrowserUpdate, this); - m_pConsole->Chain("remove_favorite", ConchainServerBrowserUpdate, this); - m_pConsole->Chain("end_favorite_group", ConchainServerBrowserUpdate, this); - - m_pConsole->Chain("gfx_screen", ConchainWindowScreen, this); - m_pConsole->Chain("gfx_screen_width", ConchainWindowResize, this); - m_pConsole->Chain("gfx_screen_height", ConchainWindowResize, this); - m_pConsole->Chain("gfx_screen_refresh_rate", ConchainWindowResize, this); - m_pConsole->Chain("gfx_fullscreen", ConchainFullscreen, this); - m_pConsole->Chain("gfx_borderless", ConchainWindowBordered, this); - m_pConsole->Chain("gfx_vsync", ConchainWindowVSync, this); - - m_pConsole->Chain("loglevel", ConchainLoglevel, this); - m_pConsole->Chain("stdout_output_level", ConchainStdoutOutputLevel, this); -} - -static CClient *CreateClient() -{ - return new CClient; -} - -void CClient::HandleConnectAddress(const NETADDR *pAddr) -{ - net_addr_str(pAddr, m_aCmdConnect, sizeof(m_aCmdConnect), true); -} - -void CClient::HandleConnectLink(const char *pLink) -{ - // Chrome works fine with ddnet:// but not with ddnet: - // Check ddnet:// before ddnet: because we don't want the // as part of connect command - if(str_startswith(pLink, CONNECTLINK_DOUBLE_SLASH)) - str_copy(m_aCmdConnect, pLink + sizeof(CONNECTLINK_DOUBLE_SLASH) - 1); - else if(str_startswith(pLink, CONNECTLINK_NO_SLASH)) - str_copy(m_aCmdConnect, pLink + sizeof(CONNECTLINK_NO_SLASH) - 1); - else - str_copy(m_aCmdConnect, pLink); - // Edge appends / to the URL - const int len = str_length(m_aCmdConnect); - if(m_aCmdConnect[len - 1] == '/') - m_aCmdConnect[len - 1] = '\0'; -} - -void CClient::HandleDemoPath(const char *pPath) -{ - str_copy(m_aCmdPlayDemo, pPath); -} - -void CClient::HandleMapPath(const char *pPath) -{ - str_copy(m_aCmdEditMap, pPath); -} - -static bool UnknownArgumentCallback(const char *pCommand, void *pUser) -{ - CClient *pClient = static_cast(pUser); - if(str_startswith(pCommand, CONNECTLINK_NO_SLASH)) - { - pClient->HandleConnectLink(pCommand); - return true; - } - else if(str_endswith(pCommand, ".demo")) - { - pClient->HandleDemoPath(pCommand); - return true; - } - else if(str_endswith(pCommand, ".map")) - { - pClient->HandleMapPath(pCommand); - return true; - } - return false; -} - -static bool SaveUnknownCommandCallback(const char *pCommand, void *pUser) -{ - CClient *pClient = static_cast(pUser); - pClient->ConfigManager()->StoreUnknownCommand(pCommand); - return true; -} - -static Uint32 GetSdlMessageBoxFlags(IClient::EMessageBoxType Type) -{ - switch(Type) - { - case IClient::MESSAGE_BOX_TYPE_ERROR: - return SDL_MESSAGEBOX_ERROR; - case IClient::MESSAGE_BOX_TYPE_WARNING: - return SDL_MESSAGEBOX_WARNING; - case IClient::MESSAGE_BOX_TYPE_INFO: - return SDL_MESSAGEBOX_INFORMATION; - } - dbg_assert(false, "Type invalid"); - return 0; -} - -static void ShowMessageBox(const char *pTitle, const char *pMessage, IClient::EMessageBoxType Type = IClient::MESSAGE_BOX_TYPE_ERROR) -{ - SDL_ShowSimpleMessageBox(GetSdlMessageBoxFlags(Type), pTitle, pMessage, nullptr); -} - -/* - Server Time - Client Mirror Time - Client Predicted Time - - Snapshot Latency - Downstream latency - - Prediction Latency - Upstream latency -*/ - -#if defined(CONF_PLATFORM_MACOS) -extern "C" int TWMain(int argc, const char **argv) -#elif defined(CONF_PLATFORM_ANDROID) -static int gs_AndroidStarted = false; -extern "C" __attribute__((visibility("default"))) int SDL_main(int argc, char *argv[]); -int SDL_main(int argc, char *argv2[]) -#else -int main(int argc, const char **argv) -#endif -{ - const int64_t MainStart = time_get(); - -#if defined(CONF_PLATFORM_ANDROID) - const char **argv = const_cast(argv2); - // Android might not unload the library from memory, causing globals like gs_AndroidStarted - // not to be initialized correctly when starting the app again. - if(gs_AndroidStarted) - { - ::ShowMessageBox("Android Error", "The app was started, but not closed properly, this causes bugs. Please restart or manually close this task."); - std::exit(0); - } - gs_AndroidStarted = true; -#elif defined(CONF_FAMILY_WINDOWS) - CWindowsComLifecycle WindowsComLifecycle(true); -#endif - CCmdlineFix CmdlineFix(&argc, &argv); - -#if defined(CONF_EXCEPTION_HANDLING) - init_exception_handler(); -#endif - - std::vector> vpLoggers; - std::shared_ptr pStdoutLogger = nullptr; -#if defined(CONF_PLATFORM_ANDROID) - pStdoutLogger = std::shared_ptr(log_logger_android()); -#else - bool Silent = false; - for(int i = 1; i < argc; i++) - { - if(str_comp("-s", argv[i]) == 0 || str_comp("--silent", argv[i]) == 0) - { - Silent = true; - } - } - if(!Silent) - { - pStdoutLogger = std::shared_ptr(log_logger_stdout()); - } -#endif - if(pStdoutLogger) - { - vpLoggers.push_back(pStdoutLogger); - } - std::shared_ptr pFutureFileLogger = std::make_shared(); - vpLoggers.push_back(pFutureFileLogger); - std::shared_ptr pFutureConsoleLogger = std::make_shared(); - vpLoggers.push_back(pFutureConsoleLogger); - std::shared_ptr pFutureAssertionLogger = std::make_shared(); - vpLoggers.push_back(pFutureAssertionLogger); - log_set_global_logger(log_logger_collection(std::move(vpLoggers)).release()); - -#if defined(CONF_PLATFORM_ANDROID) - // Initialize Android after logger is available - const char *pAndroidInitError = InitAndroid(); - if(pAndroidInitError != nullptr) - { - log_error("android", "%s", pAndroidInitError); - ::ShowMessageBox("Android Error", pAndroidInitError); - std::exit(0); - } -#endif - - std::stack> CleanerFunctions; - std::function PerformCleanup = [&CleanerFunctions]() mutable { - while(!CleanerFunctions.empty()) - { - CleanerFunctions.top()(); - CleanerFunctions.pop(); - } - }; - std::function PerformFinalCleanup = []() { -#ifdef CONF_PLATFORM_ANDROID - // Forcefully terminate the entire process, to ensure that static variables - // will be initialized correctly when the app is started again after quitting. - // Returning from the main function is not enough, as this only results in the - // native thread terminating, but the Java thread will continue. Java does not - // support unloading libraries once they have been loaded, so all static - // variables will not have their expected initial values anymore when the app - // is started again after quitting. The variable gs_AndroidStarted above is - // used to check that static variables have been initialized properly. - // TODO: This is not the correct way to close an activity on Android, as it - // ignores the activity lifecycle entirely, which may cause issues if - // we ever used any global resources like the camera. - std::exit(0); -#endif - }; - std::function PerformAllCleanup = [PerformCleanup, PerformFinalCleanup]() mutable { - PerformCleanup(); - PerformFinalCleanup(); - }; - - const bool RandInitFailed = secure_random_init() != 0; - if(!RandInitFailed) - CleanerFunctions.emplace([]() { secure_random_uninit(); }); - - // Register SDL for cleanup before creating the kernel and client, - // so SDL is shutdown after kernel and client. Otherwise the client - // may crash when shutting down after SDL is already shutdown. - CleanerFunctions.emplace([]() { SDL_Quit(); }); - - CClient *pClient = CreateClient(); - pClient->SetLoggers(pFutureFileLogger, std::move(pStdoutLogger)); - - IKernel *pKernel = IKernel::Create(); - pKernel->RegisterInterface(pClient, false); - pClient->RegisterInterfaces(); - CleanerFunctions.emplace([pKernel, pClient]() { - // Ensure that the assert handler doesn't use the client/graphics after they've been destroyed - dbg_assert_set_handler(nullptr); - pKernel->Shutdown(); - delete pKernel; - delete pClient; - }); - - const std::thread::id MainThreadId = std::this_thread::get_id(); - dbg_assert_set_handler([MainThreadId, pClient](const char *pMsg) { - if(MainThreadId != std::this_thread::get_id()) - return; - char aVersionStr[128]; - if(!os_version_str(aVersionStr, sizeof(aVersionStr))) - str_copy(aVersionStr, "unknown"); - char aGpuInfo[256]; - pClient->GetGpuInfoString(aGpuInfo); - char aMessage[768]; - str_format(aMessage, sizeof(aMessage), - "An assertion error occurred. Please write down or take a screenshot of the following information and report this error.\n" - "Please also share the assert log which you should find in the 'dumps' folder in your config directory.\n\n" - "%s\n\n" - "Platform: %s\n" - "Game version: %s %s\n" - "OS version: %s\n\n" - "%s", // GPU info - pMsg, CONF_PLATFORM_STRING, GAME_RELEASE_VERSION, GIT_SHORTREV_HASH != nullptr ? GIT_SHORTREV_HASH : "", aVersionStr, - aGpuInfo); - pClient->ShowMessageBox("Assertion Error", aMessage); - // Client will crash due to assertion, don't call PerformAllCleanup in this inconsistent state - }); - - // create the components - IEngine *pEngine = CreateEngine(GAME_NAME, pFutureConsoleLogger, 2 * std::thread::hardware_concurrency() + 2); - pKernel->RegisterInterface(pEngine, false); - CleanerFunctions.emplace([pEngine]() { - // Engine has to be destroyed before the graphics so that skin download thread can finish - delete pEngine; - }); - - IStorage *pStorage = CreateStorage(IStorage::STORAGETYPE_CLIENT, argc, argv); - pKernel->RegisterInterface(pStorage); - - pFutureAssertionLogger->Set(CreateAssertionLogger(pStorage, GAME_NAME)); - -#if defined(CONF_EXCEPTION_HANDLING) - char aBufPath[IO_MAX_PATH_LENGTH]; - char aBufName[IO_MAX_PATH_LENGTH]; - char aDate[64]; - str_timestamp(aDate, sizeof(aDate)); - str_format(aBufName, sizeof(aBufName), "dumps/" GAME_NAME "_%s_crash_log_%s_%d_%s.RTP", CONF_PLATFORM_STRING, aDate, pid(), GIT_SHORTREV_HASH != nullptr ? GIT_SHORTREV_HASH : ""); - pStorage->GetCompletePath(IStorage::TYPE_SAVE, aBufName, aBufPath, sizeof(aBufPath)); - set_exception_handler_log_file(aBufPath); -#endif - - if(RandInitFailed) - { - const char *pError = "Failed to initialize the secure RNG."; - log_error("secure", "%s", pError); - pClient->ShowMessageBox("Secure RNG Error", pError); - PerformAllCleanup(); - return -1; - } - - IConsole *pConsole = CreateConsole(CFGFLAG_CLIENT).release(); - pKernel->RegisterInterface(pConsole); - - IConfigManager *pConfigManager = CreateConfigManager(); - pKernel->RegisterInterface(pConfigManager); - - IEngineSound *pEngineSound = CreateEngineSound(); - pKernel->RegisterInterface(pEngineSound); // IEngineSound - pKernel->RegisterInterface(static_cast(pEngineSound), false); - - IEngineInput *pEngineInput = CreateEngineInput(); - pKernel->RegisterInterface(pEngineInput); // IEngineInput - pKernel->RegisterInterface(static_cast(pEngineInput), false); - - IEngineTextRender *pEngineTextRender = CreateEngineTextRender(); - pKernel->RegisterInterface(pEngineTextRender); // IEngineTextRender - pKernel->RegisterInterface(static_cast(pEngineTextRender), false); - - IEngineMap *pEngineMap = CreateEngineMap(); - pKernel->RegisterInterface(pEngineMap); // IEngineMap - pKernel->RegisterInterface(static_cast(pEngineMap), false); - - IDiscord *pDiscord = CreateDiscord(); - pKernel->RegisterInterface(pDiscord); - - ISteam *pSteam = CreateSteam(); - pKernel->RegisterInterface(pSteam); - - INotifications *pNotifications = CreateNotifications(); - pKernel->RegisterInterface(pNotifications); - - pKernel->RegisterInterface(CreateEditor(), false); - pKernel->RegisterInterface(CreateFavorites().release()); - pKernel->RegisterInterface(CreateGameClient()); - - pEngine->Init(); - pConsole->Init(); - pConfigManager->Init(); - pNotifications->Init(GAME_NAME " Client"); - - // register all console commands - pClient->RegisterCommands(); - - pKernel->RequestInterface()->OnConsoleInit(); - - // init client's interfaces - pClient->InitInterfaces(); - - // execute config file - if(pStorage->FileExists(CONFIG_FILE, IStorage::TYPE_ALL)) - { - pConsole->SetUnknownCommandCallback(SaveUnknownCommandCallback, pClient); - if(!pConsole->ExecuteFile(CONFIG_FILE)) - { - const char *pError = "Failed to load config from '" CONFIG_FILE "'."; - log_error("client", "%s", pError); - pClient->ShowMessageBox("Config File Error", pError); - PerformAllCleanup(); - return -1; - } - pConsole->SetUnknownCommandCallback(IConsole::EmptyUnknownCommandCallback, nullptr); - } - - // execute autoexec file - if(pStorage->FileExists(AUTOEXEC_CLIENT_FILE, IStorage::TYPE_ALL)) - { - pConsole->ExecuteFile(AUTOEXEC_CLIENT_FILE); - } - else // fallback - { - pConsole->ExecuteFile(AUTOEXEC_FILE); - } - - if(g_Config.m_ClConfigVersion < 1) - { - if(g_Config.m_ClAntiPing == 0) - { - g_Config.m_ClAntiPingPlayers = 1; - g_Config.m_ClAntiPingGrenade = 1; - g_Config.m_ClAntiPingWeapons = 1; - } - } - g_Config.m_ClConfigVersion = 1; - - // parse the command line arguments - pConsole->SetUnknownCommandCallback(UnknownArgumentCallback, pClient); - pConsole->ParseArguments(argc - 1, &argv[1]); - pConsole->SetUnknownCommandCallback(IConsole::EmptyUnknownCommandCallback, nullptr); - - if(pSteam->GetConnectAddress()) - { - pClient->HandleConnectAddress(pSteam->GetConnectAddress()); - pSteam->ClearConnectAddress(); - } - - if(g_Config.m_Logfile[0]) - { - const int Mode = g_Config.m_Logappend ? IOFLAG_APPEND : IOFLAG_WRITE; - IOHANDLE Logfile = pStorage->OpenFile(g_Config.m_Logfile, Mode, IStorage::TYPE_SAVE_OR_ABSOLUTE); - if(Logfile) - { - pFutureFileLogger->Set(log_logger_file(Logfile)); - } - else - { - log_error("client", "failed to open '%s' for logging", g_Config.m_Logfile); - pFutureFileLogger->Set(log_logger_noop()); - } - } - else - { - pFutureFileLogger->Set(log_logger_noop()); - } - - // Register protocol and file extensions -#if defined(CONF_FAMILY_WINDOWS) - pClient->ShellRegister(); -#endif - - // Do not automatically translate touch events to mouse events and vice versa. - SDL_SetHint("SDL_TOUCH_MOUSE_EVENTS", "0"); - SDL_SetHint("SDL_MOUSE_TOUCH_EVENTS", "0"); - - // Support longer IME composition strings (enables SDL_TEXTEDITING_EXT). -#if SDL_VERSION_ATLEAST(2, 0, 22) - SDL_SetHint(SDL_HINT_IME_SUPPORT_EXTENDED_TEXT, "1"); -#endif - -#if defined(CONF_PLATFORM_MACOS) - // Hints will not be set if there is an existing override hint or environment variable that takes precedence. - // So this respects cli environment overrides. - SDL_SetHint("SDL_MAC_OPENGL_ASYNC_DISPATCH", "1"); -#endif - -#if defined(CONF_FAMILY_WINDOWS) - SDL_SetHint("SDL_IME_SHOW_UI", g_Config.m_InpImeNativeUi ? "1" : "0"); -#else - SDL_SetHint("SDL_IME_SHOW_UI", "1"); -#endif - -#if defined(CONF_PLATFORM_ANDROID) - // Trap the Android back button so it can be handled in our code reliably - // instead of letting the system handle it. - SDL_SetHint("SDL_ANDROID_TRAP_BACK_BUTTON", "1"); - // Force landscape screen orientation. - SDL_SetHint("SDL_IOS_ORIENTATIONS", "LandscapeLeft LandscapeRight"); -#endif - - // init SDL - if(SDL_Init(0) < 0) - { - char aError[256]; - str_format(aError, sizeof(aError), "Unable to initialize SDL base: %s", SDL_GetError()); - log_error("client", "%s", aError); - pClient->ShowMessageBox("SDL Error", aError); - PerformAllCleanup(); - return -1; - } - - // run the client - log_trace("client", "initialization finished after %.2fms, starting...", (time_get() - MainStart) * 1000.0f / (float)time_freq()); - pClient->Run(); - - const bool Restarting = pClient->State() == CClient::STATE_RESTARTING; -#if !defined(CONF_PLATFORM_ANDROID) - char aRestartBinaryPath[IO_MAX_PATH_LENGTH]; - if(Restarting) - { - pStorage->GetBinaryPath(PLAT_CLIENT_EXEC, aRestartBinaryPath, sizeof(aRestartBinaryPath)); - } -#endif - - std::vector vQuittingWarnings = pClient->QuittingWarnings(); - - PerformCleanup(); - - for(const SWarning &Warning : vQuittingWarnings) - { - ::ShowMessageBox(Warning.m_aWarningTitle, Warning.m_aWarningMsg); - } - - if(Restarting) - { -#if defined(CONF_PLATFORM_ANDROID) - RestartAndroidApp(); -#else - shell_execute(aRestartBinaryPath, EShellExecuteWindowState::FOREGROUND); -#endif - } - - PerformFinalCleanup(); - - return 0; -} - -// DDRace - -const char *CClient::GetCurrentMap() const -{ - return m_aCurrentMap; -} - -const char *CClient::GetCurrentMapPath() const -{ - return m_aCurrentMapPath; -} - -SHA256_DIGEST CClient::GetCurrentMapSha256() const -{ - return m_pMap->Sha256(); -} - -unsigned CClient::GetCurrentMapCrc() const -{ - return m_pMap->Crc(); -} - -void CClient::RaceRecord_Start(const char *pFilename) -{ - if(State() != IClient::STATE_ONLINE) - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demorec/record", "client is not online"); - else - m_aDemoRecorder[RECORDER_RACE].Start( - Storage(), - m_pConsole, - pFilename, - IsSixup() ? GameClient()->NetVersion7() : GameClient()->NetVersion(), - m_aCurrentMap, - m_pMap->Sha256(), - m_pMap->Crc(), - "client", - m_pMap->MapSize(), - 0, - m_pMap->File(), - nullptr, - nullptr); -} - -void CClient::RaceRecord_Stop() -{ - if(m_aDemoRecorder[RECORDER_RACE].IsRecording()) - { - m_aDemoRecorder[RECORDER_RACE].Stop(IDemoRecorder::EStopMode::KEEP_FILE); - } -} - -bool CClient::RaceRecord_IsRecording() -{ - return m_aDemoRecorder[RECORDER_RACE].IsRecording(); -} - -void CClient::RequestDDNetInfo() -{ - if(m_pDDNetInfoTask && !m_pDDNetInfoTask->Done()) - return; - - char aUrl[256]; - str_copy(aUrl, DDNET_INFO_URL); - - if(g_Config.m_BrIndicateFinished) - { - char aEscaped[128]; - EscapeUrl(aEscaped, sizeof(aEscaped), PlayerName()); - str_append(aUrl, "?name="); - str_append(aUrl, aEscaped); - } - - // Use ipv4 so we can know the ingame ip addresses of players before they join game servers - m_pDDNetInfoTask = HttpGet(aUrl); - m_pDDNetInfoTask->Timeout(CTimeout{10000, 0, 500, 10}); - m_pDDNetInfoTask->IpResolve(IPRESOLVE::V4); - Http()->Run(m_pDDNetInfoTask); -} - -int CClient::GetPredictionTime() -{ - int64_t Now = time_get(); - return (int)((m_PredictedTime.Get(Now) - m_aGameTime[g_Config.m_ClDummy].Get(Now)) * 1000 / (float)time_freq()); -} - -void CClient::GetSmoothTick(int *pSmoothTick, float *pSmoothIntraTick, float MixAmount) -{ - int64_t GameTime = m_aGameTime[g_Config.m_ClDummy].Get(time_get()); - int64_t PredTime = m_PredictedTime.Get(time_get()); - int64_t SmoothTime = clamp(GameTime + (int64_t)(MixAmount * (PredTime - GameTime)), GameTime, PredTime); - - *pSmoothTick = (int)(SmoothTime * GameTickSpeed() / time_freq()) + 1; - *pSmoothIntraTick = (SmoothTime - (*pSmoothTick - 1) * time_freq() / GameTickSpeed()) / (float)(time_freq() / GameTickSpeed()); -} - -void CClient::AddWarning(const SWarning &Warning) -{ - const std::unique_lock Lock(m_WarningsMutex); - m_vWarnings.emplace_back(Warning); -} - -std::optional CClient::CurrentWarning() -{ - const std::unique_lock Lock(m_WarningsMutex); - if(m_vWarnings.empty()) - { - return std::nullopt; - } - else - { - std::optional Result = std::make_optional(m_vWarnings[0]); - m_vWarnings.erase(m_vWarnings.begin()); - return Result; - } -} - -int CClient::MaxLatencyTicks() const -{ - return GameTickSpeed() + (PredictionMargin() * GameTickSpeed()) / 1000; -} - -int CClient::PredictionMargin() const -{ - return m_ServerCapabilities.m_SyncWeaponInput ? g_Config.m_ClPredictionMargin : 10; -} - -int CClient::UdpConnectivity(int NetType) -{ - static const int NETTYPES[2] = {NETTYPE_IPV6, NETTYPE_IPV4}; - int Connectivity = CONNECTIVITY_UNKNOWN; - for(int PossibleNetType : NETTYPES) - { - if((NetType & PossibleNetType) == 0) - { - continue; - } - NETADDR GlobalUdpAddr; - int NewConnectivity; - switch(m_aNetClient[CONN_MAIN].GetConnectivity(PossibleNetType, &GlobalUdpAddr)) - { - case CONNECTIVITY::UNKNOWN: - NewConnectivity = CONNECTIVITY_UNKNOWN; - break; - case CONNECTIVITY::CHECKING: - NewConnectivity = CONNECTIVITY_CHECKING; - break; - case CONNECTIVITY::UNREACHABLE: - NewConnectivity = CONNECTIVITY_UNREACHABLE; - break; - case CONNECTIVITY::REACHABLE: - NewConnectivity = CONNECTIVITY_REACHABLE; - break; - case CONNECTIVITY::ADDRESS_KNOWN: - GlobalUdpAddr.port = 0; - if(m_HaveGlobalTcpAddr && NetType == (int)m_GlobalTcpAddr.type && net_addr_comp(&m_GlobalTcpAddr, &GlobalUdpAddr) != 0) - { - NewConnectivity = CONNECTIVITY_DIFFERING_UDP_TCP_IP_ADDRESSES; - break; - } - NewConnectivity = CONNECTIVITY_REACHABLE; - break; - default: - dbg_assert(0, "invalid connectivity value"); - return CONNECTIVITY_UNKNOWN; - } - Connectivity = std::max(Connectivity, NewConnectivity); - } - return Connectivity; -} - -bool CClient::ViewLink(const char *pLink) -{ -#if defined(CONF_PLATFORM_ANDROID) - if(SDL_OpenURL(pLink) == 0) - { - return true; - } - log_error("client", "Failed to open link '%s' (%s)", pLink, SDL_GetError()); - return false; -#else - if(open_link(pLink)) - { - return true; - } - log_error("client", "Failed to open link '%s'", pLink); - return false; -#endif -} - -bool CClient::ViewFile(const char *pFilename) -{ -#if defined(CONF_PLATFORM_MACOS) - return ViewLink(pFilename); -#else - // Create a file link so the path can contain forward and - // backward slashes. But the file link must be absolute. - char aWorkingDir[IO_MAX_PATH_LENGTH]; - if(fs_is_relative_path(pFilename)) - { - if(!fs_getcwd(aWorkingDir, sizeof(aWorkingDir))) - { - log_error("client", "Failed to open file '%s' (failed to get working directory)", pFilename); - return false; - } - str_append(aWorkingDir, "/"); - } - else - aWorkingDir[0] = '\0'; - - char aFileLink[IO_MAX_PATH_LENGTH]; - str_format(aFileLink, sizeof(aFileLink), "file://%s%s", aWorkingDir, pFilename); - return ViewLink(aFileLink); -#endif -} - -#if defined(CONF_FAMILY_WINDOWS) -void CClient::ShellRegister() -{ - char aFullPath[IO_MAX_PATH_LENGTH]; - Storage()->GetBinaryPathAbsolute(PLAT_CLIENT_EXEC, aFullPath, sizeof(aFullPath)); - if(!aFullPath[0]) - { - log_error("client", "Failed to register protocol and file extensions: could not determine absolute path"); - return; - } - - bool Updated = false; - if(!shell_register_protocol("ddnet", aFullPath, &Updated)) - log_error("client", "Failed to register ddnet protocol"); - if(!shell_register_extension(".map", "Map File", GAME_NAME, aFullPath, &Updated)) - log_error("client", "Failed to register .map file extension"); - if(!shell_register_extension(".demo", "Demo File", GAME_NAME, aFullPath, &Updated)) - log_error("client", "Failed to register .demo file extension"); - if(!shell_register_application(GAME_NAME, aFullPath, &Updated)) - log_error("client", "Failed to register application"); - if(Updated) - shell_update(); -} - -void CClient::ShellUnregister() -{ - char aFullPath[IO_MAX_PATH_LENGTH]; - Storage()->GetBinaryPathAbsolute(PLAT_CLIENT_EXEC, aFullPath, sizeof(aFullPath)); - if(!aFullPath[0]) - { - log_error("client", "Failed to unregister protocol and file extensions: could not determine absolute path"); - return; - } - - bool Updated = false; - if(!shell_unregister_class("ddnet", &Updated)) - log_error("client", "Failed to unregister ddnet protocol"); - if(!shell_unregister_class(GAME_NAME ".map", &Updated)) - log_error("client", "Failed to unregister .map file extension"); - if(!shell_unregister_class(GAME_NAME ".demo", &Updated)) - log_error("client", "Failed to unregister .demo file extension"); - if(!shell_unregister_application(aFullPath, &Updated)) - log_error("client", "Failed to unregister application"); - if(Updated) - shell_update(); -} -#endif - -void CClient::ShowMessageBox(const char *pTitle, const char *pMessage, EMessageBoxType Type) -{ - if(m_pGraphics == nullptr || !m_pGraphics->ShowMessageBox(GetSdlMessageBoxFlags(Type), pTitle, pMessage)) - ::ShowMessageBox(pTitle, pMessage, Type); -} - -void CClient::GetGpuInfoString(char (&aGpuInfo)[256]) -{ - if(m_pGraphics != nullptr && m_pGraphics->IsBackendInitialized()) - { - str_format(aGpuInfo, std::size(aGpuInfo), "GPU: %s - %s - %s", m_pGraphics->GetVendorString(), m_pGraphics->GetRendererString(), m_pGraphics->GetVersionString()); - } - else - { - str_copy(aGpuInfo, "Graphics backend was not yet initialized."); - } -} - -void CClient::SetLoggers(std::shared_ptr &&pFileLogger, std::shared_ptr &&pStdoutLogger) -{ - m_pFileLogger = pFileLogger; - m_pStdoutLogger = pStdoutLogger; -} diff --git a/src/engine/client/client.h b/src/engine/client/client.h deleted file mode 100644 index f05d784861..0000000000 --- a/src/engine/client/client.h +++ /dev/null @@ -1,532 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef ENGINE_CLIENT_CLIENT_H -#define ENGINE_CLIENT_CLIENT_H - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "graph.h" -#include "smooth_time.h" - -class CDemoEdit; -class IDemoRecorder; -class CMsgPacker; -class CUnpacker; -class IConfigManager; -class IDiscord; -class IEngine; -class IEngineInput; -class IEngineMap; -class IEngineSound; -class IFriends; -class ILogger; -class ISteam; -class INotifications; -class IStorage; -class IUpdater; - -#define CONNECTLINK_DOUBLE_SLASH "ddnet://" -#define CONNECTLINK_NO_SLASH "ddnet:" - -class CServerCapabilities -{ -public: - bool m_ChatTimeoutCode = false; - bool m_AnyPlayerFlag = false; - bool m_PingEx = false; - bool m_AllowDummy = false; - bool m_SyncWeaponInput = false; -}; - -class CClient : public IClient, public CDemoPlayer::IListener -{ - // needed interfaces - IConfigManager *m_pConfigManager = nullptr; - CConfig *m_pConfig = nullptr; - IConsole *m_pConsole = nullptr; - IDiscord *m_pDiscord = nullptr; - IEditor *m_pEditor = nullptr; - IEngine *m_pEngine = nullptr; - IFavorites *m_pFavorites = nullptr; - IGameClient *m_pGameClient = nullptr; - IEngineGraphics *m_pGraphics = nullptr; - IEngineInput *m_pInput = nullptr; - IEngineMap *m_pMap = nullptr; - IEngineSound *m_pSound = nullptr; - ISteam *m_pSteam = nullptr; - INotifications *m_pNotifications = nullptr; - IStorage *m_pStorage = nullptr; - IEngineTextRender *m_pTextRender = nullptr; - IUpdater *m_pUpdater = nullptr; - CHttp m_Http; - - CNetClient m_aNetClient[NUM_CONNS]; - CDemoPlayer m_DemoPlayer; - CDemoRecorder m_aDemoRecorder[RECORDER_MAX]; - CDemoEditor m_DemoEditor; - CGhostRecorder m_GhostRecorder; - CGhostLoader m_GhostLoader; - CServerBrowser m_ServerBrowser; - CUpdater m_Updater; - CFriends m_Friends; - CFriends m_Foes; - - char m_aConnectAddressStr[MAX_SERVER_ADDRESSES * NETADDR_MAXSTRSIZE] = ""; - - CUuid m_ConnectionId = UUID_ZEROED; - bool m_Sixup; - - bool m_HaveGlobalTcpAddr = false; - NETADDR m_GlobalTcpAddr = NETADDR_ZEROED; - - uint64_t m_aSnapshotParts[NUM_DUMMIES] = {0, 0}; - int64_t m_LocalStartTime = 0; - int64_t m_GlobalStartTime = 0; - - IGraphics::CTextureHandle m_DebugFont; - - int64_t m_LastRenderTime; - - int m_SnapCrcErrors = 0; - bool m_AutoScreenshotRecycle = false; - bool m_AutoStatScreenshotRecycle = false; - bool m_AutoCSVRecycle = false; - bool m_EditorActive = false; - - int m_aAckGameTick[NUM_DUMMIES] = {-1, -1}; - int m_aCurrentRecvTick[NUM_DUMMIES] = {0, 0}; - int m_aRconAuthed[NUM_DUMMIES] = {0, 0}; - char m_aRconUsername[32] = ""; - char m_aRconPassword[sizeof(g_Config.m_SvRconPassword)] = ""; - int m_UseTempRconCommands = 0; - int m_ExpectedRconCommands = -1; - int m_GotRconCommands = 0; - char m_aPassword[sizeof(g_Config.m_Password)] = ""; - bool m_SendPassword = false; - - // version-checking - char m_aVersionStr[10] = "0"; - - // pinging - int64_t m_PingStartTime = 0; - - char m_aCurrentMap[IO_MAX_PATH_LENGTH] = ""; - char m_aCurrentMapPath[IO_MAX_PATH_LENGTH] = ""; - - char m_aTimeoutCodes[NUM_DUMMIES][32] = {"", ""}; - bool m_aCodeRunAfterJoin[NUM_DUMMIES] = {false, false}; - bool m_GenerateTimeoutSeed = true; - - char m_aCmdConnect[256] = ""; - char m_aCmdPlayDemo[IO_MAX_PATH_LENGTH] = ""; - char m_aCmdEditMap[IO_MAX_PATH_LENGTH] = ""; - - // map download - char m_aMapDownloadUrl[256] = ""; - std::shared_ptr m_pMapdownloadTask = nullptr; - char m_aMapdownloadFilename[256] = ""; - char m_aMapdownloadFilenameTemp[256] = ""; - char m_aMapdownloadName[256] = ""; - IOHANDLE m_MapdownloadFileTemp = 0; - int m_MapdownloadChunk = 0; - int m_MapdownloadCrc = 0; - int m_MapdownloadAmount = -1; - int m_MapdownloadTotalsize = -1; - bool m_MapdownloadSha256Present = false; - SHA256_DIGEST m_MapdownloadSha256 = SHA256_ZEROED; - - bool m_MapDetailsPresent = false; - char m_aMapDetailsName[256] = ""; - int m_MapDetailsCrc = 0; - SHA256_DIGEST m_MapDetailsSha256 = SHA256_ZEROED; - char m_aMapDetailsUrl[256] = ""; - - std::shared_ptr m_pDDNetInfoTask = nullptr; - - // time - CSmoothTime m_aGameTime[NUM_DUMMIES]; - CSmoothTime m_PredictedTime; - - // input - struct // TODO: handle input better - { - int m_aData[MAX_INPUT_SIZE]; // the input data - int m_Tick; // the tick that the input is for - int64_t m_PredictedTime; // prediction latency when we sent this input - int64_t m_PredictionMargin; // prediction margin when we sent this input - int64_t m_Time; - } m_aInputs[NUM_DUMMIES][200]; - - int m_aCurrentInput[NUM_DUMMIES] = {0, 0}; - bool m_LastDummy = false; - bool m_DummySendConnInfo = false; - bool m_DummyConnecting = false; - bool m_DummyConnected = false; - float m_LastDummyConnectTime = 0.0f; - bool m_DummyReconnectOnReload = false; - bool m_DummyDeactivateOnReconnect = false; - - // graphs - CGraph m_InputtimeMarginGraph; - CGraph m_aGametimeMarginGraphs[NUM_DUMMIES]; - CGraph m_FpsGraph; - - // the game snapshots are modifiable by the game - CSnapshotStorage m_aSnapshotStorage[NUM_DUMMIES]; - CSnapshotStorage::CHolder *m_aapSnapshots[NUM_DUMMIES][NUM_SNAPSHOT_TYPES]; - - int m_aReceivedSnapshots[NUM_DUMMIES] = {0, 0}; - char m_aaSnapshotIncomingData[NUM_DUMMIES][CSnapshot::MAX_SIZE]; - int m_aSnapshotIncomingDataSize[NUM_DUMMIES] = {0, 0}; - - CSnapshotStorage::CHolder m_aDemorecSnapshotHolders[NUM_SNAPSHOT_TYPES]; - char m_aaaDemorecSnapshotData[NUM_SNAPSHOT_TYPES][2][CSnapshot::MAX_SIZE]; - - CSnapshotDelta m_SnapshotDelta; - - std::deque> m_EditJobs; - - // - bool m_CanReceiveServerCapabilities = false; - bool m_ServerSentCapabilities = false; - CServerCapabilities m_ServerCapabilities; - - bool ServerCapAnyPlayerFlag() const override { return m_ServerCapabilities.m_AnyPlayerFlag; } - - CServerInfo m_CurrentServerInfo; - int64_t m_CurrentServerInfoRequestTime = -1; // >= 0 should request, == -1 got info - - int m_CurrentServerPingInfoType = -1; - int m_CurrentServerPingBasicToken = -1; - int m_CurrentServerPingToken = -1; - CUuid m_CurrentServerPingUuid = UUID_ZEROED; - int64_t m_CurrentServerCurrentPingTime = -1; // >= 0 request running - int64_t m_CurrentServerNextPingTime = -1; // >= 0 should request - - // version info - struct CVersionInfo - { - enum - { - STATE_INIT = 0, - STATE_START, - STATE_READY, - }; - - int m_State = STATE_INIT; - } m_VersionInfo; - - std::mutex m_WarningsMutex; - std::vector m_vWarnings; - std::vector m_vQuittingWarnings; - - CFifo m_Fifo; - - IOHANDLE m_BenchmarkFile = 0; - int64_t m_BenchmarkStopTime = 0; - - CChecksum m_Checksum; - int64_t m_OwnExecutableSize = 0; - IOHANDLE m_OwnExecutable = 0; - - // favorite command handling - bool m_FavoritesGroup = false; - bool m_FavoritesGroupAllowPing = false; - int m_FavoritesGroupNum = 0; - NETADDR m_aFavoritesGroupAddresses[MAX_SERVER_ADDRESSES]; - - void UpdateDemoIntraTimers(); - int MaxLatencyTicks() const; - int PredictionMargin() const; - - std::shared_ptr m_pFileLogger = nullptr; - std::shared_ptr m_pStdoutLogger = nullptr; - - // For DummyName function - char m_aAutomaticDummyName[MAX_NAME_LENGTH]; - -public: - IConfigManager *ConfigManager() { return m_pConfigManager; } - CConfig *Config() { return m_pConfig; } - IDiscord *Discord() { return m_pDiscord; } - IEngine *Engine() { return m_pEngine; } - IGameClient *GameClient() { return m_pGameClient; } - IEngineGraphics *Graphics() { return m_pGraphics; } - IEngineInput *Input() { return m_pInput; } - IEngineSound *Sound() { return m_pSound; } - ISteam *Steam() { return m_pSteam; } - INotifications *Notifications() { return m_pNotifications; } - IStorage *Storage() { return m_pStorage; } - IEngineTextRender *TextRender() { return m_pTextRender; } - IUpdater *Updater() { return m_pUpdater; } - IHttp *Http() { return &m_Http; } - - CClient(); - - // ----- send functions ----- - int SendMsg(int Conn, CMsgPacker *pMsg, int Flags) override; - // Send via the currently active client (main/dummy) - int SendMsgActive(CMsgPacker *pMsg, int Flags) override; - - void SendInfo(int Conn); - void SendEnterGame(int Conn); - void SendReady(int Conn); - void SendMapRequest(); - - bool RconAuthed() const override { return m_aRconAuthed[g_Config.m_ClDummy] != 0; } - bool UseTempRconCommands() const override { return m_UseTempRconCommands != 0; } - void RconAuth(const char *pName, const char *pPassword, bool Dummy = g_Config.m_ClDummy) override; - void Rcon(const char *pCmd) override; - bool ReceivingRconCommands() const override { return m_ExpectedRconCommands > 0; } - float GotRconCommandsPercentage() const override; - - bool ConnectionProblems() const override; - - IGraphics::CTextureHandle GetDebugFont() const override { return m_DebugFont; } - - void SendInput(); - - // TODO: OPT: do this a lot smarter! - int *GetInput(int Tick, int IsDummy) const override; - - const char *LatestVersion() const override; - - // ------ state handling ----- - void SetState(EClientState State); - - // called when the map is loaded and we should init for a new round - void OnEnterGame(bool Dummy); - void EnterGame(int Conn) override; - - void Connect(const char *pAddress, const char *pPassword = nullptr) override; - void DisconnectWithReason(const char *pReason); - void Disconnect() override; - - void DummyDisconnect(const char *pReason) override; - void DummyConnect() override; - bool DummyConnected() const override; - bool DummyConnecting() const override; - bool DummyConnectingDelayed() const override; - bool DummyAllowed() const override; - - void GetServerInfo(CServerInfo *pServerInfo) const override; - void ServerInfoRequest(); - - void LoadDebugFont(); - - // --- - - int GetPredictionTime() override; - CSnapItem SnapGetItem(int SnapId, int Index) const override; - const void *SnapFindItem(int SnapId, int Type, int Id) const override; - int SnapNumItems(int SnapId) const override; - void SnapSetStaticsize(int ItemType, int Size) override; - void SnapSetStaticsize7(int ItemType, int Size) override; - - void Render(); - void DebugRender(); - - void Restart() override; - void Quit() override; - - const char *PlayerName() const override; - const char *DummyName() override; - const char *ErrorString() const override; - - const char *LoadMap(const char *pName, const char *pFilename, SHA256_DIGEST *pWantedSha256, unsigned WantedCrc); - const char *LoadMapSearch(const char *pMapName, SHA256_DIGEST *pWantedSha256, int WantedCrc); - - int TranslateSysMsg(int *pMsgId, bool System, CUnpacker *pUnpacker, CPacker *pPacker, CNetChunk *pPacket, bool *pIsExMsg); - - void ProcessConnlessPacket(CNetChunk *pPacket); - void ProcessServerInfo(int Type, NETADDR *pFrom, const void *pData, int DataSize); - void ProcessServerPacket(CNetChunk *pPacket, int Conn, bool Dummy); - - int UnpackAndValidateSnapshot(CSnapshot *pFrom, CSnapshot *pTo); - - void ResetMapDownload(bool ResetActive); - void FinishMapDownload(); - - void RequestDDNetInfo() override; - void ResetDDNetInfoTask(); - void FinishDDNetInfo(); - void LoadDDNetInfo(); - - bool IsSixup() const override { return m_Sixup; } - - const NETADDR &ServerAddress() const override { return *m_aNetClient[CONN_MAIN].ServerAddress(); } - int ConnectNetTypes() const override; - const char *ConnectAddressString() const override { return m_aConnectAddressStr; } - const char *MapDownloadName() const override { return m_aMapdownloadName; } - int MapDownloadAmount() const override { return !m_pMapdownloadTask ? m_MapdownloadAmount : (int)m_pMapdownloadTask->Current(); } - int MapDownloadTotalsize() const override { return !m_pMapdownloadTask ? m_MapdownloadTotalsize : (int)m_pMapdownloadTask->Size(); } - - void PumpNetwork(); - - void OnDemoPlayerSnapshot(void *pData, int Size) override; - void OnDemoPlayerMessage(void *pData, int Size) override; - - void Update(); - - void RegisterInterfaces(); - void InitInterfaces(); - - void Run(); - - bool InitNetworkClient(char *pError, size_t ErrorSize); - bool CtrlShiftKey(int Key, bool &Last); - - static void Con_Connect(IConsole::IResult *pResult, void *pUserData); - static void Con_Disconnect(IConsole::IResult *pResult, void *pUserData); - - static void Con_DummyConnect(IConsole::IResult *pResult, void *pUserData); - static void Con_DummyDisconnect(IConsole::IResult *pResult, void *pUserData); - static void Con_DummyResetInput(IConsole::IResult *pResult, void *pUserData); - - static void Con_Quit(IConsole::IResult *pResult, void *pUserData); - static void Con_Restart(IConsole::IResult *pResult, void *pUserData); - static void Con_DemoPlay(IConsole::IResult *pResult, void *pUserData); - static void Con_DemoSpeed(IConsole::IResult *pResult, void *pUserData); - static void Con_Minimize(IConsole::IResult *pResult, void *pUserData); - static void Con_Ping(IConsole::IResult *pResult, void *pUserData); - static void Con_Screenshot(IConsole::IResult *pResult, void *pUserData); - -#if defined(CONF_VIDEORECORDER) - void StartVideo(const char *pFilename, bool WithTimestamp); - static void Con_StartVideo(IConsole::IResult *pResult, void *pUserData); - static void Con_StopVideo(IConsole::IResult *pResult, void *pUserData); - const char *DemoPlayer_Render(const char *pFilename, int StorageType, const char *pVideoName, int SpeedIndex, bool StartPaused = false) override; -#endif - - static void Con_Rcon(IConsole::IResult *pResult, void *pUserData); - static void Con_RconAuth(IConsole::IResult *pResult, void *pUserData); - static void Con_RconLogin(IConsole::IResult *pResult, void *pUserData); - static void Con_BeginFavoriteGroup(IConsole::IResult *pResult, void *pUserData); - static void Con_EndFavoriteGroup(IConsole::IResult *pResult, void *pUserData); - static void Con_AddFavorite(IConsole::IResult *pResult, void *pUserData); - static void Con_RemoveFavorite(IConsole::IResult *pResult, void *pUserData); - static void Con_Play(IConsole::IResult *pResult, void *pUserData); - static void Con_Record(IConsole::IResult *pResult, void *pUserData); - static void Con_StopRecord(IConsole::IResult *pResult, void *pUserData); - static void Con_AddDemoMarker(IConsole::IResult *pResult, void *pUserData); - static void Con_BenchmarkQuit(IConsole::IResult *pResult, void *pUserData); - static void ConchainServerBrowserUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainFullscreen(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainWindowBordered(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainWindowScreen(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainWindowVSync(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainWindowResize(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainTimeoutSeed(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainPassword(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainReplays(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainLoglevel(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainStdoutOutputLevel(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - - static void Con_DemoSlice(IConsole::IResult *pResult, void *pUserData); - static void Con_DemoSliceBegin(IConsole::IResult *pResult, void *pUserData); - static void Con_DemoSliceEnd(IConsole::IResult *pResult, void *pUserData); - static void Con_SaveReplay(IConsole::IResult *pResult, void *pUserData); - - void RegisterCommands(); - - const char *DemoPlayer_Play(const char *pFilename, int StorageType) override; - void DemoRecorder_Start(const char *pFilename, bool WithTimestamp, int Recorder, bool Verbose = false) override; - void DemoRecorder_HandleAutoStart() override; - void DemoRecorder_UpdateReplayRecorder() override; - void DemoRecorder_AddDemoMarker(int Recorder); - IDemoRecorder *DemoRecorder(int Recorder) override; - - void AutoScreenshot_Start() override; - void AutoStatScreenshot_Start() override; - void AutoScreenshot_Cleanup(); - void AutoStatScreenshot_Cleanup(); - - void AutoCSV_Start() override; - void AutoCSV_Cleanup(); - - void ServerBrowserUpdate() override; - - void HandleConnectAddress(const NETADDR *pAddr); - void HandleConnectLink(const char *pLink); - void HandleDemoPath(const char *pPath); - void HandleMapPath(const char *pPath); - - virtual void InitChecksum(); - virtual int HandleChecksum(int Conn, CUuid Uuid, CUnpacker *pUnpacker); - - // gfx - void SwitchWindowScreen(int Index) override; - void SetWindowParams(int FullscreenMode, bool IsBorderless) override; - void ToggleWindowVSync() override; - void Notify(const char *pTitle, const char *pMessage) override; - void OnWindowResize() override; - void BenchmarkQuit(int Seconds, const char *pFilename); - - void UpdateAndSwap() override; - - // DDRace - - void GenerateTimeoutSeed() override; - void GenerateTimeoutCodes(const NETADDR *pAddrs, int NumAddrs); - - const char *GetCurrentMap() const override; - const char *GetCurrentMapPath() const override; - SHA256_DIGEST GetCurrentMapSha256() const override; - unsigned GetCurrentMapCrc() const override; - - void RaceRecord_Start(const char *pFilename) override; - void RaceRecord_Stop() override; - bool RaceRecord_IsRecording() override; - - void DemoSliceBegin() override; - void DemoSliceEnd() override; - void DemoSlice(const char *pDstPath, CLIENTFUNC_FILTER pfnFilter, void *pUser) override; - virtual void SaveReplay(int Length, const char *pFilename = ""); - - bool EditorHasUnsavedData() const override { return m_pEditor->HasUnsavedData(); } - - IFriends *Foes() override { return &m_Foes; } - - void GetSmoothTick(int *pSmoothTick, float *pSmoothIntraTick, float MixAmount) override; - - void AddWarning(const SWarning &Warning) override; - std::optional CurrentWarning() override; - std::vector &&QuittingWarnings() { return std::move(m_vQuittingWarnings); } - - CChecksumData *ChecksumData() override { return &m_Checksum.m_Data; } - int UdpConnectivity(int NetType) override; - - bool ViewLink(const char *pLink) override; - bool ViewFile(const char *pFilename) override; - -#if defined(CONF_FAMILY_WINDOWS) - void ShellRegister() override; - void ShellUnregister() override; -#endif - - void ShowMessageBox(const char *pTitle, const char *pMessage, EMessageBoxType Type = MESSAGE_BOX_TYPE_ERROR) override; - void GetGpuInfoString(char (&aGpuInfo)[256]) override; - void SetLoggers(std::shared_ptr &&pFileLogger, std::shared_ptr &&pStdoutLogger); -}; - -#endif diff --git a/src/engine/client/demoedit.cpp b/src/engine/client/demoedit.cpp deleted file mode 100644 index 410331e8a1..0000000000 --- a/src/engine/client/demoedit.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "demoedit.h" - -#include -#include - -CDemoEdit::CDemoEdit(const char *pNetVersion, class CSnapshotDelta *pSnapshotDelta, IStorage *pStorage, const char *pDemo, const char *pDst, int StartTick, int EndTick) : - m_SnapshotDelta(*pSnapshotDelta), - m_pStorage(pStorage) -{ - str_copy(m_aDemo, pDemo); - str_copy(m_aDst, pDst); - - m_StartTick = StartTick; - m_EndTick = EndTick; - - // Init the demoeditor - m_DemoEditor.Init(&m_SnapshotDelta, NULL, pStorage); -} - -void CDemoEdit::Run() -{ - // Slice the current demo - m_Success = m_DemoEditor.Slice(m_aDemo, m_aDst, m_StartTick, m_EndTick, NULL, 0); - // We remove the temporary demo file if slicing is successful - if(m_Success) - m_pStorage->RemoveFile(m_aDemo, IStorage::TYPE_SAVE); -} diff --git a/src/engine/client/demoedit.h b/src/engine/client/demoedit.h deleted file mode 100644 index d6b2640253..0000000000 --- a/src/engine/client/demoedit.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef ENGINE_CLIENT_DEMOEDIT_H -#define ENGINE_CLIENT_DEMOEDIT_H - -#include -#include -#include - -class IStorage; - -class CDemoEdit : public IJob -{ - CSnapshotDelta m_SnapshotDelta; - IStorage *m_pStorage; - - CDemoEditor m_DemoEditor; - - char m_aDemo[256]; - char m_aDst[256]; - int m_StartTick; - int m_EndTick; - bool m_Success; - -public: - CDemoEdit(const char *pNetVersion, CSnapshotDelta *pSnapshotDelta, IStorage *pStorage, const char *pDemo, const char *pDst, int StartTick, int EndTick); - void Run() override; - char *Destination() { return m_aDst; } - bool Success() { return m_Success; } -}; -#endif diff --git a/src/engine/client/discord.cpp b/src/engine/client/discord.cpp deleted file mode 100644 index cef226d85a..0000000000 --- a/src/engine/client/discord.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include -#include - -#if defined(CONF_DISCORD) -#include - -typedef enum EDiscordResult DISCORD_API (*FDiscordCreate)(DiscordVersion, struct DiscordCreateParams *, struct IDiscordCore **); - -#if defined(CONF_DISCORD_DYNAMIC) -#include -FDiscordCreate GetDiscordCreate() -{ - void *pSdk = dlopen("discord_game_sdk.so", RTLD_NOW); - if(!pSdk) - { - return nullptr; - } - return (FDiscordCreate)dlsym(pSdk, "DiscordCreate"); -} -#else -FDiscordCreate GetDiscordCreate() -{ - return DiscordCreate; -} -#endif - -class CDiscord : public IDiscord -{ - IDiscordCore *m_pCore; - IDiscordActivityEvents m_ActivityEvents; - IDiscordActivityManager *m_pActivityManager; - -public: - bool Init(FDiscordCreate pfnDiscordCreate) - { - m_pCore = 0; - mem_zero(&m_ActivityEvents, sizeof(m_ActivityEvents)); - m_pActivityManager = 0; - - DiscordCreateParams Params; - DiscordCreateParamsSetDefault(&Params); - - Params.client_id = 752165779117441075; // DDNet - Params.flags = EDiscordCreateFlags::DiscordCreateFlags_NoRequireDiscord; - Params.event_data = this; - Params.activity_events = &m_ActivityEvents; - int Error = pfnDiscordCreate(DISCORD_VERSION, &Params, &m_pCore); - if(Error != DiscordResult_Ok) - { - dbg_msg("discord", "error initializing discord instance, error=%d", Error); - return true; - } - - m_pActivityManager = m_pCore->get_activity_manager(m_pCore); - ClearGameInfo(); - return false; - } - void Update() override - { - m_pCore->run_callbacks(m_pCore); - } - void ClearGameInfo() override - { - DiscordActivity Activity; - mem_zero(&Activity, sizeof(DiscordActivity)); - str_copy(Activity.assets.large_image, "ddnet_logo", sizeof(Activity.assets.large_image)); - str_copy(Activity.assets.large_text, "DDNet logo", sizeof(Activity.assets.large_text)); - Activity.timestamps.start = time_timestamp(); - str_copy(Activity.details, "Offline", sizeof(Activity.details)); - m_pActivityManager->update_activity(m_pActivityManager, &Activity, 0, 0); - } - void SetGameInfo(const NETADDR &ServerAddr, const char *pMapName, bool AnnounceAddr) override - { - DiscordActivity Activity; - mem_zero(&Activity, sizeof(DiscordActivity)); - str_copy(Activity.assets.large_image, "ddnet_logo", sizeof(Activity.assets.large_image)); - str_copy(Activity.assets.large_text, "DDNet logo", sizeof(Activity.assets.large_text)); - Activity.timestamps.start = time_timestamp(); - str_copy(Activity.details, "Online", sizeof(Activity.details)); - str_copy(Activity.state, pMapName, sizeof(Activity.state)); - m_pActivityManager->update_activity(m_pActivityManager, &Activity, 0, 0); - } -}; - -IDiscord *CreateDiscordImpl() -{ - FDiscordCreate pfnDiscordCreate = GetDiscordCreate(); - if(!pfnDiscordCreate) - { - return 0; - } - CDiscord *pDiscord = new CDiscord(); - if(pDiscord->Init(pfnDiscordCreate)) - { - delete pDiscord; - return 0; - } - return pDiscord; -} -#else -IDiscord *CreateDiscordImpl() -{ - return 0; -} -#endif - -class CDiscordStub : public IDiscord -{ - void Update() override {} - void ClearGameInfo() override {} - void SetGameInfo(const NETADDR &ServerAddr, const char *pMapName, bool AnnounceAddr) override {} -}; - -IDiscord *CreateDiscord() -{ - IDiscord *pDiscord = CreateDiscordImpl(); - if(pDiscord) - { - return pDiscord; - } - return new CDiscordStub(); -} diff --git a/src/engine/client/enums.h b/src/engine/client/enums.h deleted file mode 100644 index 45a475fa12..0000000000 --- a/src/engine/client/enums.h +++ /dev/null @@ -1,11 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef ENGINE_CLIENT_ENUMS_H -#define ENGINE_CLIENT_ENUMS_H - -enum -{ - NUM_DUMMIES = 2, -}; - -#endif diff --git a/src/engine/client/favorites.cpp b/src/engine/client/favorites.cpp deleted file mode 100644 index 0e713a5151..0000000000 --- a/src/engine/client/favorites.cpp +++ /dev/null @@ -1,265 +0,0 @@ -#include -#include -#include -#include - -#include -#include -#include - -class CFavorites : public IFavorites -{ -protected: - void OnConfigSave(IConfigManager *pConfigManager) override; - -public: - TRISTATE IsFavorite(const NETADDR *pAddrs, int NumAddrs) const override; - TRISTATE IsPingAllowed(const NETADDR *pAddrs, int NumAddrs) const override; - void Add(const NETADDR *pAddrs, int NumAddrs) override; - void AllowPing(const NETADDR *pAddrs, int NumAddrs, bool AllowPing) override; - void Remove(const NETADDR *pAddrs, int NumAddrs) override; - void AllEntries(const CEntry **ppEntries, int *pNumEntries) override; - -private: - std::vector m_vEntries; - std::unordered_map m_ByAddr; - - CEntry *Entry(const NETADDR &Addr); - const CEntry *Entry(const NETADDR &Addr) const; - // `pEntry` must come from the `m_vEntries` vector. - void RemoveEntry(CEntry *pEntry); -}; - -void CFavorites::OnConfigSave(IConfigManager *pConfigManager) -{ - for(const auto &Entry : m_vEntries) - { - if(Entry.m_NumAddrs > 1) - { - pConfigManager->WriteLine("begin_favorite_group"); - } - for(int i = 0; i < Entry.m_NumAddrs; i++) - { - char aAddr[NETADDR_MAXSTRSIZE]; - char aBuffer[128]; - net_addr_str(&Entry.m_aAddrs[i], aBuffer, sizeof(aBuffer), true); - - if(Entry.m_aAddrs[i].type & NETTYPE_TW7) - { - str_format( - aAddr, - sizeof(aAddr), - "tw-0.7+udp://%s", - aBuffer); - } - else - { - str_copy(aAddr, aBuffer); - } - - if(!Entry.m_AllowPing) - { - str_format(aBuffer, sizeof(aBuffer), "add_favorite %s", aAddr); - } - else - { - // Add quotes to the first parameter for backward - // compatibility with versions that took a `r` console - // parameter. - str_format(aBuffer, sizeof(aBuffer), "add_favorite \"%s\" allow_ping", aAddr); - } - pConfigManager->WriteLine(aBuffer); - } - if(Entry.m_NumAddrs > 1) - { - pConfigManager->WriteLine("end_favorite_group"); - } - } -} - -TRISTATE CFavorites::IsFavorite(const NETADDR *pAddrs, int NumAddrs) const -{ - bool All = true; - bool None = true; - for(int i = 0; i < NumAddrs && (All || None); i++) - { - const CEntry *pEntry = Entry(pAddrs[i]); - if(pEntry) - { - None = false; - } - else - { - All = false; - } - } - // Return ALL if no addresses were passed. - if(All) - { - return TRISTATE::ALL; - } - else if(None) - { - return TRISTATE::NONE; - } - else - { - return TRISTATE::SOME; - } -} - -TRISTATE CFavorites::IsPingAllowed(const NETADDR *pAddrs, int NumAddrs) const -{ - bool All = true; - bool None = true; - for(int i = 0; i < NumAddrs && (All || None); i++) - { - const CEntry *pEntry = Entry(pAddrs[i]); - if(pEntry == nullptr) - { - continue; - } - if(pEntry->m_AllowPing) - { - None = false; - } - else - { - All = false; - } - } - // Return ALL if no addresses were passed. - if(All) - { - return TRISTATE::ALL; - } - else if(None) - { - return TRISTATE::NONE; - } - else - { - return TRISTATE::SOME; - } -} - -void CFavorites::Add(const NETADDR *pAddrs, int NumAddrs) -{ - // First make sure that all the addresses are not registered for some - // other favorite. - for(int i = 0; i < NumAddrs; i++) - { - CEntry *pEntry = Entry(pAddrs[i]); - if(pEntry == nullptr) - { - continue; - } - for(int j = 0; j < pEntry->m_NumAddrs; j++) - { - if(pEntry->m_aAddrs[j] == pAddrs[i]) - { - pEntry->m_aAddrs[j] = pEntry->m_aAddrs[pEntry->m_NumAddrs - 1]; - pEntry->m_NumAddrs -= 1; - break; - } - } - // If the entry has become empty due to the cleaning, remove it - // completely. - if(pEntry->m_NumAddrs == 0) - { - RemoveEntry(pEntry); - } - } - // Add the new entry. - CEntry NewEntry; - mem_zero(&NewEntry, sizeof(NewEntry)); - NewEntry.m_NumAddrs = std::min(NumAddrs, (int)std::size(NewEntry.m_aAddrs)); - for(int i = 0; i < NewEntry.m_NumAddrs; i++) - { - NewEntry.m_aAddrs[i] = pAddrs[i]; - m_ByAddr[pAddrs[i]] = m_vEntries.size(); - } - NewEntry.m_AllowPing = false; - m_vEntries.push_back(NewEntry); -} - -void CFavorites::AllowPing(const NETADDR *pAddrs, int NumAddrs, bool AllowPing) -{ - for(int i = 0; i < NumAddrs; i++) - { - CEntry *pEntry = Entry(pAddrs[i]); - if(pEntry == nullptr) - { - continue; - } - pEntry->m_AllowPing = AllowPing; - } -} - -void CFavorites::Remove(const NETADDR *pAddrs, int NumAddrs) -{ - for(int i = 0; i < NumAddrs; i++) - { - CEntry *pEntry = Entry(pAddrs[i]); - if(pEntry == nullptr) - { - continue; - } - for(int j = 0; j < pEntry->m_NumAddrs; j++) - { - m_ByAddr.erase(pEntry->m_aAddrs[j]); - } - RemoveEntry(pEntry); - } -} - -void CFavorites::AllEntries(const CEntry **ppEntries, int *pNumEntries) -{ - *ppEntries = m_vEntries.data(); - *pNumEntries = m_vEntries.size(); -} - -CFavorites::CEntry *CFavorites::Entry(const NETADDR &Addr) -{ - auto Entry = m_ByAddr.find(Addr); - if(Entry == m_ByAddr.end()) - { - return nullptr; - } - return &m_vEntries[Entry->second]; -} - -const CFavorites::CEntry *CFavorites::Entry(const NETADDR &Addr) const -{ - auto Entry = m_ByAddr.find(Addr); - if(Entry == m_ByAddr.end()) - { - return nullptr; - } - return &m_vEntries[Entry->second]; -} - -void CFavorites::RemoveEntry(CEntry *pEntry) -{ - // Replace the entry - int Index = pEntry - m_vEntries.data(); - *pEntry = m_vEntries[m_vEntries.size() - 1]; - m_vEntries.pop_back(); - if(Index != (int)m_vEntries.size()) - { - for(int i = 0; i < pEntry->m_NumAddrs; i++) - { - m_ByAddr.at(pEntry->m_aAddrs[i]) = Index; - } - } -} - -void IFavorites::ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData) -{ - ((IFavorites *)pUserData)->OnConfigSave(pConfigManager); -} - -std::unique_ptr CreateFavorites() -{ - return std::make_unique(); -} diff --git a/src/engine/client/friends.cpp b/src/engine/client/friends.cpp deleted file mode 100644 index 925ecc2424..0000000000 --- a/src/engine/client/friends.cpp +++ /dev/null @@ -1,181 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include - -#include -#include -#include - -#include "friends.h" - -CFriends::CFriends() -{ - mem_zero(m_aFriends, sizeof(m_aFriends)); - m_NumFriends = 0; - m_Foes = false; -} - -void CFriends::ConAddFriend(IConsole::IResult *pResult, void *pUserData) -{ - CFriends *pSelf = (CFriends *)pUserData; - pSelf->AddFriend(pResult->GetString(0), pResult->GetString(1)); -} - -void CFriends::ConRemoveFriend(IConsole::IResult *pResult, void *pUserData) -{ - CFriends *pSelf = (CFriends *)pUserData; - pSelf->RemoveFriend(pResult->GetString(0), pResult->GetString(1)); -} - -void CFriends::ConFriends(IConsole::IResult *pResult, void *pUserData) -{ - CFriends *pSelf = (CFriends *)pUserData; - pSelf->Friends(); -} - -void CFriends::Init(bool Foes) -{ - m_Foes = Foes; - - IConfigManager *pConfigManager = Kernel()->RequestInterface(); - if(pConfigManager) - pConfigManager->RegisterCallback(ConfigSaveCallback, this); - - IConsole *pConsole = Kernel()->RequestInterface(); - if(pConsole) - { - if(Foes) - { - pConsole->Register("add_foe", "s[name] ?s[clan]", CFGFLAG_CLIENT, ConAddFriend, this, "Add a foe"); - pConsole->Register("remove_foe", "s[name] ?s[clan]", CFGFLAG_CLIENT, ConRemoveFriend, this, "Remove a foe"); - pConsole->Register("foes", "", CFGFLAG_CLIENT, ConFriends, this, "List foes"); - } - else - { - pConsole->Register("add_friend", "s[name] ?s[clan]", CFGFLAG_CLIENT, ConAddFriend, this, "Add a friend"); - pConsole->Register("remove_friend", "s[name] ?s[clan]", CFGFLAG_CLIENT, ConRemoveFriend, this, "Remove a friend"); - pConsole->Register("friends", "", CFGFLAG_CLIENT, ConFriends, this, "List friends"); - } - } -} - -const CFriendInfo *CFriends::GetFriend(int Index) const -{ - return &m_aFriends[maximum(0, Index % m_NumFriends)]; -} - -int CFriends::GetFriendState(const char *pName, const char *pClan) const -{ - int Result = FRIEND_NO; - unsigned NameHash = str_quickhash(pName); - unsigned ClanHash = str_quickhash(pClan); - for(int i = 0; i < m_NumFriends; ++i) - { - if((g_Config.m_ClFriendsIgnoreClan && m_aFriends[i].m_aName[0]) || (m_aFriends[i].m_ClanHash == ClanHash && !str_comp(m_aFriends[i].m_aClan, pClan))) - { - if(m_aFriends[i].m_aName[0] == 0) - Result = FRIEND_CLAN; - else if(m_aFriends[i].m_NameHash == NameHash && !str_comp(m_aFriends[i].m_aName, pName)) - { - Result = FRIEND_PLAYER; - break; - } - } - } - return Result; -} - -bool CFriends::IsFriend(const char *pName, const char *pClan, bool PlayersOnly) const -{ - unsigned NameHash = str_quickhash(pName); - unsigned ClanHash = str_quickhash(pClan); - for(int i = 0; i < m_NumFriends; ++i) - { - if(((g_Config.m_ClFriendsIgnoreClan && m_aFriends[i].m_aName[0]) || (m_aFriends[i].m_ClanHash == ClanHash && !str_comp(m_aFriends[i].m_aClan, pClan))) && - ((!PlayersOnly && m_aFriends[i].m_aName[0] == 0) || (m_aFriends[i].m_NameHash == NameHash && !str_comp(m_aFriends[i].m_aName, pName)))) - return true; - } - return false; -} - -void CFriends::AddFriend(const char *pName, const char *pClan) -{ - if(m_NumFriends == MAX_FRIENDS || (pName[0] == 0 && pClan[0] == 0)) - return; - - // make sure we don't have the friend already - unsigned NameHash = str_quickhash(pName); - unsigned ClanHash = str_quickhash(pClan); - for(int i = 0; i < m_NumFriends; ++i) - { - if((m_aFriends[i].m_NameHash == NameHash && !str_comp(m_aFriends[i].m_aName, pName)) && ((g_Config.m_ClFriendsIgnoreClan && m_aFriends[i].m_aName[0]) || (m_aFriends[i].m_ClanHash == ClanHash && !str_comp(m_aFriends[i].m_aClan, pClan)))) - return; - } - - str_copy(m_aFriends[m_NumFriends].m_aName, pName); - str_copy(m_aFriends[m_NumFriends].m_aClan, pClan); - m_aFriends[m_NumFriends].m_NameHash = NameHash; - m_aFriends[m_NumFriends].m_ClanHash = ClanHash; - ++m_NumFriends; -} - -void CFriends::RemoveFriend(const char *pName, const char *pClan) -{ - unsigned NameHash = str_quickhash(pName); - unsigned ClanHash = str_quickhash(pClan); - for(int i = 0; i < m_NumFriends; ++i) - { - if((m_aFriends[i].m_NameHash == NameHash && !str_comp(m_aFriends[i].m_aName, pName)) && - ((g_Config.m_ClFriendsIgnoreClan && m_aFriends[i].m_aName[0]) || (m_aFriends[i].m_ClanHash == ClanHash && !str_comp(m_aFriends[i].m_aClan, pClan)))) - { - RemoveFriend(i); - return; - } - } -} - -void CFriends::RemoveFriend(int Index) -{ - if(Index >= 0 && Index < m_NumFriends) - { - mem_move(&m_aFriends[Index], &m_aFriends[Index + 1], sizeof(CFriendInfo) * (m_NumFriends - (Index + 1))); - --m_NumFriends; - } -} - -void CFriends::Friends() -{ - char aBuf[128]; - IConsole *pConsole = Kernel()->RequestInterface(); - if(pConsole) - { - for(int i = 0; i < m_NumFriends; ++i) - { - str_format(aBuf, sizeof(aBuf), "Name: %s, Clan: %s", m_aFriends[i].m_aName, m_aFriends[i].m_aClan); - - pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, m_Foes ? "foes" : "friends", aBuf, color_cast(ColorHSLA(g_Config.m_ClMessageHighlightColor))); - } - } -} - -void CFriends::ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData) -{ - CFriends *pSelf = (CFriends *)pUserData; - char aBuf[128]; - const char *pEnd = aBuf + sizeof(aBuf) - 4; - for(int i = 0; i < pSelf->m_NumFriends; ++i) - { - str_copy(aBuf, pSelf->m_Foes ? "add_foe " : "add_friend "); - - str_append(aBuf, "\""); - char *pDst = aBuf + str_length(aBuf); - str_escape(&pDst, pSelf->m_aFriends[i].m_aName, pEnd); - str_append(aBuf, "\" \""); - pDst = aBuf + str_length(aBuf); - str_escape(&pDst, pSelf->m_aFriends[i].m_aClan, pEnd); - str_append(aBuf, "\""); - - pConfigManager->WriteLine(aBuf); - } -} diff --git a/src/engine/client/friends.h b/src/engine/client/friends.h deleted file mode 100644 index cd3e9a1d8f..0000000000 --- a/src/engine/client/friends.h +++ /dev/null @@ -1,39 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef ENGINE_CLIENT_FRIENDS_H -#define ENGINE_CLIENT_FRIENDS_H - -#include -#include - -class IConfigManager; - -class CFriends : public IFriends -{ - CFriendInfo m_aFriends[MAX_FRIENDS]; - int m_Foes; - int m_NumFriends; - - static void ConAddFriend(IConsole::IResult *pResult, void *pUserData); - static void ConRemoveFriend(IConsole::IResult *pResult, void *pUserData); - static void ConFriends(IConsole::IResult *pResult, void *pUserData); - - static void ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData); - -public: - CFriends(); - - void Init(bool Foes = false) override; - - int NumFriends() const override { return m_NumFriends; } - const CFriendInfo *GetFriend(int Index) const override; - int GetFriendState(const char *pName, const char *pClan) const override; - bool IsFriend(const char *pName, const char *pClan, bool PlayersOnly) const override; - - void AddFriend(const char *pName, const char *pClan) override; - void RemoveFriend(const char *pName, const char *pClan) override; - void RemoveFriend(int Index); - void Friends(); -}; - -#endif diff --git a/src/engine/client/ghost.cpp b/src/engine/client/ghost.cpp deleted file mode 100644 index 98de2da615..0000000000 --- a/src/engine/client/ghost.cpp +++ /dev/null @@ -1,494 +0,0 @@ -#include "ghost.h" - -#include -#include - -#include -#include -#include -#include - -static const unsigned char gs_aHeaderMarker[8] = {'T', 'W', 'G', 'H', 'O', 'S', 'T', 0}; -static const unsigned char gs_CurVersion = 6; - -static const LOG_COLOR LOG_COLOR_GHOST{165, 153, 153}; - -int CGhostHeader::GetTicks() const -{ - return bytes_be_to_uint(m_aNumTicks); -} - -int CGhostHeader::GetTime() const -{ - return bytes_be_to_uint(m_aTime); -} - -CGhostInfo CGhostHeader::ToGhostInfo() const -{ - CGhostInfo Result; - str_copy(Result.m_aOwner, m_aOwner); - str_copy(Result.m_aMap, m_aMap); - Result.m_NumTicks = GetTicks(); - Result.m_Time = GetTime(); - return Result; -} - -CGhostRecorder::CGhostRecorder() -{ - m_File = 0; - m_aFilename[0] = '\0'; - ResetBuffer(); -} - -void CGhostRecorder::Init() -{ - m_pStorage = Kernel()->RequestInterface(); -} - -int CGhostRecorder::Start(const char *pFilename, const char *pMap, const SHA256_DIGEST &MapSha256, const char *pName) -{ - dbg_assert(!m_File, "File already open"); - - m_File = m_pStorage->OpenFile(pFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE); - if(!m_File) - { - log_info_color(LOG_COLOR_GHOST, "ghost_recorder", "Unable to open '%s' for recording", pFilename); - return -1; - } - str_copy(m_aFilename, pFilename); - - // write header - CGhostHeader Header; - mem_zero(&Header, sizeof(Header)); - mem_copy(Header.m_aMarker, gs_aHeaderMarker, sizeof(Header.m_aMarker)); - Header.m_Version = gs_CurVersion; - str_copy(Header.m_aOwner, pName); - str_copy(Header.m_aMap, pMap); - Header.m_MapSha256 = MapSha256; - io_write(m_File, &Header, sizeof(Header)); - - m_LastItem.Reset(); - ResetBuffer(); - - log_info_color(LOG_COLOR_GHOST, "ghost_recorder", "Recording to '%s'", pFilename); - return 0; -} - -void CGhostRecorder::ResetBuffer() -{ - m_pBufferPos = m_aBuffer; - m_pBufferEnd = m_aBuffer; - m_BufferNumItems = 0; -} - -static void DiffItem(const uint32_t *pPast, const uint32_t *pCurrent, uint32_t *pOut, size_t Size) -{ - while(Size) - { - *pOut = *pCurrent - *pPast; - pOut++; - pPast++; - pCurrent++; - Size--; - } -} - -void CGhostRecorder::WriteData(int Type, const void *pData, size_t Size) -{ - dbg_assert((bool)m_File, "File not open"); - dbg_assert(Type >= 0 && Type <= (int)std::numeric_limits::max(), "Type invalid"); - dbg_assert(Size > 0 && Size <= MAX_ITEM_SIZE && Size % sizeof(uint32_t) == 0, "Size invalid"); - - if((size_t)(m_pBufferEnd - m_pBufferPos) < Size) - { - FlushChunk(); - } - - CGhostItem Data(Type); - mem_copy(Data.m_aData, pData, Size); - if(m_LastItem.m_Type == Data.m_Type) - { - DiffItem((const uint32_t *)m_LastItem.m_aData, (const uint32_t *)Data.m_aData, (uint32_t *)m_pBufferPos, Size / sizeof(uint32_t)); - } - else - { - FlushChunk(); - mem_copy(m_pBufferPos, Data.m_aData, Size); - } - - m_LastItem = Data; - m_pBufferPos += Size; - m_BufferNumItems++; - if(m_BufferNumItems >= NUM_ITEMS_PER_CHUNK) - { - FlushChunk(); - } -} - -void CGhostRecorder::FlushChunk() -{ - dbg_assert((bool)m_File, "File not open"); - - int Size = m_pBufferPos - m_aBuffer; - if(Size == 0 || m_BufferNumItems == 0) - { - return; - } - dbg_assert(Size % sizeof(uint32_t) == 0, "Chunk size invalid"); - - Size = CVariableInt::Compress(m_aBuffer, Size, m_aBufferTemp, sizeof(m_aBufferTemp)); - if(Size < 0) - { - log_info_color(LOG_COLOR_GHOST, "ghost_recorder", "Failed to write chunk to '%s': error during intpack compression", m_aFilename); - m_LastItem.Reset(); - ResetBuffer(); - return; - } - - Size = CNetBase::Compress(m_aBufferTemp, Size, m_aBuffer, sizeof(m_aBuffer)); - if(Size < 0) - { - log_info_color(LOG_COLOR_GHOST, "ghost_recorder", "Failed to write chunk to '%s': error during network compression", m_aFilename); - m_LastItem.Reset(); - ResetBuffer(); - return; - } - - unsigned char aChunkHeader[4]; - aChunkHeader[0] = m_LastItem.m_Type & 0xff; - aChunkHeader[1] = m_BufferNumItems & 0xff; - aChunkHeader[2] = (Size >> 8) & 0xff; - aChunkHeader[3] = Size & 0xff; - - io_write(m_File, aChunkHeader, sizeof(aChunkHeader)); - io_write(m_File, m_aBuffer, Size); - - m_LastItem.Reset(); - ResetBuffer(); -} - -void CGhostRecorder::Stop(int Ticks, int Time) -{ - if(!m_File) - { - return; - } - - const bool DiscardFile = Ticks <= 0 || Time <= 0; - - if(!DiscardFile) - { - FlushChunk(); - - // write number of ticks and time - io_seek(m_File, offsetof(CGhostHeader, m_aNumTicks), IOSEEK_START); - - unsigned char aNumTicks[sizeof(int32_t)]; - uint_to_bytes_be(aNumTicks, Ticks); - io_write(m_File, aNumTicks, sizeof(aNumTicks)); - - unsigned char aTime[sizeof(int32_t)]; - uint_to_bytes_be(aTime, Time); - io_write(m_File, aTime, sizeof(aTime)); - } - - io_close(m_File); - m_File = 0; - - if(DiscardFile) - { - m_pStorage->RemoveFile(m_aFilename, IStorage::TYPE_SAVE); - } - - log_info_color(LOG_COLOR_GHOST, "ghost_recorder", "Stopped recording to '%s'", m_aFilename); - m_aFilename[0] = '\0'; -} - -CGhostLoader::CGhostLoader() -{ - m_File = 0; - m_aFilename[0] = '\0'; - ResetBuffer(); -} - -void CGhostLoader::Init() -{ - m_pStorage = Kernel()->RequestInterface(); -} - -void CGhostLoader::ResetBuffer() -{ - m_pBufferPos = m_aBuffer; - m_pBufferEnd = m_aBuffer; - m_BufferNumItems = 0; - m_BufferCurItem = 0; - m_BufferPrevItem = -1; -} - -IOHANDLE CGhostLoader::ReadHeader(CGhostHeader &Header, const char *pFilename, const char *pMap, const SHA256_DIGEST &MapSha256, unsigned MapCrc, bool LogMapMismatch) const -{ - IOHANDLE File = m_pStorage->OpenFile(pFilename, IOFLAG_READ, IStorage::TYPE_SAVE); - if(!File) - { - log_error_color(LOG_COLOR_GHOST, "ghost_loader", "Failed to open ghost file '%s' for reading", pFilename); - return nullptr; - } - - if(io_read(File, &Header, sizeof(Header)) != sizeof(Header)) - { - log_error_color(LOG_COLOR_GHOST, "ghost_loader", "Failed to read ghost file '%s': failed to read header", pFilename); - io_close(File); - return nullptr; - } - - if(!ValidateHeader(Header, pFilename) || - !CheckHeaderMap(Header, pFilename, pMap, MapSha256, MapCrc, LogMapMismatch)) - { - io_close(File); - return nullptr; - } - - return File; -} - -bool CGhostLoader::ValidateHeader(const CGhostHeader &Header, const char *pFilename) const -{ - if(mem_comp(Header.m_aMarker, gs_aHeaderMarker, sizeof(gs_aHeaderMarker)) != 0) - { - log_error_color(LOG_COLOR_GHOST, "ghost_loader", "Failed to read ghost file '%s': invalid header marker", pFilename); - return false; - } - - if(Header.m_Version < 4 || Header.m_Version > gs_CurVersion) - { - log_error_color(LOG_COLOR_GHOST, "ghost_loader", "Failed to read ghost file '%s': ghost version '%d' is not supported", pFilename, Header.m_Version); - return false; - } - - if(!mem_has_null(Header.m_aOwner, sizeof(Header.m_aOwner)) || !str_utf8_check(Header.m_aOwner)) - { - log_error_color(LOG_COLOR_GHOST, "ghost_loader", "Failed to read ghost file '%s': owner name is invalid", pFilename); - return false; - } - - if(!mem_has_null(Header.m_aMap, sizeof(Header.m_aMap)) || !str_utf8_check(Header.m_aMap)) - { - log_error_color(LOG_COLOR_GHOST, "ghost_loader", "Failed to read ghost file '%s': map name is invalid", pFilename); - return false; - } - - const int NumTicks = Header.GetTicks(); - if(NumTicks <= 0) - { - log_error_color(LOG_COLOR_GHOST, "ghost_loader", "Failed to read ghost file '%s': number of ticks '%d' is invalid", pFilename, NumTicks); - return false; - } - - const int Time = Header.GetTime(); - if(Time <= 0) - { - log_error_color(LOG_COLOR_GHOST, "ghost_loader", "Failed to read ghost file '%s': time '%d' is invalid", pFilename, Time); - return false; - } - - return true; -} - -bool CGhostLoader::CheckHeaderMap(const CGhostHeader &Header, const char *pFilename, const char *pMap, const SHA256_DIGEST &MapSha256, unsigned MapCrc, bool LogMapMismatch) const -{ - if(str_comp(Header.m_aMap, pMap) != 0) - { - if(LogMapMismatch) - { - log_error_color(LOG_COLOR_GHOST, "ghost_loader", "Failed to read ghost file '%s': ghost map name '%s' does not match current map '%s'", pFilename, Header.m_aMap, pMap); - } - return false; - } - - if(Header.m_Version >= 6) - { - if(Header.m_MapSha256 != MapSha256 && g_Config.m_ClRaceGhostStrictMap) - { - if(LogMapMismatch) - { - char aGhostSha256[SHA256_MAXSTRSIZE]; - sha256_str(Header.m_MapSha256, aGhostSha256, sizeof(aGhostSha256)); - char aMapSha256[SHA256_MAXSTRSIZE]; - sha256_str(MapSha256, aMapSha256, sizeof(aMapSha256)); - log_error_color(LOG_COLOR_GHOST, "ghost_loader", "Failed to read ghost file '%s': ghost map SHA256 mismatch (wanted='%s', ghost='%s')", pFilename, aMapSha256, aGhostSha256); - } - return false; - } - } - else - { - const unsigned GhostMapCrc = bytes_be_to_uint(Header.m_aZeroes); - if(GhostMapCrc != MapCrc && g_Config.m_ClRaceGhostStrictMap) - { - if(LogMapMismatch) - { - log_error_color(LOG_COLOR_GHOST, "ghost_loader", "Failed to read ghost file '%s': ghost map CRC mismatch (wanted='%08x', ghost='%08x')", pFilename, MapCrc, GhostMapCrc); - } - return false; - } - } - - return true; -} - -bool CGhostLoader::Load(const char *pFilename, const char *pMap, const SHA256_DIGEST &MapSha256, unsigned MapCrc) -{ - dbg_assert(!m_File, "File already open"); - - CGhostHeader Header; - IOHANDLE File = ReadHeader(Header, pFilename, pMap, MapSha256, MapCrc, true); - if(!File) - { - return false; - } - - if(Header.m_Version < 6) - { - io_skip(File, -(int)sizeof(SHA256_DIGEST)); - } - - m_File = File; - str_copy(m_aFilename, pFilename); - m_Header = Header; - m_Info = m_Header.ToGhostInfo(); - m_LastItem.Reset(); - ResetBuffer(); - return true; -} - -bool CGhostLoader::ReadChunk(int *pType) -{ - if(m_Header.m_Version != 4) - { - m_LastItem.Reset(); - } - ResetBuffer(); - - unsigned char aChunkHeader[4]; - if(io_read(m_File, aChunkHeader, sizeof(aChunkHeader)) != sizeof(aChunkHeader)) - { - return false; // EOF - } - - *pType = aChunkHeader[0]; - int Size = (aChunkHeader[2] << 8) | aChunkHeader[3]; - m_BufferNumItems = aChunkHeader[1]; - - if(Size <= 0 || Size > MAX_CHUNK_SIZE) - { - log_error_color(LOG_COLOR_GHOST, "ghost_loader", "Failed to read ghost file '%s': invalid chunk header size", m_aFilename); - return false; - } - - if(io_read(m_File, m_aBuffer, Size) != (unsigned)Size) - { - log_error_color(LOG_COLOR_GHOST, "ghost_loader", "Failed to read ghost file '%s': error reading chunk data", m_aFilename); - return false; - } - - Size = CNetBase::Decompress(m_aBuffer, Size, m_aBufferTemp, sizeof(m_aBufferTemp)); - if(Size < 0) - { - log_error_color(LOG_COLOR_GHOST, "ghost_loader", "Failed to read ghost file '%s': error during network decompression", m_aFilename); - return false; - } - - Size = CVariableInt::Decompress(m_aBufferTemp, Size, m_aBuffer, sizeof(m_aBuffer)); - if(Size < 0) - { - log_error_color(LOG_COLOR_GHOST, "ghost_loader", "Failed to read ghost file '%s': error during intpack decompression", m_aFilename); - return false; - } - - m_pBufferEnd = m_aBuffer + Size; - return true; -} - -bool CGhostLoader::ReadNextType(int *pType) -{ - dbg_assert((bool)m_File, "File not open"); - - if(m_BufferCurItem != m_BufferPrevItem && m_BufferCurItem < m_BufferNumItems) - { - *pType = m_LastItem.m_Type; - } - else if(!ReadChunk(pType)) - { - return false; // error or EOF - } - - m_BufferPrevItem = m_BufferCurItem; - return true; -} - -static void UndiffItem(const uint32_t *pPast, const uint32_t *pDiff, uint32_t *pOut, size_t Size) -{ - while(Size) - { - *pOut = *pPast + *pDiff; - pOut++; - pPast++; - pDiff++; - Size--; - } -} - -bool CGhostLoader::ReadData(int Type, void *pData, size_t Size) -{ - dbg_assert((bool)m_File, "File not open"); - dbg_assert(Type >= 0 && Type <= (int)std::numeric_limits::max(), "Type invalid"); - dbg_assert(Size > 0 && Size <= MAX_ITEM_SIZE && Size % sizeof(uint32_t) == 0, "Size invalid"); - - if((size_t)(m_pBufferEnd - m_pBufferPos) < Size) - { - log_error_color(LOG_COLOR_GHOST, "ghost_loader", "Failed to read ghost file '%s': not enough data (type='%d', got='%" PRIzu "', wanted='%" PRIzu "')", m_aFilename, Type, (size_t)(m_pBufferEnd - m_pBufferPos), Size); - return false; - } - - CGhostItem Data(Type); - if(m_LastItem.m_Type == Data.m_Type) - { - UndiffItem((const uint32_t *)m_LastItem.m_aData, (const uint32_t *)m_pBufferPos, (uint32_t *)Data.m_aData, Size / sizeof(uint32_t)); - } - else - { - mem_copy(Data.m_aData, m_pBufferPos, Size); - } - - mem_copy(pData, Data.m_aData, Size); - - m_LastItem = Data; - m_pBufferPos += Size; - m_BufferCurItem++; - return true; -} - -void CGhostLoader::Close() -{ - if(!m_File) - { - return; - } - - io_close(m_File); - m_File = 0; - m_aFilename[0] = '\0'; -} - -bool CGhostLoader::GetGhostInfo(const char *pFilename, CGhostInfo *pGhostInfo, const char *pMap, const SHA256_DIGEST &MapSha256, unsigned MapCrc) -{ - CGhostHeader Header; - IOHANDLE File = ReadHeader(Header, pFilename, pMap, MapSha256, MapCrc, false); - if(!File) - { - return false; - } - io_close(File); - *pGhostInfo = Header.ToGhostInfo(); - return true; -} diff --git a/src/engine/client/ghost.h b/src/engine/client/ghost.h deleted file mode 100644 index 155b7574eb..0000000000 --- a/src/engine/client/ghost.h +++ /dev/null @@ -1,112 +0,0 @@ -#ifndef ENGINE_CLIENT_GHOST_H -#define ENGINE_CLIENT_GHOST_H - -#include - -#include - -enum -{ - MAX_ITEM_SIZE = 128, - NUM_ITEMS_PER_CHUNK = 50, - MAX_CHUNK_SIZE = MAX_ITEM_SIZE * NUM_ITEMS_PER_CHUNK, -}; -static_assert(MAX_CHUNK_SIZE % sizeof(uint32_t) == 0, "Chunk size must be aligned with uint32_t"); - -// version 4-6 -struct CGhostHeader -{ - unsigned char m_aMarker[8]; - unsigned char m_Version; - char m_aOwner[MAX_NAME_LENGTH]; - char m_aMap[64]; - unsigned char m_aZeroes[sizeof(int32_t)]; // Crc before version 6 - unsigned char m_aNumTicks[sizeof(int32_t)]; - unsigned char m_aTime[sizeof(int32_t)]; - SHA256_DIGEST m_MapSha256; - - int GetTicks() const; - int GetTime() const; - CGhostInfo ToGhostInfo() const; -}; - -class CGhostItem -{ -public: - alignas(uint32_t) unsigned char m_aData[MAX_ITEM_SIZE]; - int m_Type; - - CGhostItem() : - m_Type(-1) {} - CGhostItem(int Type) : - m_Type(Type) {} - void Reset() { m_Type = -1; } -}; - -class CGhostRecorder : public IGhostRecorder -{ - IOHANDLE m_File; - char m_aFilename[IO_MAX_PATH_LENGTH]; - class IStorage *m_pStorage; - - alignas(uint32_t) char m_aBuffer[MAX_CHUNK_SIZE]; - alignas(uint32_t) char m_aBufferTemp[MAX_CHUNK_SIZE]; - char *m_pBufferPos; - const char *m_pBufferEnd; - int m_BufferNumItems; - CGhostItem m_LastItem; - - void ResetBuffer(); - void FlushChunk(); - -public: - CGhostRecorder(); - - void Init(); - - int Start(const char *pFilename, const char *pMap, const SHA256_DIGEST &MapSha256, const char *pName) override; - void Stop(int Ticks, int Time) override; - - void WriteData(int Type, const void *pData, size_t Size) override; - bool IsRecording() const override { return m_File != nullptr; } -}; - -class CGhostLoader : public IGhostLoader -{ - IOHANDLE m_File; - char m_aFilename[IO_MAX_PATH_LENGTH]; - class IStorage *m_pStorage; - - CGhostHeader m_Header; - CGhostInfo m_Info; - - alignas(uint32_t) char m_aBuffer[MAX_CHUNK_SIZE]; - alignas(uint32_t) char m_aBufferTemp[MAX_CHUNK_SIZE]; - char *m_pBufferPos; - const char *m_pBufferEnd; - int m_BufferNumItems; - int m_BufferCurItem; - int m_BufferPrevItem; - CGhostItem m_LastItem; - - void ResetBuffer(); - IOHANDLE ReadHeader(CGhostHeader &Header, const char *pFilename, const char *pMap, const SHA256_DIGEST &MapSha256, unsigned MapCrc, bool LogMapMismatch) const; - bool ValidateHeader(const CGhostHeader &Header, const char *pFilename) const; - bool CheckHeaderMap(const CGhostHeader &Header, const char *pFilename, const char *pMap, const SHA256_DIGEST &MapSha256, unsigned MapCrc, bool LogMapMismatch) const; - bool ReadChunk(int *pType); - -public: - CGhostLoader(); - - void Init(); - - bool Load(const char *pFilename, const char *pMap, const SHA256_DIGEST &MapSha256, unsigned MapCrc) override; - void Close() override; - const CGhostInfo *GetInfo() const override { return &m_Info; } - - bool ReadNextType(int *pType) override; - bool ReadData(int Type, void *pData, size_t Size) override; - - bool GetGhostInfo(const char *pFilename, CGhostInfo *pGhostInfo, const char *pMap, const SHA256_DIGEST &MapSha256, unsigned MapCrc) override; -}; -#endif diff --git a/src/engine/client/graph.cpp b/src/engine/client/graph.cpp deleted file mode 100644 index 9b98f7c707..0000000000 --- a/src/engine/client/graph.cpp +++ /dev/null @@ -1,212 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include -#include - -#include "graph.h" - -CGraph::CGraph(int MaxEntries) : - m_Entries(MaxEntries * (sizeof(SEntry) + 2 * CRingBufferBase::ITEM_SIZE), CRingBufferBase::FLAG_RECYCLE) -{ -} - -void CGraph::Init(float Min, float Max) -{ - m_Entries.Clear(); - m_pFirstScaled = nullptr; - m_RenderedTotalTime = 0; - SetMin(Min); - SetMax(Max); -} - -void CGraph::SetMin(float Min) -{ - m_MinRange = m_Min = Min; -} - -void CGraph::SetMax(float Max) -{ - m_MaxRange = m_Max = Max; -} - -void CGraph::Scale(int64_t WantedTotalTime) -{ - // Scale X axis for wanted total time - if(m_Entries.First() != nullptr) - { - const int64_t EndTime = m_Entries.Last()->m_Time; - bool ScaleTotalTime = false; - m_pFirstScaled = nullptr; - - if(m_Entries.First()->m_Time >= EndTime - WantedTotalTime) - { - m_pFirstScaled = m_Entries.First(); - } - else - { - m_pFirstScaled = m_Entries.Last(); - while(m_pFirstScaled) - { - SEntry *pPrev = m_Entries.Prev(m_pFirstScaled); - if(pPrev == nullptr) - break; - if(pPrev->m_Time < EndTime - WantedTotalTime) - { - // Scale based on actual total time instead of based on wanted total time, - // to avoid flickering last segment due to rounding errors. - ScaleTotalTime = true; - break; - } - m_pFirstScaled = pPrev; - } - } - - m_RenderedTotalTime = ScaleTotalTime ? (EndTime - m_pFirstScaled->m_Time) : WantedTotalTime; - - // Ensure that color is applied to first line segment - if(m_pFirstScaled) - { - m_pFirstScaled->m_ApplyColor = true; - SEntry *pNext = m_Entries.Next(m_pFirstScaled); - if(pNext != nullptr) - { - pNext->m_ApplyColor = true; - } - } - } - else - { - m_pFirstScaled = nullptr; - m_RenderedTotalTime = 0; - } - - // Scale Y axis - m_Min = m_MinRange; - m_Max = m_MaxRange; - for(SEntry *pEntry = m_pFirstScaled; pEntry != nullptr; pEntry = m_Entries.Next(pEntry)) - { - if(pEntry->m_Value > m_Max) - m_Max = pEntry->m_Value; - else if(pEntry->m_Value < m_Min) - m_Min = pEntry->m_Value; - } -} - -void CGraph::Add(float Value, ColorRGBA Color) -{ - InsertAt(time_get(), Value, Color); -} - -void CGraph::InsertAt(int64_t Time, float Value, ColorRGBA Color) -{ - SEntry *pEntry = m_Entries.Allocate(sizeof(SEntry)); - pEntry->m_Time = Time; - pEntry->m_Value = Value; - pEntry->m_Color = Color; - - // Determine whether the line (pPrev, pEntry) has different - // vertex colors than the line (pPrevPrev, pPrev). - SEntry *pPrev = m_Entries.Prev(pEntry); - if(pPrev == nullptr) - { - pEntry->m_ApplyColor = true; - } - else - { - SEntry *pPrevPrev = m_Entries.Prev(pPrev); - if(pPrevPrev == nullptr) - { - pEntry->m_ApplyColor = true; - } - else - { - pEntry->m_ApplyColor = Color != pPrev->m_Color || pPrev->m_Color != pPrevPrev->m_Color; - } - } -} - -void CGraph::Render(IGraphics *pGraphics, ITextRender *pTextRender, float x, float y, float w, float h, const char *pDescription) -{ - pGraphics->TextureClear(); - - pGraphics->QuadsBegin(); - pGraphics->SetColor(0.0f, 0.0f, 0.0f, 0.75f); - IGraphics::CQuadItem QuadItem(x, y, w, h); - pGraphics->QuadsDrawTL(&QuadItem, 1); - pGraphics->QuadsEnd(); - - pGraphics->LinesBegin(); - pGraphics->SetColor(0.95f, 0.95f, 0.95f, 1.0f); - IGraphics::CLineItem LineItem(x, y + h / 2, x + w, y + h / 2); - pGraphics->LinesDraw(&LineItem, 1); - - pGraphics->SetColor(0.5f, 0.5f, 0.5f, 0.75f); - IGraphics::CLineItem aLineItems[2] = { - IGraphics::CLineItem(x, y + (h * 3) / 4, x + w, y + (h * 3) / 4), - IGraphics::CLineItem(x, y + h / 4, x + w, y + h / 4)}; - pGraphics->LinesDraw(aLineItems, std::size(aLineItems)); - - if(m_pFirstScaled != nullptr) - { - IGraphics::CLineItem aValueLineItems[128]; - size_t NumValueLineItems = 0; - - const int64_t StartTime = m_pFirstScaled->m_Time; - - SEntry *pEntry0 = m_pFirstScaled; - int a0 = round_to_int((pEntry0->m_Time - StartTime) * w / m_RenderedTotalTime); - int v0 = round_to_int((pEntry0->m_Value - m_Min) * h / (m_Max - m_Min)); - while(pEntry0 != nullptr) - { - SEntry *pEntry1 = m_Entries.Next(pEntry0); - if(pEntry1 == nullptr) - break; - - const int a1 = round_to_int((pEntry1->m_Time - StartTime) * w / m_RenderedTotalTime); - const int v1 = round_to_int((pEntry1->m_Value - m_Min) * h / (m_Max - m_Min)); - - if(pEntry1->m_ApplyColor) - { - if(NumValueLineItems) - { - pGraphics->LinesDraw(aValueLineItems, NumValueLineItems); - NumValueLineItems = 0; - } - - IGraphics::CColorVertex aColorVertices[2] = { - IGraphics::CColorVertex(0, pEntry0->m_Color.r, pEntry0->m_Color.g, pEntry0->m_Color.b, pEntry0->m_Color.a), - IGraphics::CColorVertex(1, pEntry1->m_Color.r, pEntry1->m_Color.g, pEntry1->m_Color.b, pEntry1->m_Color.a)}; - pGraphics->SetColorVertex(aColorVertices, std::size(aColorVertices)); - } - if(NumValueLineItems == std::size(aValueLineItems)) - { - pGraphics->LinesDraw(aValueLineItems, NumValueLineItems); - NumValueLineItems = 0; - } - aValueLineItems[NumValueLineItems] = IGraphics::CLineItem(x + a0, y + h - v0, x + a1, y + h - v1); - ++NumValueLineItems; - - pEntry0 = pEntry1; - a0 = a1; - v0 = v1; - } - if(NumValueLineItems) - { - pGraphics->LinesDraw(aValueLineItems, NumValueLineItems); - } - } - pGraphics->LinesEnd(); - - const float FontSize = 12.0f; - const float Spacing = 2.0f; - - pTextRender->Text(x + Spacing, y + h - FontSize - Spacing, FontSize, pDescription); - - char aBuf[32]; - str_format(aBuf, sizeof(aBuf), "%.2f", m_Max); - pTextRender->Text(x + w - pTextRender->TextWidth(FontSize, aBuf) - Spacing, y + Spacing, FontSize, aBuf); - - str_format(aBuf, sizeof(aBuf), "%.2f", m_Min); - pTextRender->Text(x + w - pTextRender->TextWidth(FontSize, aBuf) - Spacing, y + h - FontSize - Spacing, FontSize, aBuf); -} diff --git a/src/engine/client/graph.h b/src/engine/client/graph.h deleted file mode 100644 index 090d506faf..0000000000 --- a/src/engine/client/graph.h +++ /dev/null @@ -1,45 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#ifndef ENGINE_CLIENT_GRAPH_H -#define ENGINE_CLIENT_GRAPH_H - -#include - -#include - -#include - -class IGraphics; -class ITextRender; - -class CGraph -{ -private: - struct SEntry - { - int64_t m_Time; - float m_Value; - ColorRGBA m_Color; - bool m_ApplyColor; - }; - SEntry *m_pFirstScaled = nullptr; - int64_t m_RenderedTotalTime = 0; - float m_Min, m_Max; - float m_MinRange, m_MaxRange; - CDynamicRingBuffer m_Entries; - -public: - CGraph(int MaxEntries); - - void Init(float Min, float Max); - void SetMin(float Min); - void SetMax(float Max); - - void Scale(int64_t WantedTotalTime); - void Add(float Value, ColorRGBA Color = ColorRGBA(1.0f, 1.0f, 1.0f, 0.75f)); - void InsertAt(int64_t Time, float Value, ColorRGBA Color = ColorRGBA(1.0f, 1.0f, 1.0f, 0.75f)); - void Render(IGraphics *pGraphics, ITextRender *pTextRender, float x, float y, float w, float h, const char *pDescription); -}; - -#endif diff --git a/src/engine/client/graphics_defines.h b/src/engine/client/graphics_defines.h deleted file mode 100644 index acc01629ff..0000000000 --- a/src/engine/client/graphics_defines.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef ENGINE_CLIENT_GRAPHICS_DEFINES_H -#define ENGINE_CLIENT_GRAPHICS_DEFINES_H - -#include -#include - -typedef uint32_t TWGLuint; -typedef int32_t TWGLint; -typedef uint32_t TWGLenum; -typedef uint8_t TWGLubyte; - -#endif diff --git a/src/engine/client/graphics_threaded.cpp b/src/engine/client/graphics_threaded.cpp deleted file mode 100644 index 617c460490..0000000000 --- a/src/engine/client/graphics_threaded.cpp +++ /dev/null @@ -1,2861 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include -#include -#include - -#if defined(CONF_FAMILY_UNIX) -#include -#endif - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#if defined(CONF_VIDEORECORDER) -#include -#endif - -#include "graphics_threaded.h" - -class CSemaphore; - -static CVideoMode g_aFakeModes[] = { - {8192, 4320, 8192, 4320, 0, 8, 8, 8, 0}, {7680, 4320, 7680, 4320, 0, 8, 8, 8, 0}, {5120, 2880, 5120, 2880, 0, 8, 8, 8, 0}, - {4096, 2160, 4096, 2160, 0, 8, 8, 8, 0}, {3840, 2160, 3840, 2160, 0, 8, 8, 8, 0}, {2560, 1440, 2560, 1440, 0, 8, 8, 8, 0}, - {2048, 1536, 2048, 1536, 0, 8, 8, 8, 0}, {1920, 2400, 1920, 2400, 0, 8, 8, 8, 0}, {1920, 1440, 1920, 1440, 0, 8, 8, 8, 0}, - {1920, 1200, 1920, 1200, 0, 8, 8, 8, 0}, {1920, 1080, 1920, 1080, 0, 8, 8, 8, 0}, {1856, 1392, 1856, 1392, 0, 8, 8, 8, 0}, - {1800, 1440, 1800, 1440, 0, 8, 8, 8, 0}, {1792, 1344, 1792, 1344, 0, 8, 8, 8, 0}, {1680, 1050, 1680, 1050, 0, 8, 8, 8, 0}, - {1600, 1200, 1600, 1200, 0, 8, 8, 8, 0}, {1600, 1000, 1600, 1000, 0, 8, 8, 8, 0}, {1440, 1050, 1440, 1050, 0, 8, 8, 8, 0}, - {1440, 900, 1440, 900, 0, 8, 8, 8, 0}, {1400, 1050, 1400, 1050, 0, 8, 8, 8, 0}, {1368, 768, 1368, 768, 0, 8, 8, 8, 0}, - {1280, 1024, 1280, 1024, 0, 8, 8, 8, 0}, {1280, 960, 1280, 960, 0, 8, 8, 8, 0}, {1280, 800, 1280, 800, 0, 8, 8, 8, 0}, - {1280, 768, 1280, 768, 0, 8, 8, 8, 0}, {1152, 864, 1152, 864, 0, 8, 8, 8, 0}, {1024, 768, 1024, 768, 0, 8, 8, 8, 0}, - {1024, 600, 1024, 600, 0, 8, 8, 8, 0}, {800, 600, 800, 600, 0, 8, 8, 8, 0}, {768, 576, 768, 576, 0, 8, 8, 8, 0}, - {720, 400, 720, 400, 0, 8, 8, 8, 0}, {640, 480, 640, 480, 0, 8, 8, 8, 0}, {400, 300, 400, 300, 0, 8, 8, 8, 0}, - {320, 240, 320, 240, 0, 8, 8, 8, 0}, - - {8192, 4320, 8192, 4320, 0, 5, 6, 5, 0}, {7680, 4320, 7680, 4320, 0, 5, 6, 5, 0}, {5120, 2880, 5120, 2880, 0, 5, 6, 5, 0}, - {4096, 2160, 4096, 2160, 0, 5, 6, 5, 0}, {3840, 2160, 3840, 2160, 0, 5, 6, 5, 0}, {2560, 1440, 2560, 1440, 0, 5, 6, 5, 0}, - {2048, 1536, 2048, 1536, 0, 5, 6, 5, 0}, {1920, 2400, 1920, 2400, 0, 5, 6, 5, 0}, {1920, 1440, 1920, 1440, 0, 5, 6, 5, 0}, - {1920, 1200, 1920, 1200, 0, 5, 6, 5, 0}, {1920, 1080, 1920, 1080, 0, 5, 6, 5, 0}, {1856, 1392, 1856, 1392, 0, 5, 6, 5, 0}, - {1800, 1440, 1800, 1440, 0, 5, 6, 5, 0}, {1792, 1344, 1792, 1344, 0, 5, 6, 5, 0}, {1680, 1050, 1680, 1050, 0, 5, 6, 5, 0}, - {1600, 1200, 1600, 1200, 0, 5, 6, 5, 0}, {1600, 1000, 1600, 1000, 0, 5, 6, 5, 0}, {1440, 1050, 1440, 1050, 0, 5, 6, 5, 0}, - {1440, 900, 1440, 900, 0, 5, 6, 5, 0}, {1400, 1050, 1400, 1050, 0, 5, 6, 5, 0}, {1368, 768, 1368, 768, 0, 5, 6, 5, 0}, - {1280, 1024, 1280, 1024, 0, 5, 6, 5, 0}, {1280, 960, 1280, 960, 0, 5, 6, 5, 0}, {1280, 800, 1280, 800, 0, 5, 6, 5, 0}, - {1280, 768, 1280, 768, 0, 5, 6, 5, 0}, {1152, 864, 1152, 864, 0, 5, 6, 5, 0}, {1024, 768, 1024, 768, 0, 5, 6, 5, 0}, - {1024, 600, 1024, 600, 0, 5, 6, 5, 0}, {800, 600, 800, 600, 0, 5, 6, 5, 0}, {768, 576, 768, 576, 0, 5, 6, 5, 0}, - {720, 400, 720, 400, 0, 5, 6, 5, 0}, {640, 480, 640, 480, 0, 5, 6, 5, 0}, {400, 300, 400, 300, 0, 5, 6, 5, 0}, - {320, 240, 320, 240, 0, 5, 6, 5, 0}}; - -void CGraphics_Threaded::FlushVertices(bool KeepVertices) -{ - CCommandBuffer::SCommand_Render Cmd; - int PrimType; - size_t PrimCount, NumVerts; - FlushVerticesImpl(KeepVertices, PrimType, PrimCount, NumVerts, Cmd, sizeof(CCommandBuffer::SVertex)); - - if(Cmd.m_pVertices != nullptr) - { - mem_copy(Cmd.m_pVertices, m_aVertices, sizeof(CCommandBuffer::SVertex) * NumVerts); - } -} - -void CGraphics_Threaded::FlushVerticesTex3D() -{ - CCommandBuffer::SCommand_RenderTex3D Cmd; - int PrimType; - size_t PrimCount, NumVerts; - FlushVerticesImpl(false, PrimType, PrimCount, NumVerts, Cmd, sizeof(CCommandBuffer::SVertexTex3DStream)); - - if(Cmd.m_pVertices != nullptr) - { - mem_copy(Cmd.m_pVertices, m_aVerticesTex3D, sizeof(CCommandBuffer::SVertexTex3DStream) * NumVerts); - } -} - -void CGraphics_Threaded::AddVertices(int Count) -{ - m_NumVertices += Count; - if((m_NumVertices + Count) >= CCommandBuffer::MAX_VERTICES) - FlushVertices(); -} - -void CGraphics_Threaded::AddVertices(int Count, CCommandBuffer::SVertex *pVertices) -{ - AddVertices(Count); -} - -void CGraphics_Threaded::AddVertices(int Count, CCommandBuffer::SVertexTex3DStream *pVertices) -{ - m_NumVertices += Count; - if((m_NumVertices + Count) >= CCommandBuffer::MAX_VERTICES) - FlushVerticesTex3D(); -} - -CGraphics_Threaded::CGraphics_Threaded() -{ - m_State.m_ScreenTL.x = 0; - m_State.m_ScreenTL.y = 0; - m_State.m_ScreenBR.x = 0; - m_State.m_ScreenBR.y = 0; - m_State.m_ClipEnable = false; - m_State.m_ClipX = 0; - m_State.m_ClipY = 0; - m_State.m_ClipW = 0; - m_State.m_ClipH = 0; - m_State.m_Texture = -1; - m_State.m_BlendMode = CCommandBuffer::BLEND_NONE; - m_State.m_WrapMode = CCommandBuffer::WRAP_REPEAT; - - m_CurrentCommandBuffer = 0; - m_pCommandBuffer = 0x0; - m_apCommandBuffers[0] = 0x0; - m_apCommandBuffers[1] = 0x0; - - m_NumVertices = 0; - - m_ScreenWidth = -1; - m_ScreenHeight = -1; - m_ScreenRefreshRate = -1; - - m_Rotation = 0; - m_Drawing = 0; - - m_TextureMemoryUsage = 0; - - m_RenderEnable = true; - m_DoScreenshot = false; -} - -void CGraphics_Threaded::ClipEnable(int x, int y, int w, int h) -{ - if(x < 0) - w += x; - if(y < 0) - h += y; - - x = clamp(x, 0, ScreenWidth()); - y = clamp(y, 0, ScreenHeight()); - w = clamp(w, 0, ScreenWidth() - x); - h = clamp(h, 0, ScreenHeight() - y); - - m_State.m_ClipEnable = true; - m_State.m_ClipX = x; - m_State.m_ClipY = ScreenHeight() - (y + h); - m_State.m_ClipW = w; - m_State.m_ClipH = h; -} - -void CGraphics_Threaded::ClipDisable() -{ - m_State.m_ClipEnable = false; -} - -void CGraphics_Threaded::BlendNone() -{ - m_State.m_BlendMode = CCommandBuffer::BLEND_NONE; -} - -void CGraphics_Threaded::BlendNormal() -{ - m_State.m_BlendMode = CCommandBuffer::BLEND_ALPHA; -} - -void CGraphics_Threaded::BlendAdditive() -{ - m_State.m_BlendMode = CCommandBuffer::BLEND_ADDITIVE; -} - -void CGraphics_Threaded::WrapNormal() -{ - m_State.m_WrapMode = CCommandBuffer::WRAP_REPEAT; -} - -void CGraphics_Threaded::WrapClamp() -{ - m_State.m_WrapMode = CCommandBuffer::WRAP_CLAMP; -} - -uint64_t CGraphics_Threaded::TextureMemoryUsage() const -{ - return m_pBackend->TextureMemoryUsage(); -} - -uint64_t CGraphics_Threaded::BufferMemoryUsage() const -{ - return m_pBackend->BufferMemoryUsage(); -} - -uint64_t CGraphics_Threaded::StreamedMemoryUsage() const -{ - return m_pBackend->StreamedMemoryUsage(); -} - -uint64_t CGraphics_Threaded::StagingMemoryUsage() const -{ - return m_pBackend->StagingMemoryUsage(); -} - -const TTwGraphicsGpuList &CGraphics_Threaded::GetGpus() const -{ - return m_pBackend->GetGpus(); -} - -void CGraphics_Threaded::MapScreen(float TopLeftX, float TopLeftY, float BottomRightX, float BottomRightY) -{ - m_State.m_ScreenTL.x = TopLeftX; - m_State.m_ScreenTL.y = TopLeftY; - m_State.m_ScreenBR.x = BottomRightX; - m_State.m_ScreenBR.y = BottomRightY; -} - -void CGraphics_Threaded::GetScreen(float *pTopLeftX, float *pTopLeftY, float *pBottomRightX, float *pBottomRightY) -{ - *pTopLeftX = m_State.m_ScreenTL.x; - *pTopLeftY = m_State.m_ScreenTL.y; - *pBottomRightX = m_State.m_ScreenBR.x; - *pBottomRightY = m_State.m_ScreenBR.y; -} - -void CGraphics_Threaded::LinesBegin() -{ - dbg_assert(m_Drawing == 0, "called Graphics()->LinesBegin twice"); - m_Drawing = DRAWING_LINES; - SetColor(1, 1, 1, 1); -} - -void CGraphics_Threaded::LinesEnd() -{ - dbg_assert(m_Drawing == DRAWING_LINES, "called Graphics()->LinesEnd without begin"); - FlushVertices(); - m_Drawing = 0; -} - -void CGraphics_Threaded::LinesDraw(const CLineItem *pArray, int Num) -{ - dbg_assert(m_Drawing == DRAWING_LINES, "called Graphics()->LinesDraw without begin"); - - for(int i = 0; i < Num; ++i) - { - m_aVertices[m_NumVertices + 2 * i].m_Pos.x = pArray[i].m_X0; - m_aVertices[m_NumVertices + 2 * i].m_Pos.y = pArray[i].m_Y0; - m_aVertices[m_NumVertices + 2 * i].m_Tex = m_aTexture[0]; - SetColor(&m_aVertices[m_NumVertices + 2 * i], 0); - - m_aVertices[m_NumVertices + 2 * i + 1].m_Pos.x = pArray[i].m_X1; - m_aVertices[m_NumVertices + 2 * i + 1].m_Pos.y = pArray[i].m_Y1; - m_aVertices[m_NumVertices + 2 * i + 1].m_Tex = m_aTexture[1]; - SetColor(&m_aVertices[m_NumVertices + 2 * i + 1], 1); - } - - AddVertices(2 * Num); -} - -IGraphics::CTextureHandle CGraphics_Threaded::FindFreeTextureIndex() -{ - const size_t CurSize = m_vTextureIndices.size(); - if(m_FirstFreeTexture == CurSize) - { - m_vTextureIndices.resize(CurSize * 2); - for(size_t i = 0; i < CurSize; ++i) - m_vTextureIndices[CurSize + i] = CurSize + i + 1; - } - const size_t Tex = m_FirstFreeTexture; - m_FirstFreeTexture = m_vTextureIndices[Tex]; - m_vTextureIndices[Tex] = -1; - return CreateTextureHandle(Tex); -} - -void CGraphics_Threaded::FreeTextureIndex(CTextureHandle *pIndex) -{ - dbg_assert(pIndex->IsValid(), "Cannot free invalid texture index"); - dbg_assert(m_vTextureIndices[pIndex->Id()] == -1, "Cannot free already freed texture index"); - - m_vTextureIndices[pIndex->Id()] = m_FirstFreeTexture; - m_FirstFreeTexture = pIndex->Id(); - pIndex->Invalidate(); -} - -void CGraphics_Threaded::UnloadTexture(CTextureHandle *pIndex) -{ - if(pIndex->IsNullTexture() || !pIndex->IsValid()) - return; - - CCommandBuffer::SCommand_Texture_Destroy Cmd; - Cmd.m_Slot = pIndex->Id(); - AddCmd(Cmd); - - FreeTextureIndex(pIndex); -} - -IGraphics::CTextureHandle CGraphics_Threaded::LoadSpriteTexture(const CImageInfo &FromImageInfo, const CDataSprite *pSprite) -{ - int ImageGridX = FromImageInfo.m_Width / pSprite->m_pSet->m_Gridx; - int ImageGridY = FromImageInfo.m_Height / pSprite->m_pSet->m_Gridy; - int x = pSprite->m_X * ImageGridX; - int y = pSprite->m_Y * ImageGridY; - int w = pSprite->m_W * ImageGridX; - int h = pSprite->m_H * ImageGridY; - - CImageInfo SpriteInfo; - SpriteInfo.m_Width = w; - SpriteInfo.m_Height = h; - SpriteInfo.m_Format = FromImageInfo.m_Format; - SpriteInfo.m_pData = static_cast(malloc(SpriteInfo.DataSize())); - SpriteInfo.CopyRectFrom(FromImageInfo, x, y, w, h, 0, 0); - return LoadTextureRawMove(SpriteInfo, 0, pSprite->m_pName); -} - -bool CGraphics_Threaded::IsImageSubFullyTransparent(const CImageInfo &FromImageInfo, int x, int y, int w, int h) -{ - if(FromImageInfo.m_Format == CImageInfo::FORMAT_R || FromImageInfo.m_Format == CImageInfo::FORMAT_RA || FromImageInfo.m_Format == CImageInfo::FORMAT_RGBA) - { - const uint8_t *pImgData = FromImageInfo.m_pData; - const size_t PixelSize = FromImageInfo.PixelSize(); - for(int iy = 0; iy < h; ++iy) - { - for(int ix = 0; ix < w; ++ix) - { - const size_t RealOffset = (x + ix) * PixelSize + (y + iy) * PixelSize * FromImageInfo.m_Width; - if(pImgData[RealOffset + (PixelSize - 1)] > 0) - return false; - } - } - - return true; - } - return false; -} - -bool CGraphics_Threaded::IsSpriteTextureFullyTransparent(const CImageInfo &FromImageInfo, const CDataSprite *pSprite) -{ - int ImageGridX = FromImageInfo.m_Width / pSprite->m_pSet->m_Gridx; - int ImageGridY = FromImageInfo.m_Height / pSprite->m_pSet->m_Gridy; - int x = pSprite->m_X * ImageGridX; - int y = pSprite->m_Y * ImageGridY; - int w = pSprite->m_W * ImageGridX; - int h = pSprite->m_H * ImageGridY; - return IsImageSubFullyTransparent(FromImageInfo, x, y, w, h); -} - -void CGraphics_Threaded::LoadTextureAddWarning(size_t Width, size_t Height, int Flags, const char *pTexName) -{ - if((Flags & IGraphics::TEXLOAD_TO_2D_ARRAY_TEXTURE) != 0 || (Flags & IGraphics::TEXLOAD_TO_3D_TEXTURE) != 0) - { - if(Width == 0 || (Width % 16) != 0 || Height == 0 || (Height % 16) != 0) - { - SWarning NewWarning; - char aText[128]; - str_format(aText, sizeof(aText), "\"%s\"", pTexName ? pTexName : "(no name)"); - str_format(NewWarning.m_aWarningMsg, sizeof(NewWarning.m_aWarningMsg), Localize("The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs."), aText, 16, 16); - AddWarning(NewWarning); - } - } -} - -static CCommandBuffer::SCommand_Texture_Create LoadTextureCreateCommand(int TextureId, size_t Width, size_t Height, int Flags) -{ - CCommandBuffer::SCommand_Texture_Create Cmd; - Cmd.m_Slot = TextureId; - Cmd.m_Width = Width; - Cmd.m_Height = Height; - - Cmd.m_Flags = 0; - if((Flags & IGraphics::TEXLOAD_TO_2D_ARRAY_TEXTURE) != 0) - Cmd.m_Flags |= CCommandBuffer::TEXFLAG_TO_2D_ARRAY_TEXTURE; - if((Flags & IGraphics::TEXLOAD_TO_3D_TEXTURE) != 0) - Cmd.m_Flags |= CCommandBuffer::TEXFLAG_TO_3D_TEXTURE; - if((Flags & IGraphics::TEXLOAD_NO_2D_TEXTURE) != 0) - Cmd.m_Flags |= CCommandBuffer::TEXFLAG_NO_2D_TEXTURE; - - return Cmd; -} - -IGraphics::CTextureHandle CGraphics_Threaded::LoadTextureRaw(const CImageInfo &Image, int Flags, const char *pTexName) -{ - LoadTextureAddWarning(Image.m_Width, Image.m_Height, Flags, pTexName); - - if(Image.m_Width == 0 || Image.m_Height == 0) - return IGraphics::CTextureHandle(); - - IGraphics::CTextureHandle TextureHandle = FindFreeTextureIndex(); - CCommandBuffer::SCommand_Texture_Create Cmd = LoadTextureCreateCommand(TextureHandle.Id(), Image.m_Width, Image.m_Height, Flags); - - // Copy texture data and convert if necessary - uint8_t *pTmpData; - if(!ConvertToRgbaAlloc(pTmpData, Image)) - { - dbg_msg("graphics", "converted image '%s' to RGBA, consider making its file format RGBA", pTexName ? pTexName : "(no name)"); - } - Cmd.m_pData = pTmpData; - - AddCmd(Cmd); - - return TextureHandle; -} - -IGraphics::CTextureHandle CGraphics_Threaded::LoadTextureRawMove(CImageInfo &Image, int Flags, const char *pTexName) -{ - if(Image.m_Format != CImageInfo::FORMAT_RGBA) - { - // Moving not possible, texture needs to be converted - IGraphics::CTextureHandle TextureHandle = LoadTextureRaw(Image, Flags, pTexName); - Image.Free(); - return TextureHandle; - } - - LoadTextureAddWarning(Image.m_Width, Image.m_Height, Flags, pTexName); - - if(Image.m_Width == 0 || Image.m_Height == 0) - return IGraphics::CTextureHandle(); - - IGraphics::CTextureHandle TextureHandle = FindFreeTextureIndex(); - CCommandBuffer::SCommand_Texture_Create Cmd = LoadTextureCreateCommand(TextureHandle.Id(), Image.m_Width, Image.m_Height, Flags); - Cmd.m_pData = Image.m_pData; - Image.m_pData = nullptr; - Image.Free(); - AddCmd(Cmd); - - return TextureHandle; -} - -IGraphics::CTextureHandle CGraphics_Threaded::LoadTexture(const char *pFilename, int StorageType, int Flags) -{ - dbg_assert(pFilename[0] != '\0', "Cannot load texture from file with empty filename"); // would cause Valgrind to crash otherwise - - CImageInfo Image; - if(LoadPng(Image, pFilename, StorageType)) - { - CTextureHandle Id = LoadTextureRawMove(Image, Flags, pFilename); - if(Id.IsValid()) - { - if(g_Config.m_Debug) - dbg_msg("graphics/texture", "loaded %s", pFilename); - return Id; - } - } - - return m_NullTexture; -} - -bool CGraphics_Threaded::LoadTextTextures(size_t Width, size_t Height, CTextureHandle &TextTexture, CTextureHandle &TextOutlineTexture, uint8_t *pTextData, uint8_t *pTextOutlineData) -{ - if(Width == 0 || Height == 0) - return false; - - TextTexture = FindFreeTextureIndex(); - TextOutlineTexture = FindFreeTextureIndex(); - - CCommandBuffer::SCommand_TextTextures_Create Cmd; - Cmd.m_Slot = TextTexture.Id(); - Cmd.m_SlotOutline = TextOutlineTexture.Id(); - Cmd.m_Width = Width; - Cmd.m_Height = Height; - Cmd.m_pTextData = pTextData; - Cmd.m_pTextOutlineData = pTextOutlineData; - AddCmd(Cmd); - - return true; -} - -bool CGraphics_Threaded::UnloadTextTextures(CTextureHandle &TextTexture, CTextureHandle &TextOutlineTexture) -{ - CCommandBuffer::SCommand_TextTextures_Destroy Cmd; - Cmd.m_Slot = TextTexture.Id(); - Cmd.m_SlotOutline = TextOutlineTexture.Id(); - AddCmd(Cmd); - - if(TextTexture.IsValid()) - FreeTextureIndex(&TextTexture); - if(TextOutlineTexture.IsValid()) - FreeTextureIndex(&TextOutlineTexture); - return true; -} - -bool CGraphics_Threaded::UpdateTextTexture(CTextureHandle TextureId, int x, int y, size_t Width, size_t Height, uint8_t *pData, bool IsMovedPointer) -{ - CCommandBuffer::SCommand_TextTexture_Update Cmd; - Cmd.m_Slot = TextureId.Id(); - Cmd.m_X = x; - Cmd.m_Y = y; - Cmd.m_Width = Width; - Cmd.m_Height = Height; - - if(IsMovedPointer) - { - Cmd.m_pData = pData; - } - else - { - const size_t MemSize = Width * Height; - uint8_t *pTmpData = static_cast(malloc(MemSize)); - mem_copy(pTmpData, pData, MemSize); - Cmd.m_pData = pTmpData; - } - AddCmd(Cmd); - - return true; -} - -static SWarning FormatPngliteIncompatibilityWarning(int PngliteIncompatible, const char *pContextName) -{ - SWarning Warning; - str_format(Warning.m_aWarningMsg, sizeof(Warning.m_aWarningMsg), Localize("\"%s\" is not compatible with pnglite and cannot be loaded by old DDNet versions:"), pContextName); - str_append(Warning.m_aWarningMsg, " "); - static const int FLAGS[] = {CImageLoader::PNGLITE_COLOR_TYPE, CImageLoader::PNGLITE_BIT_DEPTH, CImageLoader::PNGLITE_INTERLACE_TYPE, CImageLoader::PNGLITE_COMPRESSION_TYPE, CImageLoader::PNGLITE_FILTER_TYPE}; - static const char *const EXPLANATION[] = {"color type", "bit depth", "interlace type", "compression type", "filter type"}; - - bool First = true; - for(size_t i = 0; i < std::size(FLAGS); ++i) - { - if((PngliteIncompatible & FLAGS[i]) != 0) - { - if(!First) - { - str_append(Warning.m_aWarningMsg, ", "); - } - str_append(Warning.m_aWarningMsg, EXPLANATION[i]); - First = false; - } - } - str_append(Warning.m_aWarningMsg, " unsupported"); - return Warning; -} - -bool CGraphics_Threaded::LoadPng(CImageInfo &Image, const char *pFilename, int StorageType) -{ - IOHANDLE File = m_pStorage->OpenFile(pFilename, IOFLAG_READ, StorageType); - - int PngliteIncompatible; - if(!CImageLoader::LoadPng(File, pFilename, Image, PngliteIncompatible)) - return false; - - if(m_WarnPngliteIncompatibleImages && PngliteIncompatible != 0) - { - AddWarning(FormatPngliteIncompatibilityWarning(PngliteIncompatible, pFilename)); - } - - return true; -} - -bool CGraphics_Threaded::LoadPng(CImageInfo &Image, const uint8_t *pData, size_t DataSize, const char *pContextName) -{ - CByteBufferReader Reader(pData, DataSize); - int PngliteIncompatible; - if(!CImageLoader::LoadPng(Reader, pContextName, Image, PngliteIncompatible)) - return false; - - if(m_WarnPngliteIncompatibleImages && PngliteIncompatible != 0) - { - AddWarning(FormatPngliteIncompatibilityWarning(PngliteIncompatible, pContextName)); - } - - return true; -} - -bool CGraphics_Threaded::CheckImageDivisibility(const char *pContextName, CImageInfo &Image, int DivX, int DivY, bool AllowResize) -{ - dbg_assert(DivX != 0 && DivY != 0, "Passing 0 to this function is not allowed."); - bool ImageIsValid = true; - bool WidthBroken = Image.m_Width == 0 || (Image.m_Width % DivX) != 0; - bool HeightBroken = Image.m_Height == 0 || (Image.m_Height % DivY) != 0; - if(WidthBroken || HeightBroken) - { - SWarning NewWarning; - char aContextNameQuoted[128]; - str_format(aContextNameQuoted, sizeof(aContextNameQuoted), "\"%s\"", pContextName); - str_format(NewWarning.m_aWarningMsg, sizeof(NewWarning.m_aWarningMsg), - Localize("The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs."), aContextNameQuoted, DivX, DivY); - AddWarning(NewWarning); - ImageIsValid = false; - } - - if(AllowResize && !ImageIsValid && Image.m_Width > 0 && Image.m_Height > 0) - { - int NewWidth = DivX; - int NewHeight = DivY; - if(WidthBroken) - { - NewWidth = maximum(HighestBit(Image.m_Width), DivX); - NewHeight = (NewWidth / DivX) * DivY; - } - else - { - NewHeight = maximum(HighestBit(Image.m_Height), DivY); - NewWidth = (NewHeight / DivY) * DivX; - } - ResizeImage(Image, NewWidth, NewHeight); - ImageIsValid = true; - } - - return ImageIsValid; -} - -bool CGraphics_Threaded::IsImageFormatRgba(const char *pContextName, const CImageInfo &Image) -{ - if(Image.m_Format != CImageInfo::FORMAT_RGBA) - { - SWarning NewWarning; - char aContextNameQuoted[128]; - str_format(aContextNameQuoted, sizeof(aContextNameQuoted), "\"%s\"", pContextName); - str_format(NewWarning.m_aWarningMsg, sizeof(NewWarning.m_aWarningMsg), - Localize("The format of texture %s is not RGBA which will cause visual bugs."), aContextNameQuoted); - AddWarning(NewWarning); - return false; - } - return true; -} - -void CGraphics_Threaded::KickCommandBuffer() -{ - m_pBackend->RunBuffer(m_pCommandBuffer); - - std::vector WarningStrings; - if(m_pBackend->GetWarning(WarningStrings)) - { - SWarning NewWarning; - std::string WarningStr; - for(const auto &WarnStr : WarningStrings) - WarningStr.append((WarnStr + "\n")); - str_copy(NewWarning.m_aWarningMsg, WarningStr.c_str()); - AddWarning(NewWarning); - } - - // swap buffer - m_CurrentCommandBuffer ^= 1; - m_pCommandBuffer = m_apCommandBuffers[m_CurrentCommandBuffer]; - m_pCommandBuffer->Reset(); -} - -class CScreenshotSaveJob : public IJob -{ - IStorage *m_pStorage; - IConsole *m_pConsole; - char m_aName[IO_MAX_PATH_LENGTH]; - CImageInfo m_Image; - - void Run() override - { - char aWholePath[IO_MAX_PATH_LENGTH]; - char aBuf[64 + IO_MAX_PATH_LENGTH]; - if(CImageLoader::SavePng(m_pStorage->OpenFile(m_aName, IOFLAG_WRITE, IStorage::TYPE_SAVE, aWholePath, sizeof(aWholePath)), m_aName, m_Image)) - { - str_format(aBuf, sizeof(aBuf), "saved screenshot to '%s'", aWholePath); - } - else - { - str_format(aBuf, sizeof(aBuf), "failed to save screenshot to '%s'", aWholePath); - } - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", aBuf, ColorRGBA(1.0f, 0.6f, 0.3f, 1.0f)); - } - -public: - CScreenshotSaveJob(IStorage *pStorage, IConsole *pConsole, const char *pName, CImageInfo Image) : - m_pStorage(pStorage), - m_pConsole(pConsole), - m_Image(Image) - { - str_copy(m_aName, pName); - } - - ~CScreenshotSaveJob() override - { - m_Image.Free(); - } -}; - -void CGraphics_Threaded::ScreenshotDirect(bool *pSwapped) -{ - if(!m_DoScreenshot) - return; - m_DoScreenshot = false; - if(!WindowActive()) - return; - - CImageInfo Image; - - CCommandBuffer::SCommand_TrySwapAndScreenshot Cmd; - Cmd.m_pImage = &Image; - Cmd.m_pSwapped = pSwapped; - AddCmd(Cmd); - - KickCommandBuffer(); - WaitForIdle(); - - if(Image.m_pData) - { - m_pEngine->AddJob(std::make_shared(m_pStorage, m_pConsole, m_aScreenshotName, Image)); - } -} - -void CGraphics_Threaded::TextureSet(CTextureHandle TextureId) -{ - dbg_assert(m_Drawing == 0, "called Graphics()->TextureSet within begin"); - dbg_assert(!TextureId.IsValid() || m_vTextureIndices[TextureId.Id()] == -1, "Texture handle was not invalid, but also did not correlate to an existing texture."); - m_State.m_Texture = TextureId.Id(); -} - -void CGraphics_Threaded::Clear(float r, float g, float b, bool ForceClearNow) -{ - CCommandBuffer::SCommand_Clear Cmd; - Cmd.m_Color.r = r; - Cmd.m_Color.g = g; - Cmd.m_Color.b = b; - Cmd.m_Color.a = 0; - Cmd.m_ForceClear = ForceClearNow; - AddCmd(Cmd); -} - -void CGraphics_Threaded::QuadsBegin() -{ - dbg_assert(m_Drawing == 0, "called Graphics()->QuadsBegin twice"); - m_Drawing = DRAWING_QUADS; - - QuadsSetSubset(0, 0, 1, 1); - QuadsSetRotation(0); - SetColor(1, 1, 1, 1); -} - -void CGraphics_Threaded::QuadsEnd() -{ - dbg_assert(m_Drawing == DRAWING_QUADS, "called Graphics()->QuadsEnd without begin"); - FlushVertices(); - m_Drawing = 0; -} - -void CGraphics_Threaded::QuadsTex3DBegin() -{ - QuadsBegin(); -} - -void CGraphics_Threaded::QuadsTex3DEnd() -{ - dbg_assert(m_Drawing == DRAWING_QUADS, "called Graphics()->QuadsEnd without begin"); - FlushVerticesTex3D(); - m_Drawing = 0; -} - -void CGraphics_Threaded::TrianglesBegin() -{ - dbg_assert(m_Drawing == 0, "called Graphics()->TrianglesBegin twice"); - m_Drawing = DRAWING_TRIANGLES; - - QuadsSetSubset(0, 0, 1, 1); - QuadsSetRotation(0); - SetColor(1, 1, 1, 1); -} - -void CGraphics_Threaded::TrianglesEnd() -{ - dbg_assert(m_Drawing == DRAWING_TRIANGLES, "called Graphics()->TrianglesEnd without begin"); - FlushVertices(); - m_Drawing = 0; -} - -void CGraphics_Threaded::QuadsEndKeepVertices() -{ - dbg_assert(m_Drawing == DRAWING_QUADS, "called Graphics()->QuadsEndKeepVertices without begin"); - FlushVertices(true); - m_Drawing = 0; -} - -void CGraphics_Threaded::QuadsDrawCurrentVertices(bool KeepVertices) -{ - m_Drawing = DRAWING_QUADS; - FlushVertices(KeepVertices); - m_Drawing = 0; -} - -void CGraphics_Threaded::QuadsSetRotation(float Angle) -{ - m_Rotation = Angle; -} - -static unsigned char NormalizeColorComponent(float ColorComponent) -{ - return (unsigned char)(clamp(ColorComponent, 0.0f, 1.0f) * 255.0f + 0.5f); // +0.5f to round to nearest -} - -void CGraphics_Threaded::SetColorVertex(const CColorVertex *pArray, size_t Num) -{ - dbg_assert(m_Drawing != 0, "called Graphics()->SetColorVertex without begin"); - - for(size_t i = 0; i < Num; ++i) - { - const CColorVertex &Vertex = pArray[i]; - CCommandBuffer::SColor &Color = m_aColor[Vertex.m_Index]; - Color.r = NormalizeColorComponent(Vertex.m_R); - Color.g = NormalizeColorComponent(Vertex.m_G); - Color.b = NormalizeColorComponent(Vertex.m_B); - Color.a = NormalizeColorComponent(Vertex.m_A); - } -} - -void CGraphics_Threaded::SetColor(float r, float g, float b, float a) -{ - CCommandBuffer::SColor NewColor; - NewColor.r = NormalizeColorComponent(r); - NewColor.g = NormalizeColorComponent(g); - NewColor.b = NormalizeColorComponent(b); - NewColor.a = NormalizeColorComponent(a); - for(CCommandBuffer::SColor &Color : m_aColor) - { - Color = NewColor; - } -} - -void CGraphics_Threaded::SetColor(ColorRGBA Color) -{ - SetColor(Color.r, Color.g, Color.b, Color.a); -} - -void CGraphics_Threaded::SetColor4(ColorRGBA TopLeft, ColorRGBA TopRight, ColorRGBA BottomLeft, ColorRGBA BottomRight) -{ - CColorVertex aArray[] = { - CColorVertex(0, TopLeft), - CColorVertex(1, TopRight), - CColorVertex(2, BottomRight), - CColorVertex(3, BottomLeft)}; - SetColorVertex(aArray, std::size(aArray)); -} - -void CGraphics_Threaded::ChangeColorOfCurrentQuadVertices(float r, float g, float b, float a) -{ - m_aColor[0].r = NormalizeColorComponent(r); - m_aColor[0].g = NormalizeColorComponent(g); - m_aColor[0].b = NormalizeColorComponent(b); - m_aColor[0].a = NormalizeColorComponent(a); - - for(int i = 0; i < m_NumVertices; ++i) - { - SetColor(&m_aVertices[i], 0); - } -} - -void CGraphics_Threaded::ChangeColorOfQuadVertices(size_t QuadOffset, unsigned char r, unsigned char g, unsigned char b, unsigned char a) -{ - const CCommandBuffer::SColor Color(r, g, b, a); - const size_t VertNum = g_Config.m_GfxQuadAsTriangle && !m_GLUseTrianglesAsQuad ? 6 : 4; - for(size_t i = 0; i < VertNum; ++i) - { - m_aVertices[QuadOffset * VertNum + i].m_Color = Color; - } -} - -void CGraphics_Threaded::QuadsSetSubset(float TlU, float TlV, float BrU, float BrV) -{ - m_aTexture[0].u = TlU; - m_aTexture[1].u = BrU; - m_aTexture[0].v = TlV; - m_aTexture[1].v = TlV; - - m_aTexture[3].u = TlU; - m_aTexture[2].u = BrU; - m_aTexture[3].v = BrV; - m_aTexture[2].v = BrV; -} - -void CGraphics_Threaded::QuadsSetSubsetFree( - float x0, float y0, float x1, float y1, - float x2, float y2, float x3, float y3, int Index) -{ - m_aTexture[0].u = x0; - m_aTexture[0].v = y0; - m_aTexture[1].u = x1; - m_aTexture[1].v = y1; - m_aTexture[2].u = x2; - m_aTexture[2].v = y2; - m_aTexture[3].u = x3; - m_aTexture[3].v = y3; - m_CurIndex = Index; -} - -void CGraphics_Threaded::QuadsDraw(CQuadItem *pArray, int Num) -{ - for(int i = 0; i < Num; ++i) - { - pArray[i].m_X -= pArray[i].m_Width / 2; - pArray[i].m_Y -= pArray[i].m_Height / 2; - } - - QuadsDrawTL(pArray, Num); -} - -void CGraphics_Threaded::QuadsDrawTL(const CQuadItem *pArray, int Num) -{ - QuadsDrawTLImpl(m_aVertices, pArray, Num); -} - -void CGraphics_Threaded::QuadsTex3DDrawTL(const CQuadItem *pArray, int Num) -{ - const int VertNum = g_Config.m_GfxQuadAsTriangle && !m_GLUseTrianglesAsQuad ? 6 : 4; - const float CurIndex = Uses2DTextureArrays() ? m_CurIndex : (m_CurIndex + 0.5f) / 256.0f; - - for(int i = 0; i < Num; ++i) - { - for(int n = 0; n < VertNum; ++n) - { - m_aVerticesTex3D[m_NumVertices + VertNum * i + n].m_Tex.w = CurIndex; - } - } - - QuadsDrawTLImpl(m_aVerticesTex3D, pArray, Num); -} - -void CGraphics_Threaded::QuadsDrawFreeform(const CFreeformItem *pArray, int Num) -{ - dbg_assert(m_Drawing == DRAWING_QUADS || m_Drawing == DRAWING_TRIANGLES, "called Graphics()->QuadsDrawFreeform without begin"); - - if((g_Config.m_GfxQuadAsTriangle && !m_GLUseTrianglesAsQuad) || m_Drawing == DRAWING_TRIANGLES) - { - for(int i = 0; i < Num; ++i) - { - m_aVertices[m_NumVertices + 6 * i].m_Pos.x = pArray[i].m_X0; - m_aVertices[m_NumVertices + 6 * i].m_Pos.y = pArray[i].m_Y0; - m_aVertices[m_NumVertices + 6 * i].m_Tex = m_aTexture[0]; - SetColor(&m_aVertices[m_NumVertices + 6 * i], 0); - - m_aVertices[m_NumVertices + 6 * i + 1].m_Pos.x = pArray[i].m_X1; - m_aVertices[m_NumVertices + 6 * i + 1].m_Pos.y = pArray[i].m_Y1; - m_aVertices[m_NumVertices + 6 * i + 1].m_Tex = m_aTexture[1]; - SetColor(&m_aVertices[m_NumVertices + 6 * i + 1], 1); - - m_aVertices[m_NumVertices + 6 * i + 2].m_Pos.x = pArray[i].m_X3; - m_aVertices[m_NumVertices + 6 * i + 2].m_Pos.y = pArray[i].m_Y3; - m_aVertices[m_NumVertices + 6 * i + 2].m_Tex = m_aTexture[3]; - SetColor(&m_aVertices[m_NumVertices + 6 * i + 2], 3); - - m_aVertices[m_NumVertices + 6 * i + 3].m_Pos.x = pArray[i].m_X0; - m_aVertices[m_NumVertices + 6 * i + 3].m_Pos.y = pArray[i].m_Y0; - m_aVertices[m_NumVertices + 6 * i + 3].m_Tex = m_aTexture[0]; - SetColor(&m_aVertices[m_NumVertices + 6 * i + 3], 0); - - m_aVertices[m_NumVertices + 6 * i + 4].m_Pos.x = pArray[i].m_X3; - m_aVertices[m_NumVertices + 6 * i + 4].m_Pos.y = pArray[i].m_Y3; - m_aVertices[m_NumVertices + 6 * i + 4].m_Tex = m_aTexture[3]; - SetColor(&m_aVertices[m_NumVertices + 6 * i + 4], 3); - - m_aVertices[m_NumVertices + 6 * i + 5].m_Pos.x = pArray[i].m_X2; - m_aVertices[m_NumVertices + 6 * i + 5].m_Pos.y = pArray[i].m_Y2; - m_aVertices[m_NumVertices + 6 * i + 5].m_Tex = m_aTexture[2]; - SetColor(&m_aVertices[m_NumVertices + 6 * i + 5], 2); - } - - AddVertices(3 * 2 * Num); - } - else - { - for(int i = 0; i < Num; ++i) - { - m_aVertices[m_NumVertices + 4 * i].m_Pos.x = pArray[i].m_X0; - m_aVertices[m_NumVertices + 4 * i].m_Pos.y = pArray[i].m_Y0; - m_aVertices[m_NumVertices + 4 * i].m_Tex = m_aTexture[0]; - SetColor(&m_aVertices[m_NumVertices + 4 * i], 0); - - m_aVertices[m_NumVertices + 4 * i + 1].m_Pos.x = pArray[i].m_X1; - m_aVertices[m_NumVertices + 4 * i + 1].m_Pos.y = pArray[i].m_Y1; - m_aVertices[m_NumVertices + 4 * i + 1].m_Tex = m_aTexture[1]; - SetColor(&m_aVertices[m_NumVertices + 4 * i + 1], 1); - - m_aVertices[m_NumVertices + 4 * i + 2].m_Pos.x = pArray[i].m_X3; - m_aVertices[m_NumVertices + 4 * i + 2].m_Pos.y = pArray[i].m_Y3; - m_aVertices[m_NumVertices + 4 * i + 2].m_Tex = m_aTexture[3]; - SetColor(&m_aVertices[m_NumVertices + 4 * i + 2], 3); - - m_aVertices[m_NumVertices + 4 * i + 3].m_Pos.x = pArray[i].m_X2; - m_aVertices[m_NumVertices + 4 * i + 3].m_Pos.y = pArray[i].m_Y2; - m_aVertices[m_NumVertices + 4 * i + 3].m_Tex = m_aTexture[2]; - SetColor(&m_aVertices[m_NumVertices + 4 * i + 3], 2); - } - - AddVertices(4 * Num); - } -} - -void CGraphics_Threaded::QuadsText(float x, float y, float Size, const char *pText) -{ - float StartX = x; - - while(*pText) - { - char c = *pText; - pText++; - - if(c == '\n') - { - x = StartX; - y += Size; - } - else - { - QuadsSetSubset( - (c % 16) / 16.0f, - (c / 16) / 16.0f, - (c % 16) / 16.0f + 1.0f / 16.0f, - (c / 16) / 16.0f + 1.0f / 16.0f); - - CQuadItem QuadItem(x, y, Size, Size); - QuadsDrawTL(&QuadItem, 1); - x += Size / 2; - } - } -} - -void CGraphics_Threaded::DrawRectExt(float x, float y, float w, float h, float r, int Corners) -{ - const int NumSegments = 8; - const float SegmentsAngle = pi / 2 / NumSegments; - IGraphics::CFreeformItem aFreeform[NumSegments * 4]; - size_t NumItems = 0; - - for(int i = 0; i < NumSegments; i += 2) - { - float a1 = i * SegmentsAngle; - float a2 = (i + 1) * SegmentsAngle; - float a3 = (i + 2) * SegmentsAngle; - float Ca1 = std::cos(a1); - float Ca2 = std::cos(a2); - float Ca3 = std::cos(a3); - float Sa1 = std::sin(a1); - float Sa2 = std::sin(a2); - float Sa3 = std::sin(a3); - - if(Corners & CORNER_TL) - aFreeform[NumItems++] = IGraphics::CFreeformItem( - x + r, y + r, - x + (1 - Ca1) * r, y + (1 - Sa1) * r, - x + (1 - Ca3) * r, y + (1 - Sa3) * r, - x + (1 - Ca2) * r, y + (1 - Sa2) * r); - - if(Corners & CORNER_TR) - aFreeform[NumItems++] = IGraphics::CFreeformItem( - x + w - r, y + r, - x + w - r + Ca1 * r, y + (1 - Sa1) * r, - x + w - r + Ca3 * r, y + (1 - Sa3) * r, - x + w - r + Ca2 * r, y + (1 - Sa2) * r); - - if(Corners & CORNER_BL) - aFreeform[NumItems++] = IGraphics::CFreeformItem( - x + r, y + h - r, - x + (1 - Ca1) * r, y + h - r + Sa1 * r, - x + (1 - Ca3) * r, y + h - r + Sa3 * r, - x + (1 - Ca2) * r, y + h - r + Sa2 * r); - - if(Corners & CORNER_BR) - aFreeform[NumItems++] = IGraphics::CFreeformItem( - x + w - r, y + h - r, - x + w - r + Ca1 * r, y + h - r + Sa1 * r, - x + w - r + Ca3 * r, y + h - r + Sa3 * r, - x + w - r + Ca2 * r, y + h - r + Sa2 * r); - } - QuadsDrawFreeform(aFreeform, NumItems); - - CQuadItem aQuads[9]; - NumItems = 0; - aQuads[NumItems++] = CQuadItem(x + r, y + r, w - r * 2, h - r * 2); // center - aQuads[NumItems++] = CQuadItem(x + r, y, w - r * 2, r); // top - aQuads[NumItems++] = CQuadItem(x + r, y + h - r, w - r * 2, r); // bottom - aQuads[NumItems++] = CQuadItem(x, y + r, r, h - r * 2); // left - aQuads[NumItems++] = CQuadItem(x + w - r, y + r, r, h - r * 2); // right - - if(!(Corners & CORNER_TL)) - aQuads[NumItems++] = CQuadItem(x, y, r, r); - if(!(Corners & CORNER_TR)) - aQuads[NumItems++] = CQuadItem(x + w, y, -r, r); - if(!(Corners & CORNER_BL)) - aQuads[NumItems++] = CQuadItem(x, y + h, r, -r); - if(!(Corners & CORNER_BR)) - aQuads[NumItems++] = CQuadItem(x + w, y + h, -r, -r); - - QuadsDrawTL(aQuads, NumItems); -} - -void CGraphics_Threaded::DrawRectExt4(float x, float y, float w, float h, ColorRGBA ColorTopLeft, ColorRGBA ColorTopRight, ColorRGBA ColorBottomLeft, ColorRGBA ColorBottomRight, float r, int Corners) -{ - if(Corners == 0 || r == 0.0f) - { - SetColor4(ColorTopLeft, ColorTopRight, ColorBottomLeft, ColorBottomRight); - CQuadItem ItemQ = CQuadItem(x, y, w, h); - QuadsDrawTL(&ItemQ, 1); - return; - } - - const int NumSegments = 8; - const float SegmentsAngle = pi / 2 / NumSegments; - for(int i = 0; i < NumSegments; i += 2) - { - float a1 = i * SegmentsAngle; - float a2 = (i + 1) * SegmentsAngle; - float a3 = (i + 2) * SegmentsAngle; - float Ca1 = std::cos(a1); - float Ca2 = std::cos(a2); - float Ca3 = std::cos(a3); - float Sa1 = std::sin(a1); - float Sa2 = std::sin(a2); - float Sa3 = std::sin(a3); - - if(Corners & CORNER_TL) - { - SetColor(ColorTopLeft); - IGraphics::CFreeformItem ItemF = IGraphics::CFreeformItem( - x + r, y + r, - x + (1 - Ca1) * r, y + (1 - Sa1) * r, - x + (1 - Ca3) * r, y + (1 - Sa3) * r, - x + (1 - Ca2) * r, y + (1 - Sa2) * r); - QuadsDrawFreeform(&ItemF, 1); - } - - if(Corners & CORNER_TR) - { - SetColor(ColorTopRight); - IGraphics::CFreeformItem ItemF = IGraphics::CFreeformItem( - x + w - r, y + r, - x + w - r + Ca1 * r, y + (1 - Sa1) * r, - x + w - r + Ca3 * r, y + (1 - Sa3) * r, - x + w - r + Ca2 * r, y + (1 - Sa2) * r); - QuadsDrawFreeform(&ItemF, 1); - } - - if(Corners & CORNER_BL) - { - SetColor(ColorBottomLeft); - IGraphics::CFreeformItem ItemF = IGraphics::CFreeformItem( - x + r, y + h - r, - x + (1 - Ca1) * r, y + h - r + Sa1 * r, - x + (1 - Ca3) * r, y + h - r + Sa3 * r, - x + (1 - Ca2) * r, y + h - r + Sa2 * r); - QuadsDrawFreeform(&ItemF, 1); - } - - if(Corners & CORNER_BR) - { - SetColor(ColorBottomRight); - IGraphics::CFreeformItem ItemF = IGraphics::CFreeformItem( - x + w - r, y + h - r, - x + w - r + Ca1 * r, y + h - r + Sa1 * r, - x + w - r + Ca3 * r, y + h - r + Sa3 * r, - x + w - r + Ca2 * r, y + h - r + Sa2 * r); - QuadsDrawFreeform(&ItemF, 1); - } - } - - SetColor4(ColorTopLeft, ColorTopRight, ColorBottomLeft, ColorBottomRight); - CQuadItem ItemQ = CQuadItem(x + r, y + r, w - r * 2, h - r * 2); // center - QuadsDrawTL(&ItemQ, 1); - - SetColor4(ColorTopLeft, ColorTopRight, ColorTopLeft, ColorTopRight); - ItemQ = CQuadItem(x + r, y, w - r * 2, r); // top - QuadsDrawTL(&ItemQ, 1); - - SetColor4(ColorBottomLeft, ColorBottomRight, ColorBottomLeft, ColorBottomRight); - ItemQ = CQuadItem(x + r, y + h - r, w - r * 2, r); // bottom - QuadsDrawTL(&ItemQ, 1); - - SetColor4(ColorTopLeft, ColorTopLeft, ColorBottomLeft, ColorBottomLeft); - ItemQ = CQuadItem(x, y + r, r, h - r * 2); // left - QuadsDrawTL(&ItemQ, 1); - - SetColor4(ColorTopRight, ColorTopRight, ColorBottomRight, ColorBottomRight); - ItemQ = CQuadItem(x + w - r, y + r, r, h - r * 2); // right - QuadsDrawTL(&ItemQ, 1); - - if(!(Corners & CORNER_TL)) - { - SetColor(ColorTopLeft); - ItemQ = CQuadItem(x, y, r, r); - QuadsDrawTL(&ItemQ, 1); - } - - if(!(Corners & CORNER_TR)) - { - SetColor(ColorTopRight); - ItemQ = CQuadItem(x + w, y, -r, r); - QuadsDrawTL(&ItemQ, 1); - } - - if(!(Corners & CORNER_BL)) - { - SetColor(ColorBottomLeft); - ItemQ = CQuadItem(x, y + h, r, -r); - QuadsDrawTL(&ItemQ, 1); - } - - if(!(Corners & CORNER_BR)) - { - SetColor(ColorBottomRight); - ItemQ = CQuadItem(x + w, y + h, -r, -r); - QuadsDrawTL(&ItemQ, 1); - } -} - -int CGraphics_Threaded::CreateRectQuadContainer(float x, float y, float w, float h, float r, int Corners) -{ - int ContainerIndex = CreateQuadContainer(false); - - if(Corners == 0 || r == 0.0f) - { - CQuadItem ItemQ = CQuadItem(x, y, w, h); - QuadContainerAddQuads(ContainerIndex, &ItemQ, 1); - QuadContainerUpload(ContainerIndex); - QuadContainerChangeAutomaticUpload(ContainerIndex, true); - return ContainerIndex; - } - - const int NumSegments = 8; - const float SegmentsAngle = pi / 2 / NumSegments; - IGraphics::CFreeformItem aFreeform[NumSegments * 4]; - size_t NumItems = 0; - - for(int i = 0; i < NumSegments; i += 2) - { - float a1 = i * SegmentsAngle; - float a2 = (i + 1) * SegmentsAngle; - float a3 = (i + 2) * SegmentsAngle; - float Ca1 = std::cos(a1); - float Ca2 = std::cos(a2); - float Ca3 = std::cos(a3); - float Sa1 = std::sin(a1); - float Sa2 = std::sin(a2); - float Sa3 = std::sin(a3); - - if(Corners & CORNER_TL) - aFreeform[NumItems++] = IGraphics::CFreeformItem( - x + r, y + r, - x + (1 - Ca1) * r, y + (1 - Sa1) * r, - x + (1 - Ca3) * r, y + (1 - Sa3) * r, - x + (1 - Ca2) * r, y + (1 - Sa2) * r); - - if(Corners & CORNER_TR) - aFreeform[NumItems++] = IGraphics::CFreeformItem( - x + w - r, y + r, - x + w - r + Ca1 * r, y + (1 - Sa1) * r, - x + w - r + Ca3 * r, y + (1 - Sa3) * r, - x + w - r + Ca2 * r, y + (1 - Sa2) * r); - - if(Corners & CORNER_BL) - aFreeform[NumItems++] = IGraphics::CFreeformItem( - x + r, y + h - r, - x + (1 - Ca1) * r, y + h - r + Sa1 * r, - x + (1 - Ca3) * r, y + h - r + Sa3 * r, - x + (1 - Ca2) * r, y + h - r + Sa2 * r); - - if(Corners & CORNER_BR) - aFreeform[NumItems++] = IGraphics::CFreeformItem( - x + w - r, y + h - r, - x + w - r + Ca1 * r, y + h - r + Sa1 * r, - x + w - r + Ca3 * r, y + h - r + Sa3 * r, - x + w - r + Ca2 * r, y + h - r + Sa2 * r); - } - - if(NumItems > 0) - QuadContainerAddQuads(ContainerIndex, aFreeform, NumItems); - - CQuadItem aQuads[9]; - NumItems = 0; - aQuads[NumItems++] = CQuadItem(x + r, y + r, w - r * 2, h - r * 2); // center - aQuads[NumItems++] = CQuadItem(x + r, y, w - r * 2, r); // top - aQuads[NumItems++] = CQuadItem(x + r, y + h - r, w - r * 2, r); // bottom - aQuads[NumItems++] = CQuadItem(x, y + r, r, h - r * 2); // left - aQuads[NumItems++] = CQuadItem(x + w - r, y + r, r, h - r * 2); // right - - if(!(Corners & CORNER_TL)) - aQuads[NumItems++] = CQuadItem(x, y, r, r); - if(!(Corners & CORNER_TR)) - aQuads[NumItems++] = CQuadItem(x + w, y, -r, r); - if(!(Corners & CORNER_BL)) - aQuads[NumItems++] = CQuadItem(x, y + h, r, -r); - if(!(Corners & CORNER_BR)) - aQuads[NumItems++] = CQuadItem(x + w, y + h, -r, -r); - - if(NumItems > 0) - QuadContainerAddQuads(ContainerIndex, aQuads, NumItems); - - QuadContainerUpload(ContainerIndex); - QuadContainerChangeAutomaticUpload(ContainerIndex, true); - - return ContainerIndex; -} - -void CGraphics_Threaded::DrawRect(float x, float y, float w, float h, ColorRGBA Color, int Corners, float Rounding) -{ - TextureClear(); - QuadsBegin(); - SetColor(Color); - DrawRectExt(x, y, w, h, Rounding, Corners); - QuadsEnd(); -} - -void CGraphics_Threaded::DrawRect4(float x, float y, float w, float h, ColorRGBA ColorTopLeft, ColorRGBA ColorTopRight, ColorRGBA ColorBottomLeft, ColorRGBA ColorBottomRight, int Corners, float Rounding) -{ - TextureClear(); - QuadsBegin(); - DrawRectExt4(x, y, w, h, ColorTopLeft, ColorTopRight, ColorBottomLeft, ColorBottomRight, Rounding, Corners); - QuadsEnd(); -} - -void CGraphics_Threaded::DrawCircle(float CenterX, float CenterY, float Radius, int Segments) -{ - IGraphics::CFreeformItem aItems[32]; - size_t NumItems = 0; - const float SegmentsAngle = 2 * pi / Segments; - for(int i = 0; i < Segments; i += 2) - { - const float a1 = i * SegmentsAngle; - const float a2 = (i + 1) * SegmentsAngle; - const float a3 = (i + 2) * SegmentsAngle; - aItems[NumItems++] = IGraphics::CFreeformItem( - CenterX, CenterY, - CenterX + std::cos(a1) * Radius, CenterY + std::sin(a1) * Radius, - CenterX + std::cos(a3) * Radius, CenterY + std::sin(a3) * Radius, - CenterX + std::cos(a2) * Radius, CenterY + std::sin(a2) * Radius); - if(NumItems == std::size(aItems)) - { - QuadsDrawFreeform(aItems, std::size(aItems)); - NumItems = 0; - } - } - if(NumItems) - QuadsDrawFreeform(aItems, NumItems); -} - -void CGraphics_Threaded::RenderTileLayer(int BufferContainerIndex, const ColorRGBA &Color, char **pOffsets, unsigned int *pIndicedVertexDrawNum, size_t NumIndicesOffset) -{ - if(NumIndicesOffset == 0) - return; - - // add the VertexArrays and draw - CCommandBuffer::SCommand_RenderTileLayer Cmd; - Cmd.m_State = m_State; - Cmd.m_IndicesDrawNum = NumIndicesOffset; - Cmd.m_BufferContainerIndex = BufferContainerIndex; - Cmd.m_Color = Color; - - void *pData = m_pCommandBuffer->AllocData((sizeof(char *) + sizeof(unsigned int)) * NumIndicesOffset); - if(pData == 0x0) - { - // kick command buffer and try again - KickCommandBuffer(); - - pData = m_pCommandBuffer->AllocData((sizeof(char *) + sizeof(unsigned int)) * NumIndicesOffset); - if(pData == 0x0) - { - dbg_msg("graphics", "failed to allocate data for vertices"); - return; - } - } - Cmd.m_pIndicesOffsets = (char **)pData; - Cmd.m_pDrawCount = (unsigned int *)(((char *)pData) + (sizeof(char *) * NumIndicesOffset)); - - AddCmd(Cmd, [&] { - pData = m_pCommandBuffer->AllocData((sizeof(char *) + sizeof(unsigned int)) * NumIndicesOffset); - if(pData == nullptr) - return false; - Cmd.m_pIndicesOffsets = (char **)pData; - Cmd.m_pDrawCount = (unsigned int *)(((char *)pData) + (sizeof(char *) * NumIndicesOffset)); - return true; - }); - - mem_copy(Cmd.m_pIndicesOffsets, pOffsets, sizeof(char *) * NumIndicesOffset); - mem_copy(Cmd.m_pDrawCount, pIndicedVertexDrawNum, sizeof(unsigned int) * NumIndicesOffset); - - m_pCommandBuffer->AddRenderCalls(NumIndicesOffset); - // todo max indices group check!! -} - -void CGraphics_Threaded::RenderBorderTiles(int BufferContainerIndex, const ColorRGBA &Color, char *pIndexBufferOffset, const vec2 &Offset, const vec2 &Scale, uint32_t DrawNum) -{ - if(DrawNum == 0) - return; - // Draw a border tile a lot of times - CCommandBuffer::SCommand_RenderBorderTile Cmd; - Cmd.m_State = m_State; - Cmd.m_DrawNum = DrawNum; - Cmd.m_BufferContainerIndex = BufferContainerIndex; - Cmd.m_Color = Color; - - Cmd.m_pIndicesOffset = pIndexBufferOffset; - - Cmd.m_Offset = Offset; - Cmd.m_Scale = Scale; - - AddCmd(Cmd); - - m_pCommandBuffer->AddRenderCalls(1); -} - -void CGraphics_Threaded::RenderQuadLayer(int BufferContainerIndex, SQuadRenderInfo *pQuadInfo, size_t QuadNum, int QuadOffset) -{ - if(QuadNum == 0) - return; - - // add the VertexArrays and draw - CCommandBuffer::SCommand_RenderQuadLayer Cmd; - Cmd.m_State = m_State; - Cmd.m_QuadNum = QuadNum; - Cmd.m_QuadOffset = QuadOffset; - Cmd.m_BufferContainerIndex = BufferContainerIndex; - Cmd.m_pQuadInfo = (SQuadRenderInfo *)AllocCommandBufferData(Cmd.m_QuadNum * sizeof(SQuadRenderInfo)); - - AddCmd(Cmd, [&] { - Cmd.m_pQuadInfo = (SQuadRenderInfo *)m_pCommandBuffer->AllocData(QuadNum * sizeof(SQuadRenderInfo)); - return Cmd.m_pQuadInfo != nullptr; - }); - - mem_copy(Cmd.m_pQuadInfo, pQuadInfo, sizeof(SQuadRenderInfo) * QuadNum); - - m_pCommandBuffer->AddRenderCalls(((QuadNum - 1) / gs_GraphicsMaxQuadsRenderCount) + 1); -} - -void CGraphics_Threaded::RenderText(int BufferContainerIndex, int TextQuadNum, int TextureSize, int TextureTextIndex, int TextureTextOutlineIndex, const ColorRGBA &TextColor, const ColorRGBA &TextOutlineColor) -{ - if(BufferContainerIndex == -1) - return; - - CCommandBuffer::SCommand_RenderText Cmd; - Cmd.m_State = m_State; - Cmd.m_BufferContainerIndex = BufferContainerIndex; - Cmd.m_DrawNum = TextQuadNum * 6; - Cmd.m_TextureSize = TextureSize; - Cmd.m_TextTextureIndex = TextureTextIndex; - Cmd.m_TextOutlineTextureIndex = TextureTextOutlineIndex; - Cmd.m_TextColor = TextColor; - Cmd.m_TextOutlineColor = TextOutlineColor; - - AddCmd(Cmd); - - m_pCommandBuffer->AddRenderCalls(1); -} - -int CGraphics_Threaded::CreateQuadContainer(bool AutomaticUpload) -{ - int Index = -1; - if(m_FirstFreeQuadContainer == -1) - { - Index = m_vQuadContainers.size(); - m_vQuadContainers.emplace_back(AutomaticUpload); - } - else - { - Index = m_FirstFreeQuadContainer; - m_FirstFreeQuadContainer = m_vQuadContainers[Index].m_FreeIndex; - m_vQuadContainers[Index].m_FreeIndex = Index; - } - - return Index; -} - -void CGraphics_Threaded::QuadContainerChangeAutomaticUpload(int ContainerIndex, bool AutomaticUpload) -{ - SQuadContainer &Container = m_vQuadContainers[ContainerIndex]; - Container.m_AutomaticUpload = AutomaticUpload; -} - -void CGraphics_Threaded::QuadContainerUpload(int ContainerIndex) -{ - if(IsQuadContainerBufferingEnabled()) - { - SQuadContainer &Container = m_vQuadContainers[ContainerIndex]; - if(!Container.m_vQuads.empty()) - { - if(Container.m_QuadBufferObjectIndex == -1) - { - size_t UploadDataSize = Container.m_vQuads.size() * sizeof(SQuadContainer::SQuad); - Container.m_QuadBufferObjectIndex = CreateBufferObject(UploadDataSize, Container.m_vQuads.data(), 0); - } - else - { - size_t UploadDataSize = Container.m_vQuads.size() * sizeof(SQuadContainer::SQuad); - RecreateBufferObject(Container.m_QuadBufferObjectIndex, UploadDataSize, Container.m_vQuads.data(), 0); - } - - if(Container.m_QuadBufferContainerIndex == -1) - { - SBufferContainerInfo Info; - Info.m_Stride = sizeof(CCommandBuffer::SVertex); - Info.m_VertBufferBindingIndex = Container.m_QuadBufferObjectIndex; - - Info.m_vAttributes.emplace_back(); - SBufferContainerInfo::SAttribute *pAttr = &Info.m_vAttributes.back(); - pAttr->m_DataTypeCount = 2; - pAttr->m_FuncType = 0; - pAttr->m_Normalized = false; - pAttr->m_pOffset = 0; - pAttr->m_Type = GRAPHICS_TYPE_FLOAT; - Info.m_vAttributes.emplace_back(); - pAttr = &Info.m_vAttributes.back(); - pAttr->m_DataTypeCount = 2; - pAttr->m_FuncType = 0; - pAttr->m_Normalized = false; - pAttr->m_pOffset = (void *)(sizeof(float) * 2); - pAttr->m_Type = GRAPHICS_TYPE_FLOAT; - Info.m_vAttributes.emplace_back(); - pAttr = &Info.m_vAttributes.back(); - pAttr->m_DataTypeCount = 4; - pAttr->m_FuncType = 0; - pAttr->m_Normalized = true; - pAttr->m_pOffset = (void *)(sizeof(float) * 2 + sizeof(float) * 2); - pAttr->m_Type = GRAPHICS_TYPE_UNSIGNED_BYTE; - - Container.m_QuadBufferContainerIndex = CreateBufferContainer(&Info); - } - } - } -} - -int CGraphics_Threaded::QuadContainerAddQuads(int ContainerIndex, CQuadItem *pArray, int Num) -{ - SQuadContainer &Container = m_vQuadContainers[ContainerIndex]; - - if((int)Container.m_vQuads.size() > Num + CCommandBuffer::CCommandBuffer::MAX_VERTICES) - return -1; - - int RetOff = (int)Container.m_vQuads.size(); - - for(int i = 0; i < Num; ++i) - { - Container.m_vQuads.emplace_back(); - SQuadContainer::SQuad &Quad = Container.m_vQuads.back(); - - Quad.m_aVertices[0].m_Pos.x = pArray[i].m_X; - Quad.m_aVertices[0].m_Pos.y = pArray[i].m_Y; - Quad.m_aVertices[0].m_Tex = m_aTexture[0]; - SetColor(&Quad.m_aVertices[0], 0); - - Quad.m_aVertices[1].m_Pos.x = pArray[i].m_X + pArray[i].m_Width; - Quad.m_aVertices[1].m_Pos.y = pArray[i].m_Y; - Quad.m_aVertices[1].m_Tex = m_aTexture[1]; - SetColor(&Quad.m_aVertices[1], 1); - - Quad.m_aVertices[2].m_Pos.x = pArray[i].m_X + pArray[i].m_Width; - Quad.m_aVertices[2].m_Pos.y = pArray[i].m_Y + pArray[i].m_Height; - Quad.m_aVertices[2].m_Tex = m_aTexture[2]; - SetColor(&Quad.m_aVertices[2], 2); - - Quad.m_aVertices[3].m_Pos.x = pArray[i].m_X; - Quad.m_aVertices[3].m_Pos.y = pArray[i].m_Y + pArray[i].m_Height; - Quad.m_aVertices[3].m_Tex = m_aTexture[3]; - SetColor(&Quad.m_aVertices[3], 3); - - if(m_Rotation != 0) - { - CCommandBuffer::SPoint Center; - Center.x = pArray[i].m_X + pArray[i].m_Width / 2; - Center.y = pArray[i].m_Y + pArray[i].m_Height / 2; - - Rotate(Center, Quad.m_aVertices, 4); - } - } - - if(Container.m_AutomaticUpload) - QuadContainerUpload(ContainerIndex); - - return RetOff; -} - -int CGraphics_Threaded::QuadContainerAddQuads(int ContainerIndex, CFreeformItem *pArray, int Num) -{ - SQuadContainer &Container = m_vQuadContainers[ContainerIndex]; - - if((int)Container.m_vQuads.size() > Num + CCommandBuffer::CCommandBuffer::MAX_VERTICES) - return -1; - - int RetOff = (int)Container.m_vQuads.size(); - - for(int i = 0; i < Num; ++i) - { - Container.m_vQuads.emplace_back(); - SQuadContainer::SQuad &Quad = Container.m_vQuads.back(); - - Quad.m_aVertices[0].m_Pos.x = pArray[i].m_X0; - Quad.m_aVertices[0].m_Pos.y = pArray[i].m_Y0; - Quad.m_aVertices[0].m_Tex = m_aTexture[0]; - SetColor(&Quad.m_aVertices[0], 0); - - Quad.m_aVertices[1].m_Pos.x = pArray[i].m_X1; - Quad.m_aVertices[1].m_Pos.y = pArray[i].m_Y1; - Quad.m_aVertices[1].m_Tex = m_aTexture[1]; - SetColor(&Quad.m_aVertices[1], 1); - - Quad.m_aVertices[2].m_Pos.x = pArray[i].m_X3; - Quad.m_aVertices[2].m_Pos.y = pArray[i].m_Y3; - Quad.m_aVertices[2].m_Tex = m_aTexture[3]; - SetColor(&Quad.m_aVertices[2], 3); - - Quad.m_aVertices[3].m_Pos.x = pArray[i].m_X2; - Quad.m_aVertices[3].m_Pos.y = pArray[i].m_Y2; - Quad.m_aVertices[3].m_Tex = m_aTexture[2]; - SetColor(&Quad.m_aVertices[3], 2); - } - - if(Container.m_AutomaticUpload) - QuadContainerUpload(ContainerIndex); - - return RetOff; -} - -void CGraphics_Threaded::QuadContainerReset(int ContainerIndex) -{ - if(ContainerIndex == -1) - return; - - SQuadContainer &Container = m_vQuadContainers[ContainerIndex]; - if(IsQuadContainerBufferingEnabled()) - DeleteBufferContainer(Container.m_QuadBufferContainerIndex, true); - Container.m_vQuads.clear(); - Container.m_QuadBufferObjectIndex = -1; -} - -void CGraphics_Threaded::DeleteQuadContainer(int &ContainerIndex) -{ - if(ContainerIndex == -1) - return; - - QuadContainerReset(ContainerIndex); - - // also clear the container index - m_vQuadContainers[ContainerIndex].m_FreeIndex = m_FirstFreeQuadContainer; - m_FirstFreeQuadContainer = ContainerIndex; - ContainerIndex = -1; -} - -void CGraphics_Threaded::RenderQuadContainer(int ContainerIndex, int QuadDrawNum) -{ - RenderQuadContainer(ContainerIndex, 0, QuadDrawNum); -} - -void CGraphics_Threaded::RenderQuadContainer(int ContainerIndex, int QuadOffset, int QuadDrawNum, bool ChangeWrapMode) -{ - SQuadContainer &Container = m_vQuadContainers[ContainerIndex]; - - if(QuadDrawNum == -1) - QuadDrawNum = (int)Container.m_vQuads.size() - QuadOffset; - - if((int)Container.m_vQuads.size() < QuadOffset + QuadDrawNum || QuadDrawNum == 0) - return; - - if(IsQuadContainerBufferingEnabled()) - { - if(Container.m_QuadBufferContainerIndex == -1) - return; - - if(ChangeWrapMode) - WrapClamp(); - - CCommandBuffer::SCommand_RenderQuadContainer Cmd; - Cmd.m_State = m_State; - Cmd.m_DrawNum = (unsigned int)QuadDrawNum * 6; - Cmd.m_pOffset = (void *)(QuadOffset * 6 * sizeof(unsigned int)); - Cmd.m_BufferContainerIndex = Container.m_QuadBufferContainerIndex; - - AddCmd(Cmd); - m_pCommandBuffer->AddRenderCalls(1); - } - else - { - if(g_Config.m_GfxQuadAsTriangle) - { - for(int i = 0; i < QuadDrawNum; ++i) - { - SQuadContainer::SQuad &Quad = Container.m_vQuads[QuadOffset + i]; - m_aVertices[i * 6] = Quad.m_aVertices[0]; - m_aVertices[i * 6 + 1] = Quad.m_aVertices[1]; - m_aVertices[i * 6 + 2] = Quad.m_aVertices[2]; - m_aVertices[i * 6 + 3] = Quad.m_aVertices[0]; - m_aVertices[i * 6 + 4] = Quad.m_aVertices[2]; - m_aVertices[i * 6 + 5] = Quad.m_aVertices[3]; - m_NumVertices += 6; - } - } - else - { - mem_copy(m_aVertices, &Container.m_vQuads[QuadOffset], sizeof(CCommandBuffer::SVertex) * 4 * QuadDrawNum); - m_NumVertices += 4 * QuadDrawNum; - } - m_Drawing = DRAWING_QUADS; - if(ChangeWrapMode) - WrapClamp(); - FlushVertices(false); - m_Drawing = 0; - } - WrapNormal(); -} - -void CGraphics_Threaded::RenderQuadContainerEx(int ContainerIndex, int QuadOffset, int QuadDrawNum, float X, float Y, float ScaleX, float ScaleY) -{ - SQuadContainer &Container = m_vQuadContainers[ContainerIndex]; - - if((int)Container.m_vQuads.size() < QuadOffset + 1) - return; - - if(QuadDrawNum == -1) - QuadDrawNum = (int)Container.m_vQuads.size() - QuadOffset; - - if(IsQuadContainerBufferingEnabled()) - { - if(Container.m_QuadBufferContainerIndex == -1) - return; - - SQuadContainer::SQuad &Quad = Container.m_vQuads[QuadOffset]; - CCommandBuffer::SCommand_RenderQuadContainerEx Cmd; - - WrapClamp(); - - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - MapScreen((ScreenX0 - X) / ScaleX, (ScreenY0 - Y) / ScaleY, (ScreenX1 - X) / ScaleX, (ScreenY1 - Y) / ScaleY); - Cmd.m_State = m_State; - MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); - - Cmd.m_DrawNum = QuadDrawNum * 6; - Cmd.m_pOffset = (void *)(QuadOffset * 6 * sizeof(unsigned int)); - Cmd.m_BufferContainerIndex = Container.m_QuadBufferContainerIndex; - - Cmd.m_VertexColor.r = (float)m_aColor[0].r / 255.f; - Cmd.m_VertexColor.g = (float)m_aColor[0].g / 255.f; - Cmd.m_VertexColor.b = (float)m_aColor[0].b / 255.f; - Cmd.m_VertexColor.a = (float)m_aColor[0].a / 255.f; - - Cmd.m_Rotation = m_Rotation; - - // rotate before positioning - Cmd.m_Center.x = Quad.m_aVertices[0].m_Pos.x + (Quad.m_aVertices[1].m_Pos.x - Quad.m_aVertices[0].m_Pos.x) / 2.f; - Cmd.m_Center.y = Quad.m_aVertices[0].m_Pos.y + (Quad.m_aVertices[2].m_Pos.y - Quad.m_aVertices[0].m_Pos.y) / 2.f; - - AddCmd(Cmd); - m_pCommandBuffer->AddRenderCalls(1); - } - else - { - if(g_Config.m_GfxQuadAsTriangle) - { - for(int i = 0; i < QuadDrawNum; ++i) - { - SQuadContainer::SQuad &Quad = Container.m_vQuads[QuadOffset + i]; - m_aVertices[i * 6 + 0] = Quad.m_aVertices[0]; - m_aVertices[i * 6 + 1] = Quad.m_aVertices[1]; - m_aVertices[i * 6 + 2] = Quad.m_aVertices[2]; - m_aVertices[i * 6 + 3] = Quad.m_aVertices[0]; - m_aVertices[i * 6 + 4] = Quad.m_aVertices[2]; - m_aVertices[i * 6 + 5] = Quad.m_aVertices[3]; - - for(int n = 0; n < 6; ++n) - { - m_aVertices[i * 6 + n].m_Pos.x *= ScaleX; - m_aVertices[i * 6 + n].m_Pos.y *= ScaleY; - - SetColor(&m_aVertices[i * 6 + n], 0); - } - - if(m_Rotation != 0) - { - CCommandBuffer::SPoint Center; - Center.x = m_aVertices[i * 6 + 0].m_Pos.x + (m_aVertices[i * 6 + 1].m_Pos.x - m_aVertices[i * 6 + 0].m_Pos.x) / 2.f; - Center.y = m_aVertices[i * 6 + 0].m_Pos.y + (m_aVertices[i * 6 + 2].m_Pos.y - m_aVertices[i * 6 + 0].m_Pos.y) / 2.f; - - Rotate(Center, &m_aVertices[i * 6 + 0], 6); - } - - for(int n = 0; n < 6; ++n) - { - m_aVertices[i * 6 + n].m_Pos.x += X; - m_aVertices[i * 6 + n].m_Pos.y += Y; - } - m_NumVertices += 6; - } - } - else - { - mem_copy(m_aVertices, &Container.m_vQuads[QuadOffset], sizeof(CCommandBuffer::SVertex) * 4 * QuadDrawNum); - for(int i = 0; i < QuadDrawNum; ++i) - { - for(int n = 0; n < 4; ++n) - { - m_aVertices[i * 4 + n].m_Pos.x *= ScaleX; - m_aVertices[i * 4 + n].m_Pos.y *= ScaleY; - SetColor(&m_aVertices[i * 4 + n], 0); - } - - if(m_Rotation != 0) - { - CCommandBuffer::SPoint Center; - Center.x = m_aVertices[i * 4 + 0].m_Pos.x + (m_aVertices[i * 4 + 1].m_Pos.x - m_aVertices[i * 4 + 0].m_Pos.x) / 2.f; - Center.y = m_aVertices[i * 4 + 0].m_Pos.y + (m_aVertices[i * 4 + 2].m_Pos.y - m_aVertices[i * 4 + 0].m_Pos.y) / 2.f; - - Rotate(Center, &m_aVertices[i * 4 + 0], 4); - } - - for(int n = 0; n < 4; ++n) - { - m_aVertices[i * 4 + n].m_Pos.x += X; - m_aVertices[i * 4 + n].m_Pos.y += Y; - } - m_NumVertices += 4; - } - } - m_Drawing = DRAWING_QUADS; - WrapClamp(); - FlushVertices(false); - m_Drawing = 0; - } - WrapNormal(); -} - -void CGraphics_Threaded::RenderQuadContainerAsSprite(int ContainerIndex, int QuadOffset, float X, float Y, float ScaleX, float ScaleY) -{ - RenderQuadContainerEx(ContainerIndex, QuadOffset, 1, X, Y, ScaleX, ScaleY); -} - -void CGraphics_Threaded::RenderQuadContainerAsSpriteMultiple(int ContainerIndex, int QuadOffset, int DrawCount, SRenderSpriteInfo *pRenderInfo) -{ - SQuadContainer &Container = m_vQuadContainers[ContainerIndex]; - - if(DrawCount == 0) - return; - - if(IsQuadContainerBufferingEnabled()) - { - if(Container.m_QuadBufferContainerIndex == -1) - return; - - WrapClamp(); - SQuadContainer::SQuad &Quad = Container.m_vQuads[0]; - CCommandBuffer::SCommand_RenderQuadContainerAsSpriteMultiple Cmd; - - Cmd.m_State = m_State; - - Cmd.m_DrawNum = 1 * 6; - Cmd.m_DrawCount = DrawCount; - Cmd.m_pOffset = (void *)(QuadOffset * 6 * sizeof(unsigned int)); - Cmd.m_BufferContainerIndex = Container.m_QuadBufferContainerIndex; - - Cmd.m_VertexColor.r = (float)m_aColor[0].r / 255.f; - Cmd.m_VertexColor.g = (float)m_aColor[0].g / 255.f; - Cmd.m_VertexColor.b = (float)m_aColor[0].b / 255.f; - Cmd.m_VertexColor.a = (float)m_aColor[0].a / 255.f; - - // rotate before positioning - Cmd.m_Center.x = Quad.m_aVertices[0].m_Pos.x + (Quad.m_aVertices[1].m_Pos.x - Quad.m_aVertices[0].m_Pos.x) / 2.f; - Cmd.m_Center.y = Quad.m_aVertices[0].m_Pos.y + (Quad.m_aVertices[2].m_Pos.y - Quad.m_aVertices[0].m_Pos.y) / 2.f; - - Cmd.m_pRenderInfo = (IGraphics::SRenderSpriteInfo *)m_pCommandBuffer->AllocData(sizeof(IGraphics::SRenderSpriteInfo) * DrawCount); - if(Cmd.m_pRenderInfo == 0x0) - { - // kick command buffer and try again - KickCommandBuffer(); - - Cmd.m_pRenderInfo = (IGraphics::SRenderSpriteInfo *)m_pCommandBuffer->AllocData(sizeof(IGraphics::SRenderSpriteInfo) * DrawCount); - if(Cmd.m_pRenderInfo == 0x0) - { - dbg_msg("graphics", "failed to allocate data for render info"); - return; - } - } - - AddCmd(Cmd, [&] { - Cmd.m_pRenderInfo = (IGraphics::SRenderSpriteInfo *)m_pCommandBuffer->AllocData(sizeof(IGraphics::SRenderSpriteInfo) * DrawCount); - return Cmd.m_pRenderInfo != nullptr; - }); - - mem_copy(Cmd.m_pRenderInfo, pRenderInfo, sizeof(IGraphics::SRenderSpriteInfo) * DrawCount); - - m_pCommandBuffer->AddRenderCalls(((DrawCount - 1) / gs_GraphicsMaxParticlesRenderCount) + 1); - - WrapNormal(); - } - else - { - for(int i = 0; i < DrawCount; ++i) - { - QuadsSetRotation(pRenderInfo[i].m_Rotation); - RenderQuadContainerAsSprite(ContainerIndex, QuadOffset, pRenderInfo[i].m_Pos.x, pRenderInfo[i].m_Pos.y, pRenderInfo[i].m_Scale, pRenderInfo[i].m_Scale); - } - } -} - -void *CGraphics_Threaded::AllocCommandBufferData(size_t AllocSize) -{ - void *pData = m_pCommandBuffer->AllocData(AllocSize); - if(pData == nullptr) - { - // kick command buffer and try again - KickCommandBuffer(); - - pData = m_pCommandBuffer->AllocData(AllocSize); - if(pData == nullptr) - { - char aError[256]; - str_format(aError, sizeof(aError), "graphics: failed to allocate data (size %" PRIzu ") for command buffer", AllocSize); - dbg_assert(false, aError); - } - } - return pData; -} - -int CGraphics_Threaded::CreateBufferObject(size_t UploadDataSize, void *pUploadData, int CreateFlags, bool IsMovedPointer) -{ - int Index = -1; - if(m_FirstFreeBufferObjectIndex == -1) - { - Index = m_vBufferObjectIndices.size(); - m_vBufferObjectIndices.push_back(Index); - } - else - { - Index = m_FirstFreeBufferObjectIndex; - m_FirstFreeBufferObjectIndex = m_vBufferObjectIndices[Index]; - m_vBufferObjectIndices[Index] = Index; - } - - CCommandBuffer::SCommand_CreateBufferObject Cmd; - Cmd.m_BufferIndex = Index; - Cmd.m_DataSize = UploadDataSize; - Cmd.m_DeletePointer = IsMovedPointer; - Cmd.m_Flags = CreateFlags; - - if(IsMovedPointer) - { - Cmd.m_pUploadData = pUploadData; - AddCmd(Cmd); - } - else - { - if(UploadDataSize <= CMD_BUFFER_DATA_BUFFER_SIZE) - { - Cmd.m_pUploadData = AllocCommandBufferData(UploadDataSize); - - AddCmd(Cmd, [&] { - Cmd.m_pUploadData = m_pCommandBuffer->AllocData(UploadDataSize); - return Cmd.m_pUploadData != nullptr; - }); - mem_copy(Cmd.m_pUploadData, pUploadData, UploadDataSize); - } - else - { - Cmd.m_pUploadData = nullptr; - AddCmd(Cmd); - - // update the buffer instead - size_t UploadDataOffset = 0; - while(UploadDataSize > 0) - { - size_t UpdateSize = (UploadDataSize > CMD_BUFFER_DATA_BUFFER_SIZE ? CMD_BUFFER_DATA_BUFFER_SIZE : UploadDataSize); - - UpdateBufferObjectInternal(Index, UpdateSize, (((char *)pUploadData) + UploadDataOffset), (void *)UploadDataOffset); - - UploadDataOffset += UpdateSize; - UploadDataSize -= UpdateSize; - } - } - } - - return Index; -} - -void CGraphics_Threaded::RecreateBufferObject(int BufferIndex, size_t UploadDataSize, void *pUploadData, int CreateFlags, bool IsMovedPointer) -{ - CCommandBuffer::SCommand_RecreateBufferObject Cmd; - Cmd.m_BufferIndex = BufferIndex; - Cmd.m_DataSize = UploadDataSize; - Cmd.m_DeletePointer = IsMovedPointer; - Cmd.m_Flags = CreateFlags; - - if(IsMovedPointer) - { - Cmd.m_pUploadData = pUploadData; - AddCmd(Cmd); - } - else - { - if(UploadDataSize <= CMD_BUFFER_DATA_BUFFER_SIZE) - { - Cmd.m_pUploadData = AllocCommandBufferData(UploadDataSize); - - AddCmd(Cmd, [&] { - Cmd.m_pUploadData = m_pCommandBuffer->AllocData(UploadDataSize); - return Cmd.m_pUploadData != nullptr; - }); - - mem_copy(Cmd.m_pUploadData, pUploadData, UploadDataSize); - } - else - { - Cmd.m_pUploadData = nullptr; - AddCmd(Cmd); - - // update the buffer instead - size_t UploadDataOffset = 0; - while(UploadDataSize > 0) - { - size_t UpdateSize = (UploadDataSize > CMD_BUFFER_DATA_BUFFER_SIZE ? CMD_BUFFER_DATA_BUFFER_SIZE : UploadDataSize); - - UpdateBufferObjectInternal(BufferIndex, UpdateSize, (((char *)pUploadData) + UploadDataOffset), (void *)UploadDataOffset); - - UploadDataOffset += UpdateSize; - UploadDataSize -= UpdateSize; - } - } - } -} - -void CGraphics_Threaded::UpdateBufferObjectInternal(int BufferIndex, size_t UploadDataSize, void *pUploadData, void *pOffset, bool IsMovedPointer) -{ - CCommandBuffer::SCommand_UpdateBufferObject Cmd; - Cmd.m_BufferIndex = BufferIndex; - Cmd.m_DataSize = UploadDataSize; - Cmd.m_pOffset = pOffset; - Cmd.m_DeletePointer = IsMovedPointer; - - if(IsMovedPointer) - { - Cmd.m_pUploadData = pUploadData; - AddCmd(Cmd); - } - else - { - Cmd.m_pUploadData = AllocCommandBufferData(UploadDataSize); - - AddCmd(Cmd, [&] { - Cmd.m_pUploadData = m_pCommandBuffer->AllocData(UploadDataSize); - return Cmd.m_pUploadData != nullptr; - }); - - mem_copy(Cmd.m_pUploadData, pUploadData, UploadDataSize); - } -} - -void CGraphics_Threaded::CopyBufferObjectInternal(int WriteBufferIndex, int ReadBufferIndex, size_t WriteOffset, size_t ReadOffset, size_t CopyDataSize) -{ - CCommandBuffer::SCommand_CopyBufferObject Cmd; - Cmd.m_WriteBufferIndex = WriteBufferIndex; - Cmd.m_ReadBufferIndex = ReadBufferIndex; - Cmd.m_WriteOffset = WriteOffset; - Cmd.m_ReadOffset = ReadOffset; - Cmd.m_CopySize = CopyDataSize; - AddCmd(Cmd); -} - -void CGraphics_Threaded::DeleteBufferObject(int BufferIndex) -{ - if(BufferIndex == -1) - return; - - CCommandBuffer::SCommand_DeleteBufferObject Cmd; - Cmd.m_BufferIndex = BufferIndex; - AddCmd(Cmd); - - // also clear the buffer object index - m_vBufferObjectIndices[BufferIndex] = m_FirstFreeBufferObjectIndex; - m_FirstFreeBufferObjectIndex = BufferIndex; -} - -int CGraphics_Threaded::CreateBufferContainer(SBufferContainerInfo *pContainerInfo) -{ - int Index = -1; - if(m_FirstFreeVertexArrayInfo == -1) - { - Index = m_vVertexArrayInfo.size(); - m_vVertexArrayInfo.emplace_back(); - } - else - { - Index = m_FirstFreeVertexArrayInfo; - m_FirstFreeVertexArrayInfo = m_vVertexArrayInfo[Index].m_FreeIndex; - m_vVertexArrayInfo[Index].m_FreeIndex = Index; - } - - CCommandBuffer::SCommand_CreateBufferContainer Cmd; - Cmd.m_BufferContainerIndex = Index; - Cmd.m_AttrCount = pContainerInfo->m_vAttributes.size(); - Cmd.m_Stride = pContainerInfo->m_Stride; - Cmd.m_VertBufferBindingIndex = pContainerInfo->m_VertBufferBindingIndex; - Cmd.m_pAttributes = (SBufferContainerInfo::SAttribute *)AllocCommandBufferData(Cmd.m_AttrCount * sizeof(SBufferContainerInfo::SAttribute)); - - AddCmd(Cmd, [&] { - Cmd.m_pAttributes = (SBufferContainerInfo::SAttribute *)m_pCommandBuffer->AllocData(Cmd.m_AttrCount * sizeof(SBufferContainerInfo::SAttribute)); - return Cmd.m_pAttributes != nullptr; - }); - - mem_copy(Cmd.m_pAttributes, pContainerInfo->m_vAttributes.data(), Cmd.m_AttrCount * sizeof(SBufferContainerInfo::SAttribute)); - - m_vVertexArrayInfo[Index].m_AssociatedBufferObjectIndex = pContainerInfo->m_VertBufferBindingIndex; - - return Index; -} - -void CGraphics_Threaded::DeleteBufferContainer(int &ContainerIndex, bool DestroyAllBO) -{ - if(ContainerIndex == -1) - return; - - CCommandBuffer::SCommand_DeleteBufferContainer Cmd; - Cmd.m_BufferContainerIndex = ContainerIndex; - Cmd.m_DestroyAllBO = DestroyAllBO; - AddCmd(Cmd); - - if(DestroyAllBO) - { - // delete all associated references - int BufferObjectIndex = m_vVertexArrayInfo[ContainerIndex].m_AssociatedBufferObjectIndex; - if(BufferObjectIndex != -1) - { - // clear the buffer object index - m_vBufferObjectIndices[BufferObjectIndex] = m_FirstFreeBufferObjectIndex; - m_FirstFreeBufferObjectIndex = BufferObjectIndex; - } - } - m_vVertexArrayInfo[ContainerIndex].m_AssociatedBufferObjectIndex = -1; - - // also clear the buffer object index - m_vVertexArrayInfo[ContainerIndex].m_FreeIndex = m_FirstFreeVertexArrayInfo; - m_FirstFreeVertexArrayInfo = ContainerIndex; - ContainerIndex = -1; -} - -void CGraphics_Threaded::UpdateBufferContainerInternal(int ContainerIndex, SBufferContainerInfo *pContainerInfo) -{ - CCommandBuffer::SCommand_UpdateBufferContainer Cmd; - Cmd.m_BufferContainerIndex = ContainerIndex; - Cmd.m_AttrCount = pContainerInfo->m_vAttributes.size(); - Cmd.m_Stride = pContainerInfo->m_Stride; - Cmd.m_VertBufferBindingIndex = pContainerInfo->m_VertBufferBindingIndex; - Cmd.m_pAttributes = (SBufferContainerInfo::SAttribute *)AllocCommandBufferData(Cmd.m_AttrCount * sizeof(SBufferContainerInfo::SAttribute)); - - AddCmd(Cmd, [&] { - Cmd.m_pAttributes = (SBufferContainerInfo::SAttribute *)m_pCommandBuffer->AllocData(Cmd.m_AttrCount * sizeof(SBufferContainerInfo::SAttribute)); - return Cmd.m_pAttributes != nullptr; - }); - - mem_copy(Cmd.m_pAttributes, pContainerInfo->m_vAttributes.data(), Cmd.m_AttrCount * sizeof(SBufferContainerInfo::SAttribute)); - - m_vVertexArrayInfo[ContainerIndex].m_AssociatedBufferObjectIndex = pContainerInfo->m_VertBufferBindingIndex; -} - -void CGraphics_Threaded::IndicesNumRequiredNotify(unsigned int RequiredIndicesCount) -{ - CCommandBuffer::SCommand_IndicesRequiredNumNotify Cmd; - Cmd.m_RequiredIndicesNum = RequiredIndicesCount; - AddCmd(Cmd); -} - -int CGraphics_Threaded::IssueInit() -{ - int Flags = 0; - - bool IsPurlyWindowed = g_Config.m_GfxFullscreen == 0; - bool IsExclusiveFullscreen = g_Config.m_GfxFullscreen == 1; - bool IsDesktopFullscreen = g_Config.m_GfxFullscreen == 2; -#ifndef CONF_FAMILY_WINDOWS - // special mode for windows only - IsDesktopFullscreen |= g_Config.m_GfxFullscreen == 3; -#endif - - if(g_Config.m_GfxBorderless) - Flags |= IGraphicsBackend::INITFLAG_BORDERLESS; - if(IsExclusiveFullscreen) - Flags |= IGraphicsBackend::INITFLAG_FULLSCREEN; - else if(IsDesktopFullscreen) - Flags |= IGraphicsBackend::INITFLAG_DESKTOP_FULLSCREEN; - if(IsPurlyWindowed || IsExclusiveFullscreen || IsDesktopFullscreen) - Flags |= IGraphicsBackend::INITFLAG_RESIZABLE; - if(g_Config.m_GfxVsync) - Flags |= IGraphicsBackend::INITFLAG_VSYNC; - if(g_Config.m_GfxHighdpi) - Flags |= IGraphicsBackend::INITFLAG_HIGHDPI; - - int r = m_pBackend->Init("DDNet Client", &g_Config.m_GfxScreen, &g_Config.m_GfxScreenWidth, &g_Config.m_GfxScreenHeight, &g_Config.m_GfxScreenRefreshRate, &g_Config.m_GfxFsaaSamples, Flags, &g_Config.m_GfxDesktopWidth, &g_Config.m_GfxDesktopHeight, &m_ScreenWidth, &m_ScreenHeight, m_pStorage); - AddBackEndWarningIfExists(); - if(r == 0) - { - m_GLUseTrianglesAsQuad = m_pBackend->UseTrianglesAsQuad(); - m_GLTileBufferingEnabled = m_pBackend->HasTileBuffering(); - m_GLQuadBufferingEnabled = m_pBackend->HasQuadBuffering(); - m_GLQuadContainerBufferingEnabled = m_pBackend->HasQuadContainerBuffering(); - m_GLTextBufferingEnabled = (m_GLQuadContainerBufferingEnabled && m_pBackend->HasTextBuffering()); - m_GLUses2DTextureArrays = m_pBackend->Uses2DTextureArrays(); - m_GLHasTextureArraysSupport = m_pBackend->HasTextureArraysSupport(); - m_ScreenHiDPIScale = m_ScreenWidth / (float)g_Config.m_GfxScreenWidth; - m_ScreenRefreshRate = g_Config.m_GfxScreenRefreshRate; - } - return r; -} - -void CGraphics_Threaded::AdjustViewport(bool SendViewportChangeToBackend) -{ - // adjust the viewport to only allow certain aspect ratios - // keep this in sync with backend_vulkan GetSwapImageSize's check - if(m_ScreenHeight > 4 * m_ScreenWidth / 5) - { - m_IsForcedViewport = true; - m_ScreenHeight = 4 * m_ScreenWidth / 5; - - if(SendViewportChangeToBackend) - { - UpdateViewport(0, 0, m_ScreenWidth, m_ScreenHeight, true); - } - } - else - { - m_IsForcedViewport = false; - } -} - -void CGraphics_Threaded::UpdateViewport(int X, int Y, int W, int H, bool ByResize) -{ - CCommandBuffer::SCommand_Update_Viewport Cmd; - Cmd.m_X = X; - Cmd.m_Y = Y; - Cmd.m_Width = W; - Cmd.m_Height = H; - Cmd.m_ByResize = ByResize; - AddCmd(Cmd); -} - -void CGraphics_Threaded::AddBackEndWarningIfExists() -{ - const char *pErrStr = m_pBackend->GetErrorString(); - if(pErrStr != nullptr) - { - SWarning NewWarning; - str_copy(NewWarning.m_aWarningMsg, Localize(pErrStr)); - AddWarning(NewWarning); - } -} - -int CGraphics_Threaded::InitWindow() -{ - int ErrorCode = IssueInit(); - if(ErrorCode == 0) - return 0; - - // try disabling fsaa - while(g_Config.m_GfxFsaaSamples) - { - // 4 is the minimum required by OpenGL ES spec (GL_MAX_SAMPLES - https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glGet.xhtml), so can probably also be assumed for OpenGL - if(g_Config.m_GfxFsaaSamples > 4) - g_Config.m_GfxFsaaSamples = 4; - else - g_Config.m_GfxFsaaSamples = 0; - - if(g_Config.m_GfxFsaaSamples) - dbg_msg("gfx", "lowering FSAA to %d and trying again", g_Config.m_GfxFsaaSamples); - else - dbg_msg("gfx", "disabling FSAA and trying again"); - - ErrorCode = IssueInit(); - if(ErrorCode == 0) - return 0; - } - - size_t GLInitTryCount = 0; - while(ErrorCode == EGraphicsBackendErrorCodes::GRAPHICS_BACKEND_ERROR_CODE_GL_CONTEXT_FAILED || ErrorCode == EGraphicsBackendErrorCodes::GRAPHICS_BACKEND_ERROR_CODE_GL_VERSION_FAILED) - { - if(ErrorCode == EGraphicsBackendErrorCodes::GRAPHICS_BACKEND_ERROR_CODE_GL_CONTEXT_FAILED) - { - // try next smaller major/minor or patch version - if(g_Config.m_GfxGLMajor >= 4) - { - g_Config.m_GfxGLMajor = 3; - g_Config.m_GfxGLMinor = 3; - g_Config.m_GfxGLPatch = 0; - } - else if(g_Config.m_GfxGLMajor == 3 && g_Config.m_GfxGLMinor >= 1) - { - g_Config.m_GfxGLMajor = 3; - g_Config.m_GfxGLMinor = 0; - g_Config.m_GfxGLPatch = 0; - } - else if(g_Config.m_GfxGLMajor == 3 && g_Config.m_GfxGLMinor == 0) - { - g_Config.m_GfxGLMajor = 2; - g_Config.m_GfxGLMinor = 1; - g_Config.m_GfxGLPatch = 0; - } - else if(g_Config.m_GfxGLMajor == 2 && g_Config.m_GfxGLMinor >= 1) - { - g_Config.m_GfxGLMajor = 2; - g_Config.m_GfxGLMinor = 0; - g_Config.m_GfxGLPatch = 0; - } - else if(g_Config.m_GfxGLMajor == 2 && g_Config.m_GfxGLMinor == 0) - { - g_Config.m_GfxGLMajor = 1; - g_Config.m_GfxGLMinor = 5; - g_Config.m_GfxGLPatch = 0; - } - else if(g_Config.m_GfxGLMajor == 1 && g_Config.m_GfxGLMinor == 5) - { - g_Config.m_GfxGLMajor = 1; - g_Config.m_GfxGLMinor = 4; - g_Config.m_GfxGLPatch = 0; - } - else if(g_Config.m_GfxGLMajor == 1 && g_Config.m_GfxGLMinor == 4) - { - g_Config.m_GfxGLMajor = 1; - g_Config.m_GfxGLMinor = 3; - g_Config.m_GfxGLPatch = 0; - } - else if(g_Config.m_GfxGLMajor == 1 && g_Config.m_GfxGLMinor == 3) - { - g_Config.m_GfxGLMajor = 1; - g_Config.m_GfxGLMinor = 2; - g_Config.m_GfxGLPatch = 1; - } - else if(g_Config.m_GfxGLMajor == 1 && g_Config.m_GfxGLMinor == 2) - { - g_Config.m_GfxGLMajor = 1; - g_Config.m_GfxGLMinor = 1; - g_Config.m_GfxGLPatch = 0; - } - } - - // new gl version was set by backend, try again - ErrorCode = IssueInit(); - if(ErrorCode == 0) - { - return 0; - } - - if(++GLInitTryCount >= 9) - { - // try something else - break; - } - } - - // try lowering the resolution - if(g_Config.m_GfxScreenWidth != 640 || g_Config.m_GfxScreenHeight != 480) - { - dbg_msg("gfx", "setting resolution to 640x480 and trying again"); - g_Config.m_GfxScreenWidth = 640; - g_Config.m_GfxScreenHeight = 480; - - if(IssueInit() == 0) - return 0; - } - - // at the very end, just try to set to gl 1.4 - { - g_Config.m_GfxGLMajor = 1; - g_Config.m_GfxGLMinor = 4; - g_Config.m_GfxGLPatch = 0; - - if(IssueInit() == 0) - return 0; - } - - dbg_msg("gfx", "out of ideas. failed to init graphics"); - - return -1; -} - -int CGraphics_Threaded::Init() -{ - // fetch pointers - m_pStorage = Kernel()->RequestInterface(); - m_pConsole = Kernel()->RequestInterface(); - m_pEngine = Kernel()->RequestInterface(); - - // init textures - m_FirstFreeTexture = 0; - m_vTextureIndices.resize(CCommandBuffer::MAX_TEXTURES); - for(size_t i = 0; i < m_vTextureIndices.size(); ++i) - m_vTextureIndices[i] = i + 1; - - m_FirstFreeVertexArrayInfo = -1; - m_FirstFreeBufferObjectIndex = -1; - m_FirstFreeQuadContainer = -1; - - m_pBackend = CreateGraphicsBackend(Localize); - if(InitWindow() != 0) - return -1; - - for(auto &FakeMode : g_aFakeModes) - { - FakeMode.m_WindowWidth = FakeMode.m_CanvasWidth / m_ScreenHiDPIScale; - FakeMode.m_WindowHeight = FakeMode.m_CanvasHeight / m_ScreenHiDPIScale; - FakeMode.m_RefreshRate = g_Config.m_GfxScreenRefreshRate; - } - - // create command buffers - for(auto &pCommandBuffer : m_apCommandBuffers) - pCommandBuffer = new CCommandBuffer(CMD_BUFFER_CMD_BUFFER_SIZE, CMD_BUFFER_DATA_BUFFER_SIZE); - m_pCommandBuffer = m_apCommandBuffers[0]; - - // create null texture, will get id=0 - { - const size_t PixelSize = 4; - const unsigned char aRed[] = {0xff, 0x00, 0x00, 0xff}; - const unsigned char aGreen[] = {0x00, 0xff, 0x00, 0xff}; - const unsigned char aBlue[] = {0x00, 0x00, 0xff, 0xff}; - const unsigned char aYellow[] = {0xff, 0xff, 0x00, 0xff}; - constexpr size_t NullTextureDimension = 16; - unsigned char aNullTextureData[NullTextureDimension * NullTextureDimension * PixelSize]; - for(size_t y = 0; y < NullTextureDimension; ++y) - { - for(size_t x = 0; x < NullTextureDimension; ++x) - { - const unsigned char *pColor; - if(x < NullTextureDimension / 2 && y < NullTextureDimension / 2) - pColor = aRed; - else if(x >= NullTextureDimension / 2 && y < NullTextureDimension / 2) - pColor = aGreen; - else if(x < NullTextureDimension / 2 && y >= NullTextureDimension / 2) - pColor = aBlue; - else - pColor = aYellow; - mem_copy(&aNullTextureData[(y * NullTextureDimension + x) * PixelSize], pColor, PixelSize); - } - } - CImageInfo NullTextureInfo; - NullTextureInfo.m_Width = NullTextureDimension; - NullTextureInfo.m_Height = NullTextureDimension; - NullTextureInfo.m_Format = CImageInfo::FORMAT_RGBA; - NullTextureInfo.m_pData = aNullTextureData; - const int TextureLoadFlags = Uses2DTextureArrays() ? IGraphics::TEXLOAD_TO_2D_ARRAY_TEXTURE : IGraphics::TEXLOAD_TO_3D_TEXTURE; - m_NullTexture.Invalidate(); - m_NullTexture = LoadTextureRaw(NullTextureInfo, TextureLoadFlags, "null-texture"); - dbg_assert(m_NullTexture.IsNullTexture(), "Null texture invalid"); - } - - ColorRGBA GPUInfoPrintColor{0.6f, 0.5f, 1.0f, 1.0f}; - - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "GPU vendor: %s", GetVendorString()); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "gfx", aBuf, GPUInfoPrintColor); - - str_format(aBuf, sizeof(aBuf), "GPU renderer: %s", GetRendererString()); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "gfx", aBuf, GPUInfoPrintColor); - - str_format(aBuf, sizeof(aBuf), "GPU version: %s", GetVersionString()); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "gfx", aBuf, GPUInfoPrintColor); - - AdjustViewport(true); - - return 0; -} - -void CGraphics_Threaded::Shutdown() -{ - // shutdown the backend - m_pBackend->Shutdown(); - delete m_pBackend; - m_pBackend = 0x0; - - // delete the command buffers - for(auto &pCommandBuffer : m_apCommandBuffers) - delete pCommandBuffer; -} - -int CGraphics_Threaded::GetNumScreens() const -{ - return m_pBackend->GetNumScreens(); -} - -const char *CGraphics_Threaded::GetScreenName(int Screen) const -{ - return m_pBackend->GetScreenName(Screen); -} - -void CGraphics_Threaded::Minimize() -{ - m_pBackend->Minimize(); - - for(auto &PropChangedListener : m_vPropChangeListeners) - PropChangedListener(); -} - -void CGraphics_Threaded::Maximize() -{ - // TODO: SDL - m_pBackend->Maximize(); - - for(auto &PropChangedListener : m_vPropChangeListeners) - PropChangedListener(); -} - -void CGraphics_Threaded::WarnPngliteIncompatibleImages(bool Warn) -{ - m_WarnPngliteIncompatibleImages = Warn; -} - -void CGraphics_Threaded::SetWindowParams(int FullscreenMode, bool IsBorderless) -{ - m_pBackend->SetWindowParams(FullscreenMode, IsBorderless); - CVideoMode CurMode; - m_pBackend->GetCurrentVideoMode(CurMode, m_ScreenHiDPIScale, g_Config.m_GfxDesktopWidth, g_Config.m_GfxDesktopHeight, g_Config.m_GfxScreen); - GotResized(CurMode.m_WindowWidth, CurMode.m_WindowHeight, CurMode.m_RefreshRate); - - for(auto &PropChangedListener : m_vPropChangeListeners) - PropChangedListener(); -} - -bool CGraphics_Threaded::SetWindowScreen(int Index) -{ - if(!m_pBackend->SetWindowScreen(Index)) - { - return false; - } - - // send a got resized event so that the current canvas size is requested - GotResized(g_Config.m_GfxScreenWidth, g_Config.m_GfxScreenHeight, g_Config.m_GfxScreenRefreshRate); - - for(auto &PropChangedListener : m_vPropChangeListeners) - PropChangedListener(); - - return true; -} - -void CGraphics_Threaded::Move(int x, int y) -{ -#if defined(CONF_VIDEORECORDER) - if(IVideo::Current() && IVideo::Current()->IsRecording()) - return; -#endif - - // Only handling CurScreen != m_GfxScreen doesn't work reliably - const int CurScreen = m_pBackend->GetWindowScreen(); - m_pBackend->UpdateDisplayMode(CurScreen); - - // send a got resized event so that the current canvas size is requested - GotResized(g_Config.m_GfxScreenWidth, g_Config.m_GfxScreenHeight, g_Config.m_GfxScreenRefreshRate); - - for(auto &PropChangedListener : m_vPropChangeListeners) - PropChangedListener(); -} - -bool CGraphics_Threaded::Resize(int w, int h, int RefreshRate) -{ -#if defined(CONF_VIDEORECORDER) - if(IVideo::Current() && IVideo::Current()->IsRecording()) - return false; -#endif - - if(WindowWidth() == w && WindowHeight() == h && RefreshRate == m_ScreenRefreshRate) - return false; - - // if the size is changed manually, only set the window resize, a window size changed event is triggered anyway - if(m_pBackend->ResizeWindow(w, h, RefreshRate)) - { - CVideoMode CurMode; - m_pBackend->GetCurrentVideoMode(CurMode, m_ScreenHiDPIScale, g_Config.m_GfxDesktopWidth, g_Config.m_GfxDesktopHeight, g_Config.m_GfxScreen); - GotResized(w, h, RefreshRate); - return true; - } - return false; -} - -void CGraphics_Threaded::ResizeToScreen() -{ - if(Resize(g_Config.m_GfxScreenWidth, g_Config.m_GfxScreenHeight, g_Config.m_GfxScreenRefreshRate)) - return; - - // Revert config variables if the change was not accepted - g_Config.m_GfxScreenWidth = ScreenWidth(); - g_Config.m_GfxScreenHeight = ScreenHeight(); - g_Config.m_GfxScreenRefreshRate = m_ScreenRefreshRate; -} - -void CGraphics_Threaded::GotResized(int w, int h, int RefreshRate) -{ -#if defined(CONF_VIDEORECORDER) - if(IVideo::Current() && IVideo::Current()->IsRecording()) - return; -#endif - - // if RefreshRate is -1 use the current config refresh rate - if(RefreshRate == -1) - RefreshRate = g_Config.m_GfxScreenRefreshRate; - - // if the size change event is triggered, set all parameters and change the viewport - auto PrevCanvasWidth = m_ScreenWidth; - auto PrevCanvasHeight = m_ScreenHeight; - m_pBackend->GetViewportSize(m_ScreenWidth, m_ScreenHeight); - - AdjustViewport(false); - - m_ScreenRefreshRate = RefreshRate; - - g_Config.m_GfxScreenWidth = w; - g_Config.m_GfxScreenHeight = h; - g_Config.m_GfxScreenRefreshRate = m_ScreenRefreshRate; - m_ScreenHiDPIScale = m_ScreenWidth / (float)g_Config.m_GfxScreenWidth; - - UpdateViewport(0, 0, m_ScreenWidth, m_ScreenHeight, true); - - // kick the command buffer and wait - KickCommandBuffer(); - WaitForIdle(); - - if(PrevCanvasWidth != m_ScreenWidth || PrevCanvasHeight != m_ScreenHeight) - { - for(auto &ResizeListener : m_vResizeListeners) - ResizeListener(); - } -} - -void CGraphics_Threaded::AddWindowResizeListener(WINDOW_RESIZE_FUNC pFunc) -{ - m_vResizeListeners.emplace_back(pFunc); -} - -void CGraphics_Threaded::AddWindowPropChangeListener(WINDOW_PROPS_CHANGED_FUNC pFunc) -{ - m_vPropChangeListeners.emplace_back(pFunc); -} - -int CGraphics_Threaded::GetWindowScreen() -{ - return m_pBackend->GetWindowScreen(); -} - -void CGraphics_Threaded::WindowDestroyNtf(uint32_t WindowId) -{ - m_pBackend->WindowDestroyNtf(WindowId); - - CCommandBuffer::SCommand_WindowDestroyNtf Cmd; - Cmd.m_WindowId = WindowId; - AddCmd(Cmd); - - // wait - KickCommandBuffer(); - WaitForIdle(); -} - -void CGraphics_Threaded::WindowCreateNtf(uint32_t WindowId) -{ - m_pBackend->WindowCreateNtf(WindowId); - - CCommandBuffer::SCommand_WindowCreateNtf Cmd; - Cmd.m_WindowId = WindowId; - AddCmd(Cmd); - - // wait - KickCommandBuffer(); - WaitForIdle(); -} - -int CGraphics_Threaded::WindowActive() -{ - return m_pBackend->WindowActive(); -} - -int CGraphics_Threaded::WindowOpen() -{ - return m_pBackend->WindowOpen(); -} - -void CGraphics_Threaded::SetWindowGrab(bool Grab) -{ - m_pBackend->SetWindowGrab(Grab); -} - -void CGraphics_Threaded::NotifyWindow() -{ - m_pBackend->NotifyWindow(); -} - -void CGraphics_Threaded::ReadPixel(ivec2 Position, ColorRGBA *pColor) -{ - dbg_assert(Position.x >= 0 && Position.x < ScreenWidth(), "ReadPixel position x out of range"); - dbg_assert(Position.y >= 0 && Position.y < ScreenHeight(), "ReadPixel position y out of range"); - - m_ReadPixelPosition = Position; - m_pReadPixelColor = pColor; -} - -void CGraphics_Threaded::ReadPixelDirect(bool *pSwapped) -{ - if(m_pReadPixelColor == nullptr) - return; - - CCommandBuffer::SCommand_TrySwapAndReadPixel Cmd; - Cmd.m_Position = m_ReadPixelPosition; - Cmd.m_pColor = m_pReadPixelColor; - Cmd.m_pSwapped = pSwapped; - AddCmd(Cmd); - - KickCommandBuffer(); - WaitForIdle(); - - m_pReadPixelColor = nullptr; -} - -void CGraphics_Threaded::TakeScreenshot(const char *pFilename) -{ - // TODO: screenshot support - char aDate[20]; - str_timestamp(aDate, sizeof(aDate)); - str_format(m_aScreenshotName, sizeof(m_aScreenshotName), "screenshots/%s_%s.png", pFilename ? pFilename : "screenshot", aDate); - m_DoScreenshot = true; -} - -void CGraphics_Threaded::TakeCustomScreenshot(const char *pFilename) -{ - str_copy(m_aScreenshotName, pFilename); - m_DoScreenshot = true; -} - -void CGraphics_Threaded::Swap() -{ - bool Swapped = false; - ScreenshotDirect(&Swapped); - ReadPixelDirect(&Swapped); - - if(!Swapped) - { - CCommandBuffer::SCommand_Swap Cmd; - AddCmd(Cmd); - } - - KickCommandBuffer(); - // TODO: Remove when https://github.com/libsdl-org/SDL/issues/5203 is fixed -#ifdef CONF_PLATFORM_MACOS - if(str_find(GetVersionString(), "Metal")) - WaitForIdle(); -#endif -} - -bool CGraphics_Threaded::SetVSync(bool State) -{ - if(!m_pCommandBuffer) - return true; - - // add vsync command - bool RetOk = false; - CCommandBuffer::SCommand_VSync Cmd; - Cmd.m_VSync = State ? 1 : 0; - Cmd.m_pRetOk = &RetOk; - AddCmd(Cmd); - - // kick the command buffer - KickCommandBuffer(); - WaitForIdle(); - return RetOk; -} - -bool CGraphics_Threaded::SetMultiSampling(uint32_t ReqMultiSamplingCount, uint32_t &MultiSamplingCountBackend) -{ - if(!m_pCommandBuffer) - return true; - - // add multisampling command - bool RetOk = false; - CCommandBuffer::SCommand_MultiSampling Cmd; - Cmd.m_RequestedMultiSamplingCount = ReqMultiSamplingCount; - Cmd.m_pRetMultiSamplingCount = &MultiSamplingCountBackend; - Cmd.m_pRetOk = &RetOk; - AddCmd(Cmd); - - // kick the command buffer - KickCommandBuffer(); - WaitForIdle(); - return RetOk; -} - -// synchronization -void CGraphics_Threaded::InsertSignal(CSemaphore *pSemaphore) -{ - CCommandBuffer::SCommand_Signal Cmd; - Cmd.m_pSemaphore = pSemaphore; - AddCmd(Cmd); -} - -bool CGraphics_Threaded::IsIdle() const -{ - return m_pBackend->IsIdle(); -} - -void CGraphics_Threaded::WaitForIdle() -{ - m_pBackend->WaitForIdle(); -} - -void CGraphics_Threaded::AddWarning(const SWarning &Warning) -{ - const std::unique_lock Lock(m_WarningsMutex); - m_vWarnings.emplace_back(Warning); -} - -std::optional CGraphics_Threaded::CurrentWarning() -{ - const std::unique_lock Lock(m_WarningsMutex); - if(m_vWarnings.empty()) - { - return std::nullopt; - } - else - { - std::optional Result = std::make_optional(m_vWarnings[0]); - m_vWarnings.erase(m_vWarnings.begin()); - return Result; - } -} - -bool CGraphics_Threaded::ShowMessageBox(unsigned Type, const char *pTitle, const char *pMsg) -{ - if(m_pBackend == nullptr) - return false; - m_pBackend->WaitForIdle(); - return m_pBackend->ShowMessageBox(Type, pTitle, pMsg); -} - -bool CGraphics_Threaded::IsBackendInitialized() -{ - return m_pBackend != nullptr; -} - -const char *CGraphics_Threaded::GetVendorString() -{ - return m_pBackend->GetVendorString(); -} - -const char *CGraphics_Threaded::GetVersionString() -{ - return m_pBackend->GetVersionString(); -} - -const char *CGraphics_Threaded::GetRendererString() -{ - return m_pBackend->GetRendererString(); -} - -TGLBackendReadPresentedImageData &CGraphics_Threaded::GetReadPresentedImageDataFuncUnsafe() -{ - return m_pBackend->GetReadPresentedImageDataFuncUnsafe(); -} - -int CGraphics_Threaded::GetVideoModes(CVideoMode *pModes, int MaxModes, int Screen) -{ - if(g_Config.m_GfxDisplayAllVideoModes) - { - const int Count = minimum(std::size(g_aFakeModes), MaxModes); - mem_copy(pModes, g_aFakeModes, Count * sizeof(CVideoMode)); - return Count; - } - - int NumModes = 0; - m_pBackend->GetVideoModes(pModes, MaxModes, &NumModes, m_ScreenHiDPIScale, g_Config.m_GfxDesktopWidth, g_Config.m_GfxDesktopHeight, Screen); - return NumModes; -} - -void CGraphics_Threaded::GetCurrentVideoMode(CVideoMode &CurMode, int Screen) -{ - m_pBackend->GetCurrentVideoMode(CurMode, m_ScreenHiDPIScale, g_Config.m_GfxDesktopWidth, g_Config.m_GfxDesktopHeight, Screen); -} - -extern IEngineGraphics *CreateEngineGraphicsThreaded() -{ - return new CGraphics_Threaded(); -} diff --git a/src/engine/client/graphics_threaded.h b/src/engine/client/graphics_threaded.h deleted file mode 100644 index db820956aa..0000000000 --- a/src/engine/client/graphics_threaded.h +++ /dev/null @@ -1,1273 +0,0 @@ -#ifndef ENGINE_CLIENT_GRAPHICS_THREADED_H -#define ENGINE_CLIENT_GRAPHICS_THREADED_H - -#include - -#include -#include - -#include -#include -#include -#include -#include - -constexpr int CMD_BUFFER_DATA_BUFFER_SIZE = 1024 * 1024 * 2; -constexpr int CMD_BUFFER_CMD_BUFFER_SIZE = 1024 * 256; - -class CCommandBuffer -{ - class CBuffer - { - unsigned char *m_pData; - unsigned m_Size; - unsigned m_Used; - - public: - CBuffer(unsigned BufferSize) - { - m_Size = BufferSize; - m_pData = new unsigned char[m_Size]; - m_Used = 0; - } - - ~CBuffer() - { - delete[] m_pData; - m_pData = 0x0; - m_Used = 0; - m_Size = 0; - } - - void Reset() - { - m_Used = 0; - } - - void *Alloc(unsigned Requested, unsigned Alignment = alignof(std::max_align_t)) - { - size_t Offset = reinterpret_cast(m_pData + m_Used) % Alignment; - if(Offset) - Offset = Alignment - Offset; - - if(Requested + Offset + m_Used > m_Size) - return 0; - - void *pPtr = &m_pData[m_Used + Offset]; - m_Used += Requested + Offset; - return pPtr; - } - - unsigned char *DataPtr() { return m_pData; } - unsigned DataSize() const { return m_Size; } - unsigned DataUsed() const { return m_Used; } - }; - -public: - CBuffer m_CmdBuffer; - size_t m_CommandCount = 0; - size_t m_RenderCallCount = 0; - - CBuffer m_DataBuffer; - - enum - { - MAX_TEXTURES = 1024 * 8, - MAX_VERTICES = 32 * 1024, - }; - - enum ECommandBufferCMD - { - // command groups - CMDGROUP_CORE = 0, // commands that everyone has to implement - CMDGROUP_PLATFORM_GL = 10000, // commands specific to a platform - CMDGROUP_PLATFORM_SDL = 20000, - - // - CMD_FIRST = CMDGROUP_CORE, - CMD_NOP = CMD_FIRST, - - // - CMD_RUNBUFFER, - - // synchronization - CMD_SIGNAL, - - // texture commands - CMD_TEXTURE_CREATE, - CMD_TEXTURE_DESTROY, - CMD_TEXT_TEXTURES_CREATE, - CMD_TEXT_TEXTURES_DESTROY, - CMD_TEXT_TEXTURE_UPDATE, - - // rendering - CMD_CLEAR, - CMD_RENDER, - CMD_RENDER_TEX3D, - - // opengl 2.0+ commands (some are just emulated and only exist in opengl 3.3+) - CMD_CREATE_BUFFER_OBJECT, // create vbo - CMD_RECREATE_BUFFER_OBJECT, // recreate vbo - CMD_UPDATE_BUFFER_OBJECT, // update vbo - CMD_COPY_BUFFER_OBJECT, // copy vbo to another - CMD_DELETE_BUFFER_OBJECT, // delete vbo - - CMD_CREATE_BUFFER_CONTAINER, // create vao - CMD_DELETE_BUFFER_CONTAINER, // delete vao - CMD_UPDATE_BUFFER_CONTAINER, // update vao - - CMD_INDICES_REQUIRED_NUM_NOTIFY, // create indices that are required - - CMD_RENDER_TILE_LAYER, // render a tilelayer - CMD_RENDER_BORDER_TILE, // render one tile multiple times - CMD_RENDER_QUAD_LAYER, // render a quad layer - CMD_RENDER_TEXT, // render text - CMD_RENDER_QUAD_CONTAINER, // render a quad buffer container - CMD_RENDER_QUAD_CONTAINER_EX, // render a quad buffer container with extended parameters - CMD_RENDER_QUAD_CONTAINER_SPRITE_MULTIPLE, // render a quad buffer container as sprite multiple times - - // swap - CMD_SWAP, - - // misc - CMD_MULTISAMPLING, - CMD_VSYNC, - CMD_TRY_SWAP_AND_READ_PIXEL, - CMD_TRY_SWAP_AND_SCREENSHOT, - CMD_UPDATE_VIEWPORT, - - // in Android a window that minimizes gets destroyed - CMD_WINDOW_CREATE_NTF, - CMD_WINDOW_DESTROY_NTF, - - CMD_COUNT, - }; - - enum - { - TEXFORMAT_INVALID = 0, - TEXFORMAT_RGBA, - - TEXFLAG_NOMIPMAPS = 1, - TEXFLAG_TO_3D_TEXTURE = (1 << 3), - TEXFLAG_TO_2D_ARRAY_TEXTURE = (1 << 4), - TEXFLAG_NO_2D_TEXTURE = (1 << 5), - }; - - enum - { - // - PRIMTYPE_INVALID = 0, - PRIMTYPE_LINES, - PRIMTYPE_QUADS, - PRIMTYPE_TRIANGLES, - }; - - enum - { - BLEND_NONE = 0, - BLEND_ALPHA, - BLEND_ADDITIVE, - }; - - enum - { - WRAP_REPEAT = 0, - WRAP_CLAMP, - }; - - typedef vec2 SPoint; - typedef vec2 STexCoord; - typedef GL_SColorf SColorf; - typedef GL_SColor SColor; - typedef GL_SVertex SVertex; - typedef GL_SVertexTex3D SVertexTex3D; - typedef GL_SVertexTex3DStream SVertexTex3DStream; - - struct SCommand - { - public: - SCommand(unsigned Cmd) : - m_Cmd(Cmd), m_pNext(nullptr) {} - unsigned m_Cmd; - SCommand *m_pNext; - }; - SCommand *m_pCmdBufferHead; - SCommand *m_pCmdBufferTail; - - struct SState - { - int m_BlendMode; - int m_WrapMode; - int m_Texture; - SPoint m_ScreenTL; - SPoint m_ScreenBR; - - // clip - bool m_ClipEnable; - int m_ClipX; - int m_ClipY; - int m_ClipW; - int m_ClipH; - }; - - struct SCommand_Clear : public SCommand - { - SCommand_Clear() : - SCommand(CMD_CLEAR) {} - SColorf m_Color; - bool m_ForceClear; - }; - - struct SCommand_Signal : public SCommand - { - SCommand_Signal() : - SCommand(CMD_SIGNAL) {} - CSemaphore *m_pSemaphore; - }; - - struct SCommand_RunBuffer : public SCommand - { - SCommand_RunBuffer() : - SCommand(CMD_RUNBUFFER) {} - CCommandBuffer *m_pOtherBuffer; - }; - - struct SCommand_Render : public SCommand - { - SCommand_Render() : - SCommand(CMD_RENDER) {} - SState m_State; - unsigned m_PrimType; - unsigned m_PrimCount; - SVertex *m_pVertices; // you should use the command buffer data to allocate vertices for this command - }; - - struct SCommand_RenderTex3D : public SCommand - { - SCommand_RenderTex3D() : - SCommand(CMD_RENDER_TEX3D) {} - SState m_State; - unsigned m_PrimType; - unsigned m_PrimCount; - SVertexTex3DStream *m_pVertices; // you should use the command buffer data to allocate vertices for this command - }; - - struct SCommand_CreateBufferObject : public SCommand - { - SCommand_CreateBufferObject() : - SCommand(CMD_CREATE_BUFFER_OBJECT) {} - - int m_BufferIndex; - - bool m_DeletePointer; - void *m_pUploadData; - size_t m_DataSize; - - int m_Flags; // @see EBufferObjectCreateFlags - }; - - struct SCommand_RecreateBufferObject : public SCommand - { - SCommand_RecreateBufferObject() : - SCommand(CMD_RECREATE_BUFFER_OBJECT) {} - - int m_BufferIndex; - - bool m_DeletePointer; - void *m_pUploadData; - size_t m_DataSize; - - int m_Flags; // @see EBufferObjectCreateFlags - }; - - struct SCommand_UpdateBufferObject : public SCommand - { - SCommand_UpdateBufferObject() : - SCommand(CMD_UPDATE_BUFFER_OBJECT) {} - - int m_BufferIndex; - - bool m_DeletePointer; - void *m_pOffset; - void *m_pUploadData; - size_t m_DataSize; - }; - - struct SCommand_CopyBufferObject : public SCommand - { - SCommand_CopyBufferObject() : - SCommand(CMD_COPY_BUFFER_OBJECT) {} - - int m_WriteBufferIndex; - int m_ReadBufferIndex; - - size_t m_ReadOffset; - size_t m_WriteOffset; - size_t m_CopySize; - }; - - struct SCommand_DeleteBufferObject : public SCommand - { - SCommand_DeleteBufferObject() : - SCommand(CMD_DELETE_BUFFER_OBJECT) {} - - int m_BufferIndex; - }; - - struct SCommand_CreateBufferContainer : public SCommand - { - SCommand_CreateBufferContainer() : - SCommand(CMD_CREATE_BUFFER_CONTAINER) {} - - int m_BufferContainerIndex; - - int m_Stride; - int m_VertBufferBindingIndex; - - size_t m_AttrCount; - SBufferContainerInfo::SAttribute *m_pAttributes; - }; - - struct SCommand_UpdateBufferContainer : public SCommand - { - SCommand_UpdateBufferContainer() : - SCommand(CMD_UPDATE_BUFFER_CONTAINER) {} - - int m_BufferContainerIndex; - - int m_Stride; - int m_VertBufferBindingIndex; - - size_t m_AttrCount; - SBufferContainerInfo::SAttribute *m_pAttributes; - }; - - struct SCommand_DeleteBufferContainer : public SCommand - { - SCommand_DeleteBufferContainer() : - SCommand(CMD_DELETE_BUFFER_CONTAINER) {} - - int m_BufferContainerIndex; - bool m_DestroyAllBO; - }; - - struct SCommand_IndicesRequiredNumNotify : public SCommand - { - SCommand_IndicesRequiredNumNotify() : - SCommand(CMD_INDICES_REQUIRED_NUM_NOTIFY) {} - - unsigned int m_RequiredIndicesNum; - }; - - struct SCommand_RenderTileLayer : public SCommand - { - SCommand_RenderTileLayer() : - SCommand(CMD_RENDER_TILE_LAYER) {} - SState m_State; - SColorf m_Color; // the color of the whole tilelayer -- already enveloped - - // the char offset of all indices that should be rendered, and the amount of renders - char **m_pIndicesOffsets; - unsigned int *m_pDrawCount; - - int m_IndicesDrawNum; - int m_BufferContainerIndex; - }; - - struct SCommand_RenderBorderTile : public SCommand - { - SCommand_RenderBorderTile() : - SCommand(CMD_RENDER_BORDER_TILE) {} - SState m_State; - SColorf m_Color; // the color of the whole tilelayer -- already enveloped - char *m_pIndicesOffset; - uint32_t m_DrawNum; - int m_BufferContainerIndex; - - vec2 m_Offset; - vec2 m_Scale; - }; - - struct SCommand_RenderQuadLayer : public SCommand - { - SCommand_RenderQuadLayer() : - SCommand(CMD_RENDER_QUAD_LAYER) {} - SState m_State; - - int m_BufferContainerIndex; - SQuadRenderInfo *m_pQuadInfo; - size_t m_QuadNum; - int m_QuadOffset; - }; - - struct SCommand_RenderText : public SCommand - { - SCommand_RenderText() : - SCommand(CMD_RENDER_TEXT) {} - SState m_State; - - int m_BufferContainerIndex; - int m_TextureSize; - - int m_TextTextureIndex; - int m_TextOutlineTextureIndex; - - int m_DrawNum; - ColorRGBA m_TextColor; - ColorRGBA m_TextOutlineColor; - }; - - struct SCommand_RenderQuadContainer : public SCommand - { - SCommand_RenderQuadContainer() : - SCommand(CMD_RENDER_QUAD_CONTAINER) {} - SState m_State; - - int m_BufferContainerIndex; - - unsigned int m_DrawNum; - void *m_pOffset; - }; - - struct SCommand_RenderQuadContainerEx : public SCommand - { - SCommand_RenderQuadContainerEx() : - SCommand(CMD_RENDER_QUAD_CONTAINER_EX) {} - SState m_State; - - int m_BufferContainerIndex; - - float m_Rotation; - SPoint m_Center; - - SColorf m_VertexColor; - - unsigned int m_DrawNum; - void *m_pOffset; - }; - - struct SCommand_RenderQuadContainerAsSpriteMultiple : public SCommand - { - SCommand_RenderQuadContainerAsSpriteMultiple() : - SCommand(CMD_RENDER_QUAD_CONTAINER_SPRITE_MULTIPLE) {} - SState m_State; - - int m_BufferContainerIndex; - - IGraphics::SRenderSpriteInfo *m_pRenderInfo; - - SPoint m_Center; - SColorf m_VertexColor; - - unsigned int m_DrawNum; - unsigned int m_DrawCount; - void *m_pOffset; - }; - - struct SCommand_TrySwapAndReadPixel : public SCommand - { - SCommand_TrySwapAndReadPixel() : - SCommand(CMD_TRY_SWAP_AND_READ_PIXEL) {} - ivec2 m_Position; - SColorf *m_pColor; // processor will fill this out - bool *m_pSwapped; // processor may set this to true, must be initialized to false by the caller - }; - - struct SCommand_TrySwapAndScreenshot : public SCommand - { - SCommand_TrySwapAndScreenshot() : - SCommand(CMD_TRY_SWAP_AND_SCREENSHOT) {} - CImageInfo *m_pImage; // processor will fill this out, the one who adds this command must free the data as well - bool *m_pSwapped; // processor may set this to true, must be initialized to false by the caller - }; - - struct SCommand_Swap : public SCommand - { - SCommand_Swap() : - SCommand(CMD_SWAP) {} - }; - - struct SCommand_VSync : public SCommand - { - SCommand_VSync() : - SCommand(CMD_VSYNC) {} - - int m_VSync; - bool *m_pRetOk; - }; - - struct SCommand_MultiSampling : public SCommand - { - SCommand_MultiSampling() : - SCommand(CMD_MULTISAMPLING) {} - - uint32_t m_RequestedMultiSamplingCount; - uint32_t *m_pRetMultiSamplingCount; - bool *m_pRetOk; - }; - - struct SCommand_Update_Viewport : public SCommand - { - SCommand_Update_Viewport() : - SCommand(CMD_UPDATE_VIEWPORT) {} - - int m_X; - int m_Y; - int m_Width; - int m_Height; - bool m_ByResize; // resized by an resize event.. a hint to make clear that the viewport update can be deferred if wanted - }; - - struct SCommand_Texture_Create : public SCommand - { - SCommand_Texture_Create() : - SCommand(CMD_TEXTURE_CREATE) {} - - // texture information - int m_Slot; - - size_t m_Width; - size_t m_Height; - int m_Flags; - // data must be in RGBA format - uint8_t *m_pData; // will be freed by the command processor - }; - - struct SCommand_Texture_Destroy : public SCommand - { - SCommand_Texture_Destroy() : - SCommand(CMD_TEXTURE_DESTROY) {} - - // texture information - int m_Slot; - }; - - struct SCommand_TextTextures_Create : public SCommand - { - SCommand_TextTextures_Create() : - SCommand(CMD_TEXT_TEXTURES_CREATE) {} - - // texture information - int m_Slot; - int m_SlotOutline; - - size_t m_Width; - size_t m_Height; - - uint8_t *m_pTextData; // will be freed by the command processor - uint8_t *m_pTextOutlineData; // will be freed by the command processor - }; - - struct SCommand_TextTextures_Destroy : public SCommand - { - SCommand_TextTextures_Destroy() : - SCommand(CMD_TEXT_TEXTURES_DESTROY) {} - - // texture information - int m_Slot; - int m_SlotOutline; - }; - - struct SCommand_TextTexture_Update : public SCommand - { - SCommand_TextTexture_Update() : - SCommand(CMD_TEXT_TEXTURE_UPDATE) {} - - // texture information - int m_Slot; - - int m_X; - int m_Y; - size_t m_Width; - size_t m_Height; - uint8_t *m_pData; // will be freed by the command processor - }; - - struct SCommand_WindowCreateNtf : public CCommandBuffer::SCommand - { - SCommand_WindowCreateNtf() : - SCommand(CMD_WINDOW_CREATE_NTF) {} - - uint32_t m_WindowId; - }; - - struct SCommand_WindowDestroyNtf : public CCommandBuffer::SCommand - { - SCommand_WindowDestroyNtf() : - SCommand(CMD_WINDOW_DESTROY_NTF) {} - - uint32_t m_WindowId; - }; - - // - CCommandBuffer(unsigned CmdBufferSize, unsigned DataBufferSize) : - m_CmdBuffer(CmdBufferSize), m_DataBuffer(DataBufferSize), m_pCmdBufferHead(nullptr), m_pCmdBufferTail(nullptr) - { - } - - void *AllocData(unsigned WantedSize) - { - return m_DataBuffer.Alloc(WantedSize); - } - - template - bool AddCommandUnsafe(const T &Command) - { - // make sure that we don't do something stupid like ->AddCommand(&Cmd); - (void)static_cast(&Command); - - // allocate and copy the command into the buffer - T *pCmd = (T *)m_CmdBuffer.Alloc(sizeof(*pCmd), alignof(T)); - if(!pCmd) - return false; - *pCmd = Command; - pCmd->m_pNext = nullptr; - - if(m_pCmdBufferTail) - m_pCmdBufferTail->m_pNext = pCmd; - if(!m_pCmdBufferHead) - m_pCmdBufferHead = pCmd; - m_pCmdBufferTail = pCmd; - - ++m_CommandCount; - - return true; - } - - SCommand *Head() - { - return m_pCmdBufferHead; - } - - void Reset() - { - m_pCmdBufferHead = m_pCmdBufferTail = nullptr; - m_CmdBuffer.Reset(); - m_DataBuffer.Reset(); - - m_CommandCount = 0; - m_RenderCallCount = 0; - } - - void AddRenderCalls(size_t RenderCallCountToAdd) - { - m_RenderCallCount += RenderCallCountToAdd; - } -}; - -enum EGraphicsBackendErrorCodes -{ - GRAPHICS_BACKEND_ERROR_CODE_UNKNOWN = -1, - GRAPHICS_BACKEND_ERROR_CODE_NONE = 0, - GRAPHICS_BACKEND_ERROR_CODE_GL_CONTEXT_FAILED, - GRAPHICS_BACKEND_ERROR_CODE_GL_VERSION_FAILED, - GRAPHICS_BACKEND_ERROR_CODE_SDL_INIT_FAILED, - GRAPHICS_BACKEND_ERROR_CODE_SDL_SCREEN_REQUEST_FAILED, - GRAPHICS_BACKEND_ERROR_CODE_SDL_SCREEN_INFO_REQUEST_FAILED, - GRAPHICS_BACKEND_ERROR_CODE_SDL_SCREEN_RESOLUTION_REQUEST_FAILED, - GRAPHICS_BACKEND_ERROR_CODE_SDL_WINDOW_CREATE_FAILED, -}; - -// interface for the graphics backend -// all these functions are called on the main thread -class IGraphicsBackend -{ -public: - enum - { - INITFLAG_FULLSCREEN = 1 << 0, - INITFLAG_VSYNC = 1 << 1, - INITFLAG_RESIZABLE = 1 << 2, - INITFLAG_BORDERLESS = 1 << 3, - INITFLAG_HIGHDPI = 1 << 4, - INITFLAG_DESKTOP_FULLSCREEN = 1 << 5, - }; - - virtual ~IGraphicsBackend() = default; - - virtual int Init(const char *pName, int *pScreen, int *pWidth, int *pHeight, int *pRefreshRate, int *pFsaaSamples, int Flags, int *pDesktopWidth, int *pDesktopHeight, int *pCurrentWidth, int *pCurrentHeight, class IStorage *pStorage) = 0; - virtual int Shutdown() = 0; - - virtual uint64_t TextureMemoryUsage() const = 0; - virtual uint64_t BufferMemoryUsage() const = 0; - virtual uint64_t StreamedMemoryUsage() const = 0; - virtual uint64_t StagingMemoryUsage() const = 0; - - virtual const TTwGraphicsGpuList &GetGpus() const = 0; - - virtual void GetVideoModes(CVideoMode *pModes, int MaxModes, int *pNumModes, int HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int Screen) = 0; - virtual void GetCurrentVideoMode(CVideoMode &CurMode, int HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int Screen) = 0; - - virtual int GetNumScreens() const = 0; - virtual const char *GetScreenName(int Screen) const = 0; - - virtual void Minimize() = 0; - virtual void Maximize() = 0; - virtual void SetWindowParams(int FullscreenMode, bool IsBorderless) = 0; - virtual bool SetWindowScreen(int Index) = 0; - virtual bool UpdateDisplayMode(int Index) = 0; - virtual int GetWindowScreen() = 0; - virtual int WindowActive() = 0; - virtual int WindowOpen() = 0; - virtual void SetWindowGrab(bool Grab) = 0; - // returns true, if the video mode changed - virtual bool ResizeWindow(int w, int h, int RefreshRate) = 0; - virtual void GetViewportSize(int &w, int &h) = 0; - virtual void NotifyWindow() = 0; - - virtual void WindowDestroyNtf(uint32_t WindowId) = 0; - virtual void WindowCreateNtf(uint32_t WindowId) = 0; - - virtual void RunBuffer(CCommandBuffer *pBuffer) = 0; - virtual void RunBufferSingleThreadedUnsafe(CCommandBuffer *pBuffer) = 0; - virtual bool IsIdle() const = 0; - virtual void WaitForIdle() = 0; - - virtual bool GetDriverVersion(EGraphicsDriverAgeType DriverAgeType, int &Major, int &Minor, int &Patch, const char *&pName, EBackendType BackendType) = 0; - // checks if the current values of the config are a graphics modern API - virtual bool IsConfigModernAPI() { return false; } - virtual bool UseTrianglesAsQuad() { return false; } - virtual bool HasTileBuffering() { return false; } - virtual bool HasQuadBuffering() { return false; } - virtual bool HasTextBuffering() { return false; } - virtual bool HasQuadContainerBuffering() { return false; } - virtual bool Uses2DTextureArrays() { return false; } - virtual bool HasTextureArraysSupport() { return false; } - virtual const char *GetErrorString() { return NULL; } - - virtual const char *GetVendorString() = 0; - virtual const char *GetVersionString() = 0; - virtual const char *GetRendererString() = 0; - - // be aware that this function should only be called from the graphics thread, and even then you should really know what you are doing - virtual TGLBackendReadPresentedImageData &GetReadPresentedImageDataFuncUnsafe() = 0; - - virtual bool GetWarning(std::vector &WarningStrings) = 0; - - // returns true if the error msg was shown - virtual bool ShowMessageBox(unsigned Type, const char *pTitle, const char *pMsg) = 0; -}; - -class CGraphics_Threaded : public IEngineGraphics -{ - enum - { - NUM_CMDBUFFERS = 2, - - DRAWING_QUADS = 1, - DRAWING_LINES = 2, - DRAWING_TRIANGLES = 3 - }; - - CCommandBuffer::SState m_State; - IGraphicsBackend *m_pBackend; - bool m_GLTileBufferingEnabled; - bool m_GLQuadBufferingEnabled; - bool m_GLTextBufferingEnabled; - bool m_GLQuadContainerBufferingEnabled; - bool m_GLUses2DTextureArrays; - bool m_GLHasTextureArraysSupport; - bool m_GLUseTrianglesAsQuad; - - CCommandBuffer *m_apCommandBuffers[NUM_CMDBUFFERS]; - CCommandBuffer *m_pCommandBuffer; - unsigned m_CurrentCommandBuffer; - - // - class IStorage *m_pStorage; - class IConsole *m_pConsole; - class IEngine *m_pEngine; - - int m_CurIndex; - - CCommandBuffer::SVertex m_aVertices[CCommandBuffer::MAX_VERTICES]; - CCommandBuffer::SVertexTex3DStream m_aVerticesTex3D[CCommandBuffer::MAX_VERTICES]; - int m_NumVertices; - - CCommandBuffer::SColor m_aColor[4]; - CCommandBuffer::STexCoord m_aTexture[4]; - - bool m_RenderEnable; - - float m_Rotation; - int m_Drawing; - bool m_DoScreenshot; - char m_aScreenshotName[IO_MAX_PATH_LENGTH]; - - CTextureHandle m_NullTexture; - - std::vector m_vTextureIndices; - size_t m_FirstFreeTexture; - int m_TextureMemoryUsage; - - std::atomic m_WarnPngliteIncompatibleImages = false; - - std::mutex m_WarningsMutex; - std::vector m_vWarnings; - - // is a non full windowed (in a sense that the viewport won't include the whole window), - // forced viewport, so that it justifies our UI ratio needs - bool m_IsForcedViewport = false; - - struct SVertexArrayInfo - { - SVertexArrayInfo() : - m_FreeIndex(-1) {} - // keep a reference to it, so we can free the ID - int m_AssociatedBufferObjectIndex; - - int m_FreeIndex; - }; - std::vector m_vVertexArrayInfo; - int m_FirstFreeVertexArrayInfo; - - std::vector m_vBufferObjectIndices; - int m_FirstFreeBufferObjectIndex; - - struct SQuadContainer - { - SQuadContainer(bool AutomaticUpload = true) - { - m_vQuads.clear(); - m_QuadBufferObjectIndex = m_QuadBufferContainerIndex = -1; - m_FreeIndex = -1; - - m_AutomaticUpload = AutomaticUpload; - } - - struct SQuad - { - CCommandBuffer::SVertex m_aVertices[4]; - }; - - std::vector m_vQuads; - - int m_QuadBufferObjectIndex; - int m_QuadBufferContainerIndex; - - int m_FreeIndex; - - bool m_AutomaticUpload; - }; - std::vector m_vQuadContainers; - int m_FirstFreeQuadContainer; - - std::vector m_vResizeListeners; - std::vector m_vPropChangeListeners; - - void *AllocCommandBufferData(size_t AllocSize); - - void AddVertices(int Count); - void AddVertices(int Count, CCommandBuffer::SVertex *pVertices); - void AddVertices(int Count, CCommandBuffer::SVertexTex3DStream *pVertices); - - template - void Rotate(const CCommandBuffer::SPoint &rCenter, TName *pPoints, int NumPoints) - { - float c = std::cos(m_Rotation); - float s = std::sin(m_Rotation); - float x, y; - int i; - - TName *pVertices = pPoints; - for(i = 0; i < NumPoints; i++) - { - x = pVertices[i].m_Pos.x - rCenter.x; - y = pVertices[i].m_Pos.y - rCenter.y; - pVertices[i].m_Pos.x = x * c - y * s + rCenter.x; - pVertices[i].m_Pos.y = x * s + y * c + rCenter.y; - } - } - - template - void AddCmd( - TName &Cmd, std::function FailFunc = [] { return true; }) - { - if(m_pCommandBuffer->AddCommandUnsafe(Cmd)) - return; - - // kick command buffer and try again - KickCommandBuffer(); - - if(!FailFunc()) - { - char aError[256]; - str_format(aError, sizeof(aError), "graphics: failed to run fail handler for command '%s'", typeid(TName).name()); - dbg_assert(false, aError); - } - - if(!m_pCommandBuffer->AddCommandUnsafe(Cmd)) - { - char aError[256]; - str_format(aError, sizeof(aError), "graphics: failed to add command '%s' to command buffer", typeid(TName).name()); - dbg_assert(false, aError); - } - } - - void KickCommandBuffer(); - - void AddBackEndWarningIfExists(); - - void AdjustViewport(bool SendViewportChangeToBackend); - - ivec2 m_ReadPixelPosition = ivec2(0, 0); - ColorRGBA *m_pReadPixelColor = nullptr; - void ReadPixelDirect(bool *pSwapped); - void ScreenshotDirect(bool *pSwapped); - - int IssueInit(); - int InitWindow(); - -public: - CGraphics_Threaded(); - - void ClipEnable(int x, int y, int w, int h) override; - void ClipDisable() override; - - void BlendNone() override; - void BlendNormal() override; - void BlendAdditive() override; - - void WrapNormal() override; - void WrapClamp() override; - - uint64_t TextureMemoryUsage() const override; - uint64_t BufferMemoryUsage() const override; - uint64_t StreamedMemoryUsage() const override; - uint64_t StagingMemoryUsage() const override; - - const TTwGraphicsGpuList &GetGpus() const override; - - void MapScreen(float TopLeftX, float TopLeftY, float BottomRightX, float BottomRightY) override; - void GetScreen(float *pTopLeftX, float *pTopLeftY, float *pBottomRightX, float *pBottomRightY) override; - - void LinesBegin() override; - void LinesEnd() override; - void LinesDraw(const CLineItem *pArray, int Num) override; - - IGraphics::CTextureHandle FindFreeTextureIndex(); - void FreeTextureIndex(CTextureHandle *pIndex); - void UnloadTexture(IGraphics::CTextureHandle *pIndex) override; - void LoadTextureAddWarning(size_t Width, size_t Height, int Flags, const char *pTexName); - IGraphics::CTextureHandle LoadTextureRaw(const CImageInfo &Image, int Flags, const char *pTexName = nullptr) override; - IGraphics::CTextureHandle LoadTextureRawMove(CImageInfo &Image, int Flags, const char *pTexName = nullptr) override; - - bool LoadTextTextures(size_t Width, size_t Height, CTextureHandle &TextTexture, CTextureHandle &TextOutlineTexture, uint8_t *pTextData, uint8_t *pTextOutlineData) override; - bool UnloadTextTextures(CTextureHandle &TextTexture, CTextureHandle &TextOutlineTexture) override; - bool UpdateTextTexture(CTextureHandle TextureId, int x, int y, size_t Width, size_t Height, uint8_t *pData, bool IsMovedPointer) override; - - CTextureHandle LoadSpriteTexture(const CImageInfo &FromImageInfo, const struct CDataSprite *pSprite) override; - - bool IsImageSubFullyTransparent(const CImageInfo &FromImageInfo, int x, int y, int w, int h) override; - bool IsSpriteTextureFullyTransparent(const CImageInfo &FromImageInfo, const struct CDataSprite *pSprite) override; - - // simple uncompressed RGBA loaders - IGraphics::CTextureHandle LoadTexture(const char *pFilename, int StorageType, int Flags = 0) override; - bool LoadPng(CImageInfo &Image, const char *pFilename, int StorageType) override; - bool LoadPng(CImageInfo &Image, const uint8_t *pData, size_t DataSize, const char *pContextName) override; - - bool CheckImageDivisibility(const char *pContextName, CImageInfo &Image, int DivX, int DivY, bool AllowResize) override; - bool IsImageFormatRgba(const char *pContextName, const CImageInfo &Image) override; - - void TextureSet(CTextureHandle TextureId) override; - - void Clear(float r, float g, float b, bool ForceClearNow = false) override; - - void QuadsBegin() override; - void QuadsEnd() override; - void QuadsTex3DBegin() override; - void QuadsTex3DEnd() override; - void TrianglesBegin() override; - void TrianglesEnd() override; - void QuadsEndKeepVertices() override; - void QuadsDrawCurrentVertices(bool KeepVertices = true) override; - void QuadsSetRotation(float Angle) override; - - template - void SetColor(TName *pVertex, int ColorIndex) - { - TName *pVert = pVertex; - pVert->m_Color = m_aColor[ColorIndex]; - } - - void SetColorVertex(const CColorVertex *pArray, size_t Num) override; - void SetColor(float r, float g, float b, float a) override; - void SetColor(ColorRGBA Color) override; - void SetColor4(ColorRGBA TopLeft, ColorRGBA TopRight, ColorRGBA BottomLeft, ColorRGBA BottomRight) override; - - // go through all vertices and change their color (only works for quads) - void ChangeColorOfCurrentQuadVertices(float r, float g, float b, float a) override; - void ChangeColorOfQuadVertices(size_t QuadOffset, unsigned char r, unsigned char g, unsigned char b, unsigned char a) override; - - void QuadsSetSubset(float TlU, float TlV, float BrU, float BrV) override; - void QuadsSetSubsetFree( - float x0, float y0, float x1, float y1, - float x2, float y2, float x3, float y3, int Index = -1) override; - - void QuadsDraw(CQuadItem *pArray, int Num) override; - - template - void QuadsDrawTLImpl(TName *pVertices, const CQuadItem *pArray, int Num) - { - CCommandBuffer::SPoint Center; - - dbg_assert(m_Drawing == DRAWING_QUADS, "called Graphics()->QuadsDrawTL without begin"); - - if(g_Config.m_GfxQuadAsTriangle && !m_GLUseTrianglesAsQuad) - { - for(int i = 0; i < Num; ++i) - { - // first triangle - pVertices[m_NumVertices + 6 * i].m_Pos.x = pArray[i].m_X; - pVertices[m_NumVertices + 6 * i].m_Pos.y = pArray[i].m_Y; - pVertices[m_NumVertices + 6 * i].m_Tex = m_aTexture[0]; - SetColor(&pVertices[m_NumVertices + 6 * i], 0); - - pVertices[m_NumVertices + 6 * i + 1].m_Pos.x = pArray[i].m_X + pArray[i].m_Width; - pVertices[m_NumVertices + 6 * i + 1].m_Pos.y = pArray[i].m_Y; - pVertices[m_NumVertices + 6 * i + 1].m_Tex = m_aTexture[1]; - SetColor(&pVertices[m_NumVertices + 6 * i + 1], 1); - - pVertices[m_NumVertices + 6 * i + 2].m_Pos.x = pArray[i].m_X + pArray[i].m_Width; - pVertices[m_NumVertices + 6 * i + 2].m_Pos.y = pArray[i].m_Y + pArray[i].m_Height; - pVertices[m_NumVertices + 6 * i + 2].m_Tex = m_aTexture[2]; - SetColor(&pVertices[m_NumVertices + 6 * i + 2], 2); - - // second triangle - pVertices[m_NumVertices + 6 * i + 3].m_Pos.x = pArray[i].m_X; - pVertices[m_NumVertices + 6 * i + 3].m_Pos.y = pArray[i].m_Y; - pVertices[m_NumVertices + 6 * i + 3].m_Tex = m_aTexture[0]; - SetColor(&pVertices[m_NumVertices + 6 * i + 3], 0); - - pVertices[m_NumVertices + 6 * i + 4].m_Pos.x = pArray[i].m_X + pArray[i].m_Width; - pVertices[m_NumVertices + 6 * i + 4].m_Pos.y = pArray[i].m_Y + pArray[i].m_Height; - pVertices[m_NumVertices + 6 * i + 4].m_Tex = m_aTexture[2]; - SetColor(&pVertices[m_NumVertices + 6 * i + 4], 2); - - pVertices[m_NumVertices + 6 * i + 5].m_Pos.x = pArray[i].m_X; - pVertices[m_NumVertices + 6 * i + 5].m_Pos.y = pArray[i].m_Y + pArray[i].m_Height; - pVertices[m_NumVertices + 6 * i + 5].m_Tex = m_aTexture[3]; - SetColor(&pVertices[m_NumVertices + 6 * i + 5], 3); - - if(m_Rotation != 0) - { - Center.x = pArray[i].m_X + pArray[i].m_Width / 2; - Center.y = pArray[i].m_Y + pArray[i].m_Height / 2; - - Rotate(Center, &pVertices[m_NumVertices + 6 * i], 6); - } - } - - AddVertices(3 * 2 * Num, pVertices); - } - else - { - for(int i = 0; i < Num; ++i) - { - pVertices[m_NumVertices + 4 * i].m_Pos.x = pArray[i].m_X; - pVertices[m_NumVertices + 4 * i].m_Pos.y = pArray[i].m_Y; - pVertices[m_NumVertices + 4 * i].m_Tex = m_aTexture[0]; - SetColor(&pVertices[m_NumVertices + 4 * i], 0); - - pVertices[m_NumVertices + 4 * i + 1].m_Pos.x = pArray[i].m_X + pArray[i].m_Width; - pVertices[m_NumVertices + 4 * i + 1].m_Pos.y = pArray[i].m_Y; - pVertices[m_NumVertices + 4 * i + 1].m_Tex = m_aTexture[1]; - SetColor(&pVertices[m_NumVertices + 4 * i + 1], 1); - - pVertices[m_NumVertices + 4 * i + 2].m_Pos.x = pArray[i].m_X + pArray[i].m_Width; - pVertices[m_NumVertices + 4 * i + 2].m_Pos.y = pArray[i].m_Y + pArray[i].m_Height; - pVertices[m_NumVertices + 4 * i + 2].m_Tex = m_aTexture[2]; - SetColor(&pVertices[m_NumVertices + 4 * i + 2], 2); - - pVertices[m_NumVertices + 4 * i + 3].m_Pos.x = pArray[i].m_X; - pVertices[m_NumVertices + 4 * i + 3].m_Pos.y = pArray[i].m_Y + pArray[i].m_Height; - pVertices[m_NumVertices + 4 * i + 3].m_Tex = m_aTexture[3]; - SetColor(&pVertices[m_NumVertices + 4 * i + 3], 3); - - if(m_Rotation != 0) - { - Center.x = pArray[i].m_X + pArray[i].m_Width / 2; - Center.y = pArray[i].m_Y + pArray[i].m_Height / 2; - - Rotate(Center, &pVertices[m_NumVertices + 4 * i], 4); - } - } - - AddVertices(4 * Num, pVertices); - } - } - - void QuadsDrawTL(const CQuadItem *pArray, int Num) override; - - void QuadsTex3DDrawTL(const CQuadItem *pArray, int Num) override; - - void QuadsDrawFreeform(const CFreeformItem *pArray, int Num) override; - void QuadsText(float x, float y, float Size, const char *pText) override; - - void DrawRectExt(float x, float y, float w, float h, float r, int Corners) override; - void DrawRectExt4(float x, float y, float w, float h, ColorRGBA ColorTopLeft, ColorRGBA ColorTopRight, ColorRGBA ColorBottomLeft, ColorRGBA ColorBottomRight, float r, int Corners) override; - int CreateRectQuadContainer(float x, float y, float w, float h, float r, int Corners) override; - void DrawRect(float x, float y, float w, float h, ColorRGBA Color, int Corners, float Rounding) override; - void DrawRect4(float x, float y, float w, float h, ColorRGBA ColorTopLeft, ColorRGBA ColorTopRight, ColorRGBA ColorBottomLeft, ColorRGBA ColorBottomRight, int Corners, float Rounding) override; - void DrawCircle(float CenterX, float CenterY, float Radius, int Segments) override; - - int CreateQuadContainer(bool AutomaticUpload = true) override; - void QuadContainerChangeAutomaticUpload(int ContainerIndex, bool AutomaticUpload) override; - void QuadContainerUpload(int ContainerIndex) override; - int QuadContainerAddQuads(int ContainerIndex, CQuadItem *pArray, int Num) override; - int QuadContainerAddQuads(int ContainerIndex, CFreeformItem *pArray, int Num) override; - void QuadContainerReset(int ContainerIndex) override; - void DeleteQuadContainer(int &ContainerIndex) override; - void RenderQuadContainer(int ContainerIndex, int QuadDrawNum) override; - void RenderQuadContainer(int ContainerIndex, int QuadOffset, int QuadDrawNum, bool ChangeWrapMode = true) override; - void RenderQuadContainerEx(int ContainerIndex, int QuadOffset, int QuadDrawNum, float X, float Y, float ScaleX = 1.f, float ScaleY = 1.f) override; - void RenderQuadContainerAsSprite(int ContainerIndex, int QuadOffset, float X, float Y, float ScaleX = 1.f, float ScaleY = 1.f) override; - void RenderQuadContainerAsSpriteMultiple(int ContainerIndex, int QuadOffset, int DrawCount, SRenderSpriteInfo *pRenderInfo) override; - - template - void FlushVerticesImpl(bool KeepVertices, int &PrimType, size_t &PrimCount, size_t &NumVerts, TName &Command, size_t VertSize) - { - Command.m_pVertices = nullptr; - if(m_NumVertices == 0) - return; - - NumVerts = m_NumVertices; - - if(!KeepVertices) - m_NumVertices = 0; - - if(m_Drawing == DRAWING_QUADS) - { - if(g_Config.m_GfxQuadAsTriangle && !m_GLUseTrianglesAsQuad) - { - PrimType = CCommandBuffer::PRIMTYPE_TRIANGLES; - PrimCount = NumVerts / 3; - } - else - { - PrimType = CCommandBuffer::PRIMTYPE_QUADS; - PrimCount = NumVerts / 4; - } - } - else if(m_Drawing == DRAWING_LINES) - { - PrimType = CCommandBuffer::PRIMTYPE_LINES; - PrimCount = NumVerts / 2; - } - else if(m_Drawing == DRAWING_TRIANGLES) - { - PrimType = CCommandBuffer::PRIMTYPE_TRIANGLES; - PrimCount = NumVerts / 3; - } - else - return; - - Command.m_pVertices = (decltype(Command.m_pVertices))AllocCommandBufferData(VertSize * NumVerts); - Command.m_State = m_State; - - Command.m_PrimType = PrimType; - Command.m_PrimCount = PrimCount; - - AddCmd(Command, [&] { - Command.m_pVertices = (decltype(Command.m_pVertices))m_pCommandBuffer->AllocData(VertSize * NumVerts); - return Command.m_pVertices != nullptr; - }); - - m_pCommandBuffer->AddRenderCalls(1); - } - - void FlushVertices(bool KeepVertices = false) override; - void FlushVerticesTex3D() override; - - void RenderTileLayer(int BufferContainerIndex, const ColorRGBA &Color, char **pOffsets, unsigned int *pIndicedVertexDrawNum, size_t NumIndicesOffset) override; - virtual void RenderBorderTiles(int BufferContainerIndex, const ColorRGBA &Color, char *pIndexBufferOffset, const vec2 &Offset, const vec2 &Scale, uint32_t DrawNum) override; - void RenderQuadLayer(int BufferContainerIndex, SQuadRenderInfo *pQuadInfo, size_t QuadNum, int QuadOffset) override; - void RenderText(int BufferContainerIndex, int TextQuadNum, int TextureSize, int TextureTextIndex, int TextureTextOutlineIndex, const ColorRGBA &TextColor, const ColorRGBA &TextOutlineColor) override; - - // modern GL functions - int CreateBufferObject(size_t UploadDataSize, void *pUploadData, int CreateFlags, bool IsMovedPointer = false) override; - void RecreateBufferObject(int BufferIndex, size_t UploadDataSize, void *pUploadData, int CreateFlags, bool IsMovedPointer = false) override; - void UpdateBufferObjectInternal(int BufferIndex, size_t UploadDataSize, void *pUploadData, void *pOffset, bool IsMovedPointer = false); - void CopyBufferObjectInternal(int WriteBufferIndex, int ReadBufferIndex, size_t WriteOffset, size_t ReadOffset, size_t CopyDataSize); - void DeleteBufferObject(int BufferIndex) override; - - int CreateBufferContainer(SBufferContainerInfo *pContainerInfo) override; - // destroying all buffer objects means, that all referenced VBOs are destroyed automatically, so the user does not need to save references to them - void DeleteBufferContainer(int &ContainerIndex, bool DestroyAllBO = true) override; - void UpdateBufferContainerInternal(int ContainerIndex, SBufferContainerInfo *pContainerInfo); - void IndicesNumRequiredNotify(unsigned int RequiredIndicesCount) override; - - int GetNumScreens() const override; - const char *GetScreenName(int Screen) const override; - - void Minimize() override; - void Maximize() override; - void WarnPngliteIncompatibleImages(bool Warn) override; - void SetWindowParams(int FullscreenMode, bool IsBorderless) override; - bool SetWindowScreen(int Index) override; - void Move(int x, int y) override; - bool Resize(int w, int h, int RefreshRate) override; - void ResizeToScreen() override; - void GotResized(int w, int h, int RefreshRate) override; - void UpdateViewport(int X, int Y, int W, int H, bool ByResize) override; - void AddWindowResizeListener(WINDOW_RESIZE_FUNC pFunc) override; - void AddWindowPropChangeListener(WINDOW_PROPS_CHANGED_FUNC pFunc) override; - int GetWindowScreen() override; - - void WindowDestroyNtf(uint32_t WindowId) override; - void WindowCreateNtf(uint32_t WindowId) override; - - int WindowActive() override; - int WindowOpen() override; - - void SetWindowGrab(bool Grab) override; - void NotifyWindow() override; - - int Init() override; - void Shutdown() override; - - void ReadPixel(ivec2 Position, ColorRGBA *pColor) override; - void TakeScreenshot(const char *pFilename) override; - void TakeCustomScreenshot(const char *pFilename) override; - void Swap() override; - bool SetVSync(bool State) override; - bool SetMultiSampling(uint32_t ReqMultiSamplingCount, uint32_t &MultiSamplingCountBackend) override; - - int GetVideoModes(CVideoMode *pModes, int MaxModes, int Screen) override; - void GetCurrentVideoMode(CVideoMode &CurMode, int Screen) override; - - virtual int GetDesktopScreenWidth() const { return g_Config.m_GfxDesktopWidth; } - virtual int GetDesktopScreenHeight() const { return g_Config.m_GfxDesktopHeight; } - - // synchronization - void InsertSignal(CSemaphore *pSemaphore) override; - bool IsIdle() const override; - void WaitForIdle() override; - - void AddWarning(const SWarning &Warning); - std::optional CurrentWarning() override; - - bool ShowMessageBox(unsigned Type, const char *pTitle, const char *pMsg) override; - bool IsBackendInitialized() override; - - bool GetDriverVersion(EGraphicsDriverAgeType DriverAgeType, int &Major, int &Minor, int &Patch, const char *&pName, EBackendType BackendType) override { return m_pBackend->GetDriverVersion(DriverAgeType, Major, Minor, Patch, pName, BackendType); } - bool IsConfigModernAPI() override { return m_pBackend->IsConfigModernAPI(); } - bool IsTileBufferingEnabled() override { return m_GLTileBufferingEnabled; } - bool IsQuadBufferingEnabled() override { return m_GLQuadBufferingEnabled; } - bool IsTextBufferingEnabled() override { return m_GLTextBufferingEnabled; } - bool IsQuadContainerBufferingEnabled() override { return m_GLQuadContainerBufferingEnabled; } - bool Uses2DTextureArrays() override { return m_GLUses2DTextureArrays; } - bool HasTextureArraysSupport() override { return m_GLHasTextureArraysSupport; } - - const char *GetVendorString() override; - const char *GetVersionString() override; - const char *GetRendererString() override; - - TGLBackendReadPresentedImageData &GetReadPresentedImageDataFuncUnsafe() override; -}; - -typedef std::function TTranslateFunc; -extern IGraphicsBackend *CreateGraphicsBackend(TTranslateFunc &&TranslateFunc); - -#endif // ENGINE_CLIENT_GRAPHICS_THREADED_H diff --git a/src/engine/client/input.cpp b/src/engine/client/input.cpp deleted file mode 100644 index c7ce4fd082..0000000000 --- a/src/engine/client/input.cpp +++ /dev/null @@ -1,918 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include - -#include -#include -#include -#include -#include -#include - -#include "input.h" - -// this header is protected so you don't include it from anywhere -#define KEYS_INCLUDE -#include "keynames.h" -#undef KEYS_INCLUDE - -// support older SDL version (pre 2.0.6) -#ifndef SDL_JOYSTICK_AXIS_MIN -#define SDL_JOYSTICK_AXIS_MIN (-32768) -#endif -#ifndef SDL_JOYSTICK_AXIS_MAX -#define SDL_JOYSTICK_AXIS_MAX 32767 -#endif - -#if defined(CONF_FAMILY_WINDOWS) -#include -// windows.h must be included before imm.h, but clang-format requires includes to be sorted alphabetically, hence this comment. -#include -#endif - -// for platform specific features that aren't available or are broken in SDL -#include -#ifdef KeyPress -#undef KeyPress // Undo pollution from X11/Xlib.h included by SDL_syswm.h on Linux -#endif - -static void AssertKeyValid(int Key) -{ - if(Key < KEY_FIRST || Key >= KEY_LAST) - { - char aError[32]; - str_format(aError, sizeof(aError), "Key invalid: %d", Key); - dbg_assert(false, aError); - } -} - -void CInput::AddKeyEvent(int Key, int Flags) -{ - AssertKeyValid(Key); - dbg_assert((Flags & (FLAG_PRESS | FLAG_RELEASE)) != 0 && (Flags & ~(FLAG_PRESS | FLAG_RELEASE)) == 0, "Flags invalid"); - - CEvent Event; - Event.m_Key = Key; - Event.m_Flags = Flags; - Event.m_aText[0] = '\0'; - Event.m_InputCount = m_InputCounter; - m_vInputEvents.emplace_back(Event); - - if(Flags & IInput::FLAG_PRESS) - { - m_aCurrentKeyStates[Key] = true; - m_aFrameKeyStates[Key] = true; - } - if(Flags & IInput::FLAG_RELEASE) - { - m_aCurrentKeyStates[Key] = false; - } -} - -void CInput::AddTextEvent(const char *pText) -{ - CEvent Event; - Event.m_Key = KEY_UNKNOWN; - Event.m_Flags = FLAG_TEXT; - str_copy(Event.m_aText, pText); - Event.m_InputCount = m_InputCounter; - m_vInputEvents.emplace_back(Event); -} - -CInput::CInput() -{ - std::fill(std::begin(m_aCurrentKeyStates), std::end(m_aCurrentKeyStates), false); - std::fill(std::begin(m_aFrameKeyStates), std::end(m_aFrameKeyStates), false); - - m_vInputEvents.reserve(32); - m_LastUpdate = 0; - m_UpdateTime = 0.0f; - - m_InputCounter = 1; - m_InputGrabbed = false; - - m_MouseFocus = true; - - m_CompositionCursor = 0; - m_CandidateSelectedIndex = -1; - - m_aDropFile[0] = '\0'; -} - -void CInput::Init() -{ - StopTextInput(); - - m_pGraphics = Kernel()->RequestInterface(); - m_pConsole = Kernel()->RequestInterface(); - m_pConfigManager = Kernel()->RequestInterface(); - - MouseModeRelative(); - - InitJoysticks(); -} - -void CInput::Shutdown() -{ - CloseJoysticks(); -} - -void CInput::InitJoysticks() -{ - if(!SDL_WasInit(SDL_INIT_JOYSTICK)) - { - if(SDL_InitSubSystem(SDL_INIT_JOYSTICK) < 0) - { - dbg_msg("joystick", "Unable to init SDL joystick system: %s", SDL_GetError()); - return; - } - } - - const int NumJoysticks = SDL_NumJoysticks(); - dbg_msg("joystick", "%d joystick(s) found", NumJoysticks); - for(int i = 0; i < NumJoysticks; i++) - OpenJoystick(i); - UpdateActiveJoystick(); - - Console()->Chain("inp_controller_guid", ConchainJoystickGuidChanged, this); -} - -bool CInput::OpenJoystick(int JoystickIndex) -{ - SDL_Joystick *pJoystick = SDL_JoystickOpen(JoystickIndex); - if(!pJoystick) - { - dbg_msg("joystick", "Could not open joystick %d: '%s'", JoystickIndex, SDL_GetError()); - return false; - } - if(std::find_if(m_vJoysticks.begin(), m_vJoysticks.end(), [pJoystick](const CJoystick &Joystick) -> bool { return Joystick.m_pDelegate == pJoystick; }) != m_vJoysticks.end()) - { - // Joystick has already been added - return false; - } - m_vJoysticks.emplace_back(this, m_vJoysticks.size(), pJoystick); - const CJoystick &Joystick = m_vJoysticks[m_vJoysticks.size() - 1]; - dbg_msg("joystick", "Opened joystick %d '%s' (%d axes, %d buttons, %d balls, %d hats)", JoystickIndex, Joystick.GetName(), - Joystick.GetNumAxes(), Joystick.GetNumButtons(), Joystick.GetNumBalls(), Joystick.GetNumHats()); - return true; -} - -void CInput::UpdateActiveJoystick() -{ - m_pActiveJoystick = nullptr; - if(m_vJoysticks.empty()) - return; - for(auto &Joystick : m_vJoysticks) - { - if(str_comp(Joystick.GetGUID(), g_Config.m_InpControllerGUID) == 0) - { - m_pActiveJoystick = &Joystick; - return; - } - } - // Fall back to first joystick if no match was found - if(!m_pActiveJoystick) - m_pActiveJoystick = &m_vJoysticks.front(); -} - -void CInput::ConchainJoystickGuidChanged(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - pfnCallback(pResult, pCallbackUserData); - if(pResult->NumArguments() == 1) - { - static_cast(pUserData)->UpdateActiveJoystick(); - } -} - -float CInput::GetJoystickDeadzone() -{ - return minimum(g_Config.m_InpControllerTolerance / 50.0f, 0.995f); -} - -CInput::CJoystick::CJoystick(CInput *pInput, int Index, SDL_Joystick *pDelegate) -{ - m_pInput = pInput; - m_Index = Index; - m_pDelegate = pDelegate; - m_NumAxes = SDL_JoystickNumAxes(pDelegate); - m_NumButtons = SDL_JoystickNumButtons(pDelegate); - m_NumBalls = SDL_JoystickNumBalls(pDelegate); - m_NumHats = SDL_JoystickNumHats(pDelegate); - str_copy(m_aName, SDL_JoystickName(pDelegate)); - SDL_JoystickGetGUIDString(SDL_JoystickGetGUID(pDelegate), m_aGUID, sizeof(m_aGUID)); - m_InstanceId = SDL_JoystickInstanceID(pDelegate); -} - -void CInput::CloseJoysticks() -{ - if(SDL_WasInit(SDL_INIT_JOYSTICK)) - SDL_QuitSubSystem(SDL_INIT_JOYSTICK); - - m_vJoysticks.clear(); - m_pActiveJoystick = nullptr; -} - -void CInput::SetActiveJoystick(size_t Index) -{ - m_pActiveJoystick = &m_vJoysticks[Index]; - str_copy(g_Config.m_InpControllerGUID, m_pActiveJoystick->GetGUID()); -} - -float CInput::CJoystick::GetAxisValue(int Axis) -{ - return (SDL_JoystickGetAxis(m_pDelegate, Axis) - SDL_JOYSTICK_AXIS_MIN) / (float)(SDL_JOYSTICK_AXIS_MAX - SDL_JOYSTICK_AXIS_MIN) * 2.0f - 1.0f; -} - -void CInput::CJoystick::GetJoystickHatKeys(int Hat, int HatValue, int (&HatKeys)[2]) -{ - if(HatValue & SDL_HAT_UP) - HatKeys[0] = KEY_JOY_HAT0_UP + Hat * NUM_JOYSTICK_BUTTONS_PER_HAT; - else if(HatValue & SDL_HAT_DOWN) - HatKeys[0] = KEY_JOY_HAT0_DOWN + Hat * NUM_JOYSTICK_BUTTONS_PER_HAT; - else - HatKeys[0] = KEY_UNKNOWN; - - if(HatValue & SDL_HAT_LEFT) - HatKeys[1] = KEY_JOY_HAT0_LEFT + Hat * NUM_JOYSTICK_BUTTONS_PER_HAT; - else if(HatValue & SDL_HAT_RIGHT) - HatKeys[1] = KEY_JOY_HAT0_RIGHT + Hat * NUM_JOYSTICK_BUTTONS_PER_HAT; - else - HatKeys[1] = KEY_UNKNOWN; -} - -void CInput::CJoystick::GetHatValue(int Hat, int (&HatKeys)[2]) -{ - GetJoystickHatKeys(Hat, SDL_JoystickGetHat(m_pDelegate, Hat), HatKeys); -} - -bool CInput::CJoystick::Relative(float *pX, float *pY) -{ - if(!Input()->m_MouseFocus || !Input()->m_InputGrabbed || !g_Config.m_InpControllerEnable) - return false; - - const vec2 RawJoystickPos = vec2(GetAxisValue(g_Config.m_InpControllerX), GetAxisValue(g_Config.m_InpControllerY)); - const float Len = length(RawJoystickPos); - const float DeadZone = Input()->GetJoystickDeadzone(); - if(Len > DeadZone) - { - const float Factor = 2500.0f * Input()->GetUpdateTime() * maximum((Len - DeadZone) / (1.0f - DeadZone), 0.001f) / Len; - *pX = RawJoystickPos.x * Factor; - *pY = RawJoystickPos.y * Factor; - return true; - } - return false; -} - -bool CInput::CJoystick::Absolute(float *pX, float *pY) -{ - if(!Input()->m_MouseFocus || !Input()->m_InputGrabbed || !g_Config.m_InpControllerEnable) - return false; - - const vec2 RawJoystickPos = vec2(GetAxisValue(g_Config.m_InpControllerX), GetAxisValue(g_Config.m_InpControllerY)); - const float DeadZone = Input()->GetJoystickDeadzone(); - if(dot(RawJoystickPos, RawJoystickPos) > DeadZone * DeadZone) - { - *pX = RawJoystickPos.x; - *pY = RawJoystickPos.y; - return true; - } - return false; -} - -bool CInput::MouseRelative(float *pX, float *pY) -{ - if(!m_MouseFocus || !m_InputGrabbed) - return false; - - ivec2 Relative; - SDL_GetRelativeMouseState(&Relative.x, &Relative.y); - - *pX = Relative.x; - *pY = Relative.y; - return *pX != 0.0f || *pY != 0.0f; -} - -void CInput::MouseModeAbsolute() -{ - m_InputGrabbed = false; - SDL_SetRelativeMouseMode(SDL_FALSE); - Graphics()->SetWindowGrab(false); -} - -void CInput::MouseModeRelative() -{ - m_InputGrabbed = true; - SDL_SetRelativeMouseMode(SDL_TRUE); - Graphics()->SetWindowGrab(true); - // Clear pending relative mouse motion - SDL_GetRelativeMouseState(nullptr, nullptr); -} - -vec2 CInput::NativeMousePos() const -{ - ivec2 Position; - SDL_GetMouseState(&Position.x, &Position.y); - return vec2(Position.x, Position.y); -} - -bool CInput::NativeMousePressed(int Index) const -{ - int i = SDL_GetMouseState(nullptr, nullptr); - return (i & SDL_BUTTON(Index)) != 0; -} - -const std::vector &CInput::TouchFingerStates() const -{ - return m_vTouchFingerStates; -} - -void CInput::ClearTouchDeltas() -{ - for(CTouchFingerState &TouchFingerState : m_vTouchFingerStates) - { - TouchFingerState.m_Delta = vec2(0.0f, 0.0f); - } -} - -std::string CInput::GetClipboardText() -{ - char *pClipboardText = SDL_GetClipboardText(); - std::string ClipboardText = pClipboardText; - SDL_free(pClipboardText); - return ClipboardText; -} - -void CInput::SetClipboardText(const char *pText) -{ - SDL_SetClipboardText(pText); -} - -void CInput::StartTextInput() -{ - // enable system messages for IME - SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE); - SDL_StartTextInput(); -} - -void CInput::StopTextInput() -{ - SDL_StopTextInput(); - // disable system messages for performance - SDL_EventState(SDL_SYSWMEVENT, SDL_DISABLE); - m_CompositionString = ""; - m_CompositionCursor = 0; - m_vCandidates.clear(); -} - -void CInput::ConsumeEvents(std::function Consumer) const -{ - for(const CEvent &Event : m_vInputEvents) - { - // Only propagate valid input events - if(Event.m_InputCount == m_InputCounter) - { - Consumer(Event); - } - } -} - -void CInput::Clear() -{ - std::fill(std::begin(m_aFrameKeyStates), std::end(m_aFrameKeyStates), false); - m_vInputEvents.clear(); - ClearTouchDeltas(); -} - -float CInput::GetUpdateTime() const -{ - return m_UpdateTime; -} - -bool CInput::KeyIsPressed(int Key) const -{ - AssertKeyValid(Key); - return m_aCurrentKeyStates[Key]; -} - -bool CInput::KeyPress(int Key) const -{ - AssertKeyValid(Key); - return m_aFrameKeyStates[Key]; -} - -const char *CInput::KeyName(int Key) const -{ - AssertKeyValid(Key); - return g_aaKeyStrings[Key]; -} - -int CInput::FindKeyByName(const char *pKeyName) const -{ - // check for numeric - if(pKeyName[0] == '&') - { - int Key = str_toint(pKeyName + 1); - if(Key > KEY_FIRST && Key < KEY_LAST) - return Key; // numeric - } - - // search for key - for(int Key = KEY_FIRST; Key < KEY_LAST; Key++) - { - if(str_comp_nocase(pKeyName, KeyName(Key)) == 0) - return Key; - } - - return KEY_UNKNOWN; -} - -void CInput::HandleJoystickAxisMotionEvent(const SDL_JoyAxisEvent &Event) -{ - if(!g_Config.m_InpControllerEnable) - return; - CJoystick *pJoystick = GetActiveJoystick(); - if(!pJoystick || pJoystick->GetInstanceId() != Event.which) - return; - if(Event.axis >= NUM_JOYSTICK_AXES) - return; - - const int LeftKey = KEY_JOY_AXIS_0_LEFT + 2 * Event.axis; - const int RightKey = LeftKey + 1; - const float DeadZone = GetJoystickDeadzone(); - - if(Event.value <= SDL_JOYSTICK_AXIS_MIN * DeadZone && !m_aCurrentKeyStates[LeftKey]) - { - AddKeyEvent(LeftKey, IInput::FLAG_PRESS); - } - else if(Event.value > SDL_JOYSTICK_AXIS_MIN * DeadZone && m_aCurrentKeyStates[LeftKey]) - { - AddKeyEvent(LeftKey, IInput::FLAG_RELEASE); - } - - if(Event.value >= SDL_JOYSTICK_AXIS_MAX * DeadZone && !m_aCurrentKeyStates[RightKey]) - { - AddKeyEvent(RightKey, IInput::FLAG_PRESS); - } - else if(Event.value < SDL_JOYSTICK_AXIS_MAX * DeadZone && m_aCurrentKeyStates[RightKey]) - { - AddKeyEvent(RightKey, IInput::FLAG_RELEASE); - } -} - -void CInput::HandleJoystickButtonEvent(const SDL_JoyButtonEvent &Event) -{ - if(!g_Config.m_InpControllerEnable) - return; - CJoystick *pJoystick = GetActiveJoystick(); - if(!pJoystick || pJoystick->GetInstanceId() != Event.which) - return; - if(Event.button >= NUM_JOYSTICK_BUTTONS) - return; - - const int Key = Event.button + KEY_JOYSTICK_BUTTON_0; - - if(Event.type == SDL_JOYBUTTONDOWN) - { - AddKeyEvent(Key, IInput::FLAG_PRESS); - } - else if(Event.type == SDL_JOYBUTTONUP) - { - AddKeyEvent(Key, IInput::FLAG_RELEASE); - } -} - -void CInput::HandleJoystickHatMotionEvent(const SDL_JoyHatEvent &Event) -{ - if(!g_Config.m_InpControllerEnable) - return; - CJoystick *pJoystick = GetActiveJoystick(); - if(!pJoystick || pJoystick->GetInstanceId() != Event.which) - return; - if(Event.hat >= NUM_JOYSTICK_HATS) - return; - - int HatKeys[2]; - CJoystick::GetJoystickHatKeys(Event.hat, Event.value, HatKeys); - - for(int Key = KEY_JOY_HAT0_UP + Event.hat * NUM_JOYSTICK_BUTTONS_PER_HAT; Key <= KEY_JOY_HAT0_DOWN + Event.hat * NUM_JOYSTICK_BUTTONS_PER_HAT; Key++) - { - if(Key != HatKeys[0] && Key != HatKeys[1] && m_aCurrentKeyStates[Key]) - { - AddKeyEvent(Key, IInput::FLAG_RELEASE); - } - } - - for(int CurrentKey : HatKeys) - { - if(CurrentKey != KEY_UNKNOWN && !m_aCurrentKeyStates[CurrentKey]) - { - AddKeyEvent(CurrentKey, IInput::FLAG_PRESS); - } - } -} - -void CInput::HandleJoystickAddedEvent(const SDL_JoyDeviceEvent &Event) -{ - if(OpenJoystick(Event.which)) - { - UpdateActiveJoystick(); - } -} - -void CInput::HandleJoystickRemovedEvent(const SDL_JoyDeviceEvent &Event) -{ - auto RemovedJoystick = std::find_if(m_vJoysticks.begin(), m_vJoysticks.end(), [Event](const CJoystick &Joystick) -> bool { return Joystick.GetInstanceId() == Event.which; }); - if(RemovedJoystick != m_vJoysticks.end()) - { - dbg_msg("joystick", "Closed joystick %d '%s'", (*RemovedJoystick).GetIndex(), (*RemovedJoystick).GetName()); - auto NextJoystick = m_vJoysticks.erase(RemovedJoystick); - // Adjust indices of following joysticks - while(NextJoystick != m_vJoysticks.end()) - { - (*NextJoystick).m_Index--; - ++NextJoystick; - } - UpdateActiveJoystick(); - } -} - -void CInput::HandleTouchDownEvent(const SDL_TouchFingerEvent &Event) -{ - CTouchFingerState TouchFingerState; - TouchFingerState.m_Finger.m_DeviceId = Event.touchId; - TouchFingerState.m_Finger.m_FingerId = Event.fingerId; - TouchFingerState.m_Position = vec2(Event.x, Event.y); - TouchFingerState.m_Delta = vec2(Event.dx, Event.dy); - TouchFingerState.m_PressTime = time_get_nanoseconds(); - m_vTouchFingerStates.emplace_back(TouchFingerState); -} - -void CInput::HandleTouchUpEvent(const SDL_TouchFingerEvent &Event) -{ - auto FoundState = std::find_if(m_vTouchFingerStates.begin(), m_vTouchFingerStates.end(), [Event](const CTouchFingerState &State) { - return State.m_Finger.m_DeviceId == Event.touchId && State.m_Finger.m_FingerId == Event.fingerId; - }); - if(FoundState != m_vTouchFingerStates.end()) - { - m_vTouchFingerStates.erase(FoundState); - } -} - -void CInput::HandleTouchMotionEvent(const SDL_TouchFingerEvent &Event) -{ - auto FoundState = std::find_if(m_vTouchFingerStates.begin(), m_vTouchFingerStates.end(), [Event](const CTouchFingerState &State) { - return State.m_Finger.m_DeviceId == Event.touchId && State.m_Finger.m_FingerId == Event.fingerId; - }); - if(FoundState != m_vTouchFingerStates.end()) - { - FoundState->m_Position = vec2(Event.x, Event.y); - FoundState->m_Delta += vec2(Event.dx, Event.dy); - } -} - -void CInput::HandleTextEditingEvent(const char *pText, int Start, int Length) -{ - if(pText[0] != '\0') - { - m_CompositionString = pText; - m_CompositionCursor = 0; - for(int i = 0; i < Start; i++) - { - m_CompositionCursor = str_utf8_forward(m_CompositionString.c_str(), m_CompositionCursor); - } - // Length is currently unused on Windows and will always be 0, so we don't support selecting composition text - AddTextEvent(""); - } - else - { - m_CompositionString = ""; - m_CompositionCursor = 0; - } -} - -void CInput::SetCompositionWindowPosition(float X, float Y, float H) -{ - SDL_Rect Rect; - Rect.x = X / m_pGraphics->ScreenHiDPIScale(); - Rect.y = Y / m_pGraphics->ScreenHiDPIScale(); - Rect.h = H / m_pGraphics->ScreenHiDPIScale(); - Rect.w = 0; - SDL_SetTextInputRect(&Rect); -} - -static int TranslateKeyEventKey(const SDL_KeyboardEvent &KeyEvent) -{ - // See SDL_Keymod for possible modifiers: - // NONE = 0 - // LSHIFT = 1 - // RSHIFT = 2 - // LCTRL = 64 - // RCTRL = 128 - // LALT = 256 - // RALT = 512 - // LGUI = 1024 - // RGUI = 2048 - // NUM = 4096 - // CAPS = 8192 - // MODE = 16384 - // Sum if you want to ignore multiple modifiers. - if(KeyEvent.keysym.mod & g_Config.m_InpIgnoredModifiers) - { - return KEY_UNKNOWN; - } - - int Key = g_Config.m_InpTranslatedKeys ? SDL_GetScancodeFromKey(KeyEvent.keysym.sym) : KeyEvent.keysym.scancode; - -#if defined(CONF_PLATFORM_ANDROID) - // Translate the Android back-button to the escape-key so it can be used to open/close the menu, close popups etc. - if(Key == KEY_AC_BACK) - { - Key = KEY_ESCAPE; - } -#endif - - return Key; -} - -static int TranslateMouseButtonEventKey(const SDL_MouseButtonEvent &MouseButtonEvent) -{ - switch(MouseButtonEvent.button) - { - case SDL_BUTTON_LEFT: - return KEY_MOUSE_1; - case SDL_BUTTON_RIGHT: - return KEY_MOUSE_2; - case SDL_BUTTON_MIDDLE: - return KEY_MOUSE_3; - case SDL_BUTTON_X1: - return KEY_MOUSE_4; - case SDL_BUTTON_X2: - return KEY_MOUSE_5; - case 6: - return KEY_MOUSE_6; - case 7: - return KEY_MOUSE_7; - case 8: - return KEY_MOUSE_8; - case 9: - return KEY_MOUSE_9; - default: - return KEY_UNKNOWN; - } -} - -static int TranslateMouseWheelEventKey(const SDL_MouseWheelEvent &MouseWheelEvent) -{ - if(MouseWheelEvent.y > 0) - { - return KEY_MOUSE_WHEEL_UP; - } - else if(MouseWheelEvent.y < 0) - { - return KEY_MOUSE_WHEEL_DOWN; - } - else if(MouseWheelEvent.x > 0) - { - return KEY_MOUSE_WHEEL_RIGHT; - } - else if(MouseWheelEvent.x < 0) - { - return KEY_MOUSE_WHEEL_LEFT; - } - else - { - return KEY_UNKNOWN; - } -} - -int CInput::Update() -{ - const int64_t Now = time_get(); - if(m_LastUpdate != 0) - { - const float Diff = (Now - m_LastUpdate) / (float)time_freq(); - m_UpdateTime = m_UpdateTime == 0.0f ? Diff : (m_UpdateTime * 0.8f + Diff * 0.2f); - } - m_LastUpdate = Now; - - // keep the counter between 1..0xFFFFFFFF, 0 means not pressed - m_InputCounter = (m_InputCounter % std::numeric_limits::max()) + 1; - - SDL_Event Event; - bool IgnoreKeys = false; - - const auto &&AddKeyEventChecked = [&](int Key, int Flags) { - if(Key != KEY_UNKNOWN && !IgnoreKeys && !HasComposition()) - { - AddKeyEvent(Key, Flags); - } - }; - - while(SDL_PollEvent(&Event)) - { - switch(Event.type) - { - case SDL_SYSWMEVENT: - ProcessSystemMessage(Event.syswm.msg); - break; - - case SDL_TEXTEDITING: - HandleTextEditingEvent(Event.edit.text, Event.edit.start, Event.edit.length); - break; - -#if SDL_VERSION_ATLEAST(2, 0, 22) - case SDL_TEXTEDITING_EXT: - HandleTextEditingEvent(Event.editExt.text, Event.editExt.start, Event.editExt.length); - SDL_free(Event.editExt.text); - break; -#endif - - case SDL_TEXTINPUT: - m_CompositionString = ""; - m_CompositionCursor = 0; - AddTextEvent(Event.text.text); - break; - - // handle keys - case SDL_KEYDOWN: - AddKeyEventChecked(TranslateKeyEventKey(Event.key), IInput::FLAG_PRESS); - break; - - case SDL_KEYUP: - AddKeyEventChecked(TranslateKeyEventKey(Event.key), IInput::FLAG_RELEASE); - break; - - // handle the joystick events - case SDL_JOYAXISMOTION: - HandleJoystickAxisMotionEvent(Event.jaxis); - break; - - case SDL_JOYBUTTONUP: - case SDL_JOYBUTTONDOWN: - HandleJoystickButtonEvent(Event.jbutton); - break; - - case SDL_JOYHATMOTION: - HandleJoystickHatMotionEvent(Event.jhat); - break; - - case SDL_JOYDEVICEADDED: - HandleJoystickAddedEvent(Event.jdevice); - break; - - case SDL_JOYDEVICEREMOVED: - HandleJoystickRemovedEvent(Event.jdevice); - break; - - // handle mouse buttons - case SDL_MOUSEBUTTONDOWN: - AddKeyEventChecked(TranslateMouseButtonEventKey(Event.button), IInput::FLAG_PRESS); - break; - - case SDL_MOUSEBUTTONUP: - AddKeyEventChecked(TranslateMouseButtonEventKey(Event.button), IInput::FLAG_RELEASE); - break; - - case SDL_MOUSEWHEEL: - AddKeyEventChecked(TranslateMouseWheelEventKey(Event.wheel), IInput::FLAG_PRESS | IInput::FLAG_RELEASE); - break; - - case SDL_FINGERDOWN: - HandleTouchDownEvent(Event.tfinger); - break; - - case SDL_FINGERUP: - HandleTouchUpEvent(Event.tfinger); - break; - - case SDL_FINGERMOTION: - HandleTouchMotionEvent(Event.tfinger); - break; - - case SDL_WINDOWEVENT: - // Ignore keys following a focus gain as they may be part of global - // shortcuts - switch(Event.window.event) - { - case SDL_WINDOWEVENT_MOVED: - Graphics()->Move(Event.window.data1, Event.window.data2); - break; - // listen to size changes, this includes our manual changes and the ones by the window manager - case SDL_WINDOWEVENT_SIZE_CHANGED: - Graphics()->GotResized(Event.window.data1, Event.window.data2, -1); - break; - case SDL_WINDOWEVENT_FOCUS_GAINED: - if(m_InputGrabbed) - { - MouseModeRelative(); - // Clear pending relative mouse motion - SDL_GetRelativeMouseState(nullptr, nullptr); - } - m_MouseFocus = true; - IgnoreKeys = true; - break; - case SDL_WINDOWEVENT_FOCUS_LOST: - m_MouseFocus = false; - IgnoreKeys = true; - if(m_InputGrabbed) - { - MouseModeAbsolute(); - // Remember that we had relative mouse - m_InputGrabbed = true; - } - break; - case SDL_WINDOWEVENT_MINIMIZED: -#if defined(CONF_PLATFORM_ANDROID) // Save the config when minimized on Android. - m_pConfigManager->Save(); -#endif - Graphics()->WindowDestroyNtf(Event.window.windowID); - break; - - case SDL_WINDOWEVENT_MAXIMIZED: -#if defined(CONF_PLATFORM_MACOS) // Todo: remove this when fixed in SDL - MouseModeAbsolute(); - MouseModeRelative(); -#endif - [[fallthrough]]; - case SDL_WINDOWEVENT_RESTORED: - Graphics()->WindowCreateNtf(Event.window.windowID); - break; - } - break; - - // other messages - case SDL_QUIT: - return 1; - - case SDL_DROPFILE: - str_copy(m_aDropFile, Event.drop.file); - SDL_free(Event.drop.file); - break; - } - } - - return 0; -} - -void CInput::ProcessSystemMessage(SDL_SysWMmsg *pMsg) -{ -#if defined(CONF_FAMILY_WINDOWS) - // Todo SDL: remove this after SDL2 supports IME candidates - if(pMsg->subsystem == SDL_SYSWM_WINDOWS && pMsg->msg.win.msg == WM_IME_NOTIFY) - { - switch(pMsg->msg.win.wParam) - { - case IMN_OPENCANDIDATE: - case IMN_CHANGECANDIDATE: - { - HWND WindowHandle = pMsg->msg.win.hwnd; - HIMC ImeContext = ImmGetContext(WindowHandle); - DWORD Size = ImmGetCandidateListW(ImeContext, 0, nullptr, 0); - LPCANDIDATELIST pCandidateList = nullptr; - if(Size > 0) - { - pCandidateList = (LPCANDIDATELIST)malloc(Size); - Size = ImmGetCandidateListW(ImeContext, 0, pCandidateList, Size); - } - m_vCandidates.clear(); - if(pCandidateList && Size > 0) - { - for(DWORD i = pCandidateList->dwPageStart; i < pCandidateList->dwCount && (int)m_vCandidates.size() < (int)pCandidateList->dwPageSize; i++) - { - LPCWSTR pCandidate = (LPCWSTR)((DWORD_PTR)pCandidateList + pCandidateList->dwOffset[i]); - m_vCandidates.push_back(std::move(windows_wide_to_utf8(pCandidate).value_or(""))); - } - m_CandidateSelectedIndex = pCandidateList->dwSelection - pCandidateList->dwPageStart; - } - else - { - m_CandidateSelectedIndex = -1; - } - free(pCandidateList); - ImmReleaseContext(WindowHandle, ImeContext); - break; - } - case IMN_CLOSECANDIDATE: - m_vCandidates.clear(); - m_CandidateSelectedIndex = -1; - break; - } - } -#endif -} - -bool CInput::GetDropFile(char *aBuf, int Len) -{ - if(m_aDropFile[0] != '\0') - { - str_copy(aBuf, m_aDropFile, Len); - m_aDropFile[0] = '\0'; - return true; - } - return false; -} - -IEngineInput *CreateEngineInput() -{ - return new CInput; -} diff --git a/src/engine/client/input.h b/src/engine/client/input.h deleted file mode 100644 index e240938b5e..0000000000 --- a/src/engine/client/input.h +++ /dev/null @@ -1,165 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef ENGINE_CLIENT_INPUT_H -#define ENGINE_CLIENT_INPUT_H - -#include -#include -#include - -#include -#include - -#include -#include - -class IEngineGraphics; -class IConfigManager; - -class CInput : public IEngineInput -{ -public: - class CJoystick : public IJoystick - { - friend class CInput; - - CInput *m_pInput; - int m_Index; - char m_aName[64]; - char m_aGUID[34]; - SDL_JoystickID m_InstanceId; - int m_NumAxes; - int m_NumButtons; - int m_NumBalls; - int m_NumHats; - SDL_Joystick *m_pDelegate; - - CInput *Input() { return m_pInput; } - - public: - CJoystick() {} - CJoystick(CInput *pInput, int Index, SDL_Joystick *pDelegate); - virtual ~CJoystick() = default; - - int GetIndex() const override { return m_Index; } - const char *GetName() const override { return m_aName; } - const char *GetGUID() const { return m_aGUID; } - SDL_JoystickID GetInstanceId() const { return m_InstanceId; } - int GetNumAxes() const override { return m_NumAxes; } - int GetNumButtons() const override { return m_NumButtons; } - int GetNumBalls() const override { return m_NumBalls; } - int GetNumHats() const override { return m_NumHats; } - float GetAxisValue(int Axis) override; - void GetHatValue(int Hat, int (&HatKeys)[2]) override; - bool Relative(float *pX, float *pY) override; - bool Absolute(float *pX, float *pY) override; - - static void GetJoystickHatKeys(int Hat, int HatValue, int (&HatKeys)[2]); - }; - -private: - IEngineGraphics *m_pGraphics; - IConsole *m_pConsole; - IConfigManager *m_pConfigManager; - - IEngineGraphics *Graphics() const { return m_pGraphics; } - IConsole *Console() const { return m_pConsole; } - - // joystick - std::vector m_vJoysticks; - CJoystick *m_pActiveJoystick = nullptr; - void InitJoysticks(); - bool OpenJoystick(int JoystickIndex); - void CloseJoysticks(); - void UpdateActiveJoystick(); - static void ConchainJoystickGuidChanged(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - float GetJoystickDeadzone(); - - bool m_InputGrabbed; - - bool m_MouseFocus; - - // IME support - std::string m_CompositionString; - int m_CompositionCursor; - std::vector m_vCandidates; - int m_CandidateSelectedIndex; - - // events - std::vector m_vInputEvents; - int64_t m_LastUpdate; - float m_UpdateTime; - void AddKeyEvent(int Key, int Flags); - void AddTextEvent(const char *pText); - - // quick access to input - bool m_aCurrentKeyStates[KEY_LAST]; - bool m_aFrameKeyStates[KEY_LAST]; - uint32_t m_InputCounter; - std::vector m_vTouchFingerStates; - - void HandleJoystickAxisMotionEvent(const SDL_JoyAxisEvent &Event); - void HandleJoystickButtonEvent(const SDL_JoyButtonEvent &Event); - void HandleJoystickHatMotionEvent(const SDL_JoyHatEvent &Event); - void HandleJoystickAddedEvent(const SDL_JoyDeviceEvent &Event); - void HandleJoystickRemovedEvent(const SDL_JoyDeviceEvent &Event); - void HandleTouchDownEvent(const SDL_TouchFingerEvent &Event); - void HandleTouchUpEvent(const SDL_TouchFingerEvent &Event); - void HandleTouchMotionEvent(const SDL_TouchFingerEvent &Event); - void HandleTextEditingEvent(const char *pText, int Start, int Length); - - char m_aDropFile[IO_MAX_PATH_LENGTH]; - - void ProcessSystemMessage(SDL_SysWMmsg *pMsg); - -public: - CInput(); - - void Init() override; - int Update() override; - void Shutdown() override; - - void ConsumeEvents(std::function Consumer) const override; - void Clear() override; - float GetUpdateTime() const override; - - bool ModifierIsPressed() const override { return KeyIsPressed(KEY_LCTRL) || KeyIsPressed(KEY_RCTRL) || KeyIsPressed(KEY_LGUI) || KeyIsPressed(KEY_RGUI); } - bool ShiftIsPressed() const override { return KeyIsPressed(KEY_LSHIFT) || KeyIsPressed(KEY_RSHIFT); } - bool AltIsPressed() const override { return KeyIsPressed(KEY_LALT) || KeyIsPressed(KEY_RALT); } - bool KeyIsPressed(int Key) const override; - bool KeyPress(int Key) const override; - const char *KeyName(int Key) const override; - int FindKeyByName(const char *pKeyName) const override; - - size_t NumJoysticks() const override { return m_vJoysticks.size(); } - CJoystick *GetJoystick(size_t Index) override { return &m_vJoysticks[Index]; } - CJoystick *GetActiveJoystick() override { return m_pActiveJoystick; } - void SetActiveJoystick(size_t Index) override; - - bool MouseRelative(float *pX, float *pY) override; - void MouseModeAbsolute() override; - void MouseModeRelative() override; - vec2 NativeMousePos() const override; - bool NativeMousePressed(int Index) const override; - - const std::vector &TouchFingerStates() const override; - void ClearTouchDeltas() override; - - std::string GetClipboardText() override; - void SetClipboardText(const char *pText) override; - - void StartTextInput() override; - void StopTextInput() override; - const char *GetComposition() const override { return m_CompositionString.c_str(); } - bool HasComposition() const override { return !m_CompositionString.empty(); } - int GetCompositionCursor() const override { return m_CompositionCursor; } - int GetCompositionLength() const override { return m_CompositionString.length(); } - const char *GetCandidate(int Index) const override { return m_vCandidates[Index].c_str(); } - int GetCandidateCount() const override { return m_vCandidates.size(); } - int GetCandidateSelectedIndex() const override { return m_CandidateSelectedIndex; } - void SetCompositionWindowPosition(float X, float Y, float H) override; - - bool GetDropFile(char *aBuf, int Len) override; -}; - -#endif diff --git a/src/engine/client/keynames.h b/src/engine/client/keynames.h deleted file mode 100644 index a41dd9d499..0000000000 --- a/src/engine/client/keynames.h +++ /dev/null @@ -1,522 +0,0 @@ -/* AUTO GENERATED! DO NOT EDIT MANUALLY! */ - -#ifndef KEYS_INCLUDE -#error do not include this header! -#endif - -const char g_aaKeyStrings[512][20] = // NOLINT(misc-definitions-in-headers) -{ - "unknown", - "&1", - "&2", - "&3", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "0", - "return", - "escape", - "backspace", - "tab", - "space", - "minus", - "equals", - "leftbracket", - "rightbracket", - "backslash", - "nonushash", - "semicolon", - "apostrophe", - "grave", - "comma", - "period", - "slash", - "capslock", - "f1", - "f2", - "f3", - "f4", - "f5", - "f6", - "f7", - "f8", - "f9", - "f10", - "f11", - "f12", - "printscreen", - "scrolllock", - "pause", - "insert", - "home", - "pageup", - "delete", - "end", - "pagedown", - "right", - "left", - "down", - "up", - "numlockclear", - "kp_divide", - "kp_multiply", - "kp_minus", - "kp_plus", - "kp_enter", - "kp_1", - "kp_2", - "kp_3", - "kp_4", - "kp_5", - "kp_6", - "kp_7", - "kp_8", - "kp_9", - "kp_0", - "kp_period", - "nonusbackslash", - "application", - "power", - "kp_equals", - "f13", - "f14", - "f15", - "f16", - "f17", - "f18", - "f19", - "f20", - "f21", - "f22", - "f23", - "f24", - "execute", - "help", - "menu", - "select", - "stop", - "again", - "undo", - "cut", - "copy", - "paste", - "find", - "mute", - "volumeup", - "volumedown", - "&130", - "&131", - "&132", - "kp_comma", - "kp_equalsas400", - "international1", - "international2", - "international3", - "international4", - "international5", - "international6", - "international7", - "international8", - "international9", - "lang1", - "lang2", - "lang3", - "lang4", - "lang5", - "lang6", - "lang7", - "lang8", - "lang9", - "alterase", - "sysreq", - "cancel", - "clear", - "prior", - "return2", - "separator", - "out", - "oper", - "clearagain", - "crsel", - "exsel", - "&165", - "&166", - "&167", - "&168", - "&169", - "&170", - "&171", - "&172", - "&173", - "&174", - "&175", - "kp_00", - "kp_000", - "thousandsseparator", - "decimalseparator", - "currencyunit", - "currencysubunit", - "kp_leftparen", - "kp_rightparen", - "kp_leftbrace", - "kp_rightbrace", - "kp_tab", - "kp_backspace", - "kp_a", - "kp_b", - "kp_c", - "kp_d", - "kp_e", - "kp_f", - "kp_xor", - "kp_power", - "kp_percent", - "kp_less", - "kp_greater", - "kp_ampersand", - "kp_dblampersand", - "kp_verticalbar", - "kp_dblverticalbar", - "kp_colon", - "kp_hash", - "kp_space", - "kp_at", - "kp_exclam", - "kp_memstore", - "kp_memrecall", - "kp_memclear", - "kp_memadd", - "kp_memsubtract", - "kp_memmultiply", - "kp_memdivide", - "kp_plusminus", - "kp_clear", - "kp_clearentry", - "kp_binary", - "kp_octal", - "kp_decimal", - "kp_hexadecimal", - "&222", - "&223", - "lctrl", - "lshift", - "lalt", - "lgui", - "rctrl", - "rshift", - "ralt", - "rgui", - "&232", - "&233", - "&234", - "&235", - "&236", - "&237", - "&238", - "&239", - "&240", - "&241", - "&242", - "&243", - "&244", - "&245", - "&246", - "&247", - "&248", - "&249", - "&250", - "&251", - "&252", - "&253", - "&254", - "&255", - "&256", - "mode", - "audionext", - "audioprev", - "audiostop", - "audioplay", - "audiomute", - "mediaselect", - "www", - "mail", - "calculator", - "computer", - "ac_search", - "ac_home", - "ac_back", - "ac_forward", - "ac_stop", - "ac_refresh", - "ac_bookmarks", - "brightnessdown", - "brightnessup", - "displayswitch", - "kbdillumtoggle", - "kbdillumdown", - "kbdillumup", - "eject", - "sleep", - "app1", - "app2", - "audiorewind", - "audiofastforward", - "softleft", - "softright", - "call", - "endcall", - "mouse1", - "mouse2", - "mouse3", - "mouse4", - "mouse5", - "mouse6", - "mouse7", - "mouse8", - "mouse9", - "mousewheelup", - "mousewheeldown", - "mousewheelleft", - "mousewheelright", - "joystick0", - "joystick1", - "joystick2", - "joystick3", - "joystick4", - "joystick5", - "joystick6", - "joystick7", - "joystick8", - "joystick9", - "joystick10", - "joystick11", - "joy_hat0_up", - "joy_hat0_left", - "joy_hat0_right", - "joy_hat0_down", - "joy_hat1_up", - "joy_hat1_left", - "joy_hat1_right", - "joy_hat1_down", - "joy_axis0_left", - "joy_axis0_right", - "joy_axis1_left", - "joy_axis1_right", - "joy_axis2_left", - "joy_axis2_right", - "joy_axis3_left", - "joy_axis3_right", - "joy_axis4_left", - "joy_axis4_right", - "joy_axis5_left", - "joy_axis5_right", - "joy_axis6_left", - "joy_axis6_right", - "joy_axis7_left", - "joy_axis7_right", - "joy_axis8_left", - "joy_axis8_right", - "joy_axis9_left", - "joy_axis9_right", - "joy_axis10_left", - "joy_axis10_right", - "joy_axis11_left", - "joy_axis11_right", - "&348", - "&349", - "&350", - "&351", - "&352", - "&353", - "&354", - "&355", - "&356", - "&357", - "&358", - "&359", - "&360", - "&361", - "&362", - "&363", - "&364", - "&365", - "&366", - "&367", - "&368", - "&369", - "&370", - "&371", - "&372", - "&373", - "&374", - "&375", - "&376", - "&377", - "&378", - "&379", - "&380", - "&381", - "&382", - "&383", - "&384", - "&385", - "&386", - "&387", - "&388", - "&389", - "&390", - "&391", - "&392", - "&393", - "&394", - "&395", - "&396", - "&397", - "&398", - "&399", - "&400", - "&401", - "&402", - "&403", - "&404", - "&405", - "&406", - "&407", - "&408", - "&409", - "&410", - "&411", - "&412", - "&413", - "&414", - "&415", - "&416", - "&417", - "&418", - "&419", - "&420", - "&421", - "&422", - "&423", - "&424", - "&425", - "&426", - "&427", - "&428", - "&429", - "&430", - "&431", - "&432", - "&433", - "&434", - "&435", - "&436", - "&437", - "&438", - "&439", - "&440", - "&441", - "&442", - "&443", - "&444", - "&445", - "&446", - "&447", - "&448", - "&449", - "&450", - "&451", - "&452", - "&453", - "&454", - "&455", - "&456", - "&457", - "&458", - "&459", - "&460", - "&461", - "&462", - "&463", - "&464", - "&465", - "&466", - "&467", - "&468", - "&469", - "&470", - "&471", - "&472", - "&473", - "&474", - "&475", - "&476", - "&477", - "&478", - "&479", - "&480", - "&481", - "&482", - "&483", - "&484", - "&485", - "&486", - "&487", - "&488", - "&489", - "&490", - "&491", - "&492", - "&493", - "&494", - "&495", - "&496", - "&497", - "&498", - "&499", - "&500", - "&501", - "&502", - "&503", - "&504", - "&505", - "&506", - "&507", - "&508", - "&509", - "&510", - "&511", -}; - diff --git a/src/engine/client/notifications.cpp b/src/engine/client/notifications.cpp deleted file mode 100644 index 577b4f4256..0000000000 --- a/src/engine/client/notifications.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include "notifications.h" - -#include - -#if defined(CONF_PLATFORM_MACOS) -// Code is in src/macos/notification.mm. -void NotificationsNotifyMacOsInternal(const char *pTitle, const char *pMessage); -#elif defined(CONF_FAMILY_UNIX) && !defined(CONF_PLATFORM_ANDROID) && !defined(CONF_PLATFORM_HAIKU) && !defined(CONF_WEBASM) -#include -#define NOTIFICATIONS_USE_LIBNOTIFY -#endif - -void CNotifications::Init(const char *pAppname) -{ -#if defined(NOTIFICATIONS_USE_LIBNOTIFY) - notify_init(pAppname); -#endif -} - -void CNotifications::Shutdown() -{ -#if defined(NOTIFICATIONS_USE_LIBNOTIFY) - notify_uninit(); -#endif -} - -void CNotifications::Notify(const char *pTitle, const char *pMessage) -{ -#if defined(CONF_PLATFORM_MACOS) - NotificationsNotifyMacOsInternal(pTitle, pMessage); -#elif defined(NOTIFICATIONS_USE_LIBNOTIFY) - NotifyNotification *pNotif = notify_notification_new(pTitle, pMessage, "ddnet"); - if(pNotif) - { - notify_notification_show(pNotif, NULL); - g_object_unref(G_OBJECT(pNotif)); - } -#endif -} - -INotifications *CreateNotifications() -{ - return new CNotifications(); -} diff --git a/src/engine/client/notifications.h b/src/engine/client/notifications.h deleted file mode 100644 index 02463535e4..0000000000 --- a/src/engine/client/notifications.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef ENGINE_CLIENT_NOTIFICATIONS_H -#define ENGINE_CLIENT_NOTIFICATIONS_H - -#include - -class CNotifications : public INotifications -{ -public: - void Init(const char *pAppname) override; - void Shutdown() override; - void Notify(const char *pTitle, const char *pMessage) override; -}; - -#endif // ENGINE_CLIENT_NOTIFICATIONS_H diff --git a/src/engine/client/serverbrowser.cpp b/src/engine/client/serverbrowser.cpp deleted file mode 100644 index 07cd529da7..0000000000 --- a/src/engine/client/serverbrowser.cpp +++ /dev/null @@ -1,2342 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include "serverbrowser.h" - -#include "serverbrowser_http.h" -#include "serverbrowser_ping_cache.h" - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -class CSortWrap -{ - typedef bool (CServerBrowser::*SortFunc)(int, int) const; - SortFunc m_pfnSort; - CServerBrowser *m_pThis; - -public: - CSortWrap(CServerBrowser *pServer, SortFunc Func) : - m_pfnSort(Func), m_pThis(pServer) {} - bool operator()(int a, int b) { return (g_Config.m_BrSortOrder ? (m_pThis->*m_pfnSort)(b, a) : (m_pThis->*m_pfnSort)(a, b)); } -}; - -bool matchesPart(const char *a, const char *b) -{ - return str_utf8_find_nocase(a, b) != nullptr; -} - -bool matchesExactly(const char *a, const char *b) -{ - return str_comp(a, &b[1]) == 0; -} - -CServerBrowser::CServerBrowser() : - m_CommunityCache(this), - m_CountriesFilter(&m_CommunityCache), - m_TypesFilter(&m_CommunityCache) -{ - m_ppServerlist = nullptr; - m_pSortedServerlist = nullptr; - - m_NeedResort = false; - m_Sorthash = 0; - - m_NumSortedServersCapacity = 0; - m_NumServerCapacity = 0; - - m_ServerlistType = 0; - m_BroadcastTime = 0; - secure_random_fill(m_aTokenSeed, sizeof(m_aTokenSeed)); - - CleanUp(); -} - -CServerBrowser::~CServerBrowser() -{ - free(m_ppServerlist); - free(m_pSortedServerlist); - json_value_free(m_pDDNetInfo); - - delete m_pHttp; - m_pHttp = nullptr; - delete m_pPingCache; - m_pPingCache = nullptr; -} - -void CServerBrowser::SetBaseInfo(class CNetClient *pClient, const char *pNetVersion) -{ - m_pNetClient = pClient; - str_copy(m_aNetVersion, pNetVersion); - m_pConsole = Kernel()->RequestInterface(); - m_pConfigManager = Kernel()->RequestInterface(); - m_pEngine = Kernel()->RequestInterface(); - m_pFavorites = Kernel()->RequestInterface(); - m_pFriends = Kernel()->RequestInterface(); - m_pStorage = Kernel()->RequestInterface(); - m_pHttpClient = Kernel()->RequestInterface(); - m_pPingCache = CreateServerBrowserPingCache(m_pConsole, m_pStorage); - - RegisterCommands(); -} - -void CServerBrowser::OnInit() -{ - m_pHttp = CreateServerBrowserHttp(m_pEngine, m_pStorage, m_pHttpClient, g_Config.m_BrCachedBestServerinfoUrl); -} - -void CServerBrowser::RegisterCommands() -{ - m_pConfigManager->RegisterCallback(CServerBrowser::ConfigSaveCallback, this); - m_pConsole->Register("add_favorite_community", "s[community_id]", CFGFLAG_CLIENT, Con_AddFavoriteCommunity, this, "Add a community as a favorite"); - m_pConsole->Register("remove_favorite_community", "s[community_id]", CFGFLAG_CLIENT, Con_RemoveFavoriteCommunity, this, "Remove a community from the favorites"); - m_pConsole->Register("add_excluded_community", "s[community_id]", CFGFLAG_CLIENT, Con_AddExcludedCommunity, this, "Add a community to the exclusion filter"); - m_pConsole->Register("remove_excluded_community", "s[community_id]", CFGFLAG_CLIENT, Con_RemoveExcludedCommunity, this, "Remove a community from the exclusion filter"); - m_pConsole->Register("add_excluded_country", "s[community_id] s[country_code]", CFGFLAG_CLIENT, Con_AddExcludedCountry, this, "Add a country to the exclusion filter for a specific community"); - m_pConsole->Register("remove_excluded_country", "s[community_id] s[country_code]", CFGFLAG_CLIENT, Con_RemoveExcludedCountry, this, "Remove a country from the exclusion filter for a specific community"); - m_pConsole->Register("add_excluded_type", "s[community_id] s[type]", CFGFLAG_CLIENT, Con_AddExcludedType, this, "Add a type to the exclusion filter for a specific community"); - m_pConsole->Register("remove_excluded_type", "s[community_id] s[type]", CFGFLAG_CLIENT, Con_RemoveExcludedType, this, "Remove a type from the exclusion filter for a specific community"); - m_pConsole->Register("leak_ip_address_to_all_servers", "", CFGFLAG_CLIENT, Con_LeakIpAddress, this, "Leaks your IP address to all servers by pinging each of them, also acquiring the latency in the process"); -} - -void CServerBrowser::ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData) -{ - CServerBrowser *pThis = static_cast(pUserData); - pThis->FavoriteCommunitiesFilter().Save(pConfigManager); - pThis->CommunitiesFilter().Save(pConfigManager); - pThis->CountriesFilter().Save(pConfigManager); - pThis->TypesFilter().Save(pConfigManager); -} - -void CServerBrowser::Con_AddFavoriteCommunity(IConsole::IResult *pResult, void *pUserData) -{ - CServerBrowser *pThis = static_cast(pUserData); - const char *pCommunityId = pResult->GetString(0); - if(!pThis->ValidateCommunityId(pCommunityId)) - return; - pThis->FavoriteCommunitiesFilter().Add(pCommunityId); -} - -void CServerBrowser::Con_RemoveFavoriteCommunity(IConsole::IResult *pResult, void *pUserData) -{ - CServerBrowser *pThis = static_cast(pUserData); - const char *pCommunityId = pResult->GetString(0); - if(!pThis->ValidateCommunityId(pCommunityId)) - return; - pThis->FavoriteCommunitiesFilter().Remove(pCommunityId); -} - -void CServerBrowser::Con_AddExcludedCommunity(IConsole::IResult *pResult, void *pUserData) -{ - CServerBrowser *pThis = static_cast(pUserData); - const char *pCommunityId = pResult->GetString(0); - if(!pThis->ValidateCommunityId(pCommunityId)) - return; - pThis->CommunitiesFilter().Add(pCommunityId); -} - -void CServerBrowser::Con_RemoveExcludedCommunity(IConsole::IResult *pResult, void *pUserData) -{ - CServerBrowser *pThis = static_cast(pUserData); - const char *pCommunityId = pResult->GetString(0); - if(!pThis->ValidateCommunityId(pCommunityId)) - return; - pThis->CommunitiesFilter().Remove(pCommunityId); -} - -void CServerBrowser::Con_AddExcludedCountry(IConsole::IResult *pResult, void *pUserData) -{ - CServerBrowser *pThis = static_cast(pUserData); - const char *pCommunityId = pResult->GetString(0); - const char *pCountryName = pResult->GetString(1); - if(!pThis->ValidateCommunityId(pCommunityId) || !pThis->ValidateCountryName(pCountryName)) - return; - pThis->CountriesFilter().Add(pCommunityId, pCountryName); -} - -void CServerBrowser::Con_RemoveExcludedCountry(IConsole::IResult *pResult, void *pUserData) -{ - CServerBrowser *pThis = static_cast(pUserData); - const char *pCommunityId = pResult->GetString(0); - const char *pCountryName = pResult->GetString(1); - if(!pThis->ValidateCommunityId(pCommunityId) || !pThis->ValidateCountryName(pCountryName)) - return; - pThis->CountriesFilter().Remove(pCommunityId, pCountryName); -} - -void CServerBrowser::Con_AddExcludedType(IConsole::IResult *pResult, void *pUserData) -{ - CServerBrowser *pThis = static_cast(pUserData); - const char *pCommunityId = pResult->GetString(0); - const char *pTypeName = pResult->GetString(1); - if(!pThis->ValidateCommunityId(pCommunityId) || !pThis->ValidateTypeName(pTypeName)) - return; - pThis->TypesFilter().Add(pCommunityId, pTypeName); -} - -void CServerBrowser::Con_RemoveExcludedType(IConsole::IResult *pResult, void *pUserData) -{ - CServerBrowser *pThis = static_cast(pUserData); - const char *pCommunityId = pResult->GetString(0); - const char *pTypeName = pResult->GetString(1); - if(!pThis->ValidateCommunityId(pCommunityId) || !pThis->ValidateTypeName(pTypeName)) - return; - pThis->TypesFilter().Remove(pCommunityId, pTypeName); -} - -void CServerBrowser::Con_LeakIpAddress(IConsole::IResult *pResult, void *pUserData) -{ - CServerBrowser *pThis = static_cast(pUserData); - - // We only consider the first address of every server. - - std::vector vSortedServers; - // Sort servers by IP address, ignoring port. - class CAddrComparer - { - public: - CServerBrowser *m_pThis; - bool operator()(int i, int j) const - { - NETADDR Addr1 = m_pThis->m_ppServerlist[i]->m_Info.m_aAddresses[0]; - NETADDR Addr2 = m_pThis->m_ppServerlist[j]->m_Info.m_aAddresses[0]; - Addr1.port = 0; - Addr2.port = 0; - return net_addr_comp(&Addr1, &Addr2) < 0; - } - }; - vSortedServers.reserve(pThis->m_NumServers); - for(int i = 0; i < pThis->m_NumServers; i++) - { - vSortedServers.push_back(i); - } - std::sort(vSortedServers.begin(), vSortedServers.end(), CAddrComparer{pThis}); - - // Group the servers into those with same IP address (but differing - // port). - NETADDR Addr; - int Start = -1; - for(int i = 0; i <= (int)vSortedServers.size(); i++) - { - NETADDR NextAddr; - if(i < (int)vSortedServers.size()) - { - NextAddr = pThis->m_ppServerlist[vSortedServers[i]]->m_Info.m_aAddresses[0]; - NextAddr.port = 0; - } - bool New = Start == -1 || i == (int)vSortedServers.size() || net_addr_comp(&Addr, &NextAddr) != 0; - if(Start != -1 && New) - { - int Chosen = Start + secure_rand_below(i - Start); - CServerEntry *pChosen = pThis->m_ppServerlist[vSortedServers[Chosen]]; - pChosen->m_RequestIgnoreInfo = true; - pThis->QueueRequest(pChosen); - char aAddr[NETADDR_MAXSTRSIZE]; - net_addr_str(&pChosen->m_Info.m_aAddresses[0], aAddr, sizeof(aAddr), true); - dbg_msg("serverbrowser", "queuing ping request for %s", aAddr); - } - if(i < (int)vSortedServers.size() && New) - { - Start = i; - Addr = NextAddr; - } - } -} - -static bool ValidIdentifier(const char *pId, size_t MaxLength) -{ - if(pId[0] == '\0' || (size_t)str_length(pId) >= MaxLength) - { - return false; - } - - for(int i = 0; pId[i] != '\0'; ++i) - { - if(pId[i] == '"' || pId[i] == '/' || pId[i] == '\\') - { - return false; - } - } - return true; -} - -static bool ValidateIdentifier(const char *pId, size_t MaxLength, const char *pContext, IConsole *pConsole) -{ - if(!ValidIdentifier(pId, MaxLength)) - { - char aError[32 + IConsole::CMDLINE_LENGTH]; - str_format(aError, sizeof(aError), "%s '%s' is not valid", pContext, pId); - pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "serverbrowser", aError); - return false; - } - return true; -} - -bool CServerBrowser::ValidateCommunityId(const char *pCommunityId) const -{ - return ValidateIdentifier(pCommunityId, CServerInfo::MAX_COMMUNITY_ID_LENGTH, "Community ID", m_pConsole); -} - -bool CServerBrowser::ValidateCountryName(const char *pCountryName) const -{ - return ValidateIdentifier(pCountryName, CServerInfo::MAX_COMMUNITY_COUNTRY_LENGTH, "Country name", m_pConsole); -} - -bool CServerBrowser::ValidateTypeName(const char *pTypeName) const -{ - return ValidateIdentifier(pTypeName, CServerInfo::MAX_COMMUNITY_TYPE_LENGTH, "Type name", m_pConsole); -} - -int CServerBrowser::Players(const CServerInfo &Item) const -{ - return g_Config.m_BrFilterSpectators ? Item.m_NumPlayers : Item.m_NumClients; -} - -int CServerBrowser::Max(const CServerInfo &Item) const -{ - return g_Config.m_BrFilterSpectators ? Item.m_MaxPlayers : Item.m_MaxClients; -} - -const CServerInfo *CServerBrowser::SortedGet(int Index) const -{ - if(Index < 0 || Index >= m_NumSortedServers) - return nullptr; - return &m_ppServerlist[m_pSortedServerlist[Index]]->m_Info; -} - -int CServerBrowser::GenerateToken(const NETADDR &Addr) const -{ - SHA256_CTX Sha256; - sha256_init(&Sha256); - sha256_update(&Sha256, m_aTokenSeed, sizeof(m_aTokenSeed)); - sha256_update(&Sha256, (unsigned char *)&Addr, sizeof(Addr)); - SHA256_DIGEST Digest = sha256_finish(&Sha256); - return (Digest.data[0] << 16) | (Digest.data[1] << 8) | Digest.data[2]; -} - -int CServerBrowser::GetBasicToken(int Token) -{ - return Token & 0xff; -} - -int CServerBrowser::GetExtraToken(int Token) -{ - return Token >> 8; -} - -bool CServerBrowser::SortCompareName(int Index1, int Index2) const -{ - CServerEntry *pIndex1 = m_ppServerlist[Index1]; - CServerEntry *pIndex2 = m_ppServerlist[Index2]; - // make sure empty entries are listed last - return (pIndex1->m_GotInfo && pIndex2->m_GotInfo) || (!pIndex1->m_GotInfo && !pIndex2->m_GotInfo) ? str_comp(pIndex1->m_Info.m_aName, pIndex2->m_Info.m_aName) < 0 : - pIndex1->m_GotInfo != 0; -} - -bool CServerBrowser::SortCompareMap(int Index1, int Index2) const -{ - CServerEntry *pIndex1 = m_ppServerlist[Index1]; - CServerEntry *pIndex2 = m_ppServerlist[Index2]; - return str_comp(pIndex1->m_Info.m_aMap, pIndex2->m_Info.m_aMap) < 0; -} - -bool CServerBrowser::SortComparePing(int Index1, int Index2) const -{ - CServerEntry *pIndex1 = m_ppServerlist[Index1]; - CServerEntry *pIndex2 = m_ppServerlist[Index2]; - return pIndex1->m_Info.m_Latency < pIndex2->m_Info.m_Latency; -} - -bool CServerBrowser::SortCompareGametype(int Index1, int Index2) const -{ - CServerEntry *pIndex1 = m_ppServerlist[Index1]; - CServerEntry *pIndex2 = m_ppServerlist[Index2]; - return str_comp(pIndex1->m_Info.m_aGameType, pIndex2->m_Info.m_aGameType) < 0; -} - -bool CServerBrowser::SortCompareNumPlayers(int Index1, int Index2) const -{ - CServerEntry *pIndex1 = m_ppServerlist[Index1]; - CServerEntry *pIndex2 = m_ppServerlist[Index2]; - return pIndex1->m_Info.m_NumFilteredPlayers > pIndex2->m_Info.m_NumFilteredPlayers; -} - -bool CServerBrowser::SortCompareNumClients(int Index1, int Index2) const -{ - CServerEntry *pIndex1 = m_ppServerlist[Index1]; - CServerEntry *pIndex2 = m_ppServerlist[Index2]; - return pIndex1->m_Info.m_NumClients > pIndex2->m_Info.m_NumClients; -} - -bool CServerBrowser::SortCompareNumFriends(int Index1, int Index2) const -{ - CServerEntry *pIndex1 = m_ppServerlist[Index1]; - CServerEntry *pIndex2 = m_ppServerlist[Index2]; - - if(pIndex1->m_Info.m_FriendNum == pIndex2->m_Info.m_FriendNum) - return pIndex1->m_Info.m_NumFilteredPlayers > pIndex2->m_Info.m_NumFilteredPlayers; - else - return pIndex1->m_Info.m_FriendNum > pIndex2->m_Info.m_FriendNum; -} - -bool CServerBrowser::SortCompareNumPlayersAndPing(int Index1, int Index2) const -{ - CServerEntry *pIndex1 = m_ppServerlist[Index1]; - CServerEntry *pIndex2 = m_ppServerlist[Index2]; - - if(pIndex1->m_Info.m_NumFilteredPlayers == pIndex2->m_Info.m_NumFilteredPlayers) - return pIndex1->m_Info.m_Latency > pIndex2->m_Info.m_Latency; - else if(pIndex1->m_Info.m_NumFilteredPlayers == 0 || pIndex2->m_Info.m_NumFilteredPlayers == 0 || pIndex1->m_Info.m_Latency / 100 == pIndex2->m_Info.m_Latency / 100) - return pIndex1->m_Info.m_NumFilteredPlayers < pIndex2->m_Info.m_NumFilteredPlayers; - else - return pIndex1->m_Info.m_Latency > pIndex2->m_Info.m_Latency; -} - -void CServerBrowser::Filter() -{ - m_NumSortedServers = 0; - m_NumSortedPlayers = 0; - - // allocate the sorted list - if(m_NumSortedServersCapacity < m_NumServers) - { - free(m_pSortedServerlist); - m_NumSortedServersCapacity = m_NumServers; - m_pSortedServerlist = (int *)calloc(m_NumSortedServersCapacity, sizeof(int)); - } - - // filter the servers - for(int i = 0; i < m_NumServers; i++) - { - CServerInfo &Info = m_ppServerlist[i]->m_Info; - bool Filtered = false; - - if(g_Config.m_BrFilterEmpty && Info.m_NumFilteredPlayers == 0) - Filtered = true; - else if(g_Config.m_BrFilterFull && Players(Info) == Max(Info)) - Filtered = true; - else if(g_Config.m_BrFilterPw && Info.m_Flags & SERVER_FLAG_PASSWORD) - Filtered = true; - else if(g_Config.m_BrFilterServerAddress[0] && !str_find_nocase(Info.m_aAddress, g_Config.m_BrFilterServerAddress)) - Filtered = true; - else if(g_Config.m_BrFilterGametypeStrict && g_Config.m_BrFilterGametype[0] && str_comp_nocase(Info.m_aGameType, g_Config.m_BrFilterGametype)) - Filtered = true; - else if(!g_Config.m_BrFilterGametypeStrict && g_Config.m_BrFilterGametype[0] && !str_utf8_find_nocase(Info.m_aGameType, g_Config.m_BrFilterGametype)) - Filtered = true; - else if(g_Config.m_BrFilterUnfinishedMap && Info.m_HasRank == CServerInfo::RANK_RANKED) - Filtered = true; - else if(g_Config.m_BrFilterLogin && Info.m_RequiresLogin) - Filtered = true; - else - { - if(!Communities().empty()) - { - if(m_ServerlistType == IServerBrowser::TYPE_INTERNET || m_ServerlistType == IServerBrowser::TYPE_FAVORITES) - { - Filtered = CommunitiesFilter().Filtered(Info.m_aCommunityId); - } - if(m_ServerlistType == IServerBrowser::TYPE_INTERNET || m_ServerlistType == IServerBrowser::TYPE_FAVORITES || - (m_ServerlistType >= IServerBrowser::TYPE_FAVORITE_COMMUNITY_1 && m_ServerlistType <= IServerBrowser::TYPE_FAVORITE_COMMUNITY_5)) - { - Filtered = Filtered || CountriesFilter().Filtered(Info.m_aCommunityCountry); - Filtered = Filtered || TypesFilter().Filtered(Info.m_aCommunityType); - } - } - - if(!Filtered && g_Config.m_BrFilterCountry) - { - Filtered = true; - // match against player country - for(int p = 0; p < minimum(Info.m_NumClients, (int)MAX_CLIENTS); p++) - { - if(Info.m_aClients[p].m_Country == g_Config.m_BrFilterCountryIndex) - { - Filtered = false; - break; - } - } - } - - if(!Filtered && g_Config.m_BrFilterString[0] != '\0') - { - Info.m_QuickSearchHit = 0; - - const char *pStr = g_Config.m_BrFilterString; - char aFilterStr[sizeof(g_Config.m_BrFilterString)]; - char aFilterStrTrimmed[sizeof(g_Config.m_BrFilterString)]; - while((pStr = str_next_token(pStr, IServerBrowser::SEARCH_EXCLUDE_TOKEN, aFilterStr, sizeof(aFilterStr)))) - { - str_copy(aFilterStrTrimmed, str_utf8_skip_whitespaces(aFilterStr)); - str_utf8_trim_right(aFilterStrTrimmed); - - if(aFilterStrTrimmed[0] == '\0') - { - continue; - } - auto MatchesFn = matchesPart; - const int FilterLen = str_length(aFilterStrTrimmed); - if(aFilterStrTrimmed[0] == '"' && aFilterStrTrimmed[FilterLen - 1] == '"') - { - aFilterStrTrimmed[FilterLen - 1] = '\0'; - MatchesFn = matchesExactly; - } - - // match against server name - if(MatchesFn(Info.m_aName, aFilterStrTrimmed)) - { - Info.m_QuickSearchHit |= IServerBrowser::QUICK_SERVERNAME; - } - - // match against players - for(int p = 0; p < minimum(Info.m_NumClients, (int)MAX_CLIENTS); p++) - { - if(MatchesFn(Info.m_aClients[p].m_aName, aFilterStrTrimmed) || - MatchesFn(Info.m_aClients[p].m_aClan, aFilterStrTrimmed)) - { - if(g_Config.m_BrFilterConnectingPlayers && - str_comp(Info.m_aClients[p].m_aName, "(connecting)") == 0 && - Info.m_aClients[p].m_aClan[0] == '\0') - { - continue; - } - Info.m_QuickSearchHit |= IServerBrowser::QUICK_PLAYER; - break; - } - } - - // match against map - if(MatchesFn(Info.m_aMap, aFilterStrTrimmed)) - { - Info.m_QuickSearchHit |= IServerBrowser::QUICK_MAPNAME; - } - } - - if(!Info.m_QuickSearchHit) - Filtered = true; - } - - if(!Filtered && g_Config.m_BrExcludeString[0] != '\0') - { - const char *pStr = g_Config.m_BrExcludeString; - char aExcludeStr[sizeof(g_Config.m_BrExcludeString)]; - char aExcludeStrTrimmed[sizeof(g_Config.m_BrExcludeString)]; - while((pStr = str_next_token(pStr, IServerBrowser::SEARCH_EXCLUDE_TOKEN, aExcludeStr, sizeof(aExcludeStr)))) - { - str_copy(aExcludeStrTrimmed, str_utf8_skip_whitespaces(aExcludeStr)); - str_utf8_trim_right(aExcludeStrTrimmed); - - if(aExcludeStrTrimmed[0] == '\0') - { - continue; - } - auto MatchesFn = matchesPart; - const int FilterLen = str_length(aExcludeStrTrimmed); - if(aExcludeStrTrimmed[0] == '"' && aExcludeStrTrimmed[FilterLen - 1] == '"') - { - aExcludeStrTrimmed[FilterLen - 1] = '\0'; - MatchesFn = matchesExactly; - } - - // match against server name - if(MatchesFn(Info.m_aName, aExcludeStrTrimmed)) - { - Filtered = true; - break; - } - - // match against map - if(MatchesFn(Info.m_aMap, aExcludeStrTrimmed)) - { - Filtered = true; - break; - } - - // match against gametype - if(MatchesFn(Info.m_aGameType, aExcludeStrTrimmed)) - { - Filtered = true; - break; - } - } - } - } - - if(!Filtered) - { - UpdateServerFriends(&Info); - - if(!g_Config.m_BrFilterFriends || Info.m_FriendState != IFriends::FRIEND_NO) - { - m_NumSortedPlayers += Info.m_NumFilteredPlayers; - m_pSortedServerlist[m_NumSortedServers++] = i; - } - } - } -} - -int CServerBrowser::SortHash() const -{ - int i = g_Config.m_BrSort & 0xff; - i |= g_Config.m_BrFilterEmpty << 4; - i |= g_Config.m_BrFilterFull << 5; - i |= g_Config.m_BrFilterSpectators << 6; - i |= g_Config.m_BrFilterFriends << 7; - i |= g_Config.m_BrFilterPw << 8; - i |= g_Config.m_BrSortOrder << 9; - i |= g_Config.m_BrFilterGametypeStrict << 12; - i |= g_Config.m_BrFilterUnfinishedMap << 13; - i |= g_Config.m_BrFilterCountry << 14; - i |= g_Config.m_BrFilterConnectingPlayers << 15; - i |= g_Config.m_BrFilterLogin << 16; - return i; -} - -void CServerBrowser::Sort() -{ - // update number of filtered players - for(int i = 0; i < m_NumServers; i++) - { - UpdateServerFilteredPlayers(&m_ppServerlist[i]->m_Info); - } - - // create filtered list - Filter(); - - // sort - if(g_Config.m_BrSortOrder == 2 && (g_Config.m_BrSort == IServerBrowser::SORT_NUMPLAYERS || g_Config.m_BrSort == IServerBrowser::SORT_PING)) - std::stable_sort(m_pSortedServerlist, m_pSortedServerlist + m_NumSortedServers, CSortWrap(this, &CServerBrowser::SortCompareNumPlayersAndPing)); - else if(g_Config.m_BrSort == IServerBrowser::SORT_NAME) - std::stable_sort(m_pSortedServerlist, m_pSortedServerlist + m_NumSortedServers, CSortWrap(this, &CServerBrowser::SortCompareName)); - else if(g_Config.m_BrSort == IServerBrowser::SORT_PING) - std::stable_sort(m_pSortedServerlist, m_pSortedServerlist + m_NumSortedServers, CSortWrap(this, &CServerBrowser::SortComparePing)); - else if(g_Config.m_BrSort == IServerBrowser::SORT_MAP) - std::stable_sort(m_pSortedServerlist, m_pSortedServerlist + m_NumSortedServers, CSortWrap(this, &CServerBrowser::SortCompareMap)); - else if(g_Config.m_BrSort == IServerBrowser::SORT_NUMFRIENDS) - std::stable_sort(m_pSortedServerlist, m_pSortedServerlist + m_NumSortedServers, CSortWrap(this, &CServerBrowser::SortCompareNumFriends)); - else if(g_Config.m_BrSort == IServerBrowser::SORT_NUMPLAYERS) - std::stable_sort(m_pSortedServerlist, m_pSortedServerlist + m_NumSortedServers, CSortWrap(this, &CServerBrowser::SortCompareNumPlayers)); - else if(g_Config.m_BrSort == IServerBrowser::SORT_GAMETYPE) - std::stable_sort(m_pSortedServerlist, m_pSortedServerlist + m_NumSortedServers, CSortWrap(this, &CServerBrowser::SortCompareGametype)); - - m_Sorthash = SortHash(); -} - -void CServerBrowser::RemoveRequest(CServerEntry *pEntry) -{ - if(pEntry->m_pPrevReq || pEntry->m_pNextReq || m_pFirstReqServer == pEntry) - { - if(pEntry->m_pPrevReq) - pEntry->m_pPrevReq->m_pNextReq = pEntry->m_pNextReq; - else - m_pFirstReqServer = pEntry->m_pNextReq; - - if(pEntry->m_pNextReq) - pEntry->m_pNextReq->m_pPrevReq = pEntry->m_pPrevReq; - else - m_pLastReqServer = pEntry->m_pPrevReq; - - pEntry->m_pPrevReq = nullptr; - pEntry->m_pNextReq = nullptr; - m_NumRequests--; - } -} - -CServerBrowser::CServerEntry *CServerBrowser::Find(const NETADDR &Addr) -{ - auto Entry = m_ByAddr.find(Addr); - if(Entry == m_ByAddr.end()) - { - return nullptr; - } - return m_ppServerlist[Entry->second]; -} - -void CServerBrowser::QueueRequest(CServerEntry *pEntry) -{ - // add it to the list of servers that we should request info from - pEntry->m_pPrevReq = m_pLastReqServer; - if(m_pLastReqServer) - m_pLastReqServer->m_pNextReq = pEntry; - else - m_pFirstReqServer = pEntry; - m_pLastReqServer = pEntry; - pEntry->m_pNextReq = nullptr; - m_NumRequests++; -} - -void ServerBrowserFormatAddresses(char *pBuffer, int BufferSize, NETADDR *pAddrs, int NumAddrs) -{ - for(int i = 0; i < NumAddrs; i++) - { - if(i != 0) - { - if(BufferSize <= 1) - { - return; - } - pBuffer[0] = ','; - pBuffer[1] = '\0'; - pBuffer += 1; - BufferSize -= 1; - } - if(BufferSize <= 1) - { - return; - } - char aIpAddr[512]; - if(!net_addr_str(&pAddrs[i], aIpAddr, sizeof(aIpAddr), true)) - { - str_copy(pBuffer, aIpAddr, BufferSize); - return; - } - if(pAddrs[i].type & NETTYPE_TW7) - { - str_format( - pBuffer, - BufferSize, - "tw-0.7+udp://%s", - aIpAddr); - return; - } - str_copy(pBuffer, aIpAddr, BufferSize); - int Length = str_length(pBuffer); - pBuffer += Length; - BufferSize -= Length; - } -} - -void CServerBrowser::SetInfo(CServerEntry *pEntry, const CServerInfo &Info) const -{ - const CServerInfo TmpInfo = pEntry->m_Info; - pEntry->m_Info = Info; - pEntry->m_Info.m_Favorite = TmpInfo.m_Favorite; - pEntry->m_Info.m_FavoriteAllowPing = TmpInfo.m_FavoriteAllowPing; - mem_copy(pEntry->m_Info.m_aAddresses, TmpInfo.m_aAddresses, sizeof(pEntry->m_Info.m_aAddresses)); - pEntry->m_Info.m_NumAddresses = TmpInfo.m_NumAddresses; - ServerBrowserFormatAddresses(pEntry->m_Info.m_aAddress, sizeof(pEntry->m_Info.m_aAddress), pEntry->m_Info.m_aAddresses, pEntry->m_Info.m_NumAddresses); - str_copy(pEntry->m_Info.m_aCommunityId, TmpInfo.m_aCommunityId); - str_copy(pEntry->m_Info.m_aCommunityCountry, TmpInfo.m_aCommunityCountry); - str_copy(pEntry->m_Info.m_aCommunityType, TmpInfo.m_aCommunityType); - UpdateServerRank(&pEntry->m_Info); - - if(pEntry->m_Info.m_ClientScoreKind == CServerInfo::CLIENT_SCORE_KIND_UNSPECIFIED) - { - if(str_find_nocase(pEntry->m_Info.m_aGameType, "race") || str_find_nocase(pEntry->m_Info.m_aGameType, "fastcap")) - { - pEntry->m_Info.m_ClientScoreKind = CServerInfo::CLIENT_SCORE_KIND_TIME_BACKCOMPAT; - } - else - { - pEntry->m_Info.m_ClientScoreKind = CServerInfo::CLIENT_SCORE_KIND_POINTS; - } - } - - class CPlayerScoreNameLess - { - const int m_ScoreKind; - - public: - CPlayerScoreNameLess(int ClientScoreKind) : - m_ScoreKind(ClientScoreKind) - { - } - - bool operator()(const CServerInfo::CClient &p0, const CServerInfo::CClient &p1) const - { - // Sort players before non players - if(p0.m_Player && !p1.m_Player) - return true; - if(!p0.m_Player && p1.m_Player) - return false; - - int Score0 = p0.m_Score; - int Score1 = p1.m_Score; - - if(m_ScoreKind == CServerInfo::CLIENT_SCORE_KIND_TIME || m_ScoreKind == CServerInfo::CLIENT_SCORE_KIND_TIME_BACKCOMPAT) - { - // Sort unfinished (-9999) and still connecting players (-1) after others - if(Score0 < 0 && Score1 >= 0) - return false; - if(Score0 >= 0 && Score1 < 0) - return true; - } - - if(Score0 != Score1) - { - // Handle the sign change introduced with CLIENT_SCORE_KIND_TIME - if(m_ScoreKind == CServerInfo::CLIENT_SCORE_KIND_TIME) - return Score0 < Score1; - else - return Score0 > Score1; - } - - return str_comp_nocase(p0.m_aName, p1.m_aName) < 0; - } - }; - - std::sort(pEntry->m_Info.m_aClients, pEntry->m_Info.m_aClients + Info.m_NumReceivedClients, CPlayerScoreNameLess(pEntry->m_Info.m_ClientScoreKind)); - - pEntry->m_GotInfo = 1; -} - -void CServerBrowser::SetLatency(NETADDR Addr, int Latency) -{ - m_pPingCache->CachePing(Addr, Latency); - - Addr.port = 0; - for(int i = 0; i < m_NumServers; i++) - { - if(!m_ppServerlist[i]->m_GotInfo) - { - continue; - } - bool Found = false; - for(int j = 0; j < m_ppServerlist[i]->m_Info.m_NumAddresses; j++) - { - NETADDR Other = m_ppServerlist[i]->m_Info.m_aAddresses[j]; - Other.port = 0; - if(Addr == Other) - { - Found = true; - break; - } - } - if(!Found) - { - continue; - } - int Ping = m_pPingCache->GetPing(m_ppServerlist[i]->m_Info.m_aAddresses, m_ppServerlist[i]->m_Info.m_NumAddresses); - if(Ping == -1) - { - continue; - } - m_ppServerlist[i]->m_Info.m_Latency = Ping; - m_ppServerlist[i]->m_Info.m_LatencyIsEstimated = false; - } -} - -CServerBrowser::CServerEntry *CServerBrowser::Add(const NETADDR *pAddrs, int NumAddrs) -{ - // create new pEntry - CServerEntry *pEntry = m_ServerlistHeap.Allocate(); - mem_zero(pEntry, sizeof(CServerEntry)); - - // set the info - mem_copy(pEntry->m_Info.m_aAddresses, pAddrs, NumAddrs * sizeof(pAddrs[0])); - pEntry->m_Info.m_NumAddresses = NumAddrs; - - pEntry->m_Info.m_Latency = 999; - pEntry->m_Info.m_HasRank = CServerInfo::RANK_UNAVAILABLE; - ServerBrowserFormatAddresses(pEntry->m_Info.m_aAddress, sizeof(pEntry->m_Info.m_aAddress), pEntry->m_Info.m_aAddresses, pEntry->m_Info.m_NumAddresses); - UpdateServerCommunity(&pEntry->m_Info); - str_copy(pEntry->m_Info.m_aName, pEntry->m_Info.m_aAddress, sizeof(pEntry->m_Info.m_aName)); - - // check if it's a favorite - pEntry->m_Info.m_Favorite = m_pFavorites->IsFavorite(pEntry->m_Info.m_aAddresses, pEntry->m_Info.m_NumAddresses); - pEntry->m_Info.m_FavoriteAllowPing = m_pFavorites->IsPingAllowed(pEntry->m_Info.m_aAddresses, pEntry->m_Info.m_NumAddresses); - - for(int i = 0; i < NumAddrs; i++) - { - m_ByAddr[pAddrs[i]] = m_NumServers; - } - - if(m_NumServers == m_NumServerCapacity) - { - CServerEntry **ppNewlist; - m_NumServerCapacity += 100; - ppNewlist = (CServerEntry **)calloc(m_NumServerCapacity, sizeof(CServerEntry *)); // NOLINT(bugprone-sizeof-expression) - if(m_NumServers > 0) - mem_copy(ppNewlist, m_ppServerlist, m_NumServers * sizeof(CServerEntry *)); // NOLINT(bugprone-sizeof-expression) - free(m_ppServerlist); - m_ppServerlist = ppNewlist; - } - - // add to list - m_ppServerlist[m_NumServers] = pEntry; - pEntry->m_Info.m_ServerIndex = m_NumServers; - m_NumServers++; - - return pEntry; -} - -void CServerBrowser::OnServerInfoUpdate(const NETADDR &Addr, int Token, const CServerInfo *pInfo) -{ - int BasicToken = Token; - int ExtraToken = 0; - if(pInfo->m_Type == SERVERINFO_EXTENDED) - { - BasicToken = Token & 0xff; - ExtraToken = Token >> 8; - } - - CServerEntry *pEntry = Find(Addr); - - if(m_ServerlistType == IServerBrowser::TYPE_LAN) - { - NETADDR Broadcast; - mem_zero(&Broadcast, sizeof(Broadcast)); - Broadcast.type = m_pNetClient->NetType() | NETTYPE_LINK_BROADCAST; - int TokenBC = GenerateToken(Broadcast); - bool Drop = false; - Drop = Drop || BasicToken != GetBasicToken(TokenBC); - Drop = Drop || (pInfo->m_Type == SERVERINFO_EXTENDED && ExtraToken != GetExtraToken(TokenBC)); - if(Drop) - { - return; - } - - if(!pEntry) - pEntry = Add(&Addr, 1); - } - else - { - if(!pEntry) - { - return; - } - int TokenAddr = GenerateToken(Addr); - bool Drop = false; - Drop = Drop || BasicToken != GetBasicToken(TokenAddr); - Drop = Drop || (pInfo->m_Type == SERVERINFO_EXTENDED && ExtraToken != GetExtraToken(TokenAddr)); - if(Drop) - { - return; - } - } - - if(m_ServerlistType == IServerBrowser::TYPE_LAN) - { - SetInfo(pEntry, *pInfo); - pEntry->m_Info.m_Latency = minimum(static_cast((time_get() - m_BroadcastTime) * 1000 / time_freq()), 999); - } - else if(pEntry->m_RequestTime > 0) - { - if(!pEntry->m_RequestIgnoreInfo) - { - SetInfo(pEntry, *pInfo); - } - - int Latency = minimum(static_cast((time_get() - pEntry->m_RequestTime) * 1000 / time_freq()), 999); - if(!pEntry->m_RequestIgnoreInfo) - { - pEntry->m_Info.m_Latency = Latency; - } - else - { - char aAddr[NETADDR_MAXSTRSIZE]; - net_addr_str(&Addr, aAddr, sizeof(aAddr), true); - dbg_msg("serverbrowser", "received ping response from %s", aAddr); - SetLatency(Addr, Latency); - } - pEntry->m_RequestTime = -1; // Request has been answered - } - RemoveRequest(pEntry); - RequestResort(); -} - -void CServerBrowser::Refresh(int Type, bool Force) -{ - bool ServerListTypeChanged = Force || m_ServerlistType != Type; - int OldServerListType = m_ServerlistType; - m_ServerlistType = Type; - secure_random_fill(m_aTokenSeed, sizeof(m_aTokenSeed)); - - if(Type == IServerBrowser::TYPE_LAN || (ServerListTypeChanged && OldServerListType == IServerBrowser::TYPE_LAN)) - CleanUp(); - - if(Type == IServerBrowser::TYPE_LAN) - { - unsigned char aBuffer[sizeof(SERVERBROWSE_GETINFO) + 1]; - CNetChunk Packet; - - /* do the broadcast version */ - Packet.m_ClientId = -1; - mem_zero(&Packet, sizeof(Packet)); - Packet.m_Address.type = m_pNetClient->NetType() | NETTYPE_LINK_BROADCAST; - Packet.m_Flags = NETSENDFLAG_CONNLESS | NETSENDFLAG_EXTENDED; - Packet.m_DataSize = sizeof(aBuffer); - Packet.m_pData = aBuffer; - mem_zero(&Packet.m_aExtraData, sizeof(Packet.m_aExtraData)); - - int Token = GenerateToken(Packet.m_Address); - mem_copy(aBuffer, SERVERBROWSE_GETINFO, sizeof(SERVERBROWSE_GETINFO)); - aBuffer[sizeof(SERVERBROWSE_GETINFO)] = GetBasicToken(Token); - - Packet.m_aExtraData[0] = GetExtraToken(Token) >> 8; - Packet.m_aExtraData[1] = GetExtraToken(Token) & 0xff; - - m_BroadcastTime = time_get(); - - for(int Port = LAN_PORT_BEGIN; Port <= LAN_PORT_END; Port++) - { - Packet.m_Address.port = Port; - m_pNetClient->Send(&Packet); - } - - if(g_Config.m_Debug) - m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "serverbrowser", "broadcasting for servers"); - } - else - { - m_pHttp->Refresh(); - m_pPingCache->Load(); - m_RefreshingHttp = true; - - if(ServerListTypeChanged && m_pHttp->NumServers() > 0) - { - CleanUp(); - UpdateFromHttp(); - Sort(); - } - } -} - -void CServerBrowser::RequestImpl(const NETADDR &Addr, CServerEntry *pEntry, int *pBasicToken, int *pToken, bool RandomToken) const -{ - if(g_Config.m_Debug) - { - char aAddrStr[NETADDR_MAXSTRSIZE]; - net_addr_str(&Addr, aAddrStr, sizeof(aAddrStr), true); - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "requesting server info from %s", aAddrStr); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "serverbrowser", aBuf); - } - - int Token = GenerateToken(Addr); - if(RandomToken) - { - int AvoidBasicToken = GetBasicToken(Token); - do - { - secure_random_fill(&Token, sizeof(Token)); - Token &= 0xffffff; - } while(GetBasicToken(Token) == AvoidBasicToken); - } - if(pToken) - { - *pToken = Token; - } - if(pBasicToken) - { - *pBasicToken = GetBasicToken(Token); - } - - unsigned char aBuffer[sizeof(SERVERBROWSE_GETINFO) + 1]; - mem_copy(aBuffer, SERVERBROWSE_GETINFO, sizeof(SERVERBROWSE_GETINFO)); - aBuffer[sizeof(SERVERBROWSE_GETINFO)] = GetBasicToken(Token); - - CNetChunk Packet; - Packet.m_ClientId = -1; - Packet.m_Address = Addr; - Packet.m_Flags = NETSENDFLAG_CONNLESS | NETSENDFLAG_EXTENDED; - Packet.m_DataSize = sizeof(aBuffer); - Packet.m_pData = aBuffer; - mem_zero(&Packet.m_aExtraData, sizeof(Packet.m_aExtraData)); - Packet.m_aExtraData[0] = GetExtraToken(Token) >> 8; - Packet.m_aExtraData[1] = GetExtraToken(Token) & 0xff; - - m_pNetClient->Send(&Packet); - - if(pEntry) - pEntry->m_RequestTime = time_get(); -} - -void CServerBrowser::RequestCurrentServer(const NETADDR &Addr) const -{ - RequestImpl(Addr, nullptr, nullptr, nullptr, false); -} - -void CServerBrowser::RequestCurrentServerWithRandomToken(const NETADDR &Addr, int *pBasicToken, int *pToken) const -{ - RequestImpl(Addr, nullptr, pBasicToken, pToken, true); -} - -void CServerBrowser::SetCurrentServerPing(const NETADDR &Addr, int Ping) -{ - SetLatency(Addr, minimum(Ping, 999)); -} - -void CServerBrowser::UpdateFromHttp() -{ - int OwnLocation; - if(str_comp(g_Config.m_BrLocation, "auto") == 0) - { - OwnLocation = m_OwnLocation; - } - else - { - if(CServerInfo::ParseLocation(&OwnLocation, g_Config.m_BrLocation)) - { - char aBuf[64]; - str_format(aBuf, sizeof(aBuf), "cannot parse br_location: '%s'", g_Config.m_BrLocation); - m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "serverbrowser", aBuf); - } - } - - int NumServers = m_pHttp->NumServers(); - std::function Want = [](const NETADDR *pAddrs, int NumAddrs) { return true; }; - if(m_ServerlistType == IServerBrowser::TYPE_FAVORITES) - { - Want = [this](const NETADDR *pAddrs, int NumAddrs) -> bool { - return m_pFavorites->IsFavorite(pAddrs, NumAddrs) != TRISTATE::NONE; - }; - } - else if(m_ServerlistType >= IServerBrowser::TYPE_FAVORITE_COMMUNITY_1 && m_ServerlistType <= IServerBrowser::TYPE_FAVORITE_COMMUNITY_5) - { - const size_t CommunityIndex = m_ServerlistType - IServerBrowser::TYPE_FAVORITE_COMMUNITY_1; - std::vector vpFavoriteCommunities = FavoriteCommunities(); - dbg_assert(CommunityIndex < vpFavoriteCommunities.size(), "Invalid community index"); - const CCommunity *pWantedCommunity = vpFavoriteCommunities[CommunityIndex]; - const bool IsNoneCommunity = str_comp(pWantedCommunity->Id(), COMMUNITY_NONE) == 0; - Want = [this, pWantedCommunity, IsNoneCommunity](const NETADDR *pAddrs, int NumAddrs) -> bool { - for(int AddressIndex = 0; AddressIndex < NumAddrs; AddressIndex++) - { - const auto CommunityServer = m_CommunityServersByAddr.find(pAddrs[AddressIndex]); - if(CommunityServer != m_CommunityServersByAddr.end()) - { - if(IsNoneCommunity) - { - // Servers with community "none" are not present in m_CommunityServersByAddr, so we ignore - // any server that is found in this map to determine only the servers without community. - return false; - } - else if(str_comp(CommunityServer->second.CommunityId(), pWantedCommunity->Id()) == 0) - { - return true; - } - } - } - return IsNoneCommunity; - }; - } - - for(int i = 0; i < NumServers; i++) - { - CServerInfo Info = m_pHttp->Server(i); - if(!Want(Info.m_aAddresses, Info.m_NumAddresses)) - { - continue; - } - int Ping = m_pPingCache->GetPing(Info.m_aAddresses, Info.m_NumAddresses); - Info.m_LatencyIsEstimated = Ping == -1; - if(Info.m_LatencyIsEstimated) - { - Info.m_Latency = CServerInfo::EstimateLatency(OwnLocation, Info.m_Location); - } - else - { - Info.m_Latency = Ping; - } - CServerEntry *pEntry = Add(Info.m_aAddresses, Info.m_NumAddresses); - SetInfo(pEntry, Info); - pEntry->m_RequestIgnoreInfo = true; - } - - if(m_ServerlistType == IServerBrowser::TYPE_FAVORITES) - { - const IFavorites::CEntry *pFavorites; - int NumFavorites; - m_pFavorites->AllEntries(&pFavorites, &NumFavorites); - for(int i = 0; i < NumFavorites; i++) - { - bool Found = false; - for(int j = 0; j < pFavorites[i].m_NumAddrs; j++) - { - if(Find(pFavorites[i].m_aAddrs[j])) - { - Found = true; - break; - } - } - if(Found) - { - continue; - } - // (Also add favorites we're not allowed to ping.) - CServerEntry *pEntry = Add(pFavorites[i].m_aAddrs, pFavorites[i].m_NumAddrs); - if(pFavorites[i].m_AllowPing) - { - QueueRequest(pEntry); - } - } - } - - RequestResort(); -} - -void CServerBrowser::CleanUp() -{ - // clear out everything - m_ServerlistHeap.Reset(); - m_NumServers = 0; - m_NumSortedServers = 0; - m_NumSortedPlayers = 0; - m_ByAddr.clear(); - m_pFirstReqServer = nullptr; - m_pLastReqServer = nullptr; - m_NumRequests = 0; - m_CurrentMaxRequests = g_Config.m_BrMaxRequests; -} - -void CServerBrowser::Update() -{ - int64_t Timeout = time_freq(); - int64_t Now = time_get(); - - const char *pHttpBestUrl; - if(!m_pHttp->GetBestUrl(&pHttpBestUrl) && pHttpBestUrl != m_pHttpPrevBestUrl) - { - str_copy(g_Config.m_BrCachedBestServerinfoUrl, pHttpBestUrl); - m_pHttpPrevBestUrl = pHttpBestUrl; - } - - m_pHttp->Update(); - - if(m_ServerlistType != TYPE_LAN && m_RefreshingHttp && !m_pHttp->IsRefreshing()) - { - m_RefreshingHttp = false; - CleanUp(); - UpdateFromHttp(); - // TODO: move this somewhere else - Sort(); - return; - } - - CServerEntry *pEntry = m_pFirstReqServer; - int Count = 0; - while(true) - { - if(!pEntry) // no more entries - break; - if(pEntry->m_RequestTime && pEntry->m_RequestTime + Timeout < Now) - { - pEntry = pEntry->m_pNextReq; - continue; - } - // no more than 10 concurrent requests - if(Count == m_CurrentMaxRequests) - break; - - if(pEntry->m_RequestTime == 0) - { - RequestImpl(pEntry->m_Info.m_aAddresses[0], pEntry, nullptr, nullptr, false); - } - - Count++; - pEntry = pEntry->m_pNextReq; - } - - if(m_pFirstReqServer && Count == 0 && m_CurrentMaxRequests > 1) //NO More current Server Requests - { - //reset old ones - pEntry = m_pFirstReqServer; - while(true) - { - if(!pEntry) // no more entries - break; - pEntry->m_RequestTime = 0; - pEntry = pEntry->m_pNextReq; - } - - //update max-requests - m_CurrentMaxRequests = m_CurrentMaxRequests / 2; - if(m_CurrentMaxRequests < 1) - m_CurrentMaxRequests = 1; - } - else if(Count == 0 && m_CurrentMaxRequests == 1) //we reached the limit, just release all left requests. IF a server sends us a packet, a new request will be added automatically, so we can delete all - { - pEntry = m_pFirstReqServer; - while(true) - { - if(!pEntry) // no more entries - break; - CServerEntry *pNext = pEntry->m_pNextReq; - RemoveRequest(pEntry); //release request - pEntry = pNext; - } - } - - // check if we need to resort - if(m_Sorthash != SortHash() || m_NeedResort) - { - for(int i = 0; i < m_NumServers; i++) - { - CServerInfo *pInfo = &m_ppServerlist[i]->m_Info; - pInfo->m_Favorite = m_pFavorites->IsFavorite(pInfo->m_aAddresses, pInfo->m_NumAddresses); - pInfo->m_FavoriteAllowPing = m_pFavorites->IsPingAllowed(pInfo->m_aAddresses, pInfo->m_NumAddresses); - } - Sort(); - m_NeedResort = false; - } -} - -const json_value *CServerBrowser::LoadDDNetInfo() -{ - LoadDDNetInfoJson(); - LoadDDNetLocation(); - LoadDDNetServers(); - for(int i = 0; i < m_NumServers; i++) - { - UpdateServerCommunity(&m_ppServerlist[i]->m_Info); - UpdateServerRank(&m_ppServerlist[i]->m_Info); - } - return m_pDDNetInfo; -} - -void CServerBrowser::LoadDDNetInfoJson() -{ - void *pBuf; - unsigned Length; - if(!m_pStorage->ReadFile(DDNET_INFO_FILE, IStorage::TYPE_SAVE, &pBuf, &Length)) - { - m_DDNetInfoSha256 = SHA256_ZEROED; - return; - } - - m_DDNetInfoSha256 = sha256(pBuf, Length); - - json_value_free(m_pDDNetInfo); - json_settings JsonSettings{}; - char aError[256]; - m_pDDNetInfo = json_parse_ex(&JsonSettings, static_cast(pBuf), Length, aError); - free(pBuf); - - if(m_pDDNetInfo == nullptr) - { - log_error("serverbrowser", "invalid info json: '%s'", aError); - } - else if(m_pDDNetInfo->type != json_object) - { - log_error("serverbrowser", "invalid info root"); - json_value_free(m_pDDNetInfo); - m_pDDNetInfo = nullptr; - } -} - -void CServerBrowser::LoadDDNetLocation() -{ - m_OwnLocation = CServerInfo::LOC_UNKNOWN; - if(m_pDDNetInfo) - { - const json_value &Location = (*m_pDDNetInfo)["location"]; - if(Location.type != json_string || CServerInfo::ParseLocation(&m_OwnLocation, Location)) - { - log_error("serverbrowser", "invalid location"); - } - } -} - -bool CServerBrowser::ParseCommunityServers(CCommunity *pCommunity, const json_value &Servers) -{ - for(unsigned ServerIndex = 0; ServerIndex < Servers.u.array.length; ++ServerIndex) - { - // pServer - { name, flagId, servers } - const json_value &Server = Servers[ServerIndex]; - if(Server.type != json_object) - { - log_error("serverbrowser", "invalid server (ServerIndex=%u)", ServerIndex); - return false; - } - - const json_value &Name = Server["name"]; - const json_value &FlagId = Server["flagId"]; - const json_value &Types = Server["servers"]; - if(Name.type != json_string || FlagId.type != json_integer || Types.type != json_object) - { - log_error("serverbrowser", "invalid server attribute (ServerIndex=%u)", ServerIndex); - return false; - } - if(Types.u.object.length == 0) - continue; - - pCommunity->m_vCountries.emplace_back(Name.u.string.ptr, FlagId.u.integer); - CCommunityCountry *pCountry = &pCommunity->m_vCountries.back(); - - for(unsigned TypeIndex = 0; TypeIndex < Types.u.object.length; ++TypeIndex) - { - const json_value &Addresses = *Types.u.object.values[TypeIndex].value; - if(Addresses.type != json_array) - { - log_error("serverbrowser", "invalid addresses (ServerIndex=%u, TypeIndex=%u)", ServerIndex, TypeIndex); - return false; - } - if(Addresses.u.array.length == 0) - continue; - - const char *pTypeName = Types.u.object.values[TypeIndex].name; - - // add type if it doesn't exist already - const auto CommunityType = std::find_if(pCommunity->m_vTypes.begin(), pCommunity->m_vTypes.end(), [pTypeName](const auto &Elem) { - return str_comp(Elem.Name(), pTypeName) == 0; - }); - if(CommunityType == pCommunity->m_vTypes.end()) - { - pCommunity->m_vTypes.emplace_back(pTypeName); - } - - // add addresses - for(unsigned AddressIndex = 0; AddressIndex < Addresses.u.array.length; ++AddressIndex) - { - const json_value &Address = Addresses[AddressIndex]; - if(Address.type != json_string) - { - log_error("serverbrowser", "invalid address (ServerIndex=%u, TypeIndex=%u, AddressIndex=%u)", ServerIndex, TypeIndex, AddressIndex); - return false; - } - NETADDR NetAddr; - if(net_addr_from_str(&NetAddr, Address.u.string.ptr)) - { - log_error("serverbrowser", "invalid address (ServerIndex=%u, TypeIndex=%u, AddressIndex=%u)", ServerIndex, TypeIndex, AddressIndex); - continue; - } - pCountry->m_vServers.emplace_back(NetAddr, pTypeName); - } - } - } - return true; -} - -bool CServerBrowser::ParseCommunityFinishes(CCommunity *pCommunity, const json_value &Finishes) -{ - for(unsigned FinishIndex = 0; FinishIndex < Finishes.u.array.length; ++FinishIndex) - { - const json_value &Finish = Finishes[FinishIndex]; - if(Finish.type != json_string) - { - log_error("serverbrowser", "invalid rank (FinishIndex=%u)", FinishIndex); - return false; - } - pCommunity->m_FinishedMaps.emplace((const char *)Finish); - } - return true; -} - -void CServerBrowser::LoadDDNetServers() -{ - // Parse communities - m_vCommunities.clear(); - m_CommunityServersByAddr.clear(); - - if(!m_pDDNetInfo) - { - return; - } - - const json_value &Communities = (*m_pDDNetInfo)["communities"]; - if(Communities.type != json_array) - { - return; - } - - for(unsigned CommunityIndex = 0; CommunityIndex < Communities.u.array.length; ++CommunityIndex) - { - const json_value &Community = Communities[CommunityIndex]; - if(Community.type != json_object) - { - log_error("serverbrowser", "invalid community (CommunityIndex=%d)", (int)CommunityIndex); - continue; - } - const json_value &Id = Community["id"]; - if(Id.type != json_string) - { - log_error("serverbrowser", "invalid community id (CommunityIndex=%d)", (int)CommunityIndex); - continue; - } - const json_value &Icon = Community["icon"]; - const json_value &IconSha256 = Icon["sha256"]; - const json_value &IconUrl = Icon["url"]; - const json_value &Name = Community["name"]; - const json_value HasFinishes = Community["has_finishes"]; - const json_value *pFinishes = &Community["finishes"]; - const json_value *pServers = &Community["servers"]; - // We accidentally set finishes/servers to be part of icon in - // the past, so support that, too. Can be removed once we make - // a breaking change to the whole thing, necessitating a new - // endpoint. - if(pFinishes->type == json_none) - { - pServers = &Icon["finishes"]; - } - if(pServers->type == json_none) - { - pServers = &Icon["servers"]; - } - // Backward compatibility. - if(pFinishes->type == json_none) - { - if(str_comp(Id, COMMUNITY_DDNET) == 0) - { - pFinishes = &(*m_pDDNetInfo)["maps"]; - } - } - if(pServers->type == json_none) - { - if(str_comp(Id, COMMUNITY_DDNET) == 0) - { - pServers = &(*m_pDDNetInfo)["servers"]; - } - else if(str_comp(Id, "kog") == 0) - { - pServers = &(*m_pDDNetInfo)["servers-kog"]; - } - } - if(false || - Icon.type != json_object || - IconSha256.type != json_string || - IconUrl.type != json_string || - Name.type != json_string || - HasFinishes.type != json_boolean || - (pFinishes->type != json_array && pFinishes->type != json_none) || - pServers->type != json_array) - { - log_error("serverbrowser", "invalid community attribute (CommunityId=%s)", (const char *)Id); - continue; - } - SHA256_DIGEST ParsedIconSha256; - if(sha256_from_str(&ParsedIconSha256, IconSha256) != 0) - { - log_error("serverbrowser", "invalid community icon sha256 (CommunityId=%s)", (const char *)Id); - continue; - } - CCommunity NewCommunity(Id, Name, ParsedIconSha256, IconUrl); - if(!ParseCommunityServers(&NewCommunity, *pServers)) - { - log_error("serverbrowser", "invalid community servers (CommunityId=%s)", NewCommunity.Id()); - continue; - } - NewCommunity.m_HasFinishes = HasFinishes; - if(NewCommunity.m_HasFinishes && pFinishes->type == json_array && !ParseCommunityFinishes(&NewCommunity, *pFinishes)) - { - log_error("serverbrowser", "invalid community finishes (CommunityId=%s)", NewCommunity.Id()); - continue; - } - - for(const auto &Country : NewCommunity.Countries()) - { - for(const auto &Server : Country.Servers()) - { - m_CommunityServersByAddr.emplace(Server.Address(), CCommunityServer(NewCommunity.Id(), Country.Name(), Server.TypeName())); - } - } - m_vCommunities.push_back(std::move(NewCommunity)); - } - - // Add default none community - { - CCommunity NoneCommunity(COMMUNITY_NONE, "None", SHA256_ZEROED, ""); - NoneCommunity.m_vCountries.emplace_back(COMMUNITY_COUNTRY_NONE, -1); - NoneCommunity.m_vTypes.emplace_back(COMMUNITY_TYPE_NONE); - m_vCommunities.push_back(std::move(NoneCommunity)); - } - - // Remove unknown elements from exclude lists - CleanFilters(); -} - -void CServerBrowser::UpdateServerFilteredPlayers(CServerInfo *pInfo) const -{ - pInfo->m_NumFilteredPlayers = g_Config.m_BrFilterSpectators ? pInfo->m_NumPlayers : pInfo->m_NumClients; - if(g_Config.m_BrFilterConnectingPlayers) - { - for(const auto &Client : pInfo->m_aClients) - { - if((!g_Config.m_BrFilterSpectators || Client.m_Player) && str_comp(Client.m_aName, "(connecting)") == 0 && Client.m_aClan[0] == '\0') - pInfo->m_NumFilteredPlayers--; - } - } -} - -void CServerBrowser::UpdateServerFriends(CServerInfo *pInfo) const -{ - pInfo->m_FriendState = IFriends::FRIEND_NO; - pInfo->m_FriendNum = 0; - for(int ClientIndex = 0; ClientIndex < minimum(pInfo->m_NumReceivedClients, (int)MAX_CLIENTS); ClientIndex++) - { - pInfo->m_aClients[ClientIndex].m_FriendState = m_pFriends->GetFriendState(pInfo->m_aClients[ClientIndex].m_aName, pInfo->m_aClients[ClientIndex].m_aClan); - pInfo->m_FriendState = maximum(pInfo->m_FriendState, pInfo->m_aClients[ClientIndex].m_FriendState); - if(pInfo->m_aClients[ClientIndex].m_FriendState != IFriends::FRIEND_NO) - pInfo->m_FriendNum++; - } -} - -void CServerBrowser::UpdateServerCommunity(CServerInfo *pInfo) const -{ - for(int AddressIndex = 0; AddressIndex < pInfo->m_NumAddresses; AddressIndex++) - { - const auto Community = m_CommunityServersByAddr.find(pInfo->m_aAddresses[AddressIndex]); - if(Community != m_CommunityServersByAddr.end()) - { - str_copy(pInfo->m_aCommunityId, Community->second.CommunityId()); - str_copy(pInfo->m_aCommunityCountry, Community->second.CountryName()); - str_copy(pInfo->m_aCommunityType, Community->second.TypeName()); - return; - } - } - str_copy(pInfo->m_aCommunityId, COMMUNITY_NONE); - str_copy(pInfo->m_aCommunityCountry, COMMUNITY_COUNTRY_NONE); - str_copy(pInfo->m_aCommunityType, COMMUNITY_TYPE_NONE); -} - -void CServerBrowser::UpdateServerRank(CServerInfo *pInfo) const -{ - const CCommunity *pCommunity = Community(pInfo->m_aCommunityId); - pInfo->m_HasRank = pCommunity == nullptr ? CServerInfo::RANK_UNAVAILABLE : pCommunity->HasRank(pInfo->m_aMap); -} - -const char *CServerBrowser::GetTutorialServer() -{ - const CCommunity *pCommunity = Community(COMMUNITY_DDNET); - if(pCommunity == nullptr) - return nullptr; - - const char *pBestAddr = nullptr; - int BestLatency = std::numeric_limits::max(); - for(const auto &Country : pCommunity->Countries()) - { - for(const auto &Server : Country.Servers()) - { - if(str_comp(Server.TypeName(), "Tutorial") != 0) - continue; - const CServerEntry *pEntry = Find(Server.Address()); - if(!pEntry) - continue; - if(pEntry->m_Info.m_NumPlayers > pEntry->m_Info.m_MaxPlayers - 10) - continue; - if(pEntry->m_Info.m_Latency >= BestLatency) - continue; - BestLatency = pEntry->m_Info.m_Latency; - pBestAddr = pEntry->m_Info.m_aAddress; - } - } - return pBestAddr; -} - -bool CServerBrowser::IsRefreshing() const -{ - return m_pFirstReqServer != nullptr; -} - -bool CServerBrowser::IsGettingServerlist() const -{ - return m_pHttp->IsRefreshing(); -} - -int CServerBrowser::LoadingProgression() const -{ - if(m_NumServers == 0) - return 0; - - int Servers = m_NumServers; - int Loaded = m_NumServers - m_NumRequests; - return 100.0f * Loaded / Servers; -} - -bool CCommunity::HasCountry(const char *pCountryName) const -{ - return std::find_if(Countries().begin(), Countries().end(), [pCountryName](const auto &Elem) { - return str_comp(Elem.Name(), pCountryName) == 0; - }) != Countries().end(); -} - -bool CCommunity::HasType(const char *pTypeName) const -{ - return std::find_if(Types().begin(), Types().end(), [pTypeName](const auto &Elem) { - return str_comp(Elem.Name(), pTypeName) == 0; - }) != Types().end(); -} - -CServerInfo::ERankState CCommunity::HasRank(const char *pMap) const -{ - if(!HasRanks()) - return CServerInfo::RANK_UNAVAILABLE; - const CCommunityMap Needle(pMap); - return m_FinishedMaps.count(Needle) == 0 ? CServerInfo::RANK_UNRANKED : CServerInfo::RANK_RANKED; -} - -const std::vector &CServerBrowser::Communities() const -{ - return m_vCommunities; -} - -const CCommunity *CServerBrowser::Community(const char *pCommunityId) const -{ - const auto Community = std::find_if(Communities().begin(), Communities().end(), [pCommunityId](const auto &Elem) { - return str_comp(Elem.Id(), pCommunityId) == 0; - }); - return Community == Communities().end() ? nullptr : &(*Community); -} - -std::vector CServerBrowser::SelectedCommunities() const -{ - std::vector vpSelected; - for(const auto &Community : Communities()) - { - if(!CommunitiesFilter().Filtered(Community.Id())) - { - vpSelected.push_back(&Community); - } - } - return vpSelected; -} - -std::vector CServerBrowser::FavoriteCommunities() const -{ - // This is done differently than SelectedCommunities because the favorite - // communities should be returned in the order specified by the user. - std::vector vpFavorites; - for(const auto &CommunityId : FavoriteCommunitiesFilter().Entries()) - { - const CCommunity *pCommunity = Community(CommunityId.Id()); - if(pCommunity) - { - vpFavorites.push_back(pCommunity); - } - } - return vpFavorites; -} - -std::vector CServerBrowser::CurrentCommunities() const -{ - if(m_ServerlistType == IServerBrowser::TYPE_INTERNET || m_ServerlistType == IServerBrowser::TYPE_FAVORITES) - { - return SelectedCommunities(); - } - else if(m_ServerlistType >= IServerBrowser::TYPE_FAVORITE_COMMUNITY_1 && m_ServerlistType <= IServerBrowser::TYPE_FAVORITE_COMMUNITY_5) - { - const size_t CommunityIndex = m_ServerlistType - IServerBrowser::TYPE_FAVORITE_COMMUNITY_1; - std::vector vpFavoriteCommunities = FavoriteCommunities(); - dbg_assert(CommunityIndex < vpFavoriteCommunities.size(), "Invalid favorite community serverbrowser type"); - return {vpFavoriteCommunities[CommunityIndex]}; - } - else - { - return {}; - } -} - -unsigned CServerBrowser::CurrentCommunitiesHash() const -{ - std::vector vpCommunities = CurrentCommunities(); - unsigned Hash = 5381; - for(const CCommunity *pCommunity : CurrentCommunities()) - { - Hash = (Hash << 5) + Hash + str_quickhash(pCommunity->Id()); - } - return Hash; -} - -void CCommunityCache::Update(bool Force) -{ - const unsigned CommunitiesHash = m_pServerBrowser->CurrentCommunitiesHash(); - const bool TypeChanged = m_LastType != m_pServerBrowser->GetCurrentType(); - const bool CurrentCommunitiesChanged = m_LastType == m_pServerBrowser->GetCurrentType() && m_SelectedCommunitiesHash != CommunitiesHash; - if(CurrentCommunitiesChanged && m_pServerBrowser->GetCurrentType() >= IServerBrowser::TYPE_FAVORITE_COMMUNITY_1 && m_pServerBrowser->GetCurrentType() <= IServerBrowser::TYPE_FAVORITE_COMMUNITY_5) - { - // Favorite community was changed while its type is active, - // refresh to get correct serverlist for updated community. - m_pServerBrowser->Refresh(m_pServerBrowser->GetCurrentType(), true); - } - - if(!Force && m_InfoSha256 == m_pServerBrowser->DDNetInfoSha256() && - !CurrentCommunitiesChanged && !TypeChanged) - { - return; - } - - m_InfoSha256 = m_pServerBrowser->DDNetInfoSha256(); - m_LastType = m_pServerBrowser->GetCurrentType(); - m_SelectedCommunitiesHash = CommunitiesHash; - m_vpSelectedCommunities = m_pServerBrowser->CurrentCommunities(); - - m_vpSelectableCountries.clear(); - m_vpSelectableTypes.clear(); - for(const CCommunity *pCommunity : m_vpSelectedCommunities) - { - for(const auto &Country : pCommunity->Countries()) - { - const auto ExistingCountry = std::find_if(m_vpSelectableCountries.begin(), m_vpSelectableCountries.end(), [&](const CCommunityCountry *pOther) { - return str_comp(Country.Name(), pOther->Name()) == 0 && Country.FlagId() == pOther->FlagId(); - }); - if(ExistingCountry == m_vpSelectableCountries.end()) - { - m_vpSelectableCountries.push_back(&Country); - } - } - for(const auto &Type : pCommunity->Types()) - { - const auto ExistingType = std::find_if(m_vpSelectableTypes.begin(), m_vpSelectableTypes.end(), [&](const CCommunityType *pOther) { - return str_comp(Type.Name(), pOther->Name()) == 0; - }); - if(ExistingType == m_vpSelectableTypes.end()) - { - m_vpSelectableTypes.push_back(&Type); - } - } - } - - m_AnyRanksAvailable = std::any_of(m_vpSelectedCommunities.begin(), m_vpSelectedCommunities.end(), [](const CCommunity *pCommunity) { - return pCommunity->HasRanks(); - }); - - // Country/type filters not shown if there are no countries and types, or if only the none-community is selected - m_CountryTypesFilterAvailable = (!m_vpSelectableCountries.empty() || !m_vpSelectableTypes.empty()) && - (m_vpSelectedCommunities.size() != 1 || str_comp(m_vpSelectedCommunities[0]->Id(), IServerBrowser::COMMUNITY_NONE) != 0); - - if(m_pServerBrowser->GetCurrentType() >= IServerBrowser::TYPE_FAVORITE_COMMUNITY_1 && m_pServerBrowser->GetCurrentType() <= IServerBrowser::TYPE_FAVORITE_COMMUNITY_5) - { - const size_t CommunityIndex = m_pServerBrowser->GetCurrentType() - IServerBrowser::TYPE_FAVORITE_COMMUNITY_1; - std::vector vpFavoriteCommunities = m_pServerBrowser->FavoriteCommunities(); - dbg_assert(CommunityIndex < vpFavoriteCommunities.size(), "Invalid favorite community serverbrowser type"); - m_pCountryTypeFilterKey = vpFavoriteCommunities[CommunityIndex]->Id(); - } - else - { - m_pCountryTypeFilterKey = IServerBrowser::COMMUNITY_ALL; - } - - m_pServerBrowser->CleanFilters(); -} - -void CFavoriteCommunityFilterList::Add(const char *pCommunityId) -{ - // Remove community if it's already a favorite, so it will be added again at - // the end of the list, to allow setting the entire list easier with binds. - Remove(pCommunityId); - - // Ensure maximum number of favorite communities, by removing the least-recently - // added community from the beginning, when the maximum number of favorite - // communities has been reached. - constexpr size_t MaxFavoriteCommunities = IServerBrowser::TYPE_FAVORITE_COMMUNITY_5 - IServerBrowser::TYPE_FAVORITE_COMMUNITY_1 + 1; - if(m_vEntries.size() >= MaxFavoriteCommunities) - { - dbg_assert(m_vEntries.size() == MaxFavoriteCommunities, "Maximum number of communities can never be exceeded"); - m_vEntries.erase(m_vEntries.begin()); - } - m_vEntries.emplace_back(pCommunityId); -} - -void CFavoriteCommunityFilterList::Remove(const char *pCommunityId) -{ - auto FoundCommunity = std::find(m_vEntries.begin(), m_vEntries.end(), CCommunityId(pCommunityId)); - if(FoundCommunity != m_vEntries.end()) - { - m_vEntries.erase(FoundCommunity); - } -} - -void CFavoriteCommunityFilterList::Clear() -{ - m_vEntries.clear(); -} - -bool CFavoriteCommunityFilterList::Filtered(const char *pCommunityId) const -{ - return std::find(m_vEntries.begin(), m_vEntries.end(), CCommunityId(pCommunityId)) != m_vEntries.end(); -} - -bool CFavoriteCommunityFilterList::Empty() const -{ - return m_vEntries.empty(); -} - -void CFavoriteCommunityFilterList::Clean(const std::vector &vAllowedCommunities) -{ - auto It = std::remove_if(m_vEntries.begin(), m_vEntries.end(), [&](const auto &Community) { - return std::find_if(vAllowedCommunities.begin(), vAllowedCommunities.end(), [&](const CCommunity &AllowedCommunity) { - return str_comp(Community.Id(), AllowedCommunity.Id()) == 0; - }) == vAllowedCommunities.end(); - }); - m_vEntries.erase(It, m_vEntries.end()); -} - -void CFavoriteCommunityFilterList::Save(IConfigManager *pConfigManager) const -{ - char aBuf[32 + CServerInfo::MAX_COMMUNITY_ID_LENGTH]; - for(const auto &FavoriteCommunity : m_vEntries) - { - str_copy(aBuf, "add_favorite_community \""); - str_append(aBuf, FavoriteCommunity.Id()); - str_append(aBuf, "\""); - pConfigManager->WriteLine(aBuf); - } -} - -const std::vector &CFavoriteCommunityFilterList::Entries() const -{ - return m_vEntries; -} - -template -static bool IsSubsetEquals(const std::vector &vpLeft, const std::unordered_set &Right) -{ - return vpLeft.size() <= Right.size() && std::all_of(vpLeft.begin(), vpLeft.end(), [&](const TNamedElement *pElem) { - return Right.count(TElementName(pElem->Name())) > 0; - }); -} - -void CExcludedCommunityFilterList::Add(const char *pCommunityId) -{ - m_Entries.emplace(pCommunityId); -} - -void CExcludedCommunityFilterList::Remove(const char *pCommunityId) -{ - m_Entries.erase(CCommunityId(pCommunityId)); -} - -void CExcludedCommunityFilterList::Clear() -{ - m_Entries.clear(); -} - -bool CExcludedCommunityFilterList::Filtered(const char *pCommunityId) const -{ - return std::find(m_Entries.begin(), m_Entries.end(), CCommunityId(pCommunityId)) != m_Entries.end(); -} - -bool CExcludedCommunityFilterList::Empty() const -{ - return m_Entries.empty(); -} - -void CExcludedCommunityFilterList::Clean(const std::vector &vAllowedCommunities) -{ - for(auto It = m_Entries.begin(); It != m_Entries.end();) - { - const bool Found = std::find_if(vAllowedCommunities.begin(), vAllowedCommunities.end(), [&](const CCommunity &AllowedCommunity) { - return str_comp(It->Id(), AllowedCommunity.Id()) == 0; - }) != vAllowedCommunities.end(); - if(Found) - { - ++It; - } - else - { - It = m_Entries.erase(It); - } - } - // Prevent filter that would exclude all allowed communities - if(m_Entries.size() == vAllowedCommunities.size()) - { - m_Entries.clear(); - } -} - -void CExcludedCommunityFilterList::Save(IConfigManager *pConfigManager) const -{ - char aBuf[32 + CServerInfo::MAX_COMMUNITY_ID_LENGTH]; - for(const auto &ExcludedCommunity : m_Entries) - { - str_copy(aBuf, "add_excluded_community \""); - str_append(aBuf, ExcludedCommunity.Id()); - str_append(aBuf, "\""); - pConfigManager->WriteLine(aBuf); - } -} - -void CExcludedCommunityCountryFilterList::Add(const char *pCountryName) -{ - // Handle special case that all selectable entries are currently filtered, - // where adding more entries to the exclusion list would have no effect. - auto CommunityEntry = m_Entries.find(m_pCommunityCache->CountryTypeFilterKey()); - if(CommunityEntry != m_Entries.end() && IsSubsetEquals(m_pCommunityCache->SelectableCountries(), CommunityEntry->second)) - { - for(const CCommunityCountry *pSelectableCountry : m_pCommunityCache->SelectableCountries()) - { - CommunityEntry->second.erase(pSelectableCountry->Name()); - } - } - - Add(m_pCommunityCache->CountryTypeFilterKey(), pCountryName); -} - -void CExcludedCommunityCountryFilterList::Add(const char *pCommunityId, const char *pCountryName) -{ - CCommunityId CommunityId(pCommunityId); - if(m_Entries.find(CommunityId) == m_Entries.end()) - { - m_Entries[CommunityId] = {}; - } - m_Entries[CommunityId].emplace(pCountryName); -} - -void CExcludedCommunityCountryFilterList::Remove(const char *pCountryName) -{ - Remove(m_pCommunityCache->CountryTypeFilterKey(), pCountryName); -} - -void CExcludedCommunityCountryFilterList::Remove(const char *pCommunityId, const char *pCountryName) -{ - auto CommunityEntry = m_Entries.find(CCommunityId(pCommunityId)); - if(CommunityEntry != m_Entries.end()) - { - CommunityEntry->second.erase(pCountryName); - } -} - -void CExcludedCommunityCountryFilterList::Clear() -{ - auto CommunityEntry = m_Entries.find(m_pCommunityCache->CountryTypeFilterKey()); - if(CommunityEntry != m_Entries.end()) - { - CommunityEntry->second.clear(); - } -} - -bool CExcludedCommunityCountryFilterList::Filtered(const char *pCountryName) const -{ - auto CommunityEntry = m_Entries.find(CCommunityId(m_pCommunityCache->CountryTypeFilterKey())); - if(CommunityEntry == m_Entries.end()) - return false; - - const auto &CountryEntries = CommunityEntry->second; - return !IsSubsetEquals(m_pCommunityCache->SelectableCountries(), CountryEntries) && - CountryEntries.find(CCommunityCountryName(pCountryName)) != CountryEntries.end(); -} - -bool CExcludedCommunityCountryFilterList::Empty() const -{ - auto CommunityEntry = m_Entries.find(CCommunityId(m_pCommunityCache->CountryTypeFilterKey())); - return CommunityEntry == m_Entries.end() || - CommunityEntry->second.empty() || - IsSubsetEquals(m_pCommunityCache->SelectableCountries(), CommunityEntry->second); -} - -void CExcludedCommunityCountryFilterList::Clean(const std::vector &vAllowedCommunities) -{ - for(auto It = m_Entries.begin(); It != m_Entries.end();) - { - const bool AllEntry = str_comp(It->first.Id(), IServerBrowser::COMMUNITY_ALL) == 0; - const bool Found = AllEntry || std::find_if(vAllowedCommunities.begin(), vAllowedCommunities.end(), [&](const CCommunity &AllowedCommunity) { - return str_comp(It->first.Id(), AllowedCommunity.Id()) == 0; - }) != vAllowedCommunities.end(); - if(Found) - { - ++It; - } - else - { - It = m_Entries.erase(It); - } - } - - for(const CCommunity &AllowedCommunity : vAllowedCommunities) - { - auto CommunityEntry = m_Entries.find(CCommunityId(AllowedCommunity.Id())); - if(CommunityEntry != m_Entries.end()) - { - auto &CountryEntries = CommunityEntry->second; - for(auto It = CountryEntries.begin(); It != CountryEntries.end();) - { - if(AllowedCommunity.HasCountry(It->Name())) - { - ++It; - } - else - { - It = CountryEntries.erase(It); - } - } - // Prevent filter that would exclude all allowed countries - if(CountryEntries.size() == AllowedCommunity.Countries().size()) - { - CountryEntries.clear(); - } - } - } - - auto AllCommunityEntry = m_Entries.find(CCommunityId(IServerBrowser::COMMUNITY_ALL)); - if(AllCommunityEntry != m_Entries.end()) - { - auto &CountryEntries = AllCommunityEntry->second; - for(auto It = CountryEntries.begin(); It != CountryEntries.end();) - { - if(std::any_of(vAllowedCommunities.begin(), vAllowedCommunities.end(), [&](const auto &Community) { return Community.HasCountry(It->Name()); })) - { - ++It; - } - else - { - It = CountryEntries.erase(It); - } - } - // Prevent filter that would exclude all allowed countries - std::unordered_set UniqueCountries; - for(const CCommunity &AllowedCommunity : vAllowedCommunities) - { - for(const CCommunityCountry &Country : AllowedCommunity.Countries()) - { - UniqueCountries.emplace(Country.Name()); - } - } - if(CountryEntries.size() == UniqueCountries.size()) - { - CountryEntries.clear(); - } - } -} - -void CExcludedCommunityCountryFilterList::Save(IConfigManager *pConfigManager) const -{ - char aBuf[32 + CServerInfo::MAX_COMMUNITY_ID_LENGTH + CServerInfo::MAX_COMMUNITY_COUNTRY_LENGTH]; - for(const auto &[Community, Countries] : m_Entries) - { - for(const auto &Country : Countries) - { - str_copy(aBuf, "add_excluded_country \""); - str_append(aBuf, Community.Id()); - str_append(aBuf, "\" \""); - str_append(aBuf, Country.Name()); - str_append(aBuf, "\""); - pConfigManager->WriteLine(aBuf); - } - } -} - -void CExcludedCommunityTypeFilterList::Add(const char *pTypeName) -{ - // Handle special case that all selectable entries are currently filtered, - // where adding more entries to the exclusion list would have no effect. - auto CommunityEntry = m_Entries.find(m_pCommunityCache->CountryTypeFilterKey()); - if(CommunityEntry != m_Entries.end() && IsSubsetEquals(m_pCommunityCache->SelectableTypes(), CommunityEntry->second)) - { - for(const CCommunityType *pSelectableType : m_pCommunityCache->SelectableTypes()) - { - CommunityEntry->second.erase(pSelectableType->Name()); - } - } - - Add(m_pCommunityCache->CountryTypeFilterKey(), pTypeName); -} - -void CExcludedCommunityTypeFilterList::Add(const char *pCommunityId, const char *pTypeName) -{ - CCommunityId CommunityId(pCommunityId); - if(m_Entries.find(CommunityId) == m_Entries.end()) - { - m_Entries[CommunityId] = {}; - } - m_Entries[CommunityId].emplace(pTypeName); -} - -void CExcludedCommunityTypeFilterList::Remove(const char *pTypeName) -{ - Remove(m_pCommunityCache->CountryTypeFilterKey(), pTypeName); -} - -void CExcludedCommunityTypeFilterList::Remove(const char *pCommunityId, const char *pTypeName) -{ - auto CommunityEntry = m_Entries.find(CCommunityId(pCommunityId)); - if(CommunityEntry != m_Entries.end()) - { - CommunityEntry->second.erase(pTypeName); - } -} - -void CExcludedCommunityTypeFilterList::Clear() -{ - auto CommunityEntry = m_Entries.find(m_pCommunityCache->CountryTypeFilterKey()); - if(CommunityEntry != m_Entries.end()) - { - CommunityEntry->second.clear(); - } -} - -bool CExcludedCommunityTypeFilterList::Filtered(const char *pTypeName) const -{ - auto CommunityEntry = m_Entries.find(CCommunityId(m_pCommunityCache->CountryTypeFilterKey())); - if(CommunityEntry == m_Entries.end()) - return false; - - const auto &TypeEntries = CommunityEntry->second; - return !IsSubsetEquals(m_pCommunityCache->SelectableTypes(), TypeEntries) && - TypeEntries.find(CCommunityTypeName(pTypeName)) != TypeEntries.end(); -} - -bool CExcludedCommunityTypeFilterList::Empty() const -{ - auto CommunityEntry = m_Entries.find(CCommunityId(m_pCommunityCache->CountryTypeFilterKey())); - return CommunityEntry == m_Entries.end() || - CommunityEntry->second.empty() || - IsSubsetEquals(m_pCommunityCache->SelectableTypes(), CommunityEntry->second); -} - -void CExcludedCommunityTypeFilterList::Clean(const std::vector &vAllowedCommunities) -{ - for(auto It = m_Entries.begin(); It != m_Entries.end();) - { - const bool AllEntry = str_comp(It->first.Id(), IServerBrowser::COMMUNITY_ALL) == 0; - const bool Found = AllEntry || std::find_if(vAllowedCommunities.begin(), vAllowedCommunities.end(), [&](const CCommunity &AllowedCommunity) { - return str_comp(It->first.Id(), AllowedCommunity.Id()) == 0; - }) != vAllowedCommunities.end(); - if(Found) - { - ++It; - } - else - { - It = m_Entries.erase(It); - } - } - - for(const CCommunity &AllowedCommunity : vAllowedCommunities) - { - auto CommunityEntry = m_Entries.find(CCommunityId(AllowedCommunity.Id())); - if(CommunityEntry != m_Entries.end()) - { - auto &TypeEntries = CommunityEntry->second; - for(auto It = TypeEntries.begin(); It != TypeEntries.end();) - { - if(AllowedCommunity.HasType(It->Name())) - { - ++It; - } - else - { - It = TypeEntries.erase(It); - } - } - // Prevent filter that would exclude all allowed types - if(TypeEntries.size() == AllowedCommunity.Types().size()) - { - TypeEntries.clear(); - } - } - } - - auto AllCommunityEntry = m_Entries.find(CCommunityId(IServerBrowser::COMMUNITY_ALL)); - if(AllCommunityEntry != m_Entries.end()) - { - auto &TypeEntries = AllCommunityEntry->second; - for(auto It = TypeEntries.begin(); It != TypeEntries.end();) - { - if(std::any_of(vAllowedCommunities.begin(), vAllowedCommunities.end(), [&](const auto &Community) { return Community.HasType(It->Name()); })) - { - ++It; - } - else - { - It = TypeEntries.erase(It); - } - } - // Prevent filter that would exclude all allowed types - std::unordered_set UniqueTypes; - for(const CCommunity &AllowedCommunity : vAllowedCommunities) - { - for(const CCommunityType &Type : AllowedCommunity.Types()) - { - UniqueTypes.emplace(Type.Name()); - } - } - if(TypeEntries.size() == UniqueTypes.size()) - { - TypeEntries.clear(); - } - } -} - -void CExcludedCommunityTypeFilterList::Save(IConfigManager *pConfigManager) const -{ - char aBuf[32 + CServerInfo::MAX_COMMUNITY_ID_LENGTH + CServerInfo::MAX_COMMUNITY_TYPE_LENGTH]; - for(const auto &[Community, Types] : m_Entries) - { - for(const auto &Type : Types) - { - str_copy(aBuf, "add_excluded_type \""); - str_append(aBuf, Community.Id()); - str_append(aBuf, "\" \""); - str_append(aBuf, Type.Name()); - str_append(aBuf, "\""); - pConfigManager->WriteLine(aBuf); - } - } -} - -void CServerBrowser::CleanFilters() -{ - // Keep filters if we failed to load any communities - if(Communities().empty()) - return; - FavoriteCommunitiesFilter().Clean(Communities()); - CommunitiesFilter().Clean(Communities()); - CountriesFilter().Clean(Communities()); - TypesFilter().Clean(Communities()); -} - -bool CServerBrowser::IsRegistered(const NETADDR &Addr) -{ - const int NumServers = m_pHttp->NumServers(); - for(int i = 0; i < NumServers; i++) - { - const CServerInfo &Info = m_pHttp->Server(i); - for(int j = 0; j < Info.m_NumAddresses; j++) - { - if(net_addr_comp(&Info.m_aAddresses[j], &Addr) == 0) - { - return true; - } - } - } - return false; -} - -int CServerInfo::EstimateLatency(int Loc1, int Loc2) -{ - if(Loc1 == LOC_UNKNOWN || Loc2 == LOC_UNKNOWN) - { - return 999; - } - if(Loc1 != Loc2) - { - return 199; - } - return 99; -} - -bool CServerInfo::ParseLocation(int *pResult, const char *pString) -{ - *pResult = LOC_UNKNOWN; - int Length = str_length(pString); - if(Length < 2) - { - return true; - } - // ISO continent code. Allow antarctica, but treat it as unknown. - static const char s_apLocations[NUM_LOCS][6] = { - "an", // LOC_UNKNOWN - "af", // LOC_AFRICA - "as", // LOC_ASIA - "oc", // LOC_AUSTRALIA - "eu", // LOC_EUROPE - "na", // LOC_NORTH_AMERICA - "sa", // LOC_SOUTH_AMERICA - "as:cn", // LOC_CHINA - }; - for(int i = std::size(s_apLocations) - 1; i >= 0; i--) - { - if(str_startswith(pString, s_apLocations[i])) - { - *pResult = i; - return false; - } - } - return true; -} diff --git a/src/engine/client/serverbrowser.h b/src/engine/client/serverbrowser.h deleted file mode 100644 index e54f2efd66..0000000000 --- a/src/engine/client/serverbrowser.h +++ /dev/null @@ -1,408 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef ENGINE_CLIENT_SERVERBROWSER_H -#define ENGINE_CLIENT_SERVERBROWSER_H - -#include -#include - -#include -#include -#include - -#include -#include -#include - -typedef struct _json_value json_value; -class CNetClient; -class IConfigManager; -class IConsole; -class IEngine; -class IFavorites; -class IFriends; -class IServerBrowserHttp; -class IServerBrowserPingCache; -class IStorage; -class IHttp; - -class CCommunityId -{ - char m_aId[CServerInfo::MAX_COMMUNITY_ID_LENGTH]; - -public: - CCommunityId(const char *pCommunityId) - { - str_copy(m_aId, pCommunityId); - } - - const char *Id() const { return m_aId; } - - bool operator==(const CCommunityId &Other) const - { - return str_comp(Id(), Other.Id()) == 0; - } -}; - -template<> -struct std::hash -{ - size_t operator()(const CCommunityId &Elem) const noexcept - { - return str_quickhash(Elem.Id()); - } -}; - -class CCommunityCountryName -{ - char m_aName[CServerInfo::MAX_COMMUNITY_COUNTRY_LENGTH]; - -public: - CCommunityCountryName(const char *pCountryName) - { - str_copy(m_aName, pCountryName); - } - - const char *Name() const { return m_aName; } - - bool operator==(const CCommunityCountryName &Other) const - { - return str_comp(Name(), Other.Name()) == 0; - } -}; - -template<> -struct std::hash -{ - size_t operator()(const CCommunityCountryName &Elem) const noexcept - { - return str_quickhash(Elem.Name()); - } -}; - -class CCommunityTypeName -{ - char m_aName[CServerInfo::MAX_COMMUNITY_TYPE_LENGTH]; - -public: - CCommunityTypeName(const char *pTypeName) - { - str_copy(m_aName, pTypeName); - } - - const char *Name() const { return m_aName; } - - bool operator==(const CCommunityTypeName &Other) const - { - return str_comp(Name(), Other.Name()) == 0; - } -}; - -template<> -struct std::hash -{ - size_t operator()(const CCommunityTypeName &Elem) const noexcept - { - return str_quickhash(Elem.Name()); - } -}; - -class CCommunityServer -{ - char m_aCommunityId[CServerInfo::MAX_COMMUNITY_ID_LENGTH]; - char m_aCountryName[CServerInfo::MAX_COMMUNITY_COUNTRY_LENGTH]; - char m_aTypeName[CServerInfo::MAX_COMMUNITY_TYPE_LENGTH]; - -public: - CCommunityServer(const char *pCommunityId, const char *pCountryName, const char *pTypeName) - { - str_copy(m_aCommunityId, pCommunityId); - str_copy(m_aCountryName, pCountryName); - str_copy(m_aTypeName, pTypeName); - } - - const char *CommunityId() const { return m_aCommunityId; } - const char *CountryName() const { return m_aCountryName; } - const char *TypeName() const { return m_aTypeName; } -}; - -class CFavoriteCommunityFilterList : public IFilterList -{ -public: - void Add(const char *pCommunityId) override; - void Remove(const char *pCommunityId) override; - void Clear() override; - bool Filtered(const char *pCommunityId) const override; - bool Empty() const override; - void Clean(const std::vector &vAllowedCommunities); - void Save(IConfigManager *pConfigManager) const; - const std::vector &Entries() const; - -private: - std::vector m_vEntries; -}; - -class CExcludedCommunityFilterList : public IFilterList -{ -public: - void Add(const char *pCommunityId) override; - void Remove(const char *pCommunityId) override; - void Clear() override; - bool Filtered(const char *pCommunityId) const override; - bool Empty() const override; - void Clean(const std::vector &vAllowedCommunities); - void Save(IConfigManager *pConfigManager) const; - -private: - std::unordered_set m_Entries; -}; - -class CExcludedCommunityCountryFilterList : public IFilterList -{ -public: - CExcludedCommunityCountryFilterList(const ICommunityCache *pCommunityCache) : - m_pCommunityCache(pCommunityCache) - { - } - - void Add(const char *pCountryName) override; - void Add(const char *pCommunityId, const char *pCountryName); - void Remove(const char *pCountryName) override; - void Remove(const char *pCommunityId, const char *pCountryName); - void Clear() override; - bool Filtered(const char *pCountryName) const override; - bool Empty() const override; - void Clean(const std::vector &vAllowedCommunities); - void Save(IConfigManager *pConfigManager) const; - -private: - const ICommunityCache *m_pCommunityCache; - std::unordered_map> m_Entries; -}; - -class CExcludedCommunityTypeFilterList : public IFilterList -{ -public: - CExcludedCommunityTypeFilterList(const ICommunityCache *pCommunityCache) : - m_pCommunityCache(pCommunityCache) - { - } - - void Add(const char *pTypeName) override; - void Add(const char *pCommunityId, const char *pTypeName); - void Remove(const char *pTypeName) override; - void Remove(const char *pCommunityId, const char *pTypeName); - void Clear() override; - bool Filtered(const char *pTypeName) const override; - bool Empty() const override; - void Clean(const std::vector &vAllowedCommunities); - void Save(IConfigManager *pConfigManager) const; - -private: - const ICommunityCache *m_pCommunityCache; - std::unordered_map> m_Entries; -}; - -class CCommunityCache : public ICommunityCache -{ - IServerBrowser *m_pServerBrowser; - SHA256_DIGEST m_InfoSha256 = SHA256_ZEROED; - int m_LastType = IServerBrowser::NUM_TYPES; // initial value does not appear normally, marking uninitialized cache - unsigned m_SelectedCommunitiesHash = 0; - std::vector m_vpSelectedCommunities; - std::vector m_vpSelectableCountries; - std::vector m_vpSelectableTypes; - bool m_AnyRanksAvailable = false; - bool m_CountryTypesFilterAvailable = false; - const char *m_pCountryTypeFilterKey = IServerBrowser::COMMUNITY_ALL; - -public: - CCommunityCache(IServerBrowser *pServerBrowser) : - m_pServerBrowser(pServerBrowser) - { - } - - void Update(bool Force) override; - const std::vector &SelectedCommunities() const override { return m_vpSelectedCommunities; } - const std::vector &SelectableCountries() const override { return m_vpSelectableCountries; } - const std::vector &SelectableTypes() const override { return m_vpSelectableTypes; } - bool AnyRanksAvailable() const override { return m_AnyRanksAvailable; } - bool CountriesTypesFilterAvailable() const override { return m_CountryTypesFilterAvailable; } - const char *CountryTypeFilterKey() const override { return m_pCountryTypeFilterKey; } -}; - -class CServerBrowser : public IServerBrowser -{ -public: - CServerBrowser(); - virtual ~CServerBrowser(); - - // interface functions - void Refresh(int Type, bool Force = false) override; - bool IsRefreshing() const override; - bool IsGettingServerlist() const override; - int LoadingProgression() const override; - void RequestResort() { m_NeedResort = true; } - - int NumServers() const override { return m_NumServers; } - int Players(const CServerInfo &Item) const override; - int Max(const CServerInfo &Item) const override; - int NumSortedServers() const override { return m_NumSortedServers; } - int NumSortedPlayers() const override { return m_NumSortedPlayers; } - const CServerInfo *SortedGet(int Index) const override; - - const json_value *LoadDDNetInfo(); - void LoadDDNetInfoJson(); - void LoadDDNetLocation(); - void LoadDDNetServers(); - void UpdateServerFilteredPlayers(CServerInfo *pInfo) const; - void UpdateServerFriends(CServerInfo *pInfo) const; - void UpdateServerCommunity(CServerInfo *pInfo) const; - void UpdateServerRank(CServerInfo *pInfo) const; - const char *GetTutorialServer() override; - - const std::vector &Communities() const override; - const CCommunity *Community(const char *pCommunityId) const override; - std::vector SelectedCommunities() const override; - std::vector FavoriteCommunities() const override; - std::vector CurrentCommunities() const override; - unsigned CurrentCommunitiesHash() const override; - - bool DDNetInfoAvailable() const override { return m_pDDNetInfo != nullptr; } - SHA256_DIGEST DDNetInfoSha256() const override { return m_DDNetInfoSha256; } - - ICommunityCache &CommunityCache() override { return m_CommunityCache; } - const ICommunityCache &CommunityCache() const override { return m_CommunityCache; } - CFavoriteCommunityFilterList &FavoriteCommunitiesFilter() override { return m_FavoriteCommunitiesFilter; } - CExcludedCommunityFilterList &CommunitiesFilter() override { return m_CommunitiesFilter; } - CExcludedCommunityCountryFilterList &CountriesFilter() override { return m_CountriesFilter; } - CExcludedCommunityTypeFilterList &TypesFilter() override { return m_TypesFilter; } - const CFavoriteCommunityFilterList &FavoriteCommunitiesFilter() const override { return m_FavoriteCommunitiesFilter; } - const CExcludedCommunityFilterList &CommunitiesFilter() const override { return m_CommunitiesFilter; } - const CExcludedCommunityCountryFilterList &CountriesFilter() const override { return m_CountriesFilter; } - const CExcludedCommunityTypeFilterList &TypesFilter() const override { return m_TypesFilter; } - void CleanFilters() override; - - // - void Update(); - void OnServerInfoUpdate(const NETADDR &Addr, int Token, const CServerInfo *pInfo); - void SetHttpInfo(const CServerInfo *pInfo); - void RequestCurrentServer(const NETADDR &Addr) const; - void RequestCurrentServerWithRandomToken(const NETADDR &Addr, int *pBasicToken, int *pToken) const; - void SetCurrentServerPing(const NETADDR &Addr, int Ping); - - void SetBaseInfo(class CNetClient *pClient, const char *pNetVersion); - void OnInit(); - - void QueueRequest(CServerEntry *pEntry); - CServerEntry *Find(const NETADDR &Addr) override; - int GetCurrentType() override { return m_ServerlistType; } - bool IsRegistered(const NETADDR &Addr); - -private: - CNetClient *m_pNetClient = nullptr; - IConfigManager *m_pConfigManager = nullptr; - IConsole *m_pConsole = nullptr; - IEngine *m_pEngine = nullptr; - IFriends *m_pFriends = nullptr; - IFavorites *m_pFavorites = nullptr; - IStorage *m_pStorage = nullptr; - IHttp *m_pHttpClient = nullptr; - char m_aNetVersion[128]; - - bool m_RefreshingHttp = false; - IServerBrowserHttp *m_pHttp = nullptr; - IServerBrowserPingCache *m_pPingCache = nullptr; - const char *m_pHttpPrevBestUrl = nullptr; - - CHeap m_ServerlistHeap; - CServerEntry **m_ppServerlist; - int *m_pSortedServerlist; - std::unordered_map m_ByAddr; - - std::vector m_vCommunities; - std::unordered_map m_CommunityServersByAddr; - - int m_OwnLocation = CServerInfo::LOC_UNKNOWN; - - CCommunityCache m_CommunityCache; - CFavoriteCommunityFilterList m_FavoriteCommunitiesFilter; - CExcludedCommunityFilterList m_CommunitiesFilter; - CExcludedCommunityCountryFilterList m_CountriesFilter; - CExcludedCommunityTypeFilterList m_TypesFilter; - - json_value *m_pDDNetInfo = nullptr; - SHA256_DIGEST m_DDNetInfoSha256 = SHA256_ZEROED; - - CServerEntry *m_pFirstReqServer; // request list - CServerEntry *m_pLastReqServer; - int m_NumRequests; - - bool m_NeedResort; - int m_Sorthash; - - // used instead of g_Config.br_max_requests to get more servers - int m_CurrentMaxRequests; - - int m_NumSortedServers; - int m_NumSortedServersCapacity; - int m_NumSortedPlayers; - int m_NumServers; - int m_NumServerCapacity; - - int m_ServerlistType; - int64_t m_BroadcastTime; - unsigned char m_aTokenSeed[16]; - - int GenerateToken(const NETADDR &Addr) const; - static int GetBasicToken(int Token); - static int GetExtraToken(int Token); - - // sorting criteria - bool SortCompareName(int Index1, int Index2) const; - bool SortCompareMap(int Index1, int Index2) const; - bool SortComparePing(int Index1, int Index2) const; - bool SortCompareGametype(int Index1, int Index2) const; - bool SortCompareNumPlayers(int Index1, int Index2) const; - bool SortCompareNumClients(int Index1, int Index2) const; - bool SortCompareNumFriends(int Index1, int Index2) const; - bool SortCompareNumPlayersAndPing(int Index1, int Index2) const; - - // - void Filter(); - void Sort(); - int SortHash() const; - - void CleanUp(); - - void UpdateFromHttp(); - CServerEntry *Add(const NETADDR *pAddrs, int NumAddrs); - - void RemoveRequest(CServerEntry *pEntry); - - void RequestImpl(const NETADDR &Addr, CServerEntry *pEntry, int *pBasicToken, int *pToken, bool RandomToken) const; - - void RegisterCommands(); - static void ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData); - static void Con_AddFavoriteCommunity(IConsole::IResult *pResult, void *pUserData); - static void Con_RemoveFavoriteCommunity(IConsole::IResult *pResult, void *pUserData); - static void Con_AddExcludedCommunity(IConsole::IResult *pResult, void *pUserData); - static void Con_RemoveExcludedCommunity(IConsole::IResult *pResult, void *pUserData); - static void Con_AddExcludedCountry(IConsole::IResult *pResult, void *pUserData); - static void Con_RemoveExcludedCountry(IConsole::IResult *pResult, void *pUserData); - static void Con_AddExcludedType(IConsole::IResult *pResult, void *pUserData); - static void Con_RemoveExcludedType(IConsole::IResult *pResult, void *pUserData); - static void Con_LeakIpAddress(IConsole::IResult *pResult, void *pUserData); - - bool ValidateCommunityId(const char *pCommunityId) const; - bool ValidateCountryName(const char *pCountryName) const; - bool ValidateTypeName(const char *pTypeName) const; - - void SetInfo(CServerEntry *pEntry, const CServerInfo &Info) const; - void SetLatency(NETADDR Addr, int Latency); - - static bool ParseCommunityFinishes(CCommunity *pCommunity, const json_value &Finishes); - static bool ParseCommunityServers(CCommunity *pCommunity, const json_value &Servers); -}; - -#endif diff --git a/src/engine/client/serverbrowser_http.cpp b/src/engine/client/serverbrowser_http.cpp deleted file mode 100644 index 64870d7a98..0000000000 --- a/src/engine/client/serverbrowser_http.cpp +++ /dev/null @@ -1,565 +0,0 @@ -#include "serverbrowser_http.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include - -using namespace std::chrono_literals; - -static int SanitizeAge(std::optional Age) -{ - // A year is of course pi*10**7 seconds. - if(!(Age && 0 <= *Age && *Age < 31415927)) - { - return 31415927; - } - return *Age; -} - -// Classify HTTP responses into buckets, treat 15 seconds as fresh, 1 minute as -// less fresh, etc. This ensures that differences in the order of seconds do -// not affect master choice. -static int ClassifyAge(int AgeSeconds) -{ - return 0 // - + (AgeSeconds >= 15) // 15 seconds - + (AgeSeconds >= 60) // 1 minute - + (AgeSeconds >= 300) // 5 minutes - + (AgeSeconds / 3600); // 1 hour -} - -class CChooseMaster -{ -public: - typedef bool (*VALIDATOR)(json_value *pJson); - - enum - { - MAX_URLS = 16, - }; - CChooseMaster(IEngine *pEngine, IHttp *pHttp, VALIDATOR pfnValidator, const char **ppUrls, int NumUrls, int PreviousBestIndex); - virtual ~CChooseMaster(); - - bool GetBestUrl(const char **pBestUrl) const; - void Reset(); - bool IsRefreshing() const { return m_pJob && !m_pJob->Done(); } - void Refresh(); - -private: - int GetBestIndex() const; - - class CData - { - public: - std::atomic_int m_BestIndex{-1}; - // Constant after construction. - VALIDATOR m_pfnValidator; - int m_NumUrls; - char m_aaUrls[MAX_URLS][256]; - }; - class CJob : public IJob - { - CChooseMaster *m_pParent; - CLock m_Lock; - std::shared_ptr m_pData; - std::shared_ptr m_pHead; - std::shared_ptr m_pGet; - void Run() override REQUIRES(!m_Lock); - - public: - CJob(CChooseMaster *pParent, std::shared_ptr pData) : - m_pParent(pParent), - m_pData(std::move(pData)) - { - Abortable(true); - } - bool Abort() override REQUIRES(!m_Lock); - }; - - IEngine *m_pEngine; - IHttp *m_pHttp; - int m_PreviousBestIndex; - std::shared_ptr m_pData; - std::shared_ptr m_pJob; -}; - -CChooseMaster::CChooseMaster(IEngine *pEngine, IHttp *pHttp, VALIDATOR pfnValidator, const char **ppUrls, int NumUrls, int PreviousBestIndex) : - m_pEngine(pEngine), - m_pHttp(pHttp), - m_PreviousBestIndex(PreviousBestIndex) -{ - dbg_assert(NumUrls >= 0, "no master URLs"); - dbg_assert(NumUrls <= MAX_URLS, "too many master URLs"); - dbg_assert(PreviousBestIndex >= -1, "previous best index negative and not -1"); - dbg_assert(PreviousBestIndex < NumUrls, "previous best index too high"); - m_pData = std::make_shared(); - m_pData->m_pfnValidator = pfnValidator; - m_pData->m_NumUrls = NumUrls; - for(int i = 0; i < m_pData->m_NumUrls; i++) - { - str_copy(m_pData->m_aaUrls[i], ppUrls[i]); - } -} - -CChooseMaster::~CChooseMaster() -{ - if(m_pJob) - { - m_pJob->Abort(); - } -} - -int CChooseMaster::GetBestIndex() const -{ - int BestIndex = m_pData->m_BestIndex.load(); - if(BestIndex >= 0) - { - return BestIndex; - } - else - { - return m_PreviousBestIndex; - } -} - -bool CChooseMaster::GetBestUrl(const char **ppBestUrl) const -{ - int Index = GetBestIndex(); - if(Index < 0) - { - *ppBestUrl = nullptr; - return true; - } - *ppBestUrl = m_pData->m_aaUrls[Index]; - return false; -} - -void CChooseMaster::Reset() -{ - m_PreviousBestIndex = -1; - m_pData->m_BestIndex.store(-1); -} - -void CChooseMaster::Refresh() -{ - if(m_pJob == nullptr || m_pJob->State() == IJob::STATE_DONE) - { - m_pJob = std::make_shared(this, m_pData); - m_pEngine->AddJob(m_pJob); - } -} - -bool CChooseMaster::CJob::Abort() -{ - if(!IJob::Abort()) - { - return false; - } - - CLockScope ls(m_Lock); - if(m_pHead != nullptr) - { - m_pHead->Abort(); - } - - if(m_pGet != nullptr) - { - m_pGet->Abort(); - } - - return true; -} - -void CChooseMaster::CJob::Run() -{ - // Check masters in a random order. - int aRandomized[MAX_URLS] = {0}; - for(int i = 0; i < m_pData->m_NumUrls; i++) - { - aRandomized[i] = i; - } - // https://en.wikipedia.org/w/index.php?title=Fisher%E2%80%93Yates_shuffle&oldid=1002922479#The_modern_algorithm - // The equivalent version. - for(int i = 0; i <= m_pData->m_NumUrls - 2; i++) - { - int j = i + secure_rand_below(m_pData->m_NumUrls - i); - std::swap(aRandomized[i], aRandomized[j]); - } - // Do a HEAD request to ensure that a connection is established and - // then do a GET request to check how fast we can get the server list. - // - // 10 seconds connection timeout, lower than 8KB/s for 10 seconds to - // fail. - CTimeout Timeout{10000, 0, 8000, 10}; - int aTimeMs[MAX_URLS]; - int aAgeS[MAX_URLS]; - for(int i = 0; i < m_pData->m_NumUrls; i++) - { - aTimeMs[i] = -1; - aAgeS[i] = SanitizeAge({}); - const char *pUrl = m_pData->m_aaUrls[aRandomized[i]]; - std::shared_ptr pHead = HttpHead(pUrl); - pHead->Timeout(Timeout); - pHead->LogProgress(HTTPLOG::FAILURE); - { - CLockScope ls(m_Lock); - m_pHead = pHead; - } - - m_pParent->m_pHttp->Run(pHead); - pHead->Wait(); - if(pHead->State() == EHttpState::ABORTED || State() == IJob::STATE_ABORTED) - { - log_debug("serverbrowser_http", "master chooser aborted"); - return; - } - if(pHead->State() != EHttpState::DONE) - { - continue; - } - - auto StartTime = time_get_nanoseconds(); - std::shared_ptr pGet = HttpGet(pUrl); - pGet->Timeout(Timeout); - pGet->LogProgress(HTTPLOG::FAILURE); - { - CLockScope ls(m_Lock); - m_pGet = pGet; - } - - m_pParent->m_pHttp->Run(pGet); - pGet->Wait(); - - auto Time = std::chrono::duration_cast(time_get_nanoseconds() - StartTime); - if(pGet->State() == EHttpState::ABORTED || State() == IJob::STATE_ABORTED) - { - log_debug("serverbrowser_http", "master chooser aborted"); - return; - } - if(pGet->State() != EHttpState::DONE) - { - continue; - } - json_value *pJson = pGet->ResultJson(); - if(!pJson) - { - continue; - } - - bool ParseFailure = m_pData->m_pfnValidator(pJson); - json_value_free(pJson); - if(ParseFailure) - { - continue; - } - int AgeS = SanitizeAge(pGet->ResultAgeSeconds()); - log_info("serverbrowser_http", "found master, url='%s' time=%dms age=%ds", pUrl, (int)Time.count(), AgeS); - - aTimeMs[i] = Time.count(); - aAgeS[i] = AgeS; - } - - // Determine index of the minimum time. - int BestIndex = -1; - int BestTime = 0; - int BestAge = 0; - for(int i = 0; i < m_pData->m_NumUrls; i++) - { - if(aTimeMs[i] < 0) - { - continue; - } - if(BestIndex == -1 || std::tuple(ClassifyAge(aAgeS[i]), aTimeMs[i]) < std::tuple(ClassifyAge(BestAge), BestTime)) - { - BestTime = aTimeMs[i]; - BestAge = aAgeS[i]; - BestIndex = aRandomized[i]; - } - } - if(BestIndex == -1) - { - log_error("serverbrowser_http", "WARNING: no usable masters found"); - return; - } - - log_info("serverbrowser_http", "determined best master, url='%s' time=%dms age=%ds", m_pData->m_aaUrls[BestIndex], BestTime, BestAge); - m_pData->m_BestIndex.store(BestIndex); -} - -class CServerBrowserHttp : public IServerBrowserHttp -{ -public: - CServerBrowserHttp(IEngine *pEngine, IHttp *pHttp, const char **ppUrls, int NumUrls, int PreviousBestIndex); - ~CServerBrowserHttp() override; - void Update() override; - bool IsRefreshing() override { return m_State != STATE_DONE; } - void Refresh() override; - bool GetBestUrl(const char **pBestUrl) const override { return m_pChooseMaster->GetBestUrl(pBestUrl); } - - int NumServers() const override - { - return m_vServers.size(); - } - const CServerInfo &Server(int Index) const override - { - return m_vServers[Index]; - } - -private: - enum - { - STATE_DONE, - STATE_WANTREFRESH, - STATE_REFRESHING, - STATE_NO_MASTER, - }; - - static bool Validate(json_value *pJson); - static bool Parse(json_value *pJson, std::vector *pvServers); - - IHttp *m_pHttp; - - int m_State = STATE_DONE; - std::shared_ptr m_pGetServers; - std::unique_ptr m_pChooseMaster; - - std::vector m_vServers; -}; - -CServerBrowserHttp::CServerBrowserHttp(IEngine *pEngine, IHttp *pHttp, const char **ppUrls, int NumUrls, int PreviousBestIndex) : - m_pHttp(pHttp), - m_pChooseMaster(new CChooseMaster(pEngine, pHttp, Validate, ppUrls, NumUrls, PreviousBestIndex)) -{ - m_pChooseMaster->Refresh(); -} - -CServerBrowserHttp::~CServerBrowserHttp() -{ - if(m_pGetServers != nullptr) - { - m_pGetServers->Abort(); - } -} - -void CServerBrowserHttp::Update() -{ - if(m_State == STATE_WANTREFRESH) - { - const char *pBestUrl; - if(m_pChooseMaster->GetBestUrl(&pBestUrl)) - { - if(!m_pChooseMaster->IsRefreshing()) - { - log_error("serverbrowser_http", "no working serverlist URL found"); - m_State = STATE_NO_MASTER; - } - return; - } - m_pGetServers = HttpGet(pBestUrl); - // 10 seconds connection timeout, lower than 8KB/s for 10 seconds to fail. - m_pGetServers->Timeout(CTimeout{10000, 0, 8000, 10}); - m_pHttp->Run(m_pGetServers); - m_State = STATE_REFRESHING; - } - else if(m_State == STATE_REFRESHING) - { - if(!m_pGetServers->Done()) - { - return; - } - m_State = STATE_DONE; - std::shared_ptr pGetServers = nullptr; - std::swap(m_pGetServers, pGetServers); - - bool Success = true; - json_value *pJson = pGetServers->State() == EHttpState::DONE ? pGetServers->ResultJson() : nullptr; - Success = Success && pJson; - Success = Success && !Parse(pJson, &m_vServers); - json_value_free(pJson); - if(!Success) - { - log_error("serverbrowser_http", "failed getting serverlist, trying to find best URL"); - m_pChooseMaster->Reset(); - m_pChooseMaster->Refresh(); - } - else - { - // Try to find new master if the current one returns - // results that are 5 minutes old. - int Age = SanitizeAge(pGetServers->ResultAgeSeconds()); - if(Age > 300) - { - log_info("serverbrowser_http", "got stale serverlist, age=%ds, trying to find best URL", Age); - m_pChooseMaster->Refresh(); - } - } - } -} -void CServerBrowserHttp::Refresh() -{ - if(m_State == STATE_WANTREFRESH || m_State == STATE_REFRESHING || m_State == STATE_NO_MASTER) - { - if(m_State == STATE_NO_MASTER) - m_State = STATE_WANTREFRESH; - m_pChooseMaster->Refresh(); - } - if(m_State == STATE_DONE) - m_State = STATE_WANTREFRESH; - Update(); -} -bool ServerbrowserParseUrl(NETADDR *pOut, const char *pUrl) -{ - int Failure = net_addr_from_url(pOut, pUrl, nullptr, 0); - if(Failure || pOut->port == 0) - return true; - return false; -} -bool CServerBrowserHttp::Validate(json_value *pJson) -{ - std::vector vServers; - return Parse(pJson, &vServers); -} -bool CServerBrowserHttp::Parse(json_value *pJson, std::vector *pvServers) -{ - std::vector vServers; - - const json_value &Json = *pJson; - const json_value &Servers = Json["servers"]; - if(Servers.type != json_array) - { - return true; - } - for(unsigned int i = 0; i < Servers.u.array.length; i++) - { - const json_value &Server = Servers[i]; - const json_value &Addresses = Server["addresses"]; - const json_value &Info = Server["info"]; - const json_value &Location = Server["location"]; - int ParsedLocation = CServerInfo::LOC_UNKNOWN; - CServerInfo2 ParsedInfo; - if(Addresses.type != json_array || (Location.type != json_string && Location.type != json_none)) - { - return true; - } - if(Location.type == json_string) - { - if(CServerInfo::ParseLocation(&ParsedLocation, Location)) - { - return true; - } - } - if(CServerInfo2::FromJson(&ParsedInfo, &Info)) - { - // Only skip the current server on parsing - // failure; the server info is "user input" by - // the game server and can be set to arbitrary - // values. - continue; - } - CServerInfo SetInfo = ParsedInfo; - SetInfo.m_Location = ParsedLocation; - SetInfo.m_NumAddresses = 0; - bool GotVersion6 = false; - for(unsigned int a = 0; a < Addresses.u.array.length; a++) - { - const json_value &Address = Addresses[a]; - if(Address.type != json_string) - { - return true; - } - if(str_startswith(Addresses[a], "tw-0.6+udp://")) - { - GotVersion6 = true; - break; - } - } - for(unsigned int a = 0; a < Addresses.u.array.length; a++) - { - const json_value &Address = Addresses[a]; - if(Address.type != json_string) - { - return true; - } - if(GotVersion6 && str_startswith(Addresses[a], "tw-0.7+udp://")) - { - continue; - } - NETADDR ParsedAddr; - if(ServerbrowserParseUrl(&ParsedAddr, Addresses[a])) - { - // Skip unknown addresses. - continue; - } - if(SetInfo.m_NumAddresses < (int)std::size(SetInfo.m_aAddresses)) - { - SetInfo.m_aAddresses[SetInfo.m_NumAddresses] = ParsedAddr; - SetInfo.m_NumAddresses += 1; - } - } - if(SetInfo.m_NumAddresses > 0) - { - vServers.push_back(SetInfo); - } - } - *pvServers = vServers; - return false; -} - -static const char *DEFAULT_SERVERLIST_URLS[] = { - "https://master1.ddnet.org/ddnet/15/servers.json", - "https://master2.ddnet.org/ddnet/15/servers.json", - "https://master3.ddnet.org/ddnet/15/servers.json", - "https://master4.ddnet.org/ddnet/15/servers.json", -}; - -IServerBrowserHttp *CreateServerBrowserHttp(IEngine *pEngine, IStorage *pStorage, IHttp *pHttp, const char *pPreviousBestUrl) -{ - char aaUrls[CChooseMaster::MAX_URLS][256]; - const char *apUrls[CChooseMaster::MAX_URLS] = {0}; - const char **ppUrls = apUrls; - int NumUrls = 0; - CLineReader LineReader; - if(LineReader.OpenFile(pStorage->OpenFile("ddnet-serverlist-urls.cfg", IOFLAG_READ, IStorage::TYPE_ALL))) - { - while(const char *pLine = LineReader.Get()) - { - if(NumUrls == CChooseMaster::MAX_URLS) - { - break; - } - str_copy(aaUrls[NumUrls], pLine); - apUrls[NumUrls] = aaUrls[NumUrls]; - NumUrls += 1; - } - } - if(NumUrls == 0) - { - ppUrls = DEFAULT_SERVERLIST_URLS; - NumUrls = std::size(DEFAULT_SERVERLIST_URLS); - } - int PreviousBestIndex = -1; - for(int i = 0; i < NumUrls; i++) - { - if(str_comp(ppUrls[i], pPreviousBestUrl) == 0) - { - PreviousBestIndex = i; - break; - } - } - return new CServerBrowserHttp(pEngine, pHttp, ppUrls, NumUrls, PreviousBestIndex); -} diff --git a/src/engine/client/serverbrowser_http.h b/src/engine/client/serverbrowser_http.h deleted file mode 100644 index 18f7a62d68..0000000000 --- a/src/engine/client/serverbrowser_http.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef ENGINE_CLIENT_SERVERBROWSER_HTTP_H -#define ENGINE_CLIENT_SERVERBROWSER_HTTP_H -#include - -class CServerInfo; -class IEngine; -class IStorage; -class IHttp; - -class IServerBrowserHttp -{ -public: - virtual ~IServerBrowserHttp() {} - - virtual void Update() = 0; - - virtual bool IsRefreshing() = 0; - virtual void Refresh() = 0; - - virtual bool GetBestUrl(const char **pBestUrl) const = 0; - - virtual int NumServers() const = 0; - virtual const CServerInfo &Server(int Index) const = 0; -}; - -IServerBrowserHttp *CreateServerBrowserHttp(IEngine *pEngine, IStorage *pStorage, IHttp *pHttp, const char *pPreviousBestUrl); -#endif // ENGINE_CLIENT_SERVERBROWSER_HTTP_H diff --git a/src/engine/client/serverbrowser_ping_cache.cpp b/src/engine/client/serverbrowser_ping_cache.cpp deleted file mode 100644 index d59f1bd834..0000000000 --- a/src/engine/client/serverbrowser_ping_cache.cpp +++ /dev/null @@ -1,168 +0,0 @@ -#include "serverbrowser_ping_cache.h" - -#include -#include -#include - -#include - -#include -#include - -class CServerBrowserPingCache : public IServerBrowserPingCache -{ -public: - class CEntry - { - public: - NETADDR m_Addr; - int m_Ping; - }; - - CServerBrowserPingCache(IConsole *pConsole, IStorage *pStorage); - ~CServerBrowserPingCache() override = default; - - void Load() override; - - int NumEntries() const override; - void CachePing(const NETADDR &Addr, int Ping) override; - int GetPing(const NETADDR *pAddrs, int NumAddrs) const override; - -private: - IConsole *m_pConsole; - - CSqlite m_pDisk; - CSqliteStmt m_pLoadStmt; - CSqliteStmt m_pStoreStmt; - - std::unordered_map m_Entries; -}; - -CServerBrowserPingCache::CServerBrowserPingCache(IConsole *pConsole, IStorage *pStorage) : - m_pConsole(pConsole) -{ - m_pDisk = SqliteOpen(pConsole, pStorage, "ddnet-cache.sqlite3"); - if(!m_pDisk) - { - pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "serverbrowse_ping_cache", "failed to open ddnet-cache.sqlite3"); - return; - } - sqlite3 *pSqlite = m_pDisk.get(); - static const char TABLE[] = "CREATE TABLE IF NOT EXISTS server_pings (ip_address TEXT PRIMARY KEY NOT NULL, ping INTEGER NOT NULL, utc_timestamp TEXT NOT NULL)"; - if(SQLITE_HANDLE_ERROR(sqlite3_exec(pSqlite, TABLE, nullptr, nullptr, nullptr))) - { - m_pDisk = nullptr; - pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "serverbrowse_ping_cache", "failed to create server_pings table"); - return; - } - m_pLoadStmt = SqlitePrepare(pConsole, pSqlite, "SELECT ip_address, ping FROM server_pings"); - m_pStoreStmt = SqlitePrepare(pConsole, pSqlite, "INSERT OR REPLACE INTO server_pings (ip_address, ping, utc_timestamp) VALUES (?, ?, datetime('now'))"); -} - -void CServerBrowserPingCache::Load() -{ - if(m_pDisk) - { - std::vector vNewEntries; - - sqlite3 *pSqlite = m_pDisk.get(); - IConsole *pConsole = m_pConsole; - bool Error = false; - bool WarnedForBadAddress = false; - Error = Error || !m_pLoadStmt; - while(!Error) - { - int StepResult = SQLITE_HANDLE_ERROR(sqlite3_step(m_pLoadStmt.get())); - if(StepResult == SQLITE_DONE) - { - break; - } - else if(StepResult == SQLITE_ROW) - { - const char *pIpAddress = (const char *)sqlite3_column_text(m_pLoadStmt.get(), 0); - int Ping = sqlite3_column_int(m_pLoadStmt.get(), 1); - NETADDR Addr; - if(net_addr_from_str(&Addr, pIpAddress)) - { - if(!WarnedForBadAddress) - { - char aBuf[64]; - str_format(aBuf, sizeof(aBuf), "invalid address: %s", pIpAddress); - pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "serverbrowse_ping_cache", aBuf); - WarnedForBadAddress = true; - } - continue; - } - vNewEntries.push_back(CEntry{Addr, Ping}); - } - else - { - Error = true; - } - } - if(Error) - { - pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "serverbrowse_ping_cache", "failed to load ping cache"); - return; - } - for(const auto &Entry : vNewEntries) - { - m_Entries[Entry.m_Addr] = Entry.m_Ping; - } - } -} - -int CServerBrowserPingCache::NumEntries() const -{ - return m_Entries.size(); -} - -void CServerBrowserPingCache::CachePing(const NETADDR &Addr, int Ping) -{ - NETADDR AddrWithoutPort = Addr; - AddrWithoutPort.port = 0; - m_Entries[AddrWithoutPort] = Ping; - if(m_pDisk) - { - sqlite3 *pSqlite = m_pDisk.get(); - IConsole *pConsole = m_pConsole; - char aAddr[NETADDR_MAXSTRSIZE]; - net_addr_str(&AddrWithoutPort, aAddr, sizeof(aAddr), false); - - bool Error = false; - Error = Error || !m_pStoreStmt; - Error = Error || SQLITE_HANDLE_ERROR(sqlite3_reset(m_pStoreStmt.get())) != SQLITE_OK; - Error = Error || SQLITE_HANDLE_ERROR(sqlite3_bind_text(m_pStoreStmt.get(), 1, aAddr, -1, SQLITE_STATIC)) != SQLITE_OK; - Error = Error || SQLITE_HANDLE_ERROR(sqlite3_bind_int(m_pStoreStmt.get(), 2, Ping)) != SQLITE_OK; - Error = Error || SQLITE_HANDLE_ERROR(sqlite3_step(m_pStoreStmt.get())) != SQLITE_DONE; - if(Error) - { - pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "serverbrowse_ping_cache", "failed to store ping"); - } - } -} - -int CServerBrowserPingCache::GetPing(const NETADDR *pAddrs, int NumAddrs) const -{ - int Ping = -1; - for(int i = 0; i < NumAddrs; i++) - { - NETADDR Addr = pAddrs[i]; - Addr.port = 0; - auto Entry = m_Entries.find(Addr); - if(Entry == m_Entries.end()) - { - continue; - } - if(Ping == -1 || Entry->second < Ping) - { - Ping = Entry->second; - } - } - return Ping; -} - -IServerBrowserPingCache *CreateServerBrowserPingCache(IConsole *pConsole, IStorage *pStorage) -{ - return new CServerBrowserPingCache(pConsole, pStorage); -} diff --git a/src/engine/client/serverbrowser_ping_cache.h b/src/engine/client/serverbrowser_ping_cache.h deleted file mode 100644 index 5c81e939f8..0000000000 --- a/src/engine/client/serverbrowser_ping_cache.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef ENGINE_CLIENT_SERVERBROWSER_PING_CACHE_H -#define ENGINE_CLIENT_SERVERBROWSER_PING_CACHE_H -#include - -class IConsole; -class IStorage; - -class IServerBrowserPingCache -{ -public: - virtual ~IServerBrowserPingCache() {} - - virtual void Load() = 0; - - virtual int NumEntries() const = 0; - virtual void CachePing(const NETADDR &Addr, int Ping) = 0; - // Returns -1 if the ping isn't cached. - virtual int GetPing(const NETADDR *pAddrs, int NumAddrs) const = 0; -}; - -IServerBrowserPingCache *CreateServerBrowserPingCache(IConsole *pConsole, IStorage *pStorage); -#endif // ENGINE_CLIENT_SERVERBROWSER_PING_CACHE_H diff --git a/src/engine/client/sixup_translate_system.cpp b/src/engine/client/sixup_translate_system.cpp deleted file mode 100644 index f6398cfcb5..0000000000 --- a/src/engine/client/sixup_translate_system.cpp +++ /dev/null @@ -1,114 +0,0 @@ -#include - -int CClient::TranslateSysMsg(int *pMsgId, bool System, CUnpacker *pUnpacker, CPacker *pPacker, CNetChunk *pPacket, bool *pIsExMsg) -{ - *pIsExMsg = false; - if(!System) - return -1; - - // ddnet ex - if(*pMsgId > NETMSG_WHATIS && *pMsgId < NETMSG_RCON_CMD_GROUP_END) - { - *pIsExMsg = true; - return 0; - } - - pPacker->Reset(); - - if(*pMsgId == protocol7::NETMSG_MAP_CHANGE) - { - *pMsgId = NETMSG_MAP_CHANGE; - const char *pMapName = pUnpacker->GetString(CUnpacker::SANITIZE_CC | CUnpacker::SKIP_START_WHITESPACES); - int MapCrc = pUnpacker->GetInt(); - int Size = pUnpacker->GetInt(); - m_TranslationContext.m_MapDownloadChunksPerRequest = pUnpacker->GetInt(); - int ChunkSize = pUnpacker->GetInt(); - // void *pSha256 = pUnpacker->GetRaw(); // probably safe to ignore - pPacker->AddString(pMapName, 0); - pPacker->AddInt(MapCrc); - pPacker->AddInt(Size); - m_TranslationContext.m_MapdownloadTotalsize = Size; - m_TranslationContext.m_MapDownloadChunkSize = ChunkSize; - return 0; - } - else if(*pMsgId == protocol7::NETMSG_SERVERINFO) - { - // side effect only - // this is a 0.7 only message and not handled in 0.6 code - *pMsgId = -1; - net_addr_str(&pPacket->m_Address, m_CurrentServerInfo.m_aAddress, sizeof(m_CurrentServerInfo.m_aAddress), true); - str_copy(m_CurrentServerInfo.m_aVersion, pUnpacker->GetString(CUnpacker::SANITIZE_CC | CUnpacker::SKIP_START_WHITESPACES)); - str_copy(m_CurrentServerInfo.m_aName, pUnpacker->GetString(CUnpacker::SANITIZE_CC | CUnpacker::SKIP_START_WHITESPACES)); - str_clean_whitespaces(m_CurrentServerInfo.m_aName); - pUnpacker->GetString(CUnpacker::SANITIZE_CC | CUnpacker::SKIP_START_WHITESPACES); // Hostname - str_copy(m_CurrentServerInfo.m_aMap, pUnpacker->GetString(CUnpacker::SANITIZE_CC | CUnpacker::SKIP_START_WHITESPACES)); - str_copy(m_CurrentServerInfo.m_aGameType, pUnpacker->GetString(CUnpacker::SANITIZE_CC | CUnpacker::SKIP_START_WHITESPACES)); - int Flags = pUnpacker->GetInt(); - if(Flags & SERVER_FLAG_PASSWORD) - m_CurrentServerInfo.m_Flags |= SERVER_FLAG_PASSWORD; - // ddnets http master server handles timescore for us already - // if(Flags&SERVER_FLAG_TIMESCORE) - // m_CurrentServerInfo.m_Flags |= SERVER_FLAG_TIMESCORE; - pUnpacker->GetInt(); // Server level - m_CurrentServerInfo.m_NumPlayers = pUnpacker->GetInt(); - m_CurrentServerInfo.m_MaxPlayers = pUnpacker->GetInt(); - m_CurrentServerInfo.m_NumClients = pUnpacker->GetInt(); - m_CurrentServerInfo.m_MaxClients = pUnpacker->GetInt(); - return 0; - } - else if(*pMsgId == protocol7::NETMSG_RCON_AUTH_ON) - { - *pMsgId = NETMSG_RCON_AUTH_STATUS; - pPacker->AddInt(1); // authed - pPacker->AddInt(1); // cmdlist - return 0; - } - else if(*pMsgId == protocol7::NETMSG_RCON_AUTH_OFF) - { - *pMsgId = NETMSG_RCON_AUTH_STATUS; - pPacker->AddInt(0); // authed - pPacker->AddInt(0); // cmdlist - return 0; - } - else if(*pMsgId == protocol7::NETMSG_MAP_DATA) - { - // not binary compatible but translation happens on unpack - *pMsgId = NETMSG_MAP_DATA; - } - else if(*pMsgId >= protocol7::NETMSG_CON_READY && *pMsgId <= protocol7::NETMSG_INPUTTIMING) - { - *pMsgId = *pMsgId - 1; - } - else if(*pMsgId == protocol7::NETMSG_RCON_LINE) - { - *pMsgId = NETMSG_RCON_LINE; - } - else if(*pMsgId == protocol7::NETMSG_RCON_CMD_ADD) - { - *pMsgId = NETMSG_RCON_CMD_ADD; - } - else if(*pMsgId == protocol7::NETMSG_RCON_CMD_REM) - { - *pMsgId = NETMSG_RCON_CMD_REM; - } - else if(*pMsgId == protocol7::NETMSG_PING_REPLY) - { - *pMsgId = NETMSG_PING_REPLY; - } - else if(*pMsgId == protocol7::NETMSG_MAPLIST_ENTRY_ADD || *pMsgId == protocol7::NETMSG_MAPLIST_ENTRY_REM) - { - // This is just a nice to have so silently dropping that is fine - return -1; - } - else if(*pMsgId >= NETMSG_INFO && *pMsgId <= NETMSG_MAP_DATA) - { - return -1; // same in 0.6 and 0.7 - } - else if(*pMsgId < OFFSET_UUID) - { - dbg_msg("sixup", "drop unknown sys msg=%d", *pMsgId); - return -1; - } - - return -1; -} diff --git a/src/engine/client/smooth_time.cpp b/src/engine/client/smooth_time.cpp deleted file mode 100644 index e917f1a19e..0000000000 --- a/src/engine/client/smooth_time.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include -#include - -#include "graph.h" -#include "smooth_time.h" - -void CSmoothTime::Init(int64_t Target) -{ - m_Snap = time_get(); - m_Current = Target; - m_Target = Target; - m_Margin = 0; - m_SpikeCounter = 0; - m_aAdjustSpeed[ADJUSTDIRECTION_DOWN] = 0.3f; - m_aAdjustSpeed[ADJUSTDIRECTION_UP] = 0.3f; -} - -void CSmoothTime::SetAdjustSpeed(EAdjustDirection Direction, float Value) -{ - m_aAdjustSpeed[Direction] = Value; -} - -int64_t CSmoothTime::Get(int64_t Now) const -{ - int64_t c = m_Current + (Now - m_Snap); - int64_t t = m_Target + (Now - m_Snap); - - // it's faster to adjust upward instead of downward - // we might need to adjust these abit - - float AdjustSpeed = m_aAdjustSpeed[ADJUSTDIRECTION_DOWN]; - if(t > c) - AdjustSpeed = m_aAdjustSpeed[ADJUSTDIRECTION_UP]; - - float a = ((Now - m_Snap) / (float)time_freq()) * AdjustSpeed; - if(a > 1.0f) - a = 1.0f; - - int64_t r = c + (int64_t)((t - c) * a); - return r + m_Margin; -} - -void CSmoothTime::UpdateInt(int64_t Target) -{ - int64_t Now = time_get(); - m_Current = Get(Now) - m_Margin; - m_Snap = Now; - m_Target = Target; -} - -void CSmoothTime::Update(CGraph *pGraph, int64_t Target, int TimeLeft, EAdjustDirection AdjustDirection) -{ - bool UpdateTimer = true; - - if(TimeLeft < 0) - { - bool IsSpike = false; - if(TimeLeft < -50) - { - IsSpike = true; - - m_SpikeCounter += 5; - if(m_SpikeCounter > 50) - m_SpikeCounter = 50; - } - - if(IsSpike && m_SpikeCounter < 15) - { - // ignore this ping spike - UpdateTimer = false; - pGraph->Add(TimeLeft, ColorRGBA(1.0f, 1.0f, 0.0f, 0.75f)); - } - else - { - pGraph->Add(TimeLeft, ColorRGBA(1.0f, 0.0f, 0.0f, 0.75f)); - if(m_aAdjustSpeed[AdjustDirection] < 30.0f) - m_aAdjustSpeed[AdjustDirection] *= 2.0f; - } - } - else - { - if(m_SpikeCounter) - m_SpikeCounter--; - - pGraph->Add(TimeLeft, ColorRGBA(0.0f, 1.0f, 0.0f, 0.75f)); - - m_aAdjustSpeed[AdjustDirection] *= 0.95f; - if(m_aAdjustSpeed[AdjustDirection] < 2.0f) - m_aAdjustSpeed[AdjustDirection] = 2.0f; - } - - if(UpdateTimer) - UpdateInt(Target); -} - -void CSmoothTime::UpdateMargin(int64_t Margin) -{ - m_Margin = Margin; -} diff --git a/src/engine/client/smooth_time.h b/src/engine/client/smooth_time.h deleted file mode 100644 index efd41e8c4f..0000000000 --- a/src/engine/client/smooth_time.h +++ /dev/null @@ -1,42 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#ifndef ENGINE_CLIENT_SMOOTH_TIME_H -#define ENGINE_CLIENT_SMOOTH_TIME_H - -#include - -class CGraph; - -class CSmoothTime -{ -public: - enum EAdjustDirection - { - ADJUSTDIRECTION_DOWN = 0, - ADJUSTDIRECTION_UP, - NUM_ADJUSTDIRECTIONS, - }; - -private: - int64_t m_Snap; - int64_t m_Current; - int64_t m_Target; - int64_t m_Margin; - - int m_SpikeCounter; - float m_aAdjustSpeed[NUM_ADJUSTDIRECTIONS]; - -public: - void Init(int64_t Target); - void SetAdjustSpeed(EAdjustDirection Direction, float Value); - - int64_t Get(int64_t Now) const; - - void UpdateInt(int64_t Target); - void Update(CGraph *pGraph, int64_t Target, int TimeLeft, EAdjustDirection AdjustDirection); - - void UpdateMargin(int64_t Margin); -}; - -#endif diff --git a/src/engine/client/sound.cpp b/src/engine/client/sound.cpp deleted file mode 100644 index c5fad540ed..0000000000 --- a/src/engine/client/sound.cpp +++ /dev/null @@ -1,984 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include - -#include -#include - -#include -#include -#include - -#include "sound.h" - -#if defined(CONF_VIDEORECORDER) -#include -#endif -extern "C" { -#include -#include -} - -#include - -static constexpr int SAMPLE_INDEX_USED = -2; -static constexpr int SAMPLE_INDEX_FULL = -1; - -void CSound::Mix(short *pFinalOut, unsigned Frames) -{ - Frames = minimum(Frames, m_MaxFrames); - mem_zero(m_pMixBuffer, Frames * 2 * sizeof(int)); - - // acquire lock while we are mixing - m_SoundLock.lock(); - - const int MasterVol = m_SoundVolume.load(std::memory_order_relaxed); - - for(auto &Voice : m_aVoices) - { - if(!Voice.m_pSample) - continue; - - // mix voice - int *pOut = m_pMixBuffer; - - const int Step = Voice.m_pSample->m_Channels; // setup input sources - short *pInL = &Voice.m_pSample->m_pData[Voice.m_Tick * Step]; - short *pInR = &Voice.m_pSample->m_pData[Voice.m_Tick * Step + 1]; - - unsigned End = Voice.m_pSample->m_NumFrames - Voice.m_Tick; - - int VolumeR = round_truncate(Voice.m_pChannel->m_Vol * (Voice.m_Vol / 255.0f)); - int VolumeL = VolumeR; - - // make sure that we don't go outside the sound data - if(Frames < End) - End = Frames; - - // check if we have a mono sound - if(Voice.m_pSample->m_Channels == 1) - pInR = pInL; - - // volume calculation - if(Voice.m_Flags & ISound::FLAG_POS && Voice.m_pChannel->m_Pan) - { - // TODO: we should respect the channel panning value - const vec2 Delta = Voice.m_Position - vec2(m_ListenerPositionX.load(std::memory_order_relaxed), m_ListenerPositionY.load(std::memory_order_relaxed)); - vec2 Falloff = vec2(0.0f, 0.0f); - - float RangeX = 0.0f; // for panning - bool InVoiceField = false; - - switch(Voice.m_Shape) - { - case ISound::SHAPE_CIRCLE: - { - const float Radius = Voice.m_Circle.m_Radius; - RangeX = Radius; - - const float Dist = length(Delta); - if(Dist < Radius) - { - InVoiceField = true; - - // falloff - const float FalloffDistance = Radius * Voice.m_Falloff; - Falloff.x = Falloff.y = Dist > FalloffDistance ? (Radius - Dist) / (Radius - FalloffDistance) : 1.0f; - } - break; - } - - case ISound::SHAPE_RECTANGLE: - { - const vec2 AbsoluteDelta = vec2(absolute(Delta.x), absolute(Delta.y)); - const float w = Voice.m_Rectangle.m_Width / 2.0f; - const float h = Voice.m_Rectangle.m_Height / 2.0f; - RangeX = w; - - if(AbsoluteDelta.x < w && AbsoluteDelta.y < h) - { - InVoiceField = true; - - // falloff - const vec2 FalloffDistance = vec2(w, h) * Voice.m_Falloff; - Falloff.x = AbsoluteDelta.x > FalloffDistance.x ? (w - AbsoluteDelta.x) / (w - FalloffDistance.x) : 1.0f; - Falloff.y = AbsoluteDelta.y > FalloffDistance.y ? (h - AbsoluteDelta.y) / (h - FalloffDistance.y) : 1.0f; - } - break; - } - }; - - if(InVoiceField) - { - // panning - if(!(Voice.m_Flags & ISound::FLAG_NO_PANNING)) - { - if(Delta.x > 0) - VolumeL = ((RangeX - absolute(Delta.x)) * VolumeL) / RangeX; - else - VolumeR = ((RangeX - absolute(Delta.x)) * VolumeR) / RangeX; - } - - { - VolumeL *= Falloff.x * Falloff.y; - VolumeR *= Falloff.x * Falloff.y; - } - } - else - { - VolumeL = 0; - VolumeR = 0; - } - } - - // process all frames - for(unsigned s = 0; s < End; s++) - { - *pOut++ += (*pInL) * VolumeL; - *pOut++ += (*pInR) * VolumeR; - pInL += Step; - pInR += Step; - Voice.m_Tick++; - } - - // free voice if not used any more - if(Voice.m_Tick == Voice.m_pSample->m_NumFrames) - { - if(Voice.m_Flags & ISound::FLAG_LOOP) - Voice.m_Tick = 0; - else - { - Voice.m_pSample = nullptr; - Voice.m_Age++; - } - } - } - - m_SoundLock.unlock(); - - // clamp accumulated values - for(unsigned i = 0; i < Frames * 2; i++) - pFinalOut[i] = clamp(((m_pMixBuffer[i] * MasterVol) / 101) >> 8, std::numeric_limits::min(), std::numeric_limits::max()); - -#if defined(CONF_ARCH_ENDIAN_BIG) - swap_endian(pFinalOut, sizeof(short), Frames * 2); -#endif -} - -static void SdlCallback(void *pUser, Uint8 *pStream, int Len) -{ - CSound *pSound = static_cast(pUser); - -#if defined(CONF_VIDEORECORDER) - if(!(IVideo::Current() && g_Config.m_ClVideoSndEnable)) - { - pSound->Mix((short *)pStream, Len / sizeof(short) / 2); - } - else - { - mem_zero(pStream, Len); - } -#else - pSound->Mix((short *)pStream, Len / sizeof(short) / 2); -#endif -} - -int CSound::Init() -{ - m_SoundEnabled = false; - m_pGraphics = Kernel()->RequestInterface(); - m_pStorage = Kernel()->RequestInterface(); - - // Initialize sample indices. We always need them to load sounds in - // the editor even if sound is disabled or failed to be enabled. - const CLockScope LockScope(m_SoundLock); - m_FirstFreeSampleIndex = 0; - for(size_t i = 0; i < std::size(m_aSamples) - 1; ++i) - { - m_aSamples[i].m_Index = i; - m_aSamples[i].m_NextFreeSampleIndex = i + 1; - m_aSamples[i].m_pData = nullptr; - } - m_aSamples[std::size(m_aSamples) - 1].m_Index = std::size(m_aSamples) - 1; - m_aSamples[std::size(m_aSamples) - 1].m_NextFreeSampleIndex = SAMPLE_INDEX_FULL; - - if(!g_Config.m_SndEnable) - return 0; - - if(SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) - { - dbg_msg("sound", "unable to init SDL audio: %s", SDL_GetError()); - return -1; - } - - SDL_AudioSpec Format, FormatOut; - Format.freq = g_Config.m_SndRate; - Format.format = AUDIO_S16; - Format.channels = 2; - Format.samples = g_Config.m_SndBufferSize; - Format.callback = SdlCallback; - Format.userdata = this; - - // Open the audio device and start playing sound! - m_Device = SDL_OpenAudioDevice(nullptr, 0, &Format, &FormatOut, SDL_AUDIO_ALLOW_FREQUENCY_CHANGE); - if(m_Device == 0) - { - dbg_msg("sound", "unable to open audio: %s", SDL_GetError()); - return -1; - } - else - dbg_msg("sound", "sound init successful using audio driver '%s'", SDL_GetCurrentAudioDriver()); - - m_MixingRate = FormatOut.freq; - m_MaxFrames = FormatOut.samples * 2; -#if defined(CONF_VIDEORECORDER) - m_MaxFrames = maximum(m_MaxFrames, 1024 * 2); // make the buffer bigger just in case -#endif - m_pMixBuffer = (int *)calloc(m_MaxFrames * 2, sizeof(int)); - - m_SoundEnabled = true; - Update(); - - SDL_PauseAudioDevice(m_Device, 0); - return 0; -} - -int CSound::Update() -{ - UpdateVolume(); - return 0; -} - -void CSound::UpdateVolume() -{ - int WantedVolume = g_Config.m_SndVolume; - if(!m_pGraphics->WindowActive() && g_Config.m_SndNonactiveMute) - WantedVolume = 0; - m_SoundVolume.store(WantedVolume, std::memory_order_relaxed); -} - -void CSound::Shutdown() -{ - StopAll(); - - // Stop sound callback before freeing sample data - SDL_CloseAudioDevice(m_Device); - SDL_QuitSubSystem(SDL_INIT_AUDIO); - m_Device = 0; - - const CLockScope LockScope(m_SoundLock); - for(auto &Sample : m_aSamples) - { - free(Sample.m_pData); - Sample.m_pData = nullptr; - } - - free(m_pMixBuffer); - m_pMixBuffer = nullptr; - m_SoundEnabled = false; -} - -CSample *CSound::AllocSample() -{ - const CLockScope LockScope(m_SoundLock); - if(m_FirstFreeSampleIndex == SAMPLE_INDEX_FULL) - return nullptr; - - CSample *pSample = &m_aSamples[m_FirstFreeSampleIndex]; - if(pSample->m_pData != nullptr || pSample->m_NextFreeSampleIndex == SAMPLE_INDEX_USED) - { - char aError[128]; - str_format(aError, sizeof(aError), "Sample was not unloaded (index=%d, next=%d, duration=%f, data=%p)", - pSample->m_Index, pSample->m_NextFreeSampleIndex, pSample->TotalTime(), pSample->m_pData); - dbg_assert(false, aError); - } - m_FirstFreeSampleIndex = pSample->m_NextFreeSampleIndex; - pSample->m_NextFreeSampleIndex = SAMPLE_INDEX_USED; - return pSample; -} - -void CSound::RateConvert(CSample &Sample) const -{ - dbg_assert(Sample.IsLoaded(), "Sample not loaded"); - // make sure that we need to convert this sound - if(Sample.m_Rate == m_MixingRate) - return; - - // allocate new data - const int NumFrames = (int)((Sample.m_NumFrames / (float)Sample.m_Rate) * m_MixingRate); - short *pNewData = (short *)calloc((size_t)NumFrames * Sample.m_Channels, sizeof(short)); - - for(int i = 0; i < NumFrames; i++) - { - // resample TODO: this should be done better, like linear at least - float a = i / (float)NumFrames; - int f = (int)(a * Sample.m_NumFrames); - if(f >= Sample.m_NumFrames) - f = Sample.m_NumFrames - 1; - - // set new data - if(Sample.m_Channels == 1) - pNewData[i] = Sample.m_pData[f]; - else if(Sample.m_Channels == 2) - { - pNewData[i * 2] = Sample.m_pData[f * 2]; - pNewData[i * 2 + 1] = Sample.m_pData[f * 2 + 1]; - } - } - - // free old data and apply new - free(Sample.m_pData); - Sample.m_pData = pNewData; - Sample.m_NumFrames = NumFrames; - Sample.m_Rate = m_MixingRate; -} - -bool CSound::DecodeOpus(CSample &Sample, const void *pData, unsigned DataSize) const -{ - int OpusError = 0; - OggOpusFile *pOpusFile = op_open_memory((const unsigned char *)pData, DataSize, &OpusError); - if(pOpusFile) - { - const int NumChannels = op_channel_count(pOpusFile, -1); - if(NumChannels > 2) - { - op_free(pOpusFile); - dbg_msg("sound/opus", "file is not mono or stereo."); - return false; - } - - const int NumSamples = op_pcm_total(pOpusFile, -1); // per channel! - if(NumSamples < 0) - { - op_free(pOpusFile); - dbg_msg("sound/opus", "failed to get number of samples, error %d", NumSamples); - return false; - } - - short *pSampleData = (short *)calloc((size_t)NumSamples * NumChannels, sizeof(short)); - - int Pos = 0; - while(Pos < NumSamples) - { - const int Read = op_read(pOpusFile, pSampleData + Pos * NumChannels, (NumSamples - Pos) * NumChannels, nullptr); - if(Read < 0) - { - free(pSampleData); - op_free(pOpusFile); - dbg_msg("sound/opus", "op_read error %d at %d", Read, Pos); - return false; - } - else if(Read == 0) // EOF - break; - Pos += Read; - } - - op_free(pOpusFile); - - Sample.m_pData = pSampleData; - Sample.m_NumFrames = Pos; - Sample.m_Rate = 48000; - Sample.m_Channels = NumChannels; - Sample.m_LoopStart = -1; - Sample.m_LoopEnd = -1; - Sample.m_PausedAt = 0; - } - else - { - dbg_msg("sound/opus", "failed to decode sample, error %d", OpusError); - return false; - } - - return true; -} - -// TODO: Update WavPack to get rid of these global variables -static const void *s_pWVBuffer = nullptr; -static int s_WVBufferPosition = 0; -static int s_WVBufferSize = 0; - -static int ReadDataOld(void *pBuffer, int Size) -{ - int ChunkSize = minimum(Size, s_WVBufferSize - s_WVBufferPosition); - mem_copy(pBuffer, (const char *)s_pWVBuffer + s_WVBufferPosition, ChunkSize); - s_WVBufferPosition += ChunkSize; - return ChunkSize; -} - -#if defined(CONF_WAVPACK_OPEN_FILE_INPUT_EX) -static int ReadData(void *pId, void *pBuffer, int Size) -{ - (void)pId; - return ReadDataOld(pBuffer, Size); -} - -static int ReturnFalse(void *pId) -{ - (void)pId; - return 0; -} - -static unsigned int GetPos(void *pId) -{ - (void)pId; - return s_WVBufferPosition; -} - -static unsigned int GetLength(void *pId) -{ - (void)pId; - return s_WVBufferSize; -} - -static int PushBackByte(void *pId, int Char) -{ - s_WVBufferPosition -= 1; - return 0; -} -#endif - -bool CSound::DecodeWV(CSample &Sample, const void *pData, unsigned DataSize) const -{ - char aError[100]; - - dbg_assert(s_pWVBuffer == nullptr, "DecodeWV already in use"); - s_pWVBuffer = pData; - s_WVBufferSize = DataSize; - s_WVBufferPosition = 0; - -#if defined(CONF_WAVPACK_OPEN_FILE_INPUT_EX) - WavpackStreamReader Callback = {0}; - Callback.can_seek = ReturnFalse; - Callback.get_length = GetLength; - Callback.get_pos = GetPos; - Callback.push_back_byte = PushBackByte; - Callback.read_bytes = ReadData; - WavpackContext *pContext = WavpackOpenFileInputEx(&Callback, (void *)1, 0, aError, 0, 0); -#else - WavpackContext *pContext = WavpackOpenFileInput(ReadDataOld, aError); -#endif - if(pContext) - { - const int NumSamples = WavpackGetNumSamples(pContext); - const int BitsPerSample = WavpackGetBitsPerSample(pContext); - const unsigned int SampleRate = WavpackGetSampleRate(pContext); - const int NumChannels = WavpackGetNumChannels(pContext); - - if(NumChannels > 2) - { - dbg_msg("sound/wv", "file is not mono or stereo."); - s_pWVBuffer = nullptr; - return false; - } - - if(BitsPerSample != 16) - { - dbg_msg("sound/wv", "bps is %d, not 16", BitsPerSample); - s_pWVBuffer = nullptr; - return false; - } - - int *pBuffer = (int *)calloc((size_t)NumSamples * NumChannels, sizeof(int)); - if(!WavpackUnpackSamples(pContext, pBuffer, NumSamples)) - { - free(pBuffer); - dbg_msg("sound/wv", "WavpackUnpackSamples failed. NumSamples=%d, NumChannels=%d", NumSamples, NumChannels); - s_pWVBuffer = nullptr; - return false; - } - - Sample.m_pData = (short *)calloc((size_t)NumSamples * NumChannels, sizeof(short)); - - int *pSrc = pBuffer; - short *pDst = Sample.m_pData; - for(int i = 0; i < NumSamples * NumChannels; i++) - *pDst++ = (short)*pSrc++; - - free(pBuffer); -#ifdef CONF_WAVPACK_CLOSE_FILE - WavpackCloseFile(pContext); -#endif - - Sample.m_NumFrames = NumSamples; - Sample.m_Rate = SampleRate; - Sample.m_Channels = NumChannels; - Sample.m_LoopStart = -1; - Sample.m_LoopEnd = -1; - Sample.m_PausedAt = 0; - - s_pWVBuffer = nullptr; - } - else - { - dbg_msg("sound/wv", "failed to decode sample (%s)", aError); - s_pWVBuffer = nullptr; - return false; - } - - return true; -} - -int CSound::LoadOpus(const char *pFilename, int StorageType) -{ - // no need to load sound when we are running with no sound - if(!m_SoundEnabled) - return -1; - - CSample *pSample = AllocSample(); - if(!pSample) - { - dbg_msg("sound/opus", "failed to allocate sample ID. filename='%s'", pFilename); - return -1; - } - - void *pData; - unsigned DataSize; - if(!m_pStorage->ReadFile(pFilename, StorageType, &pData, &DataSize)) - { - UnloadSample(pSample->m_Index); - dbg_msg("sound/opus", "failed to open file. filename='%s'", pFilename); - return -1; - } - - const bool DecodeSuccess = DecodeOpus(*pSample, pData, DataSize); - free(pData); - if(!DecodeSuccess) - { - UnloadSample(pSample->m_Index); - return -1; - } - - if(g_Config.m_Debug) - dbg_msg("sound/opus", "loaded %s", pFilename); - - RateConvert(*pSample); - return pSample->m_Index; -} - -int CSound::LoadWV(const char *pFilename, int StorageType) -{ - // no need to load sound when we are running with no sound - if(!m_SoundEnabled) - return -1; - - CSample *pSample = AllocSample(); - if(!pSample) - { - dbg_msg("sound/wv", "failed to allocate sample ID. filename='%s'", pFilename); - return -1; - } - - void *pData; - unsigned DataSize; - if(!m_pStorage->ReadFile(pFilename, StorageType, &pData, &DataSize)) - { - UnloadSample(pSample->m_Index); - dbg_msg("sound/wv", "failed to open file. filename='%s'", pFilename); - return -1; - } - - const bool DecodeSuccess = DecodeWV(*pSample, pData, DataSize); - free(pData); - if(!DecodeSuccess) - { - UnloadSample(pSample->m_Index); - return -1; - } - - if(g_Config.m_Debug) - dbg_msg("sound/wv", "loaded %s", pFilename); - - RateConvert(*pSample); - return pSample->m_Index; -} - -int CSound::LoadOpusFromMem(const void *pData, unsigned DataSize, bool ForceLoad = false) -{ - // no need to load sound when we are running with no sound - if(!m_SoundEnabled && !ForceLoad) - return -1; - - CSample *pSample = AllocSample(); - if(!pSample) - return -1; - - if(!DecodeOpus(*pSample, pData, DataSize)) - { - UnloadSample(pSample->m_Index); - return -1; - } - - RateConvert(*pSample); - return pSample->m_Index; -} - -int CSound::LoadWVFromMem(const void *pData, unsigned DataSize, bool ForceLoad = false) -{ - // no need to load sound when we are running with no sound - if(!m_SoundEnabled && !ForceLoad) - return -1; - - CSample *pSample = AllocSample(); - if(!pSample) - return -1; - - if(!DecodeWV(*pSample, pData, DataSize)) - { - UnloadSample(pSample->m_Index); - return -1; - } - - RateConvert(*pSample); - return pSample->m_Index; -} - -void CSound::UnloadSample(int SampleId) -{ - if(SampleId == -1) - return; - - dbg_assert(SampleId >= 0 && SampleId < NUM_SAMPLES, "SampleId invalid"); - const CLockScope LockScope(m_SoundLock); - CSample &Sample = m_aSamples[SampleId]; - - if(Sample.IsLoaded()) - { - // Stop voices using this sample - for(auto &Voice : m_aVoices) - { - if(Voice.m_pSample == &Sample) - { - Voice.m_pSample = nullptr; - } - } - - // Free data - free(Sample.m_pData); - Sample.m_pData = nullptr; - } - - // Free slot - if(Sample.m_NextFreeSampleIndex == SAMPLE_INDEX_USED) - { - Sample.m_NextFreeSampleIndex = m_FirstFreeSampleIndex; - m_FirstFreeSampleIndex = Sample.m_Index; - } -} - -float CSound::GetSampleTotalTime(int SampleId) -{ - dbg_assert(SampleId >= 0 && SampleId < NUM_SAMPLES, "SampleId invalid"); - - const CLockScope LockScope(m_SoundLock); - dbg_assert(m_aSamples[SampleId].IsLoaded(), "Sample not loaded"); - return m_aSamples[SampleId].TotalTime(); -} - -float CSound::GetSampleCurrentTime(int SampleId) -{ - dbg_assert(SampleId >= 0 && SampleId < NUM_SAMPLES, "SampleId invalid"); - - const CLockScope LockScope(m_SoundLock); - dbg_assert(m_aSamples[SampleId].IsLoaded(), "Sample not loaded"); - CSample *pSample = &m_aSamples[SampleId]; - for(auto &Voice : m_aVoices) - { - if(Voice.m_pSample == pSample) - { - return Voice.m_Tick / (float)pSample->m_Rate; - } - } - - return pSample->m_PausedAt / (float)pSample->m_Rate; -} - -void CSound::SetSampleCurrentTime(int SampleId, float Time) -{ - dbg_assert(SampleId >= 0 && SampleId < NUM_SAMPLES, "SampleId invalid"); - - const CLockScope LockScope(m_SoundLock); - dbg_assert(m_aSamples[SampleId].IsLoaded(), "Sample not loaded"); - CSample *pSample = &m_aSamples[SampleId]; - for(auto &Voice : m_aVoices) - { - if(Voice.m_pSample == pSample) - { - Voice.m_Tick = pSample->m_NumFrames * Time; - return; - } - } - - pSample->m_PausedAt = pSample->m_NumFrames * Time; -} - -void CSound::SetChannel(int ChannelId, float Vol, float Pan) -{ - dbg_assert(ChannelId >= 0 && ChannelId < NUM_CHANNELS, "ChannelId invalid"); - - const CLockScope LockScope(m_SoundLock); - m_aChannels[ChannelId].m_Vol = (int)(Vol * 255.0f); - m_aChannels[ChannelId].m_Pan = (int)(Pan * 255.0f); // TODO: this is only on and off right now -} - -void CSound::SetListenerPosition(vec2 Position) -{ - m_ListenerPositionX.store(Position.x, std::memory_order_relaxed); - m_ListenerPositionY.store(Position.y, std::memory_order_relaxed); -} - -void CSound::SetVoiceVolume(CVoiceHandle Voice, float Volume) -{ - if(!Voice.IsValid()) - return; - - int VoiceId = Voice.Id(); - - const CLockScope LockScope(m_SoundLock); - if(m_aVoices[VoiceId].m_Age != Voice.Age()) - return; - - Volume = clamp(Volume, 0.0f, 1.0f); - m_aVoices[VoiceId].m_Vol = (int)(Volume * 255.0f); -} - -void CSound::SetVoiceFalloff(CVoiceHandle Voice, float Falloff) -{ - if(!Voice.IsValid()) - return; - - int VoiceId = Voice.Id(); - - const CLockScope LockScope(m_SoundLock); - if(m_aVoices[VoiceId].m_Age != Voice.Age()) - return; - - Falloff = clamp(Falloff, 0.0f, 1.0f); - m_aVoices[VoiceId].m_Falloff = Falloff; -} - -void CSound::SetVoicePosition(CVoiceHandle Voice, vec2 Position) -{ - if(!Voice.IsValid()) - return; - - int VoiceId = Voice.Id(); - - const CLockScope LockScope(m_SoundLock); - if(m_aVoices[VoiceId].m_Age != Voice.Age()) - return; - - m_aVoices[VoiceId].m_Position = Position; -} - -void CSound::SetVoiceTimeOffset(CVoiceHandle Voice, float TimeOffset) -{ - if(!Voice.IsValid()) - return; - - int VoiceId = Voice.Id(); - - const CLockScope LockScope(m_SoundLock); - if(m_aVoices[VoiceId].m_Age != Voice.Age()) - return; - - if(!m_aVoices[VoiceId].m_pSample) - return; - - int Tick = 0; - bool IsLooping = m_aVoices[VoiceId].m_Flags & ISound::FLAG_LOOP; - uint64_t TickOffset = m_aVoices[VoiceId].m_pSample->m_Rate * TimeOffset; - if(m_aVoices[VoiceId].m_pSample->m_NumFrames > 0 && IsLooping) - Tick = TickOffset % m_aVoices[VoiceId].m_pSample->m_NumFrames; - else - Tick = clamp(TickOffset, (uint64_t)0, (uint64_t)m_aVoices[VoiceId].m_pSample->m_NumFrames); - - // at least 200msec off, else depend on buffer size - float Threshold = maximum(0.2f * m_aVoices[VoiceId].m_pSample->m_Rate, (float)m_MaxFrames); - if(absolute(m_aVoices[VoiceId].m_Tick - Tick) > Threshold) - { - // take care of looping (modulo!) - if(!(IsLooping && (minimum(m_aVoices[VoiceId].m_Tick, Tick) + m_aVoices[VoiceId].m_pSample->m_NumFrames - maximum(m_aVoices[VoiceId].m_Tick, Tick)) <= Threshold)) - { - m_aVoices[VoiceId].m_Tick = Tick; - } - } -} - -void CSound::SetVoiceCircle(CVoiceHandle Voice, float Radius) -{ - if(!Voice.IsValid()) - return; - - int VoiceId = Voice.Id(); - - const CLockScope LockScope(m_SoundLock); - if(m_aVoices[VoiceId].m_Age != Voice.Age()) - return; - - m_aVoices[VoiceId].m_Shape = ISound::SHAPE_CIRCLE; - m_aVoices[VoiceId].m_Circle.m_Radius = maximum(0.0f, Radius); -} - -void CSound::SetVoiceRectangle(CVoiceHandle Voice, float Width, float Height) -{ - if(!Voice.IsValid()) - return; - - int VoiceId = Voice.Id(); - - const CLockScope LockScope(m_SoundLock); - if(m_aVoices[VoiceId].m_Age != Voice.Age()) - return; - - m_aVoices[VoiceId].m_Shape = ISound::SHAPE_RECTANGLE; - m_aVoices[VoiceId].m_Rectangle.m_Width = maximum(0.0f, Width); - m_aVoices[VoiceId].m_Rectangle.m_Height = maximum(0.0f, Height); -} - -ISound::CVoiceHandle CSound::Play(int ChannelId, int SampleId, int Flags, float Volume, vec2 Position) -{ - const CLockScope LockScope(m_SoundLock); - - // search for voice - int VoiceId = -1; - for(int i = 0; i < NUM_VOICES; i++) - { - int NextId = (m_NextVoice + i) % NUM_VOICES; - if(!m_aVoices[NextId].m_pSample) - { - VoiceId = NextId; - m_NextVoice = NextId + 1; - break; - } - } - if(VoiceId == -1) - { - return CreateVoiceHandle(-1, -1); - } - - // voice found, use it - m_aVoices[VoiceId].m_pSample = &m_aSamples[SampleId]; - m_aVoices[VoiceId].m_pChannel = &m_aChannels[ChannelId]; - if(Flags & FLAG_LOOP) - { - m_aVoices[VoiceId].m_Tick = m_aSamples[SampleId].m_PausedAt; - } - else if(Flags & FLAG_PREVIEW) - { - m_aVoices[VoiceId].m_Tick = m_aSamples[SampleId].m_PausedAt; - m_aSamples[SampleId].m_PausedAt = 0; - } - else - { - m_aVoices[VoiceId].m_Tick = 0; - } - m_aVoices[VoiceId].m_Vol = (int)(clamp(Volume, 0.0f, 1.0f) * 255.0f); - m_aVoices[VoiceId].m_Flags = Flags; - m_aVoices[VoiceId].m_Position = Position; - m_aVoices[VoiceId].m_Falloff = 0.0f; - m_aVoices[VoiceId].m_Shape = ISound::SHAPE_CIRCLE; - m_aVoices[VoiceId].m_Circle.m_Radius = 1500; - return CreateVoiceHandle(VoiceId, m_aVoices[VoiceId].m_Age); -} - -ISound::CVoiceHandle CSound::PlayAt(int ChannelId, int SampleId, int Flags, float Volume, vec2 Position) -{ - return Play(ChannelId, SampleId, Flags | ISound::FLAG_POS, Volume, Position); -} - -ISound::CVoiceHandle CSound::Play(int ChannelId, int SampleId, int Flags, float Volume) -{ - return Play(ChannelId, SampleId, Flags, Volume, vec2(0.0f, 0.0f)); -} - -void CSound::Pause(int SampleId) -{ - dbg_assert(SampleId >= 0 && SampleId < NUM_SAMPLES, "SampleId invalid"); - - // TODO: a nice fade out - const CLockScope LockScope(m_SoundLock); - CSample *pSample = &m_aSamples[SampleId]; - dbg_assert(m_aSamples[SampleId].IsLoaded(), "Sample not loaded"); - for(auto &Voice : m_aVoices) - { - if(Voice.m_pSample == pSample) - { - Voice.m_pSample->m_PausedAt = Voice.m_Tick; - Voice.m_pSample = nullptr; - } - } -} - -void CSound::Stop(int SampleId) -{ - dbg_assert(SampleId >= 0 && SampleId < NUM_SAMPLES, "SampleId invalid"); - - // TODO: a nice fade out - const CLockScope LockScope(m_SoundLock); - CSample *pSample = &m_aSamples[SampleId]; - dbg_assert(m_aSamples[SampleId].IsLoaded(), "Sample not loaded"); - for(auto &Voice : m_aVoices) - { - if(Voice.m_pSample == pSample) - { - if(Voice.m_Flags & FLAG_LOOP) - Voice.m_pSample->m_PausedAt = Voice.m_Tick; - else - Voice.m_pSample->m_PausedAt = 0; - Voice.m_pSample = nullptr; - } - } -} - -void CSound::StopAll() -{ - // TODO: a nice fade out - const CLockScope LockScope(m_SoundLock); - for(auto &Voice : m_aVoices) - { - if(Voice.m_pSample) - { - if(Voice.m_Flags & FLAG_LOOP) - Voice.m_pSample->m_PausedAt = Voice.m_Tick; - else - Voice.m_pSample->m_PausedAt = 0; - } - Voice.m_pSample = nullptr; - } -} - -void CSound::StopVoice(CVoiceHandle Voice) -{ - if(!Voice.IsValid()) - return; - - int VoiceId = Voice.Id(); - - const CLockScope LockScope(m_SoundLock); - if(m_aVoices[VoiceId].m_Age != Voice.Age()) - return; - - m_aVoices[VoiceId].m_pSample = nullptr; - m_aVoices[VoiceId].m_Age++; -} - -bool CSound::IsPlaying(int SampleId) -{ - dbg_assert(SampleId >= 0 && SampleId < NUM_SAMPLES, "SampleId invalid"); - const CLockScope LockScope(m_SoundLock); - const CSample *pSample = &m_aSamples[SampleId]; - dbg_assert(m_aSamples[SampleId].IsLoaded(), "Sample not loaded"); - return std::any_of(std::begin(m_aVoices), std::end(m_aVoices), [pSample](const auto &Voice) { return Voice.m_pSample == pSample; }); -} - -void CSound::PauseAudioDevice() -{ - SDL_PauseAudioDevice(m_Device, 1); -} - -void CSound::UnpauseAudioDevice() -{ - SDL_PauseAudioDevice(m_Device, 0); -} - -IEngineSound *CreateEngineSound() { return new CSound; } diff --git a/src/engine/client/sound.h b/src/engine/client/sound.h deleted file mode 100644 index 8bd13b4da9..0000000000 --- a/src/engine/client/sound.h +++ /dev/null @@ -1,148 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef ENGINE_CLIENT_SOUND_H -#define ENGINE_CLIENT_SOUND_H - -#include - -#include - -#include - -#include - -struct CSample -{ - int m_Index; - int m_NextFreeSampleIndex; - - short *m_pData; - int m_NumFrames; - int m_Rate; - int m_Channels; - int m_LoopStart; - int m_LoopEnd; - int m_PausedAt; - - float TotalTime() const - { - return m_NumFrames / (float)m_Rate; - } - - bool IsLoaded() const - { - return m_pData != nullptr; - } -}; - -struct CChannel -{ - int m_Vol; - int m_Pan; -}; - -struct CVoice -{ - CSample *m_pSample; - CChannel *m_pChannel; - int m_Age; // increases when reused - int m_Tick; - int m_Vol; // 0 - 255 - int m_Flags; - vec2 m_Position; - float m_Falloff; // [0.0, 1.0] - - int m_Shape; - union - { - ISound::CVoiceShapeCircle m_Circle; - ISound::CVoiceShapeRectangle m_Rectangle; - }; -}; - -class CSound : public IEngineSound -{ - enum - { - NUM_SAMPLES = 512, - NUM_VOICES = 256, - NUM_CHANNELS = 16, - }; - - bool m_SoundEnabled = false; - SDL_AudioDeviceID m_Device = 0; - CLock m_SoundLock; - - CSample m_aSamples[NUM_SAMPLES] GUARDED_BY(m_SoundLock) = {{0}}; - int m_FirstFreeSampleIndex GUARDED_BY(m_SoundLock) = 0; - - CVoice m_aVoices[NUM_VOICES] GUARDED_BY(m_SoundLock) = {{0}}; - CChannel m_aChannels[NUM_CHANNELS] GUARDED_BY(m_SoundLock) = {{255, 0}}; - int m_NextVoice GUARDED_BY(m_SoundLock) = 0; - uint32_t m_MaxFrames = 0; - - // This is not an std::atomic as this would require linking with - // libatomic with clang x86 as there is no native support for this. - std::atomic m_ListenerPositionX = 0.0f; - std::atomic m_ListenerPositionY = 0.0f; - std::atomic m_SoundVolume = 100; - int m_MixingRate = 48000; - - class IEngineGraphics *m_pGraphics = nullptr; - IStorage *m_pStorage = nullptr; - - int *m_pMixBuffer = nullptr; - - CSample *AllocSample() REQUIRES(!m_SoundLock); - void RateConvert(CSample &Sample) const; - - bool DecodeOpus(CSample &Sample, const void *pData, unsigned DataSize) const; - bool DecodeWV(CSample &Sample, const void *pData, unsigned DataSize) const; - - void UpdateVolume(); - -public: - int Init() override REQUIRES(!m_SoundLock); - int Update() override; - void Shutdown() override REQUIRES(!m_SoundLock); - - bool IsSoundEnabled() override { return m_SoundEnabled; } - - int LoadOpus(const char *pFilename, int StorageType = IStorage::TYPE_ALL) override REQUIRES(!m_SoundLock); - int LoadWV(const char *pFilename, int StorageType = IStorage::TYPE_ALL) override REQUIRES(!m_SoundLock); - int LoadOpusFromMem(const void *pData, unsigned DataSize, bool ForceLoad) override REQUIRES(!m_SoundLock); - int LoadWVFromMem(const void *pData, unsigned DataSize, bool ForceLoad) override REQUIRES(!m_SoundLock); - void UnloadSample(int SampleId) override REQUIRES(!m_SoundLock); - - float GetSampleTotalTime(int SampleId) override REQUIRES(!m_SoundLock); // in s - float GetSampleCurrentTime(int SampleId) override REQUIRES(!m_SoundLock); // in s - void SetSampleCurrentTime(int SampleId, float Time) override REQUIRES(!m_SoundLock); - - void SetChannel(int ChannelId, float Vol, float Pan) override REQUIRES(!m_SoundLock); - void SetListenerPosition(vec2 Position) override; - - void SetVoiceVolume(CVoiceHandle Voice, float Volume) override REQUIRES(!m_SoundLock); - void SetVoiceFalloff(CVoiceHandle Voice, float Falloff) override REQUIRES(!m_SoundLock); - void SetVoicePosition(CVoiceHandle Voice, vec2 Position) override REQUIRES(!m_SoundLock); - void SetVoiceTimeOffset(CVoiceHandle Voice, float TimeOffset) override REQUIRES(!m_SoundLock); // in s - - void SetVoiceCircle(CVoiceHandle Voice, float Radius) override REQUIRES(!m_SoundLock); - void SetVoiceRectangle(CVoiceHandle Voice, float Width, float Height) override REQUIRES(!m_SoundLock); - - CVoiceHandle Play(int ChannelId, int SampleId, int Flags, float Volume, vec2 Position) REQUIRES(!m_SoundLock); - CVoiceHandle PlayAt(int ChannelId, int SampleId, int Flags, float Volume, vec2 Position) override REQUIRES(!m_SoundLock); - CVoiceHandle Play(int ChannelId, int SampleId, int Flags, float Volume) override REQUIRES(!m_SoundLock); - void Pause(int SampleId) override REQUIRES(!m_SoundLock); - void Stop(int SampleId) override REQUIRES(!m_SoundLock); - void StopAll() override REQUIRES(!m_SoundLock); - void StopVoice(CVoiceHandle Voice) override REQUIRES(!m_SoundLock); - bool IsPlaying(int SampleId) override REQUIRES(!m_SoundLock); - - int MixingRate() const override { return m_MixingRate; } - void Mix(short *pFinalOut, unsigned Frames) override REQUIRES(!m_SoundLock); - - void PauseAudioDevice() override; - void UnpauseAudioDevice() override; -}; - -#endif diff --git a/src/engine/client/sqlite.cpp b/src/engine/client/sqlite.cpp deleted file mode 100644 index 41638b8cf7..0000000000 --- a/src/engine/client/sqlite.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include -#include -#include - -#include - -void CSqliteDeleter::operator()(sqlite3 *pSqlite) -{ - sqlite3_close(pSqlite); -} - -void CSqliteStmtDeleter::operator()(sqlite3_stmt *pStmt) -{ - sqlite3_finalize(pStmt); -} - -int SqliteHandleError(IConsole *pConsole, int Error, sqlite3 *pSqlite, const char *pContext) -{ - if(Error != SQLITE_OK && Error != SQLITE_DONE && Error != SQLITE_ROW) - { - char aBuf[512]; - str_format(aBuf, sizeof(aBuf), "%s at %s", sqlite3_errmsg(pSqlite), pContext); - pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "sqlite3", aBuf); - } - return Error; -} - -CSqlite SqliteOpen(IConsole *pConsole, IStorage *pStorage, const char *pPath) -{ - char aFullPath[IO_MAX_PATH_LENGTH]; - pStorage->GetCompletePath(IStorage::TYPE_SAVE, pPath, aFullPath, sizeof(aFullPath)); - sqlite3 *pSqlite = nullptr; - const bool ErrorOpening = SQLITE_HANDLE_ERROR(sqlite3_open(aFullPath, &pSqlite)) != SQLITE_OK; - // Even on error, the database is initialized and needs to be freed. - // Except on allocation failure, but then it'll be nullptr which is - // also fine. - CSqlite pResult{pSqlite}; - if(ErrorOpening) - { - return nullptr; - } - bool Error = false; - Error = Error || SQLITE_HANDLE_ERROR(sqlite3_exec(pSqlite, "PRAGMA journal_mode = WAL", nullptr, nullptr, nullptr)); - Error = Error || SQLITE_HANDLE_ERROR(sqlite3_exec(pSqlite, "PRAGMA synchronous = NORMAL", nullptr, nullptr, nullptr)); - if(Error) - { - return nullptr; - } - return pResult; -} - -CSqliteStmt SqlitePrepare(IConsole *pConsole, sqlite3 *pSqlite, const char *pStatement) -{ - sqlite3_stmt *pTemp; - if(SQLITE_HANDLE_ERROR(sqlite3_prepare_v2(pSqlite, pStatement, -1, &pTemp, nullptr))) - { - return nullptr; - } - return CSqliteStmt{pTemp}; -} diff --git a/src/engine/client/steam.cpp b/src/engine/client/steam.cpp deleted file mode 100644 index 6c1cd20ea1..0000000000 --- a/src/engine/client/steam.cpp +++ /dev/null @@ -1,149 +0,0 @@ -#include - -#include -#include - -#include - -class CSteam : public ISteam -{ - HSteamPipe m_SteamPipe; - ISteamApps *m_pSteamApps; - ISteamFriends *m_pSteamFriends; - char m_aPlayerName[16]; - bool m_GotConnectAddr; - NETADDR m_ConnectAddr; - -public: - CSteam() - { - SteamAPI_ManualDispatch_Init(); - m_SteamPipe = SteamAPI_GetHSteamPipe(); - m_pSteamApps = SteamAPI_SteamApps_v008(); - m_pSteamFriends = SteamAPI_SteamFriends_v017(); - - ReadLaunchCommandLine(); - str_copy(m_aPlayerName, SteamAPI_ISteamFriends_GetPersonaName(m_pSteamFriends)); - } - ~CSteam() override - { - SteamAPI_Shutdown(); - } - - void ParseConnectString(const char *pConnect) - { - if(pConnect[0]) - { - NETADDR Connect; - if(net_host_lookup(pConnect, &Connect, NETTYPE_ALL) == 0) - { - m_ConnectAddr = Connect; - m_GotConnectAddr = true; - } - else - { - dbg_msg("steam", "got unparsable connect string: '%s'", pConnect); - } - } - } - - void ReadLaunchCommandLine() - { - char aConnect[NETADDR_MAXSTRSIZE]; - int ConnectSize = SteamAPI_ISteamApps_GetLaunchCommandLine(m_pSteamApps, aConnect, sizeof(aConnect)); - if(ConnectSize >= NETADDR_MAXSTRSIZE) - { - ConnectSize = NETADDR_MAXSTRSIZE - 1; - } - aConnect[ConnectSize] = 0; - m_GotConnectAddr = false; - ParseConnectString(aConnect); - } - - void OnGameRichPresenceJoinRequested(GameRichPresenceJoinRequested_t *pEvent) - { - ParseConnectString(pEvent->m_aRGCHConnect); - } - - const char *GetPlayerName() override - { - return m_aPlayerName; - } - - const NETADDR *GetConnectAddress() override - { - if(m_GotConnectAddr) - { - return &m_ConnectAddr; - } - else - { - return 0; - } - } - void ClearConnectAddress() override - { - m_GotConnectAddr = false; - } - - void Update() override - { - SteamAPI_ManualDispatch_RunFrame(m_SteamPipe); - CallbackMsg_t Callback; - while(SteamAPI_ManualDispatch_GetNextCallback(m_SteamPipe, &Callback)) - { - switch(Callback.m_iCallback) - { - case NewUrlLaunchParameters_t::k_iCallback: - ReadLaunchCommandLine(); - break; - case GameRichPresenceJoinRequested_t::k_iCallback: - OnGameRichPresenceJoinRequested((GameRichPresenceJoinRequested_t *)Callback.m_pubParam); - break; - default: - if(g_Config.m_Debug) - { - dbg_msg("steam/dbg", "unhandled callback id=%d", Callback.m_iCallback); - } - } - SteamAPI_ManualDispatch_FreeLastCallback(m_SteamPipe); - } - } - void ClearGameInfo() override - { - SteamAPI_ISteamFriends_ClearRichPresence(m_pSteamFriends); - } - void SetGameInfo(const NETADDR &ServerAddr, const char *pMapName, bool AnnounceAddr) override - { - if(AnnounceAddr) - { - char aServerAddr[NETADDR_MAXSTRSIZE]; - net_addr_str(&ServerAddr, aServerAddr, sizeof(aServerAddr), true); - SteamAPI_ISteamFriends_SetRichPresence(m_pSteamFriends, "connect", aServerAddr); - SteamAPI_ISteamFriends_SetRichPresence(m_pSteamFriends, "steam_player_group", aServerAddr); - } - - SteamAPI_ISteamFriends_SetRichPresence(m_pSteamFriends, "map", pMapName); - SteamAPI_ISteamFriends_SetRichPresence(m_pSteamFriends, "status", pMapName); - SteamAPI_ISteamFriends_SetRichPresence(m_pSteamFriends, "steam_display", "#Status"); - } -}; - -class CSteamStub : public ISteam -{ - const char *GetPlayerName() override { return 0; } - const NETADDR *GetConnectAddress() override { return 0; } - void ClearConnectAddress() override {} - void Update() override {} - void ClearGameInfo() override {} - void SetGameInfo(const NETADDR &ServerAddr, const char *pMapName, bool AnnounceAddr) override {} -}; - -ISteam *CreateSteam() -{ - if(!SteamAPI_Init()) - { - return new CSteamStub(); - } - return new CSteam(); -} diff --git a/src/engine/client/text.cpp b/src/engine/client/text.cpp deleted file mode 100644 index 7bea8c5f89..0000000000 --- a/src/engine/client/text.cpp +++ /dev/null @@ -1,2359 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include -#include - -#include -#include -#include -#include -#include - -// ft2 texture -#include -#include FT_FREETYPE_H - -#include -#include -#include -#include -#include -#include - -using namespace std::chrono_literals; - -enum -{ - FONT_NAME_SIZE = 128, -}; - -struct SGlyph -{ - enum class EState - { - UNINITIALIZED, - RENDERED, - ERROR, - }; - EState m_State = EState::UNINITIALIZED; - - int m_FontSize; - FT_Face m_Face; - int m_Chr; - FT_UInt m_GlyphIndex; - - // these values are scaled to the font size - // width * font_size == real_size - float m_Width; - float m_Height; - float m_CharWidth; - float m_CharHeight; - float m_OffsetX; - float m_OffsetY; - float m_AdvanceX; - - float m_aUVs[4]; -}; - -struct SGlyphKeyHash -{ - size_t operator()(const std::tuple &Key) const - { - size_t Hash = 17; - Hash = Hash * 31 + std::hash()(std::get<0>(Key)); - Hash = Hash * 31 + std::hash()(std::get<1>(Key)); - Hash = Hash * 31 + std::hash()(std::get<2>(Key)); - return Hash; - } -}; - -struct SGlyphKeyEquals -{ - bool operator()(const std::tuple &Lhs, const std::tuple &Rhs) const - { - return std::get<0>(Lhs) == std::get<0>(Rhs) && std::get<1>(Lhs) == std::get<1>(Rhs) && std::get<2>(Lhs) == std::get<2>(Rhs); - } -}; - -class CAtlas -{ - struct SSectionKeyHash - { - size_t operator()(const std::tuple &Key) const - { - // Width and height should never be above 2^16 so this hash should cause no collisions - return (std::get<0>(Key) << 16) ^ std::get<1>(Key); - } - }; - - struct SSectionKeyEquals - { - bool operator()(const std::tuple &Lhs, const std::tuple &Rhs) const - { - return std::get<0>(Lhs) == std::get<0>(Rhs) && std::get<1>(Lhs) == std::get<1>(Rhs); - } - }; - - struct SSection - { - size_t m_X; - size_t m_Y; - size_t m_W; - size_t m_H; - - SSection() = default; - - SSection(size_t X, size_t Y, size_t W, size_t H) : - m_X(X), m_Y(Y), m_W(W), m_H(H) - { - } - }; - - /** - * Sections with a smaller width or height will not be created - * when cutting larger sections, to prevent collecting many - * small, mostly unusable sections. - */ - static constexpr size_t MIN_SECTION_DIMENSION = 6; - - /** - * Sections with larger width or height will be stored in m_vSections. - * Sections with width and height equal or smaller will be stored in m_SectionsMap. - * This achieves a good balance between the size of the vector storing all large - * sections and the map storing vectors of all sections with specific small sizes. - * Lowering this value will result in the size of m_vSections becoming the bottleneck. - * Increasing this value will result in the map becoming the bottleneck. - */ - static constexpr size_t MAX_SECTION_DIMENSION_MAPPED = 8 * MIN_SECTION_DIMENSION; - - size_t m_TextureDimension; - std::vector m_vSections; - std::unordered_map, std::vector, SSectionKeyHash, SSectionKeyEquals> m_SectionsMap; - - void AddSection(size_t X, size_t Y, size_t W, size_t H) - { - std::vector &vSections = W <= MAX_SECTION_DIMENSION_MAPPED && H <= MAX_SECTION_DIMENSION_MAPPED ? m_SectionsMap[std::make_tuple(W, H)] : m_vSections; - vSections.emplace_back(X, Y, W, H); - } - - void UseSection(const SSection &Section, size_t Width, size_t Height, int &PosX, int &PosY) - { - PosX = Section.m_X; - PosY = Section.m_Y; - - // Create cut sections - const size_t CutW = Section.m_W - Width; - const size_t CutH = Section.m_H - Height; - if(CutW == 0) - { - if(CutH >= MIN_SECTION_DIMENSION) - AddSection(Section.m_X, Section.m_Y + Height, Section.m_W, CutH); - } - else if(CutH == 0) - { - if(CutW >= MIN_SECTION_DIMENSION) - AddSection(Section.m_X + Width, Section.m_Y, CutW, Section.m_H); - } - else if(CutW > CutH) - { - if(CutW >= MIN_SECTION_DIMENSION) - AddSection(Section.m_X + Width, Section.m_Y, CutW, Section.m_H); - if(CutH >= MIN_SECTION_DIMENSION) - AddSection(Section.m_X, Section.m_Y + Height, Width, CutH); - } - else - { - if(CutH >= MIN_SECTION_DIMENSION) - AddSection(Section.m_X, Section.m_Y + Height, Section.m_W, CutH); - if(CutW >= MIN_SECTION_DIMENSION) - AddSection(Section.m_X + Width, Section.m_Y, CutW, Height); - } - } - -public: - void Clear(size_t TextureDimension) - { - m_TextureDimension = TextureDimension; - m_vSections.clear(); - m_vSections.emplace_back(0, 0, m_TextureDimension, m_TextureDimension); - m_SectionsMap.clear(); - } - - void IncreaseDimension(size_t NewTextureDimension) - { - dbg_assert(NewTextureDimension == m_TextureDimension * 2, "New atlas dimension must be twice the old one"); - // Create 3 square sections to cover the new area, add the sections - // to the beginning of the vector so they are considered last. - m_vSections.emplace_back(m_TextureDimension, m_TextureDimension, m_TextureDimension, m_TextureDimension); - m_vSections.emplace_back(m_TextureDimension, 0, m_TextureDimension, m_TextureDimension); - m_vSections.emplace_back(0, m_TextureDimension, m_TextureDimension, m_TextureDimension); - std::rotate(m_vSections.rbegin(), m_vSections.rbegin() + 3, m_vSections.rend()); - m_TextureDimension = NewTextureDimension; - } - - bool Add(size_t Width, size_t Height, int &PosX, int &PosY) - { - if(m_vSections.empty() || m_TextureDimension < Width || m_TextureDimension < Height) - return false; - - // Find small section more efficiently by using maps - if(Width <= MAX_SECTION_DIMENSION_MAPPED && Height <= MAX_SECTION_DIMENSION_MAPPED) - { - const auto UseSectionFromVector = [&](std::vector &vSections) { - if(!vSections.empty()) - { - const SSection Section = vSections.back(); - vSections.pop_back(); - UseSection(Section, Width, Height, PosX, PosY); - return true; - } - return false; - }; - - if(UseSectionFromVector(m_SectionsMap[std::make_tuple(Width, Height)])) - return true; - - for(size_t CheckWidth = Width + 1; CheckWidth <= MAX_SECTION_DIMENSION_MAPPED; ++CheckWidth) - { - if(UseSectionFromVector(m_SectionsMap[std::make_tuple(CheckWidth, Height)])) - return true; - } - - for(size_t CheckHeight = Height + 1; CheckHeight <= MAX_SECTION_DIMENSION_MAPPED; ++CheckHeight) - { - if(UseSectionFromVector(m_SectionsMap[std::make_tuple(Width, CheckHeight)])) - return true; - } - - // We don't iterate sections in the map with increasing width and height at the same time, - // because it's slower and doesn't noticeable increase the atlas utilization. - } - - // Check vector for larger section - size_t SmallestLossValue = std::numeric_limits::max(); - size_t SmallestLossIndex = m_vSections.size(); - size_t SectionIndex = m_vSections.size(); - do - { - --SectionIndex; - const SSection &Section = m_vSections[SectionIndex]; - if(Section.m_W < Width || Section.m_H < Height) - continue; - - const size_t LossW = Section.m_W - Width; - const size_t LossH = Section.m_H - Height; - - size_t Loss; - if(LossW == 0) - Loss = LossH; - else if(LossH == 0) - Loss = LossW; - else - Loss = LossW * LossH; - - if(Loss < SmallestLossValue) - { - SmallestLossValue = Loss; - SmallestLossIndex = SectionIndex; - if(SmallestLossValue == 0) - break; - } - } while(SectionIndex > 0); - if(SmallestLossIndex == m_vSections.size()) - return false; // No usable section found in vector - - // Use the section with the smallest loss - const SSection Section = m_vSections[SmallestLossIndex]; - m_vSections.erase(m_vSections.begin() + SmallestLossIndex); - UseSection(Section, Width, Height, PosX, PosY); - return true; - } -}; - -class CGlyphMap -{ -public: - enum - { - FONT_TEXTURE_FILL = 0, // the main text body - FONT_TEXTURE_OUTLINE, // the text outline - NUM_FONT_TEXTURES, - }; - -private: - /** - * The initial dimension of the atlas textures. - * Results in 1 MB of memory being used per texture. - */ - static constexpr int INITIAL_ATLAS_DIMENSION = 1024; - - /** - * The maximum dimension of the atlas textures. - * Results in 256 MB of memory being used per texture. - */ - static constexpr int MAXIMUM_ATLAS_DIMENSION = 16 * 1024; - - /** - * The minimum supported font size. - */ - static constexpr int MIN_FONT_SIZE = 6; - - /** - * The maximum supported font size. - */ - static constexpr int MAX_FONT_SIZE = 128; - - /** - * White square to indicate missing glyph. - */ - static constexpr int REPLACEMENT_CHARACTER = 0x25a1; - - IGraphics *m_pGraphics; - IGraphics *Graphics() { return m_pGraphics; } - - // Atlas textures and data - IGraphics::CTextureHandle m_aTextures[NUM_FONT_TEXTURES]; - // Width and height are the same, all font textures have the same dimensions - size_t m_TextureDimension = INITIAL_ATLAS_DIMENSION; - // Keep the full texture data, because OpenGL doesn't provide texture copying - uint8_t *m_apTextureData[NUM_FONT_TEXTURES]; - CAtlas m_TextureAtlas; - std::unordered_map, SGlyph, SGlyphKeyHash, SGlyphKeyEquals> m_Glyphs; - - // Font faces - FT_Face m_DefaultFace = nullptr; - FT_Face m_IconFace = nullptr; - FT_Face m_VariantFace = nullptr; - FT_Face m_SelectedFace = nullptr; - std::vector m_vFallbackFaces; - std::vector m_vFtFaces; - - FT_Face GetFaceByName(const char *pFamilyName) - { - if(pFamilyName == nullptr || pFamilyName[0] == '\0') - return nullptr; - - FT_Face FamilyNameMatch = nullptr; - char aFamilyStyleName[FONT_NAME_SIZE]; - - for(const auto &CurrentFace : m_vFtFaces) - { - // Best match: font face with matching family and style name - str_format(aFamilyStyleName, sizeof(aFamilyStyleName), "%s %s", CurrentFace->family_name, CurrentFace->style_name); - if(str_comp(pFamilyName, aFamilyStyleName) == 0) - { - return CurrentFace; - } - - // Second best match: font face with matching family - if(!FamilyNameMatch && str_comp(pFamilyName, CurrentFace->family_name) == 0) - { - FamilyNameMatch = CurrentFace; - } - } - - return FamilyNameMatch; - } - - bool IncreaseGlyphMapSize() - { - if(m_TextureDimension >= MAXIMUM_ATLAS_DIMENSION) - return false; - - const size_t NewTextureDimension = m_TextureDimension * 2; - log_debug("textrender", "Increasing atlas dimension to %" PRIzu " (%" PRIzu " MB used for textures)", NewTextureDimension, (NewTextureDimension / 1024) * (NewTextureDimension / 1024) * NUM_FONT_TEXTURES); - UnloadTextures(); - - for(auto &pTextureData : m_apTextureData) - { - uint8_t *pTmpTexBuffer = new uint8_t[NewTextureDimension * NewTextureDimension]; - mem_zero(pTmpTexBuffer, NewTextureDimension * NewTextureDimension * sizeof(uint8_t)); - for(size_t y = 0; y < m_TextureDimension; ++y) - { - mem_copy(&pTmpTexBuffer[y * NewTextureDimension], &pTextureData[y * m_TextureDimension], m_TextureDimension); - } - delete[] pTextureData; - pTextureData = pTmpTexBuffer; - } - - m_TextureAtlas.IncreaseDimension(NewTextureDimension); - - m_TextureDimension = NewTextureDimension; - - UploadTextures(); - return true; - } - - void UploadTextures() - { - const size_t NewTextureSize = m_TextureDimension * m_TextureDimension; - uint8_t *pTmpTextFillData = static_cast(malloc(NewTextureSize)); - uint8_t *pTmpTextOutlineData = static_cast(malloc(NewTextureSize)); - mem_copy(pTmpTextFillData, m_apTextureData[FONT_TEXTURE_FILL], NewTextureSize); - mem_copy(pTmpTextOutlineData, m_apTextureData[FONT_TEXTURE_OUTLINE], NewTextureSize); - Graphics()->LoadTextTextures(m_TextureDimension, m_TextureDimension, m_aTextures[FONT_TEXTURE_FILL], m_aTextures[FONT_TEXTURE_OUTLINE], pTmpTextFillData, pTmpTextOutlineData); - } - - void UnloadTextures() - { - Graphics()->UnloadTextTextures(m_aTextures[FONT_TEXTURE_FILL], m_aTextures[FONT_TEXTURE_OUTLINE]); - } - - FT_UInt GetCharGlyph(int Chr, FT_Face *pFace, bool AllowReplacementCharacter) - { - for(FT_Face Face : {m_SelectedFace, m_DefaultFace, m_VariantFace}) - { - if(Face && Face->charmap) - { - FT_UInt GlyphIndex = FT_Get_Char_Index(Face, (FT_ULong)Chr); - if(GlyphIndex) - { - *pFace = Face; - return GlyphIndex; - } - } - } - - for(const auto &FallbackFace : m_vFallbackFaces) - { - if(FallbackFace->charmap) - { - FT_UInt GlyphIndex = FT_Get_Char_Index(FallbackFace, (FT_ULong)Chr); - if(GlyphIndex) - { - *pFace = FallbackFace; - return GlyphIndex; - } - } - } - - if(!m_DefaultFace || !m_DefaultFace->charmap || !AllowReplacementCharacter) - { - *pFace = nullptr; - return 0; - } - - FT_UInt GlyphIndex = FT_Get_Char_Index(m_DefaultFace, (FT_ULong)REPLACEMENT_CHARACTER); - *pFace = m_DefaultFace; - - if(GlyphIndex == 0) - { - log_debug("textrender", "Default font has no glyph for either %d or replacement char %d.", Chr, REPLACEMENT_CHARACTER); - } - - return GlyphIndex; - } - - void Grow(const unsigned char *pIn, unsigned char *pOut, int w, int h, int OutlineCount) const - { - for(int y = 0; y < h; y++) - { - for(int x = 0; x < w; x++) - { - int c = pIn[y * w + x]; - - for(int sy = -OutlineCount; sy <= OutlineCount; sy++) - { - for(int sx = -OutlineCount; sx <= OutlineCount; sx++) - { - int GetX = x + sx; - int GetY = y + sy; - if(GetX >= 0 && GetY >= 0 && GetX < w && GetY < h) - { - int Index = GetY * w + GetX; - float Mask = 1.f - clamp(length(vec2(sx, sy)) - OutlineCount, 0.f, 1.f); - c = maximum(c, int(pIn[Index] * Mask)); - } - } - } - - pOut[y * w + x] = c; - } - } - } - - int AdjustOutlineThicknessToFontSize(int OutlineThickness, int FontSize) const - { - if(FontSize > 48) - OutlineThickness *= 4; - else if(FontSize >= 18) - OutlineThickness *= 2; - return OutlineThickness; - } - - void UploadGlyph(int TextureIndex, int PosX, int PosY, size_t Width, size_t Height, uint8_t *pData) - { - for(size_t y = 0; y < Height; ++y) - { - mem_copy(&m_apTextureData[TextureIndex][PosX + ((y + PosY) * m_TextureDimension)], &pData[y * Width], Width); - } - Graphics()->UpdateTextTexture(m_aTextures[TextureIndex], PosX, PosY, Width, Height, pData, true); - } - - bool FitGlyph(size_t Width, size_t Height, int &PosX, int &PosY) - { - return m_TextureAtlas.Add(Width, Height, PosX, PosY); - } - - bool RenderGlyph(SGlyph &Glyph) - { - FT_Set_Pixel_Sizes(Glyph.m_Face, 0, Glyph.m_FontSize); - - if(FT_Load_Glyph(Glyph.m_Face, Glyph.m_GlyphIndex, FT_LOAD_RENDER | FT_LOAD_NO_BITMAP)) - { - log_debug("textrender", "Error loading glyph. Chr=%d GlyphIndex=%u", Glyph.m_Chr, Glyph.m_GlyphIndex); - return false; - } - - const FT_Bitmap *pBitmap = &Glyph.m_Face->glyph->bitmap; - if(pBitmap->pixel_mode != FT_PIXEL_MODE_GRAY) - { - log_debug("textrender", "Error loading glyph, unsupported pixel mode. Chr=%d GlyphIndex=%u PixelMode=%d", Glyph.m_Chr, Glyph.m_GlyphIndex, pBitmap->pixel_mode); - return false; - } - - const unsigned RealWidth = pBitmap->width; - const unsigned RealHeight = pBitmap->rows; - - // adjust spacing - int OutlineThickness = 0; - int x = 0; - int y = 0; - if(RealWidth > 0) - { - OutlineThickness = AdjustOutlineThicknessToFontSize(1, Glyph.m_FontSize); - x += (OutlineThickness + 1); - y += (OutlineThickness + 1); - } - - const unsigned Width = RealWidth + x * 2; - const unsigned Height = RealHeight + y * 2; - - int X = 0; - int Y = 0; - - if(Width > 0 && Height > 0) - { - // find space in atlas, or increase size if necessary - while(!FitGlyph(Width, Height, X, Y)) - { - if(!IncreaseGlyphMapSize()) - { - log_debug("textrender", "Cannot fit glyph into atlas, which is already at maximum size. Chr=%d GlyphIndex=%u", Glyph.m_Chr, Glyph.m_GlyphIndex); - return false; - } - } - - // prepare glyph data - const size_t GlyphDataSize = (size_t)Width * Height * sizeof(uint8_t); - uint8_t *pGlyphDataFill = static_cast(malloc(GlyphDataSize)); - uint8_t *pGlyphDataOutline = static_cast(malloc(GlyphDataSize)); - mem_zero(pGlyphDataFill, GlyphDataSize); - for(unsigned py = 0; py < pBitmap->rows; ++py) - { - mem_copy(&pGlyphDataFill[(py + y) * Width + x], &pBitmap->buffer[py * pBitmap->width], pBitmap->width); - } - Grow(pGlyphDataFill, pGlyphDataOutline, Width, Height, OutlineThickness); - - // upload the glyph - UploadGlyph(FONT_TEXTURE_FILL, X, Y, Width, Height, pGlyphDataFill); - UploadGlyph(FONT_TEXTURE_OUTLINE, X, Y, Width, Height, pGlyphDataOutline); - } - - // set glyph info - { - Glyph.m_Height = Height; - Glyph.m_Width = Width; - Glyph.m_CharHeight = RealHeight; - Glyph.m_CharWidth = RealWidth; - Glyph.m_OffsetX = (Glyph.m_Face->glyph->metrics.horiBearingX >> 6); - Glyph.m_OffsetY = -((Glyph.m_Face->glyph->metrics.height >> 6) - (Glyph.m_Face->glyph->metrics.horiBearingY >> 6)); - Glyph.m_AdvanceX = (Glyph.m_Face->glyph->advance.x >> 6); - - Glyph.m_aUVs[0] = X; - Glyph.m_aUVs[1] = Y; - Glyph.m_aUVs[2] = Glyph.m_aUVs[0] + Width; - Glyph.m_aUVs[3] = Glyph.m_aUVs[1] + Height; - - Glyph.m_State = SGlyph::EState::RENDERED; - } - return true; - } - -public: - CGlyphMap(IGraphics *pGraphics) - { - m_pGraphics = pGraphics; - for(auto &pTextureData : m_apTextureData) - { - pTextureData = new uint8_t[m_TextureDimension * m_TextureDimension]; - mem_zero(pTextureData, m_TextureDimension * m_TextureDimension * sizeof(uint8_t)); - } - - m_TextureAtlas.Clear(m_TextureDimension); - UploadTextures(); - } - - ~CGlyphMap() - { - UnloadTextures(); - for(auto &pTextureData : m_apTextureData) - { - delete[] pTextureData; - } - } - - FT_Face DefaultFace() const - { - return m_DefaultFace; - } - - FT_Face IconFace() const - { - return m_IconFace; - } - - void AddFace(FT_Face Face) - { - m_vFtFaces.push_back(Face); - } - - bool SetDefaultFaceByName(const char *pFamilyName) - { - m_DefaultFace = GetFaceByName(pFamilyName); - if(!m_DefaultFace) - { - if(!m_vFtFaces.empty()) - { - m_DefaultFace = m_vFtFaces.front(); - } - log_error("textrender", "The default font face '%s' could not be found", pFamilyName); - return false; - } - return true; - } - - bool SetIconFaceByName(const char *pFamilyName) - { - m_IconFace = GetFaceByName(pFamilyName); - if(!m_IconFace) - { - log_error("textrender", "The icon font face '%s' could not be found", pFamilyName); - return false; - } - return true; - } - - bool AddFallbackFaceByName(const char *pFamilyName) - { - FT_Face Face = GetFaceByName(pFamilyName); - if(!Face) - { - log_error("textrender", "The fallback font face '%s' could not be found", pFamilyName); - return false; - } - if(std::find(m_vFallbackFaces.begin(), m_vFallbackFaces.end(), Face) != m_vFallbackFaces.end()) - { - log_warn("textrender", "The fallback font face '%s' was specified multiple times", pFamilyName); - return true; - } - m_vFallbackFaces.push_back(Face); - return true; - } - - bool SetVariantFaceByName(const char *pFamilyName) - { - FT_Face Face = GetFaceByName(pFamilyName); - if(m_VariantFace != Face) - { - m_VariantFace = Face; - Clear(); // rebuild atlas after changing variant font - if(!Face && pFamilyName != nullptr) - { - log_error("textrender", "The variant font face '%s' could not be found", pFamilyName); - return false; - } - } - return true; - } - - void SetFontPreset(EFontPreset FontPreset) - { - switch(FontPreset) - { - case EFontPreset::DEFAULT_FONT: - m_SelectedFace = nullptr; - break; - case EFontPreset::ICON_FONT: - m_SelectedFace = m_IconFace; - break; - } - } - - void Clear() - { - for(size_t TextureIndex = 0; TextureIndex < NUM_FONT_TEXTURES; ++TextureIndex) - { - mem_zero(m_apTextureData[TextureIndex], m_TextureDimension * m_TextureDimension * sizeof(uint8_t)); - Graphics()->UpdateTextTexture(m_aTextures[TextureIndex], 0, 0, m_TextureDimension, m_TextureDimension, m_apTextureData[TextureIndex], false); - } - - m_TextureAtlas.Clear(m_TextureDimension); - m_Glyphs.clear(); - } - - const SGlyph *GetGlyph(int Chr, int FontSize) - { - FontSize = clamp(FontSize, MIN_FONT_SIZE, MAX_FONT_SIZE); - - // Find glyph index and most appropriate font face. - FT_Face Face; - FT_UInt GlyphIndex = GetCharGlyph(Chr, &Face, false); - if(GlyphIndex == 0) - { - // Use replacement character if glyph could not be found, - // also retrieve replacement character from the atlas. - return Chr == REPLACEMENT_CHARACTER ? nullptr : GetGlyph(REPLACEMENT_CHARACTER, FontSize); - } - - // Check if glyph for this (font face, character, font size)-combination was already rendered. - SGlyph &Glyph = m_Glyphs[std::make_tuple(Face, Chr, FontSize)]; - if(Glyph.m_State == SGlyph::EState::RENDERED) - return &Glyph; - else if(Glyph.m_State == SGlyph::EState::ERROR) - return nullptr; - - // Else, render it. - Glyph.m_FontSize = FontSize; - Glyph.m_Face = Face; - Glyph.m_Chr = Chr; - Glyph.m_GlyphIndex = GlyphIndex; - if(RenderGlyph(Glyph)) - return &Glyph; - - // Use replacement character if the glyph could not be rendered, - // also retrieve replacement character from the atlas. - const SGlyph *pReplacementCharacter = Chr == REPLACEMENT_CHARACTER ? nullptr : GetGlyph(REPLACEMENT_CHARACTER, FontSize); - if(pReplacementCharacter) - { - Glyph = *pReplacementCharacter; - return &Glyph; - } - - // Keep failed glyph in the cache so we don't attempt to render it again, - // but set its state to ERROR so we don't return it to the text render. - Glyph.m_State = SGlyph::EState::ERROR; - return nullptr; - } - - vec2 Kerning(const SGlyph *pLeft, const SGlyph *pRight) const - { - if(pLeft != nullptr && pRight != nullptr && pLeft->m_Face == pRight->m_Face && pLeft->m_FontSize == pRight->m_FontSize) - { - FT_Vector Kerning = {0, 0}; - FT_Set_Pixel_Sizes(pLeft->m_Face, 0, pLeft->m_FontSize); - FT_Get_Kerning(pLeft->m_Face, pLeft->m_Chr, pRight->m_Chr, FT_KERNING_DEFAULT, &Kerning); - return vec2(Kerning.x >> 6, Kerning.y >> 6); - } - return vec2(0.0f, 0.0f); - } - - void UploadEntityLayerText(const CImageInfo &TextImage, int TexSubWidth, int TexSubHeight, const char *pText, int Length, float x, float y, int FontSize) - { - if(FontSize < 1) - return; - - const size_t PixelSize = TextImage.PixelSize(); - const char *pCurrent = pText; - const char *pEnd = pCurrent + Length; - int WidthLastChars = 0; - - while(pCurrent < pEnd) - { - const char *pTmp = pCurrent; - const int NextCharacter = str_utf8_decode(&pTmp); - - if(NextCharacter) - { - FT_Face Face; - FT_UInt GlyphIndex = GetCharGlyph(NextCharacter, &Face, true); - if(GlyphIndex == 0) - { - pCurrent = pTmp; - continue; - } - - FT_Set_Pixel_Sizes(Face, 0, FontSize); - if(FT_Load_Char(Face, NextCharacter, FT_LOAD_RENDER | FT_LOAD_NO_BITMAP)) - { - log_debug("textrender", "Error loading glyph. Chr=%d GlyphIndex=%u", NextCharacter, GlyphIndex); - pCurrent = pTmp; - continue; - } - - const FT_Bitmap *pBitmap = &Face->glyph->bitmap; - if(pBitmap->pixel_mode != FT_PIXEL_MODE_GRAY) - { - log_debug("textrender", "Error loading glyph, unsupported pixel mode. Chr=%d GlyphIndex=%u PixelMode=%d", NextCharacter, GlyphIndex, pBitmap->pixel_mode); - pCurrent = pTmp; - continue; - } - - for(unsigned OffY = 0; OffY < pBitmap->rows; ++OffY) - { - for(unsigned OffX = 0; OffX < pBitmap->width; ++OffX) - { - const int ImgOffX = clamp(x + OffX + WidthLastChars, x, (x + TexSubWidth) - 1); - const int ImgOffY = clamp(y + OffY, y, (y + TexSubHeight) - 1); - const size_t ImageOffset = ImgOffY * (TextImage.m_Width * PixelSize) + ImgOffX * PixelSize; - for(size_t i = 0; i < PixelSize - 1; ++i) - { - TextImage.m_pData[ImageOffset + i] = 255; - } - TextImage.m_pData[ImageOffset + PixelSize - 1] = pBitmap->buffer[OffY * pBitmap->width + OffX]; - } - } - - WidthLastChars += (pBitmap->width + 1); - } - pCurrent = pTmp; - } - } - - size_t TextureDimension() const - { - return m_TextureDimension; - } - - IGraphics::CTextureHandle Texture(size_t TextureIndex) const - { - return m_aTextures[TextureIndex]; - } -}; - -typedef vector4_base STextCharQuadVertexColor; - -struct STextCharQuadVertex -{ - STextCharQuadVertex() - { - m_Color.r = m_Color.g = m_Color.b = m_Color.a = 255; - } - float m_X, m_Y; - // do not use normalized floats as coordinates, since the texture might grow - float m_U, m_V; - STextCharQuadVertexColor m_Color; -}; - -struct STextCharQuad -{ - STextCharQuadVertex m_aVertices[4]; -}; - -struct SStringInfo -{ - int m_QuadBufferObjectIndex; - int m_QuadBufferContainerIndex; - int m_SelectionQuadContainerIndex; - - std::vector m_vCharacterQuads; -}; - -struct STextContainer -{ - STextContainer() - { - Reset(); - } - - SStringInfo m_StringInfo; - - // keep these values to calculate offsets - float m_AlignedStartX; - float m_AlignedStartY; - float m_X; - float m_Y; - - int m_Flags; - int m_LineCount; - int m_GlyphCount; - int m_CharCount; - int m_MaxLines; - float m_LineWidth; - - unsigned m_RenderFlags; - - bool m_HasCursor; - bool m_ForceCursorRendering; - bool m_HasSelection; - - bool m_SingleTimeUse; - - STextBoundingBox m_BoundingBox; - - // prefix of the container's text stored for debugging purposes - char m_aDebugText[32]; - - STextContainerIndex m_ContainerIndex; - - void Reset() - { - m_StringInfo.m_QuadBufferObjectIndex = m_StringInfo.m_QuadBufferContainerIndex = m_StringInfo.m_SelectionQuadContainerIndex = -1; - m_StringInfo.m_vCharacterQuads.clear(); - - m_AlignedStartX = m_AlignedStartY = m_X = m_Y = 0.0f; - m_Flags = m_LineCount = m_CharCount = m_GlyphCount = 0; - m_MaxLines = -1; - m_LineWidth = -1.0f; - - m_RenderFlags = 0; - - m_HasCursor = false; - m_ForceCursorRendering = false; - m_HasSelection = false; - - m_SingleTimeUse = false; - - m_BoundingBox = {0.0f, 0.0f, 0.0f, 0.0f}; - - m_aDebugText[0] = '\0'; - - m_ContainerIndex = STextContainerIndex{}; - } -}; - -struct SFontLanguageVariant -{ - char m_aLanguageFile[IO_MAX_PATH_LENGTH]; - char m_aFamilyName[FONT_NAME_SIZE]; -}; - -class CTextRender : public IEngineTextRender -{ - IConsole *m_pConsole; - IGraphics *m_pGraphics; - IStorage *m_pStorage; - IConsole *Console() { return m_pConsole; } - IGraphics *Graphics() { return m_pGraphics; } - IStorage *Storage() { return m_pStorage; } - - CGlyphMap *m_pGlyphMap; - std::vector m_vpFontData; - - std::vector m_vVariants; - - unsigned m_RenderFlags; - - ColorRGBA m_Color; - ColorRGBA m_OutlineColor; - ColorRGBA m_SelectionColor; - - FT_Library m_FTLibrary; - - std::vector m_vpTextContainers; - std::vector m_vTextContainerIndices; - int m_FirstFreeTextContainerIndex; - - SBufferContainerInfo m_DefaultTextContainerInfo; - - std::chrono::nanoseconds m_CursorRenderTime; - - int GetFreeTextContainerIndex() - { - if(m_FirstFreeTextContainerIndex == -1) - { - const int Index = (int)m_vTextContainerIndices.size(); - m_vTextContainerIndices.push_back(Index); - return Index; - } - else - { - const int Index = m_FirstFreeTextContainerIndex; - m_FirstFreeTextContainerIndex = m_vTextContainerIndices[Index]; - m_vTextContainerIndices[Index] = Index; - return Index; - } - } - - void FreeTextContainerIndex(STextContainerIndex &Index) - { - m_vTextContainerIndices[Index.m_Index] = m_FirstFreeTextContainerIndex; - m_FirstFreeTextContainerIndex = Index.m_Index; - Index.Reset(); - } - - void FreeTextContainer(STextContainerIndex &Index) - { - m_vpTextContainers[Index.m_Index]->Reset(); - FreeTextContainerIndex(Index); - } - - STextContainer &GetTextContainer(const STextContainerIndex &Index) - { - dbg_assert(Index.Valid(), "Text container index was invalid."); - if(Index.m_Index >= (int)m_vpTextContainers.size()) - { - for(int i = 0; i < Index.m_Index + 1 - (int)m_vpTextContainers.size(); ++i) - m_vpTextContainers.push_back(new STextContainer()); - } - - if(m_vpTextContainers[Index.m_Index]->m_ContainerIndex.m_UseCount.get() != Index.m_UseCount.get()) - { - m_vpTextContainers[Index.m_Index]->m_ContainerIndex = Index; - } - return *m_vpTextContainers[Index.m_Index]; - } - - int WordLength(const char *pText) const - { - const char *pCursor = pText; - while(true) - { - if(*pCursor == '\0') - return pCursor - pText; - if(*pCursor == '\n' || *pCursor == '\t' || *pCursor == ' ') - return pCursor - pText + 1; - str_utf8_decode(&pCursor); - } - } - - bool LoadFontCollection(const char *pFontName, const FT_Byte *pFontData, FT_Long FontDataSize) - { - FT_Face FtFace; - FT_Error CollectionLoadError = FT_New_Memory_Face(m_FTLibrary, pFontData, FontDataSize, -1, &FtFace); - if(CollectionLoadError) - { - log_error("textrender", "Failed to load font file '%s': %s", pFontName, FT_Error_String(CollectionLoadError)); - return false; - } - - const FT_Long NumFaces = FtFace->num_faces; - FT_Done_Face(FtFace); - - bool LoadedAny = false; - for(FT_Long FaceIndex = 0; FaceIndex < NumFaces; ++FaceIndex) - { - FT_Error FaceLoadError = FT_New_Memory_Face(m_FTLibrary, pFontData, FontDataSize, FaceIndex, &FtFace); - if(FaceLoadError) - { - log_error("textrender", "Failed to load font face %ld from font file '%s': %s", FaceIndex, pFontName, FT_Error_String(FaceLoadError)); - FT_Done_Face(FtFace); - continue; - } - - m_pGlyphMap->AddFace(FtFace); - - log_debug("textrender", "Loaded font face %ld '%s %s' from font file '%s'", FaceIndex, FtFace->family_name, FtFace->style_name, pFontName); - LoadedAny = true; - } - - if(!LoadedAny) - { - log_error("textrender", "Failed to load font file '%s': no font faces could be loaded", pFontName); - return false; - } - - return true; - } - - void SetRenderFlags(unsigned Flags) override - { - m_RenderFlags = Flags; - } - - unsigned GetRenderFlags() const override - { - return m_RenderFlags; - } - -public: - CTextRender() - { - m_pConsole = nullptr; - m_pGraphics = nullptr; - m_pStorage = nullptr; - m_pGlyphMap = nullptr; - - m_Color = DefaultTextColor(); - m_OutlineColor = DefaultTextOutlineColor(); - m_SelectionColor = DefaultTextSelectionColor(); - - m_FTLibrary = nullptr; - - m_RenderFlags = 0; - m_CursorRenderTime = time_get_nanoseconds(); - } - - void Init() override - { - m_pConsole = Kernel()->RequestInterface(); - m_pGraphics = Kernel()->RequestInterface(); - m_pStorage = Kernel()->RequestInterface(); - FT_Init_FreeType(&m_FTLibrary); - m_pGlyphMap = new CGlyphMap(m_pGraphics); - - // print freetype version - { - int LMajor, LMinor, LPatch; - FT_Library_Version(m_FTLibrary, &LMajor, &LMinor, &LPatch); - log_info("textrender", "Freetype version %d.%d.%d (compiled = %d.%d.%d)", LMajor, LMinor, LPatch, FREETYPE_MAJOR, FREETYPE_MINOR, FREETYPE_PATCH); - } - - m_FirstFreeTextContainerIndex = -1; - - m_DefaultTextContainerInfo.m_Stride = sizeof(STextCharQuadVertex); - m_DefaultTextContainerInfo.m_VertBufferBindingIndex = -1; - - m_DefaultTextContainerInfo.m_vAttributes.emplace_back(); - SBufferContainerInfo::SAttribute *pAttr = &m_DefaultTextContainerInfo.m_vAttributes.back(); - pAttr->m_DataTypeCount = 2; - pAttr->m_FuncType = 0; - pAttr->m_Normalized = false; - pAttr->m_pOffset = nullptr; - pAttr->m_Type = GRAPHICS_TYPE_FLOAT; - - m_DefaultTextContainerInfo.m_vAttributes.emplace_back(); - pAttr = &m_DefaultTextContainerInfo.m_vAttributes.back(); - pAttr->m_DataTypeCount = 2; - pAttr->m_FuncType = 0; - pAttr->m_Normalized = false; - pAttr->m_pOffset = (void *)(sizeof(float) * 2); - pAttr->m_Type = GRAPHICS_TYPE_FLOAT; - - m_DefaultTextContainerInfo.m_vAttributes.emplace_back(); - pAttr = &m_DefaultTextContainerInfo.m_vAttributes.back(); - pAttr->m_DataTypeCount = 4; - pAttr->m_FuncType = 0; - pAttr->m_Normalized = true; - pAttr->m_pOffset = (void *)(sizeof(float) * 2 + sizeof(float) * 2); - pAttr->m_Type = GRAPHICS_TYPE_UNSIGNED_BYTE; - } - - void Shutdown() override - { - for(auto *pTextCont : m_vpTextContainers) - delete pTextCont; - m_vpTextContainers.clear(); - - delete m_pGlyphMap; - m_pGlyphMap = nullptr; - - if(m_FTLibrary != nullptr) - FT_Done_FreeType(m_FTLibrary); - m_FTLibrary = nullptr; - - for(auto *pFontData : m_vpFontData) - free(pFontData); - m_vpFontData.clear(); - - m_DefaultTextContainerInfo.m_vAttributes.clear(); - - m_pConsole = nullptr; - m_pGraphics = nullptr; - m_pStorage = nullptr; - } - - bool LoadFonts() override - { - // read file data into buffer - const char *pFilename = "fonts/index.json"; - void *pFileData; - unsigned JsonFileSize; - if(!Storage()->ReadFile(pFilename, IStorage::TYPE_ALL, &pFileData, &JsonFileSize)) - { - log_error("textrender", "Failed to open/read font index file '%s'", pFilename); - return false; - } - - // parse json data - json_settings JsonSettings{}; - char aError[256]; - json_value *pJsonData = json_parse_ex(&JsonSettings, static_cast(pFileData), JsonFileSize, aError); - free(pFileData); - if(pJsonData == nullptr) - { - log_error("textrender", "Failed to parse font index file '%s': %s", pFilename, aError); - return false; - } - if(pJsonData->type != json_object) - { - log_error("textrender", "Font index malformed: root must be an object", pFilename, aError); - return false; - } - - bool Success = true; - - // extract font file definitions - const json_value &FontFiles = (*pJsonData)["font files"]; - if(FontFiles.type == json_array) - { - for(unsigned FontFileIndex = 0; FontFileIndex < FontFiles.u.array.length; ++FontFileIndex) - { - if(FontFiles[FontFileIndex].type != json_string) - { - log_error("textrender", "Font index malformed: 'font files' must be an array of strings (error at index %d)", FontFileIndex); - Success = false; - continue; - } - - char aFontName[IO_MAX_PATH_LENGTH]; - str_format(aFontName, sizeof(aFontName), "fonts/%s", FontFiles[FontFileIndex].u.string.ptr); - void *pFontData; - unsigned FontDataSize; - if(Storage()->ReadFile(aFontName, IStorage::TYPE_ALL, &pFontData, &FontDataSize)) - { - if(LoadFontCollection(aFontName, static_cast(pFontData), (FT_Long)FontDataSize)) - { - m_vpFontData.push_back(pFontData); - } - else - { - free(pFontData); - } - } - else - { - log_error("textrender", "Failed to open/read font file '%s'", aFontName); - Success = false; - } - } - } - else - { - log_error("textrender", "Font index malformed: 'font files' must be an array"); - Success = false; - } - - // extract default family name - const json_value &DefaultFace = (*pJsonData)["default"]; - if(DefaultFace.type == json_string) - { - if(!m_pGlyphMap->SetDefaultFaceByName(DefaultFace.u.string.ptr)) - { - Success = false; - } - } - else - { - log_error("textrender", "Font index malformed: 'default' must be a string"); - Success = false; - } - - // extract language variant family names - const json_value &Variants = (*pJsonData)["language variants"]; - if(Variants.type == json_object) - { - m_vVariants.reserve(Variants.u.object.length); - for(size_t i = 0; i < Variants.u.object.length; ++i) - { - const json_value *pFamilyName = Variants.u.object.values[i].value; - if(pFamilyName->type != json_string) - { - log_error("textrender", "Font index malformed: 'language variants' entries must have string values (error on entry '%s')", Variants.u.object.values[i].name); - Success = false; - continue; - } - - SFontLanguageVariant Variant; - str_format(Variant.m_aLanguageFile, sizeof(Variant.m_aLanguageFile), "languages/%s.txt", Variants.u.object.values[i].name); - str_copy(Variant.m_aFamilyName, pFamilyName->u.string.ptr); - m_vVariants.emplace_back(Variant); - } - } - else - { - log_error("textrender", "Font index malformed: 'language variants' must be an array"); - Success = false; - } - - // extract fallback family names - const json_value &FallbackFaces = (*pJsonData)["fallbacks"]; - if(FallbackFaces.type == json_array) - { - for(unsigned i = 0; i < FallbackFaces.u.array.length; ++i) - { - if(FallbackFaces[i].type != json_string) - { - log_error("textrender", "Font index malformed: 'fallbacks' must be an array of strings (error at index %d)", i); - Success = false; - continue; - } - if(!m_pGlyphMap->AddFallbackFaceByName(FallbackFaces[i].u.string.ptr)) - { - Success = false; - } - } - } - else - { - log_error("textrender", "Font index malformed: 'fallbacks' must be an array"); - Success = false; - } - - // extract icon font family name - const json_value &IconFace = (*pJsonData)["icon"]; - if(IconFace.type == json_string) - { - if(!m_pGlyphMap->SetIconFaceByName(IconFace.u.string.ptr)) - { - Success = false; - } - } - else - { - log_error("textrender", "Font index malformed: 'icon' must be a string"); - Success = false; - } - - json_value_free(pJsonData); - return Success; - } - - void SetFontPreset(EFontPreset FontPreset) override - { - m_pGlyphMap->SetFontPreset(FontPreset); - } - - void SetFontLanguageVariant(const char *pLanguageFile) override - { - for(const auto &Variant : m_vVariants) - { - if(str_comp(pLanguageFile, Variant.m_aLanguageFile) == 0) - { - m_pGlyphMap->SetVariantFaceByName(Variant.m_aFamilyName); - return; - } - } - m_pGlyphMap->SetVariantFaceByName(nullptr); - } - - void SetCursor(CTextCursor *pCursor, float x, float y, float FontSize, int Flags) const override - { - pCursor->m_Flags = Flags; - pCursor->m_LineCount = 1; - pCursor->m_GlyphCount = 0; - pCursor->m_CharCount = 0; - pCursor->m_MaxLines = 0; - - pCursor->m_LineSpacing = 0; - pCursor->m_AlignedLineSpacing = 0; - - pCursor->m_StartX = x; - pCursor->m_StartY = y; - pCursor->m_LineWidth = -1.0f; - pCursor->m_X = x; - pCursor->m_Y = y; - pCursor->m_MaxCharacterHeight = 0.0f; - pCursor->m_LongestLineWidth = 0.0f; - - pCursor->m_FontSize = FontSize; - pCursor->m_AlignedFontSize = FontSize; - - pCursor->m_CalculateSelectionMode = TEXT_CURSOR_SELECTION_MODE_NONE; - pCursor->m_SelectionHeightFactor = 1.0f; - pCursor->m_PressMouse = vec2(0.0f, 0.0f); - pCursor->m_ReleaseMouse = vec2(0.0f, 0.0f); - pCursor->m_SelectionStart = 0; - pCursor->m_SelectionEnd = 0; - - pCursor->m_CursorMode = TEXT_CURSOR_CURSOR_MODE_NONE; - pCursor->m_ForceCursorRendering = false; - pCursor->m_CursorCharacter = -1; - pCursor->m_CursorRenderedPosition = vec2(-1.0f, -1.0f); - - pCursor->m_vColorSplits = {}; - } - - void MoveCursor(CTextCursor *pCursor, float x, float y) const override - { - pCursor->m_X += x; - pCursor->m_Y += y; - } - - void SetCursorPosition(CTextCursor *pCursor, float x, float y) const override - { - pCursor->m_X = x; - pCursor->m_Y = y; - } - - void Text(float x, float y, float Size, const char *pText, float LineWidth = -1.0f) override - { - CTextCursor Cursor; - SetCursor(&Cursor, x, y, Size, TEXTFLAG_RENDER); - Cursor.m_LineWidth = LineWidth; - TextEx(&Cursor, pText, -1); - } - - float TextWidth(float Size, const char *pText, int StrLength = -1, float LineWidth = -1.0f, int Flags = 0, const STextSizeProperties &TextSizeProps = {}) override - { - CTextCursor Cursor; - SetCursor(&Cursor, 0, 0, Size, Flags); - Cursor.m_LineWidth = LineWidth; - TextEx(&Cursor, pText, StrLength); - if(TextSizeProps.m_pHeight != nullptr) - *TextSizeProps.m_pHeight = Cursor.Height(); - if(TextSizeProps.m_pAlignedFontSize != nullptr) - *TextSizeProps.m_pAlignedFontSize = Cursor.m_AlignedFontSize; - if(TextSizeProps.m_pMaxCharacterHeightInLine != nullptr) - *TextSizeProps.m_pMaxCharacterHeightInLine = Cursor.m_MaxCharacterHeight; - if(TextSizeProps.m_pLineCount != nullptr) - *TextSizeProps.m_pLineCount = Cursor.m_LineCount; - return Cursor.m_LongestLineWidth; - } - - STextBoundingBox TextBoundingBox(float Size, const char *pText, int StrLength = -1, float LineWidth = -1.0f, float LineSpacing = 0.0f, int Flags = 0) override - { - CTextCursor Cursor; - SetCursor(&Cursor, 0, 0, Size, Flags); - Cursor.m_LineWidth = LineWidth; - Cursor.m_LineSpacing = LineSpacing; - TextEx(&Cursor, pText, StrLength); - return Cursor.BoundingBox(); - } - - void TextColor(float r, float g, float b, float a) override - { - m_Color.r = r; - m_Color.g = g; - m_Color.b = b; - m_Color.a = a; - } - - void TextColor(ColorRGBA Color) override - { - m_Color = Color; - } - - void TextOutlineColor(float r, float g, float b, float a) override - { - m_OutlineColor.r = r; - m_OutlineColor.g = g; - m_OutlineColor.b = b; - m_OutlineColor.a = a; - } - - void TextOutlineColor(ColorRGBA Color) override - { - m_OutlineColor = Color; - } - - void TextSelectionColor(float r, float g, float b, float a) override - { - m_SelectionColor.r = r; - m_SelectionColor.g = g; - m_SelectionColor.b = b; - m_SelectionColor.a = a; - } - - void TextSelectionColor(ColorRGBA Color) override - { - m_SelectionColor = Color; - } - - ColorRGBA GetTextColor() const override - { - return m_Color; - } - - ColorRGBA GetTextOutlineColor() const override - { - return m_OutlineColor; - } - - ColorRGBA GetTextSelectionColor() const override - { - return m_SelectionColor; - } - - void TextEx(CTextCursor *pCursor, const char *pText, int Length = -1) override - { - const unsigned OldRenderFlags = m_RenderFlags; - m_RenderFlags |= TEXT_RENDER_FLAG_ONE_TIME_USE; - STextContainerIndex TextCont; - CreateTextContainer(TextCont, pCursor, pText, Length); - m_RenderFlags = OldRenderFlags; - if(TextCont.Valid()) - { - if((pCursor->m_Flags & TEXTFLAG_RENDER) != 0) - { - ColorRGBA TextColor = DefaultTextColor(); - ColorRGBA TextColorOutline = DefaultTextOutlineColor(); - RenderTextContainer(TextCont, TextColor, TextColorOutline); - } - DeleteTextContainer(TextCont); - } - } - - bool CreateTextContainer(STextContainerIndex &TextContainerIndex, CTextCursor *pCursor, const char *pText, int Length = -1) override - { - dbg_assert(!TextContainerIndex.Valid(), "Text container index was not cleared."); - - TextContainerIndex.Reset(); - TextContainerIndex.m_Index = GetFreeTextContainerIndex(); - - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - - STextContainer &TextContainer = GetTextContainer(TextContainerIndex); - TextContainer.m_SingleTimeUse = (m_RenderFlags & TEXT_RENDER_FLAG_ONE_TIME_USE) != 0; - const vec2 FakeToScreen = vec2(Graphics()->ScreenWidth() / (ScreenX1 - ScreenX0), Graphics()->ScreenHeight() / (ScreenY1 - ScreenY0)); - TextContainer.m_AlignedStartX = round_to_int(pCursor->m_X * FakeToScreen.x) / FakeToScreen.x; - TextContainer.m_AlignedStartY = round_to_int(pCursor->m_Y * FakeToScreen.y) / FakeToScreen.y; - TextContainer.m_X = pCursor->m_X; - TextContainer.m_Y = pCursor->m_Y; - TextContainer.m_Flags = pCursor->m_Flags; - - if(pCursor->m_LineWidth <= 0) - TextContainer.m_RenderFlags = m_RenderFlags | ETextRenderFlags::TEXT_RENDER_FLAG_NO_FIRST_CHARACTER_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_LAST_CHARACTER_ADVANCE; - else - TextContainer.m_RenderFlags = m_RenderFlags; - - AppendTextContainer(TextContainerIndex, pCursor, pText, Length); - - const bool IsRendered = (pCursor->m_Flags & TEXTFLAG_RENDER) != 0; - - if(TextContainer.m_StringInfo.m_vCharacterQuads.empty() && TextContainer.m_StringInfo.m_SelectionQuadContainerIndex == -1 && IsRendered) - { - FreeTextContainer(TextContainerIndex); - return false; - } - else - { - if(Graphics()->IsTextBufferingEnabled() && IsRendered && !TextContainer.m_StringInfo.m_vCharacterQuads.empty()) - { - if((TextContainer.m_RenderFlags & TEXT_RENDER_FLAG_NO_AUTOMATIC_QUAD_UPLOAD) == 0) - { - UploadTextContainer(TextContainerIndex); - } - } - - TextContainer.m_LineCount = pCursor->m_LineCount; - TextContainer.m_GlyphCount = pCursor->m_GlyphCount; - TextContainer.m_CharCount = pCursor->m_CharCount; - TextContainer.m_MaxLines = pCursor->m_MaxLines; - TextContainer.m_LineWidth = pCursor->m_LineWidth; - return true; - } - } - - void AppendTextContainer(STextContainerIndex TextContainerIndex, CTextCursor *pCursor, const char *pText, int Length = -1) override - { - STextContainer &TextContainer = GetTextContainer(TextContainerIndex); - str_append(TextContainer.m_aDebugText, pText); - - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - - const vec2 FakeToScreen = vec2(Graphics()->ScreenWidth() / (ScreenX1 - ScreenX0), Graphics()->ScreenHeight() / (ScreenY1 - ScreenY0)); - const float CursorX = round_to_int(pCursor->m_X * FakeToScreen.x) / FakeToScreen.x; - const float CursorY = round_to_int(pCursor->m_Y * FakeToScreen.y) / FakeToScreen.y; - const int ActualSize = round_truncate(pCursor->m_FontSize * FakeToScreen.y); - pCursor->m_AlignedFontSize = ActualSize / FakeToScreen.y; - pCursor->m_AlignedLineSpacing = round_truncate(pCursor->m_LineSpacing * FakeToScreen.y) / FakeToScreen.y; - - // string length - if(Length < 0) - Length = str_length(pText); - else - Length = minimum(Length, str_length(pText)); - - const char *pCurrent = pText; - const char *pEnd = pCurrent + Length; - const char *pPrevBatchEnd = nullptr; - const char *pEllipsis = "…"; - const SGlyph *pEllipsisGlyph = nullptr; - if(pCursor->m_Flags & TEXTFLAG_ELLIPSIS_AT_END) - { - if(pCursor->m_LineWidth != -1 && pCursor->m_LineWidth < TextWidth(pCursor->m_FontSize, pText, -1, -1.0f)) - { - pEllipsisGlyph = m_pGlyphMap->GetGlyph(0x2026, ActualSize); // … - if(pEllipsisGlyph == nullptr) - { - // no ellipsis char in font, just stop at end instead - pCursor->m_Flags &= ~TEXTFLAG_ELLIPSIS_AT_END; - pCursor->m_Flags |= TEXTFLAG_STOP_AT_END; - } - } - } - - const unsigned RenderFlags = TextContainer.m_RenderFlags; - - float DrawX = 0.0f, DrawY = 0.0f; - if((RenderFlags & TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT) != 0) - { - DrawX = pCursor->m_X; - DrawY = pCursor->m_Y; - } - else - { - DrawX = CursorX; - DrawY = CursorY; - } - - int LineCount = pCursor->m_LineCount; - - const bool IsRendered = (pCursor->m_Flags & TEXTFLAG_RENDER) != 0; - - const float CursorInnerWidth = (((ScreenX1 - ScreenX0) / Graphics()->ScreenWidth())) * 2; - const float CursorOuterWidth = CursorInnerWidth * 2; - const float CursorOuterInnerDiff = (CursorOuterWidth - CursorInnerWidth) / 2; - - std::vector vSelectionQuads; - int SelectionQuadLine = -1; - bool SelectionStarted = false; - bool SelectionUsedPress = false; - bool SelectionUsedRelease = false; - int SelectionStartChar = -1; - int SelectionEndChar = -1; - - const auto &&CheckInsideChar = [&](bool CheckOuter, vec2 CursorPos, float LastCharX, float LastCharWidth, float CharX, float CharWidth, float CharY) -> bool { - return (LastCharX - LastCharWidth / 2 <= CursorPos.x && - CharX + CharWidth / 2 > CursorPos.x && - CursorPos.y >= CharY - pCursor->m_AlignedFontSize && - CursorPos.y < CharY + pCursor->m_AlignedLineSpacing) || - (CheckOuter && - CursorPos.y <= CharY - pCursor->m_AlignedFontSize); - }; - const auto &&CheckSelectionStart = [&](bool CheckOuter, vec2 CursorPos, int &SelectionChar, bool &SelectionUsedCase, float LastCharX, float LastCharWidth, float CharX, float CharWidth, float CharY) { - if(!SelectionStarted && !SelectionUsedCase && - CheckInsideChar(CheckOuter, CursorPos, LastCharX, LastCharWidth, CharX, CharWidth, CharY)) - { - SelectionChar = pCursor->m_GlyphCount; - SelectionStarted = !SelectionStarted; - SelectionUsedCase = true; - } - }; - const auto &&CheckOutsideChar = [&](bool CheckOuter, vec2 CursorPos, float CharX, float CharWidth, float CharY) -> bool { - return (CharX + CharWidth / 2 > CursorPos.x && - CursorPos.y >= CharY - pCursor->m_AlignedFontSize && - CursorPos.y < CharY + pCursor->m_AlignedLineSpacing) || - (CheckOuter && - CursorPos.y >= CharY + pCursor->m_AlignedLineSpacing); - }; - const auto &&CheckSelectionEnd = [&](bool CheckOuter, vec2 CursorPos, int &SelectionChar, bool &SelectionUsedCase, float CharX, float CharWidth, float CharY) { - if(SelectionStarted && !SelectionUsedCase && - CheckOutsideChar(CheckOuter, CursorPos, CharX, CharWidth, CharY)) - { - SelectionChar = pCursor->m_GlyphCount; - SelectionStarted = !SelectionStarted; - SelectionUsedCase = true; - } - }; - - float LastSelX = DrawX; - float LastSelWidth = 0; - float LastCharX = DrawX; - float LastCharWidth = 0; - - // Returns true if line was started - const auto &&StartNewLine = [&]() { - if(pCursor->m_MaxLines > 0 && LineCount >= pCursor->m_MaxLines) - return false; - - DrawX = pCursor->m_StartX; - DrawY += pCursor->m_AlignedFontSize + pCursor->m_AlignedLineSpacing; - if((RenderFlags & TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT) == 0) - { - DrawX = round_to_int(DrawX * FakeToScreen.x) / FakeToScreen.x; // realign - DrawY = round_to_int(DrawY * FakeToScreen.y) / FakeToScreen.y; - } - LastSelX = DrawX; - LastSelWidth = 0; - LastCharX = DrawX; - LastCharWidth = 0; - ++LineCount; - return true; - }; - - if(pCursor->m_CalculateSelectionMode != TEXT_CURSOR_SELECTION_MODE_NONE || pCursor->m_CursorMode != TEXT_CURSOR_CURSOR_MODE_NONE) - { - if(IsRendered) - Graphics()->QuadContainerReset(TextContainer.m_StringInfo.m_SelectionQuadContainerIndex); - - // if in calculate mode, also calculate the cursor - if(pCursor->m_CursorMode == TEXT_CURSOR_CURSOR_MODE_CALCULATE) - pCursor->m_CursorCharacter = -1; - } - - IGraphics::CQuadItem aCursorQuads[2]; - bool HasCursor = false; - - const SGlyph *pLastGlyph = nullptr; - bool GotNewLineLast = false; - - int ColorOption = 0; - - while(pCurrent < pEnd && pCurrent != pEllipsis) - { - bool NewLine = false; - const char *pBatchEnd = pEnd; - if(pCursor->m_LineWidth > 0 && !(pCursor->m_Flags & TEXTFLAG_STOP_AT_END) && !(pCursor->m_Flags & TEXTFLAG_ELLIPSIS_AT_END)) - { - int Wlen = minimum(WordLength(pCurrent), (int)(pEnd - pCurrent)); - CTextCursor Compare = *pCursor; - Compare.m_CalculateSelectionMode = TEXT_CURSOR_SELECTION_MODE_NONE; - Compare.m_CursorMode = TEXT_CURSOR_CURSOR_MODE_NONE; - Compare.m_X = DrawX; - Compare.m_Y = DrawY; - Compare.m_Flags &= ~TEXTFLAG_RENDER; - Compare.m_Flags |= TEXTFLAG_DISALLOW_NEWLINE; - Compare.m_LineWidth = -1; - TextEx(&Compare, pCurrent, Wlen); - - if(Compare.m_X - DrawX > pCursor->m_LineWidth) - { - // word can't be fitted in one line, cut it - CTextCursor Cutter = *pCursor; - Cutter.m_CalculateSelectionMode = TEXT_CURSOR_SELECTION_MODE_NONE; - Cutter.m_CursorMode = TEXT_CURSOR_CURSOR_MODE_NONE; - Cutter.m_GlyphCount = 0; - Cutter.m_CharCount = 0; - Cutter.m_X = DrawX; - Cutter.m_Y = DrawY; - Cutter.m_Flags &= ~TEXTFLAG_RENDER; - Cutter.m_Flags |= TEXTFLAG_STOP_AT_END | TEXTFLAG_DISALLOW_NEWLINE; - - TextEx(&Cutter, pCurrent, Wlen); - Wlen = str_utf8_rewind(pCurrent, Cutter.m_CharCount); // rewind once to skip the last character that did not fit - NewLine = true; - - if(Cutter.m_GlyphCount <= 3 && !GotNewLineLast) // if we can't place 3 chars of the word on this line, take the next - Wlen = 0; - } - else if(Compare.m_X - pCursor->m_StartX > pCursor->m_LineWidth && !GotNewLineLast) - { - NewLine = true; - Wlen = 0; - } - - pBatchEnd = pCurrent + Wlen; - } - - const char *pTmp = pCurrent; - int NextCharacter = str_utf8_decode(&pTmp); - - while(pCurrent < pBatchEnd && pCurrent != pEllipsis) - { - const int PrevCharCount = pCursor->m_CharCount; - pCursor->m_CharCount += pTmp - pCurrent; - pCurrent = pTmp; - int Character = NextCharacter; - NextCharacter = str_utf8_decode(&pTmp); - - if(Character == '\n') - { - if((pCursor->m_Flags & TEXTFLAG_DISALLOW_NEWLINE) == 0) - { - pLastGlyph = nullptr; - if(!StartNewLine()) - break; - continue; - } - else - { - Character = ' '; - } - } - - const SGlyph *pGlyph = m_pGlyphMap->GetGlyph(Character, ActualSize); - if(pGlyph) - { - const float Scale = 1.0f / pGlyph->m_FontSize; - - const bool ApplyBearingX = !(((RenderFlags & TEXT_RENDER_FLAG_NO_X_BEARING) != 0) || (pCursor->m_GlyphCount == 0 && (RenderFlags & TEXT_RENDER_FLAG_NO_FIRST_CHARACTER_X_BEARING) != 0)); - const float Advance = ((((RenderFlags & TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH) != 0) ? (pGlyph->m_Width) : (pGlyph->m_AdvanceX + ((!ApplyBearingX) ? (-pGlyph->m_OffsetX) : 0.f)))) * Scale * pCursor->m_AlignedFontSize; - - const float OutLineRealDiff = (pGlyph->m_Width - pGlyph->m_CharWidth) * Scale * pCursor->m_AlignedFontSize; - - float CharKerning = 0.0f; - if((RenderFlags & TEXT_RENDER_FLAG_KERNING) != 0) - CharKerning = m_pGlyphMap->Kerning(pLastGlyph, pGlyph).x * Scale * pCursor->m_AlignedFontSize; - pLastGlyph = pGlyph; - - if(pEllipsisGlyph != nullptr && pCursor->m_Flags & TEXTFLAG_ELLIPSIS_AT_END && pCurrent < pBatchEnd && pCurrent != pEllipsis) - { - float AdvanceEllipsis = ((((RenderFlags & TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH) != 0) ? (pEllipsisGlyph->m_Width) : (pEllipsisGlyph->m_AdvanceX + ((!ApplyBearingX) ? (-pEllipsisGlyph->m_OffsetX) : 0.f)))) * Scale * pCursor->m_AlignedFontSize; - float CharKerningEllipsis = 0.0f; - if((RenderFlags & TEXT_RENDER_FLAG_KERNING) != 0) - { - CharKerningEllipsis = m_pGlyphMap->Kerning(pGlyph, pEllipsisGlyph).x * Scale * pCursor->m_AlignedFontSize; - } - if(DrawX + CharKerning + Advance + CharKerningEllipsis + AdvanceEllipsis - pCursor->m_StartX > pCursor->m_LineWidth) - { - // we hit the end, only render ellipsis and finish - pTmp = pEllipsis; - NextCharacter = 0x2026; - continue; - } - } - - if(pCursor->m_Flags & TEXTFLAG_STOP_AT_END && (DrawX + CharKerning) + Advance - pCursor->m_StartX > pCursor->m_LineWidth) - { - // we hit the end of the line, no more to render or count - pCurrent = pEnd; - break; - } - - float BearingX = (!ApplyBearingX ? 0.f : pGlyph->m_OffsetX) * Scale * pCursor->m_AlignedFontSize; - float CharWidth = pGlyph->m_Width * Scale * pCursor->m_AlignedFontSize; - - float BearingY = (((RenderFlags & TEXT_RENDER_FLAG_NO_Y_BEARING) != 0) ? 0.f : (pGlyph->m_OffsetY * Scale * pCursor->m_AlignedFontSize)); - float CharHeight = pGlyph->m_Height * Scale * pCursor->m_AlignedFontSize; - - if((RenderFlags & TEXT_RENDER_FLAG_NO_OVERSIZE) != 0) - { - if(CharHeight + BearingY > pCursor->m_AlignedFontSize) - { - BearingY = 0; - float ScaleChar = (CharHeight + BearingY) / pCursor->m_AlignedFontSize; - CharHeight = pCursor->m_AlignedFontSize; - CharWidth /= ScaleChar; - } - } - - const float TmpY = (DrawY + pCursor->m_AlignedFontSize); - const float CharX = (DrawX + CharKerning) + BearingX; - const float CharY = TmpY - BearingY; - - // Check if we have any color split - ColorRGBA Color = m_Color; - if(ColorOption < (int)pCursor->m_vColorSplits.size()) - { - STextColorSplit &Split = pCursor->m_vColorSplits.at(ColorOption); - if(PrevCharCount >= Split.m_CharIndex && (Split.m_Length == -1 || PrevCharCount < Split.m_CharIndex + Split.m_Length)) - Color = Split.m_Color; - if(Split.m_Length != -1 && PrevCharCount >= (Split.m_CharIndex + Split.m_Length - 1)) - { - ColorOption++; - if(ColorOption < (int)pCursor->m_vColorSplits.size()) - { // Handle splits that are - Split = pCursor->m_vColorSplits.at(ColorOption); - if(PrevCharCount >= Split.m_CharIndex) - Color = Split.m_Color; - } - } - } - - // don't add text that isn't drawn, the color overwrite is used for that - if(Color.a != 0.f && IsRendered) - { - TextContainer.m_StringInfo.m_vCharacterQuads.emplace_back(); - STextCharQuad &TextCharQuad = TextContainer.m_StringInfo.m_vCharacterQuads.back(); - - TextCharQuad.m_aVertices[0].m_X = CharX; - TextCharQuad.m_aVertices[0].m_Y = CharY; - TextCharQuad.m_aVertices[0].m_U = pGlyph->m_aUVs[0]; - TextCharQuad.m_aVertices[0].m_V = pGlyph->m_aUVs[3]; - TextCharQuad.m_aVertices[0].m_Color.r = (unsigned char)(Color.r * 255.f); - TextCharQuad.m_aVertices[0].m_Color.g = (unsigned char)(Color.g * 255.f); - TextCharQuad.m_aVertices[0].m_Color.b = (unsigned char)(Color.b * 255.f); - TextCharQuad.m_aVertices[0].m_Color.a = (unsigned char)(Color.a * 255.f); - - TextCharQuad.m_aVertices[1].m_X = CharX + CharWidth; - TextCharQuad.m_aVertices[1].m_Y = CharY; - TextCharQuad.m_aVertices[1].m_U = pGlyph->m_aUVs[2]; - TextCharQuad.m_aVertices[1].m_V = pGlyph->m_aUVs[3]; - TextCharQuad.m_aVertices[1].m_Color.r = (unsigned char)(Color.r * 255.f); - TextCharQuad.m_aVertices[1].m_Color.g = (unsigned char)(Color.g * 255.f); - TextCharQuad.m_aVertices[1].m_Color.b = (unsigned char)(Color.b * 255.f); - TextCharQuad.m_aVertices[1].m_Color.a = (unsigned char)(Color.a * 255.f); - - TextCharQuad.m_aVertices[2].m_X = CharX + CharWidth; - TextCharQuad.m_aVertices[2].m_Y = CharY - CharHeight; - TextCharQuad.m_aVertices[2].m_U = pGlyph->m_aUVs[2]; - TextCharQuad.m_aVertices[2].m_V = pGlyph->m_aUVs[1]; - TextCharQuad.m_aVertices[2].m_Color.r = (unsigned char)(Color.r * 255.f); - TextCharQuad.m_aVertices[2].m_Color.g = (unsigned char)(Color.g * 255.f); - TextCharQuad.m_aVertices[2].m_Color.b = (unsigned char)(Color.b * 255.f); - TextCharQuad.m_aVertices[2].m_Color.a = (unsigned char)(Color.a * 255.f); - - TextCharQuad.m_aVertices[3].m_X = CharX; - TextCharQuad.m_aVertices[3].m_Y = CharY - CharHeight; - TextCharQuad.m_aVertices[3].m_U = pGlyph->m_aUVs[0]; - TextCharQuad.m_aVertices[3].m_V = pGlyph->m_aUVs[1]; - TextCharQuad.m_aVertices[3].m_Color.r = (unsigned char)(Color.r * 255.f); - TextCharQuad.m_aVertices[3].m_Color.g = (unsigned char)(Color.g * 255.f); - TextCharQuad.m_aVertices[3].m_Color.b = (unsigned char)(Color.b * 255.f); - TextCharQuad.m_aVertices[3].m_Color.a = (unsigned char)(Color.a * 255.f); - } - - // calculate the full width from the last selection point to the end of this selection draw on screen - const float SelWidth = (CharX + maximum(Advance, CharWidth - OutLineRealDiff / 2)) - (LastSelX + LastSelWidth); - const float SelX = (LastSelX + LastSelWidth); - - if(pCursor->m_CursorMode == TEXT_CURSOR_CURSOR_MODE_CALCULATE) - { - if(pCursor->m_CursorCharacter == -1 && CheckInsideChar(pCursor->m_GlyphCount == 0, pCursor->m_ReleaseMouse, pCursor->m_GlyphCount == 0 ? std::numeric_limits::lowest() : LastCharX, LastCharWidth, CharX, CharWidth, TmpY)) - { - pCursor->m_CursorCharacter = pCursor->m_GlyphCount; - } - } - - if(pCursor->m_CalculateSelectionMode == TEXT_CURSOR_SELECTION_MODE_CALCULATE) - { - if(pCursor->m_GlyphCount == 0) - { - CheckSelectionStart(true, pCursor->m_PressMouse, SelectionStartChar, SelectionUsedPress, std::numeric_limits::lowest(), 0, CharX, CharWidth, TmpY); - CheckSelectionStart(true, pCursor->m_ReleaseMouse, SelectionEndChar, SelectionUsedRelease, std::numeric_limits::lowest(), 0, CharX, CharWidth, TmpY); - } - - // if selection didn't start and the mouse pos is at least on 50% of the right side of the character start - CheckSelectionStart(false, pCursor->m_PressMouse, SelectionStartChar, SelectionUsedPress, LastCharX, LastCharWidth, CharX, CharWidth, TmpY); - CheckSelectionStart(false, pCursor->m_ReleaseMouse, SelectionEndChar, SelectionUsedRelease, LastCharX, LastCharWidth, CharX, CharWidth, TmpY); - CheckSelectionEnd(false, pCursor->m_ReleaseMouse, SelectionEndChar, SelectionUsedRelease, CharX, CharWidth, TmpY); - CheckSelectionEnd(false, pCursor->m_PressMouse, SelectionStartChar, SelectionUsedPress, CharX, CharWidth, TmpY); - } - if(pCursor->m_CalculateSelectionMode == TEXT_CURSOR_SELECTION_MODE_SET) - { - if(pCursor->m_GlyphCount == pCursor->m_SelectionStart) - { - SelectionStarted = !SelectionStarted; - SelectionStartChar = pCursor->m_GlyphCount; - SelectionUsedPress = true; - } - if(pCursor->m_GlyphCount == pCursor->m_SelectionEnd) - { - SelectionStarted = !SelectionStarted; - SelectionEndChar = pCursor->m_GlyphCount; - SelectionUsedRelease = true; - } - } - - if(pCursor->m_CursorMode != TEXT_CURSOR_CURSOR_MODE_NONE) - { - if(pCursor->m_GlyphCount == pCursor->m_CursorCharacter) - { - HasCursor = true; - aCursorQuads[0] = IGraphics::CQuadItem(SelX - CursorOuterInnerDiff, DrawY, CursorOuterWidth, pCursor->m_AlignedFontSize); - aCursorQuads[1] = IGraphics::CQuadItem(SelX, DrawY + CursorOuterInnerDiff, CursorInnerWidth, pCursor->m_AlignedFontSize - CursorOuterInnerDiff * 2); - pCursor->m_CursorRenderedPosition = vec2(SelX, DrawY); - } - } - - pCursor->m_MaxCharacterHeight = maximum(pCursor->m_MaxCharacterHeight, CharHeight + BearingY); - - if(NextCharacter == 0 && (RenderFlags & TEXT_RENDER_FLAG_NO_LAST_CHARACTER_ADVANCE) != 0 && Character != ' ') - DrawX += BearingX + CharKerning + CharWidth; - else - DrawX += Advance + CharKerning; - - pCursor->m_GlyphCount++; - - if(SelectionStarted && IsRendered) - { - if(!vSelectionQuads.empty() && SelectionQuadLine == LineCount) - { - vSelectionQuads.back().m_Width += SelWidth; - } - else - { - const float SelectionHeight = pCursor->m_AlignedFontSize + pCursor->m_AlignedLineSpacing; - const float SelectionY = DrawY + (1.0f - pCursor->m_SelectionHeightFactor) * SelectionHeight; - const float ScaledSelectionHeight = pCursor->m_SelectionHeightFactor * SelectionHeight; - vSelectionQuads.emplace_back(SelX, SelectionY, SelWidth, ScaledSelectionHeight); - SelectionQuadLine = LineCount; - } - } - - LastSelX = SelX; - LastSelWidth = SelWidth; - LastCharX = CharX; - LastCharWidth = CharWidth; - } - - pCursor->m_LongestLineWidth = maximum(pCursor->m_LongestLineWidth, DrawX - pCursor->m_StartX); - } - - if(NewLine) - { - if(pPrevBatchEnd == pBatchEnd) - break; - pPrevBatchEnd = pBatchEnd; - if(!StartNewLine()) - break; - GotNewLineLast = true; - } - else - GotNewLineLast = false; - } - - if(!TextContainer.m_StringInfo.m_vCharacterQuads.empty() && IsRendered) - { - // setup the buffers - if(Graphics()->IsTextBufferingEnabled()) - { - const size_t DataSize = TextContainer.m_StringInfo.m_vCharacterQuads.size() * sizeof(STextCharQuad); - void *pUploadData = TextContainer.m_StringInfo.m_vCharacterQuads.data(); - - if(TextContainer.m_StringInfo.m_QuadBufferObjectIndex != -1 && (TextContainer.m_RenderFlags & TEXT_RENDER_FLAG_NO_AUTOMATIC_QUAD_UPLOAD) == 0) - { - Graphics()->RecreateBufferObject(TextContainer.m_StringInfo.m_QuadBufferObjectIndex, DataSize, pUploadData, TextContainer.m_SingleTimeUse ? IGraphics::EBufferObjectCreateFlags::BUFFER_OBJECT_CREATE_FLAGS_ONE_TIME_USE_BIT : 0); - Graphics()->IndicesNumRequiredNotify(TextContainer.m_StringInfo.m_vCharacterQuads.size() * 6); - } - } - } - - if(pCursor->m_CalculateSelectionMode == TEXT_CURSOR_SELECTION_MODE_CALCULATE) - { - pCursor->m_SelectionStart = -1; - pCursor->m_SelectionEnd = -1; - - if(SelectionStarted) - { - CheckSelectionEnd(true, pCursor->m_ReleaseMouse, SelectionEndChar, SelectionUsedRelease, std::numeric_limits::max(), 0, DrawY + pCursor->m_AlignedFontSize); - CheckSelectionEnd(true, pCursor->m_PressMouse, SelectionStartChar, SelectionUsedPress, std::numeric_limits::max(), 0, DrawY + pCursor->m_AlignedFontSize); - } - } - else if(pCursor->m_CalculateSelectionMode == TEXT_CURSOR_SELECTION_MODE_SET) - { - if(pCursor->m_GlyphCount == pCursor->m_SelectionStart) - { - SelectionStarted = !SelectionStarted; - SelectionStartChar = pCursor->m_GlyphCount; - SelectionUsedPress = true; - } - if(pCursor->m_GlyphCount == pCursor->m_SelectionEnd) - { - SelectionStarted = !SelectionStarted; - SelectionEndChar = pCursor->m_GlyphCount; - SelectionUsedRelease = true; - } - } - - if(pCursor->m_CursorMode != TEXT_CURSOR_CURSOR_MODE_NONE) - { - if(pCursor->m_CursorMode == TEXT_CURSOR_CURSOR_MODE_CALCULATE && pCursor->m_CursorCharacter == -1 && CheckOutsideChar(true, pCursor->m_ReleaseMouse, std::numeric_limits::max(), 0, DrawY + pCursor->m_AlignedFontSize)) - { - pCursor->m_CursorCharacter = pCursor->m_GlyphCount; - } - - if(pCursor->m_GlyphCount == pCursor->m_CursorCharacter) - { - HasCursor = true; - aCursorQuads[0] = IGraphics::CQuadItem((LastSelX + LastSelWidth) - CursorOuterInnerDiff, DrawY, CursorOuterWidth, pCursor->m_AlignedFontSize); - aCursorQuads[1] = IGraphics::CQuadItem((LastSelX + LastSelWidth), DrawY + CursorOuterInnerDiff, CursorInnerWidth, pCursor->m_AlignedFontSize - CursorOuterInnerDiff * 2); - pCursor->m_CursorRenderedPosition = vec2(LastSelX + LastSelWidth, DrawY); - } - } - - const bool HasSelection = !vSelectionQuads.empty() && SelectionUsedPress && SelectionUsedRelease; - if((HasSelection || HasCursor) && IsRendered) - { - Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); - if(TextContainer.m_StringInfo.m_SelectionQuadContainerIndex == -1) - TextContainer.m_StringInfo.m_SelectionQuadContainerIndex = Graphics()->CreateQuadContainer(false); - if(HasCursor) - Graphics()->QuadContainerAddQuads(TextContainer.m_StringInfo.m_SelectionQuadContainerIndex, aCursorQuads, std::size(aCursorQuads)); - if(HasSelection) - Graphics()->QuadContainerAddQuads(TextContainer.m_StringInfo.m_SelectionQuadContainerIndex, vSelectionQuads.data(), vSelectionQuads.size()); - Graphics()->QuadContainerUpload(TextContainer.m_StringInfo.m_SelectionQuadContainerIndex); - - TextContainer.m_HasCursor = HasCursor; - TextContainer.m_HasSelection = HasSelection; - TextContainer.m_ForceCursorRendering = pCursor->m_ForceCursorRendering; - - if(HasSelection) - { - pCursor->m_SelectionStart = SelectionStartChar; - pCursor->m_SelectionEnd = SelectionEndChar; - } - else - { - pCursor->m_SelectionStart = -1; - pCursor->m_SelectionEnd = -1; - } - } - - // even if no text is drawn the cursor position will be adjusted - pCursor->m_X = DrawX; - pCursor->m_Y = DrawY; - pCursor->m_LineCount = LineCount; - - TextContainer.m_BoundingBox = pCursor->BoundingBox(); - } - - bool CreateOrAppendTextContainer(STextContainerIndex &TextContainerIndex, CTextCursor *pCursor, const char *pText, int Length = -1) override - { - if(TextContainerIndex.Valid()) - { - AppendTextContainer(TextContainerIndex, pCursor, pText, Length); - return true; - } - else - { - return CreateTextContainer(TextContainerIndex, pCursor, pText, Length); - } - } - - // just deletes and creates text container - void RecreateTextContainer(STextContainerIndex &TextContainerIndex, CTextCursor *pCursor, const char *pText, int Length = -1) override - { - DeleteTextContainer(TextContainerIndex); - CreateTextContainer(TextContainerIndex, pCursor, pText, Length); - } - - void RecreateTextContainerSoft(STextContainerIndex &TextContainerIndex, CTextCursor *pCursor, const char *pText, int Length = -1) override - { - STextContainer &TextContainer = GetTextContainer(TextContainerIndex); - TextContainer.m_StringInfo.m_vCharacterQuads.clear(); - // the text buffer gets then recreated by the appended quads - AppendTextContainer(TextContainerIndex, pCursor, pText, Length); - } - - void DeleteTextContainer(STextContainerIndex &TextContainerIndex) override - { - if(!TextContainerIndex.Valid()) - return; - - STextContainer &TextContainer = GetTextContainer(TextContainerIndex); - if(Graphics()->IsTextBufferingEnabled()) - Graphics()->DeleteBufferContainer(TextContainer.m_StringInfo.m_QuadBufferContainerIndex, true); - Graphics()->DeleteQuadContainer(TextContainer.m_StringInfo.m_SelectionQuadContainerIndex); - FreeTextContainer(TextContainerIndex); - } - - void UploadTextContainer(STextContainerIndex TextContainerIndex) override - { - if(Graphics()->IsTextBufferingEnabled()) - { - STextContainer &TextContainer = GetTextContainer(TextContainerIndex); - size_t DataSize = TextContainer.m_StringInfo.m_vCharacterQuads.size() * sizeof(STextCharQuad); - void *pUploadData = TextContainer.m_StringInfo.m_vCharacterQuads.data(); - TextContainer.m_StringInfo.m_QuadBufferObjectIndex = Graphics()->CreateBufferObject(DataSize, pUploadData, TextContainer.m_SingleTimeUse ? IGraphics::EBufferObjectCreateFlags::BUFFER_OBJECT_CREATE_FLAGS_ONE_TIME_USE_BIT : 0); - - m_DefaultTextContainerInfo.m_VertBufferBindingIndex = TextContainer.m_StringInfo.m_QuadBufferObjectIndex; - - TextContainer.m_StringInfo.m_QuadBufferContainerIndex = Graphics()->CreateBufferContainer(&m_DefaultTextContainerInfo); - Graphics()->IndicesNumRequiredNotify(TextContainer.m_StringInfo.m_vCharacterQuads.size() * 6); - } - } - - void RenderTextContainer(STextContainerIndex TextContainerIndex, const ColorRGBA &TextColor, const ColorRGBA &TextOutlineColor) override - { - const STextContainer &TextContainer = GetTextContainer(TextContainerIndex); - - if(!TextContainer.m_StringInfo.m_vCharacterQuads.empty()) - { - if(Graphics()->IsTextBufferingEnabled()) - { - Graphics()->TextureClear(); - // render buffered text - Graphics()->RenderText(TextContainer.m_StringInfo.m_QuadBufferContainerIndex, TextContainer.m_StringInfo.m_vCharacterQuads.size(), m_pGlyphMap->TextureDimension(), m_pGlyphMap->Texture(CGlyphMap::FONT_TEXTURE_FILL).Id(), m_pGlyphMap->Texture(CGlyphMap::FONT_TEXTURE_OUTLINE).Id(), TextColor, TextOutlineColor); - } - else - { - // render tiles - const float UVScale = 1.0f / m_pGlyphMap->TextureDimension(); - - Graphics()->FlushVertices(); - Graphics()->TextureSet(m_pGlyphMap->Texture(CGlyphMap::FONT_TEXTURE_OUTLINE)); - - Graphics()->QuadsBegin(); - - for(const STextCharQuad &TextCharQuad : TextContainer.m_StringInfo.m_vCharacterQuads) - { - Graphics()->SetColor(TextCharQuad.m_aVertices[0].m_Color.r / 255.f * TextOutlineColor.r, TextCharQuad.m_aVertices[0].m_Color.g / 255.f * TextOutlineColor.g, TextCharQuad.m_aVertices[0].m_Color.b / 255.f * TextOutlineColor.b, TextCharQuad.m_aVertices[0].m_Color.a / 255.f * TextOutlineColor.a); - Graphics()->QuadsSetSubset(TextCharQuad.m_aVertices[0].m_U * UVScale, TextCharQuad.m_aVertices[0].m_V * UVScale, TextCharQuad.m_aVertices[2].m_U * UVScale, TextCharQuad.m_aVertices[2].m_V * UVScale); - IGraphics::CQuadItem QuadItem(TextCharQuad.m_aVertices[0].m_X, TextCharQuad.m_aVertices[0].m_Y, TextCharQuad.m_aVertices[1].m_X - TextCharQuad.m_aVertices[0].m_X, TextCharQuad.m_aVertices[2].m_Y - TextCharQuad.m_aVertices[0].m_Y); - Graphics()->QuadsDrawTL(&QuadItem, 1); - } - - if(TextColor.a != 0) - { - Graphics()->QuadsEndKeepVertices(); - Graphics()->TextureSet(m_pGlyphMap->Texture(CGlyphMap::FONT_TEXTURE_FILL)); - - int TextCharQuadIndex = 0; - for(const STextCharQuad &TextCharQuad : TextContainer.m_StringInfo.m_vCharacterQuads) - { - unsigned char CR = (unsigned char)((float)(TextCharQuad.m_aVertices[0].m_Color.r) * TextColor.r); - unsigned char CG = (unsigned char)((float)(TextCharQuad.m_aVertices[0].m_Color.g) * TextColor.g); - unsigned char CB = (unsigned char)((float)(TextCharQuad.m_aVertices[0].m_Color.b) * TextColor.b); - unsigned char CA = (unsigned char)((float)(TextCharQuad.m_aVertices[0].m_Color.a) * TextColor.a); - Graphics()->ChangeColorOfQuadVertices(TextCharQuadIndex, CR, CG, CB, CA); - ++TextCharQuadIndex; - } - - // render non outlined - Graphics()->QuadsDrawCurrentVertices(false); - } - else - Graphics()->QuadsEnd(); - - // reset - Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); - } - } - - if(TextContainer.m_StringInfo.m_SelectionQuadContainerIndex != -1) - { - if(TextContainer.m_HasSelection) - { - Graphics()->TextureClear(); - Graphics()->SetColor(m_SelectionColor); - Graphics()->RenderQuadContainerEx(TextContainer.m_StringInfo.m_SelectionQuadContainerIndex, TextContainer.m_HasCursor ? 2 : 0, -1, 0, 0); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - } - - if(TextContainer.m_HasCursor) - { - const auto CurTime = time_get_nanoseconds(); - - Graphics()->TextureClear(); - if(TextContainer.m_ForceCursorRendering || (CurTime - m_CursorRenderTime) > 500ms) - { - Graphics()->SetColor(TextOutlineColor); - Graphics()->RenderQuadContainerEx(TextContainer.m_StringInfo.m_SelectionQuadContainerIndex, 0, 1, 0, 0); - Graphics()->SetColor(TextColor); - Graphics()->RenderQuadContainerEx(TextContainer.m_StringInfo.m_SelectionQuadContainerIndex, 1, 1, 0, 0); - } - if(TextContainer.m_ForceCursorRendering) - m_CursorRenderTime = CurTime - 501ms; - else if((CurTime - m_CursorRenderTime) > 1s) - m_CursorRenderTime = time_get_nanoseconds(); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - } - } - } - - void RenderTextContainer(STextContainerIndex TextContainerIndex, const ColorRGBA &TextColor, const ColorRGBA &TextOutlineColor, float X, float Y) override - { - STextContainer &TextContainer = GetTextContainer(TextContainerIndex); - - // remap the current screen, after render revert the change again - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - - if((TextContainer.m_RenderFlags & TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT) == 0) - { - const vec2 FakeToScreen = vec2(Graphics()->ScreenWidth() / (ScreenX1 - ScreenX0), Graphics()->ScreenHeight() / (ScreenY1 - ScreenY0)); - const float AlignedX = round_to_int((TextContainer.m_X + X) * FakeToScreen.x) / FakeToScreen.x; - const float AlignedY = round_to_int((TextContainer.m_Y + Y) * FakeToScreen.y) / FakeToScreen.y; - X = AlignedX - TextContainer.m_AlignedStartX; - Y = AlignedY - TextContainer.m_AlignedStartY; - } - - TextContainer.m_BoundingBox.m_X = X; - TextContainer.m_BoundingBox.m_Y = Y; - - Graphics()->MapScreen(ScreenX0 - X, ScreenY0 - Y, ScreenX1 - X, ScreenY1 - Y); - RenderTextContainer(TextContainerIndex, TextColor, TextOutlineColor); - Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); - } - - STextBoundingBox GetBoundingBoxTextContainer(STextContainerIndex TextContainerIndex) override - { - const STextContainer &TextContainer = GetTextContainer(TextContainerIndex); - return TextContainer.m_BoundingBox; - } - - void UploadEntityLayerText(const CImageInfo &TextImage, int TexSubWidth, int TexSubHeight, const char *pText, int Length, float x, float y, int FontSize) override - { - m_pGlyphMap->UploadEntityLayerText(TextImage, TexSubWidth, TexSubHeight, pText, Length, x, y, FontSize); - } - - int AdjustFontSize(const char *pText, int TextLength, int MaxSize, int MaxWidth) const override - { - const int WidthOfText = CalculateTextWidth(pText, TextLength, 0, 100); - - int FontSize = 100.0f / ((float)WidthOfText / (float)MaxWidth); - if(MaxSize > 0 && FontSize > MaxSize) - FontSize = MaxSize; - - return FontSize; - } - - float GetGlyphOffsetX(int FontSize, char TextCharacter) const override - { - if(m_pGlyphMap->DefaultFace() == nullptr) - return -1.0f; - - FT_Set_Pixel_Sizes(m_pGlyphMap->DefaultFace(), 0, FontSize); - const char *pTmp = &TextCharacter; - const int NextCharacter = str_utf8_decode(&pTmp); - - if(NextCharacter) - { -#if FREETYPE_MAJOR >= 2 && FREETYPE_MINOR >= 7 && (FREETYPE_MINOR > 7 || FREETYPE_PATCH >= 1) - const FT_Int32 FTFlags = FT_LOAD_BITMAP_METRICS_ONLY | FT_LOAD_NO_BITMAP; -#else - const FT_Int32 FTFlags = FT_LOAD_RENDER | FT_LOAD_NO_BITMAP; -#endif - if(FT_Load_Char(m_pGlyphMap->DefaultFace(), NextCharacter, FTFlags)) - { - log_debug("textrender", "Error loading glyph. Chr=%d", NextCharacter); - return -1.0f; - } - - return (float)(m_pGlyphMap->DefaultFace()->glyph->metrics.horiBearingX >> 6); - } - return 0.0f; - } - - int CalculateTextWidth(const char *pText, int TextLength, int FontWidth, int FontHeight) const override - { - if(m_pGlyphMap->DefaultFace() == nullptr) - return 0; - - const char *pCurrent = pText; - const char *pEnd = pCurrent + TextLength; - - int WidthOfText = 0; - FT_Set_Pixel_Sizes(m_pGlyphMap->DefaultFace(), FontWidth, FontHeight); - while(pCurrent < pEnd) - { - const char *pTmp = pCurrent; - const int NextCharacter = str_utf8_decode(&pTmp); - if(NextCharacter) - { -#if FREETYPE_MAJOR >= 2 && FREETYPE_MINOR >= 7 && (FREETYPE_MINOR > 7 || FREETYPE_PATCH >= 1) - const FT_Int32 FTFlags = FT_LOAD_BITMAP_METRICS_ONLY | FT_LOAD_NO_BITMAP; -#else - const FT_Int32 FTFlags = FT_LOAD_RENDER | FT_LOAD_NO_BITMAP; -#endif - if(FT_Load_Char(m_pGlyphMap->DefaultFace(), NextCharacter, FTFlags)) - { - log_debug("textrender", "Error loading glyph. Chr=%d", NextCharacter); - pCurrent = pTmp; - continue; - } - - WidthOfText += (m_pGlyphMap->DefaultFace()->glyph->metrics.width >> 6) + 1; - } - pCurrent = pTmp; - } - - return WidthOfText; - } - - void OnPreWindowResize() override - { - for(auto *pTextContainer : m_vpTextContainers) - { - if(pTextContainer->m_ContainerIndex.Valid() && pTextContainer->m_ContainerIndex.m_UseCount.use_count() <= 1) - { - log_error("textrender", "Found non empty text container with index %d with %" PRIzu " quads '%s'", pTextContainer->m_StringInfo.m_QuadBufferContainerIndex, pTextContainer->m_StringInfo.m_vCharacterQuads.size(), pTextContainer->m_aDebugText); - dbg_assert(false, "Text container was forgotten by the implementation (the index was overwritten)."); - } - } - } - - void OnWindowResize() override - { - bool HasNonEmptyTextContainer = false; - for(auto *pTextContainer : m_vpTextContainers) - { - if(pTextContainer->m_StringInfo.m_QuadBufferContainerIndex != -1) - { - log_error("textrender", "Found non empty text container with index %d with %" PRIzu " quads '%s'", pTextContainer->m_StringInfo.m_QuadBufferContainerIndex, pTextContainer->m_StringInfo.m_vCharacterQuads.size(), pTextContainer->m_aDebugText); - log_error("textrender", "The text container index was in use by %d ", (int)pTextContainer->m_ContainerIndex.m_UseCount.use_count()); - HasNonEmptyTextContainer = true; - } - } - - dbg_assert(!HasNonEmptyTextContainer, "text container was not empty"); - } -}; - -IEngineTextRender *CreateEngineTextRender() { return new CTextRender; } diff --git a/src/engine/client/updater.cpp b/src/engine/client/updater.cpp deleted file mode 100644 index 7829567858..0000000000 --- a/src/engine/client/updater.cpp +++ /dev/null @@ -1,387 +0,0 @@ -#include - -#include "updater.h" -#include -#include -#include -#include -#include -#include - -#include - -#include // system - -using std::string; - -class CUpdaterFetchTask : public CHttpRequest -{ - char m_aBuf[256]; - char m_aBuf2[256]; - CUpdater *m_pUpdater; - - void OnProgress() override; - -protected: - void OnCompletion(EHttpState State) override; - -public: - CUpdaterFetchTask(CUpdater *pUpdater, const char *pFile, const char *pDestPath); -}; - -static const char *GetUpdaterUrl(char *pBuf, int BufSize, const char *pFile) -{ - str_format(pBuf, BufSize, "https://update.ddnet.org/%s", pFile); - return pBuf; -} - -static const char *GetUpdaterDestPath(char *pBuf, int BufSize, const char *pFile, const char *pDestPath) -{ - if(!pDestPath) - { - pDestPath = pFile; - } - str_format(pBuf, BufSize, "update/%s", pDestPath); - return pBuf; -} - -CUpdaterFetchTask::CUpdaterFetchTask(CUpdater *pUpdater, const char *pFile, const char *pDestPath) : - CHttpRequest(GetUpdaterUrl(m_aBuf, sizeof(m_aBuf), pFile)), - m_pUpdater(pUpdater) -{ - WriteToFile(pUpdater->m_pStorage, GetUpdaterDestPath(m_aBuf2, sizeof(m_aBuf2), pFile, pDestPath), -2); -} - -void CUpdaterFetchTask::OnProgress() -{ - CLockScope ls(m_pUpdater->m_Lock); - m_pUpdater->m_Percent = Progress(); -} - -void CUpdaterFetchTask::OnCompletion(EHttpState State) -{ - const char *pFileName = 0; - for(const char *pPath = Dest(); *pPath; pPath++) - if(*pPath == '/') - pFileName = pPath + 1; - pFileName = pFileName ? pFileName : Dest(); - if(!str_comp(pFileName, "update.json")) - { - if(State == EHttpState::DONE) - m_pUpdater->SetCurrentState(IUpdater::GOT_MANIFEST); - else if(State == EHttpState::ERROR) - m_pUpdater->SetCurrentState(IUpdater::FAIL); - } -} - -CUpdater::CUpdater() -{ - m_pClient = nullptr; - m_pStorage = nullptr; - m_pEngine = nullptr; - m_pHttp = nullptr; - m_State = CLEAN; - m_Percent = 0; - m_pCurrentTask = nullptr; - - m_ClientUpdate = m_ServerUpdate = m_ClientFetched = m_ServerFetched = false; - - IStorage::FormatTmpPath(m_aClientExecTmp, sizeof(m_aClientExecTmp), CLIENT_EXEC); - IStorage::FormatTmpPath(m_aServerExecTmp, sizeof(m_aServerExecTmp), SERVER_EXEC); -} - -void CUpdater::Init(CHttp *pHttp) -{ - m_pClient = Kernel()->RequestInterface(); - m_pStorage = Kernel()->RequestInterface(); - m_pEngine = Kernel()->RequestInterface(); - m_pHttp = pHttp; -} - -void CUpdater::SetCurrentState(EUpdaterState NewState) -{ - CLockScope ls(m_Lock); - m_State = NewState; -} - -IUpdater::EUpdaterState CUpdater::GetCurrentState() -{ - CLockScope ls(m_Lock); - return m_State; -} - -void CUpdater::GetCurrentFile(char *pBuf, int BufSize) -{ - CLockScope ls(m_Lock); - str_copy(pBuf, m_aStatus, BufSize); -} - -int CUpdater::GetCurrentPercent() -{ - CLockScope ls(m_Lock); - return m_Percent; -} - -void CUpdater::FetchFile(const char *pFile, const char *pDestPath) -{ - CLockScope ls(m_Lock); - m_pCurrentTask = std::make_shared(this, pFile, pDestPath); - str_copy(m_aStatus, m_pCurrentTask->Dest()); - m_pHttp->Run(m_pCurrentTask); -} - -bool CUpdater::MoveFile(const char *pFile) -{ - char aBuf[256]; - size_t len = str_length(pFile); - bool Success = true; - -#if !defined(CONF_FAMILY_WINDOWS) - if(!str_comp_nocase(pFile + len - 4, ".dll")) - return Success; -#endif - -#if !defined(CONF_PLATFORM_LINUX) - if(!str_comp_nocase(pFile + len - 3, ".so")) - return Success; -#endif - - if(!str_comp_nocase(pFile + len - 4, ".dll") || !str_comp_nocase(pFile + len - 4, ".ttf") || !str_comp_nocase(pFile + len - 3, ".so")) - { - str_format(aBuf, sizeof(aBuf), "%s.old", pFile); - m_pStorage->RenameBinaryFile(pFile, aBuf); - str_format(aBuf, sizeof(aBuf), "update/%s", pFile); - Success &= m_pStorage->RenameBinaryFile(aBuf, pFile); - } - else - { - str_format(aBuf, sizeof(aBuf), "update/%s", pFile); - Success &= m_pStorage->RenameBinaryFile(aBuf, pFile); - } - - return Success; -} - -void CUpdater::Update() -{ - switch(GetCurrentState()) - { - case IUpdater::GOT_MANIFEST: - PerformUpdate(); - break; - case IUpdater::DOWNLOADING: - RunningUpdate(); - break; - case IUpdater::MOVE_FILES: - CommitUpdate(); - break; - default: - return; - } -} - -void CUpdater::AddFileJob(const char *pFile, bool Job) -{ - m_FileJobs.emplace_front(pFile, Job); -} - -bool CUpdater::ReplaceClient() -{ - dbg_msg("updater", "replacing " PLAT_CLIENT_EXEC); - bool Success = true; - char aPath[IO_MAX_PATH_LENGTH]; - - // Replace running executable by renaming twice... - m_pStorage->RemoveBinaryFile(CLIENT_EXEC ".old"); - Success &= m_pStorage->RenameBinaryFile(PLAT_CLIENT_EXEC, CLIENT_EXEC ".old"); - str_format(aPath, sizeof(aPath), "update/%s", m_aClientExecTmp); - Success &= m_pStorage->RenameBinaryFile(aPath, PLAT_CLIENT_EXEC); -#if !defined(CONF_FAMILY_WINDOWS) - m_pStorage->GetBinaryPath(PLAT_CLIENT_EXEC, aPath, sizeof(aPath)); - char aBuf[512]; - str_format(aBuf, sizeof(aBuf), "chmod +x %s", aPath); - if(system(aBuf)) - { - dbg_msg("updater", "ERROR: failed to set client executable bit"); - Success = false; - } -#endif - return Success; -} - -bool CUpdater::ReplaceServer() -{ - dbg_msg("updater", "replacing " PLAT_SERVER_EXEC); - bool Success = true; - char aPath[IO_MAX_PATH_LENGTH]; - - //Replace running executable by renaming twice... - m_pStorage->RemoveBinaryFile(SERVER_EXEC ".old"); - Success &= m_pStorage->RenameBinaryFile(PLAT_SERVER_EXEC, SERVER_EXEC ".old"); - str_format(aPath, sizeof(aPath), "update/%s", m_aServerExecTmp); - Success &= m_pStorage->RenameBinaryFile(aPath, PLAT_SERVER_EXEC); -#if !defined(CONF_FAMILY_WINDOWS) - m_pStorage->GetBinaryPath(PLAT_SERVER_EXEC, aPath, sizeof(aPath)); - char aBuf[512]; - str_format(aBuf, sizeof(aBuf), "chmod +x %s", aPath); - if(system(aBuf)) - { - dbg_msg("updater", "ERROR: failed to set server executable bit"); - Success = false; - } -#endif - return Success; -} - -void CUpdater::ParseUpdate() -{ - char aPath[IO_MAX_PATH_LENGTH]; - void *pBuf; - unsigned Length; - if(!m_pStorage->ReadFile(m_pStorage->GetBinaryPath("update/update.json", aPath, sizeof(aPath)), IStorage::TYPE_ABSOLUTE, &pBuf, &Length)) - return; - - json_value *pVersions = json_parse((json_char *)pBuf, Length); - free(pBuf); - - if(pVersions && pVersions->type == json_array) - { - for(int i = 0; i < json_array_length(pVersions); i++) - { - const json_value *pTemp; - const json_value *pCurrent = json_array_get(pVersions, i); - if(str_comp(json_string_get(json_object_get(pCurrent, "version")), GAME_RELEASE_VERSION)) - { - if(json_boolean_get(json_object_get(pCurrent, "client"))) - m_ClientUpdate = true; - if(json_boolean_get(json_object_get(pCurrent, "server"))) - m_ServerUpdate = true; - if((pTemp = json_object_get(pCurrent, "download"))->type == json_array) - { - for(int j = 0; j < json_array_length(pTemp); j++) - AddFileJob(json_string_get(json_array_get(pTemp, j)), true); - } - if((pTemp = json_object_get(pCurrent, "remove"))->type == json_array) - { - for(int j = 0; j < json_array_length(pTemp); j++) - AddFileJob(json_string_get(json_array_get(pTemp, j)), false); - } - } - else - break; - } - } - json_value_free(pVersions); -} - -void CUpdater::InitiateUpdate() -{ - SetCurrentState(IUpdater::GETTING_MANIFEST); - FetchFile("update.json"); -} - -void CUpdater::PerformUpdate() -{ - SetCurrentState(IUpdater::PARSING_UPDATE); - dbg_msg("updater", "parsing update.json"); - ParseUpdate(); - m_CurrentJob = m_FileJobs.begin(); - SetCurrentState(IUpdater::DOWNLOADING); -} - -void CUpdater::RunningUpdate() -{ - if(m_pCurrentTask) - { - if(!m_pCurrentTask->Done()) - { - return; - } - else if(m_pCurrentTask->State() == EHttpState::ERROR || m_pCurrentTask->State() == EHttpState::ABORTED) - { - SetCurrentState(IUpdater::FAIL); - } - } - - if(m_CurrentJob != m_FileJobs.end()) - { - auto &Job = *m_CurrentJob; - if(Job.second) - { - const char *pFile = Job.first.c_str(); - size_t len = str_length(pFile); - if(!str_comp_nocase(pFile + len - 4, ".dll")) - { -#if defined(CONF_FAMILY_WINDOWS) - char aBuf[512]; - str_copy(aBuf, pFile, sizeof(aBuf)); // SDL - str_copy(aBuf + len - 4, "-" PLAT_NAME, sizeof(aBuf) - len + 4); // -win32 - str_append(aBuf, pFile + len - 4); // .dll - FetchFile(aBuf, pFile); -#endif - // Ignore DLL downloads on other platforms - } - else if(!str_comp_nocase(pFile + len - 3, ".so")) - { -#if defined(CONF_PLATFORM_LINUX) - char aBuf[512]; - str_copy(aBuf, pFile, sizeof(aBuf)); // libsteam_api - str_copy(aBuf + len - 3, "-" PLAT_NAME, sizeof(aBuf) - len + 3); // -linux-x86_64 - str_append(aBuf, pFile + len - 3); // .so - FetchFile(aBuf, pFile); -#endif - // Ignore DLL downloads on other platforms, on Linux we statically link anyway - } - else - { - FetchFile(pFile); - } - } - else - { - m_pStorage->RemoveBinaryFile(Job.first.c_str()); - } - - m_CurrentJob++; - } - else - { - if(m_ServerUpdate && !m_ServerFetched) - { - FetchFile(PLAT_SERVER_DOWN, m_aServerExecTmp); - m_ServerFetched = true; - return; - } - - if(m_ClientUpdate && !m_ClientFetched) - { - FetchFile(PLAT_CLIENT_DOWN, m_aClientExecTmp); - m_ClientFetched = true; - return; - } - - SetCurrentState(IUpdater::MOVE_FILES); - } -} - -void CUpdater::CommitUpdate() -{ - bool Success = true; - - for(auto &FileJob : m_FileJobs) - if(FileJob.second) - Success &= MoveFile(FileJob.first.c_str()); - - if(m_ClientUpdate) - Success &= ReplaceClient(); - if(m_ServerUpdate) - Success &= ReplaceServer(); - if(!Success) - SetCurrentState(IUpdater::FAIL); - else if(m_pClient->State() == IClient::STATE_ONLINE || m_pClient->EditorHasUnsavedData()) - SetCurrentState(IUpdater::NEED_RESTART); - else - { - m_pClient->Restart(); - } -} diff --git a/src/engine/client/updater.h b/src/engine/client/updater.h deleted file mode 100644 index 4127ca5e3c..0000000000 --- a/src/engine/client/updater.h +++ /dev/null @@ -1,97 +0,0 @@ -#ifndef ENGINE_CLIENT_UPDATER_H -#define ENGINE_CLIENT_UPDATER_H - -#include -#include - -#include - -#include -#include -#include - -#define CLIENT_EXEC "DDNet" -#define SERVER_EXEC "DDNet-Server" - -#if defined(CONF_FAMILY_WINDOWS) -#define PLAT_EXT ".exe" -#define PLAT_NAME CONF_PLATFORM_STRING -#elif defined(CONF_FAMILY_UNIX) -#define PLAT_EXT "" -#if defined(CONF_ARCH_IA32) -#define PLAT_NAME CONF_PLATFORM_STRING "-x86" -#elif defined(CONF_ARCH_AMD64) -#define PLAT_NAME CONF_PLATFORM_STRING "-x86_64" -#else -#define PLAT_NAME CONF_PLATFORM_STRING "-unsupported" -#endif -#else -#if defined(AUTOUPDATE) -#error Compiling with autoupdater on an unsupported platform -#endif -#define PLAT_EXT "" -#define PLAT_NAME "unsupported-unsupported" -#endif - -#define PLAT_CLIENT_DOWN CLIENT_EXEC "-" PLAT_NAME PLAT_EXT -#define PLAT_SERVER_DOWN SERVER_EXEC "-" PLAT_NAME PLAT_EXT - -#define PLAT_CLIENT_EXEC CLIENT_EXEC PLAT_EXT -#define PLAT_SERVER_EXEC SERVER_EXEC PLAT_EXT - -class CUpdaterFetchTask; - -class CUpdater : public IUpdater -{ - friend class CUpdaterFetchTask; - - class IClient *m_pClient; - class IStorage *m_pStorage; - class IEngine *m_pEngine; - class CHttp *m_pHttp; - - CLock m_Lock; - - EUpdaterState m_State GUARDED_BY(m_Lock); - char m_aStatus[256] GUARDED_BY(m_Lock); - int m_Percent GUARDED_BY(m_Lock); - char m_aClientExecTmp[64]; - char m_aServerExecTmp[64]; - - std::forward_list> m_FileJobs; - std::shared_ptr m_pCurrentTask; - decltype(m_FileJobs)::iterator m_CurrentJob; - - bool m_ClientUpdate; - bool m_ServerUpdate; - - bool m_ClientFetched; - bool m_ServerFetched; - - void AddFileJob(const char *pFile, bool Job); - void FetchFile(const char *pFile, const char *pDestPath = nullptr) REQUIRES(!m_Lock); - bool MoveFile(const char *pFile); - - void ParseUpdate() REQUIRES(!m_Lock); - void PerformUpdate() REQUIRES(!m_Lock); - void RunningUpdate() REQUIRES(!m_Lock); - void CommitUpdate() REQUIRES(!m_Lock); - - bool ReplaceClient(); - bool ReplaceServer(); - - void SetCurrentState(EUpdaterState NewState) REQUIRES(!m_Lock); - -public: - CUpdater(); - - EUpdaterState GetCurrentState() override REQUIRES(!m_Lock); - void GetCurrentFile(char *pBuf, int BufSize) override REQUIRES(!m_Lock); - int GetCurrentPercent() override REQUIRES(!m_Lock); - - void InitiateUpdate() REQUIRES(!m_Lock) override; - void Init(CHttp *pHttp); - void Update() REQUIRES(!m_Lock) override; -}; - -#endif diff --git a/src/engine/client/video.cpp b/src/engine/client/video.cpp deleted file mode 100644 index d5b914fce8..0000000000 --- a/src/engine/client/video.cpp +++ /dev/null @@ -1,1099 +0,0 @@ -#if defined(CONF_VIDEORECORDER) - -#include "video.h" - -#include - -#include -#include -#include -#include - -extern "C" { -#include -#include -#include -#include -}; - -#include -#include -#include -#include - -using namespace std::chrono_literals; - -// This code is mostly stolen from https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/muxing.c - -#define STREAM_PIX_FMT AV_PIX_FMT_YUV420P /* default pix_fmt */ - -#if LIBAVCODEC_VERSION_MAJOR >= 60 -#define FRAME_NUM frame_num -#else -#define FRAME_NUM frame_number -#endif - -const size_t FORMAT_GL_NCHANNELS = 4; -CLock g_WriteLock; - -static LEVEL AvLevelToLogLevel(int Level) -{ - switch(Level) - { - case AV_LOG_PANIC: - case AV_LOG_FATAL: - case AV_LOG_ERROR: - return LEVEL_ERROR; - case AV_LOG_WARNING: - return LEVEL_WARN; - case AV_LOG_INFO: - return LEVEL_INFO; - case AV_LOG_VERBOSE: - case AV_LOG_DEBUG: - return LEVEL_DEBUG; - case AV_LOG_TRACE: - return LEVEL_TRACE; - default: - dbg_assert(false, "invalid log level"); - dbg_break(); - } -} - -void AvLogCallback(void *pUser, int Level, const char *pFormat, va_list VarArgs) - GNUC_ATTRIBUTE((format(printf, 3, 0))); - -void AvLogCallback(void *pUser, int Level, const char *pFormat, va_list VarArgs) -{ - const LEVEL LogLevel = AvLevelToLogLevel(Level); - if(LogLevel <= LEVEL_INFO) - { - log_log_v(LogLevel, "videorecorder/libav", pFormat, VarArgs); - } -} - -void CVideo::Init() -{ - av_log_set_callback(AvLogCallback); -} - -CVideo::CVideo(IGraphics *pGraphics, ISound *pSound, IStorage *pStorage, int Width, int Height, const char *pName) : - m_pGraphics(pGraphics), - m_pStorage(pStorage), - m_pSound(pSound) -{ - m_pFormatContext = nullptr; - m_pFormat = nullptr; - m_pOptDict = nullptr; - - m_pVideoCodec = nullptr; - m_pAudioCodec = nullptr; - - m_Width = Width; - m_Height = Height; - str_copy(m_aName, pName); - - m_FPS = g_Config.m_ClVideoRecorderFPS; - - m_Recording = false; - m_Started = false; - m_Stopped = false; - m_ProcessingVideoFrame = 0; - m_ProcessingAudioFrame = 0; - - m_HasAudio = m_pSound->IsSoundEnabled() && g_Config.m_ClVideoSndEnable; - - dbg_assert(ms_pCurrentVideo == nullptr, "ms_pCurrentVideo is NOT set to nullptr while creating a new Video."); - - ms_TickTime = time_freq() / m_FPS; - ms_pCurrentVideo = this; -} - -CVideo::~CVideo() -{ - ms_pCurrentVideo = nullptr; -} - -bool CVideo::Start() -{ - dbg_assert(!m_Started, "Already started"); - - // wait for the graphic thread to idle - m_pGraphics->WaitForIdle(); - - m_AudioStream = {}; - m_VideoStream = {}; - - char aWholePath[IO_MAX_PATH_LENGTH]; - IOHANDLE File = m_pStorage->OpenFile(m_aName, IOFLAG_WRITE, IStorage::TYPE_SAVE, aWholePath, sizeof(aWholePath)); - if(File) - { - io_close(File); - } - else - { - log_error("videorecorder", "Could not open file '%s'", aWholePath); - return false; - } - - const int FormatAllocResult = avformat_alloc_output_context2(&m_pFormatContext, nullptr, "mp4", aWholePath); - if(FormatAllocResult < 0 || !m_pFormatContext) - { - char aError[AV_ERROR_MAX_STRING_SIZE]; - av_strerror(FormatAllocResult, aError, sizeof(aError)); - log_error("videorecorder", "Could not create format context: %s", aError); - return false; - } - - m_pFormat = m_pFormatContext->oformat; - -#if defined(CONF_ARCH_IA32) || defined(CONF_ARCH_ARM) - // use only the minimum of 2 threads on 32-bit to save memory - m_VideoThreads = 2; - m_AudioThreads = 2; -#else - m_VideoThreads = std::thread::hardware_concurrency() + 2; - // audio gets a bit less - m_AudioThreads = (std::thread::hardware_concurrency() / 2) + 2; -#endif - - m_CurVideoThreadIndex = 0; - m_CurAudioThreadIndex = 0; - - size_t GLNVals = FORMAT_GL_NCHANNELS * m_Width * m_Height; - m_vVideoBuffers.resize(m_VideoThreads); - for(size_t i = 0; i < m_VideoThreads; ++i) - { - m_vVideoBuffers[i].m_vBuffer.resize(GLNVals * sizeof(uint8_t)); - } - - m_vAudioBuffers.resize(m_AudioThreads); - - /* Add the audio and video streams using the default format codecs - * and initialize the codecs. */ - if(m_pFormat->video_codec != AV_CODEC_ID_NONE) - { - if(!AddStream(&m_VideoStream, m_pFormatContext, &m_pVideoCodec, m_pFormat->video_codec)) - return false; - } - else - { - log_error("videorecorder", "Could not determine default video stream codec"); - return false; - } - - if(m_HasAudio) - { - if(m_pFormat->audio_codec != AV_CODEC_ID_NONE) - { - if(!AddStream(&m_AudioStream, m_pFormatContext, &m_pAudioCodec, m_pFormat->audio_codec)) - return false; - } - else - { - log_error("videorecorder", "Could not determine default audio stream codec"); - return false; - } - } - - m_vpVideoThreads.resize(m_VideoThreads); - for(size_t i = 0; i < m_VideoThreads; ++i) - { - m_vpVideoThreads[i] = std::make_unique(); - } - for(size_t i = 0; i < m_VideoThreads; ++i) - { - std::unique_lock Lock(m_vpVideoThreads[i]->m_Mutex); - m_vpVideoThreads[i]->m_Thread = std::thread([this, i]() REQUIRES(!g_WriteLock) { RunVideoThread(i == 0 ? (m_VideoThreads - 1) : (i - 1), i); }); - m_vpVideoThreads[i]->m_Cond.wait(Lock, [this, i]() -> bool { return m_vpVideoThreads[i]->m_Started; }); - } - - m_vpAudioThreads.resize(m_AudioThreads); - for(size_t i = 0; i < m_AudioThreads; ++i) - { - m_vpAudioThreads[i] = std::make_unique(); - } - for(size_t i = 0; i < m_AudioThreads; ++i) - { - std::unique_lock Lock(m_vpAudioThreads[i]->m_Mutex); - m_vpAudioThreads[i]->m_Thread = std::thread([this, i]() REQUIRES(!g_WriteLock) { RunAudioThread(i == 0 ? (m_AudioThreads - 1) : (i - 1), i); }); - m_vpAudioThreads[i]->m_Cond.wait(Lock, [this, i]() -> bool { return m_vpAudioThreads[i]->m_Started; }); - } - - /* Now that all the parameters are set, we can open the audio and - * video codecs and allocate the necessary encode buffers. */ - if(!OpenVideo()) - return false; - - if(m_HasAudio && !OpenAudio()) - return false; - - /* open the output file, if needed */ - if(!(m_pFormat->flags & AVFMT_NOFILE)) - { - const int OpenResult = avio_open(&m_pFormatContext->pb, aWholePath, AVIO_FLAG_WRITE); - if(OpenResult < 0) - { - char aError[AV_ERROR_MAX_STRING_SIZE]; - av_strerror(OpenResult, aError, sizeof(aError)); - log_error("videorecorder", "Could not open file '%s': %s", aWholePath, aError); - return false; - } - } - - m_VideoStream.m_vpSwsContexts.reserve(m_VideoThreads); - - for(size_t i = 0; i < m_VideoThreads; ++i) - { - if(m_VideoStream.m_vpSwsContexts.size() <= i) - m_VideoStream.m_vpSwsContexts.emplace_back(nullptr); - - if(!m_VideoStream.m_vpSwsContexts[i]) - { - m_VideoStream.m_vpSwsContexts[i] = sws_getCachedContext( - m_VideoStream.m_vpSwsContexts[i], - m_VideoStream.m_pCodecContext->width, m_VideoStream.m_pCodecContext->height, AV_PIX_FMT_RGBA, - m_VideoStream.m_pCodecContext->width, m_VideoStream.m_pCodecContext->height, AV_PIX_FMT_YUV420P, - 0, 0, 0, 0); - } - } - - /* Write the stream header, if any. */ - const int WriteHeaderResult = avformat_write_header(m_pFormatContext, &m_pOptDict); - if(WriteHeaderResult < 0) - { - char aError[AV_ERROR_MAX_STRING_SIZE]; - av_strerror(WriteHeaderResult, aError, sizeof(aError)); - log_error("videorecorder", "Could not write header: %s", aError); - return false; - } - - m_Recording = true; - m_Started = true; - m_Stopped = false; - ms_Time = time_get(); - return true; -} - -void CVideo::Pause(bool Pause) -{ - if(ms_pCurrentVideo) - m_Recording = !Pause; -} - -void CVideo::Stop() -{ - dbg_assert(!m_Stopped, "Already stopped"); - m_Stopped = true; - - m_pGraphics->WaitForIdle(); - - for(auto &pVideoThread : m_vpVideoThreads) - { - { - std::unique_lock Lock(pVideoThread->m_Mutex); - pVideoThread->m_Finished = true; - pVideoThread->m_Cond.notify_all(); - } - - pVideoThread->m_Thread.join(); - } - m_vpVideoThreads.clear(); - - for(auto &pAudioThread : m_vpAudioThreads) - { - { - std::unique_lock Lock(pAudioThread->m_Mutex); - pAudioThread->m_Finished = true; - pAudioThread->m_Cond.notify_all(); - } - - pAudioThread->m_Thread.join(); - } - m_vpAudioThreads.clear(); - - while(m_ProcessingVideoFrame > 0 || m_ProcessingAudioFrame > 0) - std::this_thread::sleep_for(10us); - - m_Recording = false; - - FinishFrames(&m_VideoStream); - - if(m_HasAudio) - FinishFrames(&m_AudioStream); - - if(m_pFormatContext && m_Started) - av_write_trailer(m_pFormatContext); - - CloseStream(&m_VideoStream); - - if(m_HasAudio) - CloseStream(&m_AudioStream); - - if(m_pFormatContext) - { - if(!(m_pFormat->flags & AVFMT_NOFILE)) - avio_closep(&m_pFormatContext->pb); - - avformat_free_context(m_pFormatContext); - } - - ISound *volatile pSound = m_pSound; - - pSound->PauseAudioDevice(); - delete ms_pCurrentVideo; - pSound->UnpauseAudioDevice(); -} - -void CVideo::NextVideoFrameThread() -{ - if(m_Recording) - { - m_VideoFrameIndex += 1; - if(m_VideoFrameIndex >= 2) - { - m_ProcessingVideoFrame.fetch_add(1); - - size_t NextVideoThreadIndex = m_CurVideoThreadIndex + 1; - if(NextVideoThreadIndex == m_VideoThreads) - NextVideoThreadIndex = 0; - - // always wait for the next video thread too, to prevent a dead lock - { - auto *pVideoThread = m_vpVideoThreads[NextVideoThreadIndex].get(); - std::unique_lock Lock(pVideoThread->m_Mutex); - - if(pVideoThread->m_HasVideoFrame) - { - pVideoThread->m_Cond.wait(Lock, [&pVideoThread]() -> bool { return !pVideoThread->m_HasVideoFrame; }); - } - } - - // after reading the graphic libraries' frame buffer, go threaded - { - auto *pVideoThread = m_vpVideoThreads[m_CurVideoThreadIndex].get(); - std::unique_lock Lock(pVideoThread->m_Mutex); - - if(pVideoThread->m_HasVideoFrame) - { - pVideoThread->m_Cond.wait(Lock, [&pVideoThread]() -> bool { return !pVideoThread->m_HasVideoFrame; }); - } - - UpdateVideoBufferFromGraphics(m_CurVideoThreadIndex); - - pVideoThread->m_HasVideoFrame = true; - { - std::unique_lock LockParent(pVideoThread->m_VideoFillMutex); - pVideoThread->m_VideoFrameToFill = m_VideoFrameIndex; - } - pVideoThread->m_Cond.notify_all(); - } - - ++m_CurVideoThreadIndex; - if(m_CurVideoThreadIndex == m_VideoThreads) - m_CurVideoThreadIndex = 0; - } - } -} - -void CVideo::NextVideoFrame() -{ - if(m_Recording) - { - ms_Time += ms_TickTime; - ms_LocalTime = (ms_Time - ms_LocalStartTime) / (float)time_freq(); - } -} - -void CVideo::NextAudioFrameTimeline(ISoundMixFunc Mix) -{ - if(m_Recording && m_HasAudio) - { - double SamplesPerFrame = (double)m_AudioStream.m_pCodecContext->sample_rate / m_FPS; - while(m_AudioStream.m_SamplesFrameCount >= m_AudioStream.m_SamplesCount) - { - NextAudioFrame(Mix); - } - m_AudioStream.m_SamplesFrameCount += SamplesPerFrame; - } -} - -void CVideo::NextAudioFrame(ISoundMixFunc Mix) -{ - if(m_Recording && m_HasAudio) - { - m_AudioFrameIndex += 1; - - m_ProcessingAudioFrame.fetch_add(1); - - size_t NextAudioThreadIndex = m_CurAudioThreadIndex + 1; - if(NextAudioThreadIndex == m_AudioThreads) - NextAudioThreadIndex = 0; - - // always wait for the next Audio thread too, to prevent a dead lock - - { - auto *pAudioThread = m_vpAudioThreads[NextAudioThreadIndex].get(); - std::unique_lock Lock(pAudioThread->m_Mutex); - - if(pAudioThread->m_HasAudioFrame) - { - pAudioThread->m_Cond.wait(Lock, [&pAudioThread]() -> bool { return !pAudioThread->m_HasAudioFrame; }); - } - } - - // after reading the graphic libraries' frame buffer, go threaded - { - auto *pAudioThread = m_vpAudioThreads[m_CurAudioThreadIndex].get(); - - std::unique_lock Lock(pAudioThread->m_Mutex); - - if(pAudioThread->m_HasAudioFrame) - { - pAudioThread->m_Cond.wait(Lock, [&pAudioThread]() -> bool { return !pAudioThread->m_HasAudioFrame; }); - } - - Mix(m_vAudioBuffers[m_CurAudioThreadIndex].m_aBuffer, std::size(m_vAudioBuffers[m_CurAudioThreadIndex].m_aBuffer) / 2 / 2); // two channels - - int64_t DstNbSamples = av_rescale_rnd( - swr_get_delay(m_AudioStream.m_vpSwrContexts[m_CurAudioThreadIndex], m_AudioStream.m_pCodecContext->sample_rate) + - m_AudioStream.m_vpFrames[m_CurAudioThreadIndex]->nb_samples, - m_AudioStream.m_pCodecContext->sample_rate, - m_AudioStream.m_pCodecContext->sample_rate, AV_ROUND_UP); - - pAudioThread->m_SampleCountStart = m_AudioStream.m_SamplesCount; - m_AudioStream.m_SamplesCount += DstNbSamples; - - pAudioThread->m_HasAudioFrame = true; - { - std::unique_lock LockParent(pAudioThread->m_AudioFillMutex); - pAudioThread->m_AudioFrameToFill = m_AudioFrameIndex; - } - pAudioThread->m_Cond.notify_all(); - } - - ++m_CurAudioThreadIndex; - if(m_CurAudioThreadIndex == m_AudioThreads) - m_CurAudioThreadIndex = 0; - } -} - -void CVideo::RunAudioThread(size_t ParentThreadIndex, size_t ThreadIndex) -{ - auto *pThreadData = m_vpAudioThreads[ThreadIndex].get(); - auto *pParentThreadData = m_vpAudioThreads[ParentThreadIndex].get(); - std::unique_lock Lock(pThreadData->m_Mutex); - pThreadData->m_Started = true; - pThreadData->m_Cond.notify_all(); - - while(!pThreadData->m_Finished) - { - pThreadData->m_Cond.wait(Lock, [&pThreadData]() -> bool { return pThreadData->m_HasAudioFrame || pThreadData->m_Finished; }); - pThreadData->m_Cond.notify_all(); - - if(pThreadData->m_HasAudioFrame) - { - FillAudioFrame(ThreadIndex); - // check if we need to wait for the parent to finish - { - std::unique_lock LockParent(pParentThreadData->m_AudioFillMutex); - if(pParentThreadData->m_AudioFrameToFill != 0 && pThreadData->m_AudioFrameToFill >= pParentThreadData->m_AudioFrameToFill) - { - // wait for the parent to finish its frame - pParentThreadData->m_AudioFillCond.wait(LockParent, [&pParentThreadData]() -> bool { return pParentThreadData->m_AudioFrameToFill == 0; }); - } - } - { - std::unique_lock LockAudio(pThreadData->m_AudioFillMutex); - - { - CLockScope ls(g_WriteLock); - m_AudioStream.m_vpFrames[ThreadIndex]->pts = av_rescale_q(pThreadData->m_SampleCountStart, AVRational{1, m_AudioStream.m_pCodecContext->sample_rate}, m_AudioStream.m_pCodecContext->time_base); - WriteFrame(&m_AudioStream, ThreadIndex); - } - - pThreadData->m_AudioFrameToFill = 0; - pThreadData->m_AudioFillCond.notify_all(); - pThreadData->m_Cond.notify_all(); - } - m_ProcessingAudioFrame.fetch_sub(1); - - pThreadData->m_HasAudioFrame = false; - } - } -} - -void CVideo::FillAudioFrame(size_t ThreadIndex) -{ - const int FillArrayResult = av_samples_fill_arrays( - (uint8_t **)m_AudioStream.m_vpTmpFrames[ThreadIndex]->data, - nullptr, // pointer to linesize (int*) - (const uint8_t *)m_vAudioBuffers[ThreadIndex].m_aBuffer, - 2, // channels - m_AudioStream.m_vpTmpFrames[ThreadIndex]->nb_samples, - AV_SAMPLE_FMT_S16, - 0 // align - ); - if(FillArrayResult < 0) - { - char aError[AV_ERROR_MAX_STRING_SIZE]; - av_strerror(FillArrayResult, aError, sizeof(aError)); - log_error("videorecorder", "Could not fill audio frame: %s", aError); - return; - } - - const int MakeWriteableResult = av_frame_make_writable(m_AudioStream.m_vpFrames[ThreadIndex]); - if(MakeWriteableResult < 0) - { - char aError[AV_ERROR_MAX_STRING_SIZE]; - av_strerror(MakeWriteableResult, aError, sizeof(aError)); - log_error("videorecorder", "Could not make audio frame writeable: %s", aError); - return; - } - - /* convert to destination format */ - const int ConvertResult = swr_convert( - m_AudioStream.m_vpSwrContexts[ThreadIndex], - m_AudioStream.m_vpFrames[ThreadIndex]->data, - m_AudioStream.m_vpFrames[ThreadIndex]->nb_samples, - (const uint8_t **)m_AudioStream.m_vpTmpFrames[ThreadIndex]->data, - m_AudioStream.m_vpTmpFrames[ThreadIndex]->nb_samples); - if(ConvertResult < 0) - { - char aError[AV_ERROR_MAX_STRING_SIZE]; - av_strerror(ConvertResult, aError, sizeof(aError)); - log_error("videorecorder", "Could not convert audio frame: %s", aError); - return; - } -} - -void CVideo::RunVideoThread(size_t ParentThreadIndex, size_t ThreadIndex) -{ - auto *pThreadData = m_vpVideoThreads[ThreadIndex].get(); - auto *pParentThreadData = m_vpVideoThreads[ParentThreadIndex].get(); - std::unique_lock Lock(pThreadData->m_Mutex); - pThreadData->m_Started = true; - pThreadData->m_Cond.notify_all(); - - while(!pThreadData->m_Finished) - { - pThreadData->m_Cond.wait(Lock, [&pThreadData]() -> bool { return pThreadData->m_HasVideoFrame || pThreadData->m_Finished; }); - pThreadData->m_Cond.notify_all(); - - if(pThreadData->m_HasVideoFrame) - { - FillVideoFrame(ThreadIndex); - // check if we need to wait for the parent to finish - { - std::unique_lock LockParent(pParentThreadData->m_VideoFillMutex); - if(pParentThreadData->m_VideoFrameToFill != 0 && pThreadData->m_VideoFrameToFill >= pParentThreadData->m_VideoFrameToFill) - { - // wait for the parent to finish its frame - pParentThreadData->m_VideoFillCond.wait(LockParent, [&pParentThreadData]() -> bool { return pParentThreadData->m_VideoFrameToFill == 0; }); - } - } - { - std::unique_lock LockVideo(pThreadData->m_VideoFillMutex); - { - CLockScope ls(g_WriteLock); - m_VideoStream.m_vpFrames[ThreadIndex]->pts = (int64_t)m_VideoStream.m_pCodecContext->FRAME_NUM; - WriteFrame(&m_VideoStream, ThreadIndex); - } - - pThreadData->m_VideoFrameToFill = 0; - pThreadData->m_VideoFillCond.notify_all(); - pThreadData->m_Cond.notify_all(); - } - m_ProcessingVideoFrame.fetch_sub(1); - - pThreadData->m_HasVideoFrame = false; - } - } -} - -void CVideo::FillVideoFrame(size_t ThreadIndex) -{ - const int InLineSize = 4 * m_VideoStream.m_pCodecContext->width; - auto *pRGBAData = m_vVideoBuffers[ThreadIndex].m_vBuffer.data(); - sws_scale(m_VideoStream.m_vpSwsContexts[ThreadIndex], (const uint8_t *const *)&pRGBAData, &InLineSize, 0, - m_VideoStream.m_pCodecContext->height, m_VideoStream.m_vpFrames[ThreadIndex]->data, m_VideoStream.m_vpFrames[ThreadIndex]->linesize); -} - -void CVideo::UpdateVideoBufferFromGraphics(size_t ThreadIndex) -{ - uint32_t Width; - uint32_t Height; - CImageInfo::EImageFormat Format; - m_pGraphics->GetReadPresentedImageDataFuncUnsafe()(Width, Height, Format, m_vVideoBuffers[ThreadIndex].m_vBuffer); - dbg_assert((int)Width == m_Width && (int)Height == m_Height, "Size mismatch between video and graphics"); - dbg_assert(Format == CImageInfo::FORMAT_RGBA, "Unexpected image format"); -} - -AVFrame *CVideo::AllocPicture(enum AVPixelFormat PixFmt, int Width, int Height) -{ - AVFrame *pPicture = av_frame_alloc(); - if(!pPicture) - { - log_error("videorecorder", "Could not allocate video frame"); - return nullptr; - } - - pPicture->format = PixFmt; - pPicture->width = Width; - pPicture->height = Height; - - /* allocate the buffers for the frame data */ - const int FrameBufferAllocResult = av_frame_get_buffer(pPicture, 32); - if(FrameBufferAllocResult < 0) - { - char aError[AV_ERROR_MAX_STRING_SIZE]; - av_strerror(FrameBufferAllocResult, aError, sizeof(aError)); - log_error("videorecorder", "Could not allocate video frame buffer: %s", aError); - return nullptr; - } - - return pPicture; -} - -AVFrame *CVideo::AllocAudioFrame(enum AVSampleFormat SampleFmt, uint64_t ChannelLayout, int SampleRate, int NbSamples) -{ - AVFrame *pFrame = av_frame_alloc(); - if(!pFrame) - { - log_error("videorecorder", "Could not allocate audio frame"); - return nullptr; - } - - pFrame->format = SampleFmt; -#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59, 24, 100) - dbg_assert(av_channel_layout_from_mask(&pFrame->ch_layout, ChannelLayout) == 0, "Failed to set channel layout"); -#else - pFrame->channel_layout = ChannelLayout; -#endif - pFrame->sample_rate = SampleRate; - pFrame->nb_samples = NbSamples; - - if(NbSamples) - { - const int FrameBufferAllocResult = av_frame_get_buffer(pFrame, 0); - if(FrameBufferAllocResult < 0) - { - char aError[AV_ERROR_MAX_STRING_SIZE]; - av_strerror(FrameBufferAllocResult, aError, sizeof(aError)); - log_error("videorecorder", "Could not allocate audio frame buffer: %s", aError); - return nullptr; - } - } - - return pFrame; -} - -bool CVideo::OpenVideo() -{ - AVCodecContext *pContext = m_VideoStream.m_pCodecContext; - AVDictionary *pOptions = nullptr; - av_dict_copy(&pOptions, m_pOptDict, 0); - - /* open the codec */ - const int VideoOpenResult = avcodec_open2(pContext, m_pVideoCodec, &pOptions); - av_dict_free(&pOptions); - if(VideoOpenResult < 0) - { - char aError[AV_ERROR_MAX_STRING_SIZE]; - av_strerror(VideoOpenResult, aError, sizeof(aError)); - log_error("videorecorder", "Could not open video codec: %s", aError); - return false; - } - - m_VideoStream.m_vpFrames.clear(); - m_VideoStream.m_vpFrames.reserve(m_VideoThreads); - - /* allocate and init a re-usable frame */ - for(size_t i = 0; i < m_VideoThreads; ++i) - { - m_VideoStream.m_vpFrames.emplace_back(nullptr); - m_VideoStream.m_vpFrames[i] = AllocPicture(pContext->pix_fmt, pContext->width, pContext->height); - if(!m_VideoStream.m_vpFrames[i]) - { - return false; - } - } - - /* If the output format is not YUV420P, then a temporary YUV420P - * picture is needed too. It is then converted to the required - * output format. */ - m_VideoStream.m_vpTmpFrames.clear(); - m_VideoStream.m_vpTmpFrames.reserve(m_VideoThreads); - - if(pContext->pix_fmt != AV_PIX_FMT_YUV420P) - { - /* allocate and init a re-usable frame */ - for(size_t i = 0; i < m_VideoThreads; ++i) - { - m_VideoStream.m_vpTmpFrames.emplace_back(nullptr); - m_VideoStream.m_vpTmpFrames[i] = AllocPicture(AV_PIX_FMT_YUV420P, pContext->width, pContext->height); - if(!m_VideoStream.m_vpTmpFrames[i]) - { - return false; - } - } - } - - /* copy the stream parameters to the muxer */ - const int AudioStreamCopyResult = avcodec_parameters_from_context(m_VideoStream.m_pStream->codecpar, pContext); - if(AudioStreamCopyResult < 0) - { - char aError[AV_ERROR_MAX_STRING_SIZE]; - av_strerror(AudioStreamCopyResult, aError, sizeof(aError)); - log_error("videorecorder", "Could not copy video stream parameters: %s", aError); - return false; - } - m_VideoFrameIndex = 0; - return true; -} - -bool CVideo::OpenAudio() -{ - AVCodecContext *pContext = m_AudioStream.m_pCodecContext; - AVDictionary *pOptions = nullptr; - av_dict_copy(&pOptions, m_pOptDict, 0); - - /* open it */ - const int AudioOpenResult = avcodec_open2(pContext, m_pAudioCodec, &pOptions); - av_dict_free(&pOptions); - if(AudioOpenResult < 0) - { - char aError[AV_ERROR_MAX_STRING_SIZE]; - av_strerror(AudioOpenResult, aError, sizeof(aError)); - log_error("videorecorder", "Could not open audio codec: %s", aError); - return false; - } - - int NbSamples; - if(pContext->codec->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE) - NbSamples = 10000; - else - NbSamples = pContext->frame_size; - - m_AudioStream.m_vpFrames.clear(); - m_AudioStream.m_vpFrames.reserve(m_AudioThreads); - - m_AudioStream.m_vpTmpFrames.clear(); - m_AudioStream.m_vpTmpFrames.reserve(m_AudioThreads); - - /* allocate and init a re-usable frame */ - for(size_t i = 0; i < m_AudioThreads; ++i) - { - m_AudioStream.m_vpFrames.emplace_back(nullptr); -#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59, 24, 100) - m_AudioStream.m_vpFrames[i] = AllocAudioFrame(pContext->sample_fmt, pContext->ch_layout.u.mask, pContext->sample_rate, NbSamples); -#else - m_AudioStream.m_vpFrames[i] = AllocAudioFrame(pContext->sample_fmt, pContext->channel_layout, pContext->sample_rate, NbSamples); -#endif - if(!m_AudioStream.m_vpFrames[i]) - { - return false; - } - - m_AudioStream.m_vpTmpFrames.emplace_back(nullptr); - m_AudioStream.m_vpTmpFrames[i] = AllocAudioFrame(AV_SAMPLE_FMT_S16, AV_CH_LAYOUT_STEREO, m_pSound->MixingRate(), NbSamples); - if(!m_AudioStream.m_vpTmpFrames[i]) - { - return false; - } - } - - /* copy the stream parameters to the muxer */ - const int AudioStreamCopyResult = avcodec_parameters_from_context(m_AudioStream.m_pStream->codecpar, pContext); - if(AudioStreamCopyResult < 0) - { - char aError[AV_ERROR_MAX_STRING_SIZE]; - av_strerror(AudioStreamCopyResult, aError, sizeof(aError)); - log_error("videorecorder", "Could not copy audio stream parameters: %s", aError); - return false; - } - - /* create resampling context */ - m_AudioStream.m_vpSwrContexts.clear(); - m_AudioStream.m_vpSwrContexts.resize(m_AudioThreads); - for(size_t i = 0; i < m_AudioThreads; ++i) - { - m_AudioStream.m_vpSwrContexts[i] = swr_alloc(); - if(!m_AudioStream.m_vpSwrContexts[i]) - { - log_error("videorecorder", "Could not allocate resampling context"); - return false; - } - - /* set options */ -#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59, 24, 100) - dbg_assert(av_opt_set_chlayout(m_AudioStream.m_vpSwrContexts[i], "in_chlayout", &pContext->ch_layout, 0) == 0, "invalid option"); -#else - dbg_assert(av_opt_set_int(m_AudioStream.m_vpSwrContexts[i], "in_channel_count", pContext->channels, 0) == 0, "invalid option"); -#endif - if(av_opt_set_int(m_AudioStream.m_vpSwrContexts[i], "in_sample_rate", m_pSound->MixingRate(), 0) != 0) - { - log_error("videorecorder", "Could not set audio sample rate to %d", m_pSound->MixingRate()); - return false; - } - dbg_assert(av_opt_set_sample_fmt(m_AudioStream.m_vpSwrContexts[i], "in_sample_fmt", AV_SAMPLE_FMT_S16, 0) == 0, "invalid option"); -#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59, 24, 100) - dbg_assert(av_opt_set_chlayout(m_AudioStream.m_vpSwrContexts[i], "out_chlayout", &pContext->ch_layout, 0) == 0, "invalid option"); -#else - dbg_assert(av_opt_set_int(m_AudioStream.m_vpSwrContexts[i], "out_channel_count", pContext->channels, 0) == 0, "invalid option"); -#endif - dbg_assert(av_opt_set_int(m_AudioStream.m_vpSwrContexts[i], "out_sample_rate", pContext->sample_rate, 0) == 0, "invalid option"); - dbg_assert(av_opt_set_sample_fmt(m_AudioStream.m_vpSwrContexts[i], "out_sample_fmt", pContext->sample_fmt, 0) == 0, "invalid option"); - - /* initialize the resampling context */ - const int ResamplingContextInitResult = swr_init(m_AudioStream.m_vpSwrContexts[i]); - if(ResamplingContextInitResult < 0) - { - char aError[AV_ERROR_MAX_STRING_SIZE]; - av_strerror(ResamplingContextInitResult, aError, sizeof(aError)); - log_error("videorecorder", "Could not initialize resampling context: %s", aError); - return false; - } - } - - m_AudioFrameIndex = 0; - return true; -} - -/* Add an output stream. */ -bool CVideo::AddStream(COutputStream *pStream, AVFormatContext *pFormatContext, const AVCodec **ppCodec, enum AVCodecID CodecId) const -{ - /* find the encoder */ - *ppCodec = avcodec_find_encoder(CodecId); - if(!(*ppCodec)) - { - log_error("videorecorder", "Could not find encoder for codec '%s'", avcodec_get_name(CodecId)); - return false; - } - - pStream->m_pStream = avformat_new_stream(pFormatContext, nullptr); - if(!pStream->m_pStream) - { - log_error("videorecorder", "Could not allocate stream"); - return false; - } - pStream->m_pStream->id = pFormatContext->nb_streams - 1; - AVCodecContext *pContext = avcodec_alloc_context3(*ppCodec); - if(!pContext) - { - log_error("videorecorder", "Could not allocate encoding context"); - return false; - } - pStream->m_pCodecContext = pContext; - -#if defined(CONF_ARCH_IA32) || defined(CONF_ARCH_ARM) - // use only 1 ffmpeg thread on 32-bit to save memory - pContext->thread_count = 1; -#endif - - switch((*ppCodec)->type) - { - case AVMEDIA_TYPE_AUDIO: - { - const AVSampleFormat *pSampleFormats = nullptr; - const int *pSampleRates = nullptr; -#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(61, 13, 100) - avcodec_get_supported_config(pContext, *ppCodec, AV_CODEC_CONFIG_SAMPLE_FORMAT, 0, (const void **)&pSampleFormats, nullptr); - avcodec_get_supported_config(pContext, *ppCodec, AV_CODEC_CONFIG_SAMPLE_RATE, 0, (const void **)&pSampleRates, nullptr); -#else - pSampleFormats = (*ppCodec)->sample_fmts; - pSampleRates = (*ppCodec)->supported_samplerates; -#endif - pContext->sample_fmt = pSampleFormats ? pSampleFormats[0] : AV_SAMPLE_FMT_FLTP; - if(pSampleRates) - { - pContext->sample_rate = pSampleRates[0]; - for(int i = 0; pSampleRates[i]; i++) - { - if(pSampleRates[i] == m_pSound->MixingRate()) - { - pContext->sample_rate = m_pSound->MixingRate(); - break; - } - } - } - else - { - pContext->sample_rate = m_pSound->MixingRate(); - } - pContext->bit_rate = pContext->sample_rate * 2 * 16; -#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59, 24, 100) - dbg_assert(av_channel_layout_from_mask(&pContext->ch_layout, AV_CH_LAYOUT_STEREO) == 0, "Failed to set channel layout"); -#else - pContext->channels = 2; - pContext->channel_layout = AV_CH_LAYOUT_STEREO; -#endif - - pStream->m_pStream->time_base.num = 1; - pStream->m_pStream->time_base.den = pContext->sample_rate; - break; - } - - case AVMEDIA_TYPE_VIDEO: - pContext->codec_id = CodecId; - - pContext->bit_rate = 400000; - /* Resolution must be a multiple of two. */ - pContext->width = m_Width; - pContext->height = m_Height % 2 == 0 ? m_Height : m_Height - 1; - /* timebase: This is the fundamental unit of time (in seconds) in terms - * of which frame timestamps are represented. For fixed-fps content, - * timebase should be 1/framerate and timestamp increments should be - * identical to 1. */ - pStream->m_pStream->time_base.num = 1; - pStream->m_pStream->time_base.den = m_FPS; - pContext->time_base = pStream->m_pStream->time_base; - - pContext->gop_size = 12; /* emit one intra frame every twelve frames at most */ - pContext->pix_fmt = STREAM_PIX_FMT; - if(pContext->codec_id == AV_CODEC_ID_MPEG2VIDEO) - { - /* just for testing, we also add B-frames */ - pContext->max_b_frames = 2; - } - if(pContext->codec_id == AV_CODEC_ID_MPEG1VIDEO) - { - /* Needed to avoid using macroblocks in which some coeffs overflow. - * This does not happen with normal video, it just happens here as - * the motion of the chroma plane does not match the luma plane. */ - pContext->mb_decision = 2; - } - if(CodecId == AV_CODEC_ID_H264) - { - static const char *s_apPresets[10] = {"ultrafast", "superfast", "veryfast", "faster", "fast", "medium", "slow", "slower", "veryslow", "placebo"}; - dbg_assert(g_Config.m_ClVideoX264Preset < (int)std::size(s_apPresets), "preset index invalid"); - dbg_assert(av_opt_set(pContext->priv_data, "preset", s_apPresets[g_Config.m_ClVideoX264Preset], 0) == 0, "invalid option"); - dbg_assert(av_opt_set_int(pContext->priv_data, "crf", g_Config.m_ClVideoX264Crf, 0) == 0, "invalid option"); - } - break; - - default: - break; - } - - /* Some formats want stream headers to be separate. */ - if(pFormatContext->oformat->flags & AVFMT_GLOBALHEADER) - pContext->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; - - return true; -} - -void CVideo::WriteFrame(COutputStream *pStream, size_t ThreadIndex) -{ - AVPacket *pPacket = av_packet_alloc(); - if(pPacket == nullptr) - { - log_error("videorecorder", "Could not allocate packet"); - return; - } - - pPacket->data = 0; - pPacket->size = 0; - - avcodec_send_frame(pStream->m_pCodecContext, pStream->m_vpFrames[ThreadIndex]); - int RecvResult = 0; - do - { - RecvResult = avcodec_receive_packet(pStream->m_pCodecContext, pPacket); - if(!RecvResult) - { - /* rescale output packet timestamp values from codec to stream timebase */ - av_packet_rescale_ts(pPacket, pStream->m_pCodecContext->time_base, pStream->m_pStream->time_base); - pPacket->stream_index = pStream->m_pStream->index; - - const int WriteFrameResult = av_interleaved_write_frame(m_pFormatContext, pPacket); - if(WriteFrameResult < 0) - { - char aError[AV_ERROR_MAX_STRING_SIZE]; - av_strerror(WriteFrameResult, aError, sizeof(aError)); - log_error("videorecorder", "Could not write video frame: %s", aError); - } - } - else - break; - } while(true); - - if(RecvResult && RecvResult != AVERROR(EAGAIN)) - { - char aError[AV_ERROR_MAX_STRING_SIZE]; - av_strerror(RecvResult, aError, sizeof(aError)); - log_error("videorecorder", "Could not encode video frame: %s", aError); - } - - av_packet_free(&pPacket); -} - -void CVideo::FinishFrames(COutputStream *pStream) -{ - if(!pStream->m_pCodecContext || !avcodec_is_open(pStream->m_pCodecContext)) - return; - - AVPacket *pPacket = av_packet_alloc(); - if(pPacket == nullptr) - { - log_error("videorecorder", "Could not allocate packet"); - return; - } - - pPacket->data = 0; - pPacket->size = 0; - - avcodec_send_frame(pStream->m_pCodecContext, 0); - int RecvResult = 0; - do - { - RecvResult = avcodec_receive_packet(pStream->m_pCodecContext, pPacket); - if(!RecvResult) - { - /* rescale output packet timestamp values from codec to stream timebase */ - av_packet_rescale_ts(pPacket, pStream->m_pCodecContext->time_base, pStream->m_pStream->time_base); - pPacket->stream_index = pStream->m_pStream->index; - - const int WriteFrameResult = av_interleaved_write_frame(m_pFormatContext, pPacket); - if(WriteFrameResult < 0) - { - char aError[AV_ERROR_MAX_STRING_SIZE]; - av_strerror(WriteFrameResult, aError, sizeof(aError)); - log_error("videorecorder", "Could not write video frame: %s", aError); - } - } - else - break; - } while(true); - - if(RecvResult && RecvResult != AVERROR_EOF) - { - char aError[AV_ERROR_MAX_STRING_SIZE]; - av_strerror(RecvResult, aError, sizeof(aError)); - log_error("videorecorder", "Could not finish recording: %s", aError); - } - - av_packet_free(&pPacket); -} - -void CVideo::CloseStream(COutputStream *pStream) -{ - avcodec_free_context(&pStream->m_pCodecContext); - - for(auto *pFrame : pStream->m_vpFrames) - av_frame_free(&pFrame); - pStream->m_vpFrames.clear(); - - for(auto *pFrame : pStream->m_vpTmpFrames) - av_frame_free(&pFrame); - pStream->m_vpTmpFrames.clear(); - - for(auto *pSwsContext : pStream->m_vpSwsContexts) - sws_freeContext(pSwsContext); - pStream->m_vpSwsContexts.clear(); - - for(auto *pSwrContext : pStream->m_vpSwrContexts) - swr_free(&pSwrContext); - pStream->m_vpSwrContexts.clear(); -} - -#endif diff --git a/src/engine/client/video.h b/src/engine/client/video.h deleted file mode 100644 index 63ddc27e65..0000000000 --- a/src/engine/client/video.h +++ /dev/null @@ -1,171 +0,0 @@ -#ifndef ENGINE_CLIENT_VIDEO_H -#define ENGINE_CLIENT_VIDEO_H - -#include - -extern "C" { -#include -#include -}; - -#include - -#include -#include -#include -#include -#include - -class IGraphics; -class ISound; -class IStorage; - -extern CLock g_WriteLock; - -// a wrapper around a single output AVStream -class COutputStream -{ -public: - AVStream *m_pStream = nullptr; - AVCodecContext *m_pCodecContext = nullptr; - - /* pts of the next frame that will be generated */ - int64_t m_SamplesCount = 0; - int64_t m_SamplesFrameCount = 0; - - std::vector m_vpFrames; - std::vector m_vpTmpFrames; - - std::vector m_vpSwsContexts; - std::vector m_vpSwrContexts; -}; - -class CVideo : public IVideo -{ -public: - CVideo(IGraphics *pGraphics, ISound *pSound, IStorage *pStorage, int Width, int Height, const char *pName); - ~CVideo(); - - bool Start() override REQUIRES(!g_WriteLock); - void Stop() override; - void Pause(bool Pause) override; - bool IsRecording() override { return m_Recording; } - - void NextVideoFrame() override; - void NextVideoFrameThread() override; - - void NextAudioFrame(ISoundMixFunc Mix) override; - void NextAudioFrameTimeline(ISoundMixFunc Mix) override; - - static IVideo *Current() { return IVideo::ms_pCurrentVideo; } - - static void Init(); - -private: - void RunVideoThread(size_t ParentThreadIndex, size_t ThreadIndex) REQUIRES(!g_WriteLock); - void FillVideoFrame(size_t ThreadIndex) REQUIRES(!g_WriteLock); - void UpdateVideoBufferFromGraphics(size_t ThreadIndex); - - void RunAudioThread(size_t ParentThreadIndex, size_t ThreadIndex) REQUIRES(!g_WriteLock); - void FillAudioFrame(size_t ThreadIndex); - - bool OpenVideo(); - bool OpenAudio(); - AVFrame *AllocPicture(enum AVPixelFormat PixFmt, int Width, int Height); - AVFrame *AllocAudioFrame(enum AVSampleFormat SampleFmt, uint64_t ChannelLayout, int SampleRate, int NbSamples); - - void WriteFrame(COutputStream *pStream, size_t ThreadIndex) REQUIRES(g_WriteLock); - void FinishFrames(COutputStream *pStream); - void CloseStream(COutputStream *pStream); - - bool AddStream(COutputStream *pStream, AVFormatContext *pFormatContext, const AVCodec **ppCodec, enum AVCodecID CodecId) const; - - IGraphics *m_pGraphics; - IStorage *m_pStorage; - ISound *m_pSound; - - int m_Width; - int m_Height; - char m_aName[256]; - uint64_t m_VideoFrameIndex = 0; - uint64_t m_AudioFrameIndex = 0; - - int m_FPS; - - bool m_Started; - bool m_Stopped; - bool m_Recording; - - size_t m_VideoThreads = 2; - size_t m_CurVideoThreadIndex = 0; - size_t m_AudioThreads = 2; - size_t m_CurAudioThreadIndex = 0; - - class CVideoRecorderThread - { - public: - std::thread m_Thread; - std::mutex m_Mutex; - std::condition_variable m_Cond; - - bool m_Started = false; - bool m_Finished = false; - bool m_HasVideoFrame = false; - - std::mutex m_VideoFillMutex; - std::condition_variable m_VideoFillCond; - uint64_t m_VideoFrameToFill = 0; - }; - - std::vector> m_vpVideoThreads; - - class CAudioRecorderThread - { - public: - std::thread m_Thread; - std::mutex m_Mutex; - std::condition_variable m_Cond; - - bool m_Started = false; - bool m_Finished = false; - bool m_HasAudioFrame = false; - - std::mutex m_AudioFillMutex; - std::condition_variable m_AudioFillCond; - uint64_t m_AudioFrameToFill = 0; - int64_t m_SampleCountStart = 0; - }; - - std::vector> m_vpAudioThreads; - - std::atomic m_ProcessingVideoFrame; - std::atomic m_ProcessingAudioFrame; - - bool m_HasAudio; - - class CVideoBuffer - { - public: - std::vector m_vBuffer; - }; - std::vector m_vVideoBuffers; - class CAudioBuffer - { - public: - int16_t m_aBuffer[4096]; - }; - std::vector m_vAudioBuffers; - - COutputStream m_VideoStream; - COutputStream m_AudioStream; - - const AVCodec *m_pVideoCodec; - const AVCodec *m_pAudioCodec; - - AVDictionary *m_pOptDict; - - AVFormatContext *m_pFormatContext; - const AVOutputFormat *m_pFormat; -}; - -#endif diff --git a/src/engine/client/warning.cpp b/src/engine/client/warning.cpp deleted file mode 100644 index bb160a09a7..0000000000 --- a/src/engine/client/warning.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include - -#include - -SWarning::SWarning(const SWarning &Other) -{ - str_copy(m_aWarningTitle, Other.m_aWarningTitle); - str_copy(m_aWarningMsg, Other.m_aWarningMsg); - m_AutoHide = Other.m_AutoHide; -} - -SWarning::SWarning(const char *pMsg) -{ - str_copy(m_aWarningMsg, pMsg); -} - -SWarning::SWarning(const char *pTitle, const char *pMsg) -{ - str_copy(m_aWarningTitle, pTitle); - str_copy(m_aWarningMsg, pMsg); -} - -SWarning &SWarning::operator=(const SWarning &Other) -{ - str_copy(m_aWarningTitle, Other.m_aWarningTitle); - str_copy(m_aWarningMsg, Other.m_aWarningMsg); - m_AutoHide = Other.m_AutoHide; - return *this; -} diff --git a/src/engine/config.h b/src/engine/config.h index 4123bad7e2..38b0ef3ea5 100644 --- a/src/engine/config.h +++ b/src/engine/config.h @@ -16,7 +16,6 @@ class IConfigManager : public IInterface virtual void Reset(const char *pScriptName) = 0; virtual void ResetGameSettings() = 0; virtual void SetReadOnly(const char *pScriptName, bool ReadOnly) = 0; - virtual bool Save() = 0; virtual class CConfig *Values() = 0; virtual void RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData) = 0; diff --git a/src/engine/console.h b/src/engine/console.h index 68f570eb0a..de4871a34f 100644 --- a/src/engine/console.h +++ b/src/engine/console.h @@ -126,7 +126,6 @@ class IConsole : public IInterface virtual void Print(int Level, const char *pFrom, const char *pStr, ColorRGBA PrintColor = gs_ConsoleDefaultColor) const = 0; virtual void SetTeeHistorianCommandCallback(FTeeHistorianCommandCallback pfnCallback, void *pUser) = 0; virtual void SetUnknownCommandCallback(FUnknownCommandCallback pfnCallback, void *pUser) = 0; - virtual void InitChecksum(CChecksumData *pData) const = 0; virtual void SetAccessLevel(int AccessLevel) = 0; diff --git a/src/engine/console.rs b/src/engine/console.rs deleted file mode 100644 index 624127bc06..0000000000 --- a/src/engine/console.rs +++ /dev/null @@ -1,550 +0,0 @@ -use ddnet_base::ColorRGBA; -use ddnet_base::UserPtr; - -pub use self::ffi::CreateConsole; -pub use self::ffi::IConsole; -pub use self::ffi::IConsole_IResult; - -/// Command callback for `IConsole`. -/// -/// See [`IConsole::Register`] for an example. -#[allow(non_camel_case_types)] -#[repr(transparent)] -pub struct IConsole_FCommandCallback(pub extern "C" fn(result: &IConsole_IResult, user: UserPtr)); - -unsafe impl cxx::ExternType for IConsole_FCommandCallback { - type Id = cxx::type_id!("IConsole_FCommandCallback"); - type Kind = cxx::kind::Trivial; -} - -#[cxx::bridge] -mod ffi { - unsafe extern "C++" { - include!("base/rust.h"); - include!("engine/console.h"); - include!("engine/rust.h"); - - type ColorRGBA = ddnet_base::ColorRGBA; - type ColorHSLA = ddnet_base::ColorHSLA; - type StrRef<'a> = ddnet_base::StrRef<'a>; - type UserPtr = ddnet_base::UserPtr; - type IConsole_FCommandCallback = super::IConsole_FCommandCallback; - - /// Represents the arguments to a console command for [`IConsole`]. - /// - /// You can only obtain this type in the command callback - /// [`IConsole_FCommandCallback`] specified in [`IConsole::Register`]. - type IConsole_IResult; - - /// Get the n-th parameter of the command as an integer. - /// - /// If the index is out of range, this returns 0. If the parameter - /// cannot be parsed as an integer, this also returns 0. - /// - /// # Examples - /// - /// ``` - /// # extern crate ddnet_test; - /// # use ddnet_base::UserPtr; - /// # use ddnet_base::s; - /// # use ddnet_engine::CreateConsole; - /// # use ddnet_engine::IConsole; - /// # use ddnet_engine::IConsole_FCommandCallback; - /// # use ddnet_engine::IConsole_IResult; - /// # use ddnet_engine_shared::CFGFLAG_SERVER; - /// # - /// # let mut console = CreateConsole(CFGFLAG_SERVER); - /// # let mut executed = false; - /// # console.pin_mut().Register(s!("command"), s!("sss"), CFGFLAG_SERVER, IConsole_FCommandCallback(callback), UserPtr::from(&mut executed), s!("")); - /// # console.pin_mut().ExecuteLine(s!(r#"command "1337" abc -7331def"#), -1, true); - /// # extern "C" fn callback(result_param: &IConsole_IResult, mut user: UserPtr) { - /// # unsafe { *user.cast_mut::() = true; } - /// let result: &IConsole_IResult /* = `command "1337" abc -7331def` */; - /// # result = result_param; - /// assert_eq!(result.GetInteger(0), 1337); - /// assert_eq!(result.GetInteger(1), 0); // unparsable - /// assert_eq!(result.GetInteger(2), -7331); // parsable start - /// assert_eq!(result.GetInteger(3), 0); // out of range - /// # } - /// # assert!(executed); - /// ``` - pub fn GetInteger(self: &IConsole_IResult, Index: u32) -> i32; - - /// Get the n-th parameter of the command as a floating point number. - /// - /// If the index is out of range, this returns 0.0. If the parameter - /// cannot be parsed as a floating point number, this also returns 0.0. - /// - /// # Examples - /// - /// ``` - /// # extern crate ddnet_test; - /// # use ddnet_base::UserPtr; - /// # use ddnet_base::s; - /// # use ddnet_engine::CreateConsole; - /// # use ddnet_engine::IConsole; - /// # use ddnet_engine::IConsole_FCommandCallback; - /// # use ddnet_engine::IConsole_IResult; - /// # use ddnet_engine_shared::CFGFLAG_SERVER; - /// # - /// # let mut console = CreateConsole(CFGFLAG_SERVER); - /// # let mut executed = false; - /// # console.pin_mut().Register(s!("command"), s!("sss"), CFGFLAG_SERVER, IConsole_FCommandCallback(callback), UserPtr::from(&mut executed), s!("")); - /// # console.pin_mut().ExecuteLine(s!(r#"command "13.37" abc -73.31def"#), -1, true); - /// # extern "C" fn callback(result_param: &IConsole_IResult, mut user: UserPtr) { - /// # unsafe { *user.cast_mut::() = true; } - /// let result: &IConsole_IResult /* = `command "13.37" abc -73.31def` */; - /// # result = result_param; - /// assert_eq!(result.GetFloat(0), 13.37); - /// assert_eq!(result.GetFloat(1), 0.0); // unparsable - /// assert_eq!(result.GetFloat(2), -73.31); // parsable start - /// assert_eq!(result.GetFloat(3), 0.0); // out of range - /// # } - /// # assert!(executed); - /// ``` - pub fn GetFloat(self: &IConsole_IResult, Index: u32) -> f32; - - /// Get the n-th parameter of the command as a string. - /// - /// If the index is out of range, this returns the empty string `""`. - /// - /// # Examples - /// - /// ``` - /// # extern crate ddnet_test; - /// # use ddnet_base::UserPtr; - /// # use ddnet_base::s; - /// # use ddnet_engine::CreateConsole; - /// # use ddnet_engine::IConsole; - /// # use ddnet_engine::IConsole_FCommandCallback; - /// # use ddnet_engine::IConsole_IResult; - /// # use ddnet_engine_shared::CFGFLAG_SERVER; - /// # - /// # let mut console = CreateConsole(CFGFLAG_SERVER); - /// # let mut executed = false; - /// # console.pin_mut().Register(s!("command"), s!("sss"), CFGFLAG_SERVER, IConsole_FCommandCallback(callback), UserPtr::from(&mut executed), s!("")); - /// # console.pin_mut().ExecuteLine(s!(r#"command "I'm in space" '' "\"\\Escapes\?\"\n""#), -1, true); - /// # extern "C" fn callback(result_param: &IConsole_IResult, mut user: UserPtr) { - /// # unsafe { *user.cast_mut::() = true; } - /// let result: &IConsole_IResult /* = `command "I'm in space" '' "\"\\Escapes\?\"\n"` */; - /// # result = result_param; - /// assert_eq!(result.GetString(0), "I'm in space"); - /// assert_eq!(result.GetString(1), "''"); - /// assert_eq!(result.GetString(2), r#""\Escapes\?"\n"#); // only \\ and \" escapes - /// assert_eq!(result.GetString(3), ""); // out of range - /// # } - /// # assert!(executed); - /// ``` - pub fn GetString(self: &IConsole_IResult, Index: u32) -> StrRef<'_>; - - /// Get the n-th parameter of the command as a color. - /// - /// If the index is out of range, this returns black. If the parameter - /// cannot be parsed as a color, this also returns black. - /// - /// It supports the following formats: - /// - `$XXX` (RGB, e.g. `$f00` for red) - /// - `$XXXX` (RGBA, e.g. `$f00f` for red with maximum opacity) - /// - `$XXXXXX` (RGB, e.g. `$ffa500` for DDNet's logo color) - /// - `$XXXXXXXX` (RGBA, e.g. `$ffa500ff` for DDNet's logo color with maximum opacity) - /// - base 10 integers (24/32 bit HSL in base 10, e.g. `0` for black) - /// - the following color names: `red`, `yellow`, `green`, `cyan`, - /// `blue`, `magenta`, `white`, `gray`, `black`. - /// - /// The `Light` parameter influences the interpretation of base 10 - /// integers, if it is set, the lightness channel is divided by 2 and - /// 0.5 is added, making 0.5 the darkest and 1.0 the lightest possible - /// value. - /// - /// # Examples - /// - /// ``` - /// # extern crate ddnet_test; - /// # use ddnet_base::ColorHSLA; - /// # use ddnet_base::UserPtr; - /// # use ddnet_base::s; - /// # use ddnet_engine::CreateConsole; - /// # use ddnet_engine::IConsole; - /// # use ddnet_engine::IConsole_FCommandCallback; - /// # use ddnet_engine::IConsole_IResult; - /// # use ddnet_engine_shared::CFGFLAG_SERVER; - /// # - /// # let mut console = CreateConsole(CFGFLAG_SERVER); - /// # let mut executed = false; - /// # console.pin_mut().Register(s!("command"), s!("ssssssss"), CFGFLAG_SERVER, IConsole_FCommandCallback(callback), UserPtr::from(&mut executed), s!("")); - /// # console.pin_mut().ExecuteLine(s!(r#"command "$f00" $ffa500 $12345 shiny cyan -16777216 $f008 $00ffff80"#), -1, true); - /// # extern "C" fn callback(result_param: &IConsole_IResult, mut user: UserPtr) { - /// # unsafe { *user.cast_mut::() = true; } - /// let result: &IConsole_IResult /* = `command "$f00" $ffa500 $12345 shiny cyan -16777216 $f008 $00ffff80` */; - /// # result = result_param; - /// assert_eq!(result.GetColor(0, 0.0), ColorHSLA { h: 0.0, s: 1.0, l: 0.5, a: 1.0 }); // red - /// assert_eq!(result.GetColor(1, 0.0), ColorHSLA { h: 0.10784314, s: 1.0, l: 0.5, a: 1.0 }); // DDNet logo color - /// assert_eq!(result.GetColor(2, 0.0), ColorHSLA { h: 0.0, s: 0.0, l: 0.0, a: 1.0 }); // cannot be parsed => black - /// assert_eq!(result.GetColor(3, 0.0), ColorHSLA { h: 0.0, s: 0.0, l: 0.0, a: 1.0 }); // unknown color name => black - /// assert_eq!(result.GetColor(4, 0.0), ColorHSLA { h: 0.5, s: 1.0, l: 0.5, a: 1.0 }); // cyan - /// assert_eq!(result.GetColor(5, 0.0), ColorHSLA { h: 0.0, s: 0.0, l: 0.0, a: 1.0 }); // black - /// assert_eq!(result.GetColor(6, 0.0), ColorHSLA { h: 0.0, s: 1.0, l: 0.5, a: 0.53333336 }); // red with alpha specified - /// assert_eq!(result.GetColor(7, 0.0), ColorHSLA { h: 0.5, s: 1.0, l: 0.5, a: 0.5019608 }); // cyan with alpha specified - /// assert_eq!(result.GetColor(8, 0.0), ColorHSLA { h: 0.0, s: 0.0, l: 0.0, a: 1.0 }); // out of range => black - /// - /// assert_eq!(result.GetColor(0, 0.5), result.GetColor(0, 0.0)); - /// assert_eq!(result.GetColor(1, 0.5), result.GetColor(1, 0.0)); - /// assert_eq!(result.GetColor(2, 0.5), result.GetColor(2, 0.0)); - /// assert_eq!(result.GetColor(3, 0.5), result.GetColor(3, 0.0)); - /// assert_eq!(result.GetColor(4, 0.5), result.GetColor(4, 0.0)); - /// assert_eq!(result.GetColor(5, 0.5), ColorHSLA { h: 0.0, s: 0.0, l: 0.5, a: 1.0 }); // black, but has the `Light` parameter set - /// assert_eq!(result.GetColor(6, 0.5), result.GetColor(6, 0.0)); - /// assert_eq!(result.GetColor(7, 0.5), result.GetColor(7, 0.0)); - /// assert_eq!(result.GetColor(8, 0.5), result.GetColor(8, 0.0)); - /// # } - /// # assert!(executed); - /// ``` - pub fn GetColor(self: &IConsole_IResult, Index: u32, DarkestLighting: f32) -> ColorHSLA; - - /// Get the number of parameters passed. - /// - /// This is mostly important for commands that have optional parameters - /// (`?`) and thus support variable numbers of arguments. - /// - /// See [`IConsole::Register`] for more details. - /// - /// # Examples - /// - /// ``` - /// # extern crate ddnet_test; - /// # use ddnet_base::ColorHSLA; - /// # use ddnet_base::UserPtr; - /// # use ddnet_base::s; - /// # use ddnet_engine::CreateConsole; - /// # use ddnet_engine::IConsole; - /// # use ddnet_engine::IConsole_FCommandCallback; - /// # use ddnet_engine::IConsole_IResult; - /// # use ddnet_engine_shared::CFGFLAG_SERVER; - /// # - /// # let mut console = CreateConsole(CFGFLAG_SERVER); - /// # let mut executed: u32 = 0; - /// # console.pin_mut().Register(s!("command"), s!("s?ss"), CFGFLAG_SERVER, IConsole_FCommandCallback(callback), UserPtr::from(&mut executed), s!("")); - /// # console.pin_mut().ExecuteLine(s!(r#"command one two three"#), -1, true); - /// # console.pin_mut().ExecuteLine(s!(r#"command "one two" "three four""#), -1, true); - /// # extern "C" fn callback(result_param: &IConsole_IResult, mut user: UserPtr) { - /// # let executed; - /// # unsafe { executed = *user.cast_mut::(); *user.cast_mut::() += 1; } - /// # if executed == 0 { - /// let result: &IConsole_IResult /* = `command one two three` */; - /// # result = result_param; - /// assert_eq!(result.NumArguments(), 3); - /// - /// # } else if executed == 1 { - /// let result: &IConsole_IResult /* = `command "one two" "three four"` */; - /// # result = result_param; - /// assert_eq!(result.NumArguments(), 2); - /// # } - /// # } - /// # assert!(executed == 2); - /// ``` - pub fn NumArguments(self: &IConsole_IResult) -> i32; - - /// Get the value of the sole victim (`v`) parameter. - /// - /// This is mostly important for commands that have optional parameters - /// and thus support variable numbers of arguments. - /// - /// See [`IConsole::Register`] for more details. - /// - /// # Examples - /// - /// ``` - /// # extern crate ddnet_test; - /// # use ddnet_base::UserPtr; - /// # use ddnet_base::s; - /// # use ddnet_engine::CreateConsole; - /// # use ddnet_engine::IConsole; - /// # use ddnet_engine::IConsole_FCommandCallback; - /// # use ddnet_engine::IConsole_IResult; - /// # use ddnet_engine_shared::CFGFLAG_SERVER; - /// # - /// # let mut console = CreateConsole(CFGFLAG_SERVER); - /// # let mut executed: u32 = 0; - /// # console.pin_mut().Register(s!("command"), s!("v"), CFGFLAG_SERVER, IConsole_FCommandCallback(callback), UserPtr::from(&mut executed), s!("")); - /// # console.pin_mut().ExecuteLine(s!(r#"command me"#), 33, true); - /// # console.pin_mut().ExecuteLine(s!(r#"command string"#), 33, true); - /// # console.pin_mut().ExecuteLine(s!(r#"command 42"#), 33, true); - /// # console.pin_mut().ExecuteLine(s!(r#"command all"#), 33, true); - /// # extern "C" fn callback(result_param: &IConsole_IResult, mut user: UserPtr) { - /// # let executed; - /// # unsafe { executed = *user.cast_mut::(); *user.cast_mut::() += 1; } - /// # match executed { - /// # 0 => { - /// let result: &IConsole_IResult /* = `command me` */; - /// # result = result_param; - /// // Assume the executing client ID is 33. - /// assert_eq!(result.GetVictim(), 33); - /// - /// # } - /// # 1 => { - /// let result: &IConsole_IResult /* = `command string` */; - /// # result = result_param; - /// assert_eq!(result.GetVictim(), 0); - /// - /// # } - /// # 2 => { - /// let result: &IConsole_IResult /* = `command 42` */; - /// # result = result_param; - /// assert_eq!(result.GetVictim(), 42); - /// - /// # } - /// # 3 => { - /// let result: &IConsole_IResult /* = `command all` first invocation */; - /// # result = result_param; - /// assert_eq!(result.GetVictim(), 0); - /// # } - /// # 4 => { - /// let result: &IConsole_IResult /* = `command all` second invocation */; - /// # result = result_param; - /// assert_eq!(result.GetVictim(), 1); - /// # } - /// // … - /// # 66 => { - /// let result: &IConsole_IResult /* = `command all` last invocation */; - /// # result = result_param; - /// assert_eq!(result.GetVictim(), 63); - /// # } - /// # _ => {} - /// # } - /// # } - /// # assert!(executed == 67); - /// ``` - pub fn GetVictim(self: &IConsole_IResult) -> i32; - - /// Console interface, consists of logging output and command execution. - /// - /// This is used for the local console in the client and the remote - /// console of the server. It handles commands, their inputs and - /// outputs, command completion and also command and log output. - /// - /// Call [`CreateConsole`] to obtain an instance. - type IConsole; - - /// Execute a command in the console. - /// - /// Commands can be separated by semicolons (`;`), everything after a - /// hash sign (`#`) is treated as a comment and discarded. Parameters - /// are separated by spaces (` `). By quoting arguments with double - /// quotes (`"`), the special meaning of the other characters can be - /// disabled. Double quotes can be escaped as `\"` and backslashes can - /// be escaped as `\\` inside double quotes. - /// - /// When `InterpretSemicolons` is `false`, semicolons are not - /// interpreted unless the command starts with `mc;`. - /// - /// The `ClientID` parameter defaults to -1, `InterpretSemicolons` to - /// `true` in C++. - pub fn ExecuteLine( - self: Pin<&mut IConsole>, - pStr: StrRef<'_>, - ClientID: i32, - InterpretSemicolons: bool, - ); - - /// Log a message. - /// - /// `Level` is one of - /// - [`IConsole_OUTPUT_LEVEL_STANDARD`](constant.IConsole_OUTPUT_LEVEL_STANDARD.html) - /// - [`IConsole_OUTPUT_LEVEL_ADDINFO`](constant.IConsole_OUTPUT_LEVEL_ADDINFO.html) - /// - [`IConsole_OUTPUT_LEVEL_DEBUG`](constant.IConsole_OUTPUT_LEVEL_DEBUG.html) - /// - /// `pFrom` is some sort of module name, e.g. for code in the console, - /// it is usually "console". Other examples include "client", - /// "client/network", … - /// - /// `pStr` is the actual log message. - /// - /// `PrintColor` is the intended log color. - /// - /// `PrintColor` defaults to [`gs_ConsoleDefaultColor`] in C++. - pub fn Print( - self: &IConsole, - Level: i32, - pFrom: StrRef<'_>, - pStr: StrRef<'_>, - PrintColor: ColorRGBA, - ); - - /// Register a command. - /// - /// This function needs a command name, a parameter shortcode, some - /// flags that specify metadata about the command, a callback function - /// with associated `UserPtr` and a help string. - /// - /// `Flags` must be a combination of - /// - [`CFGFLAG_SAVE`](../ddnet_engine_shared/constant.CFGFLAG_SAVE.html) - /// - [`CFGFLAG_CLIENT`](../ddnet_engine_shared/constant.CFGFLAG_CLIENT.html) - /// - [`CFGFLAG_SERVER`](../ddnet_engine_shared/constant.CFGFLAG_SERVER.html) - /// - [`CFGFLAG_STORE`](../ddnet_engine_shared/constant.CFGFLAG_STORE.html) - /// - [`CFGFLAG_MASTER`](../ddnet_engine_shared/constant.CFGFLAG_MASTER.html) - /// - [`CFGFLAG_ECON`](../ddnet_engine_shared/constant.CFGFLAG_ECON.html) - /// - [`CMDFLAG_TEST`](../ddnet_engine_shared/constant.CMDFLAG_TEST.html) - /// - [`CFGFLAG_CHAT`](../ddnet_engine_shared/constant.CFGFLAG_CHAT.html) - /// - [`CFGFLAG_GAME`](../ddnet_engine_shared/constant.CFGFLAG_GAME.html) - /// - [`CFGFLAG_NONTEEHISTORIC`](../ddnet_engine_shared/constant.CFGFLAG_NONTEEHISTORIC.html) - /// - [`CFGFLAG_COLLIGHT`](../ddnet_engine_shared/constant.CFGFLAG_COLLIGHT.html) - /// - [`CFGFLAG_INSENSITIVE`](../ddnet_engine_shared/constant.CFGFLAG_INSENSITIVE.html) - /// - /// # Parameter shortcode - /// - /// The following parameter types are supported: - /// - /// - `i`, `f`, `s`: **I**nteger, **f**loat, and **s**tring parameter, - /// respectively. Since they're not type-checked, they're all the - /// same, one word delimited by whitespace or any quoted string. - /// Examples: `12`, `example`, `"Hello, World!"`. - /// - `r`: **R**est of the command line, possibly multiple word, until - /// the next command or the end of line. Alternatively one quoted - /// parameter. Examples: `multiple words even without quotes`, - /// `"quotes are fine, too"`. - /// - `v`: **V**ictim client ID for this command. Supports the special - /// parameters `me` for the executing client ID, and `all` to target - /// all players. Examples: `0`, `63`, `words` (gets parsed as `0`), - /// `me`, `all`. - /// - /// The parameter shortcode is now a string consisting of any number of - /// these parameter type characters, a question mark `?` to mark the - /// beginning of optional parameters and `[]` help strings after - /// each parameter that can have a short explanation. - /// - /// Examples: - /// - /// - `echo` has `r[text]`: Takes the whole command line as the first - /// parameter. This means we get the following arguments: - /// ```text - /// ## "1" - /// echo 1 - /// - /// ## "multiple words" - /// echo multiple words - /// - /// ## error: missing argument - /// echo - /// - /// ## "multiple" - /// echo "multiple" "quoted" "arguments" - /// - /// ## "comments" - /// echo comments # work too - /// - /// ## "multiple"; "commands" - /// echo multiple; echo commands - /// ``` - /// - `muteid` has `v[id] i[seconds] ?r[reason]`. Assume the local - /// player has client ID 33, then we get the following - /// arguments: - /// ```text - /// ## "33" "60" - /// muteid me 60 - /// - /// ## "12" "120" "You're a wonderful person" - /// muteid 12 120 You're a wonderful person - /// - /// ## "0" "180"; "1" "180"; …, "63" "180" - /// muteid all 180 - /// ``` - /// - /// # Examples - /// - /// ``` - /// # extern crate ddnet_test; - /// use ddnet_base::UserPtr; - /// use ddnet_base::s; - /// use ddnet_engine::CreateConsole; - /// use ddnet_engine::IConsole; - /// use ddnet_engine::IConsole_FCommandCallback; - /// use ddnet_engine::IConsole_IResult; - /// use ddnet_engine::IConsole_OUTPUT_LEVEL_STANDARD; - /// use ddnet_engine::gs_ConsoleDefaultColor; - /// use ddnet_engine_shared::CFGFLAG_SERVER; - /// - /// extern "C" fn print_callback(_: &IConsole_IResult, user: UserPtr) { - /// let console: &IConsole = unsafe { user.cast() }; - /// console.Print(IConsole_OUTPUT_LEVEL_STANDARD, s!("example"), s!("print callback"), gs_ConsoleDefaultColor); - /// } - /// - /// let mut console = CreateConsole(CFGFLAG_SERVER); - /// let user = (&*console).into(); - /// console.pin_mut().Register(s!("example"), s!(""), CFGFLAG_SERVER, IConsole_FCommandCallback(print_callback), user, s!("Example command outputting a single line into the console")); - /// console.pin_mut().ExecuteLine(s!("example"), -1, true); - /// ``` - pub fn Register( - self: Pin<&mut IConsole>, - pName: StrRef<'_>, - pParams: StrRef<'_>, - Flags: i32, - pfnFunc: IConsole_FCommandCallback, - pUser: UserPtr, - pHelp: StrRef<'_>, - ); - - /// Create a console instance. - /// - /// It comes with a few registered commands by default. Only the - /// commands sharing a bit with the `FlagMask` parameter are considered - /// when executing commands. - /// - /// # Examples - /// - /// ``` - /// # extern crate ddnet_test; - /// use ddnet_base::s; - /// use ddnet_engine::CreateConsole; - /// use ddnet_engine_shared::CFGFLAG_SERVER; - /// - /// let mut console = CreateConsole(CFGFLAG_SERVER); - /// console.pin_mut().ExecuteLine(s!("cmdlist; echo hi!"), -1, true); - /// ``` - pub fn CreateConsole(FlagMask: i32) -> UniquePtr; - } -} - -/// Default console output color. White. -/// -/// Corresponds to the `gs_ConsoleDefaultColor` constant of the same name in -/// C++. -/// -/// Used as a last parameter in [`IConsole::Print`]. -/// -/// It is treated as "no color" in the console code, meaning that the default -/// color of the output medium isn't overridden. -#[allow(non_upper_case_globals)] -pub const gs_ConsoleDefaultColor: ColorRGBA = ColorRGBA { - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, -}; - -/// Default console output level. -/// -/// Corresponds to the `IConsole::OUTPUT_LEVEL_STANDARD` enum value in C++. -/// -/// Used as a first parameter in [`IConsole::Print`]. -/// -/// This is the only level that is shown by default. -#[allow(non_upper_case_globals)] -pub const IConsole_OUTPUT_LEVEL_STANDARD: i32 = 0; -/// First more verbose console output level. -/// -/// Corresponds to the `IConsole::OUTPUT_LEVEL_ADDINFO` enum value in C++. -/// -/// Used as a first parameter in [`IConsole::Print`]. -/// -/// This output level is not shown by default. -#[allow(non_upper_case_globals)] -pub const IConsole_OUTPUT_LEVEL_ADDINFO: i32 = 1; -/// Most verbose console output level. -/// -/// Corresponds to the `IConsole::OUTPUT_LEVEL_DEBUG` enum value in C++. -/// -/// Used as a first parameter in [`IConsole::Print`]. -/// -/// This output level is not shown by default. -#[allow(non_upper_case_globals)] -pub const IConsole_OUTPUT_LEVEL_DEBUG: i32 = 2; diff --git a/src/engine/discord.h b/src/engine/discord.h deleted file mode 100644 index 5b5f0a8269..0000000000 --- a/src/engine/discord.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef ENGINE_DISCORD_H -#define ENGINE_DISCORD_H - -#include "kernel.h" -#include - -class IDiscord : public IInterface -{ - MACRO_INTERFACE("discord") -public: - virtual void Update() = 0; - - virtual void ClearGameInfo() = 0; - virtual void SetGameInfo(const NETADDR &ServerAddr, const char *pMapName, bool AnnounceAddr) = 0; -}; - -IDiscord *CreateDiscord(); - -#endif // ENGINE_DISCORD_H diff --git a/src/engine/docs/client_time.txt b/src/engine/docs/client_time.txt deleted file mode 100644 index 0d4dd53e07..0000000000 --- a/src/engine/docs/client_time.txt +++ /dev/null @@ -1,11 +0,0 @@ -Title: Time on the client - -tick, intratick -predtick, predintratick - - prevtick tick predtick - 4 8 14 - |---------------------|---------------------| - 0 <- intratick -> 1 - 0 <- ticktime(in s)-> X - 0 <- predintratick?-> 1 diff --git a/src/engine/docs/prediction.txt b/src/engine/docs/prediction.txt deleted file mode 100644 index 8eb5a87229..0000000000 --- a/src/engine/docs/prediction.txt +++ /dev/null @@ -1,19 +0,0 @@ -Title: Prediction - -The engine calls when reprediction is required. This happens usually when new data has arrived from the server. should to prediction from the current snapshot and current snapshot tick ( + 1) up to and including the tick returned by . - -Predicted input sent to the server can be retrieved by calling with the corresponding tick that you want the input for. Here is a simple example of how it might look. - -> void modc_predict() -> { -> int tick; -> prediction_reset(); -> -> for(tick = client_tick()+1; tick <= client_predtick(); tick++) -> { -> MY_INPUT *input = (MY_INPUT *)client_get_input(); -> if(input) -> prediction_apply_input(input); -> prediction_tick(); -> } -> } diff --git a/src/engine/docs/server_op.txt b/src/engine/docs/server_op.txt deleted file mode 100644 index c0a054c48b..0000000000 --- a/src/engine/docs/server_op.txt +++ /dev/null @@ -1,39 +0,0 @@ -Title: Server Operation - -Section: Init - -Section: Running - -Here is an graph over how the server operates on each refresh. - -(start code) -load map -init mod - -while running - if map change then - load new map - shutdown mod - reset clients to init state - init mod - end if - - if new tick then - call - for each client do - create snapshot - send snapshot - end for - end - - process new network messages -end while - -unload map -(end) - - - -Section: Reinit - -Section: Shutdown diff --git a/src/engine/docs/snapshots.txt b/src/engine/docs/snapshots.txt deleted file mode 100644 index 4bd494ca06..0000000000 --- a/src/engine/docs/snapshots.txt +++ /dev/null @@ -1,57 +0,0 @@ -Title: Snapshots - -Section: Overview - -Topic: Definitions - -- *Snapshot*. A is a serialized game state from which a client can render the game from. They are sent from the server at a regular interval and is created specifically for each client in order to reduce bandwidth. -- *Delta Snapshot*. A set of data that can be applied to a snapshot in order to create a new snapshot with the updated game state. - -Topic: Structure - -A snapshot contains a series of items. Each item have a type, id and data. - -- *Type*. Type of item. Could be projectile or character for example. -- *Id*. A unique id so the client can identify the item between two snapshots. -- *Data*. A series of 32-bit integers that contains the per item type specific data. - -Section: Server Side - -Topic: Creating - -Items can be added when is called using the function to insert an item to the snapshot. The server can not inspect the snapshot that is in progress of being created. - -Section: Client Side - -Topic: Inspection - is called when a new snapshot has arrived for processing. , and can be used to inspect the current and previous snapshot. This can be done anywhere while the client is running and not just in the function. - -Topic: Rendering -DOCTODO - -Section: In depth - -Topic: Compression - -After a snapshot has been created, compression is applied to reduce the bandwidth. There are several steps taken in order to reduce the size of the snapshot. - -- *Delta*. The server looks in a clients backlog of snapshots to find a previous acked snapshot. It then compares the two snapshots and creates a delta snapshot containing the changes from the previous acked snapshot to the new one. -- *Variable Integers*. The delta snapshot which is only consisting of 32-bit integers is then encoded into variable integers similar to UTF-8. Each byte has a bit that tells the decoder that it needs one more byte to decode the 32-bit integer. The first byte also contains a bit for telling the sign of the integer. - -> ESDDDDDD EDDDDDDD EDDDDDDD EDDDDDDD - -> E = extend -> S = sign -> D = data bit - -- *Huffman*. The last step is to compress the buffer with a huffman encoder. It uses a static tree that is weighted towards 0 because it's where most of the data will be because of the delta compression. - -Topic: Interval - -The interval for how often a client receives a snapshot changes during the course of the connection. There are three different snapshot rates. - -- *Init*. 5 snapshots per second. Used when a client is connecting and used until the client has acknowledged a snapshot. This mechanism is used because the first snapshot because no delta compression can be done. - -- *Full*. Snapshot for every tick or every even tick depending on server configuration. This is used during normal gameplay and everything is running smooth. - -- *Recovery*. 1 snapshot each second. A client enters recovery rate when it hasn't acknowledged a snapshot over 1 second. This is to let the client be able to recover if it has a slow connection. diff --git a/src/engine/editor.h b/src/engine/editor.h deleted file mode 100644 index 745868062a..0000000000 --- a/src/engine/editor.h +++ /dev/null @@ -1,30 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef ENGINE_EDITOR_H -#define ENGINE_EDITOR_H -#include "kernel.h" - -class IEditor : public IInterface -{ - MACRO_INTERFACE("editor") -public: - virtual ~IEditor() {} - virtual void Init() = 0; - virtual void OnUpdate() = 0; - virtual void OnRender() = 0; - virtual void OnActivate() = 0; - virtual void OnWindowResize() = 0; - virtual void OnClose() = 0; - virtual void OnDialogClose() = 0; - virtual bool HasUnsavedData() const = 0; - virtual bool HandleMapDrop(const char *pFilename, int StorageType) = 0; - virtual bool Load(const char *pFilename, int StorageType) = 0; - virtual bool Save(const char *pFilename) = 0; - virtual void UpdateMentions() = 0; - virtual void ResetMentions() = 0; - virtual void OnIngameMoved() = 0; - virtual void ResetIngameMoved() = 0; -}; - -extern IEditor *CreateEditor(); -#endif diff --git a/src/engine/external/glew/GL/eglew.h b/src/engine/external/glew/GL/eglew.h deleted file mode 100644 index 4670147948..0000000000 --- a/src/engine/external/glew/GL/eglew.h +++ /dev/null @@ -1,2618 +0,0 @@ -/* -** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2017, Nigel Stewart -** Copyright (C) 2002-2008, Milan Ikits -** Copyright (C) 2002-2008, Marcelo E. Magallon -** Copyright (C) 2002, Lev Povalahev -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are met: -** -** * Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** * The name of the author may be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -** THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Mesa 3-D graphics library - * Version: 7.0 - * - * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* -** Copyright (c) 2007 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -#ifndef __eglew_h__ -#define __eglew_h__ -#define __EGLEW_H__ - -#ifdef __eglext_h_ -#error eglext.h included before eglew.h -#endif - -#if defined(__egl_h_) -#error egl.h included before eglew.h -#endif - -#define __eglext_h_ - -#define __egl_h_ - -#ifndef EGLAPIENTRY -#define EGLAPIENTRY -#endif -#ifndef EGLAPI -#define EGLAPI extern -#endif - -/* EGL Types */ -#include - -#include -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef int32_t EGLint; - -typedef unsigned int EGLBoolean; -typedef void *EGLDisplay; -typedef void *EGLConfig; -typedef void *EGLSurface; -typedef void *EGLContext; -typedef void (*__eglMustCastToProperFunctionPointerType)(void); - -typedef unsigned int EGLenum; -typedef void *EGLClientBuffer; - -typedef void *EGLSync; -typedef intptr_t EGLAttrib; -typedef khronos_utime_nanoseconds_t EGLTime; -typedef void *EGLImage; - -typedef void *EGLSyncKHR; -typedef intptr_t EGLAttribKHR; -typedef void *EGLLabelKHR; -typedef void *EGLObjectKHR; -typedef void (EGLAPIENTRY *EGLDEBUGPROCKHR)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message); -typedef khronos_utime_nanoseconds_t EGLTimeKHR; -typedef void *EGLImageKHR; -typedef void *EGLStreamKHR; -typedef khronos_uint64_t EGLuint64KHR; -typedef int EGLNativeFileDescriptorKHR; -typedef khronos_ssize_t EGLsizeiANDROID; -typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize); -typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize); -typedef void *EGLDeviceEXT; -typedef void *EGLOutputLayerEXT; -typedef void *EGLOutputPortEXT; -typedef void *EGLSyncNV; -typedef khronos_utime_nanoseconds_t EGLTimeNV; -typedef khronos_utime_nanoseconds_t EGLuint64NV; -typedef khronos_stime_nanoseconds_t EGLnsecsANDROID; - -struct EGLClientPixmapHI; - -#define EGL_DONT_CARE ((EGLint)-1) - -#define EGL_NO_CONTEXT ((EGLContext)0) -#define EGL_NO_DISPLAY ((EGLDisplay)0) -#define EGL_NO_IMAGE ((EGLImage)0) -#define EGL_NO_SURFACE ((EGLSurface)0) -#define EGL_NO_SYNC ((EGLSync)0) - -#define EGL_UNKNOWN ((EGLint)-1) - -#define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType)0) - -EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress (const char *procname); -/* ---------------------------- EGL_VERSION_1_0 ---------------------------- */ - -#ifndef EGL_VERSION_1_0 -#define EGL_VERSION_1_0 1 - -#define EGL_FALSE 0 -#define EGL_PBUFFER_BIT 0x0001 -#define EGL_TRUE 1 -#define EGL_PIXMAP_BIT 0x0002 -#define EGL_WINDOW_BIT 0x0004 -#define EGL_SUCCESS 0x3000 -#define EGL_NOT_INITIALIZED 0x3001 -#define EGL_BAD_ACCESS 0x3002 -#define EGL_BAD_ALLOC 0x3003 -#define EGL_BAD_ATTRIBUTE 0x3004 -#define EGL_BAD_CONFIG 0x3005 -#define EGL_BAD_CONTEXT 0x3006 -#define EGL_BAD_CURRENT_SURFACE 0x3007 -#define EGL_BAD_DISPLAY 0x3008 -#define EGL_BAD_MATCH 0x3009 -#define EGL_BAD_NATIVE_PIXMAP 0x300A -#define EGL_BAD_NATIVE_WINDOW 0x300B -#define EGL_BAD_PARAMETER 0x300C -#define EGL_BAD_SURFACE 0x300D -#define EGL_BUFFER_SIZE 0x3020 -#define EGL_ALPHA_SIZE 0x3021 -#define EGL_BLUE_SIZE 0x3022 -#define EGL_GREEN_SIZE 0x3023 -#define EGL_RED_SIZE 0x3024 -#define EGL_DEPTH_SIZE 0x3025 -#define EGL_STENCIL_SIZE 0x3026 -#define EGL_CONFIG_CAVEAT 0x3027 -#define EGL_CONFIG_ID 0x3028 -#define EGL_LEVEL 0x3029 -#define EGL_MAX_PBUFFER_HEIGHT 0x302A -#define EGL_MAX_PBUFFER_PIXELS 0x302B -#define EGL_MAX_PBUFFER_WIDTH 0x302C -#define EGL_NATIVE_RENDERABLE 0x302D -#define EGL_NATIVE_VISUAL_ID 0x302E -#define EGL_NATIVE_VISUAL_TYPE 0x302F -#define EGL_SAMPLES 0x3031 -#define EGL_SAMPLE_BUFFERS 0x3032 -#define EGL_SURFACE_TYPE 0x3033 -#define EGL_TRANSPARENT_TYPE 0x3034 -#define EGL_TRANSPARENT_BLUE_VALUE 0x3035 -#define EGL_TRANSPARENT_GREEN_VALUE 0x3036 -#define EGL_TRANSPARENT_RED_VALUE 0x3037 -#define EGL_NONE 0x3038 -#define EGL_SLOW_CONFIG 0x3050 -#define EGL_NON_CONFORMANT_CONFIG 0x3051 -#define EGL_TRANSPARENT_RGB 0x3052 -#define EGL_VENDOR 0x3053 -#define EGL_VERSION 0x3054 -#define EGL_EXTENSIONS 0x3055 -#define EGL_HEIGHT 0x3056 -#define EGL_WIDTH 0x3057 -#define EGL_LARGEST_PBUFFER 0x3058 -#define EGL_DRAW 0x3059 -#define EGL_READ 0x305A -#define EGL_CORE_NATIVE_ENGINE 0x305B - -typedef EGLBoolean ( * PFNEGLCHOOSECONFIGPROC) (EGLDisplay dpy, const EGLint * attrib_list, EGLConfig * configs, EGLint config_size, EGLint * num_config); -typedef EGLBoolean ( * PFNEGLCOPYBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target); -typedef EGLContext ( * PFNEGLCREATECONTEXTPROC) (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint * attrib_list); -typedef EGLSurface ( * PFNEGLCREATEPBUFFERSURFACEPROC) (EGLDisplay dpy, EGLConfig config, const EGLint * attrib_list); -typedef EGLSurface ( * PFNEGLCREATEPIXMAPSURFACEPROC) (EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint * attrib_list); -typedef EGLSurface ( * PFNEGLCREATEWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint * attrib_list); -typedef EGLBoolean ( * PFNEGLDESTROYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx); -typedef EGLBoolean ( * PFNEGLDESTROYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface); -typedef EGLBoolean ( * PFNEGLGETCONFIGATTRIBPROC) (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint * value); -typedef EGLBoolean ( * PFNEGLGETCONFIGSPROC) (EGLDisplay dpy, EGLConfig * configs, EGLint config_size, EGLint * num_config); -typedef EGLDisplay ( * PFNEGLGETCURRENTDISPLAYPROC) ( void ); -typedef EGLSurface ( * PFNEGLGETCURRENTSURFACEPROC) (EGLint readdraw); -typedef EGLDisplay ( * PFNEGLGETDISPLAYPROC) (EGLNativeDisplayType display_id); -typedef EGLint ( * PFNEGLGETERRORPROC) ( void ); -typedef EGLBoolean ( * PFNEGLINITIALIZEPROC) (EGLDisplay dpy, EGLint * major, EGLint * minor); -typedef EGLBoolean ( * PFNEGLMAKECURRENTPROC) (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); -typedef EGLBoolean ( * PFNEGLQUERYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint * value); -typedef const char * ( * PFNEGLQUERYSTRINGPROC) (EGLDisplay dpy, EGLint name); -typedef EGLBoolean ( * PFNEGLQUERYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint * value); -typedef EGLBoolean ( * PFNEGLSWAPBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface); -typedef EGLBoolean ( * PFNEGLTERMINATEPROC) (EGLDisplay dpy); -typedef EGLBoolean ( * PFNEGLWAITGLPROC) ( void ); -typedef EGLBoolean ( * PFNEGLWAITNATIVEPROC) (EGLint engine); - -#define eglChooseConfig EGLEW_GET_FUN(__eglewChooseConfig) -#define eglCopyBuffers EGLEW_GET_FUN(__eglewCopyBuffers) -#define eglCreateContext EGLEW_GET_FUN(__eglewCreateContext) -#define eglCreatePbufferSurface EGLEW_GET_FUN(__eglewCreatePbufferSurface) -#define eglCreatePixmapSurface EGLEW_GET_FUN(__eglewCreatePixmapSurface) -#define eglCreateWindowSurface EGLEW_GET_FUN(__eglewCreateWindowSurface) -#define eglDestroyContext EGLEW_GET_FUN(__eglewDestroyContext) -#define eglDestroySurface EGLEW_GET_FUN(__eglewDestroySurface) -#define eglGetConfigAttrib EGLEW_GET_FUN(__eglewGetConfigAttrib) -#define eglGetConfigs EGLEW_GET_FUN(__eglewGetConfigs) -#define eglGetCurrentDisplay EGLEW_GET_FUN(__eglewGetCurrentDisplay) -#define eglGetCurrentSurface EGLEW_GET_FUN(__eglewGetCurrentSurface) -#define eglGetDisplay EGLEW_GET_FUN(__eglewGetDisplay) -#define eglGetError EGLEW_GET_FUN(__eglewGetError) -#define eglInitialize EGLEW_GET_FUN(__eglewInitialize) -#define eglMakeCurrent EGLEW_GET_FUN(__eglewMakeCurrent) -#define eglQueryContext EGLEW_GET_FUN(__eglewQueryContext) -#define eglQueryString EGLEW_GET_FUN(__eglewQueryString) -#define eglQuerySurface EGLEW_GET_FUN(__eglewQuerySurface) -#define eglSwapBuffers EGLEW_GET_FUN(__eglewSwapBuffers) -#define eglTerminate EGLEW_GET_FUN(__eglewTerminate) -#define eglWaitGL EGLEW_GET_FUN(__eglewWaitGL) -#define eglWaitNative EGLEW_GET_FUN(__eglewWaitNative) - -#define EGLEW_VERSION_1_0 EGLEW_GET_VAR(__EGLEW_VERSION_1_0) - -#endif /* EGL_VERSION_1_0 */ - -/* ---------------------------- EGL_VERSION_1_1 ---------------------------- */ - -#ifndef EGL_VERSION_1_1 -#define EGL_VERSION_1_1 1 - -#define EGL_CONTEXT_LOST 0x300E -#define EGL_BIND_TO_TEXTURE_RGB 0x3039 -#define EGL_BIND_TO_TEXTURE_RGBA 0x303A -#define EGL_MIN_SWAP_INTERVAL 0x303B -#define EGL_MAX_SWAP_INTERVAL 0x303C -#define EGL_NO_TEXTURE 0x305C -#define EGL_TEXTURE_RGB 0x305D -#define EGL_TEXTURE_RGBA 0x305E -#define EGL_TEXTURE_2D 0x305F -#define EGL_TEXTURE_FORMAT 0x3080 -#define EGL_TEXTURE_TARGET 0x3081 -#define EGL_MIPMAP_TEXTURE 0x3082 -#define EGL_MIPMAP_LEVEL 0x3083 -#define EGL_BACK_BUFFER 0x3084 - -typedef EGLBoolean ( * PFNEGLBINDTEXIMAGEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint buffer); -typedef EGLBoolean ( * PFNEGLRELEASETEXIMAGEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint buffer); -typedef EGLBoolean ( * PFNEGLSURFACEATTRIBPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value); -typedef EGLBoolean ( * PFNEGLSWAPINTERVALPROC) (EGLDisplay dpy, EGLint interval); - -#define eglBindTexImage EGLEW_GET_FUN(__eglewBindTexImage) -#define eglReleaseTexImage EGLEW_GET_FUN(__eglewReleaseTexImage) -#define eglSurfaceAttrib EGLEW_GET_FUN(__eglewSurfaceAttrib) -#define eglSwapInterval EGLEW_GET_FUN(__eglewSwapInterval) - -#define EGLEW_VERSION_1_1 EGLEW_GET_VAR(__EGLEW_VERSION_1_1) - -#endif /* EGL_VERSION_1_1 */ - -/* ---------------------------- EGL_VERSION_1_2 ---------------------------- */ - -#ifndef EGL_VERSION_1_2 -#define EGL_VERSION_1_2 1 - -#define EGL_OPENGL_ES_BIT 0x0001 -#define EGL_OPENVG_BIT 0x0002 -#define EGL_LUMINANCE_SIZE 0x303D -#define EGL_ALPHA_MASK_SIZE 0x303E -#define EGL_COLOR_BUFFER_TYPE 0x303F -#define EGL_RENDERABLE_TYPE 0x3040 -#define EGL_SINGLE_BUFFER 0x3085 -#define EGL_RENDER_BUFFER 0x3086 -#define EGL_COLORSPACE 0x3087 -#define EGL_ALPHA_FORMAT 0x3088 -#define EGL_COLORSPACE_LINEAR 0x308A -#define EGL_ALPHA_FORMAT_NONPRE 0x308B -#define EGL_ALPHA_FORMAT_PRE 0x308C -#define EGL_CLIENT_APIS 0x308D -#define EGL_RGB_BUFFER 0x308E -#define EGL_LUMINANCE_BUFFER 0x308F -#define EGL_HORIZONTAL_RESOLUTION 0x3090 -#define EGL_VERTICAL_RESOLUTION 0x3091 -#define EGL_PIXEL_ASPECT_RATIO 0x3092 -#define EGL_SWAP_BEHAVIOR 0x3093 -#define EGL_BUFFER_PRESERVED 0x3094 -#define EGL_BUFFER_DESTROYED 0x3095 -#define EGL_OPENVG_IMAGE 0x3096 -#define EGL_CONTEXT_CLIENT_TYPE 0x3097 -#define EGL_OPENGL_ES_API 0x30A0 -#define EGL_OPENVG_API 0x30A1 -#define EGL_DISPLAY_SCALING 10000 - -typedef EGLBoolean ( * PFNEGLBINDAPIPROC) (EGLenum api); -typedef EGLSurface ( * PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC) (EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint * attrib_list); -typedef EGLenum ( * PFNEGLQUERYAPIPROC) ( void ); -typedef EGLBoolean ( * PFNEGLRELEASETHREADPROC) ( void ); -typedef EGLBoolean ( * PFNEGLWAITCLIENTPROC) ( void ); - -#define eglBindAPI EGLEW_GET_FUN(__eglewBindAPI) -#define eglCreatePbufferFromClientBuffer EGLEW_GET_FUN(__eglewCreatePbufferFromClientBuffer) -#define eglQueryAPI EGLEW_GET_FUN(__eglewQueryAPI) -#define eglReleaseThread EGLEW_GET_FUN(__eglewReleaseThread) -#define eglWaitClient EGLEW_GET_FUN(__eglewWaitClient) - -#define EGLEW_VERSION_1_2 EGLEW_GET_VAR(__EGLEW_VERSION_1_2) - -#endif /* EGL_VERSION_1_2 */ - -/* ---------------------------- EGL_VERSION_1_3 ---------------------------- */ - -#ifndef EGL_VERSION_1_3 -#define EGL_VERSION_1_3 1 - -#define EGL_OPENGL_ES2_BIT 0x0004 -#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020 -#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040 -#define EGL_MATCH_NATIVE_PIXMAP 0x3041 -#define EGL_CONFORMANT 0x3042 -#define EGL_VG_COLORSPACE 0x3087 -#define EGL_VG_ALPHA_FORMAT 0x3088 -#define EGL_VG_COLORSPACE_LINEAR 0x308A -#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B -#define EGL_VG_ALPHA_FORMAT_PRE 0x308C -#define EGL_CONTEXT_CLIENT_VERSION 0x3098 - -#define EGLEW_VERSION_1_3 EGLEW_GET_VAR(__EGLEW_VERSION_1_3) - -#endif /* EGL_VERSION_1_3 */ - -/* ---------------------------- EGL_VERSION_1_4 ---------------------------- */ - -#ifndef EGL_VERSION_1_4 -#define EGL_VERSION_1_4 1 - -#define EGL_OPENGL_BIT 0x0008 -#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200 -#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400 -#define EGL_MULTISAMPLE_RESOLVE 0x3099 -#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A -#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B -#define EGL_OPENGL_API 0x30A2 - -typedef EGLContext ( * PFNEGLGETCURRENTCONTEXTPROC) ( void ); - -#define eglGetCurrentContext EGLEW_GET_FUN(__eglewGetCurrentContext) - -#define EGLEW_VERSION_1_4 EGLEW_GET_VAR(__EGLEW_VERSION_1_4) - -#endif /* EGL_VERSION_1_4 */ - -/* ---------------------------- EGL_VERSION_1_5 ---------------------------- */ - -#ifndef EGL_VERSION_1_5 -#define EGL_VERSION_1_5 1 - -#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT 0x00000001 -#define EGL_SYNC_FLUSH_COMMANDS_BIT 0x0001 -#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT 0x00000002 -#define EGL_OPENGL_ES3_BIT 0x00000040 -#define EGL_GL_COLORSPACE_SRGB 0x3089 -#define EGL_GL_COLORSPACE_LINEAR 0x308A -#define EGL_CONTEXT_MAJOR_VERSION 0x3098 -#define EGL_CL_EVENT_HANDLE 0x309C -#define EGL_GL_COLORSPACE 0x309D -#define EGL_GL_TEXTURE_2D 0x30B1 -#define EGL_GL_TEXTURE_3D 0x30B2 -#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x30B3 -#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x30B4 -#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x30B5 -#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x30B6 -#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x30B7 -#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x30B8 -#define EGL_GL_RENDERBUFFER 0x30B9 -#define EGL_GL_TEXTURE_LEVEL 0x30BC -#define EGL_GL_TEXTURE_ZOFFSET 0x30BD -#define EGL_IMAGE_PRESERVED 0x30D2 -#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE 0x30F0 -#define EGL_SYNC_STATUS 0x30F1 -#define EGL_SIGNALED 0x30F2 -#define EGL_UNSIGNALED 0x30F3 -#define EGL_TIMEOUT_EXPIRED 0x30F5 -#define EGL_CONDITION_SATISFIED 0x30F6 -#define EGL_SYNC_TYPE 0x30F7 -#define EGL_SYNC_CONDITION 0x30F8 -#define EGL_SYNC_FENCE 0x30F9 -#define EGL_CONTEXT_MINOR_VERSION 0x30FB -#define EGL_CONTEXT_OPENGL_PROFILE_MASK 0x30FD -#define EGL_SYNC_CL_EVENT 0x30FE -#define EGL_SYNC_CL_EVENT_COMPLETE 0x30FF -#define EGL_CONTEXT_OPENGL_DEBUG 0x31B0 -#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE 0x31B1 -#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS 0x31B2 -#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY 0x31BD -#define EGL_NO_RESET_NOTIFICATION 0x31BE -#define EGL_LOSE_CONTEXT_ON_RESET 0x31BF -#define EGL_FOREVER 0xFFFFFFFFFFFFFFFF - -typedef EGLint ( * PFNEGLCLIENTWAITSYNCPROC) (EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout); -typedef EGLImage ( * PFNEGLCREATEIMAGEPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib * attrib_list); -typedef EGLSurface ( * PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC) (EGLDisplay dpy, EGLConfig config, void * native_pixmap, const EGLAttrib * attrib_list); -typedef EGLSurface ( * PFNEGLCREATEPLATFORMWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConfig config, void * native_window, const EGLAttrib * attrib_list); -typedef EGLSync ( * PFNEGLCREATESYNCPROC) (EGLDisplay dpy, EGLenum type, const EGLAttrib * attrib_list); -typedef EGLBoolean ( * PFNEGLDESTROYIMAGEPROC) (EGLDisplay dpy, EGLImage image); -typedef EGLBoolean ( * PFNEGLDESTROYSYNCPROC) (EGLDisplay dpy, EGLSync sync); -typedef EGLDisplay ( * PFNEGLGETPLATFORMDISPLAYPROC) (EGLenum platform, void * native_display, const EGLAttrib * attrib_list); -typedef EGLBoolean ( * PFNEGLGETSYNCATTRIBPROC) (EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib * value); -typedef EGLBoolean ( * PFNEGLWAITSYNCPROC) (EGLDisplay dpy, EGLSync sync, EGLint flags); - -#define eglClientWaitSync EGLEW_GET_FUN(__eglewClientWaitSync) -#define eglCreateImage EGLEW_GET_FUN(__eglewCreateImage) -#define eglCreatePlatformPixmapSurface EGLEW_GET_FUN(__eglewCreatePlatformPixmapSurface) -#define eglCreatePlatformWindowSurface EGLEW_GET_FUN(__eglewCreatePlatformWindowSurface) -#define eglCreateSync EGLEW_GET_FUN(__eglewCreateSync) -#define eglDestroyImage EGLEW_GET_FUN(__eglewDestroyImage) -#define eglDestroySync EGLEW_GET_FUN(__eglewDestroySync) -#define eglGetPlatformDisplay EGLEW_GET_FUN(__eglewGetPlatformDisplay) -#define eglGetSyncAttrib EGLEW_GET_FUN(__eglewGetSyncAttrib) -#define eglWaitSync EGLEW_GET_FUN(__eglewWaitSync) - -#define EGLEW_VERSION_1_5 EGLEW_GET_VAR(__EGLEW_VERSION_1_5) - -#endif /* EGL_VERSION_1_5 */ - -/* ------------------------- EGL_ANDROID_blob_cache ------------------------ */ - -#ifndef EGL_ANDROID_blob_cache -#define EGL_ANDROID_blob_cache 1 - -typedef void ( * PFNEGLSETBLOBCACHEFUNCSANDROIDPROC) (EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get); - -#define eglSetBlobCacheFuncsANDROID EGLEW_GET_FUN(__eglewSetBlobCacheFuncsANDROID) - -#define EGLEW_ANDROID_blob_cache EGLEW_GET_VAR(__EGLEW_ANDROID_blob_cache) - -#endif /* EGL_ANDROID_blob_cache */ - -/* ---------------- EGL_ANDROID_create_native_client_buffer ---------------- */ - -#ifndef EGL_ANDROID_create_native_client_buffer -#define EGL_ANDROID_create_native_client_buffer 1 - -#define EGL_NATIVE_BUFFER_USAGE_PROTECTED_BIT_ANDROID 0x00000001 -#define EGL_NATIVE_BUFFER_USAGE_RENDERBUFFER_BIT_ANDROID 0x00000002 -#define EGL_NATIVE_BUFFER_USAGE_TEXTURE_BIT_ANDROID 0x00000004 -#define EGL_NATIVE_BUFFER_USAGE_ANDROID 0x3143 - -typedef EGLClientBuffer ( * PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC) (const EGLint * attrib_list); - -#define eglCreateNativeClientBufferANDROID EGLEW_GET_FUN(__eglewCreateNativeClientBufferANDROID) - -#define EGLEW_ANDROID_create_native_client_buffer EGLEW_GET_VAR(__EGLEW_ANDROID_create_native_client_buffer) - -#endif /* EGL_ANDROID_create_native_client_buffer */ - -/* --------------------- EGL_ANDROID_framebuffer_target -------------------- */ - -#ifndef EGL_ANDROID_framebuffer_target -#define EGL_ANDROID_framebuffer_target 1 - -#define EGL_FRAMEBUFFER_TARGET_ANDROID 0x3147 - -#define EGLEW_ANDROID_framebuffer_target EGLEW_GET_VAR(__EGLEW_ANDROID_framebuffer_target) - -#endif /* EGL_ANDROID_framebuffer_target */ - -/* ----------------- EGL_ANDROID_front_buffer_auto_refresh ----------------- */ - -#ifndef EGL_ANDROID_front_buffer_auto_refresh -#define EGL_ANDROID_front_buffer_auto_refresh 1 - -#define EGL_FRONT_BUFFER_AUTO_REFRESH_ANDROID 0x314C - -#define EGLEW_ANDROID_front_buffer_auto_refresh EGLEW_GET_VAR(__EGLEW_ANDROID_front_buffer_auto_refresh) - -#endif /* EGL_ANDROID_front_buffer_auto_refresh */ - -/* -------------------- EGL_ANDROID_image_native_buffer -------------------- */ - -#ifndef EGL_ANDROID_image_native_buffer -#define EGL_ANDROID_image_native_buffer 1 - -#define EGL_NATIVE_BUFFER_ANDROID 0x3140 - -#define EGLEW_ANDROID_image_native_buffer EGLEW_GET_VAR(__EGLEW_ANDROID_image_native_buffer) - -#endif /* EGL_ANDROID_image_native_buffer */ - -/* --------------------- EGL_ANDROID_native_fence_sync --------------------- */ - -#ifndef EGL_ANDROID_native_fence_sync -#define EGL_ANDROID_native_fence_sync 1 - -#define EGL_SYNC_NATIVE_FENCE_ANDROID 0x3144 -#define EGL_SYNC_NATIVE_FENCE_FD_ANDROID 0x3145 -#define EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID 0x3146 - -typedef EGLint ( * PFNEGLDUPNATIVEFENCEFDANDROIDPROC) (EGLDisplay dpy, EGLSyncKHR sync); - -#define eglDupNativeFenceFDANDROID EGLEW_GET_FUN(__eglewDupNativeFenceFDANDROID) - -#define EGLEW_ANDROID_native_fence_sync EGLEW_GET_VAR(__EGLEW_ANDROID_native_fence_sync) - -#endif /* EGL_ANDROID_native_fence_sync */ - -/* --------------------- EGL_ANDROID_presentation_time --------------------- */ - -#ifndef EGL_ANDROID_presentation_time -#define EGL_ANDROID_presentation_time 1 - -typedef EGLBoolean ( * PFNEGLPRESENTATIONTIMEANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLnsecsANDROID time); - -#define eglPresentationTimeANDROID EGLEW_GET_FUN(__eglewPresentationTimeANDROID) - -#define EGLEW_ANDROID_presentation_time EGLEW_GET_VAR(__EGLEW_ANDROID_presentation_time) - -#endif /* EGL_ANDROID_presentation_time */ - -/* ------------------------- EGL_ANDROID_recordable ------------------------ */ - -#ifndef EGL_ANDROID_recordable -#define EGL_ANDROID_recordable 1 - -#define EGL_RECORDABLE_ANDROID 0x3142 - -#define EGLEW_ANDROID_recordable EGLEW_GET_VAR(__EGLEW_ANDROID_recordable) - -#endif /* EGL_ANDROID_recordable */ - -/* ---------------- EGL_ANGLE_d3d_share_handle_client_buffer --------------- */ - -#ifndef EGL_ANGLE_d3d_share_handle_client_buffer -#define EGL_ANGLE_d3d_share_handle_client_buffer 1 - -#define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE 0x3200 - -#define EGLEW_ANGLE_d3d_share_handle_client_buffer EGLEW_GET_VAR(__EGLEW_ANGLE_d3d_share_handle_client_buffer) - -#endif /* EGL_ANGLE_d3d_share_handle_client_buffer */ - -/* -------------------------- EGL_ANGLE_device_d3d ------------------------- */ - -#ifndef EGL_ANGLE_device_d3d -#define EGL_ANGLE_device_d3d 1 - -#define EGL_D3D9_DEVICE_ANGLE 0x33A0 -#define EGL_D3D11_DEVICE_ANGLE 0x33A1 - -#define EGLEW_ANGLE_device_d3d EGLEW_GET_VAR(__EGLEW_ANGLE_device_d3d) - -#endif /* EGL_ANGLE_device_d3d */ - -/* -------------------- EGL_ANGLE_query_surface_pointer -------------------- */ - -#ifndef EGL_ANGLE_query_surface_pointer -#define EGL_ANGLE_query_surface_pointer 1 - -typedef EGLBoolean ( * PFNEGLQUERYSURFACEPOINTERANGLEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void ** value); - -#define eglQuerySurfacePointerANGLE EGLEW_GET_FUN(__eglewQuerySurfacePointerANGLE) - -#define EGLEW_ANGLE_query_surface_pointer EGLEW_GET_VAR(__EGLEW_ANGLE_query_surface_pointer) - -#endif /* EGL_ANGLE_query_surface_pointer */ - -/* ------------- EGL_ANGLE_surface_d3d_texture_2d_share_handle ------------- */ - -#ifndef EGL_ANGLE_surface_d3d_texture_2d_share_handle -#define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1 - -#define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE 0x3200 - -#define EGLEW_ANGLE_surface_d3d_texture_2d_share_handle EGLEW_GET_VAR(__EGLEW_ANGLE_surface_d3d_texture_2d_share_handle) - -#endif /* EGL_ANGLE_surface_d3d_texture_2d_share_handle */ - -/* ---------------------- EGL_ANGLE_window_fixed_size ---------------------- */ - -#ifndef EGL_ANGLE_window_fixed_size -#define EGL_ANGLE_window_fixed_size 1 - -#define EGL_FIXED_SIZE_ANGLE 0x3201 - -#define EGLEW_ANGLE_window_fixed_size EGLEW_GET_VAR(__EGLEW_ANGLE_window_fixed_size) - -#endif /* EGL_ANGLE_window_fixed_size */ - -/* --------------------- EGL_ARM_implicit_external_sync -------------------- */ - -#ifndef EGL_ARM_implicit_external_sync -#define EGL_ARM_implicit_external_sync 1 - -#define EGL_SYNC_PRIOR_COMMANDS_IMPLICIT_EXTERNAL_ARM 0x328A - -#define EGLEW_ARM_implicit_external_sync EGLEW_GET_VAR(__EGLEW_ARM_implicit_external_sync) - -#endif /* EGL_ARM_implicit_external_sync */ - -/* ------------------- EGL_ARM_pixmap_multisample_discard ------------------ */ - -#ifndef EGL_ARM_pixmap_multisample_discard -#define EGL_ARM_pixmap_multisample_discard 1 - -#define EGL_DISCARD_SAMPLES_ARM 0x3286 - -#define EGLEW_ARM_pixmap_multisample_discard EGLEW_GET_VAR(__EGLEW_ARM_pixmap_multisample_discard) - -#endif /* EGL_ARM_pixmap_multisample_discard */ - -/* --------------------------- EGL_EXT_buffer_age -------------------------- */ - -#ifndef EGL_EXT_buffer_age -#define EGL_EXT_buffer_age 1 - -#define EGL_BUFFER_AGE_EXT 0x313D - -#define EGLEW_EXT_buffer_age EGLEW_GET_VAR(__EGLEW_EXT_buffer_age) - -#endif /* EGL_EXT_buffer_age */ - -/* ----------------------- EGL_EXT_client_extensions ----------------------- */ - -#ifndef EGL_EXT_client_extensions -#define EGL_EXT_client_extensions 1 - -#define EGLEW_EXT_client_extensions EGLEW_GET_VAR(__EGLEW_EXT_client_extensions) - -#endif /* EGL_EXT_client_extensions */ - -/* ------------------- EGL_EXT_create_context_robustness ------------------- */ - -#ifndef EGL_EXT_create_context_robustness -#define EGL_EXT_create_context_robustness 1 - -#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT 0x30BF -#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT 0x3138 -#define EGL_NO_RESET_NOTIFICATION_EXT 0x31BE -#define EGL_LOSE_CONTEXT_ON_RESET_EXT 0x31BF - -#define EGLEW_EXT_create_context_robustness EGLEW_GET_VAR(__EGLEW_EXT_create_context_robustness) - -#endif /* EGL_EXT_create_context_robustness */ - -/* -------------------------- EGL_EXT_device_base -------------------------- */ - -#ifndef EGL_EXT_device_base -#define EGL_EXT_device_base 1 - -#define EGL_BAD_DEVICE_EXT 0x322B -#define EGL_DEVICE_EXT 0x322C - -#define EGLEW_EXT_device_base EGLEW_GET_VAR(__EGLEW_EXT_device_base) - -#endif /* EGL_EXT_device_base */ - -/* --------------------------- EGL_EXT_device_drm -------------------------- */ - -#ifndef EGL_EXT_device_drm -#define EGL_EXT_device_drm 1 - -#define EGL_DRM_DEVICE_FILE_EXT 0x3233 - -#define EGLEW_EXT_device_drm EGLEW_GET_VAR(__EGLEW_EXT_device_drm) - -#endif /* EGL_EXT_device_drm */ - -/* ----------------------- EGL_EXT_device_enumeration ---------------------- */ - -#ifndef EGL_EXT_device_enumeration -#define EGL_EXT_device_enumeration 1 - -typedef EGLBoolean ( * PFNEGLQUERYDEVICESEXTPROC) (EGLint max_devices, EGLDeviceEXT * devices, EGLint * num_devices); - -#define eglQueryDevicesEXT EGLEW_GET_FUN(__eglewQueryDevicesEXT) - -#define EGLEW_EXT_device_enumeration EGLEW_GET_VAR(__EGLEW_EXT_device_enumeration) - -#endif /* EGL_EXT_device_enumeration */ - -/* ------------------------- EGL_EXT_device_openwf ------------------------- */ - -#ifndef EGL_EXT_device_openwf -#define EGL_EXT_device_openwf 1 - -#define EGL_OPENWF_DEVICE_ID_EXT 0x3237 - -#define EGLEW_EXT_device_openwf EGLEW_GET_VAR(__EGLEW_EXT_device_openwf) - -#endif /* EGL_EXT_device_openwf */ - -/* -------------------------- EGL_EXT_device_query ------------------------- */ - -#ifndef EGL_EXT_device_query -#define EGL_EXT_device_query 1 - -#define EGL_BAD_DEVICE_EXT 0x322B -#define EGL_DEVICE_EXT 0x322C - -typedef EGLBoolean ( * PFNEGLQUERYDEVICEATTRIBEXTPROC) (EGLDeviceEXT device, EGLint attribute, EGLAttrib * value); -typedef const char * ( * PFNEGLQUERYDEVICESTRINGEXTPROC) (EGLDeviceEXT device, EGLint name); -typedef EGLBoolean ( * PFNEGLQUERYDISPLAYATTRIBEXTPROC) (EGLDisplay dpy, EGLint attribute, EGLAttrib * value); - -#define eglQueryDeviceAttribEXT EGLEW_GET_FUN(__eglewQueryDeviceAttribEXT) -#define eglQueryDeviceStringEXT EGLEW_GET_FUN(__eglewQueryDeviceStringEXT) -#define eglQueryDisplayAttribEXT EGLEW_GET_FUN(__eglewQueryDisplayAttribEXT) - -#define EGLEW_EXT_device_query EGLEW_GET_VAR(__EGLEW_EXT_device_query) - -#endif /* EGL_EXT_device_query */ - -/* ------------------ EGL_EXT_gl_colorspace_bt2020_linear ------------------ */ - -#ifndef EGL_EXT_gl_colorspace_bt2020_linear -#define EGL_EXT_gl_colorspace_bt2020_linear 1 - -#define EGL_GL_COLORSPACE_BT2020_LINEAR_EXT 0x333F - -#define EGLEW_EXT_gl_colorspace_bt2020_linear EGLEW_GET_VAR(__EGLEW_EXT_gl_colorspace_bt2020_linear) - -#endif /* EGL_EXT_gl_colorspace_bt2020_linear */ - -/* -------------------- EGL_EXT_gl_colorspace_bt2020_pq -------------------- */ - -#ifndef EGL_EXT_gl_colorspace_bt2020_pq -#define EGL_EXT_gl_colorspace_bt2020_pq 1 - -#define EGL_GL_COLORSPACE_BT2020_PQ_EXT 0x3340 - -#define EGLEW_EXT_gl_colorspace_bt2020_pq EGLEW_GET_VAR(__EGLEW_EXT_gl_colorspace_bt2020_pq) - -#endif /* EGL_EXT_gl_colorspace_bt2020_pq */ - -/* ------------------- EGL_EXT_gl_colorspace_scrgb_linear ------------------ */ - -#ifndef EGL_EXT_gl_colorspace_scrgb_linear -#define EGL_EXT_gl_colorspace_scrgb_linear 1 - -#define EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT 0x3350 - -#define EGLEW_EXT_gl_colorspace_scrgb_linear EGLEW_GET_VAR(__EGLEW_EXT_gl_colorspace_scrgb_linear) - -#endif /* EGL_EXT_gl_colorspace_scrgb_linear */ - -/* ---------------------- EGL_EXT_image_dma_buf_import --------------------- */ - -#ifndef EGL_EXT_image_dma_buf_import -#define EGL_EXT_image_dma_buf_import 1 - -#define EGL_LINUX_DMA_BUF_EXT 0x3270 -#define EGL_LINUX_DRM_FOURCC_EXT 0x3271 -#define EGL_DMA_BUF_PLANE0_FD_EXT 0x3272 -#define EGL_DMA_BUF_PLANE0_OFFSET_EXT 0x3273 -#define EGL_DMA_BUF_PLANE0_PITCH_EXT 0x3274 -#define EGL_DMA_BUF_PLANE1_FD_EXT 0x3275 -#define EGL_DMA_BUF_PLANE1_OFFSET_EXT 0x3276 -#define EGL_DMA_BUF_PLANE1_PITCH_EXT 0x3277 -#define EGL_DMA_BUF_PLANE2_FD_EXT 0x3278 -#define EGL_DMA_BUF_PLANE2_OFFSET_EXT 0x3279 -#define EGL_DMA_BUF_PLANE2_PITCH_EXT 0x327A -#define EGL_YUV_COLOR_SPACE_HINT_EXT 0x327B -#define EGL_SAMPLE_RANGE_HINT_EXT 0x327C -#define EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT 0x327D -#define EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT 0x327E -#define EGL_ITU_REC601_EXT 0x327F -#define EGL_ITU_REC709_EXT 0x3280 -#define EGL_ITU_REC2020_EXT 0x3281 -#define EGL_YUV_FULL_RANGE_EXT 0x3282 -#define EGL_YUV_NARROW_RANGE_EXT 0x3283 -#define EGL_YUV_CHROMA_SITING_0_EXT 0x3284 -#define EGL_YUV_CHROMA_SITING_0_5_EXT 0x3285 - -#define EGLEW_EXT_image_dma_buf_import EGLEW_GET_VAR(__EGLEW_EXT_image_dma_buf_import) - -#endif /* EGL_EXT_image_dma_buf_import */ - -/* ----------------- EGL_EXT_image_dma_buf_import_modifiers ---------------- */ - -#ifndef EGL_EXT_image_dma_buf_import_modifiers -#define EGL_EXT_image_dma_buf_import_modifiers 1 - -#define EGL_DMA_BUF_PLANE3_FD_EXT 0x3440 -#define EGL_DMA_BUF_PLANE3_OFFSET_EXT 0x3441 -#define EGL_DMA_BUF_PLANE3_PITCH_EXT 0x3442 -#define EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT 0x3443 -#define EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT 0x3444 -#define EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT 0x3445 -#define EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT 0x3446 -#define EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT 0x3447 -#define EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT 0x3448 -#define EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT 0x3449 -#define EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT 0x344A - -typedef EGLBoolean ( * PFNEGLQUERYDMABUFFORMATSEXTPROC) (EGLDisplay dpy, EGLint max_formats, EGLint *formats, EGLint *num_formats); -typedef EGLBoolean ( * PFNEGLQUERYDMABUFMODIFIERSEXTPROC) (EGLDisplay dpy, EGLint format, EGLint max_modifiers, EGLuint64KHR *modifiers, EGLBoolean *external_only, EGLint *num_modifiers); - -#define eglQueryDmaBufFormatsEXT EGLEW_GET_FUN(__eglewQueryDmaBufFormatsEXT) -#define eglQueryDmaBufModifiersEXT EGLEW_GET_FUN(__eglewQueryDmaBufModifiersEXT) - -#define EGLEW_EXT_image_dma_buf_import_modifiers EGLEW_GET_VAR(__EGLEW_EXT_image_dma_buf_import_modifiers) - -#endif /* EGL_EXT_image_dma_buf_import_modifiers */ - -/* ------------------------ EGL_EXT_multiview_window ----------------------- */ - -#ifndef EGL_EXT_multiview_window -#define EGL_EXT_multiview_window 1 - -#define EGL_MULTIVIEW_VIEW_COUNT_EXT 0x3134 - -#define EGLEW_EXT_multiview_window EGLEW_GET_VAR(__EGLEW_EXT_multiview_window) - -#endif /* EGL_EXT_multiview_window */ - -/* -------------------------- EGL_EXT_output_base -------------------------- */ - -#ifndef EGL_EXT_output_base -#define EGL_EXT_output_base 1 - -#define EGL_BAD_OUTPUT_LAYER_EXT 0x322D -#define EGL_BAD_OUTPUT_PORT_EXT 0x322E -#define EGL_SWAP_INTERVAL_EXT 0x322F - -typedef EGLBoolean ( * PFNEGLGETOUTPUTLAYERSEXTPROC) (EGLDisplay dpy, const EGLAttrib * attrib_list, EGLOutputLayerEXT * layers, EGLint max_layers, EGLint * num_layers); -typedef EGLBoolean ( * PFNEGLGETOUTPUTPORTSEXTPROC) (EGLDisplay dpy, const EGLAttrib * attrib_list, EGLOutputPortEXT * ports, EGLint max_ports, EGLint * num_ports); -typedef EGLBoolean ( * PFNEGLOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib value); -typedef EGLBoolean ( * PFNEGLOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib value); -typedef EGLBoolean ( * PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib * value); -typedef const char * ( * PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint name); -typedef EGLBoolean ( * PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib * value); -typedef const char * ( * PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint name); - -#define eglGetOutputLayersEXT EGLEW_GET_FUN(__eglewGetOutputLayersEXT) -#define eglGetOutputPortsEXT EGLEW_GET_FUN(__eglewGetOutputPortsEXT) -#define eglOutputLayerAttribEXT EGLEW_GET_FUN(__eglewOutputLayerAttribEXT) -#define eglOutputPortAttribEXT EGLEW_GET_FUN(__eglewOutputPortAttribEXT) -#define eglQueryOutputLayerAttribEXT EGLEW_GET_FUN(__eglewQueryOutputLayerAttribEXT) -#define eglQueryOutputLayerStringEXT EGLEW_GET_FUN(__eglewQueryOutputLayerStringEXT) -#define eglQueryOutputPortAttribEXT EGLEW_GET_FUN(__eglewQueryOutputPortAttribEXT) -#define eglQueryOutputPortStringEXT EGLEW_GET_FUN(__eglewQueryOutputPortStringEXT) - -#define EGLEW_EXT_output_base EGLEW_GET_VAR(__EGLEW_EXT_output_base) - -#endif /* EGL_EXT_output_base */ - -/* --------------------------- EGL_EXT_output_drm -------------------------- */ - -#ifndef EGL_EXT_output_drm -#define EGL_EXT_output_drm 1 - -#define EGL_DRM_CRTC_EXT 0x3234 -#define EGL_DRM_PLANE_EXT 0x3235 -#define EGL_DRM_CONNECTOR_EXT 0x3236 - -#define EGLEW_EXT_output_drm EGLEW_GET_VAR(__EGLEW_EXT_output_drm) - -#endif /* EGL_EXT_output_drm */ - -/* ------------------------- EGL_EXT_output_openwf ------------------------- */ - -#ifndef EGL_EXT_output_openwf -#define EGL_EXT_output_openwf 1 - -#define EGL_OPENWF_PIPELINE_ID_EXT 0x3238 -#define EGL_OPENWF_PORT_ID_EXT 0x3239 - -#define EGLEW_EXT_output_openwf EGLEW_GET_VAR(__EGLEW_EXT_output_openwf) - -#endif /* EGL_EXT_output_openwf */ - -/* ----------------------- EGL_EXT_pixel_format_float ---------------------- */ - -#ifndef EGL_EXT_pixel_format_float -#define EGL_EXT_pixel_format_float 1 - -#define EGL_COLOR_COMPONENT_TYPE_EXT 0x3339 -#define EGL_COLOR_COMPONENT_TYPE_FIXED_EXT 0x333A -#define EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT 0x333B - -#define EGLEW_EXT_pixel_format_float EGLEW_GET_VAR(__EGLEW_EXT_pixel_format_float) - -#endif /* EGL_EXT_pixel_format_float */ - -/* ------------------------- EGL_EXT_platform_base ------------------------- */ - -#ifndef EGL_EXT_platform_base -#define EGL_EXT_platform_base 1 - -typedef EGLSurface ( * PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC) (EGLDisplay dpy, EGLConfig config, void * native_pixmap, const EGLint * attrib_list); -typedef EGLSurface ( * PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC) (EGLDisplay dpy, EGLConfig config, void * native_window, const EGLint * attrib_list); -typedef EGLDisplay ( * PFNEGLGETPLATFORMDISPLAYEXTPROC) (EGLenum platform, void * native_display, const EGLint * attrib_list); - -#define eglCreatePlatformPixmapSurfaceEXT EGLEW_GET_FUN(__eglewCreatePlatformPixmapSurfaceEXT) -#define eglCreatePlatformWindowSurfaceEXT EGLEW_GET_FUN(__eglewCreatePlatformWindowSurfaceEXT) -#define eglGetPlatformDisplayEXT EGLEW_GET_FUN(__eglewGetPlatformDisplayEXT) - -#define EGLEW_EXT_platform_base EGLEW_GET_VAR(__EGLEW_EXT_platform_base) - -#endif /* EGL_EXT_platform_base */ - -/* ------------------------ EGL_EXT_platform_device ------------------------ */ - -#ifndef EGL_EXT_platform_device -#define EGL_EXT_platform_device 1 - -#define EGL_PLATFORM_DEVICE_EXT 0x313F - -#define EGLEW_EXT_platform_device EGLEW_GET_VAR(__EGLEW_EXT_platform_device) - -#endif /* EGL_EXT_platform_device */ - -/* ------------------------ EGL_EXT_platform_wayland ----------------------- */ - -#ifndef EGL_EXT_platform_wayland -#define EGL_EXT_platform_wayland 1 - -#define EGL_PLATFORM_WAYLAND_EXT 0x31D8 - -#define EGLEW_EXT_platform_wayland EGLEW_GET_VAR(__EGLEW_EXT_platform_wayland) - -#endif /* EGL_EXT_platform_wayland */ - -/* -------------------------- EGL_EXT_platform_x11 ------------------------- */ - -#ifndef EGL_EXT_platform_x11 -#define EGL_EXT_platform_x11 1 - -#define EGL_PLATFORM_X11_EXT 0x31D5 -#define EGL_PLATFORM_X11_SCREEN_EXT 0x31D6 - -#define EGLEW_EXT_platform_x11 EGLEW_GET_VAR(__EGLEW_EXT_platform_x11) - -#endif /* EGL_EXT_platform_x11 */ - -/* ----------------------- EGL_EXT_protected_content ----------------------- */ - -#ifndef EGL_EXT_protected_content -#define EGL_EXT_protected_content 1 - -#define EGL_PROTECTED_CONTENT_EXT 0x32C0 - -#define EGLEW_EXT_protected_content EGLEW_GET_VAR(__EGLEW_EXT_protected_content) - -#endif /* EGL_EXT_protected_content */ - -/* ----------------------- EGL_EXT_protected_surface ----------------------- */ - -#ifndef EGL_EXT_protected_surface -#define EGL_EXT_protected_surface 1 - -#define EGL_PROTECTED_CONTENT_EXT 0x32C0 - -#define EGLEW_EXT_protected_surface EGLEW_GET_VAR(__EGLEW_EXT_protected_surface) - -#endif /* EGL_EXT_protected_surface */ - -/* ------------------- EGL_EXT_stream_consumer_egloutput ------------------- */ - -#ifndef EGL_EXT_stream_consumer_egloutput -#define EGL_EXT_stream_consumer_egloutput 1 - -typedef EGLBoolean ( * PFNEGLSTREAMCONSUMEROUTPUTEXTPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLOutputLayerEXT layer); - -#define eglStreamConsumerOutputEXT EGLEW_GET_FUN(__eglewStreamConsumerOutputEXT) - -#define EGLEW_EXT_stream_consumer_egloutput EGLEW_GET_VAR(__EGLEW_EXT_stream_consumer_egloutput) - -#endif /* EGL_EXT_stream_consumer_egloutput */ - -/* ------------------- EGL_EXT_surface_SMPTE2086_metadata ------------------ */ - -#ifndef EGL_EXT_surface_SMPTE2086_metadata -#define EGL_EXT_surface_SMPTE2086_metadata 1 - -#define EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT 0x3341 -#define EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT 0x3342 -#define EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT 0x3343 -#define EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT 0x3344 -#define EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT 0x3345 -#define EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT 0x3346 -#define EGL_SMPTE2086_WHITE_POINT_X_EXT 0x3347 -#define EGL_SMPTE2086_WHITE_POINT_Y_EXT 0x3348 -#define EGL_SMPTE2086_MAX_LUMINANCE_EXT 0x3349 -#define EGL_SMPTE2086_MIN_LUMINANCE_EXT 0x334A - -#define EGLEW_EXT_surface_SMPTE2086_metadata EGLEW_GET_VAR(__EGLEW_EXT_surface_SMPTE2086_metadata) - -#endif /* EGL_EXT_surface_SMPTE2086_metadata */ - -/* -------------------- EGL_EXT_swap_buffers_with_damage ------------------- */ - -#ifndef EGL_EXT_swap_buffers_with_damage -#define EGL_EXT_swap_buffers_with_damage 1 - -typedef EGLBoolean ( * PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC) (EGLDisplay dpy, EGLSurface surface, EGLint * rects, EGLint n_rects); - -#define eglSwapBuffersWithDamageEXT EGLEW_GET_FUN(__eglewSwapBuffersWithDamageEXT) - -#define EGLEW_EXT_swap_buffers_with_damage EGLEW_GET_VAR(__EGLEW_EXT_swap_buffers_with_damage) - -#endif /* EGL_EXT_swap_buffers_with_damage */ - -/* -------------------------- EGL_EXT_yuv_surface -------------------------- */ - -#ifndef EGL_EXT_yuv_surface -#define EGL_EXT_yuv_surface 1 - -#define EGL_YUV_BUFFER_EXT 0x3300 -#define EGL_YUV_ORDER_EXT 0x3301 -#define EGL_YUV_ORDER_YUV_EXT 0x3302 -#define EGL_YUV_ORDER_YVU_EXT 0x3303 -#define EGL_YUV_ORDER_YUYV_EXT 0x3304 -#define EGL_YUV_ORDER_UYVY_EXT 0x3305 -#define EGL_YUV_ORDER_YVYU_EXT 0x3306 -#define EGL_YUV_ORDER_VYUY_EXT 0x3307 -#define EGL_YUV_ORDER_AYUV_EXT 0x3308 -#define EGL_YUV_CSC_STANDARD_EXT 0x330A -#define EGL_YUV_CSC_STANDARD_601_EXT 0x330B -#define EGL_YUV_CSC_STANDARD_709_EXT 0x330C -#define EGL_YUV_CSC_STANDARD_2020_EXT 0x330D -#define EGL_YUV_NUMBER_OF_PLANES_EXT 0x3311 -#define EGL_YUV_SUBSAMPLE_EXT 0x3312 -#define EGL_YUV_SUBSAMPLE_4_2_0_EXT 0x3313 -#define EGL_YUV_SUBSAMPLE_4_2_2_EXT 0x3314 -#define EGL_YUV_SUBSAMPLE_4_4_4_EXT 0x3315 -#define EGL_YUV_DEPTH_RANGE_EXT 0x3317 -#define EGL_YUV_DEPTH_RANGE_LIMITED_EXT 0x3318 -#define EGL_YUV_DEPTH_RANGE_FULL_EXT 0x3319 -#define EGL_YUV_PLANE_BPP_EXT 0x331A -#define EGL_YUV_PLANE_BPP_0_EXT 0x331B -#define EGL_YUV_PLANE_BPP_8_EXT 0x331C -#define EGL_YUV_PLANE_BPP_10_EXT 0x331D - -#define EGLEW_EXT_yuv_surface EGLEW_GET_VAR(__EGLEW_EXT_yuv_surface) - -#endif /* EGL_EXT_yuv_surface */ - -/* -------------------------- EGL_HI_clientpixmap -------------------------- */ - -#ifndef EGL_HI_clientpixmap -#define EGL_HI_clientpixmap 1 - -#define EGL_CLIENT_PIXMAP_POINTER_HI 0x8F74 - -typedef EGLSurface ( * PFNEGLCREATEPIXMAPSURFACEHIPROC) (EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI * pixmap); - -#define eglCreatePixmapSurfaceHI EGLEW_GET_FUN(__eglewCreatePixmapSurfaceHI) - -#define EGLEW_HI_clientpixmap EGLEW_GET_VAR(__EGLEW_HI_clientpixmap) - -#endif /* EGL_HI_clientpixmap */ - -/* -------------------------- EGL_HI_colorformats -------------------------- */ - -#ifndef EGL_HI_colorformats -#define EGL_HI_colorformats 1 - -#define EGL_COLOR_FORMAT_HI 0x8F70 -#define EGL_COLOR_RGB_HI 0x8F71 -#define EGL_COLOR_RGBA_HI 0x8F72 -#define EGL_COLOR_ARGB_HI 0x8F73 - -#define EGLEW_HI_colorformats EGLEW_GET_VAR(__EGLEW_HI_colorformats) - -#endif /* EGL_HI_colorformats */ - -/* ------------------------ EGL_IMG_context_priority ----------------------- */ - -#ifndef EGL_IMG_context_priority -#define EGL_IMG_context_priority 1 - -#define EGL_CONTEXT_PRIORITY_LEVEL_IMG 0x3100 -#define EGL_CONTEXT_PRIORITY_HIGH_IMG 0x3101 -#define EGL_CONTEXT_PRIORITY_MEDIUM_IMG 0x3102 -#define EGL_CONTEXT_PRIORITY_LOW_IMG 0x3103 - -#define EGLEW_IMG_context_priority EGLEW_GET_VAR(__EGLEW_IMG_context_priority) - -#endif /* EGL_IMG_context_priority */ - -/* ---------------------- EGL_IMG_image_plane_attribs ---------------------- */ - -#ifndef EGL_IMG_image_plane_attribs -#define EGL_IMG_image_plane_attribs 1 - -#define EGL_NATIVE_BUFFER_MULTIPLANE_SEPARATE_IMG 0x3105 -#define EGL_NATIVE_BUFFER_PLANE_OFFSET_IMG 0x3106 - -#define EGLEW_IMG_image_plane_attribs EGLEW_GET_VAR(__EGLEW_IMG_image_plane_attribs) - -#endif /* EGL_IMG_image_plane_attribs */ - -/* ---------------------------- EGL_KHR_cl_event --------------------------- */ - -#ifndef EGL_KHR_cl_event -#define EGL_KHR_cl_event 1 - -#define EGL_CL_EVENT_HANDLE_KHR 0x309C -#define EGL_SYNC_CL_EVENT_KHR 0x30FE -#define EGL_SYNC_CL_EVENT_COMPLETE_KHR 0x30FF - -#define EGLEW_KHR_cl_event EGLEW_GET_VAR(__EGLEW_KHR_cl_event) - -#endif /* EGL_KHR_cl_event */ - -/* --------------------------- EGL_KHR_cl_event2 --------------------------- */ - -#ifndef EGL_KHR_cl_event2 -#define EGL_KHR_cl_event2 1 - -#define EGL_CL_EVENT_HANDLE_KHR 0x309C -#define EGL_SYNC_CL_EVENT_KHR 0x30FE -#define EGL_SYNC_CL_EVENT_COMPLETE_KHR 0x30FF - -typedef EGLSyncKHR ( * PFNEGLCREATESYNC64KHRPROC) (EGLDisplay dpy, EGLenum type, const EGLAttribKHR * attrib_list); - -#define eglCreateSync64KHR EGLEW_GET_FUN(__eglewCreateSync64KHR) - -#define EGLEW_KHR_cl_event2 EGLEW_GET_VAR(__EGLEW_KHR_cl_event2) - -#endif /* EGL_KHR_cl_event2 */ - -/* ----------------- EGL_KHR_client_get_all_proc_addresses ----------------- */ - -#ifndef EGL_KHR_client_get_all_proc_addresses -#define EGL_KHR_client_get_all_proc_addresses 1 - -#define EGLEW_KHR_client_get_all_proc_addresses EGLEW_GET_VAR(__EGLEW_KHR_client_get_all_proc_addresses) - -#endif /* EGL_KHR_client_get_all_proc_addresses */ - -/* ------------------------- EGL_KHR_config_attribs ------------------------ */ - -#ifndef EGL_KHR_config_attribs -#define EGL_KHR_config_attribs 1 - -#define EGL_VG_COLORSPACE_LINEAR_BIT_KHR 0x0020 -#define EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR 0x0040 -#define EGL_CONFORMANT_KHR 0x3042 - -#define EGLEW_KHR_config_attribs EGLEW_GET_VAR(__EGLEW_KHR_config_attribs) - -#endif /* EGL_KHR_config_attribs */ - -/* --------------------- EGL_KHR_context_flush_control --------------------- */ - -#ifndef EGL_KHR_context_flush_control -#define EGL_KHR_context_flush_control 1 - -#define EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR 0 -#define EGL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x2097 -#define EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x2098 - -#define EGLEW_KHR_context_flush_control EGLEW_GET_VAR(__EGLEW_KHR_context_flush_control) - -#endif /* EGL_KHR_context_flush_control */ - -/* ------------------------- EGL_KHR_create_context ------------------------ */ - -#ifndef EGL_KHR_create_context -#define EGL_KHR_create_context 1 - -#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001 -#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001 -#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002 -#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002 -#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR 0x00000004 -#define EGL_OPENGL_ES3_BIT 0x00000040 -#define EGL_OPENGL_ES3_BIT_KHR 0x00000040 -#define EGL_CONTEXT_MAJOR_VERSION_KHR 0x3098 -#define EGL_CONTEXT_MINOR_VERSION_KHR 0x30FB -#define EGL_CONTEXT_FLAGS_KHR 0x30FC -#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30FD -#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR 0x31BD -#define EGL_NO_RESET_NOTIFICATION_KHR 0x31BE -#define EGL_LOSE_CONTEXT_ON_RESET_KHR 0x31BF - -#define EGLEW_KHR_create_context EGLEW_GET_VAR(__EGLEW_KHR_create_context) - -#endif /* EGL_KHR_create_context */ - -/* -------------------- EGL_KHR_create_context_no_error -------------------- */ - -#ifndef EGL_KHR_create_context_no_error -#define EGL_KHR_create_context_no_error 1 - -#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR 0x31B3 - -#define EGLEW_KHR_create_context_no_error EGLEW_GET_VAR(__EGLEW_KHR_create_context_no_error) - -#endif /* EGL_KHR_create_context_no_error */ - -/* ----------------------------- EGL_KHR_debug ----------------------------- */ - -#ifndef EGL_KHR_debug -#define EGL_KHR_debug 1 - -#define EGL_OBJECT_THREAD_KHR 0x33B0 -#define EGL_OBJECT_DISPLAY_KHR 0x33B1 -#define EGL_OBJECT_CONTEXT_KHR 0x33B2 -#define EGL_OBJECT_SURFACE_KHR 0x33B3 -#define EGL_OBJECT_IMAGE_KHR 0x33B4 -#define EGL_OBJECT_SYNC_KHR 0x33B5 -#define EGL_OBJECT_STREAM_KHR 0x33B6 -#define EGL_DEBUG_CALLBACK_KHR 0x33B8 -#define EGL_DEBUG_MSG_CRITICAL_KHR 0x33B9 -#define EGL_DEBUG_MSG_ERROR_KHR 0x33BA -#define EGL_DEBUG_MSG_WARN_KHR 0x33BB -#define EGL_DEBUG_MSG_INFO_KHR 0x33BC - -typedef EGLint ( * PFNEGLDEBUGMESSAGECONTROLKHRPROC) (EGLDEBUGPROCKHR callback, const EGLAttrib * attrib_list); -typedef EGLint ( * PFNEGLLABELOBJECTKHRPROC) (EGLDisplay display, EGLenum objectType, EGLObjectKHR object, EGLLabelKHR label); -typedef EGLBoolean ( * PFNEGLQUERYDEBUGKHRPROC) (EGLint attribute, EGLAttrib * value); - -#define eglDebugMessageControlKHR EGLEW_GET_FUN(__eglewDebugMessageControlKHR) -#define eglLabelObjectKHR EGLEW_GET_FUN(__eglewLabelObjectKHR) -#define eglQueryDebugKHR EGLEW_GET_FUN(__eglewQueryDebugKHR) - -#define EGLEW_KHR_debug EGLEW_GET_VAR(__EGLEW_KHR_debug) - -#endif /* EGL_KHR_debug */ - -/* --------------------------- EGL_KHR_fence_sync -------------------------- */ - -#ifndef EGL_KHR_fence_sync -#define EGL_KHR_fence_sync 1 - -#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR 0x30F0 -#define EGL_SYNC_CONDITION_KHR 0x30F8 -#define EGL_SYNC_FENCE_KHR 0x30F9 - -#define EGLEW_KHR_fence_sync EGLEW_GET_VAR(__EGLEW_KHR_fence_sync) - -#endif /* EGL_KHR_fence_sync */ - -/* --------------------- EGL_KHR_get_all_proc_addresses -------------------- */ - -#ifndef EGL_KHR_get_all_proc_addresses -#define EGL_KHR_get_all_proc_addresses 1 - -#define EGLEW_KHR_get_all_proc_addresses EGLEW_GET_VAR(__EGLEW_KHR_get_all_proc_addresses) - -#endif /* EGL_KHR_get_all_proc_addresses */ - -/* ------------------------- EGL_KHR_gl_colorspace ------------------------- */ - -#ifndef EGL_KHR_gl_colorspace -#define EGL_KHR_gl_colorspace 1 - -#define EGL_GL_COLORSPACE_SRGB_KHR 0x3089 -#define EGL_GL_COLORSPACE_LINEAR_KHR 0x308A -#define EGL_GL_COLORSPACE_KHR 0x309D - -#define EGLEW_KHR_gl_colorspace EGLEW_GET_VAR(__EGLEW_KHR_gl_colorspace) - -#endif /* EGL_KHR_gl_colorspace */ - -/* --------------------- EGL_KHR_gl_renderbuffer_image --------------------- */ - -#ifndef EGL_KHR_gl_renderbuffer_image -#define EGL_KHR_gl_renderbuffer_image 1 - -#define EGL_GL_RENDERBUFFER_KHR 0x30B9 - -#define EGLEW_KHR_gl_renderbuffer_image EGLEW_GET_VAR(__EGLEW_KHR_gl_renderbuffer_image) - -#endif /* EGL_KHR_gl_renderbuffer_image */ - -/* ---------------------- EGL_KHR_gl_texture_2D_image ---------------------- */ - -#ifndef EGL_KHR_gl_texture_2D_image -#define EGL_KHR_gl_texture_2D_image 1 - -#define EGL_GL_TEXTURE_2D_KHR 0x30B1 -#define EGL_GL_TEXTURE_LEVEL_KHR 0x30BC - -#define EGLEW_KHR_gl_texture_2D_image EGLEW_GET_VAR(__EGLEW_KHR_gl_texture_2D_image) - -#endif /* EGL_KHR_gl_texture_2D_image */ - -/* ---------------------- EGL_KHR_gl_texture_3D_image ---------------------- */ - -#ifndef EGL_KHR_gl_texture_3D_image -#define EGL_KHR_gl_texture_3D_image 1 - -#define EGL_GL_TEXTURE_3D_KHR 0x30B2 -#define EGL_GL_TEXTURE_ZOFFSET_KHR 0x30BD - -#define EGLEW_KHR_gl_texture_3D_image EGLEW_GET_VAR(__EGLEW_KHR_gl_texture_3D_image) - -#endif /* EGL_KHR_gl_texture_3D_image */ - -/* -------------------- EGL_KHR_gl_texture_cubemap_image ------------------- */ - -#ifndef EGL_KHR_gl_texture_cubemap_image -#define EGL_KHR_gl_texture_cubemap_image 1 - -#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR 0x30B3 -#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR 0x30B4 -#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR 0x30B5 -#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR 0x30B6 -#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR 0x30B7 -#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR 0x30B8 - -#define EGLEW_KHR_gl_texture_cubemap_image EGLEW_GET_VAR(__EGLEW_KHR_gl_texture_cubemap_image) - -#endif /* EGL_KHR_gl_texture_cubemap_image */ - -/* ----------------------------- EGL_KHR_image ----------------------------- */ - -#ifndef EGL_KHR_image -#define EGL_KHR_image 1 - -#define EGL_NATIVE_PIXMAP_KHR 0x30B0 - -typedef EGLImageKHR ( * PFNEGLCREATEIMAGEKHRPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint * attrib_list); -typedef EGLBoolean ( * PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGLImageKHR image); - -#define eglCreateImageKHR EGLEW_GET_FUN(__eglewCreateImageKHR) -#define eglDestroyImageKHR EGLEW_GET_FUN(__eglewDestroyImageKHR) - -#define EGLEW_KHR_image EGLEW_GET_VAR(__EGLEW_KHR_image) - -#endif /* EGL_KHR_image */ - -/* --------------------------- EGL_KHR_image_base -------------------------- */ - -#ifndef EGL_KHR_image_base -#define EGL_KHR_image_base 1 - -#define EGL_IMAGE_PRESERVED_KHR 0x30D2 - -#define EGLEW_KHR_image_base EGLEW_GET_VAR(__EGLEW_KHR_image_base) - -#endif /* EGL_KHR_image_base */ - -/* -------------------------- EGL_KHR_image_pixmap ------------------------- */ - -#ifndef EGL_KHR_image_pixmap -#define EGL_KHR_image_pixmap 1 - -#define EGL_NATIVE_PIXMAP_KHR 0x30B0 - -#define EGLEW_KHR_image_pixmap EGLEW_GET_VAR(__EGLEW_KHR_image_pixmap) - -#endif /* EGL_KHR_image_pixmap */ - -/* -------------------------- EGL_KHR_lock_surface ------------------------- */ - -#ifndef EGL_KHR_lock_surface -#define EGL_KHR_lock_surface 1 - -#define EGL_READ_SURFACE_BIT_KHR 0x0001 -#define EGL_WRITE_SURFACE_BIT_KHR 0x0002 -#define EGL_LOCK_SURFACE_BIT_KHR 0x0080 -#define EGL_OPTIMAL_FORMAT_BIT_KHR 0x0100 -#define EGL_MATCH_FORMAT_KHR 0x3043 -#define EGL_FORMAT_RGB_565_EXACT_KHR 0x30C0 -#define EGL_FORMAT_RGB_565_KHR 0x30C1 -#define EGL_FORMAT_RGBA_8888_EXACT_KHR 0x30C2 -#define EGL_FORMAT_RGBA_8888_KHR 0x30C3 -#define EGL_MAP_PRESERVE_PIXELS_KHR 0x30C4 -#define EGL_LOCK_USAGE_HINT_KHR 0x30C5 -#define EGL_BITMAP_POINTER_KHR 0x30C6 -#define EGL_BITMAP_PITCH_KHR 0x30C7 -#define EGL_BITMAP_ORIGIN_KHR 0x30C8 -#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR 0x30C9 -#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR 0x30CA -#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR 0x30CB -#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR 0x30CC -#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR 0x30CD -#define EGL_LOWER_LEFT_KHR 0x30CE -#define EGL_UPPER_LEFT_KHR 0x30CF - -typedef EGLBoolean ( * PFNEGLLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface, const EGLint * attrib_list); -typedef EGLBoolean ( * PFNEGLUNLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface); - -#define eglLockSurfaceKHR EGLEW_GET_FUN(__eglewLockSurfaceKHR) -#define eglUnlockSurfaceKHR EGLEW_GET_FUN(__eglewUnlockSurfaceKHR) - -#define EGLEW_KHR_lock_surface EGLEW_GET_VAR(__EGLEW_KHR_lock_surface) - -#endif /* EGL_KHR_lock_surface */ - -/* ------------------------- EGL_KHR_lock_surface2 ------------------------- */ - -#ifndef EGL_KHR_lock_surface2 -#define EGL_KHR_lock_surface2 1 - -#define EGL_BITMAP_PIXEL_SIZE_KHR 0x3110 - -#define EGLEW_KHR_lock_surface2 EGLEW_GET_VAR(__EGLEW_KHR_lock_surface2) - -#endif /* EGL_KHR_lock_surface2 */ - -/* ------------------------- EGL_KHR_lock_surface3 ------------------------- */ - -#ifndef EGL_KHR_lock_surface3 -#define EGL_KHR_lock_surface3 1 - -#define EGL_READ_SURFACE_BIT_KHR 0x0001 -#define EGL_WRITE_SURFACE_BIT_KHR 0x0002 -#define EGL_LOCK_SURFACE_BIT_KHR 0x0080 -#define EGL_OPTIMAL_FORMAT_BIT_KHR 0x0100 -#define EGL_MATCH_FORMAT_KHR 0x3043 -#define EGL_FORMAT_RGB_565_EXACT_KHR 0x30C0 -#define EGL_FORMAT_RGB_565_KHR 0x30C1 -#define EGL_FORMAT_RGBA_8888_EXACT_KHR 0x30C2 -#define EGL_FORMAT_RGBA_8888_KHR 0x30C3 -#define EGL_MAP_PRESERVE_PIXELS_KHR 0x30C4 -#define EGL_LOCK_USAGE_HINT_KHR 0x30C5 -#define EGL_BITMAP_POINTER_KHR 0x30C6 -#define EGL_BITMAP_PITCH_KHR 0x30C7 -#define EGL_BITMAP_ORIGIN_KHR 0x30C8 -#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR 0x30C9 -#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR 0x30CA -#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR 0x30CB -#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR 0x30CC -#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR 0x30CD -#define EGL_LOWER_LEFT_KHR 0x30CE -#define EGL_UPPER_LEFT_KHR 0x30CF -#define EGL_BITMAP_PIXEL_SIZE_KHR 0x3110 - -typedef EGLBoolean ( * PFNEGLQUERYSURFACE64KHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLAttribKHR * value); - -#define eglQuerySurface64KHR EGLEW_GET_FUN(__eglewQuerySurface64KHR) - -#define EGLEW_KHR_lock_surface3 EGLEW_GET_VAR(__EGLEW_KHR_lock_surface3) - -#endif /* EGL_KHR_lock_surface3 */ - -/* --------------------- EGL_KHR_mutable_render_buffer --------------------- */ - -#ifndef EGL_KHR_mutable_render_buffer -#define EGL_KHR_mutable_render_buffer 1 - -#define EGL_MUTABLE_RENDER_BUFFER_BIT_KHR 0x1000 - -#define EGLEW_KHR_mutable_render_buffer EGLEW_GET_VAR(__EGLEW_KHR_mutable_render_buffer) - -#endif /* EGL_KHR_mutable_render_buffer */ - -/* ----------------------- EGL_KHR_no_config_context ----------------------- */ - -#ifndef EGL_KHR_no_config_context -#define EGL_KHR_no_config_context 1 - -#define EGLEW_KHR_no_config_context EGLEW_GET_VAR(__EGLEW_KHR_no_config_context) - -#endif /* EGL_KHR_no_config_context */ - -/* ------------------------- EGL_KHR_partial_update ------------------------ */ - -#ifndef EGL_KHR_partial_update -#define EGL_KHR_partial_update 1 - -#define EGL_BUFFER_AGE_KHR 0x313D - -typedef EGLBoolean ( * PFNEGLSETDAMAGEREGIONKHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint * rects, EGLint n_rects); - -#define eglSetDamageRegionKHR EGLEW_GET_FUN(__eglewSetDamageRegionKHR) - -#define EGLEW_KHR_partial_update EGLEW_GET_VAR(__EGLEW_KHR_partial_update) - -#endif /* EGL_KHR_partial_update */ - -/* ------------------------ EGL_KHR_platform_android ----------------------- */ - -#ifndef EGL_KHR_platform_android -#define EGL_KHR_platform_android 1 - -#define EGL_PLATFORM_ANDROID_KHR 0x3141 - -#define EGLEW_KHR_platform_android EGLEW_GET_VAR(__EGLEW_KHR_platform_android) - -#endif /* EGL_KHR_platform_android */ - -/* -------------------------- EGL_KHR_platform_gbm ------------------------- */ - -#ifndef EGL_KHR_platform_gbm -#define EGL_KHR_platform_gbm 1 - -#define EGL_PLATFORM_GBM_KHR 0x31D7 - -#define EGLEW_KHR_platform_gbm EGLEW_GET_VAR(__EGLEW_KHR_platform_gbm) - -#endif /* EGL_KHR_platform_gbm */ - -/* ------------------------ EGL_KHR_platform_wayland ----------------------- */ - -#ifndef EGL_KHR_platform_wayland -#define EGL_KHR_platform_wayland 1 - -#define EGL_PLATFORM_WAYLAND_KHR 0x31D8 - -#define EGLEW_KHR_platform_wayland EGLEW_GET_VAR(__EGLEW_KHR_platform_wayland) - -#endif /* EGL_KHR_platform_wayland */ - -/* -------------------------- EGL_KHR_platform_x11 ------------------------- */ - -#ifndef EGL_KHR_platform_x11 -#define EGL_KHR_platform_x11 1 - -#define EGL_PLATFORM_X11_KHR 0x31D5 -#define EGL_PLATFORM_X11_SCREEN_KHR 0x31D6 - -#define EGLEW_KHR_platform_x11 EGLEW_GET_VAR(__EGLEW_KHR_platform_x11) - -#endif /* EGL_KHR_platform_x11 */ - -/* ------------------------- EGL_KHR_reusable_sync ------------------------- */ - -#ifndef EGL_KHR_reusable_sync -#define EGL_KHR_reusable_sync 1 - -#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR 0x0001 -#define EGL_SYNC_STATUS_KHR 0x30F1 -#define EGL_SIGNALED_KHR 0x30F2 -#define EGL_UNSIGNALED_KHR 0x30F3 -#define EGL_TIMEOUT_EXPIRED_KHR 0x30F5 -#define EGL_CONDITION_SATISFIED_KHR 0x30F6 -#define EGL_SYNC_TYPE_KHR 0x30F7 -#define EGL_SYNC_REUSABLE_KHR 0x30FA -#define EGL_FOREVER_KHR 0xFFFFFFFFFFFFFFFF - -typedef EGLint ( * PFNEGLCLIENTWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); -typedef EGLSyncKHR ( * PFNEGLCREATESYNCKHRPROC) (EGLDisplay dpy, EGLenum type, const EGLint * attrib_list); -typedef EGLBoolean ( * PFNEGLDESTROYSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync); -typedef EGLBoolean ( * PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint * value); -typedef EGLBoolean ( * PFNEGLSIGNALSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); - -#define eglClientWaitSyncKHR EGLEW_GET_FUN(__eglewClientWaitSyncKHR) -#define eglCreateSyncKHR EGLEW_GET_FUN(__eglewCreateSyncKHR) -#define eglDestroySyncKHR EGLEW_GET_FUN(__eglewDestroySyncKHR) -#define eglGetSyncAttribKHR EGLEW_GET_FUN(__eglewGetSyncAttribKHR) -#define eglSignalSyncKHR EGLEW_GET_FUN(__eglewSignalSyncKHR) - -#define EGLEW_KHR_reusable_sync EGLEW_GET_VAR(__EGLEW_KHR_reusable_sync) - -#endif /* EGL_KHR_reusable_sync */ - -/* ----------------------------- EGL_KHR_stream ---------------------------- */ - -#ifndef EGL_KHR_stream -#define EGL_KHR_stream 1 - -#define EGL_CONSUMER_LATENCY_USEC_KHR 0x3210 -#define EGL_PRODUCER_FRAME_KHR 0x3212 -#define EGL_CONSUMER_FRAME_KHR 0x3213 -#define EGL_STREAM_STATE_KHR 0x3214 -#define EGL_STREAM_STATE_CREATED_KHR 0x3215 -#define EGL_STREAM_STATE_CONNECTING_KHR 0x3216 -#define EGL_STREAM_STATE_EMPTY_KHR 0x3217 -#define EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR 0x3218 -#define EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR 0x3219 -#define EGL_STREAM_STATE_DISCONNECTED_KHR 0x321A -#define EGL_BAD_STREAM_KHR 0x321B -#define EGL_BAD_STATE_KHR 0x321C - -typedef EGLStreamKHR ( * PFNEGLCREATESTREAMKHRPROC) (EGLDisplay dpy, const EGLint * attrib_list); -typedef EGLBoolean ( * PFNEGLDESTROYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); -typedef EGLBoolean ( * PFNEGLQUERYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint * value); -typedef EGLBoolean ( * PFNEGLQUERYSTREAMU64KHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR * value); -typedef EGLBoolean ( * PFNEGLSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value); - -#define eglCreateStreamKHR EGLEW_GET_FUN(__eglewCreateStreamKHR) -#define eglDestroyStreamKHR EGLEW_GET_FUN(__eglewDestroyStreamKHR) -#define eglQueryStreamKHR EGLEW_GET_FUN(__eglewQueryStreamKHR) -#define eglQueryStreamu64KHR EGLEW_GET_FUN(__eglewQueryStreamu64KHR) -#define eglStreamAttribKHR EGLEW_GET_FUN(__eglewStreamAttribKHR) - -#define EGLEW_KHR_stream EGLEW_GET_VAR(__EGLEW_KHR_stream) - -#endif /* EGL_KHR_stream */ - -/* ------------------------- EGL_KHR_stream_attrib ------------------------- */ - -#ifndef EGL_KHR_stream_attrib -#define EGL_KHR_stream_attrib 1 - -#define EGL_CONSUMER_LATENCY_USEC_KHR 0x3210 -#define EGL_STREAM_STATE_KHR 0x3214 -#define EGL_STREAM_STATE_CREATED_KHR 0x3215 -#define EGL_STREAM_STATE_CONNECTING_KHR 0x3216 - -typedef EGLStreamKHR ( * PFNEGLCREATESTREAMATTRIBKHRPROC) (EGLDisplay dpy, const EGLAttrib * attrib_list); -typedef EGLBoolean ( * PFNEGLQUERYSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib * value); -typedef EGLBoolean ( * PFNEGLSETSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib value); -typedef EGLBoolean ( * PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib * attrib_list); -typedef EGLBoolean ( * PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib * attrib_list); - -#define eglCreateStreamAttribKHR EGLEW_GET_FUN(__eglewCreateStreamAttribKHR) -#define eglQueryStreamAttribKHR EGLEW_GET_FUN(__eglewQueryStreamAttribKHR) -#define eglSetStreamAttribKHR EGLEW_GET_FUN(__eglewSetStreamAttribKHR) -#define eglStreamConsumerAcquireAttribKHR EGLEW_GET_FUN(__eglewStreamConsumerAcquireAttribKHR) -#define eglStreamConsumerReleaseAttribKHR EGLEW_GET_FUN(__eglewStreamConsumerReleaseAttribKHR) - -#define EGLEW_KHR_stream_attrib EGLEW_GET_VAR(__EGLEW_KHR_stream_attrib) - -#endif /* EGL_KHR_stream_attrib */ - -/* ------------------- EGL_KHR_stream_consumer_gltexture ------------------- */ - -#ifndef EGL_KHR_stream_consumer_gltexture -#define EGL_KHR_stream_consumer_gltexture 1 - -#define EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR 0x321E - -typedef EGLBoolean ( * PFNEGLSTREAMCONSUMERACQUIREKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); -typedef EGLBoolean ( * PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); -typedef EGLBoolean ( * PFNEGLSTREAMCONSUMERRELEASEKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); - -#define eglStreamConsumerAcquireKHR EGLEW_GET_FUN(__eglewStreamConsumerAcquireKHR) -#define eglStreamConsumerGLTextureExternalKHR EGLEW_GET_FUN(__eglewStreamConsumerGLTextureExternalKHR) -#define eglStreamConsumerReleaseKHR EGLEW_GET_FUN(__eglewStreamConsumerReleaseKHR) - -#define EGLEW_KHR_stream_consumer_gltexture EGLEW_GET_VAR(__EGLEW_KHR_stream_consumer_gltexture) - -#endif /* EGL_KHR_stream_consumer_gltexture */ - -/* -------------------- EGL_KHR_stream_cross_process_fd -------------------- */ - -#ifndef EGL_KHR_stream_cross_process_fd -#define EGL_KHR_stream_cross_process_fd 1 - -typedef EGLStreamKHR ( * PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy, EGLNativeFileDescriptorKHR file_descriptor); -typedef EGLNativeFileDescriptorKHR ( * PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); - -#define eglCreateStreamFromFileDescriptorKHR EGLEW_GET_FUN(__eglewCreateStreamFromFileDescriptorKHR) -#define eglGetStreamFileDescriptorKHR EGLEW_GET_FUN(__eglewGetStreamFileDescriptorKHR) - -#define EGLEW_KHR_stream_cross_process_fd EGLEW_GET_VAR(__EGLEW_KHR_stream_cross_process_fd) - -#endif /* EGL_KHR_stream_cross_process_fd */ - -/* -------------------------- EGL_KHR_stream_fifo -------------------------- */ - -#ifndef EGL_KHR_stream_fifo -#define EGL_KHR_stream_fifo 1 - -#define EGL_STREAM_FIFO_LENGTH_KHR 0x31FC -#define EGL_STREAM_TIME_NOW_KHR 0x31FD -#define EGL_STREAM_TIME_CONSUMER_KHR 0x31FE -#define EGL_STREAM_TIME_PRODUCER_KHR 0x31FF - -typedef EGLBoolean ( * PFNEGLQUERYSTREAMTIMEKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR * value); - -#define eglQueryStreamTimeKHR EGLEW_GET_FUN(__eglewQueryStreamTimeKHR) - -#define EGLEW_KHR_stream_fifo EGLEW_GET_VAR(__EGLEW_KHR_stream_fifo) - -#endif /* EGL_KHR_stream_fifo */ - -/* ----------------- EGL_KHR_stream_producer_aldatalocator ----------------- */ - -#ifndef EGL_KHR_stream_producer_aldatalocator -#define EGL_KHR_stream_producer_aldatalocator 1 - -#define EGLEW_KHR_stream_producer_aldatalocator EGLEW_GET_VAR(__EGLEW_KHR_stream_producer_aldatalocator) - -#endif /* EGL_KHR_stream_producer_aldatalocator */ - -/* ------------------- EGL_KHR_stream_producer_eglsurface ------------------ */ - -#ifndef EGL_KHR_stream_producer_eglsurface -#define EGL_KHR_stream_producer_eglsurface 1 - -#define EGL_STREAM_BIT_KHR 0x0800 - -typedef EGLSurface ( * PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC) (EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint * attrib_list); - -#define eglCreateStreamProducerSurfaceKHR EGLEW_GET_FUN(__eglewCreateStreamProducerSurfaceKHR) - -#define EGLEW_KHR_stream_producer_eglsurface EGLEW_GET_VAR(__EGLEW_KHR_stream_producer_eglsurface) - -#endif /* EGL_KHR_stream_producer_eglsurface */ - -/* ---------------------- EGL_KHR_surfaceless_context ---------------------- */ - -#ifndef EGL_KHR_surfaceless_context -#define EGL_KHR_surfaceless_context 1 - -#define EGLEW_KHR_surfaceless_context EGLEW_GET_VAR(__EGLEW_KHR_surfaceless_context) - -#endif /* EGL_KHR_surfaceless_context */ - -/* -------------------- EGL_KHR_swap_buffers_with_damage ------------------- */ - -#ifndef EGL_KHR_swap_buffers_with_damage -#define EGL_KHR_swap_buffers_with_damage 1 - -typedef EGLBoolean ( * PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint * rects, EGLint n_rects); - -#define eglSwapBuffersWithDamageKHR EGLEW_GET_FUN(__eglewSwapBuffersWithDamageKHR) - -#define EGLEW_KHR_swap_buffers_with_damage EGLEW_GET_VAR(__EGLEW_KHR_swap_buffers_with_damage) - -#endif /* EGL_KHR_swap_buffers_with_damage */ - -/* ------------------------ EGL_KHR_vg_parent_image ------------------------ */ - -#ifndef EGL_KHR_vg_parent_image -#define EGL_KHR_vg_parent_image 1 - -#define EGL_VG_PARENT_IMAGE_KHR 0x30BA - -#define EGLEW_KHR_vg_parent_image EGLEW_GET_VAR(__EGLEW_KHR_vg_parent_image) - -#endif /* EGL_KHR_vg_parent_image */ - -/* --------------------------- EGL_KHR_wait_sync --------------------------- */ - -#ifndef EGL_KHR_wait_sync -#define EGL_KHR_wait_sync 1 - -typedef EGLint ( * PFNEGLWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags); - -#define eglWaitSyncKHR EGLEW_GET_FUN(__eglewWaitSyncKHR) - -#define EGLEW_KHR_wait_sync EGLEW_GET_VAR(__EGLEW_KHR_wait_sync) - -#endif /* EGL_KHR_wait_sync */ - -/* --------------------------- EGL_MESA_drm_image -------------------------- */ - -#ifndef EGL_MESA_drm_image -#define EGL_MESA_drm_image 1 - -#define EGL_DRM_BUFFER_USE_SCANOUT_MESA 0x00000001 -#define EGL_DRM_BUFFER_USE_SHARE_MESA 0x00000002 -#define EGL_DRM_BUFFER_FORMAT_MESA 0x31D0 -#define EGL_DRM_BUFFER_USE_MESA 0x31D1 -#define EGL_DRM_BUFFER_FORMAT_ARGB32_MESA 0x31D2 -#define EGL_DRM_BUFFER_MESA 0x31D3 -#define EGL_DRM_BUFFER_STRIDE_MESA 0x31D4 - -typedef EGLImageKHR ( * PFNEGLCREATEDRMIMAGEMESAPROC) (EGLDisplay dpy, const EGLint * attrib_list); -typedef EGLBoolean ( * PFNEGLEXPORTDRMIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, EGLint * name, EGLint * handle, EGLint * stride); - -#define eglCreateDRMImageMESA EGLEW_GET_FUN(__eglewCreateDRMImageMESA) -#define eglExportDRMImageMESA EGLEW_GET_FUN(__eglewExportDRMImageMESA) - -#define EGLEW_MESA_drm_image EGLEW_GET_VAR(__EGLEW_MESA_drm_image) - -#endif /* EGL_MESA_drm_image */ - -/* --------------------- EGL_MESA_image_dma_buf_export --------------------- */ - -#ifndef EGL_MESA_image_dma_buf_export -#define EGL_MESA_image_dma_buf_export 1 - -typedef EGLBoolean ( * PFNEGLEXPORTDMABUFIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, int * fds, EGLint * strides, EGLint * offsets); -typedef EGLBoolean ( * PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC) (EGLDisplay dpy, EGLImageKHR image, int * fourcc, int * num_planes, EGLuint64KHR * modifiers); - -#define eglExportDMABUFImageMESA EGLEW_GET_FUN(__eglewExportDMABUFImageMESA) -#define eglExportDMABUFImageQueryMESA EGLEW_GET_FUN(__eglewExportDMABUFImageQueryMESA) - -#define EGLEW_MESA_image_dma_buf_export EGLEW_GET_VAR(__EGLEW_MESA_image_dma_buf_export) - -#endif /* EGL_MESA_image_dma_buf_export */ - -/* ------------------------- EGL_MESA_platform_gbm ------------------------- */ - -#ifndef EGL_MESA_platform_gbm -#define EGL_MESA_platform_gbm 1 - -#define EGL_PLATFORM_GBM_MESA 0x31D7 - -#define EGLEW_MESA_platform_gbm EGLEW_GET_VAR(__EGLEW_MESA_platform_gbm) - -#endif /* EGL_MESA_platform_gbm */ - -/* --------------------- EGL_MESA_platform_surfaceless --------------------- */ - -#ifndef EGL_MESA_platform_surfaceless -#define EGL_MESA_platform_surfaceless 1 - -#define EGL_PLATFORM_SURFACELESS_MESA 0x31DD - -#define EGLEW_MESA_platform_surfaceless EGLEW_GET_VAR(__EGLEW_MESA_platform_surfaceless) - -#endif /* EGL_MESA_platform_surfaceless */ - -/* -------------------------- EGL_NOK_swap_region -------------------------- */ - -#ifndef EGL_NOK_swap_region -#define EGL_NOK_swap_region 1 - -typedef EGLBoolean ( * PFNEGLSWAPBUFFERSREGIONNOKPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint * rects); - -#define eglSwapBuffersRegionNOK EGLEW_GET_FUN(__eglewSwapBuffersRegionNOK) - -#define EGLEW_NOK_swap_region EGLEW_GET_VAR(__EGLEW_NOK_swap_region) - -#endif /* EGL_NOK_swap_region */ - -/* -------------------------- EGL_NOK_swap_region2 ------------------------- */ - -#ifndef EGL_NOK_swap_region2 -#define EGL_NOK_swap_region2 1 - -typedef EGLBoolean ( * PFNEGLSWAPBUFFERSREGION2NOKPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint * rects); - -#define eglSwapBuffersRegion2NOK EGLEW_GET_FUN(__eglewSwapBuffersRegion2NOK) - -#define EGLEW_NOK_swap_region2 EGLEW_GET_VAR(__EGLEW_NOK_swap_region2) - -#endif /* EGL_NOK_swap_region2 */ - -/* ---------------------- EGL_NOK_texture_from_pixmap ---------------------- */ - -#ifndef EGL_NOK_texture_from_pixmap -#define EGL_NOK_texture_from_pixmap 1 - -#define EGL_Y_INVERTED_NOK 0x307F - -#define EGLEW_NOK_texture_from_pixmap EGLEW_GET_VAR(__EGLEW_NOK_texture_from_pixmap) - -#endif /* EGL_NOK_texture_from_pixmap */ - -/* ------------------------ EGL_NV_3dvision_surface ------------------------ */ - -#ifndef EGL_NV_3dvision_surface -#define EGL_NV_3dvision_surface 1 - -#define EGL_AUTO_STEREO_NV 0x3136 - -#define EGLEW_NV_3dvision_surface EGLEW_GET_VAR(__EGLEW_NV_3dvision_surface) - -#endif /* EGL_NV_3dvision_surface */ - -/* ------------------------- EGL_NV_coverage_sample ------------------------ */ - -#ifndef EGL_NV_coverage_sample -#define EGL_NV_coverage_sample 1 - -#define EGL_COVERAGE_BUFFERS_NV 0x30E0 -#define EGL_COVERAGE_SAMPLES_NV 0x30E1 - -#define EGLEW_NV_coverage_sample EGLEW_GET_VAR(__EGLEW_NV_coverage_sample) - -#endif /* EGL_NV_coverage_sample */ - -/* --------------------- EGL_NV_coverage_sample_resolve -------------------- */ - -#ifndef EGL_NV_coverage_sample_resolve -#define EGL_NV_coverage_sample_resolve 1 - -#define EGL_COVERAGE_SAMPLE_RESOLVE_NV 0x3131 -#define EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV 0x3132 -#define EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV 0x3133 - -#define EGLEW_NV_coverage_sample_resolve EGLEW_GET_VAR(__EGLEW_NV_coverage_sample_resolve) - -#endif /* EGL_NV_coverage_sample_resolve */ - -/* --------------------------- EGL_NV_cuda_event --------------------------- */ - -#ifndef EGL_NV_cuda_event -#define EGL_NV_cuda_event 1 - -#define EGL_CUDA_EVENT_HANDLE_NV 0x323B -#define EGL_SYNC_CUDA_EVENT_NV 0x323C -#define EGL_SYNC_CUDA_EVENT_COMPLETE_NV 0x323D - -#define EGLEW_NV_cuda_event EGLEW_GET_VAR(__EGLEW_NV_cuda_event) - -#endif /* EGL_NV_cuda_event */ - -/* ------------------------- EGL_NV_depth_nonlinear ------------------------ */ - -#ifndef EGL_NV_depth_nonlinear -#define EGL_NV_depth_nonlinear 1 - -#define EGL_DEPTH_ENCODING_NONE_NV 0 -#define EGL_DEPTH_ENCODING_NV 0x30E2 -#define EGL_DEPTH_ENCODING_NONLINEAR_NV 0x30E3 - -#define EGLEW_NV_depth_nonlinear EGLEW_GET_VAR(__EGLEW_NV_depth_nonlinear) - -#endif /* EGL_NV_depth_nonlinear */ - -/* --------------------------- EGL_NV_device_cuda -------------------------- */ - -#ifndef EGL_NV_device_cuda -#define EGL_NV_device_cuda 1 - -#define EGL_CUDA_DEVICE_NV 0x323A - -#define EGLEW_NV_device_cuda EGLEW_GET_VAR(__EGLEW_NV_device_cuda) - -#endif /* EGL_NV_device_cuda */ - -/* -------------------------- EGL_NV_native_query -------------------------- */ - -#ifndef EGL_NV_native_query -#define EGL_NV_native_query 1 - -typedef EGLBoolean ( * PFNEGLQUERYNATIVEDISPLAYNVPROC) (EGLDisplay dpy, EGLNativeDisplayType * display_id); -typedef EGLBoolean ( * PFNEGLQUERYNATIVEPIXMAPNVPROC) (EGLDisplay dpy, EGLSurface surf, EGLNativePixmapType * pixmap); -typedef EGLBoolean ( * PFNEGLQUERYNATIVEWINDOWNVPROC) (EGLDisplay dpy, EGLSurface surf, EGLNativeWindowType * window); - -#define eglQueryNativeDisplayNV EGLEW_GET_FUN(__eglewQueryNativeDisplayNV) -#define eglQueryNativePixmapNV EGLEW_GET_FUN(__eglewQueryNativePixmapNV) -#define eglQueryNativeWindowNV EGLEW_GET_FUN(__eglewQueryNativeWindowNV) - -#define EGLEW_NV_native_query EGLEW_GET_VAR(__EGLEW_NV_native_query) - -#endif /* EGL_NV_native_query */ - -/* ---------------------- EGL_NV_post_convert_rounding --------------------- */ - -#ifndef EGL_NV_post_convert_rounding -#define EGL_NV_post_convert_rounding 1 - -#define EGLEW_NV_post_convert_rounding EGLEW_GET_VAR(__EGLEW_NV_post_convert_rounding) - -#endif /* EGL_NV_post_convert_rounding */ - -/* ------------------------- EGL_NV_post_sub_buffer ------------------------ */ - -#ifndef EGL_NV_post_sub_buffer -#define EGL_NV_post_sub_buffer 1 - -#define EGL_POST_SUB_BUFFER_SUPPORTED_NV 0x30BE - -typedef EGLBoolean ( * PFNEGLPOSTSUBBUFFERNVPROC) (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height); - -#define eglPostSubBufferNV EGLEW_GET_FUN(__eglewPostSubBufferNV) - -#define EGLEW_NV_post_sub_buffer EGLEW_GET_VAR(__EGLEW_NV_post_sub_buffer) - -#endif /* EGL_NV_post_sub_buffer */ - -/* ------------------ EGL_NV_robustness_video_memory_purge ----------------- */ - -#ifndef EGL_NV_robustness_video_memory_purge -#define EGL_NV_robustness_video_memory_purge 1 - -#define EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x334C - -#define EGLEW_NV_robustness_video_memory_purge EGLEW_GET_VAR(__EGLEW_NV_robustness_video_memory_purge) - -#endif /* EGL_NV_robustness_video_memory_purge */ - -/* ------------------ EGL_NV_stream_consumer_gltexture_yuv ----------------- */ - -#ifndef EGL_NV_stream_consumer_gltexture_yuv -#define EGL_NV_stream_consumer_gltexture_yuv 1 - -#define EGL_YUV_BUFFER_EXT 0x3300 -#define EGL_YUV_NUMBER_OF_PLANES_EXT 0x3311 -#define EGL_YUV_PLANE0_TEXTURE_UNIT_NV 0x332C -#define EGL_YUV_PLANE1_TEXTURE_UNIT_NV 0x332D -#define EGL_YUV_PLANE2_TEXTURE_UNIT_NV 0x332E - -typedef EGLBoolean ( * PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLAttrib *attrib_list); - -#define eglStreamConsumerGLTextureExternalAttribsNV EGLEW_GET_FUN(__eglewStreamConsumerGLTextureExternalAttribsNV) - -#define EGLEW_NV_stream_consumer_gltexture_yuv EGLEW_GET_VAR(__EGLEW_NV_stream_consumer_gltexture_yuv) - -#endif /* EGL_NV_stream_consumer_gltexture_yuv */ - -/* ---------------------- EGL_NV_stream_cross_display ---------------------- */ - -#ifndef EGL_NV_stream_cross_display -#define EGL_NV_stream_cross_display 1 - -#define EGL_STREAM_CROSS_DISPLAY_NV 0x334E - -#define EGLEW_NV_stream_cross_display EGLEW_GET_VAR(__EGLEW_NV_stream_cross_display) - -#endif /* EGL_NV_stream_cross_display */ - -/* ----------------------- EGL_NV_stream_cross_object ---------------------- */ - -#ifndef EGL_NV_stream_cross_object -#define EGL_NV_stream_cross_object 1 - -#define EGL_STREAM_CROSS_OBJECT_NV 0x334D - -#define EGLEW_NV_stream_cross_object EGLEW_GET_VAR(__EGLEW_NV_stream_cross_object) - -#endif /* EGL_NV_stream_cross_object */ - -/* --------------------- EGL_NV_stream_cross_partition --------------------- */ - -#ifndef EGL_NV_stream_cross_partition -#define EGL_NV_stream_cross_partition 1 - -#define EGL_STREAM_CROSS_PARTITION_NV 0x323F - -#define EGLEW_NV_stream_cross_partition EGLEW_GET_VAR(__EGLEW_NV_stream_cross_partition) - -#endif /* EGL_NV_stream_cross_partition */ - -/* ---------------------- EGL_NV_stream_cross_process ---------------------- */ - -#ifndef EGL_NV_stream_cross_process -#define EGL_NV_stream_cross_process 1 - -#define EGL_STREAM_CROSS_PROCESS_NV 0x3245 - -#define EGLEW_NV_stream_cross_process EGLEW_GET_VAR(__EGLEW_NV_stream_cross_process) - -#endif /* EGL_NV_stream_cross_process */ - -/* ----------------------- EGL_NV_stream_cross_system ---------------------- */ - -#ifndef EGL_NV_stream_cross_system -#define EGL_NV_stream_cross_system 1 - -#define EGL_STREAM_CROSS_SYSTEM_NV 0x334F - -#define EGLEW_NV_stream_cross_system EGLEW_GET_VAR(__EGLEW_NV_stream_cross_system) - -#endif /* EGL_NV_stream_cross_system */ - -/* ------------------------ EGL_NV_stream_fifo_next ------------------------ */ - -#ifndef EGL_NV_stream_fifo_next -#define EGL_NV_stream_fifo_next 1 - -#define EGL_PENDING_FRAME_NV 0x3329 -#define EGL_STREAM_TIME_PENDING_NV 0x332A - -#define EGLEW_NV_stream_fifo_next EGLEW_GET_VAR(__EGLEW_NV_stream_fifo_next) - -#endif /* EGL_NV_stream_fifo_next */ - -/* --------------------- EGL_NV_stream_fifo_synchronous -------------------- */ - -#ifndef EGL_NV_stream_fifo_synchronous -#define EGL_NV_stream_fifo_synchronous 1 - -#define EGL_STREAM_FIFO_SYNCHRONOUS_NV 0x3336 - -#define EGLEW_NV_stream_fifo_synchronous EGLEW_GET_VAR(__EGLEW_NV_stream_fifo_synchronous) - -#endif /* EGL_NV_stream_fifo_synchronous */ - -/* ----------------------- EGL_NV_stream_frame_limits ---------------------- */ - -#ifndef EGL_NV_stream_frame_limits -#define EGL_NV_stream_frame_limits 1 - -#define EGL_PRODUCER_MAX_FRAME_HINT_NV 0x3337 -#define EGL_CONSUMER_MAX_FRAME_HINT_NV 0x3338 - -#define EGLEW_NV_stream_frame_limits EGLEW_GET_VAR(__EGLEW_NV_stream_frame_limits) - -#endif /* EGL_NV_stream_frame_limits */ - -/* ------------------------- EGL_NV_stream_metadata ------------------------ */ - -#ifndef EGL_NV_stream_metadata -#define EGL_NV_stream_metadata 1 - -#define EGL_MAX_STREAM_METADATA_BLOCKS_NV 0x3250 -#define EGL_MAX_STREAM_METADATA_BLOCK_SIZE_NV 0x3251 -#define EGL_MAX_STREAM_METADATA_TOTAL_SIZE_NV 0x3252 -#define EGL_PRODUCER_METADATA_NV 0x3253 -#define EGL_CONSUMER_METADATA_NV 0x3254 -#define EGL_METADATA0_SIZE_NV 0x3255 -#define EGL_METADATA1_SIZE_NV 0x3256 -#define EGL_METADATA2_SIZE_NV 0x3257 -#define EGL_METADATA3_SIZE_NV 0x3258 -#define EGL_METADATA0_TYPE_NV 0x3259 -#define EGL_METADATA1_TYPE_NV 0x325A -#define EGL_METADATA2_TYPE_NV 0x325B -#define EGL_METADATA3_TYPE_NV 0x325C -#define EGL_PENDING_METADATA_NV 0x3328 - -typedef EGLBoolean ( * PFNEGLQUERYDISPLAYATTRIBNVPROC) (EGLDisplay dpy, EGLint attribute, EGLAttrib * value); -typedef EGLBoolean ( * PFNEGLQUERYSTREAMMETADATANVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum name, EGLint n, EGLint offset, EGLint size, void * data); -typedef EGLBoolean ( * PFNEGLSETSTREAMMETADATANVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLint n, EGLint offset, EGLint size, const void * data); - -#define eglQueryDisplayAttribNV EGLEW_GET_FUN(__eglewQueryDisplayAttribNV) -#define eglQueryStreamMetadataNV EGLEW_GET_FUN(__eglewQueryStreamMetadataNV) -#define eglSetStreamMetadataNV EGLEW_GET_FUN(__eglewSetStreamMetadataNV) - -#define EGLEW_NV_stream_metadata EGLEW_GET_VAR(__EGLEW_NV_stream_metadata) - -#endif /* EGL_NV_stream_metadata */ - -/* -------------------------- EGL_NV_stream_remote ------------------------- */ - -#ifndef EGL_NV_stream_remote -#define EGL_NV_stream_remote 1 - -#define EGL_STREAM_STATE_INITIALIZING_NV 0x3240 -#define EGL_STREAM_TYPE_NV 0x3241 -#define EGL_STREAM_PROTOCOL_NV 0x3242 -#define EGL_STREAM_ENDPOINT_NV 0x3243 -#define EGL_STREAM_LOCAL_NV 0x3244 -#define EGL_STREAM_PROTOCOL_FD_NV 0x3246 -#define EGL_STREAM_PRODUCER_NV 0x3247 -#define EGL_STREAM_CONSUMER_NV 0x3248 - -#define EGLEW_NV_stream_remote EGLEW_GET_VAR(__EGLEW_NV_stream_remote) - -#endif /* EGL_NV_stream_remote */ - -/* -------------------------- EGL_NV_stream_reset -------------------------- */ - -#ifndef EGL_NV_stream_reset -#define EGL_NV_stream_reset 1 - -#define EGL_SUPPORT_RESET_NV 0x3334 -#define EGL_SUPPORT_REUSE_NV 0x3335 - -typedef EGLBoolean ( * PFNEGLRESETSTREAMNVPROC) (EGLDisplay dpy, EGLStreamKHR stream); - -#define eglResetStreamNV EGLEW_GET_FUN(__eglewResetStreamNV) - -#define EGLEW_NV_stream_reset EGLEW_GET_VAR(__EGLEW_NV_stream_reset) - -#endif /* EGL_NV_stream_reset */ - -/* -------------------------- EGL_NV_stream_socket ------------------------- */ - -#ifndef EGL_NV_stream_socket -#define EGL_NV_stream_socket 1 - -#define EGL_STREAM_PROTOCOL_SOCKET_NV 0x324B -#define EGL_SOCKET_HANDLE_NV 0x324C -#define EGL_SOCKET_TYPE_NV 0x324D - -#define EGLEW_NV_stream_socket EGLEW_GET_VAR(__EGLEW_NV_stream_socket) - -#endif /* EGL_NV_stream_socket */ - -/* ----------------------- EGL_NV_stream_socket_inet ----------------------- */ - -#ifndef EGL_NV_stream_socket_inet -#define EGL_NV_stream_socket_inet 1 - -#define EGL_SOCKET_TYPE_INET_NV 0x324F - -#define EGLEW_NV_stream_socket_inet EGLEW_GET_VAR(__EGLEW_NV_stream_socket_inet) - -#endif /* EGL_NV_stream_socket_inet */ - -/* ----------------------- EGL_NV_stream_socket_unix ----------------------- */ - -#ifndef EGL_NV_stream_socket_unix -#define EGL_NV_stream_socket_unix 1 - -#define EGL_SOCKET_TYPE_UNIX_NV 0x324E - -#define EGLEW_NV_stream_socket_unix EGLEW_GET_VAR(__EGLEW_NV_stream_socket_unix) - -#endif /* EGL_NV_stream_socket_unix */ - -/* --------------------------- EGL_NV_stream_sync -------------------------- */ - -#ifndef EGL_NV_stream_sync -#define EGL_NV_stream_sync 1 - -#define EGL_SYNC_TYPE_KHR 0x30F7 -#define EGL_SYNC_NEW_FRAME_NV 0x321F - -typedef EGLSyncKHR ( * PFNEGLCREATESTREAMSYNCNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum type, const EGLint * attrib_list); - -#define eglCreateStreamSyncNV EGLEW_GET_FUN(__eglewCreateStreamSyncNV) - -#define EGLEW_NV_stream_sync EGLEW_GET_VAR(__EGLEW_NV_stream_sync) - -#endif /* EGL_NV_stream_sync */ - -/* ------------------------------ EGL_NV_sync ------------------------------ */ - -#ifndef EGL_NV_sync -#define EGL_NV_sync 1 - -#define EGL_SYNC_FLUSH_COMMANDS_BIT_NV 0x0001 -#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV 0x30E6 -#define EGL_SYNC_STATUS_NV 0x30E7 -#define EGL_SIGNALED_NV 0x30E8 -#define EGL_UNSIGNALED_NV 0x30E9 -#define EGL_ALREADY_SIGNALED_NV 0x30EA -#define EGL_TIMEOUT_EXPIRED_NV 0x30EB -#define EGL_CONDITION_SATISFIED_NV 0x30EC -#define EGL_SYNC_TYPE_NV 0x30ED -#define EGL_SYNC_CONDITION_NV 0x30EE -#define EGL_SYNC_FENCE_NV 0x30EF -#define EGL_FOREVER_NV 0xFFFFFFFFFFFFFFFF - -typedef EGLint ( * PFNEGLCLIENTWAITSYNCNVPROC) (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout); -typedef EGLSyncNV ( * PFNEGLCREATEFENCESYNCNVPROC) (EGLDisplay dpy, EGLenum condition, const EGLint * attrib_list); -typedef EGLBoolean ( * PFNEGLDESTROYSYNCNVPROC) (EGLSyncNV sync); -typedef EGLBoolean ( * PFNEGLFENCENVPROC) (EGLSyncNV sync); -typedef EGLBoolean ( * PFNEGLGETSYNCATTRIBNVPROC) (EGLSyncNV sync, EGLint attribute, EGLint * value); -typedef EGLBoolean ( * PFNEGLSIGNALSYNCNVPROC) (EGLSyncNV sync, EGLenum mode); - -#define eglClientWaitSyncNV EGLEW_GET_FUN(__eglewClientWaitSyncNV) -#define eglCreateFenceSyncNV EGLEW_GET_FUN(__eglewCreateFenceSyncNV) -#define eglDestroySyncNV EGLEW_GET_FUN(__eglewDestroySyncNV) -#define eglFenceNV EGLEW_GET_FUN(__eglewFenceNV) -#define eglGetSyncAttribNV EGLEW_GET_FUN(__eglewGetSyncAttribNV) -#define eglSignalSyncNV EGLEW_GET_FUN(__eglewSignalSyncNV) - -#define EGLEW_NV_sync EGLEW_GET_VAR(__EGLEW_NV_sync) - -#endif /* EGL_NV_sync */ - -/* --------------------------- EGL_NV_system_time -------------------------- */ - -#ifndef EGL_NV_system_time -#define EGL_NV_system_time 1 - -typedef EGLuint64NV ( * PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC) ( void ); -typedef EGLuint64NV ( * PFNEGLGETSYSTEMTIMENVPROC) ( void ); - -#define eglGetSystemTimeFrequencyNV EGLEW_GET_FUN(__eglewGetSystemTimeFrequencyNV) -#define eglGetSystemTimeNV EGLEW_GET_FUN(__eglewGetSystemTimeNV) - -#define EGLEW_NV_system_time EGLEW_GET_VAR(__EGLEW_NV_system_time) - -#endif /* EGL_NV_system_time */ - -/* --------------------- EGL_TIZEN_image_native_buffer --------------------- */ - -#ifndef EGL_TIZEN_image_native_buffer -#define EGL_TIZEN_image_native_buffer 1 - -#define EGL_NATIVE_BUFFER_TIZEN 0x32A0 - -#define EGLEW_TIZEN_image_native_buffer EGLEW_GET_VAR(__EGLEW_TIZEN_image_native_buffer) - -#endif /* EGL_TIZEN_image_native_buffer */ - -/* --------------------- EGL_TIZEN_image_native_surface -------------------- */ - -#ifndef EGL_TIZEN_image_native_surface -#define EGL_TIZEN_image_native_surface 1 - -#define EGL_NATIVE_SURFACE_TIZEN 0x32A1 - -#define EGLEW_TIZEN_image_native_surface EGLEW_GET_VAR(__EGLEW_TIZEN_image_native_surface) - -#endif /* EGL_TIZEN_image_native_surface */ - -/* ------------------------------------------------------------------------- */ - -#define EGLEW_FUN_EXPORT GLEW_FUN_EXPORT -#define EGLEW_VAR_EXPORT GLEW_VAR_EXPORT - -EGLEW_FUN_EXPORT PFNEGLCHOOSECONFIGPROC __eglewChooseConfig; -EGLEW_FUN_EXPORT PFNEGLCOPYBUFFERSPROC __eglewCopyBuffers; -EGLEW_FUN_EXPORT PFNEGLCREATECONTEXTPROC __eglewCreateContext; -EGLEW_FUN_EXPORT PFNEGLCREATEPBUFFERSURFACEPROC __eglewCreatePbufferSurface; -EGLEW_FUN_EXPORT PFNEGLCREATEPIXMAPSURFACEPROC __eglewCreatePixmapSurface; -EGLEW_FUN_EXPORT PFNEGLCREATEWINDOWSURFACEPROC __eglewCreateWindowSurface; -EGLEW_FUN_EXPORT PFNEGLDESTROYCONTEXTPROC __eglewDestroyContext; -EGLEW_FUN_EXPORT PFNEGLDESTROYSURFACEPROC __eglewDestroySurface; -EGLEW_FUN_EXPORT PFNEGLGETCONFIGATTRIBPROC __eglewGetConfigAttrib; -EGLEW_FUN_EXPORT PFNEGLGETCONFIGSPROC __eglewGetConfigs; -EGLEW_FUN_EXPORT PFNEGLGETCURRENTDISPLAYPROC __eglewGetCurrentDisplay; -EGLEW_FUN_EXPORT PFNEGLGETCURRENTSURFACEPROC __eglewGetCurrentSurface; -EGLEW_FUN_EXPORT PFNEGLGETDISPLAYPROC __eglewGetDisplay; -EGLEW_FUN_EXPORT PFNEGLGETERRORPROC __eglewGetError; -EGLEW_FUN_EXPORT PFNEGLINITIALIZEPROC __eglewInitialize; -EGLEW_FUN_EXPORT PFNEGLMAKECURRENTPROC __eglewMakeCurrent; -EGLEW_FUN_EXPORT PFNEGLQUERYCONTEXTPROC __eglewQueryContext; -EGLEW_FUN_EXPORT PFNEGLQUERYSTRINGPROC __eglewQueryString; -EGLEW_FUN_EXPORT PFNEGLQUERYSURFACEPROC __eglewQuerySurface; -EGLEW_FUN_EXPORT PFNEGLSWAPBUFFERSPROC __eglewSwapBuffers; -EGLEW_FUN_EXPORT PFNEGLTERMINATEPROC __eglewTerminate; -EGLEW_FUN_EXPORT PFNEGLWAITGLPROC __eglewWaitGL; -EGLEW_FUN_EXPORT PFNEGLWAITNATIVEPROC __eglewWaitNative; - -EGLEW_FUN_EXPORT PFNEGLBINDTEXIMAGEPROC __eglewBindTexImage; -EGLEW_FUN_EXPORT PFNEGLRELEASETEXIMAGEPROC __eglewReleaseTexImage; -EGLEW_FUN_EXPORT PFNEGLSURFACEATTRIBPROC __eglewSurfaceAttrib; -EGLEW_FUN_EXPORT PFNEGLSWAPINTERVALPROC __eglewSwapInterval; - -EGLEW_FUN_EXPORT PFNEGLBINDAPIPROC __eglewBindAPI; -EGLEW_FUN_EXPORT PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC __eglewCreatePbufferFromClientBuffer; -EGLEW_FUN_EXPORT PFNEGLQUERYAPIPROC __eglewQueryAPI; -EGLEW_FUN_EXPORT PFNEGLRELEASETHREADPROC __eglewReleaseThread; -EGLEW_FUN_EXPORT PFNEGLWAITCLIENTPROC __eglewWaitClient; - -EGLEW_FUN_EXPORT PFNEGLGETCURRENTCONTEXTPROC __eglewGetCurrentContext; - -EGLEW_FUN_EXPORT PFNEGLCLIENTWAITSYNCPROC __eglewClientWaitSync; -EGLEW_FUN_EXPORT PFNEGLCREATEIMAGEPROC __eglewCreateImage; -EGLEW_FUN_EXPORT PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC __eglewCreatePlatformPixmapSurface; -EGLEW_FUN_EXPORT PFNEGLCREATEPLATFORMWINDOWSURFACEPROC __eglewCreatePlatformWindowSurface; -EGLEW_FUN_EXPORT PFNEGLCREATESYNCPROC __eglewCreateSync; -EGLEW_FUN_EXPORT PFNEGLDESTROYIMAGEPROC __eglewDestroyImage; -EGLEW_FUN_EXPORT PFNEGLDESTROYSYNCPROC __eglewDestroySync; -EGLEW_FUN_EXPORT PFNEGLGETPLATFORMDISPLAYPROC __eglewGetPlatformDisplay; -EGLEW_FUN_EXPORT PFNEGLGETSYNCATTRIBPROC __eglewGetSyncAttrib; -EGLEW_FUN_EXPORT PFNEGLWAITSYNCPROC __eglewWaitSync; - -EGLEW_FUN_EXPORT PFNEGLSETBLOBCACHEFUNCSANDROIDPROC __eglewSetBlobCacheFuncsANDROID; - -EGLEW_FUN_EXPORT PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC __eglewCreateNativeClientBufferANDROID; - -EGLEW_FUN_EXPORT PFNEGLDUPNATIVEFENCEFDANDROIDPROC __eglewDupNativeFenceFDANDROID; - -EGLEW_FUN_EXPORT PFNEGLPRESENTATIONTIMEANDROIDPROC __eglewPresentationTimeANDROID; - -EGLEW_FUN_EXPORT PFNEGLQUERYSURFACEPOINTERANGLEPROC __eglewQuerySurfacePointerANGLE; - -EGLEW_FUN_EXPORT PFNEGLQUERYDEVICESEXTPROC __eglewQueryDevicesEXT; - -EGLEW_FUN_EXPORT PFNEGLQUERYDEVICEATTRIBEXTPROC __eglewQueryDeviceAttribEXT; -EGLEW_FUN_EXPORT PFNEGLQUERYDEVICESTRINGEXTPROC __eglewQueryDeviceStringEXT; -EGLEW_FUN_EXPORT PFNEGLQUERYDISPLAYATTRIBEXTPROC __eglewQueryDisplayAttribEXT; - -EGLEW_FUN_EXPORT PFNEGLQUERYDMABUFFORMATSEXTPROC __eglewQueryDmaBufFormatsEXT; -EGLEW_FUN_EXPORT PFNEGLQUERYDMABUFMODIFIERSEXTPROC __eglewQueryDmaBufModifiersEXT; - -EGLEW_FUN_EXPORT PFNEGLGETOUTPUTLAYERSEXTPROC __eglewGetOutputLayersEXT; -EGLEW_FUN_EXPORT PFNEGLGETOUTPUTPORTSEXTPROC __eglewGetOutputPortsEXT; -EGLEW_FUN_EXPORT PFNEGLOUTPUTLAYERATTRIBEXTPROC __eglewOutputLayerAttribEXT; -EGLEW_FUN_EXPORT PFNEGLOUTPUTPORTATTRIBEXTPROC __eglewOutputPortAttribEXT; -EGLEW_FUN_EXPORT PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC __eglewQueryOutputLayerAttribEXT; -EGLEW_FUN_EXPORT PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC __eglewQueryOutputLayerStringEXT; -EGLEW_FUN_EXPORT PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC __eglewQueryOutputPortAttribEXT; -EGLEW_FUN_EXPORT PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC __eglewQueryOutputPortStringEXT; - -EGLEW_FUN_EXPORT PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC __eglewCreatePlatformPixmapSurfaceEXT; -EGLEW_FUN_EXPORT PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC __eglewCreatePlatformWindowSurfaceEXT; -EGLEW_FUN_EXPORT PFNEGLGETPLATFORMDISPLAYEXTPROC __eglewGetPlatformDisplayEXT; - -EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMEROUTPUTEXTPROC __eglewStreamConsumerOutputEXT; - -EGLEW_FUN_EXPORT PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC __eglewSwapBuffersWithDamageEXT; - -EGLEW_FUN_EXPORT PFNEGLCREATEPIXMAPSURFACEHIPROC __eglewCreatePixmapSurfaceHI; - -EGLEW_FUN_EXPORT PFNEGLCREATESYNC64KHRPROC __eglewCreateSync64KHR; - -EGLEW_FUN_EXPORT PFNEGLDEBUGMESSAGECONTROLKHRPROC __eglewDebugMessageControlKHR; -EGLEW_FUN_EXPORT PFNEGLLABELOBJECTKHRPROC __eglewLabelObjectKHR; -EGLEW_FUN_EXPORT PFNEGLQUERYDEBUGKHRPROC __eglewQueryDebugKHR; - -EGLEW_FUN_EXPORT PFNEGLCREATEIMAGEKHRPROC __eglewCreateImageKHR; -EGLEW_FUN_EXPORT PFNEGLDESTROYIMAGEKHRPROC __eglewDestroyImageKHR; - -EGLEW_FUN_EXPORT PFNEGLLOCKSURFACEKHRPROC __eglewLockSurfaceKHR; -EGLEW_FUN_EXPORT PFNEGLUNLOCKSURFACEKHRPROC __eglewUnlockSurfaceKHR; - -EGLEW_FUN_EXPORT PFNEGLQUERYSURFACE64KHRPROC __eglewQuerySurface64KHR; - -EGLEW_FUN_EXPORT PFNEGLSETDAMAGEREGIONKHRPROC __eglewSetDamageRegionKHR; - -EGLEW_FUN_EXPORT PFNEGLCLIENTWAITSYNCKHRPROC __eglewClientWaitSyncKHR; -EGLEW_FUN_EXPORT PFNEGLCREATESYNCKHRPROC __eglewCreateSyncKHR; -EGLEW_FUN_EXPORT PFNEGLDESTROYSYNCKHRPROC __eglewDestroySyncKHR; -EGLEW_FUN_EXPORT PFNEGLGETSYNCATTRIBKHRPROC __eglewGetSyncAttribKHR; -EGLEW_FUN_EXPORT PFNEGLSIGNALSYNCKHRPROC __eglewSignalSyncKHR; - -EGLEW_FUN_EXPORT PFNEGLCREATESTREAMKHRPROC __eglewCreateStreamKHR; -EGLEW_FUN_EXPORT PFNEGLDESTROYSTREAMKHRPROC __eglewDestroyStreamKHR; -EGLEW_FUN_EXPORT PFNEGLQUERYSTREAMKHRPROC __eglewQueryStreamKHR; -EGLEW_FUN_EXPORT PFNEGLQUERYSTREAMU64KHRPROC __eglewQueryStreamu64KHR; -EGLEW_FUN_EXPORT PFNEGLSTREAMATTRIBKHRPROC __eglewStreamAttribKHR; - -EGLEW_FUN_EXPORT PFNEGLCREATESTREAMATTRIBKHRPROC __eglewCreateStreamAttribKHR; -EGLEW_FUN_EXPORT PFNEGLQUERYSTREAMATTRIBKHRPROC __eglewQueryStreamAttribKHR; -EGLEW_FUN_EXPORT PFNEGLSETSTREAMATTRIBKHRPROC __eglewSetStreamAttribKHR; -EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC __eglewStreamConsumerAcquireAttribKHR; -EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC __eglewStreamConsumerReleaseAttribKHR; - -EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMERACQUIREKHRPROC __eglewStreamConsumerAcquireKHR; -EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC __eglewStreamConsumerGLTextureExternalKHR; -EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMERRELEASEKHRPROC __eglewStreamConsumerReleaseKHR; - -EGLEW_FUN_EXPORT PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC __eglewCreateStreamFromFileDescriptorKHR; -EGLEW_FUN_EXPORT PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC __eglewGetStreamFileDescriptorKHR; - -EGLEW_FUN_EXPORT PFNEGLQUERYSTREAMTIMEKHRPROC __eglewQueryStreamTimeKHR; - -EGLEW_FUN_EXPORT PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC __eglewCreateStreamProducerSurfaceKHR; - -EGLEW_FUN_EXPORT PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC __eglewSwapBuffersWithDamageKHR; - -EGLEW_FUN_EXPORT PFNEGLWAITSYNCKHRPROC __eglewWaitSyncKHR; - -EGLEW_FUN_EXPORT PFNEGLCREATEDRMIMAGEMESAPROC __eglewCreateDRMImageMESA; -EGLEW_FUN_EXPORT PFNEGLEXPORTDRMIMAGEMESAPROC __eglewExportDRMImageMESA; - -EGLEW_FUN_EXPORT PFNEGLEXPORTDMABUFIMAGEMESAPROC __eglewExportDMABUFImageMESA; -EGLEW_FUN_EXPORT PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC __eglewExportDMABUFImageQueryMESA; - -EGLEW_FUN_EXPORT PFNEGLSWAPBUFFERSREGIONNOKPROC __eglewSwapBuffersRegionNOK; - -EGLEW_FUN_EXPORT PFNEGLSWAPBUFFERSREGION2NOKPROC __eglewSwapBuffersRegion2NOK; - -EGLEW_FUN_EXPORT PFNEGLQUERYNATIVEDISPLAYNVPROC __eglewQueryNativeDisplayNV; -EGLEW_FUN_EXPORT PFNEGLQUERYNATIVEPIXMAPNVPROC __eglewQueryNativePixmapNV; -EGLEW_FUN_EXPORT PFNEGLQUERYNATIVEWINDOWNVPROC __eglewQueryNativeWindowNV; - -EGLEW_FUN_EXPORT PFNEGLPOSTSUBBUFFERNVPROC __eglewPostSubBufferNV; - -EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC __eglewStreamConsumerGLTextureExternalAttribsNV; - -EGLEW_FUN_EXPORT PFNEGLQUERYDISPLAYATTRIBNVPROC __eglewQueryDisplayAttribNV; -EGLEW_FUN_EXPORT PFNEGLQUERYSTREAMMETADATANVPROC __eglewQueryStreamMetadataNV; -EGLEW_FUN_EXPORT PFNEGLSETSTREAMMETADATANVPROC __eglewSetStreamMetadataNV; - -EGLEW_FUN_EXPORT PFNEGLRESETSTREAMNVPROC __eglewResetStreamNV; - -EGLEW_FUN_EXPORT PFNEGLCREATESTREAMSYNCNVPROC __eglewCreateStreamSyncNV; - -EGLEW_FUN_EXPORT PFNEGLCLIENTWAITSYNCNVPROC __eglewClientWaitSyncNV; -EGLEW_FUN_EXPORT PFNEGLCREATEFENCESYNCNVPROC __eglewCreateFenceSyncNV; -EGLEW_FUN_EXPORT PFNEGLDESTROYSYNCNVPROC __eglewDestroySyncNV; -EGLEW_FUN_EXPORT PFNEGLFENCENVPROC __eglewFenceNV; -EGLEW_FUN_EXPORT PFNEGLGETSYNCATTRIBNVPROC __eglewGetSyncAttribNV; -EGLEW_FUN_EXPORT PFNEGLSIGNALSYNCNVPROC __eglewSignalSyncNV; - -EGLEW_FUN_EXPORT PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC __eglewGetSystemTimeFrequencyNV; -EGLEW_FUN_EXPORT PFNEGLGETSYSTEMTIMENVPROC __eglewGetSystemTimeNV; -EGLEW_VAR_EXPORT GLboolean __EGLEW_VERSION_1_0; -EGLEW_VAR_EXPORT GLboolean __EGLEW_VERSION_1_1; -EGLEW_VAR_EXPORT GLboolean __EGLEW_VERSION_1_2; -EGLEW_VAR_EXPORT GLboolean __EGLEW_VERSION_1_3; -EGLEW_VAR_EXPORT GLboolean __EGLEW_VERSION_1_4; -EGLEW_VAR_EXPORT GLboolean __EGLEW_VERSION_1_5; -EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_blob_cache; -EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_create_native_client_buffer; -EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_framebuffer_target; -EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_front_buffer_auto_refresh; -EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_image_native_buffer; -EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_native_fence_sync; -EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_presentation_time; -EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_recordable; -EGLEW_VAR_EXPORT GLboolean __EGLEW_ANGLE_d3d_share_handle_client_buffer; -EGLEW_VAR_EXPORT GLboolean __EGLEW_ANGLE_device_d3d; -EGLEW_VAR_EXPORT GLboolean __EGLEW_ANGLE_query_surface_pointer; -EGLEW_VAR_EXPORT GLboolean __EGLEW_ANGLE_surface_d3d_texture_2d_share_handle; -EGLEW_VAR_EXPORT GLboolean __EGLEW_ANGLE_window_fixed_size; -EGLEW_VAR_EXPORT GLboolean __EGLEW_ARM_implicit_external_sync; -EGLEW_VAR_EXPORT GLboolean __EGLEW_ARM_pixmap_multisample_discard; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_buffer_age; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_client_extensions; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_create_context_robustness; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_device_base; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_device_drm; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_device_enumeration; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_device_openwf; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_device_query; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_gl_colorspace_bt2020_linear; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_gl_colorspace_bt2020_pq; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_gl_colorspace_scrgb_linear; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_image_dma_buf_import; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_image_dma_buf_import_modifiers; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_multiview_window; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_output_base; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_output_drm; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_output_openwf; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_pixel_format_float; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_platform_base; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_platform_device; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_platform_wayland; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_platform_x11; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_protected_content; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_protected_surface; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_stream_consumer_egloutput; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_surface_SMPTE2086_metadata; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_swap_buffers_with_damage; -EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_yuv_surface; -EGLEW_VAR_EXPORT GLboolean __EGLEW_HI_clientpixmap; -EGLEW_VAR_EXPORT GLboolean __EGLEW_HI_colorformats; -EGLEW_VAR_EXPORT GLboolean __EGLEW_IMG_context_priority; -EGLEW_VAR_EXPORT GLboolean __EGLEW_IMG_image_plane_attribs; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_cl_event; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_cl_event2; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_client_get_all_proc_addresses; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_config_attribs; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_context_flush_control; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_create_context; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_create_context_no_error; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_debug; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_fence_sync; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_get_all_proc_addresses; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_gl_colorspace; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_gl_renderbuffer_image; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_gl_texture_2D_image; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_gl_texture_3D_image; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_gl_texture_cubemap_image; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_image; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_image_base; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_image_pixmap; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_lock_surface; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_lock_surface2; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_lock_surface3; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_mutable_render_buffer; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_no_config_context; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_partial_update; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_platform_android; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_platform_gbm; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_platform_wayland; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_platform_x11; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_reusable_sync; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream_attrib; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream_consumer_gltexture; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream_cross_process_fd; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream_fifo; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream_producer_aldatalocator; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream_producer_eglsurface; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_surfaceless_context; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_swap_buffers_with_damage; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_vg_parent_image; -EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_wait_sync; -EGLEW_VAR_EXPORT GLboolean __EGLEW_MESA_drm_image; -EGLEW_VAR_EXPORT GLboolean __EGLEW_MESA_image_dma_buf_export; -EGLEW_VAR_EXPORT GLboolean __EGLEW_MESA_platform_gbm; -EGLEW_VAR_EXPORT GLboolean __EGLEW_MESA_platform_surfaceless; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NOK_swap_region; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NOK_swap_region2; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NOK_texture_from_pixmap; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_3dvision_surface; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_coverage_sample; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_coverage_sample_resolve; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_cuda_event; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_depth_nonlinear; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_device_cuda; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_native_query; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_post_convert_rounding; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_post_sub_buffer; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_robustness_video_memory_purge; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_consumer_gltexture_yuv; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_cross_display; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_cross_object; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_cross_partition; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_cross_process; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_cross_system; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_fifo_next; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_fifo_synchronous; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_frame_limits; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_metadata; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_remote; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_reset; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_socket; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_socket_inet; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_socket_unix; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_sync; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_sync; -EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_system_time; -EGLEW_VAR_EXPORT GLboolean __EGLEW_TIZEN_image_native_buffer; -EGLEW_VAR_EXPORT GLboolean __EGLEW_TIZEN_image_native_surface; -/* ------------------------------------------------------------------------ */ - -GLEWAPI GLenum GLEWAPIENTRY eglewInit (EGLDisplay display); -GLEWAPI GLboolean GLEWAPIENTRY eglewIsSupported (const char *name); - -#define EGLEW_GET_VAR(x) (*(const GLboolean*)&x) -#define EGLEW_GET_FUN(x) x - -GLEWAPI GLboolean GLEWAPIENTRY eglewGetExtension (const char *name); - -#ifdef __cplusplus -} -#endif - -#endif /* __eglew_h__ */ diff --git a/src/engine/external/glew/GL/glew.h b/src/engine/external/glew/GL/glew.h deleted file mode 100644 index 3155f39c7d..0000000000 --- a/src/engine/external/glew/GL/glew.h +++ /dev/null @@ -1,23687 +0,0 @@ -/* -** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2017, Nigel Stewart -** Copyright (C) 2002-2008, Milan Ikits -** Copyright (C) 2002-2008, Marcelo E. Magallon -** Copyright (C) 2002, Lev Povalahev -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are met: -** -** * Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** * The name of the author may be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -** THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Mesa 3-D graphics library - * Version: 7.0 - * - * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* -** Copyright (c) 2007 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -#ifndef __glew_h__ -#define __glew_h__ -#define __GLEW_H__ - -#if defined(__gl_h_) || defined(__GL_H__) || defined(_GL_H) || defined(__X_GL_H) -#error gl.h included before glew.h -#endif -#if defined(__gl2_h_) -#error gl2.h included before glew.h -#endif -#if defined(__gltypes_h_) -#error gltypes.h included before glew.h -#endif -#if defined(__REGAL_H__) -#error Regal.h included before glew.h -#endif -#if defined(__glext_h_) || defined(__GLEXT_H_) -#error glext.h included before glew.h -#endif -#if defined(__gl_ATI_h_) -#error glATI.h included before glew.h -#endif - -#define __gl_h_ -#define __gl2_h_ -#define __GL_H__ -#define _GL_H -#define __gltypes_h_ -#define __REGAL_H__ -#define __X_GL_H -#define __glext_h_ -#define __GLEXT_H_ -#define __gl_ATI_h_ - -#if defined(_WIN32) - -/* - * GLEW does not include to avoid name space pollution. - * GL needs GLAPI and GLAPIENTRY, GLU needs APIENTRY, CALLBACK, and wchar_t - * defined properly. - */ -/* and */ -#ifdef APIENTRY -# ifndef GLAPIENTRY -# define GLAPIENTRY APIENTRY -# endif -# ifndef GLEWAPIENTRY -# define GLEWAPIENTRY APIENTRY -# endif -#else -#define GLEW_APIENTRY_DEFINED -# if defined(__MINGW32__) || defined(__CYGWIN__) || (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) -# define APIENTRY __stdcall -# ifndef GLAPIENTRY -# define GLAPIENTRY __stdcall -# endif -# ifndef GLEWAPIENTRY -# define GLEWAPIENTRY __stdcall -# endif -# else -# define APIENTRY -# endif -#endif -#ifndef GLAPI -# if defined(__MINGW32__) || defined(__CYGWIN__) -# define GLAPI extern -# endif -#endif -/* */ -#ifndef CALLBACK -#define GLEW_CALLBACK_DEFINED -# if defined(__MINGW32__) || defined(__CYGWIN__) -# define CALLBACK __attribute__ ((__stdcall__)) -# elif (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) -# define CALLBACK __stdcall -# else -# define CALLBACK -# endif -#endif -/* and */ -#ifndef WINGDIAPI -#define GLEW_WINGDIAPI_DEFINED -#define WINGDIAPI __declspec(dllimport) -#endif -/* */ -#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(_WCHAR_T_DEFINED) -typedef unsigned short wchar_t; -# define _WCHAR_T_DEFINED -#endif -/* */ -#if !defined(_W64) -# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && defined(_MSC_VER) && _MSC_VER >= 1300 -# define _W64 __w64 -# else -# define _W64 -# endif -#endif -#if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_) && !defined(__MINGW64__) -# ifdef _WIN64 -typedef __int64 ptrdiff_t; -# else -typedef _W64 int ptrdiff_t; -# endif -# define _PTRDIFF_T_DEFINED -# define _PTRDIFF_T_ -#endif - -#ifndef GLAPI -# if defined(__MINGW32__) || defined(__CYGWIN__) -# define GLAPI extern -# else -# define GLAPI WINGDIAPI -# endif -#endif - -/* - * GLEW_STATIC is defined for static library. - * GLEW_BUILD is defined for building the DLL library. - */ - -#ifdef GLEW_STATIC -# define GLEWAPI extern -#else -# ifdef GLEW_BUILD -# define GLEWAPI extern __declspec(dllexport) -# else -# define GLEWAPI extern __declspec(dllimport) -# endif -#endif - -#else /* _UNIX */ - -/* - * Needed for ptrdiff_t in turn needed by VBO. This is defined by ISO - * C. On my system, this amounts to _3 lines_ of included code, all of - * them pretty much harmless. If you know of a way of detecting 32 vs - * 64 _targets_ at compile time you are free to replace this with - * something that's portable. For now, _this_ is the portable solution. - * (mem, 2004-01-04) - */ - -#include - -/* SGI MIPSPro doesn't like stdint.h in C++ mode */ -/* ID: 3376260 Solaris 9 has inttypes.h, but not stdint.h */ - -#if (defined(__sgi) || defined(__sun)) && !defined(__GNUC__) -#include -#else -#include -#endif - -#define GLEW_APIENTRY_DEFINED -#define APIENTRY - -/* - * GLEW_STATIC is defined for static library. - */ - -#ifdef GLEW_STATIC -# define GLEWAPI extern -#else -# if defined(__GNUC__) && __GNUC__>=4 -# define GLEWAPI extern __attribute__ ((visibility("default"))) -# elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) -# define GLEWAPI extern __global -# else -# define GLEWAPI extern -# endif -#endif - -/* */ -#ifndef GLAPI -#define GLAPI extern -#endif - -#endif /* _WIN32 */ - -#ifndef GLAPIENTRY -#define GLAPIENTRY -#endif - -#ifndef GLEWAPIENTRY -#define GLEWAPIENTRY -#endif - -#define GLEW_VAR_EXPORT GLEWAPI -#define GLEW_FUN_EXPORT GLEWAPI - -#ifdef __cplusplus -extern "C" { -#endif - -/* ----------------------------- GL_VERSION_1_1 ---------------------------- */ - -#ifndef GL_VERSION_1_1 -#define GL_VERSION_1_1 1 - -typedef unsigned int GLenum; -typedef unsigned int GLbitfield; -typedef unsigned int GLuint; -typedef int GLint; -typedef int GLsizei; -typedef unsigned char GLboolean; -typedef signed char GLbyte; -typedef short GLshort; -typedef unsigned char GLubyte; -typedef unsigned short GLushort; -typedef unsigned long GLulong; -typedef float GLfloat; -typedef float GLclampf; -typedef double GLdouble; -typedef double GLclampd; -typedef void GLvoid; -#if defined(_MSC_VER) && _MSC_VER < 1400 -typedef __int64 GLint64EXT; -typedef unsigned __int64 GLuint64EXT; -#elif defined(_MSC_VER) || defined(__BORLANDC__) -typedef signed long long GLint64EXT; -typedef unsigned long long GLuint64EXT; -#else -# if defined(__MINGW32__) || defined(__CYGWIN__) -#include -# endif -typedef int64_t GLint64EXT; -typedef uint64_t GLuint64EXT; -#endif -typedef GLint64EXT GLint64; -typedef GLuint64EXT GLuint64; -typedef struct __GLsync *GLsync; - -typedef char GLchar; - -#define GL_ZERO 0 -#define GL_FALSE 0 -#define GL_LOGIC_OP 0x0BF1 -#define GL_NONE 0 -#define GL_TEXTURE_COMPONENTS 0x1003 -#define GL_NO_ERROR 0 -#define GL_POINTS 0x0000 -#define GL_CURRENT_BIT 0x00000001 -#define GL_TRUE 1 -#define GL_ONE 1 -#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 -#define GL_LINES 0x0001 -#define GL_LINE_LOOP 0x0002 -#define GL_POINT_BIT 0x00000002 -#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 -#define GL_LINE_STRIP 0x0003 -#define GL_LINE_BIT 0x00000004 -#define GL_TRIANGLES 0x0004 -#define GL_TRIANGLE_STRIP 0x0005 -#define GL_TRIANGLE_FAN 0x0006 -#define GL_QUADS 0x0007 -#define GL_QUAD_STRIP 0x0008 -#define GL_POLYGON_BIT 0x00000008 -#define GL_POLYGON 0x0009 -#define GL_POLYGON_STIPPLE_BIT 0x00000010 -#define GL_PIXEL_MODE_BIT 0x00000020 -#define GL_LIGHTING_BIT 0x00000040 -#define GL_FOG_BIT 0x00000080 -#define GL_DEPTH_BUFFER_BIT 0x00000100 -#define GL_ACCUM 0x0100 -#define GL_LOAD 0x0101 -#define GL_RETURN 0x0102 -#define GL_MULT 0x0103 -#define GL_ADD 0x0104 -#define GL_NEVER 0x0200 -#define GL_ACCUM_BUFFER_BIT 0x00000200 -#define GL_LESS 0x0201 -#define GL_EQUAL 0x0202 -#define GL_LEQUAL 0x0203 -#define GL_GREATER 0x0204 -#define GL_NOTEQUAL 0x0205 -#define GL_GEQUAL 0x0206 -#define GL_ALWAYS 0x0207 -#define GL_SRC_COLOR 0x0300 -#define GL_ONE_MINUS_SRC_COLOR 0x0301 -#define GL_SRC_ALPHA 0x0302 -#define GL_ONE_MINUS_SRC_ALPHA 0x0303 -#define GL_DST_ALPHA 0x0304 -#define GL_ONE_MINUS_DST_ALPHA 0x0305 -#define GL_DST_COLOR 0x0306 -#define GL_ONE_MINUS_DST_COLOR 0x0307 -#define GL_SRC_ALPHA_SATURATE 0x0308 -#define GL_STENCIL_BUFFER_BIT 0x00000400 -#define GL_FRONT_LEFT 0x0400 -#define GL_FRONT_RIGHT 0x0401 -#define GL_BACK_LEFT 0x0402 -#define GL_BACK_RIGHT 0x0403 -#define GL_FRONT 0x0404 -#define GL_BACK 0x0405 -#define GL_LEFT 0x0406 -#define GL_RIGHT 0x0407 -#define GL_FRONT_AND_BACK 0x0408 -#define GL_AUX0 0x0409 -#define GL_AUX1 0x040A -#define GL_AUX2 0x040B -#define GL_AUX3 0x040C -#define GL_INVALID_ENUM 0x0500 -#define GL_INVALID_VALUE 0x0501 -#define GL_INVALID_OPERATION 0x0502 -#define GL_STACK_OVERFLOW 0x0503 -#define GL_STACK_UNDERFLOW 0x0504 -#define GL_OUT_OF_MEMORY 0x0505 -#define GL_2D 0x0600 -#define GL_3D 0x0601 -#define GL_3D_COLOR 0x0602 -#define GL_3D_COLOR_TEXTURE 0x0603 -#define GL_4D_COLOR_TEXTURE 0x0604 -#define GL_PASS_THROUGH_TOKEN 0x0700 -#define GL_POINT_TOKEN 0x0701 -#define GL_LINE_TOKEN 0x0702 -#define GL_POLYGON_TOKEN 0x0703 -#define GL_BITMAP_TOKEN 0x0704 -#define GL_DRAW_PIXEL_TOKEN 0x0705 -#define GL_COPY_PIXEL_TOKEN 0x0706 -#define GL_LINE_RESET_TOKEN 0x0707 -#define GL_EXP 0x0800 -#define GL_VIEWPORT_BIT 0x00000800 -#define GL_EXP2 0x0801 -#define GL_CW 0x0900 -#define GL_CCW 0x0901 -#define GL_COEFF 0x0A00 -#define GL_ORDER 0x0A01 -#define GL_DOMAIN 0x0A02 -#define GL_CURRENT_COLOR 0x0B00 -#define GL_CURRENT_INDEX 0x0B01 -#define GL_CURRENT_NORMAL 0x0B02 -#define GL_CURRENT_TEXTURE_COORDS 0x0B03 -#define GL_CURRENT_RASTER_COLOR 0x0B04 -#define GL_CURRENT_RASTER_INDEX 0x0B05 -#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 -#define GL_CURRENT_RASTER_POSITION 0x0B07 -#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 -#define GL_CURRENT_RASTER_DISTANCE 0x0B09 -#define GL_POINT_SMOOTH 0x0B10 -#define GL_POINT_SIZE 0x0B11 -#define GL_POINT_SIZE_RANGE 0x0B12 -#define GL_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_LINE_SMOOTH 0x0B20 -#define GL_LINE_WIDTH 0x0B21 -#define GL_LINE_WIDTH_RANGE 0x0B22 -#define GL_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_LINE_STIPPLE 0x0B24 -#define GL_LINE_STIPPLE_PATTERN 0x0B25 -#define GL_LINE_STIPPLE_REPEAT 0x0B26 -#define GL_LIST_MODE 0x0B30 -#define GL_MAX_LIST_NESTING 0x0B31 -#define GL_LIST_BASE 0x0B32 -#define GL_LIST_INDEX 0x0B33 -#define GL_POLYGON_MODE 0x0B40 -#define GL_POLYGON_SMOOTH 0x0B41 -#define GL_POLYGON_STIPPLE 0x0B42 -#define GL_EDGE_FLAG 0x0B43 -#define GL_CULL_FACE 0x0B44 -#define GL_CULL_FACE_MODE 0x0B45 -#define GL_FRONT_FACE 0x0B46 -#define GL_LIGHTING 0x0B50 -#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 -#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 -#define GL_LIGHT_MODEL_AMBIENT 0x0B53 -#define GL_SHADE_MODEL 0x0B54 -#define GL_COLOR_MATERIAL_FACE 0x0B55 -#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 -#define GL_COLOR_MATERIAL 0x0B57 -#define GL_FOG 0x0B60 -#define GL_FOG_INDEX 0x0B61 -#define GL_FOG_DENSITY 0x0B62 -#define GL_FOG_START 0x0B63 -#define GL_FOG_END 0x0B64 -#define GL_FOG_MODE 0x0B65 -#define GL_FOG_COLOR 0x0B66 -#define GL_DEPTH_RANGE 0x0B70 -#define GL_DEPTH_TEST 0x0B71 -#define GL_DEPTH_WRITEMASK 0x0B72 -#define GL_DEPTH_CLEAR_VALUE 0x0B73 -#define GL_DEPTH_FUNC 0x0B74 -#define GL_ACCUM_CLEAR_VALUE 0x0B80 -#define GL_STENCIL_TEST 0x0B90 -#define GL_STENCIL_CLEAR_VALUE 0x0B91 -#define GL_STENCIL_FUNC 0x0B92 -#define GL_STENCIL_VALUE_MASK 0x0B93 -#define GL_STENCIL_FAIL 0x0B94 -#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 -#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 -#define GL_STENCIL_REF 0x0B97 -#define GL_STENCIL_WRITEMASK 0x0B98 -#define GL_MATRIX_MODE 0x0BA0 -#define GL_NORMALIZE 0x0BA1 -#define GL_VIEWPORT 0x0BA2 -#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 -#define GL_PROJECTION_STACK_DEPTH 0x0BA4 -#define GL_TEXTURE_STACK_DEPTH 0x0BA5 -#define GL_MODELVIEW_MATRIX 0x0BA6 -#define GL_PROJECTION_MATRIX 0x0BA7 -#define GL_TEXTURE_MATRIX 0x0BA8 -#define GL_ATTRIB_STACK_DEPTH 0x0BB0 -#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 -#define GL_ALPHA_TEST 0x0BC0 -#define GL_ALPHA_TEST_FUNC 0x0BC1 -#define GL_ALPHA_TEST_REF 0x0BC2 -#define GL_DITHER 0x0BD0 -#define GL_BLEND_DST 0x0BE0 -#define GL_BLEND_SRC 0x0BE1 -#define GL_BLEND 0x0BE2 -#define GL_LOGIC_OP_MODE 0x0BF0 -#define GL_INDEX_LOGIC_OP 0x0BF1 -#define GL_COLOR_LOGIC_OP 0x0BF2 -#define GL_AUX_BUFFERS 0x0C00 -#define GL_DRAW_BUFFER 0x0C01 -#define GL_READ_BUFFER 0x0C02 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_INDEX_CLEAR_VALUE 0x0C20 -#define GL_INDEX_WRITEMASK 0x0C21 -#define GL_COLOR_CLEAR_VALUE 0x0C22 -#define GL_COLOR_WRITEMASK 0x0C23 -#define GL_INDEX_MODE 0x0C30 -#define GL_RGBA_MODE 0x0C31 -#define GL_DOUBLEBUFFER 0x0C32 -#define GL_STEREO 0x0C33 -#define GL_RENDER_MODE 0x0C40 -#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 -#define GL_POINT_SMOOTH_HINT 0x0C51 -#define GL_LINE_SMOOTH_HINT 0x0C52 -#define GL_POLYGON_SMOOTH_HINT 0x0C53 -#define GL_FOG_HINT 0x0C54 -#define GL_TEXTURE_GEN_S 0x0C60 -#define GL_TEXTURE_GEN_T 0x0C61 -#define GL_TEXTURE_GEN_R 0x0C62 -#define GL_TEXTURE_GEN_Q 0x0C63 -#define GL_PIXEL_MAP_I_TO_I 0x0C70 -#define GL_PIXEL_MAP_S_TO_S 0x0C71 -#define GL_PIXEL_MAP_I_TO_R 0x0C72 -#define GL_PIXEL_MAP_I_TO_G 0x0C73 -#define GL_PIXEL_MAP_I_TO_B 0x0C74 -#define GL_PIXEL_MAP_I_TO_A 0x0C75 -#define GL_PIXEL_MAP_R_TO_R 0x0C76 -#define GL_PIXEL_MAP_G_TO_G 0x0C77 -#define GL_PIXEL_MAP_B_TO_B 0x0C78 -#define GL_PIXEL_MAP_A_TO_A 0x0C79 -#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 -#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 -#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 -#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 -#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 -#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 -#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 -#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 -#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 -#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 -#define GL_UNPACK_SWAP_BYTES 0x0CF0 -#define GL_UNPACK_LSB_FIRST 0x0CF1 -#define GL_UNPACK_ROW_LENGTH 0x0CF2 -#define GL_UNPACK_SKIP_ROWS 0x0CF3 -#define GL_UNPACK_SKIP_PIXELS 0x0CF4 -#define GL_UNPACK_ALIGNMENT 0x0CF5 -#define GL_PACK_SWAP_BYTES 0x0D00 -#define GL_PACK_LSB_FIRST 0x0D01 -#define GL_PACK_ROW_LENGTH 0x0D02 -#define GL_PACK_SKIP_ROWS 0x0D03 -#define GL_PACK_SKIP_PIXELS 0x0D04 -#define GL_PACK_ALIGNMENT 0x0D05 -#define GL_MAP_COLOR 0x0D10 -#define GL_MAP_STENCIL 0x0D11 -#define GL_INDEX_SHIFT 0x0D12 -#define GL_INDEX_OFFSET 0x0D13 -#define GL_RED_SCALE 0x0D14 -#define GL_RED_BIAS 0x0D15 -#define GL_ZOOM_X 0x0D16 -#define GL_ZOOM_Y 0x0D17 -#define GL_GREEN_SCALE 0x0D18 -#define GL_GREEN_BIAS 0x0D19 -#define GL_BLUE_SCALE 0x0D1A -#define GL_BLUE_BIAS 0x0D1B -#define GL_ALPHA_SCALE 0x0D1C -#define GL_ALPHA_BIAS 0x0D1D -#define GL_DEPTH_SCALE 0x0D1E -#define GL_DEPTH_BIAS 0x0D1F -#define GL_MAX_EVAL_ORDER 0x0D30 -#define GL_MAX_LIGHTS 0x0D31 -#define GL_MAX_CLIP_PLANES 0x0D32 -#define GL_MAX_TEXTURE_SIZE 0x0D33 -#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 -#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 -#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 -#define GL_MAX_NAME_STACK_DEPTH 0x0D37 -#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 -#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 -#define GL_MAX_VIEWPORT_DIMS 0x0D3A -#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B -#define GL_SUBPIXEL_BITS 0x0D50 -#define GL_INDEX_BITS 0x0D51 -#define GL_RED_BITS 0x0D52 -#define GL_GREEN_BITS 0x0D53 -#define GL_BLUE_BITS 0x0D54 -#define GL_ALPHA_BITS 0x0D55 -#define GL_DEPTH_BITS 0x0D56 -#define GL_STENCIL_BITS 0x0D57 -#define GL_ACCUM_RED_BITS 0x0D58 -#define GL_ACCUM_GREEN_BITS 0x0D59 -#define GL_ACCUM_BLUE_BITS 0x0D5A -#define GL_ACCUM_ALPHA_BITS 0x0D5B -#define GL_NAME_STACK_DEPTH 0x0D70 -#define GL_AUTO_NORMAL 0x0D80 -#define GL_MAP1_COLOR_4 0x0D90 -#define GL_MAP1_INDEX 0x0D91 -#define GL_MAP1_NORMAL 0x0D92 -#define GL_MAP1_TEXTURE_COORD_1 0x0D93 -#define GL_MAP1_TEXTURE_COORD_2 0x0D94 -#define GL_MAP1_TEXTURE_COORD_3 0x0D95 -#define GL_MAP1_TEXTURE_COORD_4 0x0D96 -#define GL_MAP1_VERTEX_3 0x0D97 -#define GL_MAP1_VERTEX_4 0x0D98 -#define GL_MAP2_COLOR_4 0x0DB0 -#define GL_MAP2_INDEX 0x0DB1 -#define GL_MAP2_NORMAL 0x0DB2 -#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 -#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 -#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 -#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 -#define GL_MAP2_VERTEX_3 0x0DB7 -#define GL_MAP2_VERTEX_4 0x0DB8 -#define GL_MAP1_GRID_DOMAIN 0x0DD0 -#define GL_MAP1_GRID_SEGMENTS 0x0DD1 -#define GL_MAP2_GRID_DOMAIN 0x0DD2 -#define GL_MAP2_GRID_SEGMENTS 0x0DD3 -#define GL_TEXTURE_1D 0x0DE0 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 -#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 -#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 -#define GL_SELECTION_BUFFER_POINTER 0x0DF3 -#define GL_SELECTION_BUFFER_SIZE 0x0DF4 -#define GL_TEXTURE_WIDTH 0x1000 -#define GL_TRANSFORM_BIT 0x00001000 -#define GL_TEXTURE_HEIGHT 0x1001 -#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 -#define GL_TEXTURE_BORDER_COLOR 0x1004 -#define GL_TEXTURE_BORDER 0x1005 -#define GL_DONT_CARE 0x1100 -#define GL_FASTEST 0x1101 -#define GL_NICEST 0x1102 -#define GL_AMBIENT 0x1200 -#define GL_DIFFUSE 0x1201 -#define GL_SPECULAR 0x1202 -#define GL_POSITION 0x1203 -#define GL_SPOT_DIRECTION 0x1204 -#define GL_SPOT_EXPONENT 0x1205 -#define GL_SPOT_CUTOFF 0x1206 -#define GL_CONSTANT_ATTENUATION 0x1207 -#define GL_LINEAR_ATTENUATION 0x1208 -#define GL_QUADRATIC_ATTENUATION 0x1209 -#define GL_COMPILE 0x1300 -#define GL_COMPILE_AND_EXECUTE 0x1301 -#define GL_BYTE 0x1400 -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_SHORT 0x1402 -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_INT 0x1404 -#define GL_UNSIGNED_INT 0x1405 -#define GL_FLOAT 0x1406 -#define GL_2_BYTES 0x1407 -#define GL_3_BYTES 0x1408 -#define GL_4_BYTES 0x1409 -#define GL_DOUBLE 0x140A -#define GL_CLEAR 0x1500 -#define GL_AND 0x1501 -#define GL_AND_REVERSE 0x1502 -#define GL_COPY 0x1503 -#define GL_AND_INVERTED 0x1504 -#define GL_NOOP 0x1505 -#define GL_XOR 0x1506 -#define GL_OR 0x1507 -#define GL_NOR 0x1508 -#define GL_EQUIV 0x1509 -#define GL_INVERT 0x150A -#define GL_OR_REVERSE 0x150B -#define GL_COPY_INVERTED 0x150C -#define GL_OR_INVERTED 0x150D -#define GL_NAND 0x150E -#define GL_SET 0x150F -#define GL_EMISSION 0x1600 -#define GL_SHININESS 0x1601 -#define GL_AMBIENT_AND_DIFFUSE 0x1602 -#define GL_COLOR_INDEXES 0x1603 -#define GL_MODELVIEW 0x1700 -#define GL_PROJECTION 0x1701 -#define GL_TEXTURE 0x1702 -#define GL_COLOR 0x1800 -#define GL_DEPTH 0x1801 -#define GL_STENCIL 0x1802 -#define GL_COLOR_INDEX 0x1900 -#define GL_STENCIL_INDEX 0x1901 -#define GL_DEPTH_COMPONENT 0x1902 -#define GL_RED 0x1903 -#define GL_GREEN 0x1904 -#define GL_BLUE 0x1905 -#define GL_ALPHA 0x1906 -#define GL_RGB 0x1907 -#define GL_RGBA 0x1908 -#define GL_LUMINANCE 0x1909 -#define GL_LUMINANCE_ALPHA 0x190A -#define GL_BITMAP 0x1A00 -#define GL_POINT 0x1B00 -#define GL_LINE 0x1B01 -#define GL_FILL 0x1B02 -#define GL_RENDER 0x1C00 -#define GL_FEEDBACK 0x1C01 -#define GL_SELECT 0x1C02 -#define GL_FLAT 0x1D00 -#define GL_SMOOTH 0x1D01 -#define GL_KEEP 0x1E00 -#define GL_REPLACE 0x1E01 -#define GL_INCR 0x1E02 -#define GL_DECR 0x1E03 -#define GL_VENDOR 0x1F00 -#define GL_RENDERER 0x1F01 -#define GL_VERSION 0x1F02 -#define GL_EXTENSIONS 0x1F03 -#define GL_S 0x2000 -#define GL_ENABLE_BIT 0x00002000 -#define GL_T 0x2001 -#define GL_R 0x2002 -#define GL_Q 0x2003 -#define GL_MODULATE 0x2100 -#define GL_DECAL 0x2101 -#define GL_TEXTURE_ENV_MODE 0x2200 -#define GL_TEXTURE_ENV_COLOR 0x2201 -#define GL_TEXTURE_ENV 0x2300 -#define GL_EYE_LINEAR 0x2400 -#define GL_OBJECT_LINEAR 0x2401 -#define GL_SPHERE_MAP 0x2402 -#define GL_TEXTURE_GEN_MODE 0x2500 -#define GL_OBJECT_PLANE 0x2501 -#define GL_EYE_PLANE 0x2502 -#define GL_NEAREST 0x2600 -#define GL_LINEAR 0x2601 -#define GL_NEAREST_MIPMAP_NEAREST 0x2700 -#define GL_LINEAR_MIPMAP_NEAREST 0x2701 -#define GL_NEAREST_MIPMAP_LINEAR 0x2702 -#define GL_LINEAR_MIPMAP_LINEAR 0x2703 -#define GL_TEXTURE_MAG_FILTER 0x2800 -#define GL_TEXTURE_MIN_FILTER 0x2801 -#define GL_TEXTURE_WRAP_S 0x2802 -#define GL_TEXTURE_WRAP_T 0x2803 -#define GL_CLAMP 0x2900 -#define GL_REPEAT 0x2901 -#define GL_POLYGON_OFFSET_UNITS 0x2A00 -#define GL_POLYGON_OFFSET_POINT 0x2A01 -#define GL_POLYGON_OFFSET_LINE 0x2A02 -#define GL_R3_G3_B2 0x2A10 -#define GL_V2F 0x2A20 -#define GL_V3F 0x2A21 -#define GL_C4UB_V2F 0x2A22 -#define GL_C4UB_V3F 0x2A23 -#define GL_C3F_V3F 0x2A24 -#define GL_N3F_V3F 0x2A25 -#define GL_C4F_N3F_V3F 0x2A26 -#define GL_T2F_V3F 0x2A27 -#define GL_T4F_V4F 0x2A28 -#define GL_T2F_C4UB_V3F 0x2A29 -#define GL_T2F_C3F_V3F 0x2A2A -#define GL_T2F_N3F_V3F 0x2A2B -#define GL_T2F_C4F_N3F_V3F 0x2A2C -#define GL_T4F_C4F_N3F_V4F 0x2A2D -#define GL_CLIP_PLANE0 0x3000 -#define GL_CLIP_PLANE1 0x3001 -#define GL_CLIP_PLANE2 0x3002 -#define GL_CLIP_PLANE3 0x3003 -#define GL_CLIP_PLANE4 0x3004 -#define GL_CLIP_PLANE5 0x3005 -#define GL_LIGHT0 0x4000 -#define GL_COLOR_BUFFER_BIT 0x00004000 -#define GL_LIGHT1 0x4001 -#define GL_LIGHT2 0x4002 -#define GL_LIGHT3 0x4003 -#define GL_LIGHT4 0x4004 -#define GL_LIGHT5 0x4005 -#define GL_LIGHT6 0x4006 -#define GL_LIGHT7 0x4007 -#define GL_HINT_BIT 0x00008000 -#define GL_POLYGON_OFFSET_FILL 0x8037 -#define GL_POLYGON_OFFSET_FACTOR 0x8038 -#define GL_ALPHA4 0x803B -#define GL_ALPHA8 0x803C -#define GL_ALPHA12 0x803D -#define GL_ALPHA16 0x803E -#define GL_LUMINANCE4 0x803F -#define GL_LUMINANCE8 0x8040 -#define GL_LUMINANCE12 0x8041 -#define GL_LUMINANCE16 0x8042 -#define GL_LUMINANCE4_ALPHA4 0x8043 -#define GL_LUMINANCE6_ALPHA2 0x8044 -#define GL_LUMINANCE8_ALPHA8 0x8045 -#define GL_LUMINANCE12_ALPHA4 0x8046 -#define GL_LUMINANCE12_ALPHA12 0x8047 -#define GL_LUMINANCE16_ALPHA16 0x8048 -#define GL_INTENSITY 0x8049 -#define GL_INTENSITY4 0x804A -#define GL_INTENSITY8 0x804B -#define GL_INTENSITY12 0x804C -#define GL_INTENSITY16 0x804D -#define GL_RGB4 0x804F -#define GL_RGB5 0x8050 -#define GL_RGB8 0x8051 -#define GL_RGB10 0x8052 -#define GL_RGB12 0x8053 -#define GL_RGB16 0x8054 -#define GL_RGBA2 0x8055 -#define GL_RGBA4 0x8056 -#define GL_RGB5_A1 0x8057 -#define GL_RGBA8 0x8058 -#define GL_RGB10_A2 0x8059 -#define GL_RGBA12 0x805A -#define GL_RGBA16 0x805B -#define GL_TEXTURE_RED_SIZE 0x805C -#define GL_TEXTURE_GREEN_SIZE 0x805D -#define GL_TEXTURE_BLUE_SIZE 0x805E -#define GL_TEXTURE_ALPHA_SIZE 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE 0x8061 -#define GL_PROXY_TEXTURE_1D 0x8063 -#define GL_PROXY_TEXTURE_2D 0x8064 -#define GL_TEXTURE_PRIORITY 0x8066 -#define GL_TEXTURE_RESIDENT 0x8067 -#define GL_TEXTURE_BINDING_1D 0x8068 -#define GL_TEXTURE_BINDING_2D 0x8069 -#define GL_VERTEX_ARRAY 0x8074 -#define GL_NORMAL_ARRAY 0x8075 -#define GL_COLOR_ARRAY 0x8076 -#define GL_INDEX_ARRAY 0x8077 -#define GL_TEXTURE_COORD_ARRAY 0x8078 -#define GL_EDGE_FLAG_ARRAY 0x8079 -#define GL_VERTEX_ARRAY_SIZE 0x807A -#define GL_VERTEX_ARRAY_TYPE 0x807B -#define GL_VERTEX_ARRAY_STRIDE 0x807C -#define GL_NORMAL_ARRAY_TYPE 0x807E -#define GL_NORMAL_ARRAY_STRIDE 0x807F -#define GL_COLOR_ARRAY_SIZE 0x8081 -#define GL_COLOR_ARRAY_TYPE 0x8082 -#define GL_COLOR_ARRAY_STRIDE 0x8083 -#define GL_INDEX_ARRAY_TYPE 0x8085 -#define GL_INDEX_ARRAY_STRIDE 0x8086 -#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A -#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C -#define GL_VERTEX_ARRAY_POINTER 0x808E -#define GL_NORMAL_ARRAY_POINTER 0x808F -#define GL_COLOR_ARRAY_POINTER 0x8090 -#define GL_INDEX_ARRAY_POINTER 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_EVAL_BIT 0x00010000 -#define GL_LIST_BIT 0x00020000 -#define GL_TEXTURE_BIT 0x00040000 -#define GL_SCISSOR_BIT 0x00080000 -#define GL_ALL_ATTRIB_BITS 0x000fffff -#define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff - -GLAPI void GLAPIENTRY glAccum (GLenum op, GLfloat value); -GLAPI void GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref); -GLAPI GLboolean GLAPIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences); -GLAPI void GLAPIENTRY glArrayElement (GLint i); -GLAPI void GLAPIENTRY glBegin (GLenum mode); -GLAPI void GLAPIENTRY glBindTexture (GLenum target, GLuint texture); -GLAPI void GLAPIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); -GLAPI void GLAPIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); -GLAPI void GLAPIENTRY glCallList (GLuint list); -GLAPI void GLAPIENTRY glCallLists (GLsizei n, GLenum type, const void *lists); -GLAPI void GLAPIENTRY glClear (GLbitfield mask); -GLAPI void GLAPIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -GLAPI void GLAPIENTRY glClearDepth (GLclampd depth); -GLAPI void GLAPIENTRY glClearIndex (GLfloat c); -GLAPI void GLAPIENTRY glClearStencil (GLint s); -GLAPI void GLAPIENTRY glClipPlane (GLenum plane, const GLdouble *equation); -GLAPI void GLAPIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue); -GLAPI void GLAPIENTRY glColor3bv (const GLbyte *v); -GLAPI void GLAPIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue); -GLAPI void GLAPIENTRY glColor3dv (const GLdouble *v); -GLAPI void GLAPIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue); -GLAPI void GLAPIENTRY glColor3fv (const GLfloat *v); -GLAPI void GLAPIENTRY glColor3i (GLint red, GLint green, GLint blue); -GLAPI void GLAPIENTRY glColor3iv (const GLint *v); -GLAPI void GLAPIENTRY glColor3s (GLshort red, GLshort green, GLshort blue); -GLAPI void GLAPIENTRY glColor3sv (const GLshort *v); -GLAPI void GLAPIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue); -GLAPI void GLAPIENTRY glColor3ubv (const GLubyte *v); -GLAPI void GLAPIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue); -GLAPI void GLAPIENTRY glColor3uiv (const GLuint *v); -GLAPI void GLAPIENTRY glColor3us (GLushort red, GLushort green, GLushort blue); -GLAPI void GLAPIENTRY glColor3usv (const GLushort *v); -GLAPI void GLAPIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); -GLAPI void GLAPIENTRY glColor4bv (const GLbyte *v); -GLAPI void GLAPIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); -GLAPI void GLAPIENTRY glColor4dv (const GLdouble *v); -GLAPI void GLAPIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GLAPI void GLAPIENTRY glColor4fv (const GLfloat *v); -GLAPI void GLAPIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha); -GLAPI void GLAPIENTRY glColor4iv (const GLint *v); -GLAPI void GLAPIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha); -GLAPI void GLAPIENTRY glColor4sv (const GLshort *v); -GLAPI void GLAPIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); -GLAPI void GLAPIENTRY glColor4ubv (const GLubyte *v); -GLAPI void GLAPIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha); -GLAPI void GLAPIENTRY glColor4uiv (const GLuint *v); -GLAPI void GLAPIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha); -GLAPI void GLAPIENTRY glColor4usv (const GLushort *v); -GLAPI void GLAPIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -GLAPI void GLAPIENTRY glColorMaterial (GLenum face, GLenum mode); -GLAPI void GLAPIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI void GLAPIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); -GLAPI void GLAPIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI void GLAPIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI void GLAPIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void GLAPIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void GLAPIENTRY glCullFace (GLenum mode); -GLAPI void GLAPIENTRY glDeleteLists (GLuint list, GLsizei range); -GLAPI void GLAPIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); -GLAPI void GLAPIENTRY glDepthFunc (GLenum func); -GLAPI void GLAPIENTRY glDepthMask (GLboolean flag); -GLAPI void GLAPIENTRY glDepthRange (GLclampd zNear, GLclampd zFar); -GLAPI void GLAPIENTRY glDisable (GLenum cap); -GLAPI void GLAPIENTRY glDisableClientState (GLenum array); -GLAPI void GLAPIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); -GLAPI void GLAPIENTRY glDrawBuffer (GLenum mode); -GLAPI void GLAPIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices); -GLAPI void GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -GLAPI void GLAPIENTRY glEdgeFlag (GLboolean flag); -GLAPI void GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const void *pointer); -GLAPI void GLAPIENTRY glEdgeFlagv (const GLboolean *flag); -GLAPI void GLAPIENTRY glEnable (GLenum cap); -GLAPI void GLAPIENTRY glEnableClientState (GLenum array); -GLAPI void GLAPIENTRY glEnd (void); -GLAPI void GLAPIENTRY glEndList (void); -GLAPI void GLAPIENTRY glEvalCoord1d (GLdouble u); -GLAPI void GLAPIENTRY glEvalCoord1dv (const GLdouble *u); -GLAPI void GLAPIENTRY glEvalCoord1f (GLfloat u); -GLAPI void GLAPIENTRY glEvalCoord1fv (const GLfloat *u); -GLAPI void GLAPIENTRY glEvalCoord2d (GLdouble u, GLdouble v); -GLAPI void GLAPIENTRY glEvalCoord2dv (const GLdouble *u); -GLAPI void GLAPIENTRY glEvalCoord2f (GLfloat u, GLfloat v); -GLAPI void GLAPIENTRY glEvalCoord2fv (const GLfloat *u); -GLAPI void GLAPIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2); -GLAPI void GLAPIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); -GLAPI void GLAPIENTRY glEvalPoint1 (GLint i); -GLAPI void GLAPIENTRY glEvalPoint2 (GLint i, GLint j); -GLAPI void GLAPIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer); -GLAPI void GLAPIENTRY glFinish (void); -GLAPI void GLAPIENTRY glFlush (void); -GLAPI void GLAPIENTRY glFogf (GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glFogfv (GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glFogi (GLenum pname, GLint param); -GLAPI void GLAPIENTRY glFogiv (GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glFrontFace (GLenum mode); -GLAPI void GLAPIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLAPI GLuint GLAPIENTRY glGenLists (GLsizei range); -GLAPI void GLAPIENTRY glGenTextures (GLsizei n, GLuint *textures); -GLAPI void GLAPIENTRY glGetBooleanv (GLenum pname, GLboolean *params); -GLAPI void GLAPIENTRY glGetClipPlane (GLenum plane, GLdouble *equation); -GLAPI void GLAPIENTRY glGetDoublev (GLenum pname, GLdouble *params); -GLAPI GLenum GLAPIENTRY glGetError (void); -GLAPI void GLAPIENTRY glGetFloatv (GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetIntegerv (GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v); -GLAPI void GLAPIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v); -GLAPI void GLAPIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v); -GLAPI void GLAPIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetPixelMapfv (GLenum map, GLfloat *values); -GLAPI void GLAPIENTRY glGetPixelMapuiv (GLenum map, GLuint *values); -GLAPI void GLAPIENTRY glGetPixelMapusv (GLenum map, GLushort *values); -GLAPI void GLAPIENTRY glGetPointerv (GLenum pname, void* *params); -GLAPI void GLAPIENTRY glGetPolygonStipple (GLubyte *mask); -GLAPI const GLubyte * GLAPIENTRY glGetString (GLenum name); -GLAPI void GLAPIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params); -GLAPI void GLAPIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -GLAPI void GLAPIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void GLAPIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void GLAPIENTRY glHint (GLenum target, GLenum mode); -GLAPI void GLAPIENTRY glIndexMask (GLuint mask); -GLAPI void GLAPIENTRY glIndexPointer (GLenum type, GLsizei stride, const void *pointer); -GLAPI void GLAPIENTRY glIndexd (GLdouble c); -GLAPI void GLAPIENTRY glIndexdv (const GLdouble *c); -GLAPI void GLAPIENTRY glIndexf (GLfloat c); -GLAPI void GLAPIENTRY glIndexfv (const GLfloat *c); -GLAPI void GLAPIENTRY glIndexi (GLint c); -GLAPI void GLAPIENTRY glIndexiv (const GLint *c); -GLAPI void GLAPIENTRY glIndexs (GLshort c); -GLAPI void GLAPIENTRY glIndexsv (const GLshort *c); -GLAPI void GLAPIENTRY glIndexub (GLubyte c); -GLAPI void GLAPIENTRY glIndexubv (const GLubyte *c); -GLAPI void GLAPIENTRY glInitNames (void); -GLAPI void GLAPIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const void *pointer); -GLAPI GLboolean GLAPIENTRY glIsEnabled (GLenum cap); -GLAPI GLboolean GLAPIENTRY glIsList (GLuint list); -GLAPI GLboolean GLAPIENTRY glIsTexture (GLuint texture); -GLAPI void GLAPIENTRY glLightModelf (GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glLightModelfv (GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glLightModeli (GLenum pname, GLint param); -GLAPI void GLAPIENTRY glLightModeliv (GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glLightf (GLenum light, GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glLighti (GLenum light, GLenum pname, GLint param); -GLAPI void GLAPIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glLineStipple (GLint factor, GLushort pattern); -GLAPI void GLAPIENTRY glLineWidth (GLfloat width); -GLAPI void GLAPIENTRY glListBase (GLuint base); -GLAPI void GLAPIENTRY glLoadIdentity (void); -GLAPI void GLAPIENTRY glLoadMatrixd (const GLdouble *m); -GLAPI void GLAPIENTRY glLoadMatrixf (const GLfloat *m); -GLAPI void GLAPIENTRY glLoadName (GLuint name); -GLAPI void GLAPIENTRY glLogicOp (GLenum opcode); -GLAPI void GLAPIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -GLAPI void GLAPIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -GLAPI void GLAPIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -GLAPI void GLAPIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -GLAPI void GLAPIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2); -GLAPI void GLAPIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2); -GLAPI void GLAPIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); -GLAPI void GLAPIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); -GLAPI void GLAPIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glMateriali (GLenum face, GLenum pname, GLint param); -GLAPI void GLAPIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glMatrixMode (GLenum mode); -GLAPI void GLAPIENTRY glMultMatrixd (const GLdouble *m); -GLAPI void GLAPIENTRY glMultMatrixf (const GLfloat *m); -GLAPI void GLAPIENTRY glNewList (GLuint list, GLenum mode); -GLAPI void GLAPIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz); -GLAPI void GLAPIENTRY glNormal3bv (const GLbyte *v); -GLAPI void GLAPIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz); -GLAPI void GLAPIENTRY glNormal3dv (const GLdouble *v); -GLAPI void GLAPIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); -GLAPI void GLAPIENTRY glNormal3fv (const GLfloat *v); -GLAPI void GLAPIENTRY glNormal3i (GLint nx, GLint ny, GLint nz); -GLAPI void GLAPIENTRY glNormal3iv (const GLint *v); -GLAPI void GLAPIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz); -GLAPI void GLAPIENTRY glNormal3sv (const GLshort *v); -GLAPI void GLAPIENTRY glNormalPointer (GLenum type, GLsizei stride, const void *pointer); -GLAPI void GLAPIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLAPI void GLAPIENTRY glPassThrough (GLfloat token); -GLAPI void GLAPIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values); -GLAPI void GLAPIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values); -GLAPI void GLAPIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values); -GLAPI void GLAPIENTRY glPixelStoref (GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glPixelStorei (GLenum pname, GLint param); -GLAPI void GLAPIENTRY glPixelTransferf (GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glPixelTransferi (GLenum pname, GLint param); -GLAPI void GLAPIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor); -GLAPI void GLAPIENTRY glPointSize (GLfloat size); -GLAPI void GLAPIENTRY glPolygonMode (GLenum face, GLenum mode); -GLAPI void GLAPIENTRY glPolygonOffset (GLfloat factor, GLfloat units); -GLAPI void GLAPIENTRY glPolygonStipple (const GLubyte *mask); -GLAPI void GLAPIENTRY glPopAttrib (void); -GLAPI void GLAPIENTRY glPopClientAttrib (void); -GLAPI void GLAPIENTRY glPopMatrix (void); -GLAPI void GLAPIENTRY glPopName (void); -GLAPI void GLAPIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities); -GLAPI void GLAPIENTRY glPushAttrib (GLbitfield mask); -GLAPI void GLAPIENTRY glPushClientAttrib (GLbitfield mask); -GLAPI void GLAPIENTRY glPushMatrix (void); -GLAPI void GLAPIENTRY glPushName (GLuint name); -GLAPI void GLAPIENTRY glRasterPos2d (GLdouble x, GLdouble y); -GLAPI void GLAPIENTRY glRasterPos2dv (const GLdouble *v); -GLAPI void GLAPIENTRY glRasterPos2f (GLfloat x, GLfloat y); -GLAPI void GLAPIENTRY glRasterPos2fv (const GLfloat *v); -GLAPI void GLAPIENTRY glRasterPos2i (GLint x, GLint y); -GLAPI void GLAPIENTRY glRasterPos2iv (const GLint *v); -GLAPI void GLAPIENTRY glRasterPos2s (GLshort x, GLshort y); -GLAPI void GLAPIENTRY glRasterPos2sv (const GLshort *v); -GLAPI void GLAPIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z); -GLAPI void GLAPIENTRY glRasterPos3dv (const GLdouble *v); -GLAPI void GLAPIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z); -GLAPI void GLAPIENTRY glRasterPos3fv (const GLfloat *v); -GLAPI void GLAPIENTRY glRasterPos3i (GLint x, GLint y, GLint z); -GLAPI void GLAPIENTRY glRasterPos3iv (const GLint *v); -GLAPI void GLAPIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z); -GLAPI void GLAPIENTRY glRasterPos3sv (const GLshort *v); -GLAPI void GLAPIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void GLAPIENTRY glRasterPos4dv (const GLdouble *v); -GLAPI void GLAPIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void GLAPIENTRY glRasterPos4fv (const GLfloat *v); -GLAPI void GLAPIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w); -GLAPI void GLAPIENTRY glRasterPos4iv (const GLint *v); -GLAPI void GLAPIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void GLAPIENTRY glRasterPos4sv (const GLshort *v); -GLAPI void GLAPIENTRY glReadBuffer (GLenum mode); -GLAPI void GLAPIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); -GLAPI void GLAPIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); -GLAPI void GLAPIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2); -GLAPI void GLAPIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); -GLAPI void GLAPIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2); -GLAPI void GLAPIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2); -GLAPI void GLAPIENTRY glRectiv (const GLint *v1, const GLint *v2); -GLAPI void GLAPIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2); -GLAPI void GLAPIENTRY glRectsv (const GLshort *v1, const GLshort *v2); -GLAPI GLint GLAPIENTRY glRenderMode (GLenum mode); -GLAPI void GLAPIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -GLAPI void GLAPIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -GLAPI void GLAPIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z); -GLAPI void GLAPIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z); -GLAPI void GLAPIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void GLAPIENTRY glSelectBuffer (GLsizei size, GLuint *buffer); -GLAPI void GLAPIENTRY glShadeModel (GLenum mode); -GLAPI void GLAPIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); -GLAPI void GLAPIENTRY glStencilMask (GLuint mask); -GLAPI void GLAPIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); -GLAPI void GLAPIENTRY glTexCoord1d (GLdouble s); -GLAPI void GLAPIENTRY glTexCoord1dv (const GLdouble *v); -GLAPI void GLAPIENTRY glTexCoord1f (GLfloat s); -GLAPI void GLAPIENTRY glTexCoord1fv (const GLfloat *v); -GLAPI void GLAPIENTRY glTexCoord1i (GLint s); -GLAPI void GLAPIENTRY glTexCoord1iv (const GLint *v); -GLAPI void GLAPIENTRY glTexCoord1s (GLshort s); -GLAPI void GLAPIENTRY glTexCoord1sv (const GLshort *v); -GLAPI void GLAPIENTRY glTexCoord2d (GLdouble s, GLdouble t); -GLAPI void GLAPIENTRY glTexCoord2dv (const GLdouble *v); -GLAPI void GLAPIENTRY glTexCoord2f (GLfloat s, GLfloat t); -GLAPI void GLAPIENTRY glTexCoord2fv (const GLfloat *v); -GLAPI void GLAPIENTRY glTexCoord2i (GLint s, GLint t); -GLAPI void GLAPIENTRY glTexCoord2iv (const GLint *v); -GLAPI void GLAPIENTRY glTexCoord2s (GLshort s, GLshort t); -GLAPI void GLAPIENTRY glTexCoord2sv (const GLshort *v); -GLAPI void GLAPIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r); -GLAPI void GLAPIENTRY glTexCoord3dv (const GLdouble *v); -GLAPI void GLAPIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r); -GLAPI void GLAPIENTRY glTexCoord3fv (const GLfloat *v); -GLAPI void GLAPIENTRY glTexCoord3i (GLint s, GLint t, GLint r); -GLAPI void GLAPIENTRY glTexCoord3iv (const GLint *v); -GLAPI void GLAPIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r); -GLAPI void GLAPIENTRY glTexCoord3sv (const GLshort *v); -GLAPI void GLAPIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q); -GLAPI void GLAPIENTRY glTexCoord4dv (const GLdouble *v); -GLAPI void GLAPIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q); -GLAPI void GLAPIENTRY glTexCoord4fv (const GLfloat *v); -GLAPI void GLAPIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q); -GLAPI void GLAPIENTRY glTexCoord4iv (const GLint *v); -GLAPI void GLAPIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q); -GLAPI void GLAPIENTRY glTexCoord4sv (const GLshort *v); -GLAPI void GLAPIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI void GLAPIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param); -GLAPI void GLAPIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param); -GLAPI void GLAPIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params); -GLAPI void GLAPIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param); -GLAPI void GLAPIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void GLAPIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); -GLAPI void GLAPIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void GLAPIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); -GLAPI void GLAPIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); -GLAPI void GLAPIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -GLAPI void GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -GLAPI void GLAPIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z); -GLAPI void GLAPIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z); -GLAPI void GLAPIENTRY glVertex2d (GLdouble x, GLdouble y); -GLAPI void GLAPIENTRY glVertex2dv (const GLdouble *v); -GLAPI void GLAPIENTRY glVertex2f (GLfloat x, GLfloat y); -GLAPI void GLAPIENTRY glVertex2fv (const GLfloat *v); -GLAPI void GLAPIENTRY glVertex2i (GLint x, GLint y); -GLAPI void GLAPIENTRY glVertex2iv (const GLint *v); -GLAPI void GLAPIENTRY glVertex2s (GLshort x, GLshort y); -GLAPI void GLAPIENTRY glVertex2sv (const GLshort *v); -GLAPI void GLAPIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z); -GLAPI void GLAPIENTRY glVertex3dv (const GLdouble *v); -GLAPI void GLAPIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z); -GLAPI void GLAPIENTRY glVertex3fv (const GLfloat *v); -GLAPI void GLAPIENTRY glVertex3i (GLint x, GLint y, GLint z); -GLAPI void GLAPIENTRY glVertex3iv (const GLint *v); -GLAPI void GLAPIENTRY glVertex3s (GLshort x, GLshort y, GLshort z); -GLAPI void GLAPIENTRY glVertex3sv (const GLshort *v); -GLAPI void GLAPIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void GLAPIENTRY glVertex4dv (const GLdouble *v); -GLAPI void GLAPIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void GLAPIENTRY glVertex4fv (const GLfloat *v); -GLAPI void GLAPIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w); -GLAPI void GLAPIENTRY glVertex4iv (const GLint *v); -GLAPI void GLAPIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void GLAPIENTRY glVertex4sv (const GLshort *v); -GLAPI void GLAPIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); - -#define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1) - -#endif /* GL_VERSION_1_1 */ - -/* ---------------------------------- GLU ---------------------------------- */ - -#ifndef GLEW_NO_GLU -# ifdef __APPLE__ -# include -# if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) -# define GLEW_NO_GLU -# endif -# endif -#endif - -#ifndef GLEW_NO_GLU -/* this is where we can safely include GLU */ -# if defined(__APPLE__) && defined(__MACH__) -# include -# else -# include -# endif -#endif - -/* ----------------------------- GL_VERSION_1_2 ---------------------------- */ - -#ifndef GL_VERSION_1_2 -#define GL_VERSION_1_2 1 - -#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 -#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 -#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_RESCALE_NORMAL 0x803A -#define GL_TEXTURE_BINDING_3D 0x806A -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_BGR 0x80E0 -#define GL_BGRA 0x80E1 -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 -#define GL_SINGLE_COLOR 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR 0x81FA -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E - -typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); -typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); - -#define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D) -#define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements) -#define glTexImage3D GLEW_GET_FUN(__glewTexImage3D) -#define glTexSubImage3D GLEW_GET_FUN(__glewTexSubImage3D) - -#define GLEW_VERSION_1_2 GLEW_GET_VAR(__GLEW_VERSION_1_2) - -#endif /* GL_VERSION_1_2 */ - -/* ---------------------------- GL_VERSION_1_2_1 --------------------------- */ - -#ifndef GL_VERSION_1_2_1 -#define GL_VERSION_1_2_1 1 - -#define GLEW_VERSION_1_2_1 GLEW_GET_VAR(__GLEW_VERSION_1_2_1) - -#endif /* GL_VERSION_1_2_1 */ - -/* ----------------------------- GL_VERSION_1_3 ---------------------------- */ - -#ifndef GL_VERSION_1_3 -#define GL_VERSION_1_3 1 - -#define GL_MULTISAMPLE 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE 0x809F -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_CLAMP_TO_BORDER 0x812D -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 -#define GL_MAX_TEXTURE_UNITS 0x84E2 -#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 -#define GL_SUBTRACT 0x84E7 -#define GL_COMPRESSED_ALPHA 0x84E9 -#define GL_COMPRESSED_LUMINANCE 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB -#define GL_COMPRESSED_INTENSITY 0x84EC -#define GL_COMPRESSED_RGB 0x84ED -#define GL_COMPRESSED_RGBA 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT 0x84EF -#define GL_NORMAL_MAP 0x8511 -#define GL_REFLECTION_MAP 0x8512 -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_COMBINE 0x8570 -#define GL_COMBINE_RGB 0x8571 -#define GL_COMBINE_ALPHA 0x8572 -#define GL_RGB_SCALE 0x8573 -#define GL_ADD_SIGNED 0x8574 -#define GL_INTERPOLATE 0x8575 -#define GL_CONSTANT 0x8576 -#define GL_PRIMARY_COLOR 0x8577 -#define GL_PREVIOUS 0x8578 -#define GL_SOURCE0_RGB 0x8580 -#define GL_SOURCE1_RGB 0x8581 -#define GL_SOURCE2_RGB 0x8582 -#define GL_SOURCE0_ALPHA 0x8588 -#define GL_SOURCE1_ALPHA 0x8589 -#define GL_SOURCE2_ALPHA 0x858A -#define GL_OPERAND0_RGB 0x8590 -#define GL_OPERAND1_RGB 0x8591 -#define GL_OPERAND2_RGB 0x8592 -#define GL_OPERAND0_ALPHA 0x8598 -#define GL_OPERAND1_ALPHA 0x8599 -#define GL_OPERAND2_ALPHA 0x859A -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 -#define GL_TEXTURE_COMPRESSED 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_DOT3_RGB 0x86AE -#define GL_DOT3_RGBA 0x86AF -#define GL_MULTISAMPLE_BIT 0x20000000 - -typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture); -typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, void *img); -typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); -typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); -typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); -typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); - -#define glActiveTexture GLEW_GET_FUN(__glewActiveTexture) -#define glClientActiveTexture GLEW_GET_FUN(__glewClientActiveTexture) -#define glCompressedTexImage1D GLEW_GET_FUN(__glewCompressedTexImage1D) -#define glCompressedTexImage2D GLEW_GET_FUN(__glewCompressedTexImage2D) -#define glCompressedTexImage3D GLEW_GET_FUN(__glewCompressedTexImage3D) -#define glCompressedTexSubImage1D GLEW_GET_FUN(__glewCompressedTexSubImage1D) -#define glCompressedTexSubImage2D GLEW_GET_FUN(__glewCompressedTexSubImage2D) -#define glCompressedTexSubImage3D GLEW_GET_FUN(__glewCompressedTexSubImage3D) -#define glGetCompressedTexImage GLEW_GET_FUN(__glewGetCompressedTexImage) -#define glLoadTransposeMatrixd GLEW_GET_FUN(__glewLoadTransposeMatrixd) -#define glLoadTransposeMatrixf GLEW_GET_FUN(__glewLoadTransposeMatrixf) -#define glMultTransposeMatrixd GLEW_GET_FUN(__glewMultTransposeMatrixd) -#define glMultTransposeMatrixf GLEW_GET_FUN(__glewMultTransposeMatrixf) -#define glMultiTexCoord1d GLEW_GET_FUN(__glewMultiTexCoord1d) -#define glMultiTexCoord1dv GLEW_GET_FUN(__glewMultiTexCoord1dv) -#define glMultiTexCoord1f GLEW_GET_FUN(__glewMultiTexCoord1f) -#define glMultiTexCoord1fv GLEW_GET_FUN(__glewMultiTexCoord1fv) -#define glMultiTexCoord1i GLEW_GET_FUN(__glewMultiTexCoord1i) -#define glMultiTexCoord1iv GLEW_GET_FUN(__glewMultiTexCoord1iv) -#define glMultiTexCoord1s GLEW_GET_FUN(__glewMultiTexCoord1s) -#define glMultiTexCoord1sv GLEW_GET_FUN(__glewMultiTexCoord1sv) -#define glMultiTexCoord2d GLEW_GET_FUN(__glewMultiTexCoord2d) -#define glMultiTexCoord2dv GLEW_GET_FUN(__glewMultiTexCoord2dv) -#define glMultiTexCoord2f GLEW_GET_FUN(__glewMultiTexCoord2f) -#define glMultiTexCoord2fv GLEW_GET_FUN(__glewMultiTexCoord2fv) -#define glMultiTexCoord2i GLEW_GET_FUN(__glewMultiTexCoord2i) -#define glMultiTexCoord2iv GLEW_GET_FUN(__glewMultiTexCoord2iv) -#define glMultiTexCoord2s GLEW_GET_FUN(__glewMultiTexCoord2s) -#define glMultiTexCoord2sv GLEW_GET_FUN(__glewMultiTexCoord2sv) -#define glMultiTexCoord3d GLEW_GET_FUN(__glewMultiTexCoord3d) -#define glMultiTexCoord3dv GLEW_GET_FUN(__glewMultiTexCoord3dv) -#define glMultiTexCoord3f GLEW_GET_FUN(__glewMultiTexCoord3f) -#define glMultiTexCoord3fv GLEW_GET_FUN(__glewMultiTexCoord3fv) -#define glMultiTexCoord3i GLEW_GET_FUN(__glewMultiTexCoord3i) -#define glMultiTexCoord3iv GLEW_GET_FUN(__glewMultiTexCoord3iv) -#define glMultiTexCoord3s GLEW_GET_FUN(__glewMultiTexCoord3s) -#define glMultiTexCoord3sv GLEW_GET_FUN(__glewMultiTexCoord3sv) -#define glMultiTexCoord4d GLEW_GET_FUN(__glewMultiTexCoord4d) -#define glMultiTexCoord4dv GLEW_GET_FUN(__glewMultiTexCoord4dv) -#define glMultiTexCoord4f GLEW_GET_FUN(__glewMultiTexCoord4f) -#define glMultiTexCoord4fv GLEW_GET_FUN(__glewMultiTexCoord4fv) -#define glMultiTexCoord4i GLEW_GET_FUN(__glewMultiTexCoord4i) -#define glMultiTexCoord4iv GLEW_GET_FUN(__glewMultiTexCoord4iv) -#define glMultiTexCoord4s GLEW_GET_FUN(__glewMultiTexCoord4s) -#define glMultiTexCoord4sv GLEW_GET_FUN(__glewMultiTexCoord4sv) -#define glSampleCoverage GLEW_GET_FUN(__glewSampleCoverage) - -#define GLEW_VERSION_1_3 GLEW_GET_VAR(__GLEW_VERSION_1_3) - -#endif /* GL_VERSION_1_3 */ - -/* ----------------------------- GL_VERSION_1_4 ---------------------------- */ - -#ifndef GL_VERSION_1_4 -#define GL_VERSION_1_4 1 - -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_POINT_SIZE_MIN 0x8126 -#define GL_POINT_SIZE_MAX 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION 0x8129 -#define GL_GENERATE_MIPMAP 0x8191 -#define GL_GENERATE_MIPMAP_HINT 0x8192 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_DEPTH_COMPONENT24 0x81A6 -#define GL_DEPTH_COMPONENT32 0x81A7 -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_FOG_COORDINATE_SOURCE 0x8450 -#define GL_FOG_COORDINATE 0x8451 -#define GL_FRAGMENT_DEPTH 0x8452 -#define GL_CURRENT_FOG_COORDINATE 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 -#define GL_FOG_COORDINATE_ARRAY 0x8457 -#define GL_COLOR_SUM 0x8458 -#define GL_CURRENT_SECONDARY_COLOR 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D -#define GL_SECONDARY_COLOR_ARRAY 0x845E -#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD -#define GL_TEXTURE_FILTER_CONTROL 0x8500 -#define GL_TEXTURE_LOD_BIAS 0x8501 -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 -#define GL_TEXTURE_DEPTH_SIZE 0x884A -#define GL_DEPTH_TEXTURE_MODE 0x884B -#define GL_TEXTURE_COMPARE_MODE 0x884C -#define GL_TEXTURE_COMPARE_FUNC 0x884D -#define GL_COMPARE_R_TO_TEXTURE 0x884E - -typedef void (GLAPIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLFOGCOORDDPROC) (GLdouble coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDDVPROC) (const GLdouble *coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDFPROC) (GLfloat coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const* indices, GLsizei drawcount); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVPROC) (const GLfloat *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVPROC) (const GLint *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVPROC) (const GLshort *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVPROC) (const GLdouble *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVPROC) (const GLfloat *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVPROC) (const GLint *p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p); - -#define glBlendColor GLEW_GET_FUN(__glewBlendColor) -#define glBlendEquation GLEW_GET_FUN(__glewBlendEquation) -#define glBlendFuncSeparate GLEW_GET_FUN(__glewBlendFuncSeparate) -#define glFogCoordPointer GLEW_GET_FUN(__glewFogCoordPointer) -#define glFogCoordd GLEW_GET_FUN(__glewFogCoordd) -#define glFogCoorddv GLEW_GET_FUN(__glewFogCoorddv) -#define glFogCoordf GLEW_GET_FUN(__glewFogCoordf) -#define glFogCoordfv GLEW_GET_FUN(__glewFogCoordfv) -#define glMultiDrawArrays GLEW_GET_FUN(__glewMultiDrawArrays) -#define glMultiDrawElements GLEW_GET_FUN(__glewMultiDrawElements) -#define glPointParameterf GLEW_GET_FUN(__glewPointParameterf) -#define glPointParameterfv GLEW_GET_FUN(__glewPointParameterfv) -#define glPointParameteri GLEW_GET_FUN(__glewPointParameteri) -#define glPointParameteriv GLEW_GET_FUN(__glewPointParameteriv) -#define glSecondaryColor3b GLEW_GET_FUN(__glewSecondaryColor3b) -#define glSecondaryColor3bv GLEW_GET_FUN(__glewSecondaryColor3bv) -#define glSecondaryColor3d GLEW_GET_FUN(__glewSecondaryColor3d) -#define glSecondaryColor3dv GLEW_GET_FUN(__glewSecondaryColor3dv) -#define glSecondaryColor3f GLEW_GET_FUN(__glewSecondaryColor3f) -#define glSecondaryColor3fv GLEW_GET_FUN(__glewSecondaryColor3fv) -#define glSecondaryColor3i GLEW_GET_FUN(__glewSecondaryColor3i) -#define glSecondaryColor3iv GLEW_GET_FUN(__glewSecondaryColor3iv) -#define glSecondaryColor3s GLEW_GET_FUN(__glewSecondaryColor3s) -#define glSecondaryColor3sv GLEW_GET_FUN(__glewSecondaryColor3sv) -#define glSecondaryColor3ub GLEW_GET_FUN(__glewSecondaryColor3ub) -#define glSecondaryColor3ubv GLEW_GET_FUN(__glewSecondaryColor3ubv) -#define glSecondaryColor3ui GLEW_GET_FUN(__glewSecondaryColor3ui) -#define glSecondaryColor3uiv GLEW_GET_FUN(__glewSecondaryColor3uiv) -#define glSecondaryColor3us GLEW_GET_FUN(__glewSecondaryColor3us) -#define glSecondaryColor3usv GLEW_GET_FUN(__glewSecondaryColor3usv) -#define glSecondaryColorPointer GLEW_GET_FUN(__glewSecondaryColorPointer) -#define glWindowPos2d GLEW_GET_FUN(__glewWindowPos2d) -#define glWindowPos2dv GLEW_GET_FUN(__glewWindowPos2dv) -#define glWindowPos2f GLEW_GET_FUN(__glewWindowPos2f) -#define glWindowPos2fv GLEW_GET_FUN(__glewWindowPos2fv) -#define glWindowPos2i GLEW_GET_FUN(__glewWindowPos2i) -#define glWindowPos2iv GLEW_GET_FUN(__glewWindowPos2iv) -#define glWindowPos2s GLEW_GET_FUN(__glewWindowPos2s) -#define glWindowPos2sv GLEW_GET_FUN(__glewWindowPos2sv) -#define glWindowPos3d GLEW_GET_FUN(__glewWindowPos3d) -#define glWindowPos3dv GLEW_GET_FUN(__glewWindowPos3dv) -#define glWindowPos3f GLEW_GET_FUN(__glewWindowPos3f) -#define glWindowPos3fv GLEW_GET_FUN(__glewWindowPos3fv) -#define glWindowPos3i GLEW_GET_FUN(__glewWindowPos3i) -#define glWindowPos3iv GLEW_GET_FUN(__glewWindowPos3iv) -#define glWindowPos3s GLEW_GET_FUN(__glewWindowPos3s) -#define glWindowPos3sv GLEW_GET_FUN(__glewWindowPos3sv) - -#define GLEW_VERSION_1_4 GLEW_GET_VAR(__GLEW_VERSION_1_4) - -#endif /* GL_VERSION_1_4 */ - -/* ----------------------------- GL_VERSION_1_5 ---------------------------- */ - -#ifndef GL_VERSION_1_5 -#define GL_VERSION_1_5 1 - -#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE -#define GL_FOG_COORD GL_FOG_COORDINATE -#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY -#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING -#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER -#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE -#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE -#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE -#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA -#define GL_SRC0_RGB GL_SOURCE0_RGB -#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA -#define GL_SRC1_RGB GL_SOURCE1_RGB -#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA -#define GL_SRC2_RGB GL_SOURCE2_RGB -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_QUERY_COUNTER_BITS 0x8864 -#define GL_CURRENT_QUERY 0x8865 -#define GL_QUERY_RESULT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE 0x8867 -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_READ_ONLY 0x88B8 -#define GL_WRITE_ONLY 0x88B9 -#define GL_READ_WRITE 0x88BA -#define GL_BUFFER_ACCESS 0x88BB -#define GL_BUFFER_MAPPED 0x88BC -#define GL_BUFFER_MAP_POINTER 0x88BD -#define GL_STREAM_DRAW 0x88E0 -#define GL_STREAM_READ 0x88E1 -#define GL_STREAM_COPY 0x88E2 -#define GL_STATIC_DRAW 0x88E4 -#define GL_STATIC_READ 0x88E5 -#define GL_STATIC_COPY 0x88E6 -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_DYNAMIC_READ 0x88E9 -#define GL_DYNAMIC_COPY 0x88EA -#define GL_SAMPLES_PASSED 0x8914 - -typedef ptrdiff_t GLintptr; -typedef ptrdiff_t GLsizeiptr; - -typedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void* data, GLenum usage); -typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void* data); -typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void** params); -typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void* data); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERPROC) (GLuint buffer); -typedef GLboolean (GLAPIENTRY * PFNGLISQUERYPROC) (GLuint id); -typedef void* (GLAPIENTRY * PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); -typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERPROC) (GLenum target); - -#define glBeginQuery GLEW_GET_FUN(__glewBeginQuery) -#define glBindBuffer GLEW_GET_FUN(__glewBindBuffer) -#define glBufferData GLEW_GET_FUN(__glewBufferData) -#define glBufferSubData GLEW_GET_FUN(__glewBufferSubData) -#define glDeleteBuffers GLEW_GET_FUN(__glewDeleteBuffers) -#define glDeleteQueries GLEW_GET_FUN(__glewDeleteQueries) -#define glEndQuery GLEW_GET_FUN(__glewEndQuery) -#define glGenBuffers GLEW_GET_FUN(__glewGenBuffers) -#define glGenQueries GLEW_GET_FUN(__glewGenQueries) -#define glGetBufferParameteriv GLEW_GET_FUN(__glewGetBufferParameteriv) -#define glGetBufferPointerv GLEW_GET_FUN(__glewGetBufferPointerv) -#define glGetBufferSubData GLEW_GET_FUN(__glewGetBufferSubData) -#define glGetQueryObjectiv GLEW_GET_FUN(__glewGetQueryObjectiv) -#define glGetQueryObjectuiv GLEW_GET_FUN(__glewGetQueryObjectuiv) -#define glGetQueryiv GLEW_GET_FUN(__glewGetQueryiv) -#define glIsBuffer GLEW_GET_FUN(__glewIsBuffer) -#define glIsQuery GLEW_GET_FUN(__glewIsQuery) -#define glMapBuffer GLEW_GET_FUN(__glewMapBuffer) -#define glUnmapBuffer GLEW_GET_FUN(__glewUnmapBuffer) - -#define GLEW_VERSION_1_5 GLEW_GET_VAR(__GLEW_VERSION_1_5) - -#endif /* GL_VERSION_1_5 */ - -/* ----------------------------- GL_VERSION_2_0 ---------------------------- */ - -#ifndef GL_VERSION_2_0 -#define GL_VERSION_2_0 1 - -#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_MAX_DRAW_BUFFERS 0x8824 -#define GL_DRAW_BUFFER0 0x8825 -#define GL_DRAW_BUFFER1 0x8826 -#define GL_DRAW_BUFFER2 0x8827 -#define GL_DRAW_BUFFER3 0x8828 -#define GL_DRAW_BUFFER4 0x8829 -#define GL_DRAW_BUFFER5 0x882A -#define GL_DRAW_BUFFER6 0x882B -#define GL_DRAW_BUFFER7 0x882C -#define GL_DRAW_BUFFER8 0x882D -#define GL_DRAW_BUFFER9 0x882E -#define GL_DRAW_BUFFER10 0x882F -#define GL_DRAW_BUFFER11 0x8830 -#define GL_DRAW_BUFFER12 0x8831 -#define GL_DRAW_BUFFER13 0x8832 -#define GL_DRAW_BUFFER14 0x8833 -#define GL_DRAW_BUFFER15 0x8834 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_POINT_SPRITE 0x8861 -#define GL_COORD_REPLACE 0x8862 -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_MAX_TEXTURE_COORDS 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A -#define GL_MAX_VARYING_FLOATS 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_SHADER_TYPE 0x8B4F -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_1D 0x8B5D -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_SAMPLER_1D_SHADOW 0x8B61 -#define GL_SAMPLER_2D_SHADOW 0x8B62 -#define GL_DELETE_STATUS 0x8B80 -#define GL_COMPILE_STATUS 0x8B81 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 -#define GL_LOWER_LEFT 0x8CA1 -#define GL_UPPER_LEFT 0x8CA2 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 - -typedef void (GLAPIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); -typedef void (GLAPIENTRY * PFNGLCOMPILESHADERPROC) (GLuint shader); -typedef GLuint (GLAPIENTRY * PFNGLCREATEPROGRAMPROC) (void); -typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROC) (GLenum type); -typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPROC) (GLuint program); -typedef void (GLAPIENTRY * PFNGLDELETESHADERPROC) (GLuint shader); -typedef void (GLAPIENTRY * PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum* bufs); -typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders); -typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog); -typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLuint obj, GLsizei maxLength, GLsizei* length, GLchar* source); -typedef void (GLAPIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint* param); -typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void** pointer); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPROC) (GLuint program); -typedef GLboolean (GLAPIENTRY * PFNGLISSHADERPROC) (GLuint shader); -typedef void (GLAPIENTRY * PFNGLLINKPROGRAMPROC) (GLuint program); -typedef void (GLAPIENTRY * PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const* string, const GLint* length); -typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -typedef void (GLAPIENTRY * PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); -typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (GLAPIENTRY * PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM1IPROC) (GLint location, GLint v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUSEPROGRAMPROC) (GLuint program); -typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPROC) (GLuint program); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer); - -#define glAttachShader GLEW_GET_FUN(__glewAttachShader) -#define glBindAttribLocation GLEW_GET_FUN(__glewBindAttribLocation) -#define glBlendEquationSeparate GLEW_GET_FUN(__glewBlendEquationSeparate) -#define glCompileShader GLEW_GET_FUN(__glewCompileShader) -#define glCreateProgram GLEW_GET_FUN(__glewCreateProgram) -#define glCreateShader GLEW_GET_FUN(__glewCreateShader) -#define glDeleteProgram GLEW_GET_FUN(__glewDeleteProgram) -#define glDeleteShader GLEW_GET_FUN(__glewDeleteShader) -#define glDetachShader GLEW_GET_FUN(__glewDetachShader) -#define glDisableVertexAttribArray GLEW_GET_FUN(__glewDisableVertexAttribArray) -#define glDrawBuffers GLEW_GET_FUN(__glewDrawBuffers) -#define glEnableVertexAttribArray GLEW_GET_FUN(__glewEnableVertexAttribArray) -#define glGetActiveAttrib GLEW_GET_FUN(__glewGetActiveAttrib) -#define glGetActiveUniform GLEW_GET_FUN(__glewGetActiveUniform) -#define glGetAttachedShaders GLEW_GET_FUN(__glewGetAttachedShaders) -#define glGetAttribLocation GLEW_GET_FUN(__glewGetAttribLocation) -#define glGetProgramInfoLog GLEW_GET_FUN(__glewGetProgramInfoLog) -#define glGetProgramiv GLEW_GET_FUN(__glewGetProgramiv) -#define glGetShaderInfoLog GLEW_GET_FUN(__glewGetShaderInfoLog) -#define glGetShaderSource GLEW_GET_FUN(__glewGetShaderSource) -#define glGetShaderiv GLEW_GET_FUN(__glewGetShaderiv) -#define glGetUniformLocation GLEW_GET_FUN(__glewGetUniformLocation) -#define glGetUniformfv GLEW_GET_FUN(__glewGetUniformfv) -#define glGetUniformiv GLEW_GET_FUN(__glewGetUniformiv) -#define glGetVertexAttribPointerv GLEW_GET_FUN(__glewGetVertexAttribPointerv) -#define glGetVertexAttribdv GLEW_GET_FUN(__glewGetVertexAttribdv) -#define glGetVertexAttribfv GLEW_GET_FUN(__glewGetVertexAttribfv) -#define glGetVertexAttribiv GLEW_GET_FUN(__glewGetVertexAttribiv) -#define glIsProgram GLEW_GET_FUN(__glewIsProgram) -#define glIsShader GLEW_GET_FUN(__glewIsShader) -#define glLinkProgram GLEW_GET_FUN(__glewLinkProgram) -#define glShaderSource GLEW_GET_FUN(__glewShaderSource) -#define glStencilFuncSeparate GLEW_GET_FUN(__glewStencilFuncSeparate) -#define glStencilMaskSeparate GLEW_GET_FUN(__glewStencilMaskSeparate) -#define glStencilOpSeparate GLEW_GET_FUN(__glewStencilOpSeparate) -#define glUniform1f GLEW_GET_FUN(__glewUniform1f) -#define glUniform1fv GLEW_GET_FUN(__glewUniform1fv) -#define glUniform1i GLEW_GET_FUN(__glewUniform1i) -#define glUniform1iv GLEW_GET_FUN(__glewUniform1iv) -#define glUniform2f GLEW_GET_FUN(__glewUniform2f) -#define glUniform2fv GLEW_GET_FUN(__glewUniform2fv) -#define glUniform2i GLEW_GET_FUN(__glewUniform2i) -#define glUniform2iv GLEW_GET_FUN(__glewUniform2iv) -#define glUniform3f GLEW_GET_FUN(__glewUniform3f) -#define glUniform3fv GLEW_GET_FUN(__glewUniform3fv) -#define glUniform3i GLEW_GET_FUN(__glewUniform3i) -#define glUniform3iv GLEW_GET_FUN(__glewUniform3iv) -#define glUniform4f GLEW_GET_FUN(__glewUniform4f) -#define glUniform4fv GLEW_GET_FUN(__glewUniform4fv) -#define glUniform4i GLEW_GET_FUN(__glewUniform4i) -#define glUniform4iv GLEW_GET_FUN(__glewUniform4iv) -#define glUniformMatrix2fv GLEW_GET_FUN(__glewUniformMatrix2fv) -#define glUniformMatrix3fv GLEW_GET_FUN(__glewUniformMatrix3fv) -#define glUniformMatrix4fv GLEW_GET_FUN(__glewUniformMatrix4fv) -#define glUseProgram GLEW_GET_FUN(__glewUseProgram) -#define glValidateProgram GLEW_GET_FUN(__glewValidateProgram) -#define glVertexAttrib1d GLEW_GET_FUN(__glewVertexAttrib1d) -#define glVertexAttrib1dv GLEW_GET_FUN(__glewVertexAttrib1dv) -#define glVertexAttrib1f GLEW_GET_FUN(__glewVertexAttrib1f) -#define glVertexAttrib1fv GLEW_GET_FUN(__glewVertexAttrib1fv) -#define glVertexAttrib1s GLEW_GET_FUN(__glewVertexAttrib1s) -#define glVertexAttrib1sv GLEW_GET_FUN(__glewVertexAttrib1sv) -#define glVertexAttrib2d GLEW_GET_FUN(__glewVertexAttrib2d) -#define glVertexAttrib2dv GLEW_GET_FUN(__glewVertexAttrib2dv) -#define glVertexAttrib2f GLEW_GET_FUN(__glewVertexAttrib2f) -#define glVertexAttrib2fv GLEW_GET_FUN(__glewVertexAttrib2fv) -#define glVertexAttrib2s GLEW_GET_FUN(__glewVertexAttrib2s) -#define glVertexAttrib2sv GLEW_GET_FUN(__glewVertexAttrib2sv) -#define glVertexAttrib3d GLEW_GET_FUN(__glewVertexAttrib3d) -#define glVertexAttrib3dv GLEW_GET_FUN(__glewVertexAttrib3dv) -#define glVertexAttrib3f GLEW_GET_FUN(__glewVertexAttrib3f) -#define glVertexAttrib3fv GLEW_GET_FUN(__glewVertexAttrib3fv) -#define glVertexAttrib3s GLEW_GET_FUN(__glewVertexAttrib3s) -#define glVertexAttrib3sv GLEW_GET_FUN(__glewVertexAttrib3sv) -#define glVertexAttrib4Nbv GLEW_GET_FUN(__glewVertexAttrib4Nbv) -#define glVertexAttrib4Niv GLEW_GET_FUN(__glewVertexAttrib4Niv) -#define glVertexAttrib4Nsv GLEW_GET_FUN(__glewVertexAttrib4Nsv) -#define glVertexAttrib4Nub GLEW_GET_FUN(__glewVertexAttrib4Nub) -#define glVertexAttrib4Nubv GLEW_GET_FUN(__glewVertexAttrib4Nubv) -#define glVertexAttrib4Nuiv GLEW_GET_FUN(__glewVertexAttrib4Nuiv) -#define glVertexAttrib4Nusv GLEW_GET_FUN(__glewVertexAttrib4Nusv) -#define glVertexAttrib4bv GLEW_GET_FUN(__glewVertexAttrib4bv) -#define glVertexAttrib4d GLEW_GET_FUN(__glewVertexAttrib4d) -#define glVertexAttrib4dv GLEW_GET_FUN(__glewVertexAttrib4dv) -#define glVertexAttrib4f GLEW_GET_FUN(__glewVertexAttrib4f) -#define glVertexAttrib4fv GLEW_GET_FUN(__glewVertexAttrib4fv) -#define glVertexAttrib4iv GLEW_GET_FUN(__glewVertexAttrib4iv) -#define glVertexAttrib4s GLEW_GET_FUN(__glewVertexAttrib4s) -#define glVertexAttrib4sv GLEW_GET_FUN(__glewVertexAttrib4sv) -#define glVertexAttrib4ubv GLEW_GET_FUN(__glewVertexAttrib4ubv) -#define glVertexAttrib4uiv GLEW_GET_FUN(__glewVertexAttrib4uiv) -#define glVertexAttrib4usv GLEW_GET_FUN(__glewVertexAttrib4usv) -#define glVertexAttribPointer GLEW_GET_FUN(__glewVertexAttribPointer) - -#define GLEW_VERSION_2_0 GLEW_GET_VAR(__GLEW_VERSION_2_0) - -#endif /* GL_VERSION_2_0 */ - -/* ----------------------------- GL_VERSION_2_1 ---------------------------- */ - -#ifndef GL_VERSION_2_1 -#define GL_VERSION_2_1 1 - -#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F -#define GL_PIXEL_PACK_BUFFER 0x88EB -#define GL_PIXEL_UNPACK_BUFFER 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF -#define GL_FLOAT_MAT2x3 0x8B65 -#define GL_FLOAT_MAT2x4 0x8B66 -#define GL_FLOAT_MAT3x2 0x8B67 -#define GL_FLOAT_MAT3x4 0x8B68 -#define GL_FLOAT_MAT4x2 0x8B69 -#define GL_FLOAT_MAT4x3 0x8B6A -#define GL_SRGB 0x8C40 -#define GL_SRGB8 0x8C41 -#define GL_SRGB_ALPHA 0x8C42 -#define GL_SRGB8_ALPHA8 0x8C43 -#define GL_SLUMINANCE_ALPHA 0x8C44 -#define GL_SLUMINANCE8_ALPHA8 0x8C45 -#define GL_SLUMINANCE 0x8C46 -#define GL_SLUMINANCE8 0x8C47 -#define GL_COMPRESSED_SRGB 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 -#define GL_COMPRESSED_SLUMINANCE 0x8C4A -#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B - -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - -#define glUniformMatrix2x3fv GLEW_GET_FUN(__glewUniformMatrix2x3fv) -#define glUniformMatrix2x4fv GLEW_GET_FUN(__glewUniformMatrix2x4fv) -#define glUniformMatrix3x2fv GLEW_GET_FUN(__glewUniformMatrix3x2fv) -#define glUniformMatrix3x4fv GLEW_GET_FUN(__glewUniformMatrix3x4fv) -#define glUniformMatrix4x2fv GLEW_GET_FUN(__glewUniformMatrix4x2fv) -#define glUniformMatrix4x3fv GLEW_GET_FUN(__glewUniformMatrix4x3fv) - -#define GLEW_VERSION_2_1 GLEW_GET_VAR(__GLEW_VERSION_2_1) - -#endif /* GL_VERSION_2_1 */ - -/* ----------------------------- GL_VERSION_3_0 ---------------------------- */ - -#ifndef GL_VERSION_3_0 -#define GL_VERSION_3_0 1 - -#define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0 -#define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1 -#define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2 -#define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3 -#define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4 -#define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5 -#define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB -#define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES -#define GL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS -#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 -#define GL_MAJOR_VERSION 0x821B -#define GL_MINOR_VERSION 0x821C -#define GL_NUM_EXTENSIONS 0x821D -#define GL_CONTEXT_FLAGS 0x821E -#define GL_DEPTH_BUFFER 0x8223 -#define GL_STENCIL_BUFFER 0x8224 -#define GL_RGBA32F 0x8814 -#define GL_RGB32F 0x8815 -#define GL_RGBA16F 0x881A -#define GL_RGB16F 0x881B -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD -#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF -#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 -#define GL_CLAMP_VERTEX_COLOR 0x891A -#define GL_CLAMP_FRAGMENT_COLOR 0x891B -#define GL_CLAMP_READ_COLOR 0x891C -#define GL_FIXED_ONLY 0x891D -#define GL_TEXTURE_RED_TYPE 0x8C10 -#define GL_TEXTURE_GREEN_TYPE 0x8C11 -#define GL_TEXTURE_BLUE_TYPE 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE 0x8C13 -#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 -#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 -#define GL_TEXTURE_DEPTH_TYPE 0x8C16 -#define GL_TEXTURE_1D_ARRAY 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 -#define GL_TEXTURE_2D_ARRAY 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D -#define GL_R11F_G11F_B10F 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B -#define GL_RGB9_E5 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E -#define GL_TEXTURE_SHARED_SIZE 0x8C3F -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 -#define GL_PRIMITIVES_GENERATED 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 -#define GL_RASTERIZER_DISCARD 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B -#define GL_INTERLEAVED_ATTRIBS 0x8C8C -#define GL_SEPARATE_ATTRIBS 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F -#define GL_RGBA32UI 0x8D70 -#define GL_RGB32UI 0x8D71 -#define GL_RGBA16UI 0x8D76 -#define GL_RGB16UI 0x8D77 -#define GL_RGBA8UI 0x8D7C -#define GL_RGB8UI 0x8D7D -#define GL_RGBA32I 0x8D82 -#define GL_RGB32I 0x8D83 -#define GL_RGBA16I 0x8D88 -#define GL_RGB16I 0x8D89 -#define GL_RGBA8I 0x8D8E -#define GL_RGB8I 0x8D8F -#define GL_RED_INTEGER 0x8D94 -#define GL_GREEN_INTEGER 0x8D95 -#define GL_BLUE_INTEGER 0x8D96 -#define GL_ALPHA_INTEGER 0x8D97 -#define GL_RGB_INTEGER 0x8D98 -#define GL_RGBA_INTEGER 0x8D99 -#define GL_BGR_INTEGER 0x8D9A -#define GL_BGRA_INTEGER 0x8D9B -#define GL_SAMPLER_1D_ARRAY 0x8DC0 -#define GL_SAMPLER_2D_ARRAY 0x8DC1 -#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 -#define GL_UNSIGNED_INT_VEC2 0x8DC6 -#define GL_UNSIGNED_INT_VEC3 0x8DC7 -#define GL_UNSIGNED_INT_VEC4 0x8DC8 -#define GL_INT_SAMPLER_1D 0x8DC9 -#define GL_INT_SAMPLER_2D 0x8DCA -#define GL_INT_SAMPLER_3D 0x8DCB -#define GL_INT_SAMPLER_CUBE 0x8DCC -#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF -#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 -#define GL_QUERY_WAIT 0x8E13 -#define GL_QUERY_NO_WAIT 0x8E14 -#define GL_QUERY_BY_REGION_WAIT 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 - -typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); -typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); -typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint colorNumber, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); -typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil); -typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawBuffer, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawBuffer, const GLint* value); -typedef void (GLAPIENTRY * PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawBuffer, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLCOLORMASKIPROC) (GLuint buf, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -typedef void (GLAPIENTRY * PFNGLDISABLEIPROC) (GLenum cap, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEIPROC) (GLenum cap, GLuint index); -typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERPROC) (void); -typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKPROC) (void); -typedef void (GLAPIENTRY * PFNGLGETBOOLEANI_VPROC) (GLenum pname, GLuint index, GLboolean* data); -typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar* name); -typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIPROC) (GLenum cap, GLuint index); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint v0, GLint v1); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint v0, GLuint v1); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint v0, GLint v1, GLint v2); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort* v0); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void*pointer); - -#define glBeginConditionalRender GLEW_GET_FUN(__glewBeginConditionalRender) -#define glBeginTransformFeedback GLEW_GET_FUN(__glewBeginTransformFeedback) -#define glBindFragDataLocation GLEW_GET_FUN(__glewBindFragDataLocation) -#define glClampColor GLEW_GET_FUN(__glewClampColor) -#define glClearBufferfi GLEW_GET_FUN(__glewClearBufferfi) -#define glClearBufferfv GLEW_GET_FUN(__glewClearBufferfv) -#define glClearBufferiv GLEW_GET_FUN(__glewClearBufferiv) -#define glClearBufferuiv GLEW_GET_FUN(__glewClearBufferuiv) -#define glColorMaski GLEW_GET_FUN(__glewColorMaski) -#define glDisablei GLEW_GET_FUN(__glewDisablei) -#define glEnablei GLEW_GET_FUN(__glewEnablei) -#define glEndConditionalRender GLEW_GET_FUN(__glewEndConditionalRender) -#define glEndTransformFeedback GLEW_GET_FUN(__glewEndTransformFeedback) -#define glGetBooleani_v GLEW_GET_FUN(__glewGetBooleani_v) -#define glGetFragDataLocation GLEW_GET_FUN(__glewGetFragDataLocation) -#define glGetStringi GLEW_GET_FUN(__glewGetStringi) -#define glGetTexParameterIiv GLEW_GET_FUN(__glewGetTexParameterIiv) -#define glGetTexParameterIuiv GLEW_GET_FUN(__glewGetTexParameterIuiv) -#define glGetTransformFeedbackVarying GLEW_GET_FUN(__glewGetTransformFeedbackVarying) -#define glGetUniformuiv GLEW_GET_FUN(__glewGetUniformuiv) -#define glGetVertexAttribIiv GLEW_GET_FUN(__glewGetVertexAttribIiv) -#define glGetVertexAttribIuiv GLEW_GET_FUN(__glewGetVertexAttribIuiv) -#define glIsEnabledi GLEW_GET_FUN(__glewIsEnabledi) -#define glTexParameterIiv GLEW_GET_FUN(__glewTexParameterIiv) -#define glTexParameterIuiv GLEW_GET_FUN(__glewTexParameterIuiv) -#define glTransformFeedbackVaryings GLEW_GET_FUN(__glewTransformFeedbackVaryings) -#define glUniform1ui GLEW_GET_FUN(__glewUniform1ui) -#define glUniform1uiv GLEW_GET_FUN(__glewUniform1uiv) -#define glUniform2ui GLEW_GET_FUN(__glewUniform2ui) -#define glUniform2uiv GLEW_GET_FUN(__glewUniform2uiv) -#define glUniform3ui GLEW_GET_FUN(__glewUniform3ui) -#define glUniform3uiv GLEW_GET_FUN(__glewUniform3uiv) -#define glUniform4ui GLEW_GET_FUN(__glewUniform4ui) -#define glUniform4uiv GLEW_GET_FUN(__glewUniform4uiv) -#define glVertexAttribI1i GLEW_GET_FUN(__glewVertexAttribI1i) -#define glVertexAttribI1iv GLEW_GET_FUN(__glewVertexAttribI1iv) -#define glVertexAttribI1ui GLEW_GET_FUN(__glewVertexAttribI1ui) -#define glVertexAttribI1uiv GLEW_GET_FUN(__glewVertexAttribI1uiv) -#define glVertexAttribI2i GLEW_GET_FUN(__glewVertexAttribI2i) -#define glVertexAttribI2iv GLEW_GET_FUN(__glewVertexAttribI2iv) -#define glVertexAttribI2ui GLEW_GET_FUN(__glewVertexAttribI2ui) -#define glVertexAttribI2uiv GLEW_GET_FUN(__glewVertexAttribI2uiv) -#define glVertexAttribI3i GLEW_GET_FUN(__glewVertexAttribI3i) -#define glVertexAttribI3iv GLEW_GET_FUN(__glewVertexAttribI3iv) -#define glVertexAttribI3ui GLEW_GET_FUN(__glewVertexAttribI3ui) -#define glVertexAttribI3uiv GLEW_GET_FUN(__glewVertexAttribI3uiv) -#define glVertexAttribI4bv GLEW_GET_FUN(__glewVertexAttribI4bv) -#define glVertexAttribI4i GLEW_GET_FUN(__glewVertexAttribI4i) -#define glVertexAttribI4iv GLEW_GET_FUN(__glewVertexAttribI4iv) -#define glVertexAttribI4sv GLEW_GET_FUN(__glewVertexAttribI4sv) -#define glVertexAttribI4ubv GLEW_GET_FUN(__glewVertexAttribI4ubv) -#define glVertexAttribI4ui GLEW_GET_FUN(__glewVertexAttribI4ui) -#define glVertexAttribI4uiv GLEW_GET_FUN(__glewVertexAttribI4uiv) -#define glVertexAttribI4usv GLEW_GET_FUN(__glewVertexAttribI4usv) -#define glVertexAttribIPointer GLEW_GET_FUN(__glewVertexAttribIPointer) - -#define GLEW_VERSION_3_0 GLEW_GET_VAR(__GLEW_VERSION_3_0) - -#endif /* GL_VERSION_3_0 */ - -/* ----------------------------- GL_VERSION_3_1 ---------------------------- */ - -#ifndef GL_VERSION_3_1 -#define GL_VERSION_3_1 1 - -#define GL_TEXTURE_RECTANGLE 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 -#define GL_SAMPLER_2D_RECT 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 -#define GL_TEXTURE_BUFFER 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT 0x8C2E -#define GL_SAMPLER_BUFFER 0x8DC2 -#define GL_INT_SAMPLER_2D_RECT 0x8DCD -#define GL_INT_SAMPLER_BUFFER 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 -#define GL_RED_SNORM 0x8F90 -#define GL_RG_SNORM 0x8F91 -#define GL_RGB_SNORM 0x8F92 -#define GL_RGBA_SNORM 0x8F93 -#define GL_R8_SNORM 0x8F94 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGB8_SNORM 0x8F96 -#define GL_RGBA8_SNORM 0x8F97 -#define GL_R16_SNORM 0x8F98 -#define GL_RG16_SNORM 0x8F99 -#define GL_RGB16_SNORM 0x8F9A -#define GL_RGBA16_SNORM 0x8F9B -#define GL_SIGNED_NORMALIZED 0x8F9C -#define GL_PRIMITIVE_RESTART 0x8F9D -#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E -#define GL_BUFFER_ACCESS_FLAGS 0x911F -#define GL_BUFFER_MAP_LENGTH 0x9120 -#define GL_BUFFER_MAP_OFFSET 0x9121 - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalFormat, GLuint buffer); - -#define glDrawArraysInstanced GLEW_GET_FUN(__glewDrawArraysInstanced) -#define glDrawElementsInstanced GLEW_GET_FUN(__glewDrawElementsInstanced) -#define glPrimitiveRestartIndex GLEW_GET_FUN(__glewPrimitiveRestartIndex) -#define glTexBuffer GLEW_GET_FUN(__glewTexBuffer) - -#define GLEW_VERSION_3_1 GLEW_GET_VAR(__GLEW_VERSION_3_1) - -#endif /* GL_VERSION_3_1 */ - -/* ----------------------------- GL_VERSION_3_2 ---------------------------- */ - -#ifndef GL_VERSION_3_2 -#define GL_VERSION_3_2 1 - -#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 -#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 -#define GL_LINES_ADJACENCY 0x000A -#define GL_LINE_STRIP_ADJACENCY 0x000B -#define GL_TRIANGLES_ADJACENCY 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D -#define GL_PROGRAM_POINT_SIZE 0x8642 -#define GL_GEOMETRY_VERTICES_OUT 0x8916 -#define GL_GEOMETRY_INPUT_TYPE 0x8917 -#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 -#define GL_GEOMETRY_SHADER 0x8DD9 -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 -#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 -#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 -#define GL_CONTEXT_PROFILE_MASK 0x9126 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum value, GLint64 * data); -typedef void (GLAPIENTRY * PFNGLGETINTEGER64I_VPROC) (GLenum pname, GLuint index, GLint64 * data); - -#define glFramebufferTexture GLEW_GET_FUN(__glewFramebufferTexture) -#define glGetBufferParameteri64v GLEW_GET_FUN(__glewGetBufferParameteri64v) -#define glGetInteger64i_v GLEW_GET_FUN(__glewGetInteger64i_v) - -#define GLEW_VERSION_3_2 GLEW_GET_VAR(__GLEW_VERSION_3_2) - -#endif /* GL_VERSION_3_2 */ - -/* ----------------------------- GL_VERSION_3_3 ---------------------------- */ - -#ifndef GL_VERSION_3_3 -#define GL_VERSION_3_3 1 - -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE -#define GL_RGB10_A2UI 0x906F - -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); - -#define glVertexAttribDivisor GLEW_GET_FUN(__glewVertexAttribDivisor) - -#define GLEW_VERSION_3_3 GLEW_GET_VAR(__GLEW_VERSION_3_3) - -#endif /* GL_VERSION_3_3 */ - -/* ----------------------------- GL_VERSION_4_0 ---------------------------- */ - -#ifndef GL_VERSION_4_0 -#define GL_VERSION_4_0 1 - -#define GL_SAMPLE_SHADING 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F -#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS 0x8F9F -#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B -#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGPROC) (GLclampf value); - -#define glBlendEquationSeparatei GLEW_GET_FUN(__glewBlendEquationSeparatei) -#define glBlendEquationi GLEW_GET_FUN(__glewBlendEquationi) -#define glBlendFuncSeparatei GLEW_GET_FUN(__glewBlendFuncSeparatei) -#define glBlendFunci GLEW_GET_FUN(__glewBlendFunci) -#define glMinSampleShading GLEW_GET_FUN(__glewMinSampleShading) - -#define GLEW_VERSION_4_0 GLEW_GET_VAR(__GLEW_VERSION_4_0) - -#endif /* GL_VERSION_4_0 */ - -/* ----------------------------- GL_VERSION_4_1 ---------------------------- */ - -#ifndef GL_VERSION_4_1 -#define GL_VERSION_4_1 1 - -#define GLEW_VERSION_4_1 GLEW_GET_VAR(__GLEW_VERSION_4_1) - -#endif /* GL_VERSION_4_1 */ - -/* ----------------------------- GL_VERSION_4_2 ---------------------------- */ - -#ifndef GL_VERSION_4_2 -#define GL_VERSION_4_2 1 - -#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 -#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 -#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C -#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D -#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E -#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F -#define GL_COPY_READ_BUFFER_BINDING 0x8F36 -#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 - -#define GLEW_VERSION_4_2 GLEW_GET_VAR(__GLEW_VERSION_4_2) - -#endif /* GL_VERSION_4_2 */ - -/* ----------------------------- GL_VERSION_4_3 ---------------------------- */ - -#ifndef GL_VERSION_4_3 -#define GL_VERSION_4_3 1 - -#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 -#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E - -#define GLEW_VERSION_4_3 GLEW_GET_VAR(__GLEW_VERSION_4_3) - -#endif /* GL_VERSION_4_3 */ - -/* ----------------------------- GL_VERSION_4_4 ---------------------------- */ - -#ifndef GL_VERSION_4_4 -#define GL_VERSION_4_4 1 - -#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 -#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 -#define GL_TEXTURE_BUFFER_BINDING 0x8C2A - -#define GLEW_VERSION_4_4 GLEW_GET_VAR(__GLEW_VERSION_4_4) - -#endif /* GL_VERSION_4_4 */ - -/* ----------------------------- GL_VERSION_4_5 ---------------------------- */ - -#ifndef GL_VERSION_4_5 -#define GL_VERSION_4_5 1 - -#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 - -typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSPROC) (void); -typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLsizei bufSize, GLvoid *pixels); -typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEPROC) (GLenum tex, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *pixels); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); - -#define glGetGraphicsResetStatus GLEW_GET_FUN(__glewGetGraphicsResetStatus) -#define glGetnCompressedTexImage GLEW_GET_FUN(__glewGetnCompressedTexImage) -#define glGetnTexImage GLEW_GET_FUN(__glewGetnTexImage) -#define glGetnUniformdv GLEW_GET_FUN(__glewGetnUniformdv) - -#define GLEW_VERSION_4_5 GLEW_GET_VAR(__GLEW_VERSION_4_5) - -#endif /* GL_VERSION_4_5 */ - -/* ----------------------------- GL_VERSION_4_6 ---------------------------- */ - -#ifndef GL_VERSION_4_6 -#define GL_VERSION_4_6 1 - -#define GL_CONTEXT_FLAG_NO_ERROR_BIT 0x00000008 -#define GL_PARAMETER_BUFFER 0x80EE -#define GL_PARAMETER_BUFFER_BINDING 0x80EF -#define GL_TRANSFORM_FEEDBACK_OVERFLOW 0x82EC -#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW 0x82ED -#define GL_VERTICES_SUBMITTED 0x82EE -#define GL_PRIMITIVES_SUBMITTED 0x82EF -#define GL_VERTEX_SHADER_INVOCATIONS 0x82F0 -#define GL_TESS_CONTROL_SHADER_PATCHES 0x82F1 -#define GL_TESS_EVALUATION_SHADER_INVOCATIONS 0x82F2 -#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED 0x82F3 -#define GL_FRAGMENT_SHADER_INVOCATIONS 0x82F4 -#define GL_COMPUTE_SHADER_INVOCATIONS 0x82F5 -#define GL_CLIPPING_INPUT_PRIMITIVES 0x82F6 -#define GL_CLIPPING_OUTPUT_PRIMITIVES 0x82F7 -#define GL_TEXTURE_MAX_ANISOTROPY 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF -#define GL_POLYGON_OFFSET_CLAMP 0x8E1B -#define GL_SHADER_BINARY_FORMAT_SPIR_V 0x9551 -#define GL_SPIR_V_BINARY 0x9552 -#define GL_SPIR_V_EXTENSIONS 0x9553 -#define GL_NUM_SPIR_V_EXTENSIONS 0x9554 - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC) (GLenum mode, const GLvoid *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC) (GLenum mode, GLenum type, const GLvoid *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLSPECIALIZESHADERPROC) (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); - -#define glMultiDrawArraysIndirectCount GLEW_GET_FUN(__glewMultiDrawArraysIndirectCount) -#define glMultiDrawElementsIndirectCount GLEW_GET_FUN(__glewMultiDrawElementsIndirectCount) -#define glSpecializeShader GLEW_GET_FUN(__glewSpecializeShader) - -#define GLEW_VERSION_4_6 GLEW_GET_VAR(__GLEW_VERSION_4_6) - -#endif /* GL_VERSION_4_6 */ - -/* -------------------------- GL_3DFX_multisample -------------------------- */ - -#ifndef GL_3DFX_multisample -#define GL_3DFX_multisample 1 - -#define GL_MULTISAMPLE_3DFX 0x86B2 -#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 -#define GL_SAMPLES_3DFX 0x86B4 -#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 - -#define GLEW_3DFX_multisample GLEW_GET_VAR(__GLEW_3DFX_multisample) - -#endif /* GL_3DFX_multisample */ - -/* ---------------------------- GL_3DFX_tbuffer ---------------------------- */ - -#ifndef GL_3DFX_tbuffer -#define GL_3DFX_tbuffer 1 - -typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); - -#define glTbufferMask3DFX GLEW_GET_FUN(__glewTbufferMask3DFX) - -#define GLEW_3DFX_tbuffer GLEW_GET_VAR(__GLEW_3DFX_tbuffer) - -#endif /* GL_3DFX_tbuffer */ - -/* -------------------- GL_3DFX_texture_compression_FXT1 ------------------- */ - -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_3DFX_texture_compression_FXT1 1 - -#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 -#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 - -#define GLEW_3DFX_texture_compression_FXT1 GLEW_GET_VAR(__GLEW_3DFX_texture_compression_FXT1) - -#endif /* GL_3DFX_texture_compression_FXT1 */ - -/* ----------------------- GL_AMD_blend_minmax_factor ---------------------- */ - -#ifndef GL_AMD_blend_minmax_factor -#define GL_AMD_blend_minmax_factor 1 - -#define GL_FACTOR_MIN_AMD 0x901C -#define GL_FACTOR_MAX_AMD 0x901D - -#define GLEW_AMD_blend_minmax_factor GLEW_GET_VAR(__GLEW_AMD_blend_minmax_factor) - -#endif /* GL_AMD_blend_minmax_factor */ - -/* --------------------- GL_AMD_compressed_3DC_texture --------------------- */ - -#ifndef GL_AMD_compressed_3DC_texture -#define GL_AMD_compressed_3DC_texture 1 - -#define GL_3DC_X_AMD 0x87F9 -#define GL_3DC_XY_AMD 0x87FA - -#define GLEW_AMD_compressed_3DC_texture GLEW_GET_VAR(__GLEW_AMD_compressed_3DC_texture) - -#endif /* GL_AMD_compressed_3DC_texture */ - -/* --------------------- GL_AMD_compressed_ATC_texture --------------------- */ - -#ifndef GL_AMD_compressed_ATC_texture -#define GL_AMD_compressed_ATC_texture 1 - -#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE -#define GL_ATC_RGB_AMD 0x8C92 -#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 - -#define GLEW_AMD_compressed_ATC_texture GLEW_GET_VAR(__GLEW_AMD_compressed_ATC_texture) - -#endif /* GL_AMD_compressed_ATC_texture */ - -/* ----------------------- GL_AMD_conservative_depth ----------------------- */ - -#ifndef GL_AMD_conservative_depth -#define GL_AMD_conservative_depth 1 - -#define GLEW_AMD_conservative_depth GLEW_GET_VAR(__GLEW_AMD_conservative_depth) - -#endif /* GL_AMD_conservative_depth */ - -/* -------------------------- GL_AMD_debug_output -------------------------- */ - -#ifndef GL_AMD_debug_output -#define GL_AMD_debug_output 1 - -#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 -#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 -#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 -#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 -#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A -#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B -#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C -#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D -#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E -#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F -#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 - -typedef void (GLAPIENTRY *GLDEBUGPROCAMD)(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar* message, void* userParam); - -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void *userParam); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar* buf); -typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum* categories, GLuint* severities, GLuint* ids, GLsizei* lengths, GLchar* message); - -#define glDebugMessageCallbackAMD GLEW_GET_FUN(__glewDebugMessageCallbackAMD) -#define glDebugMessageEnableAMD GLEW_GET_FUN(__glewDebugMessageEnableAMD) -#define glDebugMessageInsertAMD GLEW_GET_FUN(__glewDebugMessageInsertAMD) -#define glGetDebugMessageLogAMD GLEW_GET_FUN(__glewGetDebugMessageLogAMD) - -#define GLEW_AMD_debug_output GLEW_GET_VAR(__GLEW_AMD_debug_output) - -#endif /* GL_AMD_debug_output */ - -/* ---------------------- GL_AMD_depth_clamp_separate ---------------------- */ - -#ifndef GL_AMD_depth_clamp_separate -#define GL_AMD_depth_clamp_separate 1 - -#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E -#define GL_DEPTH_CLAMP_FAR_AMD 0x901F - -#define GLEW_AMD_depth_clamp_separate GLEW_GET_VAR(__GLEW_AMD_depth_clamp_separate) - -#endif /* GL_AMD_depth_clamp_separate */ - -/* ----------------------- GL_AMD_draw_buffers_blend ----------------------- */ - -#ifndef GL_AMD_draw_buffers_blend -#define GL_AMD_draw_buffers_blend 1 - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); - -#define glBlendEquationIndexedAMD GLEW_GET_FUN(__glewBlendEquationIndexedAMD) -#define glBlendEquationSeparateIndexedAMD GLEW_GET_FUN(__glewBlendEquationSeparateIndexedAMD) -#define glBlendFuncIndexedAMD GLEW_GET_FUN(__glewBlendFuncIndexedAMD) -#define glBlendFuncSeparateIndexedAMD GLEW_GET_FUN(__glewBlendFuncSeparateIndexedAMD) - -#define GLEW_AMD_draw_buffers_blend GLEW_GET_VAR(__GLEW_AMD_draw_buffers_blend) - -#endif /* GL_AMD_draw_buffers_blend */ - -/* ------------------ GL_AMD_framebuffer_sample_positions ------------------ */ - -#ifndef GL_AMD_framebuffer_sample_positions -#define GL_AMD_framebuffer_sample_positions 1 - -#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F -#define GL_PIXELS_PER_SAMPLE_PATTERN_X_AMD 0x91AE -#define GL_PIXELS_PER_SAMPLE_PATTERN_Y_AMD 0x91AF -#define GL_ALL_PIXELS_AMD 0xFFFFFFFF - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC) (GLenum target, GLuint numsamples, GLuint pixelindex, const GLfloat* values); -typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC) (GLenum target, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat* values); -typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC) (GLuint framebuffer, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat* values); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC) (GLuint framebuffer, GLuint numsamples, GLuint pixelindex, const GLfloat* values); - -#define glFramebufferSamplePositionsfvAMD GLEW_GET_FUN(__glewFramebufferSamplePositionsfvAMD) -#define glGetFramebufferParameterfvAMD GLEW_GET_FUN(__glewGetFramebufferParameterfvAMD) -#define glGetNamedFramebufferParameterfvAMD GLEW_GET_FUN(__glewGetNamedFramebufferParameterfvAMD) -#define glNamedFramebufferSamplePositionsfvAMD GLEW_GET_FUN(__glewNamedFramebufferSamplePositionsfvAMD) - -#define GLEW_AMD_framebuffer_sample_positions GLEW_GET_VAR(__GLEW_AMD_framebuffer_sample_positions) - -#endif /* GL_AMD_framebuffer_sample_positions */ - -/* --------------------------- GL_AMD_gcn_shader --------------------------- */ - -#ifndef GL_AMD_gcn_shader -#define GL_AMD_gcn_shader 1 - -#define GLEW_AMD_gcn_shader GLEW_GET_VAR(__GLEW_AMD_gcn_shader) - -#endif /* GL_AMD_gcn_shader */ - -/* ---------------------- GL_AMD_gpu_shader_half_float --------------------- */ - -#ifndef GL_AMD_gpu_shader_half_float -#define GL_AMD_gpu_shader_half_float 1 - -#define GL_FLOAT16_NV 0x8FF8 -#define GL_FLOAT16_VEC2_NV 0x8FF9 -#define GL_FLOAT16_VEC3_NV 0x8FFA -#define GL_FLOAT16_VEC4_NV 0x8FFB -#define GL_FLOAT16_MAT2_AMD 0x91C5 -#define GL_FLOAT16_MAT3_AMD 0x91C6 -#define GL_FLOAT16_MAT4_AMD 0x91C7 -#define GL_FLOAT16_MAT2x3_AMD 0x91C8 -#define GL_FLOAT16_MAT2x4_AMD 0x91C9 -#define GL_FLOAT16_MAT3x2_AMD 0x91CA -#define GL_FLOAT16_MAT3x4_AMD 0x91CB -#define GL_FLOAT16_MAT4x2_AMD 0x91CC -#define GL_FLOAT16_MAT4x3_AMD 0x91CD - -#define GLEW_AMD_gpu_shader_half_float GLEW_GET_VAR(__GLEW_AMD_gpu_shader_half_float) - -#endif /* GL_AMD_gpu_shader_half_float */ - -/* ------------------------ GL_AMD_gpu_shader_int16 ------------------------ */ - -#ifndef GL_AMD_gpu_shader_int16 -#define GL_AMD_gpu_shader_int16 1 - -#define GLEW_AMD_gpu_shader_int16 GLEW_GET_VAR(__GLEW_AMD_gpu_shader_int16) - -#endif /* GL_AMD_gpu_shader_int16 */ - -/* ------------------------ GL_AMD_gpu_shader_int64 ------------------------ */ - -#ifndef GL_AMD_gpu_shader_int64 -#define GL_AMD_gpu_shader_int64 1 - -#define GLEW_AMD_gpu_shader_int64 GLEW_GET_VAR(__GLEW_AMD_gpu_shader_int64) - -#endif /* GL_AMD_gpu_shader_int64 */ - -/* ---------------------- GL_AMD_interleaved_elements ---------------------- */ - -#ifndef GL_AMD_interleaved_elements -#define GL_AMD_interleaved_elements 1 - -#define GL_RED 0x1903 -#define GL_GREEN 0x1904 -#define GL_BLUE 0x1905 -#define GL_ALPHA 0x1906 -#define GL_RG8UI 0x8238 -#define GL_RG16UI 0x823A -#define GL_RGBA8UI 0x8D7C -#define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 -#define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 - -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param); - -#define glVertexAttribParameteriAMD GLEW_GET_FUN(__glewVertexAttribParameteriAMD) - -#define GLEW_AMD_interleaved_elements GLEW_GET_VAR(__GLEW_AMD_interleaved_elements) - -#endif /* GL_AMD_interleaved_elements */ - -/* ----------------------- GL_AMD_multi_draw_indirect ---------------------- */ - -#ifndef GL_AMD_multi_draw_indirect -#define GL_AMD_multi_draw_indirect 1 - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); - -#define glMultiDrawArraysIndirectAMD GLEW_GET_FUN(__glewMultiDrawArraysIndirectAMD) -#define glMultiDrawElementsIndirectAMD GLEW_GET_FUN(__glewMultiDrawElementsIndirectAMD) - -#define GLEW_AMD_multi_draw_indirect GLEW_GET_VAR(__GLEW_AMD_multi_draw_indirect) - -#endif /* GL_AMD_multi_draw_indirect */ - -/* ------------------------- GL_AMD_name_gen_delete ------------------------ */ - -#ifndef GL_AMD_name_gen_delete -#define GL_AMD_name_gen_delete 1 - -#define GL_DATA_BUFFER_AMD 0x9151 -#define GL_PERFORMANCE_MONITOR_AMD 0x9152 -#define GL_QUERY_OBJECT_AMD 0x9153 -#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 -#define GL_SAMPLER_OBJECT_AMD 0x9155 - -typedef void (GLAPIENTRY * PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint* names); -typedef void (GLAPIENTRY * PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint* names); -typedef GLboolean (GLAPIENTRY * PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); - -#define glDeleteNamesAMD GLEW_GET_FUN(__glewDeleteNamesAMD) -#define glGenNamesAMD GLEW_GET_FUN(__glewGenNamesAMD) -#define glIsNameAMD GLEW_GET_FUN(__glewIsNameAMD) - -#define GLEW_AMD_name_gen_delete GLEW_GET_VAR(__GLEW_AMD_name_gen_delete) - -#endif /* GL_AMD_name_gen_delete */ - -/* ---------------------- GL_AMD_occlusion_query_event --------------------- */ - -#ifndef GL_AMD_occlusion_query_event -#define GL_AMD_occlusion_query_event 1 - -#define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001 -#define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002 -#define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004 -#define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008 -#define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F -#define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF - -typedef void (GLAPIENTRY * PFNGLQUERYOBJECTPARAMETERUIAMDPROC) (GLenum target, GLuint id, GLenum pname, GLuint param); - -#define glQueryObjectParameteruiAMD GLEW_GET_FUN(__glewQueryObjectParameteruiAMD) - -#define GLEW_AMD_occlusion_query_event GLEW_GET_VAR(__GLEW_AMD_occlusion_query_event) - -#endif /* GL_AMD_occlusion_query_event */ - -/* ----------------------- GL_AMD_performance_monitor ---------------------- */ - -#ifndef GL_AMD_performance_monitor -#define GL_AMD_performance_monitor 1 - -#define GL_COUNTER_TYPE_AMD 0x8BC0 -#define GL_COUNTER_RANGE_AMD 0x8BC1 -#define GL_UNSIGNED_INT64_AMD 0x8BC2 -#define GL_PERCENTAGE_AMD 0x8BC3 -#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 -#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 -#define GL_PERFMON_RESULT_AMD 0x8BC6 - -typedef void (GLAPIENTRY * PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); -typedef void (GLAPIENTRY * PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); -typedef void (GLAPIENTRY * PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); -typedef void (GLAPIENTRY * PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); -typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint *bytesWritten); -typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); -typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, GLchar *counterString); -typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint* numCounters, GLint *maxActiveCounters, GLsizei countersSize, GLuint *counters); -typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei* length, GLchar *groupString); -typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint* numGroups, GLsizei groupsSize, GLuint *groups); -typedef void (GLAPIENTRY * PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* counterList); - -#define glBeginPerfMonitorAMD GLEW_GET_FUN(__glewBeginPerfMonitorAMD) -#define glDeletePerfMonitorsAMD GLEW_GET_FUN(__glewDeletePerfMonitorsAMD) -#define glEndPerfMonitorAMD GLEW_GET_FUN(__glewEndPerfMonitorAMD) -#define glGenPerfMonitorsAMD GLEW_GET_FUN(__glewGenPerfMonitorsAMD) -#define glGetPerfMonitorCounterDataAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterDataAMD) -#define glGetPerfMonitorCounterInfoAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterInfoAMD) -#define glGetPerfMonitorCounterStringAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterStringAMD) -#define glGetPerfMonitorCountersAMD GLEW_GET_FUN(__glewGetPerfMonitorCountersAMD) -#define glGetPerfMonitorGroupStringAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupStringAMD) -#define glGetPerfMonitorGroupsAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupsAMD) -#define glSelectPerfMonitorCountersAMD GLEW_GET_FUN(__glewSelectPerfMonitorCountersAMD) - -#define GLEW_AMD_performance_monitor GLEW_GET_VAR(__GLEW_AMD_performance_monitor) - -#endif /* GL_AMD_performance_monitor */ - -/* -------------------------- GL_AMD_pinned_memory ------------------------- */ - -#ifndef GL_AMD_pinned_memory -#define GL_AMD_pinned_memory 1 - -#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 - -#define GLEW_AMD_pinned_memory GLEW_GET_VAR(__GLEW_AMD_pinned_memory) - -#endif /* GL_AMD_pinned_memory */ - -/* ----------------------- GL_AMD_program_binary_Z400 ---------------------- */ - -#ifndef GL_AMD_program_binary_Z400 -#define GL_AMD_program_binary_Z400 1 - -#define GL_Z400_BINARY_AMD 0x8740 - -#define GLEW_AMD_program_binary_Z400 GLEW_GET_VAR(__GLEW_AMD_program_binary_Z400) - -#endif /* GL_AMD_program_binary_Z400 */ - -/* ----------------------- GL_AMD_query_buffer_object ---------------------- */ - -#ifndef GL_AMD_query_buffer_object -#define GL_AMD_query_buffer_object 1 - -#define GL_QUERY_BUFFER_AMD 0x9192 -#define GL_QUERY_BUFFER_BINDING_AMD 0x9193 -#define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194 - -#define GLEW_AMD_query_buffer_object GLEW_GET_VAR(__GLEW_AMD_query_buffer_object) - -#endif /* GL_AMD_query_buffer_object */ - -/* ------------------------ GL_AMD_sample_positions ------------------------ */ - -#ifndef GL_AMD_sample_positions -#define GL_AMD_sample_positions 1 - -#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F - -typedef void (GLAPIENTRY * PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat* val); - -#define glSetMultisamplefvAMD GLEW_GET_FUN(__glewSetMultisamplefvAMD) - -#define GLEW_AMD_sample_positions GLEW_GET_VAR(__GLEW_AMD_sample_positions) - -#endif /* GL_AMD_sample_positions */ - -/* ------------------ GL_AMD_seamless_cubemap_per_texture ------------------ */ - -#ifndef GL_AMD_seamless_cubemap_per_texture -#define GL_AMD_seamless_cubemap_per_texture 1 - -#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F - -#define GLEW_AMD_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_AMD_seamless_cubemap_per_texture) - -#endif /* GL_AMD_seamless_cubemap_per_texture */ - -/* -------------------- GL_AMD_shader_atomic_counter_ops ------------------- */ - -#ifndef GL_AMD_shader_atomic_counter_ops -#define GL_AMD_shader_atomic_counter_ops 1 - -#define GLEW_AMD_shader_atomic_counter_ops GLEW_GET_VAR(__GLEW_AMD_shader_atomic_counter_ops) - -#endif /* GL_AMD_shader_atomic_counter_ops */ - -/* -------------------------- GL_AMD_shader_ballot ------------------------- */ - -#ifndef GL_AMD_shader_ballot -#define GL_AMD_shader_ballot 1 - -#define GLEW_AMD_shader_ballot GLEW_GET_VAR(__GLEW_AMD_shader_ballot) - -#endif /* GL_AMD_shader_ballot */ - -/* ---------------- GL_AMD_shader_explicit_vertex_parameter ---------------- */ - -#ifndef GL_AMD_shader_explicit_vertex_parameter -#define GL_AMD_shader_explicit_vertex_parameter 1 - -#define GLEW_AMD_shader_explicit_vertex_parameter GLEW_GET_VAR(__GLEW_AMD_shader_explicit_vertex_parameter) - -#endif /* GL_AMD_shader_explicit_vertex_parameter */ - -/* ---------------------- GL_AMD_shader_stencil_export --------------------- */ - -#ifndef GL_AMD_shader_stencil_export -#define GL_AMD_shader_stencil_export 1 - -#define GLEW_AMD_shader_stencil_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_export) - -#endif /* GL_AMD_shader_stencil_export */ - -/* ------------------- GL_AMD_shader_stencil_value_export ------------------ */ - -#ifndef GL_AMD_shader_stencil_value_export -#define GL_AMD_shader_stencil_value_export 1 - -#define GLEW_AMD_shader_stencil_value_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_value_export) - -#endif /* GL_AMD_shader_stencil_value_export */ - -/* ---------------------- GL_AMD_shader_trinary_minmax --------------------- */ - -#ifndef GL_AMD_shader_trinary_minmax -#define GL_AMD_shader_trinary_minmax 1 - -#define GLEW_AMD_shader_trinary_minmax GLEW_GET_VAR(__GLEW_AMD_shader_trinary_minmax) - -#endif /* GL_AMD_shader_trinary_minmax */ - -/* ------------------------- GL_AMD_sparse_texture ------------------------- */ - -#ifndef GL_AMD_sparse_texture -#define GL_AMD_sparse_texture 1 - -#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 -#define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 -#define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 -#define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 -#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 -#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 -#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A -#define GL_MIN_SPARSE_LEVEL_AMD 0x919B -#define GL_MIN_LOD_WARNING_AMD 0x919C - -typedef void (GLAPIENTRY * PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); - -#define glTexStorageSparseAMD GLEW_GET_FUN(__glewTexStorageSparseAMD) -#define glTextureStorageSparseAMD GLEW_GET_FUN(__glewTextureStorageSparseAMD) - -#define GLEW_AMD_sparse_texture GLEW_GET_VAR(__GLEW_AMD_sparse_texture) - -#endif /* GL_AMD_sparse_texture */ - -/* ------------------- GL_AMD_stencil_operation_extended ------------------- */ - -#ifndef GL_AMD_stencil_operation_extended -#define GL_AMD_stencil_operation_extended 1 - -#define GL_SET_AMD 0x874A -#define GL_REPLACE_VALUE_AMD 0x874B -#define GL_STENCIL_OP_VALUE_AMD 0x874C -#define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D - -typedef void (GLAPIENTRY * PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value); - -#define glStencilOpValueAMD GLEW_GET_FUN(__glewStencilOpValueAMD) - -#define GLEW_AMD_stencil_operation_extended GLEW_GET_VAR(__GLEW_AMD_stencil_operation_extended) - -#endif /* GL_AMD_stencil_operation_extended */ - -/* --------------------- GL_AMD_texture_gather_bias_lod -------------------- */ - -#ifndef GL_AMD_texture_gather_bias_lod -#define GL_AMD_texture_gather_bias_lod 1 - -#define GLEW_AMD_texture_gather_bias_lod GLEW_GET_VAR(__GLEW_AMD_texture_gather_bias_lod) - -#endif /* GL_AMD_texture_gather_bias_lod */ - -/* ------------------------ GL_AMD_texture_texture4 ------------------------ */ - -#ifndef GL_AMD_texture_texture4 -#define GL_AMD_texture_texture4 1 - -#define GLEW_AMD_texture_texture4 GLEW_GET_VAR(__GLEW_AMD_texture_texture4) - -#endif /* GL_AMD_texture_texture4 */ - -/* --------------- GL_AMD_transform_feedback3_lines_triangles -------------- */ - -#ifndef GL_AMD_transform_feedback3_lines_triangles -#define GL_AMD_transform_feedback3_lines_triangles 1 - -#define GLEW_AMD_transform_feedback3_lines_triangles GLEW_GET_VAR(__GLEW_AMD_transform_feedback3_lines_triangles) - -#endif /* GL_AMD_transform_feedback3_lines_triangles */ - -/* ----------------------- GL_AMD_transform_feedback4 ---------------------- */ - -#ifndef GL_AMD_transform_feedback4 -#define GL_AMD_transform_feedback4 1 - -#define GL_STREAM_RASTERIZATION_AMD 0x91A0 - -#define GLEW_AMD_transform_feedback4 GLEW_GET_VAR(__GLEW_AMD_transform_feedback4) - -#endif /* GL_AMD_transform_feedback4 */ - -/* ----------------------- GL_AMD_vertex_shader_layer ---------------------- */ - -#ifndef GL_AMD_vertex_shader_layer -#define GL_AMD_vertex_shader_layer 1 - -#define GLEW_AMD_vertex_shader_layer GLEW_GET_VAR(__GLEW_AMD_vertex_shader_layer) - -#endif /* GL_AMD_vertex_shader_layer */ - -/* -------------------- GL_AMD_vertex_shader_tessellator ------------------- */ - -#ifndef GL_AMD_vertex_shader_tessellator -#define GL_AMD_vertex_shader_tessellator 1 - -#define GL_SAMPLER_BUFFER_AMD 0x9001 -#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 -#define GL_TESSELLATION_MODE_AMD 0x9004 -#define GL_TESSELLATION_FACTOR_AMD 0x9005 -#define GL_DISCRETE_AMD 0x9006 -#define GL_CONTINUOUS_AMD 0x9007 - -typedef void (GLAPIENTRY * PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); -typedef void (GLAPIENTRY * PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); - -#define glTessellationFactorAMD GLEW_GET_FUN(__glewTessellationFactorAMD) -#define glTessellationModeAMD GLEW_GET_FUN(__glewTessellationModeAMD) - -#define GLEW_AMD_vertex_shader_tessellator GLEW_GET_VAR(__GLEW_AMD_vertex_shader_tessellator) - -#endif /* GL_AMD_vertex_shader_tessellator */ - -/* ------------------ GL_AMD_vertex_shader_viewport_index ------------------ */ - -#ifndef GL_AMD_vertex_shader_viewport_index -#define GL_AMD_vertex_shader_viewport_index 1 - -#define GLEW_AMD_vertex_shader_viewport_index GLEW_GET_VAR(__GLEW_AMD_vertex_shader_viewport_index) - -#endif /* GL_AMD_vertex_shader_viewport_index */ - -/* -------------------- GL_ANDROID_extension_pack_es31a -------------------- */ - -#ifndef GL_ANDROID_extension_pack_es31a -#define GL_ANDROID_extension_pack_es31a 1 - -#define GLEW_ANDROID_extension_pack_es31a GLEW_GET_VAR(__GLEW_ANDROID_extension_pack_es31a) - -#endif /* GL_ANDROID_extension_pack_es31a */ - -/* ------------------------- GL_ANGLE_depth_texture ------------------------ */ - -#ifndef GL_ANGLE_depth_texture -#define GL_ANGLE_depth_texture 1 - -#define GLEW_ANGLE_depth_texture GLEW_GET_VAR(__GLEW_ANGLE_depth_texture) - -#endif /* GL_ANGLE_depth_texture */ - -/* ----------------------- GL_ANGLE_framebuffer_blit ----------------------- */ - -#ifndef GL_ANGLE_framebuffer_blit -#define GL_ANGLE_framebuffer_blit 1 - -#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 -#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA - -typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); - -#define glBlitFramebufferANGLE GLEW_GET_FUN(__glewBlitFramebufferANGLE) - -#define GLEW_ANGLE_framebuffer_blit GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_blit) - -#endif /* GL_ANGLE_framebuffer_blit */ - -/* -------------------- GL_ANGLE_framebuffer_multisample ------------------- */ - -#ifndef GL_ANGLE_framebuffer_multisample -#define GL_ANGLE_framebuffer_multisample 1 - -#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 -#define GL_MAX_SAMPLES_ANGLE 0x8D57 - -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - -#define glRenderbufferStorageMultisampleANGLE GLEW_GET_FUN(__glewRenderbufferStorageMultisampleANGLE) - -#define GLEW_ANGLE_framebuffer_multisample GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_multisample) - -#endif /* GL_ANGLE_framebuffer_multisample */ - -/* ----------------------- GL_ANGLE_instanced_arrays ----------------------- */ - -#ifndef GL_ANGLE_instanced_arrays -#define GL_ANGLE_instanced_arrays 1 - -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor); - -#define glDrawArraysInstancedANGLE GLEW_GET_FUN(__glewDrawArraysInstancedANGLE) -#define glDrawElementsInstancedANGLE GLEW_GET_FUN(__glewDrawElementsInstancedANGLE) -#define glVertexAttribDivisorANGLE GLEW_GET_FUN(__glewVertexAttribDivisorANGLE) - -#define GLEW_ANGLE_instanced_arrays GLEW_GET_VAR(__GLEW_ANGLE_instanced_arrays) - -#endif /* GL_ANGLE_instanced_arrays */ - -/* -------------------- GL_ANGLE_pack_reverse_row_order -------------------- */ - -#ifndef GL_ANGLE_pack_reverse_row_order -#define GL_ANGLE_pack_reverse_row_order 1 - -#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 - -#define GLEW_ANGLE_pack_reverse_row_order GLEW_GET_VAR(__GLEW_ANGLE_pack_reverse_row_order) - -#endif /* GL_ANGLE_pack_reverse_row_order */ - -/* ------------------------ GL_ANGLE_program_binary ------------------------ */ - -#ifndef GL_ANGLE_program_binary -#define GL_ANGLE_program_binary 1 - -#define GL_PROGRAM_BINARY_ANGLE 0x93A6 - -#define GLEW_ANGLE_program_binary GLEW_GET_VAR(__GLEW_ANGLE_program_binary) - -#endif /* GL_ANGLE_program_binary */ - -/* ------------------- GL_ANGLE_texture_compression_dxt1 ------------------- */ - -#ifndef GL_ANGLE_texture_compression_dxt1 -#define GL_ANGLE_texture_compression_dxt1 1 - -#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 - -#define GLEW_ANGLE_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt1) - -#endif /* GL_ANGLE_texture_compression_dxt1 */ - -/* ------------------- GL_ANGLE_texture_compression_dxt3 ------------------- */ - -#ifndef GL_ANGLE_texture_compression_dxt3 -#define GL_ANGLE_texture_compression_dxt3 1 - -#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 - -#define GLEW_ANGLE_texture_compression_dxt3 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt3) - -#endif /* GL_ANGLE_texture_compression_dxt3 */ - -/* ------------------- GL_ANGLE_texture_compression_dxt5 ------------------- */ - -#ifndef GL_ANGLE_texture_compression_dxt5 -#define GL_ANGLE_texture_compression_dxt5 1 - -#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 - -#define GLEW_ANGLE_texture_compression_dxt5 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt5) - -#endif /* GL_ANGLE_texture_compression_dxt5 */ - -/* ------------------------- GL_ANGLE_texture_usage ------------------------ */ - -#ifndef GL_ANGLE_texture_usage -#define GL_ANGLE_texture_usage 1 - -#define GL_TEXTURE_USAGE_ANGLE 0x93A2 -#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 - -#define GLEW_ANGLE_texture_usage GLEW_GET_VAR(__GLEW_ANGLE_texture_usage) - -#endif /* GL_ANGLE_texture_usage */ - -/* -------------------------- GL_ANGLE_timer_query ------------------------- */ - -#ifndef GL_ANGLE_timer_query -#define GL_ANGLE_timer_query 1 - -#define GL_QUERY_COUNTER_BITS_ANGLE 0x8864 -#define GL_CURRENT_QUERY_ANGLE 0x8865 -#define GL_QUERY_RESULT_ANGLE 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_ANGLE 0x8867 -#define GL_TIME_ELAPSED_ANGLE 0x88BF -#define GL_TIMESTAMP_ANGLE 0x8E28 - -typedef void (GLAPIENTRY * PFNGLBEGINQUERYANGLEPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETEQUERIESANGLEPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLENDQUERYANGLEPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLGENQUERIESANGLEPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VANGLEPROC) (GLuint id, GLenum pname, GLint64* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVANGLEPROC) (GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VANGLEPROC) (GLuint id, GLenum pname, GLuint64* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVANGLEPROC) (GLuint id, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYIVANGLEPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISQUERYANGLEPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERANGLEPROC) (GLuint id, GLenum target); - -#define glBeginQueryANGLE GLEW_GET_FUN(__glewBeginQueryANGLE) -#define glDeleteQueriesANGLE GLEW_GET_FUN(__glewDeleteQueriesANGLE) -#define glEndQueryANGLE GLEW_GET_FUN(__glewEndQueryANGLE) -#define glGenQueriesANGLE GLEW_GET_FUN(__glewGenQueriesANGLE) -#define glGetQueryObjecti64vANGLE GLEW_GET_FUN(__glewGetQueryObjecti64vANGLE) -#define glGetQueryObjectivANGLE GLEW_GET_FUN(__glewGetQueryObjectivANGLE) -#define glGetQueryObjectui64vANGLE GLEW_GET_FUN(__glewGetQueryObjectui64vANGLE) -#define glGetQueryObjectuivANGLE GLEW_GET_FUN(__glewGetQueryObjectuivANGLE) -#define glGetQueryivANGLE GLEW_GET_FUN(__glewGetQueryivANGLE) -#define glIsQueryANGLE GLEW_GET_FUN(__glewIsQueryANGLE) -#define glQueryCounterANGLE GLEW_GET_FUN(__glewQueryCounterANGLE) - -#define GLEW_ANGLE_timer_query GLEW_GET_VAR(__GLEW_ANGLE_timer_query) - -#endif /* GL_ANGLE_timer_query */ - -/* ------------------- GL_ANGLE_translated_shader_source ------------------- */ - -#ifndef GL_ANGLE_translated_shader_source -#define GL_ANGLE_translated_shader_source 1 - -#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 - -typedef void (GLAPIENTRY * PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source); - -#define glGetTranslatedShaderSourceANGLE GLEW_GET_FUN(__glewGetTranslatedShaderSourceANGLE) - -#define GLEW_ANGLE_translated_shader_source GLEW_GET_VAR(__GLEW_ANGLE_translated_shader_source) - -#endif /* GL_ANGLE_translated_shader_source */ - -/* ----------------------- GL_APPLE_aux_depth_stencil ---------------------- */ - -#ifndef GL_APPLE_aux_depth_stencil -#define GL_APPLE_aux_depth_stencil 1 - -#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 - -#define GLEW_APPLE_aux_depth_stencil GLEW_GET_VAR(__GLEW_APPLE_aux_depth_stencil) - -#endif /* GL_APPLE_aux_depth_stencil */ - -/* ------------------------ GL_APPLE_client_storage ------------------------ */ - -#ifndef GL_APPLE_client_storage -#define GL_APPLE_client_storage 1 - -#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 - -#define GLEW_APPLE_client_storage GLEW_GET_VAR(__GLEW_APPLE_client_storage) - -#endif /* GL_APPLE_client_storage */ - -/* ------------------------- GL_APPLE_clip_distance ------------------------ */ - -#ifndef GL_APPLE_clip_distance -#define GL_APPLE_clip_distance 1 - -#define GL_MAX_CLIP_DISTANCES_APPLE 0x0D32 -#define GL_CLIP_DISTANCE0_APPLE 0x3000 -#define GL_CLIP_DISTANCE1_APPLE 0x3001 -#define GL_CLIP_DISTANCE2_APPLE 0x3002 -#define GL_CLIP_DISTANCE3_APPLE 0x3003 -#define GL_CLIP_DISTANCE4_APPLE 0x3004 -#define GL_CLIP_DISTANCE5_APPLE 0x3005 -#define GL_CLIP_DISTANCE6_APPLE 0x3006 -#define GL_CLIP_DISTANCE7_APPLE 0x3007 - -#define GLEW_APPLE_clip_distance GLEW_GET_VAR(__GLEW_APPLE_clip_distance) - -#endif /* GL_APPLE_clip_distance */ - -/* ------------------- GL_APPLE_color_buffer_packed_float ------------------ */ - -#ifndef GL_APPLE_color_buffer_packed_float -#define GL_APPLE_color_buffer_packed_float 1 - -#define GLEW_APPLE_color_buffer_packed_float GLEW_GET_VAR(__GLEW_APPLE_color_buffer_packed_float) - -#endif /* GL_APPLE_color_buffer_packed_float */ - -/* ---------------------- GL_APPLE_copy_texture_levels --------------------- */ - -#ifndef GL_APPLE_copy_texture_levels -#define GL_APPLE_copy_texture_levels 1 - -typedef void (GLAPIENTRY * PFNGLCOPYTEXTURELEVELSAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); - -#define glCopyTextureLevelsAPPLE GLEW_GET_FUN(__glewCopyTextureLevelsAPPLE) - -#define GLEW_APPLE_copy_texture_levels GLEW_GET_VAR(__GLEW_APPLE_copy_texture_levels) - -#endif /* GL_APPLE_copy_texture_levels */ - -/* ------------------------- GL_APPLE_element_array ------------------------ */ - -#ifndef GL_APPLE_element_array -#define GL_APPLE_element_array 1 - -#define GL_ELEMENT_ARRAY_APPLE 0x8A0C -#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D -#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E - -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); -typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void *pointer); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount); - -#define glDrawElementArrayAPPLE GLEW_GET_FUN(__glewDrawElementArrayAPPLE) -#define glDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewDrawRangeElementArrayAPPLE) -#define glElementPointerAPPLE GLEW_GET_FUN(__glewElementPointerAPPLE) -#define glMultiDrawElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawElementArrayAPPLE) -#define glMultiDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawRangeElementArrayAPPLE) - -#define GLEW_APPLE_element_array GLEW_GET_VAR(__GLEW_APPLE_element_array) - -#endif /* GL_APPLE_element_array */ - -/* ----------------------------- GL_APPLE_fence ---------------------------- */ - -#ifndef GL_APPLE_fence -#define GL_APPLE_fence 1 - -#define GL_DRAW_PIXELS_APPLE 0x8A0A -#define GL_FENCE_APPLE 0x8A0B - -typedef void (GLAPIENTRY * PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint* fences); -typedef void (GLAPIENTRY * PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); -typedef void (GLAPIENTRY * PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); -typedef void (GLAPIENTRY * PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint* fences); -typedef GLboolean (GLAPIENTRY * PFNGLISFENCEAPPLEPROC) (GLuint fence); -typedef void (GLAPIENTRY * PFNGLSETFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (GLAPIENTRY * PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); - -#define glDeleteFencesAPPLE GLEW_GET_FUN(__glewDeleteFencesAPPLE) -#define glFinishFenceAPPLE GLEW_GET_FUN(__glewFinishFenceAPPLE) -#define glFinishObjectAPPLE GLEW_GET_FUN(__glewFinishObjectAPPLE) -#define glGenFencesAPPLE GLEW_GET_FUN(__glewGenFencesAPPLE) -#define glIsFenceAPPLE GLEW_GET_FUN(__glewIsFenceAPPLE) -#define glSetFenceAPPLE GLEW_GET_FUN(__glewSetFenceAPPLE) -#define glTestFenceAPPLE GLEW_GET_FUN(__glewTestFenceAPPLE) -#define glTestObjectAPPLE GLEW_GET_FUN(__glewTestObjectAPPLE) - -#define GLEW_APPLE_fence GLEW_GET_VAR(__GLEW_APPLE_fence) - -#endif /* GL_APPLE_fence */ - -/* ------------------------- GL_APPLE_float_pixels ------------------------- */ - -#ifndef GL_APPLE_float_pixels -#define GL_APPLE_float_pixels 1 - -#define GL_HALF_APPLE 0x140B -#define GL_RGBA_FLOAT32_APPLE 0x8814 -#define GL_RGB_FLOAT32_APPLE 0x8815 -#define GL_ALPHA_FLOAT32_APPLE 0x8816 -#define GL_INTENSITY_FLOAT32_APPLE 0x8817 -#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 -#define GL_RGBA_FLOAT16_APPLE 0x881A -#define GL_RGB_FLOAT16_APPLE 0x881B -#define GL_ALPHA_FLOAT16_APPLE 0x881C -#define GL_INTENSITY_FLOAT16_APPLE 0x881D -#define GL_LUMINANCE_FLOAT16_APPLE 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F -#define GL_COLOR_FLOAT_APPLE 0x8A0F - -#define GLEW_APPLE_float_pixels GLEW_GET_VAR(__GLEW_APPLE_float_pixels) - -#endif /* GL_APPLE_float_pixels */ - -/* ---------------------- GL_APPLE_flush_buffer_range ---------------------- */ - -#ifndef GL_APPLE_flush_buffer_range -#define GL_APPLE_flush_buffer_range 1 - -#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 -#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 - -typedef void (GLAPIENTRY * PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); - -#define glBufferParameteriAPPLE GLEW_GET_FUN(__glewBufferParameteriAPPLE) -#define glFlushMappedBufferRangeAPPLE GLEW_GET_FUN(__glewFlushMappedBufferRangeAPPLE) - -#define GLEW_APPLE_flush_buffer_range GLEW_GET_VAR(__GLEW_APPLE_flush_buffer_range) - -#endif /* GL_APPLE_flush_buffer_range */ - -/* -------------------- GL_APPLE_framebuffer_multisample ------------------- */ - -#ifndef GL_APPLE_framebuffer_multisample -#define GL_APPLE_framebuffer_multisample 1 - -#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6 -#define GL_READ_FRAMEBUFFER_APPLE 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_APPLE 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA -#define GL_RENDERBUFFER_SAMPLES_APPLE 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56 -#define GL_MAX_SAMPLES_APPLE 0x8D57 - -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void); - -#define glRenderbufferStorageMultisampleAPPLE GLEW_GET_FUN(__glewRenderbufferStorageMultisampleAPPLE) -#define glResolveMultisampleFramebufferAPPLE GLEW_GET_FUN(__glewResolveMultisampleFramebufferAPPLE) - -#define GLEW_APPLE_framebuffer_multisample GLEW_GET_VAR(__GLEW_APPLE_framebuffer_multisample) - -#endif /* GL_APPLE_framebuffer_multisample */ - -/* ----------------------- GL_APPLE_object_purgeable ----------------------- */ - -#ifndef GL_APPLE_object_purgeable -#define GL_APPLE_object_purgeable 1 - -#define GL_BUFFER_OBJECT_APPLE 0x85B3 -#define GL_RELEASED_APPLE 0x8A19 -#define GL_VOLATILE_APPLE 0x8A1A -#define GL_RETAINED_APPLE 0x8A1B -#define GL_UNDEFINED_APPLE 0x8A1C -#define GL_PURGEABLE_APPLE 0x8A1D - -typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint* params); -typedef GLenum (GLAPIENTRY * PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); -typedef GLenum (GLAPIENTRY * PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); - -#define glGetObjectParameterivAPPLE GLEW_GET_FUN(__glewGetObjectParameterivAPPLE) -#define glObjectPurgeableAPPLE GLEW_GET_FUN(__glewObjectPurgeableAPPLE) -#define glObjectUnpurgeableAPPLE GLEW_GET_FUN(__glewObjectUnpurgeableAPPLE) - -#define GLEW_APPLE_object_purgeable GLEW_GET_VAR(__GLEW_APPLE_object_purgeable) - -#endif /* GL_APPLE_object_purgeable */ - -/* ------------------------- GL_APPLE_pixel_buffer ------------------------- */ - -#ifndef GL_APPLE_pixel_buffer -#define GL_APPLE_pixel_buffer 1 - -#define GL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE 0x8A10 - -#define GLEW_APPLE_pixel_buffer GLEW_GET_VAR(__GLEW_APPLE_pixel_buffer) - -#endif /* GL_APPLE_pixel_buffer */ - -/* ---------------------------- GL_APPLE_rgb_422 --------------------------- */ - -#ifndef GL_APPLE_rgb_422 -#define GL_APPLE_rgb_422 1 - -#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB -#define GL_RGB_422_APPLE 0x8A1F -#define GL_RGB_RAW_422_APPLE 0x8A51 - -#define GLEW_APPLE_rgb_422 GLEW_GET_VAR(__GLEW_APPLE_rgb_422) - -#endif /* GL_APPLE_rgb_422 */ - -/* --------------------------- GL_APPLE_row_bytes -------------------------- */ - -#ifndef GL_APPLE_row_bytes -#define GL_APPLE_row_bytes 1 - -#define GL_PACK_ROW_BYTES_APPLE 0x8A15 -#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 - -#define GLEW_APPLE_row_bytes GLEW_GET_VAR(__GLEW_APPLE_row_bytes) - -#endif /* GL_APPLE_row_bytes */ - -/* ------------------------ GL_APPLE_specular_vector ----------------------- */ - -#ifndef GL_APPLE_specular_vector -#define GL_APPLE_specular_vector 1 - -#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 - -#define GLEW_APPLE_specular_vector GLEW_GET_VAR(__GLEW_APPLE_specular_vector) - -#endif /* GL_APPLE_specular_vector */ - -/* ----------------------------- GL_APPLE_sync ----------------------------- */ - -#ifndef GL_APPLE_sync -#define GL_APPLE_sync 1 - -#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE 0x00000001 -#define GL_SYNC_OBJECT_APPLE 0x8A53 -#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE 0x9111 -#define GL_OBJECT_TYPE_APPLE 0x9112 -#define GL_SYNC_CONDITION_APPLE 0x9113 -#define GL_SYNC_STATUS_APPLE 0x9114 -#define GL_SYNC_FLAGS_APPLE 0x9115 -#define GL_SYNC_FENCE_APPLE 0x9116 -#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE 0x9117 -#define GL_UNSIGNALED_APPLE 0x9118 -#define GL_SIGNALED_APPLE 0x9119 -#define GL_ALREADY_SIGNALED_APPLE 0x911A -#define GL_TIMEOUT_EXPIRED_APPLE 0x911B -#define GL_CONDITION_SATISFIED_APPLE 0x911C -#define GL_WAIT_FAILED_APPLE 0x911D -#define GL_TIMEOUT_IGNORED_APPLE 0xFFFFFFFFFFFFFFFFull - -typedef GLenum (GLAPIENTRY * PFNGLCLIENTWAITSYNCAPPLEPROC) (GLsync GLsync, GLbitfield flags, GLuint64 timeout); -typedef void (GLAPIENTRY * PFNGLDELETESYNCAPPLEPROC) (GLsync GLsync); -typedef GLsync (GLAPIENTRY * PFNGLFENCESYNCAPPLEPROC) (GLenum condition, GLbitfield flags); -typedef void (GLAPIENTRY * PFNGLGETINTEGER64VAPPLEPROC) (GLenum pname, GLint64* params); -typedef void (GLAPIENTRY * PFNGLGETSYNCIVAPPLEPROC) (GLsync GLsync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint *values); -typedef GLboolean (GLAPIENTRY * PFNGLISSYNCAPPLEPROC) (GLsync GLsync); -typedef void (GLAPIENTRY * PFNGLWAITSYNCAPPLEPROC) (GLsync GLsync, GLbitfield flags, GLuint64 timeout); - -#define glClientWaitSyncAPPLE GLEW_GET_FUN(__glewClientWaitSyncAPPLE) -#define glDeleteSyncAPPLE GLEW_GET_FUN(__glewDeleteSyncAPPLE) -#define glFenceSyncAPPLE GLEW_GET_FUN(__glewFenceSyncAPPLE) -#define glGetInteger64vAPPLE GLEW_GET_FUN(__glewGetInteger64vAPPLE) -#define glGetSyncivAPPLE GLEW_GET_FUN(__glewGetSyncivAPPLE) -#define glIsSyncAPPLE GLEW_GET_FUN(__glewIsSyncAPPLE) -#define glWaitSyncAPPLE GLEW_GET_FUN(__glewWaitSyncAPPLE) - -#define GLEW_APPLE_sync GLEW_GET_VAR(__GLEW_APPLE_sync) - -#endif /* GL_APPLE_sync */ - -/* -------------------- GL_APPLE_texture_2D_limited_npot ------------------- */ - -#ifndef GL_APPLE_texture_2D_limited_npot -#define GL_APPLE_texture_2D_limited_npot 1 - -#define GLEW_APPLE_texture_2D_limited_npot GLEW_GET_VAR(__GLEW_APPLE_texture_2D_limited_npot) - -#endif /* GL_APPLE_texture_2D_limited_npot */ - -/* -------------------- GL_APPLE_texture_format_BGRA8888 ------------------- */ - -#ifndef GL_APPLE_texture_format_BGRA8888 -#define GL_APPLE_texture_format_BGRA8888 1 - -#define GL_BGRA_EXT 0x80E1 -#define GL_BGRA8_EXT 0x93A1 - -#define GLEW_APPLE_texture_format_BGRA8888 GLEW_GET_VAR(__GLEW_APPLE_texture_format_BGRA8888) - -#endif /* GL_APPLE_texture_format_BGRA8888 */ - -/* ----------------------- GL_APPLE_texture_max_level ---------------------- */ - -#ifndef GL_APPLE_texture_max_level -#define GL_APPLE_texture_max_level 1 - -#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D - -#define GLEW_APPLE_texture_max_level GLEW_GET_VAR(__GLEW_APPLE_texture_max_level) - -#endif /* GL_APPLE_texture_max_level */ - -/* --------------------- GL_APPLE_texture_packed_float --------------------- */ - -#ifndef GL_APPLE_texture_packed_float -#define GL_APPLE_texture_packed_float 1 - -#define GL_R11F_G11F_B10F_APPLE 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV_APPLE 0x8C3B -#define GL_RGB9_E5_APPLE 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV_APPLE 0x8C3E - -#define GLEW_APPLE_texture_packed_float GLEW_GET_VAR(__GLEW_APPLE_texture_packed_float) - -#endif /* GL_APPLE_texture_packed_float */ - -/* ------------------------- GL_APPLE_texture_range ------------------------ */ - -#ifndef GL_APPLE_texture_range -#define GL_APPLE_texture_range 1 - -#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 -#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 -#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC -#define GL_STORAGE_PRIVATE_APPLE 0x85BD -#define GL_STORAGE_CACHED_APPLE 0x85BE -#define GL_STORAGE_SHARED_APPLE 0x85BF - -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, void **params); -typedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, void *pointer); - -#define glGetTexParameterPointervAPPLE GLEW_GET_FUN(__glewGetTexParameterPointervAPPLE) -#define glTextureRangeAPPLE GLEW_GET_FUN(__glewTextureRangeAPPLE) - -#define GLEW_APPLE_texture_range GLEW_GET_VAR(__GLEW_APPLE_texture_range) - -#endif /* GL_APPLE_texture_range */ - -/* ------------------------ GL_APPLE_transform_hint ------------------------ */ - -#ifndef GL_APPLE_transform_hint -#define GL_APPLE_transform_hint 1 - -#define GL_TRANSFORM_HINT_APPLE 0x85B1 - -#define GLEW_APPLE_transform_hint GLEW_GET_VAR(__GLEW_APPLE_transform_hint) - -#endif /* GL_APPLE_transform_hint */ - -/* ---------------------- GL_APPLE_vertex_array_object --------------------- */ - -#ifndef GL_APPLE_vertex_array_object -#define GL_APPLE_vertex_array_object 1 - -#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 - -typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); -typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); -typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); -typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); - -#define glBindVertexArrayAPPLE GLEW_GET_FUN(__glewBindVertexArrayAPPLE) -#define glDeleteVertexArraysAPPLE GLEW_GET_FUN(__glewDeleteVertexArraysAPPLE) -#define glGenVertexArraysAPPLE GLEW_GET_FUN(__glewGenVertexArraysAPPLE) -#define glIsVertexArrayAPPLE GLEW_GET_FUN(__glewIsVertexArrayAPPLE) - -#define GLEW_APPLE_vertex_array_object GLEW_GET_VAR(__GLEW_APPLE_vertex_array_object) - -#endif /* GL_APPLE_vertex_array_object */ - -/* ---------------------- GL_APPLE_vertex_array_range ---------------------- */ - -#ifndef GL_APPLE_vertex_array_range -#define GL_APPLE_vertex_array_range 1 - -#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E -#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 -#define GL_STORAGE_CLIENT_APPLE 0x85B4 -#define GL_STORAGE_CACHED_APPLE 0x85BE -#define GL_STORAGE_SHARED_APPLE 0x85BF - -typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); - -#define glFlushVertexArrayRangeAPPLE GLEW_GET_FUN(__glewFlushVertexArrayRangeAPPLE) -#define glVertexArrayParameteriAPPLE GLEW_GET_FUN(__glewVertexArrayParameteriAPPLE) -#define glVertexArrayRangeAPPLE GLEW_GET_FUN(__glewVertexArrayRangeAPPLE) - -#define GLEW_APPLE_vertex_array_range GLEW_GET_VAR(__GLEW_APPLE_vertex_array_range) - -#endif /* GL_APPLE_vertex_array_range */ - -/* ------------------- GL_APPLE_vertex_program_evaluators ------------------ */ - -#ifndef GL_APPLE_vertex_program_evaluators -#define GL_APPLE_vertex_program_evaluators 1 - -#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 -#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 -#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 -#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 -#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 -#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 -#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 -#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 -#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 -#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 - -typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); -typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); -typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); -typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points); -typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points); -typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points); -typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points); - -#define glDisableVertexAttribAPPLE GLEW_GET_FUN(__glewDisableVertexAttribAPPLE) -#define glEnableVertexAttribAPPLE GLEW_GET_FUN(__glewEnableVertexAttribAPPLE) -#define glIsVertexAttribEnabledAPPLE GLEW_GET_FUN(__glewIsVertexAttribEnabledAPPLE) -#define glMapVertexAttrib1dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1dAPPLE) -#define glMapVertexAttrib1fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1fAPPLE) -#define glMapVertexAttrib2dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2dAPPLE) -#define glMapVertexAttrib2fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2fAPPLE) - -#define GLEW_APPLE_vertex_program_evaluators GLEW_GET_VAR(__GLEW_APPLE_vertex_program_evaluators) - -#endif /* GL_APPLE_vertex_program_evaluators */ - -/* --------------------------- GL_APPLE_ycbcr_422 -------------------------- */ - -#ifndef GL_APPLE_ycbcr_422 -#define GL_APPLE_ycbcr_422 1 - -#define GL_YCBCR_422_APPLE 0x85B9 - -#define GLEW_APPLE_ycbcr_422 GLEW_GET_VAR(__GLEW_APPLE_ycbcr_422) - -#endif /* GL_APPLE_ycbcr_422 */ - -/* ------------------------ GL_ARB_ES2_compatibility ----------------------- */ - -#ifndef GL_ARB_ES2_compatibility -#define GL_ARB_ES2_compatibility 1 - -#define GL_FIXED 0x140C -#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B -#define GL_RGB565 0x8D62 -#define GL_LOW_FLOAT 0x8DF0 -#define GL_MEDIUM_FLOAT 0x8DF1 -#define GL_HIGH_FLOAT 0x8DF2 -#define GL_LOW_INT 0x8DF3 -#define GL_MEDIUM_INT 0x8DF4 -#define GL_HIGH_INT 0x8DF5 -#define GL_SHADER_BINARY_FORMATS 0x8DF8 -#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 -#define GL_SHADER_COMPILER 0x8DFA -#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB -#define GL_MAX_VARYING_VECTORS 0x8DFC -#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD - -typedef int GLfixed; - -typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFPROC) (GLclampf d); -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFPROC) (GLclampf n, GLclampf f); -typedef void (GLAPIENTRY * PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint *precision); -typedef void (GLAPIENTRY * PFNGLRELEASESHADERCOMPILERPROC) (void); -typedef void (GLAPIENTRY * PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint* shaders, GLenum binaryformat, const void*binary, GLsizei length); - -#define glClearDepthf GLEW_GET_FUN(__glewClearDepthf) -#define glDepthRangef GLEW_GET_FUN(__glewDepthRangef) -#define glGetShaderPrecisionFormat GLEW_GET_FUN(__glewGetShaderPrecisionFormat) -#define glReleaseShaderCompiler GLEW_GET_FUN(__glewReleaseShaderCompiler) -#define glShaderBinary GLEW_GET_FUN(__glewShaderBinary) - -#define GLEW_ARB_ES2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES2_compatibility) - -#endif /* GL_ARB_ES2_compatibility */ - -/* ----------------------- GL_ARB_ES3_1_compatibility ---------------------- */ - -#ifndef GL_ARB_ES3_1_compatibility -#define GL_ARB_ES3_1_compatibility 1 - -typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); - -#define glMemoryBarrierByRegion GLEW_GET_FUN(__glewMemoryBarrierByRegion) - -#define GLEW_ARB_ES3_1_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_1_compatibility) - -#endif /* GL_ARB_ES3_1_compatibility */ - -/* ----------------------- GL_ARB_ES3_2_compatibility ---------------------- */ - -#ifndef GL_ARB_ES3_2_compatibility -#define GL_ARB_ES3_2_compatibility 1 - -#define GL_PRIMITIVE_BOUNDING_BOX_ARB 0x92BE -#define GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB 0x9381 -#define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB 0x9382 - -typedef void (GLAPIENTRY * PFNGLPRIMITIVEBOUNDINGBOXARBPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); - -#define glPrimitiveBoundingBoxARB GLEW_GET_FUN(__glewPrimitiveBoundingBoxARB) - -#define GLEW_ARB_ES3_2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_2_compatibility) - -#endif /* GL_ARB_ES3_2_compatibility */ - -/* ------------------------ GL_ARB_ES3_compatibility ----------------------- */ - -#ifndef GL_ARB_ES3_compatibility -#define GL_ARB_ES3_compatibility 1 - -#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF -#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 -#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A -#define GL_MAX_ELEMENT_INDEX 0x8D6B -#define GL_COMPRESSED_R11_EAC 0x9270 -#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 -#define GL_COMPRESSED_RG11_EAC 0x9272 -#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 -#define GL_COMPRESSED_RGB8_ETC2 0x9274 -#define GL_COMPRESSED_SRGB8_ETC2 0x9275 -#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 -#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 -#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 -#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 - -#define GLEW_ARB_ES3_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_compatibility) - -#endif /* GL_ARB_ES3_compatibility */ - -/* ------------------------ GL_ARB_arrays_of_arrays ------------------------ */ - -#ifndef GL_ARB_arrays_of_arrays -#define GL_ARB_arrays_of_arrays 1 - -#define GLEW_ARB_arrays_of_arrays GLEW_GET_VAR(__GLEW_ARB_arrays_of_arrays) - -#endif /* GL_ARB_arrays_of_arrays */ - -/* -------------------------- GL_ARB_base_instance ------------------------- */ - -#ifndef GL_ARB_base_instance -#define GL_ARB_base_instance 1 - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount, GLuint baseinstance); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLuint baseinstance); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLint basevertex, GLuint baseinstance); - -#define glDrawArraysInstancedBaseInstance GLEW_GET_FUN(__glewDrawArraysInstancedBaseInstance) -#define glDrawElementsInstancedBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseInstance) -#define glDrawElementsInstancedBaseVertexBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexBaseInstance) - -#define GLEW_ARB_base_instance GLEW_GET_VAR(__GLEW_ARB_base_instance) - -#endif /* GL_ARB_base_instance */ - -/* ------------------------ GL_ARB_bindless_texture ------------------------ */ - -#ifndef GL_ARB_bindless_texture -#define GL_ARB_bindless_texture 1 - -#define GL_UNSIGNED_INT64_ARB 0x140F - -typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); -typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); -typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT* params); -typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); -typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); -typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); -typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); -typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT* v); - -#define glGetImageHandleARB GLEW_GET_FUN(__glewGetImageHandleARB) -#define glGetTextureHandleARB GLEW_GET_FUN(__glewGetTextureHandleARB) -#define glGetTextureSamplerHandleARB GLEW_GET_FUN(__glewGetTextureSamplerHandleARB) -#define glGetVertexAttribLui64vARB GLEW_GET_FUN(__glewGetVertexAttribLui64vARB) -#define glIsImageHandleResidentARB GLEW_GET_FUN(__glewIsImageHandleResidentARB) -#define glIsTextureHandleResidentARB GLEW_GET_FUN(__glewIsTextureHandleResidentARB) -#define glMakeImageHandleNonResidentARB GLEW_GET_FUN(__glewMakeImageHandleNonResidentARB) -#define glMakeImageHandleResidentARB GLEW_GET_FUN(__glewMakeImageHandleResidentARB) -#define glMakeTextureHandleNonResidentARB GLEW_GET_FUN(__glewMakeTextureHandleNonResidentARB) -#define glMakeTextureHandleResidentARB GLEW_GET_FUN(__glewMakeTextureHandleResidentARB) -#define glProgramUniformHandleui64ARB GLEW_GET_FUN(__glewProgramUniformHandleui64ARB) -#define glProgramUniformHandleui64vARB GLEW_GET_FUN(__glewProgramUniformHandleui64vARB) -#define glUniformHandleui64ARB GLEW_GET_FUN(__glewUniformHandleui64ARB) -#define glUniformHandleui64vARB GLEW_GET_FUN(__glewUniformHandleui64vARB) -#define glVertexAttribL1ui64ARB GLEW_GET_FUN(__glewVertexAttribL1ui64ARB) -#define glVertexAttribL1ui64vARB GLEW_GET_FUN(__glewVertexAttribL1ui64vARB) - -#define GLEW_ARB_bindless_texture GLEW_GET_VAR(__GLEW_ARB_bindless_texture) - -#endif /* GL_ARB_bindless_texture */ - -/* ----------------------- GL_ARB_blend_func_extended ---------------------- */ - -#ifndef GL_ARB_blend_func_extended -#define GL_ARB_blend_func_extended 1 - -#define GL_SRC1_COLOR 0x88F9 -#define GL_ONE_MINUS_SRC1_COLOR 0x88FA -#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB -#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC - -typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); -typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar * name); - -#define glBindFragDataLocationIndexed GLEW_GET_FUN(__glewBindFragDataLocationIndexed) -#define glGetFragDataIndex GLEW_GET_FUN(__glewGetFragDataIndex) - -#define GLEW_ARB_blend_func_extended GLEW_GET_VAR(__GLEW_ARB_blend_func_extended) - -#endif /* GL_ARB_blend_func_extended */ - -/* ------------------------- GL_ARB_buffer_storage ------------------------- */ - -#ifndef GL_ARB_buffer_storage -#define GL_ARB_buffer_storage 1 - -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAP_PERSISTENT_BIT 0x00000040 -#define GL_MAP_COHERENT_BIT 0x00000080 -#define GL_DYNAMIC_STORAGE_BIT 0x0100 -#define GL_CLIENT_STORAGE_BIT 0x0200 -#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 -#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F -#define GL_BUFFER_STORAGE_FLAGS 0x8220 - -typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); - -#define glBufferStorage GLEW_GET_FUN(__glewBufferStorage) - -#define GLEW_ARB_buffer_storage GLEW_GET_VAR(__GLEW_ARB_buffer_storage) - -#endif /* GL_ARB_buffer_storage */ - -/* ---------------------------- GL_ARB_cl_event ---------------------------- */ - -#ifndef GL_ARB_cl_event -#define GL_ARB_cl_event 1 - -#define GL_SYNC_CL_EVENT_ARB 0x8240 -#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 - -typedef struct _cl_context *cl_context; -typedef struct _cl_event *cl_event; - -typedef GLsync (GLAPIENTRY * PFNGLCREATESYNCFROMCLEVENTARBPROC) (cl_context context, cl_event event, GLbitfield flags); - -#define glCreateSyncFromCLeventARB GLEW_GET_FUN(__glewCreateSyncFromCLeventARB) - -#define GLEW_ARB_cl_event GLEW_GET_VAR(__GLEW_ARB_cl_event) - -#endif /* GL_ARB_cl_event */ - -/* ----------------------- GL_ARB_clear_buffer_object ---------------------- */ - -#ifndef GL_ARB_clear_buffer_object -#define GL_ARB_clear_buffer_object 1 - -typedef void (GLAPIENTRY * PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); - -#define glClearBufferData GLEW_GET_FUN(__glewClearBufferData) -#define glClearBufferSubData GLEW_GET_FUN(__glewClearBufferSubData) -#define glClearNamedBufferDataEXT GLEW_GET_FUN(__glewClearNamedBufferDataEXT) -#define glClearNamedBufferSubDataEXT GLEW_GET_FUN(__glewClearNamedBufferSubDataEXT) - -#define GLEW_ARB_clear_buffer_object GLEW_GET_VAR(__GLEW_ARB_clear_buffer_object) - -#endif /* GL_ARB_clear_buffer_object */ - -/* -------------------------- GL_ARB_clear_texture ------------------------- */ - -#ifndef GL_ARB_clear_texture -#define GL_ARB_clear_texture 1 - -#define GL_CLEAR_TEXTURE 0x9365 - -typedef void (GLAPIENTRY * PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); - -#define glClearTexImage GLEW_GET_FUN(__glewClearTexImage) -#define glClearTexSubImage GLEW_GET_FUN(__glewClearTexSubImage) - -#define GLEW_ARB_clear_texture GLEW_GET_VAR(__GLEW_ARB_clear_texture) - -#endif /* GL_ARB_clear_texture */ - -/* -------------------------- GL_ARB_clip_control -------------------------- */ - -#ifndef GL_ARB_clip_control -#define GL_ARB_clip_control 1 - -#define GL_LOWER_LEFT 0x8CA1 -#define GL_UPPER_LEFT 0x8CA2 -#define GL_CLIP_ORIGIN 0x935C -#define GL_CLIP_DEPTH_MODE 0x935D -#define GL_NEGATIVE_ONE_TO_ONE 0x935E -#define GL_ZERO_TO_ONE 0x935F - -typedef void (GLAPIENTRY * PFNGLCLIPCONTROLPROC) (GLenum origin, GLenum depth); - -#define glClipControl GLEW_GET_FUN(__glewClipControl) - -#define GLEW_ARB_clip_control GLEW_GET_VAR(__GLEW_ARB_clip_control) - -#endif /* GL_ARB_clip_control */ - -/* ----------------------- GL_ARB_color_buffer_float ----------------------- */ - -#ifndef GL_ARB_color_buffer_float -#define GL_ARB_color_buffer_float 1 - -#define GL_RGBA_FLOAT_MODE_ARB 0x8820 -#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A -#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B -#define GL_CLAMP_READ_COLOR_ARB 0x891C -#define GL_FIXED_ONLY_ARB 0x891D - -typedef void (GLAPIENTRY * PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); - -#define glClampColorARB GLEW_GET_FUN(__glewClampColorARB) - -#define GLEW_ARB_color_buffer_float GLEW_GET_VAR(__GLEW_ARB_color_buffer_float) - -#endif /* GL_ARB_color_buffer_float */ - -/* -------------------------- GL_ARB_compatibility ------------------------- */ - -#ifndef GL_ARB_compatibility -#define GL_ARB_compatibility 1 - -#define GLEW_ARB_compatibility GLEW_GET_VAR(__GLEW_ARB_compatibility) - -#endif /* GL_ARB_compatibility */ - -/* ---------------- GL_ARB_compressed_texture_pixel_storage ---------------- */ - -#ifndef GL_ARB_compressed_texture_pixel_storage -#define GL_ARB_compressed_texture_pixel_storage 1 - -#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 -#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 -#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 -#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A -#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B -#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C -#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D -#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E - -#define GLEW_ARB_compressed_texture_pixel_storage GLEW_GET_VAR(__GLEW_ARB_compressed_texture_pixel_storage) - -#endif /* GL_ARB_compressed_texture_pixel_storage */ - -/* ------------------------- GL_ARB_compute_shader ------------------------- */ - -#ifndef GL_ARB_compute_shader -#define GL_ARB_compute_shader 1 - -#define GL_COMPUTE_SHADER_BIT 0x00000020 -#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 -#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 -#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 -#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 -#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 -#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 -#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB -#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED -#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE -#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF -#define GL_COMPUTE_SHADER 0x91B9 -#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB -#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC -#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD -#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE -#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF - -typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); -typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); - -#define glDispatchCompute GLEW_GET_FUN(__glewDispatchCompute) -#define glDispatchComputeIndirect GLEW_GET_FUN(__glewDispatchComputeIndirect) - -#define GLEW_ARB_compute_shader GLEW_GET_VAR(__GLEW_ARB_compute_shader) - -#endif /* GL_ARB_compute_shader */ - -/* ------------------- GL_ARB_compute_variable_group_size ------------------ */ - -#ifndef GL_ARB_compute_variable_group_size -#define GL_ARB_compute_variable_group_size 1 - -#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB -#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF -#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 -#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 - -typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); - -#define glDispatchComputeGroupSizeARB GLEW_GET_FUN(__glewDispatchComputeGroupSizeARB) - -#define GLEW_ARB_compute_variable_group_size GLEW_GET_VAR(__GLEW_ARB_compute_variable_group_size) - -#endif /* GL_ARB_compute_variable_group_size */ - -/* ------------------- GL_ARB_conditional_render_inverted ------------------ */ - -#ifndef GL_ARB_conditional_render_inverted -#define GL_ARB_conditional_render_inverted 1 - -#define GL_QUERY_WAIT_INVERTED 0x8E17 -#define GL_QUERY_NO_WAIT_INVERTED 0x8E18 -#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 -#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A - -#define GLEW_ARB_conditional_render_inverted GLEW_GET_VAR(__GLEW_ARB_conditional_render_inverted) - -#endif /* GL_ARB_conditional_render_inverted */ - -/* ----------------------- GL_ARB_conservative_depth ----------------------- */ - -#ifndef GL_ARB_conservative_depth -#define GL_ARB_conservative_depth 1 - -#define GLEW_ARB_conservative_depth GLEW_GET_VAR(__GLEW_ARB_conservative_depth) - -#endif /* GL_ARB_conservative_depth */ - -/* --------------------------- GL_ARB_copy_buffer -------------------------- */ - -#ifndef GL_ARB_copy_buffer -#define GL_ARB_copy_buffer 1 - -#define GL_COPY_READ_BUFFER 0x8F36 -#define GL_COPY_WRITE_BUFFER 0x8F37 - -typedef void (GLAPIENTRY * PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size); - -#define glCopyBufferSubData GLEW_GET_FUN(__glewCopyBufferSubData) - -#define GLEW_ARB_copy_buffer GLEW_GET_VAR(__GLEW_ARB_copy_buffer) - -#endif /* GL_ARB_copy_buffer */ - -/* --------------------------- GL_ARB_copy_image --------------------------- */ - -#ifndef GL_ARB_copy_image -#define GL_ARB_copy_image 1 - -typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); - -#define glCopyImageSubData GLEW_GET_FUN(__glewCopyImageSubData) - -#define GLEW_ARB_copy_image GLEW_GET_VAR(__GLEW_ARB_copy_image) - -#endif /* GL_ARB_copy_image */ - -/* -------------------------- GL_ARB_cull_distance ------------------------- */ - -#ifndef GL_ARB_cull_distance -#define GL_ARB_cull_distance 1 - -#define GL_MAX_CULL_DISTANCES 0x82F9 -#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA - -#define GLEW_ARB_cull_distance GLEW_GET_VAR(__GLEW_ARB_cull_distance) - -#endif /* GL_ARB_cull_distance */ - -/* -------------------------- GL_ARB_debug_output -------------------------- */ - -#ifndef GL_ARB_debug_output -#define GL_ARB_debug_output 1 - -#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 -#define GL_DEBUG_SOURCE_API_ARB 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A -#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B -#define GL_DEBUG_TYPE_ERROR_ARB 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E -#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 -#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 -#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 -#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 -#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 - -typedef void (GLAPIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); - -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); -typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); - -#define glDebugMessageCallbackARB GLEW_GET_FUN(__glewDebugMessageCallbackARB) -#define glDebugMessageControlARB GLEW_GET_FUN(__glewDebugMessageControlARB) -#define glDebugMessageInsertARB GLEW_GET_FUN(__glewDebugMessageInsertARB) -#define glGetDebugMessageLogARB GLEW_GET_FUN(__glewGetDebugMessageLogARB) - -#define GLEW_ARB_debug_output GLEW_GET_VAR(__GLEW_ARB_debug_output) - -#endif /* GL_ARB_debug_output */ - -/* ----------------------- GL_ARB_depth_buffer_float ----------------------- */ - -#ifndef GL_ARB_depth_buffer_float -#define GL_ARB_depth_buffer_float 1 - -#define GL_DEPTH_COMPONENT32F 0x8CAC -#define GL_DEPTH32F_STENCIL8 0x8CAD -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD - -#define GLEW_ARB_depth_buffer_float GLEW_GET_VAR(__GLEW_ARB_depth_buffer_float) - -#endif /* GL_ARB_depth_buffer_float */ - -/* --------------------------- GL_ARB_depth_clamp -------------------------- */ - -#ifndef GL_ARB_depth_clamp -#define GL_ARB_depth_clamp 1 - -#define GL_DEPTH_CLAMP 0x864F - -#define GLEW_ARB_depth_clamp GLEW_GET_VAR(__GLEW_ARB_depth_clamp) - -#endif /* GL_ARB_depth_clamp */ - -/* -------------------------- GL_ARB_depth_texture ------------------------- */ - -#ifndef GL_ARB_depth_texture -#define GL_ARB_depth_texture 1 - -#define GL_DEPTH_COMPONENT16_ARB 0x81A5 -#define GL_DEPTH_COMPONENT24_ARB 0x81A6 -#define GL_DEPTH_COMPONENT32_ARB 0x81A7 -#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A -#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B - -#define GLEW_ARB_depth_texture GLEW_GET_VAR(__GLEW_ARB_depth_texture) - -#endif /* GL_ARB_depth_texture */ - -/* ----------------------- GL_ARB_derivative_control ----------------------- */ - -#ifndef GL_ARB_derivative_control -#define GL_ARB_derivative_control 1 - -#define GLEW_ARB_derivative_control GLEW_GET_VAR(__GLEW_ARB_derivative_control) - -#endif /* GL_ARB_derivative_control */ - -/* ----------------------- GL_ARB_direct_state_access ---------------------- */ - -#ifndef GL_ARB_direct_state_access -#define GL_ARB_direct_state_access 1 - -#define GL_TEXTURE_TARGET 0x1006 -#define GL_QUERY_TARGET 0x82EA - -typedef void (GLAPIENTRY * PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture); -typedef void (GLAPIENTRY * PFNGLBLITNAMEDFRAMEBUFFERPROC) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat* value); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint* value); -typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLCREATEBUFFERSPROC) (GLsizei n, GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers); -typedef void (GLAPIENTRY * PFNGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines); -typedef void (GLAPIENTRY * PFNGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers); -typedef void (GLAPIENTRY * PFNGLCREATESAMPLERSPROC) (GLsizei n, GLuint* samplers); -typedef void (GLAPIENTRY * PFNGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint* textures); -typedef void (GLAPIENTRY * PFNGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays); -typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); -typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); -typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void** params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); -typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTUI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTUIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); -typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64* param); -typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64* param); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments); -typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access); -typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum mode); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum mode); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat* param); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint* param); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides); - -#define glBindTextureUnit GLEW_GET_FUN(__glewBindTextureUnit) -#define glBlitNamedFramebuffer GLEW_GET_FUN(__glewBlitNamedFramebuffer) -#define glCheckNamedFramebufferStatus GLEW_GET_FUN(__glewCheckNamedFramebufferStatus) -#define glClearNamedBufferData GLEW_GET_FUN(__glewClearNamedBufferData) -#define glClearNamedBufferSubData GLEW_GET_FUN(__glewClearNamedBufferSubData) -#define glClearNamedFramebufferfi GLEW_GET_FUN(__glewClearNamedFramebufferfi) -#define glClearNamedFramebufferfv GLEW_GET_FUN(__glewClearNamedFramebufferfv) -#define glClearNamedFramebufferiv GLEW_GET_FUN(__glewClearNamedFramebufferiv) -#define glClearNamedFramebufferuiv GLEW_GET_FUN(__glewClearNamedFramebufferuiv) -#define glCompressedTextureSubImage1D GLEW_GET_FUN(__glewCompressedTextureSubImage1D) -#define glCompressedTextureSubImage2D GLEW_GET_FUN(__glewCompressedTextureSubImage2D) -#define glCompressedTextureSubImage3D GLEW_GET_FUN(__glewCompressedTextureSubImage3D) -#define glCopyNamedBufferSubData GLEW_GET_FUN(__glewCopyNamedBufferSubData) -#define glCopyTextureSubImage1D GLEW_GET_FUN(__glewCopyTextureSubImage1D) -#define glCopyTextureSubImage2D GLEW_GET_FUN(__glewCopyTextureSubImage2D) -#define glCopyTextureSubImage3D GLEW_GET_FUN(__glewCopyTextureSubImage3D) -#define glCreateBuffers GLEW_GET_FUN(__glewCreateBuffers) -#define glCreateFramebuffers GLEW_GET_FUN(__glewCreateFramebuffers) -#define glCreateProgramPipelines GLEW_GET_FUN(__glewCreateProgramPipelines) -#define glCreateQueries GLEW_GET_FUN(__glewCreateQueries) -#define glCreateRenderbuffers GLEW_GET_FUN(__glewCreateRenderbuffers) -#define glCreateSamplers GLEW_GET_FUN(__glewCreateSamplers) -#define glCreateTextures GLEW_GET_FUN(__glewCreateTextures) -#define glCreateTransformFeedbacks GLEW_GET_FUN(__glewCreateTransformFeedbacks) -#define glCreateVertexArrays GLEW_GET_FUN(__glewCreateVertexArrays) -#define glDisableVertexArrayAttrib GLEW_GET_FUN(__glewDisableVertexArrayAttrib) -#define glEnableVertexArrayAttrib GLEW_GET_FUN(__glewEnableVertexArrayAttrib) -#define glFlushMappedNamedBufferRange GLEW_GET_FUN(__glewFlushMappedNamedBufferRange) -#define glGenerateTextureMipmap GLEW_GET_FUN(__glewGenerateTextureMipmap) -#define glGetCompressedTextureImage GLEW_GET_FUN(__glewGetCompressedTextureImage) -#define glGetNamedBufferParameteri64v GLEW_GET_FUN(__glewGetNamedBufferParameteri64v) -#define glGetNamedBufferParameteriv GLEW_GET_FUN(__glewGetNamedBufferParameteriv) -#define glGetNamedBufferPointerv GLEW_GET_FUN(__glewGetNamedBufferPointerv) -#define glGetNamedBufferSubData GLEW_GET_FUN(__glewGetNamedBufferSubData) -#define glGetNamedFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameteriv) -#define glGetNamedFramebufferParameteriv GLEW_GET_FUN(__glewGetNamedFramebufferParameteriv) -#define glGetNamedRenderbufferParameteriv GLEW_GET_FUN(__glewGetNamedRenderbufferParameteriv) -#define glGetQueryBufferObjecti64v GLEW_GET_FUN(__glewGetQueryBufferObjecti64v) -#define glGetQueryBufferObjectiv GLEW_GET_FUN(__glewGetQueryBufferObjectiv) -#define glGetQueryBufferObjectui64v GLEW_GET_FUN(__glewGetQueryBufferObjectui64v) -#define glGetQueryBufferObjectuiv GLEW_GET_FUN(__glewGetQueryBufferObjectuiv) -#define glGetTextureImage GLEW_GET_FUN(__glewGetTextureImage) -#define glGetTextureLevelParameterfv GLEW_GET_FUN(__glewGetTextureLevelParameterfv) -#define glGetTextureLevelParameteriv GLEW_GET_FUN(__glewGetTextureLevelParameteriv) -#define glGetTextureParameterIiv GLEW_GET_FUN(__glewGetTextureParameterIiv) -#define glGetTextureParameterIuiv GLEW_GET_FUN(__glewGetTextureParameterIuiv) -#define glGetTextureParameterfv GLEW_GET_FUN(__glewGetTextureParameterfv) -#define glGetTextureParameteriv GLEW_GET_FUN(__glewGetTextureParameteriv) -#define glGetTransformFeedbacki64_v GLEW_GET_FUN(__glewGetTransformFeedbacki64_v) -#define glGetTransformFeedbacki_v GLEW_GET_FUN(__glewGetTransformFeedbacki_v) -#define glGetTransformFeedbackiv GLEW_GET_FUN(__glewGetTransformFeedbackiv) -#define glGetVertexArrayIndexed64iv GLEW_GET_FUN(__glewGetVertexArrayIndexed64iv) -#define glGetVertexArrayIndexediv GLEW_GET_FUN(__glewGetVertexArrayIndexediv) -#define glGetVertexArrayiv GLEW_GET_FUN(__glewGetVertexArrayiv) -#define glInvalidateNamedFramebufferData GLEW_GET_FUN(__glewInvalidateNamedFramebufferData) -#define glInvalidateNamedFramebufferSubData GLEW_GET_FUN(__glewInvalidateNamedFramebufferSubData) -#define glMapNamedBuffer GLEW_GET_FUN(__glewMapNamedBuffer) -#define glMapNamedBufferRange GLEW_GET_FUN(__glewMapNamedBufferRange) -#define glNamedBufferData GLEW_GET_FUN(__glewNamedBufferData) -#define glNamedBufferStorage GLEW_GET_FUN(__glewNamedBufferStorage) -#define glNamedBufferSubData GLEW_GET_FUN(__glewNamedBufferSubData) -#define glNamedFramebufferDrawBuffer GLEW_GET_FUN(__glewNamedFramebufferDrawBuffer) -#define glNamedFramebufferDrawBuffers GLEW_GET_FUN(__glewNamedFramebufferDrawBuffers) -#define glNamedFramebufferParameteri GLEW_GET_FUN(__glewNamedFramebufferParameteri) -#define glNamedFramebufferReadBuffer GLEW_GET_FUN(__glewNamedFramebufferReadBuffer) -#define glNamedFramebufferRenderbuffer GLEW_GET_FUN(__glewNamedFramebufferRenderbuffer) -#define glNamedFramebufferTexture GLEW_GET_FUN(__glewNamedFramebufferTexture) -#define glNamedFramebufferTextureLayer GLEW_GET_FUN(__glewNamedFramebufferTextureLayer) -#define glNamedRenderbufferStorage GLEW_GET_FUN(__glewNamedRenderbufferStorage) -#define glNamedRenderbufferStorageMultisample GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisample) -#define glTextureBuffer GLEW_GET_FUN(__glewTextureBuffer) -#define glTextureBufferRange GLEW_GET_FUN(__glewTextureBufferRange) -#define glTextureParameterIiv GLEW_GET_FUN(__glewTextureParameterIiv) -#define glTextureParameterIuiv GLEW_GET_FUN(__glewTextureParameterIuiv) -#define glTextureParameterf GLEW_GET_FUN(__glewTextureParameterf) -#define glTextureParameterfv GLEW_GET_FUN(__glewTextureParameterfv) -#define glTextureParameteri GLEW_GET_FUN(__glewTextureParameteri) -#define glTextureParameteriv GLEW_GET_FUN(__glewTextureParameteriv) -#define glTextureStorage1D GLEW_GET_FUN(__glewTextureStorage1D) -#define glTextureStorage2D GLEW_GET_FUN(__glewTextureStorage2D) -#define glTextureStorage2DMultisample GLEW_GET_FUN(__glewTextureStorage2DMultisample) -#define glTextureStorage3D GLEW_GET_FUN(__glewTextureStorage3D) -#define glTextureStorage3DMultisample GLEW_GET_FUN(__glewTextureStorage3DMultisample) -#define glTextureSubImage1D GLEW_GET_FUN(__glewTextureSubImage1D) -#define glTextureSubImage2D GLEW_GET_FUN(__glewTextureSubImage2D) -#define glTextureSubImage3D GLEW_GET_FUN(__glewTextureSubImage3D) -#define glTransformFeedbackBufferBase GLEW_GET_FUN(__glewTransformFeedbackBufferBase) -#define glTransformFeedbackBufferRange GLEW_GET_FUN(__glewTransformFeedbackBufferRange) -#define glUnmapNamedBuffer GLEW_GET_FUN(__glewUnmapNamedBuffer) -#define glVertexArrayAttribBinding GLEW_GET_FUN(__glewVertexArrayAttribBinding) -#define glVertexArrayAttribFormat GLEW_GET_FUN(__glewVertexArrayAttribFormat) -#define glVertexArrayAttribIFormat GLEW_GET_FUN(__glewVertexArrayAttribIFormat) -#define glVertexArrayAttribLFormat GLEW_GET_FUN(__glewVertexArrayAttribLFormat) -#define glVertexArrayBindingDivisor GLEW_GET_FUN(__glewVertexArrayBindingDivisor) -#define glVertexArrayElementBuffer GLEW_GET_FUN(__glewVertexArrayElementBuffer) -#define glVertexArrayVertexBuffer GLEW_GET_FUN(__glewVertexArrayVertexBuffer) -#define glVertexArrayVertexBuffers GLEW_GET_FUN(__glewVertexArrayVertexBuffers) - -#define GLEW_ARB_direct_state_access GLEW_GET_VAR(__GLEW_ARB_direct_state_access) - -#endif /* GL_ARB_direct_state_access */ - -/* -------------------------- GL_ARB_draw_buffers -------------------------- */ - -#ifndef GL_ARB_draw_buffers -#define GL_ARB_draw_buffers 1 - -#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 -#define GL_DRAW_BUFFER0_ARB 0x8825 -#define GL_DRAW_BUFFER1_ARB 0x8826 -#define GL_DRAW_BUFFER2_ARB 0x8827 -#define GL_DRAW_BUFFER3_ARB 0x8828 -#define GL_DRAW_BUFFER4_ARB 0x8829 -#define GL_DRAW_BUFFER5_ARB 0x882A -#define GL_DRAW_BUFFER6_ARB 0x882B -#define GL_DRAW_BUFFER7_ARB 0x882C -#define GL_DRAW_BUFFER8_ARB 0x882D -#define GL_DRAW_BUFFER9_ARB 0x882E -#define GL_DRAW_BUFFER10_ARB 0x882F -#define GL_DRAW_BUFFER11_ARB 0x8830 -#define GL_DRAW_BUFFER12_ARB 0x8831 -#define GL_DRAW_BUFFER13_ARB 0x8832 -#define GL_DRAW_BUFFER14_ARB 0x8833 -#define GL_DRAW_BUFFER15_ARB 0x8834 - -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum* bufs); - -#define glDrawBuffersARB GLEW_GET_FUN(__glewDrawBuffersARB) - -#define GLEW_ARB_draw_buffers GLEW_GET_VAR(__GLEW_ARB_draw_buffers) - -#endif /* GL_ARB_draw_buffers */ - -/* ----------------------- GL_ARB_draw_buffers_blend ----------------------- */ - -#ifndef GL_ARB_draw_buffers_blend -#define GL_ARB_draw_buffers_blend 1 - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); - -#define glBlendEquationSeparateiARB GLEW_GET_FUN(__glewBlendEquationSeparateiARB) -#define glBlendEquationiARB GLEW_GET_FUN(__glewBlendEquationiARB) -#define glBlendFuncSeparateiARB GLEW_GET_FUN(__glewBlendFuncSeparateiARB) -#define glBlendFunciARB GLEW_GET_FUN(__glewBlendFunciARB) - -#define GLEW_ARB_draw_buffers_blend GLEW_GET_VAR(__GLEW_ARB_draw_buffers_blend) - -#endif /* GL_ARB_draw_buffers_blend */ - -/* -------------------- GL_ARB_draw_elements_base_vertex ------------------- */ - -#ifndef GL_ARB_draw_elements_base_vertex -#define GL_ARB_draw_elements_base_vertex 1 - -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, void *indices, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, void *indices, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei* count, GLenum type, void**indices, GLsizei primcount, GLint *basevertex); - -#define glDrawElementsBaseVertex GLEW_GET_FUN(__glewDrawElementsBaseVertex) -#define glDrawElementsInstancedBaseVertex GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertex) -#define glDrawRangeElementsBaseVertex GLEW_GET_FUN(__glewDrawRangeElementsBaseVertex) -#define glMultiDrawElementsBaseVertex GLEW_GET_FUN(__glewMultiDrawElementsBaseVertex) - -#define GLEW_ARB_draw_elements_base_vertex GLEW_GET_VAR(__GLEW_ARB_draw_elements_base_vertex) - -#endif /* GL_ARB_draw_elements_base_vertex */ - -/* -------------------------- GL_ARB_draw_indirect ------------------------- */ - -#ifndef GL_ARB_draw_indirect -#define GL_ARB_draw_indirect 1 - -#define GL_DRAW_INDIRECT_BUFFER 0x8F3F -#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); - -#define glDrawArraysIndirect GLEW_GET_FUN(__glewDrawArraysIndirect) -#define glDrawElementsIndirect GLEW_GET_FUN(__glewDrawElementsIndirect) - -#define GLEW_ARB_draw_indirect GLEW_GET_VAR(__GLEW_ARB_draw_indirect) - -#endif /* GL_ARB_draw_indirect */ - -/* ------------------------- GL_ARB_draw_instanced ------------------------- */ - -#ifndef GL_ARB_draw_instanced -#define GL_ARB_draw_instanced 1 - -#define GLEW_ARB_draw_instanced GLEW_GET_VAR(__GLEW_ARB_draw_instanced) - -#endif /* GL_ARB_draw_instanced */ - -/* ------------------------ GL_ARB_enhanced_layouts ------------------------ */ - -#ifndef GL_ARB_enhanced_layouts -#define GL_ARB_enhanced_layouts 1 - -#define GL_LOCATION_COMPONENT 0x934A -#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B -#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C - -#define GLEW_ARB_enhanced_layouts GLEW_GET_VAR(__GLEW_ARB_enhanced_layouts) - -#endif /* GL_ARB_enhanced_layouts */ - -/* -------------------- GL_ARB_explicit_attrib_location -------------------- */ - -#ifndef GL_ARB_explicit_attrib_location -#define GL_ARB_explicit_attrib_location 1 - -#define GLEW_ARB_explicit_attrib_location GLEW_GET_VAR(__GLEW_ARB_explicit_attrib_location) - -#endif /* GL_ARB_explicit_attrib_location */ - -/* -------------------- GL_ARB_explicit_uniform_location ------------------- */ - -#ifndef GL_ARB_explicit_uniform_location -#define GL_ARB_explicit_uniform_location 1 - -#define GL_MAX_UNIFORM_LOCATIONS 0x826E - -#define GLEW_ARB_explicit_uniform_location GLEW_GET_VAR(__GLEW_ARB_explicit_uniform_location) - -#endif /* GL_ARB_explicit_uniform_location */ - -/* ------------------- GL_ARB_fragment_coord_conventions ------------------- */ - -#ifndef GL_ARB_fragment_coord_conventions -#define GL_ARB_fragment_coord_conventions 1 - -#define GLEW_ARB_fragment_coord_conventions GLEW_GET_VAR(__GLEW_ARB_fragment_coord_conventions) - -#endif /* GL_ARB_fragment_coord_conventions */ - -/* --------------------- GL_ARB_fragment_layer_viewport -------------------- */ - -#ifndef GL_ARB_fragment_layer_viewport -#define GL_ARB_fragment_layer_viewport 1 - -#define GLEW_ARB_fragment_layer_viewport GLEW_GET_VAR(__GLEW_ARB_fragment_layer_viewport) - -#endif /* GL_ARB_fragment_layer_viewport */ - -/* ------------------------ GL_ARB_fragment_program ------------------------ */ - -#ifndef GL_ARB_fragment_program -#define GL_ARB_fragment_program 1 - -#define GL_FRAGMENT_PROGRAM_ARB 0x8804 -#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 -#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 -#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 -#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 -#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 -#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A -#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B -#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C -#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D -#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E -#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F -#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 -#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 - -#define GLEW_ARB_fragment_program GLEW_GET_VAR(__GLEW_ARB_fragment_program) - -#endif /* GL_ARB_fragment_program */ - -/* --------------------- GL_ARB_fragment_program_shadow -------------------- */ - -#ifndef GL_ARB_fragment_program_shadow -#define GL_ARB_fragment_program_shadow 1 - -#define GLEW_ARB_fragment_program_shadow GLEW_GET_VAR(__GLEW_ARB_fragment_program_shadow) - -#endif /* GL_ARB_fragment_program_shadow */ - -/* ------------------------- GL_ARB_fragment_shader ------------------------ */ - -#ifndef GL_ARB_fragment_shader -#define GL_ARB_fragment_shader 1 - -#define GL_FRAGMENT_SHADER_ARB 0x8B30 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B - -#define GLEW_ARB_fragment_shader GLEW_GET_VAR(__GLEW_ARB_fragment_shader) - -#endif /* GL_ARB_fragment_shader */ - -/* -------------------- GL_ARB_fragment_shader_interlock ------------------- */ - -#ifndef GL_ARB_fragment_shader_interlock -#define GL_ARB_fragment_shader_interlock 1 - -#define GLEW_ARB_fragment_shader_interlock GLEW_GET_VAR(__GLEW_ARB_fragment_shader_interlock) - -#endif /* GL_ARB_fragment_shader_interlock */ - -/* ------------------- GL_ARB_framebuffer_no_attachments ------------------- */ - -#ifndef GL_ARB_framebuffer_no_attachments -#define GL_ARB_framebuffer_no_attachments 1 - -#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 -#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 -#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 -#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 -#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 -#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 -#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 -#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 -#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); - -#define glFramebufferParameteri GLEW_GET_FUN(__glewFramebufferParameteri) -#define glGetFramebufferParameteriv GLEW_GET_FUN(__glewGetFramebufferParameteriv) -#define glGetNamedFramebufferParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferParameterivEXT) -#define glNamedFramebufferParameteriEXT GLEW_GET_FUN(__glewNamedFramebufferParameteriEXT) - -#define GLEW_ARB_framebuffer_no_attachments GLEW_GET_VAR(__GLEW_ARB_framebuffer_no_attachments) - -#endif /* GL_ARB_framebuffer_no_attachments */ - -/* ----------------------- GL_ARB_framebuffer_object ----------------------- */ - -#ifndef GL_ARB_framebuffer_object -#define GL_ARB_framebuffer_object 1 - -#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 -#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 -#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 -#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 -#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 -#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 -#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 -#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 -#define GL_FRAMEBUFFER_DEFAULT 0x8218 -#define GL_FRAMEBUFFER_UNDEFINED 0x8219 -#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A -#define GL_INDEX 0x8222 -#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 -#define GL_DEPTH_STENCIL 0x84F9 -#define GL_UNSIGNED_INT_24_8 0x84FA -#define GL_DEPTH24_STENCIL8 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE 0x88F1 -#define GL_UNSIGNED_NORMALIZED 0x8C17 -#define GL_SRGB 0x8C40 -#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_RENDERBUFFER_BINDING 0x8CA7 -#define GL_READ_FRAMEBUFFER 0x8CA8 -#define GL_DRAW_FRAMEBUFFER 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA -#define GL_RENDERBUFFER_SAMPLES 0x8CAB -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF -#define GL_COLOR_ATTACHMENT0 0x8CE0 -#define GL_COLOR_ATTACHMENT1 0x8CE1 -#define GL_COLOR_ATTACHMENT2 0x8CE2 -#define GL_COLOR_ATTACHMENT3 0x8CE3 -#define GL_COLOR_ATTACHMENT4 0x8CE4 -#define GL_COLOR_ATTACHMENT5 0x8CE5 -#define GL_COLOR_ATTACHMENT6 0x8CE6 -#define GL_COLOR_ATTACHMENT7 0x8CE7 -#define GL_COLOR_ATTACHMENT8 0x8CE8 -#define GL_COLOR_ATTACHMENT9 0x8CE9 -#define GL_COLOR_ATTACHMENT10 0x8CEA -#define GL_COLOR_ATTACHMENT11 0x8CEB -#define GL_COLOR_ATTACHMENT12 0x8CEC -#define GL_COLOR_ATTACHMENT13 0x8CED -#define GL_COLOR_ATTACHMENT14 0x8CEE -#define GL_COLOR_ATTACHMENT15 0x8CEF -#define GL_DEPTH_ATTACHMENT 0x8D00 -#define GL_STENCIL_ATTACHMENT 0x8D20 -#define GL_FRAMEBUFFER 0x8D40 -#define GL_RENDERBUFFER 0x8D41 -#define GL_RENDERBUFFER_WIDTH 0x8D42 -#define GL_RENDERBUFFER_HEIGHT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 -#define GL_STENCIL_INDEX1 0x8D46 -#define GL_STENCIL_INDEX4 0x8D47 -#define GL_STENCIL_INDEX8 0x8D48 -#define GL_STENCIL_INDEX16 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 -#define GL_MAX_SAMPLES 0x8D57 - -typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); -typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint* framebuffers); -typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint* renderbuffers); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint layer); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer); -typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers); -typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers); -typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); -typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - -#define glBindFramebuffer GLEW_GET_FUN(__glewBindFramebuffer) -#define glBindRenderbuffer GLEW_GET_FUN(__glewBindRenderbuffer) -#define glBlitFramebuffer GLEW_GET_FUN(__glewBlitFramebuffer) -#define glCheckFramebufferStatus GLEW_GET_FUN(__glewCheckFramebufferStatus) -#define glDeleteFramebuffers GLEW_GET_FUN(__glewDeleteFramebuffers) -#define glDeleteRenderbuffers GLEW_GET_FUN(__glewDeleteRenderbuffers) -#define glFramebufferRenderbuffer GLEW_GET_FUN(__glewFramebufferRenderbuffer) -#define glFramebufferTexture1D GLEW_GET_FUN(__glewFramebufferTexture1D) -#define glFramebufferTexture2D GLEW_GET_FUN(__glewFramebufferTexture2D) -#define glFramebufferTexture3D GLEW_GET_FUN(__glewFramebufferTexture3D) -#define glFramebufferTextureLayer GLEW_GET_FUN(__glewFramebufferTextureLayer) -#define glGenFramebuffers GLEW_GET_FUN(__glewGenFramebuffers) -#define glGenRenderbuffers GLEW_GET_FUN(__glewGenRenderbuffers) -#define glGenerateMipmap GLEW_GET_FUN(__glewGenerateMipmap) -#define glGetFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetFramebufferAttachmentParameteriv) -#define glGetRenderbufferParameteriv GLEW_GET_FUN(__glewGetRenderbufferParameteriv) -#define glIsFramebuffer GLEW_GET_FUN(__glewIsFramebuffer) -#define glIsRenderbuffer GLEW_GET_FUN(__glewIsRenderbuffer) -#define glRenderbufferStorage GLEW_GET_FUN(__glewRenderbufferStorage) -#define glRenderbufferStorageMultisample GLEW_GET_FUN(__glewRenderbufferStorageMultisample) - -#define GLEW_ARB_framebuffer_object GLEW_GET_VAR(__GLEW_ARB_framebuffer_object) - -#endif /* GL_ARB_framebuffer_object */ - -/* ------------------------ GL_ARB_framebuffer_sRGB ------------------------ */ - -#ifndef GL_ARB_framebuffer_sRGB -#define GL_ARB_framebuffer_sRGB 1 - -#define GL_FRAMEBUFFER_SRGB 0x8DB9 - -#define GLEW_ARB_framebuffer_sRGB GLEW_GET_VAR(__GLEW_ARB_framebuffer_sRGB) - -#endif /* GL_ARB_framebuffer_sRGB */ - -/* ------------------------ GL_ARB_geometry_shader4 ------------------------ */ - -#ifndef GL_ARB_geometry_shader4 -#define GL_ARB_geometry_shader4 1 - -#define GL_LINES_ADJACENCY_ARB 0xA -#define GL_LINE_STRIP_ADJACENCY_ARB 0xB -#define GL_TRIANGLES_ADJACENCY_ARB 0xC -#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0xD -#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 -#define GL_GEOMETRY_SHADER_ARB 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD -#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); - -#define glFramebufferTextureARB GLEW_GET_FUN(__glewFramebufferTextureARB) -#define glFramebufferTextureFaceARB GLEW_GET_FUN(__glewFramebufferTextureFaceARB) -#define glFramebufferTextureLayerARB GLEW_GET_FUN(__glewFramebufferTextureLayerARB) -#define glProgramParameteriARB GLEW_GET_FUN(__glewProgramParameteriARB) - -#define GLEW_ARB_geometry_shader4 GLEW_GET_VAR(__GLEW_ARB_geometry_shader4) - -#endif /* GL_ARB_geometry_shader4 */ - -/* ----------------------- GL_ARB_get_program_binary ----------------------- */ - -#ifndef GL_ARB_get_program_binary -#define GL_ARB_get_program_binary 1 - -#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 -#define GL_PROGRAM_BINARY_LENGTH 0x8741 -#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE -#define GL_PROGRAM_BINARY_FORMATS 0x87FF - -typedef void (GLAPIENTRY * PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum *binaryFormat, void*binary); -typedef void (GLAPIENTRY * PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); - -#define glGetProgramBinary GLEW_GET_FUN(__glewGetProgramBinary) -#define glProgramBinary GLEW_GET_FUN(__glewProgramBinary) -#define glProgramParameteri GLEW_GET_FUN(__glewProgramParameteri) - -#define GLEW_ARB_get_program_binary GLEW_GET_VAR(__GLEW_ARB_get_program_binary) - -#endif /* GL_ARB_get_program_binary */ - -/* ---------------------- GL_ARB_get_texture_sub_image --------------------- */ - -#ifndef GL_ARB_get_texture_sub_image -#define GL_ARB_get_texture_sub_image 1 - -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); -typedef void (GLAPIENTRY * PFNGLGETTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); - -#define glGetCompressedTextureSubImage GLEW_GET_FUN(__glewGetCompressedTextureSubImage) -#define glGetTextureSubImage GLEW_GET_FUN(__glewGetTextureSubImage) - -#define GLEW_ARB_get_texture_sub_image GLEW_GET_VAR(__GLEW_ARB_get_texture_sub_image) - -#endif /* GL_ARB_get_texture_sub_image */ - -/* ---------------------------- GL_ARB_gl_spirv ---------------------------- */ - -#ifndef GL_ARB_gl_spirv -#define GL_ARB_gl_spirv 1 - -#define GL_SHADER_BINARY_FORMAT_SPIR_V_ARB 0x9551 -#define GL_SPIR_V_BINARY_ARB 0x9552 - -typedef void (GLAPIENTRY * PFNGLSPECIALIZESHADERARBPROC) (GLuint shader, const GLchar* pEntryPoint, GLuint numSpecializationConstants, const GLuint* pConstantIndex, const GLuint* pConstantValue); - -#define glSpecializeShaderARB GLEW_GET_FUN(__glewSpecializeShaderARB) - -#define GLEW_ARB_gl_spirv GLEW_GET_VAR(__GLEW_ARB_gl_spirv) - -#endif /* GL_ARB_gl_spirv */ - -/* --------------------------- GL_ARB_gpu_shader5 -------------------------- */ - -#ifndef GL_ARB_gpu_shader5 -#define GL_ARB_gpu_shader5 1 - -#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F -#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A -#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B -#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C -#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D -#define GL_MAX_VERTEX_STREAMS 0x8E71 - -#define GLEW_ARB_gpu_shader5 GLEW_GET_VAR(__GLEW_ARB_gpu_shader5) - -#endif /* GL_ARB_gpu_shader5 */ - -/* ------------------------- GL_ARB_gpu_shader_fp64 ------------------------ */ - -#ifndef GL_ARB_gpu_shader_fp64 -#define GL_ARB_gpu_shader_fp64 1 - -#define GL_DOUBLE_MAT2 0x8F46 -#define GL_DOUBLE_MAT3 0x8F47 -#define GL_DOUBLE_MAT4 0x8F48 -#define GL_DOUBLE_MAT2x3 0x8F49 -#define GL_DOUBLE_MAT2x4 0x8F4A -#define GL_DOUBLE_MAT3x2 0x8F4B -#define GL_DOUBLE_MAT3x4 0x8F4C -#define GL_DOUBLE_MAT4x2 0x8F4D -#define GL_DOUBLE_MAT4x3 0x8F4E -#define GL_DOUBLE_VEC2 0x8FFC -#define GL_DOUBLE_VEC3 0x8FFD -#define GL_DOUBLE_VEC4 0x8FFE - -typedef void (GLAPIENTRY * PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); -typedef void (GLAPIENTRY * PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); - -#define glGetUniformdv GLEW_GET_FUN(__glewGetUniformdv) -#define glUniform1d GLEW_GET_FUN(__glewUniform1d) -#define glUniform1dv GLEW_GET_FUN(__glewUniform1dv) -#define glUniform2d GLEW_GET_FUN(__glewUniform2d) -#define glUniform2dv GLEW_GET_FUN(__glewUniform2dv) -#define glUniform3d GLEW_GET_FUN(__glewUniform3d) -#define glUniform3dv GLEW_GET_FUN(__glewUniform3dv) -#define glUniform4d GLEW_GET_FUN(__glewUniform4d) -#define glUniform4dv GLEW_GET_FUN(__glewUniform4dv) -#define glUniformMatrix2dv GLEW_GET_FUN(__glewUniformMatrix2dv) -#define glUniformMatrix2x3dv GLEW_GET_FUN(__glewUniformMatrix2x3dv) -#define glUniformMatrix2x4dv GLEW_GET_FUN(__glewUniformMatrix2x4dv) -#define glUniformMatrix3dv GLEW_GET_FUN(__glewUniformMatrix3dv) -#define glUniformMatrix3x2dv GLEW_GET_FUN(__glewUniformMatrix3x2dv) -#define glUniformMatrix3x4dv GLEW_GET_FUN(__glewUniformMatrix3x4dv) -#define glUniformMatrix4dv GLEW_GET_FUN(__glewUniformMatrix4dv) -#define glUniformMatrix4x2dv GLEW_GET_FUN(__glewUniformMatrix4x2dv) -#define glUniformMatrix4x3dv GLEW_GET_FUN(__glewUniformMatrix4x3dv) - -#define GLEW_ARB_gpu_shader_fp64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_fp64) - -#endif /* GL_ARB_gpu_shader_fp64 */ - -/* ------------------------ GL_ARB_gpu_shader_int64 ------------------------ */ - -#ifndef GL_ARB_gpu_shader_int64 -#define GL_ARB_gpu_shader_int64 1 - -#define GL_INT64_ARB 0x140E -#define GL_UNSIGNED_INT64_ARB 0x140F -#define GL_INT64_VEC2_ARB 0x8FE9 -#define GL_INT64_VEC3_ARB 0x8FEA -#define GL_INT64_VEC4_ARB 0x8FEB -#define GL_UNSIGNED_INT64_VEC2_ARB 0x8FF5 -#define GL_UNSIGNED_INT64_VEC3_ARB 0x8FF6 -#define GL_UNSIGNED_INT64_VEC4_ARB 0x8FF7 - -typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VARBPROC) (GLuint program, GLint location, GLint64* params); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLuint64* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint64* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint64* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64ARBPROC) (GLuint program, GLint location, GLint64 x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64ARBPROC) (GLuint program, GLint location, GLuint64 x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM1I64ARBPROC) (GLint location, GLint64 x); -typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64ARBPROC) (GLint location, GLuint64 x); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2I64ARBPROC) (GLint location, GLint64 x, GLint64 y); -typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z); -typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); -typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); - -#define glGetUniformi64vARB GLEW_GET_FUN(__glewGetUniformi64vARB) -#define glGetUniformui64vARB GLEW_GET_FUN(__glewGetUniformui64vARB) -#define glGetnUniformi64vARB GLEW_GET_FUN(__glewGetnUniformi64vARB) -#define glGetnUniformui64vARB GLEW_GET_FUN(__glewGetnUniformui64vARB) -#define glProgramUniform1i64ARB GLEW_GET_FUN(__glewProgramUniform1i64ARB) -#define glProgramUniform1i64vARB GLEW_GET_FUN(__glewProgramUniform1i64vARB) -#define glProgramUniform1ui64ARB GLEW_GET_FUN(__glewProgramUniform1ui64ARB) -#define glProgramUniform1ui64vARB GLEW_GET_FUN(__glewProgramUniform1ui64vARB) -#define glProgramUniform2i64ARB GLEW_GET_FUN(__glewProgramUniform2i64ARB) -#define glProgramUniform2i64vARB GLEW_GET_FUN(__glewProgramUniform2i64vARB) -#define glProgramUniform2ui64ARB GLEW_GET_FUN(__glewProgramUniform2ui64ARB) -#define glProgramUniform2ui64vARB GLEW_GET_FUN(__glewProgramUniform2ui64vARB) -#define glProgramUniform3i64ARB GLEW_GET_FUN(__glewProgramUniform3i64ARB) -#define glProgramUniform3i64vARB GLEW_GET_FUN(__glewProgramUniform3i64vARB) -#define glProgramUniform3ui64ARB GLEW_GET_FUN(__glewProgramUniform3ui64ARB) -#define glProgramUniform3ui64vARB GLEW_GET_FUN(__glewProgramUniform3ui64vARB) -#define glProgramUniform4i64ARB GLEW_GET_FUN(__glewProgramUniform4i64ARB) -#define glProgramUniform4i64vARB GLEW_GET_FUN(__glewProgramUniform4i64vARB) -#define glProgramUniform4ui64ARB GLEW_GET_FUN(__glewProgramUniform4ui64ARB) -#define glProgramUniform4ui64vARB GLEW_GET_FUN(__glewProgramUniform4ui64vARB) -#define glUniform1i64ARB GLEW_GET_FUN(__glewUniform1i64ARB) -#define glUniform1i64vARB GLEW_GET_FUN(__glewUniform1i64vARB) -#define glUniform1ui64ARB GLEW_GET_FUN(__glewUniform1ui64ARB) -#define glUniform1ui64vARB GLEW_GET_FUN(__glewUniform1ui64vARB) -#define glUniform2i64ARB GLEW_GET_FUN(__glewUniform2i64ARB) -#define glUniform2i64vARB GLEW_GET_FUN(__glewUniform2i64vARB) -#define glUniform2ui64ARB GLEW_GET_FUN(__glewUniform2ui64ARB) -#define glUniform2ui64vARB GLEW_GET_FUN(__glewUniform2ui64vARB) -#define glUniform3i64ARB GLEW_GET_FUN(__glewUniform3i64ARB) -#define glUniform3i64vARB GLEW_GET_FUN(__glewUniform3i64vARB) -#define glUniform3ui64ARB GLEW_GET_FUN(__glewUniform3ui64ARB) -#define glUniform3ui64vARB GLEW_GET_FUN(__glewUniform3ui64vARB) -#define glUniform4i64ARB GLEW_GET_FUN(__glewUniform4i64ARB) -#define glUniform4i64vARB GLEW_GET_FUN(__glewUniform4i64vARB) -#define glUniform4ui64ARB GLEW_GET_FUN(__glewUniform4ui64ARB) -#define glUniform4ui64vARB GLEW_GET_FUN(__glewUniform4ui64vARB) - -#define GLEW_ARB_gpu_shader_int64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_int64) - -#endif /* GL_ARB_gpu_shader_int64 */ - -/* ------------------------ GL_ARB_half_float_pixel ------------------------ */ - -#ifndef GL_ARB_half_float_pixel -#define GL_ARB_half_float_pixel 1 - -#define GL_HALF_FLOAT_ARB 0x140B - -#define GLEW_ARB_half_float_pixel GLEW_GET_VAR(__GLEW_ARB_half_float_pixel) - -#endif /* GL_ARB_half_float_pixel */ - -/* ------------------------ GL_ARB_half_float_vertex ----------------------- */ - -#ifndef GL_ARB_half_float_vertex -#define GL_ARB_half_float_vertex 1 - -#define GL_HALF_FLOAT 0x140B - -#define GLEW_ARB_half_float_vertex GLEW_GET_VAR(__GLEW_ARB_half_float_vertex) - -#endif /* GL_ARB_half_float_vertex */ - -/* ----------------------------- GL_ARB_imaging ---------------------------- */ - -#ifndef GL_ARB_imaging -#define GL_ARB_imaging 1 - -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_BLEND_COLOR 0x8005 -#define GL_FUNC_ADD 0x8006 -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_BLEND_EQUATION 0x8009 -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_CONVOLUTION_1D 0x8010 -#define GL_CONVOLUTION_2D 0x8011 -#define GL_SEPARABLE_2D 0x8012 -#define GL_CONVOLUTION_BORDER_MODE 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS 0x8015 -#define GL_REDUCE 0x8016 -#define GL_CONVOLUTION_FORMAT 0x8017 -#define GL_CONVOLUTION_WIDTH 0x8018 -#define GL_CONVOLUTION_HEIGHT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 -#define GL_HISTOGRAM 0x8024 -#define GL_PROXY_HISTOGRAM 0x8025 -#define GL_HISTOGRAM_WIDTH 0x8026 -#define GL_HISTOGRAM_FORMAT 0x8027 -#define GL_HISTOGRAM_RED_SIZE 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C -#define GL_HISTOGRAM_SINK 0x802D -#define GL_MINMAX 0x802E -#define GL_MINMAX_FORMAT 0x802F -#define GL_MINMAX_SINK 0x8030 -#define GL_TABLE_TOO_LARGE 0x8031 -#define GL_COLOR_MATRIX 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB -#define GL_COLOR_TABLE 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 -#define GL_PROXY_COLOR_TABLE 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 -#define GL_COLOR_TABLE_SCALE 0x80D6 -#define GL_COLOR_TABLE_BIAS 0x80D7 -#define GL_COLOR_TABLE_FORMAT 0x80D8 -#define GL_COLOR_TABLE_WIDTH 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF -#define GL_IGNORE_BORDER 0x8150 -#define GL_CONSTANT_BORDER 0x8151 -#define GL_WRAP_BORDER 0x8152 -#define GL_REPLICATE_BORDER 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR 0x8154 - -typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); -typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum types, void *values); -typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); -typedef void (GLAPIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (GLAPIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLRESETMINMAXPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); - -#define glColorSubTable GLEW_GET_FUN(__glewColorSubTable) -#define glColorTable GLEW_GET_FUN(__glewColorTable) -#define glColorTableParameterfv GLEW_GET_FUN(__glewColorTableParameterfv) -#define glColorTableParameteriv GLEW_GET_FUN(__glewColorTableParameteriv) -#define glConvolutionFilter1D GLEW_GET_FUN(__glewConvolutionFilter1D) -#define glConvolutionFilter2D GLEW_GET_FUN(__glewConvolutionFilter2D) -#define glConvolutionParameterf GLEW_GET_FUN(__glewConvolutionParameterf) -#define glConvolutionParameterfv GLEW_GET_FUN(__glewConvolutionParameterfv) -#define glConvolutionParameteri GLEW_GET_FUN(__glewConvolutionParameteri) -#define glConvolutionParameteriv GLEW_GET_FUN(__glewConvolutionParameteriv) -#define glCopyColorSubTable GLEW_GET_FUN(__glewCopyColorSubTable) -#define glCopyColorTable GLEW_GET_FUN(__glewCopyColorTable) -#define glCopyConvolutionFilter1D GLEW_GET_FUN(__glewCopyConvolutionFilter1D) -#define glCopyConvolutionFilter2D GLEW_GET_FUN(__glewCopyConvolutionFilter2D) -#define glGetColorTable GLEW_GET_FUN(__glewGetColorTable) -#define glGetColorTableParameterfv GLEW_GET_FUN(__glewGetColorTableParameterfv) -#define glGetColorTableParameteriv GLEW_GET_FUN(__glewGetColorTableParameteriv) -#define glGetConvolutionFilter GLEW_GET_FUN(__glewGetConvolutionFilter) -#define glGetConvolutionParameterfv GLEW_GET_FUN(__glewGetConvolutionParameterfv) -#define glGetConvolutionParameteriv GLEW_GET_FUN(__glewGetConvolutionParameteriv) -#define glGetHistogram GLEW_GET_FUN(__glewGetHistogram) -#define glGetHistogramParameterfv GLEW_GET_FUN(__glewGetHistogramParameterfv) -#define glGetHistogramParameteriv GLEW_GET_FUN(__glewGetHistogramParameteriv) -#define glGetMinmax GLEW_GET_FUN(__glewGetMinmax) -#define glGetMinmaxParameterfv GLEW_GET_FUN(__glewGetMinmaxParameterfv) -#define glGetMinmaxParameteriv GLEW_GET_FUN(__glewGetMinmaxParameteriv) -#define glGetSeparableFilter GLEW_GET_FUN(__glewGetSeparableFilter) -#define glHistogram GLEW_GET_FUN(__glewHistogram) -#define glMinmax GLEW_GET_FUN(__glewMinmax) -#define glResetHistogram GLEW_GET_FUN(__glewResetHistogram) -#define glResetMinmax GLEW_GET_FUN(__glewResetMinmax) -#define glSeparableFilter2D GLEW_GET_FUN(__glewSeparableFilter2D) - -#define GLEW_ARB_imaging GLEW_GET_VAR(__GLEW_ARB_imaging) - -#endif /* GL_ARB_imaging */ - -/* ----------------------- GL_ARB_indirect_parameters ---------------------- */ - -#ifndef GL_ARB_indirect_parameters -#define GL_ARB_indirect_parameters 1 - -#define GL_PARAMETER_BUFFER_ARB 0x80EE -#define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); - -#define glMultiDrawArraysIndirectCountARB GLEW_GET_FUN(__glewMultiDrawArraysIndirectCountARB) -#define glMultiDrawElementsIndirectCountARB GLEW_GET_FUN(__glewMultiDrawElementsIndirectCountARB) - -#define GLEW_ARB_indirect_parameters GLEW_GET_VAR(__GLEW_ARB_indirect_parameters) - -#endif /* GL_ARB_indirect_parameters */ - -/* ------------------------ GL_ARB_instanced_arrays ------------------------ */ - -#ifndef GL_ARB_instanced_arrays -#define GL_ARB_instanced_arrays 1 - -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); - -#define glDrawArraysInstancedARB GLEW_GET_FUN(__glewDrawArraysInstancedARB) -#define glDrawElementsInstancedARB GLEW_GET_FUN(__glewDrawElementsInstancedARB) -#define glVertexAttribDivisorARB GLEW_GET_FUN(__glewVertexAttribDivisorARB) - -#define GLEW_ARB_instanced_arrays GLEW_GET_VAR(__GLEW_ARB_instanced_arrays) - -#endif /* GL_ARB_instanced_arrays */ - -/* ---------------------- GL_ARB_internalformat_query ---------------------- */ - -#ifndef GL_ARB_internalformat_query -#define GL_ARB_internalformat_query 1 - -#define GL_NUM_SAMPLE_COUNTS 0x9380 - -typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params); - -#define glGetInternalformativ GLEW_GET_FUN(__glewGetInternalformativ) - -#define GLEW_ARB_internalformat_query GLEW_GET_VAR(__GLEW_ARB_internalformat_query) - -#endif /* GL_ARB_internalformat_query */ - -/* ---------------------- GL_ARB_internalformat_query2 --------------------- */ - -#ifndef GL_ARB_internalformat_query2 -#define GL_ARB_internalformat_query2 1 - -#define GL_INTERNALFORMAT_SUPPORTED 0x826F -#define GL_INTERNALFORMAT_PREFERRED 0x8270 -#define GL_INTERNALFORMAT_RED_SIZE 0x8271 -#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 -#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 -#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 -#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 -#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 -#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 -#define GL_INTERNALFORMAT_RED_TYPE 0x8278 -#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 -#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A -#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B -#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C -#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D -#define GL_MAX_WIDTH 0x827E -#define GL_MAX_HEIGHT 0x827F -#define GL_MAX_DEPTH 0x8280 -#define GL_MAX_LAYERS 0x8281 -#define GL_MAX_COMBINED_DIMENSIONS 0x8282 -#define GL_COLOR_COMPONENTS 0x8283 -#define GL_DEPTH_COMPONENTS 0x8284 -#define GL_STENCIL_COMPONENTS 0x8285 -#define GL_COLOR_RENDERABLE 0x8286 -#define GL_DEPTH_RENDERABLE 0x8287 -#define GL_STENCIL_RENDERABLE 0x8288 -#define GL_FRAMEBUFFER_RENDERABLE 0x8289 -#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A -#define GL_FRAMEBUFFER_BLEND 0x828B -#define GL_READ_PIXELS 0x828C -#define GL_READ_PIXELS_FORMAT 0x828D -#define GL_READ_PIXELS_TYPE 0x828E -#define GL_TEXTURE_IMAGE_FORMAT 0x828F -#define GL_TEXTURE_IMAGE_TYPE 0x8290 -#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 -#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 -#define GL_MIPMAP 0x8293 -#define GL_MANUAL_GENERATE_MIPMAP 0x8294 -#define GL_AUTO_GENERATE_MIPMAP 0x8295 -#define GL_COLOR_ENCODING 0x8296 -#define GL_SRGB_READ 0x8297 -#define GL_SRGB_WRITE 0x8298 -#define GL_SRGB_DECODE_ARB 0x8299 -#define GL_FILTER 0x829A -#define GL_VERTEX_TEXTURE 0x829B -#define GL_TESS_CONTROL_TEXTURE 0x829C -#define GL_TESS_EVALUATION_TEXTURE 0x829D -#define GL_GEOMETRY_TEXTURE 0x829E -#define GL_FRAGMENT_TEXTURE 0x829F -#define GL_COMPUTE_TEXTURE 0x82A0 -#define GL_TEXTURE_SHADOW 0x82A1 -#define GL_TEXTURE_GATHER 0x82A2 -#define GL_TEXTURE_GATHER_SHADOW 0x82A3 -#define GL_SHADER_IMAGE_LOAD 0x82A4 -#define GL_SHADER_IMAGE_STORE 0x82A5 -#define GL_SHADER_IMAGE_ATOMIC 0x82A6 -#define GL_IMAGE_TEXEL_SIZE 0x82A7 -#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 -#define GL_IMAGE_PIXEL_FORMAT 0x82A9 -#define GL_IMAGE_PIXEL_TYPE 0x82AA -#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC -#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD -#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE -#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF -#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 -#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 -#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 -#define GL_CLEAR_BUFFER 0x82B4 -#define GL_TEXTURE_VIEW 0x82B5 -#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 -#define GL_FULL_SUPPORT 0x82B7 -#define GL_CAVEAT_SUPPORT 0x82B8 -#define GL_IMAGE_CLASS_4_X_32 0x82B9 -#define GL_IMAGE_CLASS_2_X_32 0x82BA -#define GL_IMAGE_CLASS_1_X_32 0x82BB -#define GL_IMAGE_CLASS_4_X_16 0x82BC -#define GL_IMAGE_CLASS_2_X_16 0x82BD -#define GL_IMAGE_CLASS_1_X_16 0x82BE -#define GL_IMAGE_CLASS_4_X_8 0x82BF -#define GL_IMAGE_CLASS_2_X_8 0x82C0 -#define GL_IMAGE_CLASS_1_X_8 0x82C1 -#define GL_IMAGE_CLASS_11_11_10 0x82C2 -#define GL_IMAGE_CLASS_10_10_10_2 0x82C3 -#define GL_VIEW_CLASS_128_BITS 0x82C4 -#define GL_VIEW_CLASS_96_BITS 0x82C5 -#define GL_VIEW_CLASS_64_BITS 0x82C6 -#define GL_VIEW_CLASS_48_BITS 0x82C7 -#define GL_VIEW_CLASS_32_BITS 0x82C8 -#define GL_VIEW_CLASS_24_BITS 0x82C9 -#define GL_VIEW_CLASS_16_BITS 0x82CA -#define GL_VIEW_CLASS_8_BITS 0x82CB -#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC -#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD -#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE -#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF -#define GL_VIEW_CLASS_RGTC1_RED 0x82D0 -#define GL_VIEW_CLASS_RGTC2_RG 0x82D1 -#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 -#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 - -typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64* params); - -#define glGetInternalformati64v GLEW_GET_FUN(__glewGetInternalformati64v) - -#define GLEW_ARB_internalformat_query2 GLEW_GET_VAR(__GLEW_ARB_internalformat_query2) - -#endif /* GL_ARB_internalformat_query2 */ - -/* ----------------------- GL_ARB_invalidate_subdata ----------------------- */ - -#ifndef GL_ARB_invalidate_subdata -#define GL_ARB_invalidate_subdata 1 - -typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); -typedef void (GLAPIENTRY * PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments); -typedef void (GLAPIENTRY * PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); - -#define glInvalidateBufferData GLEW_GET_FUN(__glewInvalidateBufferData) -#define glInvalidateBufferSubData GLEW_GET_FUN(__glewInvalidateBufferSubData) -#define glInvalidateFramebuffer GLEW_GET_FUN(__glewInvalidateFramebuffer) -#define glInvalidateSubFramebuffer GLEW_GET_FUN(__glewInvalidateSubFramebuffer) -#define glInvalidateTexImage GLEW_GET_FUN(__glewInvalidateTexImage) -#define glInvalidateTexSubImage GLEW_GET_FUN(__glewInvalidateTexSubImage) - -#define GLEW_ARB_invalidate_subdata GLEW_GET_VAR(__GLEW_ARB_invalidate_subdata) - -#endif /* GL_ARB_invalidate_subdata */ - -/* ---------------------- GL_ARB_map_buffer_alignment ---------------------- */ - -#ifndef GL_ARB_map_buffer_alignment -#define GL_ARB_map_buffer_alignment 1 - -#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC - -#define GLEW_ARB_map_buffer_alignment GLEW_GET_VAR(__GLEW_ARB_map_buffer_alignment) - -#endif /* GL_ARB_map_buffer_alignment */ - -/* ------------------------ GL_ARB_map_buffer_range ------------------------ */ - -#ifndef GL_ARB_map_buffer_range -#define GL_ARB_map_buffer_range 1 - -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 -#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 -#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 -#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 - -typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); -typedef void * (GLAPIENTRY * PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); - -#define glFlushMappedBufferRange GLEW_GET_FUN(__glewFlushMappedBufferRange) -#define glMapBufferRange GLEW_GET_FUN(__glewMapBufferRange) - -#define GLEW_ARB_map_buffer_range GLEW_GET_VAR(__GLEW_ARB_map_buffer_range) - -#endif /* GL_ARB_map_buffer_range */ - -/* ------------------------- GL_ARB_matrix_palette ------------------------- */ - -#ifndef GL_ARB_matrix_palette -#define GL_ARB_matrix_palette 1 - -#define GL_MATRIX_PALETTE_ARB 0x8840 -#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 -#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 -#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 -#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 -#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 -#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 -#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 -#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 -#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 - -typedef void (GLAPIENTRY * PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); -typedef void (GLAPIENTRY * PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); -typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUBVARBPROC) (GLint size, GLubyte *indices); -typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUIVARBPROC) (GLint size, GLuint *indices); -typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, GLushort *indices); - -#define glCurrentPaletteMatrixARB GLEW_GET_FUN(__glewCurrentPaletteMatrixARB) -#define glMatrixIndexPointerARB GLEW_GET_FUN(__glewMatrixIndexPointerARB) -#define glMatrixIndexubvARB GLEW_GET_FUN(__glewMatrixIndexubvARB) -#define glMatrixIndexuivARB GLEW_GET_FUN(__glewMatrixIndexuivARB) -#define glMatrixIndexusvARB GLEW_GET_FUN(__glewMatrixIndexusvARB) - -#define GLEW_ARB_matrix_palette GLEW_GET_VAR(__GLEW_ARB_matrix_palette) - -#endif /* GL_ARB_matrix_palette */ - -/* --------------------------- GL_ARB_multi_bind --------------------------- */ - -#ifndef GL_ARB_multi_bind -#define GL_ARB_multi_bind 1 - -typedef void (GLAPIENTRY * PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizeiptr *sizes); -typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); -typedef void (GLAPIENTRY * PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint* samplers); -typedef void (GLAPIENTRY * PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); -typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides); - -#define glBindBuffersBase GLEW_GET_FUN(__glewBindBuffersBase) -#define glBindBuffersRange GLEW_GET_FUN(__glewBindBuffersRange) -#define glBindImageTextures GLEW_GET_FUN(__glewBindImageTextures) -#define glBindSamplers GLEW_GET_FUN(__glewBindSamplers) -#define glBindTextures GLEW_GET_FUN(__glewBindTextures) -#define glBindVertexBuffers GLEW_GET_FUN(__glewBindVertexBuffers) - -#define GLEW_ARB_multi_bind GLEW_GET_VAR(__GLEW_ARB_multi_bind) - -#endif /* GL_ARB_multi_bind */ - -/* ----------------------- GL_ARB_multi_draw_indirect ---------------------- */ - -#ifndef GL_ARB_multi_draw_indirect -#define GL_ARB_multi_draw_indirect 1 - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); - -#define glMultiDrawArraysIndirect GLEW_GET_FUN(__glewMultiDrawArraysIndirect) -#define glMultiDrawElementsIndirect GLEW_GET_FUN(__glewMultiDrawElementsIndirect) - -#define GLEW_ARB_multi_draw_indirect GLEW_GET_VAR(__GLEW_ARB_multi_draw_indirect) - -#endif /* GL_ARB_multi_draw_indirect */ - -/* --------------------------- GL_ARB_multisample -------------------------- */ - -#ifndef GL_ARB_multisample -#define GL_ARB_multisample 1 - -#define GL_MULTISAMPLE_ARB 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F -#define GL_SAMPLE_COVERAGE_ARB 0x80A0 -#define GL_SAMPLE_BUFFERS_ARB 0x80A8 -#define GL_SAMPLES_ARB 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB -#define GL_MULTISAMPLE_BIT_ARB 0x20000000 - -typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); - -#define glSampleCoverageARB GLEW_GET_FUN(__glewSampleCoverageARB) - -#define GLEW_ARB_multisample GLEW_GET_VAR(__GLEW_ARB_multisample) - -#endif /* GL_ARB_multisample */ - -/* -------------------------- GL_ARB_multitexture -------------------------- */ - -#ifndef GL_ARB_multitexture -#define GL_ARB_multitexture 1 - -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 -#define GL_TEXTURE4_ARB 0x84C4 -#define GL_TEXTURE5_ARB 0x84C5 -#define GL_TEXTURE6_ARB 0x84C6 -#define GL_TEXTURE7_ARB 0x84C7 -#define GL_TEXTURE8_ARB 0x84C8 -#define GL_TEXTURE9_ARB 0x84C9 -#define GL_TEXTURE10_ARB 0x84CA -#define GL_TEXTURE11_ARB 0x84CB -#define GL_TEXTURE12_ARB 0x84CC -#define GL_TEXTURE13_ARB 0x84CD -#define GL_TEXTURE14_ARB 0x84CE -#define GL_TEXTURE15_ARB 0x84CF -#define GL_TEXTURE16_ARB 0x84D0 -#define GL_TEXTURE17_ARB 0x84D1 -#define GL_TEXTURE18_ARB 0x84D2 -#define GL_TEXTURE19_ARB 0x84D3 -#define GL_TEXTURE20_ARB 0x84D4 -#define GL_TEXTURE21_ARB 0x84D5 -#define GL_TEXTURE22_ARB 0x84D6 -#define GL_TEXTURE23_ARB 0x84D7 -#define GL_TEXTURE24_ARB 0x84D8 -#define GL_TEXTURE25_ARB 0x84D9 -#define GL_TEXTURE26_ARB 0x84DA -#define GL_TEXTURE27_ARB 0x84DB -#define GL_TEXTURE28_ARB 0x84DC -#define GL_TEXTURE29_ARB 0x84DD -#define GL_TEXTURE30_ARB 0x84DE -#define GL_TEXTURE31_ARB 0x84DF -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 - -typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); - -#define glActiveTextureARB GLEW_GET_FUN(__glewActiveTextureARB) -#define glClientActiveTextureARB GLEW_GET_FUN(__glewClientActiveTextureARB) -#define glMultiTexCoord1dARB GLEW_GET_FUN(__glewMultiTexCoord1dARB) -#define glMultiTexCoord1dvARB GLEW_GET_FUN(__glewMultiTexCoord1dvARB) -#define glMultiTexCoord1fARB GLEW_GET_FUN(__glewMultiTexCoord1fARB) -#define glMultiTexCoord1fvARB GLEW_GET_FUN(__glewMultiTexCoord1fvARB) -#define glMultiTexCoord1iARB GLEW_GET_FUN(__glewMultiTexCoord1iARB) -#define glMultiTexCoord1ivARB GLEW_GET_FUN(__glewMultiTexCoord1ivARB) -#define glMultiTexCoord1sARB GLEW_GET_FUN(__glewMultiTexCoord1sARB) -#define glMultiTexCoord1svARB GLEW_GET_FUN(__glewMultiTexCoord1svARB) -#define glMultiTexCoord2dARB GLEW_GET_FUN(__glewMultiTexCoord2dARB) -#define glMultiTexCoord2dvARB GLEW_GET_FUN(__glewMultiTexCoord2dvARB) -#define glMultiTexCoord2fARB GLEW_GET_FUN(__glewMultiTexCoord2fARB) -#define glMultiTexCoord2fvARB GLEW_GET_FUN(__glewMultiTexCoord2fvARB) -#define glMultiTexCoord2iARB GLEW_GET_FUN(__glewMultiTexCoord2iARB) -#define glMultiTexCoord2ivARB GLEW_GET_FUN(__glewMultiTexCoord2ivARB) -#define glMultiTexCoord2sARB GLEW_GET_FUN(__glewMultiTexCoord2sARB) -#define glMultiTexCoord2svARB GLEW_GET_FUN(__glewMultiTexCoord2svARB) -#define glMultiTexCoord3dARB GLEW_GET_FUN(__glewMultiTexCoord3dARB) -#define glMultiTexCoord3dvARB GLEW_GET_FUN(__glewMultiTexCoord3dvARB) -#define glMultiTexCoord3fARB GLEW_GET_FUN(__glewMultiTexCoord3fARB) -#define glMultiTexCoord3fvARB GLEW_GET_FUN(__glewMultiTexCoord3fvARB) -#define glMultiTexCoord3iARB GLEW_GET_FUN(__glewMultiTexCoord3iARB) -#define glMultiTexCoord3ivARB GLEW_GET_FUN(__glewMultiTexCoord3ivARB) -#define glMultiTexCoord3sARB GLEW_GET_FUN(__glewMultiTexCoord3sARB) -#define glMultiTexCoord3svARB GLEW_GET_FUN(__glewMultiTexCoord3svARB) -#define glMultiTexCoord4dARB GLEW_GET_FUN(__glewMultiTexCoord4dARB) -#define glMultiTexCoord4dvARB GLEW_GET_FUN(__glewMultiTexCoord4dvARB) -#define glMultiTexCoord4fARB GLEW_GET_FUN(__glewMultiTexCoord4fARB) -#define glMultiTexCoord4fvARB GLEW_GET_FUN(__glewMultiTexCoord4fvARB) -#define glMultiTexCoord4iARB GLEW_GET_FUN(__glewMultiTexCoord4iARB) -#define glMultiTexCoord4ivARB GLEW_GET_FUN(__glewMultiTexCoord4ivARB) -#define glMultiTexCoord4sARB GLEW_GET_FUN(__glewMultiTexCoord4sARB) -#define glMultiTexCoord4svARB GLEW_GET_FUN(__glewMultiTexCoord4svARB) - -#define GLEW_ARB_multitexture GLEW_GET_VAR(__GLEW_ARB_multitexture) - -#endif /* GL_ARB_multitexture */ - -/* ------------------------- GL_ARB_occlusion_query ------------------------ */ - -#ifndef GL_ARB_occlusion_query -#define GL_ARB_occlusion_query 1 - -#define GL_QUERY_COUNTER_BITS_ARB 0x8864 -#define GL_CURRENT_QUERY_ARB 0x8865 -#define GL_QUERY_RESULT_ARB 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 -#define GL_SAMPLES_PASSED_ARB 0x8914 - -typedef void (GLAPIENTRY * PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLENDQUERYARBPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISQUERYARBPROC) (GLuint id); - -#define glBeginQueryARB GLEW_GET_FUN(__glewBeginQueryARB) -#define glDeleteQueriesARB GLEW_GET_FUN(__glewDeleteQueriesARB) -#define glEndQueryARB GLEW_GET_FUN(__glewEndQueryARB) -#define glGenQueriesARB GLEW_GET_FUN(__glewGenQueriesARB) -#define glGetQueryObjectivARB GLEW_GET_FUN(__glewGetQueryObjectivARB) -#define glGetQueryObjectuivARB GLEW_GET_FUN(__glewGetQueryObjectuivARB) -#define glGetQueryivARB GLEW_GET_FUN(__glewGetQueryivARB) -#define glIsQueryARB GLEW_GET_FUN(__glewIsQueryARB) - -#define GLEW_ARB_occlusion_query GLEW_GET_VAR(__GLEW_ARB_occlusion_query) - -#endif /* GL_ARB_occlusion_query */ - -/* ------------------------ GL_ARB_occlusion_query2 ------------------------ */ - -#ifndef GL_ARB_occlusion_query2 -#define GL_ARB_occlusion_query2 1 - -#define GL_ANY_SAMPLES_PASSED 0x8C2F - -#define GLEW_ARB_occlusion_query2 GLEW_GET_VAR(__GLEW_ARB_occlusion_query2) - -#endif /* GL_ARB_occlusion_query2 */ - -/* --------------------- GL_ARB_parallel_shader_compile -------------------- */ - -#ifndef GL_ARB_parallel_shader_compile -#define GL_ARB_parallel_shader_compile 1 - -#define GL_MAX_SHADER_COMPILER_THREADS_ARB 0x91B0 -#define GL_COMPLETION_STATUS_ARB 0x91B1 - -typedef void (GLAPIENTRY * PFNGLMAXSHADERCOMPILERTHREADSARBPROC) (GLuint count); - -#define glMaxShaderCompilerThreadsARB GLEW_GET_FUN(__glewMaxShaderCompilerThreadsARB) - -#define GLEW_ARB_parallel_shader_compile GLEW_GET_VAR(__GLEW_ARB_parallel_shader_compile) - -#endif /* GL_ARB_parallel_shader_compile */ - -/* -------------------- GL_ARB_pipeline_statistics_query ------------------- */ - -#ifndef GL_ARB_pipeline_statistics_query -#define GL_ARB_pipeline_statistics_query 1 - -#define GL_VERTICES_SUBMITTED_ARB 0x82EE -#define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF -#define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0 -#define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1 -#define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2 -#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3 -#define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4 -#define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5 -#define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6 -#define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7 -#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F - -#define GLEW_ARB_pipeline_statistics_query GLEW_GET_VAR(__GLEW_ARB_pipeline_statistics_query) - -#endif /* GL_ARB_pipeline_statistics_query */ - -/* ----------------------- GL_ARB_pixel_buffer_object ---------------------- */ - -#ifndef GL_ARB_pixel_buffer_object -#define GL_ARB_pixel_buffer_object 1 - -#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF - -#define GLEW_ARB_pixel_buffer_object GLEW_GET_VAR(__GLEW_ARB_pixel_buffer_object) - -#endif /* GL_ARB_pixel_buffer_object */ - -/* ------------------------ GL_ARB_point_parameters ------------------------ */ - -#ifndef GL_ARB_point_parameters -#define GL_ARB_point_parameters 1 - -#define GL_POINT_SIZE_MIN_ARB 0x8126 -#define GL_POINT_SIZE_MAX_ARB 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 - -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat* params); - -#define glPointParameterfARB GLEW_GET_FUN(__glewPointParameterfARB) -#define glPointParameterfvARB GLEW_GET_FUN(__glewPointParameterfvARB) - -#define GLEW_ARB_point_parameters GLEW_GET_VAR(__GLEW_ARB_point_parameters) - -#endif /* GL_ARB_point_parameters */ - -/* -------------------------- GL_ARB_point_sprite -------------------------- */ - -#ifndef GL_ARB_point_sprite -#define GL_ARB_point_sprite 1 - -#define GL_POINT_SPRITE_ARB 0x8861 -#define GL_COORD_REPLACE_ARB 0x8862 - -#define GLEW_ARB_point_sprite GLEW_GET_VAR(__GLEW_ARB_point_sprite) - -#endif /* GL_ARB_point_sprite */ - -/* ---------------------- GL_ARB_polygon_offset_clamp ---------------------- */ - -#ifndef GL_ARB_polygon_offset_clamp -#define GL_ARB_polygon_offset_clamp 1 - -#define GL_POLYGON_OFFSET_CLAMP 0x8E1B - -typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETCLAMPPROC) (GLfloat factor, GLfloat units, GLfloat clamp); - -#define glPolygonOffsetClamp GLEW_GET_FUN(__glewPolygonOffsetClamp) - -#define GLEW_ARB_polygon_offset_clamp GLEW_GET_VAR(__GLEW_ARB_polygon_offset_clamp) - -#endif /* GL_ARB_polygon_offset_clamp */ - -/* ----------------------- GL_ARB_post_depth_coverage ---------------------- */ - -#ifndef GL_ARB_post_depth_coverage -#define GL_ARB_post_depth_coverage 1 - -#define GLEW_ARB_post_depth_coverage GLEW_GET_VAR(__GLEW_ARB_post_depth_coverage) - -#endif /* GL_ARB_post_depth_coverage */ - -/* --------------------- GL_ARB_program_interface_query -------------------- */ - -#ifndef GL_ARB_program_interface_query -#define GL_ARB_program_interface_query 1 - -#define GL_UNIFORM 0x92E1 -#define GL_UNIFORM_BLOCK 0x92E2 -#define GL_PROGRAM_INPUT 0x92E3 -#define GL_PROGRAM_OUTPUT 0x92E4 -#define GL_BUFFER_VARIABLE 0x92E5 -#define GL_SHADER_STORAGE_BLOCK 0x92E6 -#define GL_IS_PER_PATCH 0x92E7 -#define GL_VERTEX_SUBROUTINE 0x92E8 -#define GL_TESS_CONTROL_SUBROUTINE 0x92E9 -#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA -#define GL_GEOMETRY_SUBROUTINE 0x92EB -#define GL_FRAGMENT_SUBROUTINE 0x92EC -#define GL_COMPUTE_SUBROUTINE 0x92ED -#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE -#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF -#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 -#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 -#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 -#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 -#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 -#define GL_ACTIVE_RESOURCES 0x92F5 -#define GL_MAX_NAME_LENGTH 0x92F6 -#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 -#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 -#define GL_NAME_LENGTH 0x92F9 -#define GL_TYPE 0x92FA -#define GL_ARRAY_SIZE 0x92FB -#define GL_OFFSET 0x92FC -#define GL_BLOCK_INDEX 0x92FD -#define GL_ARRAY_STRIDE 0x92FE -#define GL_MATRIX_STRIDE 0x92FF -#define GL_IS_ROW_MAJOR 0x9300 -#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 -#define GL_BUFFER_BINDING 0x9302 -#define GL_BUFFER_DATA_SIZE 0x9303 -#define GL_NUM_ACTIVE_VARIABLES 0x9304 -#define GL_ACTIVE_VARIABLES 0x9305 -#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 -#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 -#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 -#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 -#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A -#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B -#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C -#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D -#define GL_LOCATION 0x930E -#define GL_LOCATION_INDEX 0x930F - -typedef void (GLAPIENTRY * PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint* params); -typedef GLuint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name); -typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar* name); -typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* length, GLchar *name); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLint *params); - -#define glGetProgramInterfaceiv GLEW_GET_FUN(__glewGetProgramInterfaceiv) -#define glGetProgramResourceIndex GLEW_GET_FUN(__glewGetProgramResourceIndex) -#define glGetProgramResourceLocation GLEW_GET_FUN(__glewGetProgramResourceLocation) -#define glGetProgramResourceLocationIndex GLEW_GET_FUN(__glewGetProgramResourceLocationIndex) -#define glGetProgramResourceName GLEW_GET_FUN(__glewGetProgramResourceName) -#define glGetProgramResourceiv GLEW_GET_FUN(__glewGetProgramResourceiv) - -#define GLEW_ARB_program_interface_query GLEW_GET_VAR(__GLEW_ARB_program_interface_query) - -#endif /* GL_ARB_program_interface_query */ - -/* ------------------------ GL_ARB_provoking_vertex ------------------------ */ - -#ifndef GL_ARB_provoking_vertex -#define GL_ARB_provoking_vertex 1 - -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C -#define GL_FIRST_VERTEX_CONVENTION 0x8E4D -#define GL_LAST_VERTEX_CONVENTION 0x8E4E -#define GL_PROVOKING_VERTEX 0x8E4F - -typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXPROC) (GLenum mode); - -#define glProvokingVertex GLEW_GET_FUN(__glewProvokingVertex) - -#define GLEW_ARB_provoking_vertex GLEW_GET_VAR(__GLEW_ARB_provoking_vertex) - -#endif /* GL_ARB_provoking_vertex */ - -/* ----------------------- GL_ARB_query_buffer_object ---------------------- */ - -#ifndef GL_ARB_query_buffer_object -#define GL_ARB_query_buffer_object 1 - -#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 -#define GL_QUERY_BUFFER 0x9192 -#define GL_QUERY_BUFFER_BINDING 0x9193 -#define GL_QUERY_RESULT_NO_WAIT 0x9194 - -#define GLEW_ARB_query_buffer_object GLEW_GET_VAR(__GLEW_ARB_query_buffer_object) - -#endif /* GL_ARB_query_buffer_object */ - -/* ------------------ GL_ARB_robust_buffer_access_behavior ----------------- */ - -#ifndef GL_ARB_robust_buffer_access_behavior -#define GL_ARB_robust_buffer_access_behavior 1 - -#define GLEW_ARB_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_ARB_robust_buffer_access_behavior) - -#endif /* GL_ARB_robust_buffer_access_behavior */ - -/* --------------------------- GL_ARB_robustness --------------------------- */ - -#ifndef GL_ARB_robustness -#define GL_ARB_robustness 1 - -#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 -#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 -#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 -#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 -#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 -#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 - -typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); -typedef void (GLAPIENTRY * PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* table); -typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void* img); -typedef void (GLAPIENTRY * PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* image); -typedef void (GLAPIENTRY * PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values); -typedef void (GLAPIENTRY * PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble* v); -typedef void (GLAPIENTRY * PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat* v); -typedef void (GLAPIENTRY * PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint* v); -typedef void (GLAPIENTRY * PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values); -typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat* values); -typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint* values); -typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort* values); -typedef void (GLAPIENTRY * PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte* pattern); -typedef void (GLAPIENTRY * PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void* row, GLsizei columnBufSize, void*column, void*span); -typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* img); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params); -typedef void (GLAPIENTRY * PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data); - -#define glGetGraphicsResetStatusARB GLEW_GET_FUN(__glewGetGraphicsResetStatusARB) -#define glGetnColorTableARB GLEW_GET_FUN(__glewGetnColorTableARB) -#define glGetnCompressedTexImageARB GLEW_GET_FUN(__glewGetnCompressedTexImageARB) -#define glGetnConvolutionFilterARB GLEW_GET_FUN(__glewGetnConvolutionFilterARB) -#define glGetnHistogramARB GLEW_GET_FUN(__glewGetnHistogramARB) -#define glGetnMapdvARB GLEW_GET_FUN(__glewGetnMapdvARB) -#define glGetnMapfvARB GLEW_GET_FUN(__glewGetnMapfvARB) -#define glGetnMapivARB GLEW_GET_FUN(__glewGetnMapivARB) -#define glGetnMinmaxARB GLEW_GET_FUN(__glewGetnMinmaxARB) -#define glGetnPixelMapfvARB GLEW_GET_FUN(__glewGetnPixelMapfvARB) -#define glGetnPixelMapuivARB GLEW_GET_FUN(__glewGetnPixelMapuivARB) -#define glGetnPixelMapusvARB GLEW_GET_FUN(__glewGetnPixelMapusvARB) -#define glGetnPolygonStippleARB GLEW_GET_FUN(__glewGetnPolygonStippleARB) -#define glGetnSeparableFilterARB GLEW_GET_FUN(__glewGetnSeparableFilterARB) -#define glGetnTexImageARB GLEW_GET_FUN(__glewGetnTexImageARB) -#define glGetnUniformdvARB GLEW_GET_FUN(__glewGetnUniformdvARB) -#define glGetnUniformfvARB GLEW_GET_FUN(__glewGetnUniformfvARB) -#define glGetnUniformivARB GLEW_GET_FUN(__glewGetnUniformivARB) -#define glGetnUniformuivARB GLEW_GET_FUN(__glewGetnUniformuivARB) -#define glReadnPixelsARB GLEW_GET_FUN(__glewReadnPixelsARB) - -#define GLEW_ARB_robustness GLEW_GET_VAR(__GLEW_ARB_robustness) - -#endif /* GL_ARB_robustness */ - -/* ---------------- GL_ARB_robustness_application_isolation ---------------- */ - -#ifndef GL_ARB_robustness_application_isolation -#define GL_ARB_robustness_application_isolation 1 - -#define GLEW_ARB_robustness_application_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_application_isolation) - -#endif /* GL_ARB_robustness_application_isolation */ - -/* ---------------- GL_ARB_robustness_share_group_isolation ---------------- */ - -#ifndef GL_ARB_robustness_share_group_isolation -#define GL_ARB_robustness_share_group_isolation 1 - -#define GLEW_ARB_robustness_share_group_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_share_group_isolation) - -#endif /* GL_ARB_robustness_share_group_isolation */ - -/* ------------------------ GL_ARB_sample_locations ------------------------ */ - -#ifndef GL_ARB_sample_locations -#define GL_ARB_sample_locations 1 - -#define GL_SAMPLE_LOCATION_ARB 0x8E50 -#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB 0x933D -#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB 0x933E -#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB 0x933F -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB 0x9340 -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_ARB 0x9341 -#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB 0x9342 -#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB 0x9343 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); - -#define glFramebufferSampleLocationsfvARB GLEW_GET_FUN(__glewFramebufferSampleLocationsfvARB) -#define glNamedFramebufferSampleLocationsfvARB GLEW_GET_FUN(__glewNamedFramebufferSampleLocationsfvARB) - -#define GLEW_ARB_sample_locations GLEW_GET_VAR(__GLEW_ARB_sample_locations) - -#endif /* GL_ARB_sample_locations */ - -/* ------------------------- GL_ARB_sample_shading ------------------------- */ - -#ifndef GL_ARB_sample_shading -#define GL_ARB_sample_shading 1 - -#define GL_SAMPLE_SHADING_ARB 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 - -typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGARBPROC) (GLclampf value); - -#define glMinSampleShadingARB GLEW_GET_FUN(__glewMinSampleShadingARB) - -#define GLEW_ARB_sample_shading GLEW_GET_VAR(__GLEW_ARB_sample_shading) - -#endif /* GL_ARB_sample_shading */ - -/* ------------------------- GL_ARB_sampler_objects ------------------------ */ - -#ifndef GL_ARB_sampler_objects -#define GL_ARB_sampler_objects 1 - -#define GL_SAMPLER_BINDING 0x8919 - -typedef void (GLAPIENTRY * PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); -typedef void (GLAPIENTRY * PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint * samplers); -typedef void (GLAPIENTRY * PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint* samplers); -typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISSAMPLERPROC) (GLuint sampler); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint* params); - -#define glBindSampler GLEW_GET_FUN(__glewBindSampler) -#define glDeleteSamplers GLEW_GET_FUN(__glewDeleteSamplers) -#define glGenSamplers GLEW_GET_FUN(__glewGenSamplers) -#define glGetSamplerParameterIiv GLEW_GET_FUN(__glewGetSamplerParameterIiv) -#define glGetSamplerParameterIuiv GLEW_GET_FUN(__glewGetSamplerParameterIuiv) -#define glGetSamplerParameterfv GLEW_GET_FUN(__glewGetSamplerParameterfv) -#define glGetSamplerParameteriv GLEW_GET_FUN(__glewGetSamplerParameteriv) -#define glIsSampler GLEW_GET_FUN(__glewIsSampler) -#define glSamplerParameterIiv GLEW_GET_FUN(__glewSamplerParameterIiv) -#define glSamplerParameterIuiv GLEW_GET_FUN(__glewSamplerParameterIuiv) -#define glSamplerParameterf GLEW_GET_FUN(__glewSamplerParameterf) -#define glSamplerParameterfv GLEW_GET_FUN(__glewSamplerParameterfv) -#define glSamplerParameteri GLEW_GET_FUN(__glewSamplerParameteri) -#define glSamplerParameteriv GLEW_GET_FUN(__glewSamplerParameteriv) - -#define GLEW_ARB_sampler_objects GLEW_GET_VAR(__GLEW_ARB_sampler_objects) - -#endif /* GL_ARB_sampler_objects */ - -/* ------------------------ GL_ARB_seamless_cube_map ----------------------- */ - -#ifndef GL_ARB_seamless_cube_map -#define GL_ARB_seamless_cube_map 1 - -#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F - -#define GLEW_ARB_seamless_cube_map GLEW_GET_VAR(__GLEW_ARB_seamless_cube_map) - -#endif /* GL_ARB_seamless_cube_map */ - -/* ------------------ GL_ARB_seamless_cubemap_per_texture ------------------ */ - -#ifndef GL_ARB_seamless_cubemap_per_texture -#define GL_ARB_seamless_cubemap_per_texture 1 - -#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F - -#define GLEW_ARB_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_ARB_seamless_cubemap_per_texture) - -#endif /* GL_ARB_seamless_cubemap_per_texture */ - -/* --------------------- GL_ARB_separate_shader_objects -------------------- */ - -#ifndef GL_ARB_separate_shader_objects -#define GL_ARB_separate_shader_objects 1 - -#define GL_VERTEX_SHADER_BIT 0x00000001 -#define GL_FRAGMENT_SHADER_BIT 0x00000002 -#define GL_GEOMETRY_SHADER_BIT 0x00000004 -#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 -#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 -#define GL_PROGRAM_SEPARABLE 0x8258 -#define GL_ACTIVE_PROGRAM 0x8259 -#define GL_PROGRAM_PIPELINE_BINDING 0x825A -#define GL_ALL_SHADER_BITS 0xFFFFFFFF - -typedef void (GLAPIENTRY * PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); -typedef void (GLAPIENTRY * PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar * const * strings); -typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint* pipelines); -typedef void (GLAPIENTRY * PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei* length, GLchar *infoLog); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint x, GLuint y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); -typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); - -#define glActiveShaderProgram GLEW_GET_FUN(__glewActiveShaderProgram) -#define glBindProgramPipeline GLEW_GET_FUN(__glewBindProgramPipeline) -#define glCreateShaderProgramv GLEW_GET_FUN(__glewCreateShaderProgramv) -#define glDeleteProgramPipelines GLEW_GET_FUN(__glewDeleteProgramPipelines) -#define glGenProgramPipelines GLEW_GET_FUN(__glewGenProgramPipelines) -#define glGetProgramPipelineInfoLog GLEW_GET_FUN(__glewGetProgramPipelineInfoLog) -#define glGetProgramPipelineiv GLEW_GET_FUN(__glewGetProgramPipelineiv) -#define glIsProgramPipeline GLEW_GET_FUN(__glewIsProgramPipeline) -#define glProgramUniform1d GLEW_GET_FUN(__glewProgramUniform1d) -#define glProgramUniform1dv GLEW_GET_FUN(__glewProgramUniform1dv) -#define glProgramUniform1f GLEW_GET_FUN(__glewProgramUniform1f) -#define glProgramUniform1fv GLEW_GET_FUN(__glewProgramUniform1fv) -#define glProgramUniform1i GLEW_GET_FUN(__glewProgramUniform1i) -#define glProgramUniform1iv GLEW_GET_FUN(__glewProgramUniform1iv) -#define glProgramUniform1ui GLEW_GET_FUN(__glewProgramUniform1ui) -#define glProgramUniform1uiv GLEW_GET_FUN(__glewProgramUniform1uiv) -#define glProgramUniform2d GLEW_GET_FUN(__glewProgramUniform2d) -#define glProgramUniform2dv GLEW_GET_FUN(__glewProgramUniform2dv) -#define glProgramUniform2f GLEW_GET_FUN(__glewProgramUniform2f) -#define glProgramUniform2fv GLEW_GET_FUN(__glewProgramUniform2fv) -#define glProgramUniform2i GLEW_GET_FUN(__glewProgramUniform2i) -#define glProgramUniform2iv GLEW_GET_FUN(__glewProgramUniform2iv) -#define glProgramUniform2ui GLEW_GET_FUN(__glewProgramUniform2ui) -#define glProgramUniform2uiv GLEW_GET_FUN(__glewProgramUniform2uiv) -#define glProgramUniform3d GLEW_GET_FUN(__glewProgramUniform3d) -#define glProgramUniform3dv GLEW_GET_FUN(__glewProgramUniform3dv) -#define glProgramUniform3f GLEW_GET_FUN(__glewProgramUniform3f) -#define glProgramUniform3fv GLEW_GET_FUN(__glewProgramUniform3fv) -#define glProgramUniform3i GLEW_GET_FUN(__glewProgramUniform3i) -#define glProgramUniform3iv GLEW_GET_FUN(__glewProgramUniform3iv) -#define glProgramUniform3ui GLEW_GET_FUN(__glewProgramUniform3ui) -#define glProgramUniform3uiv GLEW_GET_FUN(__glewProgramUniform3uiv) -#define glProgramUniform4d GLEW_GET_FUN(__glewProgramUniform4d) -#define glProgramUniform4dv GLEW_GET_FUN(__glewProgramUniform4dv) -#define glProgramUniform4f GLEW_GET_FUN(__glewProgramUniform4f) -#define glProgramUniform4fv GLEW_GET_FUN(__glewProgramUniform4fv) -#define glProgramUniform4i GLEW_GET_FUN(__glewProgramUniform4i) -#define glProgramUniform4iv GLEW_GET_FUN(__glewProgramUniform4iv) -#define glProgramUniform4ui GLEW_GET_FUN(__glewProgramUniform4ui) -#define glProgramUniform4uiv GLEW_GET_FUN(__glewProgramUniform4uiv) -#define glProgramUniformMatrix2dv GLEW_GET_FUN(__glewProgramUniformMatrix2dv) -#define glProgramUniformMatrix2fv GLEW_GET_FUN(__glewProgramUniformMatrix2fv) -#define glProgramUniformMatrix2x3dv GLEW_GET_FUN(__glewProgramUniformMatrix2x3dv) -#define glProgramUniformMatrix2x3fv GLEW_GET_FUN(__glewProgramUniformMatrix2x3fv) -#define glProgramUniformMatrix2x4dv GLEW_GET_FUN(__glewProgramUniformMatrix2x4dv) -#define glProgramUniformMatrix2x4fv GLEW_GET_FUN(__glewProgramUniformMatrix2x4fv) -#define glProgramUniformMatrix3dv GLEW_GET_FUN(__glewProgramUniformMatrix3dv) -#define glProgramUniformMatrix3fv GLEW_GET_FUN(__glewProgramUniformMatrix3fv) -#define glProgramUniformMatrix3x2dv GLEW_GET_FUN(__glewProgramUniformMatrix3x2dv) -#define glProgramUniformMatrix3x2fv GLEW_GET_FUN(__glewProgramUniformMatrix3x2fv) -#define glProgramUniformMatrix3x4dv GLEW_GET_FUN(__glewProgramUniformMatrix3x4dv) -#define glProgramUniformMatrix3x4fv GLEW_GET_FUN(__glewProgramUniformMatrix3x4fv) -#define glProgramUniformMatrix4dv GLEW_GET_FUN(__glewProgramUniformMatrix4dv) -#define glProgramUniformMatrix4fv GLEW_GET_FUN(__glewProgramUniformMatrix4fv) -#define glProgramUniformMatrix4x2dv GLEW_GET_FUN(__glewProgramUniformMatrix4x2dv) -#define glProgramUniformMatrix4x2fv GLEW_GET_FUN(__glewProgramUniformMatrix4x2fv) -#define glProgramUniformMatrix4x3dv GLEW_GET_FUN(__glewProgramUniformMatrix4x3dv) -#define glProgramUniformMatrix4x3fv GLEW_GET_FUN(__glewProgramUniformMatrix4x3fv) -#define glUseProgramStages GLEW_GET_FUN(__glewUseProgramStages) -#define glValidateProgramPipeline GLEW_GET_FUN(__glewValidateProgramPipeline) - -#define GLEW_ARB_separate_shader_objects GLEW_GET_VAR(__GLEW_ARB_separate_shader_objects) - -#endif /* GL_ARB_separate_shader_objects */ - -/* -------------------- GL_ARB_shader_atomic_counter_ops ------------------- */ - -#ifndef GL_ARB_shader_atomic_counter_ops -#define GL_ARB_shader_atomic_counter_ops 1 - -#define GLEW_ARB_shader_atomic_counter_ops GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counter_ops) - -#endif /* GL_ARB_shader_atomic_counter_ops */ - -/* --------------------- GL_ARB_shader_atomic_counters --------------------- */ - -#ifndef GL_ARB_shader_atomic_counters -#define GL_ARB_shader_atomic_counters 1 - -#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 -#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 -#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 -#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 -#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 -#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 -#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB -#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE -#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF -#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 -#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 -#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 -#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 -#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 -#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 -#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 -#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 -#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA -#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB -#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC - -typedef void (GLAPIENTRY * PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint* params); - -#define glGetActiveAtomicCounterBufferiv GLEW_GET_FUN(__glewGetActiveAtomicCounterBufferiv) - -#define GLEW_ARB_shader_atomic_counters GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counters) - -#endif /* GL_ARB_shader_atomic_counters */ - -/* -------------------------- GL_ARB_shader_ballot ------------------------- */ - -#ifndef GL_ARB_shader_ballot -#define GL_ARB_shader_ballot 1 - -#define GLEW_ARB_shader_ballot GLEW_GET_VAR(__GLEW_ARB_shader_ballot) - -#endif /* GL_ARB_shader_ballot */ - -/* ----------------------- GL_ARB_shader_bit_encoding ---------------------- */ - -#ifndef GL_ARB_shader_bit_encoding -#define GL_ARB_shader_bit_encoding 1 - -#define GLEW_ARB_shader_bit_encoding GLEW_GET_VAR(__GLEW_ARB_shader_bit_encoding) - -#endif /* GL_ARB_shader_bit_encoding */ - -/* -------------------------- GL_ARB_shader_clock -------------------------- */ - -#ifndef GL_ARB_shader_clock -#define GL_ARB_shader_clock 1 - -#define GLEW_ARB_shader_clock GLEW_GET_VAR(__GLEW_ARB_shader_clock) - -#endif /* GL_ARB_shader_clock */ - -/* --------------------- GL_ARB_shader_draw_parameters --------------------- */ - -#ifndef GL_ARB_shader_draw_parameters -#define GL_ARB_shader_draw_parameters 1 - -#define GLEW_ARB_shader_draw_parameters GLEW_GET_VAR(__GLEW_ARB_shader_draw_parameters) - -#endif /* GL_ARB_shader_draw_parameters */ - -/* ------------------------ GL_ARB_shader_group_vote ----------------------- */ - -#ifndef GL_ARB_shader_group_vote -#define GL_ARB_shader_group_vote 1 - -#define GLEW_ARB_shader_group_vote GLEW_GET_VAR(__GLEW_ARB_shader_group_vote) - -#endif /* GL_ARB_shader_group_vote */ - -/* --------------------- GL_ARB_shader_image_load_store -------------------- */ - -#ifndef GL_ARB_shader_image_load_store -#define GL_ARB_shader_image_load_store 1 - -#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 -#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 -#define GL_UNIFORM_BARRIER_BIT 0x00000004 -#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 -#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 -#define GL_COMMAND_BARRIER_BIT 0x00000040 -#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 -#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 -#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 -#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 -#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 -#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 -#define GL_MAX_IMAGE_UNITS 0x8F38 -#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 -#define GL_IMAGE_BINDING_NAME 0x8F3A -#define GL_IMAGE_BINDING_LEVEL 0x8F3B -#define GL_IMAGE_BINDING_LAYERED 0x8F3C -#define GL_IMAGE_BINDING_LAYER 0x8F3D -#define GL_IMAGE_BINDING_ACCESS 0x8F3E -#define GL_IMAGE_1D 0x904C -#define GL_IMAGE_2D 0x904D -#define GL_IMAGE_3D 0x904E -#define GL_IMAGE_2D_RECT 0x904F -#define GL_IMAGE_CUBE 0x9050 -#define GL_IMAGE_BUFFER 0x9051 -#define GL_IMAGE_1D_ARRAY 0x9052 -#define GL_IMAGE_2D_ARRAY 0x9053 -#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 -#define GL_IMAGE_2D_MULTISAMPLE 0x9055 -#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 -#define GL_INT_IMAGE_1D 0x9057 -#define GL_INT_IMAGE_2D 0x9058 -#define GL_INT_IMAGE_3D 0x9059 -#define GL_INT_IMAGE_2D_RECT 0x905A -#define GL_INT_IMAGE_CUBE 0x905B -#define GL_INT_IMAGE_BUFFER 0x905C -#define GL_INT_IMAGE_1D_ARRAY 0x905D -#define GL_INT_IMAGE_2D_ARRAY 0x905E -#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F -#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 -#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 -#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 -#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 -#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 -#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 -#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 -#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 -#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 -#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 -#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C -#define GL_MAX_IMAGE_SAMPLES 0x906D -#define GL_IMAGE_BINDING_FORMAT 0x906E -#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 -#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 -#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 -#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA -#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB -#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC -#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD -#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE -#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF -#define GL_ALL_BARRIER_BITS 0xFFFFFFFF - -typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); -typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); - -#define glBindImageTexture GLEW_GET_FUN(__glewBindImageTexture) -#define glMemoryBarrier GLEW_GET_FUN(__glewMemoryBarrier) - -#define GLEW_ARB_shader_image_load_store GLEW_GET_VAR(__GLEW_ARB_shader_image_load_store) - -#endif /* GL_ARB_shader_image_load_store */ - -/* ------------------------ GL_ARB_shader_image_size ----------------------- */ - -#ifndef GL_ARB_shader_image_size -#define GL_ARB_shader_image_size 1 - -#define GLEW_ARB_shader_image_size GLEW_GET_VAR(__GLEW_ARB_shader_image_size) - -#endif /* GL_ARB_shader_image_size */ - -/* ------------------------- GL_ARB_shader_objects ------------------------- */ - -#ifndef GL_ARB_shader_objects -#define GL_ARB_shader_objects 1 - -#define GL_PROGRAM_OBJECT_ARB 0x8B40 -#define GL_SHADER_OBJECT_ARB 0x8B48 -#define GL_OBJECT_TYPE_ARB 0x8B4E -#define GL_OBJECT_SUBTYPE_ARB 0x8B4F -#define GL_FLOAT_VEC2_ARB 0x8B50 -#define GL_FLOAT_VEC3_ARB 0x8B51 -#define GL_FLOAT_VEC4_ARB 0x8B52 -#define GL_INT_VEC2_ARB 0x8B53 -#define GL_INT_VEC3_ARB 0x8B54 -#define GL_INT_VEC4_ARB 0x8B55 -#define GL_BOOL_ARB 0x8B56 -#define GL_BOOL_VEC2_ARB 0x8B57 -#define GL_BOOL_VEC3_ARB 0x8B58 -#define GL_BOOL_VEC4_ARB 0x8B59 -#define GL_FLOAT_MAT2_ARB 0x8B5A -#define GL_FLOAT_MAT3_ARB 0x8B5B -#define GL_FLOAT_MAT4_ARB 0x8B5C -#define GL_SAMPLER_1D_ARB 0x8B5D -#define GL_SAMPLER_2D_ARB 0x8B5E -#define GL_SAMPLER_3D_ARB 0x8B5F -#define GL_SAMPLER_CUBE_ARB 0x8B60 -#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 -#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 -#define GL_SAMPLER_2D_RECT_ARB 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 -#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 -#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 -#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 -#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 -#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 -#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 -#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 -#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 -#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 - -typedef char GLcharARB; -typedef unsigned int GLhandleARB; - -typedef void (GLAPIENTRY * PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); -typedef void (GLAPIENTRY * PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); -typedef GLhandleARB (GLAPIENTRY * PFNGLCREATEPROGRAMOBJECTARBPROC) (void); -typedef GLhandleARB (GLAPIENTRY * PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); -typedef void (GLAPIENTRY * PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); -typedef void (GLAPIENTRY * PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); -typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); -typedef void (GLAPIENTRY * PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB *obj); -typedef GLhandleARB (GLAPIENTRY * PFNGLGETHANDLEARBPROC) (GLenum pname); -typedef void (GLAPIENTRY * PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *infoLog); -typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *source); -typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint* params); -typedef void (GLAPIENTRY * PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (GLAPIENTRY * PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint *length); -typedef void (GLAPIENTRY * PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); -typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); - -#define glAttachObjectARB GLEW_GET_FUN(__glewAttachObjectARB) -#define glCompileShaderARB GLEW_GET_FUN(__glewCompileShaderARB) -#define glCreateProgramObjectARB GLEW_GET_FUN(__glewCreateProgramObjectARB) -#define glCreateShaderObjectARB GLEW_GET_FUN(__glewCreateShaderObjectARB) -#define glDeleteObjectARB GLEW_GET_FUN(__glewDeleteObjectARB) -#define glDetachObjectARB GLEW_GET_FUN(__glewDetachObjectARB) -#define glGetActiveUniformARB GLEW_GET_FUN(__glewGetActiveUniformARB) -#define glGetAttachedObjectsARB GLEW_GET_FUN(__glewGetAttachedObjectsARB) -#define glGetHandleARB GLEW_GET_FUN(__glewGetHandleARB) -#define glGetInfoLogARB GLEW_GET_FUN(__glewGetInfoLogARB) -#define glGetObjectParameterfvARB GLEW_GET_FUN(__glewGetObjectParameterfvARB) -#define glGetObjectParameterivARB GLEW_GET_FUN(__glewGetObjectParameterivARB) -#define glGetShaderSourceARB GLEW_GET_FUN(__glewGetShaderSourceARB) -#define glGetUniformLocationARB GLEW_GET_FUN(__glewGetUniformLocationARB) -#define glGetUniformfvARB GLEW_GET_FUN(__glewGetUniformfvARB) -#define glGetUniformivARB GLEW_GET_FUN(__glewGetUniformivARB) -#define glLinkProgramARB GLEW_GET_FUN(__glewLinkProgramARB) -#define glShaderSourceARB GLEW_GET_FUN(__glewShaderSourceARB) -#define glUniform1fARB GLEW_GET_FUN(__glewUniform1fARB) -#define glUniform1fvARB GLEW_GET_FUN(__glewUniform1fvARB) -#define glUniform1iARB GLEW_GET_FUN(__glewUniform1iARB) -#define glUniform1ivARB GLEW_GET_FUN(__glewUniform1ivARB) -#define glUniform2fARB GLEW_GET_FUN(__glewUniform2fARB) -#define glUniform2fvARB GLEW_GET_FUN(__glewUniform2fvARB) -#define glUniform2iARB GLEW_GET_FUN(__glewUniform2iARB) -#define glUniform2ivARB GLEW_GET_FUN(__glewUniform2ivARB) -#define glUniform3fARB GLEW_GET_FUN(__glewUniform3fARB) -#define glUniform3fvARB GLEW_GET_FUN(__glewUniform3fvARB) -#define glUniform3iARB GLEW_GET_FUN(__glewUniform3iARB) -#define glUniform3ivARB GLEW_GET_FUN(__glewUniform3ivARB) -#define glUniform4fARB GLEW_GET_FUN(__glewUniform4fARB) -#define glUniform4fvARB GLEW_GET_FUN(__glewUniform4fvARB) -#define glUniform4iARB GLEW_GET_FUN(__glewUniform4iARB) -#define glUniform4ivARB GLEW_GET_FUN(__glewUniform4ivARB) -#define glUniformMatrix2fvARB GLEW_GET_FUN(__glewUniformMatrix2fvARB) -#define glUniformMatrix3fvARB GLEW_GET_FUN(__glewUniformMatrix3fvARB) -#define glUniformMatrix4fvARB GLEW_GET_FUN(__glewUniformMatrix4fvARB) -#define glUseProgramObjectARB GLEW_GET_FUN(__glewUseProgramObjectARB) -#define glValidateProgramARB GLEW_GET_FUN(__glewValidateProgramARB) - -#define GLEW_ARB_shader_objects GLEW_GET_VAR(__GLEW_ARB_shader_objects) - -#endif /* GL_ARB_shader_objects */ - -/* ------------------------ GL_ARB_shader_precision ------------------------ */ - -#ifndef GL_ARB_shader_precision -#define GL_ARB_shader_precision 1 - -#define GLEW_ARB_shader_precision GLEW_GET_VAR(__GLEW_ARB_shader_precision) - -#endif /* GL_ARB_shader_precision */ - -/* ---------------------- GL_ARB_shader_stencil_export --------------------- */ - -#ifndef GL_ARB_shader_stencil_export -#define GL_ARB_shader_stencil_export 1 - -#define GLEW_ARB_shader_stencil_export GLEW_GET_VAR(__GLEW_ARB_shader_stencil_export) - -#endif /* GL_ARB_shader_stencil_export */ - -/* ------------------ GL_ARB_shader_storage_buffer_object ------------------ */ - -#ifndef GL_ARB_shader_storage_buffer_object -#define GL_ARB_shader_storage_buffer_object 1 - -#define GL_SHADER_STORAGE_BARRIER_BIT 0x2000 -#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 -#define GL_SHADER_STORAGE_BUFFER 0x90D2 -#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 -#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 -#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 -#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 -#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 -#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 -#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 -#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA -#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB -#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC -#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD -#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE -#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF - -typedef void (GLAPIENTRY * PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); - -#define glShaderStorageBlockBinding GLEW_GET_FUN(__glewShaderStorageBlockBinding) - -#define GLEW_ARB_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_ARB_shader_storage_buffer_object) - -#endif /* GL_ARB_shader_storage_buffer_object */ - -/* ------------------------ GL_ARB_shader_subroutine ----------------------- */ - -#ifndef GL_ARB_shader_subroutine -#define GL_ARB_shader_subroutine 1 - -#define GL_ACTIVE_SUBROUTINES 0x8DE5 -#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 -#define GL_MAX_SUBROUTINES 0x8DE7 -#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 -#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 -#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 -#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 -#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A -#define GL_COMPATIBLE_SUBROUTINES 0x8E4B - -typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *name); -typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *name); -typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint* values); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint* values); -typedef GLuint (GLAPIENTRY * PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar* name); -typedef GLint (GLAPIENTRY * PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint* params); -typedef void (GLAPIENTRY * PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint* indices); - -#define glGetActiveSubroutineName GLEW_GET_FUN(__glewGetActiveSubroutineName) -#define glGetActiveSubroutineUniformName GLEW_GET_FUN(__glewGetActiveSubroutineUniformName) -#define glGetActiveSubroutineUniformiv GLEW_GET_FUN(__glewGetActiveSubroutineUniformiv) -#define glGetProgramStageiv GLEW_GET_FUN(__glewGetProgramStageiv) -#define glGetSubroutineIndex GLEW_GET_FUN(__glewGetSubroutineIndex) -#define glGetSubroutineUniformLocation GLEW_GET_FUN(__glewGetSubroutineUniformLocation) -#define glGetUniformSubroutineuiv GLEW_GET_FUN(__glewGetUniformSubroutineuiv) -#define glUniformSubroutinesuiv GLEW_GET_FUN(__glewUniformSubroutinesuiv) - -#define GLEW_ARB_shader_subroutine GLEW_GET_VAR(__GLEW_ARB_shader_subroutine) - -#endif /* GL_ARB_shader_subroutine */ - -/* ------------------ GL_ARB_shader_texture_image_samples ------------------ */ - -#ifndef GL_ARB_shader_texture_image_samples -#define GL_ARB_shader_texture_image_samples 1 - -#define GLEW_ARB_shader_texture_image_samples GLEW_GET_VAR(__GLEW_ARB_shader_texture_image_samples) - -#endif /* GL_ARB_shader_texture_image_samples */ - -/* ----------------------- GL_ARB_shader_texture_lod ----------------------- */ - -#ifndef GL_ARB_shader_texture_lod -#define GL_ARB_shader_texture_lod 1 - -#define GLEW_ARB_shader_texture_lod GLEW_GET_VAR(__GLEW_ARB_shader_texture_lod) - -#endif /* GL_ARB_shader_texture_lod */ - -/* ------------------- GL_ARB_shader_viewport_layer_array ------------------ */ - -#ifndef GL_ARB_shader_viewport_layer_array -#define GL_ARB_shader_viewport_layer_array 1 - -#define GLEW_ARB_shader_viewport_layer_array GLEW_GET_VAR(__GLEW_ARB_shader_viewport_layer_array) - -#endif /* GL_ARB_shader_viewport_layer_array */ - -/* ---------------------- GL_ARB_shading_language_100 ---------------------- */ - -#ifndef GL_ARB_shading_language_100 -#define GL_ARB_shading_language_100 1 - -#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C - -#define GLEW_ARB_shading_language_100 GLEW_GET_VAR(__GLEW_ARB_shading_language_100) - -#endif /* GL_ARB_shading_language_100 */ - -/* -------------------- GL_ARB_shading_language_420pack -------------------- */ - -#ifndef GL_ARB_shading_language_420pack -#define GL_ARB_shading_language_420pack 1 - -#define GLEW_ARB_shading_language_420pack GLEW_GET_VAR(__GLEW_ARB_shading_language_420pack) - -#endif /* GL_ARB_shading_language_420pack */ - -/* -------------------- GL_ARB_shading_language_include -------------------- */ - -#ifndef GL_ARB_shading_language_include -#define GL_ARB_shading_language_include 1 - -#define GL_SHADER_INCLUDE_ARB 0x8DAE -#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 -#define GL_NAMED_STRING_TYPE_ARB 0x8DEA - -typedef void (GLAPIENTRY * PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar* const *path, const GLint *length); -typedef void (GLAPIENTRY * PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name, GLsizei bufSize, GLint *stringlen, GLchar *string); -typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar* name, GLenum pname, GLint *params); -typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); -typedef void (GLAPIENTRY * PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar* name, GLint stringlen, const GLchar *string); - -#define glCompileShaderIncludeARB GLEW_GET_FUN(__glewCompileShaderIncludeARB) -#define glDeleteNamedStringARB GLEW_GET_FUN(__glewDeleteNamedStringARB) -#define glGetNamedStringARB GLEW_GET_FUN(__glewGetNamedStringARB) -#define glGetNamedStringivARB GLEW_GET_FUN(__glewGetNamedStringivARB) -#define glIsNamedStringARB GLEW_GET_FUN(__glewIsNamedStringARB) -#define glNamedStringARB GLEW_GET_FUN(__glewNamedStringARB) - -#define GLEW_ARB_shading_language_include GLEW_GET_VAR(__GLEW_ARB_shading_language_include) - -#endif /* GL_ARB_shading_language_include */ - -/* -------------------- GL_ARB_shading_language_packing -------------------- */ - -#ifndef GL_ARB_shading_language_packing -#define GL_ARB_shading_language_packing 1 - -#define GLEW_ARB_shading_language_packing GLEW_GET_VAR(__GLEW_ARB_shading_language_packing) - -#endif /* GL_ARB_shading_language_packing */ - -/* ----------------------------- GL_ARB_shadow ----------------------------- */ - -#ifndef GL_ARB_shadow -#define GL_ARB_shadow 1 - -#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C -#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D -#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E - -#define GLEW_ARB_shadow GLEW_GET_VAR(__GLEW_ARB_shadow) - -#endif /* GL_ARB_shadow */ - -/* ------------------------- GL_ARB_shadow_ambient ------------------------- */ - -#ifndef GL_ARB_shadow_ambient -#define GL_ARB_shadow_ambient 1 - -#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF - -#define GLEW_ARB_shadow_ambient GLEW_GET_VAR(__GLEW_ARB_shadow_ambient) - -#endif /* GL_ARB_shadow_ambient */ - -/* -------------------------- GL_ARB_sparse_buffer ------------------------- */ - -#ifndef GL_ARB_sparse_buffer -#define GL_ARB_sparse_buffer 1 - -#define GL_SPARSE_STORAGE_BIT_ARB 0x0400 -#define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8 - -typedef void (GLAPIENTRY * PFNGLBUFFERPAGECOMMITMENTARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); - -#define glBufferPageCommitmentARB GLEW_GET_FUN(__glewBufferPageCommitmentARB) - -#define GLEW_ARB_sparse_buffer GLEW_GET_VAR(__GLEW_ARB_sparse_buffer) - -#endif /* GL_ARB_sparse_buffer */ - -/* ------------------------- GL_ARB_sparse_texture ------------------------- */ - -#ifndef GL_ARB_sparse_texture -#define GL_ARB_sparse_texture 1 - -#define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 -#define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 -#define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 -#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 -#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 -#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A -#define GL_TEXTURE_SPARSE_ARB 0x91A6 -#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 -#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 -#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 -#define GL_NUM_SPARSE_LEVELS_ARB 0x91AA - -typedef void (GLAPIENTRY * PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); - -#define glTexPageCommitmentARB GLEW_GET_FUN(__glewTexPageCommitmentARB) - -#define GLEW_ARB_sparse_texture GLEW_GET_VAR(__GLEW_ARB_sparse_texture) - -#endif /* GL_ARB_sparse_texture */ - -/* ------------------------- GL_ARB_sparse_texture2 ------------------------ */ - -#ifndef GL_ARB_sparse_texture2 -#define GL_ARB_sparse_texture2 1 - -#define GLEW_ARB_sparse_texture2 GLEW_GET_VAR(__GLEW_ARB_sparse_texture2) - -#endif /* GL_ARB_sparse_texture2 */ - -/* ---------------------- GL_ARB_sparse_texture_clamp ---------------------- */ - -#ifndef GL_ARB_sparse_texture_clamp -#define GL_ARB_sparse_texture_clamp 1 - -#define GLEW_ARB_sparse_texture_clamp GLEW_GET_VAR(__GLEW_ARB_sparse_texture_clamp) - -#endif /* GL_ARB_sparse_texture_clamp */ - -/* ------------------------ GL_ARB_spirv_extensions ------------------------ */ - -#ifndef GL_ARB_spirv_extensions -#define GL_ARB_spirv_extensions 1 - -#define GL_SPIR_V_EXTENSIONS 0x9553 -#define GL_NUM_SPIR_V_EXTENSIONS 0x9554 - -#define GLEW_ARB_spirv_extensions GLEW_GET_VAR(__GLEW_ARB_spirv_extensions) - -#endif /* GL_ARB_spirv_extensions */ - -/* ------------------------ GL_ARB_stencil_texturing ----------------------- */ - -#ifndef GL_ARB_stencil_texturing -#define GL_ARB_stencil_texturing 1 - -#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA - -#define GLEW_ARB_stencil_texturing GLEW_GET_VAR(__GLEW_ARB_stencil_texturing) - -#endif /* GL_ARB_stencil_texturing */ - -/* ------------------------------ GL_ARB_sync ------------------------------ */ - -#ifndef GL_ARB_sync -#define GL_ARB_sync 1 - -#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 -#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 -#define GL_OBJECT_TYPE 0x9112 -#define GL_SYNC_CONDITION 0x9113 -#define GL_SYNC_STATUS 0x9114 -#define GL_SYNC_FLAGS 0x9115 -#define GL_SYNC_FENCE 0x9116 -#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 -#define GL_UNSIGNALED 0x9118 -#define GL_SIGNALED 0x9119 -#define GL_ALREADY_SIGNALED 0x911A -#define GL_TIMEOUT_EXPIRED 0x911B -#define GL_CONDITION_SATISFIED 0x911C -#define GL_WAIT_FAILED 0x911D -#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull - -typedef GLenum (GLAPIENTRY * PFNGLCLIENTWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout); -typedef void (GLAPIENTRY * PFNGLDELETESYNCPROC) (GLsync GLsync); -typedef GLsync (GLAPIENTRY * PFNGLFENCESYNCPROC) (GLenum condition,GLbitfield flags); -typedef void (GLAPIENTRY * PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64* params); -typedef void (GLAPIENTRY * PFNGLGETSYNCIVPROC) (GLsync GLsync,GLenum pname,GLsizei bufSize,GLsizei* length, GLint *values); -typedef GLboolean (GLAPIENTRY * PFNGLISSYNCPROC) (GLsync GLsync); -typedef void (GLAPIENTRY * PFNGLWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout); - -#define glClientWaitSync GLEW_GET_FUN(__glewClientWaitSync) -#define glDeleteSync GLEW_GET_FUN(__glewDeleteSync) -#define glFenceSync GLEW_GET_FUN(__glewFenceSync) -#define glGetInteger64v GLEW_GET_FUN(__glewGetInteger64v) -#define glGetSynciv GLEW_GET_FUN(__glewGetSynciv) -#define glIsSync GLEW_GET_FUN(__glewIsSync) -#define glWaitSync GLEW_GET_FUN(__glewWaitSync) - -#define GLEW_ARB_sync GLEW_GET_VAR(__GLEW_ARB_sync) - -#endif /* GL_ARB_sync */ - -/* ----------------------- GL_ARB_tessellation_shader ---------------------- */ - -#ifndef GL_ARB_tessellation_shader -#define GL_ARB_tessellation_shader 1 - -#define GL_PATCHES 0xE -#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 -#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C -#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D -#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E -#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F -#define GL_PATCH_VERTICES 0x8E72 -#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 -#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 -#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 -#define GL_TESS_GEN_MODE 0x8E76 -#define GL_TESS_GEN_SPACING 0x8E77 -#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 -#define GL_TESS_GEN_POINT_MODE 0x8E79 -#define GL_ISOLINES 0x8E7A -#define GL_FRACTIONAL_ODD 0x8E7B -#define GL_FRACTIONAL_EVEN 0x8E7C -#define GL_MAX_PATCH_VERTICES 0x8E7D -#define GL_MAX_TESS_GEN_LEVEL 0x8E7E -#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F -#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 -#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 -#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 -#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 -#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 -#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 -#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 -#define GL_TESS_EVALUATION_SHADER 0x8E87 -#define GL_TESS_CONTROL_SHADER 0x8E88 -#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 -#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A - -typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat* values); -typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); - -#define glPatchParameterfv GLEW_GET_FUN(__glewPatchParameterfv) -#define glPatchParameteri GLEW_GET_FUN(__glewPatchParameteri) - -#define GLEW_ARB_tessellation_shader GLEW_GET_VAR(__GLEW_ARB_tessellation_shader) - -#endif /* GL_ARB_tessellation_shader */ - -/* ------------------------- GL_ARB_texture_barrier ------------------------ */ - -#ifndef GL_ARB_texture_barrier -#define GL_ARB_texture_barrier 1 - -typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERPROC) (void); - -#define glTextureBarrier GLEW_GET_FUN(__glewTextureBarrier) - -#define GLEW_ARB_texture_barrier GLEW_GET_VAR(__GLEW_ARB_texture_barrier) - -#endif /* GL_ARB_texture_barrier */ - -/* ---------------------- GL_ARB_texture_border_clamp ---------------------- */ - -#ifndef GL_ARB_texture_border_clamp -#define GL_ARB_texture_border_clamp 1 - -#define GL_CLAMP_TO_BORDER_ARB 0x812D - -#define GLEW_ARB_texture_border_clamp GLEW_GET_VAR(__GLEW_ARB_texture_border_clamp) - -#endif /* GL_ARB_texture_border_clamp */ - -/* ---------------------- GL_ARB_texture_buffer_object --------------------- */ - -#ifndef GL_ARB_texture_buffer_object -#define GL_ARB_texture_buffer_object 1 - -#define GL_TEXTURE_BUFFER_ARB 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E - -typedef void (GLAPIENTRY * PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); - -#define glTexBufferARB GLEW_GET_FUN(__glewTexBufferARB) - -#define GLEW_ARB_texture_buffer_object GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object) - -#endif /* GL_ARB_texture_buffer_object */ - -/* ------------------- GL_ARB_texture_buffer_object_rgb32 ------------------ */ - -#ifndef GL_ARB_texture_buffer_object_rgb32 -#define GL_ARB_texture_buffer_object_rgb32 1 - -#define GLEW_ARB_texture_buffer_object_rgb32 GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object_rgb32) - -#endif /* GL_ARB_texture_buffer_object_rgb32 */ - -/* ---------------------- GL_ARB_texture_buffer_range ---------------------- */ - -#ifndef GL_ARB_texture_buffer_range -#define GL_ARB_texture_buffer_range 1 - -#define GL_TEXTURE_BUFFER_OFFSET 0x919D -#define GL_TEXTURE_BUFFER_SIZE 0x919E -#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F - -typedef void (GLAPIENTRY * PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); - -#define glTexBufferRange GLEW_GET_FUN(__glewTexBufferRange) -#define glTextureBufferRangeEXT GLEW_GET_FUN(__glewTextureBufferRangeEXT) - -#define GLEW_ARB_texture_buffer_range GLEW_GET_VAR(__GLEW_ARB_texture_buffer_range) - -#endif /* GL_ARB_texture_buffer_range */ - -/* ----------------------- GL_ARB_texture_compression ---------------------- */ - -#ifndef GL_ARB_texture_compression -#define GL_ARB_texture_compression 1 - -#define GL_COMPRESSED_ALPHA_ARB 0x84E9 -#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB -#define GL_COMPRESSED_INTENSITY_ARB 0x84EC -#define GL_COMPRESSED_RGB_ARB 0x84ED -#define GL_COMPRESSED_RGBA_ARB 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 -#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 - -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, void *img); - -#define glCompressedTexImage1DARB GLEW_GET_FUN(__glewCompressedTexImage1DARB) -#define glCompressedTexImage2DARB GLEW_GET_FUN(__glewCompressedTexImage2DARB) -#define glCompressedTexImage3DARB GLEW_GET_FUN(__glewCompressedTexImage3DARB) -#define glCompressedTexSubImage1DARB GLEW_GET_FUN(__glewCompressedTexSubImage1DARB) -#define glCompressedTexSubImage2DARB GLEW_GET_FUN(__glewCompressedTexSubImage2DARB) -#define glCompressedTexSubImage3DARB GLEW_GET_FUN(__glewCompressedTexSubImage3DARB) -#define glGetCompressedTexImageARB GLEW_GET_FUN(__glewGetCompressedTexImageARB) - -#define GLEW_ARB_texture_compression GLEW_GET_VAR(__GLEW_ARB_texture_compression) - -#endif /* GL_ARB_texture_compression */ - -/* -------------------- GL_ARB_texture_compression_bptc -------------------- */ - -#ifndef GL_ARB_texture_compression_bptc -#define GL_ARB_texture_compression_bptc 1 - -#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C -#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D -#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E -#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F - -#define GLEW_ARB_texture_compression_bptc GLEW_GET_VAR(__GLEW_ARB_texture_compression_bptc) - -#endif /* GL_ARB_texture_compression_bptc */ - -/* -------------------- GL_ARB_texture_compression_rgtc -------------------- */ - -#ifndef GL_ARB_texture_compression_rgtc -#define GL_ARB_texture_compression_rgtc 1 - -#define GL_COMPRESSED_RED_RGTC1 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC -#define GL_COMPRESSED_RG_RGTC2 0x8DBD -#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE - -#define GLEW_ARB_texture_compression_rgtc GLEW_GET_VAR(__GLEW_ARB_texture_compression_rgtc) - -#endif /* GL_ARB_texture_compression_rgtc */ - -/* ------------------------ GL_ARB_texture_cube_map ------------------------ */ - -#ifndef GL_ARB_texture_cube_map -#define GL_ARB_texture_cube_map 1 - -#define GL_NORMAL_MAP_ARB 0x8511 -#define GL_REFLECTION_MAP_ARB 0x8512 -#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C - -#define GLEW_ARB_texture_cube_map GLEW_GET_VAR(__GLEW_ARB_texture_cube_map) - -#endif /* GL_ARB_texture_cube_map */ - -/* --------------------- GL_ARB_texture_cube_map_array --------------------- */ - -#ifndef GL_ARB_texture_cube_map_array -#define GL_ARB_texture_cube_map_array 1 - -#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B -#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F - -#define GLEW_ARB_texture_cube_map_array GLEW_GET_VAR(__GLEW_ARB_texture_cube_map_array) - -#endif /* GL_ARB_texture_cube_map_array */ - -/* ------------------------- GL_ARB_texture_env_add ------------------------ */ - -#ifndef GL_ARB_texture_env_add -#define GL_ARB_texture_env_add 1 - -#define GLEW_ARB_texture_env_add GLEW_GET_VAR(__GLEW_ARB_texture_env_add) - -#endif /* GL_ARB_texture_env_add */ - -/* ----------------------- GL_ARB_texture_env_combine ---------------------- */ - -#ifndef GL_ARB_texture_env_combine -#define GL_ARB_texture_env_combine 1 - -#define GL_SUBTRACT_ARB 0x84E7 -#define GL_COMBINE_ARB 0x8570 -#define GL_COMBINE_RGB_ARB 0x8571 -#define GL_COMBINE_ALPHA_ARB 0x8572 -#define GL_RGB_SCALE_ARB 0x8573 -#define GL_ADD_SIGNED_ARB 0x8574 -#define GL_INTERPOLATE_ARB 0x8575 -#define GL_CONSTANT_ARB 0x8576 -#define GL_PRIMARY_COLOR_ARB 0x8577 -#define GL_PREVIOUS_ARB 0x8578 -#define GL_SOURCE0_RGB_ARB 0x8580 -#define GL_SOURCE1_RGB_ARB 0x8581 -#define GL_SOURCE2_RGB_ARB 0x8582 -#define GL_SOURCE0_ALPHA_ARB 0x8588 -#define GL_SOURCE1_ALPHA_ARB 0x8589 -#define GL_SOURCE2_ALPHA_ARB 0x858A -#define GL_OPERAND0_RGB_ARB 0x8590 -#define GL_OPERAND1_RGB_ARB 0x8591 -#define GL_OPERAND2_RGB_ARB 0x8592 -#define GL_OPERAND0_ALPHA_ARB 0x8598 -#define GL_OPERAND1_ALPHA_ARB 0x8599 -#define GL_OPERAND2_ALPHA_ARB 0x859A - -#define GLEW_ARB_texture_env_combine GLEW_GET_VAR(__GLEW_ARB_texture_env_combine) - -#endif /* GL_ARB_texture_env_combine */ - -/* ---------------------- GL_ARB_texture_env_crossbar ---------------------- */ - -#ifndef GL_ARB_texture_env_crossbar -#define GL_ARB_texture_env_crossbar 1 - -#define GLEW_ARB_texture_env_crossbar GLEW_GET_VAR(__GLEW_ARB_texture_env_crossbar) - -#endif /* GL_ARB_texture_env_crossbar */ - -/* ------------------------ GL_ARB_texture_env_dot3 ------------------------ */ - -#ifndef GL_ARB_texture_env_dot3 -#define GL_ARB_texture_env_dot3 1 - -#define GL_DOT3_RGB_ARB 0x86AE -#define GL_DOT3_RGBA_ARB 0x86AF - -#define GLEW_ARB_texture_env_dot3 GLEW_GET_VAR(__GLEW_ARB_texture_env_dot3) - -#endif /* GL_ARB_texture_env_dot3 */ - -/* ------------------- GL_ARB_texture_filter_anisotropic ------------------- */ - -#ifndef GL_ARB_texture_filter_anisotropic -#define GL_ARB_texture_filter_anisotropic 1 - -#define GL_TEXTURE_MAX_ANISOTROPY 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF - -#define GLEW_ARB_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_ARB_texture_filter_anisotropic) - -#endif /* GL_ARB_texture_filter_anisotropic */ - -/* ---------------------- GL_ARB_texture_filter_minmax --------------------- */ - -#ifndef GL_ARB_texture_filter_minmax -#define GL_ARB_texture_filter_minmax 1 - -#define GL_TEXTURE_REDUCTION_MODE_ARB 0x9366 -#define GL_WEIGHTED_AVERAGE_ARB 0x9367 - -#define GLEW_ARB_texture_filter_minmax GLEW_GET_VAR(__GLEW_ARB_texture_filter_minmax) - -#endif /* GL_ARB_texture_filter_minmax */ - -/* -------------------------- GL_ARB_texture_float ------------------------- */ - -#ifndef GL_ARB_texture_float -#define GL_ARB_texture_float 1 - -#define GL_RGBA32F_ARB 0x8814 -#define GL_RGB32F_ARB 0x8815 -#define GL_ALPHA32F_ARB 0x8816 -#define GL_INTENSITY32F_ARB 0x8817 -#define GL_LUMINANCE32F_ARB 0x8818 -#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 -#define GL_RGBA16F_ARB 0x881A -#define GL_RGB16F_ARB 0x881B -#define GL_ALPHA16F_ARB 0x881C -#define GL_INTENSITY16F_ARB 0x881D -#define GL_LUMINANCE16F_ARB 0x881E -#define GL_LUMINANCE_ALPHA16F_ARB 0x881F -#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 -#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 -#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 -#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 -#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 -#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 -#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 - -#define GLEW_ARB_texture_float GLEW_GET_VAR(__GLEW_ARB_texture_float) - -#endif /* GL_ARB_texture_float */ - -/* ------------------------- GL_ARB_texture_gather ------------------------- */ - -#ifndef GL_ARB_texture_gather -#define GL_ARB_texture_gather 1 - -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F -#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F - -#define GLEW_ARB_texture_gather GLEW_GET_VAR(__GLEW_ARB_texture_gather) - -#endif /* GL_ARB_texture_gather */ - -/* ------------------ GL_ARB_texture_mirror_clamp_to_edge ------------------ */ - -#ifndef GL_ARB_texture_mirror_clamp_to_edge -#define GL_ARB_texture_mirror_clamp_to_edge 1 - -#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 - -#define GLEW_ARB_texture_mirror_clamp_to_edge GLEW_GET_VAR(__GLEW_ARB_texture_mirror_clamp_to_edge) - -#endif /* GL_ARB_texture_mirror_clamp_to_edge */ - -/* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */ - -#ifndef GL_ARB_texture_mirrored_repeat -#define GL_ARB_texture_mirrored_repeat 1 - -#define GL_MIRRORED_REPEAT_ARB 0x8370 - -#define GLEW_ARB_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_ARB_texture_mirrored_repeat) - -#endif /* GL_ARB_texture_mirrored_repeat */ - -/* ----------------------- GL_ARB_texture_multisample ---------------------- */ - -#ifndef GL_ARB_texture_multisample -#define GL_ARB_texture_multisample 1 - -#define GL_SAMPLE_POSITION 0x8E50 -#define GL_SAMPLE_MASK 0x8E51 -#define GL_SAMPLE_MASK_VALUE 0x8E52 -#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 -#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 -#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 -#define GL_TEXTURE_SAMPLES 0x9106 -#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 -#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 -#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A -#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B -#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D -#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E -#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F -#define GL_MAX_INTEGER_SAMPLES 0x9110 - -typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat* val); -typedef void (GLAPIENTRY * PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask); -typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); - -#define glGetMultisamplefv GLEW_GET_FUN(__glewGetMultisamplefv) -#define glSampleMaski GLEW_GET_FUN(__glewSampleMaski) -#define glTexImage2DMultisample GLEW_GET_FUN(__glewTexImage2DMultisample) -#define glTexImage3DMultisample GLEW_GET_FUN(__glewTexImage3DMultisample) - -#define GLEW_ARB_texture_multisample GLEW_GET_VAR(__GLEW_ARB_texture_multisample) - -#endif /* GL_ARB_texture_multisample */ - -/* -------------------- GL_ARB_texture_non_power_of_two -------------------- */ - -#ifndef GL_ARB_texture_non_power_of_two -#define GL_ARB_texture_non_power_of_two 1 - -#define GLEW_ARB_texture_non_power_of_two GLEW_GET_VAR(__GLEW_ARB_texture_non_power_of_two) - -#endif /* GL_ARB_texture_non_power_of_two */ - -/* ---------------------- GL_ARB_texture_query_levels ---------------------- */ - -#ifndef GL_ARB_texture_query_levels -#define GL_ARB_texture_query_levels 1 - -#define GLEW_ARB_texture_query_levels GLEW_GET_VAR(__GLEW_ARB_texture_query_levels) - -#endif /* GL_ARB_texture_query_levels */ - -/* ------------------------ GL_ARB_texture_query_lod ----------------------- */ - -#ifndef GL_ARB_texture_query_lod -#define GL_ARB_texture_query_lod 1 - -#define GLEW_ARB_texture_query_lod GLEW_GET_VAR(__GLEW_ARB_texture_query_lod) - -#endif /* GL_ARB_texture_query_lod */ - -/* ------------------------ GL_ARB_texture_rectangle ----------------------- */ - -#ifndef GL_ARB_texture_rectangle -#define GL_ARB_texture_rectangle 1 - -#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 -#define GL_SAMPLER_2D_RECT_ARB 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 - -#define GLEW_ARB_texture_rectangle GLEW_GET_VAR(__GLEW_ARB_texture_rectangle) - -#endif /* GL_ARB_texture_rectangle */ - -/* --------------------------- GL_ARB_texture_rg --------------------------- */ - -#ifndef GL_ARB_texture_rg -#define GL_ARB_texture_rg 1 - -#define GL_COMPRESSED_RED 0x8225 -#define GL_COMPRESSED_RG 0x8226 -#define GL_RG 0x8227 -#define GL_RG_INTEGER 0x8228 -#define GL_R8 0x8229 -#define GL_R16 0x822A -#define GL_RG8 0x822B -#define GL_RG16 0x822C -#define GL_R16F 0x822D -#define GL_R32F 0x822E -#define GL_RG16F 0x822F -#define GL_RG32F 0x8230 -#define GL_R8I 0x8231 -#define GL_R8UI 0x8232 -#define GL_R16I 0x8233 -#define GL_R16UI 0x8234 -#define GL_R32I 0x8235 -#define GL_R32UI 0x8236 -#define GL_RG8I 0x8237 -#define GL_RG8UI 0x8238 -#define GL_RG16I 0x8239 -#define GL_RG16UI 0x823A -#define GL_RG32I 0x823B -#define GL_RG32UI 0x823C - -#define GLEW_ARB_texture_rg GLEW_GET_VAR(__GLEW_ARB_texture_rg) - -#endif /* GL_ARB_texture_rg */ - -/* ----------------------- GL_ARB_texture_rgb10_a2ui ----------------------- */ - -#ifndef GL_ARB_texture_rgb10_a2ui -#define GL_ARB_texture_rgb10_a2ui 1 - -#define GL_RGB10_A2UI 0x906F - -#define GLEW_ARB_texture_rgb10_a2ui GLEW_GET_VAR(__GLEW_ARB_texture_rgb10_a2ui) - -#endif /* GL_ARB_texture_rgb10_a2ui */ - -/* ------------------------ GL_ARB_texture_stencil8 ------------------------ */ - -#ifndef GL_ARB_texture_stencil8 -#define GL_ARB_texture_stencil8 1 - -#define GL_STENCIL_INDEX 0x1901 -#define GL_STENCIL_INDEX8 0x8D48 - -#define GLEW_ARB_texture_stencil8 GLEW_GET_VAR(__GLEW_ARB_texture_stencil8) - -#endif /* GL_ARB_texture_stencil8 */ - -/* ------------------------- GL_ARB_texture_storage ------------------------ */ - -#ifndef GL_ARB_texture_storage -#define GL_ARB_texture_storage 1 - -#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F - -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); - -#define glTexStorage1D GLEW_GET_FUN(__glewTexStorage1D) -#define glTexStorage2D GLEW_GET_FUN(__glewTexStorage2D) -#define glTexStorage3D GLEW_GET_FUN(__glewTexStorage3D) - -#define GLEW_ARB_texture_storage GLEW_GET_VAR(__GLEW_ARB_texture_storage) - -#endif /* GL_ARB_texture_storage */ - -/* ------------------- GL_ARB_texture_storage_multisample ------------------ */ - -#ifndef GL_ARB_texture_storage_multisample -#define GL_ARB_texture_storage_multisample 1 - -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); - -#define glTexStorage2DMultisample GLEW_GET_FUN(__glewTexStorage2DMultisample) -#define glTexStorage3DMultisample GLEW_GET_FUN(__glewTexStorage3DMultisample) -#define glTextureStorage2DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage2DMultisampleEXT) -#define glTextureStorage3DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage3DMultisampleEXT) - -#define GLEW_ARB_texture_storage_multisample GLEW_GET_VAR(__GLEW_ARB_texture_storage_multisample) - -#endif /* GL_ARB_texture_storage_multisample */ - -/* ------------------------- GL_ARB_texture_swizzle ------------------------ */ - -#ifndef GL_ARB_texture_swizzle -#define GL_ARB_texture_swizzle 1 - -#define GL_TEXTURE_SWIZZLE_R 0x8E42 -#define GL_TEXTURE_SWIZZLE_G 0x8E43 -#define GL_TEXTURE_SWIZZLE_B 0x8E44 -#define GL_TEXTURE_SWIZZLE_A 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 - -#define GLEW_ARB_texture_swizzle GLEW_GET_VAR(__GLEW_ARB_texture_swizzle) - -#endif /* GL_ARB_texture_swizzle */ - -/* -------------------------- GL_ARB_texture_view -------------------------- */ - -#ifndef GL_ARB_texture_view -#define GL_ARB_texture_view 1 - -#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB -#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC -#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD -#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE -#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF - -typedef void (GLAPIENTRY * PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); - -#define glTextureView GLEW_GET_FUN(__glewTextureView) - -#define GLEW_ARB_texture_view GLEW_GET_VAR(__GLEW_ARB_texture_view) - -#endif /* GL_ARB_texture_view */ - -/* --------------------------- GL_ARB_timer_query -------------------------- */ - -#ifndef GL_ARB_timer_query -#define GL_ARB_timer_query 1 - -#define GL_TIME_ELAPSED 0x88BF -#define GL_TIMESTAMP 0x8E28 - -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64* params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64* params); -typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); - -#define glGetQueryObjecti64v GLEW_GET_FUN(__glewGetQueryObjecti64v) -#define glGetQueryObjectui64v GLEW_GET_FUN(__glewGetQueryObjectui64v) -#define glQueryCounter GLEW_GET_FUN(__glewQueryCounter) - -#define GLEW_ARB_timer_query GLEW_GET_VAR(__GLEW_ARB_timer_query) - -#endif /* GL_ARB_timer_query */ - -/* ----------------------- GL_ARB_transform_feedback2 ---------------------- */ - -#ifndef GL_ARB_transform_feedback2 -#define GL_ARB_transform_feedback2 1 - -#define GL_TRANSFORM_FEEDBACK 0x8E22 -#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 -#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 -#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 - -typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); -typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids); -typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); -typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); - -#define glBindTransformFeedback GLEW_GET_FUN(__glewBindTransformFeedback) -#define glDeleteTransformFeedbacks GLEW_GET_FUN(__glewDeleteTransformFeedbacks) -#define glDrawTransformFeedback GLEW_GET_FUN(__glewDrawTransformFeedback) -#define glGenTransformFeedbacks GLEW_GET_FUN(__glewGenTransformFeedbacks) -#define glIsTransformFeedback GLEW_GET_FUN(__glewIsTransformFeedback) -#define glPauseTransformFeedback GLEW_GET_FUN(__glewPauseTransformFeedback) -#define glResumeTransformFeedback GLEW_GET_FUN(__glewResumeTransformFeedback) - -#define GLEW_ARB_transform_feedback2 GLEW_GET_VAR(__GLEW_ARB_transform_feedback2) - -#endif /* GL_ARB_transform_feedback2 */ - -/* ----------------------- GL_ARB_transform_feedback3 ---------------------- */ - -#ifndef GL_ARB_transform_feedback3 -#define GL_ARB_transform_feedback3 1 - -#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 -#define GL_MAX_VERTEX_STREAMS 0x8E71 - -typedef void (GLAPIENTRY * PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); -typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); -typedef void (GLAPIENTRY * PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRY * PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); - -#define glBeginQueryIndexed GLEW_GET_FUN(__glewBeginQueryIndexed) -#define glDrawTransformFeedbackStream GLEW_GET_FUN(__glewDrawTransformFeedbackStream) -#define glEndQueryIndexed GLEW_GET_FUN(__glewEndQueryIndexed) -#define glGetQueryIndexediv GLEW_GET_FUN(__glewGetQueryIndexediv) - -#define GLEW_ARB_transform_feedback3 GLEW_GET_VAR(__GLEW_ARB_transform_feedback3) - -#endif /* GL_ARB_transform_feedback3 */ - -/* ------------------ GL_ARB_transform_feedback_instanced ------------------ */ - -#ifndef GL_ARB_transform_feedback_instanced -#define GL_ARB_transform_feedback_instanced 1 - -typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei primcount); - -#define glDrawTransformFeedbackInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackInstanced) -#define glDrawTransformFeedbackStreamInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackStreamInstanced) - -#define GLEW_ARB_transform_feedback_instanced GLEW_GET_VAR(__GLEW_ARB_transform_feedback_instanced) - -#endif /* GL_ARB_transform_feedback_instanced */ - -/* ---------------- GL_ARB_transform_feedback_overflow_query --------------- */ - -#ifndef GL_ARB_transform_feedback_overflow_query -#define GL_ARB_transform_feedback_overflow_query 1 - -#define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC -#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED - -#define GLEW_ARB_transform_feedback_overflow_query GLEW_GET_VAR(__GLEW_ARB_transform_feedback_overflow_query) - -#endif /* GL_ARB_transform_feedback_overflow_query */ - -/* ------------------------ GL_ARB_transpose_matrix ------------------------ */ - -#ifndef GL_ARB_transpose_matrix -#define GL_ARB_transpose_matrix 1 - -#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 - -typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); -typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); -typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); -typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); - -#define glLoadTransposeMatrixdARB GLEW_GET_FUN(__glewLoadTransposeMatrixdARB) -#define glLoadTransposeMatrixfARB GLEW_GET_FUN(__glewLoadTransposeMatrixfARB) -#define glMultTransposeMatrixdARB GLEW_GET_FUN(__glewMultTransposeMatrixdARB) -#define glMultTransposeMatrixfARB GLEW_GET_FUN(__glewMultTransposeMatrixfARB) - -#define GLEW_ARB_transpose_matrix GLEW_GET_VAR(__GLEW_ARB_transpose_matrix) - -#endif /* GL_ARB_transpose_matrix */ - -/* ---------------------- GL_ARB_uniform_buffer_object --------------------- */ - -#ifndef GL_ARB_uniform_buffer_object -#define GL_ARB_uniform_buffer_object 1 - -#define GL_UNIFORM_BUFFER 0x8A11 -#define GL_UNIFORM_BUFFER_BINDING 0x8A28 -#define GL_UNIFORM_BUFFER_START 0x8A29 -#define GL_UNIFORM_BUFFER_SIZE 0x8A2A -#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C -#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D -#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E -#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F -#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 -#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 -#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 -#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 -#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 -#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 -#define GL_UNIFORM_TYPE 0x8A37 -#define GL_UNIFORM_SIZE 0x8A38 -#define GL_UNIFORM_NAME_LENGTH 0x8A39 -#define GL_UNIFORM_BLOCK_INDEX 0x8A3A -#define GL_UNIFORM_OFFSET 0x8A3B -#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C -#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D -#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E -#define GL_UNIFORM_BLOCK_BINDING 0x8A3F -#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 -#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 -#define GL_INVALID_INDEX 0xFFFFFFFFu - -typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName); -typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformName); -typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint* data); -typedef GLuint (GLAPIENTRY * PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar* uniformBlockName); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar* const * uniformNames, GLuint* uniformIndices); -typedef void (GLAPIENTRY * PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); - -#define glBindBufferBase GLEW_GET_FUN(__glewBindBufferBase) -#define glBindBufferRange GLEW_GET_FUN(__glewBindBufferRange) -#define glGetActiveUniformBlockName GLEW_GET_FUN(__glewGetActiveUniformBlockName) -#define glGetActiveUniformBlockiv GLEW_GET_FUN(__glewGetActiveUniformBlockiv) -#define glGetActiveUniformName GLEW_GET_FUN(__glewGetActiveUniformName) -#define glGetActiveUniformsiv GLEW_GET_FUN(__glewGetActiveUniformsiv) -#define glGetIntegeri_v GLEW_GET_FUN(__glewGetIntegeri_v) -#define glGetUniformBlockIndex GLEW_GET_FUN(__glewGetUniformBlockIndex) -#define glGetUniformIndices GLEW_GET_FUN(__glewGetUniformIndices) -#define glUniformBlockBinding GLEW_GET_FUN(__glewUniformBlockBinding) - -#define GLEW_ARB_uniform_buffer_object GLEW_GET_VAR(__GLEW_ARB_uniform_buffer_object) - -#endif /* GL_ARB_uniform_buffer_object */ - -/* ------------------------ GL_ARB_vertex_array_bgra ----------------------- */ - -#ifndef GL_ARB_vertex_array_bgra -#define GL_ARB_vertex_array_bgra 1 - -#define GL_BGRA 0x80E1 - -#define GLEW_ARB_vertex_array_bgra GLEW_GET_VAR(__GLEW_ARB_vertex_array_bgra) - -#endif /* GL_ARB_vertex_array_bgra */ - -/* ----------------------- GL_ARB_vertex_array_object ---------------------- */ - -#ifndef GL_ARB_vertex_array_object -#define GL_ARB_vertex_array_object 1 - -#define GL_VERTEX_ARRAY_BINDING 0x85B5 - -typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYPROC) (GLuint array); -typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint* arrays); -typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays); -typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYPROC) (GLuint array); - -#define glBindVertexArray GLEW_GET_FUN(__glewBindVertexArray) -#define glDeleteVertexArrays GLEW_GET_FUN(__glewDeleteVertexArrays) -#define glGenVertexArrays GLEW_GET_FUN(__glewGenVertexArrays) -#define glIsVertexArray GLEW_GET_FUN(__glewIsVertexArray) - -#define GLEW_ARB_vertex_array_object GLEW_GET_VAR(__GLEW_ARB_vertex_array_object) - -#endif /* GL_ARB_vertex_array_object */ - -/* ----------------------- GL_ARB_vertex_attrib_64bit ---------------------- */ - -#ifndef GL_ARB_vertex_attrib_64bit -#define GL_ARB_vertex_attrib_64bit 1 - -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); - -#define glGetVertexAttribLdv GLEW_GET_FUN(__glewGetVertexAttribLdv) -#define glVertexAttribL1d GLEW_GET_FUN(__glewVertexAttribL1d) -#define glVertexAttribL1dv GLEW_GET_FUN(__glewVertexAttribL1dv) -#define glVertexAttribL2d GLEW_GET_FUN(__glewVertexAttribL2d) -#define glVertexAttribL2dv GLEW_GET_FUN(__glewVertexAttribL2dv) -#define glVertexAttribL3d GLEW_GET_FUN(__glewVertexAttribL3d) -#define glVertexAttribL3dv GLEW_GET_FUN(__glewVertexAttribL3dv) -#define glVertexAttribL4d GLEW_GET_FUN(__glewVertexAttribL4d) -#define glVertexAttribL4dv GLEW_GET_FUN(__glewVertexAttribL4dv) -#define glVertexAttribLPointer GLEW_GET_FUN(__glewVertexAttribLPointer) - -#define GLEW_ARB_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_64bit) - -#endif /* GL_ARB_vertex_attrib_64bit */ - -/* ---------------------- GL_ARB_vertex_attrib_binding --------------------- */ - -#ifndef GL_ARB_vertex_attrib_binding -#define GL_ARB_vertex_attrib_binding 1 - -#define GL_VERTEX_ATTRIB_BINDING 0x82D4 -#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 -#define GL_VERTEX_BINDING_DIVISOR 0x82D6 -#define GL_VERTEX_BINDING_OFFSET 0x82D7 -#define GL_VERTEX_BINDING_STRIDE 0x82D8 -#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 -#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA -#define GL_VERTEX_BINDING_BUFFER 0x8F4F - -typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (GLAPIENTRY * PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); - -#define glBindVertexBuffer GLEW_GET_FUN(__glewBindVertexBuffer) -#define glVertexArrayBindVertexBufferEXT GLEW_GET_FUN(__glewVertexArrayBindVertexBufferEXT) -#define glVertexArrayVertexAttribBindingEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribBindingEXT) -#define glVertexArrayVertexAttribFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribFormatEXT) -#define glVertexArrayVertexAttribIFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIFormatEXT) -#define glVertexArrayVertexAttribLFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLFormatEXT) -#define glVertexArrayVertexBindingDivisorEXT GLEW_GET_FUN(__glewVertexArrayVertexBindingDivisorEXT) -#define glVertexAttribBinding GLEW_GET_FUN(__glewVertexAttribBinding) -#define glVertexAttribFormat GLEW_GET_FUN(__glewVertexAttribFormat) -#define glVertexAttribIFormat GLEW_GET_FUN(__glewVertexAttribIFormat) -#define glVertexAttribLFormat GLEW_GET_FUN(__glewVertexAttribLFormat) -#define glVertexBindingDivisor GLEW_GET_FUN(__glewVertexBindingDivisor) - -#define GLEW_ARB_vertex_attrib_binding GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_binding) - -#endif /* GL_ARB_vertex_attrib_binding */ - -/* -------------------------- GL_ARB_vertex_blend -------------------------- */ - -#ifndef GL_ARB_vertex_blend -#define GL_ARB_vertex_blend 1 - -#define GL_MODELVIEW0_ARB 0x1700 -#define GL_MODELVIEW1_ARB 0x850A -#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 -#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 -#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 -#define GL_VERTEX_BLEND_ARB 0x86A7 -#define GL_CURRENT_WEIGHT_ARB 0x86A8 -#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 -#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA -#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB -#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC -#define GL_WEIGHT_ARRAY_ARB 0x86AD -#define GL_MODELVIEW2_ARB 0x8722 -#define GL_MODELVIEW3_ARB 0x8723 -#define GL_MODELVIEW4_ARB 0x8724 -#define GL_MODELVIEW5_ARB 0x8725 -#define GL_MODELVIEW6_ARB 0x8726 -#define GL_MODELVIEW7_ARB 0x8727 -#define GL_MODELVIEW8_ARB 0x8728 -#define GL_MODELVIEW9_ARB 0x8729 -#define GL_MODELVIEW10_ARB 0x872A -#define GL_MODELVIEW11_ARB 0x872B -#define GL_MODELVIEW12_ARB 0x872C -#define GL_MODELVIEW13_ARB 0x872D -#define GL_MODELVIEW14_ARB 0x872E -#define GL_MODELVIEW15_ARB 0x872F -#define GL_MODELVIEW16_ARB 0x8730 -#define GL_MODELVIEW17_ARB 0x8731 -#define GL_MODELVIEW18_ARB 0x8732 -#define GL_MODELVIEW19_ARB 0x8733 -#define GL_MODELVIEW20_ARB 0x8734 -#define GL_MODELVIEW21_ARB 0x8735 -#define GL_MODELVIEW22_ARB 0x8736 -#define GL_MODELVIEW23_ARB 0x8737 -#define GL_MODELVIEW24_ARB 0x8738 -#define GL_MODELVIEW25_ARB 0x8739 -#define GL_MODELVIEW26_ARB 0x873A -#define GL_MODELVIEW27_ARB 0x873B -#define GL_MODELVIEW28_ARB 0x873C -#define GL_MODELVIEW29_ARB 0x873D -#define GL_MODELVIEW30_ARB 0x873E -#define GL_MODELVIEW31_ARB 0x873F - -typedef void (GLAPIENTRY * PFNGLVERTEXBLENDARBPROC) (GLint count); -typedef void (GLAPIENTRY * PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); -typedef void (GLAPIENTRY * PFNGLWEIGHTBVARBPROC) (GLint size, GLbyte *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTDVARBPROC) (GLint size, GLdouble *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTFVARBPROC) (GLint size, GLfloat *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTIVARBPROC) (GLint size, GLint *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTSVARBPROC) (GLint size, GLshort *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTUBVARBPROC) (GLint size, GLubyte *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTUIVARBPROC) (GLint size, GLuint *weights); -typedef void (GLAPIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, GLushort *weights); - -#define glVertexBlendARB GLEW_GET_FUN(__glewVertexBlendARB) -#define glWeightPointerARB GLEW_GET_FUN(__glewWeightPointerARB) -#define glWeightbvARB GLEW_GET_FUN(__glewWeightbvARB) -#define glWeightdvARB GLEW_GET_FUN(__glewWeightdvARB) -#define glWeightfvARB GLEW_GET_FUN(__glewWeightfvARB) -#define glWeightivARB GLEW_GET_FUN(__glewWeightivARB) -#define glWeightsvARB GLEW_GET_FUN(__glewWeightsvARB) -#define glWeightubvARB GLEW_GET_FUN(__glewWeightubvARB) -#define glWeightuivARB GLEW_GET_FUN(__glewWeightuivARB) -#define glWeightusvARB GLEW_GET_FUN(__glewWeightusvARB) - -#define GLEW_ARB_vertex_blend GLEW_GET_VAR(__GLEW_ARB_vertex_blend) - -#endif /* GL_ARB_vertex_blend */ - -/* ---------------------- GL_ARB_vertex_buffer_object ---------------------- */ - -#ifndef GL_ARB_vertex_buffer_object -#define GL_ARB_vertex_buffer_object 1 - -#define GL_BUFFER_SIZE_ARB 0x8764 -#define GL_BUFFER_USAGE_ARB 0x8765 -#define GL_ARRAY_BUFFER_ARB 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 -#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F -#define GL_READ_ONLY_ARB 0x88B8 -#define GL_WRITE_ONLY_ARB 0x88B9 -#define GL_READ_WRITE_ARB 0x88BA -#define GL_BUFFER_ACCESS_ARB 0x88BB -#define GL_BUFFER_MAPPED_ARB 0x88BC -#define GL_BUFFER_MAP_POINTER_ARB 0x88BD -#define GL_STREAM_DRAW_ARB 0x88E0 -#define GL_STREAM_READ_ARB 0x88E1 -#define GL_STREAM_COPY_ARB 0x88E2 -#define GL_STATIC_DRAW_ARB 0x88E4 -#define GL_STATIC_READ_ARB 0x88E5 -#define GL_STATIC_COPY_ARB 0x88E6 -#define GL_DYNAMIC_DRAW_ARB 0x88E8 -#define GL_DYNAMIC_READ_ARB 0x88E9 -#define GL_DYNAMIC_COPY_ARB 0x88EA - -typedef ptrdiff_t GLintptrARB; -typedef ptrdiff_t GLsizeiptrARB; - -typedef void (GLAPIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); -typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); -typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint* buffers); -typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void** params); -typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); -typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERARBPROC) (GLuint buffer); -typedef void * (GLAPIENTRY * PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); -typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERARBPROC) (GLenum target); - -#define glBindBufferARB GLEW_GET_FUN(__glewBindBufferARB) -#define glBufferDataARB GLEW_GET_FUN(__glewBufferDataARB) -#define glBufferSubDataARB GLEW_GET_FUN(__glewBufferSubDataARB) -#define glDeleteBuffersARB GLEW_GET_FUN(__glewDeleteBuffersARB) -#define glGenBuffersARB GLEW_GET_FUN(__glewGenBuffersARB) -#define glGetBufferParameterivARB GLEW_GET_FUN(__glewGetBufferParameterivARB) -#define glGetBufferPointervARB GLEW_GET_FUN(__glewGetBufferPointervARB) -#define glGetBufferSubDataARB GLEW_GET_FUN(__glewGetBufferSubDataARB) -#define glIsBufferARB GLEW_GET_FUN(__glewIsBufferARB) -#define glMapBufferARB GLEW_GET_FUN(__glewMapBufferARB) -#define glUnmapBufferARB GLEW_GET_FUN(__glewUnmapBufferARB) - -#define GLEW_ARB_vertex_buffer_object GLEW_GET_VAR(__GLEW_ARB_vertex_buffer_object) - -#endif /* GL_ARB_vertex_buffer_object */ - -/* ------------------------- GL_ARB_vertex_program ------------------------- */ - -#ifndef GL_ARB_vertex_program -#define GL_ARB_vertex_program 1 - -#define GL_COLOR_SUM_ARB 0x8458 -#define GL_VERTEX_PROGRAM_ARB 0x8620 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 -#define GL_PROGRAM_LENGTH_ARB 0x8627 -#define GL_PROGRAM_STRING_ARB 0x8628 -#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E -#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F -#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 -#define GL_CURRENT_MATRIX_ARB 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 -#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B -#define GL_PROGRAM_BINDING_ARB 0x8677 -#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A -#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 -#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 -#define GL_PROGRAM_FORMAT_ARB 0x8876 -#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 -#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 -#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 -#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 -#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 -#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 -#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 -#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 -#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 -#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 -#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA -#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB -#define GL_PROGRAM_ATTRIBS_ARB 0x88AC -#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD -#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE -#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF -#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 -#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 -#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 -#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 -#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 -#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 -#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 -#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 -#define GL_MATRIX0_ARB 0x88C0 -#define GL_MATRIX1_ARB 0x88C1 -#define GL_MATRIX2_ARB 0x88C2 -#define GL_MATRIX3_ARB 0x88C3 -#define GL_MATRIX4_ARB 0x88C4 -#define GL_MATRIX5_ARB 0x88C5 -#define GL_MATRIX6_ARB 0x88C6 -#define GL_MATRIX7_ARB 0x88C7 -#define GL_MATRIX8_ARB 0x88C8 -#define GL_MATRIX9_ARB 0x88C9 -#define GL_MATRIX10_ARB 0x88CA -#define GL_MATRIX11_ARB 0x88CB -#define GL_MATRIX12_ARB 0x88CC -#define GL_MATRIX13_ARB 0x88CD -#define GL_MATRIX14_ARB 0x88CE -#define GL_MATRIX15_ARB 0x88CF -#define GL_MATRIX16_ARB 0x88D0 -#define GL_MATRIX17_ARB 0x88D1 -#define GL_MATRIX18_ARB 0x88D2 -#define GL_MATRIX19_ARB 0x88D3 -#define GL_MATRIX20_ARB 0x88D4 -#define GL_MATRIX21_ARB 0x88D5 -#define GL_MATRIX22_ARB 0x88D6 -#define GL_MATRIX23_ARB 0x88D7 -#define GL_MATRIX24_ARB 0x88D8 -#define GL_MATRIX25_ARB 0x88D9 -#define GL_MATRIX26_ARB 0x88DA -#define GL_MATRIX27_ARB 0x88DB -#define GL_MATRIX28_ARB 0x88DC -#define GL_MATRIX29_ARB 0x88DD -#define GL_MATRIX30_ARB 0x88DE -#define GL_MATRIX31_ARB 0x88DF - -typedef void (GLAPIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); -typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint* programs); -typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (GLAPIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint* programs); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void** pointer); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); - -#define glBindProgramARB GLEW_GET_FUN(__glewBindProgramARB) -#define glDeleteProgramsARB GLEW_GET_FUN(__glewDeleteProgramsARB) -#define glDisableVertexAttribArrayARB GLEW_GET_FUN(__glewDisableVertexAttribArrayARB) -#define glEnableVertexAttribArrayARB GLEW_GET_FUN(__glewEnableVertexAttribArrayARB) -#define glGenProgramsARB GLEW_GET_FUN(__glewGenProgramsARB) -#define glGetProgramEnvParameterdvARB GLEW_GET_FUN(__glewGetProgramEnvParameterdvARB) -#define glGetProgramEnvParameterfvARB GLEW_GET_FUN(__glewGetProgramEnvParameterfvARB) -#define glGetProgramLocalParameterdvARB GLEW_GET_FUN(__glewGetProgramLocalParameterdvARB) -#define glGetProgramLocalParameterfvARB GLEW_GET_FUN(__glewGetProgramLocalParameterfvARB) -#define glGetProgramStringARB GLEW_GET_FUN(__glewGetProgramStringARB) -#define glGetProgramivARB GLEW_GET_FUN(__glewGetProgramivARB) -#define glGetVertexAttribPointervARB GLEW_GET_FUN(__glewGetVertexAttribPointervARB) -#define glGetVertexAttribdvARB GLEW_GET_FUN(__glewGetVertexAttribdvARB) -#define glGetVertexAttribfvARB GLEW_GET_FUN(__glewGetVertexAttribfvARB) -#define glGetVertexAttribivARB GLEW_GET_FUN(__glewGetVertexAttribivARB) -#define glIsProgramARB GLEW_GET_FUN(__glewIsProgramARB) -#define glProgramEnvParameter4dARB GLEW_GET_FUN(__glewProgramEnvParameter4dARB) -#define glProgramEnvParameter4dvARB GLEW_GET_FUN(__glewProgramEnvParameter4dvARB) -#define glProgramEnvParameter4fARB GLEW_GET_FUN(__glewProgramEnvParameter4fARB) -#define glProgramEnvParameter4fvARB GLEW_GET_FUN(__glewProgramEnvParameter4fvARB) -#define glProgramLocalParameter4dARB GLEW_GET_FUN(__glewProgramLocalParameter4dARB) -#define glProgramLocalParameter4dvARB GLEW_GET_FUN(__glewProgramLocalParameter4dvARB) -#define glProgramLocalParameter4fARB GLEW_GET_FUN(__glewProgramLocalParameter4fARB) -#define glProgramLocalParameter4fvARB GLEW_GET_FUN(__glewProgramLocalParameter4fvARB) -#define glProgramStringARB GLEW_GET_FUN(__glewProgramStringARB) -#define glVertexAttrib1dARB GLEW_GET_FUN(__glewVertexAttrib1dARB) -#define glVertexAttrib1dvARB GLEW_GET_FUN(__glewVertexAttrib1dvARB) -#define glVertexAttrib1fARB GLEW_GET_FUN(__glewVertexAttrib1fARB) -#define glVertexAttrib1fvARB GLEW_GET_FUN(__glewVertexAttrib1fvARB) -#define glVertexAttrib1sARB GLEW_GET_FUN(__glewVertexAttrib1sARB) -#define glVertexAttrib1svARB GLEW_GET_FUN(__glewVertexAttrib1svARB) -#define glVertexAttrib2dARB GLEW_GET_FUN(__glewVertexAttrib2dARB) -#define glVertexAttrib2dvARB GLEW_GET_FUN(__glewVertexAttrib2dvARB) -#define glVertexAttrib2fARB GLEW_GET_FUN(__glewVertexAttrib2fARB) -#define glVertexAttrib2fvARB GLEW_GET_FUN(__glewVertexAttrib2fvARB) -#define glVertexAttrib2sARB GLEW_GET_FUN(__glewVertexAttrib2sARB) -#define glVertexAttrib2svARB GLEW_GET_FUN(__glewVertexAttrib2svARB) -#define glVertexAttrib3dARB GLEW_GET_FUN(__glewVertexAttrib3dARB) -#define glVertexAttrib3dvARB GLEW_GET_FUN(__glewVertexAttrib3dvARB) -#define glVertexAttrib3fARB GLEW_GET_FUN(__glewVertexAttrib3fARB) -#define glVertexAttrib3fvARB GLEW_GET_FUN(__glewVertexAttrib3fvARB) -#define glVertexAttrib3sARB GLEW_GET_FUN(__glewVertexAttrib3sARB) -#define glVertexAttrib3svARB GLEW_GET_FUN(__glewVertexAttrib3svARB) -#define glVertexAttrib4NbvARB GLEW_GET_FUN(__glewVertexAttrib4NbvARB) -#define glVertexAttrib4NivARB GLEW_GET_FUN(__glewVertexAttrib4NivARB) -#define glVertexAttrib4NsvARB GLEW_GET_FUN(__glewVertexAttrib4NsvARB) -#define glVertexAttrib4NubARB GLEW_GET_FUN(__glewVertexAttrib4NubARB) -#define glVertexAttrib4NubvARB GLEW_GET_FUN(__glewVertexAttrib4NubvARB) -#define glVertexAttrib4NuivARB GLEW_GET_FUN(__glewVertexAttrib4NuivARB) -#define glVertexAttrib4NusvARB GLEW_GET_FUN(__glewVertexAttrib4NusvARB) -#define glVertexAttrib4bvARB GLEW_GET_FUN(__glewVertexAttrib4bvARB) -#define glVertexAttrib4dARB GLEW_GET_FUN(__glewVertexAttrib4dARB) -#define glVertexAttrib4dvARB GLEW_GET_FUN(__glewVertexAttrib4dvARB) -#define glVertexAttrib4fARB GLEW_GET_FUN(__glewVertexAttrib4fARB) -#define glVertexAttrib4fvARB GLEW_GET_FUN(__glewVertexAttrib4fvARB) -#define glVertexAttrib4ivARB GLEW_GET_FUN(__glewVertexAttrib4ivARB) -#define glVertexAttrib4sARB GLEW_GET_FUN(__glewVertexAttrib4sARB) -#define glVertexAttrib4svARB GLEW_GET_FUN(__glewVertexAttrib4svARB) -#define glVertexAttrib4ubvARB GLEW_GET_FUN(__glewVertexAttrib4ubvARB) -#define glVertexAttrib4uivARB GLEW_GET_FUN(__glewVertexAttrib4uivARB) -#define glVertexAttrib4usvARB GLEW_GET_FUN(__glewVertexAttrib4usvARB) -#define glVertexAttribPointerARB GLEW_GET_FUN(__glewVertexAttribPointerARB) - -#define GLEW_ARB_vertex_program GLEW_GET_VAR(__GLEW_ARB_vertex_program) - -#endif /* GL_ARB_vertex_program */ - -/* -------------------------- GL_ARB_vertex_shader ------------------------- */ - -#ifndef GL_ARB_vertex_shader -#define GL_ARB_vertex_shader 1 - -#define GL_VERTEX_SHADER_ARB 0x8B31 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A -#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D -#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 -#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A - -typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB* name); -typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); -typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); - -#define glBindAttribLocationARB GLEW_GET_FUN(__glewBindAttribLocationARB) -#define glGetActiveAttribARB GLEW_GET_FUN(__glewGetActiveAttribARB) -#define glGetAttribLocationARB GLEW_GET_FUN(__glewGetAttribLocationARB) - -#define GLEW_ARB_vertex_shader GLEW_GET_VAR(__GLEW_ARB_vertex_shader) - -#endif /* GL_ARB_vertex_shader */ - -/* ------------------- GL_ARB_vertex_type_10f_11f_11f_rev ------------------ */ - -#ifndef GL_ARB_vertex_type_10f_11f_11f_rev -#define GL_ARB_vertex_type_10f_11f_11f_rev 1 - -#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B - -#define GLEW_ARB_vertex_type_10f_11f_11f_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_10f_11f_11f_rev) - -#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ - -/* ------------------- GL_ARB_vertex_type_2_10_10_10_rev ------------------- */ - -#ifndef GL_ARB_vertex_type_2_10_10_10_rev -#define GL_ARB_vertex_type_2_10_10_10_rev 1 - -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_INT_2_10_10_10_REV 0x8D9F - -typedef void (GLAPIENTRY * PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); -typedef void (GLAPIENTRY * PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint* color); -typedef void (GLAPIENTRY * PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); -typedef void (GLAPIENTRY * PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint* color); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint* color); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); -typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint* coords); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); -typedef void (GLAPIENTRY * PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint* value); - -#define glColorP3ui GLEW_GET_FUN(__glewColorP3ui) -#define glColorP3uiv GLEW_GET_FUN(__glewColorP3uiv) -#define glColorP4ui GLEW_GET_FUN(__glewColorP4ui) -#define glColorP4uiv GLEW_GET_FUN(__glewColorP4uiv) -#define glMultiTexCoordP1ui GLEW_GET_FUN(__glewMultiTexCoordP1ui) -#define glMultiTexCoordP1uiv GLEW_GET_FUN(__glewMultiTexCoordP1uiv) -#define glMultiTexCoordP2ui GLEW_GET_FUN(__glewMultiTexCoordP2ui) -#define glMultiTexCoordP2uiv GLEW_GET_FUN(__glewMultiTexCoordP2uiv) -#define glMultiTexCoordP3ui GLEW_GET_FUN(__glewMultiTexCoordP3ui) -#define glMultiTexCoordP3uiv GLEW_GET_FUN(__glewMultiTexCoordP3uiv) -#define glMultiTexCoordP4ui GLEW_GET_FUN(__glewMultiTexCoordP4ui) -#define glMultiTexCoordP4uiv GLEW_GET_FUN(__glewMultiTexCoordP4uiv) -#define glNormalP3ui GLEW_GET_FUN(__glewNormalP3ui) -#define glNormalP3uiv GLEW_GET_FUN(__glewNormalP3uiv) -#define glSecondaryColorP3ui GLEW_GET_FUN(__glewSecondaryColorP3ui) -#define glSecondaryColorP3uiv GLEW_GET_FUN(__glewSecondaryColorP3uiv) -#define glTexCoordP1ui GLEW_GET_FUN(__glewTexCoordP1ui) -#define glTexCoordP1uiv GLEW_GET_FUN(__glewTexCoordP1uiv) -#define glTexCoordP2ui GLEW_GET_FUN(__glewTexCoordP2ui) -#define glTexCoordP2uiv GLEW_GET_FUN(__glewTexCoordP2uiv) -#define glTexCoordP3ui GLEW_GET_FUN(__glewTexCoordP3ui) -#define glTexCoordP3uiv GLEW_GET_FUN(__glewTexCoordP3uiv) -#define glTexCoordP4ui GLEW_GET_FUN(__glewTexCoordP4ui) -#define glTexCoordP4uiv GLEW_GET_FUN(__glewTexCoordP4uiv) -#define glVertexAttribP1ui GLEW_GET_FUN(__glewVertexAttribP1ui) -#define glVertexAttribP1uiv GLEW_GET_FUN(__glewVertexAttribP1uiv) -#define glVertexAttribP2ui GLEW_GET_FUN(__glewVertexAttribP2ui) -#define glVertexAttribP2uiv GLEW_GET_FUN(__glewVertexAttribP2uiv) -#define glVertexAttribP3ui GLEW_GET_FUN(__glewVertexAttribP3ui) -#define glVertexAttribP3uiv GLEW_GET_FUN(__glewVertexAttribP3uiv) -#define glVertexAttribP4ui GLEW_GET_FUN(__glewVertexAttribP4ui) -#define glVertexAttribP4uiv GLEW_GET_FUN(__glewVertexAttribP4uiv) -#define glVertexP2ui GLEW_GET_FUN(__glewVertexP2ui) -#define glVertexP2uiv GLEW_GET_FUN(__glewVertexP2uiv) -#define glVertexP3ui GLEW_GET_FUN(__glewVertexP3ui) -#define glVertexP3uiv GLEW_GET_FUN(__glewVertexP3uiv) -#define glVertexP4ui GLEW_GET_FUN(__glewVertexP4ui) -#define glVertexP4uiv GLEW_GET_FUN(__glewVertexP4uiv) - -#define GLEW_ARB_vertex_type_2_10_10_10_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_2_10_10_10_rev) - -#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ - -/* ------------------------- GL_ARB_viewport_array ------------------------- */ - -#ifndef GL_ARB_viewport_array -#define GL_ARB_viewport_array 1 - -#define GL_DEPTH_RANGE 0x0B70 -#define GL_VIEWPORT 0x0BA2 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_MAX_VIEWPORTS 0x825B -#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C -#define GL_VIEWPORT_BOUNDS_RANGE 0x825D -#define GL_LAYER_PROVOKING_VERTEX 0x825E -#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F -#define GL_UNDEFINED_VERTEX 0x8260 -#define GL_FIRST_VERTEX_CONVENTION 0x8E4D -#define GL_LAST_VERTEX_CONVENTION 0x8E4E -#define GL_PROVOKING_VERTEX 0x8E4F - -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLclampd * v); -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLclampd n, GLclampd f); -typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble* data); -typedef void (GLAPIENTRY * PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat* data); -typedef void (GLAPIENTRY * PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint * v); -typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint * v); -typedef void (GLAPIENTRY * PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat * v); -typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat * v); - -#define glDepthRangeArrayv GLEW_GET_FUN(__glewDepthRangeArrayv) -#define glDepthRangeIndexed GLEW_GET_FUN(__glewDepthRangeIndexed) -#define glGetDoublei_v GLEW_GET_FUN(__glewGetDoublei_v) -#define glGetFloati_v GLEW_GET_FUN(__glewGetFloati_v) -#define glScissorArrayv GLEW_GET_FUN(__glewScissorArrayv) -#define glScissorIndexed GLEW_GET_FUN(__glewScissorIndexed) -#define glScissorIndexedv GLEW_GET_FUN(__glewScissorIndexedv) -#define glViewportArrayv GLEW_GET_FUN(__glewViewportArrayv) -#define glViewportIndexedf GLEW_GET_FUN(__glewViewportIndexedf) -#define glViewportIndexedfv GLEW_GET_FUN(__glewViewportIndexedfv) - -#define GLEW_ARB_viewport_array GLEW_GET_VAR(__GLEW_ARB_viewport_array) - -#endif /* GL_ARB_viewport_array */ - -/* --------------------------- GL_ARB_window_pos --------------------------- */ - -#ifndef GL_ARB_window_pos -#define GL_ARB_window_pos 1 - -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVARBPROC) (const GLdouble* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVARBPROC) (const GLfloat* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVARBPROC) (const GLint* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVARBPROC) (const GLshort* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVARBPROC) (const GLdouble* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVARBPROC) (const GLfloat* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVARBPROC) (const GLint* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVARBPROC) (const GLshort* p); - -#define glWindowPos2dARB GLEW_GET_FUN(__glewWindowPos2dARB) -#define glWindowPos2dvARB GLEW_GET_FUN(__glewWindowPos2dvARB) -#define glWindowPos2fARB GLEW_GET_FUN(__glewWindowPos2fARB) -#define glWindowPos2fvARB GLEW_GET_FUN(__glewWindowPos2fvARB) -#define glWindowPos2iARB GLEW_GET_FUN(__glewWindowPos2iARB) -#define glWindowPos2ivARB GLEW_GET_FUN(__glewWindowPos2ivARB) -#define glWindowPos2sARB GLEW_GET_FUN(__glewWindowPos2sARB) -#define glWindowPos2svARB GLEW_GET_FUN(__glewWindowPos2svARB) -#define glWindowPos3dARB GLEW_GET_FUN(__glewWindowPos3dARB) -#define glWindowPos3dvARB GLEW_GET_FUN(__glewWindowPos3dvARB) -#define glWindowPos3fARB GLEW_GET_FUN(__glewWindowPos3fARB) -#define glWindowPos3fvARB GLEW_GET_FUN(__glewWindowPos3fvARB) -#define glWindowPos3iARB GLEW_GET_FUN(__glewWindowPos3iARB) -#define glWindowPos3ivARB GLEW_GET_FUN(__glewWindowPos3ivARB) -#define glWindowPos3sARB GLEW_GET_FUN(__glewWindowPos3sARB) -#define glWindowPos3svARB GLEW_GET_FUN(__glewWindowPos3svARB) - -#define GLEW_ARB_window_pos GLEW_GET_VAR(__GLEW_ARB_window_pos) - -#endif /* GL_ARB_window_pos */ - -/* ----------------------- GL_ARM_mali_program_binary ---------------------- */ - -#ifndef GL_ARM_mali_program_binary -#define GL_ARM_mali_program_binary 1 - -#define GL_MALI_PROGRAM_BINARY_ARM 0x8F61 - -#define GLEW_ARM_mali_program_binary GLEW_GET_VAR(__GLEW_ARM_mali_program_binary) - -#endif /* GL_ARM_mali_program_binary */ - -/* ----------------------- GL_ARM_mali_shader_binary ----------------------- */ - -#ifndef GL_ARM_mali_shader_binary -#define GL_ARM_mali_shader_binary 1 - -#define GL_MALI_SHADER_BINARY_ARM 0x8F60 - -#define GLEW_ARM_mali_shader_binary GLEW_GET_VAR(__GLEW_ARM_mali_shader_binary) - -#endif /* GL_ARM_mali_shader_binary */ - -/* ------------------------------ GL_ARM_rgba8 ----------------------------- */ - -#ifndef GL_ARM_rgba8 -#define GL_ARM_rgba8 1 - -#define GL_RGBA8_OES 0x8058 - -#define GLEW_ARM_rgba8 GLEW_GET_VAR(__GLEW_ARM_rgba8) - -#endif /* GL_ARM_rgba8 */ - -/* -------------------- GL_ARM_shader_framebuffer_fetch -------------------- */ - -#ifndef GL_ARM_shader_framebuffer_fetch -#define GL_ARM_shader_framebuffer_fetch 1 - -#define GL_FETCH_PER_SAMPLE_ARM 0x8F65 -#define GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM 0x8F66 - -#define GLEW_ARM_shader_framebuffer_fetch GLEW_GET_VAR(__GLEW_ARM_shader_framebuffer_fetch) - -#endif /* GL_ARM_shader_framebuffer_fetch */ - -/* ------------- GL_ARM_shader_framebuffer_fetch_depth_stencil ------------- */ - -#ifndef GL_ARM_shader_framebuffer_fetch_depth_stencil -#define GL_ARM_shader_framebuffer_fetch_depth_stencil 1 - -#define GLEW_ARM_shader_framebuffer_fetch_depth_stencil GLEW_GET_VAR(__GLEW_ARM_shader_framebuffer_fetch_depth_stencil) - -#endif /* GL_ARM_shader_framebuffer_fetch_depth_stencil */ - -/* ------------------------- GL_ATIX_point_sprites ------------------------- */ - -#ifndef GL_ATIX_point_sprites -#define GL_ATIX_point_sprites 1 - -#define GL_TEXTURE_POINT_MODE_ATIX 0x60B0 -#define GL_TEXTURE_POINT_ONE_COORD_ATIX 0x60B1 -#define GL_TEXTURE_POINT_SPRITE_ATIX 0x60B2 -#define GL_POINT_SPRITE_CULL_MODE_ATIX 0x60B3 -#define GL_POINT_SPRITE_CULL_CENTER_ATIX 0x60B4 -#define GL_POINT_SPRITE_CULL_CLIP_ATIX 0x60B5 - -#define GLEW_ATIX_point_sprites GLEW_GET_VAR(__GLEW_ATIX_point_sprites) - -#endif /* GL_ATIX_point_sprites */ - -/* ---------------------- GL_ATIX_texture_env_combine3 --------------------- */ - -#ifndef GL_ATIX_texture_env_combine3 -#define GL_ATIX_texture_env_combine3 1 - -#define GL_MODULATE_ADD_ATIX 0x8744 -#define GL_MODULATE_SIGNED_ADD_ATIX 0x8745 -#define GL_MODULATE_SUBTRACT_ATIX 0x8746 - -#define GLEW_ATIX_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATIX_texture_env_combine3) - -#endif /* GL_ATIX_texture_env_combine3 */ - -/* ----------------------- GL_ATIX_texture_env_route ----------------------- */ - -#ifndef GL_ATIX_texture_env_route -#define GL_ATIX_texture_env_route 1 - -#define GL_SECONDARY_COLOR_ATIX 0x8747 -#define GL_TEXTURE_OUTPUT_RGB_ATIX 0x8748 -#define GL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749 - -#define GLEW_ATIX_texture_env_route GLEW_GET_VAR(__GLEW_ATIX_texture_env_route) - -#endif /* GL_ATIX_texture_env_route */ - -/* ---------------- GL_ATIX_vertex_shader_output_point_size ---------------- */ - -#ifndef GL_ATIX_vertex_shader_output_point_size -#define GL_ATIX_vertex_shader_output_point_size 1 - -#define GL_OUTPUT_POINT_SIZE_ATIX 0x610E - -#define GLEW_ATIX_vertex_shader_output_point_size GLEW_GET_VAR(__GLEW_ATIX_vertex_shader_output_point_size) - -#endif /* GL_ATIX_vertex_shader_output_point_size */ - -/* -------------------------- GL_ATI_draw_buffers -------------------------- */ - -#ifndef GL_ATI_draw_buffers -#define GL_ATI_draw_buffers 1 - -#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 -#define GL_DRAW_BUFFER0_ATI 0x8825 -#define GL_DRAW_BUFFER1_ATI 0x8826 -#define GL_DRAW_BUFFER2_ATI 0x8827 -#define GL_DRAW_BUFFER3_ATI 0x8828 -#define GL_DRAW_BUFFER4_ATI 0x8829 -#define GL_DRAW_BUFFER5_ATI 0x882A -#define GL_DRAW_BUFFER6_ATI 0x882B -#define GL_DRAW_BUFFER7_ATI 0x882C -#define GL_DRAW_BUFFER8_ATI 0x882D -#define GL_DRAW_BUFFER9_ATI 0x882E -#define GL_DRAW_BUFFER10_ATI 0x882F -#define GL_DRAW_BUFFER11_ATI 0x8830 -#define GL_DRAW_BUFFER12_ATI 0x8831 -#define GL_DRAW_BUFFER13_ATI 0x8832 -#define GL_DRAW_BUFFER14_ATI 0x8833 -#define GL_DRAW_BUFFER15_ATI 0x8834 - -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum* bufs); - -#define glDrawBuffersATI GLEW_GET_FUN(__glewDrawBuffersATI) - -#define GLEW_ATI_draw_buffers GLEW_GET_VAR(__GLEW_ATI_draw_buffers) - -#endif /* GL_ATI_draw_buffers */ - -/* -------------------------- GL_ATI_element_array ------------------------- */ - -#ifndef GL_ATI_element_array -#define GL_ATI_element_array 1 - -#define GL_ELEMENT_ARRAY_ATI 0x8768 -#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 -#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A - -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); -typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void *pointer); - -#define glDrawElementArrayATI GLEW_GET_FUN(__glewDrawElementArrayATI) -#define glDrawRangeElementArrayATI GLEW_GET_FUN(__glewDrawRangeElementArrayATI) -#define glElementPointerATI GLEW_GET_FUN(__glewElementPointerATI) - -#define GLEW_ATI_element_array GLEW_GET_VAR(__GLEW_ATI_element_array) - -#endif /* GL_ATI_element_array */ - -/* ------------------------- GL_ATI_envmap_bumpmap ------------------------- */ - -#ifndef GL_ATI_envmap_bumpmap -#define GL_ATI_envmap_bumpmap 1 - -#define GL_BUMP_ROT_MATRIX_ATI 0x8775 -#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 -#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 -#define GL_BUMP_TEX_UNITS_ATI 0x8778 -#define GL_DUDV_ATI 0x8779 -#define GL_DU8DV8_ATI 0x877A -#define GL_BUMP_ENVMAP_ATI 0x877B -#define GL_BUMP_TARGET_ATI 0x877C - -typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); -typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); -typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); -typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); - -#define glGetTexBumpParameterfvATI GLEW_GET_FUN(__glewGetTexBumpParameterfvATI) -#define glGetTexBumpParameterivATI GLEW_GET_FUN(__glewGetTexBumpParameterivATI) -#define glTexBumpParameterfvATI GLEW_GET_FUN(__glewTexBumpParameterfvATI) -#define glTexBumpParameterivATI GLEW_GET_FUN(__glewTexBumpParameterivATI) - -#define GLEW_ATI_envmap_bumpmap GLEW_GET_VAR(__GLEW_ATI_envmap_bumpmap) - -#endif /* GL_ATI_envmap_bumpmap */ - -/* ------------------------- GL_ATI_fragment_shader ------------------------ */ - -#ifndef GL_ATI_fragment_shader -#define GL_ATI_fragment_shader 1 - -#define GL_2X_BIT_ATI 0x00000001 -#define GL_RED_BIT_ATI 0x00000001 -#define GL_4X_BIT_ATI 0x00000002 -#define GL_COMP_BIT_ATI 0x00000002 -#define GL_GREEN_BIT_ATI 0x00000002 -#define GL_8X_BIT_ATI 0x00000004 -#define GL_BLUE_BIT_ATI 0x00000004 -#define GL_NEGATE_BIT_ATI 0x00000004 -#define GL_BIAS_BIT_ATI 0x00000008 -#define GL_HALF_BIT_ATI 0x00000008 -#define GL_QUARTER_BIT_ATI 0x00000010 -#define GL_EIGHTH_BIT_ATI 0x00000020 -#define GL_SATURATE_BIT_ATI 0x00000040 -#define GL_FRAGMENT_SHADER_ATI 0x8920 -#define GL_REG_0_ATI 0x8921 -#define GL_REG_1_ATI 0x8922 -#define GL_REG_2_ATI 0x8923 -#define GL_REG_3_ATI 0x8924 -#define GL_REG_4_ATI 0x8925 -#define GL_REG_5_ATI 0x8926 -#define GL_CON_0_ATI 0x8941 -#define GL_CON_1_ATI 0x8942 -#define GL_CON_2_ATI 0x8943 -#define GL_CON_3_ATI 0x8944 -#define GL_CON_4_ATI 0x8945 -#define GL_CON_5_ATI 0x8946 -#define GL_CON_6_ATI 0x8947 -#define GL_CON_7_ATI 0x8948 -#define GL_MOV_ATI 0x8961 -#define GL_ADD_ATI 0x8963 -#define GL_MUL_ATI 0x8964 -#define GL_SUB_ATI 0x8965 -#define GL_DOT3_ATI 0x8966 -#define GL_DOT4_ATI 0x8967 -#define GL_MAD_ATI 0x8968 -#define GL_LERP_ATI 0x8969 -#define GL_CND_ATI 0x896A -#define GL_CND0_ATI 0x896B -#define GL_DOT2_ADD_ATI 0x896C -#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D -#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E -#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F -#define GL_NUM_PASSES_ATI 0x8970 -#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 -#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 -#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 -#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 -#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 -#define GL_SWIZZLE_STR_ATI 0x8976 -#define GL_SWIZZLE_STQ_ATI 0x8977 -#define GL_SWIZZLE_STR_DR_ATI 0x8978 -#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 -#define GL_SWIZZLE_STRQ_ATI 0x897A -#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B - -typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (GLAPIENTRY * PFNGLBEGINFRAGMENTSHADERATIPROC) (void); -typedef void (GLAPIENTRY * PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (GLAPIENTRY * PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLENDFRAGMENTSHADERATIPROC) (void); -typedef GLuint (GLAPIENTRY * PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); -typedef void (GLAPIENTRY * PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); -typedef void (GLAPIENTRY * PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); -typedef void (GLAPIENTRY * PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat* value); - -#define glAlphaFragmentOp1ATI GLEW_GET_FUN(__glewAlphaFragmentOp1ATI) -#define glAlphaFragmentOp2ATI GLEW_GET_FUN(__glewAlphaFragmentOp2ATI) -#define glAlphaFragmentOp3ATI GLEW_GET_FUN(__glewAlphaFragmentOp3ATI) -#define glBeginFragmentShaderATI GLEW_GET_FUN(__glewBeginFragmentShaderATI) -#define glBindFragmentShaderATI GLEW_GET_FUN(__glewBindFragmentShaderATI) -#define glColorFragmentOp1ATI GLEW_GET_FUN(__glewColorFragmentOp1ATI) -#define glColorFragmentOp2ATI GLEW_GET_FUN(__glewColorFragmentOp2ATI) -#define glColorFragmentOp3ATI GLEW_GET_FUN(__glewColorFragmentOp3ATI) -#define glDeleteFragmentShaderATI GLEW_GET_FUN(__glewDeleteFragmentShaderATI) -#define glEndFragmentShaderATI GLEW_GET_FUN(__glewEndFragmentShaderATI) -#define glGenFragmentShadersATI GLEW_GET_FUN(__glewGenFragmentShadersATI) -#define glPassTexCoordATI GLEW_GET_FUN(__glewPassTexCoordATI) -#define glSampleMapATI GLEW_GET_FUN(__glewSampleMapATI) -#define glSetFragmentShaderConstantATI GLEW_GET_FUN(__glewSetFragmentShaderConstantATI) - -#define GLEW_ATI_fragment_shader GLEW_GET_VAR(__GLEW_ATI_fragment_shader) - -#endif /* GL_ATI_fragment_shader */ - -/* ------------------------ GL_ATI_map_object_buffer ----------------------- */ - -#ifndef GL_ATI_map_object_buffer -#define GL_ATI_map_object_buffer 1 - -typedef void * (GLAPIENTRY * PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); - -#define glMapObjectBufferATI GLEW_GET_FUN(__glewMapObjectBufferATI) -#define glUnmapObjectBufferATI GLEW_GET_FUN(__glewUnmapObjectBufferATI) - -#define GLEW_ATI_map_object_buffer GLEW_GET_VAR(__GLEW_ATI_map_object_buffer) - -#endif /* GL_ATI_map_object_buffer */ - -/* ----------------------------- GL_ATI_meminfo ---------------------------- */ - -#ifndef GL_ATI_meminfo -#define GL_ATI_meminfo 1 - -#define GL_VBO_FREE_MEMORY_ATI 0x87FB -#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC -#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD - -#define GLEW_ATI_meminfo GLEW_GET_VAR(__GLEW_ATI_meminfo) - -#endif /* GL_ATI_meminfo */ - -/* -------------------------- GL_ATI_pn_triangles -------------------------- */ - -#ifndef GL_ATI_pn_triangles -#define GL_ATI_pn_triangles 1 - -#define GL_PN_TRIANGLES_ATI 0x87F0 -#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 -#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 -#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 -#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 -#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 -#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 -#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 -#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 - -typedef void (GLAPIENTRY * PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); - -#define glPNTrianglesfATI GLEW_GET_FUN(__glewPNTrianglesfATI) -#define glPNTrianglesiATI GLEW_GET_FUN(__glewPNTrianglesiATI) - -#define GLEW_ATI_pn_triangles GLEW_GET_VAR(__GLEW_ATI_pn_triangles) - -#endif /* GL_ATI_pn_triangles */ - -/* ------------------------ GL_ATI_separate_stencil ------------------------ */ - -#ifndef GL_ATI_separate_stencil -#define GL_ATI_separate_stencil 1 - -#define GL_STENCIL_BACK_FUNC_ATI 0x8800 -#define GL_STENCIL_BACK_FAIL_ATI 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 - -typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); - -#define glStencilFuncSeparateATI GLEW_GET_FUN(__glewStencilFuncSeparateATI) -#define glStencilOpSeparateATI GLEW_GET_FUN(__glewStencilOpSeparateATI) - -#define GLEW_ATI_separate_stencil GLEW_GET_VAR(__GLEW_ATI_separate_stencil) - -#endif /* GL_ATI_separate_stencil */ - -/* ----------------------- GL_ATI_shader_texture_lod ----------------------- */ - -#ifndef GL_ATI_shader_texture_lod -#define GL_ATI_shader_texture_lod 1 - -#define GLEW_ATI_shader_texture_lod GLEW_GET_VAR(__GLEW_ATI_shader_texture_lod) - -#endif /* GL_ATI_shader_texture_lod */ - -/* ---------------------- GL_ATI_text_fragment_shader ---------------------- */ - -#ifndef GL_ATI_text_fragment_shader -#define GL_ATI_text_fragment_shader 1 - -#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 - -#define GLEW_ATI_text_fragment_shader GLEW_GET_VAR(__GLEW_ATI_text_fragment_shader) - -#endif /* GL_ATI_text_fragment_shader */ - -/* --------------------- GL_ATI_texture_compression_3dc -------------------- */ - -#ifndef GL_ATI_texture_compression_3dc -#define GL_ATI_texture_compression_3dc 1 - -#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837 - -#define GLEW_ATI_texture_compression_3dc GLEW_GET_VAR(__GLEW_ATI_texture_compression_3dc) - -#endif /* GL_ATI_texture_compression_3dc */ - -/* ---------------------- GL_ATI_texture_env_combine3 ---------------------- */ - -#ifndef GL_ATI_texture_env_combine3 -#define GL_ATI_texture_env_combine3 1 - -#define GL_MODULATE_ADD_ATI 0x8744 -#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 -#define GL_MODULATE_SUBTRACT_ATI 0x8746 - -#define GLEW_ATI_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATI_texture_env_combine3) - -#endif /* GL_ATI_texture_env_combine3 */ - -/* -------------------------- GL_ATI_texture_float ------------------------- */ - -#ifndef GL_ATI_texture_float -#define GL_ATI_texture_float 1 - -#define GL_RGBA_FLOAT32_ATI 0x8814 -#define GL_RGB_FLOAT32_ATI 0x8815 -#define GL_ALPHA_FLOAT32_ATI 0x8816 -#define GL_INTENSITY_FLOAT32_ATI 0x8817 -#define GL_LUMINANCE_FLOAT32_ATI 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 -#define GL_RGBA_FLOAT16_ATI 0x881A -#define GL_RGB_FLOAT16_ATI 0x881B -#define GL_ALPHA_FLOAT16_ATI 0x881C -#define GL_INTENSITY_FLOAT16_ATI 0x881D -#define GL_LUMINANCE_FLOAT16_ATI 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F - -#define GLEW_ATI_texture_float GLEW_GET_VAR(__GLEW_ATI_texture_float) - -#endif /* GL_ATI_texture_float */ - -/* ----------------------- GL_ATI_texture_mirror_once ---------------------- */ - -#ifndef GL_ATI_texture_mirror_once -#define GL_ATI_texture_mirror_once 1 - -#define GL_MIRROR_CLAMP_ATI 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 - -#define GLEW_ATI_texture_mirror_once GLEW_GET_VAR(__GLEW_ATI_texture_mirror_once) - -#endif /* GL_ATI_texture_mirror_once */ - -/* ----------------------- GL_ATI_vertex_array_object ---------------------- */ - -#ifndef GL_ATI_vertex_array_object -#define GL_ATI_vertex_array_object 1 - -#define GL_STATIC_ATI 0x8760 -#define GL_DYNAMIC_ATI 0x8761 -#define GL_PRESERVE_ATI 0x8762 -#define GL_DISCARD_ATI 0x8763 -#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 -#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 -#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 -#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 - -typedef void (GLAPIENTRY * PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (GLAPIENTRY * PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); -typedef GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void *pointer, GLenum usage); -typedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); -typedef void (GLAPIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); - -#define glArrayObjectATI GLEW_GET_FUN(__glewArrayObjectATI) -#define glFreeObjectBufferATI GLEW_GET_FUN(__glewFreeObjectBufferATI) -#define glGetArrayObjectfvATI GLEW_GET_FUN(__glewGetArrayObjectfvATI) -#define glGetArrayObjectivATI GLEW_GET_FUN(__glewGetArrayObjectivATI) -#define glGetObjectBufferfvATI GLEW_GET_FUN(__glewGetObjectBufferfvATI) -#define glGetObjectBufferivATI GLEW_GET_FUN(__glewGetObjectBufferivATI) -#define glGetVariantArrayObjectfvATI GLEW_GET_FUN(__glewGetVariantArrayObjectfvATI) -#define glGetVariantArrayObjectivATI GLEW_GET_FUN(__glewGetVariantArrayObjectivATI) -#define glIsObjectBufferATI GLEW_GET_FUN(__glewIsObjectBufferATI) -#define glNewObjectBufferATI GLEW_GET_FUN(__glewNewObjectBufferATI) -#define glUpdateObjectBufferATI GLEW_GET_FUN(__glewUpdateObjectBufferATI) -#define glVariantArrayObjectATI GLEW_GET_FUN(__glewVariantArrayObjectATI) - -#define GLEW_ATI_vertex_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_array_object) - -#endif /* GL_ATI_vertex_array_object */ - -/* ------------------- GL_ATI_vertex_attrib_array_object ------------------- */ - -#ifndef GL_ATI_vertex_attrib_array_object -#define GL_ATI_vertex_attrib_array_object 1 - -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); - -#define glGetVertexAttribArrayObjectfvATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectfvATI) -#define glGetVertexAttribArrayObjectivATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectivATI) -#define glVertexAttribArrayObjectATI GLEW_GET_FUN(__glewVertexAttribArrayObjectATI) - -#define GLEW_ATI_vertex_attrib_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_attrib_array_object) - -#endif /* GL_ATI_vertex_attrib_array_object */ - -/* ------------------------- GL_ATI_vertex_streams ------------------------- */ - -#ifndef GL_ATI_vertex_streams -#define GL_ATI_vertex_streams 1 - -#define GL_MAX_VERTEX_STREAMS_ATI 0x876B -#define GL_VERTEX_SOURCE_ATI 0x876C -#define GL_VERTEX_STREAM0_ATI 0x876D -#define GL_VERTEX_STREAM1_ATI 0x876E -#define GL_VERTEX_STREAM2_ATI 0x876F -#define GL_VERTEX_STREAM3_ATI 0x8770 -#define GL_VERTEX_STREAM4_ATI 0x8771 -#define GL_VERTEX_STREAM5_ATI 0x8772 -#define GL_VERTEX_STREAM6_ATI 0x8773 -#define GL_VERTEX_STREAM7_ATI 0x8774 - -typedef void (GLAPIENTRY * PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte x, GLbyte y, GLbyte z); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); - -#define glClientActiveVertexStreamATI GLEW_GET_FUN(__glewClientActiveVertexStreamATI) -#define glNormalStream3bATI GLEW_GET_FUN(__glewNormalStream3bATI) -#define glNormalStream3bvATI GLEW_GET_FUN(__glewNormalStream3bvATI) -#define glNormalStream3dATI GLEW_GET_FUN(__glewNormalStream3dATI) -#define glNormalStream3dvATI GLEW_GET_FUN(__glewNormalStream3dvATI) -#define glNormalStream3fATI GLEW_GET_FUN(__glewNormalStream3fATI) -#define glNormalStream3fvATI GLEW_GET_FUN(__glewNormalStream3fvATI) -#define glNormalStream3iATI GLEW_GET_FUN(__glewNormalStream3iATI) -#define glNormalStream3ivATI GLEW_GET_FUN(__glewNormalStream3ivATI) -#define glNormalStream3sATI GLEW_GET_FUN(__glewNormalStream3sATI) -#define glNormalStream3svATI GLEW_GET_FUN(__glewNormalStream3svATI) -#define glVertexBlendEnvfATI GLEW_GET_FUN(__glewVertexBlendEnvfATI) -#define glVertexBlendEnviATI GLEW_GET_FUN(__glewVertexBlendEnviATI) -#define glVertexStream1dATI GLEW_GET_FUN(__glewVertexStream1dATI) -#define glVertexStream1dvATI GLEW_GET_FUN(__glewVertexStream1dvATI) -#define glVertexStream1fATI GLEW_GET_FUN(__glewVertexStream1fATI) -#define glVertexStream1fvATI GLEW_GET_FUN(__glewVertexStream1fvATI) -#define glVertexStream1iATI GLEW_GET_FUN(__glewVertexStream1iATI) -#define glVertexStream1ivATI GLEW_GET_FUN(__glewVertexStream1ivATI) -#define glVertexStream1sATI GLEW_GET_FUN(__glewVertexStream1sATI) -#define glVertexStream1svATI GLEW_GET_FUN(__glewVertexStream1svATI) -#define glVertexStream2dATI GLEW_GET_FUN(__glewVertexStream2dATI) -#define glVertexStream2dvATI GLEW_GET_FUN(__glewVertexStream2dvATI) -#define glVertexStream2fATI GLEW_GET_FUN(__glewVertexStream2fATI) -#define glVertexStream2fvATI GLEW_GET_FUN(__glewVertexStream2fvATI) -#define glVertexStream2iATI GLEW_GET_FUN(__glewVertexStream2iATI) -#define glVertexStream2ivATI GLEW_GET_FUN(__glewVertexStream2ivATI) -#define glVertexStream2sATI GLEW_GET_FUN(__glewVertexStream2sATI) -#define glVertexStream2svATI GLEW_GET_FUN(__glewVertexStream2svATI) -#define glVertexStream3dATI GLEW_GET_FUN(__glewVertexStream3dATI) -#define glVertexStream3dvATI GLEW_GET_FUN(__glewVertexStream3dvATI) -#define glVertexStream3fATI GLEW_GET_FUN(__glewVertexStream3fATI) -#define glVertexStream3fvATI GLEW_GET_FUN(__glewVertexStream3fvATI) -#define glVertexStream3iATI GLEW_GET_FUN(__glewVertexStream3iATI) -#define glVertexStream3ivATI GLEW_GET_FUN(__glewVertexStream3ivATI) -#define glVertexStream3sATI GLEW_GET_FUN(__glewVertexStream3sATI) -#define glVertexStream3svATI GLEW_GET_FUN(__glewVertexStream3svATI) -#define glVertexStream4dATI GLEW_GET_FUN(__glewVertexStream4dATI) -#define glVertexStream4dvATI GLEW_GET_FUN(__glewVertexStream4dvATI) -#define glVertexStream4fATI GLEW_GET_FUN(__glewVertexStream4fATI) -#define glVertexStream4fvATI GLEW_GET_FUN(__glewVertexStream4fvATI) -#define glVertexStream4iATI GLEW_GET_FUN(__glewVertexStream4iATI) -#define glVertexStream4ivATI GLEW_GET_FUN(__glewVertexStream4ivATI) -#define glVertexStream4sATI GLEW_GET_FUN(__glewVertexStream4sATI) -#define glVertexStream4svATI GLEW_GET_FUN(__glewVertexStream4svATI) - -#define GLEW_ATI_vertex_streams GLEW_GET_VAR(__GLEW_ATI_vertex_streams) - -#endif /* GL_ATI_vertex_streams */ - -/* -------------------- GL_EGL_KHR_context_flush_control ------------------- */ - -#ifndef GL_EGL_KHR_context_flush_control -#define GL_EGL_KHR_context_flush_control 1 - -#define GLEW_EGL_KHR_context_flush_control GLEW_GET_VAR(__GLEW_EGL_KHR_context_flush_control) - -#endif /* GL_EGL_KHR_context_flush_control */ - -/* ---------------- GL_EGL_NV_robustness_video_memory_purge ---------------- */ - -#ifndef GL_EGL_NV_robustness_video_memory_purge -#define GL_EGL_NV_robustness_video_memory_purge 1 - -#define GL_EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x334C -#define GL_PURGED_CONTEXT_RESET_NV 0x92BB - -#define GLEW_EGL_NV_robustness_video_memory_purge GLEW_GET_VAR(__GLEW_EGL_NV_robustness_video_memory_purge) - -#endif /* GL_EGL_NV_robustness_video_memory_purge */ - -/* --------------------------- GL_EXT_422_pixels --------------------------- */ - -#ifndef GL_EXT_422_pixels -#define GL_EXT_422_pixels 1 - -#define GL_422_EXT 0x80CC -#define GL_422_REV_EXT 0x80CD -#define GL_422_AVERAGE_EXT 0x80CE -#define GL_422_REV_AVERAGE_EXT 0x80CF - -#define GLEW_EXT_422_pixels GLEW_GET_VAR(__GLEW_EXT_422_pixels) - -#endif /* GL_EXT_422_pixels */ - -/* ---------------------------- GL_EXT_Cg_shader --------------------------- */ - -#ifndef GL_EXT_Cg_shader -#define GL_EXT_Cg_shader 1 - -#define GL_CG_VERTEX_SHADER_EXT 0x890E -#define GL_CG_FRAGMENT_SHADER_EXT 0x890F - -#define GLEW_EXT_Cg_shader GLEW_GET_VAR(__GLEW_EXT_Cg_shader) - -#endif /* GL_EXT_Cg_shader */ - -/* ------------------------- GL_EXT_EGL_image_array ------------------------ */ - -#ifndef GL_EXT_EGL_image_array -#define GL_EXT_EGL_image_array 1 - -#define GLEW_EXT_EGL_image_array GLEW_GET_VAR(__GLEW_EXT_EGL_image_array) - -#endif /* GL_EXT_EGL_image_array */ - -/* --------------------------- GL_EXT_YUV_target --------------------------- */ - -#ifndef GL_EXT_YUV_target -#define GL_EXT_YUV_target 1 - -#define GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT 0x8BE7 - -#define GLEW_EXT_YUV_target GLEW_GET_VAR(__GLEW_EXT_YUV_target) - -#endif /* GL_EXT_YUV_target */ - -/* ------------------------------ GL_EXT_abgr ------------------------------ */ - -#ifndef GL_EXT_abgr -#define GL_EXT_abgr 1 - -#define GL_ABGR_EXT 0x8000 - -#define GLEW_EXT_abgr GLEW_GET_VAR(__GLEW_EXT_abgr) - -#endif /* GL_EXT_abgr */ - -/* -------------------------- GL_EXT_base_instance ------------------------- */ - -#ifndef GL_EXT_base_instance -#define GL_EXT_base_instance 1 - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); - -#define glDrawArraysInstancedBaseInstanceEXT GLEW_GET_FUN(__glewDrawArraysInstancedBaseInstanceEXT) -#define glDrawElementsInstancedBaseInstanceEXT GLEW_GET_FUN(__glewDrawElementsInstancedBaseInstanceEXT) -#define glDrawElementsInstancedBaseVertexBaseInstanceEXT GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexBaseInstanceEXT) - -#define GLEW_EXT_base_instance GLEW_GET_VAR(__GLEW_EXT_base_instance) - -#endif /* GL_EXT_base_instance */ - -/* ------------------------------ GL_EXT_bgra ------------------------------ */ - -#ifndef GL_EXT_bgra -#define GL_EXT_bgra 1 - -#define GL_BGR_EXT 0x80E0 -#define GL_BGRA_EXT 0x80E1 - -#define GLEW_EXT_bgra GLEW_GET_VAR(__GLEW_EXT_bgra) - -#endif /* GL_EXT_bgra */ - -/* ------------------------ GL_EXT_bindable_uniform ------------------------ */ - -#ifndef GL_EXT_bindable_uniform -#define GL_EXT_bindable_uniform 1 - -#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 -#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 -#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 -#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED -#define GL_UNIFORM_BUFFER_EXT 0x8DEE -#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF - -typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); -typedef GLintptr (GLAPIENTRY * PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); -typedef void (GLAPIENTRY * PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); - -#define glGetUniformBufferSizeEXT GLEW_GET_FUN(__glewGetUniformBufferSizeEXT) -#define glGetUniformOffsetEXT GLEW_GET_FUN(__glewGetUniformOffsetEXT) -#define glUniformBufferEXT GLEW_GET_FUN(__glewUniformBufferEXT) - -#define GLEW_EXT_bindable_uniform GLEW_GET_VAR(__GLEW_EXT_bindable_uniform) - -#endif /* GL_EXT_bindable_uniform */ - -/* --------------------------- GL_EXT_blend_color -------------------------- */ - -#ifndef GL_EXT_blend_color -#define GL_EXT_blend_color 1 - -#define GL_CONSTANT_COLOR_EXT 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 -#define GL_CONSTANT_ALPHA_EXT 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 -#define GL_BLEND_COLOR_EXT 0x8005 - -typedef void (GLAPIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); - -#define glBlendColorEXT GLEW_GET_FUN(__glewBlendColorEXT) - -#define GLEW_EXT_blend_color GLEW_GET_VAR(__GLEW_EXT_blend_color) - -#endif /* GL_EXT_blend_color */ - -/* --------------------- GL_EXT_blend_equation_separate -------------------- */ - -#ifndef GL_EXT_blend_equation_separate -#define GL_EXT_blend_equation_separate 1 - -#define GL_BLEND_EQUATION_RGB_EXT 0x8009 -#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); - -#define glBlendEquationSeparateEXT GLEW_GET_FUN(__glewBlendEquationSeparateEXT) - -#define GLEW_EXT_blend_equation_separate GLEW_GET_VAR(__GLEW_EXT_blend_equation_separate) - -#endif /* GL_EXT_blend_equation_separate */ - -/* ----------------------- GL_EXT_blend_func_extended ---------------------- */ - -#ifndef GL_EXT_blend_func_extended -#define GL_EXT_blend_func_extended 1 - -#define GL_SRC_ALPHA_SATURATE_EXT 0x0308 -#define GL_SRC1_ALPHA_EXT 0x8589 -#define GL_SRC1_COLOR_EXT 0x88F9 -#define GL_ONE_MINUS_SRC1_COLOR_EXT 0x88FA -#define GL_ONE_MINUS_SRC1_ALPHA_EXT 0x88FB -#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT 0x88FC -#define GL_LOCATION_INDEX_EXT 0x930F - -typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); -typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXEXTPROC) (GLuint program, const GLchar * name); -typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC) (GLuint program, GLenum programInterface, const GLchar* name); - -#define glBindFragDataLocationIndexedEXT GLEW_GET_FUN(__glewBindFragDataLocationIndexedEXT) -#define glGetFragDataIndexEXT GLEW_GET_FUN(__glewGetFragDataIndexEXT) -#define glGetProgramResourceLocationIndexEXT GLEW_GET_FUN(__glewGetProgramResourceLocationIndexEXT) - -#define GLEW_EXT_blend_func_extended GLEW_GET_VAR(__GLEW_EXT_blend_func_extended) - -#endif /* GL_EXT_blend_func_extended */ - -/* ----------------------- GL_EXT_blend_func_separate ---------------------- */ - -#ifndef GL_EXT_blend_func_separate -#define GL_EXT_blend_func_separate 1 - -#define GL_BLEND_DST_RGB_EXT 0x80C8 -#define GL_BLEND_SRC_RGB_EXT 0x80C9 -#define GL_BLEND_DST_ALPHA_EXT 0x80CA -#define GL_BLEND_SRC_ALPHA_EXT 0x80CB - -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); - -#define glBlendFuncSeparateEXT GLEW_GET_FUN(__glewBlendFuncSeparateEXT) - -#define GLEW_EXT_blend_func_separate GLEW_GET_VAR(__GLEW_EXT_blend_func_separate) - -#endif /* GL_EXT_blend_func_separate */ - -/* ------------------------- GL_EXT_blend_logic_op ------------------------- */ - -#ifndef GL_EXT_blend_logic_op -#define GL_EXT_blend_logic_op 1 - -#define GLEW_EXT_blend_logic_op GLEW_GET_VAR(__GLEW_EXT_blend_logic_op) - -#endif /* GL_EXT_blend_logic_op */ - -/* -------------------------- GL_EXT_blend_minmax -------------------------- */ - -#ifndef GL_EXT_blend_minmax -#define GL_EXT_blend_minmax 1 - -#define GL_FUNC_ADD_EXT 0x8006 -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#define GL_BLEND_EQUATION_EXT 0x8009 - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); - -#define glBlendEquationEXT GLEW_GET_FUN(__glewBlendEquationEXT) - -#define GLEW_EXT_blend_minmax GLEW_GET_VAR(__GLEW_EXT_blend_minmax) - -#endif /* GL_EXT_blend_minmax */ - -/* ------------------------- GL_EXT_blend_subtract ------------------------- */ - -#ifndef GL_EXT_blend_subtract -#define GL_EXT_blend_subtract 1 - -#define GL_FUNC_SUBTRACT_EXT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B - -#define GLEW_EXT_blend_subtract GLEW_GET_VAR(__GLEW_EXT_blend_subtract) - -#endif /* GL_EXT_blend_subtract */ - -/* ------------------------- GL_EXT_buffer_storage ------------------------- */ - -#ifndef GL_EXT_buffer_storage -#define GL_EXT_buffer_storage 1 - -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAP_PERSISTENT_BIT_EXT 0x0040 -#define GL_MAP_COHERENT_BIT_EXT 0x0080 -#define GL_DYNAMIC_STORAGE_BIT_EXT 0x0100 -#define GL_CLIENT_STORAGE_BIT_EXT 0x0200 -#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT 0x00004000 -#define GL_BUFFER_IMMUTABLE_STORAGE_EXT 0x821F -#define GL_BUFFER_STORAGE_FLAGS_EXT 0x8220 - -typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEEXTPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); - -#define glBufferStorageEXT GLEW_GET_FUN(__glewBufferStorageEXT) -#define glNamedBufferStorageEXT GLEW_GET_FUN(__glewNamedBufferStorageEXT) - -#define GLEW_EXT_buffer_storage GLEW_GET_VAR(__GLEW_EXT_buffer_storage) - -#endif /* GL_EXT_buffer_storage */ - -/* -------------------------- GL_EXT_clear_texture ------------------------- */ - -#ifndef GL_EXT_clear_texture -#define GL_EXT_clear_texture 1 - -typedef void (GLAPIENTRY * PFNGLCLEARTEXIMAGEEXTPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCLEARTEXSUBIMAGEEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); - -#define glClearTexImageEXT GLEW_GET_FUN(__glewClearTexImageEXT) -#define glClearTexSubImageEXT GLEW_GET_FUN(__glewClearTexSubImageEXT) - -#define GLEW_EXT_clear_texture GLEW_GET_VAR(__GLEW_EXT_clear_texture) - -#endif /* GL_EXT_clear_texture */ - -/* ----------------------- GL_EXT_clip_cull_distance ----------------------- */ - -#ifndef GL_EXT_clip_cull_distance -#define GL_EXT_clip_cull_distance 1 - -#define GL_MAX_CLIP_DISTANCES_EXT 0x0D32 -#define GL_CLIP_DISTANCE0_EXT 0x3000 -#define GL_CLIP_DISTANCE1_EXT 0x3001 -#define GL_CLIP_DISTANCE2_EXT 0x3002 -#define GL_CLIP_DISTANCE3_EXT 0x3003 -#define GL_CLIP_DISTANCE4_EXT 0x3004 -#define GL_CLIP_DISTANCE5_EXT 0x3005 -#define GL_CLIP_DISTANCE6_EXT 0x3006 -#define GL_CLIP_DISTANCE7_EXT 0x3007 -#define GL_MAX_CULL_DISTANCES_EXT 0x82F9 -#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT 0x82FA - -#define GLEW_EXT_clip_cull_distance GLEW_GET_VAR(__GLEW_EXT_clip_cull_distance) - -#endif /* GL_EXT_clip_cull_distance */ - -/* ------------------------ GL_EXT_clip_volume_hint ------------------------ */ - -#ifndef GL_EXT_clip_volume_hint -#define GL_EXT_clip_volume_hint 1 - -#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 - -#define GLEW_EXT_clip_volume_hint GLEW_GET_VAR(__GLEW_EXT_clip_volume_hint) - -#endif /* GL_EXT_clip_volume_hint */ - -/* ------------------------------ GL_EXT_cmyka ----------------------------- */ - -#ifndef GL_EXT_cmyka -#define GL_EXT_cmyka 1 - -#define GL_CMYK_EXT 0x800C -#define GL_CMYKA_EXT 0x800D -#define GL_PACK_CMYK_HINT_EXT 0x800E -#define GL_UNPACK_CMYK_HINT_EXT 0x800F - -#define GLEW_EXT_cmyka GLEW_GET_VAR(__GLEW_EXT_cmyka) - -#endif /* GL_EXT_cmyka */ - -/* ----------------------- GL_EXT_color_buffer_float ----------------------- */ - -#ifndef GL_EXT_color_buffer_float -#define GL_EXT_color_buffer_float 1 - -#define GLEW_EXT_color_buffer_float GLEW_GET_VAR(__GLEW_EXT_color_buffer_float) - -#endif /* GL_EXT_color_buffer_float */ - -/* --------------------- GL_EXT_color_buffer_half_float -------------------- */ - -#ifndef GL_EXT_color_buffer_half_float -#define GL_EXT_color_buffer_half_float 1 - -#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211 -#define GL_R16F_EXT 0x822D -#define GL_RG16F_EXT 0x822F -#define GL_RGBA16F_EXT 0x881A -#define GL_RGB16F_EXT 0x881B -#define GL_UNSIGNED_NORMALIZED_EXT 0x8C17 - -#define GLEW_EXT_color_buffer_half_float GLEW_GET_VAR(__GLEW_EXT_color_buffer_half_float) - -#endif /* GL_EXT_color_buffer_half_float */ - -/* ------------------------- GL_EXT_color_subtable ------------------------- */ - -#ifndef GL_EXT_color_subtable -#define GL_EXT_color_subtable 1 - -typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); - -#define glColorSubTableEXT GLEW_GET_FUN(__glewColorSubTableEXT) -#define glCopyColorSubTableEXT GLEW_GET_FUN(__glewCopyColorSubTableEXT) - -#define GLEW_EXT_color_subtable GLEW_GET_VAR(__GLEW_EXT_color_subtable) - -#endif /* GL_EXT_color_subtable */ - -/* ---------------------- GL_EXT_compiled_vertex_array --------------------- */ - -#ifndef GL_EXT_compiled_vertex_array -#define GL_EXT_compiled_vertex_array 1 - -#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 -#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 - -typedef void (GLAPIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); -typedef void (GLAPIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); - -#define glLockArraysEXT GLEW_GET_FUN(__glewLockArraysEXT) -#define glUnlockArraysEXT GLEW_GET_FUN(__glewUnlockArraysEXT) - -#define GLEW_EXT_compiled_vertex_array GLEW_GET_VAR(__GLEW_EXT_compiled_vertex_array) - -#endif /* GL_EXT_compiled_vertex_array */ - -/* ---------------- GL_EXT_compressed_ETC1_RGB8_sub_texture ---------------- */ - -#ifndef GL_EXT_compressed_ETC1_RGB8_sub_texture -#define GL_EXT_compressed_ETC1_RGB8_sub_texture 1 - -#define GLEW_EXT_compressed_ETC1_RGB8_sub_texture GLEW_GET_VAR(__GLEW_EXT_compressed_ETC1_RGB8_sub_texture) - -#endif /* GL_EXT_compressed_ETC1_RGB8_sub_texture */ - -/* ----------------------- GL_EXT_conservative_depth ----------------------- */ - -#ifndef GL_EXT_conservative_depth -#define GL_EXT_conservative_depth 1 - -#define GLEW_EXT_conservative_depth GLEW_GET_VAR(__GLEW_EXT_conservative_depth) - -#endif /* GL_EXT_conservative_depth */ - -/* --------------------------- GL_EXT_convolution -------------------------- */ - -#ifndef GL_EXT_convolution -#define GL_EXT_convolution 1 - -#define GL_CONVOLUTION_1D_EXT 0x8010 -#define GL_CONVOLUTION_2D_EXT 0x8011 -#define GL_SEPARABLE_2D_EXT 0x8012 -#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 -#define GL_REDUCE_EXT 0x8016 -#define GL_CONVOLUTION_FORMAT_EXT 0x8017 -#define GL_CONVOLUTION_WIDTH_EXT 0x8018 -#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 - -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *image); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); -typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); - -#define glConvolutionFilter1DEXT GLEW_GET_FUN(__glewConvolutionFilter1DEXT) -#define glConvolutionFilter2DEXT GLEW_GET_FUN(__glewConvolutionFilter2DEXT) -#define glConvolutionParameterfEXT GLEW_GET_FUN(__glewConvolutionParameterfEXT) -#define glConvolutionParameterfvEXT GLEW_GET_FUN(__glewConvolutionParameterfvEXT) -#define glConvolutionParameteriEXT GLEW_GET_FUN(__glewConvolutionParameteriEXT) -#define glConvolutionParameterivEXT GLEW_GET_FUN(__glewConvolutionParameterivEXT) -#define glCopyConvolutionFilter1DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter1DEXT) -#define glCopyConvolutionFilter2DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter2DEXT) -#define glGetConvolutionFilterEXT GLEW_GET_FUN(__glewGetConvolutionFilterEXT) -#define glGetConvolutionParameterfvEXT GLEW_GET_FUN(__glewGetConvolutionParameterfvEXT) -#define glGetConvolutionParameterivEXT GLEW_GET_FUN(__glewGetConvolutionParameterivEXT) -#define glGetSeparableFilterEXT GLEW_GET_FUN(__glewGetSeparableFilterEXT) -#define glSeparableFilter2DEXT GLEW_GET_FUN(__glewSeparableFilter2DEXT) - -#define GLEW_EXT_convolution GLEW_GET_VAR(__GLEW_EXT_convolution) - -#endif /* GL_EXT_convolution */ - -/* ------------------------ GL_EXT_coordinate_frame ------------------------ */ - -#ifndef GL_EXT_coordinate_frame -#define GL_EXT_coordinate_frame 1 - -#define GL_TANGENT_ARRAY_EXT 0x8439 -#define GL_BINORMAL_ARRAY_EXT 0x843A -#define GL_CURRENT_TANGENT_EXT 0x843B -#define GL_CURRENT_BINORMAL_EXT 0x843C -#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E -#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F -#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 -#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 -#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 -#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 -#define GL_MAP1_TANGENT_EXT 0x8444 -#define GL_MAP2_TANGENT_EXT 0x8445 -#define GL_MAP1_BINORMAL_EXT 0x8446 -#define GL_MAP2_BINORMAL_EXT 0x8447 - -typedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, void *pointer); -typedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, void *pointer); - -#define glBinormalPointerEXT GLEW_GET_FUN(__glewBinormalPointerEXT) -#define glTangentPointerEXT GLEW_GET_FUN(__glewTangentPointerEXT) - -#define GLEW_EXT_coordinate_frame GLEW_GET_VAR(__GLEW_EXT_coordinate_frame) - -#endif /* GL_EXT_coordinate_frame */ - -/* --------------------------- GL_EXT_copy_image --------------------------- */ - -#ifndef GL_EXT_copy_image -#define GL_EXT_copy_image 1 - -typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATAEXTPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); - -#define glCopyImageSubDataEXT GLEW_GET_FUN(__glewCopyImageSubDataEXT) - -#define GLEW_EXT_copy_image GLEW_GET_VAR(__GLEW_EXT_copy_image) - -#endif /* GL_EXT_copy_image */ - -/* -------------------------- GL_EXT_copy_texture -------------------------- */ - -#ifndef GL_EXT_copy_texture -#define GL_EXT_copy_texture 1 - -typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); - -#define glCopyTexImage1DEXT GLEW_GET_FUN(__glewCopyTexImage1DEXT) -#define glCopyTexImage2DEXT GLEW_GET_FUN(__glewCopyTexImage2DEXT) -#define glCopyTexSubImage1DEXT GLEW_GET_FUN(__glewCopyTexSubImage1DEXT) -#define glCopyTexSubImage2DEXT GLEW_GET_FUN(__glewCopyTexSubImage2DEXT) -#define glCopyTexSubImage3DEXT GLEW_GET_FUN(__glewCopyTexSubImage3DEXT) - -#define GLEW_EXT_copy_texture GLEW_GET_VAR(__GLEW_EXT_copy_texture) - -#endif /* GL_EXT_copy_texture */ - -/* --------------------------- GL_EXT_cull_vertex -------------------------- */ - -#ifndef GL_EXT_cull_vertex -#define GL_EXT_cull_vertex 1 - -#define GL_CULL_VERTEX_EXT 0x81AA -#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB -#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC - -typedef void (GLAPIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params); - -#define glCullParameterdvEXT GLEW_GET_FUN(__glewCullParameterdvEXT) -#define glCullParameterfvEXT GLEW_GET_FUN(__glewCullParameterfvEXT) - -#define GLEW_EXT_cull_vertex GLEW_GET_VAR(__GLEW_EXT_cull_vertex) - -#endif /* GL_EXT_cull_vertex */ - -/* --------------------------- GL_EXT_debug_label -------------------------- */ - -#ifndef GL_EXT_debug_label -#define GL_EXT_debug_label 1 - -#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F -#define GL_PROGRAM_OBJECT_EXT 0x8B40 -#define GL_SHADER_OBJECT_EXT 0x8B48 -#define GL_BUFFER_OBJECT_EXT 0x9151 -#define GL_QUERY_OBJECT_EXT 0x9153 -#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 - -typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei* length, GLchar *label); -typedef void (GLAPIENTRY * PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar* label); - -#define glGetObjectLabelEXT GLEW_GET_FUN(__glewGetObjectLabelEXT) -#define glLabelObjectEXT GLEW_GET_FUN(__glewLabelObjectEXT) - -#define GLEW_EXT_debug_label GLEW_GET_VAR(__GLEW_EXT_debug_label) - -#endif /* GL_EXT_debug_label */ - -/* -------------------------- GL_EXT_debug_marker -------------------------- */ - -#ifndef GL_EXT_debug_marker -#define GL_EXT_debug_marker 1 - -typedef void (GLAPIENTRY * PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar* marker); -typedef void (GLAPIENTRY * PFNGLPOPGROUPMARKEREXTPROC) (void); -typedef void (GLAPIENTRY * PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar* marker); - -#define glInsertEventMarkerEXT GLEW_GET_FUN(__glewInsertEventMarkerEXT) -#define glPopGroupMarkerEXT GLEW_GET_FUN(__glewPopGroupMarkerEXT) -#define glPushGroupMarkerEXT GLEW_GET_FUN(__glewPushGroupMarkerEXT) - -#define GLEW_EXT_debug_marker GLEW_GET_VAR(__GLEW_EXT_debug_marker) - -#endif /* GL_EXT_debug_marker */ - -/* ------------------------ GL_EXT_depth_bounds_test ----------------------- */ - -#ifndef GL_EXT_depth_bounds_test -#define GL_EXT_depth_bounds_test 1 - -#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 -#define GL_DEPTH_BOUNDS_EXT 0x8891 - -typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); - -#define glDepthBoundsEXT GLEW_GET_FUN(__glewDepthBoundsEXT) - -#define GLEW_EXT_depth_bounds_test GLEW_GET_VAR(__GLEW_EXT_depth_bounds_test) - -#endif /* GL_EXT_depth_bounds_test */ - -/* ----------------------- GL_EXT_direct_state_access ---------------------- */ - -#ifndef GL_EXT_direct_state_access -#define GL_EXT_direct_state_access 1 - -#define GL_PROGRAM_MATRIX_EXT 0x8E2D -#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E -#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F - -typedef void (GLAPIENTRY * PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); -typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); -typedef void (GLAPIENTRY * PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); -typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); -typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); -typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); -typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); -typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); -typedef void (GLAPIENTRY * PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); -typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, void *img); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, void *img); -typedef void (GLAPIENTRY * PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void** params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); -typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void *string); -typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, void** params); -typedef void (GLAPIENTRY * PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void** params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint* param); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void** param); -typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void** param); -typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); -typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (GLAPIENTRY * PFNGLMATRIXFRUSTUMEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); -typedef void (GLAPIENTRY * PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum matrixMode); -typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m); -typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXLOADDEXTPROC) (GLenum matrixMode, const GLdouble* m); -typedef void (GLAPIENTRY * PFNGLMATRIXLOADFEXTPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULTDEXTPROC) (GLenum matrixMode, const GLdouble* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULTFEXTPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXORTHOEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); -typedef void (GLAPIENTRY * PFNGLMATRIXPOPEXTPROC) (GLenum matrixMode); -typedef void (GLAPIENTRY * PFNGLMATRIXPUSHEXTPROC) (GLenum matrixMode); -typedef void (GLAPIENTRY * PFNGLMATRIXROTATEDEXTPROC) (GLenum matrixMode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLMATRIXROTATEFEXTPROC) (GLenum matrixMode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLMATRIXSCALEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLMATRIXSCALEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); -typedef void (GLAPIENTRY * PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* param); -typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* param); -typedef void (GLAPIENTRY * PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); -typedef void (GLAPIENTRY * PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); -typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); -typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat* param); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* param); -typedef void (GLAPIENTRY * PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); - -#define glBindMultiTextureEXT GLEW_GET_FUN(__glewBindMultiTextureEXT) -#define glCheckNamedFramebufferStatusEXT GLEW_GET_FUN(__glewCheckNamedFramebufferStatusEXT) -#define glClientAttribDefaultEXT GLEW_GET_FUN(__glewClientAttribDefaultEXT) -#define glCompressedMultiTexImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage1DEXT) -#define glCompressedMultiTexImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage2DEXT) -#define glCompressedMultiTexImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage3DEXT) -#define glCompressedMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage1DEXT) -#define glCompressedMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage2DEXT) -#define glCompressedMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage3DEXT) -#define glCompressedTextureImage1DEXT GLEW_GET_FUN(__glewCompressedTextureImage1DEXT) -#define glCompressedTextureImage2DEXT GLEW_GET_FUN(__glewCompressedTextureImage2DEXT) -#define glCompressedTextureImage3DEXT GLEW_GET_FUN(__glewCompressedTextureImage3DEXT) -#define glCompressedTextureSubImage1DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage1DEXT) -#define glCompressedTextureSubImage2DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage2DEXT) -#define glCompressedTextureSubImage3DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage3DEXT) -#define glCopyMultiTexImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexImage1DEXT) -#define glCopyMultiTexImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexImage2DEXT) -#define glCopyMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage1DEXT) -#define glCopyMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage2DEXT) -#define glCopyMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage3DEXT) -#define glCopyTextureImage1DEXT GLEW_GET_FUN(__glewCopyTextureImage1DEXT) -#define glCopyTextureImage2DEXT GLEW_GET_FUN(__glewCopyTextureImage2DEXT) -#define glCopyTextureSubImage1DEXT GLEW_GET_FUN(__glewCopyTextureSubImage1DEXT) -#define glCopyTextureSubImage2DEXT GLEW_GET_FUN(__glewCopyTextureSubImage2DEXT) -#define glCopyTextureSubImage3DEXT GLEW_GET_FUN(__glewCopyTextureSubImage3DEXT) -#define glDisableClientStateIndexedEXT GLEW_GET_FUN(__glewDisableClientStateIndexedEXT) -#define glDisableClientStateiEXT GLEW_GET_FUN(__glewDisableClientStateiEXT) -#define glDisableVertexArrayAttribEXT GLEW_GET_FUN(__glewDisableVertexArrayAttribEXT) -#define glDisableVertexArrayEXT GLEW_GET_FUN(__glewDisableVertexArrayEXT) -#define glEnableClientStateIndexedEXT GLEW_GET_FUN(__glewEnableClientStateIndexedEXT) -#define glEnableClientStateiEXT GLEW_GET_FUN(__glewEnableClientStateiEXT) -#define glEnableVertexArrayAttribEXT GLEW_GET_FUN(__glewEnableVertexArrayAttribEXT) -#define glEnableVertexArrayEXT GLEW_GET_FUN(__glewEnableVertexArrayEXT) -#define glFlushMappedNamedBufferRangeEXT GLEW_GET_FUN(__glewFlushMappedNamedBufferRangeEXT) -#define glFramebufferDrawBufferEXT GLEW_GET_FUN(__glewFramebufferDrawBufferEXT) -#define glFramebufferDrawBuffersEXT GLEW_GET_FUN(__glewFramebufferDrawBuffersEXT) -#define glFramebufferReadBufferEXT GLEW_GET_FUN(__glewFramebufferReadBufferEXT) -#define glGenerateMultiTexMipmapEXT GLEW_GET_FUN(__glewGenerateMultiTexMipmapEXT) -#define glGenerateTextureMipmapEXT GLEW_GET_FUN(__glewGenerateTextureMipmapEXT) -#define glGetCompressedMultiTexImageEXT GLEW_GET_FUN(__glewGetCompressedMultiTexImageEXT) -#define glGetCompressedTextureImageEXT GLEW_GET_FUN(__glewGetCompressedTextureImageEXT) -#define glGetDoubleIndexedvEXT GLEW_GET_FUN(__glewGetDoubleIndexedvEXT) -#define glGetDoublei_vEXT GLEW_GET_FUN(__glewGetDoublei_vEXT) -#define glGetFloatIndexedvEXT GLEW_GET_FUN(__glewGetFloatIndexedvEXT) -#define glGetFloati_vEXT GLEW_GET_FUN(__glewGetFloati_vEXT) -#define glGetFramebufferParameterivEXT GLEW_GET_FUN(__glewGetFramebufferParameterivEXT) -#define glGetMultiTexEnvfvEXT GLEW_GET_FUN(__glewGetMultiTexEnvfvEXT) -#define glGetMultiTexEnvivEXT GLEW_GET_FUN(__glewGetMultiTexEnvivEXT) -#define glGetMultiTexGendvEXT GLEW_GET_FUN(__glewGetMultiTexGendvEXT) -#define glGetMultiTexGenfvEXT GLEW_GET_FUN(__glewGetMultiTexGenfvEXT) -#define glGetMultiTexGenivEXT GLEW_GET_FUN(__glewGetMultiTexGenivEXT) -#define glGetMultiTexImageEXT GLEW_GET_FUN(__glewGetMultiTexImageEXT) -#define glGetMultiTexLevelParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterfvEXT) -#define glGetMultiTexLevelParameterivEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterivEXT) -#define glGetMultiTexParameterIivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIivEXT) -#define glGetMultiTexParameterIuivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIuivEXT) -#define glGetMultiTexParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexParameterfvEXT) -#define glGetMultiTexParameterivEXT GLEW_GET_FUN(__glewGetMultiTexParameterivEXT) -#define glGetNamedBufferParameterivEXT GLEW_GET_FUN(__glewGetNamedBufferParameterivEXT) -#define glGetNamedBufferPointervEXT GLEW_GET_FUN(__glewGetNamedBufferPointervEXT) -#define glGetNamedBufferSubDataEXT GLEW_GET_FUN(__glewGetNamedBufferSubDataEXT) -#define glGetNamedFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameterivEXT) -#define glGetNamedProgramLocalParameterIivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIivEXT) -#define glGetNamedProgramLocalParameterIuivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIuivEXT) -#define glGetNamedProgramLocalParameterdvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterdvEXT) -#define glGetNamedProgramLocalParameterfvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterfvEXT) -#define glGetNamedProgramStringEXT GLEW_GET_FUN(__glewGetNamedProgramStringEXT) -#define glGetNamedProgramivEXT GLEW_GET_FUN(__glewGetNamedProgramivEXT) -#define glGetNamedRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetNamedRenderbufferParameterivEXT) -#define glGetPointerIndexedvEXT GLEW_GET_FUN(__glewGetPointerIndexedvEXT) -#define glGetPointeri_vEXT GLEW_GET_FUN(__glewGetPointeri_vEXT) -#define glGetTextureImageEXT GLEW_GET_FUN(__glewGetTextureImageEXT) -#define glGetTextureLevelParameterfvEXT GLEW_GET_FUN(__glewGetTextureLevelParameterfvEXT) -#define glGetTextureLevelParameterivEXT GLEW_GET_FUN(__glewGetTextureLevelParameterivEXT) -#define glGetTextureParameterIivEXT GLEW_GET_FUN(__glewGetTextureParameterIivEXT) -#define glGetTextureParameterIuivEXT GLEW_GET_FUN(__glewGetTextureParameterIuivEXT) -#define glGetTextureParameterfvEXT GLEW_GET_FUN(__glewGetTextureParameterfvEXT) -#define glGetTextureParameterivEXT GLEW_GET_FUN(__glewGetTextureParameterivEXT) -#define glGetVertexArrayIntegeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayIntegeri_vEXT) -#define glGetVertexArrayIntegervEXT GLEW_GET_FUN(__glewGetVertexArrayIntegervEXT) -#define glGetVertexArrayPointeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayPointeri_vEXT) -#define glGetVertexArrayPointervEXT GLEW_GET_FUN(__glewGetVertexArrayPointervEXT) -#define glMapNamedBufferEXT GLEW_GET_FUN(__glewMapNamedBufferEXT) -#define glMapNamedBufferRangeEXT GLEW_GET_FUN(__glewMapNamedBufferRangeEXT) -#define glMatrixFrustumEXT GLEW_GET_FUN(__glewMatrixFrustumEXT) -#define glMatrixLoadIdentityEXT GLEW_GET_FUN(__glewMatrixLoadIdentityEXT) -#define glMatrixLoadTransposedEXT GLEW_GET_FUN(__glewMatrixLoadTransposedEXT) -#define glMatrixLoadTransposefEXT GLEW_GET_FUN(__glewMatrixLoadTransposefEXT) -#define glMatrixLoaddEXT GLEW_GET_FUN(__glewMatrixLoaddEXT) -#define glMatrixLoadfEXT GLEW_GET_FUN(__glewMatrixLoadfEXT) -#define glMatrixMultTransposedEXT GLEW_GET_FUN(__glewMatrixMultTransposedEXT) -#define glMatrixMultTransposefEXT GLEW_GET_FUN(__glewMatrixMultTransposefEXT) -#define glMatrixMultdEXT GLEW_GET_FUN(__glewMatrixMultdEXT) -#define glMatrixMultfEXT GLEW_GET_FUN(__glewMatrixMultfEXT) -#define glMatrixOrthoEXT GLEW_GET_FUN(__glewMatrixOrthoEXT) -#define glMatrixPopEXT GLEW_GET_FUN(__glewMatrixPopEXT) -#define glMatrixPushEXT GLEW_GET_FUN(__glewMatrixPushEXT) -#define glMatrixRotatedEXT GLEW_GET_FUN(__glewMatrixRotatedEXT) -#define glMatrixRotatefEXT GLEW_GET_FUN(__glewMatrixRotatefEXT) -#define glMatrixScaledEXT GLEW_GET_FUN(__glewMatrixScaledEXT) -#define glMatrixScalefEXT GLEW_GET_FUN(__glewMatrixScalefEXT) -#define glMatrixTranslatedEXT GLEW_GET_FUN(__glewMatrixTranslatedEXT) -#define glMatrixTranslatefEXT GLEW_GET_FUN(__glewMatrixTranslatefEXT) -#define glMultiTexBufferEXT GLEW_GET_FUN(__glewMultiTexBufferEXT) -#define glMultiTexCoordPointerEXT GLEW_GET_FUN(__glewMultiTexCoordPointerEXT) -#define glMultiTexEnvfEXT GLEW_GET_FUN(__glewMultiTexEnvfEXT) -#define glMultiTexEnvfvEXT GLEW_GET_FUN(__glewMultiTexEnvfvEXT) -#define glMultiTexEnviEXT GLEW_GET_FUN(__glewMultiTexEnviEXT) -#define glMultiTexEnvivEXT GLEW_GET_FUN(__glewMultiTexEnvivEXT) -#define glMultiTexGendEXT GLEW_GET_FUN(__glewMultiTexGendEXT) -#define glMultiTexGendvEXT GLEW_GET_FUN(__glewMultiTexGendvEXT) -#define glMultiTexGenfEXT GLEW_GET_FUN(__glewMultiTexGenfEXT) -#define glMultiTexGenfvEXT GLEW_GET_FUN(__glewMultiTexGenfvEXT) -#define glMultiTexGeniEXT GLEW_GET_FUN(__glewMultiTexGeniEXT) -#define glMultiTexGenivEXT GLEW_GET_FUN(__glewMultiTexGenivEXT) -#define glMultiTexImage1DEXT GLEW_GET_FUN(__glewMultiTexImage1DEXT) -#define glMultiTexImage2DEXT GLEW_GET_FUN(__glewMultiTexImage2DEXT) -#define glMultiTexImage3DEXT GLEW_GET_FUN(__glewMultiTexImage3DEXT) -#define glMultiTexParameterIivEXT GLEW_GET_FUN(__glewMultiTexParameterIivEXT) -#define glMultiTexParameterIuivEXT GLEW_GET_FUN(__glewMultiTexParameterIuivEXT) -#define glMultiTexParameterfEXT GLEW_GET_FUN(__glewMultiTexParameterfEXT) -#define glMultiTexParameterfvEXT GLEW_GET_FUN(__glewMultiTexParameterfvEXT) -#define glMultiTexParameteriEXT GLEW_GET_FUN(__glewMultiTexParameteriEXT) -#define glMultiTexParameterivEXT GLEW_GET_FUN(__glewMultiTexParameterivEXT) -#define glMultiTexRenderbufferEXT GLEW_GET_FUN(__glewMultiTexRenderbufferEXT) -#define glMultiTexSubImage1DEXT GLEW_GET_FUN(__glewMultiTexSubImage1DEXT) -#define glMultiTexSubImage2DEXT GLEW_GET_FUN(__glewMultiTexSubImage2DEXT) -#define glMultiTexSubImage3DEXT GLEW_GET_FUN(__glewMultiTexSubImage3DEXT) -#define glNamedBufferDataEXT GLEW_GET_FUN(__glewNamedBufferDataEXT) -#define glNamedBufferSubDataEXT GLEW_GET_FUN(__glewNamedBufferSubDataEXT) -#define glNamedCopyBufferSubDataEXT GLEW_GET_FUN(__glewNamedCopyBufferSubDataEXT) -#define glNamedFramebufferRenderbufferEXT GLEW_GET_FUN(__glewNamedFramebufferRenderbufferEXT) -#define glNamedFramebufferTexture1DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture1DEXT) -#define glNamedFramebufferTexture2DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture2DEXT) -#define glNamedFramebufferTexture3DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture3DEXT) -#define glNamedFramebufferTextureEXT GLEW_GET_FUN(__glewNamedFramebufferTextureEXT) -#define glNamedFramebufferTextureFaceEXT GLEW_GET_FUN(__glewNamedFramebufferTextureFaceEXT) -#define glNamedFramebufferTextureLayerEXT GLEW_GET_FUN(__glewNamedFramebufferTextureLayerEXT) -#define glNamedProgramLocalParameter4dEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dEXT) -#define glNamedProgramLocalParameter4dvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dvEXT) -#define glNamedProgramLocalParameter4fEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fEXT) -#define glNamedProgramLocalParameter4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fvEXT) -#define glNamedProgramLocalParameterI4iEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4iEXT) -#define glNamedProgramLocalParameterI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4ivEXT) -#define glNamedProgramLocalParameterI4uiEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uiEXT) -#define glNamedProgramLocalParameterI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uivEXT) -#define glNamedProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameters4fvEXT) -#define glNamedProgramLocalParametersI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4ivEXT) -#define glNamedProgramLocalParametersI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4uivEXT) -#define glNamedProgramStringEXT GLEW_GET_FUN(__glewNamedProgramStringEXT) -#define glNamedRenderbufferStorageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageEXT) -#define glNamedRenderbufferStorageMultisampleCoverageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleCoverageEXT) -#define glNamedRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleEXT) -#define glProgramUniform1fEXT GLEW_GET_FUN(__glewProgramUniform1fEXT) -#define glProgramUniform1fvEXT GLEW_GET_FUN(__glewProgramUniform1fvEXT) -#define glProgramUniform1iEXT GLEW_GET_FUN(__glewProgramUniform1iEXT) -#define glProgramUniform1ivEXT GLEW_GET_FUN(__glewProgramUniform1ivEXT) -#define glProgramUniform1uiEXT GLEW_GET_FUN(__glewProgramUniform1uiEXT) -#define glProgramUniform1uivEXT GLEW_GET_FUN(__glewProgramUniform1uivEXT) -#define glProgramUniform2fEXT GLEW_GET_FUN(__glewProgramUniform2fEXT) -#define glProgramUniform2fvEXT GLEW_GET_FUN(__glewProgramUniform2fvEXT) -#define glProgramUniform2iEXT GLEW_GET_FUN(__glewProgramUniform2iEXT) -#define glProgramUniform2ivEXT GLEW_GET_FUN(__glewProgramUniform2ivEXT) -#define glProgramUniform2uiEXT GLEW_GET_FUN(__glewProgramUniform2uiEXT) -#define glProgramUniform2uivEXT GLEW_GET_FUN(__glewProgramUniform2uivEXT) -#define glProgramUniform3fEXT GLEW_GET_FUN(__glewProgramUniform3fEXT) -#define glProgramUniform3fvEXT GLEW_GET_FUN(__glewProgramUniform3fvEXT) -#define glProgramUniform3iEXT GLEW_GET_FUN(__glewProgramUniform3iEXT) -#define glProgramUniform3ivEXT GLEW_GET_FUN(__glewProgramUniform3ivEXT) -#define glProgramUniform3uiEXT GLEW_GET_FUN(__glewProgramUniform3uiEXT) -#define glProgramUniform3uivEXT GLEW_GET_FUN(__glewProgramUniform3uivEXT) -#define glProgramUniform4fEXT GLEW_GET_FUN(__glewProgramUniform4fEXT) -#define glProgramUniform4fvEXT GLEW_GET_FUN(__glewProgramUniform4fvEXT) -#define glProgramUniform4iEXT GLEW_GET_FUN(__glewProgramUniform4iEXT) -#define glProgramUniform4ivEXT GLEW_GET_FUN(__glewProgramUniform4ivEXT) -#define glProgramUniform4uiEXT GLEW_GET_FUN(__glewProgramUniform4uiEXT) -#define glProgramUniform4uivEXT GLEW_GET_FUN(__glewProgramUniform4uivEXT) -#define glProgramUniformMatrix2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2fvEXT) -#define glProgramUniformMatrix2x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3fvEXT) -#define glProgramUniformMatrix2x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4fvEXT) -#define glProgramUniformMatrix3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3fvEXT) -#define glProgramUniformMatrix3x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2fvEXT) -#define glProgramUniformMatrix3x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4fvEXT) -#define glProgramUniformMatrix4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4fvEXT) -#define glProgramUniformMatrix4x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2fvEXT) -#define glProgramUniformMatrix4x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3fvEXT) -#define glPushClientAttribDefaultEXT GLEW_GET_FUN(__glewPushClientAttribDefaultEXT) -#define glTextureBufferEXT GLEW_GET_FUN(__glewTextureBufferEXT) -#define glTextureImage1DEXT GLEW_GET_FUN(__glewTextureImage1DEXT) -#define glTextureImage2DEXT GLEW_GET_FUN(__glewTextureImage2DEXT) -#define glTextureImage3DEXT GLEW_GET_FUN(__glewTextureImage3DEXT) -#define glTextureParameterIivEXT GLEW_GET_FUN(__glewTextureParameterIivEXT) -#define glTextureParameterIuivEXT GLEW_GET_FUN(__glewTextureParameterIuivEXT) -#define glTextureParameterfEXT GLEW_GET_FUN(__glewTextureParameterfEXT) -#define glTextureParameterfvEXT GLEW_GET_FUN(__glewTextureParameterfvEXT) -#define glTextureParameteriEXT GLEW_GET_FUN(__glewTextureParameteriEXT) -#define glTextureParameterivEXT GLEW_GET_FUN(__glewTextureParameterivEXT) -#define glTextureRenderbufferEXT GLEW_GET_FUN(__glewTextureRenderbufferEXT) -#define glTextureSubImage1DEXT GLEW_GET_FUN(__glewTextureSubImage1DEXT) -#define glTextureSubImage2DEXT GLEW_GET_FUN(__glewTextureSubImage2DEXT) -#define glTextureSubImage3DEXT GLEW_GET_FUN(__glewTextureSubImage3DEXT) -#define glUnmapNamedBufferEXT GLEW_GET_FUN(__glewUnmapNamedBufferEXT) -#define glVertexArrayColorOffsetEXT GLEW_GET_FUN(__glewVertexArrayColorOffsetEXT) -#define glVertexArrayEdgeFlagOffsetEXT GLEW_GET_FUN(__glewVertexArrayEdgeFlagOffsetEXT) -#define glVertexArrayFogCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayFogCoordOffsetEXT) -#define glVertexArrayIndexOffsetEXT GLEW_GET_FUN(__glewVertexArrayIndexOffsetEXT) -#define glVertexArrayMultiTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayMultiTexCoordOffsetEXT) -#define glVertexArrayNormalOffsetEXT GLEW_GET_FUN(__glewVertexArrayNormalOffsetEXT) -#define glVertexArraySecondaryColorOffsetEXT GLEW_GET_FUN(__glewVertexArraySecondaryColorOffsetEXT) -#define glVertexArrayTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayTexCoordOffsetEXT) -#define glVertexArrayVertexAttribDivisorEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribDivisorEXT) -#define glVertexArrayVertexAttribIOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIOffsetEXT) -#define glVertexArrayVertexAttribOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribOffsetEXT) -#define glVertexArrayVertexOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexOffsetEXT) - -#define GLEW_EXT_direct_state_access GLEW_GET_VAR(__GLEW_EXT_direct_state_access) - -#endif /* GL_EXT_direct_state_access */ - -/* ----------------------- GL_EXT_discard_framebuffer ---------------------- */ - -#ifndef GL_EXT_discard_framebuffer -#define GL_EXT_discard_framebuffer 1 - -#define GL_COLOR_EXT 0x1800 -#define GL_DEPTH_EXT 0x1801 -#define GL_STENCIL_EXT 0x1802 - -typedef void (GLAPIENTRY * PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments); - -#define glDiscardFramebufferEXT GLEW_GET_FUN(__glewDiscardFramebufferEXT) - -#define GLEW_EXT_discard_framebuffer GLEW_GET_VAR(__GLEW_EXT_discard_framebuffer) - -#endif /* GL_EXT_discard_framebuffer */ - -/* -------------------------- GL_EXT_draw_buffers -------------------------- */ - -#ifndef GL_EXT_draw_buffers -#define GL_EXT_draw_buffers 1 - -#define GL_MAX_DRAW_BUFFERS_EXT 0x8824 -#define GL_DRAW_BUFFER0_EXT 0x8825 -#define GL_DRAW_BUFFER1_EXT 0x8826 -#define GL_DRAW_BUFFER2_EXT 0x8827 -#define GL_DRAW_BUFFER3_EXT 0x8828 -#define GL_DRAW_BUFFER4_EXT 0x8829 -#define GL_DRAW_BUFFER5_EXT 0x882A -#define GL_DRAW_BUFFER6_EXT 0x882B -#define GL_DRAW_BUFFER7_EXT 0x882C -#define GL_DRAW_BUFFER8_EXT 0x882D -#define GL_DRAW_BUFFER9_EXT 0x882E -#define GL_DRAW_BUFFER10_EXT 0x882F -#define GL_DRAW_BUFFER11_EXT 0x8830 -#define GL_DRAW_BUFFER12_EXT 0x8831 -#define GL_DRAW_BUFFER13_EXT 0x8832 -#define GL_DRAW_BUFFER14_EXT 0x8833 -#define GL_DRAW_BUFFER15_EXT 0x8834 -#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF -#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 -#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 -#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 -#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 -#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 -#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 -#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 -#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 -#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 -#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 -#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA -#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB -#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC -#define GL_COLOR_ATTACHMENT13_EXT 0x8CED -#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE -#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF - -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSEXTPROC) (GLsizei n, const GLenum* bufs); - -#define glDrawBuffersEXT GLEW_GET_FUN(__glewDrawBuffersEXT) - -#define GLEW_EXT_draw_buffers GLEW_GET_VAR(__GLEW_EXT_draw_buffers) - -#endif /* GL_EXT_draw_buffers */ - -/* -------------------------- GL_EXT_draw_buffers2 ------------------------- */ - -#ifndef GL_EXT_draw_buffers2 -#define GL_EXT_draw_buffers2 1 - -typedef void (GLAPIENTRY * PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef void (GLAPIENTRY * PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRY * PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum value, GLuint index, GLboolean* data); -typedef void (GLAPIENTRY * PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum value, GLuint index, GLint* data); -typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); - -#define glColorMaskIndexedEXT GLEW_GET_FUN(__glewColorMaskIndexedEXT) -#define glDisableIndexedEXT GLEW_GET_FUN(__glewDisableIndexedEXT) -#define glEnableIndexedEXT GLEW_GET_FUN(__glewEnableIndexedEXT) -#define glGetBooleanIndexedvEXT GLEW_GET_FUN(__glewGetBooleanIndexedvEXT) -#define glGetIntegerIndexedvEXT GLEW_GET_FUN(__glewGetIntegerIndexedvEXT) -#define glIsEnabledIndexedEXT GLEW_GET_FUN(__glewIsEnabledIndexedEXT) - -#define GLEW_EXT_draw_buffers2 GLEW_GET_VAR(__GLEW_EXT_draw_buffers2) - -#endif /* GL_EXT_draw_buffers2 */ - -/* ---------------------- GL_EXT_draw_buffers_indexed ---------------------- */ - -#ifndef GL_EXT_draw_buffers_indexed -#define GL_EXT_draw_buffers_indexed 1 - -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIEXTPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIEXTPROC) (GLuint buf, GLenum mode); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIEXTPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (GLAPIENTRY * PFNGLBLENDFUNCIEXTPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (GLAPIENTRY * PFNGLCOLORMASKIEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef void (GLAPIENTRY * PFNGLDISABLEIEXTPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEIEXTPROC) (GLenum target, GLuint index); -typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIEXTPROC) (GLenum target, GLuint index); - -#define glBlendEquationSeparateiEXT GLEW_GET_FUN(__glewBlendEquationSeparateiEXT) -#define glBlendEquationiEXT GLEW_GET_FUN(__glewBlendEquationiEXT) -#define glBlendFuncSeparateiEXT GLEW_GET_FUN(__glewBlendFuncSeparateiEXT) -#define glBlendFunciEXT GLEW_GET_FUN(__glewBlendFunciEXT) -#define glColorMaskiEXT GLEW_GET_FUN(__glewColorMaskiEXT) -#define glDisableiEXT GLEW_GET_FUN(__glewDisableiEXT) -#define glEnableiEXT GLEW_GET_FUN(__glewEnableiEXT) -#define glIsEnablediEXT GLEW_GET_FUN(__glewIsEnablediEXT) - -#define GLEW_EXT_draw_buffers_indexed GLEW_GET_VAR(__GLEW_EXT_draw_buffers_indexed) - -#endif /* GL_EXT_draw_buffers_indexed */ - -/* -------------------- GL_EXT_draw_elements_base_vertex ------------------- */ - -#ifndef GL_EXT_draw_elements_base_vertex -#define GL_EXT_draw_elements_base_vertex 1 - -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, const GLsizei* count, GLenum type, const void *const *indices, GLsizei primcount, const GLint *basevertex); - -#define glDrawElementsBaseVertexEXT GLEW_GET_FUN(__glewDrawElementsBaseVertexEXT) -#define glDrawElementsInstancedBaseVertexEXT GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexEXT) -#define glDrawRangeElementsBaseVertexEXT GLEW_GET_FUN(__glewDrawRangeElementsBaseVertexEXT) -#define glMultiDrawElementsBaseVertexEXT GLEW_GET_FUN(__glewMultiDrawElementsBaseVertexEXT) - -#define GLEW_EXT_draw_elements_base_vertex GLEW_GET_VAR(__GLEW_EXT_draw_elements_base_vertex) - -#endif /* GL_EXT_draw_elements_base_vertex */ - -/* ------------------------- GL_EXT_draw_instanced ------------------------- */ - -#ifndef GL_EXT_draw_instanced -#define GL_EXT_draw_instanced 1 - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); - -#define glDrawArraysInstancedEXT GLEW_GET_FUN(__glewDrawArraysInstancedEXT) -#define glDrawElementsInstancedEXT GLEW_GET_FUN(__glewDrawElementsInstancedEXT) - -#define GLEW_EXT_draw_instanced GLEW_GET_VAR(__GLEW_EXT_draw_instanced) - -#endif /* GL_EXT_draw_instanced */ - -/* ----------------------- GL_EXT_draw_range_elements ---------------------- */ - -#ifndef GL_EXT_draw_range_elements -#define GL_EXT_draw_range_elements 1 - -#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 -#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 - -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); - -#define glDrawRangeElementsEXT GLEW_GET_FUN(__glewDrawRangeElementsEXT) - -#define GLEW_EXT_draw_range_elements GLEW_GET_VAR(__GLEW_EXT_draw_range_elements) - -#endif /* GL_EXT_draw_range_elements */ - -/* ------------------------- GL_EXT_external_buffer ------------------------ */ - -#ifndef GL_EXT_external_buffer -#define GL_EXT_external_buffer 1 - -typedef void* GLeglClientBufferEXT; - -typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEEXTERNALEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); - -#define glBufferStorageExternalEXT GLEW_GET_FUN(__glewBufferStorageExternalEXT) -#define glNamedBufferStorageExternalEXT GLEW_GET_FUN(__glewNamedBufferStorageExternalEXT) - -#define GLEW_EXT_external_buffer GLEW_GET_VAR(__GLEW_EXT_external_buffer) - -#endif /* GL_EXT_external_buffer */ - -/* --------------------------- GL_EXT_float_blend -------------------------- */ - -#ifndef GL_EXT_float_blend -#define GL_EXT_float_blend 1 - -#define GLEW_EXT_float_blend GLEW_GET_VAR(__GLEW_EXT_float_blend) - -#endif /* GL_EXT_float_blend */ - -/* ---------------------------- GL_EXT_fog_coord --------------------------- */ - -#ifndef GL_EXT_fog_coord -#define GL_EXT_fog_coord 1 - -#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 -#define GL_FOG_COORDINATE_EXT 0x8451 -#define GL_FRAGMENT_DEPTH_EXT 0x8452 -#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 -#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 - -typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord); -typedef void (GLAPIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); - -#define glFogCoordPointerEXT GLEW_GET_FUN(__glewFogCoordPointerEXT) -#define glFogCoorddEXT GLEW_GET_FUN(__glewFogCoorddEXT) -#define glFogCoorddvEXT GLEW_GET_FUN(__glewFogCoorddvEXT) -#define glFogCoordfEXT GLEW_GET_FUN(__glewFogCoordfEXT) -#define glFogCoordfvEXT GLEW_GET_FUN(__glewFogCoordfvEXT) - -#define GLEW_EXT_fog_coord GLEW_GET_VAR(__GLEW_EXT_fog_coord) - -#endif /* GL_EXT_fog_coord */ - -/* --------------------------- GL_EXT_frag_depth --------------------------- */ - -#ifndef GL_EXT_frag_depth -#define GL_EXT_frag_depth 1 - -#define GLEW_EXT_frag_depth GLEW_GET_VAR(__GLEW_EXT_frag_depth) - -#endif /* GL_EXT_frag_depth */ - -/* ------------------------ GL_EXT_fragment_lighting ----------------------- */ - -#ifndef GL_EXT_fragment_lighting -#define GL_EXT_fragment_lighting 1 - -#define GL_FRAGMENT_LIGHTING_EXT 0x8400 -#define GL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401 -#define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402 -#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403 -#define GL_MAX_FRAGMENT_LIGHTS_EXT 0x8404 -#define GL_MAX_ACTIVE_LIGHTS_EXT 0x8405 -#define GL_CURRENT_RASTER_NORMAL_EXT 0x8406 -#define GL_LIGHT_ENV_MODE_EXT 0x8407 -#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408 -#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409 -#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A -#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B -#define GL_FRAGMENT_LIGHT0_EXT 0x840C -#define GL_FRAGMENT_LIGHT7_EXT 0x8413 - -typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param); - -#define glFragmentColorMaterialEXT GLEW_GET_FUN(__glewFragmentColorMaterialEXT) -#define glFragmentLightModelfEXT GLEW_GET_FUN(__glewFragmentLightModelfEXT) -#define glFragmentLightModelfvEXT GLEW_GET_FUN(__glewFragmentLightModelfvEXT) -#define glFragmentLightModeliEXT GLEW_GET_FUN(__glewFragmentLightModeliEXT) -#define glFragmentLightModelivEXT GLEW_GET_FUN(__glewFragmentLightModelivEXT) -#define glFragmentLightfEXT GLEW_GET_FUN(__glewFragmentLightfEXT) -#define glFragmentLightfvEXT GLEW_GET_FUN(__glewFragmentLightfvEXT) -#define glFragmentLightiEXT GLEW_GET_FUN(__glewFragmentLightiEXT) -#define glFragmentLightivEXT GLEW_GET_FUN(__glewFragmentLightivEXT) -#define glFragmentMaterialfEXT GLEW_GET_FUN(__glewFragmentMaterialfEXT) -#define glFragmentMaterialfvEXT GLEW_GET_FUN(__glewFragmentMaterialfvEXT) -#define glFragmentMaterialiEXT GLEW_GET_FUN(__glewFragmentMaterialiEXT) -#define glFragmentMaterialivEXT GLEW_GET_FUN(__glewFragmentMaterialivEXT) -#define glGetFragmentLightfvEXT GLEW_GET_FUN(__glewGetFragmentLightfvEXT) -#define glGetFragmentLightivEXT GLEW_GET_FUN(__glewGetFragmentLightivEXT) -#define glGetFragmentMaterialfvEXT GLEW_GET_FUN(__glewGetFragmentMaterialfvEXT) -#define glGetFragmentMaterialivEXT GLEW_GET_FUN(__glewGetFragmentMaterialivEXT) -#define glLightEnviEXT GLEW_GET_FUN(__glewLightEnviEXT) - -#define GLEW_EXT_fragment_lighting GLEW_GET_VAR(__GLEW_EXT_fragment_lighting) - -#endif /* GL_EXT_fragment_lighting */ - -/* ------------------------ GL_EXT_framebuffer_blit ------------------------ */ - -#ifndef GL_EXT_framebuffer_blit -#define GL_EXT_framebuffer_blit 1 - -#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA - -typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); - -#define glBlitFramebufferEXT GLEW_GET_FUN(__glewBlitFramebufferEXT) - -#define GLEW_EXT_framebuffer_blit GLEW_GET_VAR(__GLEW_EXT_framebuffer_blit) - -#endif /* GL_EXT_framebuffer_blit */ - -/* --------------------- GL_EXT_framebuffer_multisample -------------------- */ - -#ifndef GL_EXT_framebuffer_multisample -#define GL_EXT_framebuffer_multisample 1 - -#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 -#define GL_MAX_SAMPLES_EXT 0x8D57 - -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - -#define glRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewRenderbufferStorageMultisampleEXT) - -#define GLEW_EXT_framebuffer_multisample GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample) - -#endif /* GL_EXT_framebuffer_multisample */ - -/* --------------- GL_EXT_framebuffer_multisample_blit_scaled -------------- */ - -#ifndef GL_EXT_framebuffer_multisample_blit_scaled -#define GL_EXT_framebuffer_multisample_blit_scaled 1 - -#define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA -#define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB - -#define GLEW_EXT_framebuffer_multisample_blit_scaled GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample_blit_scaled) - -#endif /* GL_EXT_framebuffer_multisample_blit_scaled */ - -/* ----------------------- GL_EXT_framebuffer_object ----------------------- */ - -#ifndef GL_EXT_framebuffer_object -#define GL_EXT_framebuffer_object 1 - -#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 -#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 -#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 -#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF -#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 -#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 -#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 -#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 -#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 -#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 -#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 -#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 -#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 -#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 -#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA -#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB -#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC -#define GL_COLOR_ATTACHMENT13_EXT 0x8CED -#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE -#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF -#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 -#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 -#define GL_FRAMEBUFFER_EXT 0x8D40 -#define GL_RENDERBUFFER_EXT 0x8D41 -#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 -#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 -#define GL_STENCIL_INDEX1_EXT 0x8D46 -#define GL_STENCIL_INDEX4_EXT 0x8D47 -#define GL_STENCIL_INDEX8_EXT 0x8D48 -#define GL_STENCIL_INDEX16_EXT 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 - -typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); -typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); -typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint* framebuffers); -typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint* renderbuffers); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint* framebuffers); -typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint* renderbuffers); -typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); -typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); - -#define glBindFramebufferEXT GLEW_GET_FUN(__glewBindFramebufferEXT) -#define glBindRenderbufferEXT GLEW_GET_FUN(__glewBindRenderbufferEXT) -#define glCheckFramebufferStatusEXT GLEW_GET_FUN(__glewCheckFramebufferStatusEXT) -#define glDeleteFramebuffersEXT GLEW_GET_FUN(__glewDeleteFramebuffersEXT) -#define glDeleteRenderbuffersEXT GLEW_GET_FUN(__glewDeleteRenderbuffersEXT) -#define glFramebufferRenderbufferEXT GLEW_GET_FUN(__glewFramebufferRenderbufferEXT) -#define glFramebufferTexture1DEXT GLEW_GET_FUN(__glewFramebufferTexture1DEXT) -#define glFramebufferTexture2DEXT GLEW_GET_FUN(__glewFramebufferTexture2DEXT) -#define glFramebufferTexture3DEXT GLEW_GET_FUN(__glewFramebufferTexture3DEXT) -#define glGenFramebuffersEXT GLEW_GET_FUN(__glewGenFramebuffersEXT) -#define glGenRenderbuffersEXT GLEW_GET_FUN(__glewGenRenderbuffersEXT) -#define glGenerateMipmapEXT GLEW_GET_FUN(__glewGenerateMipmapEXT) -#define glGetFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetFramebufferAttachmentParameterivEXT) -#define glGetRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetRenderbufferParameterivEXT) -#define glIsFramebufferEXT GLEW_GET_FUN(__glewIsFramebufferEXT) -#define glIsRenderbufferEXT GLEW_GET_FUN(__glewIsRenderbufferEXT) -#define glRenderbufferStorageEXT GLEW_GET_FUN(__glewRenderbufferStorageEXT) - -#define GLEW_EXT_framebuffer_object GLEW_GET_VAR(__GLEW_EXT_framebuffer_object) - -#endif /* GL_EXT_framebuffer_object */ - -/* ------------------------ GL_EXT_framebuffer_sRGB ------------------------ */ - -#ifndef GL_EXT_framebuffer_sRGB -#define GL_EXT_framebuffer_sRGB 1 - -#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 -#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA - -#define GLEW_EXT_framebuffer_sRGB GLEW_GET_VAR(__GLEW_EXT_framebuffer_sRGB) - -#endif /* GL_EXT_framebuffer_sRGB */ - -/* ----------------------- GL_EXT_geometry_point_size ---------------------- */ - -#ifndef GL_EXT_geometry_point_size -#define GL_EXT_geometry_point_size 1 - -#define GL_GEOMETRY_SHADER_BIT_EXT 0x00000004 -#define GL_LINES_ADJACENCY_EXT 0xA -#define GL_LINE_STRIP_ADJACENCY_EXT 0xB -#define GL_TRIANGLES_ADJACENCY_EXT 0xC -#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD -#define GL_LAYER_PROVOKING_VERTEX_EXT 0x825E -#define GL_UNDEFINED_VERTEX_EXT 0x8260 -#define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F -#define GL_GEOMETRY_LINKED_VERTICES_OUT_EXT 0x8916 -#define GL_GEOMETRY_LINKED_INPUT_TYPE_EXT 0x8917 -#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT 0x8918 -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 -#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 -#define GL_GEOMETRY_SHADER_EXT 0x8DD9 -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 -#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D -#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E -#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A -#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD -#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124 -#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF -#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5 -#define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309 -#define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312 -#define GL_MAX_FRAMEBUFFER_LAYERS_EXT 0x9317 - -#define GLEW_EXT_geometry_point_size GLEW_GET_VAR(__GLEW_EXT_geometry_point_size) - -#endif /* GL_EXT_geometry_point_size */ - -/* ------------------------- GL_EXT_geometry_shader ------------------------ */ - -#ifndef GL_EXT_geometry_shader -#define GL_EXT_geometry_shader 1 - -#define GL_GEOMETRY_SHADER_BIT_EXT 0x00000004 -#define GL_LINES_ADJACENCY_EXT 0xA -#define GL_LINE_STRIP_ADJACENCY_EXT 0xB -#define GL_TRIANGLES_ADJACENCY_EXT 0xC -#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD -#define GL_LAYER_PROVOKING_VERTEX_EXT 0x825E -#define GL_UNDEFINED_VERTEX_EXT 0x8260 -#define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F -#define GL_GEOMETRY_LINKED_VERTICES_OUT_EXT 0x8916 -#define GL_GEOMETRY_LINKED_INPUT_TYPE_EXT 0x8917 -#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT 0x8918 -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 -#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 -#define GL_GEOMETRY_SHADER_EXT 0x8DD9 -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 -#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D -#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E -#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A -#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD -#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124 -#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF -#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5 -#define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309 -#define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312 -#define GL_MAX_FRAMEBUFFER_LAYERS_EXT 0x9317 - -#define GLEW_EXT_geometry_shader GLEW_GET_VAR(__GLEW_EXT_geometry_shader) - -#endif /* GL_EXT_geometry_shader */ - -/* ------------------------ GL_EXT_geometry_shader4 ------------------------ */ - -#ifndef GL_EXT_geometry_shader4 -#define GL_EXT_geometry_shader4 1 - -#define GL_LINES_ADJACENCY_EXT 0xA -#define GL_LINE_STRIP_ADJACENCY_EXT 0xB -#define GL_TRIANGLES_ADJACENCY_EXT 0xC -#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD -#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 -#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 -#define GL_GEOMETRY_SHADER_EXT 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD -#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); - -#define glFramebufferTextureEXT GLEW_GET_FUN(__glewFramebufferTextureEXT) -#define glFramebufferTextureFaceEXT GLEW_GET_FUN(__glewFramebufferTextureFaceEXT) -#define glProgramParameteriEXT GLEW_GET_FUN(__glewProgramParameteriEXT) - -#define GLEW_EXT_geometry_shader4 GLEW_GET_VAR(__GLEW_EXT_geometry_shader4) - -#endif /* GL_EXT_geometry_shader4 */ - -/* --------------------- GL_EXT_gpu_program_parameters --------------------- */ - -#ifndef GL_EXT_gpu_program_parameters -#define GL_EXT_gpu_program_parameters 1 - -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); - -#define glProgramEnvParameters4fvEXT GLEW_GET_FUN(__glewProgramEnvParameters4fvEXT) -#define glProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewProgramLocalParameters4fvEXT) - -#define GLEW_EXT_gpu_program_parameters GLEW_GET_VAR(__GLEW_EXT_gpu_program_parameters) - -#endif /* GL_EXT_gpu_program_parameters */ - -/* --------------------------- GL_EXT_gpu_shader4 -------------------------- */ - -#ifndef GL_EXT_gpu_shader4 -#define GL_EXT_gpu_shader4 1 - -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD -#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 -#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 -#define GL_SAMPLER_BUFFER_EXT 0x8DC2 -#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 -#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 -#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 -#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 -#define GL_INT_SAMPLER_1D_EXT 0x8DC9 -#define GL_INT_SAMPLER_2D_EXT 0x8DCA -#define GL_INT_SAMPLER_3D_EXT 0x8DCB -#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC -#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD -#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF -#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 - -typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); -typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); - -#define glBindFragDataLocationEXT GLEW_GET_FUN(__glewBindFragDataLocationEXT) -#define glGetFragDataLocationEXT GLEW_GET_FUN(__glewGetFragDataLocationEXT) -#define glGetUniformuivEXT GLEW_GET_FUN(__glewGetUniformuivEXT) -#define glGetVertexAttribIivEXT GLEW_GET_FUN(__glewGetVertexAttribIivEXT) -#define glGetVertexAttribIuivEXT GLEW_GET_FUN(__glewGetVertexAttribIuivEXT) -#define glUniform1uiEXT GLEW_GET_FUN(__glewUniform1uiEXT) -#define glUniform1uivEXT GLEW_GET_FUN(__glewUniform1uivEXT) -#define glUniform2uiEXT GLEW_GET_FUN(__glewUniform2uiEXT) -#define glUniform2uivEXT GLEW_GET_FUN(__glewUniform2uivEXT) -#define glUniform3uiEXT GLEW_GET_FUN(__glewUniform3uiEXT) -#define glUniform3uivEXT GLEW_GET_FUN(__glewUniform3uivEXT) -#define glUniform4uiEXT GLEW_GET_FUN(__glewUniform4uiEXT) -#define glUniform4uivEXT GLEW_GET_FUN(__glewUniform4uivEXT) -#define glVertexAttribI1iEXT GLEW_GET_FUN(__glewVertexAttribI1iEXT) -#define glVertexAttribI1ivEXT GLEW_GET_FUN(__glewVertexAttribI1ivEXT) -#define glVertexAttribI1uiEXT GLEW_GET_FUN(__glewVertexAttribI1uiEXT) -#define glVertexAttribI1uivEXT GLEW_GET_FUN(__glewVertexAttribI1uivEXT) -#define glVertexAttribI2iEXT GLEW_GET_FUN(__glewVertexAttribI2iEXT) -#define glVertexAttribI2ivEXT GLEW_GET_FUN(__glewVertexAttribI2ivEXT) -#define glVertexAttribI2uiEXT GLEW_GET_FUN(__glewVertexAttribI2uiEXT) -#define glVertexAttribI2uivEXT GLEW_GET_FUN(__glewVertexAttribI2uivEXT) -#define glVertexAttribI3iEXT GLEW_GET_FUN(__glewVertexAttribI3iEXT) -#define glVertexAttribI3ivEXT GLEW_GET_FUN(__glewVertexAttribI3ivEXT) -#define glVertexAttribI3uiEXT GLEW_GET_FUN(__glewVertexAttribI3uiEXT) -#define glVertexAttribI3uivEXT GLEW_GET_FUN(__glewVertexAttribI3uivEXT) -#define glVertexAttribI4bvEXT GLEW_GET_FUN(__glewVertexAttribI4bvEXT) -#define glVertexAttribI4iEXT GLEW_GET_FUN(__glewVertexAttribI4iEXT) -#define glVertexAttribI4ivEXT GLEW_GET_FUN(__glewVertexAttribI4ivEXT) -#define glVertexAttribI4svEXT GLEW_GET_FUN(__glewVertexAttribI4svEXT) -#define glVertexAttribI4ubvEXT GLEW_GET_FUN(__glewVertexAttribI4ubvEXT) -#define glVertexAttribI4uiEXT GLEW_GET_FUN(__glewVertexAttribI4uiEXT) -#define glVertexAttribI4uivEXT GLEW_GET_FUN(__glewVertexAttribI4uivEXT) -#define glVertexAttribI4usvEXT GLEW_GET_FUN(__glewVertexAttribI4usvEXT) -#define glVertexAttribIPointerEXT GLEW_GET_FUN(__glewVertexAttribIPointerEXT) - -#define GLEW_EXT_gpu_shader4 GLEW_GET_VAR(__GLEW_EXT_gpu_shader4) - -#endif /* GL_EXT_gpu_shader4 */ - -/* --------------------------- GL_EXT_gpu_shader5 -------------------------- */ - -#ifndef GL_EXT_gpu_shader5 -#define GL_EXT_gpu_shader5 1 - -#define GLEW_EXT_gpu_shader5 GLEW_GET_VAR(__GLEW_EXT_gpu_shader5) - -#endif /* GL_EXT_gpu_shader5 */ - -/* ---------------------------- GL_EXT_histogram --------------------------- */ - -#ifndef GL_EXT_histogram -#define GL_EXT_histogram 1 - -#define GL_HISTOGRAM_EXT 0x8024 -#define GL_PROXY_HISTOGRAM_EXT 0x8025 -#define GL_HISTOGRAM_WIDTH_EXT 0x8026 -#define GL_HISTOGRAM_FORMAT_EXT 0x8027 -#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C -#define GL_HISTOGRAM_SINK_EXT 0x802D -#define GL_MINMAX_EXT 0x802E -#define GL_MINMAX_FORMAT_EXT 0x802F -#define GL_MINMAX_SINK_EXT 0x8030 - -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); -typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (GLAPIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target); - -#define glGetHistogramEXT GLEW_GET_FUN(__glewGetHistogramEXT) -#define glGetHistogramParameterfvEXT GLEW_GET_FUN(__glewGetHistogramParameterfvEXT) -#define glGetHistogramParameterivEXT GLEW_GET_FUN(__glewGetHistogramParameterivEXT) -#define glGetMinmaxEXT GLEW_GET_FUN(__glewGetMinmaxEXT) -#define glGetMinmaxParameterfvEXT GLEW_GET_FUN(__glewGetMinmaxParameterfvEXT) -#define glGetMinmaxParameterivEXT GLEW_GET_FUN(__glewGetMinmaxParameterivEXT) -#define glHistogramEXT GLEW_GET_FUN(__glewHistogramEXT) -#define glMinmaxEXT GLEW_GET_FUN(__glewMinmaxEXT) -#define glResetHistogramEXT GLEW_GET_FUN(__glewResetHistogramEXT) -#define glResetMinmaxEXT GLEW_GET_FUN(__glewResetMinmaxEXT) - -#define GLEW_EXT_histogram GLEW_GET_VAR(__GLEW_EXT_histogram) - -#endif /* GL_EXT_histogram */ - -/* ----------------------- GL_EXT_index_array_formats ---------------------- */ - -#ifndef GL_EXT_index_array_formats -#define GL_EXT_index_array_formats 1 - -#define GLEW_EXT_index_array_formats GLEW_GET_VAR(__GLEW_EXT_index_array_formats) - -#endif /* GL_EXT_index_array_formats */ - -/* --------------------------- GL_EXT_index_func --------------------------- */ - -#ifndef GL_EXT_index_func -#define GL_EXT_index_func 1 - -typedef void (GLAPIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLfloat ref); - -#define glIndexFuncEXT GLEW_GET_FUN(__glewIndexFuncEXT) - -#define GLEW_EXT_index_func GLEW_GET_VAR(__GLEW_EXT_index_func) - -#endif /* GL_EXT_index_func */ - -/* ------------------------- GL_EXT_index_material ------------------------- */ - -#ifndef GL_EXT_index_material -#define GL_EXT_index_material 1 - -typedef void (GLAPIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); - -#define glIndexMaterialEXT GLEW_GET_FUN(__glewIndexMaterialEXT) - -#define GLEW_EXT_index_material GLEW_GET_VAR(__GLEW_EXT_index_material) - -#endif /* GL_EXT_index_material */ - -/* -------------------------- GL_EXT_index_texture ------------------------- */ - -#ifndef GL_EXT_index_texture -#define GL_EXT_index_texture 1 - -#define GLEW_EXT_index_texture GLEW_GET_VAR(__GLEW_EXT_index_texture) - -#endif /* GL_EXT_index_texture */ - -/* ------------------------ GL_EXT_instanced_arrays ------------------------ */ - -#ifndef GL_EXT_instanced_arrays -#define GL_EXT_instanced_arrays 1 - -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT 0x88FE - -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor); - -#define glVertexAttribDivisorEXT GLEW_GET_FUN(__glewVertexAttribDivisorEXT) - -#define GLEW_EXT_instanced_arrays GLEW_GET_VAR(__GLEW_EXT_instanced_arrays) - -#endif /* GL_EXT_instanced_arrays */ - -/* -------------------------- GL_EXT_light_texture ------------------------- */ - -#ifndef GL_EXT_light_texture -#define GL_EXT_light_texture 1 - -#define GL_FRAGMENT_MATERIAL_EXT 0x8349 -#define GL_FRAGMENT_NORMAL_EXT 0x834A -#define GL_FRAGMENT_COLOR_EXT 0x834C -#define GL_ATTENUATION_EXT 0x834D -#define GL_SHADOW_ATTENUATION_EXT 0x834E -#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F -#define GL_TEXTURE_LIGHT_EXT 0x8350 -#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 -#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 - -typedef void (GLAPIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); -typedef void (GLAPIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); -typedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); - -#define glApplyTextureEXT GLEW_GET_FUN(__glewApplyTextureEXT) -#define glTextureLightEXT GLEW_GET_FUN(__glewTextureLightEXT) -#define glTextureMaterialEXT GLEW_GET_FUN(__glewTextureMaterialEXT) - -#define GLEW_EXT_light_texture GLEW_GET_VAR(__GLEW_EXT_light_texture) - -#endif /* GL_EXT_light_texture */ - -/* ------------------------ GL_EXT_map_buffer_range ------------------------ */ - -#ifndef GL_EXT_map_buffer_range -#define GL_EXT_map_buffer_range 1 - -#define GL_MAP_READ_BIT_EXT 0x0001 -#define GL_MAP_WRITE_BIT_EXT 0x0002 -#define GL_MAP_INVALIDATE_RANGE_BIT_EXT 0x0004 -#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT 0x0008 -#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010 -#define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020 - -typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length); -typedef void * (GLAPIENTRY * PFNGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); - -#define glFlushMappedBufferRangeEXT GLEW_GET_FUN(__glewFlushMappedBufferRangeEXT) -#define glMapBufferRangeEXT GLEW_GET_FUN(__glewMapBufferRangeEXT) - -#define GLEW_EXT_map_buffer_range GLEW_GET_VAR(__GLEW_EXT_map_buffer_range) - -#endif /* GL_EXT_map_buffer_range */ - -/* -------------------------- GL_EXT_memory_object ------------------------- */ - -#ifndef GL_EXT_memory_object -#define GL_EXT_memory_object 1 - -#define GL_UUID_SIZE_EXT 16 -#define GL_TEXTURE_TILING_EXT 0x9580 -#define GL_DEDICATED_MEMORY_OBJECT_EXT 0x9581 -#define GL_NUM_TILING_TYPES_EXT 0x9582 -#define GL_TILING_TYPES_EXT 0x9583 -#define GL_OPTIMAL_TILING_EXT 0x9584 -#define GL_LINEAR_TILING_EXT 0x9585 -#define GL_LAYOUT_GENERAL_EXT 0x958D -#define GL_LAYOUT_COLOR_ATTACHMENT_EXT 0x958E -#define GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT 0x958F -#define GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT 0x9590 -#define GL_LAYOUT_SHADER_READ_ONLY_EXT 0x9591 -#define GL_LAYOUT_TRANSFER_SRC_EXT 0x9592 -#define GL_LAYOUT_TRANSFER_DST_EXT 0x9593 -#define GL_NUM_DEVICE_UUIDS_EXT 0x9596 -#define GL_DEVICE_UUID_EXT 0x9597 -#define GL_DRIVER_UUID_EXT 0x9598 -#define GL_PROTECTED_MEMORY_OBJECT_EXT 0x959B - -typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEMEMEXTPROC) (GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLCREATEMEMORYOBJECTSEXTPROC) (GLsizei n, GLuint* memoryObjects); -typedef void (GLAPIENTRY * PFNGLDELETEMEMORYOBJECTSEXTPROC) (GLsizei n, const GLuint* memoryObjects); -typedef void (GLAPIENTRY * PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETUNSIGNEDBYTEI_VEXTPROC) (GLenum target, GLuint index, GLubyte* data); -typedef void (GLAPIENTRY * PFNGLGETUNSIGNEDBYTEVEXTPROC) (GLenum pname, GLubyte* data); -typedef GLboolean (GLAPIENTRY * PFNGLISMEMORYOBJECTEXTPROC) (GLuint memoryObject); -typedef void (GLAPIENTRY * PFNGLMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC) (GLuint buffer, GLsizeiptr size, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM1DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM2DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM3DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); - -#define glBufferStorageMemEXT GLEW_GET_FUN(__glewBufferStorageMemEXT) -#define glCreateMemoryObjectsEXT GLEW_GET_FUN(__glewCreateMemoryObjectsEXT) -#define glDeleteMemoryObjectsEXT GLEW_GET_FUN(__glewDeleteMemoryObjectsEXT) -#define glGetMemoryObjectParameterivEXT GLEW_GET_FUN(__glewGetMemoryObjectParameterivEXT) -#define glGetUnsignedBytei_vEXT GLEW_GET_FUN(__glewGetUnsignedBytei_vEXT) -#define glGetUnsignedBytevEXT GLEW_GET_FUN(__glewGetUnsignedBytevEXT) -#define glIsMemoryObjectEXT GLEW_GET_FUN(__glewIsMemoryObjectEXT) -#define glMemoryObjectParameterivEXT GLEW_GET_FUN(__glewMemoryObjectParameterivEXT) -#define glNamedBufferStorageMemEXT GLEW_GET_FUN(__glewNamedBufferStorageMemEXT) -#define glTexStorageMem1DEXT GLEW_GET_FUN(__glewTexStorageMem1DEXT) -#define glTexStorageMem2DEXT GLEW_GET_FUN(__glewTexStorageMem2DEXT) -#define glTexStorageMem2DMultisampleEXT GLEW_GET_FUN(__glewTexStorageMem2DMultisampleEXT) -#define glTexStorageMem3DEXT GLEW_GET_FUN(__glewTexStorageMem3DEXT) -#define glTexStorageMem3DMultisampleEXT GLEW_GET_FUN(__glewTexStorageMem3DMultisampleEXT) -#define glTextureStorageMem1DEXT GLEW_GET_FUN(__glewTextureStorageMem1DEXT) -#define glTextureStorageMem2DEXT GLEW_GET_FUN(__glewTextureStorageMem2DEXT) -#define glTextureStorageMem2DMultisampleEXT GLEW_GET_FUN(__glewTextureStorageMem2DMultisampleEXT) -#define glTextureStorageMem3DEXT GLEW_GET_FUN(__glewTextureStorageMem3DEXT) -#define glTextureStorageMem3DMultisampleEXT GLEW_GET_FUN(__glewTextureStorageMem3DMultisampleEXT) - -#define GLEW_EXT_memory_object GLEW_GET_VAR(__GLEW_EXT_memory_object) - -#endif /* GL_EXT_memory_object */ - -/* ------------------------ GL_EXT_memory_object_fd ------------------------ */ - -#ifndef GL_EXT_memory_object_fd -#define GL_EXT_memory_object_fd 1 - -#define GL_HANDLE_TYPE_OPAQUE_FD_EXT 0x9586 - -typedef void (GLAPIENTRY * PFNGLIMPORTMEMORYFDEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, GLint fd); - -#define glImportMemoryFdEXT GLEW_GET_FUN(__glewImportMemoryFdEXT) - -#define GLEW_EXT_memory_object_fd GLEW_GET_VAR(__GLEW_EXT_memory_object_fd) - -#endif /* GL_EXT_memory_object_fd */ - -/* ----------------------- GL_EXT_memory_object_win32 ---------------------- */ - -#ifndef GL_EXT_memory_object_win32 -#define GL_EXT_memory_object_win32 1 - -#define GL_LUID_SIZE_EXT 8 -#define GL_HANDLE_TYPE_OPAQUE_WIN32_EXT 0x9587 -#define GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT 0x9588 -#define GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT 0x9589 -#define GL_HANDLE_TYPE_D3D12_RESOURCE_EXT 0x958A -#define GL_HANDLE_TYPE_D3D11_IMAGE_EXT 0x958B -#define GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT 0x958C -#define GL_HANDLE_TYPE_D3D12_FENCE_EXT 0x9594 -#define GL_D3D12_FENCE_VALUE_EXT 0x9595 -#define GL_DEVICE_LUID_EXT 0x9599 -#define GL_DEVICE_NODE_MASK_EXT 0x959A - -typedef void (GLAPIENTRY * PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, void *handle); -typedef void (GLAPIENTRY * PFNGLIMPORTMEMORYWIN32NAMEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, const void *name); - -#define glImportMemoryWin32HandleEXT GLEW_GET_FUN(__glewImportMemoryWin32HandleEXT) -#define glImportMemoryWin32NameEXT GLEW_GET_FUN(__glewImportMemoryWin32NameEXT) - -#define GLEW_EXT_memory_object_win32 GLEW_GET_VAR(__GLEW_EXT_memory_object_win32) - -#endif /* GL_EXT_memory_object_win32 */ - -/* ------------------------- GL_EXT_misc_attribute ------------------------- */ - -#ifndef GL_EXT_misc_attribute -#define GL_EXT_misc_attribute 1 - -#define GLEW_EXT_misc_attribute GLEW_GET_VAR(__GLEW_EXT_misc_attribute) - -#endif /* GL_EXT_misc_attribute */ - -/* ------------------------ GL_EXT_multi_draw_arrays ----------------------- */ - -#ifndef GL_EXT_multi_draw_arrays -#define GL_EXT_multi_draw_arrays 1 - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const void *const *indices, GLsizei primcount); - -#define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT) -#define glMultiDrawElementsEXT GLEW_GET_FUN(__glewMultiDrawElementsEXT) - -#define GLEW_EXT_multi_draw_arrays GLEW_GET_VAR(__GLEW_EXT_multi_draw_arrays) - -#endif /* GL_EXT_multi_draw_arrays */ - -/* ----------------------- GL_EXT_multi_draw_indirect ---------------------- */ - -#ifndef GL_EXT_multi_draw_indirect -#define GL_EXT_multi_draw_indirect 1 - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); - -#define glMultiDrawArraysIndirectEXT GLEW_GET_FUN(__glewMultiDrawArraysIndirectEXT) -#define glMultiDrawElementsIndirectEXT GLEW_GET_FUN(__glewMultiDrawElementsIndirectEXT) - -#define GLEW_EXT_multi_draw_indirect GLEW_GET_VAR(__GLEW_EXT_multi_draw_indirect) - -#endif /* GL_EXT_multi_draw_indirect */ - -/* ------------------------ GL_EXT_multiple_textures ----------------------- */ - -#ifndef GL_EXT_multiple_textures -#define GL_EXT_multiple_textures 1 - -#define GLEW_EXT_multiple_textures GLEW_GET_VAR(__GLEW_EXT_multiple_textures) - -#endif /* GL_EXT_multiple_textures */ - -/* --------------------------- GL_EXT_multisample -------------------------- */ - -#ifndef GL_EXT_multisample -#define GL_EXT_multisample 1 - -#define GL_MULTISAMPLE_EXT 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F -#define GL_SAMPLE_MASK_EXT 0x80A0 -#define GL_1PASS_EXT 0x80A1 -#define GL_2PASS_0_EXT 0x80A2 -#define GL_2PASS_1_EXT 0x80A3 -#define GL_4PASS_0_EXT 0x80A4 -#define GL_4PASS_1_EXT 0x80A5 -#define GL_4PASS_2_EXT 0x80A6 -#define GL_4PASS_3_EXT 0x80A7 -#define GL_SAMPLE_BUFFERS_EXT 0x80A8 -#define GL_SAMPLES_EXT 0x80A9 -#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA -#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB -#define GL_SAMPLE_PATTERN_EXT 0x80AC -#define GL_MULTISAMPLE_BIT_EXT 0x20000000 - -typedef void (GLAPIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); -typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); - -#define glSampleMaskEXT GLEW_GET_FUN(__glewSampleMaskEXT) -#define glSamplePatternEXT GLEW_GET_FUN(__glewSamplePatternEXT) - -#define GLEW_EXT_multisample GLEW_GET_VAR(__GLEW_EXT_multisample) - -#endif /* GL_EXT_multisample */ - -/* -------------------- GL_EXT_multisample_compatibility ------------------- */ - -#ifndef GL_EXT_multisample_compatibility -#define GL_EXT_multisample_compatibility 1 - -#define GL_MULTISAMPLE_EXT 0x809D -#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F - -#define GLEW_EXT_multisample_compatibility GLEW_GET_VAR(__GLEW_EXT_multisample_compatibility) - -#endif /* GL_EXT_multisample_compatibility */ - -/* ----------------- GL_EXT_multisampled_render_to_texture ----------------- */ - -#ifndef GL_EXT_multisampled_render_to_texture -#define GL_EXT_multisampled_render_to_texture 1 - -#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 -#define GL_MAX_SAMPLES_EXT 0x8D57 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); - -#define glFramebufferTexture2DMultisampleEXT GLEW_GET_FUN(__glewFramebufferTexture2DMultisampleEXT) - -#define GLEW_EXT_multisampled_render_to_texture GLEW_GET_VAR(__GLEW_EXT_multisampled_render_to_texture) - -#endif /* GL_EXT_multisampled_render_to_texture */ - -/* ----------------- GL_EXT_multisampled_render_to_texture2 ---------------- */ - -#ifndef GL_EXT_multisampled_render_to_texture2 -#define GL_EXT_multisampled_render_to_texture2 1 - -#define GLEW_EXT_multisampled_render_to_texture2 GLEW_GET_VAR(__GLEW_EXT_multisampled_render_to_texture2) - -#endif /* GL_EXT_multisampled_render_to_texture2 */ - -/* --------------------- GL_EXT_multiview_draw_buffers --------------------- */ - -#ifndef GL_EXT_multiview_draw_buffers -#define GL_EXT_multiview_draw_buffers 1 - -#define GL_DRAW_BUFFER_EXT 0x0C01 -#define GL_READ_BUFFER_EXT 0x0C02 -#define GL_COLOR_ATTACHMENT_EXT 0x90F0 -#define GL_MULTIVIEW_EXT 0x90F1 -#define GL_MAX_MULTIVIEW_BUFFERS_EXT 0x90F2 - -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum* location, const GLint *indices); -typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint* data); -typedef void (GLAPIENTRY * PFNGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index); - -#define glDrawBuffersIndexedEXT GLEW_GET_FUN(__glewDrawBuffersIndexedEXT) -#define glGetIntegeri_vEXT GLEW_GET_FUN(__glewGetIntegeri_vEXT) -#define glReadBufferIndexedEXT GLEW_GET_FUN(__glewReadBufferIndexedEXT) - -#define GLEW_EXT_multiview_draw_buffers GLEW_GET_VAR(__GLEW_EXT_multiview_draw_buffers) - -#endif /* GL_EXT_multiview_draw_buffers */ - -/* ---------------------- GL_EXT_packed_depth_stencil ---------------------- */ - -#ifndef GL_EXT_packed_depth_stencil -#define GL_EXT_packed_depth_stencil 1 - -#define GL_DEPTH_STENCIL_EXT 0x84F9 -#define GL_UNSIGNED_INT_24_8_EXT 0x84FA -#define GL_DEPTH24_STENCIL8_EXT 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 - -#define GLEW_EXT_packed_depth_stencil GLEW_GET_VAR(__GLEW_EXT_packed_depth_stencil) - -#endif /* GL_EXT_packed_depth_stencil */ - -/* -------------------------- GL_EXT_packed_float -------------------------- */ - -#ifndef GL_EXT_packed_float -#define GL_EXT_packed_float 1 - -#define GL_R11F_G11F_B10F_EXT 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B -#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C - -#define GLEW_EXT_packed_float GLEW_GET_VAR(__GLEW_EXT_packed_float) - -#endif /* GL_EXT_packed_float */ - -/* -------------------------- GL_EXT_packed_pixels ------------------------- */ - -#ifndef GL_EXT_packed_pixels -#define GL_EXT_packed_pixels 1 - -#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 - -#define GLEW_EXT_packed_pixels GLEW_GET_VAR(__GLEW_EXT_packed_pixels) - -#endif /* GL_EXT_packed_pixels */ - -/* ------------------------ GL_EXT_paletted_texture ------------------------ */ - -#ifndef GL_EXT_paletted_texture -#define GL_EXT_paletted_texture 1 - -#define GL_TEXTURE_1D 0x0DE0 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_PROXY_TEXTURE_1D 0x8063 -#define GL_PROXY_TEXTURE_2D 0x8064 -#define GL_COLOR_TABLE_FORMAT_EXT 0x80D8 -#define GL_COLOR_TABLE_WIDTH_EXT 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE_EXT 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED -#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 -#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B - -typedef void (GLAPIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *data); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void *data); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); - -#define glColorTableEXT GLEW_GET_FUN(__glewColorTableEXT) -#define glGetColorTableEXT GLEW_GET_FUN(__glewGetColorTableEXT) -#define glGetColorTableParameterfvEXT GLEW_GET_FUN(__glewGetColorTableParameterfvEXT) -#define glGetColorTableParameterivEXT GLEW_GET_FUN(__glewGetColorTableParameterivEXT) - -#define GLEW_EXT_paletted_texture GLEW_GET_VAR(__GLEW_EXT_paletted_texture) - -#endif /* GL_EXT_paletted_texture */ - -/* ----------------------- GL_EXT_pixel_buffer_object ---------------------- */ - -#ifndef GL_EXT_pixel_buffer_object -#define GL_EXT_pixel_buffer_object 1 - -#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF - -#define GLEW_EXT_pixel_buffer_object GLEW_GET_VAR(__GLEW_EXT_pixel_buffer_object) - -#endif /* GL_EXT_pixel_buffer_object */ - -/* ------------------------- GL_EXT_pixel_transform ------------------------ */ - -#ifndef GL_EXT_pixel_transform -#define GL_EXT_pixel_transform 1 - -#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 -#define GL_PIXEL_MAG_FILTER_EXT 0x8331 -#define GL_PIXEL_MIN_FILTER_EXT 0x8332 -#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 -#define GL_CUBIC_EXT 0x8334 -#define GL_AVERAGE_EXT 0x8335 -#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 -#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 -#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 - -typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, const GLfloat param); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, const GLint param); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); - -#define glGetPixelTransformParameterfvEXT GLEW_GET_FUN(__glewGetPixelTransformParameterfvEXT) -#define glGetPixelTransformParameterivEXT GLEW_GET_FUN(__glewGetPixelTransformParameterivEXT) -#define glPixelTransformParameterfEXT GLEW_GET_FUN(__glewPixelTransformParameterfEXT) -#define glPixelTransformParameterfvEXT GLEW_GET_FUN(__glewPixelTransformParameterfvEXT) -#define glPixelTransformParameteriEXT GLEW_GET_FUN(__glewPixelTransformParameteriEXT) -#define glPixelTransformParameterivEXT GLEW_GET_FUN(__glewPixelTransformParameterivEXT) - -#define GLEW_EXT_pixel_transform GLEW_GET_VAR(__GLEW_EXT_pixel_transform) - -#endif /* GL_EXT_pixel_transform */ - -/* ------------------- GL_EXT_pixel_transform_color_table ------------------ */ - -#ifndef GL_EXT_pixel_transform_color_table -#define GL_EXT_pixel_transform_color_table 1 - -#define GLEW_EXT_pixel_transform_color_table GLEW_GET_VAR(__GLEW_EXT_pixel_transform_color_table) - -#endif /* GL_EXT_pixel_transform_color_table */ - -/* ------------------------ GL_EXT_point_parameters ------------------------ */ - -#ifndef GL_EXT_point_parameters -#define GL_EXT_point_parameters 1 - -#define GL_POINT_SIZE_MIN_EXT 0x8126 -#define GL_POINT_SIZE_MAX_EXT 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 -#define GL_DISTANCE_ATTENUATION_EXT 0x8129 - -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat* params); - -#define glPointParameterfEXT GLEW_GET_FUN(__glewPointParameterfEXT) -#define glPointParameterfvEXT GLEW_GET_FUN(__glewPointParameterfvEXT) - -#define GLEW_EXT_point_parameters GLEW_GET_VAR(__GLEW_EXT_point_parameters) - -#endif /* GL_EXT_point_parameters */ - -/* ------------------------- GL_EXT_polygon_offset ------------------------- */ - -#ifndef GL_EXT_polygon_offset -#define GL_EXT_polygon_offset 1 - -#define GL_POLYGON_OFFSET_EXT 0x8037 -#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 -#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 - -typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); - -#define glPolygonOffsetEXT GLEW_GET_FUN(__glewPolygonOffsetEXT) - -#define GLEW_EXT_polygon_offset GLEW_GET_VAR(__GLEW_EXT_polygon_offset) - -#endif /* GL_EXT_polygon_offset */ - -/* ---------------------- GL_EXT_polygon_offset_clamp ---------------------- */ - -#ifndef GL_EXT_polygon_offset_clamp -#define GL_EXT_polygon_offset_clamp 1 - -#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B - -typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); - -#define glPolygonOffsetClampEXT GLEW_GET_FUN(__glewPolygonOffsetClampEXT) - -#define GLEW_EXT_polygon_offset_clamp GLEW_GET_VAR(__GLEW_EXT_polygon_offset_clamp) - -#endif /* GL_EXT_polygon_offset_clamp */ - -/* ----------------------- GL_EXT_post_depth_coverage ---------------------- */ - -#ifndef GL_EXT_post_depth_coverage -#define GL_EXT_post_depth_coverage 1 - -#define GLEW_EXT_post_depth_coverage GLEW_GET_VAR(__GLEW_EXT_post_depth_coverage) - -#endif /* GL_EXT_post_depth_coverage */ - -/* ------------------------ GL_EXT_provoking_vertex ------------------------ */ - -#ifndef GL_EXT_provoking_vertex -#define GL_EXT_provoking_vertex 1 - -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C -#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D -#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E -#define GL_PROVOKING_VERTEX_EXT 0x8E4F - -typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); - -#define glProvokingVertexEXT GLEW_GET_FUN(__glewProvokingVertexEXT) - -#define GLEW_EXT_provoking_vertex GLEW_GET_VAR(__GLEW_EXT_provoking_vertex) - -#endif /* GL_EXT_provoking_vertex */ - -/* --------------------------- GL_EXT_pvrtc_sRGB --------------------------- */ - -#ifndef GL_EXT_pvrtc_sRGB -#define GL_EXT_pvrtc_sRGB 1 - -#define GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT 0x8A54 -#define GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT 0x8A55 -#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT 0x8A56 -#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT 0x8A57 - -#define GLEW_EXT_pvrtc_sRGB GLEW_GET_VAR(__GLEW_EXT_pvrtc_sRGB) - -#endif /* GL_EXT_pvrtc_sRGB */ - -/* ----------------------- GL_EXT_raster_multisample ----------------------- */ - -#ifndef GL_EXT_raster_multisample -#define GL_EXT_raster_multisample 1 - -#define GL_COLOR_SAMPLES_NV 0x8E20 -#define GL_RASTER_MULTISAMPLE_EXT 0x9327 -#define GL_RASTER_SAMPLES_EXT 0x9328 -#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 -#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A -#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B -#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C -#define GL_DEPTH_SAMPLES_NV 0x932D -#define GL_STENCIL_SAMPLES_NV 0x932E -#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F -#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 -#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 -#define GL_COVERAGE_MODULATION_NV 0x9332 -#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 - -typedef void (GLAPIENTRY * PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components); -typedef void (GLAPIENTRY * PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufsize, GLfloat* v); -typedef void (GLAPIENTRY * PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); - -#define glCoverageModulationNV GLEW_GET_FUN(__glewCoverageModulationNV) -#define glCoverageModulationTableNV GLEW_GET_FUN(__glewCoverageModulationTableNV) -#define glGetCoverageModulationTableNV GLEW_GET_FUN(__glewGetCoverageModulationTableNV) -#define glRasterSamplesEXT GLEW_GET_FUN(__glewRasterSamplesEXT) - -#define GLEW_EXT_raster_multisample GLEW_GET_VAR(__GLEW_EXT_raster_multisample) - -#endif /* GL_EXT_raster_multisample */ - -/* ------------------------ GL_EXT_read_format_bgra ------------------------ */ - -#ifndef GL_EXT_read_format_bgra -#define GL_EXT_read_format_bgra 1 - -#define GL_BGRA_EXT 0x80E1 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 - -#define GLEW_EXT_read_format_bgra GLEW_GET_VAR(__GLEW_EXT_read_format_bgra) - -#endif /* GL_EXT_read_format_bgra */ - -/* -------------------------- GL_EXT_render_snorm -------------------------- */ - -#ifndef GL_EXT_render_snorm -#define GL_EXT_render_snorm 1 - -#define GL_BYTE 0x1400 -#define GL_SHORT 0x1402 -#define GL_R8_SNORM 0x8F94 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGBA8_SNORM 0x8F97 -#define GL_R16_SNORM_EXT 0x8F98 -#define GL_RG16_SNORM_EXT 0x8F99 -#define GL_RGBA16_SNORM_EXT 0x8F9B - -#define GLEW_EXT_render_snorm GLEW_GET_VAR(__GLEW_EXT_render_snorm) - -#endif /* GL_EXT_render_snorm */ - -/* ------------------------- GL_EXT_rescale_normal ------------------------- */ - -#ifndef GL_EXT_rescale_normal -#define GL_EXT_rescale_normal 1 - -#define GL_RESCALE_NORMAL_EXT 0x803A - -#define GLEW_EXT_rescale_normal GLEW_GET_VAR(__GLEW_EXT_rescale_normal) - -#endif /* GL_EXT_rescale_normal */ - -/* ------------------------------ GL_EXT_sRGB ------------------------------ */ - -#ifndef GL_EXT_sRGB -#define GL_EXT_sRGB 1 - -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 -#define GL_SRGB_EXT 0x8C40 -#define GL_SRGB_ALPHA_EXT 0x8C42 -#define GL_SRGB8_ALPHA8_EXT 0x8C43 - -#define GLEW_EXT_sRGB GLEW_GET_VAR(__GLEW_EXT_sRGB) - -#endif /* GL_EXT_sRGB */ - -/* ----------------------- GL_EXT_sRGB_write_control ----------------------- */ - -#ifndef GL_EXT_sRGB_write_control -#define GL_EXT_sRGB_write_control 1 - -#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 - -#define GLEW_EXT_sRGB_write_control GLEW_GET_VAR(__GLEW_EXT_sRGB_write_control) - -#endif /* GL_EXT_sRGB_write_control */ - -/* -------------------------- GL_EXT_scene_marker -------------------------- */ - -#ifndef GL_EXT_scene_marker -#define GL_EXT_scene_marker 1 - -typedef void (GLAPIENTRY * PFNGLBEGINSCENEEXTPROC) (void); -typedef void (GLAPIENTRY * PFNGLENDSCENEEXTPROC) (void); - -#define glBeginSceneEXT GLEW_GET_FUN(__glewBeginSceneEXT) -#define glEndSceneEXT GLEW_GET_FUN(__glewEndSceneEXT) - -#define GLEW_EXT_scene_marker GLEW_GET_VAR(__GLEW_EXT_scene_marker) - -#endif /* GL_EXT_scene_marker */ - -/* ------------------------- GL_EXT_secondary_color ------------------------ */ - -#ifndef GL_EXT_secondary_color -#define GL_EXT_secondary_color 1 - -#define GL_COLOR_SUM_EXT 0x8458 -#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D -#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E - -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); - -#define glSecondaryColor3bEXT GLEW_GET_FUN(__glewSecondaryColor3bEXT) -#define glSecondaryColor3bvEXT GLEW_GET_FUN(__glewSecondaryColor3bvEXT) -#define glSecondaryColor3dEXT GLEW_GET_FUN(__glewSecondaryColor3dEXT) -#define glSecondaryColor3dvEXT GLEW_GET_FUN(__glewSecondaryColor3dvEXT) -#define glSecondaryColor3fEXT GLEW_GET_FUN(__glewSecondaryColor3fEXT) -#define glSecondaryColor3fvEXT GLEW_GET_FUN(__glewSecondaryColor3fvEXT) -#define glSecondaryColor3iEXT GLEW_GET_FUN(__glewSecondaryColor3iEXT) -#define glSecondaryColor3ivEXT GLEW_GET_FUN(__glewSecondaryColor3ivEXT) -#define glSecondaryColor3sEXT GLEW_GET_FUN(__glewSecondaryColor3sEXT) -#define glSecondaryColor3svEXT GLEW_GET_FUN(__glewSecondaryColor3svEXT) -#define glSecondaryColor3ubEXT GLEW_GET_FUN(__glewSecondaryColor3ubEXT) -#define glSecondaryColor3ubvEXT GLEW_GET_FUN(__glewSecondaryColor3ubvEXT) -#define glSecondaryColor3uiEXT GLEW_GET_FUN(__glewSecondaryColor3uiEXT) -#define glSecondaryColor3uivEXT GLEW_GET_FUN(__glewSecondaryColor3uivEXT) -#define glSecondaryColor3usEXT GLEW_GET_FUN(__glewSecondaryColor3usEXT) -#define glSecondaryColor3usvEXT GLEW_GET_FUN(__glewSecondaryColor3usvEXT) -#define glSecondaryColorPointerEXT GLEW_GET_FUN(__glewSecondaryColorPointerEXT) - -#define GLEW_EXT_secondary_color GLEW_GET_VAR(__GLEW_EXT_secondary_color) - -#endif /* GL_EXT_secondary_color */ - -/* ---------------------------- GL_EXT_semaphore --------------------------- */ - -#ifndef GL_EXT_semaphore -#define GL_EXT_semaphore 1 - -typedef void (GLAPIENTRY * PFNGLDELETESEMAPHORESEXTPROC) (GLsizei n, const GLuint* semaphores); -typedef void (GLAPIENTRY * PFNGLGENSEMAPHORESEXTPROC) (GLsizei n, GLuint* semaphores); -typedef void (GLAPIENTRY * PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, GLuint64* params); -typedef GLboolean (GLAPIENTRY * PFNGLISSEMAPHOREEXTPROC) (GLuint semaphore); -typedef void (GLAPIENTRY * PFNGLSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, const GLuint64* params); -typedef void (GLAPIENTRY * PFNGLSIGNALSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint* buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts); -typedef void (GLAPIENTRY * PFNGLWAITSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint* buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts); - -#define glDeleteSemaphoresEXT GLEW_GET_FUN(__glewDeleteSemaphoresEXT) -#define glGenSemaphoresEXT GLEW_GET_FUN(__glewGenSemaphoresEXT) -#define glGetSemaphoreParameterui64vEXT GLEW_GET_FUN(__glewGetSemaphoreParameterui64vEXT) -#define glIsSemaphoreEXT GLEW_GET_FUN(__glewIsSemaphoreEXT) -#define glSemaphoreParameterui64vEXT GLEW_GET_FUN(__glewSemaphoreParameterui64vEXT) -#define glSignalSemaphoreEXT GLEW_GET_FUN(__glewSignalSemaphoreEXT) -#define glWaitSemaphoreEXT GLEW_GET_FUN(__glewWaitSemaphoreEXT) - -#define GLEW_EXT_semaphore GLEW_GET_VAR(__GLEW_EXT_semaphore) - -#endif /* GL_EXT_semaphore */ - -/* -------------------------- GL_EXT_semaphore_fd -------------------------- */ - -#ifndef GL_EXT_semaphore_fd -#define GL_EXT_semaphore_fd 1 - -typedef void (GLAPIENTRY * PFNGLIMPORTSEMAPHOREFDEXTPROC) (GLuint semaphore, GLenum handleType, GLint fd); - -#define glImportSemaphoreFdEXT GLEW_GET_FUN(__glewImportSemaphoreFdEXT) - -#define GLEW_EXT_semaphore_fd GLEW_GET_VAR(__GLEW_EXT_semaphore_fd) - -#endif /* GL_EXT_semaphore_fd */ - -/* ------------------------- GL_EXT_semaphore_win32 ------------------------ */ - -#ifndef GL_EXT_semaphore_win32 -#define GL_EXT_semaphore_win32 1 - -typedef void (GLAPIENTRY * PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC) (GLuint semaphore, GLenum handleType, void *handle); -typedef void (GLAPIENTRY * PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC) (GLuint semaphore, GLenum handleType, const void *name); - -#define glImportSemaphoreWin32HandleEXT GLEW_GET_FUN(__glewImportSemaphoreWin32HandleEXT) -#define glImportSemaphoreWin32NameEXT GLEW_GET_FUN(__glewImportSemaphoreWin32NameEXT) - -#define GLEW_EXT_semaphore_win32 GLEW_GET_VAR(__GLEW_EXT_semaphore_win32) - -#endif /* GL_EXT_semaphore_win32 */ - -/* --------------------- GL_EXT_separate_shader_objects -------------------- */ - -#ifndef GL_EXT_separate_shader_objects -#define GL_EXT_separate_shader_objects 1 - -#define GL_ACTIVE_PROGRAM_EXT 0x8B8D - -typedef void (GLAPIENTRY * PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); -typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar* string); -typedef void (GLAPIENTRY * PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); - -#define glActiveProgramEXT GLEW_GET_FUN(__glewActiveProgramEXT) -#define glCreateShaderProgramEXT GLEW_GET_FUN(__glewCreateShaderProgramEXT) -#define glUseShaderProgramEXT GLEW_GET_FUN(__glewUseShaderProgramEXT) - -#define GLEW_EXT_separate_shader_objects GLEW_GET_VAR(__GLEW_EXT_separate_shader_objects) - -#endif /* GL_EXT_separate_shader_objects */ - -/* --------------------- GL_EXT_separate_specular_color -------------------- */ - -#ifndef GL_EXT_separate_specular_color -#define GL_EXT_separate_specular_color 1 - -#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 -#define GL_SINGLE_COLOR_EXT 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA - -#define GLEW_EXT_separate_specular_color GLEW_GET_VAR(__GLEW_EXT_separate_specular_color) - -#endif /* GL_EXT_separate_specular_color */ - -/* -------------------- GL_EXT_shader_framebuffer_fetch -------------------- */ - -#ifndef GL_EXT_shader_framebuffer_fetch -#define GL_EXT_shader_framebuffer_fetch 1 - -#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 - -#define GLEW_EXT_shader_framebuffer_fetch GLEW_GET_VAR(__GLEW_EXT_shader_framebuffer_fetch) - -#endif /* GL_EXT_shader_framebuffer_fetch */ - -/* ------------------------ GL_EXT_shader_group_vote ----------------------- */ - -#ifndef GL_EXT_shader_group_vote -#define GL_EXT_shader_group_vote 1 - -#define GLEW_EXT_shader_group_vote GLEW_GET_VAR(__GLEW_EXT_shader_group_vote) - -#endif /* GL_EXT_shader_group_vote */ - -/* ------------------- GL_EXT_shader_image_load_formatted ------------------ */ - -#ifndef GL_EXT_shader_image_load_formatted -#define GL_EXT_shader_image_load_formatted 1 - -#define GLEW_EXT_shader_image_load_formatted GLEW_GET_VAR(__GLEW_EXT_shader_image_load_formatted) - -#endif /* GL_EXT_shader_image_load_formatted */ - -/* --------------------- GL_EXT_shader_image_load_store -------------------- */ - -#ifndef GL_EXT_shader_image_load_store -#define GL_EXT_shader_image_load_store 1 - -#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 -#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 -#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 -#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 -#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 -#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 -#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 -#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 -#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 -#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 -#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 -#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 -#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 -#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 -#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A -#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B -#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C -#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D -#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E -#define GL_IMAGE_1D_EXT 0x904C -#define GL_IMAGE_2D_EXT 0x904D -#define GL_IMAGE_3D_EXT 0x904E -#define GL_IMAGE_2D_RECT_EXT 0x904F -#define GL_IMAGE_CUBE_EXT 0x9050 -#define GL_IMAGE_BUFFER_EXT 0x9051 -#define GL_IMAGE_1D_ARRAY_EXT 0x9052 -#define GL_IMAGE_2D_ARRAY_EXT 0x9053 -#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 -#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 -#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 -#define GL_INT_IMAGE_1D_EXT 0x9057 -#define GL_INT_IMAGE_2D_EXT 0x9058 -#define GL_INT_IMAGE_3D_EXT 0x9059 -#define GL_INT_IMAGE_2D_RECT_EXT 0x905A -#define GL_INT_IMAGE_CUBE_EXT 0x905B -#define GL_INT_IMAGE_BUFFER_EXT 0x905C -#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D -#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E -#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F -#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 -#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 -#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 -#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 -#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 -#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 -#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 -#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 -#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 -#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 -#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C -#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D -#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E -#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF - -typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); -typedef void (GLAPIENTRY * PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); - -#define glBindImageTextureEXT GLEW_GET_FUN(__glewBindImageTextureEXT) -#define glMemoryBarrierEXT GLEW_GET_FUN(__glewMemoryBarrierEXT) - -#define GLEW_EXT_shader_image_load_store GLEW_GET_VAR(__GLEW_EXT_shader_image_load_store) - -#endif /* GL_EXT_shader_image_load_store */ - -/* ------------------- GL_EXT_shader_implicit_conversions ------------------ */ - -#ifndef GL_EXT_shader_implicit_conversions -#define GL_EXT_shader_implicit_conversions 1 - -#define GLEW_EXT_shader_implicit_conversions GLEW_GET_VAR(__GLEW_EXT_shader_implicit_conversions) - -#endif /* GL_EXT_shader_implicit_conversions */ - -/* ----------------------- GL_EXT_shader_integer_mix ----------------------- */ - -#ifndef GL_EXT_shader_integer_mix -#define GL_EXT_shader_integer_mix 1 - -#define GLEW_EXT_shader_integer_mix GLEW_GET_VAR(__GLEW_EXT_shader_integer_mix) - -#endif /* GL_EXT_shader_integer_mix */ - -/* ------------------------ GL_EXT_shader_io_blocks ------------------------ */ - -#ifndef GL_EXT_shader_io_blocks -#define GL_EXT_shader_io_blocks 1 - -#define GLEW_EXT_shader_io_blocks GLEW_GET_VAR(__GLEW_EXT_shader_io_blocks) - -#endif /* GL_EXT_shader_io_blocks */ - -/* ------------- GL_EXT_shader_non_constant_global_initializers ------------ */ - -#ifndef GL_EXT_shader_non_constant_global_initializers -#define GL_EXT_shader_non_constant_global_initializers 1 - -#define GLEW_EXT_shader_non_constant_global_initializers GLEW_GET_VAR(__GLEW_EXT_shader_non_constant_global_initializers) - -#endif /* GL_EXT_shader_non_constant_global_initializers */ - -/* ------------------- GL_EXT_shader_pixel_local_storage ------------------- */ - -#ifndef GL_EXT_shader_pixel_local_storage -#define GL_EXT_shader_pixel_local_storage 1 - -#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT 0x8F63 -#define GL_SHADER_PIXEL_LOCAL_STORAGE_EXT 0x8F64 -#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT 0x8F67 - -#define GLEW_EXT_shader_pixel_local_storage GLEW_GET_VAR(__GLEW_EXT_shader_pixel_local_storage) - -#endif /* GL_EXT_shader_pixel_local_storage */ - -/* ------------------- GL_EXT_shader_pixel_local_storage2 ------------------ */ - -#ifndef GL_EXT_shader_pixel_local_storage2 -#define GL_EXT_shader_pixel_local_storage2 1 - -#define GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_FAST_SIZE_EXT 0x9650 -#define GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_SIZE_EXT 0x9651 -#define GL_FRAMEBUFFER_INCOMPLETE_INSUFFICIENT_SHADER_COMBINED_LOCAL_STORAGE_EXT 0x9652 - -typedef void (GLAPIENTRY * PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC) (GLsizei offset, GLsizei n, const GLuint* values); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target, GLsizei size); -typedef GLsizei (GLAPIENTRY * PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target); - -#define glClearPixelLocalStorageuiEXT GLEW_GET_FUN(__glewClearPixelLocalStorageuiEXT) -#define glFramebufferPixelLocalStorageSizeEXT GLEW_GET_FUN(__glewFramebufferPixelLocalStorageSizeEXT) -#define glGetFramebufferPixelLocalStorageSizeEXT GLEW_GET_FUN(__glewGetFramebufferPixelLocalStorageSizeEXT) - -#define GLEW_EXT_shader_pixel_local_storage2 GLEW_GET_VAR(__GLEW_EXT_shader_pixel_local_storage2) - -#endif /* GL_EXT_shader_pixel_local_storage2 */ - -/* ----------------------- GL_EXT_shader_texture_lod ----------------------- */ - -#ifndef GL_EXT_shader_texture_lod -#define GL_EXT_shader_texture_lod 1 - -#define GLEW_EXT_shader_texture_lod GLEW_GET_VAR(__GLEW_EXT_shader_texture_lod) - -#endif /* GL_EXT_shader_texture_lod */ - -/* -------------------------- GL_EXT_shadow_funcs -------------------------- */ - -#ifndef GL_EXT_shadow_funcs -#define GL_EXT_shadow_funcs 1 - -#define GLEW_EXT_shadow_funcs GLEW_GET_VAR(__GLEW_EXT_shadow_funcs) - -#endif /* GL_EXT_shadow_funcs */ - -/* ------------------------- GL_EXT_shadow_samplers ------------------------ */ - -#ifndef GL_EXT_shadow_samplers -#define GL_EXT_shadow_samplers 1 - -#define GL_TEXTURE_COMPARE_MODE_EXT 0x884C -#define GL_TEXTURE_COMPARE_FUNC_EXT 0x884D -#define GL_COMPARE_REF_TO_TEXTURE_EXT 0x884E -#define GL_SAMPLER_2D_SHADOW_EXT 0x8B62 - -#define GLEW_EXT_shadow_samplers GLEW_GET_VAR(__GLEW_EXT_shadow_samplers) - -#endif /* GL_EXT_shadow_samplers */ - -/* --------------------- GL_EXT_shared_texture_palette --------------------- */ - -#ifndef GL_EXT_shared_texture_palette -#define GL_EXT_shared_texture_palette 1 - -#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB - -#define GLEW_EXT_shared_texture_palette GLEW_GET_VAR(__GLEW_EXT_shared_texture_palette) - -#endif /* GL_EXT_shared_texture_palette */ - -/* ------------------------- GL_EXT_sparse_texture ------------------------- */ - -#ifndef GL_EXT_sparse_texture -#define GL_EXT_sparse_texture 1 - -#define GL_TEXTURE_2D 0x0DE1 -#define GL_TEXTURE_3D 0x806F -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_2D_ARRAY 0x8C1A -#define GL_TEXTURE_CUBE_MAP_ARRAY_OES 0x9009 -#define GL_VIRTUAL_PAGE_SIZE_X_EXT 0x9195 -#define GL_VIRTUAL_PAGE_SIZE_Y_EXT 0x9196 -#define GL_VIRTUAL_PAGE_SIZE_Z_EXT 0x9197 -#define GL_MAX_SPARSE_TEXTURE_SIZE_EXT 0x9198 -#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_EXT 0x9199 -#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_EXT 0x919A -#define GL_TEXTURE_SPARSE_EXT 0x91A6 -#define GL_VIRTUAL_PAGE_SIZE_INDEX_EXT 0x91A7 -#define GL_NUM_VIRTUAL_PAGE_SIZES_EXT 0x91A8 -#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_EXT 0x91A9 -#define GL_NUM_SPARSE_LEVELS_EXT 0x91AA - -typedef void (GLAPIENTRY * PFNGLTEXPAGECOMMITMENTEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); -typedef void (GLAPIENTRY * PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); - -#define glTexPageCommitmentEXT GLEW_GET_FUN(__glewTexPageCommitmentEXT) -#define glTexturePageCommitmentEXT GLEW_GET_FUN(__glewTexturePageCommitmentEXT) - -#define GLEW_EXT_sparse_texture GLEW_GET_VAR(__GLEW_EXT_sparse_texture) - -#endif /* GL_EXT_sparse_texture */ - -/* ------------------------- GL_EXT_sparse_texture2 ------------------------ */ - -#ifndef GL_EXT_sparse_texture2 -#define GL_EXT_sparse_texture2 1 - -#define GLEW_EXT_sparse_texture2 GLEW_GET_VAR(__GLEW_EXT_sparse_texture2) - -#endif /* GL_EXT_sparse_texture2 */ - -/* ------------------------ GL_EXT_stencil_clear_tag ----------------------- */ - -#ifndef GL_EXT_stencil_clear_tag -#define GL_EXT_stencil_clear_tag 1 - -#define GL_STENCIL_TAG_BITS_EXT 0x88F2 -#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 - -#define GLEW_EXT_stencil_clear_tag GLEW_GET_VAR(__GLEW_EXT_stencil_clear_tag) - -#endif /* GL_EXT_stencil_clear_tag */ - -/* ------------------------ GL_EXT_stencil_two_side ------------------------ */ - -#ifndef GL_EXT_stencil_two_side -#define GL_EXT_stencil_two_side 1 - -#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 -#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 - -typedef void (GLAPIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); - -#define glActiveStencilFaceEXT GLEW_GET_FUN(__glewActiveStencilFaceEXT) - -#define GLEW_EXT_stencil_two_side GLEW_GET_VAR(__GLEW_EXT_stencil_two_side) - -#endif /* GL_EXT_stencil_two_side */ - -/* -------------------------- GL_EXT_stencil_wrap -------------------------- */ - -#ifndef GL_EXT_stencil_wrap -#define GL_EXT_stencil_wrap 1 - -#define GL_INCR_WRAP_EXT 0x8507 -#define GL_DECR_WRAP_EXT 0x8508 - -#define GLEW_EXT_stencil_wrap GLEW_GET_VAR(__GLEW_EXT_stencil_wrap) - -#endif /* GL_EXT_stencil_wrap */ - -/* --------------------------- GL_EXT_subtexture --------------------------- */ - -#ifndef GL_EXT_subtexture -#define GL_EXT_subtexture 1 - -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); - -#define glTexSubImage1DEXT GLEW_GET_FUN(__glewTexSubImage1DEXT) -#define glTexSubImage2DEXT GLEW_GET_FUN(__glewTexSubImage2DEXT) -#define glTexSubImage3DEXT GLEW_GET_FUN(__glewTexSubImage3DEXT) - -#define GLEW_EXT_subtexture GLEW_GET_VAR(__GLEW_EXT_subtexture) - -#endif /* GL_EXT_subtexture */ - -/* ----------------------------- GL_EXT_texture ---------------------------- */ - -#ifndef GL_EXT_texture -#define GL_EXT_texture 1 - -#define GL_ALPHA4_EXT 0x803B -#define GL_ALPHA8_EXT 0x803C -#define GL_ALPHA12_EXT 0x803D -#define GL_ALPHA16_EXT 0x803E -#define GL_LUMINANCE4_EXT 0x803F -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE12_EXT 0x8041 -#define GL_LUMINANCE16_EXT 0x8042 -#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 -#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 -#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 -#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 -#define GL_INTENSITY_EXT 0x8049 -#define GL_INTENSITY4_EXT 0x804A -#define GL_INTENSITY8_EXT 0x804B -#define GL_INTENSITY12_EXT 0x804C -#define GL_INTENSITY16_EXT 0x804D -#define GL_RGB2_EXT 0x804E -#define GL_RGB4_EXT 0x804F -#define GL_RGB5_EXT 0x8050 -#define GL_RGB8_EXT 0x8051 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB12_EXT 0x8053 -#define GL_RGB16_EXT 0x8054 -#define GL_RGBA2_EXT 0x8055 -#define GL_RGBA4_EXT 0x8056 -#define GL_RGB5_A1_EXT 0x8057 -#define GL_RGBA8_EXT 0x8058 -#define GL_RGB10_A2_EXT 0x8059 -#define GL_RGBA12_EXT 0x805A -#define GL_RGBA16_EXT 0x805B -#define GL_TEXTURE_RED_SIZE_EXT 0x805C -#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D -#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E -#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 -#define GL_REPLACE_EXT 0x8062 -#define GL_PROXY_TEXTURE_1D_EXT 0x8063 -#define GL_PROXY_TEXTURE_2D_EXT 0x8064 - -#define GLEW_EXT_texture GLEW_GET_VAR(__GLEW_EXT_texture) - -#endif /* GL_EXT_texture */ - -/* ---------------------------- GL_EXT_texture3D --------------------------- */ - -#ifndef GL_EXT_texture3D -#define GL_EXT_texture3D 1 - -#define GL_PACK_SKIP_IMAGES_EXT 0x806B -#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C -#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D -#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E -#define GL_TEXTURE_3D_EXT 0x806F -#define GL_PROXY_TEXTURE_3D_EXT 0x8070 -#define GL_TEXTURE_DEPTH_EXT 0x8071 -#define GL_TEXTURE_WRAP_R_EXT 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 - -typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); - -#define glTexImage3DEXT GLEW_GET_FUN(__glewTexImage3DEXT) - -#define GLEW_EXT_texture3D GLEW_GET_VAR(__GLEW_EXT_texture3D) - -#endif /* GL_EXT_texture3D */ - -/* -------------------------- GL_EXT_texture_array ------------------------- */ - -#ifndef GL_EXT_texture_array -#define GL_EXT_texture_array 1 - -#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E -#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF -#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 -#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); - -#define glFramebufferTextureLayerEXT GLEW_GET_FUN(__glewFramebufferTextureLayerEXT) - -#define GLEW_EXT_texture_array GLEW_GET_VAR(__GLEW_EXT_texture_array) - -#endif /* GL_EXT_texture_array */ - -/* ---------------------- GL_EXT_texture_buffer_object --------------------- */ - -#ifndef GL_EXT_texture_buffer_object -#define GL_EXT_texture_buffer_object 1 - -#define GL_TEXTURE_BUFFER_EXT 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E - -typedef void (GLAPIENTRY * PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); - -#define glTexBufferEXT GLEW_GET_FUN(__glewTexBufferEXT) - -#define GLEW_EXT_texture_buffer_object GLEW_GET_VAR(__GLEW_EXT_texture_buffer_object) - -#endif /* GL_EXT_texture_buffer_object */ - -/* -------------- GL_EXT_texture_compression_astc_decode_mode -------------- */ - -#ifndef GL_EXT_texture_compression_astc_decode_mode -#define GL_EXT_texture_compression_astc_decode_mode 1 - -#define GL_TEXTURE_ASTC_DECODE_PRECISION_EXT 0x8F69 - -#define GLEW_EXT_texture_compression_astc_decode_mode GLEW_GET_VAR(__GLEW_EXT_texture_compression_astc_decode_mode) - -#endif /* GL_EXT_texture_compression_astc_decode_mode */ - -/* ----------- GL_EXT_texture_compression_astc_decode_mode_rgb9e5 ---------- */ - -#ifndef GL_EXT_texture_compression_astc_decode_mode_rgb9e5 -#define GL_EXT_texture_compression_astc_decode_mode_rgb9e5 1 - -#define GL_TEXTURE_ASTC_DECODE_PRECISION_EXT 0x8F69 - -#define GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5 GLEW_GET_VAR(__GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5) - -#endif /* GL_EXT_texture_compression_astc_decode_mode_rgb9e5 */ - -/* -------------------- GL_EXT_texture_compression_bptc -------------------- */ - -#ifndef GL_EXT_texture_compression_bptc -#define GL_EXT_texture_compression_bptc 1 - -#define GL_COMPRESSED_RGBA_BPTC_UNORM_EXT 0x8E8C -#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT 0x8E8D -#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT 0x8E8E -#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT 0x8E8F - -#define GLEW_EXT_texture_compression_bptc GLEW_GET_VAR(__GLEW_EXT_texture_compression_bptc) - -#endif /* GL_EXT_texture_compression_bptc */ - -/* -------------------- GL_EXT_texture_compression_dxt1 -------------------- */ - -#ifndef GL_EXT_texture_compression_dxt1 -#define GL_EXT_texture_compression_dxt1 1 - -#define GLEW_EXT_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_EXT_texture_compression_dxt1) - -#endif /* GL_EXT_texture_compression_dxt1 */ - -/* -------------------- GL_EXT_texture_compression_latc -------------------- */ - -#ifndef GL_EXT_texture_compression_latc -#define GL_EXT_texture_compression_latc 1 - -#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 -#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 -#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 -#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 - -#define GLEW_EXT_texture_compression_latc GLEW_GET_VAR(__GLEW_EXT_texture_compression_latc) - -#endif /* GL_EXT_texture_compression_latc */ - -/* -------------------- GL_EXT_texture_compression_rgtc -------------------- */ - -#ifndef GL_EXT_texture_compression_rgtc -#define GL_EXT_texture_compression_rgtc 1 - -#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC -#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD -#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE - -#define GLEW_EXT_texture_compression_rgtc GLEW_GET_VAR(__GLEW_EXT_texture_compression_rgtc) - -#endif /* GL_EXT_texture_compression_rgtc */ - -/* -------------------- GL_EXT_texture_compression_s3tc -------------------- */ - -#ifndef GL_EXT_texture_compression_s3tc -#define GL_EXT_texture_compression_s3tc 1 - -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 - -#define GLEW_EXT_texture_compression_s3tc GLEW_GET_VAR(__GLEW_EXT_texture_compression_s3tc) - -#endif /* GL_EXT_texture_compression_s3tc */ - -/* ------------------------ GL_EXT_texture_cube_map ------------------------ */ - -#ifndef GL_EXT_texture_cube_map -#define GL_EXT_texture_cube_map 1 - -#define GL_NORMAL_MAP_EXT 0x8511 -#define GL_REFLECTION_MAP_EXT 0x8512 -#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C - -#define GLEW_EXT_texture_cube_map GLEW_GET_VAR(__GLEW_EXT_texture_cube_map) - -#endif /* GL_EXT_texture_cube_map */ - -/* --------------------- GL_EXT_texture_cube_map_array --------------------- */ - -#ifndef GL_EXT_texture_cube_map_array -#define GL_EXT_texture_cube_map_array 1 - -#define GL_TEXTURE_CUBE_MAP_ARRAY_EXT 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT 0x900A -#define GL_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900F -#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 -#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F -#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A - -#define GLEW_EXT_texture_cube_map_array GLEW_GET_VAR(__GLEW_EXT_texture_cube_map_array) - -#endif /* GL_EXT_texture_cube_map_array */ - -/* ----------------------- GL_EXT_texture_edge_clamp ----------------------- */ - -#ifndef GL_EXT_texture_edge_clamp -#define GL_EXT_texture_edge_clamp 1 - -#define GL_CLAMP_TO_EDGE_EXT 0x812F - -#define GLEW_EXT_texture_edge_clamp GLEW_GET_VAR(__GLEW_EXT_texture_edge_clamp) - -#endif /* GL_EXT_texture_edge_clamp */ - -/* --------------------------- GL_EXT_texture_env -------------------------- */ - -#ifndef GL_EXT_texture_env -#define GL_EXT_texture_env 1 - -#define GLEW_EXT_texture_env GLEW_GET_VAR(__GLEW_EXT_texture_env) - -#endif /* GL_EXT_texture_env */ - -/* ------------------------- GL_EXT_texture_env_add ------------------------ */ - -#ifndef GL_EXT_texture_env_add -#define GL_EXT_texture_env_add 1 - -#define GLEW_EXT_texture_env_add GLEW_GET_VAR(__GLEW_EXT_texture_env_add) - -#endif /* GL_EXT_texture_env_add */ - -/* ----------------------- GL_EXT_texture_env_combine ---------------------- */ - -#ifndef GL_EXT_texture_env_combine -#define GL_EXT_texture_env_combine 1 - -#define GL_COMBINE_EXT 0x8570 -#define GL_COMBINE_RGB_EXT 0x8571 -#define GL_COMBINE_ALPHA_EXT 0x8572 -#define GL_RGB_SCALE_EXT 0x8573 -#define GL_ADD_SIGNED_EXT 0x8574 -#define GL_INTERPOLATE_EXT 0x8575 -#define GL_CONSTANT_EXT 0x8576 -#define GL_PRIMARY_COLOR_EXT 0x8577 -#define GL_PREVIOUS_EXT 0x8578 -#define GL_SOURCE0_RGB_EXT 0x8580 -#define GL_SOURCE1_RGB_EXT 0x8581 -#define GL_SOURCE2_RGB_EXT 0x8582 -#define GL_SOURCE0_ALPHA_EXT 0x8588 -#define GL_SOURCE1_ALPHA_EXT 0x8589 -#define GL_SOURCE2_ALPHA_EXT 0x858A -#define GL_OPERAND0_RGB_EXT 0x8590 -#define GL_OPERAND1_RGB_EXT 0x8591 -#define GL_OPERAND2_RGB_EXT 0x8592 -#define GL_OPERAND0_ALPHA_EXT 0x8598 -#define GL_OPERAND1_ALPHA_EXT 0x8599 -#define GL_OPERAND2_ALPHA_EXT 0x859A - -#define GLEW_EXT_texture_env_combine GLEW_GET_VAR(__GLEW_EXT_texture_env_combine) - -#endif /* GL_EXT_texture_env_combine */ - -/* ------------------------ GL_EXT_texture_env_dot3 ------------------------ */ - -#ifndef GL_EXT_texture_env_dot3 -#define GL_EXT_texture_env_dot3 1 - -#define GL_DOT3_RGB_EXT 0x8740 -#define GL_DOT3_RGBA_EXT 0x8741 - -#define GLEW_EXT_texture_env_dot3 GLEW_GET_VAR(__GLEW_EXT_texture_env_dot3) - -#endif /* GL_EXT_texture_env_dot3 */ - -/* ------------------- GL_EXT_texture_filter_anisotropic ------------------- */ - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 - -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF - -#define GLEW_EXT_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_EXT_texture_filter_anisotropic) - -#endif /* GL_EXT_texture_filter_anisotropic */ - -/* ---------------------- GL_EXT_texture_filter_minmax --------------------- */ - -#ifndef GL_EXT_texture_filter_minmax -#define GL_EXT_texture_filter_minmax 1 - -#define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366 -#define GL_WEIGHTED_AVERAGE_EXT 0x9367 - -#define GLEW_EXT_texture_filter_minmax GLEW_GET_VAR(__GLEW_EXT_texture_filter_minmax) - -#endif /* GL_EXT_texture_filter_minmax */ - -/* --------------------- GL_EXT_texture_format_BGRA8888 -------------------- */ - -#ifndef GL_EXT_texture_format_BGRA8888 -#define GL_EXT_texture_format_BGRA8888 1 - -#define GL_BGRA_EXT 0x80E1 - -#define GLEW_EXT_texture_format_BGRA8888 GLEW_GET_VAR(__GLEW_EXT_texture_format_BGRA8888) - -#endif /* GL_EXT_texture_format_BGRA8888 */ - -/* ------------------------- GL_EXT_texture_integer ------------------------ */ - -#ifndef GL_EXT_texture_integer -#define GL_EXT_texture_integer 1 - -#define GL_RGBA32UI_EXT 0x8D70 -#define GL_RGB32UI_EXT 0x8D71 -#define GL_ALPHA32UI_EXT 0x8D72 -#define GL_INTENSITY32UI_EXT 0x8D73 -#define GL_LUMINANCE32UI_EXT 0x8D74 -#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 -#define GL_RGBA16UI_EXT 0x8D76 -#define GL_RGB16UI_EXT 0x8D77 -#define GL_ALPHA16UI_EXT 0x8D78 -#define GL_INTENSITY16UI_EXT 0x8D79 -#define GL_LUMINANCE16UI_EXT 0x8D7A -#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B -#define GL_RGBA8UI_EXT 0x8D7C -#define GL_RGB8UI_EXT 0x8D7D -#define GL_ALPHA8UI_EXT 0x8D7E -#define GL_INTENSITY8UI_EXT 0x8D7F -#define GL_LUMINANCE8UI_EXT 0x8D80 -#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 -#define GL_RGBA32I_EXT 0x8D82 -#define GL_RGB32I_EXT 0x8D83 -#define GL_ALPHA32I_EXT 0x8D84 -#define GL_INTENSITY32I_EXT 0x8D85 -#define GL_LUMINANCE32I_EXT 0x8D86 -#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 -#define GL_RGBA16I_EXT 0x8D88 -#define GL_RGB16I_EXT 0x8D89 -#define GL_ALPHA16I_EXT 0x8D8A -#define GL_INTENSITY16I_EXT 0x8D8B -#define GL_LUMINANCE16I_EXT 0x8D8C -#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D -#define GL_RGBA8I_EXT 0x8D8E -#define GL_RGB8I_EXT 0x8D8F -#define GL_ALPHA8I_EXT 0x8D90 -#define GL_INTENSITY8I_EXT 0x8D91 -#define GL_LUMINANCE8I_EXT 0x8D92 -#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 -#define GL_RED_INTEGER_EXT 0x8D94 -#define GL_GREEN_INTEGER_EXT 0x8D95 -#define GL_BLUE_INTEGER_EXT 0x8D96 -#define GL_ALPHA_INTEGER_EXT 0x8D97 -#define GL_RGB_INTEGER_EXT 0x8D98 -#define GL_RGBA_INTEGER_EXT 0x8D99 -#define GL_BGR_INTEGER_EXT 0x8D9A -#define GL_BGRA_INTEGER_EXT 0x8D9B -#define GL_LUMINANCE_INTEGER_EXT 0x8D9C -#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D -#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E - -typedef void (GLAPIENTRY * PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); -typedef void (GLAPIENTRY * PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); - -#define glClearColorIiEXT GLEW_GET_FUN(__glewClearColorIiEXT) -#define glClearColorIuiEXT GLEW_GET_FUN(__glewClearColorIuiEXT) -#define glGetTexParameterIivEXT GLEW_GET_FUN(__glewGetTexParameterIivEXT) -#define glGetTexParameterIuivEXT GLEW_GET_FUN(__glewGetTexParameterIuivEXT) -#define glTexParameterIivEXT GLEW_GET_FUN(__glewTexParameterIivEXT) -#define glTexParameterIuivEXT GLEW_GET_FUN(__glewTexParameterIuivEXT) - -#define GLEW_EXT_texture_integer GLEW_GET_VAR(__GLEW_EXT_texture_integer) - -#endif /* GL_EXT_texture_integer */ - -/* ------------------------ GL_EXT_texture_lod_bias ------------------------ */ - -#ifndef GL_EXT_texture_lod_bias -#define GL_EXT_texture_lod_bias 1 - -#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD -#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 -#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 - -#define GLEW_EXT_texture_lod_bias GLEW_GET_VAR(__GLEW_EXT_texture_lod_bias) - -#endif /* GL_EXT_texture_lod_bias */ - -/* ---------------------- GL_EXT_texture_mirror_clamp ---------------------- */ - -#ifndef GL_EXT_texture_mirror_clamp -#define GL_EXT_texture_mirror_clamp 1 - -#define GL_MIRROR_CLAMP_EXT 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 -#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 - -#define GLEW_EXT_texture_mirror_clamp GLEW_GET_VAR(__GLEW_EXT_texture_mirror_clamp) - -#endif /* GL_EXT_texture_mirror_clamp */ - -/* ------------------------- GL_EXT_texture_norm16 ------------------------- */ - -#ifndef GL_EXT_texture_norm16 -#define GL_EXT_texture_norm16 1 - -#define GL_RGB16_EXT 0x8054 -#define GL_RGBA16_EXT 0x805B -#define GL_R16_EXT 0x822A -#define GL_RG16_EXT 0x822C -#define GL_R16_SNORM_EXT 0x8F98 -#define GL_RG16_SNORM_EXT 0x8F99 -#define GL_RGB16_SNORM_EXT 0x8F9A -#define GL_RGBA16_SNORM_EXT 0x8F9B - -#define GLEW_EXT_texture_norm16 GLEW_GET_VAR(__GLEW_EXT_texture_norm16) - -#endif /* GL_EXT_texture_norm16 */ - -/* ------------------------- GL_EXT_texture_object ------------------------- */ - -#ifndef GL_EXT_texture_object -#define GL_EXT_texture_object 1 - -#define GL_TEXTURE_PRIORITY_EXT 0x8066 -#define GL_TEXTURE_RESIDENT_EXT 0x8067 -#define GL_TEXTURE_1D_BINDING_EXT 0x8068 -#define GL_TEXTURE_2D_BINDING_EXT 0x8069 -#define GL_TEXTURE_3D_BINDING_EXT 0x806A - -typedef GLboolean (GLAPIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint* textures, GLboolean* residences); -typedef void (GLAPIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); -typedef void (GLAPIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint* textures); -typedef void (GLAPIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint* textures); -typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture); -typedef void (GLAPIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint* textures, const GLclampf* priorities); - -#define glAreTexturesResidentEXT GLEW_GET_FUN(__glewAreTexturesResidentEXT) -#define glBindTextureEXT GLEW_GET_FUN(__glewBindTextureEXT) -#define glDeleteTexturesEXT GLEW_GET_FUN(__glewDeleteTexturesEXT) -#define glGenTexturesEXT GLEW_GET_FUN(__glewGenTexturesEXT) -#define glIsTextureEXT GLEW_GET_FUN(__glewIsTextureEXT) -#define glPrioritizeTexturesEXT GLEW_GET_FUN(__glewPrioritizeTexturesEXT) - -#define GLEW_EXT_texture_object GLEW_GET_VAR(__GLEW_EXT_texture_object) - -#endif /* GL_EXT_texture_object */ - -/* --------------------- GL_EXT_texture_perturb_normal --------------------- */ - -#ifndef GL_EXT_texture_perturb_normal -#define GL_EXT_texture_perturb_normal 1 - -#define GL_PERTURB_EXT 0x85AE -#define GL_TEXTURE_NORMAL_EXT 0x85AF - -typedef void (GLAPIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode); - -#define glTextureNormalEXT GLEW_GET_FUN(__glewTextureNormalEXT) - -#define GLEW_EXT_texture_perturb_normal GLEW_GET_VAR(__GLEW_EXT_texture_perturb_normal) - -#endif /* GL_EXT_texture_perturb_normal */ - -/* ------------------------ GL_EXT_texture_rectangle ----------------------- */ - -#ifndef GL_EXT_texture_rectangle -#define GL_EXT_texture_rectangle 1 - -#define GL_TEXTURE_RECTANGLE_EXT 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8 - -#define GLEW_EXT_texture_rectangle GLEW_GET_VAR(__GLEW_EXT_texture_rectangle) - -#endif /* GL_EXT_texture_rectangle */ - -/* --------------------------- GL_EXT_texture_rg --------------------------- */ - -#ifndef GL_EXT_texture_rg -#define GL_EXT_texture_rg 1 - -#define GL_RED_EXT 0x1903 -#define GL_RG_EXT 0x8227 -#define GL_R8_EXT 0x8229 -#define GL_RG8_EXT 0x822B - -#define GLEW_EXT_texture_rg GLEW_GET_VAR(__GLEW_EXT_texture_rg) - -#endif /* GL_EXT_texture_rg */ - -/* -------------------------- GL_EXT_texture_sRGB -------------------------- */ - -#ifndef GL_EXT_texture_sRGB -#define GL_EXT_texture_sRGB 1 - -#define GL_SRGB_EXT 0x8C40 -#define GL_SRGB8_EXT 0x8C41 -#define GL_SRGB_ALPHA_EXT 0x8C42 -#define GL_SRGB8_ALPHA8_EXT 0x8C43 -#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 -#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 -#define GL_SLUMINANCE_EXT 0x8C46 -#define GL_SLUMINANCE8_EXT 0x8C47 -#define GL_COMPRESSED_SRGB_EXT 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 -#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A -#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B -#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F - -#define GLEW_EXT_texture_sRGB GLEW_GET_VAR(__GLEW_EXT_texture_sRGB) - -#endif /* GL_EXT_texture_sRGB */ - -/* ------------------------- GL_EXT_texture_sRGB_R8 ------------------------ */ - -#ifndef GL_EXT_texture_sRGB_R8 -#define GL_EXT_texture_sRGB_R8 1 - -#define GL_SR8_EXT 0x8FBD - -#define GLEW_EXT_texture_sRGB_R8 GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_R8) - -#endif /* GL_EXT_texture_sRGB_R8 */ - -/* ------------------------ GL_EXT_texture_sRGB_RG8 ------------------------ */ - -#ifndef GL_EXT_texture_sRGB_RG8 -#define GL_EXT_texture_sRGB_RG8 1 - -#define GL_SRG8_EXT 0x8FBE - -#define GLEW_EXT_texture_sRGB_RG8 GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_RG8) - -#endif /* GL_EXT_texture_sRGB_RG8 */ - -/* ----------------------- GL_EXT_texture_sRGB_decode ---------------------- */ - -#ifndef GL_EXT_texture_sRGB_decode -#define GL_EXT_texture_sRGB_decode 1 - -#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 -#define GL_DECODE_EXT 0x8A49 -#define GL_SKIP_DECODE_EXT 0x8A4A - -#define GLEW_EXT_texture_sRGB_decode GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_decode) - -#endif /* GL_EXT_texture_sRGB_decode */ - -/* --------------------- GL_EXT_texture_shared_exponent -------------------- */ - -#ifndef GL_EXT_texture_shared_exponent -#define GL_EXT_texture_shared_exponent 1 - -#define GL_RGB9_E5_EXT 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E -#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F - -#define GLEW_EXT_texture_shared_exponent GLEW_GET_VAR(__GLEW_EXT_texture_shared_exponent) - -#endif /* GL_EXT_texture_shared_exponent */ - -/* -------------------------- GL_EXT_texture_snorm ------------------------- */ - -#ifndef GL_EXT_texture_snorm -#define GL_EXT_texture_snorm 1 - -#define GL_RED_SNORM 0x8F90 -#define GL_RG_SNORM 0x8F91 -#define GL_RGB_SNORM 0x8F92 -#define GL_RGBA_SNORM 0x8F93 -#define GL_R8_SNORM 0x8F94 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGB8_SNORM 0x8F96 -#define GL_RGBA8_SNORM 0x8F97 -#define GL_R16_SNORM 0x8F98 -#define GL_RG16_SNORM 0x8F99 -#define GL_RGB16_SNORM 0x8F9A -#define GL_RGBA16_SNORM 0x8F9B -#define GL_SIGNED_NORMALIZED 0x8F9C -#define GL_ALPHA_SNORM 0x9010 -#define GL_LUMINANCE_SNORM 0x9011 -#define GL_LUMINANCE_ALPHA_SNORM 0x9012 -#define GL_INTENSITY_SNORM 0x9013 -#define GL_ALPHA8_SNORM 0x9014 -#define GL_LUMINANCE8_SNORM 0x9015 -#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 -#define GL_INTENSITY8_SNORM 0x9017 -#define GL_ALPHA16_SNORM 0x9018 -#define GL_LUMINANCE16_SNORM 0x9019 -#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A -#define GL_INTENSITY16_SNORM 0x901B - -#define GLEW_EXT_texture_snorm GLEW_GET_VAR(__GLEW_EXT_texture_snorm) - -#endif /* GL_EXT_texture_snorm */ - -/* ------------------------- GL_EXT_texture_storage ------------------------ */ - -#ifndef GL_EXT_texture_storage -#define GL_EXT_texture_storage 1 - -#define GL_ALPHA8_EXT 0x803C -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB10_A2_EXT 0x8059 -#define GL_R8_EXT 0x8229 -#define GL_RG8_EXT 0x822B -#define GL_R16F_EXT 0x822D -#define GL_R32F_EXT 0x822E -#define GL_RG16F_EXT 0x822F -#define GL_RG32F_EXT 0x8230 -#define GL_RGBA32F_EXT 0x8814 -#define GL_RGB32F_EXT 0x8815 -#define GL_ALPHA32F_EXT 0x8816 -#define GL_LUMINANCE32F_EXT 0x8818 -#define GL_LUMINANCE_ALPHA32F_EXT 0x8819 -#define GL_RGBA16F_EXT 0x881A -#define GL_RGB16F_EXT 0x881B -#define GL_ALPHA16F_EXT 0x881C -#define GL_LUMINANCE16F_EXT 0x881E -#define GL_LUMINANCE_ALPHA16F_EXT 0x881F -#define GL_RGB_RAW_422_APPLE 0x8A51 -#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F -#define GL_BGRA8_EXT 0x93A1 - -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); - -#define glTexStorage1DEXT GLEW_GET_FUN(__glewTexStorage1DEXT) -#define glTexStorage2DEXT GLEW_GET_FUN(__glewTexStorage2DEXT) -#define glTexStorage3DEXT GLEW_GET_FUN(__glewTexStorage3DEXT) -#define glTextureStorage1DEXT GLEW_GET_FUN(__glewTextureStorage1DEXT) -#define glTextureStorage2DEXT GLEW_GET_FUN(__glewTextureStorage2DEXT) -#define glTextureStorage3DEXT GLEW_GET_FUN(__glewTextureStorage3DEXT) - -#define GLEW_EXT_texture_storage GLEW_GET_VAR(__GLEW_EXT_texture_storage) - -#endif /* GL_EXT_texture_storage */ - -/* ------------------------- GL_EXT_texture_swizzle ------------------------ */ - -#ifndef GL_EXT_texture_swizzle -#define GL_EXT_texture_swizzle 1 - -#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 -#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 -#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 -#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 - -#define GLEW_EXT_texture_swizzle GLEW_GET_VAR(__GLEW_EXT_texture_swizzle) - -#endif /* GL_EXT_texture_swizzle */ - -/* ------------------- GL_EXT_texture_type_2_10_10_10_REV ------------------ */ - -#ifndef GL_EXT_texture_type_2_10_10_10_REV -#define GL_EXT_texture_type_2_10_10_10_REV 1 - -#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 - -#define GLEW_EXT_texture_type_2_10_10_10_REV GLEW_GET_VAR(__GLEW_EXT_texture_type_2_10_10_10_REV) - -#endif /* GL_EXT_texture_type_2_10_10_10_REV */ - -/* -------------------------- GL_EXT_texture_view -------------------------- */ - -#ifndef GL_EXT_texture_view -#define GL_EXT_texture_view 1 - -#define GL_TEXTURE_VIEW_MIN_LEVEL_EXT 0x82DB -#define GL_TEXTURE_VIEW_NUM_LEVELS_EXT 0x82DC -#define GL_TEXTURE_VIEW_MIN_LAYER_EXT 0x82DD -#define GL_TEXTURE_VIEW_NUM_LAYERS_EXT 0x82DE -#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF - -typedef void (GLAPIENTRY * PFNGLTEXTUREVIEWEXTPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); - -#define glTextureViewEXT GLEW_GET_FUN(__glewTextureViewEXT) - -#define GLEW_EXT_texture_view GLEW_GET_VAR(__GLEW_EXT_texture_view) - -#endif /* GL_EXT_texture_view */ - -/* --------------------------- GL_EXT_timer_query -------------------------- */ - -#ifndef GL_EXT_timer_query -#define GL_EXT_timer_query 1 - -#define GL_TIME_ELAPSED_EXT 0x88BF - -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); -typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); - -#define glGetQueryObjecti64vEXT GLEW_GET_FUN(__glewGetQueryObjecti64vEXT) -#define glGetQueryObjectui64vEXT GLEW_GET_FUN(__glewGetQueryObjectui64vEXT) - -#define GLEW_EXT_timer_query GLEW_GET_VAR(__GLEW_EXT_timer_query) - -#endif /* GL_EXT_timer_query */ - -/* ----------------------- GL_EXT_transform_feedback ----------------------- */ - -#ifndef GL_EXT_transform_feedback -#define GL_EXT_transform_feedback 1 - -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 -#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 -#define GL_RASTERIZER_DISCARD_EXT 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B -#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C -#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F - -typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); -typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar * const* varyings, GLenum bufferMode); - -#define glBeginTransformFeedbackEXT GLEW_GET_FUN(__glewBeginTransformFeedbackEXT) -#define glBindBufferBaseEXT GLEW_GET_FUN(__glewBindBufferBaseEXT) -#define glBindBufferOffsetEXT GLEW_GET_FUN(__glewBindBufferOffsetEXT) -#define glBindBufferRangeEXT GLEW_GET_FUN(__glewBindBufferRangeEXT) -#define glEndTransformFeedbackEXT GLEW_GET_FUN(__glewEndTransformFeedbackEXT) -#define glGetTransformFeedbackVaryingEXT GLEW_GET_FUN(__glewGetTransformFeedbackVaryingEXT) -#define glTransformFeedbackVaryingsEXT GLEW_GET_FUN(__glewTransformFeedbackVaryingsEXT) - -#define GLEW_EXT_transform_feedback GLEW_GET_VAR(__GLEW_EXT_transform_feedback) - -#endif /* GL_EXT_transform_feedback */ - -/* ------------------------- GL_EXT_unpack_subimage ------------------------ */ - -#ifndef GL_EXT_unpack_subimage -#define GL_EXT_unpack_subimage 1 - -#define GL_UNPACK_ROW_LENGTH_EXT 0x0CF2 -#define GL_UNPACK_SKIP_ROWS_EXT 0x0CF3 -#define GL_UNPACK_SKIP_PIXELS_EXT 0x0CF4 - -#define GLEW_EXT_unpack_subimage GLEW_GET_VAR(__GLEW_EXT_unpack_subimage) - -#endif /* GL_EXT_unpack_subimage */ - -/* -------------------------- GL_EXT_vertex_array -------------------------- */ - -#ifndef GL_EXT_vertex_array -#define GL_EXT_vertex_array 1 - -#define GL_DOUBLE_EXT 0x140A -#define GL_VERTEX_ARRAY_EXT 0x8074 -#define GL_NORMAL_ARRAY_EXT 0x8075 -#define GL_COLOR_ARRAY_EXT 0x8076 -#define GL_INDEX_ARRAY_EXT 0x8077 -#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 -#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 -#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A -#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B -#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C -#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D -#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E -#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F -#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 -#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 -#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 -#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 -#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 -#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 -#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 -#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 -#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A -#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B -#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C -#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D -#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E -#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F -#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 -#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 - -typedef void (GLAPIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); -typedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean* pointer); -typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); -typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); -typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); - -#define glArrayElementEXT GLEW_GET_FUN(__glewArrayElementEXT) -#define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT) -#define glDrawArraysEXT GLEW_GET_FUN(__glewDrawArraysEXT) -#define glEdgeFlagPointerEXT GLEW_GET_FUN(__glewEdgeFlagPointerEXT) -#define glIndexPointerEXT GLEW_GET_FUN(__glewIndexPointerEXT) -#define glNormalPointerEXT GLEW_GET_FUN(__glewNormalPointerEXT) -#define glTexCoordPointerEXT GLEW_GET_FUN(__glewTexCoordPointerEXT) -#define glVertexPointerEXT GLEW_GET_FUN(__glewVertexPointerEXT) - -#define GLEW_EXT_vertex_array GLEW_GET_VAR(__GLEW_EXT_vertex_array) - -#endif /* GL_EXT_vertex_array */ - -/* ------------------------ GL_EXT_vertex_array_bgra ----------------------- */ - -#ifndef GL_EXT_vertex_array_bgra -#define GL_EXT_vertex_array_bgra 1 - -#define GL_BGRA 0x80E1 - -#define GLEW_EXT_vertex_array_bgra GLEW_GET_VAR(__GLEW_EXT_vertex_array_bgra) - -#endif /* GL_EXT_vertex_array_bgra */ - -/* ----------------------- GL_EXT_vertex_array_setXXX ---------------------- */ - -#ifndef GL_EXT_vertex_array_setXXX -#define GL_EXT_vertex_array_setXXX 1 - -typedef void (GLAPIENTRY * PFNGLBINDARRAYSETEXTPROC) (const void *arrayset); -typedef const void * (GLAPIENTRY * PFNGLCREATEARRAYSETEXTPROC) (void); -typedef void (GLAPIENTRY * PFNGLDELETEARRAYSETSEXTPROC) (GLsizei n, const void *arrayset[]); - -#define glBindArraySetEXT GLEW_GET_FUN(__glewBindArraySetEXT) -#define glCreateArraySetExt GLEW_GET_FUN(__glewCreateArraySetExt) -#define glDeleteArraySetsEXT GLEW_GET_FUN(__glewDeleteArraySetsEXT) - -#define GLEW_EXT_vertex_array_setXXX GLEW_GET_VAR(__GLEW_EXT_vertex_array_setXXX) - -#endif /* GL_EXT_vertex_array_setXXX */ - -/* ----------------------- GL_EXT_vertex_attrib_64bit ---------------------- */ - -#ifndef GL_EXT_vertex_attrib_64bit -#define GL_EXT_vertex_attrib_64bit 1 - -#define GL_DOUBLE_MAT2_EXT 0x8F46 -#define GL_DOUBLE_MAT3_EXT 0x8F47 -#define GL_DOUBLE_MAT4_EXT 0x8F48 -#define GL_DOUBLE_MAT2x3_EXT 0x8F49 -#define GL_DOUBLE_MAT2x4_EXT 0x8F4A -#define GL_DOUBLE_MAT3x2_EXT 0x8F4B -#define GL_DOUBLE_MAT3x4_EXT 0x8F4C -#define GL_DOUBLE_MAT4x2_EXT 0x8F4D -#define GL_DOUBLE_MAT4x3_EXT 0x8F4E -#define GL_DOUBLE_VEC2_EXT 0x8FFC -#define GL_DOUBLE_VEC3_EXT 0x8FFD -#define GL_DOUBLE_VEC4_EXT 0x8FFE - -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); - -#define glGetVertexAttribLdvEXT GLEW_GET_FUN(__glewGetVertexAttribLdvEXT) -#define glVertexArrayVertexAttribLOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLOffsetEXT) -#define glVertexAttribL1dEXT GLEW_GET_FUN(__glewVertexAttribL1dEXT) -#define glVertexAttribL1dvEXT GLEW_GET_FUN(__glewVertexAttribL1dvEXT) -#define glVertexAttribL2dEXT GLEW_GET_FUN(__glewVertexAttribL2dEXT) -#define glVertexAttribL2dvEXT GLEW_GET_FUN(__glewVertexAttribL2dvEXT) -#define glVertexAttribL3dEXT GLEW_GET_FUN(__glewVertexAttribL3dEXT) -#define glVertexAttribL3dvEXT GLEW_GET_FUN(__glewVertexAttribL3dvEXT) -#define glVertexAttribL4dEXT GLEW_GET_FUN(__glewVertexAttribL4dEXT) -#define glVertexAttribL4dvEXT GLEW_GET_FUN(__glewVertexAttribL4dvEXT) -#define glVertexAttribLPointerEXT GLEW_GET_FUN(__glewVertexAttribLPointerEXT) - -#define GLEW_EXT_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_EXT_vertex_attrib_64bit) - -#endif /* GL_EXT_vertex_attrib_64bit */ - -/* -------------------------- GL_EXT_vertex_shader ------------------------- */ - -#ifndef GL_EXT_vertex_shader -#define GL_EXT_vertex_shader 1 - -#define GL_VERTEX_SHADER_EXT 0x8780 -#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 -#define GL_OP_INDEX_EXT 0x8782 -#define GL_OP_NEGATE_EXT 0x8783 -#define GL_OP_DOT3_EXT 0x8784 -#define GL_OP_DOT4_EXT 0x8785 -#define GL_OP_MUL_EXT 0x8786 -#define GL_OP_ADD_EXT 0x8787 -#define GL_OP_MADD_EXT 0x8788 -#define GL_OP_FRAC_EXT 0x8789 -#define GL_OP_MAX_EXT 0x878A -#define GL_OP_MIN_EXT 0x878B -#define GL_OP_SET_GE_EXT 0x878C -#define GL_OP_SET_LT_EXT 0x878D -#define GL_OP_CLAMP_EXT 0x878E -#define GL_OP_FLOOR_EXT 0x878F -#define GL_OP_ROUND_EXT 0x8790 -#define GL_OP_EXP_BASE_2_EXT 0x8791 -#define GL_OP_LOG_BASE_2_EXT 0x8792 -#define GL_OP_POWER_EXT 0x8793 -#define GL_OP_RECIP_EXT 0x8794 -#define GL_OP_RECIP_SQRT_EXT 0x8795 -#define GL_OP_SUB_EXT 0x8796 -#define GL_OP_CROSS_PRODUCT_EXT 0x8797 -#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 -#define GL_OP_MOV_EXT 0x8799 -#define GL_OUTPUT_VERTEX_EXT 0x879A -#define GL_OUTPUT_COLOR0_EXT 0x879B -#define GL_OUTPUT_COLOR1_EXT 0x879C -#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D -#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E -#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F -#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 -#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 -#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 -#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 -#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 -#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 -#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 -#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 -#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 -#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 -#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA -#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB -#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC -#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD -#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE -#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF -#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 -#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 -#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 -#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 -#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 -#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 -#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 -#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 -#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 -#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 -#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA -#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB -#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC -#define GL_OUTPUT_FOG_EXT 0x87BD -#define GL_SCALAR_EXT 0x87BE -#define GL_VECTOR_EXT 0x87BF -#define GL_MATRIX_EXT 0x87C0 -#define GL_VARIANT_EXT 0x87C1 -#define GL_INVARIANT_EXT 0x87C2 -#define GL_LOCAL_CONSTANT_EXT 0x87C3 -#define GL_LOCAL_EXT 0x87C4 -#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 -#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 -#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 -#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 -#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE -#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF -#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 -#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 -#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 -#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 -#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 -#define GL_X_EXT 0x87D5 -#define GL_Y_EXT 0x87D6 -#define GL_Z_EXT 0x87D7 -#define GL_W_EXT 0x87D8 -#define GL_NEGATIVE_X_EXT 0x87D9 -#define GL_NEGATIVE_Y_EXT 0x87DA -#define GL_NEGATIVE_Z_EXT 0x87DB -#define GL_NEGATIVE_W_EXT 0x87DC -#define GL_ZERO_EXT 0x87DD -#define GL_ONE_EXT 0x87DE -#define GL_NEGATIVE_ONE_EXT 0x87DF -#define GL_NORMALIZED_RANGE_EXT 0x87E0 -#define GL_FULL_RANGE_EXT 0x87E1 -#define GL_CURRENT_VERTEX_EXT 0x87E2 -#define GL_MVP_MATRIX_EXT 0x87E3 -#define GL_VARIANT_VALUE_EXT 0x87E4 -#define GL_VARIANT_DATATYPE_EXT 0x87E5 -#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 -#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 -#define GL_VARIANT_ARRAY_EXT 0x87E8 -#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 -#define GL_INVARIANT_VALUE_EXT 0x87EA -#define GL_INVARIANT_DATATYPE_EXT 0x87EB -#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC -#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED - -typedef void (GLAPIENTRY * PFNGLBEGINVERTEXSHADEREXTPROC) (void); -typedef GLuint (GLAPIENTRY * PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); -typedef GLuint (GLAPIENTRY * PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); -typedef GLuint (GLAPIENTRY * PFNGLBINDPARAMETEREXTPROC) (GLenum value); -typedef GLuint (GLAPIENTRY * PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); -typedef GLuint (GLAPIENTRY * PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); -typedef void (GLAPIENTRY * PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLENDVERTEXSHADEREXTPROC) (void); -typedef void (GLAPIENTRY * PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef GLuint (GLAPIENTRY * PFNGLGENSYMBOLSEXTPROC) (GLenum dataType, GLenum storageType, GLenum range, GLuint components); -typedef GLuint (GLAPIENTRY * PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); -typedef void (GLAPIENTRY * PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (GLAPIENTRY * PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (GLAPIENTRY * PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (GLAPIENTRY * PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (GLAPIENTRY * PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (GLAPIENTRY * PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (GLAPIENTRY * PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, void **data); -typedef void (GLAPIENTRY * PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef GLboolean (GLAPIENTRY * PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); -typedef void (GLAPIENTRY * PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, void *addr); -typedef void (GLAPIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, void *addr); -typedef void (GLAPIENTRY * PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); -typedef void (GLAPIENTRY * PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); -typedef void (GLAPIENTRY * PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); -typedef void (GLAPIENTRY * PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -typedef void (GLAPIENTRY * PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, void *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTBVEXTPROC) (GLuint id, GLbyte *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTDVEXTPROC) (GLuint id, GLdouble *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTFVEXTPROC) (GLuint id, GLfloat *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTIVEXTPROC) (GLuint id, GLint *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTSVEXTPROC) (GLuint id, GLshort *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTUBVEXTPROC) (GLuint id, GLubyte *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTUIVEXTPROC) (GLuint id, GLuint *addr); -typedef void (GLAPIENTRY * PFNGLVARIANTUSVEXTPROC) (GLuint id, GLushort *addr); -typedef void (GLAPIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); - -#define glBeginVertexShaderEXT GLEW_GET_FUN(__glewBeginVertexShaderEXT) -#define glBindLightParameterEXT GLEW_GET_FUN(__glewBindLightParameterEXT) -#define glBindMaterialParameterEXT GLEW_GET_FUN(__glewBindMaterialParameterEXT) -#define glBindParameterEXT GLEW_GET_FUN(__glewBindParameterEXT) -#define glBindTexGenParameterEXT GLEW_GET_FUN(__glewBindTexGenParameterEXT) -#define glBindTextureUnitParameterEXT GLEW_GET_FUN(__glewBindTextureUnitParameterEXT) -#define glBindVertexShaderEXT GLEW_GET_FUN(__glewBindVertexShaderEXT) -#define glDeleteVertexShaderEXT GLEW_GET_FUN(__glewDeleteVertexShaderEXT) -#define glDisableVariantClientStateEXT GLEW_GET_FUN(__glewDisableVariantClientStateEXT) -#define glEnableVariantClientStateEXT GLEW_GET_FUN(__glewEnableVariantClientStateEXT) -#define glEndVertexShaderEXT GLEW_GET_FUN(__glewEndVertexShaderEXT) -#define glExtractComponentEXT GLEW_GET_FUN(__glewExtractComponentEXT) -#define glGenSymbolsEXT GLEW_GET_FUN(__glewGenSymbolsEXT) -#define glGenVertexShadersEXT GLEW_GET_FUN(__glewGenVertexShadersEXT) -#define glGetInvariantBooleanvEXT GLEW_GET_FUN(__glewGetInvariantBooleanvEXT) -#define glGetInvariantFloatvEXT GLEW_GET_FUN(__glewGetInvariantFloatvEXT) -#define glGetInvariantIntegervEXT GLEW_GET_FUN(__glewGetInvariantIntegervEXT) -#define glGetLocalConstantBooleanvEXT GLEW_GET_FUN(__glewGetLocalConstantBooleanvEXT) -#define glGetLocalConstantFloatvEXT GLEW_GET_FUN(__glewGetLocalConstantFloatvEXT) -#define glGetLocalConstantIntegervEXT GLEW_GET_FUN(__glewGetLocalConstantIntegervEXT) -#define glGetVariantBooleanvEXT GLEW_GET_FUN(__glewGetVariantBooleanvEXT) -#define glGetVariantFloatvEXT GLEW_GET_FUN(__glewGetVariantFloatvEXT) -#define glGetVariantIntegervEXT GLEW_GET_FUN(__glewGetVariantIntegervEXT) -#define glGetVariantPointervEXT GLEW_GET_FUN(__glewGetVariantPointervEXT) -#define glInsertComponentEXT GLEW_GET_FUN(__glewInsertComponentEXT) -#define glIsVariantEnabledEXT GLEW_GET_FUN(__glewIsVariantEnabledEXT) -#define glSetInvariantEXT GLEW_GET_FUN(__glewSetInvariantEXT) -#define glSetLocalConstantEXT GLEW_GET_FUN(__glewSetLocalConstantEXT) -#define glShaderOp1EXT GLEW_GET_FUN(__glewShaderOp1EXT) -#define glShaderOp2EXT GLEW_GET_FUN(__glewShaderOp2EXT) -#define glShaderOp3EXT GLEW_GET_FUN(__glewShaderOp3EXT) -#define glSwizzleEXT GLEW_GET_FUN(__glewSwizzleEXT) -#define glVariantPointerEXT GLEW_GET_FUN(__glewVariantPointerEXT) -#define glVariantbvEXT GLEW_GET_FUN(__glewVariantbvEXT) -#define glVariantdvEXT GLEW_GET_FUN(__glewVariantdvEXT) -#define glVariantfvEXT GLEW_GET_FUN(__glewVariantfvEXT) -#define glVariantivEXT GLEW_GET_FUN(__glewVariantivEXT) -#define glVariantsvEXT GLEW_GET_FUN(__glewVariantsvEXT) -#define glVariantubvEXT GLEW_GET_FUN(__glewVariantubvEXT) -#define glVariantuivEXT GLEW_GET_FUN(__glewVariantuivEXT) -#define glVariantusvEXT GLEW_GET_FUN(__glewVariantusvEXT) -#define glWriteMaskEXT GLEW_GET_FUN(__glewWriteMaskEXT) - -#define GLEW_EXT_vertex_shader GLEW_GET_VAR(__GLEW_EXT_vertex_shader) - -#endif /* GL_EXT_vertex_shader */ - -/* ------------------------ GL_EXT_vertex_weighting ------------------------ */ - -#ifndef GL_EXT_vertex_weighting -#define GL_EXT_vertex_weighting 1 - -#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 -#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 -#define GL_MODELVIEW0_EXT 0x1700 -#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 -#define GL_MODELVIEW1_MATRIX_EXT 0x8506 -#define GL_VERTEX_WEIGHTING_EXT 0x8509 -#define GL_MODELVIEW1_EXT 0x850A -#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B -#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C -#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D -#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E -#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F -#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 - -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (GLfloat* weight); - -#define glVertexWeightPointerEXT GLEW_GET_FUN(__glewVertexWeightPointerEXT) -#define glVertexWeightfEXT GLEW_GET_FUN(__glewVertexWeightfEXT) -#define glVertexWeightfvEXT GLEW_GET_FUN(__glewVertexWeightfvEXT) - -#define GLEW_EXT_vertex_weighting GLEW_GET_VAR(__GLEW_EXT_vertex_weighting) - -#endif /* GL_EXT_vertex_weighting */ - -/* ------------------------ GL_EXT_win32_keyed_mutex ----------------------- */ - -#ifndef GL_EXT_win32_keyed_mutex -#define GL_EXT_win32_keyed_mutex 1 - -typedef GLboolean (GLAPIENTRY * PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key, GLuint timeout); -typedef GLboolean (GLAPIENTRY * PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key); - -#define glAcquireKeyedMutexWin32EXT GLEW_GET_FUN(__glewAcquireKeyedMutexWin32EXT) -#define glReleaseKeyedMutexWin32EXT GLEW_GET_FUN(__glewReleaseKeyedMutexWin32EXT) - -#define GLEW_EXT_win32_keyed_mutex GLEW_GET_VAR(__GLEW_EXT_win32_keyed_mutex) - -#endif /* GL_EXT_win32_keyed_mutex */ - -/* ------------------------ GL_EXT_window_rectangles ----------------------- */ - -#ifndef GL_EXT_window_rectangles -#define GL_EXT_window_rectangles 1 - -#define GL_INCLUSIVE_EXT 0x8F10 -#define GL_EXCLUSIVE_EXT 0x8F11 -#define GL_WINDOW_RECTANGLE_EXT 0x8F12 -#define GL_WINDOW_RECTANGLE_MODE_EXT 0x8F13 -#define GL_MAX_WINDOW_RECTANGLES_EXT 0x8F14 -#define GL_NUM_WINDOW_RECTANGLES_EXT 0x8F15 - -typedef void (GLAPIENTRY * PFNGLWINDOWRECTANGLESEXTPROC) (GLenum mode, GLsizei count, const GLint box[]); - -#define glWindowRectanglesEXT GLEW_GET_FUN(__glewWindowRectanglesEXT) - -#define GLEW_EXT_window_rectangles GLEW_GET_VAR(__GLEW_EXT_window_rectangles) - -#endif /* GL_EXT_window_rectangles */ - -/* ------------------------- GL_EXT_x11_sync_object ------------------------ */ - -#ifndef GL_EXT_x11_sync_object -#define GL_EXT_x11_sync_object 1 - -#define GL_SYNC_X11_FENCE_EXT 0x90E1 - -typedef GLsync (GLAPIENTRY * PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); - -#define glImportSyncEXT GLEW_GET_FUN(__glewImportSyncEXT) - -#define GLEW_EXT_x11_sync_object GLEW_GET_VAR(__GLEW_EXT_x11_sync_object) - -#endif /* GL_EXT_x11_sync_object */ - -/* ---------------------- GL_GREMEDY_frame_terminator ---------------------- */ - -#ifndef GL_GREMEDY_frame_terminator -#define GL_GREMEDY_frame_terminator 1 - -typedef void (GLAPIENTRY * PFNGLFRAMETERMINATORGREMEDYPROC) (void); - -#define glFrameTerminatorGREMEDY GLEW_GET_FUN(__glewFrameTerminatorGREMEDY) - -#define GLEW_GREMEDY_frame_terminator GLEW_GET_VAR(__GLEW_GREMEDY_frame_terminator) - -#endif /* GL_GREMEDY_frame_terminator */ - -/* ------------------------ GL_GREMEDY_string_marker ----------------------- */ - -#ifndef GL_GREMEDY_string_marker -#define GL_GREMEDY_string_marker 1 - -typedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void *string); - -#define glStringMarkerGREMEDY GLEW_GET_FUN(__glewStringMarkerGREMEDY) - -#define GLEW_GREMEDY_string_marker GLEW_GET_VAR(__GLEW_GREMEDY_string_marker) - -#endif /* GL_GREMEDY_string_marker */ - -/* --------------------- GL_HP_convolution_border_modes -------------------- */ - -#ifndef GL_HP_convolution_border_modes -#define GL_HP_convolution_border_modes 1 - -#define GLEW_HP_convolution_border_modes GLEW_GET_VAR(__GLEW_HP_convolution_border_modes) - -#endif /* GL_HP_convolution_border_modes */ - -/* ------------------------- GL_HP_image_transform ------------------------- */ - -#ifndef GL_HP_image_transform -#define GL_HP_image_transform 1 - -typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, const GLfloat param); -typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, const GLint param); -typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); - -#define glGetImageTransformParameterfvHP GLEW_GET_FUN(__glewGetImageTransformParameterfvHP) -#define glGetImageTransformParameterivHP GLEW_GET_FUN(__glewGetImageTransformParameterivHP) -#define glImageTransformParameterfHP GLEW_GET_FUN(__glewImageTransformParameterfHP) -#define glImageTransformParameterfvHP GLEW_GET_FUN(__glewImageTransformParameterfvHP) -#define glImageTransformParameteriHP GLEW_GET_FUN(__glewImageTransformParameteriHP) -#define glImageTransformParameterivHP GLEW_GET_FUN(__glewImageTransformParameterivHP) - -#define GLEW_HP_image_transform GLEW_GET_VAR(__GLEW_HP_image_transform) - -#endif /* GL_HP_image_transform */ - -/* -------------------------- GL_HP_occlusion_test ------------------------- */ - -#ifndef GL_HP_occlusion_test -#define GL_HP_occlusion_test 1 - -#define GLEW_HP_occlusion_test GLEW_GET_VAR(__GLEW_HP_occlusion_test) - -#endif /* GL_HP_occlusion_test */ - -/* ------------------------- GL_HP_texture_lighting ------------------------ */ - -#ifndef GL_HP_texture_lighting -#define GL_HP_texture_lighting 1 - -#define GLEW_HP_texture_lighting GLEW_GET_VAR(__GLEW_HP_texture_lighting) - -#endif /* GL_HP_texture_lighting */ - -/* --------------------------- GL_IBM_cull_vertex -------------------------- */ - -#ifndef GL_IBM_cull_vertex -#define GL_IBM_cull_vertex 1 - -#define GL_CULL_VERTEX_IBM 103050 - -#define GLEW_IBM_cull_vertex GLEW_GET_VAR(__GLEW_IBM_cull_vertex) - -#endif /* GL_IBM_cull_vertex */ - -/* ---------------------- GL_IBM_multimode_draw_arrays --------------------- */ - -#ifndef GL_IBM_multimode_draw_arrays -#define GL_IBM_multimode_draw_arrays 1 - -typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum* mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); -typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum* mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei primcount, GLint modestride); - -#define glMultiModeDrawArraysIBM GLEW_GET_FUN(__glewMultiModeDrawArraysIBM) -#define glMultiModeDrawElementsIBM GLEW_GET_FUN(__glewMultiModeDrawElementsIBM) - -#define GLEW_IBM_multimode_draw_arrays GLEW_GET_VAR(__GLEW_IBM_multimode_draw_arrays) - -#endif /* GL_IBM_multimode_draw_arrays */ - -/* ------------------------- GL_IBM_rasterpos_clip ------------------------- */ - -#ifndef GL_IBM_rasterpos_clip -#define GL_IBM_rasterpos_clip 1 - -#define GL_RASTER_POSITION_UNCLIPPED_IBM 103010 - -#define GLEW_IBM_rasterpos_clip GLEW_GET_VAR(__GLEW_IBM_rasterpos_clip) - -#endif /* GL_IBM_rasterpos_clip */ - -/* --------------------------- GL_IBM_static_data -------------------------- */ - -#ifndef GL_IBM_static_data -#define GL_IBM_static_data 1 - -#define GL_ALL_STATIC_DATA_IBM 103060 -#define GL_STATIC_VERTEX_ARRAY_IBM 103061 - -#define GLEW_IBM_static_data GLEW_GET_VAR(__GLEW_IBM_static_data) - -#endif /* GL_IBM_static_data */ - -/* --------------------- GL_IBM_texture_mirrored_repeat -------------------- */ - -#ifndef GL_IBM_texture_mirrored_repeat -#define GL_IBM_texture_mirrored_repeat 1 - -#define GL_MIRRORED_REPEAT_IBM 0x8370 - -#define GLEW_IBM_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_IBM_texture_mirrored_repeat) - -#endif /* GL_IBM_texture_mirrored_repeat */ - -/* ----------------------- GL_IBM_vertex_array_lists ----------------------- */ - -#ifndef GL_IBM_vertex_array_lists -#define GL_IBM_vertex_array_lists 1 - -#define GL_VERTEX_ARRAY_LIST_IBM 103070 -#define GL_NORMAL_ARRAY_LIST_IBM 103071 -#define GL_COLOR_ARRAY_LIST_IBM 103072 -#define GL_INDEX_ARRAY_LIST_IBM 103073 -#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 -#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 -#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 -#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 -#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 -#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 -#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 -#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 -#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 -#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 -#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 -#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 - -typedef void (GLAPIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean ** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); -typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); - -#define glColorPointerListIBM GLEW_GET_FUN(__glewColorPointerListIBM) -#define glEdgeFlagPointerListIBM GLEW_GET_FUN(__glewEdgeFlagPointerListIBM) -#define glFogCoordPointerListIBM GLEW_GET_FUN(__glewFogCoordPointerListIBM) -#define glIndexPointerListIBM GLEW_GET_FUN(__glewIndexPointerListIBM) -#define glNormalPointerListIBM GLEW_GET_FUN(__glewNormalPointerListIBM) -#define glSecondaryColorPointerListIBM GLEW_GET_FUN(__glewSecondaryColorPointerListIBM) -#define glTexCoordPointerListIBM GLEW_GET_FUN(__glewTexCoordPointerListIBM) -#define glVertexPointerListIBM GLEW_GET_FUN(__glewVertexPointerListIBM) - -#define GLEW_IBM_vertex_array_lists GLEW_GET_VAR(__GLEW_IBM_vertex_array_lists) - -#endif /* GL_IBM_vertex_array_lists */ - -/* -------------------------- GL_INGR_color_clamp -------------------------- */ - -#ifndef GL_INGR_color_clamp -#define GL_INGR_color_clamp 1 - -#define GL_RED_MIN_CLAMP_INGR 0x8560 -#define GL_GREEN_MIN_CLAMP_INGR 0x8561 -#define GL_BLUE_MIN_CLAMP_INGR 0x8562 -#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 -#define GL_RED_MAX_CLAMP_INGR 0x8564 -#define GL_GREEN_MAX_CLAMP_INGR 0x8565 -#define GL_BLUE_MAX_CLAMP_INGR 0x8566 -#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 - -#define GLEW_INGR_color_clamp GLEW_GET_VAR(__GLEW_INGR_color_clamp) - -#endif /* GL_INGR_color_clamp */ - -/* ------------------------- GL_INGR_interlace_read ------------------------ */ - -#ifndef GL_INGR_interlace_read -#define GL_INGR_interlace_read 1 - -#define GL_INTERLACE_READ_INGR 0x8568 - -#define GLEW_INGR_interlace_read GLEW_GET_VAR(__GLEW_INGR_interlace_read) - -#endif /* GL_INGR_interlace_read */ - -/* ------------------ GL_INTEL_conservative_rasterization ------------------ */ - -#ifndef GL_INTEL_conservative_rasterization -#define GL_INTEL_conservative_rasterization 1 - -#define GL_CONSERVATIVE_RASTERIZATION_INTEL 0x83FE - -#define GLEW_INTEL_conservative_rasterization GLEW_GET_VAR(__GLEW_INTEL_conservative_rasterization) - -#endif /* GL_INTEL_conservative_rasterization */ - -/* ------------------- GL_INTEL_fragment_shader_ordering ------------------- */ - -#ifndef GL_INTEL_fragment_shader_ordering -#define GL_INTEL_fragment_shader_ordering 1 - -#define GLEW_INTEL_fragment_shader_ordering GLEW_GET_VAR(__GLEW_INTEL_fragment_shader_ordering) - -#endif /* GL_INTEL_fragment_shader_ordering */ - -/* ----------------------- GL_INTEL_framebuffer_CMAA ----------------------- */ - -#ifndef GL_INTEL_framebuffer_CMAA -#define GL_INTEL_framebuffer_CMAA 1 - -#define GLEW_INTEL_framebuffer_CMAA GLEW_GET_VAR(__GLEW_INTEL_framebuffer_CMAA) - -#endif /* GL_INTEL_framebuffer_CMAA */ - -/* -------------------------- GL_INTEL_map_texture ------------------------- */ - -#ifndef GL_INTEL_map_texture -#define GL_INTEL_map_texture 1 - -#define GL_LAYOUT_DEFAULT_INTEL 0 -#define GL_LAYOUT_LINEAR_INTEL 1 -#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 -#define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF - -typedef void * (GLAPIENTRY * PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint* stride, GLenum *layout); -typedef void (GLAPIENTRY * PFNGLSYNCTEXTUREINTELPROC) (GLuint texture); -typedef void (GLAPIENTRY * PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level); - -#define glMapTexture2DINTEL GLEW_GET_FUN(__glewMapTexture2DINTEL) -#define glSyncTextureINTEL GLEW_GET_FUN(__glewSyncTextureINTEL) -#define glUnmapTexture2DINTEL GLEW_GET_FUN(__glewUnmapTexture2DINTEL) - -#define GLEW_INTEL_map_texture GLEW_GET_VAR(__GLEW_INTEL_map_texture) - -#endif /* GL_INTEL_map_texture */ - -/* ------------------------ GL_INTEL_parallel_arrays ----------------------- */ - -#ifndef GL_INTEL_parallel_arrays -#define GL_INTEL_parallel_arrays 1 - -#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 -#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 -#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 -#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 -#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 - -typedef void (GLAPIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); -typedef void (GLAPIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void** pointer); -typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); - -#define glColorPointervINTEL GLEW_GET_FUN(__glewColorPointervINTEL) -#define glNormalPointervINTEL GLEW_GET_FUN(__glewNormalPointervINTEL) -#define glTexCoordPointervINTEL GLEW_GET_FUN(__glewTexCoordPointervINTEL) -#define glVertexPointervINTEL GLEW_GET_FUN(__glewVertexPointervINTEL) - -#define GLEW_INTEL_parallel_arrays GLEW_GET_VAR(__GLEW_INTEL_parallel_arrays) - -#endif /* GL_INTEL_parallel_arrays */ - -/* ----------------------- GL_INTEL_performance_query ---------------------- */ - -#ifndef GL_INTEL_performance_query -#define GL_INTEL_performance_query 1 - -#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x0000 -#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x0001 -#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 -#define GL_PERFQUERY_FLUSH_INTEL 0x83FA -#define GL_PERFQUERY_WAIT_INTEL 0x83FB -#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 -#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 -#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 -#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 -#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 -#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 -#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 -#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 -#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA -#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB -#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC -#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD -#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE -#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF -#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 - -typedef void (GLAPIENTRY * PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); -typedef void (GLAPIENTRY * PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint* queryHandle); -typedef void (GLAPIENTRY * PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); -typedef void (GLAPIENTRY * PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); -typedef void (GLAPIENTRY * PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint* queryId); -typedef void (GLAPIENTRY * PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint* nextQueryId); -typedef void (GLAPIENTRY * PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar* counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); -typedef void (GLAPIENTRY * PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); -typedef void (GLAPIENTRY * PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar* queryName, GLuint *queryId); -typedef void (GLAPIENTRY * PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar* queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); - -#define glBeginPerfQueryINTEL GLEW_GET_FUN(__glewBeginPerfQueryINTEL) -#define glCreatePerfQueryINTEL GLEW_GET_FUN(__glewCreatePerfQueryINTEL) -#define glDeletePerfQueryINTEL GLEW_GET_FUN(__glewDeletePerfQueryINTEL) -#define glEndPerfQueryINTEL GLEW_GET_FUN(__glewEndPerfQueryINTEL) -#define glGetFirstPerfQueryIdINTEL GLEW_GET_FUN(__glewGetFirstPerfQueryIdINTEL) -#define glGetNextPerfQueryIdINTEL GLEW_GET_FUN(__glewGetNextPerfQueryIdINTEL) -#define glGetPerfCounterInfoINTEL GLEW_GET_FUN(__glewGetPerfCounterInfoINTEL) -#define glGetPerfQueryDataINTEL GLEW_GET_FUN(__glewGetPerfQueryDataINTEL) -#define glGetPerfQueryIdByNameINTEL GLEW_GET_FUN(__glewGetPerfQueryIdByNameINTEL) -#define glGetPerfQueryInfoINTEL GLEW_GET_FUN(__glewGetPerfQueryInfoINTEL) - -#define GLEW_INTEL_performance_query GLEW_GET_VAR(__GLEW_INTEL_performance_query) - -#endif /* GL_INTEL_performance_query */ - -/* ------------------------ GL_INTEL_texture_scissor ----------------------- */ - -#ifndef GL_INTEL_texture_scissor -#define GL_INTEL_texture_scissor 1 - -typedef void (GLAPIENTRY * PFNGLTEXSCISSORFUNCINTELPROC) (GLenum target, GLenum lfunc, GLenum hfunc); -typedef void (GLAPIENTRY * PFNGLTEXSCISSORINTELPROC) (GLenum target, GLclampf tlow, GLclampf thigh); - -#define glTexScissorFuncINTEL GLEW_GET_FUN(__glewTexScissorFuncINTEL) -#define glTexScissorINTEL GLEW_GET_FUN(__glewTexScissorINTEL) - -#define GLEW_INTEL_texture_scissor GLEW_GET_VAR(__GLEW_INTEL_texture_scissor) - -#endif /* GL_INTEL_texture_scissor */ - -/* --------------------- GL_KHR_blend_equation_advanced -------------------- */ - -#ifndef GL_KHR_blend_equation_advanced -#define GL_KHR_blend_equation_advanced 1 - -#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 -#define GL_MULTIPLY_KHR 0x9294 -#define GL_SCREEN_KHR 0x9295 -#define GL_OVERLAY_KHR 0x9296 -#define GL_DARKEN_KHR 0x9297 -#define GL_LIGHTEN_KHR 0x9298 -#define GL_COLORDODGE_KHR 0x9299 -#define GL_COLORBURN_KHR 0x929A -#define GL_HARDLIGHT_KHR 0x929B -#define GL_SOFTLIGHT_KHR 0x929C -#define GL_DIFFERENCE_KHR 0x929E -#define GL_EXCLUSION_KHR 0x92A0 -#define GL_HSL_HUE_KHR 0x92AD -#define GL_HSL_SATURATION_KHR 0x92AE -#define GL_HSL_COLOR_KHR 0x92AF -#define GL_HSL_LUMINOSITY_KHR 0x92B0 - -typedef void (GLAPIENTRY * PFNGLBLENDBARRIERKHRPROC) (void); - -#define glBlendBarrierKHR GLEW_GET_FUN(__glewBlendBarrierKHR) - -#define GLEW_KHR_blend_equation_advanced GLEW_GET_VAR(__GLEW_KHR_blend_equation_advanced) - -#endif /* GL_KHR_blend_equation_advanced */ - -/* ---------------- GL_KHR_blend_equation_advanced_coherent ---------------- */ - -#ifndef GL_KHR_blend_equation_advanced_coherent -#define GL_KHR_blend_equation_advanced_coherent 1 - -#define GLEW_KHR_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_KHR_blend_equation_advanced_coherent) - -#endif /* GL_KHR_blend_equation_advanced_coherent */ - -/* ---------------------- GL_KHR_context_flush_control --------------------- */ - -#ifndef GL_KHR_context_flush_control -#define GL_KHR_context_flush_control 1 - -#define GLEW_KHR_context_flush_control GLEW_GET_VAR(__GLEW_KHR_context_flush_control) - -#endif /* GL_KHR_context_flush_control */ - -/* ------------------------------ GL_KHR_debug ----------------------------- */ - -#ifndef GL_KHR_debug -#define GL_KHR_debug 1 - -#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 -#define GL_STACK_OVERFLOW 0x0503 -#define GL_STACK_UNDERFLOW 0x0504 -#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 -#define GL_DEBUG_SOURCE_API 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION 0x824A -#define GL_DEBUG_SOURCE_OTHER 0x824B -#define GL_DEBUG_TYPE_ERROR 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E -#define GL_DEBUG_TYPE_PORTABILITY 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 -#define GL_DEBUG_TYPE_OTHER 0x8251 -#define GL_DEBUG_TYPE_MARKER 0x8268 -#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 -#define GL_DEBUG_TYPE_POP_GROUP 0x826A -#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B -#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C -#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D -#define GL_BUFFER 0x82E0 -#define GL_SHADER 0x82E1 -#define GL_PROGRAM 0x82E2 -#define GL_QUERY 0x82E3 -#define GL_PROGRAM_PIPELINE 0x82E4 -#define GL_SAMPLER 0x82E6 -#define GL_DISPLAY_LIST 0x82E7 -#define GL_MAX_LABEL_LENGTH 0x82E8 -#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES 0x9145 -#define GL_DEBUG_SEVERITY_HIGH 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 -#define GL_DEBUG_SEVERITY_LOW 0x9148 -#define GL_DEBUG_OUTPUT 0x92E0 - -typedef void (GLAPIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); - -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); -typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); -typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar *label); -typedef void (GLAPIENTRY * PFNGLGETOBJECTPTRLABELPROC) (void* ptr, GLsizei bufSize, GLsizei* length, GLchar *label); -typedef void (GLAPIENTRY * PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar* label); -typedef void (GLAPIENTRY * PFNGLOBJECTPTRLABELPROC) (void* ptr, GLsizei length, const GLchar* label); -typedef void (GLAPIENTRY * PFNGLPOPDEBUGGROUPPROC) (void); -typedef void (GLAPIENTRY * PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar * message); - -#define glDebugMessageCallback GLEW_GET_FUN(__glewDebugMessageCallback) -#define glDebugMessageControl GLEW_GET_FUN(__glewDebugMessageControl) -#define glDebugMessageInsert GLEW_GET_FUN(__glewDebugMessageInsert) -#define glGetDebugMessageLog GLEW_GET_FUN(__glewGetDebugMessageLog) -#define glGetObjectLabel GLEW_GET_FUN(__glewGetObjectLabel) -#define glGetObjectPtrLabel GLEW_GET_FUN(__glewGetObjectPtrLabel) -#define glObjectLabel GLEW_GET_FUN(__glewObjectLabel) -#define glObjectPtrLabel GLEW_GET_FUN(__glewObjectPtrLabel) -#define glPopDebugGroup GLEW_GET_FUN(__glewPopDebugGroup) -#define glPushDebugGroup GLEW_GET_FUN(__glewPushDebugGroup) - -#define GLEW_KHR_debug GLEW_GET_VAR(__GLEW_KHR_debug) - -#endif /* GL_KHR_debug */ - -/* ---------------------------- GL_KHR_no_error ---------------------------- */ - -#ifndef GL_KHR_no_error -#define GL_KHR_no_error 1 - -#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 - -#define GLEW_KHR_no_error GLEW_GET_VAR(__GLEW_KHR_no_error) - -#endif /* GL_KHR_no_error */ - -/* --------------------- GL_KHR_parallel_shader_compile -------------------- */ - -#ifndef GL_KHR_parallel_shader_compile -#define GL_KHR_parallel_shader_compile 1 - -#define GL_MAX_SHADER_COMPILER_THREADS_KHR 0x91B0 -#define GL_COMPLETION_STATUS_KHR 0x91B1 - -typedef void (GLAPIENTRY * PFNGLMAXSHADERCOMPILERTHREADSKHRPROC) (GLuint count); - -#define glMaxShaderCompilerThreadsKHR GLEW_GET_FUN(__glewMaxShaderCompilerThreadsKHR) - -#define GLEW_KHR_parallel_shader_compile GLEW_GET_VAR(__GLEW_KHR_parallel_shader_compile) - -#endif /* GL_KHR_parallel_shader_compile */ - -/* ------------------ GL_KHR_robust_buffer_access_behavior ----------------- */ - -#ifndef GL_KHR_robust_buffer_access_behavior -#define GL_KHR_robust_buffer_access_behavior 1 - -#define GLEW_KHR_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_KHR_robust_buffer_access_behavior) - -#endif /* GL_KHR_robust_buffer_access_behavior */ - -/* --------------------------- GL_KHR_robustness --------------------------- */ - -#ifndef GL_KHR_robustness -#define GL_KHR_robustness 1 - -#define GL_CONTEXT_LOST 0x0507 -#define GL_LOSE_CONTEXT_ON_RESET 0x8252 -#define GL_GUILTY_CONTEXT_RESET 0x8253 -#define GL_INNOCENT_CONTEXT_RESET 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET 0x8255 -#define GL_RESET_NOTIFICATION_STRATEGY 0x8256 -#define GL_NO_RESET_NOTIFICATION 0x8261 -#define GL_CONTEXT_ROBUST_ACCESS 0x90F3 - -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params); -typedef void (GLAPIENTRY * PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); - -#define glGetnUniformfv GLEW_GET_FUN(__glewGetnUniformfv) -#define glGetnUniformiv GLEW_GET_FUN(__glewGetnUniformiv) -#define glGetnUniformuiv GLEW_GET_FUN(__glewGetnUniformuiv) -#define glReadnPixels GLEW_GET_FUN(__glewReadnPixels) - -#define GLEW_KHR_robustness GLEW_GET_VAR(__GLEW_KHR_robustness) - -#endif /* GL_KHR_robustness */ - -/* ------------------ GL_KHR_texture_compression_astc_hdr ------------------ */ - -#ifndef GL_KHR_texture_compression_astc_hdr -#define GL_KHR_texture_compression_astc_hdr 1 - -#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 -#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 -#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 -#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 -#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 -#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 -#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 -#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 -#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 -#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 -#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA -#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB -#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC -#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD - -#define GLEW_KHR_texture_compression_astc_hdr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_hdr) - -#endif /* GL_KHR_texture_compression_astc_hdr */ - -/* ------------------ GL_KHR_texture_compression_astc_ldr ------------------ */ - -#ifndef GL_KHR_texture_compression_astc_ldr -#define GL_KHR_texture_compression_astc_ldr 1 - -#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 -#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 -#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 -#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 -#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 -#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 -#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 -#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 -#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 -#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 -#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA -#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB -#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC -#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD - -#define GLEW_KHR_texture_compression_astc_ldr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_ldr) - -#endif /* GL_KHR_texture_compression_astc_ldr */ - -/* --------------- GL_KHR_texture_compression_astc_sliced_3d --------------- */ - -#ifndef GL_KHR_texture_compression_astc_sliced_3d -#define GL_KHR_texture_compression_astc_sliced_3d 1 - -#define GLEW_KHR_texture_compression_astc_sliced_3d GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_sliced_3d) - -#endif /* GL_KHR_texture_compression_astc_sliced_3d */ - -/* -------------------------- GL_KTX_buffer_region ------------------------- */ - -#ifndef GL_KTX_buffer_region -#define GL_KTX_buffer_region 1 - -#define GL_KTX_FRONT_REGION 0x0 -#define GL_KTX_BACK_REGION 0x1 -#define GL_KTX_Z_REGION 0x2 -#define GL_KTX_STENCIL_REGION 0x3 - -typedef GLuint (GLAPIENTRY * PFNGLBUFFERREGIONENABLEDPROC) (void); -typedef void (GLAPIENTRY * PFNGLDELETEBUFFERREGIONPROC) (GLenum region); -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height, GLint xDest, GLint yDest); -typedef GLuint (GLAPIENTRY * PFNGLNEWBUFFERREGIONPROC) (GLenum region); -typedef void (GLAPIENTRY * PFNGLREADBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height); - -#define glBufferRegionEnabled GLEW_GET_FUN(__glewBufferRegionEnabled) -#define glDeleteBufferRegion GLEW_GET_FUN(__glewDeleteBufferRegion) -#define glDrawBufferRegion GLEW_GET_FUN(__glewDrawBufferRegion) -#define glNewBufferRegion GLEW_GET_FUN(__glewNewBufferRegion) -#define glReadBufferRegion GLEW_GET_FUN(__glewReadBufferRegion) - -#define GLEW_KTX_buffer_region GLEW_GET_VAR(__GLEW_KTX_buffer_region) - -#endif /* GL_KTX_buffer_region */ - -/* ------------------------- GL_MESAX_texture_stack ------------------------ */ - -#ifndef GL_MESAX_texture_stack -#define GL_MESAX_texture_stack 1 - -#define GL_TEXTURE_1D_STACK_MESAX 0x8759 -#define GL_TEXTURE_2D_STACK_MESAX 0x875A -#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B -#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C -#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D -#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E - -#define GLEW_MESAX_texture_stack GLEW_GET_VAR(__GLEW_MESAX_texture_stack) - -#endif /* GL_MESAX_texture_stack */ - -/* -------------------------- GL_MESA_pack_invert -------------------------- */ - -#ifndef GL_MESA_pack_invert -#define GL_MESA_pack_invert 1 - -#define GL_PACK_INVERT_MESA 0x8758 - -#define GLEW_MESA_pack_invert GLEW_GET_VAR(__GLEW_MESA_pack_invert) - -#endif /* GL_MESA_pack_invert */ - -/* ------------------------- GL_MESA_resize_buffers ------------------------ */ - -#ifndef GL_MESA_resize_buffers -#define GL_MESA_resize_buffers 1 - -typedef void (GLAPIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void); - -#define glResizeBuffersMESA GLEW_GET_FUN(__glewResizeBuffersMESA) - -#define GLEW_MESA_resize_buffers GLEW_GET_VAR(__GLEW_MESA_resize_buffers) - -#endif /* GL_MESA_resize_buffers */ - -/* -------------------- GL_MESA_shader_integer_functions ------------------- */ - -#ifndef GL_MESA_shader_integer_functions -#define GL_MESA_shader_integer_functions 1 - -#define GLEW_MESA_shader_integer_functions GLEW_GET_VAR(__GLEW_MESA_shader_integer_functions) - -#endif /* GL_MESA_shader_integer_functions */ - -/* --------------------------- GL_MESA_window_pos -------------------------- */ - -#ifndef GL_MESA_window_pos -#define GL_MESA_window_pos 1 - -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint* p); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p); - -#define glWindowPos2dMESA GLEW_GET_FUN(__glewWindowPos2dMESA) -#define glWindowPos2dvMESA GLEW_GET_FUN(__glewWindowPos2dvMESA) -#define glWindowPos2fMESA GLEW_GET_FUN(__glewWindowPos2fMESA) -#define glWindowPos2fvMESA GLEW_GET_FUN(__glewWindowPos2fvMESA) -#define glWindowPos2iMESA GLEW_GET_FUN(__glewWindowPos2iMESA) -#define glWindowPos2ivMESA GLEW_GET_FUN(__glewWindowPos2ivMESA) -#define glWindowPos2sMESA GLEW_GET_FUN(__glewWindowPos2sMESA) -#define glWindowPos2svMESA GLEW_GET_FUN(__glewWindowPos2svMESA) -#define glWindowPos3dMESA GLEW_GET_FUN(__glewWindowPos3dMESA) -#define glWindowPos3dvMESA GLEW_GET_FUN(__glewWindowPos3dvMESA) -#define glWindowPos3fMESA GLEW_GET_FUN(__glewWindowPos3fMESA) -#define glWindowPos3fvMESA GLEW_GET_FUN(__glewWindowPos3fvMESA) -#define glWindowPos3iMESA GLEW_GET_FUN(__glewWindowPos3iMESA) -#define glWindowPos3ivMESA GLEW_GET_FUN(__glewWindowPos3ivMESA) -#define glWindowPos3sMESA GLEW_GET_FUN(__glewWindowPos3sMESA) -#define glWindowPos3svMESA GLEW_GET_FUN(__glewWindowPos3svMESA) -#define glWindowPos4dMESA GLEW_GET_FUN(__glewWindowPos4dMESA) -#define glWindowPos4dvMESA GLEW_GET_FUN(__glewWindowPos4dvMESA) -#define glWindowPos4fMESA GLEW_GET_FUN(__glewWindowPos4fMESA) -#define glWindowPos4fvMESA GLEW_GET_FUN(__glewWindowPos4fvMESA) -#define glWindowPos4iMESA GLEW_GET_FUN(__glewWindowPos4iMESA) -#define glWindowPos4ivMESA GLEW_GET_FUN(__glewWindowPos4ivMESA) -#define glWindowPos4sMESA GLEW_GET_FUN(__glewWindowPos4sMESA) -#define glWindowPos4svMESA GLEW_GET_FUN(__glewWindowPos4svMESA) - -#define GLEW_MESA_window_pos GLEW_GET_VAR(__GLEW_MESA_window_pos) - -#endif /* GL_MESA_window_pos */ - -/* ------------------------- GL_MESA_ycbcr_texture ------------------------- */ - -#ifndef GL_MESA_ycbcr_texture -#define GL_MESA_ycbcr_texture 1 - -#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB -#define GL_YCBCR_MESA 0x8757 - -#define GLEW_MESA_ycbcr_texture GLEW_GET_VAR(__GLEW_MESA_ycbcr_texture) - -#endif /* GL_MESA_ycbcr_texture */ - -/* ----------- GL_NVX_blend_equation_advanced_multi_draw_buffers ----------- */ - -#ifndef GL_NVX_blend_equation_advanced_multi_draw_buffers -#define GL_NVX_blend_equation_advanced_multi_draw_buffers 1 - -#define GLEW_NVX_blend_equation_advanced_multi_draw_buffers GLEW_GET_VAR(__GLEW_NVX_blend_equation_advanced_multi_draw_buffers) - -#endif /* GL_NVX_blend_equation_advanced_multi_draw_buffers */ - -/* ----------------------- GL_NVX_conditional_render ----------------------- */ - -#ifndef GL_NVX_conditional_render -#define GL_NVX_conditional_render 1 - -typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVXPROC) (void); - -#define glBeginConditionalRenderNVX GLEW_GET_FUN(__glewBeginConditionalRenderNVX) -#define glEndConditionalRenderNVX GLEW_GET_FUN(__glewEndConditionalRenderNVX) - -#define GLEW_NVX_conditional_render GLEW_GET_VAR(__GLEW_NVX_conditional_render) - -#endif /* GL_NVX_conditional_render */ - -/* ------------------------- GL_NVX_gpu_memory_info ------------------------ */ - -#ifndef GL_NVX_gpu_memory_info -#define GL_NVX_gpu_memory_info 1 - -#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 -#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 -#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 -#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A -#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B - -#define GLEW_NVX_gpu_memory_info GLEW_GET_VAR(__GLEW_NVX_gpu_memory_info) - -#endif /* GL_NVX_gpu_memory_info */ - -/* ---------------------- GL_NVX_linked_gpu_multicast ---------------------- */ - -#ifndef GL_NVX_linked_gpu_multicast -#define GL_NVX_linked_gpu_multicast 1 - -#define GL_LGPU_SEPARATE_STORAGE_BIT_NVX 0x0800 -#define GL_MAX_LGPU_GPUS_NVX 0x92BA - -typedef void (GLAPIENTRY * PFNGLLGPUCOPYIMAGESUBDATANVXPROC) (GLuint sourceGpu, GLbitfield destinationGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srxY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); -typedef void (GLAPIENTRY * PFNGLLGPUINTERLOCKNVXPROC) (void); -typedef void (GLAPIENTRY * PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC) (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); - -#define glLGPUCopyImageSubDataNVX GLEW_GET_FUN(__glewLGPUCopyImageSubDataNVX) -#define glLGPUInterlockNVX GLEW_GET_FUN(__glewLGPUInterlockNVX) -#define glLGPUNamedBufferSubDataNVX GLEW_GET_FUN(__glewLGPUNamedBufferSubDataNVX) - -#define GLEW_NVX_linked_gpu_multicast GLEW_GET_VAR(__GLEW_NVX_linked_gpu_multicast) - -#endif /* GL_NVX_linked_gpu_multicast */ - -/* ------------------------ GL_NV_3dvision_settings ------------------------ */ - -#ifndef GL_NV_3dvision_settings -#define GL_NV_3dvision_settings 1 - -#define GL_3DVISION_STEREO_NV 0x90F4 -#define GL_STEREO_SEPARATION_NV 0x90F5 -#define GL_STEREO_CONVERGENCE_NV 0x90F6 -#define GL_STEREO_CUTOFF_NV 0x90F7 -#define GL_STEREO_PROJECTION_NV 0x90F8 -#define GL_STEREO_PROJECTION_PERSPECTIVE_NV 0x90F9 -#define GL_STEREO_PROJECTION_ORTHO_NV 0x90FA - -typedef void (GLAPIENTRY * PFNGLSTEREOPARAMETERFNVPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLSTEREOPARAMETERINVPROC) (GLenum pname, GLint param); - -#define glStereoParameterfNV GLEW_GET_FUN(__glewStereoParameterfNV) -#define glStereoParameteriNV GLEW_GET_FUN(__glewStereoParameteriNV) - -#define GLEW_NV_3dvision_settings GLEW_GET_VAR(__GLEW_NV_3dvision_settings) - -#endif /* GL_NV_3dvision_settings */ - -/* ------------------- GL_NV_EGL_stream_consumer_external ------------------ */ - -#ifndef GL_NV_EGL_stream_consumer_external -#define GL_NV_EGL_stream_consumer_external 1 - -#define GL_TEXTURE_EXTERNAL_OES 0x8D65 -#define GL_SAMPLER_EXTERNAL_OES 0x8D66 -#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 -#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68 - -#define GLEW_NV_EGL_stream_consumer_external GLEW_GET_VAR(__GLEW_NV_EGL_stream_consumer_external) - -#endif /* GL_NV_EGL_stream_consumer_external */ - -/* ----------------- GL_NV_alpha_to_coverage_dither_control ---------------- */ - -#ifndef GL_NV_alpha_to_coverage_dither_control -#define GL_NV_alpha_to_coverage_dither_control 1 - -#define GL_ALPHA_TO_COVERAGE_DITHER_MODE_NV 0x92BF -#define GL_ALPHA_TO_COVERAGE_DITHER_DEFAULT_NV 0x934D -#define GL_ALPHA_TO_COVERAGE_DITHER_ENABLE_NV 0x934E -#define GL_ALPHA_TO_COVERAGE_DITHER_DISABLE_NV 0x934F - -#define GLEW_NV_alpha_to_coverage_dither_control GLEW_GET_VAR(__GLEW_NV_alpha_to_coverage_dither_control) - -#endif /* GL_NV_alpha_to_coverage_dither_control */ - -/* ------------------------------- GL_NV_bgr ------------------------------- */ - -#ifndef GL_NV_bgr -#define GL_NV_bgr 1 - -#define GL_BGR_NV 0x80E0 - -#define GLEW_NV_bgr GLEW_GET_VAR(__GLEW_NV_bgr) - -#endif /* GL_NV_bgr */ - -/* ------------------- GL_NV_bindless_multi_draw_indirect ------------------ */ - -#ifndef GL_NV_bindless_multi_draw_indirect -#define GL_NV_bindless_multi_draw_indirect 1 - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); - -#define glMultiDrawArraysIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessNV) -#define glMultiDrawElementsIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessNV) - -#define GLEW_NV_bindless_multi_draw_indirect GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect) - -#endif /* GL_NV_bindless_multi_draw_indirect */ - -/* ---------------- GL_NV_bindless_multi_draw_indirect_count --------------- */ - -#ifndef GL_NV_bindless_multi_draw_indirect_count -#define GL_NV_bindless_multi_draw_indirect_count 1 - -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, const void *indirect, GLintptr drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); - -#define glMultiDrawArraysIndirectBindlessCountNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessCountNV) -#define glMultiDrawElementsIndirectBindlessCountNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessCountNV) - -#define GLEW_NV_bindless_multi_draw_indirect_count GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect_count) - -#endif /* GL_NV_bindless_multi_draw_indirect_count */ - -/* ------------------------- GL_NV_bindless_texture ------------------------ */ - -#ifndef GL_NV_bindless_texture -#define GL_NV_bindless_texture 1 - -typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); -typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); -typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); -typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); -typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); -typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); -typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); -typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64* value); - -#define glGetImageHandleNV GLEW_GET_FUN(__glewGetImageHandleNV) -#define glGetTextureHandleNV GLEW_GET_FUN(__glewGetTextureHandleNV) -#define glGetTextureSamplerHandleNV GLEW_GET_FUN(__glewGetTextureSamplerHandleNV) -#define glIsImageHandleResidentNV GLEW_GET_FUN(__glewIsImageHandleResidentNV) -#define glIsTextureHandleResidentNV GLEW_GET_FUN(__glewIsTextureHandleResidentNV) -#define glMakeImageHandleNonResidentNV GLEW_GET_FUN(__glewMakeImageHandleNonResidentNV) -#define glMakeImageHandleResidentNV GLEW_GET_FUN(__glewMakeImageHandleResidentNV) -#define glMakeTextureHandleNonResidentNV GLEW_GET_FUN(__glewMakeTextureHandleNonResidentNV) -#define glMakeTextureHandleResidentNV GLEW_GET_FUN(__glewMakeTextureHandleResidentNV) -#define glProgramUniformHandleui64NV GLEW_GET_FUN(__glewProgramUniformHandleui64NV) -#define glProgramUniformHandleui64vNV GLEW_GET_FUN(__glewProgramUniformHandleui64vNV) -#define glUniformHandleui64NV GLEW_GET_FUN(__glewUniformHandleui64NV) -#define glUniformHandleui64vNV GLEW_GET_FUN(__glewUniformHandleui64vNV) - -#define GLEW_NV_bindless_texture GLEW_GET_VAR(__GLEW_NV_bindless_texture) - -#endif /* GL_NV_bindless_texture */ - -/* --------------------- GL_NV_blend_equation_advanced --------------------- */ - -#ifndef GL_NV_blend_equation_advanced -#define GL_NV_blend_equation_advanced 1 - -#define GL_XOR_NV 0x1506 -#define GL_RED_NV 0x1903 -#define GL_GREEN_NV 0x1904 -#define GL_BLUE_NV 0x1905 -#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 -#define GL_BLEND_OVERLAP_NV 0x9281 -#define GL_UNCORRELATED_NV 0x9282 -#define GL_DISJOINT_NV 0x9283 -#define GL_CONJOINT_NV 0x9284 -#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 -#define GL_SRC_NV 0x9286 -#define GL_DST_NV 0x9287 -#define GL_SRC_OVER_NV 0x9288 -#define GL_DST_OVER_NV 0x9289 -#define GL_SRC_IN_NV 0x928A -#define GL_DST_IN_NV 0x928B -#define GL_SRC_OUT_NV 0x928C -#define GL_DST_OUT_NV 0x928D -#define GL_SRC_ATOP_NV 0x928E -#define GL_DST_ATOP_NV 0x928F -#define GL_PLUS_NV 0x9291 -#define GL_PLUS_DARKER_NV 0x9292 -#define GL_MULTIPLY_NV 0x9294 -#define GL_SCREEN_NV 0x9295 -#define GL_OVERLAY_NV 0x9296 -#define GL_DARKEN_NV 0x9297 -#define GL_LIGHTEN_NV 0x9298 -#define GL_COLORDODGE_NV 0x9299 -#define GL_COLORBURN_NV 0x929A -#define GL_HARDLIGHT_NV 0x929B -#define GL_SOFTLIGHT_NV 0x929C -#define GL_DIFFERENCE_NV 0x929E -#define GL_MINUS_NV 0x929F -#define GL_EXCLUSION_NV 0x92A0 -#define GL_CONTRAST_NV 0x92A1 -#define GL_INVERT_RGB_NV 0x92A3 -#define GL_LINEARDODGE_NV 0x92A4 -#define GL_LINEARBURN_NV 0x92A5 -#define GL_VIVIDLIGHT_NV 0x92A6 -#define GL_LINEARLIGHT_NV 0x92A7 -#define GL_PINLIGHT_NV 0x92A8 -#define GL_HARDMIX_NV 0x92A9 -#define GL_HSL_HUE_NV 0x92AD -#define GL_HSL_SATURATION_NV 0x92AE -#define GL_HSL_COLOR_NV 0x92AF -#define GL_HSL_LUMINOSITY_NV 0x92B0 -#define GL_PLUS_CLAMPED_NV 0x92B1 -#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 -#define GL_MINUS_CLAMPED_NV 0x92B3 -#define GL_INVERT_OVG_NV 0x92B4 - -typedef void (GLAPIENTRY * PFNGLBLENDBARRIERNVPROC) (void); -typedef void (GLAPIENTRY * PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); - -#define glBlendBarrierNV GLEW_GET_FUN(__glewBlendBarrierNV) -#define glBlendParameteriNV GLEW_GET_FUN(__glewBlendParameteriNV) - -#define GLEW_NV_blend_equation_advanced GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced) - -#endif /* GL_NV_blend_equation_advanced */ - -/* ----------------- GL_NV_blend_equation_advanced_coherent ---------------- */ - -#ifndef GL_NV_blend_equation_advanced_coherent -#define GL_NV_blend_equation_advanced_coherent 1 - -#define GLEW_NV_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced_coherent) - -#endif /* GL_NV_blend_equation_advanced_coherent */ - -/* ----------------------- GL_NV_blend_minmax_factor ----------------------- */ - -#ifndef GL_NV_blend_minmax_factor -#define GL_NV_blend_minmax_factor 1 - -#define GL_FACTOR_MIN_AMD 0x901C -#define GL_FACTOR_MAX_AMD 0x901D - -#define GLEW_NV_blend_minmax_factor GLEW_GET_VAR(__GLEW_NV_blend_minmax_factor) - -#endif /* GL_NV_blend_minmax_factor */ - -/* --------------------------- GL_NV_blend_square -------------------------- */ - -#ifndef GL_NV_blend_square -#define GL_NV_blend_square 1 - -#define GLEW_NV_blend_square GLEW_GET_VAR(__GLEW_NV_blend_square) - -#endif /* GL_NV_blend_square */ - -/* ----------------------- GL_NV_clip_space_w_scaling ---------------------- */ - -#ifndef GL_NV_clip_space_w_scaling -#define GL_NV_clip_space_w_scaling 1 - -#define GL_VIEWPORT_POSITION_W_SCALE_NV 0x937C -#define GL_VIEWPORT_POSITION_W_SCALE_X_COEFF_NV 0x937D -#define GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF_NV 0x937E - -typedef void (GLAPIENTRY * PFNGLVIEWPORTPOSITIONWSCALENVPROC) (GLuint index, GLfloat xcoeff, GLfloat ycoeff); - -#define glViewportPositionWScaleNV GLEW_GET_FUN(__glewViewportPositionWScaleNV) - -#define GLEW_NV_clip_space_w_scaling GLEW_GET_VAR(__GLEW_NV_clip_space_w_scaling) - -#endif /* GL_NV_clip_space_w_scaling */ - -/* --------------------------- GL_NV_command_list -------------------------- */ - -#ifndef GL_NV_command_list -#define GL_NV_command_list 1 - -#define GL_TERMINATE_SEQUENCE_COMMAND_NV 0x0000 -#define GL_NOP_COMMAND_NV 0x0001 -#define GL_DRAW_ELEMENTS_COMMAND_NV 0x0002 -#define GL_DRAW_ARRAYS_COMMAND_NV 0x0003 -#define GL_DRAW_ELEMENTS_STRIP_COMMAND_NV 0x0004 -#define GL_DRAW_ARRAYS_STRIP_COMMAND_NV 0x0005 -#define GL_DRAW_ELEMENTS_INSTANCED_COMMAND_NV 0x0006 -#define GL_DRAW_ARRAYS_INSTANCED_COMMAND_NV 0x0007 -#define GL_ELEMENT_ADDRESS_COMMAND_NV 0x0008 -#define GL_ATTRIBUTE_ADDRESS_COMMAND_NV 0x0009 -#define GL_UNIFORM_ADDRESS_COMMAND_NV 0x000a -#define GL_BLEND_COLOR_COMMAND_NV 0x000b -#define GL_STENCIL_REF_COMMAND_NV 0x000c -#define GL_LINE_WIDTH_COMMAND_NV 0x000d -#define GL_POLYGON_OFFSET_COMMAND_NV 0x000e -#define GL_ALPHA_REF_COMMAND_NV 0x000f -#define GL_VIEWPORT_COMMAND_NV 0x0010 -#define GL_SCISSOR_COMMAND_NV 0x0011 -#define GL_FRONT_FACE_COMMAND_NV 0x0012 - -typedef void (GLAPIENTRY * PFNGLCALLCOMMANDLISTNVPROC) (GLuint list); -typedef void (GLAPIENTRY * PFNGLCOMMANDLISTSEGMENTSNVPROC) (GLuint list, GLuint segments); -typedef void (GLAPIENTRY * PFNGLCOMPILECOMMANDLISTNVPROC) (GLuint list); -typedef void (GLAPIENTRY * PFNGLCREATECOMMANDLISTSNVPROC) (GLsizei n, GLuint* lists); -typedef void (GLAPIENTRY * PFNGLCREATESTATESNVPROC) (GLsizei n, GLuint* states); -typedef void (GLAPIENTRY * PFNGLDELETECOMMANDLISTSNVPROC) (GLsizei n, const GLuint* lists); -typedef void (GLAPIENTRY * PFNGLDELETESTATESNVPROC) (GLsizei n, const GLuint* states); -typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSADDRESSNVPROC) (GLenum primitiveMode, const GLuint64* indirects, const GLsizei* sizes, GLuint count); -typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSNVPROC) (GLenum primitiveMode, GLuint buffer, const GLintptr* indirects, const GLsizei* sizes, GLuint count); -typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC) (const GLuint64* indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count); -typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSSTATESNVPROC) (GLuint buffer, const GLintptr* indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count); -typedef GLuint (GLAPIENTRY * PFNGLGETCOMMANDHEADERNVPROC) (GLenum tokenID, GLuint size); -typedef GLushort (GLAPIENTRY * PFNGLGETSTAGEINDEXNVPROC) (GLenum shadertype); -typedef GLboolean (GLAPIENTRY * PFNGLISCOMMANDLISTNVPROC) (GLuint list); -typedef GLboolean (GLAPIENTRY * PFNGLISSTATENVPROC) (GLuint state); -typedef void (GLAPIENTRY * PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC) (GLuint list, GLuint segment, const void** indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count); -typedef void (GLAPIENTRY * PFNGLSTATECAPTURENVPROC) (GLuint state, GLenum mode); - -#define glCallCommandListNV GLEW_GET_FUN(__glewCallCommandListNV) -#define glCommandListSegmentsNV GLEW_GET_FUN(__glewCommandListSegmentsNV) -#define glCompileCommandListNV GLEW_GET_FUN(__glewCompileCommandListNV) -#define glCreateCommandListsNV GLEW_GET_FUN(__glewCreateCommandListsNV) -#define glCreateStatesNV GLEW_GET_FUN(__glewCreateStatesNV) -#define glDeleteCommandListsNV GLEW_GET_FUN(__glewDeleteCommandListsNV) -#define glDeleteStatesNV GLEW_GET_FUN(__glewDeleteStatesNV) -#define glDrawCommandsAddressNV GLEW_GET_FUN(__glewDrawCommandsAddressNV) -#define glDrawCommandsNV GLEW_GET_FUN(__glewDrawCommandsNV) -#define glDrawCommandsStatesAddressNV GLEW_GET_FUN(__glewDrawCommandsStatesAddressNV) -#define glDrawCommandsStatesNV GLEW_GET_FUN(__glewDrawCommandsStatesNV) -#define glGetCommandHeaderNV GLEW_GET_FUN(__glewGetCommandHeaderNV) -#define glGetStageIndexNV GLEW_GET_FUN(__glewGetStageIndexNV) -#define glIsCommandListNV GLEW_GET_FUN(__glewIsCommandListNV) -#define glIsStateNV GLEW_GET_FUN(__glewIsStateNV) -#define glListDrawCommandsStatesClientNV GLEW_GET_FUN(__glewListDrawCommandsStatesClientNV) -#define glStateCaptureNV GLEW_GET_FUN(__glewStateCaptureNV) - -#define GLEW_NV_command_list GLEW_GET_VAR(__GLEW_NV_command_list) - -#endif /* GL_NV_command_list */ - -/* ------------------------- GL_NV_compute_program5 ------------------------ */ - -#ifndef GL_NV_compute_program5 -#define GL_NV_compute_program5 1 - -#define GL_COMPUTE_PROGRAM_NV 0x90FB -#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC - -#define GLEW_NV_compute_program5 GLEW_GET_VAR(__GLEW_NV_compute_program5) - -#endif /* GL_NV_compute_program5 */ - -/* ------------------------ GL_NV_conditional_render ----------------------- */ - -#ifndef GL_NV_conditional_render -#define GL_NV_conditional_render 1 - -#define GL_QUERY_WAIT_NV 0x8E13 -#define GL_QUERY_NO_WAIT_NV 0x8E14 -#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 - -typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); -typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVPROC) (void); - -#define glBeginConditionalRenderNV GLEW_GET_FUN(__glewBeginConditionalRenderNV) -#define glEndConditionalRenderNV GLEW_GET_FUN(__glewEndConditionalRenderNV) - -#define GLEW_NV_conditional_render GLEW_GET_VAR(__GLEW_NV_conditional_render) - -#endif /* GL_NV_conditional_render */ - -/* ----------------------- GL_NV_conservative_raster ----------------------- */ - -#ifndef GL_NV_conservative_raster -#define GL_NV_conservative_raster 1 - -#define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 -#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 -#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 -#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 - -typedef void (GLAPIENTRY * PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); - -#define glSubpixelPrecisionBiasNV GLEW_GET_FUN(__glewSubpixelPrecisionBiasNV) - -#define GLEW_NV_conservative_raster GLEW_GET_VAR(__GLEW_NV_conservative_raster) - -#endif /* GL_NV_conservative_raster */ - -/* -------------------- GL_NV_conservative_raster_dilate ------------------- */ - -#ifndef GL_NV_conservative_raster_dilate -#define GL_NV_conservative_raster_dilate 1 - -#define GL_CONSERVATIVE_RASTER_DILATE_NV 0x9379 -#define GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV 0x937A -#define GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV 0x937B - -typedef void (GLAPIENTRY * PFNGLCONSERVATIVERASTERPARAMETERFNVPROC) (GLenum pname, GLfloat value); - -#define glConservativeRasterParameterfNV GLEW_GET_FUN(__glewConservativeRasterParameterfNV) - -#define GLEW_NV_conservative_raster_dilate GLEW_GET_VAR(__GLEW_NV_conservative_raster_dilate) - -#endif /* GL_NV_conservative_raster_dilate */ - -/* -------------- GL_NV_conservative_raster_pre_snap_triangles ------------- */ - -#ifndef GL_NV_conservative_raster_pre_snap_triangles -#define GL_NV_conservative_raster_pre_snap_triangles 1 - -#define GL_CONSERVATIVE_RASTER_MODE_NV 0x954D -#define GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV 0x954E -#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV 0x954F - -typedef void (GLAPIENTRY * PFNGLCONSERVATIVERASTERPARAMETERINVPROC) (GLenum pname, GLint param); - -#define glConservativeRasterParameteriNV GLEW_GET_FUN(__glewConservativeRasterParameteriNV) - -#define GLEW_NV_conservative_raster_pre_snap_triangles GLEW_GET_VAR(__GLEW_NV_conservative_raster_pre_snap_triangles) - -#endif /* GL_NV_conservative_raster_pre_snap_triangles */ - -/* --------------------------- GL_NV_copy_buffer --------------------------- */ - -#ifndef GL_NV_copy_buffer -#define GL_NV_copy_buffer 1 - -#define GL_COPY_READ_BUFFER_NV 0x8F36 -#define GL_COPY_WRITE_BUFFER_NV 0x8F37 - -typedef void (GLAPIENTRY * PFNGLCOPYBUFFERSUBDATANVPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size); - -#define glCopyBufferSubDataNV GLEW_GET_FUN(__glewCopyBufferSubDataNV) - -#define GLEW_NV_copy_buffer GLEW_GET_VAR(__GLEW_NV_copy_buffer) - -#endif /* GL_NV_copy_buffer */ - -/* ----------------------- GL_NV_copy_depth_to_color ----------------------- */ - -#ifndef GL_NV_copy_depth_to_color -#define GL_NV_copy_depth_to_color 1 - -#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E -#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F - -#define GLEW_NV_copy_depth_to_color GLEW_GET_VAR(__GLEW_NV_copy_depth_to_color) - -#endif /* GL_NV_copy_depth_to_color */ - -/* ---------------------------- GL_NV_copy_image --------------------------- */ - -#ifndef GL_NV_copy_image -#define GL_NV_copy_image 1 - -typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); - -#define glCopyImageSubDataNV GLEW_GET_FUN(__glewCopyImageSubDataNV) - -#define GLEW_NV_copy_image GLEW_GET_VAR(__GLEW_NV_copy_image) - -#endif /* GL_NV_copy_image */ - -/* -------------------------- GL_NV_deep_texture3D ------------------------- */ - -#ifndef GL_NV_deep_texture3D -#define GL_NV_deep_texture3D 1 - -#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 -#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 - -#define GLEW_NV_deep_texture3D GLEW_GET_VAR(__GLEW_NV_deep_texture3D) - -#endif /* GL_NV_deep_texture3D */ - -/* ------------------------ GL_NV_depth_buffer_float ----------------------- */ - -#ifndef GL_NV_depth_buffer_float -#define GL_NV_depth_buffer_float 1 - -#define GL_DEPTH_COMPONENT32F_NV 0x8DAB -#define GL_DEPTH32F_STENCIL8_NV 0x8DAC -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD -#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF - -typedef void (GLAPIENTRY * PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); -typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); - -#define glClearDepthdNV GLEW_GET_FUN(__glewClearDepthdNV) -#define glDepthBoundsdNV GLEW_GET_FUN(__glewDepthBoundsdNV) -#define glDepthRangedNV GLEW_GET_FUN(__glewDepthRangedNV) - -#define GLEW_NV_depth_buffer_float GLEW_GET_VAR(__GLEW_NV_depth_buffer_float) - -#endif /* GL_NV_depth_buffer_float */ - -/* --------------------------- GL_NV_depth_clamp --------------------------- */ - -#ifndef GL_NV_depth_clamp -#define GL_NV_depth_clamp 1 - -#define GL_DEPTH_CLAMP_NV 0x864F - -#define GLEW_NV_depth_clamp GLEW_GET_VAR(__GLEW_NV_depth_clamp) - -#endif /* GL_NV_depth_clamp */ - -/* ---------------------- GL_NV_depth_range_unclamped ---------------------- */ - -#ifndef GL_NV_depth_range_unclamped -#define GL_NV_depth_range_unclamped 1 - -#define GL_SAMPLE_COUNT_BITS_NV 0x8864 -#define GL_CURRENT_SAMPLE_COUNT_QUERY_NV 0x8865 -#define GL_QUERY_RESULT_NV 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_NV 0x8867 -#define GL_SAMPLE_COUNT_NV 0x8914 - -#define GLEW_NV_depth_range_unclamped GLEW_GET_VAR(__GLEW_NV_depth_range_unclamped) - -#endif /* GL_NV_depth_range_unclamped */ - -/* --------------------------- GL_NV_draw_buffers -------------------------- */ - -#ifndef GL_NV_draw_buffers -#define GL_NV_draw_buffers 1 - -#define GL_MAX_DRAW_BUFFERS_NV 0x8824 -#define GL_DRAW_BUFFER0_NV 0x8825 -#define GL_DRAW_BUFFER1_NV 0x8826 -#define GL_DRAW_BUFFER2_NV 0x8827 -#define GL_DRAW_BUFFER3_NV 0x8828 -#define GL_DRAW_BUFFER4_NV 0x8829 -#define GL_DRAW_BUFFER5_NV 0x882A -#define GL_DRAW_BUFFER6_NV 0x882B -#define GL_DRAW_BUFFER7_NV 0x882C -#define GL_DRAW_BUFFER8_NV 0x882D -#define GL_DRAW_BUFFER9_NV 0x882E -#define GL_DRAW_BUFFER10_NV 0x882F -#define GL_DRAW_BUFFER11_NV 0x8830 -#define GL_DRAW_BUFFER12_NV 0x8831 -#define GL_DRAW_BUFFER13_NV 0x8832 -#define GL_DRAW_BUFFER14_NV 0x8833 -#define GL_DRAW_BUFFER15_NV 0x8834 -#define GL_COLOR_ATTACHMENT0_NV 0x8CE0 -#define GL_COLOR_ATTACHMENT1_NV 0x8CE1 -#define GL_COLOR_ATTACHMENT2_NV 0x8CE2 -#define GL_COLOR_ATTACHMENT3_NV 0x8CE3 -#define GL_COLOR_ATTACHMENT4_NV 0x8CE4 -#define GL_COLOR_ATTACHMENT5_NV 0x8CE5 -#define GL_COLOR_ATTACHMENT6_NV 0x8CE6 -#define GL_COLOR_ATTACHMENT7_NV 0x8CE7 -#define GL_COLOR_ATTACHMENT8_NV 0x8CE8 -#define GL_COLOR_ATTACHMENT9_NV 0x8CE9 -#define GL_COLOR_ATTACHMENT10_NV 0x8CEA -#define GL_COLOR_ATTACHMENT11_NV 0x8CEB -#define GL_COLOR_ATTACHMENT12_NV 0x8CEC -#define GL_COLOR_ATTACHMENT13_NV 0x8CED -#define GL_COLOR_ATTACHMENT14_NV 0x8CEE -#define GL_COLOR_ATTACHMENT15_NV 0x8CEF - -typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSNVPROC) (GLsizei n, const GLenum* bufs); - -#define glDrawBuffersNV GLEW_GET_FUN(__glewDrawBuffersNV) - -#define GLEW_NV_draw_buffers GLEW_GET_VAR(__GLEW_NV_draw_buffers) - -#endif /* GL_NV_draw_buffers */ - -/* -------------------------- GL_NV_draw_instanced ------------------------- */ - -#ifndef GL_NV_draw_instanced -#define GL_NV_draw_instanced 1 - -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDNVPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDNVPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); - -#define glDrawArraysInstancedNV GLEW_GET_FUN(__glewDrawArraysInstancedNV) -#define glDrawElementsInstancedNV GLEW_GET_FUN(__glewDrawElementsInstancedNV) - -#define GLEW_NV_draw_instanced GLEW_GET_VAR(__GLEW_NV_draw_instanced) - -#endif /* GL_NV_draw_instanced */ - -/* --------------------------- GL_NV_draw_texture -------------------------- */ - -#ifndef GL_NV_draw_texture -#define GL_NV_draw_texture 1 - -typedef void (GLAPIENTRY * PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); - -#define glDrawTextureNV GLEW_GET_FUN(__glewDrawTextureNV) - -#define GLEW_NV_draw_texture GLEW_GET_VAR(__GLEW_NV_draw_texture) - -#endif /* GL_NV_draw_texture */ - -/* ------------------------ GL_NV_draw_vulkan_image ------------------------ */ - -#ifndef GL_NV_draw_vulkan_image -#define GL_NV_draw_vulkan_image 1 - -typedef void (APIENTRY *GLVULKANPROCNV)(void); - -typedef void (GLAPIENTRY * PFNGLDRAWVKIMAGENVPROC) (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); -typedef GLVULKANPROCNV (GLAPIENTRY * PFNGLGETVKPROCADDRNVPROC) (const GLchar* name); -typedef void (GLAPIENTRY * PFNGLSIGNALVKFENCENVPROC) (GLuint64 vkFence); -typedef void (GLAPIENTRY * PFNGLSIGNALVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); -typedef void (GLAPIENTRY * PFNGLWAITVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); - -#define glDrawVkImageNV GLEW_GET_FUN(__glewDrawVkImageNV) -#define glGetVkProcAddrNV GLEW_GET_FUN(__glewGetVkProcAddrNV) -#define glSignalVkFenceNV GLEW_GET_FUN(__glewSignalVkFenceNV) -#define glSignalVkSemaphoreNV GLEW_GET_FUN(__glewSignalVkSemaphoreNV) -#define glWaitVkSemaphoreNV GLEW_GET_FUN(__glewWaitVkSemaphoreNV) - -#define GLEW_NV_draw_vulkan_image GLEW_GET_VAR(__GLEW_NV_draw_vulkan_image) - -#endif /* GL_NV_draw_vulkan_image */ - -/* ---------------------------- GL_NV_evaluators --------------------------- */ - -#ifndef GL_NV_evaluators -#define GL_NV_evaluators 1 - -#define GL_EVAL_2D_NV 0x86C0 -#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 -#define GL_MAP_TESSELLATION_NV 0x86C2 -#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 -#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 -#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 -#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 -#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 -#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 -#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 -#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA -#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB -#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC -#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD -#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE -#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF -#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 -#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 -#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 -#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 -#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 -#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 -#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 -#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 - -typedef void (GLAPIENTRY * PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); -typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); -typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); -typedef void (GLAPIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint* params); - -#define glEvalMapsNV GLEW_GET_FUN(__glewEvalMapsNV) -#define glGetMapAttribParameterfvNV GLEW_GET_FUN(__glewGetMapAttribParameterfvNV) -#define glGetMapAttribParameterivNV GLEW_GET_FUN(__glewGetMapAttribParameterivNV) -#define glGetMapControlPointsNV GLEW_GET_FUN(__glewGetMapControlPointsNV) -#define glGetMapParameterfvNV GLEW_GET_FUN(__glewGetMapParameterfvNV) -#define glGetMapParameterivNV GLEW_GET_FUN(__glewGetMapParameterivNV) -#define glMapControlPointsNV GLEW_GET_FUN(__glewMapControlPointsNV) -#define glMapParameterfvNV GLEW_GET_FUN(__glewMapParameterfvNV) -#define glMapParameterivNV GLEW_GET_FUN(__glewMapParameterivNV) - -#define GLEW_NV_evaluators GLEW_GET_VAR(__GLEW_NV_evaluators) - -#endif /* GL_NV_evaluators */ - -/* --------------------- GL_NV_explicit_attrib_location -------------------- */ - -#ifndef GL_NV_explicit_attrib_location -#define GL_NV_explicit_attrib_location 1 - -#define GLEW_NV_explicit_attrib_location GLEW_GET_VAR(__GLEW_NV_explicit_attrib_location) - -#endif /* GL_NV_explicit_attrib_location */ - -/* ----------------------- GL_NV_explicit_multisample ---------------------- */ - -#ifndef GL_NV_explicit_multisample -#define GL_NV_explicit_multisample 1 - -#define GL_SAMPLE_POSITION_NV 0x8E50 -#define GL_SAMPLE_MASK_NV 0x8E51 -#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 -#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 -#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 -#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 -#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 -#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 -#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 -#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 - -typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat* val); -typedef void (GLAPIENTRY * PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); -typedef void (GLAPIENTRY * PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); - -#define glGetMultisamplefvNV GLEW_GET_FUN(__glewGetMultisamplefvNV) -#define glSampleMaskIndexedNV GLEW_GET_FUN(__glewSampleMaskIndexedNV) -#define glTexRenderbufferNV GLEW_GET_FUN(__glewTexRenderbufferNV) - -#define GLEW_NV_explicit_multisample GLEW_GET_VAR(__GLEW_NV_explicit_multisample) - -#endif /* GL_NV_explicit_multisample */ - -/* ---------------------- GL_NV_fbo_color_attachments ---------------------- */ - -#ifndef GL_NV_fbo_color_attachments -#define GL_NV_fbo_color_attachments 1 - -#define GL_MAX_COLOR_ATTACHMENTS_NV 0x8CDF -#define GL_COLOR_ATTACHMENT0_NV 0x8CE0 -#define GL_COLOR_ATTACHMENT1_NV 0x8CE1 -#define GL_COLOR_ATTACHMENT2_NV 0x8CE2 -#define GL_COLOR_ATTACHMENT3_NV 0x8CE3 -#define GL_COLOR_ATTACHMENT4_NV 0x8CE4 -#define GL_COLOR_ATTACHMENT5_NV 0x8CE5 -#define GL_COLOR_ATTACHMENT6_NV 0x8CE6 -#define GL_COLOR_ATTACHMENT7_NV 0x8CE7 -#define GL_COLOR_ATTACHMENT8_NV 0x8CE8 -#define GL_COLOR_ATTACHMENT9_NV 0x8CE9 -#define GL_COLOR_ATTACHMENT10_NV 0x8CEA -#define GL_COLOR_ATTACHMENT11_NV 0x8CEB -#define GL_COLOR_ATTACHMENT12_NV 0x8CEC -#define GL_COLOR_ATTACHMENT13_NV 0x8CED -#define GL_COLOR_ATTACHMENT14_NV 0x8CEE -#define GL_COLOR_ATTACHMENT15_NV 0x8CEF - -#define GLEW_NV_fbo_color_attachments GLEW_GET_VAR(__GLEW_NV_fbo_color_attachments) - -#endif /* GL_NV_fbo_color_attachments */ - -/* ------------------------------ GL_NV_fence ------------------------------ */ - -#ifndef GL_NV_fence -#define GL_NV_fence 1 - -#define GL_ALL_COMPLETED_NV 0x84F2 -#define GL_FENCE_STATUS_NV 0x84F3 -#define GL_FENCE_CONDITION_NV 0x84F4 - -typedef void (GLAPIENTRY * PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint* fences); -typedef void (GLAPIENTRY * PFNGLFINISHFENCENVPROC) (GLuint fence); -typedef void (GLAPIENTRY * PFNGLGENFENCESNVPROC) (GLsizei n, GLuint* fences); -typedef void (GLAPIENTRY * PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISFENCENVPROC) (GLuint fence); -typedef void (GLAPIENTRY * PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); -typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCENVPROC) (GLuint fence); - -#define glDeleteFencesNV GLEW_GET_FUN(__glewDeleteFencesNV) -#define glFinishFenceNV GLEW_GET_FUN(__glewFinishFenceNV) -#define glGenFencesNV GLEW_GET_FUN(__glewGenFencesNV) -#define glGetFenceivNV GLEW_GET_FUN(__glewGetFenceivNV) -#define glIsFenceNV GLEW_GET_FUN(__glewIsFenceNV) -#define glSetFenceNV GLEW_GET_FUN(__glewSetFenceNV) -#define glTestFenceNV GLEW_GET_FUN(__glewTestFenceNV) - -#define GLEW_NV_fence GLEW_GET_VAR(__GLEW_NV_fence) - -#endif /* GL_NV_fence */ - -/* -------------------------- GL_NV_fill_rectangle ------------------------- */ - -#ifndef GL_NV_fill_rectangle -#define GL_NV_fill_rectangle 1 - -#define GL_FILL_RECTANGLE_NV 0x933C - -#define GLEW_NV_fill_rectangle GLEW_GET_VAR(__GLEW_NV_fill_rectangle) - -#endif /* GL_NV_fill_rectangle */ - -/* --------------------------- GL_NV_float_buffer -------------------------- */ - -#ifndef GL_NV_float_buffer -#define GL_NV_float_buffer 1 - -#define GL_FLOAT_R_NV 0x8880 -#define GL_FLOAT_RG_NV 0x8881 -#define GL_FLOAT_RGB_NV 0x8882 -#define GL_FLOAT_RGBA_NV 0x8883 -#define GL_FLOAT_R16_NV 0x8884 -#define GL_FLOAT_R32_NV 0x8885 -#define GL_FLOAT_RG16_NV 0x8886 -#define GL_FLOAT_RG32_NV 0x8887 -#define GL_FLOAT_RGB16_NV 0x8888 -#define GL_FLOAT_RGB32_NV 0x8889 -#define GL_FLOAT_RGBA16_NV 0x888A -#define GL_FLOAT_RGBA32_NV 0x888B -#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C -#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D -#define GL_FLOAT_RGBA_MODE_NV 0x888E - -#define GLEW_NV_float_buffer GLEW_GET_VAR(__GLEW_NV_float_buffer) - -#endif /* GL_NV_float_buffer */ - -/* --------------------------- GL_NV_fog_distance -------------------------- */ - -#ifndef GL_NV_fog_distance -#define GL_NV_fog_distance 1 - -#define GL_FOG_DISTANCE_MODE_NV 0x855A -#define GL_EYE_RADIAL_NV 0x855B -#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C - -#define GLEW_NV_fog_distance GLEW_GET_VAR(__GLEW_NV_fog_distance) - -#endif /* GL_NV_fog_distance */ - -/* -------------------- GL_NV_fragment_coverage_to_color ------------------- */ - -#ifndef GL_NV_fragment_coverage_to_color -#define GL_NV_fragment_coverage_to_color 1 - -#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD -#define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE - -typedef void (GLAPIENTRY * PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); - -#define glFragmentCoverageColorNV GLEW_GET_FUN(__glewFragmentCoverageColorNV) - -#define GLEW_NV_fragment_coverage_to_color GLEW_GET_VAR(__GLEW_NV_fragment_coverage_to_color) - -#endif /* GL_NV_fragment_coverage_to_color */ - -/* ------------------------- GL_NV_fragment_program ------------------------ */ - -#ifndef GL_NV_fragment_program -#define GL_NV_fragment_program 1 - -#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 -#define GL_FRAGMENT_PROGRAM_NV 0x8870 -#define GL_MAX_TEXTURE_COORDS_NV 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 -#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 -#define GL_PROGRAM_ERROR_STRING_NV 0x8874 - -typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble *params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLdouble v[]); -typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLfloat v[]); - -#define glGetProgramNamedParameterdvNV GLEW_GET_FUN(__glewGetProgramNamedParameterdvNV) -#define glGetProgramNamedParameterfvNV GLEW_GET_FUN(__glewGetProgramNamedParameterfvNV) -#define glProgramNamedParameter4dNV GLEW_GET_FUN(__glewProgramNamedParameter4dNV) -#define glProgramNamedParameter4dvNV GLEW_GET_FUN(__glewProgramNamedParameter4dvNV) -#define glProgramNamedParameter4fNV GLEW_GET_FUN(__glewProgramNamedParameter4fNV) -#define glProgramNamedParameter4fvNV GLEW_GET_FUN(__glewProgramNamedParameter4fvNV) - -#define GLEW_NV_fragment_program GLEW_GET_VAR(__GLEW_NV_fragment_program) - -#endif /* GL_NV_fragment_program */ - -/* ------------------------ GL_NV_fragment_program2 ------------------------ */ - -#ifndef GL_NV_fragment_program2 -#define GL_NV_fragment_program2 1 - -#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 -#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 -#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 -#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 -#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 - -#define GLEW_NV_fragment_program2 GLEW_GET_VAR(__GLEW_NV_fragment_program2) - -#endif /* GL_NV_fragment_program2 */ - -/* ------------------------ GL_NV_fragment_program4 ------------------------ */ - -#ifndef GL_NV_fragment_program4 -#define GL_NV_fragment_program4 1 - -#define GLEW_NV_fragment_program4 GLEW_GET_VAR(__GLEW_NV_fragment_program4) - -#endif /* GL_NV_fragment_program4 */ - -/* --------------------- GL_NV_fragment_program_option --------------------- */ - -#ifndef GL_NV_fragment_program_option -#define GL_NV_fragment_program_option 1 - -#define GLEW_NV_fragment_program_option GLEW_GET_VAR(__GLEW_NV_fragment_program_option) - -#endif /* GL_NV_fragment_program_option */ - -/* -------------------- GL_NV_fragment_shader_interlock -------------------- */ - -#ifndef GL_NV_fragment_shader_interlock -#define GL_NV_fragment_shader_interlock 1 - -#define GLEW_NV_fragment_shader_interlock GLEW_GET_VAR(__GLEW_NV_fragment_shader_interlock) - -#endif /* GL_NV_fragment_shader_interlock */ - -/* ------------------------- GL_NV_framebuffer_blit ------------------------ */ - -#ifndef GL_NV_framebuffer_blit -#define GL_NV_framebuffer_blit 1 - -#define GL_DRAW_FRAMEBUFFER_BINDING_NV 0x8CA6 -#define GL_READ_FRAMEBUFFER_NV 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_NV 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING_NV 0x8CAA - -typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERNVPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); - -#define glBlitFramebufferNV GLEW_GET_FUN(__glewBlitFramebufferNV) - -#define GLEW_NV_framebuffer_blit GLEW_GET_VAR(__GLEW_NV_framebuffer_blit) - -#endif /* GL_NV_framebuffer_blit */ - -/* -------------------- GL_NV_framebuffer_mixed_samples -------------------- */ - -#ifndef GL_NV_framebuffer_mixed_samples -#define GL_NV_framebuffer_mixed_samples 1 - -#define GL_COLOR_SAMPLES_NV 0x8E20 -#define GL_RASTER_MULTISAMPLE_EXT 0x9327 -#define GL_RASTER_SAMPLES_EXT 0x9328 -#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 -#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A -#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B -#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C -#define GL_DEPTH_SAMPLES_NV 0x932D -#define GL_STENCIL_SAMPLES_NV 0x932E -#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F -#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 -#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 -#define GL_COVERAGE_MODULATION_NV 0x9332 -#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 - -#define GLEW_NV_framebuffer_mixed_samples GLEW_GET_VAR(__GLEW_NV_framebuffer_mixed_samples) - -#endif /* GL_NV_framebuffer_mixed_samples */ - -/* --------------------- GL_NV_framebuffer_multisample --------------------- */ - -#ifndef GL_NV_framebuffer_multisample -#define GL_NV_framebuffer_multisample 1 - -#define GL_RENDERBUFFER_SAMPLES_NV 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV 0x8D56 -#define GL_MAX_SAMPLES_NV 0x8D57 - -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - -#define glRenderbufferStorageMultisampleNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleNV) - -#define GLEW_NV_framebuffer_multisample GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample) - -#endif /* GL_NV_framebuffer_multisample */ - -/* ----------------- GL_NV_framebuffer_multisample_coverage ---------------- */ - -#ifndef GL_NV_framebuffer_multisample_coverage -#define GL_NV_framebuffer_multisample_coverage 1 - -#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB -#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 -#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 -#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 - -typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); - -#define glRenderbufferStorageMultisampleCoverageNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleCoverageNV) - -#define GLEW_NV_framebuffer_multisample_coverage GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample_coverage) - -#endif /* GL_NV_framebuffer_multisample_coverage */ - -/* ----------------------- GL_NV_generate_mipmap_sRGB ---------------------- */ - -#ifndef GL_NV_generate_mipmap_sRGB -#define GL_NV_generate_mipmap_sRGB 1 - -#define GLEW_NV_generate_mipmap_sRGB GLEW_GET_VAR(__GLEW_NV_generate_mipmap_sRGB) - -#endif /* GL_NV_generate_mipmap_sRGB */ - -/* ------------------------ GL_NV_geometry_program4 ------------------------ */ - -#ifndef GL_NV_geometry_program4 -#define GL_NV_geometry_program4 1 - -#define GL_GEOMETRY_PROGRAM_NV 0x8C26 -#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 -#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 - -typedef void (GLAPIENTRY * PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); - -#define glProgramVertexLimitNV GLEW_GET_FUN(__glewProgramVertexLimitNV) - -#define GLEW_NV_geometry_program4 GLEW_GET_VAR(__GLEW_NV_geometry_program4) - -#endif /* GL_NV_geometry_program4 */ - -/* ------------------------- GL_NV_geometry_shader4 ------------------------ */ - -#ifndef GL_NV_geometry_shader4 -#define GL_NV_geometry_shader4 1 - -#define GLEW_NV_geometry_shader4 GLEW_GET_VAR(__GLEW_NV_geometry_shader4) - -#endif /* GL_NV_geometry_shader4 */ - -/* ------------------- GL_NV_geometry_shader_passthrough ------------------- */ - -#ifndef GL_NV_geometry_shader_passthrough -#define GL_NV_geometry_shader_passthrough 1 - -#define GLEW_NV_geometry_shader_passthrough GLEW_GET_VAR(__GLEW_NV_geometry_shader_passthrough) - -#endif /* GL_NV_geometry_shader_passthrough */ - -/* -------------------------- GL_NV_gpu_multicast -------------------------- */ - -#ifndef GL_NV_gpu_multicast -#define GL_NV_gpu_multicast 1 - -#define GL_PER_GPU_STORAGE_BIT_NV 0x0800 -#define GL_MULTICAST_GPUS_NV 0x92BA -#define GL_PER_GPU_STORAGE_NV 0x9548 -#define GL_MULTICAST_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9549 -#define GL_RENDER_GPU_MASK_NV 0x9558 - -typedef void (GLAPIENTRY * PFNGLMULTICASTBARRIERNVPROC) (void); -typedef void (GLAPIENTRY * PFNGLMULTICASTBLITFRAMEBUFFERNVPROC) (GLuint srcGpu, GLuint dstGpu, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef void (GLAPIENTRY * PFNGLMULTICASTBUFFERSUBDATANVPROC) (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); -typedef void (GLAPIENTRY * PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC) (GLuint readGpu, GLbitfield writeGpuMask, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLMULTICASTCOPYIMAGESUBDATANVPROC) (GLuint srcGpu, GLbitfield dstGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -typedef void (GLAPIENTRY * PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint gpu, GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLint64* params); -typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTIVNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLuint64* params); -typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLMULTICASTWAITSYNCNVPROC) (GLuint signalGpu, GLbitfield waitGpuMask); -typedef void (GLAPIENTRY * PFNGLRENDERGPUMASKNVPROC) (GLbitfield mask); - -#define glMulticastBarrierNV GLEW_GET_FUN(__glewMulticastBarrierNV) -#define glMulticastBlitFramebufferNV GLEW_GET_FUN(__glewMulticastBlitFramebufferNV) -#define glMulticastBufferSubDataNV GLEW_GET_FUN(__glewMulticastBufferSubDataNV) -#define glMulticastCopyBufferSubDataNV GLEW_GET_FUN(__glewMulticastCopyBufferSubDataNV) -#define glMulticastCopyImageSubDataNV GLEW_GET_FUN(__glewMulticastCopyImageSubDataNV) -#define glMulticastFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewMulticastFramebufferSampleLocationsfvNV) -#define glMulticastGetQueryObjecti64vNV GLEW_GET_FUN(__glewMulticastGetQueryObjecti64vNV) -#define glMulticastGetQueryObjectivNV GLEW_GET_FUN(__glewMulticastGetQueryObjectivNV) -#define glMulticastGetQueryObjectui64vNV GLEW_GET_FUN(__glewMulticastGetQueryObjectui64vNV) -#define glMulticastGetQueryObjectuivNV GLEW_GET_FUN(__glewMulticastGetQueryObjectuivNV) -#define glMulticastWaitSyncNV GLEW_GET_FUN(__glewMulticastWaitSyncNV) -#define glRenderGpuMaskNV GLEW_GET_FUN(__glewRenderGpuMaskNV) - -#define GLEW_NV_gpu_multicast GLEW_GET_VAR(__GLEW_NV_gpu_multicast) - -#endif /* GL_NV_gpu_multicast */ - -/* --------------------------- GL_NV_gpu_program4 -------------------------- */ - -#ifndef GL_NV_gpu_program4 -#define GL_NV_gpu_program4 1 - -#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 -#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 -#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 -#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 -#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 -#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 -#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 - -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); - -#define glProgramEnvParameterI4iNV GLEW_GET_FUN(__glewProgramEnvParameterI4iNV) -#define glProgramEnvParameterI4ivNV GLEW_GET_FUN(__glewProgramEnvParameterI4ivNV) -#define glProgramEnvParameterI4uiNV GLEW_GET_FUN(__glewProgramEnvParameterI4uiNV) -#define glProgramEnvParameterI4uivNV GLEW_GET_FUN(__glewProgramEnvParameterI4uivNV) -#define glProgramEnvParametersI4ivNV GLEW_GET_FUN(__glewProgramEnvParametersI4ivNV) -#define glProgramEnvParametersI4uivNV GLEW_GET_FUN(__glewProgramEnvParametersI4uivNV) -#define glProgramLocalParameterI4iNV GLEW_GET_FUN(__glewProgramLocalParameterI4iNV) -#define glProgramLocalParameterI4ivNV GLEW_GET_FUN(__glewProgramLocalParameterI4ivNV) -#define glProgramLocalParameterI4uiNV GLEW_GET_FUN(__glewProgramLocalParameterI4uiNV) -#define glProgramLocalParameterI4uivNV GLEW_GET_FUN(__glewProgramLocalParameterI4uivNV) -#define glProgramLocalParametersI4ivNV GLEW_GET_FUN(__glewProgramLocalParametersI4ivNV) -#define glProgramLocalParametersI4uivNV GLEW_GET_FUN(__glewProgramLocalParametersI4uivNV) - -#define GLEW_NV_gpu_program4 GLEW_GET_VAR(__GLEW_NV_gpu_program4) - -#endif /* GL_NV_gpu_program4 */ - -/* --------------------------- GL_NV_gpu_program5 -------------------------- */ - -#ifndef GL_NV_gpu_program5 -#define GL_NV_gpu_program5 1 - -#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A -#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B -#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C -#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F - -#define GLEW_NV_gpu_program5 GLEW_GET_VAR(__GLEW_NV_gpu_program5) - -#endif /* GL_NV_gpu_program5 */ - -/* -------------------- GL_NV_gpu_program5_mem_extended -------------------- */ - -#ifndef GL_NV_gpu_program5_mem_extended -#define GL_NV_gpu_program5_mem_extended 1 - -#define GLEW_NV_gpu_program5_mem_extended GLEW_GET_VAR(__GLEW_NV_gpu_program5_mem_extended) - -#endif /* GL_NV_gpu_program5_mem_extended */ - -/* ------------------------- GL_NV_gpu_program_fp64 ------------------------ */ - -#ifndef GL_NV_gpu_program_fp64 -#define GL_NV_gpu_program_fp64 1 - -#define GLEW_NV_gpu_program_fp64 GLEW_GET_VAR(__GLEW_NV_gpu_program_fp64) - -#endif /* GL_NV_gpu_program_fp64 */ - -/* --------------------------- GL_NV_gpu_shader5 --------------------------- */ - -#ifndef GL_NV_gpu_shader5 -#define GL_NV_gpu_shader5 1 - -#define GL_INT64_NV 0x140E -#define GL_UNSIGNED_INT64_NV 0x140F -#define GL_INT8_NV 0x8FE0 -#define GL_INT8_VEC2_NV 0x8FE1 -#define GL_INT8_VEC3_NV 0x8FE2 -#define GL_INT8_VEC4_NV 0x8FE3 -#define GL_INT16_NV 0x8FE4 -#define GL_INT16_VEC2_NV 0x8FE5 -#define GL_INT16_VEC3_NV 0x8FE6 -#define GL_INT16_VEC4_NV 0x8FE7 -#define GL_INT64_VEC2_NV 0x8FE9 -#define GL_INT64_VEC3_NV 0x8FEA -#define GL_INT64_VEC4_NV 0x8FEB -#define GL_UNSIGNED_INT8_NV 0x8FEC -#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED -#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE -#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF -#define GL_UNSIGNED_INT16_NV 0x8FF0 -#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 -#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 -#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 -#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 -#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 -#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 -#define GL_FLOAT16_NV 0x8FF8 -#define GL_FLOAT16_VEC2_NV 0x8FF9 -#define GL_FLOAT16_VEC3_NV 0x8FFA -#define GL_FLOAT16_VEC4_NV 0x8FFB - -typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT* params); -typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); -typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); -typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); -typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); -typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); - -#define glGetUniformi64vNV GLEW_GET_FUN(__glewGetUniformi64vNV) -#define glGetUniformui64vNV GLEW_GET_FUN(__glewGetUniformui64vNV) -#define glProgramUniform1i64NV GLEW_GET_FUN(__glewProgramUniform1i64NV) -#define glProgramUniform1i64vNV GLEW_GET_FUN(__glewProgramUniform1i64vNV) -#define glProgramUniform1ui64NV GLEW_GET_FUN(__glewProgramUniform1ui64NV) -#define glProgramUniform1ui64vNV GLEW_GET_FUN(__glewProgramUniform1ui64vNV) -#define glProgramUniform2i64NV GLEW_GET_FUN(__glewProgramUniform2i64NV) -#define glProgramUniform2i64vNV GLEW_GET_FUN(__glewProgramUniform2i64vNV) -#define glProgramUniform2ui64NV GLEW_GET_FUN(__glewProgramUniform2ui64NV) -#define glProgramUniform2ui64vNV GLEW_GET_FUN(__glewProgramUniform2ui64vNV) -#define glProgramUniform3i64NV GLEW_GET_FUN(__glewProgramUniform3i64NV) -#define glProgramUniform3i64vNV GLEW_GET_FUN(__glewProgramUniform3i64vNV) -#define glProgramUniform3ui64NV GLEW_GET_FUN(__glewProgramUniform3ui64NV) -#define glProgramUniform3ui64vNV GLEW_GET_FUN(__glewProgramUniform3ui64vNV) -#define glProgramUniform4i64NV GLEW_GET_FUN(__glewProgramUniform4i64NV) -#define glProgramUniform4i64vNV GLEW_GET_FUN(__glewProgramUniform4i64vNV) -#define glProgramUniform4ui64NV GLEW_GET_FUN(__glewProgramUniform4ui64NV) -#define glProgramUniform4ui64vNV GLEW_GET_FUN(__glewProgramUniform4ui64vNV) -#define glUniform1i64NV GLEW_GET_FUN(__glewUniform1i64NV) -#define glUniform1i64vNV GLEW_GET_FUN(__glewUniform1i64vNV) -#define glUniform1ui64NV GLEW_GET_FUN(__glewUniform1ui64NV) -#define glUniform1ui64vNV GLEW_GET_FUN(__glewUniform1ui64vNV) -#define glUniform2i64NV GLEW_GET_FUN(__glewUniform2i64NV) -#define glUniform2i64vNV GLEW_GET_FUN(__glewUniform2i64vNV) -#define glUniform2ui64NV GLEW_GET_FUN(__glewUniform2ui64NV) -#define glUniform2ui64vNV GLEW_GET_FUN(__glewUniform2ui64vNV) -#define glUniform3i64NV GLEW_GET_FUN(__glewUniform3i64NV) -#define glUniform3i64vNV GLEW_GET_FUN(__glewUniform3i64vNV) -#define glUniform3ui64NV GLEW_GET_FUN(__glewUniform3ui64NV) -#define glUniform3ui64vNV GLEW_GET_FUN(__glewUniform3ui64vNV) -#define glUniform4i64NV GLEW_GET_FUN(__glewUniform4i64NV) -#define glUniform4i64vNV GLEW_GET_FUN(__glewUniform4i64vNV) -#define glUniform4ui64NV GLEW_GET_FUN(__glewUniform4ui64NV) -#define glUniform4ui64vNV GLEW_GET_FUN(__glewUniform4ui64vNV) - -#define GLEW_NV_gpu_shader5 GLEW_GET_VAR(__GLEW_NV_gpu_shader5) - -#endif /* GL_NV_gpu_shader5 */ - -/* ---------------------------- GL_NV_half_float --------------------------- */ - -#ifndef GL_NV_half_float -#define GL_NV_half_float 1 - -#define GL_HALF_FLOAT_NV 0x140B - -typedef unsigned short GLhalf; - -typedef void (GLAPIENTRY * PFNGLCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); -typedef void (GLAPIENTRY * PFNGLCOLOR3HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLCOLOR4HNVPROC) (GLhalf red, GLhalf green, GLhalf blue, GLhalf alpha); -typedef void (GLAPIENTRY * PFNGLCOLOR4HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLFOGCOORDHNVPROC) (GLhalf fog); -typedef void (GLAPIENTRY * PFNGLFOGCOORDHVNVPROC) (const GLhalf* fog); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalf s); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalf s, GLhalf t); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r, GLhalf q); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLNORMAL3HNVPROC) (GLhalf nx, GLhalf ny, GLhalf nz); -typedef void (GLAPIENTRY * PFNGLNORMAL3HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD1HNVPROC) (GLhalf s); -typedef void (GLAPIENTRY * PFNGLTEXCOORD1HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2HNVPROC) (GLhalf s, GLhalf t); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD3HNVPROC) (GLhalf s, GLhalf t, GLhalf r); -typedef void (GLAPIENTRY * PFNGLTEXCOORD3HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4HNVPROC) (GLhalf s, GLhalf t, GLhalf r, GLhalf q); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEX2HNVPROC) (GLhalf x, GLhalf y); -typedef void (GLAPIENTRY * PFNGLVERTEX2HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEX3HNVPROC) (GLhalf x, GLhalf y, GLhalf z); -typedef void (GLAPIENTRY * PFNGLVERTEX3HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEX4HNVPROC) (GLhalf x, GLhalf y, GLhalf z, GLhalf w); -typedef void (GLAPIENTRY * PFNGLVERTEX4HVNVPROC) (const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalf x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalf x, GLhalf y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z, GLhalf w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHNVPROC) (GLhalf weight); -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalf* weight); - -#define glColor3hNV GLEW_GET_FUN(__glewColor3hNV) -#define glColor3hvNV GLEW_GET_FUN(__glewColor3hvNV) -#define glColor4hNV GLEW_GET_FUN(__glewColor4hNV) -#define glColor4hvNV GLEW_GET_FUN(__glewColor4hvNV) -#define glFogCoordhNV GLEW_GET_FUN(__glewFogCoordhNV) -#define glFogCoordhvNV GLEW_GET_FUN(__glewFogCoordhvNV) -#define glMultiTexCoord1hNV GLEW_GET_FUN(__glewMultiTexCoord1hNV) -#define glMultiTexCoord1hvNV GLEW_GET_FUN(__glewMultiTexCoord1hvNV) -#define glMultiTexCoord2hNV GLEW_GET_FUN(__glewMultiTexCoord2hNV) -#define glMultiTexCoord2hvNV GLEW_GET_FUN(__glewMultiTexCoord2hvNV) -#define glMultiTexCoord3hNV GLEW_GET_FUN(__glewMultiTexCoord3hNV) -#define glMultiTexCoord3hvNV GLEW_GET_FUN(__glewMultiTexCoord3hvNV) -#define glMultiTexCoord4hNV GLEW_GET_FUN(__glewMultiTexCoord4hNV) -#define glMultiTexCoord4hvNV GLEW_GET_FUN(__glewMultiTexCoord4hvNV) -#define glNormal3hNV GLEW_GET_FUN(__glewNormal3hNV) -#define glNormal3hvNV GLEW_GET_FUN(__glewNormal3hvNV) -#define glSecondaryColor3hNV GLEW_GET_FUN(__glewSecondaryColor3hNV) -#define glSecondaryColor3hvNV GLEW_GET_FUN(__glewSecondaryColor3hvNV) -#define glTexCoord1hNV GLEW_GET_FUN(__glewTexCoord1hNV) -#define glTexCoord1hvNV GLEW_GET_FUN(__glewTexCoord1hvNV) -#define glTexCoord2hNV GLEW_GET_FUN(__glewTexCoord2hNV) -#define glTexCoord2hvNV GLEW_GET_FUN(__glewTexCoord2hvNV) -#define glTexCoord3hNV GLEW_GET_FUN(__glewTexCoord3hNV) -#define glTexCoord3hvNV GLEW_GET_FUN(__glewTexCoord3hvNV) -#define glTexCoord4hNV GLEW_GET_FUN(__glewTexCoord4hNV) -#define glTexCoord4hvNV GLEW_GET_FUN(__glewTexCoord4hvNV) -#define glVertex2hNV GLEW_GET_FUN(__glewVertex2hNV) -#define glVertex2hvNV GLEW_GET_FUN(__glewVertex2hvNV) -#define glVertex3hNV GLEW_GET_FUN(__glewVertex3hNV) -#define glVertex3hvNV GLEW_GET_FUN(__glewVertex3hvNV) -#define glVertex4hNV GLEW_GET_FUN(__glewVertex4hNV) -#define glVertex4hvNV GLEW_GET_FUN(__glewVertex4hvNV) -#define glVertexAttrib1hNV GLEW_GET_FUN(__glewVertexAttrib1hNV) -#define glVertexAttrib1hvNV GLEW_GET_FUN(__glewVertexAttrib1hvNV) -#define glVertexAttrib2hNV GLEW_GET_FUN(__glewVertexAttrib2hNV) -#define glVertexAttrib2hvNV GLEW_GET_FUN(__glewVertexAttrib2hvNV) -#define glVertexAttrib3hNV GLEW_GET_FUN(__glewVertexAttrib3hNV) -#define glVertexAttrib3hvNV GLEW_GET_FUN(__glewVertexAttrib3hvNV) -#define glVertexAttrib4hNV GLEW_GET_FUN(__glewVertexAttrib4hNV) -#define glVertexAttrib4hvNV GLEW_GET_FUN(__glewVertexAttrib4hvNV) -#define glVertexAttribs1hvNV GLEW_GET_FUN(__glewVertexAttribs1hvNV) -#define glVertexAttribs2hvNV GLEW_GET_FUN(__glewVertexAttribs2hvNV) -#define glVertexAttribs3hvNV GLEW_GET_FUN(__glewVertexAttribs3hvNV) -#define glVertexAttribs4hvNV GLEW_GET_FUN(__glewVertexAttribs4hvNV) -#define glVertexWeighthNV GLEW_GET_FUN(__glewVertexWeighthNV) -#define glVertexWeighthvNV GLEW_GET_FUN(__glewVertexWeighthvNV) - -#define GLEW_NV_half_float GLEW_GET_VAR(__GLEW_NV_half_float) - -#endif /* GL_NV_half_float */ - -/* -------------------------- GL_NV_image_formats -------------------------- */ - -#ifndef GL_NV_image_formats -#define GL_NV_image_formats 1 - -#define GLEW_NV_image_formats GLEW_GET_VAR(__GLEW_NV_image_formats) - -#endif /* GL_NV_image_formats */ - -/* ------------------------- GL_NV_instanced_arrays ------------------------ */ - -#ifndef GL_NV_instanced_arrays -#define GL_NV_instanced_arrays 1 - -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV 0x88FE - -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORNVPROC) (GLuint index, GLuint divisor); - -#define glVertexAttribDivisorNV GLEW_GET_FUN(__glewVertexAttribDivisorNV) - -#define GLEW_NV_instanced_arrays GLEW_GET_VAR(__GLEW_NV_instanced_arrays) - -#endif /* GL_NV_instanced_arrays */ - -/* ------------------- GL_NV_internalformat_sample_query ------------------- */ - -#ifndef GL_NV_internalformat_sample_query -#define GL_NV_internalformat_sample_query 1 - -#define GL_MULTISAMPLES_NV 0x9371 -#define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 -#define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 -#define GL_CONFORMANT_NV 0x9374 - -typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint* params); - -#define glGetInternalformatSampleivNV GLEW_GET_FUN(__glewGetInternalformatSampleivNV) - -#define GLEW_NV_internalformat_sample_query GLEW_GET_VAR(__GLEW_NV_internalformat_sample_query) - -#endif /* GL_NV_internalformat_sample_query */ - -/* ------------------------ GL_NV_light_max_exponent ----------------------- */ - -#ifndef GL_NV_light_max_exponent -#define GL_NV_light_max_exponent 1 - -#define GL_MAX_SHININESS_NV 0x8504 -#define GL_MAX_SPOT_EXPONENT_NV 0x8505 - -#define GLEW_NV_light_max_exponent GLEW_GET_VAR(__GLEW_NV_light_max_exponent) - -#endif /* GL_NV_light_max_exponent */ - -/* ----------------------- GL_NV_multisample_coverage ---------------------- */ - -#ifndef GL_NV_multisample_coverage -#define GL_NV_multisample_coverage 1 - -#define GL_COLOR_SAMPLES_NV 0x8E20 - -#define GLEW_NV_multisample_coverage GLEW_GET_VAR(__GLEW_NV_multisample_coverage) - -#endif /* GL_NV_multisample_coverage */ - -/* --------------------- GL_NV_multisample_filter_hint --------------------- */ - -#ifndef GL_NV_multisample_filter_hint -#define GL_NV_multisample_filter_hint 1 - -#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 - -#define GLEW_NV_multisample_filter_hint GLEW_GET_VAR(__GLEW_NV_multisample_filter_hint) - -#endif /* GL_NV_multisample_filter_hint */ - -/* ----------------------- GL_NV_non_square_matrices ----------------------- */ - -#ifndef GL_NV_non_square_matrices -#define GL_NV_non_square_matrices 1 - -#define GL_FLOAT_MAT2x3_NV 0x8B65 -#define GL_FLOAT_MAT2x4_NV 0x8B66 -#define GL_FLOAT_MAT3x2_NV 0x8B67 -#define GL_FLOAT_MAT3x4_NV 0x8B68 -#define GL_FLOAT_MAT4x2_NV 0x8B69 -#define GL_FLOAT_MAT4x3_NV 0x8B6A - -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); - -#define glUniformMatrix2x3fvNV GLEW_GET_FUN(__glewUniformMatrix2x3fvNV) -#define glUniformMatrix2x4fvNV GLEW_GET_FUN(__glewUniformMatrix2x4fvNV) -#define glUniformMatrix3x2fvNV GLEW_GET_FUN(__glewUniformMatrix3x2fvNV) -#define glUniformMatrix3x4fvNV GLEW_GET_FUN(__glewUniformMatrix3x4fvNV) -#define glUniformMatrix4x2fvNV GLEW_GET_FUN(__glewUniformMatrix4x2fvNV) -#define glUniformMatrix4x3fvNV GLEW_GET_FUN(__glewUniformMatrix4x3fvNV) - -#define GLEW_NV_non_square_matrices GLEW_GET_VAR(__GLEW_NV_non_square_matrices) - -#endif /* GL_NV_non_square_matrices */ - -/* ------------------------- GL_NV_occlusion_query ------------------------- */ - -#ifndef GL_NV_occlusion_query -#define GL_NV_occlusion_query 1 - -#define GL_PIXEL_COUNTER_BITS_NV 0x8864 -#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 -#define GL_PIXEL_COUNT_NV 0x8866 -#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 - -typedef void (GLAPIENTRY * PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLENDOCCLUSIONQUERYNVPROC) (void); -typedef void (GLAPIENTRY * PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); - -#define glBeginOcclusionQueryNV GLEW_GET_FUN(__glewBeginOcclusionQueryNV) -#define glDeleteOcclusionQueriesNV GLEW_GET_FUN(__glewDeleteOcclusionQueriesNV) -#define glEndOcclusionQueryNV GLEW_GET_FUN(__glewEndOcclusionQueryNV) -#define glGenOcclusionQueriesNV GLEW_GET_FUN(__glewGenOcclusionQueriesNV) -#define glGetOcclusionQueryivNV GLEW_GET_FUN(__glewGetOcclusionQueryivNV) -#define glGetOcclusionQueryuivNV GLEW_GET_FUN(__glewGetOcclusionQueryuivNV) -#define glIsOcclusionQueryNV GLEW_GET_FUN(__glewIsOcclusionQueryNV) - -#define GLEW_NV_occlusion_query GLEW_GET_VAR(__GLEW_NV_occlusion_query) - -#endif /* GL_NV_occlusion_query */ - -/* -------------------------- GL_NV_pack_subimage -------------------------- */ - -#ifndef GL_NV_pack_subimage -#define GL_NV_pack_subimage 1 - -#define GL_PACK_ROW_LENGTH_NV 0x0D02 -#define GL_PACK_SKIP_ROWS_NV 0x0D03 -#define GL_PACK_SKIP_PIXELS_NV 0x0D04 - -#define GLEW_NV_pack_subimage GLEW_GET_VAR(__GLEW_NV_pack_subimage) - -#endif /* GL_NV_pack_subimage */ - -/* ----------------------- GL_NV_packed_depth_stencil ---------------------- */ - -#ifndef GL_NV_packed_depth_stencil -#define GL_NV_packed_depth_stencil 1 - -#define GL_DEPTH_STENCIL_NV 0x84F9 -#define GL_UNSIGNED_INT_24_8_NV 0x84FA - -#define GLEW_NV_packed_depth_stencil GLEW_GET_VAR(__GLEW_NV_packed_depth_stencil) - -#endif /* GL_NV_packed_depth_stencil */ - -/* --------------------------- GL_NV_packed_float -------------------------- */ - -#ifndef GL_NV_packed_float -#define GL_NV_packed_float 1 - -#define GL_R11F_G11F_B10F_NV 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV_NV 0x8C3B - -#define GLEW_NV_packed_float GLEW_GET_VAR(__GLEW_NV_packed_float) - -#endif /* GL_NV_packed_float */ - -/* ----------------------- GL_NV_packed_float_linear ----------------------- */ - -#ifndef GL_NV_packed_float_linear -#define GL_NV_packed_float_linear 1 - -#define GL_R11F_G11F_B10F_NV 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV_NV 0x8C3B - -#define GLEW_NV_packed_float_linear GLEW_GET_VAR(__GLEW_NV_packed_float_linear) - -#endif /* GL_NV_packed_float_linear */ - -/* --------------------- GL_NV_parameter_buffer_object --------------------- */ - -#ifndef GL_NV_parameter_buffer_object -#define GL_NV_parameter_buffer_object 1 - -#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 -#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 -#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 -#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 -#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 - -typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); -typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); - -#define glProgramBufferParametersIivNV GLEW_GET_FUN(__glewProgramBufferParametersIivNV) -#define glProgramBufferParametersIuivNV GLEW_GET_FUN(__glewProgramBufferParametersIuivNV) -#define glProgramBufferParametersfvNV GLEW_GET_FUN(__glewProgramBufferParametersfvNV) - -#define GLEW_NV_parameter_buffer_object GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object) - -#endif /* GL_NV_parameter_buffer_object */ - -/* --------------------- GL_NV_parameter_buffer_object2 -------------------- */ - -#ifndef GL_NV_parameter_buffer_object2 -#define GL_NV_parameter_buffer_object2 1 - -#define GLEW_NV_parameter_buffer_object2 GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object2) - -#endif /* GL_NV_parameter_buffer_object2 */ - -/* -------------------------- GL_NV_path_rendering ------------------------- */ - -#ifndef GL_NV_path_rendering -#define GL_NV_path_rendering 1 - -#define GL_CLOSE_PATH_NV 0x00 -#define GL_BOLD_BIT_NV 0x01 -#define GL_GLYPH_WIDTH_BIT_NV 0x01 -#define GL_GLYPH_HEIGHT_BIT_NV 0x02 -#define GL_ITALIC_BIT_NV 0x02 -#define GL_MOVE_TO_NV 0x02 -#define GL_RELATIVE_MOVE_TO_NV 0x03 -#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 -#define GL_LINE_TO_NV 0x04 -#define GL_RELATIVE_LINE_TO_NV 0x05 -#define GL_HORIZONTAL_LINE_TO_NV 0x06 -#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 -#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 -#define GL_VERTICAL_LINE_TO_NV 0x08 -#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 -#define GL_QUADRATIC_CURVE_TO_NV 0x0A -#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B -#define GL_CUBIC_CURVE_TO_NV 0x0C -#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D -#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E -#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F -#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 -#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 -#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 -#define GL_SMALL_CCW_ARC_TO_NV 0x12 -#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 -#define GL_SMALL_CW_ARC_TO_NV 0x14 -#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 -#define GL_LARGE_CCW_ARC_TO_NV 0x16 -#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 -#define GL_LARGE_CW_ARC_TO_NV 0x18 -#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 -#define GL_CONIC_CURVE_TO_NV 0x1A -#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B -#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 -#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 -#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 -#define GL_ROUNDED_RECT_NV 0xE8 -#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 -#define GL_ROUNDED_RECT2_NV 0xEA -#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB -#define GL_ROUNDED_RECT4_NV 0xEC -#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED -#define GL_ROUNDED_RECT8_NV 0xEE -#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF -#define GL_RESTART_PATH_NV 0xF0 -#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 -#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 -#define GL_RECT_NV 0xF6 -#define GL_RELATIVE_RECT_NV 0xF7 -#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 -#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA -#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC -#define GL_ARC_TO_NV 0xFE -#define GL_RELATIVE_ARC_TO_NV 0xFF -#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D -#define GL_PRIMARY_COLOR 0x8577 -#define GL_PATH_FORMAT_SVG_NV 0x9070 -#define GL_PATH_FORMAT_PS_NV 0x9071 -#define GL_STANDARD_FONT_NAME_NV 0x9072 -#define GL_SYSTEM_FONT_NAME_NV 0x9073 -#define GL_FILE_NAME_NV 0x9074 -#define GL_PATH_STROKE_WIDTH_NV 0x9075 -#define GL_PATH_END_CAPS_NV 0x9076 -#define GL_PATH_INITIAL_END_CAP_NV 0x9077 -#define GL_PATH_TERMINAL_END_CAP_NV 0x9078 -#define GL_PATH_JOIN_STYLE_NV 0x9079 -#define GL_PATH_MITER_LIMIT_NV 0x907A -#define GL_PATH_DASH_CAPS_NV 0x907B -#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C -#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D -#define GL_PATH_DASH_OFFSET_NV 0x907E -#define GL_PATH_CLIENT_LENGTH_NV 0x907F -#define GL_PATH_FILL_MODE_NV 0x9080 -#define GL_PATH_FILL_MASK_NV 0x9081 -#define GL_PATH_FILL_COVER_MODE_NV 0x9082 -#define GL_PATH_STROKE_COVER_MODE_NV 0x9083 -#define GL_PATH_STROKE_MASK_NV 0x9084 -#define GL_PATH_STROKE_BOUND_NV 0x9086 -#define GL_COUNT_UP_NV 0x9088 -#define GL_COUNT_DOWN_NV 0x9089 -#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A -#define GL_CONVEX_HULL_NV 0x908B -#define GL_BOUNDING_BOX_NV 0x908D -#define GL_TRANSLATE_X_NV 0x908E -#define GL_TRANSLATE_Y_NV 0x908F -#define GL_TRANSLATE_2D_NV 0x9090 -#define GL_TRANSLATE_3D_NV 0x9091 -#define GL_AFFINE_2D_NV 0x9092 -#define GL_AFFINE_3D_NV 0x9094 -#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 -#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 -#define GL_UTF8_NV 0x909A -#define GL_UTF16_NV 0x909B -#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C -#define GL_PATH_COMMAND_COUNT_NV 0x909D -#define GL_PATH_COORD_COUNT_NV 0x909E -#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F -#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 -#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 -#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 -#define GL_SQUARE_NV 0x90A3 -#define GL_ROUND_NV 0x90A4 -#define GL_TRIANGULAR_NV 0x90A5 -#define GL_BEVEL_NV 0x90A6 -#define GL_MITER_REVERT_NV 0x90A7 -#define GL_MITER_TRUNCATE_NV 0x90A8 -#define GL_SKIP_MISSING_GLYPH_NV 0x90A9 -#define GL_USE_MISSING_GLYPH_NV 0x90AA -#define GL_PATH_ERROR_POSITION_NV 0x90AB -#define GL_PATH_FOG_GEN_MODE_NV 0x90AC -#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD -#define GL_ADJACENT_PAIRS_NV 0x90AE -#define GL_FIRST_TO_REST_NV 0x90AF -#define GL_PATH_GEN_MODE_NV 0x90B0 -#define GL_PATH_GEN_COEFF_NV 0x90B1 -#define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2 -#define GL_PATH_GEN_COMPONENTS_NV 0x90B3 -#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 -#define GL_MOVE_TO_RESETS_NV 0x90B5 -#define GL_MOVE_TO_CONTINUES_NV 0x90B6 -#define GL_PATH_STENCIL_FUNC_NV 0x90B7 -#define GL_PATH_STENCIL_REF_NV 0x90B8 -#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 -#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD -#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE -#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF -#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 -#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 -#define GL_FONT_UNAVAILABLE_NV 0x936A -#define GL_FONT_UNINTELLIGIBLE_NV 0x936B -#define GL_STANDARD_FONT_FORMAT_NV 0x936C -#define GL_FRAGMENT_INPUT_NV 0x936D -#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 -#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 -#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 -#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 -#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 -#define GL_FONT_ASCENDER_BIT_NV 0x00200000 -#define GL_FONT_DESCENDER_BIT_NV 0x00400000 -#define GL_FONT_HEIGHT_BIT_NV 0x00800000 -#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 -#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 -#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 -#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 -#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 -#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 - -typedef void (GLAPIENTRY * PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); -typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); -typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); -typedef void (GLAPIENTRY * PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); -typedef GLuint (GLAPIENTRY * PFNGLGENPATHSNVPROC) (GLsizei range); -typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat* value); -typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint* value); -typedef void (GLAPIENTRY * PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte* commands); -typedef void (GLAPIENTRY * PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat* coords); -typedef void (GLAPIENTRY * PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat* dashArray); -typedef GLfloat (GLAPIENTRY * PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); -typedef void (GLAPIENTRY * PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat* metrics); -typedef void (GLAPIENTRY * PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); -typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat* value); -typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint* value); -typedef void (GLAPIENTRY * PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); -typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat* value); -typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint* value); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLfloat *params); -typedef void (GLAPIENTRY * PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); -typedef GLboolean (GLAPIENTRY * PFNGLISPATHNVPROC) (GLuint path); -typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); -typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); -typedef void (GLAPIENTRY * PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat* coeffs); -typedef void (GLAPIENTRY * PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void*coords); -typedef void (GLAPIENTRY * PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); -typedef void (GLAPIENTRY * PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum zfunc); -typedef void (GLAPIENTRY * PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat* dashArray); -typedef void (GLAPIENTRY * PFNGLPATHFOGGENNVPROC) (GLenum genMode); -typedef GLenum (GLAPIENTRY * PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef GLenum (GLAPIENTRY * PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); -typedef void (GLAPIENTRY * PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef void (GLAPIENTRY * PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void*charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef GLenum (GLAPIENTRY * PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); -typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); -typedef void (GLAPIENTRY * PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint* value); -typedef void (GLAPIENTRY * PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); -typedef void (GLAPIENTRY * PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); -typedef void (GLAPIENTRY * PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); -typedef void (GLAPIENTRY * PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void*coords); -typedef void (GLAPIENTRY * PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); -typedef void (GLAPIENTRY * PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat* coeffs); -typedef GLboolean (GLAPIENTRY * PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat* x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); -typedef void (GLAPIENTRY * PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat* coeffs); -typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); -typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); -typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); -typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); -typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); -typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); -typedef void (GLAPIENTRY * PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat* transformValues); -typedef void (GLAPIENTRY * PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint paths[], const GLfloat weights[]); - -#define glCopyPathNV GLEW_GET_FUN(__glewCopyPathNV) -#define glCoverFillPathInstancedNV GLEW_GET_FUN(__glewCoverFillPathInstancedNV) -#define glCoverFillPathNV GLEW_GET_FUN(__glewCoverFillPathNV) -#define glCoverStrokePathInstancedNV GLEW_GET_FUN(__glewCoverStrokePathInstancedNV) -#define glCoverStrokePathNV GLEW_GET_FUN(__glewCoverStrokePathNV) -#define glDeletePathsNV GLEW_GET_FUN(__glewDeletePathsNV) -#define glGenPathsNV GLEW_GET_FUN(__glewGenPathsNV) -#define glGetPathColorGenfvNV GLEW_GET_FUN(__glewGetPathColorGenfvNV) -#define glGetPathColorGenivNV GLEW_GET_FUN(__glewGetPathColorGenivNV) -#define glGetPathCommandsNV GLEW_GET_FUN(__glewGetPathCommandsNV) -#define glGetPathCoordsNV GLEW_GET_FUN(__glewGetPathCoordsNV) -#define glGetPathDashArrayNV GLEW_GET_FUN(__glewGetPathDashArrayNV) -#define glGetPathLengthNV GLEW_GET_FUN(__glewGetPathLengthNV) -#define glGetPathMetricRangeNV GLEW_GET_FUN(__glewGetPathMetricRangeNV) -#define glGetPathMetricsNV GLEW_GET_FUN(__glewGetPathMetricsNV) -#define glGetPathParameterfvNV GLEW_GET_FUN(__glewGetPathParameterfvNV) -#define glGetPathParameterivNV GLEW_GET_FUN(__glewGetPathParameterivNV) -#define glGetPathSpacingNV GLEW_GET_FUN(__glewGetPathSpacingNV) -#define glGetPathTexGenfvNV GLEW_GET_FUN(__glewGetPathTexGenfvNV) -#define glGetPathTexGenivNV GLEW_GET_FUN(__glewGetPathTexGenivNV) -#define glGetProgramResourcefvNV GLEW_GET_FUN(__glewGetProgramResourcefvNV) -#define glInterpolatePathsNV GLEW_GET_FUN(__glewInterpolatePathsNV) -#define glIsPathNV GLEW_GET_FUN(__glewIsPathNV) -#define glIsPointInFillPathNV GLEW_GET_FUN(__glewIsPointInFillPathNV) -#define glIsPointInStrokePathNV GLEW_GET_FUN(__glewIsPointInStrokePathNV) -#define glMatrixLoad3x2fNV GLEW_GET_FUN(__glewMatrixLoad3x2fNV) -#define glMatrixLoad3x3fNV GLEW_GET_FUN(__glewMatrixLoad3x3fNV) -#define glMatrixLoadTranspose3x3fNV GLEW_GET_FUN(__glewMatrixLoadTranspose3x3fNV) -#define glMatrixMult3x2fNV GLEW_GET_FUN(__glewMatrixMult3x2fNV) -#define glMatrixMult3x3fNV GLEW_GET_FUN(__glewMatrixMult3x3fNV) -#define glMatrixMultTranspose3x3fNV GLEW_GET_FUN(__glewMatrixMultTranspose3x3fNV) -#define glPathColorGenNV GLEW_GET_FUN(__glewPathColorGenNV) -#define glPathCommandsNV GLEW_GET_FUN(__glewPathCommandsNV) -#define glPathCoordsNV GLEW_GET_FUN(__glewPathCoordsNV) -#define glPathCoverDepthFuncNV GLEW_GET_FUN(__glewPathCoverDepthFuncNV) -#define glPathDashArrayNV GLEW_GET_FUN(__glewPathDashArrayNV) -#define glPathFogGenNV GLEW_GET_FUN(__glewPathFogGenNV) -#define glPathGlyphIndexArrayNV GLEW_GET_FUN(__glewPathGlyphIndexArrayNV) -#define glPathGlyphIndexRangeNV GLEW_GET_FUN(__glewPathGlyphIndexRangeNV) -#define glPathGlyphRangeNV GLEW_GET_FUN(__glewPathGlyphRangeNV) -#define glPathGlyphsNV GLEW_GET_FUN(__glewPathGlyphsNV) -#define glPathMemoryGlyphIndexArrayNV GLEW_GET_FUN(__glewPathMemoryGlyphIndexArrayNV) -#define glPathParameterfNV GLEW_GET_FUN(__glewPathParameterfNV) -#define glPathParameterfvNV GLEW_GET_FUN(__glewPathParameterfvNV) -#define glPathParameteriNV GLEW_GET_FUN(__glewPathParameteriNV) -#define glPathParameterivNV GLEW_GET_FUN(__glewPathParameterivNV) -#define glPathStencilDepthOffsetNV GLEW_GET_FUN(__glewPathStencilDepthOffsetNV) -#define glPathStencilFuncNV GLEW_GET_FUN(__glewPathStencilFuncNV) -#define glPathStringNV GLEW_GET_FUN(__glewPathStringNV) -#define glPathSubCommandsNV GLEW_GET_FUN(__glewPathSubCommandsNV) -#define glPathSubCoordsNV GLEW_GET_FUN(__glewPathSubCoordsNV) -#define glPathTexGenNV GLEW_GET_FUN(__glewPathTexGenNV) -#define glPointAlongPathNV GLEW_GET_FUN(__glewPointAlongPathNV) -#define glProgramPathFragmentInputGenNV GLEW_GET_FUN(__glewProgramPathFragmentInputGenNV) -#define glStencilFillPathInstancedNV GLEW_GET_FUN(__glewStencilFillPathInstancedNV) -#define glStencilFillPathNV GLEW_GET_FUN(__glewStencilFillPathNV) -#define glStencilStrokePathInstancedNV GLEW_GET_FUN(__glewStencilStrokePathInstancedNV) -#define glStencilStrokePathNV GLEW_GET_FUN(__glewStencilStrokePathNV) -#define glStencilThenCoverFillPathInstancedNV GLEW_GET_FUN(__glewStencilThenCoverFillPathInstancedNV) -#define glStencilThenCoverFillPathNV GLEW_GET_FUN(__glewStencilThenCoverFillPathNV) -#define glStencilThenCoverStrokePathInstancedNV GLEW_GET_FUN(__glewStencilThenCoverStrokePathInstancedNV) -#define glStencilThenCoverStrokePathNV GLEW_GET_FUN(__glewStencilThenCoverStrokePathNV) -#define glTransformPathNV GLEW_GET_FUN(__glewTransformPathNV) -#define glWeightPathsNV GLEW_GET_FUN(__glewWeightPathsNV) - -#define GLEW_NV_path_rendering GLEW_GET_VAR(__GLEW_NV_path_rendering) - -#endif /* GL_NV_path_rendering */ - -/* -------------------- GL_NV_path_rendering_shared_edge ------------------- */ - -#ifndef GL_NV_path_rendering_shared_edge -#define GL_NV_path_rendering_shared_edge 1 - -#define GL_SHARED_EDGE_NV 0xC0 - -#define GLEW_NV_path_rendering_shared_edge GLEW_GET_VAR(__GLEW_NV_path_rendering_shared_edge) - -#endif /* GL_NV_path_rendering_shared_edge */ - -/* ----------------------- GL_NV_pixel_buffer_object ----------------------- */ - -#ifndef GL_NV_pixel_buffer_object -#define GL_NV_pixel_buffer_object 1 - -#define GL_PIXEL_PACK_BUFFER_NV 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_NV 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_NV 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_NV 0x88EF - -#define GLEW_NV_pixel_buffer_object GLEW_GET_VAR(__GLEW_NV_pixel_buffer_object) - -#endif /* GL_NV_pixel_buffer_object */ - -/* ------------------------- GL_NV_pixel_data_range ------------------------ */ - -#ifndef GL_NV_pixel_data_range -#define GL_NV_pixel_data_range 1 - -#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 -#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 -#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A -#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B -#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C -#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D - -typedef void (GLAPIENTRY * PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, void *pointer); - -#define glFlushPixelDataRangeNV GLEW_GET_FUN(__glewFlushPixelDataRangeNV) -#define glPixelDataRangeNV GLEW_GET_FUN(__glewPixelDataRangeNV) - -#define GLEW_NV_pixel_data_range GLEW_GET_VAR(__GLEW_NV_pixel_data_range) - -#endif /* GL_NV_pixel_data_range */ - -/* ------------------------- GL_NV_platform_binary ------------------------- */ - -#ifndef GL_NV_platform_binary -#define GL_NV_platform_binary 1 - -#define GL_NVIDIA_PLATFORM_BINARY_NV 0x890B - -#define GLEW_NV_platform_binary GLEW_GET_VAR(__GLEW_NV_platform_binary) - -#endif /* GL_NV_platform_binary */ - -/* --------------------------- GL_NV_point_sprite -------------------------- */ - -#ifndef GL_NV_point_sprite -#define GL_NV_point_sprite 1 - -#define GL_POINT_SPRITE_NV 0x8861 -#define GL_COORD_REPLACE_NV 0x8862 -#define GL_POINT_SPRITE_R_MODE_NV 0x8863 - -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint* params); - -#define glPointParameteriNV GLEW_GET_FUN(__glewPointParameteriNV) -#define glPointParameterivNV GLEW_GET_FUN(__glewPointParameterivNV) - -#define GLEW_NV_point_sprite GLEW_GET_VAR(__GLEW_NV_point_sprite) - -#endif /* GL_NV_point_sprite */ - -/* --------------------------- GL_NV_polygon_mode -------------------------- */ - -#ifndef GL_NV_polygon_mode -#define GL_NV_polygon_mode 1 - -#define GL_POLYGON_MODE_NV 0x0B40 -#define GL_POINT_NV 0x1B00 -#define GL_LINE_NV 0x1B01 -#define GL_FILL_NV 0x1B02 -#define GL_POLYGON_OFFSET_POINT_NV 0x2A01 -#define GL_POLYGON_OFFSET_LINE_NV 0x2A02 - -typedef void (GLAPIENTRY * PFNGLPOLYGONMODENVPROC) (GLenum face, GLenum mode); - -#define glPolygonModeNV GLEW_GET_FUN(__glewPolygonModeNV) - -#define GLEW_NV_polygon_mode GLEW_GET_VAR(__GLEW_NV_polygon_mode) - -#endif /* GL_NV_polygon_mode */ - -/* -------------------------- GL_NV_present_video -------------------------- */ - -#ifndef GL_NV_present_video -#define GL_NV_present_video 1 - -#define GL_FRAME_NV 0x8E26 -#define GL_FIELDS_NV 0x8E27 -#define GL_CURRENT_TIME_NV 0x8E28 -#define GL_NUM_FILL_STREAMS_NV 0x8E29 -#define GL_PRESENT_TIME_NV 0x8E2A -#define GL_PRESENT_DURATION_NV 0x8E2B - -typedef void (GLAPIENTRY * PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT* params); -typedef void (GLAPIENTRY * PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT* params); -typedef void (GLAPIENTRY * PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint* params); -typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); -typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); - -#define glGetVideoi64vNV GLEW_GET_FUN(__glewGetVideoi64vNV) -#define glGetVideoivNV GLEW_GET_FUN(__glewGetVideoivNV) -#define glGetVideoui64vNV GLEW_GET_FUN(__glewGetVideoui64vNV) -#define glGetVideouivNV GLEW_GET_FUN(__glewGetVideouivNV) -#define glPresentFrameDualFillNV GLEW_GET_FUN(__glewPresentFrameDualFillNV) -#define glPresentFrameKeyedNV GLEW_GET_FUN(__glewPresentFrameKeyedNV) - -#define GLEW_NV_present_video GLEW_GET_VAR(__GLEW_NV_present_video) - -#endif /* GL_NV_present_video */ - -/* ------------------------ GL_NV_primitive_restart ------------------------ */ - -#ifndef GL_NV_primitive_restart -#define GL_NV_primitive_restart 1 - -#define GL_PRIMITIVE_RESTART_NV 0x8558 -#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 - -typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); -typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTNVPROC) (void); - -#define glPrimitiveRestartIndexNV GLEW_GET_FUN(__glewPrimitiveRestartIndexNV) -#define glPrimitiveRestartNV GLEW_GET_FUN(__glewPrimitiveRestartNV) - -#define GLEW_NV_primitive_restart GLEW_GET_VAR(__GLEW_NV_primitive_restart) - -#endif /* GL_NV_primitive_restart */ - -/* ---------------------------- GL_NV_read_depth --------------------------- */ - -#ifndef GL_NV_read_depth -#define GL_NV_read_depth 1 - -#define GLEW_NV_read_depth GLEW_GET_VAR(__GLEW_NV_read_depth) - -#endif /* GL_NV_read_depth */ - -/* ------------------------ GL_NV_read_depth_stencil ----------------------- */ - -#ifndef GL_NV_read_depth_stencil -#define GL_NV_read_depth_stencil 1 - -#define GLEW_NV_read_depth_stencil GLEW_GET_VAR(__GLEW_NV_read_depth_stencil) - -#endif /* GL_NV_read_depth_stencil */ - -/* --------------------------- GL_NV_read_stencil -------------------------- */ - -#ifndef GL_NV_read_stencil -#define GL_NV_read_stencil 1 - -#define GLEW_NV_read_stencil GLEW_GET_VAR(__GLEW_NV_read_stencil) - -#endif /* GL_NV_read_stencil */ - -/* ------------------------ GL_NV_register_combiners ----------------------- */ - -#ifndef GL_NV_register_combiners -#define GL_NV_register_combiners 1 - -#define GL_REGISTER_COMBINERS_NV 0x8522 -#define GL_VARIABLE_A_NV 0x8523 -#define GL_VARIABLE_B_NV 0x8524 -#define GL_VARIABLE_C_NV 0x8525 -#define GL_VARIABLE_D_NV 0x8526 -#define GL_VARIABLE_E_NV 0x8527 -#define GL_VARIABLE_F_NV 0x8528 -#define GL_VARIABLE_G_NV 0x8529 -#define GL_CONSTANT_COLOR0_NV 0x852A -#define GL_CONSTANT_COLOR1_NV 0x852B -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D -#define GL_SPARE0_NV 0x852E -#define GL_SPARE1_NV 0x852F -#define GL_DISCARD_NV 0x8530 -#define GL_E_TIMES_F_NV 0x8531 -#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 -#define GL_UNSIGNED_IDENTITY_NV 0x8536 -#define GL_UNSIGNED_INVERT_NV 0x8537 -#define GL_EXPAND_NORMAL_NV 0x8538 -#define GL_EXPAND_NEGATE_NV 0x8539 -#define GL_HALF_BIAS_NORMAL_NV 0x853A -#define GL_HALF_BIAS_NEGATE_NV 0x853B -#define GL_SIGNED_IDENTITY_NV 0x853C -#define GL_SIGNED_NEGATE_NV 0x853D -#define GL_SCALE_BY_TWO_NV 0x853E -#define GL_SCALE_BY_FOUR_NV 0x853F -#define GL_SCALE_BY_ONE_HALF_NV 0x8540 -#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 -#define GL_COMBINER_INPUT_NV 0x8542 -#define GL_COMBINER_MAPPING_NV 0x8543 -#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 -#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 -#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 -#define GL_COMBINER_MUX_SUM_NV 0x8547 -#define GL_COMBINER_SCALE_NV 0x8548 -#define GL_COMBINER_BIAS_NV 0x8549 -#define GL_COMBINER_AB_OUTPUT_NV 0x854A -#define GL_COMBINER_CD_OUTPUT_NV 0x854B -#define GL_COMBINER_SUM_OUTPUT_NV 0x854C -#define GL_MAX_GENERAL_COMBINERS_NV 0x854D -#define GL_NUM_GENERAL_COMBINERS_NV 0x854E -#define GL_COLOR_SUM_CLAMP_NV 0x854F -#define GL_COMBINER0_NV 0x8550 -#define GL_COMBINER1_NV 0x8551 -#define GL_COMBINER2_NV 0x8552 -#define GL_COMBINER3_NV 0x8553 -#define GL_COMBINER4_NV 0x8554 -#define GL_COMBINER5_NV 0x8555 -#define GL_COMBINER6_NV 0x8556 -#define GL_COMBINER7_NV 0x8557 - -typedef void (GLAPIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (GLAPIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); -typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint* params); - -#define glCombinerInputNV GLEW_GET_FUN(__glewCombinerInputNV) -#define glCombinerOutputNV GLEW_GET_FUN(__glewCombinerOutputNV) -#define glCombinerParameterfNV GLEW_GET_FUN(__glewCombinerParameterfNV) -#define glCombinerParameterfvNV GLEW_GET_FUN(__glewCombinerParameterfvNV) -#define glCombinerParameteriNV GLEW_GET_FUN(__glewCombinerParameteriNV) -#define glCombinerParameterivNV GLEW_GET_FUN(__glewCombinerParameterivNV) -#define glFinalCombinerInputNV GLEW_GET_FUN(__glewFinalCombinerInputNV) -#define glGetCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetCombinerInputParameterfvNV) -#define glGetCombinerInputParameterivNV GLEW_GET_FUN(__glewGetCombinerInputParameterivNV) -#define glGetCombinerOutputParameterfvNV GLEW_GET_FUN(__glewGetCombinerOutputParameterfvNV) -#define glGetCombinerOutputParameterivNV GLEW_GET_FUN(__glewGetCombinerOutputParameterivNV) -#define glGetFinalCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterfvNV) -#define glGetFinalCombinerInputParameterivNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterivNV) - -#define GLEW_NV_register_combiners GLEW_GET_VAR(__GLEW_NV_register_combiners) - -#endif /* GL_NV_register_combiners */ - -/* ----------------------- GL_NV_register_combiners2 ----------------------- */ - -#ifndef GL_NV_register_combiners2 -#define GL_NV_register_combiners2 1 - -#define GL_PER_STAGE_CONSTANTS_NV 0x8535 - -typedef void (GLAPIENTRY * PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat* params); - -#define glCombinerStageParameterfvNV GLEW_GET_FUN(__glewCombinerStageParameterfvNV) -#define glGetCombinerStageParameterfvNV GLEW_GET_FUN(__glewGetCombinerStageParameterfvNV) - -#define GLEW_NV_register_combiners2 GLEW_GET_VAR(__GLEW_NV_register_combiners2) - -#endif /* GL_NV_register_combiners2 */ - -/* ------------------ GL_NV_robustness_video_memory_purge ------------------ */ - -#ifndef GL_NV_robustness_video_memory_purge -#define GL_NV_robustness_video_memory_purge 1 - -#define GL_EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x334C -#define GL_PURGED_CONTEXT_RESET_NV 0x92BB - -#define GLEW_NV_robustness_video_memory_purge GLEW_GET_VAR(__GLEW_NV_robustness_video_memory_purge) - -#endif /* GL_NV_robustness_video_memory_purge */ - -/* --------------------------- GL_NV_sRGB_formats -------------------------- */ - -#ifndef GL_NV_sRGB_formats -#define GL_NV_sRGB_formats 1 - -#define GL_ETC1_SRGB8_NV 0x88EE -#define GL_SRGB8_NV 0x8C41 -#define GL_SLUMINANCE_ALPHA_NV 0x8C44 -#define GL_SLUMINANCE8_ALPHA8_NV 0x8C45 -#define GL_SLUMINANCE_NV 0x8C46 -#define GL_SLUMINANCE8_NV 0x8C47 -#define GL_COMPRESSED_SRGB_S3TC_DXT1_NV 0x8C4C -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV 0x8C4D -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV 0x8C4E -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV 0x8C4F - -#define GLEW_NV_sRGB_formats GLEW_GET_VAR(__GLEW_NV_sRGB_formats) - -#endif /* GL_NV_sRGB_formats */ - -/* ------------------------- GL_NV_sample_locations ------------------------ */ - -#ifndef GL_NV_sample_locations -#define GL_NV_sample_locations 1 - -#define GL_SAMPLE_LOCATION_NV 0x8E50 -#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D -#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E -#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 -#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 -#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); - -#define glFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewFramebufferSampleLocationsfvNV) -#define glNamedFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewNamedFramebufferSampleLocationsfvNV) - -#define GLEW_NV_sample_locations GLEW_GET_VAR(__GLEW_NV_sample_locations) - -#endif /* GL_NV_sample_locations */ - -/* ------------------ GL_NV_sample_mask_override_coverage ------------------ */ - -#ifndef GL_NV_sample_mask_override_coverage -#define GL_NV_sample_mask_override_coverage 1 - -#define GLEW_NV_sample_mask_override_coverage GLEW_GET_VAR(__GLEW_NV_sample_mask_override_coverage) - -#endif /* GL_NV_sample_mask_override_coverage */ - -/* ---------------------- GL_NV_shader_atomic_counters --------------------- */ - -#ifndef GL_NV_shader_atomic_counters -#define GL_NV_shader_atomic_counters 1 - -#define GLEW_NV_shader_atomic_counters GLEW_GET_VAR(__GLEW_NV_shader_atomic_counters) - -#endif /* GL_NV_shader_atomic_counters */ - -/* ----------------------- GL_NV_shader_atomic_float ----------------------- */ - -#ifndef GL_NV_shader_atomic_float -#define GL_NV_shader_atomic_float 1 - -#define GLEW_NV_shader_atomic_float GLEW_GET_VAR(__GLEW_NV_shader_atomic_float) - -#endif /* GL_NV_shader_atomic_float */ - -/* ---------------------- GL_NV_shader_atomic_float64 ---------------------- */ - -#ifndef GL_NV_shader_atomic_float64 -#define GL_NV_shader_atomic_float64 1 - -#define GLEW_NV_shader_atomic_float64 GLEW_GET_VAR(__GLEW_NV_shader_atomic_float64) - -#endif /* GL_NV_shader_atomic_float64 */ - -/* -------------------- GL_NV_shader_atomic_fp16_vector -------------------- */ - -#ifndef GL_NV_shader_atomic_fp16_vector -#define GL_NV_shader_atomic_fp16_vector 1 - -#define GLEW_NV_shader_atomic_fp16_vector GLEW_GET_VAR(__GLEW_NV_shader_atomic_fp16_vector) - -#endif /* GL_NV_shader_atomic_fp16_vector */ - -/* ----------------------- GL_NV_shader_atomic_int64 ----------------------- */ - -#ifndef GL_NV_shader_atomic_int64 -#define GL_NV_shader_atomic_int64 1 - -#define GLEW_NV_shader_atomic_int64 GLEW_GET_VAR(__GLEW_NV_shader_atomic_int64) - -#endif /* GL_NV_shader_atomic_int64 */ - -/* ------------------------ GL_NV_shader_buffer_load ----------------------- */ - -#ifndef GL_NV_shader_buffer_load -#define GL_NV_shader_buffer_load 1 - -#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D -#define GL_GPU_ADDRESS_NV 0x8F34 -#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 - -typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT* params); -typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT* result); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT* params); -typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); -typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); -typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); -typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); -typedef void (GLAPIENTRY * PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); -typedef void (GLAPIENTRY * PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); - -#define glGetBufferParameterui64vNV GLEW_GET_FUN(__glewGetBufferParameterui64vNV) -#define glGetIntegerui64vNV GLEW_GET_FUN(__glewGetIntegerui64vNV) -#define glGetNamedBufferParameterui64vNV GLEW_GET_FUN(__glewGetNamedBufferParameterui64vNV) -#define glIsBufferResidentNV GLEW_GET_FUN(__glewIsBufferResidentNV) -#define glIsNamedBufferResidentNV GLEW_GET_FUN(__glewIsNamedBufferResidentNV) -#define glMakeBufferNonResidentNV GLEW_GET_FUN(__glewMakeBufferNonResidentNV) -#define glMakeBufferResidentNV GLEW_GET_FUN(__glewMakeBufferResidentNV) -#define glMakeNamedBufferNonResidentNV GLEW_GET_FUN(__glewMakeNamedBufferNonResidentNV) -#define glMakeNamedBufferResidentNV GLEW_GET_FUN(__glewMakeNamedBufferResidentNV) -#define glProgramUniformui64NV GLEW_GET_FUN(__glewProgramUniformui64NV) -#define glProgramUniformui64vNV GLEW_GET_FUN(__glewProgramUniformui64vNV) -#define glUniformui64NV GLEW_GET_FUN(__glewUniformui64NV) -#define glUniformui64vNV GLEW_GET_FUN(__glewUniformui64vNV) - -#define GLEW_NV_shader_buffer_load GLEW_GET_VAR(__GLEW_NV_shader_buffer_load) - -#endif /* GL_NV_shader_buffer_load */ - -/* ---------------- GL_NV_shader_noperspective_interpolation --------------- */ - -#ifndef GL_NV_shader_noperspective_interpolation -#define GL_NV_shader_noperspective_interpolation 1 - -#define GLEW_NV_shader_noperspective_interpolation GLEW_GET_VAR(__GLEW_NV_shader_noperspective_interpolation) - -#endif /* GL_NV_shader_noperspective_interpolation */ - -/* ------------------- GL_NV_shader_storage_buffer_object ------------------ */ - -#ifndef GL_NV_shader_storage_buffer_object -#define GL_NV_shader_storage_buffer_object 1 - -#define GLEW_NV_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_NV_shader_storage_buffer_object) - -#endif /* GL_NV_shader_storage_buffer_object */ - -/* ----------------------- GL_NV_shader_thread_group ----------------------- */ - -#ifndef GL_NV_shader_thread_group -#define GL_NV_shader_thread_group 1 - -#define GL_WARP_SIZE_NV 0x9339 -#define GL_WARPS_PER_SM_NV 0x933A -#define GL_SM_COUNT_NV 0x933B - -#define GLEW_NV_shader_thread_group GLEW_GET_VAR(__GLEW_NV_shader_thread_group) - -#endif /* GL_NV_shader_thread_group */ - -/* ---------------------- GL_NV_shader_thread_shuffle ---------------------- */ - -#ifndef GL_NV_shader_thread_shuffle -#define GL_NV_shader_thread_shuffle 1 - -#define GLEW_NV_shader_thread_shuffle GLEW_GET_VAR(__GLEW_NV_shader_thread_shuffle) - -#endif /* GL_NV_shader_thread_shuffle */ - -/* ---------------------- GL_NV_shadow_samplers_array ---------------------- */ - -#ifndef GL_NV_shadow_samplers_array -#define GL_NV_shadow_samplers_array 1 - -#define GL_SAMPLER_2D_ARRAY_SHADOW_NV 0x8DC4 - -#define GLEW_NV_shadow_samplers_array GLEW_GET_VAR(__GLEW_NV_shadow_samplers_array) - -#endif /* GL_NV_shadow_samplers_array */ - -/* ----------------------- GL_NV_shadow_samplers_cube ---------------------- */ - -#ifndef GL_NV_shadow_samplers_cube -#define GL_NV_shadow_samplers_cube 1 - -#define GL_SAMPLER_CUBE_SHADOW_NV 0x8DC5 - -#define GLEW_NV_shadow_samplers_cube GLEW_GET_VAR(__GLEW_NV_shadow_samplers_cube) - -#endif /* GL_NV_shadow_samplers_cube */ - -/* ---------------------- GL_NV_stereo_view_rendering ---------------------- */ - -#ifndef GL_NV_stereo_view_rendering -#define GL_NV_stereo_view_rendering 1 - -#define GLEW_NV_stereo_view_rendering GLEW_GET_VAR(__GLEW_NV_stereo_view_rendering) - -#endif /* GL_NV_stereo_view_rendering */ - -/* ---------------------- GL_NV_tessellation_program5 ---------------------- */ - -#ifndef GL_NV_tessellation_program5 -#define GL_NV_tessellation_program5 1 - -#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 -#define GL_TESS_CONTROL_PROGRAM_NV 0x891E -#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F -#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 -#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 - -#define GLEW_NV_tessellation_program5 GLEW_GET_VAR(__GLEW_NV_tessellation_program5) - -#endif /* GL_NV_tessellation_program5 */ - -/* -------------------------- GL_NV_texgen_emboss -------------------------- */ - -#ifndef GL_NV_texgen_emboss -#define GL_NV_texgen_emboss 1 - -#define GL_EMBOSS_LIGHT_NV 0x855D -#define GL_EMBOSS_CONSTANT_NV 0x855E -#define GL_EMBOSS_MAP_NV 0x855F - -#define GLEW_NV_texgen_emboss GLEW_GET_VAR(__GLEW_NV_texgen_emboss) - -#endif /* GL_NV_texgen_emboss */ - -/* ------------------------ GL_NV_texgen_reflection ------------------------ */ - -#ifndef GL_NV_texgen_reflection -#define GL_NV_texgen_reflection 1 - -#define GL_NORMAL_MAP_NV 0x8511 -#define GL_REFLECTION_MAP_NV 0x8512 - -#define GLEW_NV_texgen_reflection GLEW_GET_VAR(__GLEW_NV_texgen_reflection) - -#endif /* GL_NV_texgen_reflection */ - -/* -------------------------- GL_NV_texture_array -------------------------- */ - -#ifndef GL_NV_texture_array -#define GL_NV_texture_array 1 - -#define GL_UNPACK_SKIP_IMAGES_NV 0x806D -#define GL_UNPACK_IMAGE_HEIGHT_NV 0x806E -#define GL_MAX_ARRAY_TEXTURE_LAYERS_NV 0x88FF -#define GL_TEXTURE_2D_ARRAY_NV 0x8C1A -#define GL_TEXTURE_BINDING_2D_ARRAY_NV 0x8C1D -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_NV 0x8CD4 -#define GL_SAMPLER_2D_ARRAY_NV 0x8DC1 - -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DNVPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DNVPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DNVPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERNVPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DNVPROC) (GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DNVPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); - -#define glCompressedTexImage3DNV GLEW_GET_FUN(__glewCompressedTexImage3DNV) -#define glCompressedTexSubImage3DNV GLEW_GET_FUN(__glewCompressedTexSubImage3DNV) -#define glCopyTexSubImage3DNV GLEW_GET_FUN(__glewCopyTexSubImage3DNV) -#define glFramebufferTextureLayerNV GLEW_GET_FUN(__glewFramebufferTextureLayerNV) -#define glTexImage3DNV GLEW_GET_FUN(__glewTexImage3DNV) -#define glTexSubImage3DNV GLEW_GET_FUN(__glewTexSubImage3DNV) - -#define GLEW_NV_texture_array GLEW_GET_VAR(__GLEW_NV_texture_array) - -#endif /* GL_NV_texture_array */ - -/* ------------------------- GL_NV_texture_barrier ------------------------- */ - -#ifndef GL_NV_texture_barrier -#define GL_NV_texture_barrier 1 - -typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERNVPROC) (void); - -#define glTextureBarrierNV GLEW_GET_FUN(__glewTextureBarrierNV) - -#define GLEW_NV_texture_barrier GLEW_GET_VAR(__GLEW_NV_texture_barrier) - -#endif /* GL_NV_texture_barrier */ - -/* ----------------------- GL_NV_texture_border_clamp ---------------------- */ - -#ifndef GL_NV_texture_border_clamp -#define GL_NV_texture_border_clamp 1 - -#define GL_TEXTURE_BORDER_COLOR_NV 0x1004 -#define GL_CLAMP_TO_BORDER_NV 0x812D - -#define GLEW_NV_texture_border_clamp GLEW_GET_VAR(__GLEW_NV_texture_border_clamp) - -#endif /* GL_NV_texture_border_clamp */ - -/* --------------------- GL_NV_texture_compression_latc -------------------- */ - -#ifndef GL_NV_texture_compression_latc -#define GL_NV_texture_compression_latc 1 - -#define GL_COMPRESSED_LUMINANCE_LATC1_NV 0x8C70 -#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_NV 0x8C71 -#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_NV 0x8C72 -#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_NV 0x8C73 - -#define GLEW_NV_texture_compression_latc GLEW_GET_VAR(__GLEW_NV_texture_compression_latc) - -#endif /* GL_NV_texture_compression_latc */ - -/* --------------------- GL_NV_texture_compression_s3tc -------------------- */ - -#ifndef GL_NV_texture_compression_s3tc -#define GL_NV_texture_compression_s3tc 1 - -#define GL_COMPRESSED_RGB_S3TC_DXT1_NV 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_NV 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_NV 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_NV 0x83F3 - -#define GLEW_NV_texture_compression_s3tc GLEW_GET_VAR(__GLEW_NV_texture_compression_s3tc) - -#endif /* GL_NV_texture_compression_s3tc */ - -/* ----------------- GL_NV_texture_compression_s3tc_update ----------------- */ - -#ifndef GL_NV_texture_compression_s3tc_update -#define GL_NV_texture_compression_s3tc_update 1 - -#define GLEW_NV_texture_compression_s3tc_update GLEW_GET_VAR(__GLEW_NV_texture_compression_s3tc_update) - -#endif /* GL_NV_texture_compression_s3tc_update */ - -/* --------------------- GL_NV_texture_compression_vtc --------------------- */ - -#ifndef GL_NV_texture_compression_vtc -#define GL_NV_texture_compression_vtc 1 - -#define GLEW_NV_texture_compression_vtc GLEW_GET_VAR(__GLEW_NV_texture_compression_vtc) - -#endif /* GL_NV_texture_compression_vtc */ - -/* ----------------------- GL_NV_texture_env_combine4 ---------------------- */ - -#ifndef GL_NV_texture_env_combine4 -#define GL_NV_texture_env_combine4 1 - -#define GL_COMBINE4_NV 0x8503 -#define GL_SOURCE3_RGB_NV 0x8583 -#define GL_SOURCE3_ALPHA_NV 0x858B -#define GL_OPERAND3_RGB_NV 0x8593 -#define GL_OPERAND3_ALPHA_NV 0x859B - -#define GLEW_NV_texture_env_combine4 GLEW_GET_VAR(__GLEW_NV_texture_env_combine4) - -#endif /* GL_NV_texture_env_combine4 */ - -/* ---------------------- GL_NV_texture_expand_normal ---------------------- */ - -#ifndef GL_NV_texture_expand_normal -#define GL_NV_texture_expand_normal 1 - -#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F - -#define GLEW_NV_texture_expand_normal GLEW_GET_VAR(__GLEW_NV_texture_expand_normal) - -#endif /* GL_NV_texture_expand_normal */ - -/* ----------------------- GL_NV_texture_multisample ----------------------- */ - -#ifndef GL_NV_texture_multisample -#define GL_NV_texture_multisample 1 - -#define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 -#define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046 - -typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); - -#define glTexImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage2DMultisampleCoverageNV) -#define glTexImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage3DMultisampleCoverageNV) -#define glTextureImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage2DMultisampleCoverageNV) -#define glTextureImage2DMultisampleNV GLEW_GET_FUN(__glewTextureImage2DMultisampleNV) -#define glTextureImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage3DMultisampleCoverageNV) -#define glTextureImage3DMultisampleNV GLEW_GET_FUN(__glewTextureImage3DMultisampleNV) - -#define GLEW_NV_texture_multisample GLEW_GET_VAR(__GLEW_NV_texture_multisample) - -#endif /* GL_NV_texture_multisample */ - -/* ---------------------- GL_NV_texture_npot_2D_mipmap --------------------- */ - -#ifndef GL_NV_texture_npot_2D_mipmap -#define GL_NV_texture_npot_2D_mipmap 1 - -#define GLEW_NV_texture_npot_2D_mipmap GLEW_GET_VAR(__GLEW_NV_texture_npot_2D_mipmap) - -#endif /* GL_NV_texture_npot_2D_mipmap */ - -/* ------------------------ GL_NV_texture_rectangle ------------------------ */ - -#ifndef GL_NV_texture_rectangle -#define GL_NV_texture_rectangle 1 - -#define GL_TEXTURE_RECTANGLE_NV 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 - -#define GLEW_NV_texture_rectangle GLEW_GET_VAR(__GLEW_NV_texture_rectangle) - -#endif /* GL_NV_texture_rectangle */ - -/* ------------------- GL_NV_texture_rectangle_compressed ------------------ */ - -#ifndef GL_NV_texture_rectangle_compressed -#define GL_NV_texture_rectangle_compressed 1 - -#define GLEW_NV_texture_rectangle_compressed GLEW_GET_VAR(__GLEW_NV_texture_rectangle_compressed) - -#endif /* GL_NV_texture_rectangle_compressed */ - -/* -------------------------- GL_NV_texture_shader ------------------------- */ - -#ifndef GL_NV_texture_shader -#define GL_NV_texture_shader 1 - -#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C -#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D -#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E -#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 -#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA -#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB -#define GL_DSDT_MAG_INTENSITY_NV 0x86DC -#define GL_SHADER_CONSISTENT_NV 0x86DD -#define GL_TEXTURE_SHADER_NV 0x86DE -#define GL_SHADER_OPERATION_NV 0x86DF -#define GL_CULL_MODES_NV 0x86E0 -#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 -#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 -#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 -#define GL_CONST_EYE_NV 0x86E5 -#define GL_PASS_THROUGH_NV 0x86E6 -#define GL_CULL_FRAGMENT_NV 0x86E7 -#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 -#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 -#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA -#define GL_DOT_PRODUCT_NV 0x86EC -#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED -#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE -#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 -#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 -#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 -#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 -#define GL_HILO_NV 0x86F4 -#define GL_DSDT_NV 0x86F5 -#define GL_DSDT_MAG_NV 0x86F6 -#define GL_DSDT_MAG_VIB_NV 0x86F7 -#define GL_HILO16_NV 0x86F8 -#define GL_SIGNED_HILO_NV 0x86F9 -#define GL_SIGNED_HILO16_NV 0x86FA -#define GL_SIGNED_RGBA_NV 0x86FB -#define GL_SIGNED_RGBA8_NV 0x86FC -#define GL_SIGNED_RGB_NV 0x86FE -#define GL_SIGNED_RGB8_NV 0x86FF -#define GL_SIGNED_LUMINANCE_NV 0x8701 -#define GL_SIGNED_LUMINANCE8_NV 0x8702 -#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 -#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 -#define GL_SIGNED_ALPHA_NV 0x8705 -#define GL_SIGNED_ALPHA8_NV 0x8706 -#define GL_SIGNED_INTENSITY_NV 0x8707 -#define GL_SIGNED_INTENSITY8_NV 0x8708 -#define GL_DSDT8_NV 0x8709 -#define GL_DSDT8_MAG8_NV 0x870A -#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B -#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C -#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D -#define GL_HI_SCALE_NV 0x870E -#define GL_LO_SCALE_NV 0x870F -#define GL_DS_SCALE_NV 0x8710 -#define GL_DT_SCALE_NV 0x8711 -#define GL_MAGNITUDE_SCALE_NV 0x8712 -#define GL_VIBRANCE_SCALE_NV 0x8713 -#define GL_HI_BIAS_NV 0x8714 -#define GL_LO_BIAS_NV 0x8715 -#define GL_DS_BIAS_NV 0x8716 -#define GL_DT_BIAS_NV 0x8717 -#define GL_MAGNITUDE_BIAS_NV 0x8718 -#define GL_VIBRANCE_BIAS_NV 0x8719 -#define GL_TEXTURE_BORDER_VALUES_NV 0x871A -#define GL_TEXTURE_HI_SIZE_NV 0x871B -#define GL_TEXTURE_LO_SIZE_NV 0x871C -#define GL_TEXTURE_DS_SIZE_NV 0x871D -#define GL_TEXTURE_DT_SIZE_NV 0x871E -#define GL_TEXTURE_MAG_SIZE_NV 0x871F - -#define GLEW_NV_texture_shader GLEW_GET_VAR(__GLEW_NV_texture_shader) - -#endif /* GL_NV_texture_shader */ - -/* ------------------------- GL_NV_texture_shader2 ------------------------- */ - -#ifndef GL_NV_texture_shader2 -#define GL_NV_texture_shader2 1 - -#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA -#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB -#define GL_DSDT_MAG_INTENSITY_NV 0x86DC -#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF -#define GL_HILO_NV 0x86F4 -#define GL_DSDT_NV 0x86F5 -#define GL_DSDT_MAG_NV 0x86F6 -#define GL_DSDT_MAG_VIB_NV 0x86F7 -#define GL_HILO16_NV 0x86F8 -#define GL_SIGNED_HILO_NV 0x86F9 -#define GL_SIGNED_HILO16_NV 0x86FA -#define GL_SIGNED_RGBA_NV 0x86FB -#define GL_SIGNED_RGBA8_NV 0x86FC -#define GL_SIGNED_RGB_NV 0x86FE -#define GL_SIGNED_RGB8_NV 0x86FF -#define GL_SIGNED_LUMINANCE_NV 0x8701 -#define GL_SIGNED_LUMINANCE8_NV 0x8702 -#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 -#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 -#define GL_SIGNED_ALPHA_NV 0x8705 -#define GL_SIGNED_ALPHA8_NV 0x8706 -#define GL_SIGNED_INTENSITY_NV 0x8707 -#define GL_SIGNED_INTENSITY8_NV 0x8708 -#define GL_DSDT8_NV 0x8709 -#define GL_DSDT8_MAG8_NV 0x870A -#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B -#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C -#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D - -#define GLEW_NV_texture_shader2 GLEW_GET_VAR(__GLEW_NV_texture_shader2) - -#endif /* GL_NV_texture_shader2 */ - -/* ------------------------- GL_NV_texture_shader3 ------------------------- */ - -#ifndef GL_NV_texture_shader3 -#define GL_NV_texture_shader3 1 - -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 -#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 -#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 -#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 -#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 -#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A -#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B -#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C -#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D -#define GL_HILO8_NV 0x885E -#define GL_SIGNED_HILO8_NV 0x885F -#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 - -#define GLEW_NV_texture_shader3 GLEW_GET_VAR(__GLEW_NV_texture_shader3) - -#endif /* GL_NV_texture_shader3 */ - -/* ------------------------ GL_NV_transform_feedback ----------------------- */ - -#ifndef GL_NV_transform_feedback -#define GL_NV_transform_feedback 1 - -#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 -#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 -#define GL_TEXTURE_COORD_NV 0x8C79 -#define GL_CLIP_DISTANCE_NV 0x8C7A -#define GL_VERTEX_ID_NV 0x8C7B -#define GL_PRIMITIVE_ID_NV 0x8C7C -#define GL_GENERIC_ATTRIB_NV 0x8C7D -#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 -#define GL_ACTIVE_VARYINGS_NV 0x8C81 -#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 -#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 -#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 -#define GL_PRIMITIVES_GENERATED_NV 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 -#define GL_RASTERIZER_DISCARD_NV 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B -#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C -#define GL_SEPARATE_ATTRIBS_NV 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F - -typedef void (GLAPIENTRY * PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); -typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); -typedef void (GLAPIENTRY * PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); -typedef GLint (GLAPIENTRY * PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); - -#define glActiveVaryingNV GLEW_GET_FUN(__glewActiveVaryingNV) -#define glBeginTransformFeedbackNV GLEW_GET_FUN(__glewBeginTransformFeedbackNV) -#define glBindBufferBaseNV GLEW_GET_FUN(__glewBindBufferBaseNV) -#define glBindBufferOffsetNV GLEW_GET_FUN(__glewBindBufferOffsetNV) -#define glBindBufferRangeNV GLEW_GET_FUN(__glewBindBufferRangeNV) -#define glEndTransformFeedbackNV GLEW_GET_FUN(__glewEndTransformFeedbackNV) -#define glGetActiveVaryingNV GLEW_GET_FUN(__glewGetActiveVaryingNV) -#define glGetTransformFeedbackVaryingNV GLEW_GET_FUN(__glewGetTransformFeedbackVaryingNV) -#define glGetVaryingLocationNV GLEW_GET_FUN(__glewGetVaryingLocationNV) -#define glTransformFeedbackAttribsNV GLEW_GET_FUN(__glewTransformFeedbackAttribsNV) -#define glTransformFeedbackVaryingsNV GLEW_GET_FUN(__glewTransformFeedbackVaryingsNV) - -#define GLEW_NV_transform_feedback GLEW_GET_VAR(__GLEW_NV_transform_feedback) - -#endif /* GL_NV_transform_feedback */ - -/* ----------------------- GL_NV_transform_feedback2 ----------------------- */ - -#ifndef GL_NV_transform_feedback2 -#define GL_NV_transform_feedback2 1 - -#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 -#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 -#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 -#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 - -typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); -typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint* ids); -typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); -typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); - -#define glBindTransformFeedbackNV GLEW_GET_FUN(__glewBindTransformFeedbackNV) -#define glDeleteTransformFeedbacksNV GLEW_GET_FUN(__glewDeleteTransformFeedbacksNV) -#define glDrawTransformFeedbackNV GLEW_GET_FUN(__glewDrawTransformFeedbackNV) -#define glGenTransformFeedbacksNV GLEW_GET_FUN(__glewGenTransformFeedbacksNV) -#define glIsTransformFeedbackNV GLEW_GET_FUN(__glewIsTransformFeedbackNV) -#define glPauseTransformFeedbackNV GLEW_GET_FUN(__glewPauseTransformFeedbackNV) -#define glResumeTransformFeedbackNV GLEW_GET_FUN(__glewResumeTransformFeedbackNV) - -#define GLEW_NV_transform_feedback2 GLEW_GET_VAR(__GLEW_NV_transform_feedback2) - -#endif /* GL_NV_transform_feedback2 */ - -/* ------------------ GL_NV_uniform_buffer_unified_memory ------------------ */ - -#ifndef GL_NV_uniform_buffer_unified_memory -#define GL_NV_uniform_buffer_unified_memory 1 - -#define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E -#define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F -#define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370 - -#define GLEW_NV_uniform_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_uniform_buffer_unified_memory) - -#endif /* GL_NV_uniform_buffer_unified_memory */ - -/* -------------------------- GL_NV_vdpau_interop -------------------------- */ - -#ifndef GL_NV_vdpau_interop -#define GL_NV_vdpau_interop 1 - -#define GL_SURFACE_STATE_NV 0x86EB -#define GL_SURFACE_REGISTERED_NV 0x86FD -#define GL_SURFACE_MAPPED_NV 0x8700 -#define GL_WRITE_DISCARD_NV 0x88BE - -typedef GLintptr GLvdpauSurfaceNV; - -typedef void (GLAPIENTRY * PFNGLVDPAUFININVPROC) (void); -typedef void (GLAPIENTRY * PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei* length, GLint *values); -typedef void (GLAPIENTRY * PFNGLVDPAUINITNVPROC) (const void* vdpDevice, const void*getProcAddress); -typedef void (GLAPIENTRY * PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); -typedef void (GLAPIENTRY * PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV* surfaces); -typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -typedef void (GLAPIENTRY * PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); -typedef void (GLAPIENTRY * PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV* surfaces); -typedef void (GLAPIENTRY * PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); - -#define glVDPAUFiniNV GLEW_GET_FUN(__glewVDPAUFiniNV) -#define glVDPAUGetSurfaceivNV GLEW_GET_FUN(__glewVDPAUGetSurfaceivNV) -#define glVDPAUInitNV GLEW_GET_FUN(__glewVDPAUInitNV) -#define glVDPAUIsSurfaceNV GLEW_GET_FUN(__glewVDPAUIsSurfaceNV) -#define glVDPAUMapSurfacesNV GLEW_GET_FUN(__glewVDPAUMapSurfacesNV) -#define glVDPAURegisterOutputSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterOutputSurfaceNV) -#define glVDPAURegisterVideoSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterVideoSurfaceNV) -#define glVDPAUSurfaceAccessNV GLEW_GET_FUN(__glewVDPAUSurfaceAccessNV) -#define glVDPAUUnmapSurfacesNV GLEW_GET_FUN(__glewVDPAUUnmapSurfacesNV) -#define glVDPAUUnregisterSurfaceNV GLEW_GET_FUN(__glewVDPAUUnregisterSurfaceNV) - -#define GLEW_NV_vdpau_interop GLEW_GET_VAR(__GLEW_NV_vdpau_interop) - -#endif /* GL_NV_vdpau_interop */ - -/* ------------------------ GL_NV_vertex_array_range ----------------------- */ - -#ifndef GL_NV_vertex_array_range -#define GL_NV_vertex_array_range 1 - -#define GL_VERTEX_ARRAY_RANGE_NV 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E -#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 - -typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void *pointer); - -#define glFlushVertexArrayRangeNV GLEW_GET_FUN(__glewFlushVertexArrayRangeNV) -#define glVertexArrayRangeNV GLEW_GET_FUN(__glewVertexArrayRangeNV) - -#define GLEW_NV_vertex_array_range GLEW_GET_VAR(__GLEW_NV_vertex_array_range) - -#endif /* GL_NV_vertex_array_range */ - -/* ----------------------- GL_NV_vertex_array_range2 ----------------------- */ - -#ifndef GL_NV_vertex_array_range2 -#define GL_NV_vertex_array_range2 1 - -#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 - -#define GLEW_NV_vertex_array_range2 GLEW_GET_VAR(__GLEW_NV_vertex_array_range2) - -#endif /* GL_NV_vertex_array_range2 */ - -/* ------------------- GL_NV_vertex_attrib_integer_64bit ------------------- */ - -#ifndef GL_NV_vertex_attrib_integer_64bit -#define GL_NV_vertex_attrib_integer_64bit 1 - -#define GL_INT64_NV 0x140E -#define GL_UNSIGNED_INT64_NV 0x140F - -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT* params); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); - -#define glGetVertexAttribLi64vNV GLEW_GET_FUN(__glewGetVertexAttribLi64vNV) -#define glGetVertexAttribLui64vNV GLEW_GET_FUN(__glewGetVertexAttribLui64vNV) -#define glVertexAttribL1i64NV GLEW_GET_FUN(__glewVertexAttribL1i64NV) -#define glVertexAttribL1i64vNV GLEW_GET_FUN(__glewVertexAttribL1i64vNV) -#define glVertexAttribL1ui64NV GLEW_GET_FUN(__glewVertexAttribL1ui64NV) -#define glVertexAttribL1ui64vNV GLEW_GET_FUN(__glewVertexAttribL1ui64vNV) -#define glVertexAttribL2i64NV GLEW_GET_FUN(__glewVertexAttribL2i64NV) -#define glVertexAttribL2i64vNV GLEW_GET_FUN(__glewVertexAttribL2i64vNV) -#define glVertexAttribL2ui64NV GLEW_GET_FUN(__glewVertexAttribL2ui64NV) -#define glVertexAttribL2ui64vNV GLEW_GET_FUN(__glewVertexAttribL2ui64vNV) -#define glVertexAttribL3i64NV GLEW_GET_FUN(__glewVertexAttribL3i64NV) -#define glVertexAttribL3i64vNV GLEW_GET_FUN(__glewVertexAttribL3i64vNV) -#define glVertexAttribL3ui64NV GLEW_GET_FUN(__glewVertexAttribL3ui64NV) -#define glVertexAttribL3ui64vNV GLEW_GET_FUN(__glewVertexAttribL3ui64vNV) -#define glVertexAttribL4i64NV GLEW_GET_FUN(__glewVertexAttribL4i64NV) -#define glVertexAttribL4i64vNV GLEW_GET_FUN(__glewVertexAttribL4i64vNV) -#define glVertexAttribL4ui64NV GLEW_GET_FUN(__glewVertexAttribL4ui64NV) -#define glVertexAttribL4ui64vNV GLEW_GET_FUN(__glewVertexAttribL4ui64vNV) -#define glVertexAttribLFormatNV GLEW_GET_FUN(__glewVertexAttribLFormatNV) - -#define GLEW_NV_vertex_attrib_integer_64bit GLEW_GET_VAR(__GLEW_NV_vertex_attrib_integer_64bit) - -#endif /* GL_NV_vertex_attrib_integer_64bit */ - -/* ------------------- GL_NV_vertex_buffer_unified_memory ------------------ */ - -#ifndef GL_NV_vertex_buffer_unified_memory -#define GL_NV_vertex_buffer_unified_memory 1 - -#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E -#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F -#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 -#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 -#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 -#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 -#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 -#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 -#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 -#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 -#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 -#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 -#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A -#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B -#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C -#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D -#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E -#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F -#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 -#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 -#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 -#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 -#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 -#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 -#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 - -typedef void (GLAPIENTRY * PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); -typedef void (GLAPIENTRY * PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); -typedef void (GLAPIENTRY * PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT result[]); -typedef void (GLAPIENTRY * PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); - -#define glBufferAddressRangeNV GLEW_GET_FUN(__glewBufferAddressRangeNV) -#define glColorFormatNV GLEW_GET_FUN(__glewColorFormatNV) -#define glEdgeFlagFormatNV GLEW_GET_FUN(__glewEdgeFlagFormatNV) -#define glFogCoordFormatNV GLEW_GET_FUN(__glewFogCoordFormatNV) -#define glGetIntegerui64i_vNV GLEW_GET_FUN(__glewGetIntegerui64i_vNV) -#define glIndexFormatNV GLEW_GET_FUN(__glewIndexFormatNV) -#define glNormalFormatNV GLEW_GET_FUN(__glewNormalFormatNV) -#define glSecondaryColorFormatNV GLEW_GET_FUN(__glewSecondaryColorFormatNV) -#define glTexCoordFormatNV GLEW_GET_FUN(__glewTexCoordFormatNV) -#define glVertexAttribFormatNV GLEW_GET_FUN(__glewVertexAttribFormatNV) -#define glVertexAttribIFormatNV GLEW_GET_FUN(__glewVertexAttribIFormatNV) -#define glVertexFormatNV GLEW_GET_FUN(__glewVertexFormatNV) - -#define GLEW_NV_vertex_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_vertex_buffer_unified_memory) - -#endif /* GL_NV_vertex_buffer_unified_memory */ - -/* -------------------------- GL_NV_vertex_program ------------------------- */ - -#ifndef GL_NV_vertex_program -#define GL_NV_vertex_program 1 - -#define GL_VERTEX_PROGRAM_NV 0x8620 -#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 -#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 -#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 -#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 -#define GL_CURRENT_ATTRIB_NV 0x8626 -#define GL_PROGRAM_LENGTH_NV 0x8627 -#define GL_PROGRAM_STRING_NV 0x8628 -#define GL_MODELVIEW_PROJECTION_NV 0x8629 -#define GL_IDENTITY_NV 0x862A -#define GL_INVERSE_NV 0x862B -#define GL_TRANSPOSE_NV 0x862C -#define GL_INVERSE_TRANSPOSE_NV 0x862D -#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E -#define GL_MAX_TRACK_MATRICES_NV 0x862F -#define GL_MATRIX0_NV 0x8630 -#define GL_MATRIX1_NV 0x8631 -#define GL_MATRIX2_NV 0x8632 -#define GL_MATRIX3_NV 0x8633 -#define GL_MATRIX4_NV 0x8634 -#define GL_MATRIX5_NV 0x8635 -#define GL_MATRIX6_NV 0x8636 -#define GL_MATRIX7_NV 0x8637 -#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 -#define GL_CURRENT_MATRIX_NV 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 -#define GL_PROGRAM_PARAMETER_NV 0x8644 -#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 -#define GL_PROGRAM_TARGET_NV 0x8646 -#define GL_PROGRAM_RESIDENT_NV 0x8647 -#define GL_TRACK_MATRIX_NV 0x8648 -#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 -#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A -#define GL_PROGRAM_ERROR_POSITION_NV 0x864B -#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 -#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 -#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 -#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 -#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 -#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 -#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 -#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 -#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 -#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 -#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A -#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B -#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C -#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D -#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E -#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F -#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 -#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 -#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 -#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 -#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 -#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 -#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 -#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 -#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 -#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 -#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A -#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B -#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C -#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D -#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E -#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F -#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 -#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 -#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 -#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 -#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 -#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 -#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 -#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 -#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 -#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 -#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A -#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B -#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C -#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D -#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E -#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F - -typedef GLboolean (GLAPIENTRY * PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint* ids, GLboolean *residences); -typedef void (GLAPIENTRY * PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); -typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint* ids); -typedef void (GLAPIENTRY * PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte* program); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, void** pointer); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint* params); -typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMNVPROC) (GLuint id); -typedef void (GLAPIENTRY * PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte* program); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, GLuint* ids); -typedef void (GLAPIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei n, const GLubyte* v); - -#define glAreProgramsResidentNV GLEW_GET_FUN(__glewAreProgramsResidentNV) -#define glBindProgramNV GLEW_GET_FUN(__glewBindProgramNV) -#define glDeleteProgramsNV GLEW_GET_FUN(__glewDeleteProgramsNV) -#define glExecuteProgramNV GLEW_GET_FUN(__glewExecuteProgramNV) -#define glGenProgramsNV GLEW_GET_FUN(__glewGenProgramsNV) -#define glGetProgramParameterdvNV GLEW_GET_FUN(__glewGetProgramParameterdvNV) -#define glGetProgramParameterfvNV GLEW_GET_FUN(__glewGetProgramParameterfvNV) -#define glGetProgramStringNV GLEW_GET_FUN(__glewGetProgramStringNV) -#define glGetProgramivNV GLEW_GET_FUN(__glewGetProgramivNV) -#define glGetTrackMatrixivNV GLEW_GET_FUN(__glewGetTrackMatrixivNV) -#define glGetVertexAttribPointervNV GLEW_GET_FUN(__glewGetVertexAttribPointervNV) -#define glGetVertexAttribdvNV GLEW_GET_FUN(__glewGetVertexAttribdvNV) -#define glGetVertexAttribfvNV GLEW_GET_FUN(__glewGetVertexAttribfvNV) -#define glGetVertexAttribivNV GLEW_GET_FUN(__glewGetVertexAttribivNV) -#define glIsProgramNV GLEW_GET_FUN(__glewIsProgramNV) -#define glLoadProgramNV GLEW_GET_FUN(__glewLoadProgramNV) -#define glProgramParameter4dNV GLEW_GET_FUN(__glewProgramParameter4dNV) -#define glProgramParameter4dvNV GLEW_GET_FUN(__glewProgramParameter4dvNV) -#define glProgramParameter4fNV GLEW_GET_FUN(__glewProgramParameter4fNV) -#define glProgramParameter4fvNV GLEW_GET_FUN(__glewProgramParameter4fvNV) -#define glProgramParameters4dvNV GLEW_GET_FUN(__glewProgramParameters4dvNV) -#define glProgramParameters4fvNV GLEW_GET_FUN(__glewProgramParameters4fvNV) -#define glRequestResidentProgramsNV GLEW_GET_FUN(__glewRequestResidentProgramsNV) -#define glTrackMatrixNV GLEW_GET_FUN(__glewTrackMatrixNV) -#define glVertexAttrib1dNV GLEW_GET_FUN(__glewVertexAttrib1dNV) -#define glVertexAttrib1dvNV GLEW_GET_FUN(__glewVertexAttrib1dvNV) -#define glVertexAttrib1fNV GLEW_GET_FUN(__glewVertexAttrib1fNV) -#define glVertexAttrib1fvNV GLEW_GET_FUN(__glewVertexAttrib1fvNV) -#define glVertexAttrib1sNV GLEW_GET_FUN(__glewVertexAttrib1sNV) -#define glVertexAttrib1svNV GLEW_GET_FUN(__glewVertexAttrib1svNV) -#define glVertexAttrib2dNV GLEW_GET_FUN(__glewVertexAttrib2dNV) -#define glVertexAttrib2dvNV GLEW_GET_FUN(__glewVertexAttrib2dvNV) -#define glVertexAttrib2fNV GLEW_GET_FUN(__glewVertexAttrib2fNV) -#define glVertexAttrib2fvNV GLEW_GET_FUN(__glewVertexAttrib2fvNV) -#define glVertexAttrib2sNV GLEW_GET_FUN(__glewVertexAttrib2sNV) -#define glVertexAttrib2svNV GLEW_GET_FUN(__glewVertexAttrib2svNV) -#define glVertexAttrib3dNV GLEW_GET_FUN(__glewVertexAttrib3dNV) -#define glVertexAttrib3dvNV GLEW_GET_FUN(__glewVertexAttrib3dvNV) -#define glVertexAttrib3fNV GLEW_GET_FUN(__glewVertexAttrib3fNV) -#define glVertexAttrib3fvNV GLEW_GET_FUN(__glewVertexAttrib3fvNV) -#define glVertexAttrib3sNV GLEW_GET_FUN(__glewVertexAttrib3sNV) -#define glVertexAttrib3svNV GLEW_GET_FUN(__glewVertexAttrib3svNV) -#define glVertexAttrib4dNV GLEW_GET_FUN(__glewVertexAttrib4dNV) -#define glVertexAttrib4dvNV GLEW_GET_FUN(__glewVertexAttrib4dvNV) -#define glVertexAttrib4fNV GLEW_GET_FUN(__glewVertexAttrib4fNV) -#define glVertexAttrib4fvNV GLEW_GET_FUN(__glewVertexAttrib4fvNV) -#define glVertexAttrib4sNV GLEW_GET_FUN(__glewVertexAttrib4sNV) -#define glVertexAttrib4svNV GLEW_GET_FUN(__glewVertexAttrib4svNV) -#define glVertexAttrib4ubNV GLEW_GET_FUN(__glewVertexAttrib4ubNV) -#define glVertexAttrib4ubvNV GLEW_GET_FUN(__glewVertexAttrib4ubvNV) -#define glVertexAttribPointerNV GLEW_GET_FUN(__glewVertexAttribPointerNV) -#define glVertexAttribs1dvNV GLEW_GET_FUN(__glewVertexAttribs1dvNV) -#define glVertexAttribs1fvNV GLEW_GET_FUN(__glewVertexAttribs1fvNV) -#define glVertexAttribs1svNV GLEW_GET_FUN(__glewVertexAttribs1svNV) -#define glVertexAttribs2dvNV GLEW_GET_FUN(__glewVertexAttribs2dvNV) -#define glVertexAttribs2fvNV GLEW_GET_FUN(__glewVertexAttribs2fvNV) -#define glVertexAttribs2svNV GLEW_GET_FUN(__glewVertexAttribs2svNV) -#define glVertexAttribs3dvNV GLEW_GET_FUN(__glewVertexAttribs3dvNV) -#define glVertexAttribs3fvNV GLEW_GET_FUN(__glewVertexAttribs3fvNV) -#define glVertexAttribs3svNV GLEW_GET_FUN(__glewVertexAttribs3svNV) -#define glVertexAttribs4dvNV GLEW_GET_FUN(__glewVertexAttribs4dvNV) -#define glVertexAttribs4fvNV GLEW_GET_FUN(__glewVertexAttribs4fvNV) -#define glVertexAttribs4svNV GLEW_GET_FUN(__glewVertexAttribs4svNV) -#define glVertexAttribs4ubvNV GLEW_GET_FUN(__glewVertexAttribs4ubvNV) - -#define GLEW_NV_vertex_program GLEW_GET_VAR(__GLEW_NV_vertex_program) - -#endif /* GL_NV_vertex_program */ - -/* ------------------------ GL_NV_vertex_program1_1 ------------------------ */ - -#ifndef GL_NV_vertex_program1_1 -#define GL_NV_vertex_program1_1 1 - -#define GLEW_NV_vertex_program1_1 GLEW_GET_VAR(__GLEW_NV_vertex_program1_1) - -#endif /* GL_NV_vertex_program1_1 */ - -/* ------------------------- GL_NV_vertex_program2 ------------------------- */ - -#ifndef GL_NV_vertex_program2 -#define GL_NV_vertex_program2 1 - -#define GLEW_NV_vertex_program2 GLEW_GET_VAR(__GLEW_NV_vertex_program2) - -#endif /* GL_NV_vertex_program2 */ - -/* ---------------------- GL_NV_vertex_program2_option --------------------- */ - -#ifndef GL_NV_vertex_program2_option -#define GL_NV_vertex_program2_option 1 - -#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 -#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 - -#define GLEW_NV_vertex_program2_option GLEW_GET_VAR(__GLEW_NV_vertex_program2_option) - -#endif /* GL_NV_vertex_program2_option */ - -/* ------------------------- GL_NV_vertex_program3 ------------------------- */ - -#ifndef GL_NV_vertex_program3 -#define GL_NV_vertex_program3 1 - -#define MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C - -#define GLEW_NV_vertex_program3 GLEW_GET_VAR(__GLEW_NV_vertex_program3) - -#endif /* GL_NV_vertex_program3 */ - -/* ------------------------- GL_NV_vertex_program4 ------------------------- */ - -#ifndef GL_NV_vertex_program4 -#define GL_NV_vertex_program4 1 - -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD - -#define GLEW_NV_vertex_program4 GLEW_GET_VAR(__GLEW_NV_vertex_program4) - -#endif /* GL_NV_vertex_program4 */ - -/* -------------------------- GL_NV_video_capture -------------------------- */ - -#ifndef GL_NV_video_capture -#define GL_NV_video_capture 1 - -#define GL_VIDEO_BUFFER_NV 0x9020 -#define GL_VIDEO_BUFFER_BINDING_NV 0x9021 -#define GL_FIELD_UPPER_NV 0x9022 -#define GL_FIELD_LOWER_NV 0x9023 -#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 -#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 -#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 -#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 -#define GL_VIDEO_BUFFER_PITCH_NV 0x9028 -#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 -#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A -#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B -#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C -#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D -#define GL_PARTIAL_SUCCESS_NV 0x902E -#define GL_SUCCESS_NV 0x902F -#define GL_FAILURE_NV 0x9030 -#define GL_YCBYCR8_422_NV 0x9031 -#define GL_YCBAYCR8A_4224_NV 0x9032 -#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 -#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 -#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 -#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 -#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 -#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 -#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 -#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A -#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B -#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C - -typedef void (GLAPIENTRY * PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); -typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); -typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); -typedef void (GLAPIENTRY * PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); -typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble* params); -typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint* params); -typedef GLenum (GLAPIENTRY * PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint* sequence_num, GLuint64EXT *capture_time); -typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble* params); -typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint* params); - -#define glBeginVideoCaptureNV GLEW_GET_FUN(__glewBeginVideoCaptureNV) -#define glBindVideoCaptureStreamBufferNV GLEW_GET_FUN(__glewBindVideoCaptureStreamBufferNV) -#define glBindVideoCaptureStreamTextureNV GLEW_GET_FUN(__glewBindVideoCaptureStreamTextureNV) -#define glEndVideoCaptureNV GLEW_GET_FUN(__glewEndVideoCaptureNV) -#define glGetVideoCaptureStreamdvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamdvNV) -#define glGetVideoCaptureStreamfvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamfvNV) -#define glGetVideoCaptureStreamivNV GLEW_GET_FUN(__glewGetVideoCaptureStreamivNV) -#define glGetVideoCaptureivNV GLEW_GET_FUN(__glewGetVideoCaptureivNV) -#define glVideoCaptureNV GLEW_GET_FUN(__glewVideoCaptureNV) -#define glVideoCaptureStreamParameterdvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterdvNV) -#define glVideoCaptureStreamParameterfvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterfvNV) -#define glVideoCaptureStreamParameterivNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterivNV) - -#define GLEW_NV_video_capture GLEW_GET_VAR(__GLEW_NV_video_capture) - -#endif /* GL_NV_video_capture */ - -/* -------------------------- GL_NV_viewport_array ------------------------- */ - -#ifndef GL_NV_viewport_array -#define GL_NV_viewport_array 1 - -#define GL_DEPTH_RANGE 0x0B70 -#define GL_VIEWPORT 0x0BA2 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_MAX_VIEWPORTS_NV 0x825B -#define GL_VIEWPORT_SUBPIXEL_BITS_NV 0x825C -#define GL_VIEWPORT_BOUNDS_RANGE_NV 0x825D -#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX_NV 0x825F - -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEARRAYFVNVPROC) (GLuint first, GLsizei count, const GLfloat * v); -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEINDEXEDFNVPROC) (GLuint index, GLfloat n, GLfloat f); -typedef void (GLAPIENTRY * PFNGLDISABLEINVPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRY * PFNGLENABLEINVPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRY * PFNGLGETFLOATI_VNVPROC) (GLenum target, GLuint index, GLfloat* data); -typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINVPROC) (GLenum target, GLuint index); -typedef void (GLAPIENTRY * PFNGLSCISSORARRAYVNVPROC) (GLuint first, GLsizei count, const GLint * v); -typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDNVPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDVNVPROC) (GLuint index, const GLint * v); -typedef void (GLAPIENTRY * PFNGLVIEWPORTARRAYVNVPROC) (GLuint first, GLsizei count, const GLfloat * v); -typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFVNVPROC) (GLuint index, const GLfloat * v); - -#define glDepthRangeArrayfvNV GLEW_GET_FUN(__glewDepthRangeArrayfvNV) -#define glDepthRangeIndexedfNV GLEW_GET_FUN(__glewDepthRangeIndexedfNV) -#define glDisableiNV GLEW_GET_FUN(__glewDisableiNV) -#define glEnableiNV GLEW_GET_FUN(__glewEnableiNV) -#define glGetFloati_vNV GLEW_GET_FUN(__glewGetFloati_vNV) -#define glIsEnablediNV GLEW_GET_FUN(__glewIsEnablediNV) -#define glScissorArrayvNV GLEW_GET_FUN(__glewScissorArrayvNV) -#define glScissorIndexedNV GLEW_GET_FUN(__glewScissorIndexedNV) -#define glScissorIndexedvNV GLEW_GET_FUN(__glewScissorIndexedvNV) -#define glViewportArrayvNV GLEW_GET_FUN(__glewViewportArrayvNV) -#define glViewportIndexedfNV GLEW_GET_FUN(__glewViewportIndexedfNV) -#define glViewportIndexedfvNV GLEW_GET_FUN(__glewViewportIndexedfvNV) - -#define GLEW_NV_viewport_array GLEW_GET_VAR(__GLEW_NV_viewport_array) - -#endif /* GL_NV_viewport_array */ - -/* ------------------------- GL_NV_viewport_array2 ------------------------- */ - -#ifndef GL_NV_viewport_array2 -#define GL_NV_viewport_array2 1 - -#define GLEW_NV_viewport_array2 GLEW_GET_VAR(__GLEW_NV_viewport_array2) - -#endif /* GL_NV_viewport_array2 */ - -/* ------------------------- GL_NV_viewport_swizzle ------------------------ */ - -#ifndef GL_NV_viewport_swizzle -#define GL_NV_viewport_swizzle 1 - -#define GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV 0x9350 -#define GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV 0x9351 -#define GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV 0x9352 -#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV 0x9353 -#define GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV 0x9354 -#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV 0x9355 -#define GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV 0x9356 -#define GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV 0x9357 -#define GL_VIEWPORT_SWIZZLE_X_NV 0x9358 -#define GL_VIEWPORT_SWIZZLE_Y_NV 0x9359 -#define GL_VIEWPORT_SWIZZLE_Z_NV 0x935A -#define GL_VIEWPORT_SWIZZLE_W_NV 0x935B - -typedef void (GLAPIENTRY * PFNGLVIEWPORTSWIZZLENVPROC) (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); - -#define glViewportSwizzleNV GLEW_GET_FUN(__glewViewportSwizzleNV) - -#define GLEW_NV_viewport_swizzle GLEW_GET_VAR(__GLEW_NV_viewport_swizzle) - -#endif /* GL_NV_viewport_swizzle */ - -/* ------------------------ GL_OES_byte_coordinates ------------------------ */ - -#ifndef GL_OES_byte_coordinates -#define GL_OES_byte_coordinates 1 - -#define GLEW_OES_byte_coordinates GLEW_GET_VAR(__GLEW_OES_byte_coordinates) - -#endif /* GL_OES_byte_coordinates */ - -/* ---------------------------- GL_OML_interlace --------------------------- */ - -#ifndef GL_OML_interlace -#define GL_OML_interlace 1 - -#define GL_INTERLACE_OML 0x8980 -#define GL_INTERLACE_READ_OML 0x8981 - -#define GLEW_OML_interlace GLEW_GET_VAR(__GLEW_OML_interlace) - -#endif /* GL_OML_interlace */ - -/* ---------------------------- GL_OML_resample ---------------------------- */ - -#ifndef GL_OML_resample -#define GL_OML_resample 1 - -#define GL_PACK_RESAMPLE_OML 0x8984 -#define GL_UNPACK_RESAMPLE_OML 0x8985 -#define GL_RESAMPLE_REPLICATE_OML 0x8986 -#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 -#define GL_RESAMPLE_AVERAGE_OML 0x8988 -#define GL_RESAMPLE_DECIMATE_OML 0x8989 - -#define GLEW_OML_resample GLEW_GET_VAR(__GLEW_OML_resample) - -#endif /* GL_OML_resample */ - -/* ---------------------------- GL_OML_subsample --------------------------- */ - -#ifndef GL_OML_subsample -#define GL_OML_subsample 1 - -#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 -#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 - -#define GLEW_OML_subsample GLEW_GET_VAR(__GLEW_OML_subsample) - -#endif /* GL_OML_subsample */ - -/* ---------------------------- GL_OVR_multiview --------------------------- */ - -#ifndef GL_OVR_multiview -#define GL_OVR_multiview 1 - -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630 -#define GL_MAX_VIEWS_OVR 0x9631 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632 -#define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR 0x9633 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); - -#define glFramebufferTextureMultiviewOVR GLEW_GET_FUN(__glewFramebufferTextureMultiviewOVR) - -#define GLEW_OVR_multiview GLEW_GET_VAR(__GLEW_OVR_multiview) - -#endif /* GL_OVR_multiview */ - -/* --------------------------- GL_OVR_multiview2 --------------------------- */ - -#ifndef GL_OVR_multiview2 -#define GL_OVR_multiview2 1 - -#define GLEW_OVR_multiview2 GLEW_GET_VAR(__GLEW_OVR_multiview2) - -#endif /* GL_OVR_multiview2 */ - -/* ------------ GL_OVR_multiview_multisampled_render_to_texture ------------ */ - -#ifndef GL_OVR_multiview_multisampled_render_to_texture -#define GL_OVR_multiview_multisampled_render_to_texture 1 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews); - -#define glFramebufferTextureMultisampleMultiviewOVR GLEW_GET_FUN(__glewFramebufferTextureMultisampleMultiviewOVR) - -#define GLEW_OVR_multiview_multisampled_render_to_texture GLEW_GET_VAR(__GLEW_OVR_multiview_multisampled_render_to_texture) - -#endif /* GL_OVR_multiview_multisampled_render_to_texture */ - -/* --------------------------- GL_PGI_misc_hints --------------------------- */ - -#ifndef GL_PGI_misc_hints -#define GL_PGI_misc_hints 1 - -#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 107000 -#define GL_CONSERVE_MEMORY_HINT_PGI 107005 -#define GL_RECLAIM_MEMORY_HINT_PGI 107006 -#define GL_NATIVE_GRAPHICS_HANDLE_PGI 107010 -#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 107011 -#define GL_NATIVE_GRAPHICS_END_HINT_PGI 107012 -#define GL_ALWAYS_FAST_HINT_PGI 107020 -#define GL_ALWAYS_SOFT_HINT_PGI 107021 -#define GL_ALLOW_DRAW_OBJ_HINT_PGI 107022 -#define GL_ALLOW_DRAW_WIN_HINT_PGI 107023 -#define GL_ALLOW_DRAW_FRG_HINT_PGI 107024 -#define GL_ALLOW_DRAW_MEM_HINT_PGI 107025 -#define GL_STRICT_DEPTHFUNC_HINT_PGI 107030 -#define GL_STRICT_LIGHTING_HINT_PGI 107031 -#define GL_STRICT_SCISSOR_HINT_PGI 107032 -#define GL_FULL_STIPPLE_HINT_PGI 107033 -#define GL_CLIP_NEAR_HINT_PGI 107040 -#define GL_CLIP_FAR_HINT_PGI 107041 -#define GL_WIDE_LINE_HINT_PGI 107042 -#define GL_BACK_NORMALS_HINT_PGI 107043 - -#define GLEW_PGI_misc_hints GLEW_GET_VAR(__GLEW_PGI_misc_hints) - -#endif /* GL_PGI_misc_hints */ - -/* -------------------------- GL_PGI_vertex_hints -------------------------- */ - -#ifndef GL_PGI_vertex_hints -#define GL_PGI_vertex_hints 1 - -#define GL_VERTEX23_BIT_PGI 0x00000004 -#define GL_VERTEX4_BIT_PGI 0x00000008 -#define GL_COLOR3_BIT_PGI 0x00010000 -#define GL_COLOR4_BIT_PGI 0x00020000 -#define GL_EDGEFLAG_BIT_PGI 0x00040000 -#define GL_INDEX_BIT_PGI 0x00080000 -#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 -#define GL_VERTEX_DATA_HINT_PGI 107050 -#define GL_VERTEX_CONSISTENT_HINT_PGI 107051 -#define GL_MATERIAL_SIDE_HINT_PGI 107052 -#define GL_MAX_VERTEX_HINT_PGI 107053 -#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 -#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 -#define GL_MAT_EMISSION_BIT_PGI 0x00800000 -#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 -#define GL_MAT_SHININESS_BIT_PGI 0x02000000 -#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 -#define GL_NORMAL_BIT_PGI 0x08000000 -#define GL_TEXCOORD1_BIT_PGI 0x10000000 -#define GL_TEXCOORD2_BIT_PGI 0x20000000 -#define GL_TEXCOORD3_BIT_PGI 0x40000000 -#define GL_TEXCOORD4_BIT_PGI 0x80000000 - -#define GLEW_PGI_vertex_hints GLEW_GET_VAR(__GLEW_PGI_vertex_hints) - -#endif /* GL_PGI_vertex_hints */ - -/* --------------------------- GL_QCOM_alpha_test -------------------------- */ - -#ifndef GL_QCOM_alpha_test -#define GL_QCOM_alpha_test 1 - -#define GL_ALPHA_TEST_QCOM 0x0BC0 -#define GL_ALPHA_TEST_FUNC_QCOM 0x0BC1 -#define GL_ALPHA_TEST_REF_QCOM 0x0BC2 - -typedef void (GLAPIENTRY * PFNGLALPHAFUNCQCOMPROC) (GLenum func, GLclampf ref); - -#define glAlphaFuncQCOM GLEW_GET_FUN(__glewAlphaFuncQCOM) - -#define GLEW_QCOM_alpha_test GLEW_GET_VAR(__GLEW_QCOM_alpha_test) - -#endif /* GL_QCOM_alpha_test */ - -/* ------------------------ GL_QCOM_binning_control ------------------------ */ - -#ifndef GL_QCOM_binning_control -#define GL_QCOM_binning_control 1 - -#define GL_DONT_CARE 0x1100 -#define GL_BINNING_CONTROL_HINT_QCOM 0x8FB0 -#define GL_CPU_OPTIMIZED_QCOM 0x8FB1 -#define GL_GPU_OPTIMIZED_QCOM 0x8FB2 -#define GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM 0x8FB3 - -#define GLEW_QCOM_binning_control GLEW_GET_VAR(__GLEW_QCOM_binning_control) - -#endif /* GL_QCOM_binning_control */ - -/* ------------------------- GL_QCOM_driver_control ------------------------ */ - -#ifndef GL_QCOM_driver_control -#define GL_QCOM_driver_control 1 - -typedef void (GLAPIENTRY * PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); -typedef void (GLAPIENTRY * PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); -typedef void (GLAPIENTRY * PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei* length, GLchar *driverControlString); -typedef void (GLAPIENTRY * PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint* num, GLsizei size, GLuint *driverControls); - -#define glDisableDriverControlQCOM GLEW_GET_FUN(__glewDisableDriverControlQCOM) -#define glEnableDriverControlQCOM GLEW_GET_FUN(__glewEnableDriverControlQCOM) -#define glGetDriverControlStringQCOM GLEW_GET_FUN(__glewGetDriverControlStringQCOM) -#define glGetDriverControlsQCOM GLEW_GET_FUN(__glewGetDriverControlsQCOM) - -#define GLEW_QCOM_driver_control GLEW_GET_VAR(__GLEW_QCOM_driver_control) - -#endif /* GL_QCOM_driver_control */ - -/* -------------------------- GL_QCOM_extended_get ------------------------- */ - -#ifndef GL_QCOM_extended_get -#define GL_QCOM_extended_get 1 - -#define GL_TEXTURE_WIDTH_QCOM 0x8BD2 -#define GL_TEXTURE_HEIGHT_QCOM 0x8BD3 -#define GL_TEXTURE_DEPTH_QCOM 0x8BD4 -#define GL_TEXTURE_INTERNAL_FORMAT_QCOM 0x8BD5 -#define GL_TEXTURE_FORMAT_QCOM 0x8BD6 -#define GL_TEXTURE_TYPE_QCOM 0x8BD7 -#define GL_TEXTURE_IMAGE_VALID_QCOM 0x8BD8 -#define GL_TEXTURE_NUM_LEVELS_QCOM 0x8BD9 -#define GL_TEXTURE_TARGET_QCOM 0x8BDA -#define GL_TEXTURE_OBJECT_VALID_QCOM 0x8BDB -#define GL_STATE_RESTORE 0x8BDC - -typedef void (GLAPIENTRY * PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, void** params); -typedef void (GLAPIENTRY * PFNGLEXTGETBUFFERSQCOMPROC) (GLuint* buffers, GLint maxBuffers, GLint* numBuffers); -typedef void (GLAPIENTRY * PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers); -typedef void (GLAPIENTRY * PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers); -typedef void (GLAPIENTRY * PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels); -typedef void (GLAPIENTRY * PFNGLEXTGETTEXTURESQCOMPROC) (GLuint* textures, GLint maxTextures, GLint* numTextures); -typedef void (GLAPIENTRY * PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param); - -#define glExtGetBufferPointervQCOM GLEW_GET_FUN(__glewExtGetBufferPointervQCOM) -#define glExtGetBuffersQCOM GLEW_GET_FUN(__glewExtGetBuffersQCOM) -#define glExtGetFramebuffersQCOM GLEW_GET_FUN(__glewExtGetFramebuffersQCOM) -#define glExtGetRenderbuffersQCOM GLEW_GET_FUN(__glewExtGetRenderbuffersQCOM) -#define glExtGetTexLevelParameterivQCOM GLEW_GET_FUN(__glewExtGetTexLevelParameterivQCOM) -#define glExtGetTexSubImageQCOM GLEW_GET_FUN(__glewExtGetTexSubImageQCOM) -#define glExtGetTexturesQCOM GLEW_GET_FUN(__glewExtGetTexturesQCOM) -#define glExtTexObjectStateOverrideiQCOM GLEW_GET_FUN(__glewExtTexObjectStateOverrideiQCOM) - -#define GLEW_QCOM_extended_get GLEW_GET_VAR(__GLEW_QCOM_extended_get) - -#endif /* GL_QCOM_extended_get */ - -/* ------------------------- GL_QCOM_extended_get2 ------------------------- */ - -#ifndef GL_QCOM_extended_get2 -#define GL_QCOM_extended_get2 1 - -typedef void (GLAPIENTRY * PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar* source, GLint* length); -typedef void (GLAPIENTRY * PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint* programs, GLint maxPrograms, GLint* numPrograms); -typedef void (GLAPIENTRY * PFNGLEXTGETSHADERSQCOMPROC) (GLuint* shaders, GLint maxShaders, GLint* numShaders); -typedef GLboolean (GLAPIENTRY * PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program); - -#define glExtGetProgramBinarySourceQCOM GLEW_GET_FUN(__glewExtGetProgramBinarySourceQCOM) -#define glExtGetProgramsQCOM GLEW_GET_FUN(__glewExtGetProgramsQCOM) -#define glExtGetShadersQCOM GLEW_GET_FUN(__glewExtGetShadersQCOM) -#define glExtIsProgramBinaryQCOM GLEW_GET_FUN(__glewExtIsProgramBinaryQCOM) - -#define GLEW_QCOM_extended_get2 GLEW_GET_VAR(__GLEW_QCOM_extended_get2) - -#endif /* GL_QCOM_extended_get2 */ - -/* ---------------------- GL_QCOM_framebuffer_foveated --------------------- */ - -#ifndef GL_QCOM_framebuffer_foveated -#define GL_QCOM_framebuffer_foveated 1 - -#define GL_FOVEATION_ENABLE_BIT_QCOM 0x1 -#define GL_FOVEATION_SCALED_BIN_METHOD_BIT_QCOM 0x2 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC) (GLuint fbo, GLuint numLayers, GLuint focalPointsPerLayer, GLuint requestedFeatures, GLuint* providedFeatures); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC) (GLuint fbo, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); - -#define glFramebufferFoveationConfigQCOM GLEW_GET_FUN(__glewFramebufferFoveationConfigQCOM) -#define glFramebufferFoveationParametersQCOM GLEW_GET_FUN(__glewFramebufferFoveationParametersQCOM) - -#define GLEW_QCOM_framebuffer_foveated GLEW_GET_VAR(__GLEW_QCOM_framebuffer_foveated) - -#endif /* GL_QCOM_framebuffer_foveated */ - -/* ---------------------- GL_QCOM_perfmon_global_mode ---------------------- */ - -#ifndef GL_QCOM_perfmon_global_mode -#define GL_QCOM_perfmon_global_mode 1 - -#define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0 - -#define GLEW_QCOM_perfmon_global_mode GLEW_GET_VAR(__GLEW_QCOM_perfmon_global_mode) - -#endif /* GL_QCOM_perfmon_global_mode */ - -/* -------------- GL_QCOM_shader_framebuffer_fetch_noncoherent ------------- */ - -#ifndef GL_QCOM_shader_framebuffer_fetch_noncoherent -#define GL_QCOM_shader_framebuffer_fetch_noncoherent 1 - -#define GL_FRAMEBUFFER_FETCH_NONCOHERENT_QCOM 0x96A2 - -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC) (void); - -#define glFramebufferFetchBarrierQCOM GLEW_GET_FUN(__glewFramebufferFetchBarrierQCOM) - -#define GLEW_QCOM_shader_framebuffer_fetch_noncoherent GLEW_GET_VAR(__GLEW_QCOM_shader_framebuffer_fetch_noncoherent) - -#endif /* GL_QCOM_shader_framebuffer_fetch_noncoherent */ - -/* ------------------------ GL_QCOM_tiled_rendering ------------------------ */ - -#ifndef GL_QCOM_tiled_rendering -#define GL_QCOM_tiled_rendering 1 - -#define GL_COLOR_BUFFER_BIT0_QCOM 0x00000001 -#define GL_COLOR_BUFFER_BIT1_QCOM 0x00000002 -#define GL_COLOR_BUFFER_BIT2_QCOM 0x00000004 -#define GL_COLOR_BUFFER_BIT3_QCOM 0x00000008 -#define GL_COLOR_BUFFER_BIT4_QCOM 0x00000010 -#define GL_COLOR_BUFFER_BIT5_QCOM 0x00000020 -#define GL_COLOR_BUFFER_BIT6_QCOM 0x00000040 -#define GL_COLOR_BUFFER_BIT7_QCOM 0x00000080 -#define GL_DEPTH_BUFFER_BIT0_QCOM 0x00000100 -#define GL_DEPTH_BUFFER_BIT1_QCOM 0x00000200 -#define GL_DEPTH_BUFFER_BIT2_QCOM 0x00000400 -#define GL_DEPTH_BUFFER_BIT3_QCOM 0x00000800 -#define GL_DEPTH_BUFFER_BIT4_QCOM 0x00001000 -#define GL_DEPTH_BUFFER_BIT5_QCOM 0x00002000 -#define GL_DEPTH_BUFFER_BIT6_QCOM 0x00004000 -#define GL_DEPTH_BUFFER_BIT7_QCOM 0x00008000 -#define GL_STENCIL_BUFFER_BIT0_QCOM 0x00010000 -#define GL_STENCIL_BUFFER_BIT1_QCOM 0x00020000 -#define GL_STENCIL_BUFFER_BIT2_QCOM 0x00040000 -#define GL_STENCIL_BUFFER_BIT3_QCOM 0x00080000 -#define GL_STENCIL_BUFFER_BIT4_QCOM 0x00100000 -#define GL_STENCIL_BUFFER_BIT5_QCOM 0x00200000 -#define GL_STENCIL_BUFFER_BIT6_QCOM 0x00400000 -#define GL_STENCIL_BUFFER_BIT7_QCOM 0x00800000 -#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM 0x01000000 -#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM 0x02000000 -#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM 0x04000000 -#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM 0x08000000 -#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM 0x10000000 -#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM 0x20000000 -#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM 0x40000000 -#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM 0x80000000 - -typedef void (GLAPIENTRY * PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask); -typedef void (GLAPIENTRY * PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); - -#define glEndTilingQCOM GLEW_GET_FUN(__glewEndTilingQCOM) -#define glStartTilingQCOM GLEW_GET_FUN(__glewStartTilingQCOM) - -#define GLEW_QCOM_tiled_rendering GLEW_GET_VAR(__GLEW_QCOM_tiled_rendering) - -#endif /* GL_QCOM_tiled_rendering */ - -/* ---------------------- GL_QCOM_writeonly_rendering ---------------------- */ - -#ifndef GL_QCOM_writeonly_rendering -#define GL_QCOM_writeonly_rendering 1 - -#define GL_WRITEONLY_RENDERING_QCOM 0x8823 - -#define GLEW_QCOM_writeonly_rendering GLEW_GET_VAR(__GLEW_QCOM_writeonly_rendering) - -#endif /* GL_QCOM_writeonly_rendering */ - -/* ---------------------- GL_REGAL_ES1_0_compatibility --------------------- */ - -#ifndef GL_REGAL_ES1_0_compatibility -#define GL_REGAL_ES1_0_compatibility 1 - -typedef int GLclampx; - -typedef void (GLAPIENTRY * PFNGLALPHAFUNCXPROC) (GLenum func, GLclampx ref); -typedef void (GLAPIENTRY * PFNGLCLEARCOLORXPROC) (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha); -typedef void (GLAPIENTRY * PFNGLCLEARDEPTHXPROC) (GLclampx depth); -typedef void (GLAPIENTRY * PFNGLCOLOR4XPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -typedef void (GLAPIENTRY * PFNGLDEPTHRANGEXPROC) (GLclampx zNear, GLclampx zFar); -typedef void (GLAPIENTRY * PFNGLFOGXPROC) (GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLFOGXVPROC) (GLenum pname, const GLfixed* params); -typedef void (GLAPIENTRY * PFNGLFRUSTUMFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); -typedef void (GLAPIENTRY * PFNGLFRUSTUMXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); -typedef void (GLAPIENTRY * PFNGLLIGHTMODELXPROC) (GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLLIGHTMODELXVPROC) (GLenum pname, const GLfixed* params); -typedef void (GLAPIENTRY * PFNGLLIGHTXPROC) (GLenum light, GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLLIGHTXVPROC) (GLenum light, GLenum pname, const GLfixed* params); -typedef void (GLAPIENTRY * PFNGLLINEWIDTHXPROC) (GLfixed width); -typedef void (GLAPIENTRY * PFNGLLOADMATRIXXPROC) (const GLfixed* m); -typedef void (GLAPIENTRY * PFNGLMATERIALXPROC) (GLenum face, GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLMATERIALXVPROC) (GLenum face, GLenum pname, const GLfixed* params); -typedef void (GLAPIENTRY * PFNGLMULTMATRIXXPROC) (const GLfixed* m); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4XPROC) (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q); -typedef void (GLAPIENTRY * PFNGLNORMAL3XPROC) (GLfixed nx, GLfixed ny, GLfixed nz); -typedef void (GLAPIENTRY * PFNGLORTHOFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); -typedef void (GLAPIENTRY * PFNGLORTHOXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); -typedef void (GLAPIENTRY * PFNGLPOINTSIZEXPROC) (GLfixed size); -typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETXPROC) (GLfixed factor, GLfixed units); -typedef void (GLAPIENTRY * PFNGLROTATEXPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); -typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEXPROC) (GLclampx value, GLboolean invert); -typedef void (GLAPIENTRY * PFNGLSCALEXPROC) (GLfixed x, GLfixed y, GLfixed z); -typedef void (GLAPIENTRY * PFNGLTEXENVXPROC) (GLenum target, GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLTEXENVXVPROC) (GLenum target, GLenum pname, const GLfixed* params); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXPROC) (GLenum target, GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLTRANSLATEXPROC) (GLfixed x, GLfixed y, GLfixed z); - -#define glAlphaFuncx GLEW_GET_FUN(__glewAlphaFuncx) -#define glClearColorx GLEW_GET_FUN(__glewClearColorx) -#define glClearDepthx GLEW_GET_FUN(__glewClearDepthx) -#define glColor4x GLEW_GET_FUN(__glewColor4x) -#define glDepthRangex GLEW_GET_FUN(__glewDepthRangex) -#define glFogx GLEW_GET_FUN(__glewFogx) -#define glFogxv GLEW_GET_FUN(__glewFogxv) -#define glFrustumf GLEW_GET_FUN(__glewFrustumf) -#define glFrustumx GLEW_GET_FUN(__glewFrustumx) -#define glLightModelx GLEW_GET_FUN(__glewLightModelx) -#define glLightModelxv GLEW_GET_FUN(__glewLightModelxv) -#define glLightx GLEW_GET_FUN(__glewLightx) -#define glLightxv GLEW_GET_FUN(__glewLightxv) -#define glLineWidthx GLEW_GET_FUN(__glewLineWidthx) -#define glLoadMatrixx GLEW_GET_FUN(__glewLoadMatrixx) -#define glMaterialx GLEW_GET_FUN(__glewMaterialx) -#define glMaterialxv GLEW_GET_FUN(__glewMaterialxv) -#define glMultMatrixx GLEW_GET_FUN(__glewMultMatrixx) -#define glMultiTexCoord4x GLEW_GET_FUN(__glewMultiTexCoord4x) -#define glNormal3x GLEW_GET_FUN(__glewNormal3x) -#define glOrthof GLEW_GET_FUN(__glewOrthof) -#define glOrthox GLEW_GET_FUN(__glewOrthox) -#define glPointSizex GLEW_GET_FUN(__glewPointSizex) -#define glPolygonOffsetx GLEW_GET_FUN(__glewPolygonOffsetx) -#define glRotatex GLEW_GET_FUN(__glewRotatex) -#define glSampleCoveragex GLEW_GET_FUN(__glewSampleCoveragex) -#define glScalex GLEW_GET_FUN(__glewScalex) -#define glTexEnvx GLEW_GET_FUN(__glewTexEnvx) -#define glTexEnvxv GLEW_GET_FUN(__glewTexEnvxv) -#define glTexParameterx GLEW_GET_FUN(__glewTexParameterx) -#define glTranslatex GLEW_GET_FUN(__glewTranslatex) - -#define GLEW_REGAL_ES1_0_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_0_compatibility) - -#endif /* GL_REGAL_ES1_0_compatibility */ - -/* ---------------------- GL_REGAL_ES1_1_compatibility --------------------- */ - -#ifndef GL_REGAL_ES1_1_compatibility -#define GL_REGAL_ES1_1_compatibility 1 - -typedef void (GLAPIENTRY * PFNGLCLIPPLANEFPROC) (GLenum plane, const GLfloat* equation); -typedef void (GLAPIENTRY * PFNGLCLIPPLANEXPROC) (GLenum plane, const GLfixed* equation); -typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFPROC) (GLenum pname, GLfloat eqn[4]); -typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEXPROC) (GLenum pname, GLfixed eqn[4]); -typedef void (GLAPIENTRY * PFNGLGETFIXEDVPROC) (GLenum pname, GLfixed* params); -typedef void (GLAPIENTRY * PFNGLGETLIGHTXVPROC) (GLenum light, GLenum pname, GLfixed* params); -typedef void (GLAPIENTRY * PFNGLGETMATERIALXVPROC) (GLenum face, GLenum pname, GLfixed* params); -typedef void (GLAPIENTRY * PFNGLGETTEXENVXVPROC) (GLenum env, GLenum pname, GLfixed* params); -typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERXVPROC) (GLenum target, GLenum pname, GLfixed* params); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXPROC) (GLenum pname, GLfixed param); -typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXVPROC) (GLenum pname, const GLfixed* params); -typedef void (GLAPIENTRY * PFNGLPOINTSIZEPOINTEROESPROC) (GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXVPROC) (GLenum target, GLenum pname, const GLfixed* params); - -#define glClipPlanef GLEW_GET_FUN(__glewClipPlanef) -#define glClipPlanex GLEW_GET_FUN(__glewClipPlanex) -#define glGetClipPlanef GLEW_GET_FUN(__glewGetClipPlanef) -#define glGetClipPlanex GLEW_GET_FUN(__glewGetClipPlanex) -#define glGetFixedv GLEW_GET_FUN(__glewGetFixedv) -#define glGetLightxv GLEW_GET_FUN(__glewGetLightxv) -#define glGetMaterialxv GLEW_GET_FUN(__glewGetMaterialxv) -#define glGetTexEnvxv GLEW_GET_FUN(__glewGetTexEnvxv) -#define glGetTexParameterxv GLEW_GET_FUN(__glewGetTexParameterxv) -#define glPointParameterx GLEW_GET_FUN(__glewPointParameterx) -#define glPointParameterxv GLEW_GET_FUN(__glewPointParameterxv) -#define glPointSizePointerOES GLEW_GET_FUN(__glewPointSizePointerOES) -#define glTexParameterxv GLEW_GET_FUN(__glewTexParameterxv) - -#define GLEW_REGAL_ES1_1_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_1_compatibility) - -#endif /* GL_REGAL_ES1_1_compatibility */ - -/* ---------------------------- GL_REGAL_enable ---------------------------- */ - -#ifndef GL_REGAL_enable -#define GL_REGAL_enable 1 - -#define GL_ERROR_REGAL 0x9322 -#define GL_DEBUG_REGAL 0x9323 -#define GL_LOG_REGAL 0x9324 -#define GL_EMULATION_REGAL 0x9325 -#define GL_DRIVER_REGAL 0x9326 -#define GL_MISSING_REGAL 0x9360 -#define GL_TRACE_REGAL 0x9361 -#define GL_CACHE_REGAL 0x9362 -#define GL_CODE_REGAL 0x9363 -#define GL_STATISTICS_REGAL 0x9364 - -#define GLEW_REGAL_enable GLEW_GET_VAR(__GLEW_REGAL_enable) - -#endif /* GL_REGAL_enable */ - -/* ------------------------- GL_REGAL_error_string ------------------------- */ - -#ifndef GL_REGAL_error_string -#define GL_REGAL_error_string 1 - -typedef const GLchar* (GLAPIENTRY * PFNGLERRORSTRINGREGALPROC) (GLenum error); - -#define glErrorStringREGAL GLEW_GET_FUN(__glewErrorStringREGAL) - -#define GLEW_REGAL_error_string GLEW_GET_VAR(__GLEW_REGAL_error_string) - -#endif /* GL_REGAL_error_string */ - -/* ------------------------ GL_REGAL_extension_query ----------------------- */ - -#ifndef GL_REGAL_extension_query -#define GL_REGAL_extension_query 1 - -typedef GLboolean (GLAPIENTRY * PFNGLGETEXTENSIONREGALPROC) (const GLchar* ext); -typedef GLboolean (GLAPIENTRY * PFNGLISSUPPORTEDREGALPROC) (const GLchar* ext); - -#define glGetExtensionREGAL GLEW_GET_FUN(__glewGetExtensionREGAL) -#define glIsSupportedREGAL GLEW_GET_FUN(__glewIsSupportedREGAL) - -#define GLEW_REGAL_extension_query GLEW_GET_VAR(__GLEW_REGAL_extension_query) - -#endif /* GL_REGAL_extension_query */ - -/* ------------------------------ GL_REGAL_log ----------------------------- */ - -#ifndef GL_REGAL_log -#define GL_REGAL_log 1 - -#define GL_LOG_ERROR_REGAL 0x9319 -#define GL_LOG_WARNING_REGAL 0x931A -#define GL_LOG_INFO_REGAL 0x931B -#define GL_LOG_APP_REGAL 0x931C -#define GL_LOG_DRIVER_REGAL 0x931D -#define GL_LOG_INTERNAL_REGAL 0x931E -#define GL_LOG_DEBUG_REGAL 0x931F -#define GL_LOG_STATUS_REGAL 0x9320 -#define GL_LOG_HTTP_REGAL 0x9321 - -typedef void (APIENTRY *GLLOGPROCREGAL)(GLenum stream, GLsizei length, const GLchar *message, void *context); - -typedef void (GLAPIENTRY * PFNGLLOGMESSAGECALLBACKREGALPROC) (GLLOGPROCREGAL callback); - -#define glLogMessageCallbackREGAL GLEW_GET_FUN(__glewLogMessageCallbackREGAL) - -#define GLEW_REGAL_log GLEW_GET_VAR(__GLEW_REGAL_log) - -#endif /* GL_REGAL_log */ - -/* ------------------------- GL_REGAL_proc_address ------------------------- */ - -#ifndef GL_REGAL_proc_address -#define GL_REGAL_proc_address 1 - -typedef void * (GLAPIENTRY * PFNGLGETPROCADDRESSREGALPROC) (const GLchar *name); - -#define glGetProcAddressREGAL GLEW_GET_FUN(__glewGetProcAddressREGAL) - -#define GLEW_REGAL_proc_address GLEW_GET_VAR(__GLEW_REGAL_proc_address) - -#endif /* GL_REGAL_proc_address */ - -/* ----------------------- GL_REND_screen_coordinates ---------------------- */ - -#ifndef GL_REND_screen_coordinates -#define GL_REND_screen_coordinates 1 - -#define GL_SCREEN_COORDINATES_REND 0x8490 -#define GL_INVERTED_SCREEN_W_REND 0x8491 - -#define GLEW_REND_screen_coordinates GLEW_GET_VAR(__GLEW_REND_screen_coordinates) - -#endif /* GL_REND_screen_coordinates */ - -/* ------------------------------- GL_S3_s3tc ------------------------------ */ - -#ifndef GL_S3_s3tc -#define GL_S3_s3tc 1 - -#define GL_RGB_S3TC 0x83A0 -#define GL_RGB4_S3TC 0x83A1 -#define GL_RGBA_S3TC 0x83A2 -#define GL_RGBA4_S3TC 0x83A3 -#define GL_RGBA_DXT5_S3TC 0x83A4 -#define GL_RGBA4_DXT5_S3TC 0x83A5 - -#define GLEW_S3_s3tc GLEW_GET_VAR(__GLEW_S3_s3tc) - -#endif /* GL_S3_s3tc */ - -/* ------------------------- GL_SGIS_clip_band_hint ------------------------ */ - -#ifndef GL_SGIS_clip_band_hint -#define GL_SGIS_clip_band_hint 1 - -#define GLEW_SGIS_clip_band_hint GLEW_GET_VAR(__GLEW_SGIS_clip_band_hint) - -#endif /* GL_SGIS_clip_band_hint */ - -/* -------------------------- GL_SGIS_color_range -------------------------- */ - -#ifndef GL_SGIS_color_range -#define GL_SGIS_color_range 1 - -#define GL_EXTENDED_RANGE_SGIS 0x85A5 -#define GL_MIN_RED_SGIS 0x85A6 -#define GL_MAX_RED_SGIS 0x85A7 -#define GL_MIN_GREEN_SGIS 0x85A8 -#define GL_MAX_GREEN_SGIS 0x85A9 -#define GL_MIN_BLUE_SGIS 0x85AA -#define GL_MAX_BLUE_SGIS 0x85AB -#define GL_MIN_ALPHA_SGIS 0x85AC -#define GL_MAX_ALPHA_SGIS 0x85AD - -#define GLEW_SGIS_color_range GLEW_GET_VAR(__GLEW_SGIS_color_range) - -#endif /* GL_SGIS_color_range */ - -/* ------------------------- GL_SGIS_detail_texture ------------------------ */ - -#ifndef GL_SGIS_detail_texture -#define GL_SGIS_detail_texture 1 - -typedef void (GLAPIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); -typedef void (GLAPIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat* points); - -#define glDetailTexFuncSGIS GLEW_GET_FUN(__glewDetailTexFuncSGIS) -#define glGetDetailTexFuncSGIS GLEW_GET_FUN(__glewGetDetailTexFuncSGIS) - -#define GLEW_SGIS_detail_texture GLEW_GET_VAR(__GLEW_SGIS_detail_texture) - -#endif /* GL_SGIS_detail_texture */ - -/* -------------------------- GL_SGIS_fog_function ------------------------- */ - -#ifndef GL_SGIS_fog_function -#define GL_SGIS_fog_function 1 - -typedef void (GLAPIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat* points); -typedef void (GLAPIENTRY * PFNGLGETFOGFUNCSGISPROC) (GLfloat* points); - -#define glFogFuncSGIS GLEW_GET_FUN(__glewFogFuncSGIS) -#define glGetFogFuncSGIS GLEW_GET_FUN(__glewGetFogFuncSGIS) - -#define GLEW_SGIS_fog_function GLEW_GET_VAR(__GLEW_SGIS_fog_function) - -#endif /* GL_SGIS_fog_function */ - -/* ------------------------ GL_SGIS_generate_mipmap ------------------------ */ - -#ifndef GL_SGIS_generate_mipmap -#define GL_SGIS_generate_mipmap 1 - -#define GL_GENERATE_MIPMAP_SGIS 0x8191 -#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 - -#define GLEW_SGIS_generate_mipmap GLEW_GET_VAR(__GLEW_SGIS_generate_mipmap) - -#endif /* GL_SGIS_generate_mipmap */ - -/* -------------------------- GL_SGIS_line_texgen -------------------------- */ - -#ifndef GL_SGIS_line_texgen -#define GL_SGIS_line_texgen 1 - -#define GLEW_SGIS_line_texgen GLEW_GET_VAR(__GLEW_SGIS_line_texgen) - -#endif /* GL_SGIS_line_texgen */ - -/* -------------------------- GL_SGIS_multisample -------------------------- */ - -#ifndef GL_SGIS_multisample -#define GL_SGIS_multisample 1 - -#define GL_MULTISAMPLE_SGIS 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F -#define GL_SAMPLE_MASK_SGIS 0x80A0 -#define GL_1PASS_SGIS 0x80A1 -#define GL_2PASS_0_SGIS 0x80A2 -#define GL_2PASS_1_SGIS 0x80A3 -#define GL_4PASS_0_SGIS 0x80A4 -#define GL_4PASS_1_SGIS 0x80A5 -#define GL_4PASS_2_SGIS 0x80A6 -#define GL_4PASS_3_SGIS 0x80A7 -#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 -#define GL_SAMPLES_SGIS 0x80A9 -#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA -#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB -#define GL_SAMPLE_PATTERN_SGIS 0x80AC - -typedef void (GLAPIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); -typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); - -#define glSampleMaskSGIS GLEW_GET_FUN(__glewSampleMaskSGIS) -#define glSamplePatternSGIS GLEW_GET_FUN(__glewSamplePatternSGIS) - -#define GLEW_SGIS_multisample GLEW_GET_VAR(__GLEW_SGIS_multisample) - -#endif /* GL_SGIS_multisample */ - -/* -------------------------- GL_SGIS_multitexture ------------------------- */ - -#ifndef GL_SGIS_multitexture -#define GL_SGIS_multitexture 1 - -#define GL_SELECTED_TEXTURE_SGIS 0x83C0 -#define GL_SELECTED_TEXTURE_COORD_SET_SGIS 0x83C1 -#define GL_SELECTED_TEXTURE_TRANSFORM_SGIS 0x83C2 -#define GL_MAX_TEXTURES_SGIS 0x83C3 -#define GL_MAX_TEXTURE_COORD_SETS_SGIS 0x83C4 -#define GL_TEXTURE_COORD_SET_INTERLEAVE_FACTOR_SGIS 0x83C5 -#define GL_TEXTURE_ENV_COORD_SET_SGIS 0x83C6 -#define GL_TEXTURE0_SGIS 0x83C7 -#define GL_TEXTURE1_SGIS 0x83C8 -#define GL_TEXTURE2_SGIS 0x83C9 -#define GL_TEXTURE3_SGIS 0x83CA - -typedef void (GLAPIENTRY * PFNGLINTERLEAVEDTEXTURECOORDSETSSGISPROC) (GLint factor); -typedef void (GLAPIENTRY * PFNGLSELECTTEXTURECOORDSETSGISPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLSELECTTEXTURESGISPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLSELECTTEXTURETRANSFORMSGISPROC) (GLenum target); - -#define glInterleavedTextureCoordSetsSGIS GLEW_GET_FUN(__glewInterleavedTextureCoordSetsSGIS) -#define glSelectTextureCoordSetSGIS GLEW_GET_FUN(__glewSelectTextureCoordSetSGIS) -#define glSelectTextureSGIS GLEW_GET_FUN(__glewSelectTextureSGIS) -#define glSelectTextureTransformSGIS GLEW_GET_FUN(__glewSelectTextureTransformSGIS) - -#define GLEW_SGIS_multitexture GLEW_GET_VAR(__GLEW_SGIS_multitexture) - -#endif /* GL_SGIS_multitexture */ - -/* ------------------------- GL_SGIS_pixel_texture ------------------------- */ - -#ifndef GL_SGIS_pixel_texture -#define GL_SGIS_pixel_texture 1 - -#define GLEW_SGIS_pixel_texture GLEW_GET_VAR(__GLEW_SGIS_pixel_texture) - -#endif /* GL_SGIS_pixel_texture */ - -/* ----------------------- GL_SGIS_point_line_texgen ----------------------- */ - -#ifndef GL_SGIS_point_line_texgen -#define GL_SGIS_point_line_texgen 1 - -#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 -#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 -#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 -#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 -#define GL_EYE_POINT_SGIS 0x81F4 -#define GL_OBJECT_POINT_SGIS 0x81F5 -#define GL_EYE_LINE_SGIS 0x81F6 -#define GL_OBJECT_LINE_SGIS 0x81F7 - -#define GLEW_SGIS_point_line_texgen GLEW_GET_VAR(__GLEW_SGIS_point_line_texgen) - -#endif /* GL_SGIS_point_line_texgen */ - -/* ----------------------- GL_SGIS_shared_multisample ---------------------- */ - -#ifndef GL_SGIS_shared_multisample -#define GL_SGIS_shared_multisample 1 - -typedef void (GLAPIENTRY * PFNGLMULTISAMPLESUBRECTPOSSGISPROC) (GLint x, GLint y); - -#define glMultisampleSubRectPosSGIS GLEW_GET_FUN(__glewMultisampleSubRectPosSGIS) - -#define GLEW_SGIS_shared_multisample GLEW_GET_VAR(__GLEW_SGIS_shared_multisample) - -#endif /* GL_SGIS_shared_multisample */ - -/* ------------------------ GL_SGIS_sharpen_texture ------------------------ */ - -#ifndef GL_SGIS_sharpen_texture -#define GL_SGIS_sharpen_texture 1 - -typedef void (GLAPIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat* points); -typedef void (GLAPIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); - -#define glGetSharpenTexFuncSGIS GLEW_GET_FUN(__glewGetSharpenTexFuncSGIS) -#define glSharpenTexFuncSGIS GLEW_GET_FUN(__glewSharpenTexFuncSGIS) - -#define GLEW_SGIS_sharpen_texture GLEW_GET_VAR(__GLEW_SGIS_sharpen_texture) - -#endif /* GL_SGIS_sharpen_texture */ - -/* --------------------------- GL_SGIS_texture4D --------------------------- */ - -#ifndef GL_SGIS_texture4D -#define GL_SGIS_texture4D 1 - -typedef void (GLAPIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLenum format, GLenum type, const void *pixels); - -#define glTexImage4DSGIS GLEW_GET_FUN(__glewTexImage4DSGIS) -#define glTexSubImage4DSGIS GLEW_GET_FUN(__glewTexSubImage4DSGIS) - -#define GLEW_SGIS_texture4D GLEW_GET_VAR(__GLEW_SGIS_texture4D) - -#endif /* GL_SGIS_texture4D */ - -/* ---------------------- GL_SGIS_texture_border_clamp --------------------- */ - -#ifndef GL_SGIS_texture_border_clamp -#define GL_SGIS_texture_border_clamp 1 - -#define GL_CLAMP_TO_BORDER_SGIS 0x812D - -#define GLEW_SGIS_texture_border_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_border_clamp) - -#endif /* GL_SGIS_texture_border_clamp */ - -/* ----------------------- GL_SGIS_texture_edge_clamp ---------------------- */ - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_SGIS_texture_edge_clamp 1 - -#define GL_CLAMP_TO_EDGE_SGIS 0x812F - -#define GLEW_SGIS_texture_edge_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_edge_clamp) - -#endif /* GL_SGIS_texture_edge_clamp */ - -/* ------------------------ GL_SGIS_texture_filter4 ------------------------ */ - -#ifndef GL_SGIS_texture_filter4 -#define GL_SGIS_texture_filter4 1 - -typedef void (GLAPIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat* weights); -typedef void (GLAPIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat* weights); - -#define glGetTexFilterFuncSGIS GLEW_GET_FUN(__glewGetTexFilterFuncSGIS) -#define glTexFilterFuncSGIS GLEW_GET_FUN(__glewTexFilterFuncSGIS) - -#define GLEW_SGIS_texture_filter4 GLEW_GET_VAR(__GLEW_SGIS_texture_filter4) - -#endif /* GL_SGIS_texture_filter4 */ - -/* -------------------------- GL_SGIS_texture_lod -------------------------- */ - -#ifndef GL_SGIS_texture_lod -#define GL_SGIS_texture_lod 1 - -#define GL_TEXTURE_MIN_LOD_SGIS 0x813A -#define GL_TEXTURE_MAX_LOD_SGIS 0x813B -#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C -#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D - -#define GLEW_SGIS_texture_lod GLEW_GET_VAR(__GLEW_SGIS_texture_lod) - -#endif /* GL_SGIS_texture_lod */ - -/* ------------------------- GL_SGIS_texture_select ------------------------ */ - -#ifndef GL_SGIS_texture_select -#define GL_SGIS_texture_select 1 - -#define GLEW_SGIS_texture_select GLEW_GET_VAR(__GLEW_SGIS_texture_select) - -#endif /* GL_SGIS_texture_select */ - -/* ----------------------------- GL_SGIX_async ----------------------------- */ - -#ifndef GL_SGIX_async -#define GL_SGIX_async 1 - -#define GL_ASYNC_MARKER_SGIX 0x8329 - -typedef void (GLAPIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker); -typedef void (GLAPIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); -typedef GLint (GLAPIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint* markerp); -typedef GLuint (GLAPIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); -typedef GLboolean (GLAPIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); -typedef GLint (GLAPIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint* markerp); - -#define glAsyncMarkerSGIX GLEW_GET_FUN(__glewAsyncMarkerSGIX) -#define glDeleteAsyncMarkersSGIX GLEW_GET_FUN(__glewDeleteAsyncMarkersSGIX) -#define glFinishAsyncSGIX GLEW_GET_FUN(__glewFinishAsyncSGIX) -#define glGenAsyncMarkersSGIX GLEW_GET_FUN(__glewGenAsyncMarkersSGIX) -#define glIsAsyncMarkerSGIX GLEW_GET_FUN(__glewIsAsyncMarkerSGIX) -#define glPollAsyncSGIX GLEW_GET_FUN(__glewPollAsyncSGIX) - -#define GLEW_SGIX_async GLEW_GET_VAR(__GLEW_SGIX_async) - -#endif /* GL_SGIX_async */ - -/* ------------------------ GL_SGIX_async_histogram ------------------------ */ - -#ifndef GL_SGIX_async_histogram -#define GL_SGIX_async_histogram 1 - -#define GL_ASYNC_HISTOGRAM_SGIX 0x832C -#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D - -#define GLEW_SGIX_async_histogram GLEW_GET_VAR(__GLEW_SGIX_async_histogram) - -#endif /* GL_SGIX_async_histogram */ - -/* -------------------------- GL_SGIX_async_pixel -------------------------- */ - -#ifndef GL_SGIX_async_pixel -#define GL_SGIX_async_pixel 1 - -#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C -#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D -#define GL_ASYNC_READ_PIXELS_SGIX 0x835E -#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F -#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 -#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 - -#define GLEW_SGIX_async_pixel GLEW_GET_VAR(__GLEW_SGIX_async_pixel) - -#endif /* GL_SGIX_async_pixel */ - -/* ----------------------- GL_SGIX_bali_g_instruments ---------------------- */ - -#ifndef GL_SGIX_bali_g_instruments -#define GL_SGIX_bali_g_instruments 1 - -#define GL_BALI_NUM_TRIS_CULLED_INSTRUMENT 0x6080 -#define GL_BALI_NUM_PRIMS_CLIPPED_INSTRUMENT 0x6081 -#define GL_BALI_NUM_PRIMS_REJECT_INSTRUMENT 0x6082 -#define GL_BALI_NUM_PRIMS_CLIP_RESULT_INSTRUMENT 0x6083 - -#define GLEW_SGIX_bali_g_instruments GLEW_GET_VAR(__GLEW_SGIX_bali_g_instruments) - -#endif /* GL_SGIX_bali_g_instruments */ - -/* ----------------------- GL_SGIX_bali_r_instruments ---------------------- */ - -#ifndef GL_SGIX_bali_r_instruments -#define GL_SGIX_bali_r_instruments 1 - -#define GL_BALI_FRAGMENTS_GENERATED_INSTRUMENT 0x6090 -#define GL_BALI_DEPTH_PASS_INSTRUMENT 0x6091 -#define GL_BALI_R_CHIP_COUNT 0x6092 - -#define GLEW_SGIX_bali_r_instruments GLEW_GET_VAR(__GLEW_SGIX_bali_r_instruments) - -#endif /* GL_SGIX_bali_r_instruments */ - -/* --------------------- GL_SGIX_bali_timer_instruments -------------------- */ - -#ifndef GL_SGIX_bali_timer_instruments -#define GL_SGIX_bali_timer_instruments 1 - -#define GLEW_SGIX_bali_timer_instruments GLEW_GET_VAR(__GLEW_SGIX_bali_timer_instruments) - -#endif /* GL_SGIX_bali_timer_instruments */ - -/* ----------------------- GL_SGIX_blend_alpha_minmax ---------------------- */ - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_SGIX_blend_alpha_minmax 1 - -#define GL_ALPHA_MIN_SGIX 0x8320 -#define GL_ALPHA_MAX_SGIX 0x8321 - -#define GLEW_SGIX_blend_alpha_minmax GLEW_GET_VAR(__GLEW_SGIX_blend_alpha_minmax) - -#endif /* GL_SGIX_blend_alpha_minmax */ - -/* --------------------------- GL_SGIX_blend_cadd -------------------------- */ - -#ifndef GL_SGIX_blend_cadd -#define GL_SGIX_blend_cadd 1 - -#define GL_FUNC_COMPLEX_ADD_EXT 0x601C - -#define GLEW_SGIX_blend_cadd GLEW_GET_VAR(__GLEW_SGIX_blend_cadd) - -#endif /* GL_SGIX_blend_cadd */ - -/* ------------------------ GL_SGIX_blend_cmultiply ------------------------ */ - -#ifndef GL_SGIX_blend_cmultiply -#define GL_SGIX_blend_cmultiply 1 - -#define GL_FUNC_COMPLEX_MULTIPLY_EXT 0x601B - -#define GLEW_SGIX_blend_cmultiply GLEW_GET_VAR(__GLEW_SGIX_blend_cmultiply) - -#endif /* GL_SGIX_blend_cmultiply */ - -/* --------------------- GL_SGIX_calligraphic_fragment --------------------- */ - -#ifndef GL_SGIX_calligraphic_fragment -#define GL_SGIX_calligraphic_fragment 1 - -#define GLEW_SGIX_calligraphic_fragment GLEW_GET_VAR(__GLEW_SGIX_calligraphic_fragment) - -#endif /* GL_SGIX_calligraphic_fragment */ - -/* ---------------------------- GL_SGIX_clipmap ---------------------------- */ - -#ifndef GL_SGIX_clipmap -#define GL_SGIX_clipmap 1 - -#define GLEW_SGIX_clipmap GLEW_GET_VAR(__GLEW_SGIX_clipmap) - -#endif /* GL_SGIX_clipmap */ - -/* --------------------- GL_SGIX_color_matrix_accuracy --------------------- */ - -#ifndef GL_SGIX_color_matrix_accuracy -#define GL_SGIX_color_matrix_accuracy 1 - -#define GL_COLOR_MATRIX_HINT 0x8317 - -#define GLEW_SGIX_color_matrix_accuracy GLEW_GET_VAR(__GLEW_SGIX_color_matrix_accuracy) - -#endif /* GL_SGIX_color_matrix_accuracy */ - -/* --------------------- GL_SGIX_color_table_index_mode -------------------- */ - -#ifndef GL_SGIX_color_table_index_mode -#define GL_SGIX_color_table_index_mode 1 - -#define GLEW_SGIX_color_table_index_mode GLEW_GET_VAR(__GLEW_SGIX_color_table_index_mode) - -#endif /* GL_SGIX_color_table_index_mode */ - -/* ------------------------- GL_SGIX_complex_polar ------------------------- */ - -#ifndef GL_SGIX_complex_polar -#define GL_SGIX_complex_polar 1 - -#define GLEW_SGIX_complex_polar GLEW_GET_VAR(__GLEW_SGIX_complex_polar) - -#endif /* GL_SGIX_complex_polar */ - -/* ---------------------- GL_SGIX_convolution_accuracy --------------------- */ - -#ifndef GL_SGIX_convolution_accuracy -#define GL_SGIX_convolution_accuracy 1 - -#define GL_CONVOLUTION_HINT_SGIX 0x8316 - -#define GLEW_SGIX_convolution_accuracy GLEW_GET_VAR(__GLEW_SGIX_convolution_accuracy) - -#endif /* GL_SGIX_convolution_accuracy */ - -/* ---------------------------- GL_SGIX_cube_map --------------------------- */ - -#ifndef GL_SGIX_cube_map -#define GL_SGIX_cube_map 1 - -#define GL_ENV_MAP_SGIX 0x8340 -#define GL_CUBE_MAP_SGIX 0x8341 -#define GL_CUBE_MAP_ZP_SGIX 0x8342 -#define GL_CUBE_MAP_ZN_SGIX 0x8343 -#define GL_CUBE_MAP_XN_SGIX 0x8344 -#define GL_CUBE_MAP_XP_SGIX 0x8345 -#define GL_CUBE_MAP_YN_SGIX 0x8346 -#define GL_CUBE_MAP_YP_SGIX 0x8347 -#define GL_CUBE_MAP_BINDING_SGIX 0x8348 - -#define GLEW_SGIX_cube_map GLEW_GET_VAR(__GLEW_SGIX_cube_map) - -#endif /* GL_SGIX_cube_map */ - -/* ------------------------ GL_SGIX_cylinder_texgen ------------------------ */ - -#ifndef GL_SGIX_cylinder_texgen -#define GL_SGIX_cylinder_texgen 1 - -#define GLEW_SGIX_cylinder_texgen GLEW_GET_VAR(__GLEW_SGIX_cylinder_texgen) - -#endif /* GL_SGIX_cylinder_texgen */ - -/* ---------------------------- GL_SGIX_datapipe --------------------------- */ - -#ifndef GL_SGIX_datapipe -#define GL_SGIX_datapipe 1 - -#define GL_GEOMETRY_BIT 0x1 -#define GL_IMAGE_BIT 0x2 - -typedef void (GLAPIENTRY * PFNGLADDRESSSPACEPROC) (GLenum space, GLbitfield mask); -typedef GLint (GLAPIENTRY * PFNGLDATAPIPEPROC) (GLenum space); - -#define glAddressSpace GLEW_GET_FUN(__glewAddressSpace) -#define glDataPipe GLEW_GET_FUN(__glewDataPipe) - -#define GLEW_SGIX_datapipe GLEW_GET_VAR(__GLEW_SGIX_datapipe) - -#endif /* GL_SGIX_datapipe */ - -/* --------------------------- GL_SGIX_decimation -------------------------- */ - -#ifndef GL_SGIX_decimation -#define GL_SGIX_decimation 1 - -#define GLEW_SGIX_decimation GLEW_GET_VAR(__GLEW_SGIX_decimation) - -#endif /* GL_SGIX_decimation */ - -/* --------------------- GL_SGIX_depth_pass_instrument --------------------- */ - -#ifndef GL_SGIX_depth_pass_instrument -#define GL_SGIX_depth_pass_instrument 1 - -#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 -#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 -#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 - -#define GLEW_SGIX_depth_pass_instrument GLEW_GET_VAR(__GLEW_SGIX_depth_pass_instrument) - -#endif /* GL_SGIX_depth_pass_instrument */ - -/* ------------------------- GL_SGIX_depth_texture ------------------------- */ - -#ifndef GL_SGIX_depth_texture -#define GL_SGIX_depth_texture 1 - -#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 -#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 -#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 - -#define GLEW_SGIX_depth_texture GLEW_GET_VAR(__GLEW_SGIX_depth_texture) - -#endif /* GL_SGIX_depth_texture */ - -/* ------------------------------ GL_SGIX_dvc ------------------------------ */ - -#ifndef GL_SGIX_dvc -#define GL_SGIX_dvc 1 - -#define GLEW_SGIX_dvc GLEW_GET_VAR(__GLEW_SGIX_dvc) - -#endif /* GL_SGIX_dvc */ - -/* -------------------------- GL_SGIX_flush_raster ------------------------- */ - -#ifndef GL_SGIX_flush_raster -#define GL_SGIX_flush_raster 1 - -typedef void (GLAPIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void); - -#define glFlushRasterSGIX GLEW_GET_FUN(__glewFlushRasterSGIX) - -#define GLEW_SGIX_flush_raster GLEW_GET_VAR(__GLEW_SGIX_flush_raster) - -#endif /* GL_SGIX_flush_raster */ - -/* --------------------------- GL_SGIX_fog_blend --------------------------- */ - -#ifndef GL_SGIX_fog_blend -#define GL_SGIX_fog_blend 1 - -#define GL_FOG_BLEND_ALPHA_SGIX 0x81FE -#define GL_FOG_BLEND_COLOR_SGIX 0x81FF - -#define GLEW_SGIX_fog_blend GLEW_GET_VAR(__GLEW_SGIX_fog_blend) - -#endif /* GL_SGIX_fog_blend */ - -/* ---------------------- GL_SGIX_fog_factor_to_alpha ---------------------- */ - -#ifndef GL_SGIX_fog_factor_to_alpha -#define GL_SGIX_fog_factor_to_alpha 1 - -#define GLEW_SGIX_fog_factor_to_alpha GLEW_GET_VAR(__GLEW_SGIX_fog_factor_to_alpha) - -#endif /* GL_SGIX_fog_factor_to_alpha */ - -/* --------------------------- GL_SGIX_fog_layers -------------------------- */ - -#ifndef GL_SGIX_fog_layers -#define GL_SGIX_fog_layers 1 - -#define GL_FOG_TYPE_SGIX 0x8323 -#define GL_UNIFORM_SGIX 0x8324 -#define GL_LAYERED_SGIX 0x8325 -#define GL_FOG_GROUND_PLANE_SGIX 0x8326 -#define GL_FOG_LAYERS_POINTS_SGIX 0x8327 -#define GL_MAX_FOG_LAYERS_POINTS_SGIX 0x8328 - -typedef void (GLAPIENTRY * PFNGLFOGLAYERSSGIXPROC) (GLsizei n, const GLfloat* points); -typedef void (GLAPIENTRY * PFNGLGETFOGLAYERSSGIXPROC) (GLfloat* points); - -#define glFogLayersSGIX GLEW_GET_FUN(__glewFogLayersSGIX) -#define glGetFogLayersSGIX GLEW_GET_FUN(__glewGetFogLayersSGIX) - -#define GLEW_SGIX_fog_layers GLEW_GET_VAR(__GLEW_SGIX_fog_layers) - -#endif /* GL_SGIX_fog_layers */ - -/* --------------------------- GL_SGIX_fog_offset -------------------------- */ - -#ifndef GL_SGIX_fog_offset -#define GL_SGIX_fog_offset 1 - -#define GL_FOG_OFFSET_SGIX 0x8198 -#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 - -#define GLEW_SGIX_fog_offset GLEW_GET_VAR(__GLEW_SGIX_fog_offset) - -#endif /* GL_SGIX_fog_offset */ - -/* --------------------------- GL_SGIX_fog_patchy -------------------------- */ - -#ifndef GL_SGIX_fog_patchy -#define GL_SGIX_fog_patchy 1 - -#define GLEW_SGIX_fog_patchy GLEW_GET_VAR(__GLEW_SGIX_fog_patchy) - -#endif /* GL_SGIX_fog_patchy */ - -/* --------------------------- GL_SGIX_fog_scale --------------------------- */ - -#ifndef GL_SGIX_fog_scale -#define GL_SGIX_fog_scale 1 - -#define GL_FOG_SCALE_SGIX 0x81FC -#define GL_FOG_SCALE_VALUE_SGIX 0x81FD - -#define GLEW_SGIX_fog_scale GLEW_GET_VAR(__GLEW_SGIX_fog_scale) - -#endif /* GL_SGIX_fog_scale */ - -/* -------------------------- GL_SGIX_fog_texture -------------------------- */ - -#ifndef GL_SGIX_fog_texture -#define GL_SGIX_fog_texture 1 - -typedef void (GLAPIENTRY * PFNGLTEXTUREFOGSGIXPROC) (GLenum pname); - -#define glTextureFogSGIX GLEW_GET_FUN(__glewTextureFogSGIX) - -#define GLEW_SGIX_fog_texture GLEW_GET_VAR(__GLEW_SGIX_fog_texture) - -#endif /* GL_SGIX_fog_texture */ - -/* -------------------- GL_SGIX_fragment_lighting_space -------------------- */ - -#ifndef GL_SGIX_fragment_lighting_space -#define GL_SGIX_fragment_lighting_space 1 - -#define GL_EYE_SPACE_SGIX 0x8436 -#define GL_TANGENT_SPACE_SGIX 0x8437 -#define GL_OBJECT_SPACE_SGIX 0x8438 -#define GL_FRAGMENT_LIGHT_SPACE_SGIX 0x843D - -#define GLEW_SGIX_fragment_lighting_space GLEW_GET_VAR(__GLEW_SGIX_fragment_lighting_space) - -#endif /* GL_SGIX_fragment_lighting_space */ - -/* ------------------- GL_SGIX_fragment_specular_lighting ------------------ */ - -#ifndef GL_SGIX_fragment_specular_lighting -#define GL_SGIX_fragment_specular_lighting 1 - -typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, const GLfloat param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, const GLint param); -typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum value, GLfloat* data); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum value, GLint* data); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* data); -typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* data); - -#define glFragmentColorMaterialSGIX GLEW_GET_FUN(__glewFragmentColorMaterialSGIX) -#define glFragmentLightModelfSGIX GLEW_GET_FUN(__glewFragmentLightModelfSGIX) -#define glFragmentLightModelfvSGIX GLEW_GET_FUN(__glewFragmentLightModelfvSGIX) -#define glFragmentLightModeliSGIX GLEW_GET_FUN(__glewFragmentLightModeliSGIX) -#define glFragmentLightModelivSGIX GLEW_GET_FUN(__glewFragmentLightModelivSGIX) -#define glFragmentLightfSGIX GLEW_GET_FUN(__glewFragmentLightfSGIX) -#define glFragmentLightfvSGIX GLEW_GET_FUN(__glewFragmentLightfvSGIX) -#define glFragmentLightiSGIX GLEW_GET_FUN(__glewFragmentLightiSGIX) -#define glFragmentLightivSGIX GLEW_GET_FUN(__glewFragmentLightivSGIX) -#define glFragmentMaterialfSGIX GLEW_GET_FUN(__glewFragmentMaterialfSGIX) -#define glFragmentMaterialfvSGIX GLEW_GET_FUN(__glewFragmentMaterialfvSGIX) -#define glFragmentMaterialiSGIX GLEW_GET_FUN(__glewFragmentMaterialiSGIX) -#define glFragmentMaterialivSGIX GLEW_GET_FUN(__glewFragmentMaterialivSGIX) -#define glGetFragmentLightfvSGIX GLEW_GET_FUN(__glewGetFragmentLightfvSGIX) -#define glGetFragmentLightivSGIX GLEW_GET_FUN(__glewGetFragmentLightivSGIX) -#define glGetFragmentMaterialfvSGIX GLEW_GET_FUN(__glewGetFragmentMaterialfvSGIX) -#define glGetFragmentMaterialivSGIX GLEW_GET_FUN(__glewGetFragmentMaterialivSGIX) - -#define GLEW_SGIX_fragment_specular_lighting GLEW_GET_VAR(__GLEW_SGIX_fragment_specular_lighting) - -#endif /* GL_SGIX_fragment_specular_lighting */ - -/* ---------------------- GL_SGIX_fragments_instrument --------------------- */ - -#ifndef GL_SGIX_fragments_instrument -#define GL_SGIX_fragments_instrument 1 - -#define GL_FRAGMENTS_INSTRUMENT_SGIX 0x8313 -#define GL_FRAGMENTS_INSTRUMENT_COUNTERS_SGIX 0x8314 -#define GL_FRAGMENTS_INSTRUMENT_MAX_SGIX 0x8315 - -#define GLEW_SGIX_fragments_instrument GLEW_GET_VAR(__GLEW_SGIX_fragments_instrument) - -#endif /* GL_SGIX_fragments_instrument */ - -/* --------------------------- GL_SGIX_framezoom --------------------------- */ - -#ifndef GL_SGIX_framezoom -#define GL_SGIX_framezoom 1 - -typedef void (GLAPIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor); - -#define glFrameZoomSGIX GLEW_GET_FUN(__glewFrameZoomSGIX) - -#define GLEW_SGIX_framezoom GLEW_GET_VAR(__GLEW_SGIX_framezoom) - -#endif /* GL_SGIX_framezoom */ - -/* -------------------------- GL_SGIX_icc_texture -------------------------- */ - -#ifndef GL_SGIX_icc_texture -#define GL_SGIX_icc_texture 1 - -#define GL_RGB_ICC_SGIX 0x8460 -#define GL_RGBA_ICC_SGIX 0x8461 -#define GL_ALPHA_ICC_SGIX 0x8462 -#define GL_LUMINANCE_ICC_SGIX 0x8463 -#define GL_INTENSITY_ICC_SGIX 0x8464 -#define GL_LUMINANCE_ALPHA_ICC_SGIX 0x8465 -#define GL_R5_G6_B5_ICC_SGIX 0x8466 -#define GL_R5_G6_B5_A8_ICC_SGIX 0x8467 -#define GL_ALPHA16_ICC_SGIX 0x8468 -#define GL_LUMINANCE16_ICC_SGIX 0x8469 -#define GL_INTENSITY16_ICC_SGIX 0x846A -#define GL_LUMINANCE16_ALPHA8_ICC_SGIX 0x846B - -#define GLEW_SGIX_icc_texture GLEW_GET_VAR(__GLEW_SGIX_icc_texture) - -#endif /* GL_SGIX_icc_texture */ - -/* ------------------------ GL_SGIX_igloo_interface ------------------------ */ - -#ifndef GL_SGIX_igloo_interface -#define GL_SGIX_igloo_interface 1 - -#define GL_IGLOO_FULLSCREEN_SGIX 0x819E -#define GL_IGLOO_VIEWPORT_OFFSET_SGIX 0x819F -#define GL_IGLOO_SWAPTMESH_SGIX 0x81A0 -#define GL_IGLOO_COLORNORMAL_SGIX 0x81A1 -#define GL_IGLOO_IRISGL_MODE_SGIX 0x81A2 -#define GL_IGLOO_LMC_COLOR_SGIX 0x81A3 -#define GL_IGLOO_TMESHMODE_SGIX 0x81A4 -#define GL_LIGHT31 0xBEAD - -typedef void (GLAPIENTRY * PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, void *param); - -#define glIglooInterfaceSGIX GLEW_GET_FUN(__glewIglooInterfaceSGIX) - -#define GLEW_SGIX_igloo_interface GLEW_GET_VAR(__GLEW_SGIX_igloo_interface) - -#endif /* GL_SGIX_igloo_interface */ - -/* ----------------------- GL_SGIX_image_compression ----------------------- */ - -#ifndef GL_SGIX_image_compression -#define GL_SGIX_image_compression 1 - -#define GLEW_SGIX_image_compression GLEW_GET_VAR(__GLEW_SGIX_image_compression) - -#endif /* GL_SGIX_image_compression */ - -/* ---------------------- GL_SGIX_impact_pixel_texture --------------------- */ - -#ifndef GL_SGIX_impact_pixel_texture -#define GL_SGIX_impact_pixel_texture 1 - -#define GLEW_SGIX_impact_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_impact_pixel_texture) - -#endif /* GL_SGIX_impact_pixel_texture */ - -/* ------------------------ GL_SGIX_instrument_error ----------------------- */ - -#ifndef GL_SGIX_instrument_error -#define GL_SGIX_instrument_error 1 - -#define GLEW_SGIX_instrument_error GLEW_GET_VAR(__GLEW_SGIX_instrument_error) - -#endif /* GL_SGIX_instrument_error */ - -/* --------------------------- GL_SGIX_interlace --------------------------- */ - -#ifndef GL_SGIX_interlace -#define GL_SGIX_interlace 1 - -#define GL_INTERLACE_SGIX 0x8094 - -#define GLEW_SGIX_interlace GLEW_GET_VAR(__GLEW_SGIX_interlace) - -#endif /* GL_SGIX_interlace */ - -/* ------------------------- GL_SGIX_ir_instrument1 ------------------------ */ - -#ifndef GL_SGIX_ir_instrument1 -#define GL_SGIX_ir_instrument1 1 - -#define GLEW_SGIX_ir_instrument1 GLEW_GET_VAR(__GLEW_SGIX_ir_instrument1) - -#endif /* GL_SGIX_ir_instrument1 */ - -/* ----------------------- GL_SGIX_line_quality_hint ----------------------- */ - -#ifndef GL_SGIX_line_quality_hint -#define GL_SGIX_line_quality_hint 1 - -#define GL_LINE_QUALITY_HINT_SGIX 0x835B - -#define GLEW_SGIX_line_quality_hint GLEW_GET_VAR(__GLEW_SGIX_line_quality_hint) - -#endif /* GL_SGIX_line_quality_hint */ - -/* ------------------------- GL_SGIX_list_priority ------------------------- */ - -#ifndef GL_SGIX_list_priority -#define GL_SGIX_list_priority 1 - -#define GLEW_SGIX_list_priority GLEW_GET_VAR(__GLEW_SGIX_list_priority) - -#endif /* GL_SGIX_list_priority */ - -/* ----------------------------- GL_SGIX_mpeg1 ----------------------------- */ - -#ifndef GL_SGIX_mpeg1 -#define GL_SGIX_mpeg1 1 - -typedef void (GLAPIENTRY * PFNGLALLOCMPEGPREDICTORSSGIXPROC) (GLsizei width, GLsizei height, GLsizei n, GLuint* predictors); -typedef void (GLAPIENTRY * PFNGLDELETEMPEGPREDICTORSSGIXPROC) (GLsizei n, GLuint* predictors); -typedef void (GLAPIENTRY * PFNGLGENMPEGPREDICTORSSGIXPROC) (GLsizei n, GLuint* predictors); -typedef void (GLAPIENTRY * PFNGLGETMPEGPARAMETERFVSGIXPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETMPEGPARAMETERIVSGIXPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMPEGPREDICTORSGIXPROC) (GLenum target, GLenum format, GLenum type, void *pixels); -typedef void (GLAPIENTRY * PFNGLGETMPEGQUANTTABLEUBVPROC) (GLenum target, GLubyte* values); -typedef GLboolean (GLAPIENTRY * PFNGLISMPEGPREDICTORSGIXPROC) (GLuint predictor); -typedef void (GLAPIENTRY * PFNGLMPEGPREDICTORSGIXPROC) (GLenum target, GLenum format, GLenum type, void *pixels); -typedef void (GLAPIENTRY * PFNGLMPEGQUANTTABLEUBVPROC) (GLenum target, GLubyte* values); -typedef void (GLAPIENTRY * PFNGLSWAPMPEGPREDICTORSSGIXPROC) (GLenum target0, GLenum target1); - -#define glAllocMPEGPredictorsSGIX GLEW_GET_FUN(__glewAllocMPEGPredictorsSGIX) -#define glDeleteMPEGPredictorsSGIX GLEW_GET_FUN(__glewDeleteMPEGPredictorsSGIX) -#define glGenMPEGPredictorsSGIX GLEW_GET_FUN(__glewGenMPEGPredictorsSGIX) -#define glGetMPEGParameterfvSGIX GLEW_GET_FUN(__glewGetMPEGParameterfvSGIX) -#define glGetMPEGParameterivSGIX GLEW_GET_FUN(__glewGetMPEGParameterivSGIX) -#define glGetMPEGPredictorSGIX GLEW_GET_FUN(__glewGetMPEGPredictorSGIX) -#define glGetMPEGQuantTableubv GLEW_GET_FUN(__glewGetMPEGQuantTableubv) -#define glIsMPEGPredictorSGIX GLEW_GET_FUN(__glewIsMPEGPredictorSGIX) -#define glMPEGPredictorSGIX GLEW_GET_FUN(__glewMPEGPredictorSGIX) -#define glMPEGQuantTableubv GLEW_GET_FUN(__glewMPEGQuantTableubv) -#define glSwapMPEGPredictorsSGIX GLEW_GET_FUN(__glewSwapMPEGPredictorsSGIX) - -#define GLEW_SGIX_mpeg1 GLEW_GET_VAR(__GLEW_SGIX_mpeg1) - -#endif /* GL_SGIX_mpeg1 */ - -/* ----------------------------- GL_SGIX_mpeg2 ----------------------------- */ - -#ifndef GL_SGIX_mpeg2 -#define GL_SGIX_mpeg2 1 - -#define GLEW_SGIX_mpeg2 GLEW_GET_VAR(__GLEW_SGIX_mpeg2) - -#endif /* GL_SGIX_mpeg2 */ - -/* ------------------ GL_SGIX_nonlinear_lighting_pervertex ----------------- */ - -#ifndef GL_SGIX_nonlinear_lighting_pervertex -#define GL_SGIX_nonlinear_lighting_pervertex 1 - -typedef void (GLAPIENTRY * PFNGLGETNONLINLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLint* terms, GLfloat *data); -typedef void (GLAPIENTRY * PFNGLGETNONLINMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLint* terms, const GLfloat *data); -typedef void (GLAPIENTRY * PFNGLNONLINLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLint terms, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLNONLINMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLint terms, const GLfloat* params); - -#define glGetNonlinLightfvSGIX GLEW_GET_FUN(__glewGetNonlinLightfvSGIX) -#define glGetNonlinMaterialfvSGIX GLEW_GET_FUN(__glewGetNonlinMaterialfvSGIX) -#define glNonlinLightfvSGIX GLEW_GET_FUN(__glewNonlinLightfvSGIX) -#define glNonlinMaterialfvSGIX GLEW_GET_FUN(__glewNonlinMaterialfvSGIX) - -#define GLEW_SGIX_nonlinear_lighting_pervertex GLEW_GET_VAR(__GLEW_SGIX_nonlinear_lighting_pervertex) - -#endif /* GL_SGIX_nonlinear_lighting_pervertex */ - -/* --------------------------- GL_SGIX_nurbs_eval -------------------------- */ - -#ifndef GL_SGIX_nurbs_eval -#define GL_SGIX_nurbs_eval 1 - -#define GL_MAP1_VERTEX_3_NURBS_SGIX 0x81CB -#define GL_MAP1_VERTEX_4_NURBS_SGIX 0x81CC -#define GL_MAP1_INDEX_NURBS_SGIX 0x81CD -#define GL_MAP1_COLOR_4_NURBS_SGIX 0x81CE -#define GL_MAP1_NORMAL_NURBS_SGIX 0x81CF -#define GL_MAP1_TEXTURE_COORD_1_NURBS_SGIX 0x81E0 -#define GL_MAP1_TEXTURE_COORD_2_NURBS_SGIX 0x81E1 -#define GL_MAP1_TEXTURE_COORD_3_NURBS_SGIX 0x81E2 -#define GL_MAP1_TEXTURE_COORD_4_NURBS_SGIX 0x81E3 -#define GL_MAP2_VERTEX_3_NURBS_SGIX 0x81E4 -#define GL_MAP2_VERTEX_4_NURBS_SGIX 0x81E5 -#define GL_MAP2_INDEX_NURBS_SGIX 0x81E6 -#define GL_MAP2_COLOR_4_NURBS_SGIX 0x81E7 -#define GL_MAP2_NORMAL_NURBS_SGIX 0x81E8 -#define GL_MAP2_TEXTURE_COORD_1_NURBS_SGIX 0x81E9 -#define GL_MAP2_TEXTURE_COORD_2_NURBS_SGIX 0x81EA -#define GL_MAP2_TEXTURE_COORD_3_NURBS_SGIX 0x81EB -#define GL_MAP2_TEXTURE_COORD_4_NURBS_SGIX 0x81EC -#define GL_NURBS_KNOT_COUNT_SGIX 0x81ED -#define GL_NURBS_KNOT_VECTOR_SGIX 0x81EE - -#define GLEW_SGIX_nurbs_eval GLEW_GET_VAR(__GLEW_SGIX_nurbs_eval) - -#endif /* GL_SGIX_nurbs_eval */ - -/* ---------------------- GL_SGIX_occlusion_instrument --------------------- */ - -#ifndef GL_SGIX_occlusion_instrument -#define GL_SGIX_occlusion_instrument 1 - -#define GL_OCCLUSION_INSTRUMENT_SGIX 0x6060 - -#define GLEW_SGIX_occlusion_instrument GLEW_GET_VAR(__GLEW_SGIX_occlusion_instrument) - -#endif /* GL_SGIX_occlusion_instrument */ - -/* ------------------------- GL_SGIX_packed_6bytes ------------------------- */ - -#ifndef GL_SGIX_packed_6bytes -#define GL_SGIX_packed_6bytes 1 - -#define GLEW_SGIX_packed_6bytes GLEW_GET_VAR(__GLEW_SGIX_packed_6bytes) - -#endif /* GL_SGIX_packed_6bytes */ - -/* ------------------------- GL_SGIX_pixel_texture ------------------------- */ - -#ifndef GL_SGIX_pixel_texture -#define GL_SGIX_pixel_texture 1 - -typedef void (GLAPIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); - -#define glPixelTexGenSGIX GLEW_GET_FUN(__glewPixelTexGenSGIX) - -#define GLEW_SGIX_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_pixel_texture) - -#endif /* GL_SGIX_pixel_texture */ - -/* ----------------------- GL_SGIX_pixel_texture_bits ---------------------- */ - -#ifndef GL_SGIX_pixel_texture_bits -#define GL_SGIX_pixel_texture_bits 1 - -#define GLEW_SGIX_pixel_texture_bits GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_bits) - -#endif /* GL_SGIX_pixel_texture_bits */ - -/* ----------------------- GL_SGIX_pixel_texture_lod ----------------------- */ - -#ifndef GL_SGIX_pixel_texture_lod -#define GL_SGIX_pixel_texture_lod 1 - -#define GLEW_SGIX_pixel_texture_lod GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_lod) - -#endif /* GL_SGIX_pixel_texture_lod */ - -/* -------------------------- GL_SGIX_pixel_tiles -------------------------- */ - -#ifndef GL_SGIX_pixel_tiles -#define GL_SGIX_pixel_tiles 1 - -#define GLEW_SGIX_pixel_tiles GLEW_GET_VAR(__GLEW_SGIX_pixel_tiles) - -#endif /* GL_SGIX_pixel_tiles */ - -/* ------------------------- GL_SGIX_polynomial_ffd ------------------------ */ - -#ifndef GL_SGIX_polynomial_ffd -#define GL_SGIX_polynomial_ffd 1 - -#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x1 -#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x2 - -typedef void (GLAPIENTRY * PFNGLDEFORMSGIXPROC) (GLbitfield mask); -typedef void (GLAPIENTRY * PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); - -#define glDeformSGIX GLEW_GET_FUN(__glewDeformSGIX) -#define glLoadIdentityDeformationMapSGIX GLEW_GET_FUN(__glewLoadIdentityDeformationMapSGIX) - -#define GLEW_SGIX_polynomial_ffd GLEW_GET_VAR(__GLEW_SGIX_polynomial_ffd) - -#endif /* GL_SGIX_polynomial_ffd */ - -/* --------------------------- GL_SGIX_quad_mesh --------------------------- */ - -#ifndef GL_SGIX_quad_mesh -#define GL_SGIX_quad_mesh 1 - -typedef void (GLAPIENTRY * PFNGLMESHBREADTHSGIXPROC) (GLint breadth); -typedef void (GLAPIENTRY * PFNGLMESHSTRIDESGIXPROC) (GLint stride); - -#define glMeshBreadthSGIX GLEW_GET_FUN(__glewMeshBreadthSGIX) -#define glMeshStrideSGIX GLEW_GET_FUN(__glewMeshStrideSGIX) - -#define GLEW_SGIX_quad_mesh GLEW_GET_VAR(__GLEW_SGIX_quad_mesh) - -#endif /* GL_SGIX_quad_mesh */ - -/* ------------------------ GL_SGIX_reference_plane ------------------------ */ - -#ifndef GL_SGIX_reference_plane -#define GL_SGIX_reference_plane 1 - -typedef void (GLAPIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble* equation); - -#define glReferencePlaneSGIX GLEW_GET_FUN(__glewReferencePlaneSGIX) - -#define GLEW_SGIX_reference_plane GLEW_GET_VAR(__GLEW_SGIX_reference_plane) - -#endif /* GL_SGIX_reference_plane */ - -/* ---------------------------- GL_SGIX_resample --------------------------- */ - -#ifndef GL_SGIX_resample -#define GL_SGIX_resample 1 - -#define GL_PACK_RESAMPLE_SGIX 0x842E -#define GL_UNPACK_RESAMPLE_SGIX 0x842F -#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 -#define GL_RESAMPLE_REPLICATE_SGIX 0x8433 -#define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434 - -#define GLEW_SGIX_resample GLEW_GET_VAR(__GLEW_SGIX_resample) - -#endif /* GL_SGIX_resample */ - -/* ------------------------- GL_SGIX_scalebias_hint ------------------------ */ - -#ifndef GL_SGIX_scalebias_hint -#define GL_SGIX_scalebias_hint 1 - -#define GL_SCALEBIAS_HINT_SGIX 0x8322 - -#define GLEW_SGIX_scalebias_hint GLEW_GET_VAR(__GLEW_SGIX_scalebias_hint) - -#endif /* GL_SGIX_scalebias_hint */ - -/* ----------------------------- GL_SGIX_shadow ---------------------------- */ - -#ifndef GL_SGIX_shadow -#define GL_SGIX_shadow 1 - -#define GL_TEXTURE_COMPARE_SGIX 0x819A -#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B -#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C -#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D - -#define GLEW_SGIX_shadow GLEW_GET_VAR(__GLEW_SGIX_shadow) - -#endif /* GL_SGIX_shadow */ - -/* ------------------------- GL_SGIX_shadow_ambient ------------------------ */ - -#ifndef GL_SGIX_shadow_ambient -#define GL_SGIX_shadow_ambient 1 - -#define GL_SHADOW_AMBIENT_SGIX 0x80BF - -#define GLEW_SGIX_shadow_ambient GLEW_GET_VAR(__GLEW_SGIX_shadow_ambient) - -#endif /* GL_SGIX_shadow_ambient */ - -/* ------------------------------ GL_SGIX_slim ----------------------------- */ - -#ifndef GL_SGIX_slim -#define GL_SGIX_slim 1 - -#define GL_PACK_MAX_COMPRESSED_SIZE_SGIX 0x831B -#define GL_SLIM8U_SGIX 0x831D -#define GL_SLIM10U_SGIX 0x831E -#define GL_SLIM12S_SGIX 0x831F - -#define GLEW_SGIX_slim GLEW_GET_VAR(__GLEW_SGIX_slim) - -#endif /* GL_SGIX_slim */ - -/* ------------------------ GL_SGIX_spotlight_cutoff ----------------------- */ - -#ifndef GL_SGIX_spotlight_cutoff -#define GL_SGIX_spotlight_cutoff 1 - -#define GL_SPOT_CUTOFF_DELTA_SGIX 0x8193 - -#define GLEW_SGIX_spotlight_cutoff GLEW_GET_VAR(__GLEW_SGIX_spotlight_cutoff) - -#endif /* GL_SGIX_spotlight_cutoff */ - -/* ----------------------------- GL_SGIX_sprite ---------------------------- */ - -#ifndef GL_SGIX_sprite -#define GL_SGIX_sprite 1 - -typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, GLint* params); - -#define glSpriteParameterfSGIX GLEW_GET_FUN(__glewSpriteParameterfSGIX) -#define glSpriteParameterfvSGIX GLEW_GET_FUN(__glewSpriteParameterfvSGIX) -#define glSpriteParameteriSGIX GLEW_GET_FUN(__glewSpriteParameteriSGIX) -#define glSpriteParameterivSGIX GLEW_GET_FUN(__glewSpriteParameterivSGIX) - -#define GLEW_SGIX_sprite GLEW_GET_VAR(__GLEW_SGIX_sprite) - -#endif /* GL_SGIX_sprite */ - -/* -------------------------- GL_SGIX_subdiv_patch ------------------------- */ - -#ifndef GL_SGIX_subdiv_patch -#define GL_SGIX_subdiv_patch 1 - -#define GLEW_SGIX_subdiv_patch GLEW_GET_VAR(__GLEW_SGIX_subdiv_patch) - -#endif /* GL_SGIX_subdiv_patch */ - -/* --------------------------- GL_SGIX_subsample --------------------------- */ - -#ifndef GL_SGIX_subsample -#define GL_SGIX_subsample 1 - -#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 -#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 -#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 -#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 -#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 - -#define GLEW_SGIX_subsample GLEW_GET_VAR(__GLEW_SGIX_subsample) - -#endif /* GL_SGIX_subsample */ - -/* ----------------------- GL_SGIX_tag_sample_buffer ----------------------- */ - -#ifndef GL_SGIX_tag_sample_buffer -#define GL_SGIX_tag_sample_buffer 1 - -typedef void (GLAPIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); - -#define glTagSampleBufferSGIX GLEW_GET_FUN(__glewTagSampleBufferSGIX) - -#define GLEW_SGIX_tag_sample_buffer GLEW_GET_VAR(__GLEW_SGIX_tag_sample_buffer) - -#endif /* GL_SGIX_tag_sample_buffer */ - -/* ------------------------ GL_SGIX_texture_add_env ------------------------ */ - -#ifndef GL_SGIX_texture_add_env -#define GL_SGIX_texture_add_env 1 - -#define GLEW_SGIX_texture_add_env GLEW_GET_VAR(__GLEW_SGIX_texture_add_env) - -#endif /* GL_SGIX_texture_add_env */ - -/* -------------------- GL_SGIX_texture_coordinate_clamp ------------------- */ - -#ifndef GL_SGIX_texture_coordinate_clamp -#define GL_SGIX_texture_coordinate_clamp 1 - -#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 -#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A -#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B - -#define GLEW_SGIX_texture_coordinate_clamp GLEW_GET_VAR(__GLEW_SGIX_texture_coordinate_clamp) - -#endif /* GL_SGIX_texture_coordinate_clamp */ - -/* ------------------------ GL_SGIX_texture_lod_bias ----------------------- */ - -#ifndef GL_SGIX_texture_lod_bias -#define GL_SGIX_texture_lod_bias 1 - -#define GLEW_SGIX_texture_lod_bias GLEW_GET_VAR(__GLEW_SGIX_texture_lod_bias) - -#endif /* GL_SGIX_texture_lod_bias */ - -/* ------------------- GL_SGIX_texture_mipmap_anisotropic ------------------ */ - -#ifndef GL_SGIX_texture_mipmap_anisotropic -#define GL_SGIX_texture_mipmap_anisotropic 1 - -#define GL_TEXTURE_MIPMAP_ANISOTROPY_SGIX 0x832E -#define GL_MAX_MIPMAP_ANISOTROPY_SGIX 0x832F - -#define GLEW_SGIX_texture_mipmap_anisotropic GLEW_GET_VAR(__GLEW_SGIX_texture_mipmap_anisotropic) - -#endif /* GL_SGIX_texture_mipmap_anisotropic */ - -/* ---------------------- GL_SGIX_texture_multi_buffer --------------------- */ - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_SGIX_texture_multi_buffer 1 - -#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E - -#define GLEW_SGIX_texture_multi_buffer GLEW_GET_VAR(__GLEW_SGIX_texture_multi_buffer) - -#endif /* GL_SGIX_texture_multi_buffer */ - -/* ------------------------- GL_SGIX_texture_phase ------------------------- */ - -#ifndef GL_SGIX_texture_phase -#define GL_SGIX_texture_phase 1 - -#define GL_PHASE_SGIX 0x832A - -#define GLEW_SGIX_texture_phase GLEW_GET_VAR(__GLEW_SGIX_texture_phase) - -#endif /* GL_SGIX_texture_phase */ - -/* ------------------------- GL_SGIX_texture_range ------------------------- */ - -#ifndef GL_SGIX_texture_range -#define GL_SGIX_texture_range 1 - -#define GL_RGB_SIGNED_SGIX 0x85E0 -#define GL_RGBA_SIGNED_SGIX 0x85E1 -#define GL_ALPHA_SIGNED_SGIX 0x85E2 -#define GL_LUMINANCE_SIGNED_SGIX 0x85E3 -#define GL_INTENSITY_SIGNED_SGIX 0x85E4 -#define GL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5 -#define GL_RGB16_SIGNED_SGIX 0x85E6 -#define GL_RGBA16_SIGNED_SGIX 0x85E7 -#define GL_ALPHA16_SIGNED_SGIX 0x85E8 -#define GL_LUMINANCE16_SIGNED_SGIX 0x85E9 -#define GL_INTENSITY16_SIGNED_SGIX 0x85EA -#define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB -#define GL_RGB_EXTENDED_RANGE_SGIX 0x85EC -#define GL_RGBA_EXTENDED_RANGE_SGIX 0x85ED -#define GL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE -#define GL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF -#define GL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0 -#define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1 -#define GL_RGB16_EXTENDED_RANGE_SGIX 0x85F2 -#define GL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3 -#define GL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4 -#define GL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5 -#define GL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6 -#define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7 -#define GL_MIN_LUMINANCE_SGIS 0x85F8 -#define GL_MAX_LUMINANCE_SGIS 0x85F9 -#define GL_MIN_INTENSITY_SGIS 0x85FA -#define GL_MAX_INTENSITY_SGIS 0x85FB - -#define GLEW_SGIX_texture_range GLEW_GET_VAR(__GLEW_SGIX_texture_range) - -#endif /* GL_SGIX_texture_range */ - -/* ----------------------- GL_SGIX_texture_scale_bias ---------------------- */ - -#ifndef GL_SGIX_texture_scale_bias -#define GL_SGIX_texture_scale_bias 1 - -#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 -#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A -#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B -#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C - -#define GLEW_SGIX_texture_scale_bias GLEW_GET_VAR(__GLEW_SGIX_texture_scale_bias) - -#endif /* GL_SGIX_texture_scale_bias */ - -/* ---------------------- GL_SGIX_texture_supersample ---------------------- */ - -#ifndef GL_SGIX_texture_supersample -#define GL_SGIX_texture_supersample 1 - -#define GLEW_SGIX_texture_supersample GLEW_GET_VAR(__GLEW_SGIX_texture_supersample) - -#endif /* GL_SGIX_texture_supersample */ - -/* --------------------------- GL_SGIX_vector_ops -------------------------- */ - -#ifndef GL_SGIX_vector_ops -#define GL_SGIX_vector_ops 1 - -typedef void (GLAPIENTRY * PFNGLGETVECTOROPERATIONSGIXPROC) (GLenum operation); -typedef void (GLAPIENTRY * PFNGLVECTOROPERATIONSGIXPROC) (GLenum operation); - -#define glGetVectorOperationSGIX GLEW_GET_FUN(__glewGetVectorOperationSGIX) -#define glVectorOperationSGIX GLEW_GET_FUN(__glewVectorOperationSGIX) - -#define GLEW_SGIX_vector_ops GLEW_GET_VAR(__GLEW_SGIX_vector_ops) - -#endif /* GL_SGIX_vector_ops */ - -/* ---------------------- GL_SGIX_vertex_array_object ---------------------- */ - -#ifndef GL_SGIX_vertex_array_object -#define GL_SGIX_vertex_array_object 1 - -typedef GLboolean (GLAPIENTRY * PFNGLAREVERTEXARRAYSRESIDENTSGIXPROC) (GLsizei n, const GLuint* arrays, GLboolean* residences); -typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYSGIXPROC) (GLuint array); -typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSSGIXPROC) (GLsizei n, const GLuint* arrays); -typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSSGIXPROC) (GLsizei n, GLuint* arrays); -typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYSGIXPROC) (GLuint array); -typedef void (GLAPIENTRY * PFNGLPRIORITIZEVERTEXARRAYSSGIXPROC) (GLsizei n, const GLuint* arrays, const GLclampf* priorities); - -#define glAreVertexArraysResidentSGIX GLEW_GET_FUN(__glewAreVertexArraysResidentSGIX) -#define glBindVertexArraySGIX GLEW_GET_FUN(__glewBindVertexArraySGIX) -#define glDeleteVertexArraysSGIX GLEW_GET_FUN(__glewDeleteVertexArraysSGIX) -#define glGenVertexArraysSGIX GLEW_GET_FUN(__glewGenVertexArraysSGIX) -#define glIsVertexArraySGIX GLEW_GET_FUN(__glewIsVertexArraySGIX) -#define glPrioritizeVertexArraysSGIX GLEW_GET_FUN(__glewPrioritizeVertexArraysSGIX) - -#define GLEW_SGIX_vertex_array_object GLEW_GET_VAR(__GLEW_SGIX_vertex_array_object) - -#endif /* GL_SGIX_vertex_array_object */ - -/* ------------------------- GL_SGIX_vertex_preclip ------------------------ */ - -#ifndef GL_SGIX_vertex_preclip -#define GL_SGIX_vertex_preclip 1 - -#define GL_VERTEX_PRECLIP_SGIX 0x83EE -#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF - -#define GLEW_SGIX_vertex_preclip GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip) - -#endif /* GL_SGIX_vertex_preclip */ - -/* ---------------------- GL_SGIX_vertex_preclip_hint ---------------------- */ - -#ifndef GL_SGIX_vertex_preclip_hint -#define GL_SGIX_vertex_preclip_hint 1 - -#define GL_VERTEX_PRECLIP_SGIX 0x83EE -#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF - -#define GLEW_SGIX_vertex_preclip_hint GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip_hint) - -#endif /* GL_SGIX_vertex_preclip_hint */ - -/* ----------------------------- GL_SGIX_ycrcb ----------------------------- */ - -#ifndef GL_SGIX_ycrcb -#define GL_SGIX_ycrcb 1 - -#define GLEW_SGIX_ycrcb GLEW_GET_VAR(__GLEW_SGIX_ycrcb) - -#endif /* GL_SGIX_ycrcb */ - -/* ------------------------ GL_SGIX_ycrcb_subsample ------------------------ */ - -#ifndef GL_SGIX_ycrcb_subsample -#define GL_SGIX_ycrcb_subsample 1 - -#define GLEW_SGIX_ycrcb_subsample GLEW_GET_VAR(__GLEW_SGIX_ycrcb_subsample) - -#endif /* GL_SGIX_ycrcb_subsample */ - -/* ----------------------------- GL_SGIX_ycrcba ---------------------------- */ - -#ifndef GL_SGIX_ycrcba -#define GL_SGIX_ycrcba 1 - -#define GL_YCRCB_SGIX 0x8318 -#define GL_YCRCBA_SGIX 0x8319 - -#define GLEW_SGIX_ycrcba GLEW_GET_VAR(__GLEW_SGIX_ycrcba) - -#endif /* GL_SGIX_ycrcba */ - -/* -------------------------- GL_SGI_color_matrix -------------------------- */ - -#ifndef GL_SGI_color_matrix -#define GL_SGI_color_matrix 1 - -#define GL_COLOR_MATRIX_SGI 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB - -#define GLEW_SGI_color_matrix GLEW_GET_VAR(__GLEW_SGI_color_matrix) - -#endif /* GL_SGI_color_matrix */ - -/* --------------------------- GL_SGI_color_table -------------------------- */ - -#ifndef GL_SGI_color_table -#define GL_SGI_color_table 1 - -#define GL_COLOR_TABLE_SGI 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 -#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 -#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 -#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 -#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 -#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF - -typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); -typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void *table); - -#define glColorTableParameterfvSGI GLEW_GET_FUN(__glewColorTableParameterfvSGI) -#define glColorTableParameterivSGI GLEW_GET_FUN(__glewColorTableParameterivSGI) -#define glColorTableSGI GLEW_GET_FUN(__glewColorTableSGI) -#define glCopyColorTableSGI GLEW_GET_FUN(__glewCopyColorTableSGI) -#define glGetColorTableParameterfvSGI GLEW_GET_FUN(__glewGetColorTableParameterfvSGI) -#define glGetColorTableParameterivSGI GLEW_GET_FUN(__glewGetColorTableParameterivSGI) -#define glGetColorTableSGI GLEW_GET_FUN(__glewGetColorTableSGI) - -#define GLEW_SGI_color_table GLEW_GET_VAR(__GLEW_SGI_color_table) - -#endif /* GL_SGI_color_table */ - -/* ----------------------------- GL_SGI_complex ---------------------------- */ - -#ifndef GL_SGI_complex -#define GL_SGI_complex 1 - -#define GLEW_SGI_complex GLEW_GET_VAR(__GLEW_SGI_complex) - -#endif /* GL_SGI_complex */ - -/* -------------------------- GL_SGI_complex_type -------------------------- */ - -#ifndef GL_SGI_complex_type -#define GL_SGI_complex_type 1 - -#define GL_COMPLEX_UNSIGNED_BYTE_SGI 0x81BD -#define GL_COMPLEX_BYTE_SGI 0x81BE -#define GL_COMPLEX_UNSIGNED_SHORT_SGI 0x81BF -#define GL_COMPLEX_SHORT_SGI 0x81C0 -#define GL_COMPLEX_UNSIGNED_INT_SGI 0x81C1 -#define GL_COMPLEX_INT_SGI 0x81C2 -#define GL_COMPLEX_FLOAT_SGI 0x81C3 - -#define GLEW_SGI_complex_type GLEW_GET_VAR(__GLEW_SGI_complex_type) - -#endif /* GL_SGI_complex_type */ - -/* ------------------------------- GL_SGI_fft ------------------------------ */ - -#ifndef GL_SGI_fft -#define GL_SGI_fft 1 - -#define GL_PIXEL_TRANSFORM_OPERATOR_SGI 0x81C4 -#define GL_CONVOLUTION_SGI 0x81C5 -#define GL_FFT_1D_SGI 0x81C6 -#define GL_PIXEL_TRANSFORM_SGI 0x81C7 -#define GL_MAX_FFT_WIDTH_SGI 0x81C8 - -typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFSGIPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERISGIPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMSGIPROC) (GLenum target); - -#define glGetPixelTransformParameterfvSGI GLEW_GET_FUN(__glewGetPixelTransformParameterfvSGI) -#define glGetPixelTransformParameterivSGI GLEW_GET_FUN(__glewGetPixelTransformParameterivSGI) -#define glPixelTransformParameterfSGI GLEW_GET_FUN(__glewPixelTransformParameterfSGI) -#define glPixelTransformParameterfvSGI GLEW_GET_FUN(__glewPixelTransformParameterfvSGI) -#define glPixelTransformParameteriSGI GLEW_GET_FUN(__glewPixelTransformParameteriSGI) -#define glPixelTransformParameterivSGI GLEW_GET_FUN(__glewPixelTransformParameterivSGI) -#define glPixelTransformSGI GLEW_GET_FUN(__glewPixelTransformSGI) - -#define GLEW_SGI_fft GLEW_GET_VAR(__GLEW_SGI_fft) - -#endif /* GL_SGI_fft */ - -/* ----------------------- GL_SGI_texture_color_table ---------------------- */ - -#ifndef GL_SGI_texture_color_table -#define GL_SGI_texture_color_table 1 - -#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC -#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD - -#define GLEW_SGI_texture_color_table GLEW_GET_VAR(__GLEW_SGI_texture_color_table) - -#endif /* GL_SGI_texture_color_table */ - -/* ------------------------- GL_SUNX_constant_data ------------------------- */ - -#ifndef GL_SUNX_constant_data -#define GL_SUNX_constant_data 1 - -#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 -#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 - -typedef void (GLAPIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void); - -#define glFinishTextureSUNX GLEW_GET_FUN(__glewFinishTextureSUNX) - -#define GLEW_SUNX_constant_data GLEW_GET_VAR(__GLEW_SUNX_constant_data) - -#endif /* GL_SUNX_constant_data */ - -/* -------------------- GL_SUN_convolution_border_modes -------------------- */ - -#ifndef GL_SUN_convolution_border_modes -#define GL_SUN_convolution_border_modes 1 - -#define GL_WRAP_BORDER_SUN 0x81D4 - -#define GLEW_SUN_convolution_border_modes GLEW_GET_VAR(__GLEW_SUN_convolution_border_modes) - -#endif /* GL_SUN_convolution_border_modes */ - -/* -------------------------- GL_SUN_global_alpha -------------------------- */ - -#ifndef GL_SUN_global_alpha -#define GL_SUN_global_alpha 1 - -#define GL_GLOBAL_ALPHA_SUN 0x81D9 -#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA - -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); -typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); - -#define glGlobalAlphaFactorbSUN GLEW_GET_FUN(__glewGlobalAlphaFactorbSUN) -#define glGlobalAlphaFactordSUN GLEW_GET_FUN(__glewGlobalAlphaFactordSUN) -#define glGlobalAlphaFactorfSUN GLEW_GET_FUN(__glewGlobalAlphaFactorfSUN) -#define glGlobalAlphaFactoriSUN GLEW_GET_FUN(__glewGlobalAlphaFactoriSUN) -#define glGlobalAlphaFactorsSUN GLEW_GET_FUN(__glewGlobalAlphaFactorsSUN) -#define glGlobalAlphaFactorubSUN GLEW_GET_FUN(__glewGlobalAlphaFactorubSUN) -#define glGlobalAlphaFactoruiSUN GLEW_GET_FUN(__glewGlobalAlphaFactoruiSUN) -#define glGlobalAlphaFactorusSUN GLEW_GET_FUN(__glewGlobalAlphaFactorusSUN) - -#define GLEW_SUN_global_alpha GLEW_GET_VAR(__GLEW_SUN_global_alpha) - -#endif /* GL_SUN_global_alpha */ - -/* --------------------------- GL_SUN_mesh_array --------------------------- */ - -#ifndef GL_SUN_mesh_array -#define GL_SUN_mesh_array 1 - -#define GL_QUAD_MESH_SUN 0x8614 -#define GL_TRIANGLE_MESH_SUN 0x8615 - -#define GLEW_SUN_mesh_array GLEW_GET_VAR(__GLEW_SUN_mesh_array) - -#endif /* GL_SUN_mesh_array */ - -/* ------------------------ GL_SUN_read_video_pixels ----------------------- */ - -#ifndef GL_SUN_read_video_pixels -#define GL_SUN_read_video_pixels 1 - -typedef void (GLAPIENTRY * PFNGLREADVIDEOPIXELSSUNPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels); - -#define glReadVideoPixelsSUN GLEW_GET_FUN(__glewReadVideoPixelsSUN) - -#define GLEW_SUN_read_video_pixels GLEW_GET_VAR(__GLEW_SUN_read_video_pixels) - -#endif /* GL_SUN_read_video_pixels */ - -/* --------------------------- GL_SUN_slice_accum -------------------------- */ - -#ifndef GL_SUN_slice_accum -#define GL_SUN_slice_accum 1 - -#define GL_SLICE_ACCUM_SUN 0x85CC - -#define GLEW_SUN_slice_accum GLEW_GET_VAR(__GLEW_SUN_slice_accum) - -#endif /* GL_SUN_slice_accum */ - -/* -------------------------- GL_SUN_triangle_list ------------------------- */ - -#ifndef GL_SUN_triangle_list -#define GL_SUN_triangle_list 1 - -#define GL_RESTART_SUN 0x01 -#define GL_REPLACE_MIDDLE_SUN 0x02 -#define GL_REPLACE_OLDEST_SUN 0x03 -#define GL_TRIANGLE_LIST_SUN 0x81D7 -#define GL_REPLACEMENT_CODE_SUN 0x81D8 -#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 -#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 -#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 -#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 -#define GL_R1UI_V3F_SUN 0x85C4 -#define GL_R1UI_C4UB_V3F_SUN 0x85C5 -#define GL_R1UI_C3F_V3F_SUN 0x85C6 -#define GL_R1UI_N3F_V3F_SUN 0x85C7 -#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 -#define GL_R1UI_T2F_V3F_SUN 0x85C9 -#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA -#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB - -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void *pointer); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte* code); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint* code); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort* code); - -#define glReplacementCodePointerSUN GLEW_GET_FUN(__glewReplacementCodePointerSUN) -#define glReplacementCodeubSUN GLEW_GET_FUN(__glewReplacementCodeubSUN) -#define glReplacementCodeubvSUN GLEW_GET_FUN(__glewReplacementCodeubvSUN) -#define glReplacementCodeuiSUN GLEW_GET_FUN(__glewReplacementCodeuiSUN) -#define glReplacementCodeuivSUN GLEW_GET_FUN(__glewReplacementCodeuivSUN) -#define glReplacementCodeusSUN GLEW_GET_FUN(__glewReplacementCodeusSUN) -#define glReplacementCodeusvSUN GLEW_GET_FUN(__glewReplacementCodeusvSUN) - -#define GLEW_SUN_triangle_list GLEW_GET_VAR(__GLEW_SUN_triangle_list) - -#endif /* GL_SUN_triangle_list */ - -/* ----------------------------- GL_SUN_vertex ----------------------------- */ - -#ifndef GL_SUN_vertex -#define GL_SUN_vertex 1 - -typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); -typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte* c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte* c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint* rc, const GLubyte *c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat* tc, const GLubyte *c, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *v); - -#define glColor3fVertex3fSUN GLEW_GET_FUN(__glewColor3fVertex3fSUN) -#define glColor3fVertex3fvSUN GLEW_GET_FUN(__glewColor3fVertex3fvSUN) -#define glColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fSUN) -#define glColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fvSUN) -#define glColor4ubVertex2fSUN GLEW_GET_FUN(__glewColor4ubVertex2fSUN) -#define glColor4ubVertex2fvSUN GLEW_GET_FUN(__glewColor4ubVertex2fvSUN) -#define glColor4ubVertex3fSUN GLEW_GET_FUN(__glewColor4ubVertex3fSUN) -#define glColor4ubVertex3fvSUN GLEW_GET_FUN(__glewColor4ubVertex3fvSUN) -#define glNormal3fVertex3fSUN GLEW_GET_FUN(__glewNormal3fVertex3fSUN) -#define glNormal3fVertex3fvSUN GLEW_GET_FUN(__glewNormal3fVertex3fvSUN) -#define glReplacementCodeuiColor3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fSUN) -#define glReplacementCodeuiColor3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fvSUN) -#define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fSUN) -#define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fvSUN) -#define glReplacementCodeuiColor4ubVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fSUN) -#define glReplacementCodeuiColor4ubVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fvSUN) -#define glReplacementCodeuiNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fSUN) -#define glReplacementCodeuiNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fvSUN) -#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) -#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) -#define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) -#define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) -#define glReplacementCodeuiTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fSUN) -#define glReplacementCodeuiTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fvSUN) -#define glReplacementCodeuiVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fSUN) -#define glReplacementCodeuiVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fvSUN) -#define glTexCoord2fColor3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fSUN) -#define glTexCoord2fColor3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fvSUN) -#define glTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fSUN) -#define glTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fvSUN) -#define glTexCoord2fColor4ubVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fSUN) -#define glTexCoord2fColor4ubVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fvSUN) -#define glTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fSUN) -#define glTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fvSUN) -#define glTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fSUN) -#define glTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fvSUN) -#define glTexCoord4fColor4fNormal3fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fSUN) -#define glTexCoord4fColor4fNormal3fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fvSUN) -#define glTexCoord4fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fSUN) -#define glTexCoord4fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fvSUN) - -#define GLEW_SUN_vertex GLEW_GET_VAR(__GLEW_SUN_vertex) - -#endif /* GL_SUN_vertex */ - -/* -------------------------- GL_WIN_phong_shading ------------------------- */ - -#ifndef GL_WIN_phong_shading -#define GL_WIN_phong_shading 1 - -#define GL_PHONG_WIN 0x80EA -#define GL_PHONG_HINT_WIN 0x80EB - -#define GLEW_WIN_phong_shading GLEW_GET_VAR(__GLEW_WIN_phong_shading) - -#endif /* GL_WIN_phong_shading */ - -/* ------------------------- GL_WIN_scene_markerXXX ------------------------ */ - -#ifndef GL_WIN_scene_markerXXX -#define GL_WIN_scene_markerXXX 1 - -#define GLEW_WIN_scene_markerXXX GLEW_GET_VAR(__GLEW_WIN_scene_markerXXX) - -#endif /* GL_WIN_scene_markerXXX */ - -/* -------------------------- GL_WIN_specular_fog -------------------------- */ - -#ifndef GL_WIN_specular_fog -#define GL_WIN_specular_fog 1 - -#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC - -#define GLEW_WIN_specular_fog GLEW_GET_VAR(__GLEW_WIN_specular_fog) - -#endif /* GL_WIN_specular_fog */ - -/* ---------------------------- GL_WIN_swap_hint --------------------------- */ - -#ifndef GL_WIN_swap_hint -#define GL_WIN_swap_hint 1 - -typedef void (GLAPIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height); - -#define glAddSwapHintRectWIN GLEW_GET_FUN(__glewAddSwapHintRectWIN) - -#define GLEW_WIN_swap_hint GLEW_GET_VAR(__GLEW_WIN_swap_hint) - -#endif /* GL_WIN_swap_hint */ - -/* ------------------------------------------------------------------------- */ - - - -GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D; -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements; -GLEW_FUN_EXPORT PFNGLTEXIMAGE3DPROC __glewTexImage3D; -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D; - -GLEW_FUN_EXPORT PFNGLACTIVETEXTUREPROC __glewActiveTexture; -GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D; -GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage; -GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd; -GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf; -GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd; -GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv; -GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage; - -GLEW_FUN_EXPORT PFNGLBLENDCOLORPROC __glewBlendColor; -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONPROC __glewBlendEquation; -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate; -GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer; -GLEW_FUN_EXPORT PFNGLFOGCOORDDPROC __glewFogCoordd; -GLEW_FUN_EXPORT PFNGLFOGCOORDDVPROC __glewFogCoorddv; -GLEW_FUN_EXPORT PFNGLFOGCOORDFPROC __glewFogCoordf; -GLEW_FUN_EXPORT PFNGLFOGCOORDFVPROC __glewFogCoordfv; -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFPROC __glewPointParameterf; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIPROC __glewPointParameteri; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DPROC __glewWindowPos2d; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FPROC __glewWindowPos2f; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IPROC __glewWindowPos2i; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SPROC __glewWindowPos2s; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DPROC __glewWindowPos3d; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FPROC __glewWindowPos3f; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IPROC __glewWindowPos3i; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SPROC __glewWindowPos3s; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv; - -GLEW_FUN_EXPORT PFNGLBEGINQUERYPROC __glewBeginQuery; -GLEW_FUN_EXPORT PFNGLBINDBUFFERPROC __glewBindBuffer; -GLEW_FUN_EXPORT PFNGLBUFFERDATAPROC __glewBufferData; -GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAPROC __glewBufferSubData; -GLEW_FUN_EXPORT PFNGLDELETEBUFFERSPROC __glewDeleteBuffers; -GLEW_FUN_EXPORT PFNGLDELETEQUERIESPROC __glewDeleteQueries; -GLEW_FUN_EXPORT PFNGLENDQUERYPROC __glewEndQuery; -GLEW_FUN_EXPORT PFNGLGENBUFFERSPROC __glewGenBuffers; -GLEW_FUN_EXPORT PFNGLGENQUERIESPROC __glewGenQueries; -GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv; -GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv; -GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv; -GLEW_FUN_EXPORT PFNGLGETQUERYIVPROC __glewGetQueryiv; -GLEW_FUN_EXPORT PFNGLISBUFFERPROC __glewIsBuffer; -GLEW_FUN_EXPORT PFNGLISQUERYPROC __glewIsQuery; -GLEW_FUN_EXPORT PFNGLMAPBUFFERPROC __glewMapBuffer; -GLEW_FUN_EXPORT PFNGLUNMAPBUFFERPROC __glewUnmapBuffer; - -GLEW_FUN_EXPORT PFNGLATTACHSHADERPROC __glewAttachShader; -GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation; -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate; -GLEW_FUN_EXPORT PFNGLCOMPILESHADERPROC __glewCompileShader; -GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPROC __glewCreateProgram; -GLEW_FUN_EXPORT PFNGLCREATESHADERPROC __glewCreateShader; -GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPROC __glewDeleteProgram; -GLEW_FUN_EXPORT PFNGLDELETESHADERPROC __glewDeleteShader; -GLEW_FUN_EXPORT PFNGLDETACHSHADERPROC __glewDetachShader; -GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray; -GLEW_FUN_EXPORT PFNGLDRAWBUFFERSPROC __glewDrawBuffers; -GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray; -GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib; -GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform; -GLEW_FUN_EXPORT PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders; -GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation; -GLEW_FUN_EXPORT PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog; -GLEW_FUN_EXPORT PFNGLGETPROGRAMIVPROC __glewGetProgramiv; -GLEW_FUN_EXPORT PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog; -GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEPROC __glewGetShaderSource; -GLEW_FUN_EXPORT PFNGLGETSHADERIVPROC __glewGetShaderiv; -GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation; -GLEW_FUN_EXPORT PFNGLGETUNIFORMFVPROC __glewGetUniformfv; -GLEW_FUN_EXPORT PFNGLGETUNIFORMIVPROC __glewGetUniformiv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv; -GLEW_FUN_EXPORT PFNGLISPROGRAMPROC __glewIsProgram; -GLEW_FUN_EXPORT PFNGLISSHADERPROC __glewIsShader; -GLEW_FUN_EXPORT PFNGLLINKPROGRAMPROC __glewLinkProgram; -GLEW_FUN_EXPORT PFNGLSHADERSOURCEPROC __glewShaderSource; -GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate; -GLEW_FUN_EXPORT PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate; -GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate; -GLEW_FUN_EXPORT PFNGLUNIFORM1FPROC __glewUniform1f; -GLEW_FUN_EXPORT PFNGLUNIFORM1FVPROC __glewUniform1fv; -GLEW_FUN_EXPORT PFNGLUNIFORM1IPROC __glewUniform1i; -GLEW_FUN_EXPORT PFNGLUNIFORM1IVPROC __glewUniform1iv; -GLEW_FUN_EXPORT PFNGLUNIFORM2FPROC __glewUniform2f; -GLEW_FUN_EXPORT PFNGLUNIFORM2FVPROC __glewUniform2fv; -GLEW_FUN_EXPORT PFNGLUNIFORM2IPROC __glewUniform2i; -GLEW_FUN_EXPORT PFNGLUNIFORM2IVPROC __glewUniform2iv; -GLEW_FUN_EXPORT PFNGLUNIFORM3FPROC __glewUniform3f; -GLEW_FUN_EXPORT PFNGLUNIFORM3FVPROC __glewUniform3fv; -GLEW_FUN_EXPORT PFNGLUNIFORM3IPROC __glewUniform3i; -GLEW_FUN_EXPORT PFNGLUNIFORM3IVPROC __glewUniform3iv; -GLEW_FUN_EXPORT PFNGLUNIFORM4FPROC __glewUniform4f; -GLEW_FUN_EXPORT PFNGLUNIFORM4FVPROC __glewUniform4fv; -GLEW_FUN_EXPORT PFNGLUNIFORM4IPROC __glewUniform4i; -GLEW_FUN_EXPORT PFNGLUNIFORM4IVPROC __glewUniform4iv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv; -GLEW_FUN_EXPORT PFNGLUSEPROGRAMPROC __glewUseProgram; -GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPROC __glewValidateProgram; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer; - -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv; - -GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender; -GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback; -GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation; -GLEW_FUN_EXPORT PFNGLCLAMPCOLORPROC __glewClampColor; -GLEW_FUN_EXPORT PFNGLCLEARBUFFERFIPROC __glewClearBufferfi; -GLEW_FUN_EXPORT PFNGLCLEARBUFFERFVPROC __glewClearBufferfv; -GLEW_FUN_EXPORT PFNGLCLEARBUFFERIVPROC __glewClearBufferiv; -GLEW_FUN_EXPORT PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv; -GLEW_FUN_EXPORT PFNGLCOLORMASKIPROC __glewColorMaski; -GLEW_FUN_EXPORT PFNGLDISABLEIPROC __glewDisablei; -GLEW_FUN_EXPORT PFNGLENABLEIPROC __glewEnablei; -GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender; -GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback; -GLEW_FUN_EXPORT PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v; -GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation; -GLEW_FUN_EXPORT PFNGLGETSTRINGIPROC __glewGetStringi; -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv; -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv; -GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying; -GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv; -GLEW_FUN_EXPORT PFNGLISENABLEDIPROC __glewIsEnabledi; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv; -GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings; -GLEW_FUN_EXPORT PFNGLUNIFORM1UIPROC __glewUniform1ui; -GLEW_FUN_EXPORT PFNGLUNIFORM1UIVPROC __glewUniform1uiv; -GLEW_FUN_EXPORT PFNGLUNIFORM2UIPROC __glewUniform2ui; -GLEW_FUN_EXPORT PFNGLUNIFORM2UIVPROC __glewUniform2uiv; -GLEW_FUN_EXPORT PFNGLUNIFORM3UIPROC __glewUniform3ui; -GLEW_FUN_EXPORT PFNGLUNIFORM3UIVPROC __glewUniform3uiv; -GLEW_FUN_EXPORT PFNGLUNIFORM4UIPROC __glewUniform4ui; -GLEW_FUN_EXPORT PFNGLUNIFORM4UIVPROC __glewUniform4uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced; -GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex; -GLEW_FUN_EXPORT PFNGLTEXBUFFERPROC __glewTexBuffer; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture; -GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v; -GLEW_FUN_EXPORT PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v; - -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei; -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIPROC __glewBlendEquationi; -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei; -GLEW_FUN_EXPORT PFNGLBLENDFUNCIPROC __glewBlendFunci; -GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading; - -GLEW_FUN_EXPORT PFNGLGETGRAPHICSRESETSTATUSPROC __glewGetGraphicsResetStatus; -GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEPROC __glewGetnCompressedTexImage; -GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEPROC __glewGetnTexImage; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVPROC __glewGetnUniformdv; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC __glewMultiDrawArraysIndirectCount; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC __glewMultiDrawElementsIndirectCount; -GLEW_FUN_EXPORT PFNGLSPECIALIZESHADERPROC __glewSpecializeShader; - -GLEW_FUN_EXPORT PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX; - -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD; -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD; -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD; -GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD; -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD; -GLEW_FUN_EXPORT PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD; -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC __glewFramebufferSamplePositionsfvAMD; -GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC __glewGetFramebufferParameterfvAMD; -GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC __glewGetNamedFramebufferParameterfvAMD; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC __glewNamedFramebufferSamplePositionsfvAMD; - -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD; - -GLEW_FUN_EXPORT PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD; -GLEW_FUN_EXPORT PFNGLGENNAMESAMDPROC __glewGenNamesAMD; -GLEW_FUN_EXPORT PFNGLISNAMEAMDPROC __glewIsNameAMD; - -GLEW_FUN_EXPORT PFNGLQUERYOBJECTPARAMETERUIAMDPROC __glewQueryObjectParameteruiAMD; - -GLEW_FUN_EXPORT PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD; -GLEW_FUN_EXPORT PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD; -GLEW_FUN_EXPORT PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD; -GLEW_FUN_EXPORT PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD; -GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD; -GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD; -GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD; -GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD; -GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD; -GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD; -GLEW_FUN_EXPORT PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD; - -GLEW_FUN_EXPORT PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD; - -GLEW_FUN_EXPORT PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD; - -GLEW_FUN_EXPORT PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD; - -GLEW_FUN_EXPORT PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD; -GLEW_FUN_EXPORT PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD; - -GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE; - -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE; - -GLEW_FUN_EXPORT PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE; -GLEW_FUN_EXPORT PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE; -GLEW_FUN_EXPORT PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE; -GLEW_FUN_EXPORT PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE; -GLEW_FUN_EXPORT PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE; -GLEW_FUN_EXPORT PFNGLISQUERYANGLEPROC __glewIsQueryANGLE; -GLEW_FUN_EXPORT PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE; - -GLEW_FUN_EXPORT PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE; - -GLEW_FUN_EXPORT PFNGLCOPYTEXTURELEVELSAPPLEPROC __glewCopyTextureLevelsAPPLE; - -GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE; -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE; -GLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE; -GLEW_FUN_EXPORT PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE; - -GLEW_FUN_EXPORT PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE; -GLEW_FUN_EXPORT PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE; -GLEW_FUN_EXPORT PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE; -GLEW_FUN_EXPORT PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE; -GLEW_FUN_EXPORT PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE; -GLEW_FUN_EXPORT PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE; -GLEW_FUN_EXPORT PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE; -GLEW_FUN_EXPORT PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE; - -GLEW_FUN_EXPORT PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE; -GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE; - -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC __glewRenderbufferStorageMultisampleAPPLE; -GLEW_FUN_EXPORT PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC __glewResolveMultisampleFramebufferAPPLE; - -GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE; -GLEW_FUN_EXPORT PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE; -GLEW_FUN_EXPORT PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE; - -GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCAPPLEPROC __glewClientWaitSyncAPPLE; -GLEW_FUN_EXPORT PFNGLDELETESYNCAPPLEPROC __glewDeleteSyncAPPLE; -GLEW_FUN_EXPORT PFNGLFENCESYNCAPPLEPROC __glewFenceSyncAPPLE; -GLEW_FUN_EXPORT PFNGLGETINTEGER64VAPPLEPROC __glewGetInteger64vAPPLE; -GLEW_FUN_EXPORT PFNGLGETSYNCIVAPPLEPROC __glewGetSyncivAPPLE; -GLEW_FUN_EXPORT PFNGLISSYNCAPPLEPROC __glewIsSyncAPPLE; -GLEW_FUN_EXPORT PFNGLWAITSYNCAPPLEPROC __glewWaitSyncAPPLE; - -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE; -GLEW_FUN_EXPORT PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE; - -GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE; -GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE; -GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE; -GLEW_FUN_EXPORT PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE; - -GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE; - -GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE; -GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE; -GLEW_FUN_EXPORT PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE; -GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE; -GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE; -GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE; -GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE; - -GLEW_FUN_EXPORT PFNGLCLEARDEPTHFPROC __glewClearDepthf; -GLEW_FUN_EXPORT PFNGLDEPTHRANGEFPROC __glewDepthRangef; -GLEW_FUN_EXPORT PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat; -GLEW_FUN_EXPORT PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler; -GLEW_FUN_EXPORT PFNGLSHADERBINARYPROC __glewShaderBinary; - -GLEW_FUN_EXPORT PFNGLMEMORYBARRIERBYREGIONPROC __glewMemoryBarrierByRegion; - -GLEW_FUN_EXPORT PFNGLPRIMITIVEBOUNDINGBOXARBPROC __glewPrimitiveBoundingBoxARB; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance; - -GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB; -GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB; -GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB; -GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB; -GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB; -GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB; -GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB; -GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB; -GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB; - -GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed; -GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex; - -GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEPROC __glewBufferStorage; - -GLEW_FUN_EXPORT PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB; - -GLEW_FUN_EXPORT PFNGLCLEARBUFFERDATAPROC __glewClearBufferData; -GLEW_FUN_EXPORT PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT; - -GLEW_FUN_EXPORT PFNGLCLEARTEXIMAGEPROC __glewClearTexImage; -GLEW_FUN_EXPORT PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage; - -GLEW_FUN_EXPORT PFNGLCLIPCONTROLPROC __glewClipControl; - -GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB; - -GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute; -GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect; - -GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB; - -GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData; - -GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData; - -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB; -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB; -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB; -GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB; - -GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPROC __glewBindTextureUnit; -GLEW_FUN_EXPORT PFNGLBLITNAMEDFRAMEBUFFERPROC __glewBlitNamedFramebuffer; -GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC __glewCheckNamedFramebufferStatus; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAPROC __glewClearNamedBufferData; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAPROC __glewClearNamedBufferSubData; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERFIPROC __glewClearNamedFramebufferfi; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERFVPROC __glewClearNamedFramebufferfv; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERIVPROC __glewClearNamedFramebufferiv; -GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC __glewClearNamedFramebufferuiv; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC __glewCompressedTextureSubImage1D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC __glewCompressedTextureSubImage2D; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC __glewCompressedTextureSubImage3D; -GLEW_FUN_EXPORT PFNGLCOPYNAMEDBUFFERSUBDATAPROC __glewCopyNamedBufferSubData; -GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DPROC __glewCopyTextureSubImage1D; -GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DPROC __glewCopyTextureSubImage2D; -GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DPROC __glewCopyTextureSubImage3D; -GLEW_FUN_EXPORT PFNGLCREATEBUFFERSPROC __glewCreateBuffers; -GLEW_FUN_EXPORT PFNGLCREATEFRAMEBUFFERSPROC __glewCreateFramebuffers; -GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPIPELINESPROC __glewCreateProgramPipelines; -GLEW_FUN_EXPORT PFNGLCREATEQUERIESPROC __glewCreateQueries; -GLEW_FUN_EXPORT PFNGLCREATERENDERBUFFERSPROC __glewCreateRenderbuffers; -GLEW_FUN_EXPORT PFNGLCREATESAMPLERSPROC __glewCreateSamplers; -GLEW_FUN_EXPORT PFNGLCREATETEXTURESPROC __glewCreateTextures; -GLEW_FUN_EXPORT PFNGLCREATETRANSFORMFEEDBACKSPROC __glewCreateTransformFeedbacks; -GLEW_FUN_EXPORT PFNGLCREATEVERTEXARRAYSPROC __glewCreateVertexArrays; -GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBPROC __glewDisableVertexArrayAttrib; -GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBPROC __glewEnableVertexArrayAttrib; -GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC __glewFlushMappedNamedBufferRange; -GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPPROC __glewGenerateTextureMipmap; -GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC __glewGetCompressedTextureImage; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERI64VPROC __glewGetNamedBufferParameteri64v; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVPROC __glewGetNamedBufferParameteriv; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVPROC __glewGetNamedBufferPointerv; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAPROC __glewGetNamedBufferSubData; -GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetNamedFramebufferAttachmentParameteriv; -GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC __glewGetNamedFramebufferParameteriv; -GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC __glewGetNamedRenderbufferParameteriv; -GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTI64VPROC __glewGetQueryBufferObjecti64v; -GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTIVPROC __glewGetQueryBufferObjectiv; -GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTUI64VPROC __glewGetQueryBufferObjectui64v; -GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTUIVPROC __glewGetQueryBufferObjectuiv; -GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEPROC __glewGetTextureImage; -GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVPROC __glewGetTextureLevelParameterfv; -GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVPROC __glewGetTextureLevelParameteriv; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVPROC __glewGetTextureParameterIiv; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVPROC __glewGetTextureParameterIuiv; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVPROC __glewGetTextureParameterfv; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVPROC __glewGetTextureParameteriv; -GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKI64_VPROC __glewGetTransformFeedbacki64_v; -GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKI_VPROC __glewGetTransformFeedbacki_v; -GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKIVPROC __glewGetTransformFeedbackiv; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINDEXED64IVPROC __glewGetVertexArrayIndexed64iv; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINDEXEDIVPROC __glewGetVertexArrayIndexediv; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYIVPROC __glewGetVertexArrayiv; -GLEW_FUN_EXPORT PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC __glewInvalidateNamedFramebufferData; -GLEW_FUN_EXPORT PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC __glewInvalidateNamedFramebufferSubData; -GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERPROC __glewMapNamedBuffer; -GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEPROC __glewMapNamedBufferRange; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAPROC __glewNamedBufferData; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEPROC __glewNamedBufferStorage; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAPROC __glewNamedBufferSubData; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC __glewNamedFramebufferDrawBuffer; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC __glewNamedFramebufferDrawBuffers; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC __glewNamedFramebufferParameteri; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC __glewNamedFramebufferReadBuffer; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC __glewNamedFramebufferRenderbuffer; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREPROC __glewNamedFramebufferTexture; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC __glewNamedFramebufferTextureLayer; -GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEPROC __glewNamedRenderbufferStorage; -GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewNamedRenderbufferStorageMultisample; -GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERPROC __glewTextureBuffer; -GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEPROC __glewTextureBufferRange; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVPROC __glewTextureParameterIiv; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVPROC __glewTextureParameterIuiv; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFPROC __glewTextureParameterf; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVPROC __glewTextureParameterfv; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIPROC __glewTextureParameteri; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVPROC __glewTextureParameteriv; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DPROC __glewTextureStorage1D; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DPROC __glewTextureStorage2D; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC __glewTextureStorage2DMultisample; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DPROC __glewTextureStorage3D; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC __glewTextureStorage3DMultisample; -GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DPROC __glewTextureSubImage1D; -GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DPROC __glewTextureSubImage2D; -GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DPROC __glewTextureSubImage3D; -GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC __glewTransformFeedbackBufferBase; -GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC __glewTransformFeedbackBufferRange; -GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFERPROC __glewUnmapNamedBuffer; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBBINDINGPROC __glewVertexArrayAttribBinding; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBFORMATPROC __glewVertexArrayAttribFormat; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBIFORMATPROC __glewVertexArrayAttribIFormat; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBLFORMATPROC __glewVertexArrayAttribLFormat; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYBINDINGDIVISORPROC __glewVertexArrayBindingDivisor; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYELEMENTBUFFERPROC __glewVertexArrayElementBuffer; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBUFFERPROC __glewVertexArrayVertexBuffer; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBUFFERSPROC __glewVertexArrayVertexBuffers; - -GLEW_FUN_EXPORT PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB; -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB; -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB; -GLEW_FUN_EXPORT PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB; - -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex; -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERPARAMETERIPROC __glewFramebufferParameteri; -GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVPROC __glewGetFramebufferParameteriv; -GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __glewGetNamedFramebufferParameterivEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __glewNamedFramebufferParameteriEXT; - -GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer; -GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer; -GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer; -GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus; -GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers; -GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer; -GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers; -GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers; -GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap; -GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv; -GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv; -GLEW_FUN_EXPORT PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer; -GLEW_FUN_EXPORT PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer; -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage; -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB; - -GLEW_FUN_EXPORT PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary; -GLEW_FUN_EXPORT PFNGLPROGRAMBINARYPROC __glewProgramBinary; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri; - -GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC __glewGetCompressedTextureSubImage; -GLEW_FUN_EXPORT PFNGLGETTEXTURESUBIMAGEPROC __glewGetTextureSubImage; - -GLEW_FUN_EXPORT PFNGLSPECIALIZESHADERARBPROC __glewSpecializeShaderARB; - -GLEW_FUN_EXPORT PFNGLGETUNIFORMDVPROC __glewGetUniformdv; -GLEW_FUN_EXPORT PFNGLUNIFORM1DPROC __glewUniform1d; -GLEW_FUN_EXPORT PFNGLUNIFORM1DVPROC __glewUniform1dv; -GLEW_FUN_EXPORT PFNGLUNIFORM2DPROC __glewUniform2d; -GLEW_FUN_EXPORT PFNGLUNIFORM2DVPROC __glewUniform2dv; -GLEW_FUN_EXPORT PFNGLUNIFORM3DPROC __glewUniform3d; -GLEW_FUN_EXPORT PFNGLUNIFORM3DVPROC __glewUniform3dv; -GLEW_FUN_EXPORT PFNGLUNIFORM4DPROC __glewUniform4d; -GLEW_FUN_EXPORT PFNGLUNIFORM4DVPROC __glewUniform4dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv; - -GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VARBPROC __glewGetUniformi64vARB; -GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VARBPROC __glewGetUniformui64vARB; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMI64VARBPROC __glewGetnUniformi64vARB; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMUI64VARBPROC __glewGetnUniformui64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64ARBPROC __glewProgramUniform1i64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VARBPROC __glewProgramUniform1i64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64ARBPROC __glewProgramUniform1ui64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VARBPROC __glewProgramUniform1ui64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64ARBPROC __glewProgramUniform2i64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VARBPROC __glewProgramUniform2i64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64ARBPROC __glewProgramUniform2ui64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VARBPROC __glewProgramUniform2ui64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64ARBPROC __glewProgramUniform3i64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VARBPROC __glewProgramUniform3i64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64ARBPROC __glewProgramUniform3ui64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VARBPROC __glewProgramUniform3ui64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64ARBPROC __glewProgramUniform4i64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VARBPROC __glewProgramUniform4i64vARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64ARBPROC __glewProgramUniform4ui64ARB; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VARBPROC __glewProgramUniform4ui64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1I64ARBPROC __glewUniform1i64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1I64VARBPROC __glewUniform1i64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1UI64ARBPROC __glewUniform1ui64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VARBPROC __glewUniform1ui64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2I64ARBPROC __glewUniform2i64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2I64VARBPROC __glewUniform2i64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2UI64ARBPROC __glewUniform2ui64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VARBPROC __glewUniform2ui64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3I64ARBPROC __glewUniform3i64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3I64VARBPROC __glewUniform3i64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3UI64ARBPROC __glewUniform3ui64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VARBPROC __glewUniform3ui64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4I64ARBPROC __glewUniform4i64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4I64VARBPROC __glewUniform4i64vARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4UI64ARBPROC __glewUniform4ui64ARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VARBPROC __glewUniform4ui64vARB; - -GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEPROC __glewColorSubTable; -GLEW_FUN_EXPORT PFNGLCOLORTABLEPROC __glewColorTable; -GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv; -GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv; -GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable; -GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable; -GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D; -GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPROC __glewGetColorTable; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv; -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPROC __glewGetHistogram; -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv; -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv; -GLEW_FUN_EXPORT PFNGLGETMINMAXPROC __glewGetMinmax; -GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv; -GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv; -GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter; -GLEW_FUN_EXPORT PFNGLHISTOGRAMPROC __glewHistogram; -GLEW_FUN_EXPORT PFNGLMINMAXPROC __glewMinmax; -GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMPROC __glewResetHistogram; -GLEW_FUN_EXPORT PFNGLRESETMINMAXPROC __glewResetMinmax; -GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB; - -GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ; - -GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATI64VPROC __glewGetInternalformati64v; - -GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERDATAPROC __glewInvalidateBufferData; -GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERSUBDATAPROC __glewInvalidateBufferSubData; -GLEW_FUN_EXPORT PFNGLINVALIDATEFRAMEBUFFERPROC __glewInvalidateFramebuffer; -GLEW_FUN_EXPORT PFNGLINVALIDATESUBFRAMEBUFFERPROC __glewInvalidateSubFramebuffer; -GLEW_FUN_EXPORT PFNGLINVALIDATETEXIMAGEPROC __glewInvalidateTexImage; -GLEW_FUN_EXPORT PFNGLINVALIDATETEXSUBIMAGEPROC __glewInvalidateTexSubImage; - -GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange; -GLEW_FUN_EXPORT PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange; - -GLEW_FUN_EXPORT PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB; -GLEW_FUN_EXPORT PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB; -GLEW_FUN_EXPORT PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB; -GLEW_FUN_EXPORT PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB; -GLEW_FUN_EXPORT PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB; - -GLEW_FUN_EXPORT PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase; -GLEW_FUN_EXPORT PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange; -GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures; -GLEW_FUN_EXPORT PFNGLBINDSAMPLERSPROC __glewBindSamplers; -GLEW_FUN_EXPORT PFNGLBINDTEXTURESPROC __glewBindTextures; -GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect; - -GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB; - -GLEW_FUN_EXPORT PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB; -GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB; - -GLEW_FUN_EXPORT PFNGLBEGINQUERYARBPROC __glewBeginQueryARB; -GLEW_FUN_EXPORT PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB; -GLEW_FUN_EXPORT PFNGLENDQUERYARBPROC __glewEndQueryARB; -GLEW_FUN_EXPORT PFNGLGENQUERIESARBPROC __glewGenQueriesARB; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB; -GLEW_FUN_EXPORT PFNGLGETQUERYIVARBPROC __glewGetQueryivARB; -GLEW_FUN_EXPORT PFNGLISQUERYARBPROC __glewIsQueryARB; - -GLEW_FUN_EXPORT PFNGLMAXSHADERCOMPILERTHREADSARBPROC __glewMaxShaderCompilerThreadsARB; - -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB; - -GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETCLAMPPROC __glewPolygonOffsetClamp; - -GLEW_FUN_EXPORT PFNGLGETPROGRAMINTERFACEIVPROC __glewGetProgramInterfaceiv; -GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEINDEXPROC __glewGetProgramResourceIndex; -GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONPROC __glewGetProgramResourceLocation; -GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC __glewGetProgramResourceLocationIndex; -GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCENAMEPROC __glewGetProgramResourceName; -GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEIVPROC __glewGetProgramResourceiv; - -GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex; - -GLEW_FUN_EXPORT PFNGLGETGRAPHICSRESETSTATUSARBPROC __glewGetGraphicsResetStatusARB; -GLEW_FUN_EXPORT PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB; -GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB; -GLEW_FUN_EXPORT PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB; -GLEW_FUN_EXPORT PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB; -GLEW_FUN_EXPORT PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB; -GLEW_FUN_EXPORT PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB; -GLEW_FUN_EXPORT PFNGLGETNMAPIVARBPROC __glewGetnMapivARB; -GLEW_FUN_EXPORT PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB; -GLEW_FUN_EXPORT PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB; -GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB; -GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB; -GLEW_FUN_EXPORT PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB; -GLEW_FUN_EXPORT PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB; -GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB; -GLEW_FUN_EXPORT PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewFramebufferSampleLocationsfvARB; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewNamedFramebufferSampleLocationsfvARB; - -GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB; - -GLEW_FUN_EXPORT PFNGLBINDSAMPLERPROC __glewBindSampler; -GLEW_FUN_EXPORT PFNGLDELETESAMPLERSPROC __glewDeleteSamplers; -GLEW_FUN_EXPORT PFNGLGENSAMPLERSPROC __glewGenSamplers; -GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv; -GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv; -GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv; -GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv; -GLEW_FUN_EXPORT PFNGLISSAMPLERPROC __glewIsSampler; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri; -GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv; - -GLEW_FUN_EXPORT PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram; -GLEW_FUN_EXPORT PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline; -GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv; -GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines; -GLEW_FUN_EXPORT PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines; -GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog; -GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv; -GLEW_FUN_EXPORT PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv; -GLEW_FUN_EXPORT PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages; -GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline; - -GLEW_FUN_EXPORT PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __glewGetActiveAtomicCounterBufferiv; - -GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREPROC __glewBindImageTexture; -GLEW_FUN_EXPORT PFNGLMEMORYBARRIERPROC __glewMemoryBarrier; - -GLEW_FUN_EXPORT PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB; -GLEW_FUN_EXPORT PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB; -GLEW_FUN_EXPORT PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB; -GLEW_FUN_EXPORT PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB; -GLEW_FUN_EXPORT PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB; -GLEW_FUN_EXPORT PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB; -GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB; -GLEW_FUN_EXPORT PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB; -GLEW_FUN_EXPORT PFNGLGETHANDLEARBPROC __glewGetHandleARB; -GLEW_FUN_EXPORT PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB; -GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB; -GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB; -GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB; -GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB; -GLEW_FUN_EXPORT PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB; -GLEW_FUN_EXPORT PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB; -GLEW_FUN_EXPORT PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB; -GLEW_FUN_EXPORT PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1FARBPROC __glewUniform1fARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1IARBPROC __glewUniform1iARB; -GLEW_FUN_EXPORT PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2FARBPROC __glewUniform2fARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2IARBPROC __glewUniform2iARB; -GLEW_FUN_EXPORT PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3FARBPROC __glewUniform3fARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3IARBPROC __glewUniform3iARB; -GLEW_FUN_EXPORT PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4FARBPROC __glewUniform4fARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4IARBPROC __glewUniform4iARB; -GLEW_FUN_EXPORT PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB; -GLEW_FUN_EXPORT PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB; -GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB; - -GLEW_FUN_EXPORT PFNGLSHADERSTORAGEBLOCKBINDINGPROC __glewShaderStorageBlockBinding; - -GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName; -GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName; -GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv; -GLEW_FUN_EXPORT PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv; -GLEW_FUN_EXPORT PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex; -GLEW_FUN_EXPORT PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation; -GLEW_FUN_EXPORT PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv; -GLEW_FUN_EXPORT PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv; - -GLEW_FUN_EXPORT PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB; -GLEW_FUN_EXPORT PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB; -GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB; -GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB; -GLEW_FUN_EXPORT PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB; -GLEW_FUN_EXPORT PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB; - -GLEW_FUN_EXPORT PFNGLBUFFERPAGECOMMITMENTARBPROC __glewBufferPageCommitmentARB; - -GLEW_FUN_EXPORT PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB; - -GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync; -GLEW_FUN_EXPORT PFNGLDELETESYNCPROC __glewDeleteSync; -GLEW_FUN_EXPORT PFNGLFENCESYNCPROC __glewFenceSync; -GLEW_FUN_EXPORT PFNGLGETINTEGER64VPROC __glewGetInteger64v; -GLEW_FUN_EXPORT PFNGLGETSYNCIVPROC __glewGetSynciv; -GLEW_FUN_EXPORT PFNGLISSYNCPROC __glewIsSync; -GLEW_FUN_EXPORT PFNGLWAITSYNCPROC __glewWaitSync; - -GLEW_FUN_EXPORT PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv; -GLEW_FUN_EXPORT PFNGLPATCHPARAMETERIPROC __glewPatchParameteri; - -GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERPROC __glewTextureBarrier; - -GLEW_FUN_EXPORT PFNGLTEXBUFFERARBPROC __glewTexBufferARB; - -GLEW_FUN_EXPORT PFNGLTEXBUFFERRANGEPROC __glewTexBufferRange; -GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEEXTPROC __glewTextureBufferRangeEXT; - -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB; -GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB; - -GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv; -GLEW_FUN_EXPORT PFNGLSAMPLEMASKIPROC __glewSampleMaski; -GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample; -GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample; - -GLEW_FUN_EXPORT PFNGLTEXSTORAGE1DPROC __glewTexStorage1D; -GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DPROC __glewTexStorage2D; -GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DPROC __glewTexStorage3D; - -GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DMULTISAMPLEPROC __glewTexStorage2DMultisample; -GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DMULTISAMPLEPROC __glewTexStorage3DMultisample; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __glewTextureStorage2DMultisampleEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __glewTextureStorage3DMultisampleEXT; - -GLEW_FUN_EXPORT PFNGLTEXTUREVIEWPROC __glewTextureView; - -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v; -GLEW_FUN_EXPORT PFNGLQUERYCOUNTERPROC __glewQueryCounter; - -GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback; -GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks; -GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback; -GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks; -GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback; -GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback; -GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback; - -GLEW_FUN_EXPORT PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed; -GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream; -GLEW_FUN_EXPORT PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed; -GLEW_FUN_EXPORT PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv; - -GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __glewDrawTransformFeedbackInstanced; -GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __glewDrawTransformFeedbackStreamInstanced; - -GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB; -GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB; -GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB; -GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB; - -GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEPROC __glewBindBufferBase; -GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange; -GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName; -GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv; -GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName; -GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv; -GLEW_FUN_EXPORT PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v; -GLEW_FUN_EXPORT PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex; -GLEW_FUN_EXPORT PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices; -GLEW_FUN_EXPORT PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding; - -GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray; -GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays; -GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays; -GLEW_FUN_EXPORT PFNGLISVERTEXARRAYPROC __glewIsVertexArray; - -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer; - -GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERPROC __glewBindVertexBuffer; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC __glewVertexArrayBindVertexBufferEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC __glewVertexArrayVertexAttribBindingEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC __glewVertexArrayVertexAttribFormatEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC __glewVertexArrayVertexAttribIFormatEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC __glewVertexArrayVertexAttribLFormatEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC __glewVertexArrayVertexBindingDivisorEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATPROC __glewVertexAttribLFormat; -GLEW_FUN_EXPORT PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor; - -GLEW_FUN_EXPORT PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB; -GLEW_FUN_EXPORT PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB; -GLEW_FUN_EXPORT PFNGLWEIGHTBVARBPROC __glewWeightbvARB; -GLEW_FUN_EXPORT PFNGLWEIGHTDVARBPROC __glewWeightdvARB; -GLEW_FUN_EXPORT PFNGLWEIGHTFVARBPROC __glewWeightfvARB; -GLEW_FUN_EXPORT PFNGLWEIGHTIVARBPROC __glewWeightivARB; -GLEW_FUN_EXPORT PFNGLWEIGHTSVARBPROC __glewWeightsvARB; -GLEW_FUN_EXPORT PFNGLWEIGHTUBVARBPROC __glewWeightubvARB; -GLEW_FUN_EXPORT PFNGLWEIGHTUIVARBPROC __glewWeightuivARB; -GLEW_FUN_EXPORT PFNGLWEIGHTUSVARBPROC __glewWeightusvARB; - -GLEW_FUN_EXPORT PFNGLBINDBUFFERARBPROC __glewBindBufferARB; -GLEW_FUN_EXPORT PFNGLBUFFERDATAARBPROC __glewBufferDataARB; -GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB; -GLEW_FUN_EXPORT PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB; -GLEW_FUN_EXPORT PFNGLGENBUFFERSARBPROC __glewGenBuffersARB; -GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB; -GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB; -GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB; -GLEW_FUN_EXPORT PFNGLISBUFFERARBPROC __glewIsBufferARB; -GLEW_FUN_EXPORT PFNGLMAPBUFFERARBPROC __glewMapBufferARB; -GLEW_FUN_EXPORT PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB; - -GLEW_FUN_EXPORT PFNGLBINDPROGRAMARBPROC __glewBindProgramARB; -GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB; -GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB; -GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB; -GLEW_FUN_EXPORT PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB; -GLEW_FUN_EXPORT PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB; -GLEW_FUN_EXPORT PFNGLISPROGRAMARBPROC __glewIsProgramARB; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB; -GLEW_FUN_EXPORT PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB; - -GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB; -GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB; -GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB; - -GLEW_FUN_EXPORT PFNGLCOLORP3UIPROC __glewColorP3ui; -GLEW_FUN_EXPORT PFNGLCOLORP3UIVPROC __glewColorP3uiv; -GLEW_FUN_EXPORT PFNGLCOLORP4UIPROC __glewColorP4ui; -GLEW_FUN_EXPORT PFNGLCOLORP4UIVPROC __glewColorP4uiv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv; -GLEW_FUN_EXPORT PFNGLNORMALP3UIPROC __glewNormalP3ui; -GLEW_FUN_EXPORT PFNGLNORMALP3UIVPROC __glewNormalP3uiv; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv; -GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui; -GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv; -GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui; -GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv; -GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui; -GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv; -GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui; -GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv; -GLEW_FUN_EXPORT PFNGLVERTEXP2UIPROC __glewVertexP2ui; -GLEW_FUN_EXPORT PFNGLVERTEXP2UIVPROC __glewVertexP2uiv; -GLEW_FUN_EXPORT PFNGLVERTEXP3UIPROC __glewVertexP3ui; -GLEW_FUN_EXPORT PFNGLVERTEXP3UIVPROC __glewVertexP3uiv; -GLEW_FUN_EXPORT PFNGLVERTEXP4UIPROC __glewVertexP4ui; -GLEW_FUN_EXPORT PFNGLVERTEXP4UIVPROC __glewVertexP4uiv; - -GLEW_FUN_EXPORT PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv; -GLEW_FUN_EXPORT PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed; -GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v; -GLEW_FUN_EXPORT PFNGLGETFLOATI_VPROC __glewGetFloati_v; -GLEW_FUN_EXPORT PFNGLSCISSORARRAYVPROC __glewScissorArrayv; -GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDPROC __glewScissorIndexed; -GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv; -GLEW_FUN_EXPORT PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv; -GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf; -GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv; - -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB; - -GLEW_FUN_EXPORT PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI; - -GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI; -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI; -GLEW_FUN_EXPORT PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI; - -GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI; -GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI; -GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI; -GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI; - -GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI; -GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI; -GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI; -GLEW_FUN_EXPORT PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI; -GLEW_FUN_EXPORT PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI; -GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI; -GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI; -GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI; -GLEW_FUN_EXPORT PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI; -GLEW_FUN_EXPORT PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI; -GLEW_FUN_EXPORT PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI; -GLEW_FUN_EXPORT PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI; -GLEW_FUN_EXPORT PFNGLSAMPLEMAPATIPROC __glewSampleMapATI; -GLEW_FUN_EXPORT PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI; - -GLEW_FUN_EXPORT PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI; -GLEW_FUN_EXPORT PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI; - -GLEW_FUN_EXPORT PFNGLPNTRIANGLESFATIPROC __glewPNTrianglesfATI; -GLEW_FUN_EXPORT PFNGLPNTRIANGLESIATIPROC __glewPNTrianglesiATI; - -GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI; -GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI; - -GLEW_FUN_EXPORT PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI; -GLEW_FUN_EXPORT PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI; -GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI; -GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI; -GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI; -GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI; -GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI; -GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI; -GLEW_FUN_EXPORT PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI; -GLEW_FUN_EXPORT PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI; -GLEW_FUN_EXPORT PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI; -GLEW_FUN_EXPORT PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI; - -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI; - -GLEW_FUN_EXPORT PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI; -GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI; -GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI; -GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DATIPROC __glewVertexStream1dATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DVATIPROC __glewVertexStream1dvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FATIPROC __glewVertexStream1fATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FVATIPROC __glewVertexStream1fvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IATIPROC __glewVertexStream1iATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IVATIPROC __glewVertexStream1ivATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SATIPROC __glewVertexStream1sATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SVATIPROC __glewVertexStream1svATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI; -GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC __glewDrawArraysInstancedBaseInstanceEXT; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC __glewDrawElementsInstancedBaseInstanceEXT; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC __glewDrawElementsInstancedBaseVertexBaseInstanceEXT; - -GLEW_FUN_EXPORT PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT; -GLEW_FUN_EXPORT PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT; -GLEW_FUN_EXPORT PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT; - -GLEW_FUN_EXPORT PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT; - -GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC __glewBindFragDataLocationIndexedEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXEXTPROC __glewGetFragDataIndexEXT; -GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC __glewGetProgramResourceLocationIndexEXT; - -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT; - -GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEEXTPROC __glewBufferStorageEXT; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT; - -GLEW_FUN_EXPORT PFNGLCLEARTEXIMAGEEXTPROC __glewClearTexImageEXT; -GLEW_FUN_EXPORT PFNGLCLEARTEXSUBIMAGEEXTPROC __glewClearTexSubImageEXT; - -GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT; -GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT; - -GLEW_FUN_EXPORT PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT; -GLEW_FUN_EXPORT PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT; - -GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT; -GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT; -GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT; -GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT; - -GLEW_FUN_EXPORT PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT; -GLEW_FUN_EXPORT PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT; - -GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATAEXTPROC __glewCopyImageSubDataEXT; - -GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT; - -GLEW_FUN_EXPORT PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT; -GLEW_FUN_EXPORT PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT; - -GLEW_FUN_EXPORT PFNGLGETOBJECTLABELEXTPROC __glewGetObjectLabelEXT; -GLEW_FUN_EXPORT PFNGLLABELOBJECTEXTPROC __glewLabelObjectEXT; - -GLEW_FUN_EXPORT PFNGLINSERTEVENTMARKEREXTPROC __glewInsertEventMarkerEXT; -GLEW_FUN_EXPORT PFNGLPOPGROUPMARKEREXTPROC __glewPopGroupMarkerEXT; -GLEW_FUN_EXPORT PFNGLPUSHGROUPMARKEREXTPROC __glewPushGroupMarkerEXT; - -GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT; - -GLEW_FUN_EXPORT PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT; -GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT; -GLEW_FUN_EXPORT PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT; -GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT; -GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT; -GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT; -GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT; -GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT; -GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT; -GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT; -GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT; -GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT; -GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT; -GLEW_FUN_EXPORT PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT; -GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT; -GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT; -GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT; -GLEW_FUN_EXPORT PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT; -GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT; -GLEW_FUN_EXPORT PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT; -GLEW_FUN_EXPORT PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT; -GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT; -GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT; -GLEW_FUN_EXPORT PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT; -GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT; -GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT; -GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT; -GLEW_FUN_EXPORT PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT; -GLEW_FUN_EXPORT PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT; -GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT; -GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT; -GLEW_FUN_EXPORT PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT; -GLEW_FUN_EXPORT PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT; -GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT; -GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT; -GLEW_FUN_EXPORT PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT; -GLEW_FUN_EXPORT PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT; -GLEW_FUN_EXPORT PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT; -GLEW_FUN_EXPORT PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT; -GLEW_FUN_EXPORT PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT; -GLEW_FUN_EXPORT PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT; -GLEW_FUN_EXPORT PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT; -GLEW_FUN_EXPORT PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT; -GLEW_FUN_EXPORT PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT; -GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT; -GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT; -GLEW_FUN_EXPORT PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT; -GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT; -GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT; -GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT; -GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT; -GLEW_FUN_EXPORT PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT; -GLEW_FUN_EXPORT PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT; -GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC __glewVertexArrayVertexAttribDivisorEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT; - -GLEW_FUN_EXPORT PFNGLDISCARDFRAMEBUFFEREXTPROC __glewDiscardFramebufferEXT; - -GLEW_FUN_EXPORT PFNGLDRAWBUFFERSEXTPROC __glewDrawBuffersEXT; - -GLEW_FUN_EXPORT PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT; -GLEW_FUN_EXPORT PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT; -GLEW_FUN_EXPORT PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT; -GLEW_FUN_EXPORT PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT; -GLEW_FUN_EXPORT PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT; -GLEW_FUN_EXPORT PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT; - -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIEXTPROC __glewBlendEquationSeparateiEXT; -GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIEXTPROC __glewBlendEquationiEXT; -GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIEXTPROC __glewBlendFuncSeparateiEXT; -GLEW_FUN_EXPORT PFNGLBLENDFUNCIEXTPROC __glewBlendFunciEXT; -GLEW_FUN_EXPORT PFNGLCOLORMASKIEXTPROC __glewColorMaskiEXT; -GLEW_FUN_EXPORT PFNGLDISABLEIEXTPROC __glewDisableiEXT; -GLEW_FUN_EXPORT PFNGLENABLEIEXTPROC __glewEnableiEXT; -GLEW_FUN_EXPORT PFNGLISENABLEDIEXTPROC __glewIsEnablediEXT; - -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSBASEVERTEXEXTPROC __glewDrawElementsBaseVertexEXT; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC __glewDrawElementsInstancedBaseVertexEXT; -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC __glewDrawRangeElementsBaseVertexEXT; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC __glewMultiDrawElementsBaseVertexEXT; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT; - -GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT; - -GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEEXTERNALEXTPROC __glewBufferStorageExternalEXT; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC __glewNamedBufferStorageExternalEXT; - -GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT; -GLEW_FUN_EXPORT PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT; -GLEW_FUN_EXPORT PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT; -GLEW_FUN_EXPORT PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT; -GLEW_FUN_EXPORT PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT; - -GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT; -GLEW_FUN_EXPORT PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT; - -GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT; - -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT; - -GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT; -GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT; -GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT; -GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT; -GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT; -GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT; -GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT; -GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT; -GLEW_FUN_EXPORT PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT; -GLEW_FUN_EXPORT PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT; -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT; - -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT; - -GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT; -GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT; -GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT; -GLEW_FUN_EXPORT PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT; - -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT; -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT; -GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT; -GLEW_FUN_EXPORT PFNGLHISTOGRAMEXTPROC __glewHistogramEXT; -GLEW_FUN_EXPORT PFNGLMINMAXEXTPROC __glewMinmaxEXT; -GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT; -GLEW_FUN_EXPORT PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT; - -GLEW_FUN_EXPORT PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT; - -GLEW_FUN_EXPORT PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT; - -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISOREXTPROC __glewVertexAttribDivisorEXT; - -GLEW_FUN_EXPORT PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT; -GLEW_FUN_EXPORT PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT; - -GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC __glewFlushMappedBufferRangeEXT; -GLEW_FUN_EXPORT PFNGLMAPBUFFERRANGEEXTPROC __glewMapBufferRangeEXT; - -GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEMEMEXTPROC __glewBufferStorageMemEXT; -GLEW_FUN_EXPORT PFNGLCREATEMEMORYOBJECTSEXTPROC __glewCreateMemoryObjectsEXT; -GLEW_FUN_EXPORT PFNGLDELETEMEMORYOBJECTSEXTPROC __glewDeleteMemoryObjectsEXT; -GLEW_FUN_EXPORT PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC __glewGetMemoryObjectParameterivEXT; -GLEW_FUN_EXPORT PFNGLGETUNSIGNEDBYTEI_VEXTPROC __glewGetUnsignedBytei_vEXT; -GLEW_FUN_EXPORT PFNGLGETUNSIGNEDBYTEVEXTPROC __glewGetUnsignedBytevEXT; -GLEW_FUN_EXPORT PFNGLISMEMORYOBJECTEXTPROC __glewIsMemoryObjectEXT; -GLEW_FUN_EXPORT PFNGLMEMORYOBJECTPARAMETERIVEXTPROC __glewMemoryObjectParameterivEXT; -GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC __glewNamedBufferStorageMemEXT; -GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM1DEXTPROC __glewTexStorageMem1DEXT; -GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM2DEXTPROC __glewTexStorageMem2DEXT; -GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC __glewTexStorageMem2DMultisampleEXT; -GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM3DEXTPROC __glewTexStorageMem3DEXT; -GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC __glewTexStorageMem3DMultisampleEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM1DEXTPROC __glewTextureStorageMem1DEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM2DEXTPROC __glewTextureStorageMem2DEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC __glewTextureStorageMem2DMultisampleEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM3DEXTPROC __glewTextureStorageMem3DEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC __glewTextureStorageMem3DMultisampleEXT; - -GLEW_FUN_EXPORT PFNGLIMPORTMEMORYFDEXTPROC __glewImportMemoryFdEXT; - -GLEW_FUN_EXPORT PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC __glewImportMemoryWin32HandleEXT; -GLEW_FUN_EXPORT PFNGLIMPORTMEMORYWIN32NAMEEXTPROC __glewImportMemoryWin32NameEXT; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC __glewMultiDrawArraysIndirectEXT; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC __glewMultiDrawElementsIndirectEXT; - -GLEW_FUN_EXPORT PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT; -GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC __glewFramebufferTexture2DMultisampleEXT; - -GLEW_FUN_EXPORT PFNGLDRAWBUFFERSINDEXEDEXTPROC __glewDrawBuffersIndexedEXT; -GLEW_FUN_EXPORT PFNGLGETINTEGERI_VEXTPROC __glewGetIntegeri_vEXT; -GLEW_FUN_EXPORT PFNGLREADBUFFERINDEXEDEXTPROC __glewReadBufferIndexedEXT; - -GLEW_FUN_EXPORT PFNGLCOLORTABLEEXTPROC __glewColorTableEXT; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT; - -GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT; -GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT; - -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT; - -GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT; - -GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETCLAMPEXTPROC __glewPolygonOffsetClampEXT; - -GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT; - -GLEW_FUN_EXPORT PFNGLCOVERAGEMODULATIONNVPROC __glewCoverageModulationNV; -GLEW_FUN_EXPORT PFNGLCOVERAGEMODULATIONTABLENVPROC __glewCoverageModulationTableNV; -GLEW_FUN_EXPORT PFNGLGETCOVERAGEMODULATIONTABLENVPROC __glewGetCoverageModulationTableNV; -GLEW_FUN_EXPORT PFNGLRASTERSAMPLESEXTPROC __glewRasterSamplesEXT; - -GLEW_FUN_EXPORT PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT; -GLEW_FUN_EXPORT PFNGLENDSCENEEXTPROC __glewEndSceneEXT; - -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT; - -GLEW_FUN_EXPORT PFNGLDELETESEMAPHORESEXTPROC __glewDeleteSemaphoresEXT; -GLEW_FUN_EXPORT PFNGLGENSEMAPHORESEXTPROC __glewGenSemaphoresEXT; -GLEW_FUN_EXPORT PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC __glewGetSemaphoreParameterui64vEXT; -GLEW_FUN_EXPORT PFNGLISSEMAPHOREEXTPROC __glewIsSemaphoreEXT; -GLEW_FUN_EXPORT PFNGLSEMAPHOREPARAMETERUI64VEXTPROC __glewSemaphoreParameterui64vEXT; -GLEW_FUN_EXPORT PFNGLSIGNALSEMAPHOREEXTPROC __glewSignalSemaphoreEXT; -GLEW_FUN_EXPORT PFNGLWAITSEMAPHOREEXTPROC __glewWaitSemaphoreEXT; - -GLEW_FUN_EXPORT PFNGLIMPORTSEMAPHOREFDEXTPROC __glewImportSemaphoreFdEXT; - -GLEW_FUN_EXPORT PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC __glewImportSemaphoreWin32HandleEXT; -GLEW_FUN_EXPORT PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC __glewImportSemaphoreWin32NameEXT; - -GLEW_FUN_EXPORT PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT; -GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT; -GLEW_FUN_EXPORT PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT; - -GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT; -GLEW_FUN_EXPORT PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT; - -GLEW_FUN_EXPORT PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC __glewClearPixelLocalStorageuiEXT; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __glewFramebufferPixelLocalStorageSizeEXT; -GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __glewGetFramebufferPixelLocalStorageSizeEXT; - -GLEW_FUN_EXPORT PFNGLTEXPAGECOMMITMENTEXTPROC __glewTexPageCommitmentEXT; -GLEW_FUN_EXPORT PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT; - -GLEW_FUN_EXPORT PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT; - -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT; -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT; -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT; - -GLEW_FUN_EXPORT PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT; - -GLEW_FUN_EXPORT PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT; - -GLEW_FUN_EXPORT PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT; -GLEW_FUN_EXPORT PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT; -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT; -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT; - -GLEW_FUN_EXPORT PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT; -GLEW_FUN_EXPORT PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT; -GLEW_FUN_EXPORT PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT; -GLEW_FUN_EXPORT PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT; -GLEW_FUN_EXPORT PFNGLISTEXTUREEXTPROC __glewIsTextureEXT; -GLEW_FUN_EXPORT PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT; - -GLEW_FUN_EXPORT PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT; - -GLEW_FUN_EXPORT PFNGLTEXSTORAGE1DEXTPROC __glewTexStorage1DEXT; -GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DEXTPROC __glewTexStorage2DEXT; -GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DEXTPROC __glewTexStorage3DEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT; -GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT; - -GLEW_FUN_EXPORT PFNGLTEXTUREVIEWEXTPROC __glewTextureViewEXT; - -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT; -GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT; - -GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT; -GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT; -GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT; -GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT; -GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT; -GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT; -GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT; - -GLEW_FUN_EXPORT PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT; -GLEW_FUN_EXPORT PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT; -GLEW_FUN_EXPORT PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT; -GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT; -GLEW_FUN_EXPORT PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT; -GLEW_FUN_EXPORT PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT; -GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT; -GLEW_FUN_EXPORT PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT; - -GLEW_FUN_EXPORT PFNGLBINDARRAYSETEXTPROC __glewBindArraySetEXT; -GLEW_FUN_EXPORT PFNGLCREATEARRAYSETEXTPROC __glewCreateArraySetExt; -GLEW_FUN_EXPORT PFNGLDELETEARRAYSETSEXTPROC __glewDeleteArraySetsEXT; - -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT; - -GLEW_FUN_EXPORT PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT; -GLEW_FUN_EXPORT PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT; -GLEW_FUN_EXPORT PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT; -GLEW_FUN_EXPORT PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT; -GLEW_FUN_EXPORT PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT; -GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT; -GLEW_FUN_EXPORT PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT; -GLEW_FUN_EXPORT PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT; -GLEW_FUN_EXPORT PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT; -GLEW_FUN_EXPORT PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT; -GLEW_FUN_EXPORT PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT; -GLEW_FUN_EXPORT PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT; -GLEW_FUN_EXPORT PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT; -GLEW_FUN_EXPORT PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT; -GLEW_FUN_EXPORT PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT; -GLEW_FUN_EXPORT PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT; -GLEW_FUN_EXPORT PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT; -GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT; -GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT; -GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT; -GLEW_FUN_EXPORT PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT; -GLEW_FUN_EXPORT PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT; -GLEW_FUN_EXPORT PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT; -GLEW_FUN_EXPORT PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT; -GLEW_FUN_EXPORT PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT; -GLEW_FUN_EXPORT PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT; -GLEW_FUN_EXPORT PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT; -GLEW_FUN_EXPORT PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT; -GLEW_FUN_EXPORT PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT; -GLEW_FUN_EXPORT PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT; -GLEW_FUN_EXPORT PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT; -GLEW_FUN_EXPORT PFNGLSWIZZLEEXTPROC __glewSwizzleEXT; -GLEW_FUN_EXPORT PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT; -GLEW_FUN_EXPORT PFNGLVARIANTBVEXTPROC __glewVariantbvEXT; -GLEW_FUN_EXPORT PFNGLVARIANTDVEXTPROC __glewVariantdvEXT; -GLEW_FUN_EXPORT PFNGLVARIANTFVEXTPROC __glewVariantfvEXT; -GLEW_FUN_EXPORT PFNGLVARIANTIVEXTPROC __glewVariantivEXT; -GLEW_FUN_EXPORT PFNGLVARIANTSVEXTPROC __glewVariantsvEXT; -GLEW_FUN_EXPORT PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT; -GLEW_FUN_EXPORT PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT; -GLEW_FUN_EXPORT PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT; -GLEW_FUN_EXPORT PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT; - -GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT; -GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT; -GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT; - -GLEW_FUN_EXPORT PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC __glewAcquireKeyedMutexWin32EXT; -GLEW_FUN_EXPORT PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC __glewReleaseKeyedMutexWin32EXT; - -GLEW_FUN_EXPORT PFNGLWINDOWRECTANGLESEXTPROC __glewWindowRectanglesEXT; - -GLEW_FUN_EXPORT PFNGLIMPORTSYNCEXTPROC __glewImportSyncEXT; - -GLEW_FUN_EXPORT PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY; - -GLEW_FUN_EXPORT PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY; - -GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP; -GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP; -GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP; -GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP; -GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP; -GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP; - -GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM; -GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM; - -GLEW_FUN_EXPORT PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM; -GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM; -GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM; -GLEW_FUN_EXPORT PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM; -GLEW_FUN_EXPORT PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM; -GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM; -GLEW_FUN_EXPORT PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM; - -GLEW_FUN_EXPORT PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL; -GLEW_FUN_EXPORT PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL; -GLEW_FUN_EXPORT PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL; - -GLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL; -GLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL; -GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL; -GLEW_FUN_EXPORT PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL; - -GLEW_FUN_EXPORT PFNGLBEGINPERFQUERYINTELPROC __glewBeginPerfQueryINTEL; -GLEW_FUN_EXPORT PFNGLCREATEPERFQUERYINTELPROC __glewCreatePerfQueryINTEL; -GLEW_FUN_EXPORT PFNGLDELETEPERFQUERYINTELPROC __glewDeletePerfQueryINTEL; -GLEW_FUN_EXPORT PFNGLENDPERFQUERYINTELPROC __glewEndPerfQueryINTEL; -GLEW_FUN_EXPORT PFNGLGETFIRSTPERFQUERYIDINTELPROC __glewGetFirstPerfQueryIdINTEL; -GLEW_FUN_EXPORT PFNGLGETNEXTPERFQUERYIDINTELPROC __glewGetNextPerfQueryIdINTEL; -GLEW_FUN_EXPORT PFNGLGETPERFCOUNTERINFOINTELPROC __glewGetPerfCounterInfoINTEL; -GLEW_FUN_EXPORT PFNGLGETPERFQUERYDATAINTELPROC __glewGetPerfQueryDataINTEL; -GLEW_FUN_EXPORT PFNGLGETPERFQUERYIDBYNAMEINTELPROC __glewGetPerfQueryIdByNameINTEL; -GLEW_FUN_EXPORT PFNGLGETPERFQUERYINFOINTELPROC __glewGetPerfQueryInfoINTEL; - -GLEW_FUN_EXPORT PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL; -GLEW_FUN_EXPORT PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL; - -GLEW_FUN_EXPORT PFNGLBLENDBARRIERKHRPROC __glewBlendBarrierKHR; - -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback; -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLPROC __glewDebugMessageControl; -GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert; -GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog; -GLEW_FUN_EXPORT PFNGLGETOBJECTLABELPROC __glewGetObjectLabel; -GLEW_FUN_EXPORT PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel; -GLEW_FUN_EXPORT PFNGLOBJECTLABELPROC __glewObjectLabel; -GLEW_FUN_EXPORT PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel; -GLEW_FUN_EXPORT PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup; -GLEW_FUN_EXPORT PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup; - -GLEW_FUN_EXPORT PFNGLMAXSHADERCOMPILERTHREADSKHRPROC __glewMaxShaderCompilerThreadsKHR; - -GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVPROC __glewGetnUniformfv; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVPROC __glewGetnUniformiv; -GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVPROC __glewGetnUniformuiv; -GLEW_FUN_EXPORT PFNGLREADNPIXELSPROC __glewReadnPixels; - -GLEW_FUN_EXPORT PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled; -GLEW_FUN_EXPORT PFNGLDELETEBUFFERREGIONPROC __glewDeleteBufferRegion; -GLEW_FUN_EXPORT PFNGLDRAWBUFFERREGIONPROC __glewDrawBufferRegion; -GLEW_FUN_EXPORT PFNGLNEWBUFFERREGIONPROC __glewNewBufferRegion; -GLEW_FUN_EXPORT PFNGLREADBUFFERREGIONPROC __glewReadBufferRegion; - -GLEW_FUN_EXPORT PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA; - -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA; -GLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA; - -GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX; -GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX; - -GLEW_FUN_EXPORT PFNGLLGPUCOPYIMAGESUBDATANVXPROC __glewLGPUCopyImageSubDataNVX; -GLEW_FUN_EXPORT PFNGLLGPUINTERLOCKNVXPROC __glewLGPUInterlockNVX; -GLEW_FUN_EXPORT PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC __glewLGPUNamedBufferSubDataNVX; - -GLEW_FUN_EXPORT PFNGLSTEREOPARAMETERFNVPROC __glewStereoParameterfNV; -GLEW_FUN_EXPORT PFNGLSTEREOPARAMETERINVPROC __glewStereoParameteriNV; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV; - -GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawArraysIndirectBindlessCountNV; -GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawElementsIndirectBindlessCountNV; - -GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV; -GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV; -GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV; -GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTNVPROC __glewIsImageHandleResidentNV; -GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTNVPROC __glewIsTextureHandleResidentNV; -GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC __glewMakeImageHandleNonResidentNV; -GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTNVPROC __glewMakeImageHandleResidentNV; -GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC __glewMakeTextureHandleNonResidentNV; -GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTNVPROC __glewMakeTextureHandleResidentNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC __glewProgramUniformHandleui64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV; -GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV; - -GLEW_FUN_EXPORT PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV; -GLEW_FUN_EXPORT PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV; - -GLEW_FUN_EXPORT PFNGLVIEWPORTPOSITIONWSCALENVPROC __glewViewportPositionWScaleNV; - -GLEW_FUN_EXPORT PFNGLCALLCOMMANDLISTNVPROC __glewCallCommandListNV; -GLEW_FUN_EXPORT PFNGLCOMMANDLISTSEGMENTSNVPROC __glewCommandListSegmentsNV; -GLEW_FUN_EXPORT PFNGLCOMPILECOMMANDLISTNVPROC __glewCompileCommandListNV; -GLEW_FUN_EXPORT PFNGLCREATECOMMANDLISTSNVPROC __glewCreateCommandListsNV; -GLEW_FUN_EXPORT PFNGLCREATESTATESNVPROC __glewCreateStatesNV; -GLEW_FUN_EXPORT PFNGLDELETECOMMANDLISTSNVPROC __glewDeleteCommandListsNV; -GLEW_FUN_EXPORT PFNGLDELETESTATESNVPROC __glewDeleteStatesNV; -GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSADDRESSNVPROC __glewDrawCommandsAddressNV; -GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSNVPROC __glewDrawCommandsNV; -GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC __glewDrawCommandsStatesAddressNV; -GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSSTATESNVPROC __glewDrawCommandsStatesNV; -GLEW_FUN_EXPORT PFNGLGETCOMMANDHEADERNVPROC __glewGetCommandHeaderNV; -GLEW_FUN_EXPORT PFNGLGETSTAGEINDEXNVPROC __glewGetStageIndexNV; -GLEW_FUN_EXPORT PFNGLISCOMMANDLISTNVPROC __glewIsCommandListNV; -GLEW_FUN_EXPORT PFNGLISSTATENVPROC __glewIsStateNV; -GLEW_FUN_EXPORT PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC __glewListDrawCommandsStatesClientNV; -GLEW_FUN_EXPORT PFNGLSTATECAPTURENVPROC __glewStateCaptureNV; - -GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV; -GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV; - -GLEW_FUN_EXPORT PFNGLSUBPIXELPRECISIONBIASNVPROC __glewSubpixelPrecisionBiasNV; - -GLEW_FUN_EXPORT PFNGLCONSERVATIVERASTERPARAMETERFNVPROC __glewConservativeRasterParameterfNV; - -GLEW_FUN_EXPORT PFNGLCONSERVATIVERASTERPARAMETERINVPROC __glewConservativeRasterParameteriNV; - -GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATANVPROC __glewCopyBufferSubDataNV; - -GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV; - -GLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV; -GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV; -GLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV; - -GLEW_FUN_EXPORT PFNGLDRAWBUFFERSNVPROC __glewDrawBuffersNV; - -GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDNVPROC __glewDrawArraysInstancedNV; -GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDNVPROC __glewDrawElementsInstancedNV; - -GLEW_FUN_EXPORT PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV; - -GLEW_FUN_EXPORT PFNGLDRAWVKIMAGENVPROC __glewDrawVkImageNV; -GLEW_FUN_EXPORT PFNGLGETVKPROCADDRNVPROC __glewGetVkProcAddrNV; -GLEW_FUN_EXPORT PFNGLSIGNALVKFENCENVPROC __glewSignalVkFenceNV; -GLEW_FUN_EXPORT PFNGLSIGNALVKSEMAPHORENVPROC __glewSignalVkSemaphoreNV; -GLEW_FUN_EXPORT PFNGLWAITVKSEMAPHORENVPROC __glewWaitVkSemaphoreNV; - -GLEW_FUN_EXPORT PFNGLEVALMAPSNVPROC __glewEvalMapsNV; -GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV; -GLEW_FUN_EXPORT PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV; -GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV; -GLEW_FUN_EXPORT PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV; -GLEW_FUN_EXPORT PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV; -GLEW_FUN_EXPORT PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV; - -GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV; -GLEW_FUN_EXPORT PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV; -GLEW_FUN_EXPORT PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV; - -GLEW_FUN_EXPORT PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV; -GLEW_FUN_EXPORT PFNGLFINISHFENCENVPROC __glewFinishFenceNV; -GLEW_FUN_EXPORT PFNGLGENFENCESNVPROC __glewGenFencesNV; -GLEW_FUN_EXPORT PFNGLGETFENCEIVNVPROC __glewGetFenceivNV; -GLEW_FUN_EXPORT PFNGLISFENCENVPROC __glewIsFenceNV; -GLEW_FUN_EXPORT PFNGLSETFENCENVPROC __glewSetFenceNV; -GLEW_FUN_EXPORT PFNGLTESTFENCENVPROC __glewTestFenceNV; - -GLEW_FUN_EXPORT PFNGLFRAGMENTCOVERAGECOLORNVPROC __glewFragmentCoverageColorNV; - -GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV; -GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV; -GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV; -GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV; -GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV; - -GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERNVPROC __glewBlitFramebufferNV; - -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC __glewRenderbufferStorageMultisampleNV; - -GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV; - -GLEW_FUN_EXPORT PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV; - -GLEW_FUN_EXPORT PFNGLMULTICASTBARRIERNVPROC __glewMulticastBarrierNV; -GLEW_FUN_EXPORT PFNGLMULTICASTBLITFRAMEBUFFERNVPROC __glewMulticastBlitFramebufferNV; -GLEW_FUN_EXPORT PFNGLMULTICASTBUFFERSUBDATANVPROC __glewMulticastBufferSubDataNV; -GLEW_FUN_EXPORT PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC __glewMulticastCopyBufferSubDataNV; -GLEW_FUN_EXPORT PFNGLMULTICASTCOPYIMAGESUBDATANVPROC __glewMulticastCopyImageSubDataNV; -GLEW_FUN_EXPORT PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewMulticastFramebufferSampleLocationsfvNV; -GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC __glewMulticastGetQueryObjecti64vNV; -GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTIVNVPROC __glewMulticastGetQueryObjectivNV; -GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC __glewMulticastGetQueryObjectui64vNV; -GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC __glewMulticastGetQueryObjectuivNV; -GLEW_FUN_EXPORT PFNGLMULTICASTWAITSYNCNVPROC __glewMulticastWaitSyncNV; -GLEW_FUN_EXPORT PFNGLRENDERGPUMASKNVPROC __glewRenderGpuMaskNV; - -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV; - -GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV; -GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV; -GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV; - -GLEW_FUN_EXPORT PFNGLCOLOR3HNVPROC __glewColor3hNV; -GLEW_FUN_EXPORT PFNGLCOLOR3HVNVPROC __glewColor3hvNV; -GLEW_FUN_EXPORT PFNGLCOLOR4HNVPROC __glewColor4hNV; -GLEW_FUN_EXPORT PFNGLCOLOR4HVNVPROC __glewColor4hvNV; -GLEW_FUN_EXPORT PFNGLFOGCOORDHNVPROC __glewFogCoordhNV; -GLEW_FUN_EXPORT PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV; -GLEW_FUN_EXPORT PFNGLNORMAL3HNVPROC __glewNormal3hNV; -GLEW_FUN_EXPORT PFNGLNORMAL3HVNVPROC __glewNormal3hvNV; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV; -GLEW_FUN_EXPORT PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV; -GLEW_FUN_EXPORT PFNGLVERTEX2HNVPROC __glewVertex2hNV; -GLEW_FUN_EXPORT PFNGLVERTEX2HVNVPROC __glewVertex2hvNV; -GLEW_FUN_EXPORT PFNGLVERTEX3HNVPROC __glewVertex3hNV; -GLEW_FUN_EXPORT PFNGLVERTEX3HVNVPROC __glewVertex3hvNV; -GLEW_FUN_EXPORT PFNGLVERTEX4HNVPROC __glewVertex4hNV; -GLEW_FUN_EXPORT PFNGLVERTEX4HVNVPROC __glewVertex4hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV; -GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV; -GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV; - -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORNVPROC __glewVertexAttribDivisorNV; - -GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATSAMPLEIVNVPROC __glewGetInternalformatSampleivNV; - -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVNVPROC __glewUniformMatrix2x3fvNV; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVNVPROC __glewUniformMatrix2x4fvNV; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVNVPROC __glewUniformMatrix3x2fvNV; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVNVPROC __glewUniformMatrix3x4fvNV; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVNVPROC __glewUniformMatrix4x2fvNV; -GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVNVPROC __glewUniformMatrix4x3fvNV; - -GLEW_FUN_EXPORT PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV; -GLEW_FUN_EXPORT PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV; -GLEW_FUN_EXPORT PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV; -GLEW_FUN_EXPORT PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV; -GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV; -GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV; -GLEW_FUN_EXPORT PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV; - -GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV; -GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV; - -GLEW_FUN_EXPORT PFNGLCOPYPATHNVPROC __glewCopyPathNV; -GLEW_FUN_EXPORT PFNGLCOVERFILLPATHINSTANCEDNVPROC __glewCoverFillPathInstancedNV; -GLEW_FUN_EXPORT PFNGLCOVERFILLPATHNVPROC __glewCoverFillPathNV; -GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHINSTANCEDNVPROC __glewCoverStrokePathInstancedNV; -GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHNVPROC __glewCoverStrokePathNV; -GLEW_FUN_EXPORT PFNGLDELETEPATHSNVPROC __glewDeletePathsNV; -GLEW_FUN_EXPORT PFNGLGENPATHSNVPROC __glewGenPathsNV; -GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENFVNVPROC __glewGetPathColorGenfvNV; -GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENIVNVPROC __glewGetPathColorGenivNV; -GLEW_FUN_EXPORT PFNGLGETPATHCOMMANDSNVPROC __glewGetPathCommandsNV; -GLEW_FUN_EXPORT PFNGLGETPATHCOORDSNVPROC __glewGetPathCoordsNV; -GLEW_FUN_EXPORT PFNGLGETPATHDASHARRAYNVPROC __glewGetPathDashArrayNV; -GLEW_FUN_EXPORT PFNGLGETPATHLENGTHNVPROC __glewGetPathLengthNV; -GLEW_FUN_EXPORT PFNGLGETPATHMETRICRANGENVPROC __glewGetPathMetricRangeNV; -GLEW_FUN_EXPORT PFNGLGETPATHMETRICSNVPROC __glewGetPathMetricsNV; -GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERFVNVPROC __glewGetPathParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERIVNVPROC __glewGetPathParameterivNV; -GLEW_FUN_EXPORT PFNGLGETPATHSPACINGNVPROC __glewGetPathSpacingNV; -GLEW_FUN_EXPORT PFNGLGETPATHTEXGENFVNVPROC __glewGetPathTexGenfvNV; -GLEW_FUN_EXPORT PFNGLGETPATHTEXGENIVNVPROC __glewGetPathTexGenivNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEFVNVPROC __glewGetProgramResourcefvNV; -GLEW_FUN_EXPORT PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV; -GLEW_FUN_EXPORT PFNGLISPATHNVPROC __glewIsPathNV; -GLEW_FUN_EXPORT PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV; -GLEW_FUN_EXPORT PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV; -GLEW_FUN_EXPORT PFNGLMATRIXLOAD3X2FNVPROC __glewMatrixLoad3x2fNV; -GLEW_FUN_EXPORT PFNGLMATRIXLOAD3X3FNVPROC __glewMatrixLoad3x3fNV; -GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC __glewMatrixLoadTranspose3x3fNV; -GLEW_FUN_EXPORT PFNGLMATRIXMULT3X2FNVPROC __glewMatrixMult3x2fNV; -GLEW_FUN_EXPORT PFNGLMATRIXMULT3X3FNVPROC __glewMatrixMult3x3fNV; -GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC __glewMatrixMultTranspose3x3fNV; -GLEW_FUN_EXPORT PFNGLPATHCOLORGENNVPROC __glewPathColorGenNV; -GLEW_FUN_EXPORT PFNGLPATHCOMMANDSNVPROC __glewPathCommandsNV; -GLEW_FUN_EXPORT PFNGLPATHCOORDSNVPROC __glewPathCoordsNV; -GLEW_FUN_EXPORT PFNGLPATHCOVERDEPTHFUNCNVPROC __glewPathCoverDepthFuncNV; -GLEW_FUN_EXPORT PFNGLPATHDASHARRAYNVPROC __glewPathDashArrayNV; -GLEW_FUN_EXPORT PFNGLPATHFOGGENNVPROC __glewPathFogGenNV; -GLEW_FUN_EXPORT PFNGLPATHGLYPHINDEXARRAYNVPROC __glewPathGlyphIndexArrayNV; -GLEW_FUN_EXPORT PFNGLPATHGLYPHINDEXRANGENVPROC __glewPathGlyphIndexRangeNV; -GLEW_FUN_EXPORT PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV; -GLEW_FUN_EXPORT PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV; -GLEW_FUN_EXPORT PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC __glewPathMemoryGlyphIndexArrayNV; -GLEW_FUN_EXPORT PFNGLPATHPARAMETERFNVPROC __glewPathParameterfNV; -GLEW_FUN_EXPORT PFNGLPATHPARAMETERFVNVPROC __glewPathParameterfvNV; -GLEW_FUN_EXPORT PFNGLPATHPARAMETERINVPROC __glewPathParameteriNV; -GLEW_FUN_EXPORT PFNGLPATHPARAMETERIVNVPROC __glewPathParameterivNV; -GLEW_FUN_EXPORT PFNGLPATHSTENCILDEPTHOFFSETNVPROC __glewPathStencilDepthOffsetNV; -GLEW_FUN_EXPORT PFNGLPATHSTENCILFUNCNVPROC __glewPathStencilFuncNV; -GLEW_FUN_EXPORT PFNGLPATHSTRINGNVPROC __glewPathStringNV; -GLEW_FUN_EXPORT PFNGLPATHSUBCOMMANDSNVPROC __glewPathSubCommandsNV; -GLEW_FUN_EXPORT PFNGLPATHSUBCOORDSNVPROC __glewPathSubCoordsNV; -GLEW_FUN_EXPORT PFNGLPATHTEXGENNVPROC __glewPathTexGenNV; -GLEW_FUN_EXPORT PFNGLPOINTALONGPATHNVPROC __glewPointAlongPathNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC __glewProgramPathFragmentInputGenNV; -GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV; -GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV; -GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV; -GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV; -GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC __glewStencilThenCoverFillPathInstancedNV; -GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERFILLPATHNVPROC __glewStencilThenCoverFillPathNV; -GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC __glewStencilThenCoverStrokePathInstancedNV; -GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC __glewStencilThenCoverStrokePathNV; -GLEW_FUN_EXPORT PFNGLTRANSFORMPATHNVPROC __glewTransformPathNV; -GLEW_FUN_EXPORT PFNGLWEIGHTPATHSNVPROC __glewWeightPathsNV; - -GLEW_FUN_EXPORT PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV; -GLEW_FUN_EXPORT PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV; - -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV; - -GLEW_FUN_EXPORT PFNGLPOLYGONMODENVPROC __glewPolygonModeNV; - -GLEW_FUN_EXPORT PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV; -GLEW_FUN_EXPORT PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV; -GLEW_FUN_EXPORT PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV; - -GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV; -GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV; - -GLEW_FUN_EXPORT PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV; -GLEW_FUN_EXPORT PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV; -GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV; -GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV; -GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV; -GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV; -GLEW_FUN_EXPORT PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV; -GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV; -GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV; -GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV; - -GLEW_FUN_EXPORT PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewFramebufferSampleLocationsfvNV; -GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewNamedFramebufferSampleLocationsfvNV; - -GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV; -GLEW_FUN_EXPORT PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV; -GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV; -GLEW_FUN_EXPORT PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV; -GLEW_FUN_EXPORT PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV; -GLEW_FUN_EXPORT PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV; -GLEW_FUN_EXPORT PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV; -GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV; -GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV; -GLEW_FUN_EXPORT PFNGLUNIFORMUI64NVPROC __glewUniformui64NV; -GLEW_FUN_EXPORT PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV; - -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DNVPROC __glewCompressedTexImage3DNV; -GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DNVPROC __glewCompressedTexSubImage3DNV; -GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DNVPROC __glewCopyTexSubImage3DNV; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERNVPROC __glewFramebufferTextureLayerNV; -GLEW_FUN_EXPORT PFNGLTEXIMAGE3DNVPROC __glewTexImage3DNV; -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DNVPROC __glewTexSubImage3DNV; - -GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV; - -GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTexImage2DMultisampleCoverageNV; -GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTexImage3DMultisampleCoverageNV; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTextureImage2DMultisampleCoverageNV; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC __glewTextureImage2DMultisampleNV; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTextureImage3DMultisampleCoverageNV; -GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC __glewTextureImage3DMultisampleNV; - -GLEW_FUN_EXPORT PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV; -GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV; -GLEW_FUN_EXPORT PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV; -GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV; -GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV; -GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV; -GLEW_FUN_EXPORT PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV; -GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV; -GLEW_FUN_EXPORT PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV; -GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV; -GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV; - -GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV; -GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV; -GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV; -GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV; -GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV; -GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV; -GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV; - -GLEW_FUN_EXPORT PFNGLVDPAUFININVPROC __glewVDPAUFiniNV; -GLEW_FUN_EXPORT PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV; -GLEW_FUN_EXPORT PFNGLVDPAUINITNVPROC __glewVDPAUInitNV; -GLEW_FUN_EXPORT PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV; -GLEW_FUN_EXPORT PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV; -GLEW_FUN_EXPORT PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV; -GLEW_FUN_EXPORT PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV; -GLEW_FUN_EXPORT PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV; -GLEW_FUN_EXPORT PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV; -GLEW_FUN_EXPORT PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV; - -GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV; -GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV; - -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV; - -GLEW_FUN_EXPORT PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV; -GLEW_FUN_EXPORT PFNGLCOLORFORMATNVPROC __glewColorFormatNV; -GLEW_FUN_EXPORT PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV; -GLEW_FUN_EXPORT PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV; -GLEW_FUN_EXPORT PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV; -GLEW_FUN_EXPORT PFNGLINDEXFORMATNVPROC __glewIndexFormatNV; -GLEW_FUN_EXPORT PFNGLNORMALFORMATNVPROC __glewNormalFormatNV; -GLEW_FUN_EXPORT PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV; -GLEW_FUN_EXPORT PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV; -GLEW_FUN_EXPORT PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV; - -GLEW_FUN_EXPORT PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV; -GLEW_FUN_EXPORT PFNGLBINDPROGRAMNVPROC __glewBindProgramNV; -GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV; -GLEW_FUN_EXPORT PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV; -GLEW_FUN_EXPORT PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV; -GLEW_FUN_EXPORT PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV; -GLEW_FUN_EXPORT PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV; -GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV; -GLEW_FUN_EXPORT PFNGLISPROGRAMNVPROC __glewIsProgramNV; -GLEW_FUN_EXPORT PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV; -GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV; -GLEW_FUN_EXPORT PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV; -GLEW_FUN_EXPORT PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV; -GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV; - -GLEW_FUN_EXPORT PFNGLBEGINVIDEOCAPTURENVPROC __glewBeginVideoCaptureNV; -GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC __glewBindVideoCaptureStreamBufferNV; -GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC __glewBindVideoCaptureStreamTextureNV; -GLEW_FUN_EXPORT PFNGLENDVIDEOCAPTURENVPROC __glewEndVideoCaptureNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMDVNVPROC __glewGetVideoCaptureStreamdvNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMFVNVPROC __glewGetVideoCaptureStreamfvNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMIVNVPROC __glewGetVideoCaptureStreamivNV; -GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTUREIVNVPROC __glewGetVideoCaptureivNV; -GLEW_FUN_EXPORT PFNGLVIDEOCAPTURENVPROC __glewVideoCaptureNV; -GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC __glewVideoCaptureStreamParameterdvNV; -GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC __glewVideoCaptureStreamParameterfvNV; -GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC __glewVideoCaptureStreamParameterivNV; - -GLEW_FUN_EXPORT PFNGLDEPTHRANGEARRAYFVNVPROC __glewDepthRangeArrayfvNV; -GLEW_FUN_EXPORT PFNGLDEPTHRANGEINDEXEDFNVPROC __glewDepthRangeIndexedfNV; -GLEW_FUN_EXPORT PFNGLDISABLEINVPROC __glewDisableiNV; -GLEW_FUN_EXPORT PFNGLENABLEINVPROC __glewEnableiNV; -GLEW_FUN_EXPORT PFNGLGETFLOATI_VNVPROC __glewGetFloati_vNV; -GLEW_FUN_EXPORT PFNGLISENABLEDINVPROC __glewIsEnablediNV; -GLEW_FUN_EXPORT PFNGLSCISSORARRAYVNVPROC __glewScissorArrayvNV; -GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDNVPROC __glewScissorIndexedNV; -GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDVNVPROC __glewScissorIndexedvNV; -GLEW_FUN_EXPORT PFNGLVIEWPORTARRAYVNVPROC __glewViewportArrayvNV; -GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFNVPROC __glewViewportIndexedfNV; -GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFVNVPROC __glewViewportIndexedfvNV; - -GLEW_FUN_EXPORT PFNGLVIEWPORTSWIZZLENVPROC __glewViewportSwizzleNV; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __glewFramebufferTextureMultiviewOVR; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC __glewFramebufferTextureMultisampleMultiviewOVR; - -GLEW_FUN_EXPORT PFNGLALPHAFUNCQCOMPROC __glewAlphaFuncQCOM; - -GLEW_FUN_EXPORT PFNGLDISABLEDRIVERCONTROLQCOMPROC __glewDisableDriverControlQCOM; -GLEW_FUN_EXPORT PFNGLENABLEDRIVERCONTROLQCOMPROC __glewEnableDriverControlQCOM; -GLEW_FUN_EXPORT PFNGLGETDRIVERCONTROLSTRINGQCOMPROC __glewGetDriverControlStringQCOM; -GLEW_FUN_EXPORT PFNGLGETDRIVERCONTROLSQCOMPROC __glewGetDriverControlsQCOM; - -GLEW_FUN_EXPORT PFNGLEXTGETBUFFERPOINTERVQCOMPROC __glewExtGetBufferPointervQCOM; -GLEW_FUN_EXPORT PFNGLEXTGETBUFFERSQCOMPROC __glewExtGetBuffersQCOM; -GLEW_FUN_EXPORT PFNGLEXTGETFRAMEBUFFERSQCOMPROC __glewExtGetFramebuffersQCOM; -GLEW_FUN_EXPORT PFNGLEXTGETRENDERBUFFERSQCOMPROC __glewExtGetRenderbuffersQCOM; -GLEW_FUN_EXPORT PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC __glewExtGetTexLevelParameterivQCOM; -GLEW_FUN_EXPORT PFNGLEXTGETTEXSUBIMAGEQCOMPROC __glewExtGetTexSubImageQCOM; -GLEW_FUN_EXPORT PFNGLEXTGETTEXTURESQCOMPROC __glewExtGetTexturesQCOM; -GLEW_FUN_EXPORT PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC __glewExtTexObjectStateOverrideiQCOM; - -GLEW_FUN_EXPORT PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC __glewExtGetProgramBinarySourceQCOM; -GLEW_FUN_EXPORT PFNGLEXTGETPROGRAMSQCOMPROC __glewExtGetProgramsQCOM; -GLEW_FUN_EXPORT PFNGLEXTGETSHADERSQCOMPROC __glewExtGetShadersQCOM; -GLEW_FUN_EXPORT PFNGLEXTISPROGRAMBINARYQCOMPROC __glewExtIsProgramBinaryQCOM; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC __glewFramebufferFoveationConfigQCOM; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC __glewFramebufferFoveationParametersQCOM; - -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC __glewFramebufferFetchBarrierQCOM; - -GLEW_FUN_EXPORT PFNGLENDTILINGQCOMPROC __glewEndTilingQCOM; -GLEW_FUN_EXPORT PFNGLSTARTTILINGQCOMPROC __glewStartTilingQCOM; - -GLEW_FUN_EXPORT PFNGLALPHAFUNCXPROC __glewAlphaFuncx; -GLEW_FUN_EXPORT PFNGLCLEARCOLORXPROC __glewClearColorx; -GLEW_FUN_EXPORT PFNGLCLEARDEPTHXPROC __glewClearDepthx; -GLEW_FUN_EXPORT PFNGLCOLOR4XPROC __glewColor4x; -GLEW_FUN_EXPORT PFNGLDEPTHRANGEXPROC __glewDepthRangex; -GLEW_FUN_EXPORT PFNGLFOGXPROC __glewFogx; -GLEW_FUN_EXPORT PFNGLFOGXVPROC __glewFogxv; -GLEW_FUN_EXPORT PFNGLFRUSTUMFPROC __glewFrustumf; -GLEW_FUN_EXPORT PFNGLFRUSTUMXPROC __glewFrustumx; -GLEW_FUN_EXPORT PFNGLLIGHTMODELXPROC __glewLightModelx; -GLEW_FUN_EXPORT PFNGLLIGHTMODELXVPROC __glewLightModelxv; -GLEW_FUN_EXPORT PFNGLLIGHTXPROC __glewLightx; -GLEW_FUN_EXPORT PFNGLLIGHTXVPROC __glewLightxv; -GLEW_FUN_EXPORT PFNGLLINEWIDTHXPROC __glewLineWidthx; -GLEW_FUN_EXPORT PFNGLLOADMATRIXXPROC __glewLoadMatrixx; -GLEW_FUN_EXPORT PFNGLMATERIALXPROC __glewMaterialx; -GLEW_FUN_EXPORT PFNGLMATERIALXVPROC __glewMaterialxv; -GLEW_FUN_EXPORT PFNGLMULTMATRIXXPROC __glewMultMatrixx; -GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x; -GLEW_FUN_EXPORT PFNGLNORMAL3XPROC __glewNormal3x; -GLEW_FUN_EXPORT PFNGLORTHOFPROC __glewOrthof; -GLEW_FUN_EXPORT PFNGLORTHOXPROC __glewOrthox; -GLEW_FUN_EXPORT PFNGLPOINTSIZEXPROC __glewPointSizex; -GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx; -GLEW_FUN_EXPORT PFNGLROTATEXPROC __glewRotatex; -GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex; -GLEW_FUN_EXPORT PFNGLSCALEXPROC __glewScalex; -GLEW_FUN_EXPORT PFNGLTEXENVXPROC __glewTexEnvx; -GLEW_FUN_EXPORT PFNGLTEXENVXVPROC __glewTexEnvxv; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERXPROC __glewTexParameterx; -GLEW_FUN_EXPORT PFNGLTRANSLATEXPROC __glewTranslatex; - -GLEW_FUN_EXPORT PFNGLCLIPPLANEFPROC __glewClipPlanef; -GLEW_FUN_EXPORT PFNGLCLIPPLANEXPROC __glewClipPlanex; -GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef; -GLEW_FUN_EXPORT PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex; -GLEW_FUN_EXPORT PFNGLGETFIXEDVPROC __glewGetFixedv; -GLEW_FUN_EXPORT PFNGLGETLIGHTXVPROC __glewGetLightxv; -GLEW_FUN_EXPORT PFNGLGETMATERIALXVPROC __glewGetMaterialxv; -GLEW_FUN_EXPORT PFNGLGETTEXENVXVPROC __glewGetTexEnvxv; -GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXPROC __glewPointParameterx; -GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv; -GLEW_FUN_EXPORT PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES; -GLEW_FUN_EXPORT PFNGLTEXPARAMETERXVPROC __glewTexParameterxv; - -GLEW_FUN_EXPORT PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL; - -GLEW_FUN_EXPORT PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL; -GLEW_FUN_EXPORT PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL; - -GLEW_FUN_EXPORT PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL; - -GLEW_FUN_EXPORT PFNGLGETPROCADDRESSREGALPROC __glewGetProcAddressREGAL; - -GLEW_FUN_EXPORT PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS; -GLEW_FUN_EXPORT PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS; - -GLEW_FUN_EXPORT PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS; -GLEW_FUN_EXPORT PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS; - -GLEW_FUN_EXPORT PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS; -GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS; - -GLEW_FUN_EXPORT PFNGLINTERLEAVEDTEXTURECOORDSETSSGISPROC __glewInterleavedTextureCoordSetsSGIS; -GLEW_FUN_EXPORT PFNGLSELECTTEXTURECOORDSETSGISPROC __glewSelectTextureCoordSetSGIS; -GLEW_FUN_EXPORT PFNGLSELECTTEXTURESGISPROC __glewSelectTextureSGIS; -GLEW_FUN_EXPORT PFNGLSELECTTEXTURETRANSFORMSGISPROC __glewSelectTextureTransformSGIS; - -GLEW_FUN_EXPORT PFNGLMULTISAMPLESUBRECTPOSSGISPROC __glewMultisampleSubRectPosSGIS; - -GLEW_FUN_EXPORT PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS; -GLEW_FUN_EXPORT PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS; - -GLEW_FUN_EXPORT PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS; -GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS; - -GLEW_FUN_EXPORT PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS; -GLEW_FUN_EXPORT PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS; - -GLEW_FUN_EXPORT PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX; -GLEW_FUN_EXPORT PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX; -GLEW_FUN_EXPORT PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX; -GLEW_FUN_EXPORT PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX; -GLEW_FUN_EXPORT PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX; -GLEW_FUN_EXPORT PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX; - -GLEW_FUN_EXPORT PFNGLADDRESSSPACEPROC __glewAddressSpace; -GLEW_FUN_EXPORT PFNGLDATAPIPEPROC __glewDataPipe; - -GLEW_FUN_EXPORT PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX; - -GLEW_FUN_EXPORT PFNGLFOGLAYERSSGIXPROC __glewFogLayersSGIX; -GLEW_FUN_EXPORT PFNGLGETFOGLAYERSSGIXPROC __glewGetFogLayersSGIX; - -GLEW_FUN_EXPORT PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX; - -GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX; -GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX; -GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX; - -GLEW_FUN_EXPORT PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX; - -GLEW_FUN_EXPORT PFNGLIGLOOINTERFACESGIXPROC __glewIglooInterfaceSGIX; - -GLEW_FUN_EXPORT PFNGLALLOCMPEGPREDICTORSSGIXPROC __glewAllocMPEGPredictorsSGIX; -GLEW_FUN_EXPORT PFNGLDELETEMPEGPREDICTORSSGIXPROC __glewDeleteMPEGPredictorsSGIX; -GLEW_FUN_EXPORT PFNGLGENMPEGPREDICTORSSGIXPROC __glewGenMPEGPredictorsSGIX; -GLEW_FUN_EXPORT PFNGLGETMPEGPARAMETERFVSGIXPROC __glewGetMPEGParameterfvSGIX; -GLEW_FUN_EXPORT PFNGLGETMPEGPARAMETERIVSGIXPROC __glewGetMPEGParameterivSGIX; -GLEW_FUN_EXPORT PFNGLGETMPEGPREDICTORSGIXPROC __glewGetMPEGPredictorSGIX; -GLEW_FUN_EXPORT PFNGLGETMPEGQUANTTABLEUBVPROC __glewGetMPEGQuantTableubv; -GLEW_FUN_EXPORT PFNGLISMPEGPREDICTORSGIXPROC __glewIsMPEGPredictorSGIX; -GLEW_FUN_EXPORT PFNGLMPEGPREDICTORSGIXPROC __glewMPEGPredictorSGIX; -GLEW_FUN_EXPORT PFNGLMPEGQUANTTABLEUBVPROC __glewMPEGQuantTableubv; -GLEW_FUN_EXPORT PFNGLSWAPMPEGPREDICTORSSGIXPROC __glewSwapMPEGPredictorsSGIX; - -GLEW_FUN_EXPORT PFNGLGETNONLINLIGHTFVSGIXPROC __glewGetNonlinLightfvSGIX; -GLEW_FUN_EXPORT PFNGLGETNONLINMATERIALFVSGIXPROC __glewGetNonlinMaterialfvSGIX; -GLEW_FUN_EXPORT PFNGLNONLINLIGHTFVSGIXPROC __glewNonlinLightfvSGIX; -GLEW_FUN_EXPORT PFNGLNONLINMATERIALFVSGIXPROC __glewNonlinMaterialfvSGIX; - -GLEW_FUN_EXPORT PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX; - -GLEW_FUN_EXPORT PFNGLDEFORMSGIXPROC __glewDeformSGIX; -GLEW_FUN_EXPORT PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC __glewLoadIdentityDeformationMapSGIX; - -GLEW_FUN_EXPORT PFNGLMESHBREADTHSGIXPROC __glewMeshBreadthSGIX; -GLEW_FUN_EXPORT PFNGLMESHSTRIDESGIXPROC __glewMeshStrideSGIX; - -GLEW_FUN_EXPORT PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX; - -GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX; -GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX; -GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX; -GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX; - -GLEW_FUN_EXPORT PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX; - -GLEW_FUN_EXPORT PFNGLGETVECTOROPERATIONSGIXPROC __glewGetVectorOperationSGIX; -GLEW_FUN_EXPORT PFNGLVECTOROPERATIONSGIXPROC __glewVectorOperationSGIX; - -GLEW_FUN_EXPORT PFNGLAREVERTEXARRAYSRESIDENTSGIXPROC __glewAreVertexArraysResidentSGIX; -GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYSGIXPROC __glewBindVertexArraySGIX; -GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSSGIXPROC __glewDeleteVertexArraysSGIX; -GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSSGIXPROC __glewGenVertexArraysSGIX; -GLEW_FUN_EXPORT PFNGLISVERTEXARRAYSGIXPROC __glewIsVertexArraySGIX; -GLEW_FUN_EXPORT PFNGLPRIORITIZEVERTEXARRAYSSGIXPROC __glewPrioritizeVertexArraysSGIX; - -GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI; -GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI; -GLEW_FUN_EXPORT PFNGLCOLORTABLESGIPROC __glewColorTableSGI; -GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI; -GLEW_FUN_EXPORT PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI; - -GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVSGIPROC __glewGetPixelTransformParameterfvSGI; -GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVSGIPROC __glewGetPixelTransformParameterivSGI; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFSGIPROC __glewPixelTransformParameterfSGI; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVSGIPROC __glewPixelTransformParameterfvSGI; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERISGIPROC __glewPixelTransformParameteriSGI; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVSGIPROC __glewPixelTransformParameterivSGI; -GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMSGIPROC __glewPixelTransformSGI; - -GLEW_FUN_EXPORT PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX; - -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN; -GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN; - -GLEW_FUN_EXPORT PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN; - -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN; - -GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN; -GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN; -GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN; -GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN; - -GLEW_FUN_EXPORT PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2_1; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_3; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_4; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_5; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_0; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_1; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_0; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_1; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_2; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_3; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_0; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_1; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_2; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_3; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_4; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_5; -GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_6; -GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer; -GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_blend_minmax_factor; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_compressed_3DC_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_compressed_ATC_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_conservative_depth; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_debug_output; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_depth_clamp_separate; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_draw_buffers_blend; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_framebuffer_sample_positions; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gcn_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_half_float; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_int16; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_int64; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_interleaved_elements; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_multi_draw_indirect; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_name_gen_delete; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_occlusion_query_event; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_performance_monitor; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_pinned_memory; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_program_binary_Z400; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_query_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sample_positions; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_seamless_cubemap_per_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_atomic_counter_ops; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_ballot; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_explicit_vertex_parameter; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_export; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_value_export; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_trinary_minmax; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sparse_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_stencil_operation_extended; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_gather_bias_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_texture4; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback3_lines_triangles; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback4; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_layer; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_tessellator; -GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_viewport_index; -GLEW_VAR_EXPORT GLboolean __GLEW_ANDROID_extension_pack_es31a; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_depth_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_blit; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_instanced_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_pack_reverse_row_order; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_program_binary; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt1; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt3; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt5; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_usage; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_timer_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_translated_shader_source; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_aux_depth_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_clip_distance; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_color_buffer_packed_float; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_copy_texture_levels; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_fence; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_float_pixels; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_flush_buffer_range; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_framebuffer_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_object_purgeable; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_pixel_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_rgb_422; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_row_bytes; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_specular_vector; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_sync; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_2D_limited_npot; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_format_BGRA8888; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_max_level; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_packed_float; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_range; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_transform_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_object; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_range; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_program_evaluators; -GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_ycbcr_422; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES2_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_1_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_2_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_arrays_of_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_base_instance; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_bindless_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_blend_func_extended; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_buffer_storage; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cl_event; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clip_control; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compressed_texture_pixel_storage; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_variable_group_size; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conditional_render_inverted; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conservative_depth; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_image; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cull_distance; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_debug_output; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_buffer_float; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_derivative_control; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_direct_state_access; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers_blend; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_elements_base_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_indirect; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_instanced; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_enhanced_layouts; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_attrib_location; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_uniform_location; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_coord_conventions; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_layer_viewport; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program_shadow; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader_interlock; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_no_attachments; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_sRGB; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_geometry_shader4; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_program_binary; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_texture_sub_image; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gl_spirv; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader5; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_fp64; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_int64; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_indirect_parameters; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_instanced_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query2; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_invalidate_subdata; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_alignment; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_range; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_bind; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_draw_indirect; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query2; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_parallel_shader_compile; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pipeline_statistics_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pixel_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_polygon_offset_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_post_depth_coverage; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_program_interface_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_provoking_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_query_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robust_buffer_access_behavior; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_application_isolation; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_share_group_isolation; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_locations; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_shading; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sampler_objects; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cube_map; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cubemap_per_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_separate_shader_objects; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counter_ops; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counters; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_ballot; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_bit_encoding; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_clock; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_draw_parameters; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_group_vote; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_load_store; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_size; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_precision; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_stencil_export; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_storage_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_subroutine; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_image_samples; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_viewport_layer_array; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_100; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_420pack; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_include; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_packing; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture2; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_spirv_extensions; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_stencil_texturing; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sync; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_tessellation_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_barrier; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_border_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object_rgb32; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_range; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_bptc; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_rgtc; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map_array; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_add; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_combine; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_crossbar; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_dot3; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_filter_anisotropic; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_filter_minmax; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_gather; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_levels; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rg; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rgb10_a2ui; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_stencil8; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_swizzle; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_view; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_timer_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback2; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback3; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback_instanced; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback_overflow_query; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transpose_matrix; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_uniform_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_bgra; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_64bit; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_binding; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_blend; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_program; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_10f_11f_11f_rev; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_viewport_array; -GLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos; -GLEW_VAR_EXPORT GLboolean __GLEW_ARM_mali_program_binary; -GLEW_VAR_EXPORT GLboolean __GLEW_ARM_mali_shader_binary; -GLEW_VAR_EXPORT GLboolean __GLEW_ARM_rgba8; -GLEW_VAR_EXPORT GLboolean __GLEW_ARM_shader_framebuffer_fetch; -GLEW_VAR_EXPORT GLboolean __GLEW_ARM_shader_framebuffer_fetch_depth_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_point_sprites; -GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_combine3; -GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_route; -GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_vertex_shader_output_point_size; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_draw_buffers; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_element_array; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_envmap_bumpmap; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_fragment_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_map_object_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_meminfo; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_pn_triangles; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_separate_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_shader_texture_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_text_fragment_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_compression_3dc; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_env_combine3; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_float; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_mirror_once; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_array_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_attrib_array_object; -GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_streams; -GLEW_VAR_EXPORT GLboolean __GLEW_EGL_KHR_context_flush_control; -GLEW_VAR_EXPORT GLboolean __GLEW_EGL_NV_robustness_video_memory_purge; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_422_pixels; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_Cg_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_EGL_image_array; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_YUV_target; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_abgr; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_base_instance; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bgra; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bindable_uniform; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_color; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_equation_separate; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_extended; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_separate; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_logic_op; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_minmax; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_subtract; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_buffer_storage; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clear_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_cull_distance; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_volume_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cmyka; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_buffer_float; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_buffer_half_float; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_subtable; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compiled_vertex_array; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compressed_ETC1_RGB8_sub_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_conservative_depth; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_convolution; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_coordinate_frame; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_image; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cull_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_label; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_marker; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_depth_bounds_test; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_direct_state_access; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_discard_framebuffer; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers2; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers_indexed; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_elements_base_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_instanced; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_range_elements; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_external_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_float_blend; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fog_coord; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_frag_depth; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fragment_lighting; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_blit; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample_blit_scaled; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_sRGB; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_point_size; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader4; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_program_parameters; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader4; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader5; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_histogram; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_array_formats; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_func; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_material; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_instanced_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_light_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_map_buffer_range; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_memory_object; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_memory_object_fd; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_memory_object_win32; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_misc_attribute; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_indirect; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multiple_textures; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisampled_render_to_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisampled_render_to_texture2; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multiview_draw_buffers; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_depth_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_float; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_pixels; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_paletted_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform_color_table; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_point_parameters; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_post_depth_coverage; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_provoking_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pvrtc_sRGB; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_raster_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_read_format_bgra; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_render_snorm; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_rescale_normal; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sRGB; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sRGB_write_control; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_semaphore; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_semaphore_fd; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_semaphore_win32; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_shader_objects; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_specular_color; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_framebuffer_fetch; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_group_vote; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_formatted; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_store; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_implicit_conversions; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_integer_mix; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_io_blocks; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_non_constant_global_initializers; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_pixel_local_storage; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_pixel_local_storage2; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_texture_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_samplers; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shared_texture_palette; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sparse_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sparse_texture2; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_clear_tag; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_two_side; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_wrap; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_subtexture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture3D; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_array; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_astc_decode_mode; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_bptc; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_dxt1; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_latc; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_rgtc; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_s3tc; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map_array; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_edge_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_add; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_combine; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_dot3; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_anisotropic; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_minmax; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_format_BGRA8888; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_integer; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_lod_bias; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_mirror_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_norm16; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_object; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_perturb_normal; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rectangle; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rg; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_R8; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_RG8; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_decode; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_shared_exponent; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_snorm; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_storage; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_swizzle; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_type_2_10_10_10_REV; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_view; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_timer_query; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_transform_feedback; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_unpack_subimage; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_bgra; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_setXXX; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_attrib_64bit; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_weighting; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_win32_keyed_mutex; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_window_rectangles; -GLEW_VAR_EXPORT GLboolean __GLEW_EXT_x11_sync_object; -GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_frame_terminator; -GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_string_marker; -GLEW_VAR_EXPORT GLboolean __GLEW_HP_convolution_border_modes; -GLEW_VAR_EXPORT GLboolean __GLEW_HP_image_transform; -GLEW_VAR_EXPORT GLboolean __GLEW_HP_occlusion_test; -GLEW_VAR_EXPORT GLboolean __GLEW_HP_texture_lighting; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_cull_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_multimode_draw_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_rasterpos_clip; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_static_data; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_texture_mirrored_repeat; -GLEW_VAR_EXPORT GLboolean __GLEW_IBM_vertex_array_lists; -GLEW_VAR_EXPORT GLboolean __GLEW_INGR_color_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_INGR_interlace_read; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_conservative_rasterization; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_fragment_shader_ordering; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_framebuffer_CMAA; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_map_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_performance_query; -GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_blend_equation_advanced; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_blend_equation_advanced_coherent; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_context_flush_control; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_debug; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_no_error; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_parallel_shader_compile; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_robust_buffer_access_behavior; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_robustness; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_hdr; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_ldr; -GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_sliced_3d; -GLEW_VAR_EXPORT GLboolean __GLEW_KTX_buffer_region; -GLEW_VAR_EXPORT GLboolean __GLEW_MESAX_texture_stack; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_pack_invert; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_resize_buffers; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_shader_integer_functions; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos; -GLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_NVX_blend_equation_advanced_multi_draw_buffers; -GLEW_VAR_EXPORT GLboolean __GLEW_NVX_conditional_render; -GLEW_VAR_EXPORT GLboolean __GLEW_NVX_gpu_memory_info; -GLEW_VAR_EXPORT GLboolean __GLEW_NVX_linked_gpu_multicast; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_3dvision_settings; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_EGL_stream_consumer_external; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_alpha_to_coverage_dither_control; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_bgr; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect_count; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced_coherent; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_minmax_factor; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_clip_space_w_scaling; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_command_list; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_compute_program5; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_conditional_render; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster_dilate; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster_pre_snap_triangles; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_image; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_deep_texture3D; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_buffer_float; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_range_unclamped; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_buffers; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_instanced; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_vulkan_image; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_attrib_location; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fbo_color_attachments; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fence; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fill_rectangle; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_float_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fog_distance; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_coverage_to_color; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program_option; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_shader_interlock; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_blit; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_mixed_samples; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample_coverage; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_generate_mipmap_sRGB; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_program4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader_passthrough; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_multicast; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5_mem_extended; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program_fp64; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_shader5; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_image_formats; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_instanced_arrays; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_internalformat_sample_query; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_light_max_exponent; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_coverage; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_filter_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_non_square_matrices; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_occlusion_query; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_pack_subimage; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_depth_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_float; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_float_linear; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_path_rendering; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_path_rendering_shared_edge; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_data_range; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_platform_binary; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_point_sprite; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_polygon_mode; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_present_video; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_read_depth; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_read_depth_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_read_stencil; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_robustness_video_memory_purge; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_sRGB_formats; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_sample_locations; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_sample_mask_override_coverage; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_counters; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_float; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_float64; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_fp16_vector; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_int64; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_buffer_load; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_noperspective_interpolation; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_storage_buffer_object; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_group; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_shuffle; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shadow_samplers_array; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_shadow_samplers_cube; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_stereo_view_rendering; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_tessellation_program5; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_array; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_barrier; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_border_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_latc; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_s3tc; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_s3tc_update; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_vtc; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_env_combine4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_expand_normal; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_npot_2D_mipmap; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle_compressed; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader3; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_uniform_buffer_unified_memory; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vdpau_interop; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_attrib_integer_64bit; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_buffer_unified_memory; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program1_1; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2_option; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program3; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program4; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_video_capture; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_array; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_array2; -GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_swizzle; -GLEW_VAR_EXPORT GLboolean __GLEW_OES_byte_coordinates; -GLEW_VAR_EXPORT GLboolean __GLEW_OML_interlace; -GLEW_VAR_EXPORT GLboolean __GLEW_OML_resample; -GLEW_VAR_EXPORT GLboolean __GLEW_OML_subsample; -GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview; -GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview2; -GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview_multisampled_render_to_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_PGI_misc_hints; -GLEW_VAR_EXPORT GLboolean __GLEW_PGI_vertex_hints; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_alpha_test; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_binning_control; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_driver_control; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_extended_get; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_extended_get2; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_framebuffer_foveated; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_perfmon_global_mode; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_shader_framebuffer_fetch_noncoherent; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_tiled_rendering; -GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_writeonly_rendering; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_0_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_1_compatibility; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_enable; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_error_string; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_extension_query; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_log; -GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_proc_address; -GLEW_VAR_EXPORT GLboolean __GLEW_REND_screen_coordinates; -GLEW_VAR_EXPORT GLboolean __GLEW_S3_s3tc; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_clip_band_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_color_range; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_detail_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_fog_function; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_generate_mipmap; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_line_texgen; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multitexture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_pixel_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_point_line_texgen; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_shared_multisample; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_sharpen_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture4D; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_border_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_edge_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_filter4; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_select; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_histogram; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_pixel; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_bali_g_instruments; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_bali_r_instruments; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_bali_timer_instruments; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_alpha_minmax; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_cadd; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_cmultiply; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_calligraphic_fragment; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_clipmap; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_color_matrix_accuracy; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_color_table_index_mode; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_complex_polar; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_convolution_accuracy; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_cube_map; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_cylinder_texgen; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_datapipe; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_decimation; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_pass_instrument; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_dvc; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_flush_raster; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_blend; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_factor_to_alpha; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_layers; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_offset; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_patchy; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_scale; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_lighting_space; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_specular_lighting; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragments_instrument; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_framezoom; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_icc_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_igloo_interface; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_image_compression; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_impact_pixel_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_instrument_error; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_interlace; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ir_instrument1; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_line_quality_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_list_priority; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_mpeg1; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_mpeg2; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_nonlinear_lighting_pervertex; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_nurbs_eval; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_occlusion_instrument; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_packed_6bytes; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_bits; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_lod; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_tiles; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_polynomial_ffd; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_quad_mesh; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_reference_plane; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_resample; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_scalebias_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow_ambient; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_slim; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_spotlight_cutoff; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_sprite; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_subdiv_patch; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_subsample; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_tag_sample_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_add_env; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_coordinate_clamp; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_lod_bias; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_mipmap_anisotropic; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_multi_buffer; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_phase; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_range; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_scale_bias; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_supersample; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vector_ops; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_array_object; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip_hint; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb_subsample; -GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcba; -GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_matrix; -GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_table; -GLEW_VAR_EXPORT GLboolean __GLEW_SGI_complex; -GLEW_VAR_EXPORT GLboolean __GLEW_SGI_complex_type; -GLEW_VAR_EXPORT GLboolean __GLEW_SGI_fft; -GLEW_VAR_EXPORT GLboolean __GLEW_SGI_texture_color_table; -GLEW_VAR_EXPORT GLboolean __GLEW_SUNX_constant_data; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_convolution_border_modes; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_global_alpha; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_mesh_array; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_read_video_pixels; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_slice_accum; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_triangle_list; -GLEW_VAR_EXPORT GLboolean __GLEW_SUN_vertex; -GLEW_VAR_EXPORT GLboolean __GLEW_WIN_phong_shading; -GLEW_VAR_EXPORT GLboolean __GLEW_WIN_scene_markerXXX; -GLEW_VAR_EXPORT GLboolean __GLEW_WIN_specular_fog; -GLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint; -/* ------------------------------------------------------------------------- */ - -/* error codes */ -#define GLEW_OK 0 -#define GLEW_NO_ERROR 0 -#define GLEW_ERROR_NO_GL_VERSION 1 /* missing GL version */ -#define GLEW_ERROR_GL_VERSION_10_ONLY 2 /* Need at least OpenGL 1.1 */ -#define GLEW_ERROR_GLX_VERSION_11_ONLY 3 /* Need at least GLX 1.2 */ -#define GLEW_ERROR_NO_GLX_DISPLAY 4 /* Need GLX display for GLX support */ - -/* string codes */ -#define GLEW_VERSION 1 -#define GLEW_VERSION_MAJOR 2 -#define GLEW_VERSION_MINOR 3 -#define GLEW_VERSION_MICRO 4 - -/* ------------------------------------------------------------------------- */ - -/* GLEW version info */ - -/* -VERSION 2.1.0 -VERSION_MAJOR 2 -VERSION_MINOR 1 -VERSION_MICRO 0 -*/ - -/* API */ -GLEWAPI GLenum GLEWAPIENTRY glewInit (void); -GLEWAPI GLenum GLEWAPIENTRY glewContextInit (void); -GLEWAPI GLboolean GLEWAPIENTRY glewIsSupported (const char *name); -#define glewIsExtensionSupported(x) glewIsSupported(x) - -#ifndef GLEW_GET_VAR -#define GLEW_GET_VAR(x) (*(const GLboolean*)&x) -#endif - -#ifndef GLEW_GET_FUN -#define GLEW_GET_FUN(x) x -#endif - -GLEWAPI GLboolean glewExperimental; -GLEWAPI GLboolean GLEWAPIENTRY glewGetExtension (const char *name); -GLEWAPI const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error); -GLEWAPI const GLubyte * GLEWAPIENTRY glewGetString (GLenum name); - -#ifdef __cplusplus -} -#endif - -#ifdef GLEW_APIENTRY_DEFINED -#undef GLEW_APIENTRY_DEFINED -#undef APIENTRY -#endif - -#ifdef GLEW_CALLBACK_DEFINED -#undef GLEW_CALLBACK_DEFINED -#undef CALLBACK -#endif - -#ifdef GLEW_WINGDIAPI_DEFINED -#undef GLEW_WINGDIAPI_DEFINED -#undef WINGDIAPI -#endif - -#undef GLAPI -/* #undef GLEWAPI */ - -#endif /* __glew_h__ */ diff --git a/src/engine/external/glew/GL/glxew.h b/src/engine/external/glew/GL/glxew.h deleted file mode 100644 index 7e39c2fd98..0000000000 --- a/src/engine/external/glew/GL/glxew.h +++ /dev/null @@ -1,1775 +0,0 @@ -/* -** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2017, Nigel Stewart -** Copyright (C) 2002-2008, Milan Ikits -** Copyright (C) 2002-2008, Marcelo E. Magallon -** Copyright (C) 2002, Lev Povalahev -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are met: -** -** * Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** * The name of the author may be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -** THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Mesa 3-D graphics library - * Version: 7.0 - * - * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* -** Copyright (c) 2007 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -#ifndef __glxew_h__ -#define __glxew_h__ -#define __GLXEW_H__ - -#ifdef __glxext_h_ -#error glxext.h included before glxew.h -#endif - -#if defined(GLX_H) || defined(__GLX_glx_h__) || defined(__glx_h__) -#error glx.h included before glxew.h -#endif - -#define __glxext_h_ - -#define GLX_H -#define __GLX_glx_h__ -#define __glx_h__ - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* ---------------------------- GLX_VERSION_1_0 --------------------------- */ - -#ifndef GLX_VERSION_1_0 -#define GLX_VERSION_1_0 1 - -#define GLX_USE_GL 1 -#define GLX_BUFFER_SIZE 2 -#define GLX_LEVEL 3 -#define GLX_RGBA 4 -#define GLX_DOUBLEBUFFER 5 -#define GLX_STEREO 6 -#define GLX_AUX_BUFFERS 7 -#define GLX_RED_SIZE 8 -#define GLX_GREEN_SIZE 9 -#define GLX_BLUE_SIZE 10 -#define GLX_ALPHA_SIZE 11 -#define GLX_DEPTH_SIZE 12 -#define GLX_STENCIL_SIZE 13 -#define GLX_ACCUM_RED_SIZE 14 -#define GLX_ACCUM_GREEN_SIZE 15 -#define GLX_ACCUM_BLUE_SIZE 16 -#define GLX_ACCUM_ALPHA_SIZE 17 -#define GLX_BAD_SCREEN 1 -#define GLX_BAD_ATTRIBUTE 2 -#define GLX_NO_EXTENSION 3 -#define GLX_BAD_VISUAL 4 -#define GLX_BAD_CONTEXT 5 -#define GLX_BAD_VALUE 6 -#define GLX_BAD_ENUM 7 - -typedef XID GLXDrawable; -typedef XID GLXPixmap; -#ifdef __sun -typedef struct __glXContextRec *GLXContext; -#else -typedef struct __GLXcontextRec *GLXContext; -#endif - -typedef unsigned int GLXVideoDeviceNV; - -extern Bool glXQueryExtension (Display *dpy, int *errorBase, int *eventBase); -extern Bool glXQueryVersion (Display *dpy, int *major, int *minor); -extern int glXGetConfig (Display *dpy, XVisualInfo *vis, int attrib, int *value); -extern XVisualInfo* glXChooseVisual (Display *dpy, int screen, int *attribList); -extern GLXPixmap glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap); -extern void glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix); -extern GLXContext glXCreateContext (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct); -extern void glXDestroyContext (Display *dpy, GLXContext ctx); -extern Bool glXIsDirect (Display *dpy, GLXContext ctx); -extern void glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, GLulong mask); -extern Bool glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx); -extern GLXContext glXGetCurrentContext (void); -extern GLXDrawable glXGetCurrentDrawable (void); -extern void glXWaitGL (void); -extern void glXWaitX (void); -extern void glXSwapBuffers (Display *dpy, GLXDrawable drawable); -extern void glXUseXFont (Font font, int first, int count, int listBase); - -#define GLXEW_VERSION_1_0 GLXEW_GET_VAR(__GLXEW_VERSION_1_0) - -#endif /* GLX_VERSION_1_0 */ - -/* ---------------------------- GLX_VERSION_1_1 --------------------------- */ - -#ifndef GLX_VERSION_1_1 -#define GLX_VERSION_1_1 - -#define GLX_VENDOR 0x1 -#define GLX_VERSION 0x2 -#define GLX_EXTENSIONS 0x3 - -extern const char* glXQueryExtensionsString (Display *dpy, int screen); -extern const char* glXGetClientString (Display *dpy, int name); -extern const char* glXQueryServerString (Display *dpy, int screen, int name); - -#define GLXEW_VERSION_1_1 GLXEW_GET_VAR(__GLXEW_VERSION_1_1) - -#endif /* GLX_VERSION_1_1 */ - -/* ---------------------------- GLX_VERSION_1_2 ---------------------------- */ - -#ifndef GLX_VERSION_1_2 -#define GLX_VERSION_1_2 1 - -typedef Display* ( * PFNGLXGETCURRENTDISPLAYPROC) (void); - -#define glXGetCurrentDisplay GLXEW_GET_FUN(__glewXGetCurrentDisplay) - -#define GLXEW_VERSION_1_2 GLXEW_GET_VAR(__GLXEW_VERSION_1_2) - -#endif /* GLX_VERSION_1_2 */ - -/* ---------------------------- GLX_VERSION_1_3 ---------------------------- */ - -#ifndef GLX_VERSION_1_3 -#define GLX_VERSION_1_3 1 - -#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 -#define GLX_RGBA_BIT 0x00000001 -#define GLX_WINDOW_BIT 0x00000001 -#define GLX_COLOR_INDEX_BIT 0x00000002 -#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 -#define GLX_PIXMAP_BIT 0x00000002 -#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 -#define GLX_PBUFFER_BIT 0x00000004 -#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 -#define GLX_AUX_BUFFERS_BIT 0x00000010 -#define GLX_CONFIG_CAVEAT 0x20 -#define GLX_DEPTH_BUFFER_BIT 0x00000020 -#define GLX_X_VISUAL_TYPE 0x22 -#define GLX_TRANSPARENT_TYPE 0x23 -#define GLX_TRANSPARENT_INDEX_VALUE 0x24 -#define GLX_TRANSPARENT_RED_VALUE 0x25 -#define GLX_TRANSPARENT_GREEN_VALUE 0x26 -#define GLX_TRANSPARENT_BLUE_VALUE 0x27 -#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 -#define GLX_STENCIL_BUFFER_BIT 0x00000040 -#define GLX_ACCUM_BUFFER_BIT 0x00000080 -#define GLX_NONE 0x8000 -#define GLX_SLOW_CONFIG 0x8001 -#define GLX_TRUE_COLOR 0x8002 -#define GLX_DIRECT_COLOR 0x8003 -#define GLX_PSEUDO_COLOR 0x8004 -#define GLX_STATIC_COLOR 0x8005 -#define GLX_GRAY_SCALE 0x8006 -#define GLX_STATIC_GRAY 0x8007 -#define GLX_TRANSPARENT_RGB 0x8008 -#define GLX_TRANSPARENT_INDEX 0x8009 -#define GLX_VISUAL_ID 0x800B -#define GLX_SCREEN 0x800C -#define GLX_NON_CONFORMANT_CONFIG 0x800D -#define GLX_DRAWABLE_TYPE 0x8010 -#define GLX_RENDER_TYPE 0x8011 -#define GLX_X_RENDERABLE 0x8012 -#define GLX_FBCONFIG_ID 0x8013 -#define GLX_RGBA_TYPE 0x8014 -#define GLX_COLOR_INDEX_TYPE 0x8015 -#define GLX_MAX_PBUFFER_WIDTH 0x8016 -#define GLX_MAX_PBUFFER_HEIGHT 0x8017 -#define GLX_MAX_PBUFFER_PIXELS 0x8018 -#define GLX_PRESERVED_CONTENTS 0x801B -#define GLX_LARGEST_PBUFFER 0x801C -#define GLX_WIDTH 0x801D -#define GLX_HEIGHT 0x801E -#define GLX_EVENT_MASK 0x801F -#define GLX_DAMAGED 0x8020 -#define GLX_SAVED 0x8021 -#define GLX_WINDOW 0x8022 -#define GLX_PBUFFER 0x8023 -#define GLX_PBUFFER_HEIGHT 0x8040 -#define GLX_PBUFFER_WIDTH 0x8041 -#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 -#define GLX_DONT_CARE 0xFFFFFFFF - -typedef XID GLXFBConfigID; -typedef XID GLXPbuffer; -typedef XID GLXWindow; -typedef struct __GLXFBConfigRec *GLXFBConfig; - -typedef struct { - int event_type; - int draw_type; - unsigned long serial; - Bool send_event; - Display *display; - GLXDrawable drawable; - unsigned int buffer_mask; - unsigned int aux_buffer; - int x, y; - int width, height; - int count; -} GLXPbufferClobberEvent; -typedef union __GLXEvent { - GLXPbufferClobberEvent glxpbufferclobber; - long pad[24]; -} GLXEvent; - -typedef GLXFBConfig* ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); -typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); -typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list); -typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list); -typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list); -typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf); -typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap); -typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win); -typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void); -typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value); -typedef GLXFBConfig* ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements); -typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask); -typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config); -typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx); -typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); -typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value); -typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask); - -#define glXChooseFBConfig GLXEW_GET_FUN(__glewXChooseFBConfig) -#define glXCreateNewContext GLXEW_GET_FUN(__glewXCreateNewContext) -#define glXCreatePbuffer GLXEW_GET_FUN(__glewXCreatePbuffer) -#define glXCreatePixmap GLXEW_GET_FUN(__glewXCreatePixmap) -#define glXCreateWindow GLXEW_GET_FUN(__glewXCreateWindow) -#define glXDestroyPbuffer GLXEW_GET_FUN(__glewXDestroyPbuffer) -#define glXDestroyPixmap GLXEW_GET_FUN(__glewXDestroyPixmap) -#define glXDestroyWindow GLXEW_GET_FUN(__glewXDestroyWindow) -#define glXGetCurrentReadDrawable GLXEW_GET_FUN(__glewXGetCurrentReadDrawable) -#define glXGetFBConfigAttrib GLXEW_GET_FUN(__glewXGetFBConfigAttrib) -#define glXGetFBConfigs GLXEW_GET_FUN(__glewXGetFBConfigs) -#define glXGetSelectedEvent GLXEW_GET_FUN(__glewXGetSelectedEvent) -#define glXGetVisualFromFBConfig GLXEW_GET_FUN(__glewXGetVisualFromFBConfig) -#define glXMakeContextCurrent GLXEW_GET_FUN(__glewXMakeContextCurrent) -#define glXQueryContext GLXEW_GET_FUN(__glewXQueryContext) -#define glXQueryDrawable GLXEW_GET_FUN(__glewXQueryDrawable) -#define glXSelectEvent GLXEW_GET_FUN(__glewXSelectEvent) - -#define GLXEW_VERSION_1_3 GLXEW_GET_VAR(__GLXEW_VERSION_1_3) - -#endif /* GLX_VERSION_1_3 */ - -/* ---------------------------- GLX_VERSION_1_4 ---------------------------- */ - -#ifndef GLX_VERSION_1_4 -#define GLX_VERSION_1_4 1 - -#define GLX_SAMPLE_BUFFERS 100000 -#define GLX_SAMPLES 100001 - -extern void ( * glXGetProcAddress (const GLubyte *procName)) (void); - -#define GLXEW_VERSION_1_4 GLXEW_GET_VAR(__GLXEW_VERSION_1_4) - -#endif /* GLX_VERSION_1_4 */ - -/* -------------------------- GLX_3DFX_multisample ------------------------- */ - -#ifndef GLX_3DFX_multisample -#define GLX_3DFX_multisample 1 - -#define GLX_SAMPLE_BUFFERS_3DFX 0x8050 -#define GLX_SAMPLES_3DFX 0x8051 - -#define GLXEW_3DFX_multisample GLXEW_GET_VAR(__GLXEW_3DFX_multisample) - -#endif /* GLX_3DFX_multisample */ - -/* ------------------------ GLX_AMD_gpu_association ------------------------ */ - -#ifndef GLX_AMD_gpu_association -#define GLX_AMD_gpu_association 1 - -#define GLX_GPU_VENDOR_AMD 0x1F00 -#define GLX_GPU_RENDERER_STRING_AMD 0x1F01 -#define GLX_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 -#define GLX_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 -#define GLX_GPU_RAM_AMD 0x21A3 -#define GLX_GPU_CLOCK_AMD 0x21A4 -#define GLX_GPU_NUM_PIPES_AMD 0x21A5 -#define GLX_GPU_NUM_SIMD_AMD 0x21A6 -#define GLX_GPU_NUM_RB_AMD 0x21A7 -#define GLX_GPU_NUM_SPI_AMD 0x21A8 - -typedef void ( * PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC) (GLXContext dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC) (unsigned int id, GLXContext share_list); -typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (unsigned int id, GLXContext share_context, const int* attribList); -typedef Bool ( * PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC) (GLXContext ctx); -typedef unsigned int ( * PFNGLXGETCONTEXTGPUIDAMDPROC) (GLXContext ctx); -typedef GLXContext ( * PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); -typedef unsigned int ( * PFNGLXGETGPUIDSAMDPROC) (unsigned int maxCount, unsigned int* ids); -typedef int ( * PFNGLXGETGPUINFOAMDPROC) (unsigned int id, int property, GLenum dataType, unsigned int size, void* data); -typedef Bool ( * PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (GLXContext ctx); - -#define glXBlitContextFramebufferAMD GLXEW_GET_FUN(__glewXBlitContextFramebufferAMD) -#define glXCreateAssociatedContextAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAMD) -#define glXCreateAssociatedContextAttribsAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAttribsAMD) -#define glXDeleteAssociatedContextAMD GLXEW_GET_FUN(__glewXDeleteAssociatedContextAMD) -#define glXGetContextGPUIDAMD GLXEW_GET_FUN(__glewXGetContextGPUIDAMD) -#define glXGetCurrentAssociatedContextAMD GLXEW_GET_FUN(__glewXGetCurrentAssociatedContextAMD) -#define glXGetGPUIDsAMD GLXEW_GET_FUN(__glewXGetGPUIDsAMD) -#define glXGetGPUInfoAMD GLXEW_GET_FUN(__glewXGetGPUInfoAMD) -#define glXMakeAssociatedContextCurrentAMD GLXEW_GET_FUN(__glewXMakeAssociatedContextCurrentAMD) - -#define GLXEW_AMD_gpu_association GLXEW_GET_VAR(__GLXEW_AMD_gpu_association) - -#endif /* GLX_AMD_gpu_association */ - -/* --------------------- GLX_ARB_context_flush_control --------------------- */ - -#ifndef GLX_ARB_context_flush_control -#define GLX_ARB_context_flush_control 1 - -#define GLXEW_ARB_context_flush_control GLXEW_GET_VAR(__GLXEW_ARB_context_flush_control) - -#endif /* GLX_ARB_context_flush_control */ - -/* ------------------------- GLX_ARB_create_context ------------------------ */ - -#ifndef GLX_ARB_create_context -#define GLX_ARB_create_context 1 - -#define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001 -#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 -#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 -#define GLX_CONTEXT_FLAGS_ARB 0x2094 - -typedef GLXContext ( * PFNGLXCREATECONTEXTATTRIBSARBPROC) (Display* dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list); - -#define glXCreateContextAttribsARB GLXEW_GET_FUN(__glewXCreateContextAttribsARB) - -#define GLXEW_ARB_create_context GLXEW_GET_VAR(__GLXEW_ARB_create_context) - -#endif /* GLX_ARB_create_context */ - -/* -------------------- GLX_ARB_create_context_no_error -------------------- */ - -#ifndef GLX_ARB_create_context_no_error -#define GLX_ARB_create_context_no_error 1 - -#define GLXEW_ARB_create_context_no_error GLXEW_GET_VAR(__GLXEW_ARB_create_context_no_error) - -#endif /* GLX_ARB_create_context_no_error */ - -/* --------------------- GLX_ARB_create_context_profile -------------------- */ - -#ifndef GLX_ARB_create_context_profile -#define GLX_ARB_create_context_profile 1 - -#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 -#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 -#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126 - -#define GLXEW_ARB_create_context_profile GLXEW_GET_VAR(__GLXEW_ARB_create_context_profile) - -#endif /* GLX_ARB_create_context_profile */ - -/* ------------------- GLX_ARB_create_context_robustness ------------------- */ - -#ifndef GLX_ARB_create_context_robustness -#define GLX_ARB_create_context_robustness 1 - -#define GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 -#define GLX_LOSE_CONTEXT_ON_RESET_ARB 0x8252 -#define GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 -#define GLX_NO_RESET_NOTIFICATION_ARB 0x8261 - -#define GLXEW_ARB_create_context_robustness GLXEW_GET_VAR(__GLXEW_ARB_create_context_robustness) - -#endif /* GLX_ARB_create_context_robustness */ - -/* ------------------------- GLX_ARB_fbconfig_float ------------------------ */ - -#ifndef GLX_ARB_fbconfig_float -#define GLX_ARB_fbconfig_float 1 - -#define GLX_RGBA_FLOAT_BIT_ARB 0x00000004 -#define GLX_RGBA_FLOAT_TYPE_ARB 0x20B9 - -#define GLXEW_ARB_fbconfig_float GLXEW_GET_VAR(__GLXEW_ARB_fbconfig_float) - -#endif /* GLX_ARB_fbconfig_float */ - -/* ------------------------ GLX_ARB_framebuffer_sRGB ----------------------- */ - -#ifndef GLX_ARB_framebuffer_sRGB -#define GLX_ARB_framebuffer_sRGB 1 - -#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2 - -#define GLXEW_ARB_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_ARB_framebuffer_sRGB) - -#endif /* GLX_ARB_framebuffer_sRGB */ - -/* ------------------------ GLX_ARB_get_proc_address ----------------------- */ - -#ifndef GLX_ARB_get_proc_address -#define GLX_ARB_get_proc_address 1 - -extern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void); - -#define GLXEW_ARB_get_proc_address GLXEW_GET_VAR(__GLXEW_ARB_get_proc_address) - -#endif /* GLX_ARB_get_proc_address */ - -/* -------------------------- GLX_ARB_multisample -------------------------- */ - -#ifndef GLX_ARB_multisample -#define GLX_ARB_multisample 1 - -#define GLX_SAMPLE_BUFFERS_ARB 100000 -#define GLX_SAMPLES_ARB 100001 - -#define GLXEW_ARB_multisample GLXEW_GET_VAR(__GLXEW_ARB_multisample) - -#endif /* GLX_ARB_multisample */ - -/* ---------------- GLX_ARB_robustness_application_isolation --------------- */ - -#ifndef GLX_ARB_robustness_application_isolation -#define GLX_ARB_robustness_application_isolation 1 - -#define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 - -#define GLXEW_ARB_robustness_application_isolation GLXEW_GET_VAR(__GLXEW_ARB_robustness_application_isolation) - -#endif /* GLX_ARB_robustness_application_isolation */ - -/* ---------------- GLX_ARB_robustness_share_group_isolation --------------- */ - -#ifndef GLX_ARB_robustness_share_group_isolation -#define GLX_ARB_robustness_share_group_isolation 1 - -#define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 - -#define GLXEW_ARB_robustness_share_group_isolation GLXEW_GET_VAR(__GLXEW_ARB_robustness_share_group_isolation) - -#endif /* GLX_ARB_robustness_share_group_isolation */ - -/* ---------------------- GLX_ARB_vertex_buffer_object --------------------- */ - -#ifndef GLX_ARB_vertex_buffer_object -#define GLX_ARB_vertex_buffer_object 1 - -#define GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB 0x2095 - -#define GLXEW_ARB_vertex_buffer_object GLXEW_GET_VAR(__GLXEW_ARB_vertex_buffer_object) - -#endif /* GLX_ARB_vertex_buffer_object */ - -/* ----------------------- GLX_ATI_pixel_format_float ---------------------- */ - -#ifndef GLX_ATI_pixel_format_float -#define GLX_ATI_pixel_format_float 1 - -#define GLX_RGBA_FLOAT_ATI_BIT 0x00000100 - -#define GLXEW_ATI_pixel_format_float GLXEW_GET_VAR(__GLXEW_ATI_pixel_format_float) - -#endif /* GLX_ATI_pixel_format_float */ - -/* ------------------------- GLX_ATI_render_texture ------------------------ */ - -#ifndef GLX_ATI_render_texture -#define GLX_ATI_render_texture 1 - -#define GLX_BIND_TO_TEXTURE_RGB_ATI 0x9800 -#define GLX_BIND_TO_TEXTURE_RGBA_ATI 0x9801 -#define GLX_TEXTURE_FORMAT_ATI 0x9802 -#define GLX_TEXTURE_TARGET_ATI 0x9803 -#define GLX_MIPMAP_TEXTURE_ATI 0x9804 -#define GLX_TEXTURE_RGB_ATI 0x9805 -#define GLX_TEXTURE_RGBA_ATI 0x9806 -#define GLX_NO_TEXTURE_ATI 0x9807 -#define GLX_TEXTURE_CUBE_MAP_ATI 0x9808 -#define GLX_TEXTURE_1D_ATI 0x9809 -#define GLX_TEXTURE_2D_ATI 0x980A -#define GLX_MIPMAP_LEVEL_ATI 0x980B -#define GLX_CUBE_MAP_FACE_ATI 0x980C -#define GLX_TEXTURE_CUBE_MAP_POSITIVE_X_ATI 0x980D -#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_X_ATI 0x980E -#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Y_ATI 0x980F -#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Y_ATI 0x9810 -#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Z_ATI 0x9811 -#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Z_ATI 0x9812 -#define GLX_FRONT_LEFT_ATI 0x9813 -#define GLX_FRONT_RIGHT_ATI 0x9814 -#define GLX_BACK_LEFT_ATI 0x9815 -#define GLX_BACK_RIGHT_ATI 0x9816 -#define GLX_AUX0_ATI 0x9817 -#define GLX_AUX1_ATI 0x9818 -#define GLX_AUX2_ATI 0x9819 -#define GLX_AUX3_ATI 0x981A -#define GLX_AUX4_ATI 0x981B -#define GLX_AUX5_ATI 0x981C -#define GLX_AUX6_ATI 0x981D -#define GLX_AUX7_ATI 0x981E -#define GLX_AUX8_ATI 0x981F -#define GLX_AUX9_ATI 0x9820 -#define GLX_BIND_TO_TEXTURE_LUMINANCE_ATI 0x9821 -#define GLX_BIND_TO_TEXTURE_INTENSITY_ATI 0x9822 - -typedef void ( * PFNGLXBINDTEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); -typedef void ( * PFNGLXDRAWABLEATTRIBATIPROC) (Display *dpy, GLXDrawable draw, const int *attrib_list); -typedef void ( * PFNGLXRELEASETEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); - -#define glXBindTexImageATI GLXEW_GET_FUN(__glewXBindTexImageATI) -#define glXDrawableAttribATI GLXEW_GET_FUN(__glewXDrawableAttribATI) -#define glXReleaseTexImageATI GLXEW_GET_FUN(__glewXReleaseTexImageATI) - -#define GLXEW_ATI_render_texture GLXEW_GET_VAR(__GLXEW_ATI_render_texture) - -#endif /* GLX_ATI_render_texture */ - -/* --------------------------- GLX_EXT_buffer_age -------------------------- */ - -#ifndef GLX_EXT_buffer_age -#define GLX_EXT_buffer_age 1 - -#define GLX_BACK_BUFFER_AGE_EXT 0x20F4 - -#define GLXEW_EXT_buffer_age GLXEW_GET_VAR(__GLXEW_EXT_buffer_age) - -#endif /* GLX_EXT_buffer_age */ - -/* ------------------- GLX_EXT_create_context_es2_profile ------------------ */ - -#ifndef GLX_EXT_create_context_es2_profile -#define GLX_EXT_create_context_es2_profile 1 - -#define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 - -#define GLXEW_EXT_create_context_es2_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es2_profile) - -#endif /* GLX_EXT_create_context_es2_profile */ - -/* ------------------- GLX_EXT_create_context_es_profile ------------------- */ - -#ifndef GLX_EXT_create_context_es_profile -#define GLX_EXT_create_context_es_profile 1 - -#define GLX_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 - -#define GLXEW_EXT_create_context_es_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es_profile) - -#endif /* GLX_EXT_create_context_es_profile */ - -/* --------------------- GLX_EXT_fbconfig_packed_float --------------------- */ - -#ifndef GLX_EXT_fbconfig_packed_float -#define GLX_EXT_fbconfig_packed_float 1 - -#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008 -#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1 - -#define GLXEW_EXT_fbconfig_packed_float GLXEW_GET_VAR(__GLXEW_EXT_fbconfig_packed_float) - -#endif /* GLX_EXT_fbconfig_packed_float */ - -/* ------------------------ GLX_EXT_framebuffer_sRGB ----------------------- */ - -#ifndef GLX_EXT_framebuffer_sRGB -#define GLX_EXT_framebuffer_sRGB 1 - -#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2 - -#define GLXEW_EXT_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_EXT_framebuffer_sRGB) - -#endif /* GLX_EXT_framebuffer_sRGB */ - -/* ------------------------- GLX_EXT_import_context ------------------------ */ - -#ifndef GLX_EXT_import_context -#define GLX_EXT_import_context 1 - -#define GLX_SHARE_CONTEXT_EXT 0x800A -#define GLX_VISUAL_ID_EXT 0x800B -#define GLX_SCREEN_EXT 0x800C - -typedef XID GLXContextID; - -typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display* dpy, GLXContext context); -typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context); -typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display* dpy, GLXContextID contextID); -typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display* dpy, GLXContext context, int attribute,int *value); - -#define glXFreeContextEXT GLXEW_GET_FUN(__glewXFreeContextEXT) -#define glXGetContextIDEXT GLXEW_GET_FUN(__glewXGetContextIDEXT) -#define glXImportContextEXT GLXEW_GET_FUN(__glewXImportContextEXT) -#define glXQueryContextInfoEXT GLXEW_GET_FUN(__glewXQueryContextInfoEXT) - -#define GLXEW_EXT_import_context GLXEW_GET_VAR(__GLXEW_EXT_import_context) - -#endif /* GLX_EXT_import_context */ - -/* ---------------------------- GLX_EXT_libglvnd --------------------------- */ - -#ifndef GLX_EXT_libglvnd -#define GLX_EXT_libglvnd 1 - -#define GLX_VENDOR_NAMES_EXT 0x20F6 - -#define GLXEW_EXT_libglvnd GLXEW_GET_VAR(__GLXEW_EXT_libglvnd) - -#endif /* GLX_EXT_libglvnd */ - -/* -------------------------- GLX_EXT_scene_marker ------------------------- */ - -#ifndef GLX_EXT_scene_marker -#define GLX_EXT_scene_marker 1 - -#define GLXEW_EXT_scene_marker GLXEW_GET_VAR(__GLXEW_EXT_scene_marker) - -#endif /* GLX_EXT_scene_marker */ - -/* -------------------------- GLX_EXT_stereo_tree -------------------------- */ - -#ifndef GLX_EXT_stereo_tree -#define GLX_EXT_stereo_tree 1 - -#define GLX_STEREO_NOTIFY_EXT 0x00000000 -#define GLX_STEREO_NOTIFY_MASK_EXT 0x00000001 -#define GLX_STEREO_TREE_EXT 0x20F5 - -#define GLXEW_EXT_stereo_tree GLXEW_GET_VAR(__GLXEW_EXT_stereo_tree) - -#endif /* GLX_EXT_stereo_tree */ - -/* -------------------------- GLX_EXT_swap_control ------------------------- */ - -#ifndef GLX_EXT_swap_control -#define GLX_EXT_swap_control 1 - -#define GLX_SWAP_INTERVAL_EXT 0x20F1 -#define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2 - -typedef void ( * PFNGLXSWAPINTERVALEXTPROC) (Display* dpy, GLXDrawable drawable, int interval); - -#define glXSwapIntervalEXT GLXEW_GET_FUN(__glewXSwapIntervalEXT) - -#define GLXEW_EXT_swap_control GLXEW_GET_VAR(__GLXEW_EXT_swap_control) - -#endif /* GLX_EXT_swap_control */ - -/* ----------------------- GLX_EXT_swap_control_tear ----------------------- */ - -#ifndef GLX_EXT_swap_control_tear -#define GLX_EXT_swap_control_tear 1 - -#define GLX_LATE_SWAPS_TEAR_EXT 0x20F3 - -#define GLXEW_EXT_swap_control_tear GLXEW_GET_VAR(__GLXEW_EXT_swap_control_tear) - -#endif /* GLX_EXT_swap_control_tear */ - -/* ---------------------- GLX_EXT_texture_from_pixmap ---------------------- */ - -#ifndef GLX_EXT_texture_from_pixmap -#define GLX_EXT_texture_from_pixmap 1 - -#define GLX_TEXTURE_1D_BIT_EXT 0x00000001 -#define GLX_TEXTURE_2D_BIT_EXT 0x00000002 -#define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004 -#define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0 -#define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1 -#define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2 -#define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3 -#define GLX_Y_INVERTED_EXT 0x20D4 -#define GLX_TEXTURE_FORMAT_EXT 0x20D5 -#define GLX_TEXTURE_TARGET_EXT 0x20D6 -#define GLX_MIPMAP_TEXTURE_EXT 0x20D7 -#define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8 -#define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9 -#define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA -#define GLX_TEXTURE_1D_EXT 0x20DB -#define GLX_TEXTURE_2D_EXT 0x20DC -#define GLX_TEXTURE_RECTANGLE_EXT 0x20DD -#define GLX_FRONT_LEFT_EXT 0x20DE -#define GLX_FRONT_RIGHT_EXT 0x20DF -#define GLX_BACK_LEFT_EXT 0x20E0 -#define GLX_BACK_RIGHT_EXT 0x20E1 -#define GLX_AUX0_EXT 0x20E2 -#define GLX_AUX1_EXT 0x20E3 -#define GLX_AUX2_EXT 0x20E4 -#define GLX_AUX3_EXT 0x20E5 -#define GLX_AUX4_EXT 0x20E6 -#define GLX_AUX5_EXT 0x20E7 -#define GLX_AUX6_EXT 0x20E8 -#define GLX_AUX7_EXT 0x20E9 -#define GLX_AUX8_EXT 0x20EA -#define GLX_AUX9_EXT 0x20EB - -typedef void ( * PFNGLXBINDTEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer, const int *attrib_list); -typedef void ( * PFNGLXRELEASETEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer); - -#define glXBindTexImageEXT GLXEW_GET_FUN(__glewXBindTexImageEXT) -#define glXReleaseTexImageEXT GLXEW_GET_FUN(__glewXReleaseTexImageEXT) - -#define GLXEW_EXT_texture_from_pixmap GLXEW_GET_VAR(__GLXEW_EXT_texture_from_pixmap) - -#endif /* GLX_EXT_texture_from_pixmap */ - -/* -------------------------- GLX_EXT_visual_info -------------------------- */ - -#ifndef GLX_EXT_visual_info -#define GLX_EXT_visual_info 1 - -#define GLX_X_VISUAL_TYPE_EXT 0x22 -#define GLX_TRANSPARENT_TYPE_EXT 0x23 -#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 -#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 -#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 -#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 -#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 -#define GLX_NONE_EXT 0x8000 -#define GLX_TRUE_COLOR_EXT 0x8002 -#define GLX_DIRECT_COLOR_EXT 0x8003 -#define GLX_PSEUDO_COLOR_EXT 0x8004 -#define GLX_STATIC_COLOR_EXT 0x8005 -#define GLX_GRAY_SCALE_EXT 0x8006 -#define GLX_STATIC_GRAY_EXT 0x8007 -#define GLX_TRANSPARENT_RGB_EXT 0x8008 -#define GLX_TRANSPARENT_INDEX_EXT 0x8009 - -#define GLXEW_EXT_visual_info GLXEW_GET_VAR(__GLXEW_EXT_visual_info) - -#endif /* GLX_EXT_visual_info */ - -/* ------------------------- GLX_EXT_visual_rating ------------------------- */ - -#ifndef GLX_EXT_visual_rating -#define GLX_EXT_visual_rating 1 - -#define GLX_VISUAL_CAVEAT_EXT 0x20 -#define GLX_SLOW_VISUAL_EXT 0x8001 -#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D - -#define GLXEW_EXT_visual_rating GLXEW_GET_VAR(__GLXEW_EXT_visual_rating) - -#endif /* GLX_EXT_visual_rating */ - -/* -------------------------- GLX_INTEL_swap_event ------------------------- */ - -#ifndef GLX_INTEL_swap_event -#define GLX_INTEL_swap_event 1 - -#define GLX_EXCHANGE_COMPLETE_INTEL 0x8180 -#define GLX_COPY_COMPLETE_INTEL 0x8181 -#define GLX_FLIP_COMPLETE_INTEL 0x8182 -#define GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK 0x04000000 - -#define GLXEW_INTEL_swap_event GLXEW_GET_VAR(__GLXEW_INTEL_swap_event) - -#endif /* GLX_INTEL_swap_event */ - -/* -------------------------- GLX_MESA_agp_offset -------------------------- */ - -#ifndef GLX_MESA_agp_offset -#define GLX_MESA_agp_offset 1 - -typedef unsigned int ( * PFNGLXGETAGPOFFSETMESAPROC) (const void* pointer); - -#define glXGetAGPOffsetMESA GLXEW_GET_FUN(__glewXGetAGPOffsetMESA) - -#define GLXEW_MESA_agp_offset GLXEW_GET_VAR(__GLXEW_MESA_agp_offset) - -#endif /* GLX_MESA_agp_offset */ - -/* ------------------------ GLX_MESA_copy_sub_buffer ----------------------- */ - -#ifndef GLX_MESA_copy_sub_buffer -#define GLX_MESA_copy_sub_buffer 1 - -typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display* dpy, GLXDrawable drawable, int x, int y, int width, int height); - -#define glXCopySubBufferMESA GLXEW_GET_FUN(__glewXCopySubBufferMESA) - -#define GLXEW_MESA_copy_sub_buffer GLXEW_GET_VAR(__GLXEW_MESA_copy_sub_buffer) - -#endif /* GLX_MESA_copy_sub_buffer */ - -/* ------------------------ GLX_MESA_pixmap_colormap ----------------------- */ - -#ifndef GLX_MESA_pixmap_colormap -#define GLX_MESA_pixmap_colormap 1 - -typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display* dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap); - -#define glXCreateGLXPixmapMESA GLXEW_GET_FUN(__glewXCreateGLXPixmapMESA) - -#define GLXEW_MESA_pixmap_colormap GLXEW_GET_VAR(__GLXEW_MESA_pixmap_colormap) - -#endif /* GLX_MESA_pixmap_colormap */ - -/* ------------------------ GLX_MESA_query_renderer ------------------------ */ - -#ifndef GLX_MESA_query_renderer -#define GLX_MESA_query_renderer 1 - -#define GLX_RENDERER_VENDOR_ID_MESA 0x8183 -#define GLX_RENDERER_DEVICE_ID_MESA 0x8184 -#define GLX_RENDERER_VERSION_MESA 0x8185 -#define GLX_RENDERER_ACCELERATED_MESA 0x8186 -#define GLX_RENDERER_VIDEO_MEMORY_MESA 0x8187 -#define GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA 0x8188 -#define GLX_RENDERER_PREFERRED_PROFILE_MESA 0x8189 -#define GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA 0x818A -#define GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA 0x818B -#define GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA 0x818C -#define GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA 0x818D -#define GLX_RENDERER_ID_MESA 0x818E - -typedef Bool ( * PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC) (int attribute, unsigned int* value); -typedef const char* ( * PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC) (int attribute); -typedef Bool ( * PFNGLXQUERYRENDERERINTEGERMESAPROC) (Display* dpy, int screen, int renderer, int attribute, unsigned int *value); -typedef const char* ( * PFNGLXQUERYRENDERERSTRINGMESAPROC) (Display *dpy, int screen, int renderer, int attribute); - -#define glXQueryCurrentRendererIntegerMESA GLXEW_GET_FUN(__glewXQueryCurrentRendererIntegerMESA) -#define glXQueryCurrentRendererStringMESA GLXEW_GET_FUN(__glewXQueryCurrentRendererStringMESA) -#define glXQueryRendererIntegerMESA GLXEW_GET_FUN(__glewXQueryRendererIntegerMESA) -#define glXQueryRendererStringMESA GLXEW_GET_FUN(__glewXQueryRendererStringMESA) - -#define GLXEW_MESA_query_renderer GLXEW_GET_VAR(__GLXEW_MESA_query_renderer) - -#endif /* GLX_MESA_query_renderer */ - -/* ------------------------ GLX_MESA_release_buffers ----------------------- */ - -#ifndef GLX_MESA_release_buffers -#define GLX_MESA_release_buffers 1 - -typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display* dpy, GLXDrawable d); - -#define glXReleaseBuffersMESA GLXEW_GET_FUN(__glewXReleaseBuffersMESA) - -#define GLXEW_MESA_release_buffers GLXEW_GET_VAR(__GLXEW_MESA_release_buffers) - -#endif /* GLX_MESA_release_buffers */ - -/* ------------------------- GLX_MESA_set_3dfx_mode ------------------------ */ - -#ifndef GLX_MESA_set_3dfx_mode -#define GLX_MESA_set_3dfx_mode 1 - -#define GLX_3DFX_WINDOW_MODE_MESA 0x1 -#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2 - -typedef GLboolean ( * PFNGLXSET3DFXMODEMESAPROC) (GLint mode); - -#define glXSet3DfxModeMESA GLXEW_GET_FUN(__glewXSet3DfxModeMESA) - -#define GLXEW_MESA_set_3dfx_mode GLXEW_GET_VAR(__GLXEW_MESA_set_3dfx_mode) - -#endif /* GLX_MESA_set_3dfx_mode */ - -/* ------------------------- GLX_MESA_swap_control ------------------------- */ - -#ifndef GLX_MESA_swap_control -#define GLX_MESA_swap_control 1 - -typedef int ( * PFNGLXGETSWAPINTERVALMESAPROC) (void); -typedef int ( * PFNGLXSWAPINTERVALMESAPROC) (unsigned int interval); - -#define glXGetSwapIntervalMESA GLXEW_GET_FUN(__glewXGetSwapIntervalMESA) -#define glXSwapIntervalMESA GLXEW_GET_FUN(__glewXSwapIntervalMESA) - -#define GLXEW_MESA_swap_control GLXEW_GET_VAR(__GLXEW_MESA_swap_control) - -#endif /* GLX_MESA_swap_control */ - -/* --------------------------- GLX_NV_copy_buffer -------------------------- */ - -#ifndef GLX_NV_copy_buffer -#define GLX_NV_copy_buffer 1 - -typedef void ( * PFNGLXCOPYBUFFERSUBDATANVPROC) (Display* dpy, GLXContext readCtx, GLXContext writeCtx, GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void ( * PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC) (Display* dpy, GLXContext readCtx, GLXContext writeCtx, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); - -#define glXCopyBufferSubDataNV GLXEW_GET_FUN(__glewXCopyBufferSubDataNV) -#define glXNamedCopyBufferSubDataNV GLXEW_GET_FUN(__glewXNamedCopyBufferSubDataNV) - -#define GLXEW_NV_copy_buffer GLXEW_GET_VAR(__GLXEW_NV_copy_buffer) - -#endif /* GLX_NV_copy_buffer */ - -/* --------------------------- GLX_NV_copy_image --------------------------- */ - -#ifndef GLX_NV_copy_image -#define GLX_NV_copy_image 1 - -typedef void ( * PFNGLXCOPYIMAGESUBDATANVPROC) (Display *dpy, GLXContext srcCtx, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLXContext dstCtx, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); - -#define glXCopyImageSubDataNV GLXEW_GET_FUN(__glewXCopyImageSubDataNV) - -#define GLXEW_NV_copy_image GLXEW_GET_VAR(__GLXEW_NV_copy_image) - -#endif /* GLX_NV_copy_image */ - -/* ------------------------ GLX_NV_delay_before_swap ----------------------- */ - -#ifndef GLX_NV_delay_before_swap -#define GLX_NV_delay_before_swap 1 - -typedef Bool ( * PFNGLXDELAYBEFORESWAPNVPROC) (Display* dpy, GLXDrawable drawable, GLfloat seconds); - -#define glXDelayBeforeSwapNV GLXEW_GET_FUN(__glewXDelayBeforeSwapNV) - -#define GLXEW_NV_delay_before_swap GLXEW_GET_VAR(__GLXEW_NV_delay_before_swap) - -#endif /* GLX_NV_delay_before_swap */ - -/* -------------------------- GLX_NV_float_buffer -------------------------- */ - -#ifndef GLX_NV_float_buffer -#define GLX_NV_float_buffer 1 - -#define GLX_FLOAT_COMPONENTS_NV 0x20B0 - -#define GLXEW_NV_float_buffer GLXEW_GET_VAR(__GLXEW_NV_float_buffer) - -#endif /* GLX_NV_float_buffer */ - -/* ---------------------- GLX_NV_multisample_coverage ---------------------- */ - -#ifndef GLX_NV_multisample_coverage -#define GLX_NV_multisample_coverage 1 - -#define GLX_COLOR_SAMPLES_NV 0x20B3 -#define GLX_COVERAGE_SAMPLES_NV 100001 - -#define GLXEW_NV_multisample_coverage GLXEW_GET_VAR(__GLXEW_NV_multisample_coverage) - -#endif /* GLX_NV_multisample_coverage */ - -/* -------------------------- GLX_NV_present_video ------------------------- */ - -#ifndef GLX_NV_present_video -#define GLX_NV_present_video 1 - -#define GLX_NUM_VIDEO_SLOTS_NV 0x20F0 - -typedef int ( * PFNGLXBINDVIDEODEVICENVPROC) (Display* dpy, unsigned int video_slot, unsigned int video_device, const int *attrib_list); -typedef unsigned int* ( * PFNGLXENUMERATEVIDEODEVICESNVPROC) (Display *dpy, int screen, int *nelements); - -#define glXBindVideoDeviceNV GLXEW_GET_FUN(__glewXBindVideoDeviceNV) -#define glXEnumerateVideoDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoDevicesNV) - -#define GLXEW_NV_present_video GLXEW_GET_VAR(__GLXEW_NV_present_video) - -#endif /* GLX_NV_present_video */ - -/* ------------------ GLX_NV_robustness_video_memory_purge ----------------- */ - -#ifndef GLX_NV_robustness_video_memory_purge -#define GLX_NV_robustness_video_memory_purge 1 - -#define GLX_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x20F7 - -#define GLXEW_NV_robustness_video_memory_purge GLXEW_GET_VAR(__GLXEW_NV_robustness_video_memory_purge) - -#endif /* GLX_NV_robustness_video_memory_purge */ - -/* --------------------------- GLX_NV_swap_group --------------------------- */ - -#ifndef GLX_NV_swap_group -#define GLX_NV_swap_group 1 - -typedef Bool ( * PFNGLXBINDSWAPBARRIERNVPROC) (Display* dpy, GLuint group, GLuint barrier); -typedef Bool ( * PFNGLXJOINSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint group); -typedef Bool ( * PFNGLXQUERYFRAMECOUNTNVPROC) (Display* dpy, int screen, GLuint *count); -typedef Bool ( * PFNGLXQUERYMAXSWAPGROUPSNVPROC) (Display* dpy, int screen, GLuint *maxGroups, GLuint *maxBarriers); -typedef Bool ( * PFNGLXQUERYSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint *group, GLuint *barrier); -typedef Bool ( * PFNGLXRESETFRAMECOUNTNVPROC) (Display* dpy, int screen); - -#define glXBindSwapBarrierNV GLXEW_GET_FUN(__glewXBindSwapBarrierNV) -#define glXJoinSwapGroupNV GLXEW_GET_FUN(__glewXJoinSwapGroupNV) -#define glXQueryFrameCountNV GLXEW_GET_FUN(__glewXQueryFrameCountNV) -#define glXQueryMaxSwapGroupsNV GLXEW_GET_FUN(__glewXQueryMaxSwapGroupsNV) -#define glXQuerySwapGroupNV GLXEW_GET_FUN(__glewXQuerySwapGroupNV) -#define glXResetFrameCountNV GLXEW_GET_FUN(__glewXResetFrameCountNV) - -#define GLXEW_NV_swap_group GLXEW_GET_VAR(__GLXEW_NV_swap_group) - -#endif /* GLX_NV_swap_group */ - -/* ----------------------- GLX_NV_vertex_array_range ----------------------- */ - -#ifndef GLX_NV_vertex_array_range -#define GLX_NV_vertex_array_range 1 - -typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); -typedef void ( * PFNGLXFREEMEMORYNVPROC) (void *pointer); - -#define glXAllocateMemoryNV GLXEW_GET_FUN(__glewXAllocateMemoryNV) -#define glXFreeMemoryNV GLXEW_GET_FUN(__glewXFreeMemoryNV) - -#define GLXEW_NV_vertex_array_range GLXEW_GET_VAR(__GLXEW_NV_vertex_array_range) - -#endif /* GLX_NV_vertex_array_range */ - -/* -------------------------- GLX_NV_video_capture ------------------------- */ - -#ifndef GLX_NV_video_capture -#define GLX_NV_video_capture 1 - -#define GLX_DEVICE_ID_NV 0x20CD -#define GLX_UNIQUE_ID_NV 0x20CE -#define GLX_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF - -typedef XID GLXVideoCaptureDeviceNV; - -typedef int ( * PFNGLXBINDVIDEOCAPTUREDEVICENVPROC) (Display* dpy, unsigned int video_capture_slot, GLXVideoCaptureDeviceNV device); -typedef GLXVideoCaptureDeviceNV * ( * PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC) (Display* dpy, int screen, int *nelements); -typedef void ( * PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device); -typedef int ( * PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device, int attribute, int *value); -typedef void ( * PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device); - -#define glXBindVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXBindVideoCaptureDeviceNV) -#define glXEnumerateVideoCaptureDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoCaptureDevicesNV) -#define glXLockVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXLockVideoCaptureDeviceNV) -#define glXQueryVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXQueryVideoCaptureDeviceNV) -#define glXReleaseVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoCaptureDeviceNV) - -#define GLXEW_NV_video_capture GLXEW_GET_VAR(__GLXEW_NV_video_capture) - -#endif /* GLX_NV_video_capture */ - -/* ---------------------------- GLX_NV_video_out --------------------------- */ - -#ifndef GLX_NV_video_out -#define GLX_NV_video_out 1 - -#define GLX_VIDEO_OUT_COLOR_NV 0x20C3 -#define GLX_VIDEO_OUT_ALPHA_NV 0x20C4 -#define GLX_VIDEO_OUT_DEPTH_NV 0x20C5 -#define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 -#define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 -#define GLX_VIDEO_OUT_FRAME_NV 0x20C8 -#define GLX_VIDEO_OUT_FIELD_1_NV 0x20C9 -#define GLX_VIDEO_OUT_FIELD_2_NV 0x20CA -#define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB -#define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC - -typedef int ( * PFNGLXBINDVIDEOIMAGENVPROC) (Display* dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer); -typedef int ( * PFNGLXGETVIDEODEVICENVPROC) (Display* dpy, int screen, int numVideoDevices, GLXVideoDeviceNV *pVideoDevice); -typedef int ( * PFNGLXGETVIDEOINFONVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); -typedef int ( * PFNGLXRELEASEVIDEODEVICENVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice); -typedef int ( * PFNGLXRELEASEVIDEOIMAGENVPROC) (Display* dpy, GLXPbuffer pbuf); -typedef int ( * PFNGLXSENDPBUFFERTOVIDEONVPROC) (Display* dpy, GLXPbuffer pbuf, int iBufferType, unsigned long *pulCounterPbuffer, GLboolean bBlock); - -#define glXBindVideoImageNV GLXEW_GET_FUN(__glewXBindVideoImageNV) -#define glXGetVideoDeviceNV GLXEW_GET_FUN(__glewXGetVideoDeviceNV) -#define glXGetVideoInfoNV GLXEW_GET_FUN(__glewXGetVideoInfoNV) -#define glXReleaseVideoDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoDeviceNV) -#define glXReleaseVideoImageNV GLXEW_GET_FUN(__glewXReleaseVideoImageNV) -#define glXSendPbufferToVideoNV GLXEW_GET_FUN(__glewXSendPbufferToVideoNV) - -#define GLXEW_NV_video_out GLXEW_GET_VAR(__GLXEW_NV_video_out) - -#endif /* GLX_NV_video_out */ - -/* -------------------------- GLX_OML_swap_method -------------------------- */ - -#ifndef GLX_OML_swap_method -#define GLX_OML_swap_method 1 - -#define GLX_SWAP_METHOD_OML 0x8060 -#define GLX_SWAP_EXCHANGE_OML 0x8061 -#define GLX_SWAP_COPY_OML 0x8062 -#define GLX_SWAP_UNDEFINED_OML 0x8063 - -#define GLXEW_OML_swap_method GLXEW_GET_VAR(__GLXEW_OML_swap_method) - -#endif /* GLX_OML_swap_method */ - -/* -------------------------- GLX_OML_sync_control ------------------------- */ - -#ifndef GLX_OML_sync_control -#define GLX_OML_sync_control 1 - -typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator); -typedef Bool ( * PFNGLXGETSYNCVALUESOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc); -typedef int64_t ( * PFNGLXSWAPBUFFERSMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder); -typedef Bool ( * PFNGLXWAITFORMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t* ust, int64_t* msc, int64_t* sbc); -typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc); - -#define glXGetMscRateOML GLXEW_GET_FUN(__glewXGetMscRateOML) -#define glXGetSyncValuesOML GLXEW_GET_FUN(__glewXGetSyncValuesOML) -#define glXSwapBuffersMscOML GLXEW_GET_FUN(__glewXSwapBuffersMscOML) -#define glXWaitForMscOML GLXEW_GET_FUN(__glewXWaitForMscOML) -#define glXWaitForSbcOML GLXEW_GET_FUN(__glewXWaitForSbcOML) - -#define GLXEW_OML_sync_control GLXEW_GET_VAR(__GLXEW_OML_sync_control) - -#endif /* GLX_OML_sync_control */ - -/* ------------------------ GLX_SGIS_blended_overlay ----------------------- */ - -#ifndef GLX_SGIS_blended_overlay -#define GLX_SGIS_blended_overlay 1 - -#define GLX_BLENDED_RGBA_SGIS 0x8025 - -#define GLXEW_SGIS_blended_overlay GLXEW_GET_VAR(__GLXEW_SGIS_blended_overlay) - -#endif /* GLX_SGIS_blended_overlay */ - -/* -------------------------- GLX_SGIS_color_range ------------------------- */ - -#ifndef GLX_SGIS_color_range -#define GLX_SGIS_color_range 1 - -#define GLXEW_SGIS_color_range GLXEW_GET_VAR(__GLXEW_SGIS_color_range) - -#endif /* GLX_SGIS_color_range */ - -/* -------------------------- GLX_SGIS_multisample ------------------------- */ - -#ifndef GLX_SGIS_multisample -#define GLX_SGIS_multisample 1 - -#define GLX_SAMPLE_BUFFERS_SGIS 100000 -#define GLX_SAMPLES_SGIS 100001 - -#define GLXEW_SGIS_multisample GLXEW_GET_VAR(__GLXEW_SGIS_multisample) - -#endif /* GLX_SGIS_multisample */ - -/* ---------------------- GLX_SGIS_shared_multisample ---------------------- */ - -#ifndef GLX_SGIS_shared_multisample -#define GLX_SGIS_shared_multisample 1 - -#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026 -#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027 - -#define GLXEW_SGIS_shared_multisample GLXEW_GET_VAR(__GLXEW_SGIS_shared_multisample) - -#endif /* GLX_SGIS_shared_multisample */ - -/* --------------------------- GLX_SGIX_fbconfig --------------------------- */ - -#ifndef GLX_SGIX_fbconfig -#define GLX_SGIX_fbconfig 1 - -#define GLX_RGBA_BIT_SGIX 0x00000001 -#define GLX_WINDOW_BIT_SGIX 0x00000001 -#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 -#define GLX_PIXMAP_BIT_SGIX 0x00000002 -#define GLX_SCREEN_EXT 0x800C -#define GLX_DRAWABLE_TYPE_SGIX 0x8010 -#define GLX_RENDER_TYPE_SGIX 0x8011 -#define GLX_X_RENDERABLE_SGIX 0x8012 -#define GLX_FBCONFIG_ID_SGIX 0x8013 -#define GLX_RGBA_TYPE_SGIX 0x8014 -#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015 - -typedef XID GLXFBConfigIDSGIX; -typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; - -typedef GLXFBConfigSGIX* ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); -typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); -typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, Pixmap pixmap); -typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display* dpy, GLXFBConfigSGIX config, int attribute, int *value); -typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display* dpy, XVisualInfo *vis); -typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfig config); - -#define glXChooseFBConfigSGIX GLXEW_GET_FUN(__glewXChooseFBConfigSGIX) -#define glXCreateContextWithConfigSGIX GLXEW_GET_FUN(__glewXCreateContextWithConfigSGIX) -#define glXCreateGLXPixmapWithConfigSGIX GLXEW_GET_FUN(__glewXCreateGLXPixmapWithConfigSGIX) -#define glXGetFBConfigAttribSGIX GLXEW_GET_FUN(__glewXGetFBConfigAttribSGIX) -#define glXGetFBConfigFromVisualSGIX GLXEW_GET_FUN(__glewXGetFBConfigFromVisualSGIX) -#define glXGetVisualFromFBConfigSGIX GLXEW_GET_FUN(__glewXGetVisualFromFBConfigSGIX) - -#define GLXEW_SGIX_fbconfig GLXEW_GET_VAR(__GLXEW_SGIX_fbconfig) - -#endif /* GLX_SGIX_fbconfig */ - -/* --------------------------- GLX_SGIX_hyperpipe -------------------------- */ - -#ifndef GLX_SGIX_hyperpipe -#define GLX_SGIX_hyperpipe 1 - -#define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001 -#define GLX_PIPE_RECT_SGIX 0x00000001 -#define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002 -#define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002 -#define GLX_HYPERPIPE_STEREO_SGIX 0x00000003 -#define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004 -#define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80 -#define GLX_BAD_HYPERPIPE_CONFIG_SGIX 91 -#define GLX_BAD_HYPERPIPE_SGIX 92 -#define GLX_HYPERPIPE_ID_SGIX 0x8030 - -typedef struct { - char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; - int networkId; -} GLXHyperpipeNetworkSGIX; -typedef struct { - char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; - int XOrigin; - int YOrigin; - int maxHeight; - int maxWidth; -} GLXPipeRectLimits; -typedef struct { - char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; - int channel; - unsigned int participationType; - int timeSlice; -} GLXHyperpipeConfigSGIX; -typedef struct { - char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; - int srcXOrigin; - int srcYOrigin; - int srcWidth; - int srcHeight; - int destXOrigin; - int destYOrigin; - int destWidth; - int destHeight; -} GLXPipeRect; - -typedef int ( * PFNGLXBINDHYPERPIPESGIXPROC) (Display *dpy, int hpId); -typedef int ( * PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId); -typedef int ( * PFNGLXHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList); -typedef int ( * PFNGLXHYPERPIPECONFIGSGIXPROC) (Display *dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX *cfg, int *hpId); -typedef int ( * PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *returnAttribList); -typedef int ( * PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList, void *returnAttribList); -typedef GLXHyperpipeConfigSGIX * ( * PFNGLXQUERYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId, int *npipes); -typedef GLXHyperpipeNetworkSGIX * ( * PFNGLXQUERYHYPERPIPENETWORKSGIXPROC) (Display *dpy, int *npipes); - -#define glXBindHyperpipeSGIX GLXEW_GET_FUN(__glewXBindHyperpipeSGIX) -#define glXDestroyHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXDestroyHyperpipeConfigSGIX) -#define glXHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXHyperpipeAttribSGIX) -#define glXHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXHyperpipeConfigSGIX) -#define glXQueryHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeAttribSGIX) -#define glXQueryHyperpipeBestAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeBestAttribSGIX) -#define glXQueryHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeConfigSGIX) -#define glXQueryHyperpipeNetworkSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeNetworkSGIX) - -#define GLXEW_SGIX_hyperpipe GLXEW_GET_VAR(__GLXEW_SGIX_hyperpipe) - -#endif /* GLX_SGIX_hyperpipe */ - -/* ---------------------------- GLX_SGIX_pbuffer --------------------------- */ - -#ifndef GLX_SGIX_pbuffer -#define GLX_SGIX_pbuffer 1 - -#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001 -#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002 -#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004 -#define GLX_PBUFFER_BIT_SGIX 0x00000004 -#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008 -#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010 -#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020 -#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040 -#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080 -#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100 -#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016 -#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017 -#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018 -#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 -#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A -#define GLX_PRESERVED_CONTENTS_SGIX 0x801B -#define GLX_LARGEST_PBUFFER_SGIX 0x801C -#define GLX_WIDTH_SGIX 0x801D -#define GLX_HEIGHT_SGIX 0x801E -#define GLX_EVENT_MASK_SGIX 0x801F -#define GLX_DAMAGED_SGIX 0x8020 -#define GLX_SAVED_SGIX 0x8021 -#define GLX_WINDOW_SGIX 0x8022 -#define GLX_PBUFFER_SGIX 0x8023 -#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000 - -typedef XID GLXPbufferSGIX; -typedef struct { int type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; int event_type; int draw_type; unsigned int mask; int x, y; int width, height; int count; } GLXBufferClobberEventSGIX; - -typedef GLXPbuffer ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display* dpy, GLXFBConfig config, unsigned int width, unsigned int height, int *attrib_list); -typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf); -typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long *mask); -typedef void ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf, int attribute, unsigned int *value); -typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long mask); - -#define glXCreateGLXPbufferSGIX GLXEW_GET_FUN(__glewXCreateGLXPbufferSGIX) -#define glXDestroyGLXPbufferSGIX GLXEW_GET_FUN(__glewXDestroyGLXPbufferSGIX) -#define glXGetSelectedEventSGIX GLXEW_GET_FUN(__glewXGetSelectedEventSGIX) -#define glXQueryGLXPbufferSGIX GLXEW_GET_FUN(__glewXQueryGLXPbufferSGIX) -#define glXSelectEventSGIX GLXEW_GET_FUN(__glewXSelectEventSGIX) - -#define GLXEW_SGIX_pbuffer GLXEW_GET_VAR(__GLXEW_SGIX_pbuffer) - -#endif /* GLX_SGIX_pbuffer */ - -/* ------------------------- GLX_SGIX_swap_barrier ------------------------- */ - -#ifndef GLX_SGIX_swap_barrier -#define GLX_SGIX_swap_barrier 1 - -typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier); -typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max); - -#define glXBindSwapBarrierSGIX GLXEW_GET_FUN(__glewXBindSwapBarrierSGIX) -#define glXQueryMaxSwapBarriersSGIX GLXEW_GET_FUN(__glewXQueryMaxSwapBarriersSGIX) - -#define GLXEW_SGIX_swap_barrier GLXEW_GET_VAR(__GLXEW_SGIX_swap_barrier) - -#endif /* GLX_SGIX_swap_barrier */ - -/* -------------------------- GLX_SGIX_swap_group -------------------------- */ - -#ifndef GLX_SGIX_swap_group -#define GLX_SGIX_swap_group 1 - -typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member); - -#define glXJoinSwapGroupSGIX GLXEW_GET_FUN(__glewXJoinSwapGroupSGIX) - -#define GLXEW_SGIX_swap_group GLXEW_GET_VAR(__GLXEW_SGIX_swap_group) - -#endif /* GLX_SGIX_swap_group */ - -/* ------------------------- GLX_SGIX_video_resize ------------------------- */ - -#ifndef GLX_SGIX_video_resize -#define GLX_SGIX_video_resize 1 - -#define GLX_SYNC_FRAME_SGIX 0x00000000 -#define GLX_SYNC_SWAP_SGIX 0x00000001 - -typedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display* display, int screen, int channel, Window window); -typedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int x, int y, int w, int h); -typedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display* display, int screen, int channel, GLenum synctype); -typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display* display, int screen, int channel, int *x, int *y, int *w, int *h); -typedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int *dx, int *dy, int *dw, int *dh); - -#define glXBindChannelToWindowSGIX GLXEW_GET_FUN(__glewXBindChannelToWindowSGIX) -#define glXChannelRectSGIX GLXEW_GET_FUN(__glewXChannelRectSGIX) -#define glXChannelRectSyncSGIX GLXEW_GET_FUN(__glewXChannelRectSyncSGIX) -#define glXQueryChannelDeltasSGIX GLXEW_GET_FUN(__glewXQueryChannelDeltasSGIX) -#define glXQueryChannelRectSGIX GLXEW_GET_FUN(__glewXQueryChannelRectSGIX) - -#define GLXEW_SGIX_video_resize GLXEW_GET_VAR(__GLXEW_SGIX_video_resize) - -#endif /* GLX_SGIX_video_resize */ - -/* ---------------------- GLX_SGIX_visual_select_group --------------------- */ - -#ifndef GLX_SGIX_visual_select_group -#define GLX_SGIX_visual_select_group 1 - -#define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028 - -#define GLXEW_SGIX_visual_select_group GLXEW_GET_VAR(__GLXEW_SGIX_visual_select_group) - -#endif /* GLX_SGIX_visual_select_group */ - -/* ---------------------------- GLX_SGI_cushion ---------------------------- */ - -#ifndef GLX_SGI_cushion -#define GLX_SGI_cushion 1 - -typedef void ( * PFNGLXCUSHIONSGIPROC) (Display* dpy, Window window, float cushion); - -#define glXCushionSGI GLXEW_GET_FUN(__glewXCushionSGI) - -#define GLXEW_SGI_cushion GLXEW_GET_VAR(__GLXEW_SGI_cushion) - -#endif /* GLX_SGI_cushion */ - -/* ----------------------- GLX_SGI_make_current_read ----------------------- */ - -#ifndef GLX_SGI_make_current_read -#define GLX_SGI_make_current_read 1 - -typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void); -typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); - -#define glXGetCurrentReadDrawableSGI GLXEW_GET_FUN(__glewXGetCurrentReadDrawableSGI) -#define glXMakeCurrentReadSGI GLXEW_GET_FUN(__glewXMakeCurrentReadSGI) - -#define GLXEW_SGI_make_current_read GLXEW_GET_VAR(__GLXEW_SGI_make_current_read) - -#endif /* GLX_SGI_make_current_read */ - -/* -------------------------- GLX_SGI_swap_control ------------------------- */ - -#ifndef GLX_SGI_swap_control -#define GLX_SGI_swap_control 1 - -typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval); - -#define glXSwapIntervalSGI GLXEW_GET_FUN(__glewXSwapIntervalSGI) - -#define GLXEW_SGI_swap_control GLXEW_GET_VAR(__GLXEW_SGI_swap_control) - -#endif /* GLX_SGI_swap_control */ - -/* --------------------------- GLX_SGI_video_sync -------------------------- */ - -#ifndef GLX_SGI_video_sync -#define GLX_SGI_video_sync 1 - -typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (unsigned int* count); -typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int* count); - -#define glXGetVideoSyncSGI GLXEW_GET_FUN(__glewXGetVideoSyncSGI) -#define glXWaitVideoSyncSGI GLXEW_GET_FUN(__glewXWaitVideoSyncSGI) - -#define GLXEW_SGI_video_sync GLXEW_GET_VAR(__GLXEW_SGI_video_sync) - -#endif /* GLX_SGI_video_sync */ - -/* --------------------- GLX_SUN_get_transparent_index --------------------- */ - -#ifndef GLX_SUN_get_transparent_index -#define GLX_SUN_get_transparent_index 1 - -typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display* dpy, Window overlay, Window underlay, unsigned long *pTransparentIndex); - -#define glXGetTransparentIndexSUN GLXEW_GET_FUN(__glewXGetTransparentIndexSUN) - -#define GLXEW_SUN_get_transparent_index GLXEW_GET_VAR(__GLXEW_SUN_get_transparent_index) - -#endif /* GLX_SUN_get_transparent_index */ - -/* -------------------------- GLX_SUN_video_resize ------------------------- */ - -#ifndef GLX_SUN_video_resize -#define GLX_SUN_video_resize 1 - -#define GLX_VIDEO_RESIZE_SUN 0x8171 -#define GL_VIDEO_RESIZE_COMPENSATION_SUN 0x85CD - -typedef int ( * PFNGLXGETVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float* factor); -typedef int ( * PFNGLXVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float factor); - -#define glXGetVideoResizeSUN GLXEW_GET_FUN(__glewXGetVideoResizeSUN) -#define glXVideoResizeSUN GLXEW_GET_FUN(__glewXVideoResizeSUN) - -#define GLXEW_SUN_video_resize GLXEW_GET_VAR(__GLXEW_SUN_video_resize) - -#endif /* GLX_SUN_video_resize */ - -/* ------------------------------------------------------------------------- */ - -#define GLXEW_FUN_EXPORT GLEW_FUN_EXPORT -#define GLXEW_VAR_EXPORT GLEW_VAR_EXPORT - -GLXEW_FUN_EXPORT PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay; - -GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig; -GLXEW_FUN_EXPORT PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext; -GLXEW_FUN_EXPORT PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer; -GLXEW_FUN_EXPORT PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap; -GLXEW_FUN_EXPORT PFNGLXCREATEWINDOWPROC __glewXCreateWindow; -GLXEW_FUN_EXPORT PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer; -GLXEW_FUN_EXPORT PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap; -GLXEW_FUN_EXPORT PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow; -GLXEW_FUN_EXPORT PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable; -GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib; -GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs; -GLXEW_FUN_EXPORT PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent; -GLXEW_FUN_EXPORT PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig; -GLXEW_FUN_EXPORT PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent; -GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTPROC __glewXQueryContext; -GLXEW_FUN_EXPORT PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable; -GLXEW_FUN_EXPORT PFNGLXSELECTEVENTPROC __glewXSelectEvent; - -GLXEW_FUN_EXPORT PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD; -GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD; -GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD; -GLXEW_FUN_EXPORT PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD; -GLXEW_FUN_EXPORT PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD; -GLXEW_FUN_EXPORT PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD; -GLXEW_FUN_EXPORT PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD; -GLXEW_FUN_EXPORT PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD; -GLXEW_FUN_EXPORT PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD; - -GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB; - -GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI; -GLXEW_FUN_EXPORT PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI; -GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI; - -GLXEW_FUN_EXPORT PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT; -GLXEW_FUN_EXPORT PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT; -GLXEW_FUN_EXPORT PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT; -GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT; - -GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT; - -GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT; -GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT; - -GLXEW_FUN_EXPORT PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA; - -GLXEW_FUN_EXPORT PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA; - -GLXEW_FUN_EXPORT PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA; - -GLXEW_FUN_EXPORT PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC __glewXQueryCurrentRendererIntegerMESA; -GLXEW_FUN_EXPORT PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC __glewXQueryCurrentRendererStringMESA; -GLXEW_FUN_EXPORT PFNGLXQUERYRENDERERINTEGERMESAPROC __glewXQueryRendererIntegerMESA; -GLXEW_FUN_EXPORT PFNGLXQUERYRENDERERSTRINGMESAPROC __glewXQueryRendererStringMESA; - -GLXEW_FUN_EXPORT PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA; - -GLXEW_FUN_EXPORT PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA; - -GLXEW_FUN_EXPORT PFNGLXGETSWAPINTERVALMESAPROC __glewXGetSwapIntervalMESA; -GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALMESAPROC __glewXSwapIntervalMESA; - -GLXEW_FUN_EXPORT PFNGLXCOPYBUFFERSUBDATANVPROC __glewXCopyBufferSubDataNV; -GLXEW_FUN_EXPORT PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC __glewXNamedCopyBufferSubDataNV; - -GLXEW_FUN_EXPORT PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV; - -GLXEW_FUN_EXPORT PFNGLXDELAYBEFORESWAPNVPROC __glewXDelayBeforeSwapNV; - -GLXEW_FUN_EXPORT PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV; -GLXEW_FUN_EXPORT PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV; - -GLXEW_FUN_EXPORT PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV; -GLXEW_FUN_EXPORT PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV; -GLXEW_FUN_EXPORT PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV; -GLXEW_FUN_EXPORT PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV; -GLXEW_FUN_EXPORT PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV; -GLXEW_FUN_EXPORT PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV; - -GLXEW_FUN_EXPORT PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV; -GLXEW_FUN_EXPORT PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV; - -GLXEW_FUN_EXPORT PFNGLXBINDVIDEOCAPTUREDEVICENVPROC __glewXBindVideoCaptureDeviceNV; -GLXEW_FUN_EXPORT PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC __glewXEnumerateVideoCaptureDevicesNV; -GLXEW_FUN_EXPORT PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC __glewXLockVideoCaptureDeviceNV; -GLXEW_FUN_EXPORT PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC __glewXQueryVideoCaptureDeviceNV; -GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC __glewXReleaseVideoCaptureDeviceNV; - -GLXEW_FUN_EXPORT PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV; -GLXEW_FUN_EXPORT PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV; -GLXEW_FUN_EXPORT PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV; -GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV; -GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV; -GLXEW_FUN_EXPORT PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV; - -GLXEW_FUN_EXPORT PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML; -GLXEW_FUN_EXPORT PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML; -GLXEW_FUN_EXPORT PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML; -GLXEW_FUN_EXPORT PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML; -GLXEW_FUN_EXPORT PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML; - -GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX; -GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX; -GLXEW_FUN_EXPORT PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX; -GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX; -GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX; -GLXEW_FUN_EXPORT PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX; - -GLXEW_FUN_EXPORT PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX; -GLXEW_FUN_EXPORT PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX; -GLXEW_FUN_EXPORT PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX; -GLXEW_FUN_EXPORT PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX; - -GLXEW_FUN_EXPORT PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX; -GLXEW_FUN_EXPORT PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX; -GLXEW_FUN_EXPORT PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX; -GLXEW_FUN_EXPORT PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX; - -GLXEW_FUN_EXPORT PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX; - -GLXEW_FUN_EXPORT PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX; - -GLXEW_FUN_EXPORT PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX; -GLXEW_FUN_EXPORT PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX; -GLXEW_FUN_EXPORT PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX; -GLXEW_FUN_EXPORT PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX; - -GLXEW_FUN_EXPORT PFNGLXCUSHIONSGIPROC __glewXCushionSGI; - -GLXEW_FUN_EXPORT PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI; -GLXEW_FUN_EXPORT PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI; - -GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI; - -GLXEW_FUN_EXPORT PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI; -GLXEW_FUN_EXPORT PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI; - -GLXEW_FUN_EXPORT PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN; - -GLXEW_FUN_EXPORT PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN; -GLXEW_FUN_EXPORT PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN; -GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_0; -GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_1; -GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_2; -GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_3; -GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_4; -GLXEW_VAR_EXPORT GLboolean __GLXEW_3DFX_multisample; -GLXEW_VAR_EXPORT GLboolean __GLXEW_AMD_gpu_association; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_context_flush_control; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_no_error; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_profile; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_robustness; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_fbconfig_float; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_framebuffer_sRGB; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_get_proc_address; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_multisample; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_application_isolation; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_share_group_isolation; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_vertex_buffer_object; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_pixel_format_float; -GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_render_texture; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_buffer_age; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es2_profile; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es_profile; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_framebuffer_sRGB; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_import_context; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_libglvnd; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_scene_marker; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_stereo_tree; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control_tear; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_texture_from_pixmap; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_visual_info; -GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_visual_rating; -GLXEW_VAR_EXPORT GLboolean __GLXEW_INTEL_swap_event; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_agp_offset; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_copy_sub_buffer; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_pixmap_colormap; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_query_renderer; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_release_buffers; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_set_3dfx_mode; -GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_swap_control; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_copy_buffer; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_copy_image; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_delay_before_swap; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_float_buffer; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_multisample_coverage; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_present_video; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_robustness_video_memory_purge; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_swap_group; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_vertex_array_range; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_capture; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_out; -GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_swap_method; -GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_sync_control; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_blended_overlay; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_color_range; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_multisample; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_shared_multisample; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_fbconfig; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_hyperpipe; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_pbuffer; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_swap_barrier; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_swap_group; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_video_resize; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_visual_select_group; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_cushion; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_make_current_read; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_swap_control; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_video_sync; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SUN_get_transparent_index; -GLXEW_VAR_EXPORT GLboolean __GLXEW_SUN_video_resize; -/* ------------------------------------------------------------------------ */ - -GLEWAPI GLenum GLEWAPIENTRY glxewInit (); -GLEWAPI GLboolean GLEWAPIENTRY glxewIsSupported (const char *name); - -#ifndef GLXEW_GET_VAR -#define GLXEW_GET_VAR(x) (*(const GLboolean*)&x) -#endif - -#ifndef GLXEW_GET_FUN -#define GLXEW_GET_FUN(x) x -#endif - -GLEWAPI GLboolean GLEWAPIENTRY glxewGetExtension (const char *name); - -#ifdef __cplusplus -} -#endif - -#endif /* __glxew_h__ */ diff --git a/src/engine/external/glew/GL/wglew.h b/src/engine/external/glew/GL/wglew.h deleted file mode 100644 index 2097c0f033..0000000000 --- a/src/engine/external/glew/GL/wglew.h +++ /dev/null @@ -1,1447 +0,0 @@ -/* -** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2017, Nigel Stewart -** Copyright (C) 2002-2008, Milan Ikits -** Copyright (C) 2002-2008, Marcelo E. Magallon -** Copyright (C) 2002, Lev Povalahev -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are met: -** -** * Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** * The name of the author may be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -** THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* -** Copyright (c) 2007 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -#ifndef __wglew_h__ -#define __wglew_h__ -#define __WGLEW_H__ - -#ifdef __wglext_h_ -#error wglext.h included before wglew.h -#endif - -#define __wglext_h_ - -#if !defined(WINAPI) -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN 1 -# endif -#include -# undef WIN32_LEAN_AND_MEAN -#endif - -/* - * GLEW_STATIC needs to be set when using the static version. - * GLEW_BUILD is set when building the DLL version. - */ -#ifdef GLEW_STATIC -# define GLEWAPI extern -#else -# ifdef GLEW_BUILD -# define GLEWAPI extern __declspec(dllexport) -# else -# define GLEWAPI extern __declspec(dllimport) -# endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* -------------------------- WGL_3DFX_multisample ------------------------- */ - -#ifndef WGL_3DFX_multisample -#define WGL_3DFX_multisample 1 - -#define WGL_SAMPLE_BUFFERS_3DFX 0x2060 -#define WGL_SAMPLES_3DFX 0x2061 - -#define WGLEW_3DFX_multisample WGLEW_GET_VAR(__WGLEW_3DFX_multisample) - -#endif /* WGL_3DFX_multisample */ - -/* ------------------------- WGL_3DL_stereo_control ------------------------ */ - -#ifndef WGL_3DL_stereo_control -#define WGL_3DL_stereo_control 1 - -#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055 -#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056 -#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057 -#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058 - -typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState); - -#define wglSetStereoEmitterState3DL WGLEW_GET_FUN(__wglewSetStereoEmitterState3DL) - -#define WGLEW_3DL_stereo_control WGLEW_GET_VAR(__WGLEW_3DL_stereo_control) - -#endif /* WGL_3DL_stereo_control */ - -/* ------------------------ WGL_AMD_gpu_association ------------------------ */ - -#ifndef WGL_AMD_gpu_association -#define WGL_AMD_gpu_association 1 - -#define WGL_GPU_VENDOR_AMD 0x1F00 -#define WGL_GPU_RENDERER_STRING_AMD 0x1F01 -#define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 -#define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 -#define WGL_GPU_RAM_AMD 0x21A3 -#define WGL_GPU_CLOCK_AMD 0x21A4 -#define WGL_GPU_NUM_PIPES_AMD 0x21A5 -#define WGL_GPU_NUM_SIMD_AMD 0x21A6 -#define WGL_GPU_NUM_RB_AMD 0x21A7 -#define WGL_GPU_NUM_SPI_AMD 0x21A8 - -typedef VOID (WINAPI * PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC) (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id); -typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int* attribList); -typedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc); -typedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc); -typedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); -typedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT* ids); -typedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, INT property, GLenum dataType, UINT size, void* data); -typedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc); - -#define wglBlitContextFramebufferAMD WGLEW_GET_FUN(__wglewBlitContextFramebufferAMD) -#define wglCreateAssociatedContextAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAMD) -#define wglCreateAssociatedContextAttribsAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAttribsAMD) -#define wglDeleteAssociatedContextAMD WGLEW_GET_FUN(__wglewDeleteAssociatedContextAMD) -#define wglGetContextGPUIDAMD WGLEW_GET_FUN(__wglewGetContextGPUIDAMD) -#define wglGetCurrentAssociatedContextAMD WGLEW_GET_FUN(__wglewGetCurrentAssociatedContextAMD) -#define wglGetGPUIDsAMD WGLEW_GET_FUN(__wglewGetGPUIDsAMD) -#define wglGetGPUInfoAMD WGLEW_GET_FUN(__wglewGetGPUInfoAMD) -#define wglMakeAssociatedContextCurrentAMD WGLEW_GET_FUN(__wglewMakeAssociatedContextCurrentAMD) - -#define WGLEW_AMD_gpu_association WGLEW_GET_VAR(__WGLEW_AMD_gpu_association) - -#endif /* WGL_AMD_gpu_association */ - -/* ------------------------- WGL_ARB_buffer_region ------------------------- */ - -#ifndef WGL_ARB_buffer_region -#define WGL_ARB_buffer_region 1 - -#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 -#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 -#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 -#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 - -typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); -typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); -typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); -typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); - -#define wglCreateBufferRegionARB WGLEW_GET_FUN(__wglewCreateBufferRegionARB) -#define wglDeleteBufferRegionARB WGLEW_GET_FUN(__wglewDeleteBufferRegionARB) -#define wglRestoreBufferRegionARB WGLEW_GET_FUN(__wglewRestoreBufferRegionARB) -#define wglSaveBufferRegionARB WGLEW_GET_FUN(__wglewSaveBufferRegionARB) - -#define WGLEW_ARB_buffer_region WGLEW_GET_VAR(__WGLEW_ARB_buffer_region) - -#endif /* WGL_ARB_buffer_region */ - -/* --------------------- WGL_ARB_context_flush_control --------------------- */ - -#ifndef WGL_ARB_context_flush_control -#define WGL_ARB_context_flush_control 1 - -#define WGLEW_ARB_context_flush_control WGLEW_GET_VAR(__WGLEW_ARB_context_flush_control) - -#endif /* WGL_ARB_context_flush_control */ - -/* ------------------------- WGL_ARB_create_context ------------------------ */ - -#ifndef WGL_ARB_create_context -#define WGL_ARB_create_context 1 - -#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 -#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 -#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 -#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 -#define WGL_CONTEXT_FLAGS_ARB 0x2094 -#define ERROR_INVALID_VERSION_ARB 0x2095 -#define ERROR_INVALID_PROFILE_ARB 0x2096 - -typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int* attribList); - -#define wglCreateContextAttribsARB WGLEW_GET_FUN(__wglewCreateContextAttribsARB) - -#define WGLEW_ARB_create_context WGLEW_GET_VAR(__WGLEW_ARB_create_context) - -#endif /* WGL_ARB_create_context */ - -/* -------------------- WGL_ARB_create_context_no_error -------------------- */ - -#ifndef WGL_ARB_create_context_no_error -#define WGL_ARB_create_context_no_error 1 - -#define WGLEW_ARB_create_context_no_error WGLEW_GET_VAR(__WGLEW_ARB_create_context_no_error) - -#endif /* WGL_ARB_create_context_no_error */ - -/* --------------------- WGL_ARB_create_context_profile -------------------- */ - -#ifndef WGL_ARB_create_context_profile -#define WGL_ARB_create_context_profile 1 - -#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 -#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 -#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 - -#define WGLEW_ARB_create_context_profile WGLEW_GET_VAR(__WGLEW_ARB_create_context_profile) - -#endif /* WGL_ARB_create_context_profile */ - -/* ------------------- WGL_ARB_create_context_robustness ------------------- */ - -#ifndef WGL_ARB_create_context_robustness -#define WGL_ARB_create_context_robustness 1 - -#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 -#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 -#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 -#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261 - -#define WGLEW_ARB_create_context_robustness WGLEW_GET_VAR(__WGLEW_ARB_create_context_robustness) - -#endif /* WGL_ARB_create_context_robustness */ - -/* ----------------------- WGL_ARB_extensions_string ----------------------- */ - -#ifndef WGL_ARB_extensions_string -#define WGL_ARB_extensions_string 1 - -typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); - -#define wglGetExtensionsStringARB WGLEW_GET_FUN(__wglewGetExtensionsStringARB) - -#define WGLEW_ARB_extensions_string WGLEW_GET_VAR(__WGLEW_ARB_extensions_string) - -#endif /* WGL_ARB_extensions_string */ - -/* ------------------------ WGL_ARB_framebuffer_sRGB ----------------------- */ - -#ifndef WGL_ARB_framebuffer_sRGB -#define WGL_ARB_framebuffer_sRGB 1 - -#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9 - -#define WGLEW_ARB_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_ARB_framebuffer_sRGB) - -#endif /* WGL_ARB_framebuffer_sRGB */ - -/* ----------------------- WGL_ARB_make_current_read ----------------------- */ - -#ifndef WGL_ARB_make_current_read -#define WGL_ARB_make_current_read 1 - -#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 -#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 - -typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (VOID); -typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); - -#define wglGetCurrentReadDCARB WGLEW_GET_FUN(__wglewGetCurrentReadDCARB) -#define wglMakeContextCurrentARB WGLEW_GET_FUN(__wglewMakeContextCurrentARB) - -#define WGLEW_ARB_make_current_read WGLEW_GET_VAR(__WGLEW_ARB_make_current_read) - -#endif /* WGL_ARB_make_current_read */ - -/* -------------------------- WGL_ARB_multisample -------------------------- */ - -#ifndef WGL_ARB_multisample -#define WGL_ARB_multisample 1 - -#define WGL_SAMPLE_BUFFERS_ARB 0x2041 -#define WGL_SAMPLES_ARB 0x2042 - -#define WGLEW_ARB_multisample WGLEW_GET_VAR(__WGLEW_ARB_multisample) - -#endif /* WGL_ARB_multisample */ - -/* ---------------------------- WGL_ARB_pbuffer ---------------------------- */ - -#ifndef WGL_ARB_pbuffer -#define WGL_ARB_pbuffer 1 - -#define WGL_DRAW_TO_PBUFFER_ARB 0x202D -#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E -#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F -#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 -#define WGL_PBUFFER_LARGEST_ARB 0x2033 -#define WGL_PBUFFER_WIDTH_ARB 0x2034 -#define WGL_PBUFFER_HEIGHT_ARB 0x2035 -#define WGL_PBUFFER_LOST_ARB 0x2036 - -DECLARE_HANDLE(HPBUFFERARB); - -typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); -typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); -typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); -typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int* piValue); -typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); - -#define wglCreatePbufferARB WGLEW_GET_FUN(__wglewCreatePbufferARB) -#define wglDestroyPbufferARB WGLEW_GET_FUN(__wglewDestroyPbufferARB) -#define wglGetPbufferDCARB WGLEW_GET_FUN(__wglewGetPbufferDCARB) -#define wglQueryPbufferARB WGLEW_GET_FUN(__wglewQueryPbufferARB) -#define wglReleasePbufferDCARB WGLEW_GET_FUN(__wglewReleasePbufferDCARB) - -#define WGLEW_ARB_pbuffer WGLEW_GET_VAR(__WGLEW_ARB_pbuffer) - -#endif /* WGL_ARB_pbuffer */ - -/* -------------------------- WGL_ARB_pixel_format ------------------------- */ - -#ifndef WGL_ARB_pixel_format -#define WGL_ARB_pixel_format 1 - -#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 -#define WGL_DRAW_TO_WINDOW_ARB 0x2001 -#define WGL_DRAW_TO_BITMAP_ARB 0x2002 -#define WGL_ACCELERATION_ARB 0x2003 -#define WGL_NEED_PALETTE_ARB 0x2004 -#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 -#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 -#define WGL_SWAP_METHOD_ARB 0x2007 -#define WGL_NUMBER_OVERLAYS_ARB 0x2008 -#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 -#define WGL_TRANSPARENT_ARB 0x200A -#define WGL_SHARE_DEPTH_ARB 0x200C -#define WGL_SHARE_STENCIL_ARB 0x200D -#define WGL_SHARE_ACCUM_ARB 0x200E -#define WGL_SUPPORT_GDI_ARB 0x200F -#define WGL_SUPPORT_OPENGL_ARB 0x2010 -#define WGL_DOUBLE_BUFFER_ARB 0x2011 -#define WGL_STEREO_ARB 0x2012 -#define WGL_PIXEL_TYPE_ARB 0x2013 -#define WGL_COLOR_BITS_ARB 0x2014 -#define WGL_RED_BITS_ARB 0x2015 -#define WGL_RED_SHIFT_ARB 0x2016 -#define WGL_GREEN_BITS_ARB 0x2017 -#define WGL_GREEN_SHIFT_ARB 0x2018 -#define WGL_BLUE_BITS_ARB 0x2019 -#define WGL_BLUE_SHIFT_ARB 0x201A -#define WGL_ALPHA_BITS_ARB 0x201B -#define WGL_ALPHA_SHIFT_ARB 0x201C -#define WGL_ACCUM_BITS_ARB 0x201D -#define WGL_ACCUM_RED_BITS_ARB 0x201E -#define WGL_ACCUM_GREEN_BITS_ARB 0x201F -#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 -#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 -#define WGL_DEPTH_BITS_ARB 0x2022 -#define WGL_STENCIL_BITS_ARB 0x2023 -#define WGL_AUX_BUFFERS_ARB 0x2024 -#define WGL_NO_ACCELERATION_ARB 0x2025 -#define WGL_GENERIC_ACCELERATION_ARB 0x2026 -#define WGL_FULL_ACCELERATION_ARB 0x2027 -#define WGL_SWAP_EXCHANGE_ARB 0x2028 -#define WGL_SWAP_COPY_ARB 0x2029 -#define WGL_SWAP_UNDEFINED_ARB 0x202A -#define WGL_TYPE_RGBA_ARB 0x202B -#define WGL_TYPE_COLORINDEX_ARB 0x202C -#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 -#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 -#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 -#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A -#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B - -typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT *pfValues); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int *piValues); - -#define wglChoosePixelFormatARB WGLEW_GET_FUN(__wglewChoosePixelFormatARB) -#define wglGetPixelFormatAttribfvARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvARB) -#define wglGetPixelFormatAttribivARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribivARB) - -#define WGLEW_ARB_pixel_format WGLEW_GET_VAR(__WGLEW_ARB_pixel_format) - -#endif /* WGL_ARB_pixel_format */ - -/* ----------------------- WGL_ARB_pixel_format_float ---------------------- */ - -#ifndef WGL_ARB_pixel_format_float -#define WGL_ARB_pixel_format_float 1 - -#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 - -#define WGLEW_ARB_pixel_format_float WGLEW_GET_VAR(__WGLEW_ARB_pixel_format_float) - -#endif /* WGL_ARB_pixel_format_float */ - -/* ------------------------- WGL_ARB_render_texture ------------------------ */ - -#ifndef WGL_ARB_render_texture -#define WGL_ARB_render_texture 1 - -#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 -#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 -#define WGL_TEXTURE_FORMAT_ARB 0x2072 -#define WGL_TEXTURE_TARGET_ARB 0x2073 -#define WGL_MIPMAP_TEXTURE_ARB 0x2074 -#define WGL_TEXTURE_RGB_ARB 0x2075 -#define WGL_TEXTURE_RGBA_ARB 0x2076 -#define WGL_NO_TEXTURE_ARB 0x2077 -#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 -#define WGL_TEXTURE_1D_ARB 0x2079 -#define WGL_TEXTURE_2D_ARB 0x207A -#define WGL_MIPMAP_LEVEL_ARB 0x207B -#define WGL_CUBE_MAP_FACE_ARB 0x207C -#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D -#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E -#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F -#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 -#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 -#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 -#define WGL_FRONT_LEFT_ARB 0x2083 -#define WGL_FRONT_RIGHT_ARB 0x2084 -#define WGL_BACK_LEFT_ARB 0x2085 -#define WGL_BACK_RIGHT_ARB 0x2086 -#define WGL_AUX0_ARB 0x2087 -#define WGL_AUX1_ARB 0x2088 -#define WGL_AUX2_ARB 0x2089 -#define WGL_AUX3_ARB 0x208A -#define WGL_AUX4_ARB 0x208B -#define WGL_AUX5_ARB 0x208C -#define WGL_AUX6_ARB 0x208D -#define WGL_AUX7_ARB 0x208E -#define WGL_AUX8_ARB 0x208F -#define WGL_AUX9_ARB 0x2090 - -typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); -typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); -typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int* piAttribList); - -#define wglBindTexImageARB WGLEW_GET_FUN(__wglewBindTexImageARB) -#define wglReleaseTexImageARB WGLEW_GET_FUN(__wglewReleaseTexImageARB) -#define wglSetPbufferAttribARB WGLEW_GET_FUN(__wglewSetPbufferAttribARB) - -#define WGLEW_ARB_render_texture WGLEW_GET_VAR(__WGLEW_ARB_render_texture) - -#endif /* WGL_ARB_render_texture */ - -/* ---------------- WGL_ARB_robustness_application_isolation --------------- */ - -#ifndef WGL_ARB_robustness_application_isolation -#define WGL_ARB_robustness_application_isolation 1 - -#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 - -#define WGLEW_ARB_robustness_application_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_application_isolation) - -#endif /* WGL_ARB_robustness_application_isolation */ - -/* ---------------- WGL_ARB_robustness_share_group_isolation --------------- */ - -#ifndef WGL_ARB_robustness_share_group_isolation -#define WGL_ARB_robustness_share_group_isolation 1 - -#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 - -#define WGLEW_ARB_robustness_share_group_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_share_group_isolation) - -#endif /* WGL_ARB_robustness_share_group_isolation */ - -/* ----------------------- WGL_ATI_pixel_format_float ---------------------- */ - -#ifndef WGL_ATI_pixel_format_float -#define WGL_ATI_pixel_format_float 1 - -#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 -#define GL_RGBA_FLOAT_MODE_ATI 0x8820 -#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 - -#define WGLEW_ATI_pixel_format_float WGLEW_GET_VAR(__WGLEW_ATI_pixel_format_float) - -#endif /* WGL_ATI_pixel_format_float */ - -/* -------------------- WGL_ATI_render_texture_rectangle ------------------- */ - -#ifndef WGL_ATI_render_texture_rectangle -#define WGL_ATI_render_texture_rectangle 1 - -#define WGL_TEXTURE_RECTANGLE_ATI 0x21A5 - -#define WGLEW_ATI_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_ATI_render_texture_rectangle) - -#endif /* WGL_ATI_render_texture_rectangle */ - -/* --------------------------- WGL_EXT_colorspace -------------------------- */ - -#ifndef WGL_EXT_colorspace -#define WGL_EXT_colorspace 1 - -#define WGL_COLORSPACE_SRGB_EXT 0x3089 -#define WGL_COLORSPACE_LINEAR_EXT 0x308A -#define WGL_COLORSPACE_EXT 0x309D - -#define WGLEW_EXT_colorspace WGLEW_GET_VAR(__WGLEW_EXT_colorspace) - -#endif /* WGL_EXT_colorspace */ - -/* ------------------- WGL_EXT_create_context_es2_profile ------------------ */ - -#ifndef WGL_EXT_create_context_es2_profile -#define WGL_EXT_create_context_es2_profile 1 - -#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 - -#define WGLEW_EXT_create_context_es2_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es2_profile) - -#endif /* WGL_EXT_create_context_es2_profile */ - -/* ------------------- WGL_EXT_create_context_es_profile ------------------- */ - -#ifndef WGL_EXT_create_context_es_profile -#define WGL_EXT_create_context_es_profile 1 - -#define WGL_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 - -#define WGLEW_EXT_create_context_es_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es_profile) - -#endif /* WGL_EXT_create_context_es_profile */ - -/* -------------------------- WGL_EXT_depth_float -------------------------- */ - -#ifndef WGL_EXT_depth_float -#define WGL_EXT_depth_float 1 - -#define WGL_DEPTH_FLOAT_EXT 0x2040 - -#define WGLEW_EXT_depth_float WGLEW_GET_VAR(__WGLEW_EXT_depth_float) - -#endif /* WGL_EXT_depth_float */ - -/* ---------------------- WGL_EXT_display_color_table ---------------------- */ - -#ifndef WGL_EXT_display_color_table -#define WGL_EXT_display_color_table 1 - -typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); -typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); -typedef void (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); -typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (GLushort* table, GLuint length); - -#define wglBindDisplayColorTableEXT WGLEW_GET_FUN(__wglewBindDisplayColorTableEXT) -#define wglCreateDisplayColorTableEXT WGLEW_GET_FUN(__wglewCreateDisplayColorTableEXT) -#define wglDestroyDisplayColorTableEXT WGLEW_GET_FUN(__wglewDestroyDisplayColorTableEXT) -#define wglLoadDisplayColorTableEXT WGLEW_GET_FUN(__wglewLoadDisplayColorTableEXT) - -#define WGLEW_EXT_display_color_table WGLEW_GET_VAR(__WGLEW_EXT_display_color_table) - -#endif /* WGL_EXT_display_color_table */ - -/* ----------------------- WGL_EXT_extensions_string ----------------------- */ - -#ifndef WGL_EXT_extensions_string -#define WGL_EXT_extensions_string 1 - -typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void); - -#define wglGetExtensionsStringEXT WGLEW_GET_FUN(__wglewGetExtensionsStringEXT) - -#define WGLEW_EXT_extensions_string WGLEW_GET_VAR(__WGLEW_EXT_extensions_string) - -#endif /* WGL_EXT_extensions_string */ - -/* ------------------------ WGL_EXT_framebuffer_sRGB ----------------------- */ - -#ifndef WGL_EXT_framebuffer_sRGB -#define WGL_EXT_framebuffer_sRGB 1 - -#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9 - -#define WGLEW_EXT_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_EXT_framebuffer_sRGB) - -#endif /* WGL_EXT_framebuffer_sRGB */ - -/* ----------------------- WGL_EXT_make_current_read ----------------------- */ - -#ifndef WGL_EXT_make_current_read -#define WGL_EXT_make_current_read 1 - -#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043 - -typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (VOID); -typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); - -#define wglGetCurrentReadDCEXT WGLEW_GET_FUN(__wglewGetCurrentReadDCEXT) -#define wglMakeContextCurrentEXT WGLEW_GET_FUN(__wglewMakeContextCurrentEXT) - -#define WGLEW_EXT_make_current_read WGLEW_GET_VAR(__WGLEW_EXT_make_current_read) - -#endif /* WGL_EXT_make_current_read */ - -/* -------------------------- WGL_EXT_multisample -------------------------- */ - -#ifndef WGL_EXT_multisample -#define WGL_EXT_multisample 1 - -#define WGL_SAMPLE_BUFFERS_EXT 0x2041 -#define WGL_SAMPLES_EXT 0x2042 - -#define WGLEW_EXT_multisample WGLEW_GET_VAR(__WGLEW_EXT_multisample) - -#endif /* WGL_EXT_multisample */ - -/* ---------------------------- WGL_EXT_pbuffer ---------------------------- */ - -#ifndef WGL_EXT_pbuffer -#define WGL_EXT_pbuffer 1 - -#define WGL_DRAW_TO_PBUFFER_EXT 0x202D -#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E -#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F -#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 -#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 -#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 -#define WGL_PBUFFER_LARGEST_EXT 0x2033 -#define WGL_PBUFFER_WIDTH_EXT 0x2034 -#define WGL_PBUFFER_HEIGHT_EXT 0x2035 - -DECLARE_HANDLE(HPBUFFEREXT); - -typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); -typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); -typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); -typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue); -typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); - -#define wglCreatePbufferEXT WGLEW_GET_FUN(__wglewCreatePbufferEXT) -#define wglDestroyPbufferEXT WGLEW_GET_FUN(__wglewDestroyPbufferEXT) -#define wglGetPbufferDCEXT WGLEW_GET_FUN(__wglewGetPbufferDCEXT) -#define wglQueryPbufferEXT WGLEW_GET_FUN(__wglewQueryPbufferEXT) -#define wglReleasePbufferDCEXT WGLEW_GET_FUN(__wglewReleasePbufferDCEXT) - -#define WGLEW_EXT_pbuffer WGLEW_GET_VAR(__WGLEW_EXT_pbuffer) - -#endif /* WGL_EXT_pbuffer */ - -/* -------------------------- WGL_EXT_pixel_format ------------------------- */ - -#ifndef WGL_EXT_pixel_format -#define WGL_EXT_pixel_format 1 - -#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 -#define WGL_DRAW_TO_WINDOW_EXT 0x2001 -#define WGL_DRAW_TO_BITMAP_EXT 0x2002 -#define WGL_ACCELERATION_EXT 0x2003 -#define WGL_NEED_PALETTE_EXT 0x2004 -#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 -#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 -#define WGL_SWAP_METHOD_EXT 0x2007 -#define WGL_NUMBER_OVERLAYS_EXT 0x2008 -#define WGL_NUMBER_UNDERLAYS_EXT 0x2009 -#define WGL_TRANSPARENT_EXT 0x200A -#define WGL_TRANSPARENT_VALUE_EXT 0x200B -#define WGL_SHARE_DEPTH_EXT 0x200C -#define WGL_SHARE_STENCIL_EXT 0x200D -#define WGL_SHARE_ACCUM_EXT 0x200E -#define WGL_SUPPORT_GDI_EXT 0x200F -#define WGL_SUPPORT_OPENGL_EXT 0x2010 -#define WGL_DOUBLE_BUFFER_EXT 0x2011 -#define WGL_STEREO_EXT 0x2012 -#define WGL_PIXEL_TYPE_EXT 0x2013 -#define WGL_COLOR_BITS_EXT 0x2014 -#define WGL_RED_BITS_EXT 0x2015 -#define WGL_RED_SHIFT_EXT 0x2016 -#define WGL_GREEN_BITS_EXT 0x2017 -#define WGL_GREEN_SHIFT_EXT 0x2018 -#define WGL_BLUE_BITS_EXT 0x2019 -#define WGL_BLUE_SHIFT_EXT 0x201A -#define WGL_ALPHA_BITS_EXT 0x201B -#define WGL_ALPHA_SHIFT_EXT 0x201C -#define WGL_ACCUM_BITS_EXT 0x201D -#define WGL_ACCUM_RED_BITS_EXT 0x201E -#define WGL_ACCUM_GREEN_BITS_EXT 0x201F -#define WGL_ACCUM_BLUE_BITS_EXT 0x2020 -#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 -#define WGL_DEPTH_BITS_EXT 0x2022 -#define WGL_STENCIL_BITS_EXT 0x2023 -#define WGL_AUX_BUFFERS_EXT 0x2024 -#define WGL_NO_ACCELERATION_EXT 0x2025 -#define WGL_GENERIC_ACCELERATION_EXT 0x2026 -#define WGL_FULL_ACCELERATION_EXT 0x2027 -#define WGL_SWAP_EXCHANGE_EXT 0x2028 -#define WGL_SWAP_COPY_EXT 0x2029 -#define WGL_SWAP_UNDEFINED_EXT 0x202A -#define WGL_TYPE_RGBA_EXT 0x202B -#define WGL_TYPE_COLORINDEX_EXT 0x202C - -typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT *pfValues); -typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int *piValues); - -#define wglChoosePixelFormatEXT WGLEW_GET_FUN(__wglewChoosePixelFormatEXT) -#define wglGetPixelFormatAttribfvEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvEXT) -#define wglGetPixelFormatAttribivEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribivEXT) - -#define WGLEW_EXT_pixel_format WGLEW_GET_VAR(__WGLEW_EXT_pixel_format) - -#endif /* WGL_EXT_pixel_format */ - -/* ------------------- WGL_EXT_pixel_format_packed_float ------------------- */ - -#ifndef WGL_EXT_pixel_format_packed_float -#define WGL_EXT_pixel_format_packed_float 1 - -#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8 - -#define WGLEW_EXT_pixel_format_packed_float WGLEW_GET_VAR(__WGLEW_EXT_pixel_format_packed_float) - -#endif /* WGL_EXT_pixel_format_packed_float */ - -/* -------------------------- WGL_EXT_swap_control ------------------------- */ - -#ifndef WGL_EXT_swap_control -#define WGL_EXT_swap_control 1 - -typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); -typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); - -#define wglGetSwapIntervalEXT WGLEW_GET_FUN(__wglewGetSwapIntervalEXT) -#define wglSwapIntervalEXT WGLEW_GET_FUN(__wglewSwapIntervalEXT) - -#define WGLEW_EXT_swap_control WGLEW_GET_VAR(__WGLEW_EXT_swap_control) - -#endif /* WGL_EXT_swap_control */ - -/* ----------------------- WGL_EXT_swap_control_tear ----------------------- */ - -#ifndef WGL_EXT_swap_control_tear -#define WGL_EXT_swap_control_tear 1 - -#define WGLEW_EXT_swap_control_tear WGLEW_GET_VAR(__WGLEW_EXT_swap_control_tear) - -#endif /* WGL_EXT_swap_control_tear */ - -/* --------------------- WGL_I3D_digital_video_control --------------------- */ - -#ifndef WGL_I3D_digital_video_control -#define WGL_I3D_digital_video_control 1 - -#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 -#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 -#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 -#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 - -typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); -typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); - -#define wglGetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewGetDigitalVideoParametersI3D) -#define wglSetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewSetDigitalVideoParametersI3D) - -#define WGLEW_I3D_digital_video_control WGLEW_GET_VAR(__WGLEW_I3D_digital_video_control) - -#endif /* WGL_I3D_digital_video_control */ - -/* ----------------------------- WGL_I3D_gamma ----------------------------- */ - -#ifndef WGL_I3D_gamma -#define WGL_I3D_gamma 1 - -#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E -#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F - -typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT* puRed, USHORT *puGreen, USHORT *puBlue); -typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); -typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT* puRed, const USHORT *puGreen, const USHORT *puBlue); -typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); - -#define wglGetGammaTableI3D WGLEW_GET_FUN(__wglewGetGammaTableI3D) -#define wglGetGammaTableParametersI3D WGLEW_GET_FUN(__wglewGetGammaTableParametersI3D) -#define wglSetGammaTableI3D WGLEW_GET_FUN(__wglewSetGammaTableI3D) -#define wglSetGammaTableParametersI3D WGLEW_GET_FUN(__wglewSetGammaTableParametersI3D) - -#define WGLEW_I3D_gamma WGLEW_GET_VAR(__WGLEW_I3D_gamma) - -#endif /* WGL_I3D_gamma */ - -/* ---------------------------- WGL_I3D_genlock ---------------------------- */ - -#ifndef WGL_I3D_genlock -#define WGL_I3D_genlock 1 - -#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 -#define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045 -#define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046 -#define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047 -#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 -#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 -#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A -#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B -#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C - -typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); -typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); -typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); -typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); -typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); -typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); -typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT* uRate); -typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT* uDelay); -typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT* uEdge); -typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT* uSource); -typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL* pFlag); -typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT* uMaxLineDelay, UINT *uMaxPixelDelay); - -#define wglDisableGenlockI3D WGLEW_GET_FUN(__wglewDisableGenlockI3D) -#define wglEnableGenlockI3D WGLEW_GET_FUN(__wglewEnableGenlockI3D) -#define wglGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGenlockSampleRateI3D) -#define wglGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGenlockSourceDelayI3D) -#define wglGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGenlockSourceEdgeI3D) -#define wglGenlockSourceI3D WGLEW_GET_FUN(__wglewGenlockSourceI3D) -#define wglGetGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGetGenlockSampleRateI3D) -#define wglGetGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGetGenlockSourceDelayI3D) -#define wglGetGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGetGenlockSourceEdgeI3D) -#define wglGetGenlockSourceI3D WGLEW_GET_FUN(__wglewGetGenlockSourceI3D) -#define wglIsEnabledGenlockI3D WGLEW_GET_FUN(__wglewIsEnabledGenlockI3D) -#define wglQueryGenlockMaxSourceDelayI3D WGLEW_GET_FUN(__wglewQueryGenlockMaxSourceDelayI3D) - -#define WGLEW_I3D_genlock WGLEW_GET_VAR(__WGLEW_I3D_genlock) - -#endif /* WGL_I3D_genlock */ - -/* -------------------------- WGL_I3D_image_buffer ------------------------- */ - -#ifndef WGL_I3D_image_buffer -#define WGL_I3D_image_buffer 1 - -#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 -#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 - -typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, HANDLE* pEvent, LPVOID *pAddress, DWORD *pSize, UINT count); -typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); -typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); -typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, LPVOID* pAddress, UINT count); - -#define wglAssociateImageBufferEventsI3D WGLEW_GET_FUN(__wglewAssociateImageBufferEventsI3D) -#define wglCreateImageBufferI3D WGLEW_GET_FUN(__wglewCreateImageBufferI3D) -#define wglDestroyImageBufferI3D WGLEW_GET_FUN(__wglewDestroyImageBufferI3D) -#define wglReleaseImageBufferEventsI3D WGLEW_GET_FUN(__wglewReleaseImageBufferEventsI3D) - -#define WGLEW_I3D_image_buffer WGLEW_GET_VAR(__WGLEW_I3D_image_buffer) - -#endif /* WGL_I3D_image_buffer */ - -/* ------------------------ WGL_I3D_swap_frame_lock ------------------------ */ - -#ifndef WGL_I3D_swap_frame_lock -#define WGL_I3D_swap_frame_lock 1 - -typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (VOID); -typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (VOID); -typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL* pFlag); -typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL* pFlag); - -#define wglDisableFrameLockI3D WGLEW_GET_FUN(__wglewDisableFrameLockI3D) -#define wglEnableFrameLockI3D WGLEW_GET_FUN(__wglewEnableFrameLockI3D) -#define wglIsEnabledFrameLockI3D WGLEW_GET_FUN(__wglewIsEnabledFrameLockI3D) -#define wglQueryFrameLockMasterI3D WGLEW_GET_FUN(__wglewQueryFrameLockMasterI3D) - -#define WGLEW_I3D_swap_frame_lock WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_lock) - -#endif /* WGL_I3D_swap_frame_lock */ - -/* ------------------------ WGL_I3D_swap_frame_usage ----------------------- */ - -#ifndef WGL_I3D_swap_frame_usage -#define WGL_I3D_swap_frame_usage 1 - -typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void); -typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void); -typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float* pUsage); -typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); - -#define wglBeginFrameTrackingI3D WGLEW_GET_FUN(__wglewBeginFrameTrackingI3D) -#define wglEndFrameTrackingI3D WGLEW_GET_FUN(__wglewEndFrameTrackingI3D) -#define wglGetFrameUsageI3D WGLEW_GET_FUN(__wglewGetFrameUsageI3D) -#define wglQueryFrameTrackingI3D WGLEW_GET_FUN(__wglewQueryFrameTrackingI3D) - -#define WGLEW_I3D_swap_frame_usage WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_usage) - -#endif /* WGL_I3D_swap_frame_usage */ - -/* --------------------------- WGL_NV_DX_interop --------------------------- */ - -#ifndef WGL_NV_DX_interop -#define WGL_NV_DX_interop 1 - -#define WGL_ACCESS_READ_ONLY_NV 0x0000 -#define WGL_ACCESS_READ_WRITE_NV 0x0001 -#define WGL_ACCESS_WRITE_DISCARD_NV 0x0002 - -typedef BOOL (WINAPI * PFNWGLDXCLOSEDEVICENVPROC) (HANDLE hDevice); -typedef BOOL (WINAPI * PFNWGLDXLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects); -typedef BOOL (WINAPI * PFNWGLDXOBJECTACCESSNVPROC) (HANDLE hObject, GLenum access); -typedef HANDLE (WINAPI * PFNWGLDXOPENDEVICENVPROC) (void* dxDevice); -typedef HANDLE (WINAPI * PFNWGLDXREGISTEROBJECTNVPROC) (HANDLE hDevice, void* dxObject, GLuint name, GLenum type, GLenum access); -typedef BOOL (WINAPI * PFNWGLDXSETRESOURCESHAREHANDLENVPROC) (void* dxObject, HANDLE shareHandle); -typedef BOOL (WINAPI * PFNWGLDXUNLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects); -typedef BOOL (WINAPI * PFNWGLDXUNREGISTEROBJECTNVPROC) (HANDLE hDevice, HANDLE hObject); - -#define wglDXCloseDeviceNV WGLEW_GET_FUN(__wglewDXCloseDeviceNV) -#define wglDXLockObjectsNV WGLEW_GET_FUN(__wglewDXLockObjectsNV) -#define wglDXObjectAccessNV WGLEW_GET_FUN(__wglewDXObjectAccessNV) -#define wglDXOpenDeviceNV WGLEW_GET_FUN(__wglewDXOpenDeviceNV) -#define wglDXRegisterObjectNV WGLEW_GET_FUN(__wglewDXRegisterObjectNV) -#define wglDXSetResourceShareHandleNV WGLEW_GET_FUN(__wglewDXSetResourceShareHandleNV) -#define wglDXUnlockObjectsNV WGLEW_GET_FUN(__wglewDXUnlockObjectsNV) -#define wglDXUnregisterObjectNV WGLEW_GET_FUN(__wglewDXUnregisterObjectNV) - -#define WGLEW_NV_DX_interop WGLEW_GET_VAR(__WGLEW_NV_DX_interop) - -#endif /* WGL_NV_DX_interop */ - -/* --------------------------- WGL_NV_DX_interop2 -------------------------- */ - -#ifndef WGL_NV_DX_interop2 -#define WGL_NV_DX_interop2 1 - -#define WGLEW_NV_DX_interop2 WGLEW_GET_VAR(__WGLEW_NV_DX_interop2) - -#endif /* WGL_NV_DX_interop2 */ - -/* --------------------------- WGL_NV_copy_image --------------------------- */ - -#ifndef WGL_NV_copy_image -#define WGL_NV_copy_image 1 - -typedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); - -#define wglCopyImageSubDataNV WGLEW_GET_FUN(__wglewCopyImageSubDataNV) - -#define WGLEW_NV_copy_image WGLEW_GET_VAR(__WGLEW_NV_copy_image) - -#endif /* WGL_NV_copy_image */ - -/* ------------------------ WGL_NV_delay_before_swap ----------------------- */ - -#ifndef WGL_NV_delay_before_swap -#define WGL_NV_delay_before_swap 1 - -typedef BOOL (WINAPI * PFNWGLDELAYBEFORESWAPNVPROC) (HDC hDC, GLfloat seconds); - -#define wglDelayBeforeSwapNV WGLEW_GET_FUN(__wglewDelayBeforeSwapNV) - -#define WGLEW_NV_delay_before_swap WGLEW_GET_VAR(__WGLEW_NV_delay_before_swap) - -#endif /* WGL_NV_delay_before_swap */ - -/* -------------------------- WGL_NV_float_buffer -------------------------- */ - -#ifndef WGL_NV_float_buffer -#define WGL_NV_float_buffer 1 - -#define WGL_FLOAT_COMPONENTS_NV 0x20B0 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 -#define WGL_TEXTURE_FLOAT_R_NV 0x20B5 -#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 -#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 -#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 - -#define WGLEW_NV_float_buffer WGLEW_GET_VAR(__WGLEW_NV_float_buffer) - -#endif /* WGL_NV_float_buffer */ - -/* -------------------------- WGL_NV_gpu_affinity -------------------------- */ - -#ifndef WGL_NV_gpu_affinity -#define WGL_NV_gpu_affinity 1 - -#define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0 -#define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1 - -DECLARE_HANDLE(HGPUNV); -typedef struct _GPU_DEVICE { - DWORD cb; - CHAR DeviceName[32]; - CHAR DeviceString[128]; - DWORD Flags; - RECT rcVirtualScreen; -} GPU_DEVICE, *PGPU_DEVICE; - -typedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList); -typedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc); -typedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice); -typedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu); -typedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu); - -#define wglCreateAffinityDCNV WGLEW_GET_FUN(__wglewCreateAffinityDCNV) -#define wglDeleteDCNV WGLEW_GET_FUN(__wglewDeleteDCNV) -#define wglEnumGpuDevicesNV WGLEW_GET_FUN(__wglewEnumGpuDevicesNV) -#define wglEnumGpusFromAffinityDCNV WGLEW_GET_FUN(__wglewEnumGpusFromAffinityDCNV) -#define wglEnumGpusNV WGLEW_GET_FUN(__wglewEnumGpusNV) - -#define WGLEW_NV_gpu_affinity WGLEW_GET_VAR(__WGLEW_NV_gpu_affinity) - -#endif /* WGL_NV_gpu_affinity */ - -/* ---------------------- WGL_NV_multisample_coverage ---------------------- */ - -#ifndef WGL_NV_multisample_coverage -#define WGL_NV_multisample_coverage 1 - -#define WGL_COVERAGE_SAMPLES_NV 0x2042 -#define WGL_COLOR_SAMPLES_NV 0x20B9 - -#define WGLEW_NV_multisample_coverage WGLEW_GET_VAR(__WGLEW_NV_multisample_coverage) - -#endif /* WGL_NV_multisample_coverage */ - -/* -------------------------- WGL_NV_present_video ------------------------- */ - -#ifndef WGL_NV_present_video -#define WGL_NV_present_video 1 - -#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0 - -DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); - -typedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int* piAttribList); -typedef int (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDc, HVIDEOOUTPUTDEVICENV* phDeviceList); -typedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int* piValue); - -#define wglBindVideoDeviceNV WGLEW_GET_FUN(__wglewBindVideoDeviceNV) -#define wglEnumerateVideoDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoDevicesNV) -#define wglQueryCurrentContextNV WGLEW_GET_FUN(__wglewQueryCurrentContextNV) - -#define WGLEW_NV_present_video WGLEW_GET_VAR(__WGLEW_NV_present_video) - -#endif /* WGL_NV_present_video */ - -/* ---------------------- WGL_NV_render_depth_texture ---------------------- */ - -#ifndef WGL_NV_render_depth_texture -#define WGL_NV_render_depth_texture 1 - -#define WGL_NO_TEXTURE_ARB 0x2077 -#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 -#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 -#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 -#define WGL_DEPTH_COMPONENT_NV 0x20A7 - -#define WGLEW_NV_render_depth_texture WGLEW_GET_VAR(__WGLEW_NV_render_depth_texture) - -#endif /* WGL_NV_render_depth_texture */ - -/* -------------------- WGL_NV_render_texture_rectangle -------------------- */ - -#ifndef WGL_NV_render_texture_rectangle -#define WGL_NV_render_texture_rectangle 1 - -#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 -#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 -#define WGL_TEXTURE_RECTANGLE_NV 0x20A2 - -#define WGLEW_NV_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_NV_render_texture_rectangle) - -#endif /* WGL_NV_render_texture_rectangle */ - -/* --------------------------- WGL_NV_swap_group --------------------------- */ - -#ifndef WGL_NV_swap_group -#define WGL_NV_swap_group 1 - -typedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier); -typedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group); -typedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint* count); -typedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint* maxGroups, GLuint *maxBarriers); -typedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint* group, GLuint *barrier); -typedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC); - -#define wglBindSwapBarrierNV WGLEW_GET_FUN(__wglewBindSwapBarrierNV) -#define wglJoinSwapGroupNV WGLEW_GET_FUN(__wglewJoinSwapGroupNV) -#define wglQueryFrameCountNV WGLEW_GET_FUN(__wglewQueryFrameCountNV) -#define wglQueryMaxSwapGroupsNV WGLEW_GET_FUN(__wglewQueryMaxSwapGroupsNV) -#define wglQuerySwapGroupNV WGLEW_GET_FUN(__wglewQuerySwapGroupNV) -#define wglResetFrameCountNV WGLEW_GET_FUN(__wglewResetFrameCountNV) - -#define WGLEW_NV_swap_group WGLEW_GET_VAR(__WGLEW_NV_swap_group) - -#endif /* WGL_NV_swap_group */ - -/* ----------------------- WGL_NV_vertex_array_range ----------------------- */ - -#ifndef WGL_NV_vertex_array_range -#define WGL_NV_vertex_array_range 1 - -typedef void * (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); -typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer); - -#define wglAllocateMemoryNV WGLEW_GET_FUN(__wglewAllocateMemoryNV) -#define wglFreeMemoryNV WGLEW_GET_FUN(__wglewFreeMemoryNV) - -#define WGLEW_NV_vertex_array_range WGLEW_GET_VAR(__WGLEW_NV_vertex_array_range) - -#endif /* WGL_NV_vertex_array_range */ - -/* -------------------------- WGL_NV_video_capture ------------------------- */ - -#ifndef WGL_NV_video_capture -#define WGL_NV_video_capture 1 - -#define WGL_UNIQUE_ID_NV 0x20CE -#define WGL_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF - -DECLARE_HANDLE(HVIDEOINPUTDEVICENV); - -typedef BOOL (WINAPI * PFNWGLBINDVIDEOCAPTUREDEVICENVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice); -typedef UINT (WINAPI * PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV* phDeviceList); -typedef BOOL (WINAPI * PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); -typedef BOOL (WINAPI * PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int* piValue); -typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); - -#define wglBindVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewBindVideoCaptureDeviceNV) -#define wglEnumerateVideoCaptureDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoCaptureDevicesNV) -#define wglLockVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewLockVideoCaptureDeviceNV) -#define wglQueryVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewQueryVideoCaptureDeviceNV) -#define wglReleaseVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoCaptureDeviceNV) - -#define WGLEW_NV_video_capture WGLEW_GET_VAR(__WGLEW_NV_video_capture) - -#endif /* WGL_NV_video_capture */ - -/* -------------------------- WGL_NV_video_output -------------------------- */ - -#ifndef WGL_NV_video_output -#define WGL_NV_video_output 1 - -#define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0 -#define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1 -#define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2 -#define WGL_VIDEO_OUT_COLOR_NV 0x20C3 -#define WGL_VIDEO_OUT_ALPHA_NV 0x20C4 -#define WGL_VIDEO_OUT_DEPTH_NV 0x20C5 -#define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 -#define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 -#define WGL_VIDEO_OUT_FRAME 0x20C8 -#define WGL_VIDEO_OUT_FIELD_1 0x20C9 -#define WGL_VIDEO_OUT_FIELD_2 0x20CA -#define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB -#define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC - -DECLARE_HANDLE(HPVIDEODEV); - -typedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer); -typedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV* hVideoDevice); -typedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long* pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); -typedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice); -typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer); -typedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long* pulCounterPbuffer, BOOL bBlock); - -#define wglBindVideoImageNV WGLEW_GET_FUN(__wglewBindVideoImageNV) -#define wglGetVideoDeviceNV WGLEW_GET_FUN(__wglewGetVideoDeviceNV) -#define wglGetVideoInfoNV WGLEW_GET_FUN(__wglewGetVideoInfoNV) -#define wglReleaseVideoDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoDeviceNV) -#define wglReleaseVideoImageNV WGLEW_GET_FUN(__wglewReleaseVideoImageNV) -#define wglSendPbufferToVideoNV WGLEW_GET_FUN(__wglewSendPbufferToVideoNV) - -#define WGLEW_NV_video_output WGLEW_GET_VAR(__WGLEW_NV_video_output) - -#endif /* WGL_NV_video_output */ - -/* -------------------------- WGL_OML_sync_control ------------------------- */ - -#ifndef WGL_OML_sync_control -#define WGL_OML_sync_control 1 - -typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32* numerator, INT32 *denominator); -typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64* ust, INT64 *msc, INT64 *sbc); -typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); -typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); -typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64 *msc, INT64 *sbc); -typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64* ust, INT64 *msc, INT64 *sbc); - -#define wglGetMscRateOML WGLEW_GET_FUN(__wglewGetMscRateOML) -#define wglGetSyncValuesOML WGLEW_GET_FUN(__wglewGetSyncValuesOML) -#define wglSwapBuffersMscOML WGLEW_GET_FUN(__wglewSwapBuffersMscOML) -#define wglSwapLayerBuffersMscOML WGLEW_GET_FUN(__wglewSwapLayerBuffersMscOML) -#define wglWaitForMscOML WGLEW_GET_FUN(__wglewWaitForMscOML) -#define wglWaitForSbcOML WGLEW_GET_FUN(__wglewWaitForSbcOML) - -#define WGLEW_OML_sync_control WGLEW_GET_VAR(__WGLEW_OML_sync_control) - -#endif /* WGL_OML_sync_control */ - -/* ------------------------------------------------------------------------- */ - -#define WGLEW_FUN_EXPORT GLEW_FUN_EXPORT -#define WGLEW_VAR_EXPORT GLEW_VAR_EXPORT - -WGLEW_FUN_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL; - -WGLEW_FUN_EXPORT PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD; -WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD; -WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD; -WGLEW_FUN_EXPORT PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD; -WGLEW_FUN_EXPORT PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD; -WGLEW_FUN_EXPORT PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD; -WGLEW_FUN_EXPORT PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD; -WGLEW_FUN_EXPORT PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD; -WGLEW_FUN_EXPORT PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD; - -WGLEW_FUN_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB; -WGLEW_FUN_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB; -WGLEW_FUN_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB; -WGLEW_FUN_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB; - -WGLEW_FUN_EXPORT PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB; - -WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB; - -WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB; -WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB; - -WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB; -WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB; -WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB; -WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB; -WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB; - -WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB; -WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB; -WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB; - -WGLEW_FUN_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB; -WGLEW_FUN_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB; -WGLEW_FUN_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB; - -WGLEW_FUN_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT; -WGLEW_FUN_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT; -WGLEW_FUN_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT; -WGLEW_FUN_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT; - -WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT; - -WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT; -WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT; - -WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT; -WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT; -WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT; -WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT; -WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT; - -WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT; -WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT; -WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT; - -WGLEW_FUN_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT; -WGLEW_FUN_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT; - -WGLEW_FUN_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D; -WGLEW_FUN_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D; - -WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D; -WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D; -WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D; -WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D; - -WGLEW_FUN_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D; -WGLEW_FUN_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D; -WGLEW_FUN_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D; -WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D; -WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D; -WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D; -WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D; -WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D; -WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D; -WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D; -WGLEW_FUN_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D; -WGLEW_FUN_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D; - -WGLEW_FUN_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D; -WGLEW_FUN_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D; -WGLEW_FUN_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D; -WGLEW_FUN_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D; - -WGLEW_FUN_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D; -WGLEW_FUN_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D; -WGLEW_FUN_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D; -WGLEW_FUN_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D; - -WGLEW_FUN_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D; -WGLEW_FUN_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D; -WGLEW_FUN_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D; -WGLEW_FUN_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D; - -WGLEW_FUN_EXPORT PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV; -WGLEW_FUN_EXPORT PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV; -WGLEW_FUN_EXPORT PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV; -WGLEW_FUN_EXPORT PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV; -WGLEW_FUN_EXPORT PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV; -WGLEW_FUN_EXPORT PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV; -WGLEW_FUN_EXPORT PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV; -WGLEW_FUN_EXPORT PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV; - -WGLEW_FUN_EXPORT PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV; - -WGLEW_FUN_EXPORT PFNWGLDELAYBEFORESWAPNVPROC __wglewDelayBeforeSwapNV; - -WGLEW_FUN_EXPORT PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV; -WGLEW_FUN_EXPORT PFNWGLDELETEDCNVPROC __wglewDeleteDCNV; -WGLEW_FUN_EXPORT PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV; -WGLEW_FUN_EXPORT PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV; -WGLEW_FUN_EXPORT PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV; - -WGLEW_FUN_EXPORT PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV; -WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV; -WGLEW_FUN_EXPORT PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV; - -WGLEW_FUN_EXPORT PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV; -WGLEW_FUN_EXPORT PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV; -WGLEW_FUN_EXPORT PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV; -WGLEW_FUN_EXPORT PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV; -WGLEW_FUN_EXPORT PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV; -WGLEW_FUN_EXPORT PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV; - -WGLEW_FUN_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV; -WGLEW_FUN_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV; - -WGLEW_FUN_EXPORT PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV; -WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV; -WGLEW_FUN_EXPORT PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV; -WGLEW_FUN_EXPORT PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV; -WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV; - -WGLEW_FUN_EXPORT PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV; -WGLEW_FUN_EXPORT PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV; -WGLEW_FUN_EXPORT PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV; -WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV; -WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV; -WGLEW_FUN_EXPORT PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV; - -WGLEW_FUN_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML; -WGLEW_FUN_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML; -WGLEW_FUN_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML; -WGLEW_FUN_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML; -WGLEW_FUN_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML; -WGLEW_FUN_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML; -WGLEW_VAR_EXPORT GLboolean __WGLEW_3DFX_multisample; -WGLEW_VAR_EXPORT GLboolean __WGLEW_3DL_stereo_control; -WGLEW_VAR_EXPORT GLboolean __WGLEW_AMD_gpu_association; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_buffer_region; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_context_flush_control; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_no_error; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_profile; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_robustness; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_extensions_string; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_framebuffer_sRGB; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_make_current_read; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_multisample; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pbuffer; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format_float; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_render_texture; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_application_isolation; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_share_group_isolation; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_pixel_format_float; -WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_colorspace; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es2_profile; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es_profile; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_depth_float; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_display_color_table; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_extensions_string; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_framebuffer_sRGB; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_make_current_read; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_multisample; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pbuffer; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format_packed_float; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control; -WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control_tear; -WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_digital_video_control; -WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_gamma; -WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_genlock; -WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_image_buffer; -WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock; -WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop2; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_copy_image; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_delay_before_swap; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_float_buffer; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_gpu_affinity; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_multisample_coverage; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_present_video; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_depth_texture; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_swap_group; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_vertex_array_range; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_capture; -WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_output; -WGLEW_VAR_EXPORT GLboolean __WGLEW_OML_sync_control; -/* ------------------------------------------------------------------------- */ - -GLEWAPI GLenum GLEWAPIENTRY wglewInit (); -GLEWAPI GLboolean GLEWAPIENTRY wglewIsSupported (const char *name); - -#ifndef WGLEW_GET_VAR -#define WGLEW_GET_VAR(x) (*(const GLboolean*)&x) -#endif - -#ifndef WGLEW_GET_FUN -#define WGLEW_GET_FUN(x) x -#endif - -GLEWAPI GLboolean GLEWAPIENTRY wglewGetExtension (const char *name); - -#ifdef __cplusplus -} -#endif - -#undef GLEWAPI - -#endif /* __wglew_h__ */ diff --git a/src/engine/external/glew/LICENSE.txt b/src/engine/external/glew/LICENSE.txt deleted file mode 100644 index f7078042e9..0000000000 --- a/src/engine/external/glew/LICENSE.txt +++ /dev/null @@ -1,73 +0,0 @@ -The OpenGL Extension Wrangler Library -Copyright (C) 2002-2007, Milan Ikits -Copyright (C) 2002-2007, Marcelo E. Magallon -Copyright (C) 2002, Lev Povalahev -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. -* The name of the author may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -THE POSSIBILITY OF SUCH DAMAGE. - - -Mesa 3-D graphics library -Version: 7.0 - -Copyright (C) 1999-2007 Brian Paul All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -Copyright (c) 2007 The Khronos Group Inc. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and/or associated documentation files (the -"Materials"), to deal in the Materials without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Materials, and to -permit persons to whom the Materials are furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Materials. - -THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. diff --git a/src/engine/external/glew/README.md b/src/engine/external/glew/README.md deleted file mode 100644 index 6d8245b45a..0000000000 --- a/src/engine/external/glew/README.md +++ /dev/null @@ -1,190 +0,0 @@ -# GLEW - The OpenGL Extension Wrangler Library - -![](http://glew.sourceforge.net/glew.png) - -http://glew.sourceforge.net/ - -https://github.com/nigels-com/glew - -[![Build Status](https://travis-ci.org/nigels-com/glew.svg?branch=master)](https://travis-ci.org/nigels-com/glew) -[![Gitter](https://badges.gitter.im/nigels-com/glew.svg)](https://gitter.im/nigels-com/glew?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) -[![Download](https://img.shields.io/sourceforge/dm/glew.svg)](https://sourceforge.net/projects/glew/files/latest/download) - -## Downloads - -Current release is [2.1.0](https://sourceforge.net/projects/glew/files/glew/2.1.0/). -[(Change Log)](http://glew.sourceforge.net/log.html) - -Sources available as -[ZIP](https://sourceforge.net/projects/glew/files/glew/2.1.0/glew-2.1.0.zip/download) or -[TGZ](https://sourceforge.net/projects/glew/files/glew/2.1.0/glew-2.1.0.tgz/download). - -Windows binaries for [32-bit and 64-bit](https://sourceforge.net/projects/glew/files/glew/2.1.0/glew-2.1.0-win32.zip/download). - -### Recent snapshots - -Snapshots may contain new features, bug-fixes or new OpenGL extensions ahead of tested, official releases. - -## Build - -It is highly recommended to build from a tgz or zip release snapshot. -The code generation workflow is a complex brew of gnu make, perl and python, that works best on Linux or Mac. -For most end-users of GLEW the official releases are the best choice, with first class support. - -### Linux and Mac - -#### Using GNU Make - -##### Install build tools - -Debian/Ubuntu/Mint: `$ sudo apt-get install build-essential libxmu-dev libxi-dev libgl-dev libosmesa-dev` - -RedHat/CentOS/Fedora: `$ sudo yum install libXmu-devel libXi-devel libGL-devel` - -##### Build - - $ make - $ sudo make install - $ make clean - -Targets: `all, glew.lib (sub-targets: glew.lib.shared, glew.lib.static), glew.bin, clean, install, uninstall` - -Variables: `SYSTEM=linux-clang, GLEW_DEST=/usr/local, STRIP=` - -_Note: may need to make **auto** folder_ - -#### Using cmake - -*CMake 2.8.12 or higher is required.* - -##### Install build tools - -Debian/Ubuntu/Mint: `$ sudo apt-get install build-essential libXmu-dev libXi-dev libgl-dev cmake` - -RedHat/CentOS/Fedora: `$ sudo yum install libXmu-devel libXi-devel libGL-devel cmake` - -##### Build - - $ cd build - $ cmake ./cmake - $ make -j4 - -| Target | Description | -| ---------- | ----------- | -| glew | Build the glew shared library. | -| glew_s | Build the glew static library. | -| glewinfo | Build the `glewinfo` executable (requires `BUILD_UTILS` to be `ON`). | -| visualinfo | Build the `visualinfo` executable (requires `BUILD_UTILS` to be `ON`). | -| install | Install all enabled targets into `CMAKE_INSTALL_PREFIX`. | -| clean | Clean up build artifacts. | -| all | Build all enabled targets (default target). | - -| Variables | Description | -| --------------- | ----------- | -| BUILD_UTILS | Build the `glewinfo` and `visualinfo` executables. | -| GLEW_REGAL | Build in Regal mode. | -| GLEW_OSMESA | Build in off-screen Mesa mode. | -| BUILD_FRAMEWORK | Build as MacOSX Framework. Setting `CMAKE_INSTALL_PREFIX` to `/Library/Frameworks` is recommended. | - -### Windows - -#### Visual Studio - -Use the provided Visual Studio project file in build/vc12/ - -Projects for vc6 and vc10 are also provided - -#### MSYS/Mingw - -Available from [Mingw](http://www.mingw.org/) - -Requirements: bash, make, gcc - - $ mingw32-make - $ mingw32-make install - $ mingw32-make install.all - -Alternative toolchain: `SYSTEM=mingw-win32` - -#### MSYS2/Mingw-w64 - -Available from [Msys2](http://msys2.github.io/) and/or [Mingw-w64](http://mingw-w64.org/) - -Requirements: bash, make, gcc - - $ pacman -S gcc make mingw-w64-i686-gcc mingw-w64-x86_64-gcc - $ make - $ make install - $ make install.all - -Alternative toolchain: `SYSTEM=msys, SYSTEM=msys-win32, SYSTEM=msys-win64` - -## glewinfo - -`glewinfo` is a command-line tool useful for inspecting the capabilities of an -OpenGL implementation and GLEW support for that. Please include `glewinfo.txt` -with bug reports, as appropriate. - - --------------------------- - GLEW Extension Info - --------------------------- - - GLEW version 2.0.0 - Reporting capabilities of pixelformat 3 - Running on a Intel(R) HD Graphics 3000 from Intel - OpenGL version 3.1.0 - Build 9.17.10.4229 is supported - - GL_VERSION_1_1: OK - --------------- - - GL_VERSION_1_2: OK - --------------- - glCopyTexSubImage3D: OK - glDrawRangeElements: OK - glTexImage3D: OK - glTexSubImage3D: OK - - ... - -## Code Generation - -A Unix or Mac environment is needed for building GLEW from scratch to -include new extensions, or customize the code generation. The extension -data is regenerated from the top level source directory with: - - make extensions - -An alternative to generating the GLEW sources from scratch is to -download a pre-generated (unsupported) snapshot: - -https://sourceforge.net/projects/glew/files/glew/snapshots/ - -Travis-built snapshots are also available: - -https://glew.s3.amazonaws.com/index.html - -## Authors - -GLEW is currently maintained by [Nigel Stewart](https://github.com/nigels-com) -with bug fixes, new OpenGL extension support and new releases. - -GLEW was developed by [Milan Ikits](http://www.cs.utah.edu/~ikits/) -and [Marcelo Magallon](http://wwwvis.informatik.uni-stuttgart.de/~magallon/). -Aaron Lefohn, Joe Kniss, and Chris Wyman were the first users and also -assisted with the design and debugging process. - -The acronym GLEW originates from Aaron Lefohn. -Pasi Kärkkäinen identified and fixed several problems with -GLX and SDL. Nate Robins created the `wglinfo` utility, to -which modifications were made by Michael Wimmer. - -## Copyright and Licensing - -GLEW is originally derived from the EXTGL project by Lev Povalahev. -The source code is licensed under the -[Modified BSD License](http://glew.sourceforge.net/glew.txt), the -[Mesa 3-D License](http://glew.sourceforge.net/mesa.txt) (MIT) and the -[Khronos License](http://glew.sourceforge.net/khronos.txt) (MIT). - -The automatic code generation scripts are released under the -[GNU GPL](http://glew.sourceforge.net/gpl.txt). diff --git a/src/engine/external/glew/VERSION.txt b/src/engine/external/glew/VERSION.txt deleted file mode 100644 index 7ec1d6db40..0000000000 --- a/src/engine/external/glew/VERSION.txt +++ /dev/null @@ -1 +0,0 @@ -2.1.0 diff --git a/src/engine/external/glew/glew.c b/src/engine/external/glew/glew.c deleted file mode 100644 index 4c47ea1828..0000000000 --- a/src/engine/external/glew/glew.c +++ /dev/null @@ -1,28581 +0,0 @@ -/* -** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2017, Nigel Stewart -** Copyright (C) 2002-2008, Milan Ikits -** Copyright (C) 2002-2008, Marcelo E. Magallon -** Copyright (C) 2002, Lev Povalahev -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are met: -** -** * Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** * The name of the author may be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -** THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef GLEW_INCLUDE -#include -#else -#include GLEW_INCLUDE -#endif - -#if defined(GLEW_OSMESA) -# define GLAPI extern -# include -#elif defined(GLEW_EGL) -# include -#elif defined(_WIN32) -/* - * If NOGDI is defined, wingdi.h won't be included by windows.h, and thus - * wglGetProcAddress won't be declared. It will instead be implicitly declared, - * potentially incorrectly, which we don't want. - */ -# if defined(NOGDI) -# undef NOGDI -# endif -# include -#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) -# include -#endif - -#include /* For size_t */ - -#if defined(GLEW_EGL) -#elif defined(GLEW_REGAL) - -/* In GLEW_REGAL mode we call direcly into the linked - libRegal.so glGetProcAddressREGAL for looking up - the GL function pointers. */ - -# undef glGetProcAddressREGAL -# ifdef WIN32 -extern void * __stdcall glGetProcAddressREGAL(const GLchar *name); -static void * (__stdcall * regalGetProcAddress) (const GLchar *) = glGetProcAddressREGAL; -# else -extern void * glGetProcAddressREGAL(const GLchar *name); -static void * (*regalGetProcAddress) (const GLchar *) = glGetProcAddressREGAL; -# endif -# define glGetProcAddressREGAL GLEW_GET_FUN(__glewGetProcAddressREGAL) - -#elif defined(__sgi) || defined (__sun) || defined(__HAIKU__) || defined(GLEW_APPLE_GLX) -#include -#include -#include - -void* dlGetProcAddress (const GLubyte* name) -{ - static void* h = NULL; - static void* gpa; - - if (h == NULL) - { - if ((h = dlopen(NULL, RTLD_LAZY | RTLD_LOCAL)) == NULL) return NULL; - gpa = dlsym(h, "glXGetProcAddress"); - } - - if (gpa != NULL) - return ((void*(*)(const GLubyte*))gpa)(name); - else - return dlsym(h, (const char*)name); -} -#endif /* __sgi || __sun || GLEW_APPLE_GLX */ - -#if defined(__APPLE__) -#include -#include -#include - -#ifdef MAC_OS_X_VERSION_10_3 - -#include - -void* NSGLGetProcAddress (const GLubyte *name) -{ - static void* image = NULL; - void* addr; - if (NULL == image) - { - image = dlopen("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", RTLD_LAZY); - } - if( !image ) return NULL; - addr = dlsym(image, (const char*)name); - if( addr ) return addr; -#ifdef GLEW_APPLE_GLX - return dlGetProcAddress( name ); // try next for glx symbols -#else - return NULL; -#endif -} -#else - -#include - -void* NSGLGetProcAddress (const GLubyte *name) -{ - static const struct mach_header* image = NULL; - NSSymbol symbol; - char* symbolName; - if (NULL == image) - { - image = NSAddImage("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", NSADDIMAGE_OPTION_RETURN_ON_ERROR); - } - /* prepend a '_' for the Unix C symbol mangling convention */ - symbolName = malloc(strlen((const char*)name) + 2); - strcpy(symbolName+1, (const char*)name); - symbolName[0] = '_'; - symbol = NULL; - /* if (NSIsSymbolNameDefined(symbolName)) - symbol = NSLookupAndBindSymbol(symbolName); */ - symbol = image ? NSLookupSymbolInImage(image, symbolName, NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR) : NULL; - free(symbolName); - if( symbol ) return NSAddressOfSymbol(symbol); -#ifdef GLEW_APPLE_GLX - return dlGetProcAddress( name ); // try next for glx symbols -#else - return NULL; -#endif -} -#endif /* MAC_OS_X_VERSION_10_3 */ -#endif /* __APPLE__ */ - -/* - * Define glewGetProcAddress. - */ -#if defined(GLEW_REGAL) -# define glewGetProcAddress(name) regalGetProcAddress((const GLchar *)name) -#elif defined(GLEW_OSMESA) -# define glewGetProcAddress(name) OSMesaGetProcAddress((const char *)name) -#elif defined(GLEW_EGL) -# define glewGetProcAddress(name) eglGetProcAddress((const char *)name) -#elif defined(_WIN32) -# define glewGetProcAddress(name) wglGetProcAddress((LPCSTR)name) -#elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX) -# define glewGetProcAddress(name) NSGLGetProcAddress(name) -#elif defined(__sgi) || defined(__sun) || defined(__HAIKU__) -# define glewGetProcAddress(name) dlGetProcAddress(name) -#elif defined(__ANDROID__) -# define glewGetProcAddress(name) NULL /* TODO */ -#elif defined(__native_client__) -# define glewGetProcAddress(name) NULL /* TODO */ -#else /* __linux */ -# define glewGetProcAddress(name) (*glXGetProcAddressARB)(name) -#endif - -/* - * Redefine GLEW_GET_VAR etc without const cast - */ - -#undef GLEW_GET_VAR -# define GLEW_GET_VAR(x) (x) - -#ifdef WGLEW_GET_VAR -# undef WGLEW_GET_VAR -# define WGLEW_GET_VAR(x) (x) -#endif /* WGLEW_GET_VAR */ - -#ifdef GLXEW_GET_VAR -# undef GLXEW_GET_VAR -# define GLXEW_GET_VAR(x) (x) -#endif /* GLXEW_GET_VAR */ - -#ifdef EGLEW_GET_VAR -# undef EGLEW_GET_VAR -# define EGLEW_GET_VAR(x) (x) -#endif /* EGLEW_GET_VAR */ - -/* - * GLEW, just like OpenGL or GLU, does not rely on the standard C library. - * These functions implement the functionality required in this file. - */ - -static GLuint _glewStrLen (const GLubyte* s) -{ - GLuint i=0; - if (s == NULL) return 0; - while (s[i] != '\0') i++; - return i; -} - -static GLuint _glewStrCLen (const GLubyte* s, GLubyte c) -{ - GLuint i=0; - if (s == NULL) return 0; - while (s[i] != '\0' && s[i] != c) i++; - return i; -} - -static GLuint _glewStrCopy(char *d, const char *s, char c) -{ - GLuint i=0; - if (s == NULL) return 0; - while (s[i] != '\0' && s[i] != c) { d[i] = s[i]; i++; } - d[i] = '\0'; - return i; -} - -#if !defined(GLEW_OSMESA) -#if !defined(__APPLE__) || defined(GLEW_APPLE_GLX) -static GLboolean _glewStrSame (const GLubyte* a, const GLubyte* b, GLuint n) -{ - GLuint i=0; - if(a == NULL || b == NULL) - return (a == NULL && b == NULL && n == 0) ? GL_TRUE : GL_FALSE; - while (i < n && a[i] != '\0' && b[i] != '\0' && a[i] == b[i]) i++; - return i == n ? GL_TRUE : GL_FALSE; -} -#endif -#endif - -static GLboolean _glewStrSame1 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) -{ - while (*na > 0 && (**a == ' ' || **a == '\n' || **a == '\r' || **a == '\t')) - { - (*a)++; - (*na)--; - } - if(*na >= nb) - { - GLuint i=0; - while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; - if(i == nb) - { - *a = *a + nb; - *na = *na - nb; - return GL_TRUE; - } - } - return GL_FALSE; -} - -static GLboolean _glewStrSame2 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) -{ - if(*na >= nb) - { - GLuint i=0; - while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; - if(i == nb) - { - *a = *a + nb; - *na = *na - nb; - return GL_TRUE; - } - } - return GL_FALSE; -} - -static GLboolean _glewStrSame3 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) -{ - if(*na >= nb) - { - GLuint i=0; - while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; - if (i == nb && (*na == nb || (*a)[i] == ' ' || (*a)[i] == '\n' || (*a)[i] == '\r' || (*a)[i] == '\t')) - { - *a = *a + nb; - *na = *na - nb; - return GL_TRUE; - } - } - return GL_FALSE; -} - -/* - * Search for name in the extensions string. Use of strstr() - * is not sufficient because extension names can be prefixes of - * other extension names. Could use strtok() but the constant - * string returned by glGetString might be in read-only memory. - */ -#if !defined(GLEW_OSMESA) -#if !defined(__APPLE__) || defined(GLEW_APPLE_GLX) -static GLboolean _glewSearchExtension (const char* name, const GLubyte *start, const GLubyte *end) -{ - const GLubyte* p; - GLuint len = _glewStrLen((const GLubyte*)name); - p = start; - while (p < end) - { - GLuint n = _glewStrCLen(p, ' '); - if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE; - p += n+1; - } - return GL_FALSE; -} -#endif -#endif - -PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D = NULL; -PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements = NULL; -PFNGLTEXIMAGE3DPROC __glewTexImage3D = NULL; -PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D = NULL; - -PFNGLACTIVETEXTUREPROC __glewActiveTexture = NULL; -PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture = NULL; -PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D = NULL; -PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D = NULL; -PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D = NULL; -PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage = NULL; -PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd = NULL; -PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf = NULL; -PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd = NULL; -PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf = NULL; -PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d = NULL; -PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv = NULL; -PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f = NULL; -PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv = NULL; -PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i = NULL; -PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv = NULL; -PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s = NULL; -PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv = NULL; -PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d = NULL; -PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv = NULL; -PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f = NULL; -PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv = NULL; -PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i = NULL; -PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv = NULL; -PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s = NULL; -PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv = NULL; -PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d = NULL; -PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv = NULL; -PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f = NULL; -PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv = NULL; -PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i = NULL; -PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv = NULL; -PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s = NULL; -PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv = NULL; -PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d = NULL; -PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv = NULL; -PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f = NULL; -PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv = NULL; -PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i = NULL; -PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv = NULL; -PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s = NULL; -PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv = NULL; -PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage = NULL; - -PFNGLBLENDCOLORPROC __glewBlendColor = NULL; -PFNGLBLENDEQUATIONPROC __glewBlendEquation = NULL; -PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate = NULL; -PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer = NULL; -PFNGLFOGCOORDDPROC __glewFogCoordd = NULL; -PFNGLFOGCOORDDVPROC __glewFogCoorddv = NULL; -PFNGLFOGCOORDFPROC __glewFogCoordf = NULL; -PFNGLFOGCOORDFVPROC __glewFogCoordfv = NULL; -PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays = NULL; -PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements = NULL; -PFNGLPOINTPARAMETERFPROC __glewPointParameterf = NULL; -PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv = NULL; -PFNGLPOINTPARAMETERIPROC __glewPointParameteri = NULL; -PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv = NULL; -PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b = NULL; -PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv = NULL; -PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d = NULL; -PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv = NULL; -PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f = NULL; -PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv = NULL; -PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i = NULL; -PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv = NULL; -PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s = NULL; -PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv = NULL; -PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub = NULL; -PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv = NULL; -PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui = NULL; -PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv = NULL; -PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us = NULL; -PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv = NULL; -PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer = NULL; -PFNGLWINDOWPOS2DPROC __glewWindowPos2d = NULL; -PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv = NULL; -PFNGLWINDOWPOS2FPROC __glewWindowPos2f = NULL; -PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv = NULL; -PFNGLWINDOWPOS2IPROC __glewWindowPos2i = NULL; -PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv = NULL; -PFNGLWINDOWPOS2SPROC __glewWindowPos2s = NULL; -PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv = NULL; -PFNGLWINDOWPOS3DPROC __glewWindowPos3d = NULL; -PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv = NULL; -PFNGLWINDOWPOS3FPROC __glewWindowPos3f = NULL; -PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv = NULL; -PFNGLWINDOWPOS3IPROC __glewWindowPos3i = NULL; -PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv = NULL; -PFNGLWINDOWPOS3SPROC __glewWindowPos3s = NULL; -PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv = NULL; - -PFNGLBEGINQUERYPROC __glewBeginQuery = NULL; -PFNGLBINDBUFFERPROC __glewBindBuffer = NULL; -PFNGLBUFFERDATAPROC __glewBufferData = NULL; -PFNGLBUFFERSUBDATAPROC __glewBufferSubData = NULL; -PFNGLDELETEBUFFERSPROC __glewDeleteBuffers = NULL; -PFNGLDELETEQUERIESPROC __glewDeleteQueries = NULL; -PFNGLENDQUERYPROC __glewEndQuery = NULL; -PFNGLGENBUFFERSPROC __glewGenBuffers = NULL; -PFNGLGENQUERIESPROC __glewGenQueries = NULL; -PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv = NULL; -PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv = NULL; -PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData = NULL; -PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv = NULL; -PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv = NULL; -PFNGLGETQUERYIVPROC __glewGetQueryiv = NULL; -PFNGLISBUFFERPROC __glewIsBuffer = NULL; -PFNGLISQUERYPROC __glewIsQuery = NULL; -PFNGLMAPBUFFERPROC __glewMapBuffer = NULL; -PFNGLUNMAPBUFFERPROC __glewUnmapBuffer = NULL; - -PFNGLATTACHSHADERPROC __glewAttachShader = NULL; -PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation = NULL; -PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate = NULL; -PFNGLCOMPILESHADERPROC __glewCompileShader = NULL; -PFNGLCREATEPROGRAMPROC __glewCreateProgram = NULL; -PFNGLCREATESHADERPROC __glewCreateShader = NULL; -PFNGLDELETEPROGRAMPROC __glewDeleteProgram = NULL; -PFNGLDELETESHADERPROC __glewDeleteShader = NULL; -PFNGLDETACHSHADERPROC __glewDetachShader = NULL; -PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray = NULL; -PFNGLDRAWBUFFERSPROC __glewDrawBuffers = NULL; -PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray = NULL; -PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib = NULL; -PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform = NULL; -PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders = NULL; -PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation = NULL; -PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog = NULL; -PFNGLGETPROGRAMIVPROC __glewGetProgramiv = NULL; -PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog = NULL; -PFNGLGETSHADERSOURCEPROC __glewGetShaderSource = NULL; -PFNGLGETSHADERIVPROC __glewGetShaderiv = NULL; -PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation = NULL; -PFNGLGETUNIFORMFVPROC __glewGetUniformfv = NULL; -PFNGLGETUNIFORMIVPROC __glewGetUniformiv = NULL; -PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv = NULL; -PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv = NULL; -PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv = NULL; -PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv = NULL; -PFNGLISPROGRAMPROC __glewIsProgram = NULL; -PFNGLISSHADERPROC __glewIsShader = NULL; -PFNGLLINKPROGRAMPROC __glewLinkProgram = NULL; -PFNGLSHADERSOURCEPROC __glewShaderSource = NULL; -PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate = NULL; -PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate = NULL; -PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate = NULL; -PFNGLUNIFORM1FPROC __glewUniform1f = NULL; -PFNGLUNIFORM1FVPROC __glewUniform1fv = NULL; -PFNGLUNIFORM1IPROC __glewUniform1i = NULL; -PFNGLUNIFORM1IVPROC __glewUniform1iv = NULL; -PFNGLUNIFORM2FPROC __glewUniform2f = NULL; -PFNGLUNIFORM2FVPROC __glewUniform2fv = NULL; -PFNGLUNIFORM2IPROC __glewUniform2i = NULL; -PFNGLUNIFORM2IVPROC __glewUniform2iv = NULL; -PFNGLUNIFORM3FPROC __glewUniform3f = NULL; -PFNGLUNIFORM3FVPROC __glewUniform3fv = NULL; -PFNGLUNIFORM3IPROC __glewUniform3i = NULL; -PFNGLUNIFORM3IVPROC __glewUniform3iv = NULL; -PFNGLUNIFORM4FPROC __glewUniform4f = NULL; -PFNGLUNIFORM4FVPROC __glewUniform4fv = NULL; -PFNGLUNIFORM4IPROC __glewUniform4i = NULL; -PFNGLUNIFORM4IVPROC __glewUniform4iv = NULL; -PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv = NULL; -PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv = NULL; -PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv = NULL; -PFNGLUSEPROGRAMPROC __glewUseProgram = NULL; -PFNGLVALIDATEPROGRAMPROC __glewValidateProgram = NULL; -PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d = NULL; -PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv = NULL; -PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f = NULL; -PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv = NULL; -PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s = NULL; -PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv = NULL; -PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d = NULL; -PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv = NULL; -PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f = NULL; -PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv = NULL; -PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s = NULL; -PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv = NULL; -PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d = NULL; -PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv = NULL; -PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f = NULL; -PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv = NULL; -PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s = NULL; -PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv = NULL; -PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv = NULL; -PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv = NULL; -PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv = NULL; -PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub = NULL; -PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv = NULL; -PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv = NULL; -PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv = NULL; -PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv = NULL; -PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d = NULL; -PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv = NULL; -PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f = NULL; -PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv = NULL; -PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv = NULL; -PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s = NULL; -PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv = NULL; -PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv = NULL; -PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv = NULL; -PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv = NULL; -PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer = NULL; - -PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv = NULL; -PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv = NULL; -PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv = NULL; -PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv = NULL; -PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv = NULL; -PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv = NULL; - -PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender = NULL; -PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback = NULL; -PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation = NULL; -PFNGLCLAMPCOLORPROC __glewClampColor = NULL; -PFNGLCLEARBUFFERFIPROC __glewClearBufferfi = NULL; -PFNGLCLEARBUFFERFVPROC __glewClearBufferfv = NULL; -PFNGLCLEARBUFFERIVPROC __glewClearBufferiv = NULL; -PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv = NULL; -PFNGLCOLORMASKIPROC __glewColorMaski = NULL; -PFNGLDISABLEIPROC __glewDisablei = NULL; -PFNGLENABLEIPROC __glewEnablei = NULL; -PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender = NULL; -PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback = NULL; -PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v = NULL; -PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation = NULL; -PFNGLGETSTRINGIPROC __glewGetStringi = NULL; -PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv = NULL; -PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv = NULL; -PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying = NULL; -PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv = NULL; -PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv = NULL; -PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv = NULL; -PFNGLISENABLEDIPROC __glewIsEnabledi = NULL; -PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv = NULL; -PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv = NULL; -PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings = NULL; -PFNGLUNIFORM1UIPROC __glewUniform1ui = NULL; -PFNGLUNIFORM1UIVPROC __glewUniform1uiv = NULL; -PFNGLUNIFORM2UIPROC __glewUniform2ui = NULL; -PFNGLUNIFORM2UIVPROC __glewUniform2uiv = NULL; -PFNGLUNIFORM3UIPROC __glewUniform3ui = NULL; -PFNGLUNIFORM3UIVPROC __glewUniform3uiv = NULL; -PFNGLUNIFORM4UIPROC __glewUniform4ui = NULL; -PFNGLUNIFORM4UIVPROC __glewUniform4uiv = NULL; -PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i = NULL; -PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv = NULL; -PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui = NULL; -PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv = NULL; -PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i = NULL; -PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv = NULL; -PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui = NULL; -PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv = NULL; -PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i = NULL; -PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv = NULL; -PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui = NULL; -PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv = NULL; -PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv = NULL; -PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i = NULL; -PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv = NULL; -PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv = NULL; -PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv = NULL; -PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui = NULL; -PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv = NULL; -PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv = NULL; -PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer = NULL; - -PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced = NULL; -PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced = NULL; -PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex = NULL; -PFNGLTEXBUFFERPROC __glewTexBuffer = NULL; - -PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture = NULL; -PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v = NULL; -PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v = NULL; - -PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor = NULL; - -PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei = NULL; -PFNGLBLENDEQUATIONIPROC __glewBlendEquationi = NULL; -PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei = NULL; -PFNGLBLENDFUNCIPROC __glewBlendFunci = NULL; -PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading = NULL; - -PFNGLGETGRAPHICSRESETSTATUSPROC __glewGetGraphicsResetStatus = NULL; -PFNGLGETNCOMPRESSEDTEXIMAGEPROC __glewGetnCompressedTexImage = NULL; -PFNGLGETNTEXIMAGEPROC __glewGetnTexImage = NULL; -PFNGLGETNUNIFORMDVPROC __glewGetnUniformdv = NULL; - -PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC __glewMultiDrawArraysIndirectCount = NULL; -PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC __glewMultiDrawElementsIndirectCount = NULL; -PFNGLSPECIALIZESHADERPROC __glewSpecializeShader = NULL; - -PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX = NULL; - -PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD = NULL; -PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD = NULL; -PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD = NULL; -PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD = NULL; - -PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD = NULL; -PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD = NULL; -PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD = NULL; -PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD = NULL; - -PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC __glewFramebufferSamplePositionsfvAMD = NULL; -PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC __glewGetFramebufferParameterfvAMD = NULL; -PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC __glewGetNamedFramebufferParameterfvAMD = NULL; -PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC __glewNamedFramebufferSamplePositionsfvAMD = NULL; - -PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD = NULL; - -PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD = NULL; -PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD = NULL; - -PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD = NULL; -PFNGLGENNAMESAMDPROC __glewGenNamesAMD = NULL; -PFNGLISNAMEAMDPROC __glewIsNameAMD = NULL; - -PFNGLQUERYOBJECTPARAMETERUIAMDPROC __glewQueryObjectParameteruiAMD = NULL; - -PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD = NULL; -PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD = NULL; -PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD = NULL; -PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD = NULL; -PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD = NULL; -PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD = NULL; -PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD = NULL; -PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD = NULL; -PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD = NULL; -PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD = NULL; -PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD = NULL; - -PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD = NULL; - -PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD = NULL; -PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD = NULL; - -PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD = NULL; - -PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD = NULL; -PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD = NULL; - -PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE = NULL; - -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE = NULL; - -PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE = NULL; -PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE = NULL; -PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE = NULL; - -PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE = NULL; -PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE = NULL; -PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE = NULL; -PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE = NULL; -PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE = NULL; -PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE = NULL; -PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE = NULL; -PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE = NULL; -PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE = NULL; -PFNGLISQUERYANGLEPROC __glewIsQueryANGLE = NULL; -PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE = NULL; - -PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE = NULL; - -PFNGLCOPYTEXTURELEVELSAPPLEPROC __glewCopyTextureLevelsAPPLE = NULL; - -PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE = NULL; -PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE = NULL; -PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE = NULL; -PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE = NULL; -PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE = NULL; - -PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE = NULL; -PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE = NULL; -PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE = NULL; -PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE = NULL; -PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE = NULL; -PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE = NULL; -PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE = NULL; -PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE = NULL; - -PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE = NULL; -PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE = NULL; - -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC __glewRenderbufferStorageMultisampleAPPLE = NULL; -PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC __glewResolveMultisampleFramebufferAPPLE = NULL; - -PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE = NULL; -PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE = NULL; -PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE = NULL; - -PFNGLCLIENTWAITSYNCAPPLEPROC __glewClientWaitSyncAPPLE = NULL; -PFNGLDELETESYNCAPPLEPROC __glewDeleteSyncAPPLE = NULL; -PFNGLFENCESYNCAPPLEPROC __glewFenceSyncAPPLE = NULL; -PFNGLGETINTEGER64VAPPLEPROC __glewGetInteger64vAPPLE = NULL; -PFNGLGETSYNCIVAPPLEPROC __glewGetSyncivAPPLE = NULL; -PFNGLISSYNCAPPLEPROC __glewIsSyncAPPLE = NULL; -PFNGLWAITSYNCAPPLEPROC __glewWaitSyncAPPLE = NULL; - -PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE = NULL; -PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE = NULL; - -PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE = NULL; -PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE = NULL; -PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE = NULL; -PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE = NULL; - -PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE = NULL; -PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE = NULL; -PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE = NULL; - -PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE = NULL; -PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE = NULL; -PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE = NULL; -PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE = NULL; -PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE = NULL; -PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE = NULL; -PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE = NULL; - -PFNGLCLEARDEPTHFPROC __glewClearDepthf = NULL; -PFNGLDEPTHRANGEFPROC __glewDepthRangef = NULL; -PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat = NULL; -PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler = NULL; -PFNGLSHADERBINARYPROC __glewShaderBinary = NULL; - -PFNGLMEMORYBARRIERBYREGIONPROC __glewMemoryBarrierByRegion = NULL; - -PFNGLPRIMITIVEBOUNDINGBOXARBPROC __glewPrimitiveBoundingBoxARB = NULL; - -PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance = NULL; -PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance = NULL; -PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance = NULL; - -PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB = NULL; -PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB = NULL; -PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB = NULL; -PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB = NULL; -PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB = NULL; -PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB = NULL; -PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB = NULL; -PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB = NULL; -PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB = NULL; -PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB = NULL; -PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB = NULL; -PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB = NULL; -PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB = NULL; -PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB = NULL; -PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB = NULL; -PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB = NULL; - -PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed = NULL; -PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex = NULL; - -PFNGLBUFFERSTORAGEPROC __glewBufferStorage = NULL; - -PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB = NULL; - -PFNGLCLEARBUFFERDATAPROC __glewClearBufferData = NULL; -PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData = NULL; -PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT = NULL; -PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT = NULL; - -PFNGLCLEARTEXIMAGEPROC __glewClearTexImage = NULL; -PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage = NULL; - -PFNGLCLIPCONTROLPROC __glewClipControl = NULL; - -PFNGLCLAMPCOLORARBPROC __glewClampColorARB = NULL; - -PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute = NULL; -PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect = NULL; - -PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB = NULL; - -PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData = NULL; - -PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData = NULL; - -PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB = NULL; -PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB = NULL; -PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB = NULL; -PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB = NULL; - -PFNGLBINDTEXTUREUNITPROC __glewBindTextureUnit = NULL; -PFNGLBLITNAMEDFRAMEBUFFERPROC __glewBlitNamedFramebuffer = NULL; -PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC __glewCheckNamedFramebufferStatus = NULL; -PFNGLCLEARNAMEDBUFFERDATAPROC __glewClearNamedBufferData = NULL; -PFNGLCLEARNAMEDBUFFERSUBDATAPROC __glewClearNamedBufferSubData = NULL; -PFNGLCLEARNAMEDFRAMEBUFFERFIPROC __glewClearNamedFramebufferfi = NULL; -PFNGLCLEARNAMEDFRAMEBUFFERFVPROC __glewClearNamedFramebufferfv = NULL; -PFNGLCLEARNAMEDFRAMEBUFFERIVPROC __glewClearNamedFramebufferiv = NULL; -PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC __glewClearNamedFramebufferuiv = NULL; -PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC __glewCompressedTextureSubImage1D = NULL; -PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC __glewCompressedTextureSubImage2D = NULL; -PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC __glewCompressedTextureSubImage3D = NULL; -PFNGLCOPYNAMEDBUFFERSUBDATAPROC __glewCopyNamedBufferSubData = NULL; -PFNGLCOPYTEXTURESUBIMAGE1DPROC __glewCopyTextureSubImage1D = NULL; -PFNGLCOPYTEXTURESUBIMAGE2DPROC __glewCopyTextureSubImage2D = NULL; -PFNGLCOPYTEXTURESUBIMAGE3DPROC __glewCopyTextureSubImage3D = NULL; -PFNGLCREATEBUFFERSPROC __glewCreateBuffers = NULL; -PFNGLCREATEFRAMEBUFFERSPROC __glewCreateFramebuffers = NULL; -PFNGLCREATEPROGRAMPIPELINESPROC __glewCreateProgramPipelines = NULL; -PFNGLCREATEQUERIESPROC __glewCreateQueries = NULL; -PFNGLCREATERENDERBUFFERSPROC __glewCreateRenderbuffers = NULL; -PFNGLCREATESAMPLERSPROC __glewCreateSamplers = NULL; -PFNGLCREATETEXTURESPROC __glewCreateTextures = NULL; -PFNGLCREATETRANSFORMFEEDBACKSPROC __glewCreateTransformFeedbacks = NULL; -PFNGLCREATEVERTEXARRAYSPROC __glewCreateVertexArrays = NULL; -PFNGLDISABLEVERTEXARRAYATTRIBPROC __glewDisableVertexArrayAttrib = NULL; -PFNGLENABLEVERTEXARRAYATTRIBPROC __glewEnableVertexArrayAttrib = NULL; -PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC __glewFlushMappedNamedBufferRange = NULL; -PFNGLGENERATETEXTUREMIPMAPPROC __glewGenerateTextureMipmap = NULL; -PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC __glewGetCompressedTextureImage = NULL; -PFNGLGETNAMEDBUFFERPARAMETERI64VPROC __glewGetNamedBufferParameteri64v = NULL; -PFNGLGETNAMEDBUFFERPARAMETERIVPROC __glewGetNamedBufferParameteriv = NULL; -PFNGLGETNAMEDBUFFERPOINTERVPROC __glewGetNamedBufferPointerv = NULL; -PFNGLGETNAMEDBUFFERSUBDATAPROC __glewGetNamedBufferSubData = NULL; -PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetNamedFramebufferAttachmentParameteriv = NULL; -PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC __glewGetNamedFramebufferParameteriv = NULL; -PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC __glewGetNamedRenderbufferParameteriv = NULL; -PFNGLGETQUERYBUFFEROBJECTI64VPROC __glewGetQueryBufferObjecti64v = NULL; -PFNGLGETQUERYBUFFEROBJECTIVPROC __glewGetQueryBufferObjectiv = NULL; -PFNGLGETQUERYBUFFEROBJECTUI64VPROC __glewGetQueryBufferObjectui64v = NULL; -PFNGLGETQUERYBUFFEROBJECTUIVPROC __glewGetQueryBufferObjectuiv = NULL; -PFNGLGETTEXTUREIMAGEPROC __glewGetTextureImage = NULL; -PFNGLGETTEXTURELEVELPARAMETERFVPROC __glewGetTextureLevelParameterfv = NULL; -PFNGLGETTEXTURELEVELPARAMETERIVPROC __glewGetTextureLevelParameteriv = NULL; -PFNGLGETTEXTUREPARAMETERIIVPROC __glewGetTextureParameterIiv = NULL; -PFNGLGETTEXTUREPARAMETERIUIVPROC __glewGetTextureParameterIuiv = NULL; -PFNGLGETTEXTUREPARAMETERFVPROC __glewGetTextureParameterfv = NULL; -PFNGLGETTEXTUREPARAMETERIVPROC __glewGetTextureParameteriv = NULL; -PFNGLGETTRANSFORMFEEDBACKI64_VPROC __glewGetTransformFeedbacki64_v = NULL; -PFNGLGETTRANSFORMFEEDBACKI_VPROC __glewGetTransformFeedbacki_v = NULL; -PFNGLGETTRANSFORMFEEDBACKIVPROC __glewGetTransformFeedbackiv = NULL; -PFNGLGETVERTEXARRAYINDEXED64IVPROC __glewGetVertexArrayIndexed64iv = NULL; -PFNGLGETVERTEXARRAYINDEXEDIVPROC __glewGetVertexArrayIndexediv = NULL; -PFNGLGETVERTEXARRAYIVPROC __glewGetVertexArrayiv = NULL; -PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC __glewInvalidateNamedFramebufferData = NULL; -PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC __glewInvalidateNamedFramebufferSubData = NULL; -PFNGLMAPNAMEDBUFFERPROC __glewMapNamedBuffer = NULL; -PFNGLMAPNAMEDBUFFERRANGEPROC __glewMapNamedBufferRange = NULL; -PFNGLNAMEDBUFFERDATAPROC __glewNamedBufferData = NULL; -PFNGLNAMEDBUFFERSTORAGEPROC __glewNamedBufferStorage = NULL; -PFNGLNAMEDBUFFERSUBDATAPROC __glewNamedBufferSubData = NULL; -PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC __glewNamedFramebufferDrawBuffer = NULL; -PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC __glewNamedFramebufferDrawBuffers = NULL; -PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC __glewNamedFramebufferParameteri = NULL; -PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC __glewNamedFramebufferReadBuffer = NULL; -PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC __glewNamedFramebufferRenderbuffer = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTUREPROC __glewNamedFramebufferTexture = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC __glewNamedFramebufferTextureLayer = NULL; -PFNGLNAMEDRENDERBUFFERSTORAGEPROC __glewNamedRenderbufferStorage = NULL; -PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewNamedRenderbufferStorageMultisample = NULL; -PFNGLTEXTUREBUFFERPROC __glewTextureBuffer = NULL; -PFNGLTEXTUREBUFFERRANGEPROC __glewTextureBufferRange = NULL; -PFNGLTEXTUREPARAMETERIIVPROC __glewTextureParameterIiv = NULL; -PFNGLTEXTUREPARAMETERIUIVPROC __glewTextureParameterIuiv = NULL; -PFNGLTEXTUREPARAMETERFPROC __glewTextureParameterf = NULL; -PFNGLTEXTUREPARAMETERFVPROC __glewTextureParameterfv = NULL; -PFNGLTEXTUREPARAMETERIPROC __glewTextureParameteri = NULL; -PFNGLTEXTUREPARAMETERIVPROC __glewTextureParameteriv = NULL; -PFNGLTEXTURESTORAGE1DPROC __glewTextureStorage1D = NULL; -PFNGLTEXTURESTORAGE2DPROC __glewTextureStorage2D = NULL; -PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC __glewTextureStorage2DMultisample = NULL; -PFNGLTEXTURESTORAGE3DPROC __glewTextureStorage3D = NULL; -PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC __glewTextureStorage3DMultisample = NULL; -PFNGLTEXTURESUBIMAGE1DPROC __glewTextureSubImage1D = NULL; -PFNGLTEXTURESUBIMAGE2DPROC __glewTextureSubImage2D = NULL; -PFNGLTEXTURESUBIMAGE3DPROC __glewTextureSubImage3D = NULL; -PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC __glewTransformFeedbackBufferBase = NULL; -PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC __glewTransformFeedbackBufferRange = NULL; -PFNGLUNMAPNAMEDBUFFERPROC __glewUnmapNamedBuffer = NULL; -PFNGLVERTEXARRAYATTRIBBINDINGPROC __glewVertexArrayAttribBinding = NULL; -PFNGLVERTEXARRAYATTRIBFORMATPROC __glewVertexArrayAttribFormat = NULL; -PFNGLVERTEXARRAYATTRIBIFORMATPROC __glewVertexArrayAttribIFormat = NULL; -PFNGLVERTEXARRAYATTRIBLFORMATPROC __glewVertexArrayAttribLFormat = NULL; -PFNGLVERTEXARRAYBINDINGDIVISORPROC __glewVertexArrayBindingDivisor = NULL; -PFNGLVERTEXARRAYELEMENTBUFFERPROC __glewVertexArrayElementBuffer = NULL; -PFNGLVERTEXARRAYVERTEXBUFFERPROC __glewVertexArrayVertexBuffer = NULL; -PFNGLVERTEXARRAYVERTEXBUFFERSPROC __glewVertexArrayVertexBuffers = NULL; - -PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB = NULL; - -PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB = NULL; -PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB = NULL; -PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB = NULL; -PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB = NULL; - -PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex = NULL; -PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex = NULL; -PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex = NULL; -PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex = NULL; - -PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect = NULL; -PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect = NULL; - -PFNGLFRAMEBUFFERPARAMETERIPROC __glewFramebufferParameteri = NULL; -PFNGLGETFRAMEBUFFERPARAMETERIVPROC __glewGetFramebufferParameteriv = NULL; -PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __glewGetNamedFramebufferParameterivEXT = NULL; -PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __glewNamedFramebufferParameteriEXT = NULL; - -PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer = NULL; -PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer = NULL; -PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer = NULL; -PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus = NULL; -PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers = NULL; -PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers = NULL; -PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer = NULL; -PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D = NULL; -PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D = NULL; -PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D = NULL; -PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer = NULL; -PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers = NULL; -PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers = NULL; -PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap = NULL; -PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv = NULL; -PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv = NULL; -PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer = NULL; -PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer = NULL; -PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage = NULL; -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample = NULL; - -PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB = NULL; -PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB = NULL; -PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB = NULL; -PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB = NULL; - -PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary = NULL; -PFNGLPROGRAMBINARYPROC __glewProgramBinary = NULL; -PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri = NULL; - -PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC __glewGetCompressedTextureSubImage = NULL; -PFNGLGETTEXTURESUBIMAGEPROC __glewGetTextureSubImage = NULL; - -PFNGLSPECIALIZESHADERARBPROC __glewSpecializeShaderARB = NULL; - -PFNGLGETUNIFORMDVPROC __glewGetUniformdv = NULL; -PFNGLUNIFORM1DPROC __glewUniform1d = NULL; -PFNGLUNIFORM1DVPROC __glewUniform1dv = NULL; -PFNGLUNIFORM2DPROC __glewUniform2d = NULL; -PFNGLUNIFORM2DVPROC __glewUniform2dv = NULL; -PFNGLUNIFORM3DPROC __glewUniform3d = NULL; -PFNGLUNIFORM3DVPROC __glewUniform3dv = NULL; -PFNGLUNIFORM4DPROC __glewUniform4d = NULL; -PFNGLUNIFORM4DVPROC __glewUniform4dv = NULL; -PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv = NULL; -PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv = NULL; -PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv = NULL; -PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv = NULL; -PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv = NULL; -PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv = NULL; -PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv = NULL; -PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv = NULL; -PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv = NULL; - -PFNGLGETUNIFORMI64VARBPROC __glewGetUniformi64vARB = NULL; -PFNGLGETUNIFORMUI64VARBPROC __glewGetUniformui64vARB = NULL; -PFNGLGETNUNIFORMI64VARBPROC __glewGetnUniformi64vARB = NULL; -PFNGLGETNUNIFORMUI64VARBPROC __glewGetnUniformui64vARB = NULL; -PFNGLPROGRAMUNIFORM1I64ARBPROC __glewProgramUniform1i64ARB = NULL; -PFNGLPROGRAMUNIFORM1I64VARBPROC __glewProgramUniform1i64vARB = NULL; -PFNGLPROGRAMUNIFORM1UI64ARBPROC __glewProgramUniform1ui64ARB = NULL; -PFNGLPROGRAMUNIFORM1UI64VARBPROC __glewProgramUniform1ui64vARB = NULL; -PFNGLPROGRAMUNIFORM2I64ARBPROC __glewProgramUniform2i64ARB = NULL; -PFNGLPROGRAMUNIFORM2I64VARBPROC __glewProgramUniform2i64vARB = NULL; -PFNGLPROGRAMUNIFORM2UI64ARBPROC __glewProgramUniform2ui64ARB = NULL; -PFNGLPROGRAMUNIFORM2UI64VARBPROC __glewProgramUniform2ui64vARB = NULL; -PFNGLPROGRAMUNIFORM3I64ARBPROC __glewProgramUniform3i64ARB = NULL; -PFNGLPROGRAMUNIFORM3I64VARBPROC __glewProgramUniform3i64vARB = NULL; -PFNGLPROGRAMUNIFORM3UI64ARBPROC __glewProgramUniform3ui64ARB = NULL; -PFNGLPROGRAMUNIFORM3UI64VARBPROC __glewProgramUniform3ui64vARB = NULL; -PFNGLPROGRAMUNIFORM4I64ARBPROC __glewProgramUniform4i64ARB = NULL; -PFNGLPROGRAMUNIFORM4I64VARBPROC __glewProgramUniform4i64vARB = NULL; -PFNGLPROGRAMUNIFORM4UI64ARBPROC __glewProgramUniform4ui64ARB = NULL; -PFNGLPROGRAMUNIFORM4UI64VARBPROC __glewProgramUniform4ui64vARB = NULL; -PFNGLUNIFORM1I64ARBPROC __glewUniform1i64ARB = NULL; -PFNGLUNIFORM1I64VARBPROC __glewUniform1i64vARB = NULL; -PFNGLUNIFORM1UI64ARBPROC __glewUniform1ui64ARB = NULL; -PFNGLUNIFORM1UI64VARBPROC __glewUniform1ui64vARB = NULL; -PFNGLUNIFORM2I64ARBPROC __glewUniform2i64ARB = NULL; -PFNGLUNIFORM2I64VARBPROC __glewUniform2i64vARB = NULL; -PFNGLUNIFORM2UI64ARBPROC __glewUniform2ui64ARB = NULL; -PFNGLUNIFORM2UI64VARBPROC __glewUniform2ui64vARB = NULL; -PFNGLUNIFORM3I64ARBPROC __glewUniform3i64ARB = NULL; -PFNGLUNIFORM3I64VARBPROC __glewUniform3i64vARB = NULL; -PFNGLUNIFORM3UI64ARBPROC __glewUniform3ui64ARB = NULL; -PFNGLUNIFORM3UI64VARBPROC __glewUniform3ui64vARB = NULL; -PFNGLUNIFORM4I64ARBPROC __glewUniform4i64ARB = NULL; -PFNGLUNIFORM4I64VARBPROC __glewUniform4i64vARB = NULL; -PFNGLUNIFORM4UI64ARBPROC __glewUniform4ui64ARB = NULL; -PFNGLUNIFORM4UI64VARBPROC __glewUniform4ui64vARB = NULL; - -PFNGLCOLORSUBTABLEPROC __glewColorSubTable = NULL; -PFNGLCOLORTABLEPROC __glewColorTable = NULL; -PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv = NULL; -PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv = NULL; -PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D = NULL; -PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D = NULL; -PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf = NULL; -PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv = NULL; -PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri = NULL; -PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv = NULL; -PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable = NULL; -PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable = NULL; -PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D = NULL; -PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D = NULL; -PFNGLGETCOLORTABLEPROC __glewGetColorTable = NULL; -PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv = NULL; -PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv = NULL; -PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter = NULL; -PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv = NULL; -PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv = NULL; -PFNGLGETHISTOGRAMPROC __glewGetHistogram = NULL; -PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv = NULL; -PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv = NULL; -PFNGLGETMINMAXPROC __glewGetMinmax = NULL; -PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv = NULL; -PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv = NULL; -PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter = NULL; -PFNGLHISTOGRAMPROC __glewHistogram = NULL; -PFNGLMINMAXPROC __glewMinmax = NULL; -PFNGLRESETHISTOGRAMPROC __glewResetHistogram = NULL; -PFNGLRESETMINMAXPROC __glewResetMinmax = NULL; -PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D = NULL; - -PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB = NULL; -PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB = NULL; - -PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB = NULL; -PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB = NULL; -PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB = NULL; - -PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ = NULL; - -PFNGLGETINTERNALFORMATI64VPROC __glewGetInternalformati64v = NULL; - -PFNGLINVALIDATEBUFFERDATAPROC __glewInvalidateBufferData = NULL; -PFNGLINVALIDATEBUFFERSUBDATAPROC __glewInvalidateBufferSubData = NULL; -PFNGLINVALIDATEFRAMEBUFFERPROC __glewInvalidateFramebuffer = NULL; -PFNGLINVALIDATESUBFRAMEBUFFERPROC __glewInvalidateSubFramebuffer = NULL; -PFNGLINVALIDATETEXIMAGEPROC __glewInvalidateTexImage = NULL; -PFNGLINVALIDATETEXSUBIMAGEPROC __glewInvalidateTexSubImage = NULL; - -PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange = NULL; -PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange = NULL; - -PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB = NULL; -PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB = NULL; -PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB = NULL; -PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB = NULL; -PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB = NULL; - -PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase = NULL; -PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange = NULL; -PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures = NULL; -PFNGLBINDSAMPLERSPROC __glewBindSamplers = NULL; -PFNGLBINDTEXTURESPROC __glewBindTextures = NULL; -PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers = NULL; - -PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect = NULL; -PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect = NULL; - -PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB = NULL; - -PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB = NULL; -PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB = NULL; -PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB = NULL; -PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB = NULL; -PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB = NULL; -PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB = NULL; -PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB = NULL; -PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB = NULL; -PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB = NULL; -PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB = NULL; -PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB = NULL; -PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB = NULL; -PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB = NULL; -PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB = NULL; -PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB = NULL; -PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB = NULL; -PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB = NULL; -PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB = NULL; -PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB = NULL; -PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB = NULL; -PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB = NULL; -PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB = NULL; -PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB = NULL; -PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB = NULL; -PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB = NULL; -PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB = NULL; -PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB = NULL; -PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB = NULL; -PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB = NULL; -PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB = NULL; -PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB = NULL; -PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB = NULL; -PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB = NULL; -PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB = NULL; - -PFNGLBEGINQUERYARBPROC __glewBeginQueryARB = NULL; -PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB = NULL; -PFNGLENDQUERYARBPROC __glewEndQueryARB = NULL; -PFNGLGENQUERIESARBPROC __glewGenQueriesARB = NULL; -PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB = NULL; -PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB = NULL; -PFNGLGETQUERYIVARBPROC __glewGetQueryivARB = NULL; -PFNGLISQUERYARBPROC __glewIsQueryARB = NULL; - -PFNGLMAXSHADERCOMPILERTHREADSARBPROC __glewMaxShaderCompilerThreadsARB = NULL; - -PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB = NULL; -PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB = NULL; - -PFNGLPOLYGONOFFSETCLAMPPROC __glewPolygonOffsetClamp = NULL; - -PFNGLGETPROGRAMINTERFACEIVPROC __glewGetProgramInterfaceiv = NULL; -PFNGLGETPROGRAMRESOURCEINDEXPROC __glewGetProgramResourceIndex = NULL; -PFNGLGETPROGRAMRESOURCELOCATIONPROC __glewGetProgramResourceLocation = NULL; -PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC __glewGetProgramResourceLocationIndex = NULL; -PFNGLGETPROGRAMRESOURCENAMEPROC __glewGetProgramResourceName = NULL; -PFNGLGETPROGRAMRESOURCEIVPROC __glewGetProgramResourceiv = NULL; - -PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex = NULL; - -PFNGLGETGRAPHICSRESETSTATUSARBPROC __glewGetGraphicsResetStatusARB = NULL; -PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB = NULL; -PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB = NULL; -PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB = NULL; -PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB = NULL; -PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB = NULL; -PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB = NULL; -PFNGLGETNMAPIVARBPROC __glewGetnMapivARB = NULL; -PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB = NULL; -PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB = NULL; -PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB = NULL; -PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB = NULL; -PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB = NULL; -PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB = NULL; -PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB = NULL; -PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB = NULL; -PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB = NULL; -PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB = NULL; -PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB = NULL; -PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB = NULL; - -PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewFramebufferSampleLocationsfvARB = NULL; -PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewNamedFramebufferSampleLocationsfvARB = NULL; - -PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB = NULL; - -PFNGLBINDSAMPLERPROC __glewBindSampler = NULL; -PFNGLDELETESAMPLERSPROC __glewDeleteSamplers = NULL; -PFNGLGENSAMPLERSPROC __glewGenSamplers = NULL; -PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv = NULL; -PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv = NULL; -PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv = NULL; -PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv = NULL; -PFNGLISSAMPLERPROC __glewIsSampler = NULL; -PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv = NULL; -PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv = NULL; -PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf = NULL; -PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv = NULL; -PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri = NULL; -PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv = NULL; - -PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram = NULL; -PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline = NULL; -PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv = NULL; -PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines = NULL; -PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines = NULL; -PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog = NULL; -PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv = NULL; -PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline = NULL; -PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d = NULL; -PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv = NULL; -PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f = NULL; -PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv = NULL; -PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i = NULL; -PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv = NULL; -PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui = NULL; -PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv = NULL; -PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d = NULL; -PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv = NULL; -PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f = NULL; -PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv = NULL; -PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i = NULL; -PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv = NULL; -PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui = NULL; -PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv = NULL; -PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d = NULL; -PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv = NULL; -PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f = NULL; -PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv = NULL; -PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i = NULL; -PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv = NULL; -PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui = NULL; -PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv = NULL; -PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d = NULL; -PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv = NULL; -PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f = NULL; -PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv = NULL; -PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i = NULL; -PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv = NULL; -PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui = NULL; -PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv = NULL; -PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages = NULL; -PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline = NULL; - -PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __glewGetActiveAtomicCounterBufferiv = NULL; - -PFNGLBINDIMAGETEXTUREPROC __glewBindImageTexture = NULL; -PFNGLMEMORYBARRIERPROC __glewMemoryBarrier = NULL; - -PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB = NULL; -PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB = NULL; -PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB = NULL; -PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB = NULL; -PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB = NULL; -PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB = NULL; -PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB = NULL; -PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB = NULL; -PFNGLGETHANDLEARBPROC __glewGetHandleARB = NULL; -PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB = NULL; -PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB = NULL; -PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB = NULL; -PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB = NULL; -PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB = NULL; -PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB = NULL; -PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB = NULL; -PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB = NULL; -PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB = NULL; -PFNGLUNIFORM1FARBPROC __glewUniform1fARB = NULL; -PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB = NULL; -PFNGLUNIFORM1IARBPROC __glewUniform1iARB = NULL; -PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB = NULL; -PFNGLUNIFORM2FARBPROC __glewUniform2fARB = NULL; -PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB = NULL; -PFNGLUNIFORM2IARBPROC __glewUniform2iARB = NULL; -PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB = NULL; -PFNGLUNIFORM3FARBPROC __glewUniform3fARB = NULL; -PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB = NULL; -PFNGLUNIFORM3IARBPROC __glewUniform3iARB = NULL; -PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB = NULL; -PFNGLUNIFORM4FARBPROC __glewUniform4fARB = NULL; -PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB = NULL; -PFNGLUNIFORM4IARBPROC __glewUniform4iARB = NULL; -PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB = NULL; -PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB = NULL; -PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB = NULL; -PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB = NULL; -PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB = NULL; -PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB = NULL; - -PFNGLSHADERSTORAGEBLOCKBINDINGPROC __glewShaderStorageBlockBinding = NULL; - -PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName = NULL; -PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName = NULL; -PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv = NULL; -PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv = NULL; -PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex = NULL; -PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation = NULL; -PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv = NULL; -PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv = NULL; - -PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB = NULL; -PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB = NULL; -PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB = NULL; -PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB = NULL; -PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB = NULL; -PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB = NULL; - -PFNGLBUFFERPAGECOMMITMENTARBPROC __glewBufferPageCommitmentARB = NULL; - -PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB = NULL; - -PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync = NULL; -PFNGLDELETESYNCPROC __glewDeleteSync = NULL; -PFNGLFENCESYNCPROC __glewFenceSync = NULL; -PFNGLGETINTEGER64VPROC __glewGetInteger64v = NULL; -PFNGLGETSYNCIVPROC __glewGetSynciv = NULL; -PFNGLISSYNCPROC __glewIsSync = NULL; -PFNGLWAITSYNCPROC __glewWaitSync = NULL; - -PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv = NULL; -PFNGLPATCHPARAMETERIPROC __glewPatchParameteri = NULL; - -PFNGLTEXTUREBARRIERPROC __glewTextureBarrier = NULL; - -PFNGLTEXBUFFERARBPROC __glewTexBufferARB = NULL; - -PFNGLTEXBUFFERRANGEPROC __glewTexBufferRange = NULL; -PFNGLTEXTUREBUFFERRANGEEXTPROC __glewTextureBufferRangeEXT = NULL; - -PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB = NULL; -PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB = NULL; -PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB = NULL; -PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB = NULL; - -PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv = NULL; -PFNGLSAMPLEMASKIPROC __glewSampleMaski = NULL; -PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample = NULL; -PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample = NULL; - -PFNGLTEXSTORAGE1DPROC __glewTexStorage1D = NULL; -PFNGLTEXSTORAGE2DPROC __glewTexStorage2D = NULL; -PFNGLTEXSTORAGE3DPROC __glewTexStorage3D = NULL; - -PFNGLTEXSTORAGE2DMULTISAMPLEPROC __glewTexStorage2DMultisample = NULL; -PFNGLTEXSTORAGE3DMULTISAMPLEPROC __glewTexStorage3DMultisample = NULL; -PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __glewTextureStorage2DMultisampleEXT = NULL; -PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __glewTextureStorage3DMultisampleEXT = NULL; - -PFNGLTEXTUREVIEWPROC __glewTextureView = NULL; - -PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v = NULL; -PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v = NULL; -PFNGLQUERYCOUNTERPROC __glewQueryCounter = NULL; - -PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback = NULL; -PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks = NULL; -PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback = NULL; -PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks = NULL; -PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback = NULL; -PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback = NULL; -PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback = NULL; - -PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed = NULL; -PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream = NULL; -PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed = NULL; -PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv = NULL; - -PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __glewDrawTransformFeedbackInstanced = NULL; -PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __glewDrawTransformFeedbackStreamInstanced = NULL; - -PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB = NULL; -PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB = NULL; -PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB = NULL; -PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB = NULL; - -PFNGLBINDBUFFERBASEPROC __glewBindBufferBase = NULL; -PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange = NULL; -PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName = NULL; -PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv = NULL; -PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName = NULL; -PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv = NULL; -PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v = NULL; -PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex = NULL; -PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices = NULL; -PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding = NULL; - -PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray = NULL; -PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays = NULL; -PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays = NULL; -PFNGLISVERTEXARRAYPROC __glewIsVertexArray = NULL; - -PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv = NULL; -PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d = NULL; -PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv = NULL; -PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d = NULL; -PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv = NULL; -PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d = NULL; -PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv = NULL; -PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d = NULL; -PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv = NULL; -PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer = NULL; - -PFNGLBINDVERTEXBUFFERPROC __glewBindVertexBuffer = NULL; -PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC __glewVertexArrayBindVertexBufferEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC __glewVertexArrayVertexAttribBindingEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC __glewVertexArrayVertexAttribFormatEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC __glewVertexArrayVertexAttribIFormatEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC __glewVertexArrayVertexAttribLFormatEXT = NULL; -PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC __glewVertexArrayVertexBindingDivisorEXT = NULL; -PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding = NULL; -PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat = NULL; -PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat = NULL; -PFNGLVERTEXATTRIBLFORMATPROC __glewVertexAttribLFormat = NULL; -PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor = NULL; - -PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB = NULL; -PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB = NULL; -PFNGLWEIGHTBVARBPROC __glewWeightbvARB = NULL; -PFNGLWEIGHTDVARBPROC __glewWeightdvARB = NULL; -PFNGLWEIGHTFVARBPROC __glewWeightfvARB = NULL; -PFNGLWEIGHTIVARBPROC __glewWeightivARB = NULL; -PFNGLWEIGHTSVARBPROC __glewWeightsvARB = NULL; -PFNGLWEIGHTUBVARBPROC __glewWeightubvARB = NULL; -PFNGLWEIGHTUIVARBPROC __glewWeightuivARB = NULL; -PFNGLWEIGHTUSVARBPROC __glewWeightusvARB = NULL; - -PFNGLBINDBUFFERARBPROC __glewBindBufferARB = NULL; -PFNGLBUFFERDATAARBPROC __glewBufferDataARB = NULL; -PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB = NULL; -PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB = NULL; -PFNGLGENBUFFERSARBPROC __glewGenBuffersARB = NULL; -PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB = NULL; -PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB = NULL; -PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB = NULL; -PFNGLISBUFFERARBPROC __glewIsBufferARB = NULL; -PFNGLMAPBUFFERARBPROC __glewMapBufferARB = NULL; -PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB = NULL; - -PFNGLBINDPROGRAMARBPROC __glewBindProgramARB = NULL; -PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB = NULL; -PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB = NULL; -PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB = NULL; -PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB = NULL; -PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB = NULL; -PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB = NULL; -PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB = NULL; -PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB = NULL; -PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB = NULL; -PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB = NULL; -PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB = NULL; -PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB = NULL; -PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB = NULL; -PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB = NULL; -PFNGLISPROGRAMARBPROC __glewIsProgramARB = NULL; -PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB = NULL; -PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB = NULL; -PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB = NULL; -PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB = NULL; -PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB = NULL; -PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB = NULL; -PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB = NULL; -PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB = NULL; -PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB = NULL; -PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB = NULL; -PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB = NULL; -PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB = NULL; -PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB = NULL; -PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB = NULL; -PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB = NULL; -PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB = NULL; -PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB = NULL; -PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB = NULL; -PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB = NULL; -PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB = NULL; -PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB = NULL; -PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB = NULL; -PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB = NULL; -PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB = NULL; -PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB = NULL; -PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB = NULL; -PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB = NULL; -PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB = NULL; -PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB = NULL; -PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB = NULL; -PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB = NULL; -PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB = NULL; -PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB = NULL; -PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB = NULL; -PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB = NULL; -PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB = NULL; -PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB = NULL; -PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB = NULL; -PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB = NULL; -PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB = NULL; -PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB = NULL; -PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB = NULL; - -PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB = NULL; -PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB = NULL; -PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB = NULL; - -PFNGLCOLORP3UIPROC __glewColorP3ui = NULL; -PFNGLCOLORP3UIVPROC __glewColorP3uiv = NULL; -PFNGLCOLORP4UIPROC __glewColorP4ui = NULL; -PFNGLCOLORP4UIVPROC __glewColorP4uiv = NULL; -PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui = NULL; -PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv = NULL; -PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui = NULL; -PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv = NULL; -PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui = NULL; -PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv = NULL; -PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui = NULL; -PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv = NULL; -PFNGLNORMALP3UIPROC __glewNormalP3ui = NULL; -PFNGLNORMALP3UIVPROC __glewNormalP3uiv = NULL; -PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui = NULL; -PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv = NULL; -PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui = NULL; -PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv = NULL; -PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui = NULL; -PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv = NULL; -PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui = NULL; -PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv = NULL; -PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui = NULL; -PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv = NULL; -PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui = NULL; -PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv = NULL; -PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui = NULL; -PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv = NULL; -PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui = NULL; -PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv = NULL; -PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui = NULL; -PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv = NULL; -PFNGLVERTEXP2UIPROC __glewVertexP2ui = NULL; -PFNGLVERTEXP2UIVPROC __glewVertexP2uiv = NULL; -PFNGLVERTEXP3UIPROC __glewVertexP3ui = NULL; -PFNGLVERTEXP3UIVPROC __glewVertexP3uiv = NULL; -PFNGLVERTEXP4UIPROC __glewVertexP4ui = NULL; -PFNGLVERTEXP4UIVPROC __glewVertexP4uiv = NULL; - -PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv = NULL; -PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed = NULL; -PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v = NULL; -PFNGLGETFLOATI_VPROC __glewGetFloati_v = NULL; -PFNGLSCISSORARRAYVPROC __glewScissorArrayv = NULL; -PFNGLSCISSORINDEXEDPROC __glewScissorIndexed = NULL; -PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv = NULL; -PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv = NULL; -PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf = NULL; -PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv = NULL; - -PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB = NULL; -PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB = NULL; -PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB = NULL; -PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB = NULL; -PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB = NULL; -PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB = NULL; -PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB = NULL; -PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB = NULL; -PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB = NULL; -PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB = NULL; -PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB = NULL; -PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB = NULL; -PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB = NULL; -PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB = NULL; -PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB = NULL; -PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB = NULL; - -PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI = NULL; - -PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI = NULL; -PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI = NULL; -PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI = NULL; - -PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI = NULL; -PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI = NULL; -PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI = NULL; -PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI = NULL; - -PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI = NULL; -PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI = NULL; -PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI = NULL; -PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI = NULL; -PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI = NULL; -PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI = NULL; -PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI = NULL; -PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI = NULL; -PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI = NULL; -PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI = NULL; -PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI = NULL; -PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI = NULL; -PFNGLSAMPLEMAPATIPROC __glewSampleMapATI = NULL; -PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI = NULL; - -PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI = NULL; -PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI = NULL; - -PFNGLPNTRIANGLESFATIPROC __glewPNTrianglesfATI = NULL; -PFNGLPNTRIANGLESIATIPROC __glewPNTrianglesiATI = NULL; - -PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI = NULL; -PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI = NULL; - -PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI = NULL; -PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI = NULL; -PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI = NULL; -PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI = NULL; -PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI = NULL; -PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI = NULL; -PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI = NULL; -PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI = NULL; -PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI = NULL; -PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI = NULL; -PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI = NULL; -PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI = NULL; - -PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI = NULL; -PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI = NULL; -PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI = NULL; - -PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI = NULL; -PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI = NULL; -PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI = NULL; -PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI = NULL; -PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI = NULL; -PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI = NULL; -PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI = NULL; -PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI = NULL; -PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI = NULL; -PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI = NULL; -PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI = NULL; -PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI = NULL; -PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI = NULL; -PFNGLVERTEXSTREAM1DATIPROC __glewVertexStream1dATI = NULL; -PFNGLVERTEXSTREAM1DVATIPROC __glewVertexStream1dvATI = NULL; -PFNGLVERTEXSTREAM1FATIPROC __glewVertexStream1fATI = NULL; -PFNGLVERTEXSTREAM1FVATIPROC __glewVertexStream1fvATI = NULL; -PFNGLVERTEXSTREAM1IATIPROC __glewVertexStream1iATI = NULL; -PFNGLVERTEXSTREAM1IVATIPROC __glewVertexStream1ivATI = NULL; -PFNGLVERTEXSTREAM1SATIPROC __glewVertexStream1sATI = NULL; -PFNGLVERTEXSTREAM1SVATIPROC __glewVertexStream1svATI = NULL; -PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI = NULL; -PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI = NULL; -PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI = NULL; -PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI = NULL; -PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI = NULL; -PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI = NULL; -PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI = NULL; -PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI = NULL; -PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI = NULL; -PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI = NULL; -PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI = NULL; -PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI = NULL; -PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI = NULL; -PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI = NULL; -PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI = NULL; -PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI = NULL; -PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI = NULL; -PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI = NULL; -PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI = NULL; -PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI = NULL; -PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI = NULL; -PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI = NULL; -PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI = NULL; -PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI = NULL; - -PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC __glewDrawArraysInstancedBaseInstanceEXT = NULL; -PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC __glewDrawElementsInstancedBaseInstanceEXT = NULL; -PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC __glewDrawElementsInstancedBaseVertexBaseInstanceEXT = NULL; - -PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT = NULL; -PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT = NULL; -PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT = NULL; - -PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT = NULL; - -PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT = NULL; - -PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC __glewBindFragDataLocationIndexedEXT = NULL; -PFNGLGETFRAGDATAINDEXEXTPROC __glewGetFragDataIndexEXT = NULL; -PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC __glewGetProgramResourceLocationIndexEXT = NULL; - -PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT = NULL; - -PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT = NULL; - -PFNGLBUFFERSTORAGEEXTPROC __glewBufferStorageEXT = NULL; -PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT = NULL; - -PFNGLCLEARTEXIMAGEEXTPROC __glewClearTexImageEXT = NULL; -PFNGLCLEARTEXSUBIMAGEEXTPROC __glewClearTexSubImageEXT = NULL; - -PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT = NULL; -PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT = NULL; - -PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT = NULL; -PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT = NULL; - -PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT = NULL; -PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT = NULL; -PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT = NULL; -PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT = NULL; -PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT = NULL; -PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT = NULL; -PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT = NULL; -PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT = NULL; -PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT = NULL; -PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT = NULL; -PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT = NULL; -PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT = NULL; -PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT = NULL; - -PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT = NULL; -PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT = NULL; - -PFNGLCOPYIMAGESUBDATAEXTPROC __glewCopyImageSubDataEXT = NULL; - -PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT = NULL; -PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT = NULL; -PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT = NULL; -PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT = NULL; -PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT = NULL; - -PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT = NULL; -PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT = NULL; - -PFNGLGETOBJECTLABELEXTPROC __glewGetObjectLabelEXT = NULL; -PFNGLLABELOBJECTEXTPROC __glewLabelObjectEXT = NULL; - -PFNGLINSERTEVENTMARKEREXTPROC __glewInsertEventMarkerEXT = NULL; -PFNGLPOPGROUPMARKEREXTPROC __glewPopGroupMarkerEXT = NULL; -PFNGLPUSHGROUPMARKEREXTPROC __glewPushGroupMarkerEXT = NULL; - -PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT = NULL; - -PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT = NULL; -PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT = NULL; -PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT = NULL; -PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT = NULL; -PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT = NULL; -PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT = NULL; -PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT = NULL; -PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT = NULL; -PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT = NULL; -PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT = NULL; -PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT = NULL; -PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT = NULL; -PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT = NULL; -PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT = NULL; -PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT = NULL; -PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT = NULL; -PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT = NULL; -PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT = NULL; -PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT = NULL; -PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT = NULL; -PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT = NULL; -PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT = NULL; -PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT = NULL; -PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT = NULL; -PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT = NULL; -PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT = NULL; -PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT = NULL; -PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT = NULL; -PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT = NULL; -PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT = NULL; -PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT = NULL; -PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT = NULL; -PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT = NULL; -PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT = NULL; -PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT = NULL; -PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT = NULL; -PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT = NULL; -PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT = NULL; -PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT = NULL; -PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT = NULL; -PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT = NULL; -PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT = NULL; -PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT = NULL; -PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT = NULL; -PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT = NULL; -PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT = NULL; -PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT = NULL; -PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT = NULL; -PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT = NULL; -PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT = NULL; -PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT = NULL; -PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT = NULL; -PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT = NULL; -PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT = NULL; -PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT = NULL; -PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT = NULL; -PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT = NULL; -PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT = NULL; -PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT = NULL; -PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT = NULL; -PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT = NULL; -PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT = NULL; -PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT = NULL; -PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT = NULL; -PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT = NULL; -PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT = NULL; -PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT = NULL; -PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT = NULL; -PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT = NULL; -PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT = NULL; -PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT = NULL; -PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT = NULL; -PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT = NULL; -PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT = NULL; -PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT = NULL; -PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT = NULL; -PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT = NULL; -PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT = NULL; -PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT = NULL; -PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT = NULL; -PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT = NULL; -PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT = NULL; -PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT = NULL; -PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT = NULL; -PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT = NULL; -PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT = NULL; -PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT = NULL; -PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT = NULL; -PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT = NULL; -PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT = NULL; -PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT = NULL; -PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT = NULL; -PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT = NULL; -PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT = NULL; -PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT = NULL; -PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT = NULL; -PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT = NULL; -PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT = NULL; -PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT = NULL; -PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT = NULL; -PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT = NULL; -PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT = NULL; -PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT = NULL; -PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT = NULL; -PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT = NULL; -PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT = NULL; -PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT = NULL; -PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT = NULL; -PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT = NULL; -PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT = NULL; -PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT = NULL; -PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT = NULL; -PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT = NULL; -PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT = NULL; -PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT = NULL; -PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT = NULL; -PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT = NULL; -PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT = NULL; -PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT = NULL; -PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT = NULL; -PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT = NULL; -PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT = NULL; -PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT = NULL; -PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT = NULL; -PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT = NULL; -PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT = NULL; -PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT = NULL; -PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT = NULL; -PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT = NULL; -PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT = NULL; -PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT = NULL; -PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT = NULL; -PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT = NULL; -PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT = NULL; -PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT = NULL; -PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT = NULL; -PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT = NULL; -PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT = NULL; -PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT = NULL; -PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT = NULL; -PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT = NULL; -PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT = NULL; -PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT = NULL; -PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT = NULL; -PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT = NULL; -PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT = NULL; -PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT = NULL; -PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT = NULL; -PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT = NULL; -PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT = NULL; -PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT = NULL; -PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT = NULL; -PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT = NULL; -PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT = NULL; -PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT = NULL; -PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT = NULL; -PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT = NULL; -PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT = NULL; -PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT = NULL; -PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT = NULL; -PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT = NULL; -PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT = NULL; -PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT = NULL; -PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT = NULL; -PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT = NULL; -PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT = NULL; -PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT = NULL; -PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT = NULL; -PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT = NULL; -PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT = NULL; -PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT = NULL; -PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT = NULL; -PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT = NULL; -PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT = NULL; -PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT = NULL; -PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT = NULL; -PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT = NULL; -PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT = NULL; -PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT = NULL; -PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT = NULL; -PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT = NULL; -PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT = NULL; -PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT = NULL; -PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT = NULL; -PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT = NULL; -PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC __glewVertexArrayVertexAttribDivisorEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT = NULL; -PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT = NULL; - -PFNGLDISCARDFRAMEBUFFEREXTPROC __glewDiscardFramebufferEXT = NULL; - -PFNGLDRAWBUFFERSEXTPROC __glewDrawBuffersEXT = NULL; - -PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT = NULL; -PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT = NULL; -PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT = NULL; -PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT = NULL; -PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT = NULL; -PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT = NULL; - -PFNGLBLENDEQUATIONSEPARATEIEXTPROC __glewBlendEquationSeparateiEXT = NULL; -PFNGLBLENDEQUATIONIEXTPROC __glewBlendEquationiEXT = NULL; -PFNGLBLENDFUNCSEPARATEIEXTPROC __glewBlendFuncSeparateiEXT = NULL; -PFNGLBLENDFUNCIEXTPROC __glewBlendFunciEXT = NULL; -PFNGLCOLORMASKIEXTPROC __glewColorMaskiEXT = NULL; -PFNGLDISABLEIEXTPROC __glewDisableiEXT = NULL; -PFNGLENABLEIEXTPROC __glewEnableiEXT = NULL; -PFNGLISENABLEDIEXTPROC __glewIsEnablediEXT = NULL; - -PFNGLDRAWELEMENTSBASEVERTEXEXTPROC __glewDrawElementsBaseVertexEXT = NULL; -PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC __glewDrawElementsInstancedBaseVertexEXT = NULL; -PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC __glewDrawRangeElementsBaseVertexEXT = NULL; -PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC __glewMultiDrawElementsBaseVertexEXT = NULL; - -PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT = NULL; -PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT = NULL; - -PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT = NULL; - -PFNGLBUFFERSTORAGEEXTERNALEXTPROC __glewBufferStorageExternalEXT = NULL; -PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC __glewNamedBufferStorageExternalEXT = NULL; - -PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT = NULL; -PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT = NULL; -PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT = NULL; -PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT = NULL; -PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT = NULL; - -PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT = NULL; -PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT = NULL; -PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT = NULL; -PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT = NULL; -PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT = NULL; -PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT = NULL; -PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT = NULL; -PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT = NULL; -PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT = NULL; -PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT = NULL; -PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT = NULL; -PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT = NULL; -PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT = NULL; -PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT = NULL; -PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT = NULL; -PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT = NULL; -PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT = NULL; -PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT = NULL; - -PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT = NULL; - -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT = NULL; - -PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT = NULL; -PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT = NULL; -PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT = NULL; -PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT = NULL; -PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT = NULL; -PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT = NULL; -PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT = NULL; -PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT = NULL; -PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT = NULL; -PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT = NULL; -PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT = NULL; -PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT = NULL; -PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT = NULL; -PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT = NULL; -PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT = NULL; -PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT = NULL; -PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT = NULL; - -PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT = NULL; -PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT = NULL; -PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT = NULL; - -PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT = NULL; -PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT = NULL; - -PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT = NULL; -PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT = NULL; -PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT = NULL; -PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT = NULL; -PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT = NULL; -PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT = NULL; -PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT = NULL; -PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT = NULL; -PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT = NULL; -PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT = NULL; -PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT = NULL; -PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT = NULL; -PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT = NULL; -PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT = NULL; -PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT = NULL; -PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT = NULL; -PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT = NULL; -PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT = NULL; -PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT = NULL; -PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT = NULL; -PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT = NULL; -PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT = NULL; -PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT = NULL; -PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT = NULL; -PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT = NULL; -PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT = NULL; -PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT = NULL; -PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT = NULL; -PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT = NULL; -PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT = NULL; -PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT = NULL; -PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT = NULL; -PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT = NULL; -PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT = NULL; - -PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT = NULL; -PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT = NULL; -PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT = NULL; -PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT = NULL; -PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT = NULL; -PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT = NULL; -PFNGLHISTOGRAMEXTPROC __glewHistogramEXT = NULL; -PFNGLMINMAXEXTPROC __glewMinmaxEXT = NULL; -PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT = NULL; -PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT = NULL; - -PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT = NULL; - -PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT = NULL; - -PFNGLVERTEXATTRIBDIVISOREXTPROC __glewVertexAttribDivisorEXT = NULL; - -PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT = NULL; -PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT = NULL; -PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT = NULL; - -PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC __glewFlushMappedBufferRangeEXT = NULL; -PFNGLMAPBUFFERRANGEEXTPROC __glewMapBufferRangeEXT = NULL; - -PFNGLBUFFERSTORAGEMEMEXTPROC __glewBufferStorageMemEXT = NULL; -PFNGLCREATEMEMORYOBJECTSEXTPROC __glewCreateMemoryObjectsEXT = NULL; -PFNGLDELETEMEMORYOBJECTSEXTPROC __glewDeleteMemoryObjectsEXT = NULL; -PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC __glewGetMemoryObjectParameterivEXT = NULL; -PFNGLGETUNSIGNEDBYTEI_VEXTPROC __glewGetUnsignedBytei_vEXT = NULL; -PFNGLGETUNSIGNEDBYTEVEXTPROC __glewGetUnsignedBytevEXT = NULL; -PFNGLISMEMORYOBJECTEXTPROC __glewIsMemoryObjectEXT = NULL; -PFNGLMEMORYOBJECTPARAMETERIVEXTPROC __glewMemoryObjectParameterivEXT = NULL; -PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC __glewNamedBufferStorageMemEXT = NULL; -PFNGLTEXSTORAGEMEM1DEXTPROC __glewTexStorageMem1DEXT = NULL; -PFNGLTEXSTORAGEMEM2DEXTPROC __glewTexStorageMem2DEXT = NULL; -PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC __glewTexStorageMem2DMultisampleEXT = NULL; -PFNGLTEXSTORAGEMEM3DEXTPROC __glewTexStorageMem3DEXT = NULL; -PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC __glewTexStorageMem3DMultisampleEXT = NULL; -PFNGLTEXTURESTORAGEMEM1DEXTPROC __glewTextureStorageMem1DEXT = NULL; -PFNGLTEXTURESTORAGEMEM2DEXTPROC __glewTextureStorageMem2DEXT = NULL; -PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC __glewTextureStorageMem2DMultisampleEXT = NULL; -PFNGLTEXTURESTORAGEMEM3DEXTPROC __glewTextureStorageMem3DEXT = NULL; -PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC __glewTextureStorageMem3DMultisampleEXT = NULL; - -PFNGLIMPORTMEMORYFDEXTPROC __glewImportMemoryFdEXT = NULL; - -PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC __glewImportMemoryWin32HandleEXT = NULL; -PFNGLIMPORTMEMORYWIN32NAMEEXTPROC __glewImportMemoryWin32NameEXT = NULL; - -PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT = NULL; -PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT = NULL; - -PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC __glewMultiDrawArraysIndirectEXT = NULL; -PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC __glewMultiDrawElementsIndirectEXT = NULL; - -PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT = NULL; -PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT = NULL; - -PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC __glewFramebufferTexture2DMultisampleEXT = NULL; - -PFNGLDRAWBUFFERSINDEXEDEXTPROC __glewDrawBuffersIndexedEXT = NULL; -PFNGLGETINTEGERI_VEXTPROC __glewGetIntegeri_vEXT = NULL; -PFNGLREADBUFFERINDEXEDEXTPROC __glewReadBufferIndexedEXT = NULL; - -PFNGLCOLORTABLEEXTPROC __glewColorTableEXT = NULL; -PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT = NULL; -PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT = NULL; -PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT = NULL; - -PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT = NULL; -PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT = NULL; -PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT = NULL; -PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT = NULL; -PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT = NULL; -PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT = NULL; - -PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT = NULL; -PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT = NULL; - -PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT = NULL; - -PFNGLPOLYGONOFFSETCLAMPEXTPROC __glewPolygonOffsetClampEXT = NULL; - -PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT = NULL; - -PFNGLCOVERAGEMODULATIONNVPROC __glewCoverageModulationNV = NULL; -PFNGLCOVERAGEMODULATIONTABLENVPROC __glewCoverageModulationTableNV = NULL; -PFNGLGETCOVERAGEMODULATIONTABLENVPROC __glewGetCoverageModulationTableNV = NULL; -PFNGLRASTERSAMPLESEXTPROC __glewRasterSamplesEXT = NULL; - -PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT = NULL; -PFNGLENDSCENEEXTPROC __glewEndSceneEXT = NULL; - -PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT = NULL; -PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT = NULL; -PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT = NULL; -PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT = NULL; -PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT = NULL; -PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT = NULL; -PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT = NULL; -PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT = NULL; -PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT = NULL; -PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT = NULL; -PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT = NULL; -PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT = NULL; -PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT = NULL; -PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT = NULL; -PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT = NULL; -PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT = NULL; -PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT = NULL; - -PFNGLDELETESEMAPHORESEXTPROC __glewDeleteSemaphoresEXT = NULL; -PFNGLGENSEMAPHORESEXTPROC __glewGenSemaphoresEXT = NULL; -PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC __glewGetSemaphoreParameterui64vEXT = NULL; -PFNGLISSEMAPHOREEXTPROC __glewIsSemaphoreEXT = NULL; -PFNGLSEMAPHOREPARAMETERUI64VEXTPROC __glewSemaphoreParameterui64vEXT = NULL; -PFNGLSIGNALSEMAPHOREEXTPROC __glewSignalSemaphoreEXT = NULL; -PFNGLWAITSEMAPHOREEXTPROC __glewWaitSemaphoreEXT = NULL; - -PFNGLIMPORTSEMAPHOREFDEXTPROC __glewImportSemaphoreFdEXT = NULL; - -PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC __glewImportSemaphoreWin32HandleEXT = NULL; -PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC __glewImportSemaphoreWin32NameEXT = NULL; - -PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT = NULL; -PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT = NULL; -PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT = NULL; - -PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT = NULL; -PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT = NULL; - -PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC __glewClearPixelLocalStorageuiEXT = NULL; -PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __glewFramebufferPixelLocalStorageSizeEXT = NULL; -PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __glewGetFramebufferPixelLocalStorageSizeEXT = NULL; - -PFNGLTEXPAGECOMMITMENTEXTPROC __glewTexPageCommitmentEXT = NULL; -PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT = NULL; - -PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT = NULL; - -PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT = NULL; -PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT = NULL; -PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT = NULL; - -PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT = NULL; - -PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT = NULL; - -PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT = NULL; - -PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT = NULL; -PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT = NULL; -PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT = NULL; -PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT = NULL; -PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT = NULL; -PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT = NULL; - -PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT = NULL; -PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT = NULL; -PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT = NULL; -PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT = NULL; -PFNGLISTEXTUREEXTPROC __glewIsTextureEXT = NULL; -PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT = NULL; - -PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT = NULL; - -PFNGLTEXSTORAGE1DEXTPROC __glewTexStorage1DEXT = NULL; -PFNGLTEXSTORAGE2DEXTPROC __glewTexStorage2DEXT = NULL; -PFNGLTEXSTORAGE3DEXTPROC __glewTexStorage3DEXT = NULL; -PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT = NULL; -PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT = NULL; -PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT = NULL; - -PFNGLTEXTUREVIEWEXTPROC __glewTextureViewEXT = NULL; - -PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT = NULL; -PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT = NULL; - -PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT = NULL; -PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT = NULL; -PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT = NULL; -PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT = NULL; -PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT = NULL; -PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT = NULL; -PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT = NULL; - -PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT = NULL; -PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT = NULL; -PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT = NULL; -PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT = NULL; -PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT = NULL; -PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT = NULL; -PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT = NULL; -PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT = NULL; - -PFNGLBINDARRAYSETEXTPROC __glewBindArraySetEXT = NULL; -PFNGLCREATEARRAYSETEXTPROC __glewCreateArraySetExt = NULL; -PFNGLDELETEARRAYSETSEXTPROC __glewDeleteArraySetsEXT = NULL; - -PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT = NULL; -PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT = NULL; -PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT = NULL; -PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT = NULL; -PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT = NULL; -PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT = NULL; -PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT = NULL; -PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT = NULL; -PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT = NULL; -PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT = NULL; -PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT = NULL; - -PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT = NULL; -PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT = NULL; -PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT = NULL; -PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT = NULL; -PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT = NULL; -PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT = NULL; -PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT = NULL; -PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT = NULL; -PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT = NULL; -PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT = NULL; -PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT = NULL; -PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT = NULL; -PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT = NULL; -PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT = NULL; -PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT = NULL; -PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT = NULL; -PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT = NULL; -PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT = NULL; -PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT = NULL; -PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT = NULL; -PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT = NULL; -PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT = NULL; -PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT = NULL; -PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT = NULL; -PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT = NULL; -PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT = NULL; -PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT = NULL; -PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT = NULL; -PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT = NULL; -PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT = NULL; -PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT = NULL; -PFNGLSWIZZLEEXTPROC __glewSwizzleEXT = NULL; -PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT = NULL; -PFNGLVARIANTBVEXTPROC __glewVariantbvEXT = NULL; -PFNGLVARIANTDVEXTPROC __glewVariantdvEXT = NULL; -PFNGLVARIANTFVEXTPROC __glewVariantfvEXT = NULL; -PFNGLVARIANTIVEXTPROC __glewVariantivEXT = NULL; -PFNGLVARIANTSVEXTPROC __glewVariantsvEXT = NULL; -PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT = NULL; -PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT = NULL; -PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT = NULL; -PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT = NULL; - -PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT = NULL; -PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT = NULL; -PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT = NULL; - -PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC __glewAcquireKeyedMutexWin32EXT = NULL; -PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC __glewReleaseKeyedMutexWin32EXT = NULL; - -PFNGLWINDOWRECTANGLESEXTPROC __glewWindowRectanglesEXT = NULL; - -PFNGLIMPORTSYNCEXTPROC __glewImportSyncEXT = NULL; - -PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY = NULL; - -PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY = NULL; - -PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP = NULL; -PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP = NULL; -PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP = NULL; -PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP = NULL; -PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP = NULL; -PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP = NULL; - -PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM = NULL; -PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM = NULL; - -PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM = NULL; -PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM = NULL; -PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM = NULL; -PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM = NULL; -PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM = NULL; -PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM = NULL; -PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM = NULL; -PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM = NULL; - -PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL = NULL; -PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL = NULL; -PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL = NULL; - -PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL = NULL; -PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL = NULL; -PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL = NULL; -PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL = NULL; - -PFNGLBEGINPERFQUERYINTELPROC __glewBeginPerfQueryINTEL = NULL; -PFNGLCREATEPERFQUERYINTELPROC __glewCreatePerfQueryINTEL = NULL; -PFNGLDELETEPERFQUERYINTELPROC __glewDeletePerfQueryINTEL = NULL; -PFNGLENDPERFQUERYINTELPROC __glewEndPerfQueryINTEL = NULL; -PFNGLGETFIRSTPERFQUERYIDINTELPROC __glewGetFirstPerfQueryIdINTEL = NULL; -PFNGLGETNEXTPERFQUERYIDINTELPROC __glewGetNextPerfQueryIdINTEL = NULL; -PFNGLGETPERFCOUNTERINFOINTELPROC __glewGetPerfCounterInfoINTEL = NULL; -PFNGLGETPERFQUERYDATAINTELPROC __glewGetPerfQueryDataINTEL = NULL; -PFNGLGETPERFQUERYIDBYNAMEINTELPROC __glewGetPerfQueryIdByNameINTEL = NULL; -PFNGLGETPERFQUERYINFOINTELPROC __glewGetPerfQueryInfoINTEL = NULL; - -PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL = NULL; -PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL = NULL; - -PFNGLBLENDBARRIERKHRPROC __glewBlendBarrierKHR = NULL; - -PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback = NULL; -PFNGLDEBUGMESSAGECONTROLPROC __glewDebugMessageControl = NULL; -PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert = NULL; -PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog = NULL; -PFNGLGETOBJECTLABELPROC __glewGetObjectLabel = NULL; -PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel = NULL; -PFNGLOBJECTLABELPROC __glewObjectLabel = NULL; -PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel = NULL; -PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup = NULL; -PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup = NULL; - -PFNGLMAXSHADERCOMPILERTHREADSKHRPROC __glewMaxShaderCompilerThreadsKHR = NULL; - -PFNGLGETNUNIFORMFVPROC __glewGetnUniformfv = NULL; -PFNGLGETNUNIFORMIVPROC __glewGetnUniformiv = NULL; -PFNGLGETNUNIFORMUIVPROC __glewGetnUniformuiv = NULL; -PFNGLREADNPIXELSPROC __glewReadnPixels = NULL; - -PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled = NULL; -PFNGLDELETEBUFFERREGIONPROC __glewDeleteBufferRegion = NULL; -PFNGLDRAWBUFFERREGIONPROC __glewDrawBufferRegion = NULL; -PFNGLNEWBUFFERREGIONPROC __glewNewBufferRegion = NULL; -PFNGLREADBUFFERREGIONPROC __glewReadBufferRegion = NULL; - -PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA = NULL; - -PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA = NULL; -PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA = NULL; -PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA = NULL; -PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA = NULL; -PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA = NULL; -PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA = NULL; -PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA = NULL; -PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA = NULL; -PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA = NULL; -PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA = NULL; -PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA = NULL; -PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA = NULL; -PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA = NULL; -PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA = NULL; -PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA = NULL; -PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA = NULL; -PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA = NULL; -PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA = NULL; -PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA = NULL; -PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA = NULL; -PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA = NULL; -PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA = NULL; -PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA = NULL; -PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA = NULL; - -PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX = NULL; -PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX = NULL; - -PFNGLLGPUCOPYIMAGESUBDATANVXPROC __glewLGPUCopyImageSubDataNVX = NULL; -PFNGLLGPUINTERLOCKNVXPROC __glewLGPUInterlockNVX = NULL; -PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC __glewLGPUNamedBufferSubDataNVX = NULL; - -PFNGLSTEREOPARAMETERFNVPROC __glewStereoParameterfNV = NULL; -PFNGLSTEREOPARAMETERINVPROC __glewStereoParameteriNV = NULL; - -PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV = NULL; -PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV = NULL; - -PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawArraysIndirectBindlessCountNV = NULL; -PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawElementsIndirectBindlessCountNV = NULL; - -PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV = NULL; -PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV = NULL; -PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV = NULL; -PFNGLISIMAGEHANDLERESIDENTNVPROC __glewIsImageHandleResidentNV = NULL; -PFNGLISTEXTUREHANDLERESIDENTNVPROC __glewIsTextureHandleResidentNV = NULL; -PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC __glewMakeImageHandleNonResidentNV = NULL; -PFNGLMAKEIMAGEHANDLERESIDENTNVPROC __glewMakeImageHandleResidentNV = NULL; -PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC __glewMakeTextureHandleNonResidentNV = NULL; -PFNGLMAKETEXTUREHANDLERESIDENTNVPROC __glewMakeTextureHandleResidentNV = NULL; -PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC __glewProgramUniformHandleui64NV = NULL; -PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV = NULL; -PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV = NULL; -PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV = NULL; - -PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV = NULL; -PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV = NULL; - -PFNGLVIEWPORTPOSITIONWSCALENVPROC __glewViewportPositionWScaleNV = NULL; - -PFNGLCALLCOMMANDLISTNVPROC __glewCallCommandListNV = NULL; -PFNGLCOMMANDLISTSEGMENTSNVPROC __glewCommandListSegmentsNV = NULL; -PFNGLCOMPILECOMMANDLISTNVPROC __glewCompileCommandListNV = NULL; -PFNGLCREATECOMMANDLISTSNVPROC __glewCreateCommandListsNV = NULL; -PFNGLCREATESTATESNVPROC __glewCreateStatesNV = NULL; -PFNGLDELETECOMMANDLISTSNVPROC __glewDeleteCommandListsNV = NULL; -PFNGLDELETESTATESNVPROC __glewDeleteStatesNV = NULL; -PFNGLDRAWCOMMANDSADDRESSNVPROC __glewDrawCommandsAddressNV = NULL; -PFNGLDRAWCOMMANDSNVPROC __glewDrawCommandsNV = NULL; -PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC __glewDrawCommandsStatesAddressNV = NULL; -PFNGLDRAWCOMMANDSSTATESNVPROC __glewDrawCommandsStatesNV = NULL; -PFNGLGETCOMMANDHEADERNVPROC __glewGetCommandHeaderNV = NULL; -PFNGLGETSTAGEINDEXNVPROC __glewGetStageIndexNV = NULL; -PFNGLISCOMMANDLISTNVPROC __glewIsCommandListNV = NULL; -PFNGLISSTATENVPROC __glewIsStateNV = NULL; -PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC __glewListDrawCommandsStatesClientNV = NULL; -PFNGLSTATECAPTURENVPROC __glewStateCaptureNV = NULL; - -PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV = NULL; -PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV = NULL; - -PFNGLSUBPIXELPRECISIONBIASNVPROC __glewSubpixelPrecisionBiasNV = NULL; - -PFNGLCONSERVATIVERASTERPARAMETERFNVPROC __glewConservativeRasterParameterfNV = NULL; - -PFNGLCONSERVATIVERASTERPARAMETERINVPROC __glewConservativeRasterParameteriNV = NULL; - -PFNGLCOPYBUFFERSUBDATANVPROC __glewCopyBufferSubDataNV = NULL; - -PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV = NULL; - -PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV = NULL; -PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV = NULL; -PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV = NULL; - -PFNGLDRAWBUFFERSNVPROC __glewDrawBuffersNV = NULL; - -PFNGLDRAWARRAYSINSTANCEDNVPROC __glewDrawArraysInstancedNV = NULL; -PFNGLDRAWELEMENTSINSTANCEDNVPROC __glewDrawElementsInstancedNV = NULL; - -PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV = NULL; - -PFNGLDRAWVKIMAGENVPROC __glewDrawVkImageNV = NULL; -PFNGLGETVKPROCADDRNVPROC __glewGetVkProcAddrNV = NULL; -PFNGLSIGNALVKFENCENVPROC __glewSignalVkFenceNV = NULL; -PFNGLSIGNALVKSEMAPHORENVPROC __glewSignalVkSemaphoreNV = NULL; -PFNGLWAITVKSEMAPHORENVPROC __glewWaitVkSemaphoreNV = NULL; - -PFNGLEVALMAPSNVPROC __glewEvalMapsNV = NULL; -PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV = NULL; -PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV = NULL; -PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV = NULL; -PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV = NULL; -PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV = NULL; -PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV = NULL; -PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV = NULL; -PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV = NULL; - -PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV = NULL; -PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV = NULL; -PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV = NULL; - -PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV = NULL; -PFNGLFINISHFENCENVPROC __glewFinishFenceNV = NULL; -PFNGLGENFENCESNVPROC __glewGenFencesNV = NULL; -PFNGLGETFENCEIVNVPROC __glewGetFenceivNV = NULL; -PFNGLISFENCENVPROC __glewIsFenceNV = NULL; -PFNGLSETFENCENVPROC __glewSetFenceNV = NULL; -PFNGLTESTFENCENVPROC __glewTestFenceNV = NULL; - -PFNGLFRAGMENTCOVERAGECOLORNVPROC __glewFragmentCoverageColorNV = NULL; - -PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV = NULL; -PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV = NULL; -PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV = NULL; -PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV = NULL; -PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV = NULL; -PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV = NULL; - -PFNGLBLITFRAMEBUFFERNVPROC __glewBlitFramebufferNV = NULL; - -PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC __glewRenderbufferStorageMultisampleNV = NULL; - -PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV = NULL; - -PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV = NULL; - -PFNGLMULTICASTBARRIERNVPROC __glewMulticastBarrierNV = NULL; -PFNGLMULTICASTBLITFRAMEBUFFERNVPROC __glewMulticastBlitFramebufferNV = NULL; -PFNGLMULTICASTBUFFERSUBDATANVPROC __glewMulticastBufferSubDataNV = NULL; -PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC __glewMulticastCopyBufferSubDataNV = NULL; -PFNGLMULTICASTCOPYIMAGESUBDATANVPROC __glewMulticastCopyImageSubDataNV = NULL; -PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewMulticastFramebufferSampleLocationsfvNV = NULL; -PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC __glewMulticastGetQueryObjecti64vNV = NULL; -PFNGLMULTICASTGETQUERYOBJECTIVNVPROC __glewMulticastGetQueryObjectivNV = NULL; -PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC __glewMulticastGetQueryObjectui64vNV = NULL; -PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC __glewMulticastGetQueryObjectuivNV = NULL; -PFNGLMULTICASTWAITSYNCNVPROC __glewMulticastWaitSyncNV = NULL; -PFNGLRENDERGPUMASKNVPROC __glewRenderGpuMaskNV = NULL; - -PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV = NULL; -PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV = NULL; -PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV = NULL; -PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV = NULL; -PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV = NULL; -PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV = NULL; -PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV = NULL; -PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV = NULL; -PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV = NULL; -PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV = NULL; -PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV = NULL; -PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV = NULL; - -PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV = NULL; -PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV = NULL; -PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV = NULL; -PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV = NULL; -PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV = NULL; -PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV = NULL; -PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV = NULL; -PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV = NULL; -PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV = NULL; -PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV = NULL; -PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV = NULL; -PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV = NULL; -PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV = NULL; -PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV = NULL; -PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV = NULL; -PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV = NULL; -PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV = NULL; -PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV = NULL; -PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV = NULL; -PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV = NULL; -PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV = NULL; -PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV = NULL; -PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV = NULL; -PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV = NULL; -PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV = NULL; -PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV = NULL; -PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV = NULL; -PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV = NULL; -PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV = NULL; -PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV = NULL; -PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV = NULL; -PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV = NULL; -PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV = NULL; -PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV = NULL; - -PFNGLCOLOR3HNVPROC __glewColor3hNV = NULL; -PFNGLCOLOR3HVNVPROC __glewColor3hvNV = NULL; -PFNGLCOLOR4HNVPROC __glewColor4hNV = NULL; -PFNGLCOLOR4HVNVPROC __glewColor4hvNV = NULL; -PFNGLFOGCOORDHNVPROC __glewFogCoordhNV = NULL; -PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV = NULL; -PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV = NULL; -PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV = NULL; -PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV = NULL; -PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV = NULL; -PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV = NULL; -PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV = NULL; -PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV = NULL; -PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV = NULL; -PFNGLNORMAL3HNVPROC __glewNormal3hNV = NULL; -PFNGLNORMAL3HVNVPROC __glewNormal3hvNV = NULL; -PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV = NULL; -PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV = NULL; -PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV = NULL; -PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV = NULL; -PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV = NULL; -PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV = NULL; -PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV = NULL; -PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV = NULL; -PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV = NULL; -PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV = NULL; -PFNGLVERTEX2HNVPROC __glewVertex2hNV = NULL; -PFNGLVERTEX2HVNVPROC __glewVertex2hvNV = NULL; -PFNGLVERTEX3HNVPROC __glewVertex3hNV = NULL; -PFNGLVERTEX3HVNVPROC __glewVertex3hvNV = NULL; -PFNGLVERTEX4HNVPROC __glewVertex4hNV = NULL; -PFNGLVERTEX4HVNVPROC __glewVertex4hvNV = NULL; -PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV = NULL; -PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV = NULL; -PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV = NULL; -PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV = NULL; -PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV = NULL; -PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV = NULL; -PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV = NULL; -PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV = NULL; -PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV = NULL; -PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV = NULL; -PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV = NULL; -PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV = NULL; -PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV = NULL; -PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV = NULL; - -PFNGLVERTEXATTRIBDIVISORNVPROC __glewVertexAttribDivisorNV = NULL; - -PFNGLGETINTERNALFORMATSAMPLEIVNVPROC __glewGetInternalformatSampleivNV = NULL; - -PFNGLUNIFORMMATRIX2X3FVNVPROC __glewUniformMatrix2x3fvNV = NULL; -PFNGLUNIFORMMATRIX2X4FVNVPROC __glewUniformMatrix2x4fvNV = NULL; -PFNGLUNIFORMMATRIX3X2FVNVPROC __glewUniformMatrix3x2fvNV = NULL; -PFNGLUNIFORMMATRIX3X4FVNVPROC __glewUniformMatrix3x4fvNV = NULL; -PFNGLUNIFORMMATRIX4X2FVNVPROC __glewUniformMatrix4x2fvNV = NULL; -PFNGLUNIFORMMATRIX4X3FVNVPROC __glewUniformMatrix4x3fvNV = NULL; - -PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV = NULL; -PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV = NULL; -PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV = NULL; -PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV = NULL; -PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV = NULL; -PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV = NULL; -PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV = NULL; - -PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV = NULL; -PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV = NULL; -PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV = NULL; - -PFNGLCOPYPATHNVPROC __glewCopyPathNV = NULL; -PFNGLCOVERFILLPATHINSTANCEDNVPROC __glewCoverFillPathInstancedNV = NULL; -PFNGLCOVERFILLPATHNVPROC __glewCoverFillPathNV = NULL; -PFNGLCOVERSTROKEPATHINSTANCEDNVPROC __glewCoverStrokePathInstancedNV = NULL; -PFNGLCOVERSTROKEPATHNVPROC __glewCoverStrokePathNV = NULL; -PFNGLDELETEPATHSNVPROC __glewDeletePathsNV = NULL; -PFNGLGENPATHSNVPROC __glewGenPathsNV = NULL; -PFNGLGETPATHCOLORGENFVNVPROC __glewGetPathColorGenfvNV = NULL; -PFNGLGETPATHCOLORGENIVNVPROC __glewGetPathColorGenivNV = NULL; -PFNGLGETPATHCOMMANDSNVPROC __glewGetPathCommandsNV = NULL; -PFNGLGETPATHCOORDSNVPROC __glewGetPathCoordsNV = NULL; -PFNGLGETPATHDASHARRAYNVPROC __glewGetPathDashArrayNV = NULL; -PFNGLGETPATHLENGTHNVPROC __glewGetPathLengthNV = NULL; -PFNGLGETPATHMETRICRANGENVPROC __glewGetPathMetricRangeNV = NULL; -PFNGLGETPATHMETRICSNVPROC __glewGetPathMetricsNV = NULL; -PFNGLGETPATHPARAMETERFVNVPROC __glewGetPathParameterfvNV = NULL; -PFNGLGETPATHPARAMETERIVNVPROC __glewGetPathParameterivNV = NULL; -PFNGLGETPATHSPACINGNVPROC __glewGetPathSpacingNV = NULL; -PFNGLGETPATHTEXGENFVNVPROC __glewGetPathTexGenfvNV = NULL; -PFNGLGETPATHTEXGENIVNVPROC __glewGetPathTexGenivNV = NULL; -PFNGLGETPROGRAMRESOURCEFVNVPROC __glewGetProgramResourcefvNV = NULL; -PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV = NULL; -PFNGLISPATHNVPROC __glewIsPathNV = NULL; -PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV = NULL; -PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV = NULL; -PFNGLMATRIXLOAD3X2FNVPROC __glewMatrixLoad3x2fNV = NULL; -PFNGLMATRIXLOAD3X3FNVPROC __glewMatrixLoad3x3fNV = NULL; -PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC __glewMatrixLoadTranspose3x3fNV = NULL; -PFNGLMATRIXMULT3X2FNVPROC __glewMatrixMult3x2fNV = NULL; -PFNGLMATRIXMULT3X3FNVPROC __glewMatrixMult3x3fNV = NULL; -PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC __glewMatrixMultTranspose3x3fNV = NULL; -PFNGLPATHCOLORGENNVPROC __glewPathColorGenNV = NULL; -PFNGLPATHCOMMANDSNVPROC __glewPathCommandsNV = NULL; -PFNGLPATHCOORDSNVPROC __glewPathCoordsNV = NULL; -PFNGLPATHCOVERDEPTHFUNCNVPROC __glewPathCoverDepthFuncNV = NULL; -PFNGLPATHDASHARRAYNVPROC __glewPathDashArrayNV = NULL; -PFNGLPATHFOGGENNVPROC __glewPathFogGenNV = NULL; -PFNGLPATHGLYPHINDEXARRAYNVPROC __glewPathGlyphIndexArrayNV = NULL; -PFNGLPATHGLYPHINDEXRANGENVPROC __glewPathGlyphIndexRangeNV = NULL; -PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV = NULL; -PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV = NULL; -PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC __glewPathMemoryGlyphIndexArrayNV = NULL; -PFNGLPATHPARAMETERFNVPROC __glewPathParameterfNV = NULL; -PFNGLPATHPARAMETERFVNVPROC __glewPathParameterfvNV = NULL; -PFNGLPATHPARAMETERINVPROC __glewPathParameteriNV = NULL; -PFNGLPATHPARAMETERIVNVPROC __glewPathParameterivNV = NULL; -PFNGLPATHSTENCILDEPTHOFFSETNVPROC __glewPathStencilDepthOffsetNV = NULL; -PFNGLPATHSTENCILFUNCNVPROC __glewPathStencilFuncNV = NULL; -PFNGLPATHSTRINGNVPROC __glewPathStringNV = NULL; -PFNGLPATHSUBCOMMANDSNVPROC __glewPathSubCommandsNV = NULL; -PFNGLPATHSUBCOORDSNVPROC __glewPathSubCoordsNV = NULL; -PFNGLPATHTEXGENNVPROC __glewPathTexGenNV = NULL; -PFNGLPOINTALONGPATHNVPROC __glewPointAlongPathNV = NULL; -PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC __glewProgramPathFragmentInputGenNV = NULL; -PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV = NULL; -PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV = NULL; -PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV = NULL; -PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV = NULL; -PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC __glewStencilThenCoverFillPathInstancedNV = NULL; -PFNGLSTENCILTHENCOVERFILLPATHNVPROC __glewStencilThenCoverFillPathNV = NULL; -PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC __glewStencilThenCoverStrokePathInstancedNV = NULL; -PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC __glewStencilThenCoverStrokePathNV = NULL; -PFNGLTRANSFORMPATHNVPROC __glewTransformPathNV = NULL; -PFNGLWEIGHTPATHSNVPROC __glewWeightPathsNV = NULL; - -PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV = NULL; -PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV = NULL; - -PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV = NULL; -PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV = NULL; - -PFNGLPOLYGONMODENVPROC __glewPolygonModeNV = NULL; - -PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV = NULL; -PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV = NULL; -PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV = NULL; -PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV = NULL; -PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV = NULL; -PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV = NULL; - -PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV = NULL; -PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV = NULL; - -PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV = NULL; -PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV = NULL; -PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV = NULL; -PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV = NULL; -PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV = NULL; -PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV = NULL; -PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV = NULL; -PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV = NULL; -PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV = NULL; -PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV = NULL; -PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV = NULL; -PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV = NULL; -PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV = NULL; - -PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV = NULL; -PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV = NULL; - -PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewFramebufferSampleLocationsfvNV = NULL; -PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewNamedFramebufferSampleLocationsfvNV = NULL; - -PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV = NULL; -PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV = NULL; -PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV = NULL; -PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV = NULL; -PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV = NULL; -PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV = NULL; -PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV = NULL; -PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV = NULL; -PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV = NULL; -PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV = NULL; -PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV = NULL; -PFNGLUNIFORMUI64NVPROC __glewUniformui64NV = NULL; -PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV = NULL; - -PFNGLCOMPRESSEDTEXIMAGE3DNVPROC __glewCompressedTexImage3DNV = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE3DNVPROC __glewCompressedTexSubImage3DNV = NULL; -PFNGLCOPYTEXSUBIMAGE3DNVPROC __glewCopyTexSubImage3DNV = NULL; -PFNGLFRAMEBUFFERTEXTURELAYERNVPROC __glewFramebufferTextureLayerNV = NULL; -PFNGLTEXIMAGE3DNVPROC __glewTexImage3DNV = NULL; -PFNGLTEXSUBIMAGE3DNVPROC __glewTexSubImage3DNV = NULL; - -PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV = NULL; - -PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTexImage2DMultisampleCoverageNV = NULL; -PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTexImage3DMultisampleCoverageNV = NULL; -PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTextureImage2DMultisampleCoverageNV = NULL; -PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC __glewTextureImage2DMultisampleNV = NULL; -PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTextureImage3DMultisampleCoverageNV = NULL; -PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC __glewTextureImage3DMultisampleNV = NULL; - -PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV = NULL; -PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV = NULL; -PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV = NULL; -PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV = NULL; -PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV = NULL; -PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV = NULL; -PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV = NULL; -PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV = NULL; -PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV = NULL; -PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV = NULL; -PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV = NULL; - -PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV = NULL; -PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV = NULL; -PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV = NULL; -PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV = NULL; -PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV = NULL; -PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV = NULL; -PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV = NULL; - -PFNGLVDPAUFININVPROC __glewVDPAUFiniNV = NULL; -PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV = NULL; -PFNGLVDPAUINITNVPROC __glewVDPAUInitNV = NULL; -PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV = NULL; -PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV = NULL; -PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV = NULL; -PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV = NULL; -PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV = NULL; -PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV = NULL; -PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV = NULL; - -PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV = NULL; -PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV = NULL; - -PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV = NULL; -PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV = NULL; -PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV = NULL; -PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV = NULL; -PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV = NULL; -PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV = NULL; -PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV = NULL; -PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV = NULL; -PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV = NULL; -PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV = NULL; -PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV = NULL; -PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV = NULL; -PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV = NULL; -PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV = NULL; -PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV = NULL; -PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV = NULL; -PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV = NULL; -PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV = NULL; -PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV = NULL; - -PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV = NULL; -PFNGLCOLORFORMATNVPROC __glewColorFormatNV = NULL; -PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV = NULL; -PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV = NULL; -PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV = NULL; -PFNGLINDEXFORMATNVPROC __glewIndexFormatNV = NULL; -PFNGLNORMALFORMATNVPROC __glewNormalFormatNV = NULL; -PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV = NULL; -PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV = NULL; -PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV = NULL; -PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV = NULL; -PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV = NULL; - -PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV = NULL; -PFNGLBINDPROGRAMNVPROC __glewBindProgramNV = NULL; -PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV = NULL; -PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV = NULL; -PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV = NULL; -PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV = NULL; -PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV = NULL; -PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV = NULL; -PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV = NULL; -PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV = NULL; -PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV = NULL; -PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV = NULL; -PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV = NULL; -PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV = NULL; -PFNGLISPROGRAMNVPROC __glewIsProgramNV = NULL; -PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV = NULL; -PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV = NULL; -PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV = NULL; -PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV = NULL; -PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV = NULL; -PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV = NULL; -PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV = NULL; -PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV = NULL; -PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV = NULL; -PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV = NULL; -PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV = NULL; -PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV = NULL; -PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV = NULL; -PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV = NULL; -PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV = NULL; -PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV = NULL; -PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV = NULL; -PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV = NULL; -PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV = NULL; -PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV = NULL; -PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV = NULL; -PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV = NULL; -PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV = NULL; -PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV = NULL; -PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV = NULL; -PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV = NULL; -PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV = NULL; -PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV = NULL; -PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV = NULL; -PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV = NULL; -PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV = NULL; -PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV = NULL; -PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV = NULL; -PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV = NULL; -PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV = NULL; -PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV = NULL; -PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV = NULL; -PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV = NULL; -PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV = NULL; -PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV = NULL; -PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV = NULL; -PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV = NULL; -PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV = NULL; -PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV = NULL; -PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV = NULL; -PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV = NULL; -PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV = NULL; -PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV = NULL; -PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV = NULL; - -PFNGLBEGINVIDEOCAPTURENVPROC __glewBeginVideoCaptureNV = NULL; -PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC __glewBindVideoCaptureStreamBufferNV = NULL; -PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC __glewBindVideoCaptureStreamTextureNV = NULL; -PFNGLENDVIDEOCAPTURENVPROC __glewEndVideoCaptureNV = NULL; -PFNGLGETVIDEOCAPTURESTREAMDVNVPROC __glewGetVideoCaptureStreamdvNV = NULL; -PFNGLGETVIDEOCAPTURESTREAMFVNVPROC __glewGetVideoCaptureStreamfvNV = NULL; -PFNGLGETVIDEOCAPTURESTREAMIVNVPROC __glewGetVideoCaptureStreamivNV = NULL; -PFNGLGETVIDEOCAPTUREIVNVPROC __glewGetVideoCaptureivNV = NULL; -PFNGLVIDEOCAPTURENVPROC __glewVideoCaptureNV = NULL; -PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC __glewVideoCaptureStreamParameterdvNV = NULL; -PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC __glewVideoCaptureStreamParameterfvNV = NULL; -PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC __glewVideoCaptureStreamParameterivNV = NULL; - -PFNGLDEPTHRANGEARRAYFVNVPROC __glewDepthRangeArrayfvNV = NULL; -PFNGLDEPTHRANGEINDEXEDFNVPROC __glewDepthRangeIndexedfNV = NULL; -PFNGLDISABLEINVPROC __glewDisableiNV = NULL; -PFNGLENABLEINVPROC __glewEnableiNV = NULL; -PFNGLGETFLOATI_VNVPROC __glewGetFloati_vNV = NULL; -PFNGLISENABLEDINVPROC __glewIsEnablediNV = NULL; -PFNGLSCISSORARRAYVNVPROC __glewScissorArrayvNV = NULL; -PFNGLSCISSORINDEXEDNVPROC __glewScissorIndexedNV = NULL; -PFNGLSCISSORINDEXEDVNVPROC __glewScissorIndexedvNV = NULL; -PFNGLVIEWPORTARRAYVNVPROC __glewViewportArrayvNV = NULL; -PFNGLVIEWPORTINDEXEDFNVPROC __glewViewportIndexedfNV = NULL; -PFNGLVIEWPORTINDEXEDFVNVPROC __glewViewportIndexedfvNV = NULL; - -PFNGLVIEWPORTSWIZZLENVPROC __glewViewportSwizzleNV = NULL; - -PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __glewFramebufferTextureMultiviewOVR = NULL; - -PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC __glewFramebufferTextureMultisampleMultiviewOVR = NULL; - -PFNGLALPHAFUNCQCOMPROC __glewAlphaFuncQCOM = NULL; - -PFNGLDISABLEDRIVERCONTROLQCOMPROC __glewDisableDriverControlQCOM = NULL; -PFNGLENABLEDRIVERCONTROLQCOMPROC __glewEnableDriverControlQCOM = NULL; -PFNGLGETDRIVERCONTROLSTRINGQCOMPROC __glewGetDriverControlStringQCOM = NULL; -PFNGLGETDRIVERCONTROLSQCOMPROC __glewGetDriverControlsQCOM = NULL; - -PFNGLEXTGETBUFFERPOINTERVQCOMPROC __glewExtGetBufferPointervQCOM = NULL; -PFNGLEXTGETBUFFERSQCOMPROC __glewExtGetBuffersQCOM = NULL; -PFNGLEXTGETFRAMEBUFFERSQCOMPROC __glewExtGetFramebuffersQCOM = NULL; -PFNGLEXTGETRENDERBUFFERSQCOMPROC __glewExtGetRenderbuffersQCOM = NULL; -PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC __glewExtGetTexLevelParameterivQCOM = NULL; -PFNGLEXTGETTEXSUBIMAGEQCOMPROC __glewExtGetTexSubImageQCOM = NULL; -PFNGLEXTGETTEXTURESQCOMPROC __glewExtGetTexturesQCOM = NULL; -PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC __glewExtTexObjectStateOverrideiQCOM = NULL; - -PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC __glewExtGetProgramBinarySourceQCOM = NULL; -PFNGLEXTGETPROGRAMSQCOMPROC __glewExtGetProgramsQCOM = NULL; -PFNGLEXTGETSHADERSQCOMPROC __glewExtGetShadersQCOM = NULL; -PFNGLEXTISPROGRAMBINARYQCOMPROC __glewExtIsProgramBinaryQCOM = NULL; - -PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC __glewFramebufferFoveationConfigQCOM = NULL; -PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC __glewFramebufferFoveationParametersQCOM = NULL; - -PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC __glewFramebufferFetchBarrierQCOM = NULL; - -PFNGLENDTILINGQCOMPROC __glewEndTilingQCOM = NULL; -PFNGLSTARTTILINGQCOMPROC __glewStartTilingQCOM = NULL; - -PFNGLALPHAFUNCXPROC __glewAlphaFuncx = NULL; -PFNGLCLEARCOLORXPROC __glewClearColorx = NULL; -PFNGLCLEARDEPTHXPROC __glewClearDepthx = NULL; -PFNGLCOLOR4XPROC __glewColor4x = NULL; -PFNGLDEPTHRANGEXPROC __glewDepthRangex = NULL; -PFNGLFOGXPROC __glewFogx = NULL; -PFNGLFOGXVPROC __glewFogxv = NULL; -PFNGLFRUSTUMFPROC __glewFrustumf = NULL; -PFNGLFRUSTUMXPROC __glewFrustumx = NULL; -PFNGLLIGHTMODELXPROC __glewLightModelx = NULL; -PFNGLLIGHTMODELXVPROC __glewLightModelxv = NULL; -PFNGLLIGHTXPROC __glewLightx = NULL; -PFNGLLIGHTXVPROC __glewLightxv = NULL; -PFNGLLINEWIDTHXPROC __glewLineWidthx = NULL; -PFNGLLOADMATRIXXPROC __glewLoadMatrixx = NULL; -PFNGLMATERIALXPROC __glewMaterialx = NULL; -PFNGLMATERIALXVPROC __glewMaterialxv = NULL; -PFNGLMULTMATRIXXPROC __glewMultMatrixx = NULL; -PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x = NULL; -PFNGLNORMAL3XPROC __glewNormal3x = NULL; -PFNGLORTHOFPROC __glewOrthof = NULL; -PFNGLORTHOXPROC __glewOrthox = NULL; -PFNGLPOINTSIZEXPROC __glewPointSizex = NULL; -PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx = NULL; -PFNGLROTATEXPROC __glewRotatex = NULL; -PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex = NULL; -PFNGLSCALEXPROC __glewScalex = NULL; -PFNGLTEXENVXPROC __glewTexEnvx = NULL; -PFNGLTEXENVXVPROC __glewTexEnvxv = NULL; -PFNGLTEXPARAMETERXPROC __glewTexParameterx = NULL; -PFNGLTRANSLATEXPROC __glewTranslatex = NULL; - -PFNGLCLIPPLANEFPROC __glewClipPlanef = NULL; -PFNGLCLIPPLANEXPROC __glewClipPlanex = NULL; -PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef = NULL; -PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex = NULL; -PFNGLGETFIXEDVPROC __glewGetFixedv = NULL; -PFNGLGETLIGHTXVPROC __glewGetLightxv = NULL; -PFNGLGETMATERIALXVPROC __glewGetMaterialxv = NULL; -PFNGLGETTEXENVXVPROC __glewGetTexEnvxv = NULL; -PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv = NULL; -PFNGLPOINTPARAMETERXPROC __glewPointParameterx = NULL; -PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv = NULL; -PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES = NULL; -PFNGLTEXPARAMETERXVPROC __glewTexParameterxv = NULL; - -PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL = NULL; - -PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL = NULL; -PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL = NULL; - -PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL = NULL; - -PFNGLGETPROCADDRESSREGALPROC __glewGetProcAddressREGAL = NULL; - -PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS = NULL; -PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS = NULL; - -PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS = NULL; -PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS = NULL; - -PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS = NULL; -PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS = NULL; - -PFNGLINTERLEAVEDTEXTURECOORDSETSSGISPROC __glewInterleavedTextureCoordSetsSGIS = NULL; -PFNGLSELECTTEXTURECOORDSETSGISPROC __glewSelectTextureCoordSetSGIS = NULL; -PFNGLSELECTTEXTURESGISPROC __glewSelectTextureSGIS = NULL; -PFNGLSELECTTEXTURETRANSFORMSGISPROC __glewSelectTextureTransformSGIS = NULL; - -PFNGLMULTISAMPLESUBRECTPOSSGISPROC __glewMultisampleSubRectPosSGIS = NULL; - -PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS = NULL; -PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS = NULL; - -PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS = NULL; -PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS = NULL; - -PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS = NULL; -PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS = NULL; - -PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX = NULL; -PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX = NULL; -PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX = NULL; -PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX = NULL; -PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX = NULL; -PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX = NULL; - -PFNGLADDRESSSPACEPROC __glewAddressSpace = NULL; -PFNGLDATAPIPEPROC __glewDataPipe = NULL; - -PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX = NULL; - -PFNGLFOGLAYERSSGIXPROC __glewFogLayersSGIX = NULL; -PFNGLGETFOGLAYERSSGIXPROC __glewGetFogLayersSGIX = NULL; - -PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX = NULL; - -PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX = NULL; -PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX = NULL; -PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX = NULL; -PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX = NULL; -PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX = NULL; -PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX = NULL; -PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX = NULL; -PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX = NULL; -PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX = NULL; -PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX = NULL; -PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX = NULL; -PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX = NULL; -PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX = NULL; -PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX = NULL; -PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX = NULL; -PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX = NULL; -PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX = NULL; - -PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX = NULL; - -PFNGLIGLOOINTERFACESGIXPROC __glewIglooInterfaceSGIX = NULL; - -PFNGLALLOCMPEGPREDICTORSSGIXPROC __glewAllocMPEGPredictorsSGIX = NULL; -PFNGLDELETEMPEGPREDICTORSSGIXPROC __glewDeleteMPEGPredictorsSGIX = NULL; -PFNGLGENMPEGPREDICTORSSGIXPROC __glewGenMPEGPredictorsSGIX = NULL; -PFNGLGETMPEGPARAMETERFVSGIXPROC __glewGetMPEGParameterfvSGIX = NULL; -PFNGLGETMPEGPARAMETERIVSGIXPROC __glewGetMPEGParameterivSGIX = NULL; -PFNGLGETMPEGPREDICTORSGIXPROC __glewGetMPEGPredictorSGIX = NULL; -PFNGLGETMPEGQUANTTABLEUBVPROC __glewGetMPEGQuantTableubv = NULL; -PFNGLISMPEGPREDICTORSGIXPROC __glewIsMPEGPredictorSGIX = NULL; -PFNGLMPEGPREDICTORSGIXPROC __glewMPEGPredictorSGIX = NULL; -PFNGLMPEGQUANTTABLEUBVPROC __glewMPEGQuantTableubv = NULL; -PFNGLSWAPMPEGPREDICTORSSGIXPROC __glewSwapMPEGPredictorsSGIX = NULL; - -PFNGLGETNONLINLIGHTFVSGIXPROC __glewGetNonlinLightfvSGIX = NULL; -PFNGLGETNONLINMATERIALFVSGIXPROC __glewGetNonlinMaterialfvSGIX = NULL; -PFNGLNONLINLIGHTFVSGIXPROC __glewNonlinLightfvSGIX = NULL; -PFNGLNONLINMATERIALFVSGIXPROC __glewNonlinMaterialfvSGIX = NULL; - -PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX = NULL; - -PFNGLDEFORMSGIXPROC __glewDeformSGIX = NULL; -PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC __glewLoadIdentityDeformationMapSGIX = NULL; - -PFNGLMESHBREADTHSGIXPROC __glewMeshBreadthSGIX = NULL; -PFNGLMESHSTRIDESGIXPROC __glewMeshStrideSGIX = NULL; - -PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX = NULL; - -PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX = NULL; -PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX = NULL; -PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX = NULL; -PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX = NULL; - -PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX = NULL; - -PFNGLGETVECTOROPERATIONSGIXPROC __glewGetVectorOperationSGIX = NULL; -PFNGLVECTOROPERATIONSGIXPROC __glewVectorOperationSGIX = NULL; - -PFNGLAREVERTEXARRAYSRESIDENTSGIXPROC __glewAreVertexArraysResidentSGIX = NULL; -PFNGLBINDVERTEXARRAYSGIXPROC __glewBindVertexArraySGIX = NULL; -PFNGLDELETEVERTEXARRAYSSGIXPROC __glewDeleteVertexArraysSGIX = NULL; -PFNGLGENVERTEXARRAYSSGIXPROC __glewGenVertexArraysSGIX = NULL; -PFNGLISVERTEXARRAYSGIXPROC __glewIsVertexArraySGIX = NULL; -PFNGLPRIORITIZEVERTEXARRAYSSGIXPROC __glewPrioritizeVertexArraysSGIX = NULL; - -PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI = NULL; -PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI = NULL; -PFNGLCOLORTABLESGIPROC __glewColorTableSGI = NULL; -PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI = NULL; -PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI = NULL; -PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI = NULL; -PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI = NULL; - -PFNGLGETPIXELTRANSFORMPARAMETERFVSGIPROC __glewGetPixelTransformParameterfvSGI = NULL; -PFNGLGETPIXELTRANSFORMPARAMETERIVSGIPROC __glewGetPixelTransformParameterivSGI = NULL; -PFNGLPIXELTRANSFORMPARAMETERFSGIPROC __glewPixelTransformParameterfSGI = NULL; -PFNGLPIXELTRANSFORMPARAMETERFVSGIPROC __glewPixelTransformParameterfvSGI = NULL; -PFNGLPIXELTRANSFORMPARAMETERISGIPROC __glewPixelTransformParameteriSGI = NULL; -PFNGLPIXELTRANSFORMPARAMETERIVSGIPROC __glewPixelTransformParameterivSGI = NULL; -PFNGLPIXELTRANSFORMSGIPROC __glewPixelTransformSGI = NULL; - -PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX = NULL; - -PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN = NULL; -PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN = NULL; -PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN = NULL; -PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN = NULL; -PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN = NULL; -PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN = NULL; -PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN = NULL; -PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN = NULL; - -PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN = NULL; - -PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN = NULL; -PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN = NULL; -PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN = NULL; -PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN = NULL; -PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN = NULL; -PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN = NULL; -PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN = NULL; - -PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN = NULL; -PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN = NULL; -PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN = NULL; -PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN = NULL; -PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN = NULL; -PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN = NULL; -PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN = NULL; -PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN = NULL; -PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN = NULL; -PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN = NULL; -PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN = NULL; -PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN = NULL; -PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN = NULL; -PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; -PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN = NULL; -PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN = NULL; -PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN = NULL; -PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN = NULL; -PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN = NULL; -PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN = NULL; -PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN = NULL; -PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN = NULL; -PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN = NULL; -PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN = NULL; - -PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN = NULL; - -GLboolean __GLEW_VERSION_1_1 = GL_FALSE; -GLboolean __GLEW_VERSION_1_2 = GL_FALSE; -GLboolean __GLEW_VERSION_1_2_1 = GL_FALSE; -GLboolean __GLEW_VERSION_1_3 = GL_FALSE; -GLboolean __GLEW_VERSION_1_4 = GL_FALSE; -GLboolean __GLEW_VERSION_1_5 = GL_FALSE; -GLboolean __GLEW_VERSION_2_0 = GL_FALSE; -GLboolean __GLEW_VERSION_2_1 = GL_FALSE; -GLboolean __GLEW_VERSION_3_0 = GL_FALSE; -GLboolean __GLEW_VERSION_3_1 = GL_FALSE; -GLboolean __GLEW_VERSION_3_2 = GL_FALSE; -GLboolean __GLEW_VERSION_3_3 = GL_FALSE; -GLboolean __GLEW_VERSION_4_0 = GL_FALSE; -GLboolean __GLEW_VERSION_4_1 = GL_FALSE; -GLboolean __GLEW_VERSION_4_2 = GL_FALSE; -GLboolean __GLEW_VERSION_4_3 = GL_FALSE; -GLboolean __GLEW_VERSION_4_4 = GL_FALSE; -GLboolean __GLEW_VERSION_4_5 = GL_FALSE; -GLboolean __GLEW_VERSION_4_6 = GL_FALSE; -GLboolean __GLEW_3DFX_multisample = GL_FALSE; -GLboolean __GLEW_3DFX_tbuffer = GL_FALSE; -GLboolean __GLEW_3DFX_texture_compression_FXT1 = GL_FALSE; -GLboolean __GLEW_AMD_blend_minmax_factor = GL_FALSE; -GLboolean __GLEW_AMD_compressed_3DC_texture = GL_FALSE; -GLboolean __GLEW_AMD_compressed_ATC_texture = GL_FALSE; -GLboolean __GLEW_AMD_conservative_depth = GL_FALSE; -GLboolean __GLEW_AMD_debug_output = GL_FALSE; -GLboolean __GLEW_AMD_depth_clamp_separate = GL_FALSE; -GLboolean __GLEW_AMD_draw_buffers_blend = GL_FALSE; -GLboolean __GLEW_AMD_framebuffer_sample_positions = GL_FALSE; -GLboolean __GLEW_AMD_gcn_shader = GL_FALSE; -GLboolean __GLEW_AMD_gpu_shader_half_float = GL_FALSE; -GLboolean __GLEW_AMD_gpu_shader_int16 = GL_FALSE; -GLboolean __GLEW_AMD_gpu_shader_int64 = GL_FALSE; -GLboolean __GLEW_AMD_interleaved_elements = GL_FALSE; -GLboolean __GLEW_AMD_multi_draw_indirect = GL_FALSE; -GLboolean __GLEW_AMD_name_gen_delete = GL_FALSE; -GLboolean __GLEW_AMD_occlusion_query_event = GL_FALSE; -GLboolean __GLEW_AMD_performance_monitor = GL_FALSE; -GLboolean __GLEW_AMD_pinned_memory = GL_FALSE; -GLboolean __GLEW_AMD_program_binary_Z400 = GL_FALSE; -GLboolean __GLEW_AMD_query_buffer_object = GL_FALSE; -GLboolean __GLEW_AMD_sample_positions = GL_FALSE; -GLboolean __GLEW_AMD_seamless_cubemap_per_texture = GL_FALSE; -GLboolean __GLEW_AMD_shader_atomic_counter_ops = GL_FALSE; -GLboolean __GLEW_AMD_shader_ballot = GL_FALSE; -GLboolean __GLEW_AMD_shader_explicit_vertex_parameter = GL_FALSE; -GLboolean __GLEW_AMD_shader_stencil_export = GL_FALSE; -GLboolean __GLEW_AMD_shader_stencil_value_export = GL_FALSE; -GLboolean __GLEW_AMD_shader_trinary_minmax = GL_FALSE; -GLboolean __GLEW_AMD_sparse_texture = GL_FALSE; -GLboolean __GLEW_AMD_stencil_operation_extended = GL_FALSE; -GLboolean __GLEW_AMD_texture_gather_bias_lod = GL_FALSE; -GLboolean __GLEW_AMD_texture_texture4 = GL_FALSE; -GLboolean __GLEW_AMD_transform_feedback3_lines_triangles = GL_FALSE; -GLboolean __GLEW_AMD_transform_feedback4 = GL_FALSE; -GLboolean __GLEW_AMD_vertex_shader_layer = GL_FALSE; -GLboolean __GLEW_AMD_vertex_shader_tessellator = GL_FALSE; -GLboolean __GLEW_AMD_vertex_shader_viewport_index = GL_FALSE; -GLboolean __GLEW_ANDROID_extension_pack_es31a = GL_FALSE; -GLboolean __GLEW_ANGLE_depth_texture = GL_FALSE; -GLboolean __GLEW_ANGLE_framebuffer_blit = GL_FALSE; -GLboolean __GLEW_ANGLE_framebuffer_multisample = GL_FALSE; -GLboolean __GLEW_ANGLE_instanced_arrays = GL_FALSE; -GLboolean __GLEW_ANGLE_pack_reverse_row_order = GL_FALSE; -GLboolean __GLEW_ANGLE_program_binary = GL_FALSE; -GLboolean __GLEW_ANGLE_texture_compression_dxt1 = GL_FALSE; -GLboolean __GLEW_ANGLE_texture_compression_dxt3 = GL_FALSE; -GLboolean __GLEW_ANGLE_texture_compression_dxt5 = GL_FALSE; -GLboolean __GLEW_ANGLE_texture_usage = GL_FALSE; -GLboolean __GLEW_ANGLE_timer_query = GL_FALSE; -GLboolean __GLEW_ANGLE_translated_shader_source = GL_FALSE; -GLboolean __GLEW_APPLE_aux_depth_stencil = GL_FALSE; -GLboolean __GLEW_APPLE_client_storage = GL_FALSE; -GLboolean __GLEW_APPLE_clip_distance = GL_FALSE; -GLboolean __GLEW_APPLE_color_buffer_packed_float = GL_FALSE; -GLboolean __GLEW_APPLE_copy_texture_levels = GL_FALSE; -GLboolean __GLEW_APPLE_element_array = GL_FALSE; -GLboolean __GLEW_APPLE_fence = GL_FALSE; -GLboolean __GLEW_APPLE_float_pixels = GL_FALSE; -GLboolean __GLEW_APPLE_flush_buffer_range = GL_FALSE; -GLboolean __GLEW_APPLE_framebuffer_multisample = GL_FALSE; -GLboolean __GLEW_APPLE_object_purgeable = GL_FALSE; -GLboolean __GLEW_APPLE_pixel_buffer = GL_FALSE; -GLboolean __GLEW_APPLE_rgb_422 = GL_FALSE; -GLboolean __GLEW_APPLE_row_bytes = GL_FALSE; -GLboolean __GLEW_APPLE_specular_vector = GL_FALSE; -GLboolean __GLEW_APPLE_sync = GL_FALSE; -GLboolean __GLEW_APPLE_texture_2D_limited_npot = GL_FALSE; -GLboolean __GLEW_APPLE_texture_format_BGRA8888 = GL_FALSE; -GLboolean __GLEW_APPLE_texture_max_level = GL_FALSE; -GLboolean __GLEW_APPLE_texture_packed_float = GL_FALSE; -GLboolean __GLEW_APPLE_texture_range = GL_FALSE; -GLboolean __GLEW_APPLE_transform_hint = GL_FALSE; -GLboolean __GLEW_APPLE_vertex_array_object = GL_FALSE; -GLboolean __GLEW_APPLE_vertex_array_range = GL_FALSE; -GLboolean __GLEW_APPLE_vertex_program_evaluators = GL_FALSE; -GLboolean __GLEW_APPLE_ycbcr_422 = GL_FALSE; -GLboolean __GLEW_ARB_ES2_compatibility = GL_FALSE; -GLboolean __GLEW_ARB_ES3_1_compatibility = GL_FALSE; -GLboolean __GLEW_ARB_ES3_2_compatibility = GL_FALSE; -GLboolean __GLEW_ARB_ES3_compatibility = GL_FALSE; -GLboolean __GLEW_ARB_arrays_of_arrays = GL_FALSE; -GLboolean __GLEW_ARB_base_instance = GL_FALSE; -GLboolean __GLEW_ARB_bindless_texture = GL_FALSE; -GLboolean __GLEW_ARB_blend_func_extended = GL_FALSE; -GLboolean __GLEW_ARB_buffer_storage = GL_FALSE; -GLboolean __GLEW_ARB_cl_event = GL_FALSE; -GLboolean __GLEW_ARB_clear_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_clear_texture = GL_FALSE; -GLboolean __GLEW_ARB_clip_control = GL_FALSE; -GLboolean __GLEW_ARB_color_buffer_float = GL_FALSE; -GLboolean __GLEW_ARB_compatibility = GL_FALSE; -GLboolean __GLEW_ARB_compressed_texture_pixel_storage = GL_FALSE; -GLboolean __GLEW_ARB_compute_shader = GL_FALSE; -GLboolean __GLEW_ARB_compute_variable_group_size = GL_FALSE; -GLboolean __GLEW_ARB_conditional_render_inverted = GL_FALSE; -GLboolean __GLEW_ARB_conservative_depth = GL_FALSE; -GLboolean __GLEW_ARB_copy_buffer = GL_FALSE; -GLboolean __GLEW_ARB_copy_image = GL_FALSE; -GLboolean __GLEW_ARB_cull_distance = GL_FALSE; -GLboolean __GLEW_ARB_debug_output = GL_FALSE; -GLboolean __GLEW_ARB_depth_buffer_float = GL_FALSE; -GLboolean __GLEW_ARB_depth_clamp = GL_FALSE; -GLboolean __GLEW_ARB_depth_texture = GL_FALSE; -GLboolean __GLEW_ARB_derivative_control = GL_FALSE; -GLboolean __GLEW_ARB_direct_state_access = GL_FALSE; -GLboolean __GLEW_ARB_draw_buffers = GL_FALSE; -GLboolean __GLEW_ARB_draw_buffers_blend = GL_FALSE; -GLboolean __GLEW_ARB_draw_elements_base_vertex = GL_FALSE; -GLboolean __GLEW_ARB_draw_indirect = GL_FALSE; -GLboolean __GLEW_ARB_draw_instanced = GL_FALSE; -GLboolean __GLEW_ARB_enhanced_layouts = GL_FALSE; -GLboolean __GLEW_ARB_explicit_attrib_location = GL_FALSE; -GLboolean __GLEW_ARB_explicit_uniform_location = GL_FALSE; -GLboolean __GLEW_ARB_fragment_coord_conventions = GL_FALSE; -GLboolean __GLEW_ARB_fragment_layer_viewport = GL_FALSE; -GLboolean __GLEW_ARB_fragment_program = GL_FALSE; -GLboolean __GLEW_ARB_fragment_program_shadow = GL_FALSE; -GLboolean __GLEW_ARB_fragment_shader = GL_FALSE; -GLboolean __GLEW_ARB_fragment_shader_interlock = GL_FALSE; -GLboolean __GLEW_ARB_framebuffer_no_attachments = GL_FALSE; -GLboolean __GLEW_ARB_framebuffer_object = GL_FALSE; -GLboolean __GLEW_ARB_framebuffer_sRGB = GL_FALSE; -GLboolean __GLEW_ARB_geometry_shader4 = GL_FALSE; -GLboolean __GLEW_ARB_get_program_binary = GL_FALSE; -GLboolean __GLEW_ARB_get_texture_sub_image = GL_FALSE; -GLboolean __GLEW_ARB_gl_spirv = GL_FALSE; -GLboolean __GLEW_ARB_gpu_shader5 = GL_FALSE; -GLboolean __GLEW_ARB_gpu_shader_fp64 = GL_FALSE; -GLboolean __GLEW_ARB_gpu_shader_int64 = GL_FALSE; -GLboolean __GLEW_ARB_half_float_pixel = GL_FALSE; -GLboolean __GLEW_ARB_half_float_vertex = GL_FALSE; -GLboolean __GLEW_ARB_imaging = GL_FALSE; -GLboolean __GLEW_ARB_indirect_parameters = GL_FALSE; -GLboolean __GLEW_ARB_instanced_arrays = GL_FALSE; -GLboolean __GLEW_ARB_internalformat_query = GL_FALSE; -GLboolean __GLEW_ARB_internalformat_query2 = GL_FALSE; -GLboolean __GLEW_ARB_invalidate_subdata = GL_FALSE; -GLboolean __GLEW_ARB_map_buffer_alignment = GL_FALSE; -GLboolean __GLEW_ARB_map_buffer_range = GL_FALSE; -GLboolean __GLEW_ARB_matrix_palette = GL_FALSE; -GLboolean __GLEW_ARB_multi_bind = GL_FALSE; -GLboolean __GLEW_ARB_multi_draw_indirect = GL_FALSE; -GLboolean __GLEW_ARB_multisample = GL_FALSE; -GLboolean __GLEW_ARB_multitexture = GL_FALSE; -GLboolean __GLEW_ARB_occlusion_query = GL_FALSE; -GLboolean __GLEW_ARB_occlusion_query2 = GL_FALSE; -GLboolean __GLEW_ARB_parallel_shader_compile = GL_FALSE; -GLboolean __GLEW_ARB_pipeline_statistics_query = GL_FALSE; -GLboolean __GLEW_ARB_pixel_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_point_parameters = GL_FALSE; -GLboolean __GLEW_ARB_point_sprite = GL_FALSE; -GLboolean __GLEW_ARB_polygon_offset_clamp = GL_FALSE; -GLboolean __GLEW_ARB_post_depth_coverage = GL_FALSE; -GLboolean __GLEW_ARB_program_interface_query = GL_FALSE; -GLboolean __GLEW_ARB_provoking_vertex = GL_FALSE; -GLboolean __GLEW_ARB_query_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_robust_buffer_access_behavior = GL_FALSE; -GLboolean __GLEW_ARB_robustness = GL_FALSE; -GLboolean __GLEW_ARB_robustness_application_isolation = GL_FALSE; -GLboolean __GLEW_ARB_robustness_share_group_isolation = GL_FALSE; -GLboolean __GLEW_ARB_sample_locations = GL_FALSE; -GLboolean __GLEW_ARB_sample_shading = GL_FALSE; -GLboolean __GLEW_ARB_sampler_objects = GL_FALSE; -GLboolean __GLEW_ARB_seamless_cube_map = GL_FALSE; -GLboolean __GLEW_ARB_seamless_cubemap_per_texture = GL_FALSE; -GLboolean __GLEW_ARB_separate_shader_objects = GL_FALSE; -GLboolean __GLEW_ARB_shader_atomic_counter_ops = GL_FALSE; -GLboolean __GLEW_ARB_shader_atomic_counters = GL_FALSE; -GLboolean __GLEW_ARB_shader_ballot = GL_FALSE; -GLboolean __GLEW_ARB_shader_bit_encoding = GL_FALSE; -GLboolean __GLEW_ARB_shader_clock = GL_FALSE; -GLboolean __GLEW_ARB_shader_draw_parameters = GL_FALSE; -GLboolean __GLEW_ARB_shader_group_vote = GL_FALSE; -GLboolean __GLEW_ARB_shader_image_load_store = GL_FALSE; -GLboolean __GLEW_ARB_shader_image_size = GL_FALSE; -GLboolean __GLEW_ARB_shader_objects = GL_FALSE; -GLboolean __GLEW_ARB_shader_precision = GL_FALSE; -GLboolean __GLEW_ARB_shader_stencil_export = GL_FALSE; -GLboolean __GLEW_ARB_shader_storage_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_shader_subroutine = GL_FALSE; -GLboolean __GLEW_ARB_shader_texture_image_samples = GL_FALSE; -GLboolean __GLEW_ARB_shader_texture_lod = GL_FALSE; -GLboolean __GLEW_ARB_shader_viewport_layer_array = GL_FALSE; -GLboolean __GLEW_ARB_shading_language_100 = GL_FALSE; -GLboolean __GLEW_ARB_shading_language_420pack = GL_FALSE; -GLboolean __GLEW_ARB_shading_language_include = GL_FALSE; -GLboolean __GLEW_ARB_shading_language_packing = GL_FALSE; -GLboolean __GLEW_ARB_shadow = GL_FALSE; -GLboolean __GLEW_ARB_shadow_ambient = GL_FALSE; -GLboolean __GLEW_ARB_sparse_buffer = GL_FALSE; -GLboolean __GLEW_ARB_sparse_texture = GL_FALSE; -GLboolean __GLEW_ARB_sparse_texture2 = GL_FALSE; -GLboolean __GLEW_ARB_sparse_texture_clamp = GL_FALSE; -GLboolean __GLEW_ARB_spirv_extensions = GL_FALSE; -GLboolean __GLEW_ARB_stencil_texturing = GL_FALSE; -GLboolean __GLEW_ARB_sync = GL_FALSE; -GLboolean __GLEW_ARB_tessellation_shader = GL_FALSE; -GLboolean __GLEW_ARB_texture_barrier = GL_FALSE; -GLboolean __GLEW_ARB_texture_border_clamp = GL_FALSE; -GLboolean __GLEW_ARB_texture_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_texture_buffer_object_rgb32 = GL_FALSE; -GLboolean __GLEW_ARB_texture_buffer_range = GL_FALSE; -GLboolean __GLEW_ARB_texture_compression = GL_FALSE; -GLboolean __GLEW_ARB_texture_compression_bptc = GL_FALSE; -GLboolean __GLEW_ARB_texture_compression_rgtc = GL_FALSE; -GLboolean __GLEW_ARB_texture_cube_map = GL_FALSE; -GLboolean __GLEW_ARB_texture_cube_map_array = GL_FALSE; -GLboolean __GLEW_ARB_texture_env_add = GL_FALSE; -GLboolean __GLEW_ARB_texture_env_combine = GL_FALSE; -GLboolean __GLEW_ARB_texture_env_crossbar = GL_FALSE; -GLboolean __GLEW_ARB_texture_env_dot3 = GL_FALSE; -GLboolean __GLEW_ARB_texture_filter_anisotropic = GL_FALSE; -GLboolean __GLEW_ARB_texture_filter_minmax = GL_FALSE; -GLboolean __GLEW_ARB_texture_float = GL_FALSE; -GLboolean __GLEW_ARB_texture_gather = GL_FALSE; -GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge = GL_FALSE; -GLboolean __GLEW_ARB_texture_mirrored_repeat = GL_FALSE; -GLboolean __GLEW_ARB_texture_multisample = GL_FALSE; -GLboolean __GLEW_ARB_texture_non_power_of_two = GL_FALSE; -GLboolean __GLEW_ARB_texture_query_levels = GL_FALSE; -GLboolean __GLEW_ARB_texture_query_lod = GL_FALSE; -GLboolean __GLEW_ARB_texture_rectangle = GL_FALSE; -GLboolean __GLEW_ARB_texture_rg = GL_FALSE; -GLboolean __GLEW_ARB_texture_rgb10_a2ui = GL_FALSE; -GLboolean __GLEW_ARB_texture_stencil8 = GL_FALSE; -GLboolean __GLEW_ARB_texture_storage = GL_FALSE; -GLboolean __GLEW_ARB_texture_storage_multisample = GL_FALSE; -GLboolean __GLEW_ARB_texture_swizzle = GL_FALSE; -GLboolean __GLEW_ARB_texture_view = GL_FALSE; -GLboolean __GLEW_ARB_timer_query = GL_FALSE; -GLboolean __GLEW_ARB_transform_feedback2 = GL_FALSE; -GLboolean __GLEW_ARB_transform_feedback3 = GL_FALSE; -GLboolean __GLEW_ARB_transform_feedback_instanced = GL_FALSE; -GLboolean __GLEW_ARB_transform_feedback_overflow_query = GL_FALSE; -GLboolean __GLEW_ARB_transpose_matrix = GL_FALSE; -GLboolean __GLEW_ARB_uniform_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_vertex_array_bgra = GL_FALSE; -GLboolean __GLEW_ARB_vertex_array_object = GL_FALSE; -GLboolean __GLEW_ARB_vertex_attrib_64bit = GL_FALSE; -GLboolean __GLEW_ARB_vertex_attrib_binding = GL_FALSE; -GLboolean __GLEW_ARB_vertex_blend = GL_FALSE; -GLboolean __GLEW_ARB_vertex_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_vertex_program = GL_FALSE; -GLboolean __GLEW_ARB_vertex_shader = GL_FALSE; -GLboolean __GLEW_ARB_vertex_type_10f_11f_11f_rev = GL_FALSE; -GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev = GL_FALSE; -GLboolean __GLEW_ARB_viewport_array = GL_FALSE; -GLboolean __GLEW_ARB_window_pos = GL_FALSE; -GLboolean __GLEW_ARM_mali_program_binary = GL_FALSE; -GLboolean __GLEW_ARM_mali_shader_binary = GL_FALSE; -GLboolean __GLEW_ARM_rgba8 = GL_FALSE; -GLboolean __GLEW_ARM_shader_framebuffer_fetch = GL_FALSE; -GLboolean __GLEW_ARM_shader_framebuffer_fetch_depth_stencil = GL_FALSE; -GLboolean __GLEW_ATIX_point_sprites = GL_FALSE; -GLboolean __GLEW_ATIX_texture_env_combine3 = GL_FALSE; -GLboolean __GLEW_ATIX_texture_env_route = GL_FALSE; -GLboolean __GLEW_ATIX_vertex_shader_output_point_size = GL_FALSE; -GLboolean __GLEW_ATI_draw_buffers = GL_FALSE; -GLboolean __GLEW_ATI_element_array = GL_FALSE; -GLboolean __GLEW_ATI_envmap_bumpmap = GL_FALSE; -GLboolean __GLEW_ATI_fragment_shader = GL_FALSE; -GLboolean __GLEW_ATI_map_object_buffer = GL_FALSE; -GLboolean __GLEW_ATI_meminfo = GL_FALSE; -GLboolean __GLEW_ATI_pn_triangles = GL_FALSE; -GLboolean __GLEW_ATI_separate_stencil = GL_FALSE; -GLboolean __GLEW_ATI_shader_texture_lod = GL_FALSE; -GLboolean __GLEW_ATI_text_fragment_shader = GL_FALSE; -GLboolean __GLEW_ATI_texture_compression_3dc = GL_FALSE; -GLboolean __GLEW_ATI_texture_env_combine3 = GL_FALSE; -GLboolean __GLEW_ATI_texture_float = GL_FALSE; -GLboolean __GLEW_ATI_texture_mirror_once = GL_FALSE; -GLboolean __GLEW_ATI_vertex_array_object = GL_FALSE; -GLboolean __GLEW_ATI_vertex_attrib_array_object = GL_FALSE; -GLboolean __GLEW_ATI_vertex_streams = GL_FALSE; -GLboolean __GLEW_EGL_KHR_context_flush_control = GL_FALSE; -GLboolean __GLEW_EGL_NV_robustness_video_memory_purge = GL_FALSE; -GLboolean __GLEW_EXT_422_pixels = GL_FALSE; -GLboolean __GLEW_EXT_Cg_shader = GL_FALSE; -GLboolean __GLEW_EXT_EGL_image_array = GL_FALSE; -GLboolean __GLEW_EXT_YUV_target = GL_FALSE; -GLboolean __GLEW_EXT_abgr = GL_FALSE; -GLboolean __GLEW_EXT_base_instance = GL_FALSE; -GLboolean __GLEW_EXT_bgra = GL_FALSE; -GLboolean __GLEW_EXT_bindable_uniform = GL_FALSE; -GLboolean __GLEW_EXT_blend_color = GL_FALSE; -GLboolean __GLEW_EXT_blend_equation_separate = GL_FALSE; -GLboolean __GLEW_EXT_blend_func_extended = GL_FALSE; -GLboolean __GLEW_EXT_blend_func_separate = GL_FALSE; -GLboolean __GLEW_EXT_blend_logic_op = GL_FALSE; -GLboolean __GLEW_EXT_blend_minmax = GL_FALSE; -GLboolean __GLEW_EXT_blend_subtract = GL_FALSE; -GLboolean __GLEW_EXT_buffer_storage = GL_FALSE; -GLboolean __GLEW_EXT_clear_texture = GL_FALSE; -GLboolean __GLEW_EXT_clip_cull_distance = GL_FALSE; -GLboolean __GLEW_EXT_clip_volume_hint = GL_FALSE; -GLboolean __GLEW_EXT_cmyka = GL_FALSE; -GLboolean __GLEW_EXT_color_buffer_float = GL_FALSE; -GLboolean __GLEW_EXT_color_buffer_half_float = GL_FALSE; -GLboolean __GLEW_EXT_color_subtable = GL_FALSE; -GLboolean __GLEW_EXT_compiled_vertex_array = GL_FALSE; -GLboolean __GLEW_EXT_compressed_ETC1_RGB8_sub_texture = GL_FALSE; -GLboolean __GLEW_EXT_conservative_depth = GL_FALSE; -GLboolean __GLEW_EXT_convolution = GL_FALSE; -GLboolean __GLEW_EXT_coordinate_frame = GL_FALSE; -GLboolean __GLEW_EXT_copy_image = GL_FALSE; -GLboolean __GLEW_EXT_copy_texture = GL_FALSE; -GLboolean __GLEW_EXT_cull_vertex = GL_FALSE; -GLboolean __GLEW_EXT_debug_label = GL_FALSE; -GLboolean __GLEW_EXT_debug_marker = GL_FALSE; -GLboolean __GLEW_EXT_depth_bounds_test = GL_FALSE; -GLboolean __GLEW_EXT_direct_state_access = GL_FALSE; -GLboolean __GLEW_EXT_discard_framebuffer = GL_FALSE; -GLboolean __GLEW_EXT_draw_buffers = GL_FALSE; -GLboolean __GLEW_EXT_draw_buffers2 = GL_FALSE; -GLboolean __GLEW_EXT_draw_buffers_indexed = GL_FALSE; -GLboolean __GLEW_EXT_draw_elements_base_vertex = GL_FALSE; -GLboolean __GLEW_EXT_draw_instanced = GL_FALSE; -GLboolean __GLEW_EXT_draw_range_elements = GL_FALSE; -GLboolean __GLEW_EXT_external_buffer = GL_FALSE; -GLboolean __GLEW_EXT_float_blend = GL_FALSE; -GLboolean __GLEW_EXT_fog_coord = GL_FALSE; -GLboolean __GLEW_EXT_frag_depth = GL_FALSE; -GLboolean __GLEW_EXT_fragment_lighting = GL_FALSE; -GLboolean __GLEW_EXT_framebuffer_blit = GL_FALSE; -GLboolean __GLEW_EXT_framebuffer_multisample = GL_FALSE; -GLboolean __GLEW_EXT_framebuffer_multisample_blit_scaled = GL_FALSE; -GLboolean __GLEW_EXT_framebuffer_object = GL_FALSE; -GLboolean __GLEW_EXT_framebuffer_sRGB = GL_FALSE; -GLboolean __GLEW_EXT_geometry_point_size = GL_FALSE; -GLboolean __GLEW_EXT_geometry_shader = GL_FALSE; -GLboolean __GLEW_EXT_geometry_shader4 = GL_FALSE; -GLboolean __GLEW_EXT_gpu_program_parameters = GL_FALSE; -GLboolean __GLEW_EXT_gpu_shader4 = GL_FALSE; -GLboolean __GLEW_EXT_gpu_shader5 = GL_FALSE; -GLboolean __GLEW_EXT_histogram = GL_FALSE; -GLboolean __GLEW_EXT_index_array_formats = GL_FALSE; -GLboolean __GLEW_EXT_index_func = GL_FALSE; -GLboolean __GLEW_EXT_index_material = GL_FALSE; -GLboolean __GLEW_EXT_index_texture = GL_FALSE; -GLboolean __GLEW_EXT_instanced_arrays = GL_FALSE; -GLboolean __GLEW_EXT_light_texture = GL_FALSE; -GLboolean __GLEW_EXT_map_buffer_range = GL_FALSE; -GLboolean __GLEW_EXT_memory_object = GL_FALSE; -GLboolean __GLEW_EXT_memory_object_fd = GL_FALSE; -GLboolean __GLEW_EXT_memory_object_win32 = GL_FALSE; -GLboolean __GLEW_EXT_misc_attribute = GL_FALSE; -GLboolean __GLEW_EXT_multi_draw_arrays = GL_FALSE; -GLboolean __GLEW_EXT_multi_draw_indirect = GL_FALSE; -GLboolean __GLEW_EXT_multiple_textures = GL_FALSE; -GLboolean __GLEW_EXT_multisample = GL_FALSE; -GLboolean __GLEW_EXT_multisample_compatibility = GL_FALSE; -GLboolean __GLEW_EXT_multisampled_render_to_texture = GL_FALSE; -GLboolean __GLEW_EXT_multisampled_render_to_texture2 = GL_FALSE; -GLboolean __GLEW_EXT_multiview_draw_buffers = GL_FALSE; -GLboolean __GLEW_EXT_packed_depth_stencil = GL_FALSE; -GLboolean __GLEW_EXT_packed_float = GL_FALSE; -GLboolean __GLEW_EXT_packed_pixels = GL_FALSE; -GLboolean __GLEW_EXT_paletted_texture = GL_FALSE; -GLboolean __GLEW_EXT_pixel_buffer_object = GL_FALSE; -GLboolean __GLEW_EXT_pixel_transform = GL_FALSE; -GLboolean __GLEW_EXT_pixel_transform_color_table = GL_FALSE; -GLboolean __GLEW_EXT_point_parameters = GL_FALSE; -GLboolean __GLEW_EXT_polygon_offset = GL_FALSE; -GLboolean __GLEW_EXT_polygon_offset_clamp = GL_FALSE; -GLboolean __GLEW_EXT_post_depth_coverage = GL_FALSE; -GLboolean __GLEW_EXT_provoking_vertex = GL_FALSE; -GLboolean __GLEW_EXT_pvrtc_sRGB = GL_FALSE; -GLboolean __GLEW_EXT_raster_multisample = GL_FALSE; -GLboolean __GLEW_EXT_read_format_bgra = GL_FALSE; -GLboolean __GLEW_EXT_render_snorm = GL_FALSE; -GLboolean __GLEW_EXT_rescale_normal = GL_FALSE; -GLboolean __GLEW_EXT_sRGB = GL_FALSE; -GLboolean __GLEW_EXT_sRGB_write_control = GL_FALSE; -GLboolean __GLEW_EXT_scene_marker = GL_FALSE; -GLboolean __GLEW_EXT_secondary_color = GL_FALSE; -GLboolean __GLEW_EXT_semaphore = GL_FALSE; -GLboolean __GLEW_EXT_semaphore_fd = GL_FALSE; -GLboolean __GLEW_EXT_semaphore_win32 = GL_FALSE; -GLboolean __GLEW_EXT_separate_shader_objects = GL_FALSE; -GLboolean __GLEW_EXT_separate_specular_color = GL_FALSE; -GLboolean __GLEW_EXT_shader_framebuffer_fetch = GL_FALSE; -GLboolean __GLEW_EXT_shader_group_vote = GL_FALSE; -GLboolean __GLEW_EXT_shader_image_load_formatted = GL_FALSE; -GLboolean __GLEW_EXT_shader_image_load_store = GL_FALSE; -GLboolean __GLEW_EXT_shader_implicit_conversions = GL_FALSE; -GLboolean __GLEW_EXT_shader_integer_mix = GL_FALSE; -GLboolean __GLEW_EXT_shader_io_blocks = GL_FALSE; -GLboolean __GLEW_EXT_shader_non_constant_global_initializers = GL_FALSE; -GLboolean __GLEW_EXT_shader_pixel_local_storage = GL_FALSE; -GLboolean __GLEW_EXT_shader_pixel_local_storage2 = GL_FALSE; -GLboolean __GLEW_EXT_shader_texture_lod = GL_FALSE; -GLboolean __GLEW_EXT_shadow_funcs = GL_FALSE; -GLboolean __GLEW_EXT_shadow_samplers = GL_FALSE; -GLboolean __GLEW_EXT_shared_texture_palette = GL_FALSE; -GLboolean __GLEW_EXT_sparse_texture = GL_FALSE; -GLboolean __GLEW_EXT_sparse_texture2 = GL_FALSE; -GLboolean __GLEW_EXT_stencil_clear_tag = GL_FALSE; -GLboolean __GLEW_EXT_stencil_two_side = GL_FALSE; -GLboolean __GLEW_EXT_stencil_wrap = GL_FALSE; -GLboolean __GLEW_EXT_subtexture = GL_FALSE; -GLboolean __GLEW_EXT_texture = GL_FALSE; -GLboolean __GLEW_EXT_texture3D = GL_FALSE; -GLboolean __GLEW_EXT_texture_array = GL_FALSE; -GLboolean __GLEW_EXT_texture_buffer_object = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_astc_decode_mode = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5 = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_bptc = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_dxt1 = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_latc = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_rgtc = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_s3tc = GL_FALSE; -GLboolean __GLEW_EXT_texture_cube_map = GL_FALSE; -GLboolean __GLEW_EXT_texture_cube_map_array = GL_FALSE; -GLboolean __GLEW_EXT_texture_edge_clamp = GL_FALSE; -GLboolean __GLEW_EXT_texture_env = GL_FALSE; -GLboolean __GLEW_EXT_texture_env_add = GL_FALSE; -GLboolean __GLEW_EXT_texture_env_combine = GL_FALSE; -GLboolean __GLEW_EXT_texture_env_dot3 = GL_FALSE; -GLboolean __GLEW_EXT_texture_filter_anisotropic = GL_FALSE; -GLboolean __GLEW_EXT_texture_filter_minmax = GL_FALSE; -GLboolean __GLEW_EXT_texture_format_BGRA8888 = GL_FALSE; -GLboolean __GLEW_EXT_texture_integer = GL_FALSE; -GLboolean __GLEW_EXT_texture_lod_bias = GL_FALSE; -GLboolean __GLEW_EXT_texture_mirror_clamp = GL_FALSE; -GLboolean __GLEW_EXT_texture_norm16 = GL_FALSE; -GLboolean __GLEW_EXT_texture_object = GL_FALSE; -GLboolean __GLEW_EXT_texture_perturb_normal = GL_FALSE; -GLboolean __GLEW_EXT_texture_rectangle = GL_FALSE; -GLboolean __GLEW_EXT_texture_rg = GL_FALSE; -GLboolean __GLEW_EXT_texture_sRGB = GL_FALSE; -GLboolean __GLEW_EXT_texture_sRGB_R8 = GL_FALSE; -GLboolean __GLEW_EXT_texture_sRGB_RG8 = GL_FALSE; -GLboolean __GLEW_EXT_texture_sRGB_decode = GL_FALSE; -GLboolean __GLEW_EXT_texture_shared_exponent = GL_FALSE; -GLboolean __GLEW_EXT_texture_snorm = GL_FALSE; -GLboolean __GLEW_EXT_texture_storage = GL_FALSE; -GLboolean __GLEW_EXT_texture_swizzle = GL_FALSE; -GLboolean __GLEW_EXT_texture_type_2_10_10_10_REV = GL_FALSE; -GLboolean __GLEW_EXT_texture_view = GL_FALSE; -GLboolean __GLEW_EXT_timer_query = GL_FALSE; -GLboolean __GLEW_EXT_transform_feedback = GL_FALSE; -GLboolean __GLEW_EXT_unpack_subimage = GL_FALSE; -GLboolean __GLEW_EXT_vertex_array = GL_FALSE; -GLboolean __GLEW_EXT_vertex_array_bgra = GL_FALSE; -GLboolean __GLEW_EXT_vertex_array_setXXX = GL_FALSE; -GLboolean __GLEW_EXT_vertex_attrib_64bit = GL_FALSE; -GLboolean __GLEW_EXT_vertex_shader = GL_FALSE; -GLboolean __GLEW_EXT_vertex_weighting = GL_FALSE; -GLboolean __GLEW_EXT_win32_keyed_mutex = GL_FALSE; -GLboolean __GLEW_EXT_window_rectangles = GL_FALSE; -GLboolean __GLEW_EXT_x11_sync_object = GL_FALSE; -GLboolean __GLEW_GREMEDY_frame_terminator = GL_FALSE; -GLboolean __GLEW_GREMEDY_string_marker = GL_FALSE; -GLboolean __GLEW_HP_convolution_border_modes = GL_FALSE; -GLboolean __GLEW_HP_image_transform = GL_FALSE; -GLboolean __GLEW_HP_occlusion_test = GL_FALSE; -GLboolean __GLEW_HP_texture_lighting = GL_FALSE; -GLboolean __GLEW_IBM_cull_vertex = GL_FALSE; -GLboolean __GLEW_IBM_multimode_draw_arrays = GL_FALSE; -GLboolean __GLEW_IBM_rasterpos_clip = GL_FALSE; -GLboolean __GLEW_IBM_static_data = GL_FALSE; -GLboolean __GLEW_IBM_texture_mirrored_repeat = GL_FALSE; -GLboolean __GLEW_IBM_vertex_array_lists = GL_FALSE; -GLboolean __GLEW_INGR_color_clamp = GL_FALSE; -GLboolean __GLEW_INGR_interlace_read = GL_FALSE; -GLboolean __GLEW_INTEL_conservative_rasterization = GL_FALSE; -GLboolean __GLEW_INTEL_fragment_shader_ordering = GL_FALSE; -GLboolean __GLEW_INTEL_framebuffer_CMAA = GL_FALSE; -GLboolean __GLEW_INTEL_map_texture = GL_FALSE; -GLboolean __GLEW_INTEL_parallel_arrays = GL_FALSE; -GLboolean __GLEW_INTEL_performance_query = GL_FALSE; -GLboolean __GLEW_INTEL_texture_scissor = GL_FALSE; -GLboolean __GLEW_KHR_blend_equation_advanced = GL_FALSE; -GLboolean __GLEW_KHR_blend_equation_advanced_coherent = GL_FALSE; -GLboolean __GLEW_KHR_context_flush_control = GL_FALSE; -GLboolean __GLEW_KHR_debug = GL_FALSE; -GLboolean __GLEW_KHR_no_error = GL_FALSE; -GLboolean __GLEW_KHR_parallel_shader_compile = GL_FALSE; -GLboolean __GLEW_KHR_robust_buffer_access_behavior = GL_FALSE; -GLboolean __GLEW_KHR_robustness = GL_FALSE; -GLboolean __GLEW_KHR_texture_compression_astc_hdr = GL_FALSE; -GLboolean __GLEW_KHR_texture_compression_astc_ldr = GL_FALSE; -GLboolean __GLEW_KHR_texture_compression_astc_sliced_3d = GL_FALSE; -GLboolean __GLEW_KTX_buffer_region = GL_FALSE; -GLboolean __GLEW_MESAX_texture_stack = GL_FALSE; -GLboolean __GLEW_MESA_pack_invert = GL_FALSE; -GLboolean __GLEW_MESA_resize_buffers = GL_FALSE; -GLboolean __GLEW_MESA_shader_integer_functions = GL_FALSE; -GLboolean __GLEW_MESA_window_pos = GL_FALSE; -GLboolean __GLEW_MESA_ycbcr_texture = GL_FALSE; -GLboolean __GLEW_NVX_blend_equation_advanced_multi_draw_buffers = GL_FALSE; -GLboolean __GLEW_NVX_conditional_render = GL_FALSE; -GLboolean __GLEW_NVX_gpu_memory_info = GL_FALSE; -GLboolean __GLEW_NVX_linked_gpu_multicast = GL_FALSE; -GLboolean __GLEW_NV_3dvision_settings = GL_FALSE; -GLboolean __GLEW_NV_EGL_stream_consumer_external = GL_FALSE; -GLboolean __GLEW_NV_alpha_to_coverage_dither_control = GL_FALSE; -GLboolean __GLEW_NV_bgr = GL_FALSE; -GLboolean __GLEW_NV_bindless_multi_draw_indirect = GL_FALSE; -GLboolean __GLEW_NV_bindless_multi_draw_indirect_count = GL_FALSE; -GLboolean __GLEW_NV_bindless_texture = GL_FALSE; -GLboolean __GLEW_NV_blend_equation_advanced = GL_FALSE; -GLboolean __GLEW_NV_blend_equation_advanced_coherent = GL_FALSE; -GLboolean __GLEW_NV_blend_minmax_factor = GL_FALSE; -GLboolean __GLEW_NV_blend_square = GL_FALSE; -GLboolean __GLEW_NV_clip_space_w_scaling = GL_FALSE; -GLboolean __GLEW_NV_command_list = GL_FALSE; -GLboolean __GLEW_NV_compute_program5 = GL_FALSE; -GLboolean __GLEW_NV_conditional_render = GL_FALSE; -GLboolean __GLEW_NV_conservative_raster = GL_FALSE; -GLboolean __GLEW_NV_conservative_raster_dilate = GL_FALSE; -GLboolean __GLEW_NV_conservative_raster_pre_snap_triangles = GL_FALSE; -GLboolean __GLEW_NV_copy_buffer = GL_FALSE; -GLboolean __GLEW_NV_copy_depth_to_color = GL_FALSE; -GLboolean __GLEW_NV_copy_image = GL_FALSE; -GLboolean __GLEW_NV_deep_texture3D = GL_FALSE; -GLboolean __GLEW_NV_depth_buffer_float = GL_FALSE; -GLboolean __GLEW_NV_depth_clamp = GL_FALSE; -GLboolean __GLEW_NV_depth_range_unclamped = GL_FALSE; -GLboolean __GLEW_NV_draw_buffers = GL_FALSE; -GLboolean __GLEW_NV_draw_instanced = GL_FALSE; -GLboolean __GLEW_NV_draw_texture = GL_FALSE; -GLboolean __GLEW_NV_draw_vulkan_image = GL_FALSE; -GLboolean __GLEW_NV_evaluators = GL_FALSE; -GLboolean __GLEW_NV_explicit_attrib_location = GL_FALSE; -GLboolean __GLEW_NV_explicit_multisample = GL_FALSE; -GLboolean __GLEW_NV_fbo_color_attachments = GL_FALSE; -GLboolean __GLEW_NV_fence = GL_FALSE; -GLboolean __GLEW_NV_fill_rectangle = GL_FALSE; -GLboolean __GLEW_NV_float_buffer = GL_FALSE; -GLboolean __GLEW_NV_fog_distance = GL_FALSE; -GLboolean __GLEW_NV_fragment_coverage_to_color = GL_FALSE; -GLboolean __GLEW_NV_fragment_program = GL_FALSE; -GLboolean __GLEW_NV_fragment_program2 = GL_FALSE; -GLboolean __GLEW_NV_fragment_program4 = GL_FALSE; -GLboolean __GLEW_NV_fragment_program_option = GL_FALSE; -GLboolean __GLEW_NV_fragment_shader_interlock = GL_FALSE; -GLboolean __GLEW_NV_framebuffer_blit = GL_FALSE; -GLboolean __GLEW_NV_framebuffer_mixed_samples = GL_FALSE; -GLboolean __GLEW_NV_framebuffer_multisample = GL_FALSE; -GLboolean __GLEW_NV_framebuffer_multisample_coverage = GL_FALSE; -GLboolean __GLEW_NV_generate_mipmap_sRGB = GL_FALSE; -GLboolean __GLEW_NV_geometry_program4 = GL_FALSE; -GLboolean __GLEW_NV_geometry_shader4 = GL_FALSE; -GLboolean __GLEW_NV_geometry_shader_passthrough = GL_FALSE; -GLboolean __GLEW_NV_gpu_multicast = GL_FALSE; -GLboolean __GLEW_NV_gpu_program4 = GL_FALSE; -GLboolean __GLEW_NV_gpu_program5 = GL_FALSE; -GLboolean __GLEW_NV_gpu_program5_mem_extended = GL_FALSE; -GLboolean __GLEW_NV_gpu_program_fp64 = GL_FALSE; -GLboolean __GLEW_NV_gpu_shader5 = GL_FALSE; -GLboolean __GLEW_NV_half_float = GL_FALSE; -GLboolean __GLEW_NV_image_formats = GL_FALSE; -GLboolean __GLEW_NV_instanced_arrays = GL_FALSE; -GLboolean __GLEW_NV_internalformat_sample_query = GL_FALSE; -GLboolean __GLEW_NV_light_max_exponent = GL_FALSE; -GLboolean __GLEW_NV_multisample_coverage = GL_FALSE; -GLboolean __GLEW_NV_multisample_filter_hint = GL_FALSE; -GLboolean __GLEW_NV_non_square_matrices = GL_FALSE; -GLboolean __GLEW_NV_occlusion_query = GL_FALSE; -GLboolean __GLEW_NV_pack_subimage = GL_FALSE; -GLboolean __GLEW_NV_packed_depth_stencil = GL_FALSE; -GLboolean __GLEW_NV_packed_float = GL_FALSE; -GLboolean __GLEW_NV_packed_float_linear = GL_FALSE; -GLboolean __GLEW_NV_parameter_buffer_object = GL_FALSE; -GLboolean __GLEW_NV_parameter_buffer_object2 = GL_FALSE; -GLboolean __GLEW_NV_path_rendering = GL_FALSE; -GLboolean __GLEW_NV_path_rendering_shared_edge = GL_FALSE; -GLboolean __GLEW_NV_pixel_buffer_object = GL_FALSE; -GLboolean __GLEW_NV_pixel_data_range = GL_FALSE; -GLboolean __GLEW_NV_platform_binary = GL_FALSE; -GLboolean __GLEW_NV_point_sprite = GL_FALSE; -GLboolean __GLEW_NV_polygon_mode = GL_FALSE; -GLboolean __GLEW_NV_present_video = GL_FALSE; -GLboolean __GLEW_NV_primitive_restart = GL_FALSE; -GLboolean __GLEW_NV_read_depth = GL_FALSE; -GLboolean __GLEW_NV_read_depth_stencil = GL_FALSE; -GLboolean __GLEW_NV_read_stencil = GL_FALSE; -GLboolean __GLEW_NV_register_combiners = GL_FALSE; -GLboolean __GLEW_NV_register_combiners2 = GL_FALSE; -GLboolean __GLEW_NV_robustness_video_memory_purge = GL_FALSE; -GLboolean __GLEW_NV_sRGB_formats = GL_FALSE; -GLboolean __GLEW_NV_sample_locations = GL_FALSE; -GLboolean __GLEW_NV_sample_mask_override_coverage = GL_FALSE; -GLboolean __GLEW_NV_shader_atomic_counters = GL_FALSE; -GLboolean __GLEW_NV_shader_atomic_float = GL_FALSE; -GLboolean __GLEW_NV_shader_atomic_float64 = GL_FALSE; -GLboolean __GLEW_NV_shader_atomic_fp16_vector = GL_FALSE; -GLboolean __GLEW_NV_shader_atomic_int64 = GL_FALSE; -GLboolean __GLEW_NV_shader_buffer_load = GL_FALSE; -GLboolean __GLEW_NV_shader_noperspective_interpolation = GL_FALSE; -GLboolean __GLEW_NV_shader_storage_buffer_object = GL_FALSE; -GLboolean __GLEW_NV_shader_thread_group = GL_FALSE; -GLboolean __GLEW_NV_shader_thread_shuffle = GL_FALSE; -GLboolean __GLEW_NV_shadow_samplers_array = GL_FALSE; -GLboolean __GLEW_NV_shadow_samplers_cube = GL_FALSE; -GLboolean __GLEW_NV_stereo_view_rendering = GL_FALSE; -GLboolean __GLEW_NV_tessellation_program5 = GL_FALSE; -GLboolean __GLEW_NV_texgen_emboss = GL_FALSE; -GLboolean __GLEW_NV_texgen_reflection = GL_FALSE; -GLboolean __GLEW_NV_texture_array = GL_FALSE; -GLboolean __GLEW_NV_texture_barrier = GL_FALSE; -GLboolean __GLEW_NV_texture_border_clamp = GL_FALSE; -GLboolean __GLEW_NV_texture_compression_latc = GL_FALSE; -GLboolean __GLEW_NV_texture_compression_s3tc = GL_FALSE; -GLboolean __GLEW_NV_texture_compression_s3tc_update = GL_FALSE; -GLboolean __GLEW_NV_texture_compression_vtc = GL_FALSE; -GLboolean __GLEW_NV_texture_env_combine4 = GL_FALSE; -GLboolean __GLEW_NV_texture_expand_normal = GL_FALSE; -GLboolean __GLEW_NV_texture_multisample = GL_FALSE; -GLboolean __GLEW_NV_texture_npot_2D_mipmap = GL_FALSE; -GLboolean __GLEW_NV_texture_rectangle = GL_FALSE; -GLboolean __GLEW_NV_texture_rectangle_compressed = GL_FALSE; -GLboolean __GLEW_NV_texture_shader = GL_FALSE; -GLboolean __GLEW_NV_texture_shader2 = GL_FALSE; -GLboolean __GLEW_NV_texture_shader3 = GL_FALSE; -GLboolean __GLEW_NV_transform_feedback = GL_FALSE; -GLboolean __GLEW_NV_transform_feedback2 = GL_FALSE; -GLboolean __GLEW_NV_uniform_buffer_unified_memory = GL_FALSE; -GLboolean __GLEW_NV_vdpau_interop = GL_FALSE; -GLboolean __GLEW_NV_vertex_array_range = GL_FALSE; -GLboolean __GLEW_NV_vertex_array_range2 = GL_FALSE; -GLboolean __GLEW_NV_vertex_attrib_integer_64bit = GL_FALSE; -GLboolean __GLEW_NV_vertex_buffer_unified_memory = GL_FALSE; -GLboolean __GLEW_NV_vertex_program = GL_FALSE; -GLboolean __GLEW_NV_vertex_program1_1 = GL_FALSE; -GLboolean __GLEW_NV_vertex_program2 = GL_FALSE; -GLboolean __GLEW_NV_vertex_program2_option = GL_FALSE; -GLboolean __GLEW_NV_vertex_program3 = GL_FALSE; -GLboolean __GLEW_NV_vertex_program4 = GL_FALSE; -GLboolean __GLEW_NV_video_capture = GL_FALSE; -GLboolean __GLEW_NV_viewport_array = GL_FALSE; -GLboolean __GLEW_NV_viewport_array2 = GL_FALSE; -GLboolean __GLEW_NV_viewport_swizzle = GL_FALSE; -GLboolean __GLEW_OES_byte_coordinates = GL_FALSE; -GLboolean __GLEW_OML_interlace = GL_FALSE; -GLboolean __GLEW_OML_resample = GL_FALSE; -GLboolean __GLEW_OML_subsample = GL_FALSE; -GLboolean __GLEW_OVR_multiview = GL_FALSE; -GLboolean __GLEW_OVR_multiview2 = GL_FALSE; -GLboolean __GLEW_OVR_multiview_multisampled_render_to_texture = GL_FALSE; -GLboolean __GLEW_PGI_misc_hints = GL_FALSE; -GLboolean __GLEW_PGI_vertex_hints = GL_FALSE; -GLboolean __GLEW_QCOM_alpha_test = GL_FALSE; -GLboolean __GLEW_QCOM_binning_control = GL_FALSE; -GLboolean __GLEW_QCOM_driver_control = GL_FALSE; -GLboolean __GLEW_QCOM_extended_get = GL_FALSE; -GLboolean __GLEW_QCOM_extended_get2 = GL_FALSE; -GLboolean __GLEW_QCOM_framebuffer_foveated = GL_FALSE; -GLboolean __GLEW_QCOM_perfmon_global_mode = GL_FALSE; -GLboolean __GLEW_QCOM_shader_framebuffer_fetch_noncoherent = GL_FALSE; -GLboolean __GLEW_QCOM_tiled_rendering = GL_FALSE; -GLboolean __GLEW_QCOM_writeonly_rendering = GL_FALSE; -GLboolean __GLEW_REGAL_ES1_0_compatibility = GL_FALSE; -GLboolean __GLEW_REGAL_ES1_1_compatibility = GL_FALSE; -GLboolean __GLEW_REGAL_enable = GL_FALSE; -GLboolean __GLEW_REGAL_error_string = GL_FALSE; -GLboolean __GLEW_REGAL_extension_query = GL_FALSE; -GLboolean __GLEW_REGAL_log = GL_FALSE; -GLboolean __GLEW_REGAL_proc_address = GL_FALSE; -GLboolean __GLEW_REND_screen_coordinates = GL_FALSE; -GLboolean __GLEW_S3_s3tc = GL_FALSE; -GLboolean __GLEW_SGIS_clip_band_hint = GL_FALSE; -GLboolean __GLEW_SGIS_color_range = GL_FALSE; -GLboolean __GLEW_SGIS_detail_texture = GL_FALSE; -GLboolean __GLEW_SGIS_fog_function = GL_FALSE; -GLboolean __GLEW_SGIS_generate_mipmap = GL_FALSE; -GLboolean __GLEW_SGIS_line_texgen = GL_FALSE; -GLboolean __GLEW_SGIS_multisample = GL_FALSE; -GLboolean __GLEW_SGIS_multitexture = GL_FALSE; -GLboolean __GLEW_SGIS_pixel_texture = GL_FALSE; -GLboolean __GLEW_SGIS_point_line_texgen = GL_FALSE; -GLboolean __GLEW_SGIS_shared_multisample = GL_FALSE; -GLboolean __GLEW_SGIS_sharpen_texture = GL_FALSE; -GLboolean __GLEW_SGIS_texture4D = GL_FALSE; -GLboolean __GLEW_SGIS_texture_border_clamp = GL_FALSE; -GLboolean __GLEW_SGIS_texture_edge_clamp = GL_FALSE; -GLboolean __GLEW_SGIS_texture_filter4 = GL_FALSE; -GLboolean __GLEW_SGIS_texture_lod = GL_FALSE; -GLboolean __GLEW_SGIS_texture_select = GL_FALSE; -GLboolean __GLEW_SGIX_async = GL_FALSE; -GLboolean __GLEW_SGIX_async_histogram = GL_FALSE; -GLboolean __GLEW_SGIX_async_pixel = GL_FALSE; -GLboolean __GLEW_SGIX_bali_g_instruments = GL_FALSE; -GLboolean __GLEW_SGIX_bali_r_instruments = GL_FALSE; -GLboolean __GLEW_SGIX_bali_timer_instruments = GL_FALSE; -GLboolean __GLEW_SGIX_blend_alpha_minmax = GL_FALSE; -GLboolean __GLEW_SGIX_blend_cadd = GL_FALSE; -GLboolean __GLEW_SGIX_blend_cmultiply = GL_FALSE; -GLboolean __GLEW_SGIX_calligraphic_fragment = GL_FALSE; -GLboolean __GLEW_SGIX_clipmap = GL_FALSE; -GLboolean __GLEW_SGIX_color_matrix_accuracy = GL_FALSE; -GLboolean __GLEW_SGIX_color_table_index_mode = GL_FALSE; -GLboolean __GLEW_SGIX_complex_polar = GL_FALSE; -GLboolean __GLEW_SGIX_convolution_accuracy = GL_FALSE; -GLboolean __GLEW_SGIX_cube_map = GL_FALSE; -GLboolean __GLEW_SGIX_cylinder_texgen = GL_FALSE; -GLboolean __GLEW_SGIX_datapipe = GL_FALSE; -GLboolean __GLEW_SGIX_decimation = GL_FALSE; -GLboolean __GLEW_SGIX_depth_pass_instrument = GL_FALSE; -GLboolean __GLEW_SGIX_depth_texture = GL_FALSE; -GLboolean __GLEW_SGIX_dvc = GL_FALSE; -GLboolean __GLEW_SGIX_flush_raster = GL_FALSE; -GLboolean __GLEW_SGIX_fog_blend = GL_FALSE; -GLboolean __GLEW_SGIX_fog_factor_to_alpha = GL_FALSE; -GLboolean __GLEW_SGIX_fog_layers = GL_FALSE; -GLboolean __GLEW_SGIX_fog_offset = GL_FALSE; -GLboolean __GLEW_SGIX_fog_patchy = GL_FALSE; -GLboolean __GLEW_SGIX_fog_scale = GL_FALSE; -GLboolean __GLEW_SGIX_fog_texture = GL_FALSE; -GLboolean __GLEW_SGIX_fragment_lighting_space = GL_FALSE; -GLboolean __GLEW_SGIX_fragment_specular_lighting = GL_FALSE; -GLboolean __GLEW_SGIX_fragments_instrument = GL_FALSE; -GLboolean __GLEW_SGIX_framezoom = GL_FALSE; -GLboolean __GLEW_SGIX_icc_texture = GL_FALSE; -GLboolean __GLEW_SGIX_igloo_interface = GL_FALSE; -GLboolean __GLEW_SGIX_image_compression = GL_FALSE; -GLboolean __GLEW_SGIX_impact_pixel_texture = GL_FALSE; -GLboolean __GLEW_SGIX_instrument_error = GL_FALSE; -GLboolean __GLEW_SGIX_interlace = GL_FALSE; -GLboolean __GLEW_SGIX_ir_instrument1 = GL_FALSE; -GLboolean __GLEW_SGIX_line_quality_hint = GL_FALSE; -GLboolean __GLEW_SGIX_list_priority = GL_FALSE; -GLboolean __GLEW_SGIX_mpeg1 = GL_FALSE; -GLboolean __GLEW_SGIX_mpeg2 = GL_FALSE; -GLboolean __GLEW_SGIX_nonlinear_lighting_pervertex = GL_FALSE; -GLboolean __GLEW_SGIX_nurbs_eval = GL_FALSE; -GLboolean __GLEW_SGIX_occlusion_instrument = GL_FALSE; -GLboolean __GLEW_SGIX_packed_6bytes = GL_FALSE; -GLboolean __GLEW_SGIX_pixel_texture = GL_FALSE; -GLboolean __GLEW_SGIX_pixel_texture_bits = GL_FALSE; -GLboolean __GLEW_SGIX_pixel_texture_lod = GL_FALSE; -GLboolean __GLEW_SGIX_pixel_tiles = GL_FALSE; -GLboolean __GLEW_SGIX_polynomial_ffd = GL_FALSE; -GLboolean __GLEW_SGIX_quad_mesh = GL_FALSE; -GLboolean __GLEW_SGIX_reference_plane = GL_FALSE; -GLboolean __GLEW_SGIX_resample = GL_FALSE; -GLboolean __GLEW_SGIX_scalebias_hint = GL_FALSE; -GLboolean __GLEW_SGIX_shadow = GL_FALSE; -GLboolean __GLEW_SGIX_shadow_ambient = GL_FALSE; -GLboolean __GLEW_SGIX_slim = GL_FALSE; -GLboolean __GLEW_SGIX_spotlight_cutoff = GL_FALSE; -GLboolean __GLEW_SGIX_sprite = GL_FALSE; -GLboolean __GLEW_SGIX_subdiv_patch = GL_FALSE; -GLboolean __GLEW_SGIX_subsample = GL_FALSE; -GLboolean __GLEW_SGIX_tag_sample_buffer = GL_FALSE; -GLboolean __GLEW_SGIX_texture_add_env = GL_FALSE; -GLboolean __GLEW_SGIX_texture_coordinate_clamp = GL_FALSE; -GLboolean __GLEW_SGIX_texture_lod_bias = GL_FALSE; -GLboolean __GLEW_SGIX_texture_mipmap_anisotropic = GL_FALSE; -GLboolean __GLEW_SGIX_texture_multi_buffer = GL_FALSE; -GLboolean __GLEW_SGIX_texture_phase = GL_FALSE; -GLboolean __GLEW_SGIX_texture_range = GL_FALSE; -GLboolean __GLEW_SGIX_texture_scale_bias = GL_FALSE; -GLboolean __GLEW_SGIX_texture_supersample = GL_FALSE; -GLboolean __GLEW_SGIX_vector_ops = GL_FALSE; -GLboolean __GLEW_SGIX_vertex_array_object = GL_FALSE; -GLboolean __GLEW_SGIX_vertex_preclip = GL_FALSE; -GLboolean __GLEW_SGIX_vertex_preclip_hint = GL_FALSE; -GLboolean __GLEW_SGIX_ycrcb = GL_FALSE; -GLboolean __GLEW_SGIX_ycrcb_subsample = GL_FALSE; -GLboolean __GLEW_SGIX_ycrcba = GL_FALSE; -GLboolean __GLEW_SGI_color_matrix = GL_FALSE; -GLboolean __GLEW_SGI_color_table = GL_FALSE; -GLboolean __GLEW_SGI_complex = GL_FALSE; -GLboolean __GLEW_SGI_complex_type = GL_FALSE; -GLboolean __GLEW_SGI_fft = GL_FALSE; -GLboolean __GLEW_SGI_texture_color_table = GL_FALSE; -GLboolean __GLEW_SUNX_constant_data = GL_FALSE; -GLboolean __GLEW_SUN_convolution_border_modes = GL_FALSE; -GLboolean __GLEW_SUN_global_alpha = GL_FALSE; -GLboolean __GLEW_SUN_mesh_array = GL_FALSE; -GLboolean __GLEW_SUN_read_video_pixels = GL_FALSE; -GLboolean __GLEW_SUN_slice_accum = GL_FALSE; -GLboolean __GLEW_SUN_triangle_list = GL_FALSE; -GLboolean __GLEW_SUN_vertex = GL_FALSE; -GLboolean __GLEW_WIN_phong_shading = GL_FALSE; -GLboolean __GLEW_WIN_scene_markerXXX = GL_FALSE; -GLboolean __GLEW_WIN_specular_fog = GL_FALSE; -GLboolean __GLEW_WIN_swap_hint = GL_FALSE; - -static const char * _glewExtensionLookup[] = { -#ifdef GL_VERSION_1_2 - "GL_VERSION_1_2", -#endif -#ifdef GL_VERSION_1_2_1 - "GL_VERSION_1_2_1", -#endif -#ifdef GL_VERSION_1_3 - "GL_VERSION_1_3", -#endif -#ifdef GL_VERSION_1_4 - "GL_VERSION_1_4", -#endif -#ifdef GL_VERSION_1_5 - "GL_VERSION_1_5", -#endif -#ifdef GL_VERSION_2_0 - "GL_VERSION_2_0", -#endif -#ifdef GL_VERSION_2_1 - "GL_VERSION_2_1", -#endif -#ifdef GL_VERSION_3_0 - "GL_VERSION_3_0", -#endif -#ifdef GL_VERSION_3_1 - "GL_VERSION_3_1", -#endif -#ifdef GL_VERSION_3_2 - "GL_VERSION_3_2", -#endif -#ifdef GL_VERSION_3_3 - "GL_VERSION_3_3", -#endif -#ifdef GL_VERSION_4_0 - "GL_VERSION_4_0", -#endif -#ifdef GL_VERSION_4_1 - "GL_VERSION_4_1", -#endif -#ifdef GL_VERSION_4_2 - "GL_VERSION_4_2", -#endif -#ifdef GL_VERSION_4_3 - "GL_VERSION_4_3", -#endif -#ifdef GL_VERSION_4_4 - "GL_VERSION_4_4", -#endif -#ifdef GL_VERSION_4_5 - "GL_VERSION_4_5", -#endif -#ifdef GL_VERSION_4_6 - "GL_VERSION_4_6", -#endif -#ifdef GL_3DFX_multisample - "GL_3DFX_multisample", -#endif -#ifdef GL_3DFX_tbuffer - "GL_3DFX_tbuffer", -#endif -#ifdef GL_3DFX_texture_compression_FXT1 - "GL_3DFX_texture_compression_FXT1", -#endif -#ifdef GL_AMD_blend_minmax_factor - "GL_AMD_blend_minmax_factor", -#endif -#ifdef GL_AMD_compressed_3DC_texture - "GL_AMD_compressed_3DC_texture", -#endif -#ifdef GL_AMD_compressed_ATC_texture - "GL_AMD_compressed_ATC_texture", -#endif -#ifdef GL_AMD_conservative_depth - "GL_AMD_conservative_depth", -#endif -#ifdef GL_AMD_debug_output - "GL_AMD_debug_output", -#endif -#ifdef GL_AMD_depth_clamp_separate - "GL_AMD_depth_clamp_separate", -#endif -#ifdef GL_AMD_draw_buffers_blend - "GL_AMD_draw_buffers_blend", -#endif -#ifdef GL_AMD_framebuffer_sample_positions - "GL_AMD_framebuffer_sample_positions", -#endif -#ifdef GL_AMD_gcn_shader - "GL_AMD_gcn_shader", -#endif -#ifdef GL_AMD_gpu_shader_half_float - "GL_AMD_gpu_shader_half_float", -#endif -#ifdef GL_AMD_gpu_shader_int16 - "GL_AMD_gpu_shader_int16", -#endif -#ifdef GL_AMD_gpu_shader_int64 - "GL_AMD_gpu_shader_int64", -#endif -#ifdef GL_AMD_interleaved_elements - "GL_AMD_interleaved_elements", -#endif -#ifdef GL_AMD_multi_draw_indirect - "GL_AMD_multi_draw_indirect", -#endif -#ifdef GL_AMD_name_gen_delete - "GL_AMD_name_gen_delete", -#endif -#ifdef GL_AMD_occlusion_query_event - "GL_AMD_occlusion_query_event", -#endif -#ifdef GL_AMD_performance_monitor - "GL_AMD_performance_monitor", -#endif -#ifdef GL_AMD_pinned_memory - "GL_AMD_pinned_memory", -#endif -#ifdef GL_AMD_program_binary_Z400 - "GL_AMD_program_binary_Z400", -#endif -#ifdef GL_AMD_query_buffer_object - "GL_AMD_query_buffer_object", -#endif -#ifdef GL_AMD_sample_positions - "GL_AMD_sample_positions", -#endif -#ifdef GL_AMD_seamless_cubemap_per_texture - "GL_AMD_seamless_cubemap_per_texture", -#endif -#ifdef GL_AMD_shader_atomic_counter_ops - "GL_AMD_shader_atomic_counter_ops", -#endif -#ifdef GL_AMD_shader_ballot - "GL_AMD_shader_ballot", -#endif -#ifdef GL_AMD_shader_explicit_vertex_parameter - "GL_AMD_shader_explicit_vertex_parameter", -#endif -#ifdef GL_AMD_shader_stencil_export - "GL_AMD_shader_stencil_export", -#endif -#ifdef GL_AMD_shader_stencil_value_export - "GL_AMD_shader_stencil_value_export", -#endif -#ifdef GL_AMD_shader_trinary_minmax - "GL_AMD_shader_trinary_minmax", -#endif -#ifdef GL_AMD_sparse_texture - "GL_AMD_sparse_texture", -#endif -#ifdef GL_AMD_stencil_operation_extended - "GL_AMD_stencil_operation_extended", -#endif -#ifdef GL_AMD_texture_gather_bias_lod - "GL_AMD_texture_gather_bias_lod", -#endif -#ifdef GL_AMD_texture_texture4 - "GL_AMD_texture_texture4", -#endif -#ifdef GL_AMD_transform_feedback3_lines_triangles - "GL_AMD_transform_feedback3_lines_triangles", -#endif -#ifdef GL_AMD_transform_feedback4 - "GL_AMD_transform_feedback4", -#endif -#ifdef GL_AMD_vertex_shader_layer - "GL_AMD_vertex_shader_layer", -#endif -#ifdef GL_AMD_vertex_shader_tessellator - "GL_AMD_vertex_shader_tessellator", -#endif -#ifdef GL_AMD_vertex_shader_viewport_index - "GL_AMD_vertex_shader_viewport_index", -#endif -#ifdef GL_ANDROID_extension_pack_es31a - "GL_ANDROID_extension_pack_es31a", -#endif -#ifdef GL_ANGLE_depth_texture - "GL_ANGLE_depth_texture", -#endif -#ifdef GL_ANGLE_framebuffer_blit - "GL_ANGLE_framebuffer_blit", -#endif -#ifdef GL_ANGLE_framebuffer_multisample - "GL_ANGLE_framebuffer_multisample", -#endif -#ifdef GL_ANGLE_instanced_arrays - "GL_ANGLE_instanced_arrays", -#endif -#ifdef GL_ANGLE_pack_reverse_row_order - "GL_ANGLE_pack_reverse_row_order", -#endif -#ifdef GL_ANGLE_program_binary - "GL_ANGLE_program_binary", -#endif -#ifdef GL_ANGLE_texture_compression_dxt1 - "GL_ANGLE_texture_compression_dxt1", -#endif -#ifdef GL_ANGLE_texture_compression_dxt3 - "GL_ANGLE_texture_compression_dxt3", -#endif -#ifdef GL_ANGLE_texture_compression_dxt5 - "GL_ANGLE_texture_compression_dxt5", -#endif -#ifdef GL_ANGLE_texture_usage - "GL_ANGLE_texture_usage", -#endif -#ifdef GL_ANGLE_timer_query - "GL_ANGLE_timer_query", -#endif -#ifdef GL_ANGLE_translated_shader_source - "GL_ANGLE_translated_shader_source", -#endif -#ifdef GL_APPLE_aux_depth_stencil - "GL_APPLE_aux_depth_stencil", -#endif -#ifdef GL_APPLE_client_storage - "GL_APPLE_client_storage", -#endif -#ifdef GL_APPLE_clip_distance - "GL_APPLE_clip_distance", -#endif -#ifdef GL_APPLE_color_buffer_packed_float - "GL_APPLE_color_buffer_packed_float", -#endif -#ifdef GL_APPLE_copy_texture_levels - "GL_APPLE_copy_texture_levels", -#endif -#ifdef GL_APPLE_element_array - "GL_APPLE_element_array", -#endif -#ifdef GL_APPLE_fence - "GL_APPLE_fence", -#endif -#ifdef GL_APPLE_float_pixels - "GL_APPLE_float_pixels", -#endif -#ifdef GL_APPLE_flush_buffer_range - "GL_APPLE_flush_buffer_range", -#endif -#ifdef GL_APPLE_framebuffer_multisample - "GL_APPLE_framebuffer_multisample", -#endif -#ifdef GL_APPLE_object_purgeable - "GL_APPLE_object_purgeable", -#endif -#ifdef GL_APPLE_pixel_buffer - "GL_APPLE_pixel_buffer", -#endif -#ifdef GL_APPLE_rgb_422 - "GL_APPLE_rgb_422", -#endif -#ifdef GL_APPLE_row_bytes - "GL_APPLE_row_bytes", -#endif -#ifdef GL_APPLE_specular_vector - "GL_APPLE_specular_vector", -#endif -#ifdef GL_APPLE_sync - "GL_APPLE_sync", -#endif -#ifdef GL_APPLE_texture_2D_limited_npot - "GL_APPLE_texture_2D_limited_npot", -#endif -#ifdef GL_APPLE_texture_format_BGRA8888 - "GL_APPLE_texture_format_BGRA8888", -#endif -#ifdef GL_APPLE_texture_max_level - "GL_APPLE_texture_max_level", -#endif -#ifdef GL_APPLE_texture_packed_float - "GL_APPLE_texture_packed_float", -#endif -#ifdef GL_APPLE_texture_range - "GL_APPLE_texture_range", -#endif -#ifdef GL_APPLE_transform_hint - "GL_APPLE_transform_hint", -#endif -#ifdef GL_APPLE_vertex_array_object - "GL_APPLE_vertex_array_object", -#endif -#ifdef GL_APPLE_vertex_array_range - "GL_APPLE_vertex_array_range", -#endif -#ifdef GL_APPLE_vertex_program_evaluators - "GL_APPLE_vertex_program_evaluators", -#endif -#ifdef GL_APPLE_ycbcr_422 - "GL_APPLE_ycbcr_422", -#endif -#ifdef GL_ARB_ES2_compatibility - "GL_ARB_ES2_compatibility", -#endif -#ifdef GL_ARB_ES3_1_compatibility - "GL_ARB_ES3_1_compatibility", -#endif -#ifdef GL_ARB_ES3_2_compatibility - "GL_ARB_ES3_2_compatibility", -#endif -#ifdef GL_ARB_ES3_compatibility - "GL_ARB_ES3_compatibility", -#endif -#ifdef GL_ARB_arrays_of_arrays - "GL_ARB_arrays_of_arrays", -#endif -#ifdef GL_ARB_base_instance - "GL_ARB_base_instance", -#endif -#ifdef GL_ARB_bindless_texture - "GL_ARB_bindless_texture", -#endif -#ifdef GL_ARB_blend_func_extended - "GL_ARB_blend_func_extended", -#endif -#ifdef GL_ARB_buffer_storage - "GL_ARB_buffer_storage", -#endif -#ifdef GL_ARB_cl_event - "GL_ARB_cl_event", -#endif -#ifdef GL_ARB_clear_buffer_object - "GL_ARB_clear_buffer_object", -#endif -#ifdef GL_ARB_clear_texture - "GL_ARB_clear_texture", -#endif -#ifdef GL_ARB_clip_control - "GL_ARB_clip_control", -#endif -#ifdef GL_ARB_color_buffer_float - "GL_ARB_color_buffer_float", -#endif -#ifdef GL_ARB_compatibility - "GL_ARB_compatibility", -#endif -#ifdef GL_ARB_compressed_texture_pixel_storage - "GL_ARB_compressed_texture_pixel_storage", -#endif -#ifdef GL_ARB_compute_shader - "GL_ARB_compute_shader", -#endif -#ifdef GL_ARB_compute_variable_group_size - "GL_ARB_compute_variable_group_size", -#endif -#ifdef GL_ARB_conditional_render_inverted - "GL_ARB_conditional_render_inverted", -#endif -#ifdef GL_ARB_conservative_depth - "GL_ARB_conservative_depth", -#endif -#ifdef GL_ARB_copy_buffer - "GL_ARB_copy_buffer", -#endif -#ifdef GL_ARB_copy_image - "GL_ARB_copy_image", -#endif -#ifdef GL_ARB_cull_distance - "GL_ARB_cull_distance", -#endif -#ifdef GL_ARB_debug_output - "GL_ARB_debug_output", -#endif -#ifdef GL_ARB_depth_buffer_float - "GL_ARB_depth_buffer_float", -#endif -#ifdef GL_ARB_depth_clamp - "GL_ARB_depth_clamp", -#endif -#ifdef GL_ARB_depth_texture - "GL_ARB_depth_texture", -#endif -#ifdef GL_ARB_derivative_control - "GL_ARB_derivative_control", -#endif -#ifdef GL_ARB_direct_state_access - "GL_ARB_direct_state_access", -#endif -#ifdef GL_ARB_draw_buffers - "GL_ARB_draw_buffers", -#endif -#ifdef GL_ARB_draw_buffers_blend - "GL_ARB_draw_buffers_blend", -#endif -#ifdef GL_ARB_draw_elements_base_vertex - "GL_ARB_draw_elements_base_vertex", -#endif -#ifdef GL_ARB_draw_indirect - "GL_ARB_draw_indirect", -#endif -#ifdef GL_ARB_draw_instanced - "GL_ARB_draw_instanced", -#endif -#ifdef GL_ARB_enhanced_layouts - "GL_ARB_enhanced_layouts", -#endif -#ifdef GL_ARB_explicit_attrib_location - "GL_ARB_explicit_attrib_location", -#endif -#ifdef GL_ARB_explicit_uniform_location - "GL_ARB_explicit_uniform_location", -#endif -#ifdef GL_ARB_fragment_coord_conventions - "GL_ARB_fragment_coord_conventions", -#endif -#ifdef GL_ARB_fragment_layer_viewport - "GL_ARB_fragment_layer_viewport", -#endif -#ifdef GL_ARB_fragment_program - "GL_ARB_fragment_program", -#endif -#ifdef GL_ARB_fragment_program_shadow - "GL_ARB_fragment_program_shadow", -#endif -#ifdef GL_ARB_fragment_shader - "GL_ARB_fragment_shader", -#endif -#ifdef GL_ARB_fragment_shader_interlock - "GL_ARB_fragment_shader_interlock", -#endif -#ifdef GL_ARB_framebuffer_no_attachments - "GL_ARB_framebuffer_no_attachments", -#endif -#ifdef GL_ARB_framebuffer_object - "GL_ARB_framebuffer_object", -#endif -#ifdef GL_ARB_framebuffer_sRGB - "GL_ARB_framebuffer_sRGB", -#endif -#ifdef GL_ARB_geometry_shader4 - "GL_ARB_geometry_shader4", -#endif -#ifdef GL_ARB_get_program_binary - "GL_ARB_get_program_binary", -#endif -#ifdef GL_ARB_get_texture_sub_image - "GL_ARB_get_texture_sub_image", -#endif -#ifdef GL_ARB_gl_spirv - "GL_ARB_gl_spirv", -#endif -#ifdef GL_ARB_gpu_shader5 - "GL_ARB_gpu_shader5", -#endif -#ifdef GL_ARB_gpu_shader_fp64 - "GL_ARB_gpu_shader_fp64", -#endif -#ifdef GL_ARB_gpu_shader_int64 - "GL_ARB_gpu_shader_int64", -#endif -#ifdef GL_ARB_half_float_pixel - "GL_ARB_half_float_pixel", -#endif -#ifdef GL_ARB_half_float_vertex - "GL_ARB_half_float_vertex", -#endif -#ifdef GL_ARB_imaging - "GL_ARB_imaging", -#endif -#ifdef GL_ARB_indirect_parameters - "GL_ARB_indirect_parameters", -#endif -#ifdef GL_ARB_instanced_arrays - "GL_ARB_instanced_arrays", -#endif -#ifdef GL_ARB_internalformat_query - "GL_ARB_internalformat_query", -#endif -#ifdef GL_ARB_internalformat_query2 - "GL_ARB_internalformat_query2", -#endif -#ifdef GL_ARB_invalidate_subdata - "GL_ARB_invalidate_subdata", -#endif -#ifdef GL_ARB_map_buffer_alignment - "GL_ARB_map_buffer_alignment", -#endif -#ifdef GL_ARB_map_buffer_range - "GL_ARB_map_buffer_range", -#endif -#ifdef GL_ARB_matrix_palette - "GL_ARB_matrix_palette", -#endif -#ifdef GL_ARB_multi_bind - "GL_ARB_multi_bind", -#endif -#ifdef GL_ARB_multi_draw_indirect - "GL_ARB_multi_draw_indirect", -#endif -#ifdef GL_ARB_multisample - "GL_ARB_multisample", -#endif -#ifdef GL_ARB_multitexture - "GL_ARB_multitexture", -#endif -#ifdef GL_ARB_occlusion_query - "GL_ARB_occlusion_query", -#endif -#ifdef GL_ARB_occlusion_query2 - "GL_ARB_occlusion_query2", -#endif -#ifdef GL_ARB_parallel_shader_compile - "GL_ARB_parallel_shader_compile", -#endif -#ifdef GL_ARB_pipeline_statistics_query - "GL_ARB_pipeline_statistics_query", -#endif -#ifdef GL_ARB_pixel_buffer_object - "GL_ARB_pixel_buffer_object", -#endif -#ifdef GL_ARB_point_parameters - "GL_ARB_point_parameters", -#endif -#ifdef GL_ARB_point_sprite - "GL_ARB_point_sprite", -#endif -#ifdef GL_ARB_polygon_offset_clamp - "GL_ARB_polygon_offset_clamp", -#endif -#ifdef GL_ARB_post_depth_coverage - "GL_ARB_post_depth_coverage", -#endif -#ifdef GL_ARB_program_interface_query - "GL_ARB_program_interface_query", -#endif -#ifdef GL_ARB_provoking_vertex - "GL_ARB_provoking_vertex", -#endif -#ifdef GL_ARB_query_buffer_object - "GL_ARB_query_buffer_object", -#endif -#ifdef GL_ARB_robust_buffer_access_behavior - "GL_ARB_robust_buffer_access_behavior", -#endif -#ifdef GL_ARB_robustness - "GL_ARB_robustness", -#endif -#ifdef GL_ARB_robustness_application_isolation - "GL_ARB_robustness_application_isolation", -#endif -#ifdef GL_ARB_robustness_share_group_isolation - "GL_ARB_robustness_share_group_isolation", -#endif -#ifdef GL_ARB_sample_locations - "GL_ARB_sample_locations", -#endif -#ifdef GL_ARB_sample_shading - "GL_ARB_sample_shading", -#endif -#ifdef GL_ARB_sampler_objects - "GL_ARB_sampler_objects", -#endif -#ifdef GL_ARB_seamless_cube_map - "GL_ARB_seamless_cube_map", -#endif -#ifdef GL_ARB_seamless_cubemap_per_texture - "GL_ARB_seamless_cubemap_per_texture", -#endif -#ifdef GL_ARB_separate_shader_objects - "GL_ARB_separate_shader_objects", -#endif -#ifdef GL_ARB_shader_atomic_counter_ops - "GL_ARB_shader_atomic_counter_ops", -#endif -#ifdef GL_ARB_shader_atomic_counters - "GL_ARB_shader_atomic_counters", -#endif -#ifdef GL_ARB_shader_ballot - "GL_ARB_shader_ballot", -#endif -#ifdef GL_ARB_shader_bit_encoding - "GL_ARB_shader_bit_encoding", -#endif -#ifdef GL_ARB_shader_clock - "GL_ARB_shader_clock", -#endif -#ifdef GL_ARB_shader_draw_parameters - "GL_ARB_shader_draw_parameters", -#endif -#ifdef GL_ARB_shader_group_vote - "GL_ARB_shader_group_vote", -#endif -#ifdef GL_ARB_shader_image_load_store - "GL_ARB_shader_image_load_store", -#endif -#ifdef GL_ARB_shader_image_size - "GL_ARB_shader_image_size", -#endif -#ifdef GL_ARB_shader_objects - "GL_ARB_shader_objects", -#endif -#ifdef GL_ARB_shader_precision - "GL_ARB_shader_precision", -#endif -#ifdef GL_ARB_shader_stencil_export - "GL_ARB_shader_stencil_export", -#endif -#ifdef GL_ARB_shader_storage_buffer_object - "GL_ARB_shader_storage_buffer_object", -#endif -#ifdef GL_ARB_shader_subroutine - "GL_ARB_shader_subroutine", -#endif -#ifdef GL_ARB_shader_texture_image_samples - "GL_ARB_shader_texture_image_samples", -#endif -#ifdef GL_ARB_shader_texture_lod - "GL_ARB_shader_texture_lod", -#endif -#ifdef GL_ARB_shader_viewport_layer_array - "GL_ARB_shader_viewport_layer_array", -#endif -#ifdef GL_ARB_shading_language_100 - "GL_ARB_shading_language_100", -#endif -#ifdef GL_ARB_shading_language_420pack - "GL_ARB_shading_language_420pack", -#endif -#ifdef GL_ARB_shading_language_include - "GL_ARB_shading_language_include", -#endif -#ifdef GL_ARB_shading_language_packing - "GL_ARB_shading_language_packing", -#endif -#ifdef GL_ARB_shadow - "GL_ARB_shadow", -#endif -#ifdef GL_ARB_shadow_ambient - "GL_ARB_shadow_ambient", -#endif -#ifdef GL_ARB_sparse_buffer - "GL_ARB_sparse_buffer", -#endif -#ifdef GL_ARB_sparse_texture - "GL_ARB_sparse_texture", -#endif -#ifdef GL_ARB_sparse_texture2 - "GL_ARB_sparse_texture2", -#endif -#ifdef GL_ARB_sparse_texture_clamp - "GL_ARB_sparse_texture_clamp", -#endif -#ifdef GL_ARB_spirv_extensions - "GL_ARB_spirv_extensions", -#endif -#ifdef GL_ARB_stencil_texturing - "GL_ARB_stencil_texturing", -#endif -#ifdef GL_ARB_sync - "GL_ARB_sync", -#endif -#ifdef GL_ARB_tessellation_shader - "GL_ARB_tessellation_shader", -#endif -#ifdef GL_ARB_texture_barrier - "GL_ARB_texture_barrier", -#endif -#ifdef GL_ARB_texture_border_clamp - "GL_ARB_texture_border_clamp", -#endif -#ifdef GL_ARB_texture_buffer_object - "GL_ARB_texture_buffer_object", -#endif -#ifdef GL_ARB_texture_buffer_object_rgb32 - "GL_ARB_texture_buffer_object_rgb32", -#endif -#ifdef GL_ARB_texture_buffer_range - "GL_ARB_texture_buffer_range", -#endif -#ifdef GL_ARB_texture_compression - "GL_ARB_texture_compression", -#endif -#ifdef GL_ARB_texture_compression_bptc - "GL_ARB_texture_compression_bptc", -#endif -#ifdef GL_ARB_texture_compression_rgtc - "GL_ARB_texture_compression_rgtc", -#endif -#ifdef GL_ARB_texture_cube_map - "GL_ARB_texture_cube_map", -#endif -#ifdef GL_ARB_texture_cube_map_array - "GL_ARB_texture_cube_map_array", -#endif -#ifdef GL_ARB_texture_env_add - "GL_ARB_texture_env_add", -#endif -#ifdef GL_ARB_texture_env_combine - "GL_ARB_texture_env_combine", -#endif -#ifdef GL_ARB_texture_env_crossbar - "GL_ARB_texture_env_crossbar", -#endif -#ifdef GL_ARB_texture_env_dot3 - "GL_ARB_texture_env_dot3", -#endif -#ifdef GL_ARB_texture_filter_anisotropic - "GL_ARB_texture_filter_anisotropic", -#endif -#ifdef GL_ARB_texture_filter_minmax - "GL_ARB_texture_filter_minmax", -#endif -#ifdef GL_ARB_texture_float - "GL_ARB_texture_float", -#endif -#ifdef GL_ARB_texture_gather - "GL_ARB_texture_gather", -#endif -#ifdef GL_ARB_texture_mirror_clamp_to_edge - "GL_ARB_texture_mirror_clamp_to_edge", -#endif -#ifdef GL_ARB_texture_mirrored_repeat - "GL_ARB_texture_mirrored_repeat", -#endif -#ifdef GL_ARB_texture_multisample - "GL_ARB_texture_multisample", -#endif -#ifdef GL_ARB_texture_non_power_of_two - "GL_ARB_texture_non_power_of_two", -#endif -#ifdef GL_ARB_texture_query_levels - "GL_ARB_texture_query_levels", -#endif -#ifdef GL_ARB_texture_query_lod - "GL_ARB_texture_query_lod", -#endif -#ifdef GL_ARB_texture_rectangle - "GL_ARB_texture_rectangle", -#endif -#ifdef GL_ARB_texture_rg - "GL_ARB_texture_rg", -#endif -#ifdef GL_ARB_texture_rgb10_a2ui - "GL_ARB_texture_rgb10_a2ui", -#endif -#ifdef GL_ARB_texture_stencil8 - "GL_ARB_texture_stencil8", -#endif -#ifdef GL_ARB_texture_storage - "GL_ARB_texture_storage", -#endif -#ifdef GL_ARB_texture_storage_multisample - "GL_ARB_texture_storage_multisample", -#endif -#ifdef GL_ARB_texture_swizzle - "GL_ARB_texture_swizzle", -#endif -#ifdef GL_ARB_texture_view - "GL_ARB_texture_view", -#endif -#ifdef GL_ARB_timer_query - "GL_ARB_timer_query", -#endif -#ifdef GL_ARB_transform_feedback2 - "GL_ARB_transform_feedback2", -#endif -#ifdef GL_ARB_transform_feedback3 - "GL_ARB_transform_feedback3", -#endif -#ifdef GL_ARB_transform_feedback_instanced - "GL_ARB_transform_feedback_instanced", -#endif -#ifdef GL_ARB_transform_feedback_overflow_query - "GL_ARB_transform_feedback_overflow_query", -#endif -#ifdef GL_ARB_transpose_matrix - "GL_ARB_transpose_matrix", -#endif -#ifdef GL_ARB_uniform_buffer_object - "GL_ARB_uniform_buffer_object", -#endif -#ifdef GL_ARB_vertex_array_bgra - "GL_ARB_vertex_array_bgra", -#endif -#ifdef GL_ARB_vertex_array_object - "GL_ARB_vertex_array_object", -#endif -#ifdef GL_ARB_vertex_attrib_64bit - "GL_ARB_vertex_attrib_64bit", -#endif -#ifdef GL_ARB_vertex_attrib_binding - "GL_ARB_vertex_attrib_binding", -#endif -#ifdef GL_ARB_vertex_blend - "GL_ARB_vertex_blend", -#endif -#ifdef GL_ARB_vertex_buffer_object - "GL_ARB_vertex_buffer_object", -#endif -#ifdef GL_ARB_vertex_program - "GL_ARB_vertex_program", -#endif -#ifdef GL_ARB_vertex_shader - "GL_ARB_vertex_shader", -#endif -#ifdef GL_ARB_vertex_type_10f_11f_11f_rev - "GL_ARB_vertex_type_10f_11f_11f_rev", -#endif -#ifdef GL_ARB_vertex_type_2_10_10_10_rev - "GL_ARB_vertex_type_2_10_10_10_rev", -#endif -#ifdef GL_ARB_viewport_array - "GL_ARB_viewport_array", -#endif -#ifdef GL_ARB_window_pos - "GL_ARB_window_pos", -#endif -#ifdef GL_ARM_mali_program_binary - "GL_ARM_mali_program_binary", -#endif -#ifdef GL_ARM_mali_shader_binary - "GL_ARM_mali_shader_binary", -#endif -#ifdef GL_ARM_rgba8 - "GL_ARM_rgba8", -#endif -#ifdef GL_ARM_shader_framebuffer_fetch - "GL_ARM_shader_framebuffer_fetch", -#endif -#ifdef GL_ARM_shader_framebuffer_fetch_depth_stencil - "GL_ARM_shader_framebuffer_fetch_depth_stencil", -#endif -#ifdef GL_ATIX_point_sprites - "GL_ATIX_point_sprites", -#endif -#ifdef GL_ATIX_texture_env_combine3 - "GL_ATIX_texture_env_combine3", -#endif -#ifdef GL_ATIX_texture_env_route - "GL_ATIX_texture_env_route", -#endif -#ifdef GL_ATIX_vertex_shader_output_point_size - "GL_ATIX_vertex_shader_output_point_size", -#endif -#ifdef GL_ATI_draw_buffers - "GL_ATI_draw_buffers", -#endif -#ifdef GL_ATI_element_array - "GL_ATI_element_array", -#endif -#ifdef GL_ATI_envmap_bumpmap - "GL_ATI_envmap_bumpmap", -#endif -#ifdef GL_ATI_fragment_shader - "GL_ATI_fragment_shader", -#endif -#ifdef GL_ATI_map_object_buffer - "GL_ATI_map_object_buffer", -#endif -#ifdef GL_ATI_meminfo - "GL_ATI_meminfo", -#endif -#ifdef GL_ATI_pn_triangles - "GL_ATI_pn_triangles", -#endif -#ifdef GL_ATI_separate_stencil - "GL_ATI_separate_stencil", -#endif -#ifdef GL_ATI_shader_texture_lod - "GL_ATI_shader_texture_lod", -#endif -#ifdef GL_ATI_text_fragment_shader - "GL_ATI_text_fragment_shader", -#endif -#ifdef GL_ATI_texture_compression_3dc - "GL_ATI_texture_compression_3dc", -#endif -#ifdef GL_ATI_texture_env_combine3 - "GL_ATI_texture_env_combine3", -#endif -#ifdef GL_ATI_texture_float - "GL_ATI_texture_float", -#endif -#ifdef GL_ATI_texture_mirror_once - "GL_ATI_texture_mirror_once", -#endif -#ifdef GL_ATI_vertex_array_object - "GL_ATI_vertex_array_object", -#endif -#ifdef GL_ATI_vertex_attrib_array_object - "GL_ATI_vertex_attrib_array_object", -#endif -#ifdef GL_ATI_vertex_streams - "GL_ATI_vertex_streams", -#endif -#ifdef GL_EGL_KHR_context_flush_control - "GL_EGL_KHR_context_flush_control", -#endif -#ifdef GL_EGL_NV_robustness_video_memory_purge - "GL_EGL_NV_robustness_video_memory_purge", -#endif -#ifdef GL_EXT_422_pixels - "GL_EXT_422_pixels", -#endif -#ifdef GL_EXT_Cg_shader - "GL_EXT_Cg_shader", -#endif -#ifdef GL_EXT_EGL_image_array - "GL_EXT_EGL_image_array", -#endif -#ifdef GL_EXT_YUV_target - "GL_EXT_YUV_target", -#endif -#ifdef GL_EXT_abgr - "GL_EXT_abgr", -#endif -#ifdef GL_EXT_base_instance - "GL_EXT_base_instance", -#endif -#ifdef GL_EXT_bgra - "GL_EXT_bgra", -#endif -#ifdef GL_EXT_bindable_uniform - "GL_EXT_bindable_uniform", -#endif -#ifdef GL_EXT_blend_color - "GL_EXT_blend_color", -#endif -#ifdef GL_EXT_blend_equation_separate - "GL_EXT_blend_equation_separate", -#endif -#ifdef GL_EXT_blend_func_extended - "GL_EXT_blend_func_extended", -#endif -#ifdef GL_EXT_blend_func_separate - "GL_EXT_blend_func_separate", -#endif -#ifdef GL_EXT_blend_logic_op - "GL_EXT_blend_logic_op", -#endif -#ifdef GL_EXT_blend_minmax - "GL_EXT_blend_minmax", -#endif -#ifdef GL_EXT_blend_subtract - "GL_EXT_blend_subtract", -#endif -#ifdef GL_EXT_buffer_storage - "GL_EXT_buffer_storage", -#endif -#ifdef GL_EXT_clear_texture - "GL_EXT_clear_texture", -#endif -#ifdef GL_EXT_clip_cull_distance - "GL_EXT_clip_cull_distance", -#endif -#ifdef GL_EXT_clip_volume_hint - "GL_EXT_clip_volume_hint", -#endif -#ifdef GL_EXT_cmyka - "GL_EXT_cmyka", -#endif -#ifdef GL_EXT_color_buffer_float - "GL_EXT_color_buffer_float", -#endif -#ifdef GL_EXT_color_buffer_half_float - "GL_EXT_color_buffer_half_float", -#endif -#ifdef GL_EXT_color_subtable - "GL_EXT_color_subtable", -#endif -#ifdef GL_EXT_compiled_vertex_array - "GL_EXT_compiled_vertex_array", -#endif -#ifdef GL_EXT_compressed_ETC1_RGB8_sub_texture - "GL_EXT_compressed_ETC1_RGB8_sub_texture", -#endif -#ifdef GL_EXT_conservative_depth - "GL_EXT_conservative_depth", -#endif -#ifdef GL_EXT_convolution - "GL_EXT_convolution", -#endif -#ifdef GL_EXT_coordinate_frame - "GL_EXT_coordinate_frame", -#endif -#ifdef GL_EXT_copy_image - "GL_EXT_copy_image", -#endif -#ifdef GL_EXT_copy_texture - "GL_EXT_copy_texture", -#endif -#ifdef GL_EXT_cull_vertex - "GL_EXT_cull_vertex", -#endif -#ifdef GL_EXT_debug_label - "GL_EXT_debug_label", -#endif -#ifdef GL_EXT_debug_marker - "GL_EXT_debug_marker", -#endif -#ifdef GL_EXT_depth_bounds_test - "GL_EXT_depth_bounds_test", -#endif -#ifdef GL_EXT_direct_state_access - "GL_EXT_direct_state_access", -#endif -#ifdef GL_EXT_discard_framebuffer - "GL_EXT_discard_framebuffer", -#endif -#ifdef GL_EXT_draw_buffers - "GL_EXT_draw_buffers", -#endif -#ifdef GL_EXT_draw_buffers2 - "GL_EXT_draw_buffers2", -#endif -#ifdef GL_EXT_draw_buffers_indexed - "GL_EXT_draw_buffers_indexed", -#endif -#ifdef GL_EXT_draw_elements_base_vertex - "GL_EXT_draw_elements_base_vertex", -#endif -#ifdef GL_EXT_draw_instanced - "GL_EXT_draw_instanced", -#endif -#ifdef GL_EXT_draw_range_elements - "GL_EXT_draw_range_elements", -#endif -#ifdef GL_EXT_external_buffer - "GL_EXT_external_buffer", -#endif -#ifdef GL_EXT_float_blend - "GL_EXT_float_blend", -#endif -#ifdef GL_EXT_fog_coord - "GL_EXT_fog_coord", -#endif -#ifdef GL_EXT_frag_depth - "GL_EXT_frag_depth", -#endif -#ifdef GL_EXT_fragment_lighting - "GL_EXT_fragment_lighting", -#endif -#ifdef GL_EXT_framebuffer_blit - "GL_EXT_framebuffer_blit", -#endif -#ifdef GL_EXT_framebuffer_multisample - "GL_EXT_framebuffer_multisample", -#endif -#ifdef GL_EXT_framebuffer_multisample_blit_scaled - "GL_EXT_framebuffer_multisample_blit_scaled", -#endif -#ifdef GL_EXT_framebuffer_object - "GL_EXT_framebuffer_object", -#endif -#ifdef GL_EXT_framebuffer_sRGB - "GL_EXT_framebuffer_sRGB", -#endif -#ifdef GL_EXT_geometry_point_size - "GL_EXT_geometry_point_size", -#endif -#ifdef GL_EXT_geometry_shader - "GL_EXT_geometry_shader", -#endif -#ifdef GL_EXT_geometry_shader4 - "GL_EXT_geometry_shader4", -#endif -#ifdef GL_EXT_gpu_program_parameters - "GL_EXT_gpu_program_parameters", -#endif -#ifdef GL_EXT_gpu_shader4 - "GL_EXT_gpu_shader4", -#endif -#ifdef GL_EXT_gpu_shader5 - "GL_EXT_gpu_shader5", -#endif -#ifdef GL_EXT_histogram - "GL_EXT_histogram", -#endif -#ifdef GL_EXT_index_array_formats - "GL_EXT_index_array_formats", -#endif -#ifdef GL_EXT_index_func - "GL_EXT_index_func", -#endif -#ifdef GL_EXT_index_material - "GL_EXT_index_material", -#endif -#ifdef GL_EXT_index_texture - "GL_EXT_index_texture", -#endif -#ifdef GL_EXT_instanced_arrays - "GL_EXT_instanced_arrays", -#endif -#ifdef GL_EXT_light_texture - "GL_EXT_light_texture", -#endif -#ifdef GL_EXT_map_buffer_range - "GL_EXT_map_buffer_range", -#endif -#ifdef GL_EXT_memory_object - "GL_EXT_memory_object", -#endif -#ifdef GL_EXT_memory_object_fd - "GL_EXT_memory_object_fd", -#endif -#ifdef GL_EXT_memory_object_win32 - "GL_EXT_memory_object_win32", -#endif -#ifdef GL_EXT_misc_attribute - "GL_EXT_misc_attribute", -#endif -#ifdef GL_EXT_multi_draw_arrays - "GL_EXT_multi_draw_arrays", -#endif -#ifdef GL_EXT_multi_draw_indirect - "GL_EXT_multi_draw_indirect", -#endif -#ifdef GL_EXT_multiple_textures - "GL_EXT_multiple_textures", -#endif -#ifdef GL_EXT_multisample - "GL_EXT_multisample", -#endif -#ifdef GL_EXT_multisample_compatibility - "GL_EXT_multisample_compatibility", -#endif -#ifdef GL_EXT_multisampled_render_to_texture - "GL_EXT_multisampled_render_to_texture", -#endif -#ifdef GL_EXT_multisampled_render_to_texture2 - "GL_EXT_multisampled_render_to_texture2", -#endif -#ifdef GL_EXT_multiview_draw_buffers - "GL_EXT_multiview_draw_buffers", -#endif -#ifdef GL_EXT_packed_depth_stencil - "GL_EXT_packed_depth_stencil", -#endif -#ifdef GL_EXT_packed_float - "GL_EXT_packed_float", -#endif -#ifdef GL_EXT_packed_pixels - "GL_EXT_packed_pixels", -#endif -#ifdef GL_EXT_paletted_texture - "GL_EXT_paletted_texture", -#endif -#ifdef GL_EXT_pixel_buffer_object - "GL_EXT_pixel_buffer_object", -#endif -#ifdef GL_EXT_pixel_transform - "GL_EXT_pixel_transform", -#endif -#ifdef GL_EXT_pixel_transform_color_table - "GL_EXT_pixel_transform_color_table", -#endif -#ifdef GL_EXT_point_parameters - "GL_EXT_point_parameters", -#endif -#ifdef GL_EXT_polygon_offset - "GL_EXT_polygon_offset", -#endif -#ifdef GL_EXT_polygon_offset_clamp - "GL_EXT_polygon_offset_clamp", -#endif -#ifdef GL_EXT_post_depth_coverage - "GL_EXT_post_depth_coverage", -#endif -#ifdef GL_EXT_provoking_vertex - "GL_EXT_provoking_vertex", -#endif -#ifdef GL_EXT_pvrtc_sRGB - "GL_EXT_pvrtc_sRGB", -#endif -#ifdef GL_EXT_raster_multisample - "GL_EXT_raster_multisample", -#endif -#ifdef GL_EXT_read_format_bgra - "GL_EXT_read_format_bgra", -#endif -#ifdef GL_EXT_render_snorm - "GL_EXT_render_snorm", -#endif -#ifdef GL_EXT_rescale_normal - "GL_EXT_rescale_normal", -#endif -#ifdef GL_EXT_sRGB - "GL_EXT_sRGB", -#endif -#ifdef GL_EXT_sRGB_write_control - "GL_EXT_sRGB_write_control", -#endif -#ifdef GL_EXT_scene_marker - "GL_EXT_scene_marker", -#endif -#ifdef GL_EXT_secondary_color - "GL_EXT_secondary_color", -#endif -#ifdef GL_EXT_semaphore - "GL_EXT_semaphore", -#endif -#ifdef GL_EXT_semaphore_fd - "GL_EXT_semaphore_fd", -#endif -#ifdef GL_EXT_semaphore_win32 - "GL_EXT_semaphore_win32", -#endif -#ifdef GL_EXT_separate_shader_objects - "GL_EXT_separate_shader_objects", -#endif -#ifdef GL_EXT_separate_specular_color - "GL_EXT_separate_specular_color", -#endif -#ifdef GL_EXT_shader_framebuffer_fetch - "GL_EXT_shader_framebuffer_fetch", -#endif -#ifdef GL_EXT_shader_group_vote - "GL_EXT_shader_group_vote", -#endif -#ifdef GL_EXT_shader_image_load_formatted - "GL_EXT_shader_image_load_formatted", -#endif -#ifdef GL_EXT_shader_image_load_store - "GL_EXT_shader_image_load_store", -#endif -#ifdef GL_EXT_shader_implicit_conversions - "GL_EXT_shader_implicit_conversions", -#endif -#ifdef GL_EXT_shader_integer_mix - "GL_EXT_shader_integer_mix", -#endif -#ifdef GL_EXT_shader_io_blocks - "GL_EXT_shader_io_blocks", -#endif -#ifdef GL_EXT_shader_non_constant_global_initializers - "GL_EXT_shader_non_constant_global_initializers", -#endif -#ifdef GL_EXT_shader_pixel_local_storage - "GL_EXT_shader_pixel_local_storage", -#endif -#ifdef GL_EXT_shader_pixel_local_storage2 - "GL_EXT_shader_pixel_local_storage2", -#endif -#ifdef GL_EXT_shader_texture_lod - "GL_EXT_shader_texture_lod", -#endif -#ifdef GL_EXT_shadow_funcs - "GL_EXT_shadow_funcs", -#endif -#ifdef GL_EXT_shadow_samplers - "GL_EXT_shadow_samplers", -#endif -#ifdef GL_EXT_shared_texture_palette - "GL_EXT_shared_texture_palette", -#endif -#ifdef GL_EXT_sparse_texture - "GL_EXT_sparse_texture", -#endif -#ifdef GL_EXT_sparse_texture2 - "GL_EXT_sparse_texture2", -#endif -#ifdef GL_EXT_stencil_clear_tag - "GL_EXT_stencil_clear_tag", -#endif -#ifdef GL_EXT_stencil_two_side - "GL_EXT_stencil_two_side", -#endif -#ifdef GL_EXT_stencil_wrap - "GL_EXT_stencil_wrap", -#endif -#ifdef GL_EXT_subtexture - "GL_EXT_subtexture", -#endif -#ifdef GL_EXT_texture - "GL_EXT_texture", -#endif -#ifdef GL_EXT_texture3D - "GL_EXT_texture3D", -#endif -#ifdef GL_EXT_texture_array - "GL_EXT_texture_array", -#endif -#ifdef GL_EXT_texture_buffer_object - "GL_EXT_texture_buffer_object", -#endif -#ifdef GL_EXT_texture_compression_astc_decode_mode - "GL_EXT_texture_compression_astc_decode_mode", -#endif -#ifdef GL_EXT_texture_compression_astc_decode_mode_rgb9e5 - "GL_EXT_texture_compression_astc_decode_mode_rgb9e5", -#endif -#ifdef GL_EXT_texture_compression_bptc - "GL_EXT_texture_compression_bptc", -#endif -#ifdef GL_EXT_texture_compression_dxt1 - "GL_EXT_texture_compression_dxt1", -#endif -#ifdef GL_EXT_texture_compression_latc - "GL_EXT_texture_compression_latc", -#endif -#ifdef GL_EXT_texture_compression_rgtc - "GL_EXT_texture_compression_rgtc", -#endif -#ifdef GL_EXT_texture_compression_s3tc - "GL_EXT_texture_compression_s3tc", -#endif -#ifdef GL_EXT_texture_cube_map - "GL_EXT_texture_cube_map", -#endif -#ifdef GL_EXT_texture_cube_map_array - "GL_EXT_texture_cube_map_array", -#endif -#ifdef GL_EXT_texture_edge_clamp - "GL_EXT_texture_edge_clamp", -#endif -#ifdef GL_EXT_texture_env - "GL_EXT_texture_env", -#endif -#ifdef GL_EXT_texture_env_add - "GL_EXT_texture_env_add", -#endif -#ifdef GL_EXT_texture_env_combine - "GL_EXT_texture_env_combine", -#endif -#ifdef GL_EXT_texture_env_dot3 - "GL_EXT_texture_env_dot3", -#endif -#ifdef GL_EXT_texture_filter_anisotropic - "GL_EXT_texture_filter_anisotropic", -#endif -#ifdef GL_EXT_texture_filter_minmax - "GL_EXT_texture_filter_minmax", -#endif -#ifdef GL_EXT_texture_format_BGRA8888 - "GL_EXT_texture_format_BGRA8888", -#endif -#ifdef GL_EXT_texture_integer - "GL_EXT_texture_integer", -#endif -#ifdef GL_EXT_texture_lod_bias - "GL_EXT_texture_lod_bias", -#endif -#ifdef GL_EXT_texture_mirror_clamp - "GL_EXT_texture_mirror_clamp", -#endif -#ifdef GL_EXT_texture_norm16 - "GL_EXT_texture_norm16", -#endif -#ifdef GL_EXT_texture_object - "GL_EXT_texture_object", -#endif -#ifdef GL_EXT_texture_perturb_normal - "GL_EXT_texture_perturb_normal", -#endif -#ifdef GL_EXT_texture_rectangle - "GL_EXT_texture_rectangle", -#endif -#ifdef GL_EXT_texture_rg - "GL_EXT_texture_rg", -#endif -#ifdef GL_EXT_texture_sRGB - "GL_EXT_texture_sRGB", -#endif -#ifdef GL_EXT_texture_sRGB_R8 - "GL_EXT_texture_sRGB_R8", -#endif -#ifdef GL_EXT_texture_sRGB_RG8 - "GL_EXT_texture_sRGB_RG8", -#endif -#ifdef GL_EXT_texture_sRGB_decode - "GL_EXT_texture_sRGB_decode", -#endif -#ifdef GL_EXT_texture_shared_exponent - "GL_EXT_texture_shared_exponent", -#endif -#ifdef GL_EXT_texture_snorm - "GL_EXT_texture_snorm", -#endif -#ifdef GL_EXT_texture_storage - "GL_EXT_texture_storage", -#endif -#ifdef GL_EXT_texture_swizzle - "GL_EXT_texture_swizzle", -#endif -#ifdef GL_EXT_texture_type_2_10_10_10_REV - "GL_EXT_texture_type_2_10_10_10_REV", -#endif -#ifdef GL_EXT_texture_view - "GL_EXT_texture_view", -#endif -#ifdef GL_EXT_timer_query - "GL_EXT_timer_query", -#endif -#ifdef GL_EXT_transform_feedback - "GL_EXT_transform_feedback", -#endif -#ifdef GL_EXT_unpack_subimage - "GL_EXT_unpack_subimage", -#endif -#ifdef GL_EXT_vertex_array - "GL_EXT_vertex_array", -#endif -#ifdef GL_EXT_vertex_array_bgra - "GL_EXT_vertex_array_bgra", -#endif -#ifdef GL_EXT_vertex_array_setXXX - "GL_EXT_vertex_array_setXXX", -#endif -#ifdef GL_EXT_vertex_attrib_64bit - "GL_EXT_vertex_attrib_64bit", -#endif -#ifdef GL_EXT_vertex_shader - "GL_EXT_vertex_shader", -#endif -#ifdef GL_EXT_vertex_weighting - "GL_EXT_vertex_weighting", -#endif -#ifdef GL_EXT_win32_keyed_mutex - "GL_EXT_win32_keyed_mutex", -#endif -#ifdef GL_EXT_window_rectangles - "GL_EXT_window_rectangles", -#endif -#ifdef GL_EXT_x11_sync_object - "GL_EXT_x11_sync_object", -#endif -#ifdef GL_GREMEDY_frame_terminator - "GL_GREMEDY_frame_terminator", -#endif -#ifdef GL_GREMEDY_string_marker - "GL_GREMEDY_string_marker", -#endif -#ifdef GL_HP_convolution_border_modes - "GL_HP_convolution_border_modes", -#endif -#ifdef GL_HP_image_transform - "GL_HP_image_transform", -#endif -#ifdef GL_HP_occlusion_test - "GL_HP_occlusion_test", -#endif -#ifdef GL_HP_texture_lighting - "GL_HP_texture_lighting", -#endif -#ifdef GL_IBM_cull_vertex - "GL_IBM_cull_vertex", -#endif -#ifdef GL_IBM_multimode_draw_arrays - "GL_IBM_multimode_draw_arrays", -#endif -#ifdef GL_IBM_rasterpos_clip - "GL_IBM_rasterpos_clip", -#endif -#ifdef GL_IBM_static_data - "GL_IBM_static_data", -#endif -#ifdef GL_IBM_texture_mirrored_repeat - "GL_IBM_texture_mirrored_repeat", -#endif -#ifdef GL_IBM_vertex_array_lists - "GL_IBM_vertex_array_lists", -#endif -#ifdef GL_INGR_color_clamp - "GL_INGR_color_clamp", -#endif -#ifdef GL_INGR_interlace_read - "GL_INGR_interlace_read", -#endif -#ifdef GL_INTEL_conservative_rasterization - "GL_INTEL_conservative_rasterization", -#endif -#ifdef GL_INTEL_fragment_shader_ordering - "GL_INTEL_fragment_shader_ordering", -#endif -#ifdef GL_INTEL_framebuffer_CMAA - "GL_INTEL_framebuffer_CMAA", -#endif -#ifdef GL_INTEL_map_texture - "GL_INTEL_map_texture", -#endif -#ifdef GL_INTEL_parallel_arrays - "GL_INTEL_parallel_arrays", -#endif -#ifdef GL_INTEL_performance_query - "GL_INTEL_performance_query", -#endif -#ifdef GL_INTEL_texture_scissor - "GL_INTEL_texture_scissor", -#endif -#ifdef GL_KHR_blend_equation_advanced - "GL_KHR_blend_equation_advanced", -#endif -#ifdef GL_KHR_blend_equation_advanced_coherent - "GL_KHR_blend_equation_advanced_coherent", -#endif -#ifdef GL_KHR_context_flush_control - "GL_KHR_context_flush_control", -#endif -#ifdef GL_KHR_debug - "GL_KHR_debug", -#endif -#ifdef GL_KHR_no_error - "GL_KHR_no_error", -#endif -#ifdef GL_KHR_parallel_shader_compile - "GL_KHR_parallel_shader_compile", -#endif -#ifdef GL_KHR_robust_buffer_access_behavior - "GL_KHR_robust_buffer_access_behavior", -#endif -#ifdef GL_KHR_robustness - "GL_KHR_robustness", -#endif -#ifdef GL_KHR_texture_compression_astc_hdr - "GL_KHR_texture_compression_astc_hdr", -#endif -#ifdef GL_KHR_texture_compression_astc_ldr - "GL_KHR_texture_compression_astc_ldr", -#endif -#ifdef GL_KHR_texture_compression_astc_sliced_3d - "GL_KHR_texture_compression_astc_sliced_3d", -#endif -#ifdef GL_KTX_buffer_region - "GL_KTX_buffer_region", -#endif -#ifdef GL_MESAX_texture_stack - "GL_MESAX_texture_stack", -#endif -#ifdef GL_MESA_pack_invert - "GL_MESA_pack_invert", -#endif -#ifdef GL_MESA_resize_buffers - "GL_MESA_resize_buffers", -#endif -#ifdef GL_MESA_shader_integer_functions - "GL_MESA_shader_integer_functions", -#endif -#ifdef GL_MESA_window_pos - "GL_MESA_window_pos", -#endif -#ifdef GL_MESA_ycbcr_texture - "GL_MESA_ycbcr_texture", -#endif -#ifdef GL_NVX_blend_equation_advanced_multi_draw_buffers - "GL_NVX_blend_equation_advanced_multi_draw_buffers", -#endif -#ifdef GL_NVX_conditional_render - "GL_NVX_conditional_render", -#endif -#ifdef GL_NVX_gpu_memory_info - "GL_NVX_gpu_memory_info", -#endif -#ifdef GL_NVX_linked_gpu_multicast - "GL_NVX_linked_gpu_multicast", -#endif -#ifdef GL_NV_3dvision_settings - "GL_NV_3dvision_settings", -#endif -#ifdef GL_NV_EGL_stream_consumer_external - "GL_NV_EGL_stream_consumer_external", -#endif -#ifdef GL_NV_alpha_to_coverage_dither_control - "GL_NV_alpha_to_coverage_dither_control", -#endif -#ifdef GL_NV_bgr - "GL_NV_bgr", -#endif -#ifdef GL_NV_bindless_multi_draw_indirect - "GL_NV_bindless_multi_draw_indirect", -#endif -#ifdef GL_NV_bindless_multi_draw_indirect_count - "GL_NV_bindless_multi_draw_indirect_count", -#endif -#ifdef GL_NV_bindless_texture - "GL_NV_bindless_texture", -#endif -#ifdef GL_NV_blend_equation_advanced - "GL_NV_blend_equation_advanced", -#endif -#ifdef GL_NV_blend_equation_advanced_coherent - "GL_NV_blend_equation_advanced_coherent", -#endif -#ifdef GL_NV_blend_minmax_factor - "GL_NV_blend_minmax_factor", -#endif -#ifdef GL_NV_blend_square - "GL_NV_blend_square", -#endif -#ifdef GL_NV_clip_space_w_scaling - "GL_NV_clip_space_w_scaling", -#endif -#ifdef GL_NV_command_list - "GL_NV_command_list", -#endif -#ifdef GL_NV_compute_program5 - "GL_NV_compute_program5", -#endif -#ifdef GL_NV_conditional_render - "GL_NV_conditional_render", -#endif -#ifdef GL_NV_conservative_raster - "GL_NV_conservative_raster", -#endif -#ifdef GL_NV_conservative_raster_dilate - "GL_NV_conservative_raster_dilate", -#endif -#ifdef GL_NV_conservative_raster_pre_snap_triangles - "GL_NV_conservative_raster_pre_snap_triangles", -#endif -#ifdef GL_NV_copy_buffer - "GL_NV_copy_buffer", -#endif -#ifdef GL_NV_copy_depth_to_color - "GL_NV_copy_depth_to_color", -#endif -#ifdef GL_NV_copy_image - "GL_NV_copy_image", -#endif -#ifdef GL_NV_deep_texture3D - "GL_NV_deep_texture3D", -#endif -#ifdef GL_NV_depth_buffer_float - "GL_NV_depth_buffer_float", -#endif -#ifdef GL_NV_depth_clamp - "GL_NV_depth_clamp", -#endif -#ifdef GL_NV_depth_range_unclamped - "GL_NV_depth_range_unclamped", -#endif -#ifdef GL_NV_draw_buffers - "GL_NV_draw_buffers", -#endif -#ifdef GL_NV_draw_instanced - "GL_NV_draw_instanced", -#endif -#ifdef GL_NV_draw_texture - "GL_NV_draw_texture", -#endif -#ifdef GL_NV_draw_vulkan_image - "GL_NV_draw_vulkan_image", -#endif -#ifdef GL_NV_evaluators - "GL_NV_evaluators", -#endif -#ifdef GL_NV_explicit_attrib_location - "GL_NV_explicit_attrib_location", -#endif -#ifdef GL_NV_explicit_multisample - "GL_NV_explicit_multisample", -#endif -#ifdef GL_NV_fbo_color_attachments - "GL_NV_fbo_color_attachments", -#endif -#ifdef GL_NV_fence - "GL_NV_fence", -#endif -#ifdef GL_NV_fill_rectangle - "GL_NV_fill_rectangle", -#endif -#ifdef GL_NV_float_buffer - "GL_NV_float_buffer", -#endif -#ifdef GL_NV_fog_distance - "GL_NV_fog_distance", -#endif -#ifdef GL_NV_fragment_coverage_to_color - "GL_NV_fragment_coverage_to_color", -#endif -#ifdef GL_NV_fragment_program - "GL_NV_fragment_program", -#endif -#ifdef GL_NV_fragment_program2 - "GL_NV_fragment_program2", -#endif -#ifdef GL_NV_fragment_program4 - "GL_NV_fragment_program4", -#endif -#ifdef GL_NV_fragment_program_option - "GL_NV_fragment_program_option", -#endif -#ifdef GL_NV_fragment_shader_interlock - "GL_NV_fragment_shader_interlock", -#endif -#ifdef GL_NV_framebuffer_blit - "GL_NV_framebuffer_blit", -#endif -#ifdef GL_NV_framebuffer_mixed_samples - "GL_NV_framebuffer_mixed_samples", -#endif -#ifdef GL_NV_framebuffer_multisample - "GL_NV_framebuffer_multisample", -#endif -#ifdef GL_NV_framebuffer_multisample_coverage - "GL_NV_framebuffer_multisample_coverage", -#endif -#ifdef GL_NV_generate_mipmap_sRGB - "GL_NV_generate_mipmap_sRGB", -#endif -#ifdef GL_NV_geometry_program4 - "GL_NV_geometry_program4", -#endif -#ifdef GL_NV_geometry_shader4 - "GL_NV_geometry_shader4", -#endif -#ifdef GL_NV_geometry_shader_passthrough - "GL_NV_geometry_shader_passthrough", -#endif -#ifdef GL_NV_gpu_multicast - "GL_NV_gpu_multicast", -#endif -#ifdef GL_NV_gpu_program4 - "GL_NV_gpu_program4", -#endif -#ifdef GL_NV_gpu_program5 - "GL_NV_gpu_program5", -#endif -#ifdef GL_NV_gpu_program5_mem_extended - "GL_NV_gpu_program5_mem_extended", -#endif -#ifdef GL_NV_gpu_program_fp64 - "GL_NV_gpu_program_fp64", -#endif -#ifdef GL_NV_gpu_shader5 - "GL_NV_gpu_shader5", -#endif -#ifdef GL_NV_half_float - "GL_NV_half_float", -#endif -#ifdef GL_NV_image_formats - "GL_NV_image_formats", -#endif -#ifdef GL_NV_instanced_arrays - "GL_NV_instanced_arrays", -#endif -#ifdef GL_NV_internalformat_sample_query - "GL_NV_internalformat_sample_query", -#endif -#ifdef GL_NV_light_max_exponent - "GL_NV_light_max_exponent", -#endif -#ifdef GL_NV_multisample_coverage - "GL_NV_multisample_coverage", -#endif -#ifdef GL_NV_multisample_filter_hint - "GL_NV_multisample_filter_hint", -#endif -#ifdef GL_NV_non_square_matrices - "GL_NV_non_square_matrices", -#endif -#ifdef GL_NV_occlusion_query - "GL_NV_occlusion_query", -#endif -#ifdef GL_NV_pack_subimage - "GL_NV_pack_subimage", -#endif -#ifdef GL_NV_packed_depth_stencil - "GL_NV_packed_depth_stencil", -#endif -#ifdef GL_NV_packed_float - "GL_NV_packed_float", -#endif -#ifdef GL_NV_packed_float_linear - "GL_NV_packed_float_linear", -#endif -#ifdef GL_NV_parameter_buffer_object - "GL_NV_parameter_buffer_object", -#endif -#ifdef GL_NV_parameter_buffer_object2 - "GL_NV_parameter_buffer_object2", -#endif -#ifdef GL_NV_path_rendering - "GL_NV_path_rendering", -#endif -#ifdef GL_NV_path_rendering_shared_edge - "GL_NV_path_rendering_shared_edge", -#endif -#ifdef GL_NV_pixel_buffer_object - "GL_NV_pixel_buffer_object", -#endif -#ifdef GL_NV_pixel_data_range - "GL_NV_pixel_data_range", -#endif -#ifdef GL_NV_platform_binary - "GL_NV_platform_binary", -#endif -#ifdef GL_NV_point_sprite - "GL_NV_point_sprite", -#endif -#ifdef GL_NV_polygon_mode - "GL_NV_polygon_mode", -#endif -#ifdef GL_NV_present_video - "GL_NV_present_video", -#endif -#ifdef GL_NV_primitive_restart - "GL_NV_primitive_restart", -#endif -#ifdef GL_NV_read_depth - "GL_NV_read_depth", -#endif -#ifdef GL_NV_read_depth_stencil - "GL_NV_read_depth_stencil", -#endif -#ifdef GL_NV_read_stencil - "GL_NV_read_stencil", -#endif -#ifdef GL_NV_register_combiners - "GL_NV_register_combiners", -#endif -#ifdef GL_NV_register_combiners2 - "GL_NV_register_combiners2", -#endif -#ifdef GL_NV_robustness_video_memory_purge - "GL_NV_robustness_video_memory_purge", -#endif -#ifdef GL_NV_sRGB_formats - "GL_NV_sRGB_formats", -#endif -#ifdef GL_NV_sample_locations - "GL_NV_sample_locations", -#endif -#ifdef GL_NV_sample_mask_override_coverage - "GL_NV_sample_mask_override_coverage", -#endif -#ifdef GL_NV_shader_atomic_counters - "GL_NV_shader_atomic_counters", -#endif -#ifdef GL_NV_shader_atomic_float - "GL_NV_shader_atomic_float", -#endif -#ifdef GL_NV_shader_atomic_float64 - "GL_NV_shader_atomic_float64", -#endif -#ifdef GL_NV_shader_atomic_fp16_vector - "GL_NV_shader_atomic_fp16_vector", -#endif -#ifdef GL_NV_shader_atomic_int64 - "GL_NV_shader_atomic_int64", -#endif -#ifdef GL_NV_shader_buffer_load - "GL_NV_shader_buffer_load", -#endif -#ifdef GL_NV_shader_noperspective_interpolation - "GL_NV_shader_noperspective_interpolation", -#endif -#ifdef GL_NV_shader_storage_buffer_object - "GL_NV_shader_storage_buffer_object", -#endif -#ifdef GL_NV_shader_thread_group - "GL_NV_shader_thread_group", -#endif -#ifdef GL_NV_shader_thread_shuffle - "GL_NV_shader_thread_shuffle", -#endif -#ifdef GL_NV_shadow_samplers_array - "GL_NV_shadow_samplers_array", -#endif -#ifdef GL_NV_shadow_samplers_cube - "GL_NV_shadow_samplers_cube", -#endif -#ifdef GL_NV_stereo_view_rendering - "GL_NV_stereo_view_rendering", -#endif -#ifdef GL_NV_tessellation_program5 - "GL_NV_tessellation_program5", -#endif -#ifdef GL_NV_texgen_emboss - "GL_NV_texgen_emboss", -#endif -#ifdef GL_NV_texgen_reflection - "GL_NV_texgen_reflection", -#endif -#ifdef GL_NV_texture_array - "GL_NV_texture_array", -#endif -#ifdef GL_NV_texture_barrier - "GL_NV_texture_barrier", -#endif -#ifdef GL_NV_texture_border_clamp - "GL_NV_texture_border_clamp", -#endif -#ifdef GL_NV_texture_compression_latc - "GL_NV_texture_compression_latc", -#endif -#ifdef GL_NV_texture_compression_s3tc - "GL_NV_texture_compression_s3tc", -#endif -#ifdef GL_NV_texture_compression_s3tc_update - "GL_NV_texture_compression_s3tc_update", -#endif -#ifdef GL_NV_texture_compression_vtc - "GL_NV_texture_compression_vtc", -#endif -#ifdef GL_NV_texture_env_combine4 - "GL_NV_texture_env_combine4", -#endif -#ifdef GL_NV_texture_expand_normal - "GL_NV_texture_expand_normal", -#endif -#ifdef GL_NV_texture_multisample - "GL_NV_texture_multisample", -#endif -#ifdef GL_NV_texture_npot_2D_mipmap - "GL_NV_texture_npot_2D_mipmap", -#endif -#ifdef GL_NV_texture_rectangle - "GL_NV_texture_rectangle", -#endif -#ifdef GL_NV_texture_rectangle_compressed - "GL_NV_texture_rectangle_compressed", -#endif -#ifdef GL_NV_texture_shader - "GL_NV_texture_shader", -#endif -#ifdef GL_NV_texture_shader2 - "GL_NV_texture_shader2", -#endif -#ifdef GL_NV_texture_shader3 - "GL_NV_texture_shader3", -#endif -#ifdef GL_NV_transform_feedback - "GL_NV_transform_feedback", -#endif -#ifdef GL_NV_transform_feedback2 - "GL_NV_transform_feedback2", -#endif -#ifdef GL_NV_uniform_buffer_unified_memory - "GL_NV_uniform_buffer_unified_memory", -#endif -#ifdef GL_NV_vdpau_interop - "GL_NV_vdpau_interop", -#endif -#ifdef GL_NV_vertex_array_range - "GL_NV_vertex_array_range", -#endif -#ifdef GL_NV_vertex_array_range2 - "GL_NV_vertex_array_range2", -#endif -#ifdef GL_NV_vertex_attrib_integer_64bit - "GL_NV_vertex_attrib_integer_64bit", -#endif -#ifdef GL_NV_vertex_buffer_unified_memory - "GL_NV_vertex_buffer_unified_memory", -#endif -#ifdef GL_NV_vertex_program - "GL_NV_vertex_program", -#endif -#ifdef GL_NV_vertex_program1_1 - "GL_NV_vertex_program1_1", -#endif -#ifdef GL_NV_vertex_program2 - "GL_NV_vertex_program2", -#endif -#ifdef GL_NV_vertex_program2_option - "GL_NV_vertex_program2_option", -#endif -#ifdef GL_NV_vertex_program3 - "GL_NV_vertex_program3", -#endif -#ifdef GL_NV_vertex_program4 - "GL_NV_vertex_program4", -#endif -#ifdef GL_NV_video_capture - "GL_NV_video_capture", -#endif -#ifdef GL_NV_viewport_array - "GL_NV_viewport_array", -#endif -#ifdef GL_NV_viewport_array2 - "GL_NV_viewport_array2", -#endif -#ifdef GL_NV_viewport_swizzle - "GL_NV_viewport_swizzle", -#endif -#ifdef GL_OES_byte_coordinates - "GL_OES_byte_coordinates", -#endif -#ifdef GL_OML_interlace - "GL_OML_interlace", -#endif -#ifdef GL_OML_resample - "GL_OML_resample", -#endif -#ifdef GL_OML_subsample - "GL_OML_subsample", -#endif -#ifdef GL_OVR_multiview - "GL_OVR_multiview", -#endif -#ifdef GL_OVR_multiview2 - "GL_OVR_multiview2", -#endif -#ifdef GL_OVR_multiview_multisampled_render_to_texture - "GL_OVR_multiview_multisampled_render_to_texture", -#endif -#ifdef GL_PGI_misc_hints - "GL_PGI_misc_hints", -#endif -#ifdef GL_PGI_vertex_hints - "GL_PGI_vertex_hints", -#endif -#ifdef GL_QCOM_alpha_test - "GL_QCOM_alpha_test", -#endif -#ifdef GL_QCOM_binning_control - "GL_QCOM_binning_control", -#endif -#ifdef GL_QCOM_driver_control - "GL_QCOM_driver_control", -#endif -#ifdef GL_QCOM_extended_get - "GL_QCOM_extended_get", -#endif -#ifdef GL_QCOM_extended_get2 - "GL_QCOM_extended_get2", -#endif -#ifdef GL_QCOM_framebuffer_foveated - "GL_QCOM_framebuffer_foveated", -#endif -#ifdef GL_QCOM_perfmon_global_mode - "GL_QCOM_perfmon_global_mode", -#endif -#ifdef GL_QCOM_shader_framebuffer_fetch_noncoherent - "GL_QCOM_shader_framebuffer_fetch_noncoherent", -#endif -#ifdef GL_QCOM_tiled_rendering - "GL_QCOM_tiled_rendering", -#endif -#ifdef GL_QCOM_writeonly_rendering - "GL_QCOM_writeonly_rendering", -#endif -#ifdef GL_REGAL_ES1_0_compatibility - "GL_REGAL_ES1_0_compatibility", -#endif -#ifdef GL_REGAL_ES1_1_compatibility - "GL_REGAL_ES1_1_compatibility", -#endif -#ifdef GL_REGAL_enable - "GL_REGAL_enable", -#endif -#ifdef GL_REGAL_error_string - "GL_REGAL_error_string", -#endif -#ifdef GL_REGAL_extension_query - "GL_REGAL_extension_query", -#endif -#ifdef GL_REGAL_log - "GL_REGAL_log", -#endif -#ifdef GL_REGAL_proc_address - "GL_REGAL_proc_address", -#endif -#ifdef GL_REND_screen_coordinates - "GL_REND_screen_coordinates", -#endif -#ifdef GL_S3_s3tc - "GL_S3_s3tc", -#endif -#ifdef GL_SGIS_clip_band_hint - "GL_SGIS_clip_band_hint", -#endif -#ifdef GL_SGIS_color_range - "GL_SGIS_color_range", -#endif -#ifdef GL_SGIS_detail_texture - "GL_SGIS_detail_texture", -#endif -#ifdef GL_SGIS_fog_function - "GL_SGIS_fog_function", -#endif -#ifdef GL_SGIS_generate_mipmap - "GL_SGIS_generate_mipmap", -#endif -#ifdef GL_SGIS_line_texgen - "GL_SGIS_line_texgen", -#endif -#ifdef GL_SGIS_multisample - "GL_SGIS_multisample", -#endif -#ifdef GL_SGIS_multitexture - "GL_SGIS_multitexture", -#endif -#ifdef GL_SGIS_pixel_texture - "GL_SGIS_pixel_texture", -#endif -#ifdef GL_SGIS_point_line_texgen - "GL_SGIS_point_line_texgen", -#endif -#ifdef GL_SGIS_shared_multisample - "GL_SGIS_shared_multisample", -#endif -#ifdef GL_SGIS_sharpen_texture - "GL_SGIS_sharpen_texture", -#endif -#ifdef GL_SGIS_texture4D - "GL_SGIS_texture4D", -#endif -#ifdef GL_SGIS_texture_border_clamp - "GL_SGIS_texture_border_clamp", -#endif -#ifdef GL_SGIS_texture_edge_clamp - "GL_SGIS_texture_edge_clamp", -#endif -#ifdef GL_SGIS_texture_filter4 - "GL_SGIS_texture_filter4", -#endif -#ifdef GL_SGIS_texture_lod - "GL_SGIS_texture_lod", -#endif -#ifdef GL_SGIS_texture_select - "GL_SGIS_texture_select", -#endif -#ifdef GL_SGIX_async - "GL_SGIX_async", -#endif -#ifdef GL_SGIX_async_histogram - "GL_SGIX_async_histogram", -#endif -#ifdef GL_SGIX_async_pixel - "GL_SGIX_async_pixel", -#endif -#ifdef GL_SGIX_bali_g_instruments - "GL_SGIX_bali_g_instruments", -#endif -#ifdef GL_SGIX_bali_r_instruments - "GL_SGIX_bali_r_instruments", -#endif -#ifdef GL_SGIX_bali_timer_instruments - "GL_SGIX_bali_timer_instruments", -#endif -#ifdef GL_SGIX_blend_alpha_minmax - "GL_SGIX_blend_alpha_minmax", -#endif -#ifdef GL_SGIX_blend_cadd - "GL_SGIX_blend_cadd", -#endif -#ifdef GL_SGIX_blend_cmultiply - "GL_SGIX_blend_cmultiply", -#endif -#ifdef GL_SGIX_calligraphic_fragment - "GL_SGIX_calligraphic_fragment", -#endif -#ifdef GL_SGIX_clipmap - "GL_SGIX_clipmap", -#endif -#ifdef GL_SGIX_color_matrix_accuracy - "GL_SGIX_color_matrix_accuracy", -#endif -#ifdef GL_SGIX_color_table_index_mode - "GL_SGIX_color_table_index_mode", -#endif -#ifdef GL_SGIX_complex_polar - "GL_SGIX_complex_polar", -#endif -#ifdef GL_SGIX_convolution_accuracy - "GL_SGIX_convolution_accuracy", -#endif -#ifdef GL_SGIX_cube_map - "GL_SGIX_cube_map", -#endif -#ifdef GL_SGIX_cylinder_texgen - "GL_SGIX_cylinder_texgen", -#endif -#ifdef GL_SGIX_datapipe - "GL_SGIX_datapipe", -#endif -#ifdef GL_SGIX_decimation - "GL_SGIX_decimation", -#endif -#ifdef GL_SGIX_depth_pass_instrument - "GL_SGIX_depth_pass_instrument", -#endif -#ifdef GL_SGIX_depth_texture - "GL_SGIX_depth_texture", -#endif -#ifdef GL_SGIX_dvc - "GL_SGIX_dvc", -#endif -#ifdef GL_SGIX_flush_raster - "GL_SGIX_flush_raster", -#endif -#ifdef GL_SGIX_fog_blend - "GL_SGIX_fog_blend", -#endif -#ifdef GL_SGIX_fog_factor_to_alpha - "GL_SGIX_fog_factor_to_alpha", -#endif -#ifdef GL_SGIX_fog_layers - "GL_SGIX_fog_layers", -#endif -#ifdef GL_SGIX_fog_offset - "GL_SGIX_fog_offset", -#endif -#ifdef GL_SGIX_fog_patchy - "GL_SGIX_fog_patchy", -#endif -#ifdef GL_SGIX_fog_scale - "GL_SGIX_fog_scale", -#endif -#ifdef GL_SGIX_fog_texture - "GL_SGIX_fog_texture", -#endif -#ifdef GL_SGIX_fragment_lighting_space - "GL_SGIX_fragment_lighting_space", -#endif -#ifdef GL_SGIX_fragment_specular_lighting - "GL_SGIX_fragment_specular_lighting", -#endif -#ifdef GL_SGIX_fragments_instrument - "GL_SGIX_fragments_instrument", -#endif -#ifdef GL_SGIX_framezoom - "GL_SGIX_framezoom", -#endif -#ifdef GL_SGIX_icc_texture - "GL_SGIX_icc_texture", -#endif -#ifdef GL_SGIX_igloo_interface - "GL_SGIX_igloo_interface", -#endif -#ifdef GL_SGIX_image_compression - "GL_SGIX_image_compression", -#endif -#ifdef GL_SGIX_impact_pixel_texture - "GL_SGIX_impact_pixel_texture", -#endif -#ifdef GL_SGIX_instrument_error - "GL_SGIX_instrument_error", -#endif -#ifdef GL_SGIX_interlace - "GL_SGIX_interlace", -#endif -#ifdef GL_SGIX_ir_instrument1 - "GL_SGIX_ir_instrument1", -#endif -#ifdef GL_SGIX_line_quality_hint - "GL_SGIX_line_quality_hint", -#endif -#ifdef GL_SGIX_list_priority - "GL_SGIX_list_priority", -#endif -#ifdef GL_SGIX_mpeg1 - "GL_SGIX_mpeg1", -#endif -#ifdef GL_SGIX_mpeg2 - "GL_SGIX_mpeg2", -#endif -#ifdef GL_SGIX_nonlinear_lighting_pervertex - "GL_SGIX_nonlinear_lighting_pervertex", -#endif -#ifdef GL_SGIX_nurbs_eval - "GL_SGIX_nurbs_eval", -#endif -#ifdef GL_SGIX_occlusion_instrument - "GL_SGIX_occlusion_instrument", -#endif -#ifdef GL_SGIX_packed_6bytes - "GL_SGIX_packed_6bytes", -#endif -#ifdef GL_SGIX_pixel_texture - "GL_SGIX_pixel_texture", -#endif -#ifdef GL_SGIX_pixel_texture_bits - "GL_SGIX_pixel_texture_bits", -#endif -#ifdef GL_SGIX_pixel_texture_lod - "GL_SGIX_pixel_texture_lod", -#endif -#ifdef GL_SGIX_pixel_tiles - "GL_SGIX_pixel_tiles", -#endif -#ifdef GL_SGIX_polynomial_ffd - "GL_SGIX_polynomial_ffd", -#endif -#ifdef GL_SGIX_quad_mesh - "GL_SGIX_quad_mesh", -#endif -#ifdef GL_SGIX_reference_plane - "GL_SGIX_reference_plane", -#endif -#ifdef GL_SGIX_resample - "GL_SGIX_resample", -#endif -#ifdef GL_SGIX_scalebias_hint - "GL_SGIX_scalebias_hint", -#endif -#ifdef GL_SGIX_shadow - "GL_SGIX_shadow", -#endif -#ifdef GL_SGIX_shadow_ambient - "GL_SGIX_shadow_ambient", -#endif -#ifdef GL_SGIX_slim - "GL_SGIX_slim", -#endif -#ifdef GL_SGIX_spotlight_cutoff - "GL_SGIX_spotlight_cutoff", -#endif -#ifdef GL_SGIX_sprite - "GL_SGIX_sprite", -#endif -#ifdef GL_SGIX_subdiv_patch - "GL_SGIX_subdiv_patch", -#endif -#ifdef GL_SGIX_subsample - "GL_SGIX_subsample", -#endif -#ifdef GL_SGIX_tag_sample_buffer - "GL_SGIX_tag_sample_buffer", -#endif -#ifdef GL_SGIX_texture_add_env - "GL_SGIX_texture_add_env", -#endif -#ifdef GL_SGIX_texture_coordinate_clamp - "GL_SGIX_texture_coordinate_clamp", -#endif -#ifdef GL_SGIX_texture_lod_bias - "GL_SGIX_texture_lod_bias", -#endif -#ifdef GL_SGIX_texture_mipmap_anisotropic - "GL_SGIX_texture_mipmap_anisotropic", -#endif -#ifdef GL_SGIX_texture_multi_buffer - "GL_SGIX_texture_multi_buffer", -#endif -#ifdef GL_SGIX_texture_phase - "GL_SGIX_texture_phase", -#endif -#ifdef GL_SGIX_texture_range - "GL_SGIX_texture_range", -#endif -#ifdef GL_SGIX_texture_scale_bias - "GL_SGIX_texture_scale_bias", -#endif -#ifdef GL_SGIX_texture_supersample - "GL_SGIX_texture_supersample", -#endif -#ifdef GL_SGIX_vector_ops - "GL_SGIX_vector_ops", -#endif -#ifdef GL_SGIX_vertex_array_object - "GL_SGIX_vertex_array_object", -#endif -#ifdef GL_SGIX_vertex_preclip - "GL_SGIX_vertex_preclip", -#endif -#ifdef GL_SGIX_vertex_preclip_hint - "GL_SGIX_vertex_preclip_hint", -#endif -#ifdef GL_SGIX_ycrcb - "GL_SGIX_ycrcb", -#endif -#ifdef GL_SGIX_ycrcb_subsample - "GL_SGIX_ycrcb_subsample", -#endif -#ifdef GL_SGIX_ycrcba - "GL_SGIX_ycrcba", -#endif -#ifdef GL_SGI_color_matrix - "GL_SGI_color_matrix", -#endif -#ifdef GL_SGI_color_table - "GL_SGI_color_table", -#endif -#ifdef GL_SGI_complex - "GL_SGI_complex", -#endif -#ifdef GL_SGI_complex_type - "GL_SGI_complex_type", -#endif -#ifdef GL_SGI_fft - "GL_SGI_fft", -#endif -#ifdef GL_SGI_texture_color_table - "GL_SGI_texture_color_table", -#endif -#ifdef GL_SUNX_constant_data - "GL_SUNX_constant_data", -#endif -#ifdef GL_SUN_convolution_border_modes - "GL_SUN_convolution_border_modes", -#endif -#ifdef GL_SUN_global_alpha - "GL_SUN_global_alpha", -#endif -#ifdef GL_SUN_mesh_array - "GL_SUN_mesh_array", -#endif -#ifdef GL_SUN_read_video_pixels - "GL_SUN_read_video_pixels", -#endif -#ifdef GL_SUN_slice_accum - "GL_SUN_slice_accum", -#endif -#ifdef GL_SUN_triangle_list - "GL_SUN_triangle_list", -#endif -#ifdef GL_SUN_vertex - "GL_SUN_vertex", -#endif -#ifdef GL_WIN_phong_shading - "GL_WIN_phong_shading", -#endif -#ifdef GL_WIN_scene_markerXXX - "GL_WIN_scene_markerXXX", -#endif -#ifdef GL_WIN_specular_fog - "GL_WIN_specular_fog", -#endif -#ifdef GL_WIN_swap_hint - "GL_WIN_swap_hint", -#endif - NULL -}; - -/* Detected in the extension string or strings */ -static GLboolean _glewExtensionString[801]; -/* Detected via extension string or experimental mode */ -static GLboolean* _glewExtensionEnabled[] = { -#ifdef GL_VERSION_1_2 - &__GLEW_VERSION_1_2, -#endif -#ifdef GL_VERSION_1_2_1 - &__GLEW_VERSION_1_2_1, -#endif -#ifdef GL_VERSION_1_3 - &__GLEW_VERSION_1_3, -#endif -#ifdef GL_VERSION_1_4 - &__GLEW_VERSION_1_4, -#endif -#ifdef GL_VERSION_1_5 - &__GLEW_VERSION_1_5, -#endif -#ifdef GL_VERSION_2_0 - &__GLEW_VERSION_2_0, -#endif -#ifdef GL_VERSION_2_1 - &__GLEW_VERSION_2_1, -#endif -#ifdef GL_VERSION_3_0 - &__GLEW_VERSION_3_0, -#endif -#ifdef GL_VERSION_3_1 - &__GLEW_VERSION_3_1, -#endif -#ifdef GL_VERSION_3_2 - &__GLEW_VERSION_3_2, -#endif -#ifdef GL_VERSION_3_3 - &__GLEW_VERSION_3_3, -#endif -#ifdef GL_VERSION_4_0 - &__GLEW_VERSION_4_0, -#endif -#ifdef GL_VERSION_4_1 - &__GLEW_VERSION_4_1, -#endif -#ifdef GL_VERSION_4_2 - &__GLEW_VERSION_4_2, -#endif -#ifdef GL_VERSION_4_3 - &__GLEW_VERSION_4_3, -#endif -#ifdef GL_VERSION_4_4 - &__GLEW_VERSION_4_4, -#endif -#ifdef GL_VERSION_4_5 - &__GLEW_VERSION_4_5, -#endif -#ifdef GL_VERSION_4_6 - &__GLEW_VERSION_4_6, -#endif -#ifdef GL_3DFX_multisample - &__GLEW_3DFX_multisample, -#endif -#ifdef GL_3DFX_tbuffer - &__GLEW_3DFX_tbuffer, -#endif -#ifdef GL_3DFX_texture_compression_FXT1 - &__GLEW_3DFX_texture_compression_FXT1, -#endif -#ifdef GL_AMD_blend_minmax_factor - &__GLEW_AMD_blend_minmax_factor, -#endif -#ifdef GL_AMD_compressed_3DC_texture - &__GLEW_AMD_compressed_3DC_texture, -#endif -#ifdef GL_AMD_compressed_ATC_texture - &__GLEW_AMD_compressed_ATC_texture, -#endif -#ifdef GL_AMD_conservative_depth - &__GLEW_AMD_conservative_depth, -#endif -#ifdef GL_AMD_debug_output - &__GLEW_AMD_debug_output, -#endif -#ifdef GL_AMD_depth_clamp_separate - &__GLEW_AMD_depth_clamp_separate, -#endif -#ifdef GL_AMD_draw_buffers_blend - &__GLEW_AMD_draw_buffers_blend, -#endif -#ifdef GL_AMD_framebuffer_sample_positions - &__GLEW_AMD_framebuffer_sample_positions, -#endif -#ifdef GL_AMD_gcn_shader - &__GLEW_AMD_gcn_shader, -#endif -#ifdef GL_AMD_gpu_shader_half_float - &__GLEW_AMD_gpu_shader_half_float, -#endif -#ifdef GL_AMD_gpu_shader_int16 - &__GLEW_AMD_gpu_shader_int16, -#endif -#ifdef GL_AMD_gpu_shader_int64 - &__GLEW_AMD_gpu_shader_int64, -#endif -#ifdef GL_AMD_interleaved_elements - &__GLEW_AMD_interleaved_elements, -#endif -#ifdef GL_AMD_multi_draw_indirect - &__GLEW_AMD_multi_draw_indirect, -#endif -#ifdef GL_AMD_name_gen_delete - &__GLEW_AMD_name_gen_delete, -#endif -#ifdef GL_AMD_occlusion_query_event - &__GLEW_AMD_occlusion_query_event, -#endif -#ifdef GL_AMD_performance_monitor - &__GLEW_AMD_performance_monitor, -#endif -#ifdef GL_AMD_pinned_memory - &__GLEW_AMD_pinned_memory, -#endif -#ifdef GL_AMD_program_binary_Z400 - &__GLEW_AMD_program_binary_Z400, -#endif -#ifdef GL_AMD_query_buffer_object - &__GLEW_AMD_query_buffer_object, -#endif -#ifdef GL_AMD_sample_positions - &__GLEW_AMD_sample_positions, -#endif -#ifdef GL_AMD_seamless_cubemap_per_texture - &__GLEW_AMD_seamless_cubemap_per_texture, -#endif -#ifdef GL_AMD_shader_atomic_counter_ops - &__GLEW_AMD_shader_atomic_counter_ops, -#endif -#ifdef GL_AMD_shader_ballot - &__GLEW_AMD_shader_ballot, -#endif -#ifdef GL_AMD_shader_explicit_vertex_parameter - &__GLEW_AMD_shader_explicit_vertex_parameter, -#endif -#ifdef GL_AMD_shader_stencil_export - &__GLEW_AMD_shader_stencil_export, -#endif -#ifdef GL_AMD_shader_stencil_value_export - &__GLEW_AMD_shader_stencil_value_export, -#endif -#ifdef GL_AMD_shader_trinary_minmax - &__GLEW_AMD_shader_trinary_minmax, -#endif -#ifdef GL_AMD_sparse_texture - &__GLEW_AMD_sparse_texture, -#endif -#ifdef GL_AMD_stencil_operation_extended - &__GLEW_AMD_stencil_operation_extended, -#endif -#ifdef GL_AMD_texture_gather_bias_lod - &__GLEW_AMD_texture_gather_bias_lod, -#endif -#ifdef GL_AMD_texture_texture4 - &__GLEW_AMD_texture_texture4, -#endif -#ifdef GL_AMD_transform_feedback3_lines_triangles - &__GLEW_AMD_transform_feedback3_lines_triangles, -#endif -#ifdef GL_AMD_transform_feedback4 - &__GLEW_AMD_transform_feedback4, -#endif -#ifdef GL_AMD_vertex_shader_layer - &__GLEW_AMD_vertex_shader_layer, -#endif -#ifdef GL_AMD_vertex_shader_tessellator - &__GLEW_AMD_vertex_shader_tessellator, -#endif -#ifdef GL_AMD_vertex_shader_viewport_index - &__GLEW_AMD_vertex_shader_viewport_index, -#endif -#ifdef GL_ANDROID_extension_pack_es31a - &__GLEW_ANDROID_extension_pack_es31a, -#endif -#ifdef GL_ANGLE_depth_texture - &__GLEW_ANGLE_depth_texture, -#endif -#ifdef GL_ANGLE_framebuffer_blit - &__GLEW_ANGLE_framebuffer_blit, -#endif -#ifdef GL_ANGLE_framebuffer_multisample - &__GLEW_ANGLE_framebuffer_multisample, -#endif -#ifdef GL_ANGLE_instanced_arrays - &__GLEW_ANGLE_instanced_arrays, -#endif -#ifdef GL_ANGLE_pack_reverse_row_order - &__GLEW_ANGLE_pack_reverse_row_order, -#endif -#ifdef GL_ANGLE_program_binary - &__GLEW_ANGLE_program_binary, -#endif -#ifdef GL_ANGLE_texture_compression_dxt1 - &__GLEW_ANGLE_texture_compression_dxt1, -#endif -#ifdef GL_ANGLE_texture_compression_dxt3 - &__GLEW_ANGLE_texture_compression_dxt3, -#endif -#ifdef GL_ANGLE_texture_compression_dxt5 - &__GLEW_ANGLE_texture_compression_dxt5, -#endif -#ifdef GL_ANGLE_texture_usage - &__GLEW_ANGLE_texture_usage, -#endif -#ifdef GL_ANGLE_timer_query - &__GLEW_ANGLE_timer_query, -#endif -#ifdef GL_ANGLE_translated_shader_source - &__GLEW_ANGLE_translated_shader_source, -#endif -#ifdef GL_APPLE_aux_depth_stencil - &__GLEW_APPLE_aux_depth_stencil, -#endif -#ifdef GL_APPLE_client_storage - &__GLEW_APPLE_client_storage, -#endif -#ifdef GL_APPLE_clip_distance - &__GLEW_APPLE_clip_distance, -#endif -#ifdef GL_APPLE_color_buffer_packed_float - &__GLEW_APPLE_color_buffer_packed_float, -#endif -#ifdef GL_APPLE_copy_texture_levels - &__GLEW_APPLE_copy_texture_levels, -#endif -#ifdef GL_APPLE_element_array - &__GLEW_APPLE_element_array, -#endif -#ifdef GL_APPLE_fence - &__GLEW_APPLE_fence, -#endif -#ifdef GL_APPLE_float_pixels - &__GLEW_APPLE_float_pixels, -#endif -#ifdef GL_APPLE_flush_buffer_range - &__GLEW_APPLE_flush_buffer_range, -#endif -#ifdef GL_APPLE_framebuffer_multisample - &__GLEW_APPLE_framebuffer_multisample, -#endif -#ifdef GL_APPLE_object_purgeable - &__GLEW_APPLE_object_purgeable, -#endif -#ifdef GL_APPLE_pixel_buffer - &__GLEW_APPLE_pixel_buffer, -#endif -#ifdef GL_APPLE_rgb_422 - &__GLEW_APPLE_rgb_422, -#endif -#ifdef GL_APPLE_row_bytes - &__GLEW_APPLE_row_bytes, -#endif -#ifdef GL_APPLE_specular_vector - &__GLEW_APPLE_specular_vector, -#endif -#ifdef GL_APPLE_sync - &__GLEW_APPLE_sync, -#endif -#ifdef GL_APPLE_texture_2D_limited_npot - &__GLEW_APPLE_texture_2D_limited_npot, -#endif -#ifdef GL_APPLE_texture_format_BGRA8888 - &__GLEW_APPLE_texture_format_BGRA8888, -#endif -#ifdef GL_APPLE_texture_max_level - &__GLEW_APPLE_texture_max_level, -#endif -#ifdef GL_APPLE_texture_packed_float - &__GLEW_APPLE_texture_packed_float, -#endif -#ifdef GL_APPLE_texture_range - &__GLEW_APPLE_texture_range, -#endif -#ifdef GL_APPLE_transform_hint - &__GLEW_APPLE_transform_hint, -#endif -#ifdef GL_APPLE_vertex_array_object - &__GLEW_APPLE_vertex_array_object, -#endif -#ifdef GL_APPLE_vertex_array_range - &__GLEW_APPLE_vertex_array_range, -#endif -#ifdef GL_APPLE_vertex_program_evaluators - &__GLEW_APPLE_vertex_program_evaluators, -#endif -#ifdef GL_APPLE_ycbcr_422 - &__GLEW_APPLE_ycbcr_422, -#endif -#ifdef GL_ARB_ES2_compatibility - &__GLEW_ARB_ES2_compatibility, -#endif -#ifdef GL_ARB_ES3_1_compatibility - &__GLEW_ARB_ES3_1_compatibility, -#endif -#ifdef GL_ARB_ES3_2_compatibility - &__GLEW_ARB_ES3_2_compatibility, -#endif -#ifdef GL_ARB_ES3_compatibility - &__GLEW_ARB_ES3_compatibility, -#endif -#ifdef GL_ARB_arrays_of_arrays - &__GLEW_ARB_arrays_of_arrays, -#endif -#ifdef GL_ARB_base_instance - &__GLEW_ARB_base_instance, -#endif -#ifdef GL_ARB_bindless_texture - &__GLEW_ARB_bindless_texture, -#endif -#ifdef GL_ARB_blend_func_extended - &__GLEW_ARB_blend_func_extended, -#endif -#ifdef GL_ARB_buffer_storage - &__GLEW_ARB_buffer_storage, -#endif -#ifdef GL_ARB_cl_event - &__GLEW_ARB_cl_event, -#endif -#ifdef GL_ARB_clear_buffer_object - &__GLEW_ARB_clear_buffer_object, -#endif -#ifdef GL_ARB_clear_texture - &__GLEW_ARB_clear_texture, -#endif -#ifdef GL_ARB_clip_control - &__GLEW_ARB_clip_control, -#endif -#ifdef GL_ARB_color_buffer_float - &__GLEW_ARB_color_buffer_float, -#endif -#ifdef GL_ARB_compatibility - &__GLEW_ARB_compatibility, -#endif -#ifdef GL_ARB_compressed_texture_pixel_storage - &__GLEW_ARB_compressed_texture_pixel_storage, -#endif -#ifdef GL_ARB_compute_shader - &__GLEW_ARB_compute_shader, -#endif -#ifdef GL_ARB_compute_variable_group_size - &__GLEW_ARB_compute_variable_group_size, -#endif -#ifdef GL_ARB_conditional_render_inverted - &__GLEW_ARB_conditional_render_inverted, -#endif -#ifdef GL_ARB_conservative_depth - &__GLEW_ARB_conservative_depth, -#endif -#ifdef GL_ARB_copy_buffer - &__GLEW_ARB_copy_buffer, -#endif -#ifdef GL_ARB_copy_image - &__GLEW_ARB_copy_image, -#endif -#ifdef GL_ARB_cull_distance - &__GLEW_ARB_cull_distance, -#endif -#ifdef GL_ARB_debug_output - &__GLEW_ARB_debug_output, -#endif -#ifdef GL_ARB_depth_buffer_float - &__GLEW_ARB_depth_buffer_float, -#endif -#ifdef GL_ARB_depth_clamp - &__GLEW_ARB_depth_clamp, -#endif -#ifdef GL_ARB_depth_texture - &__GLEW_ARB_depth_texture, -#endif -#ifdef GL_ARB_derivative_control - &__GLEW_ARB_derivative_control, -#endif -#ifdef GL_ARB_direct_state_access - &__GLEW_ARB_direct_state_access, -#endif -#ifdef GL_ARB_draw_buffers - &__GLEW_ARB_draw_buffers, -#endif -#ifdef GL_ARB_draw_buffers_blend - &__GLEW_ARB_draw_buffers_blend, -#endif -#ifdef GL_ARB_draw_elements_base_vertex - &__GLEW_ARB_draw_elements_base_vertex, -#endif -#ifdef GL_ARB_draw_indirect - &__GLEW_ARB_draw_indirect, -#endif -#ifdef GL_ARB_draw_instanced - &__GLEW_ARB_draw_instanced, -#endif -#ifdef GL_ARB_enhanced_layouts - &__GLEW_ARB_enhanced_layouts, -#endif -#ifdef GL_ARB_explicit_attrib_location - &__GLEW_ARB_explicit_attrib_location, -#endif -#ifdef GL_ARB_explicit_uniform_location - &__GLEW_ARB_explicit_uniform_location, -#endif -#ifdef GL_ARB_fragment_coord_conventions - &__GLEW_ARB_fragment_coord_conventions, -#endif -#ifdef GL_ARB_fragment_layer_viewport - &__GLEW_ARB_fragment_layer_viewport, -#endif -#ifdef GL_ARB_fragment_program - &__GLEW_ARB_fragment_program, -#endif -#ifdef GL_ARB_fragment_program_shadow - &__GLEW_ARB_fragment_program_shadow, -#endif -#ifdef GL_ARB_fragment_shader - &__GLEW_ARB_fragment_shader, -#endif -#ifdef GL_ARB_fragment_shader_interlock - &__GLEW_ARB_fragment_shader_interlock, -#endif -#ifdef GL_ARB_framebuffer_no_attachments - &__GLEW_ARB_framebuffer_no_attachments, -#endif -#ifdef GL_ARB_framebuffer_object - &__GLEW_ARB_framebuffer_object, -#endif -#ifdef GL_ARB_framebuffer_sRGB - &__GLEW_ARB_framebuffer_sRGB, -#endif -#ifdef GL_ARB_geometry_shader4 - &__GLEW_ARB_geometry_shader4, -#endif -#ifdef GL_ARB_get_program_binary - &__GLEW_ARB_get_program_binary, -#endif -#ifdef GL_ARB_get_texture_sub_image - &__GLEW_ARB_get_texture_sub_image, -#endif -#ifdef GL_ARB_gl_spirv - &__GLEW_ARB_gl_spirv, -#endif -#ifdef GL_ARB_gpu_shader5 - &__GLEW_ARB_gpu_shader5, -#endif -#ifdef GL_ARB_gpu_shader_fp64 - &__GLEW_ARB_gpu_shader_fp64, -#endif -#ifdef GL_ARB_gpu_shader_int64 - &__GLEW_ARB_gpu_shader_int64, -#endif -#ifdef GL_ARB_half_float_pixel - &__GLEW_ARB_half_float_pixel, -#endif -#ifdef GL_ARB_half_float_vertex - &__GLEW_ARB_half_float_vertex, -#endif -#ifdef GL_ARB_imaging - &__GLEW_ARB_imaging, -#endif -#ifdef GL_ARB_indirect_parameters - &__GLEW_ARB_indirect_parameters, -#endif -#ifdef GL_ARB_instanced_arrays - &__GLEW_ARB_instanced_arrays, -#endif -#ifdef GL_ARB_internalformat_query - &__GLEW_ARB_internalformat_query, -#endif -#ifdef GL_ARB_internalformat_query2 - &__GLEW_ARB_internalformat_query2, -#endif -#ifdef GL_ARB_invalidate_subdata - &__GLEW_ARB_invalidate_subdata, -#endif -#ifdef GL_ARB_map_buffer_alignment - &__GLEW_ARB_map_buffer_alignment, -#endif -#ifdef GL_ARB_map_buffer_range - &__GLEW_ARB_map_buffer_range, -#endif -#ifdef GL_ARB_matrix_palette - &__GLEW_ARB_matrix_palette, -#endif -#ifdef GL_ARB_multi_bind - &__GLEW_ARB_multi_bind, -#endif -#ifdef GL_ARB_multi_draw_indirect - &__GLEW_ARB_multi_draw_indirect, -#endif -#ifdef GL_ARB_multisample - &__GLEW_ARB_multisample, -#endif -#ifdef GL_ARB_multitexture - &__GLEW_ARB_multitexture, -#endif -#ifdef GL_ARB_occlusion_query - &__GLEW_ARB_occlusion_query, -#endif -#ifdef GL_ARB_occlusion_query2 - &__GLEW_ARB_occlusion_query2, -#endif -#ifdef GL_ARB_parallel_shader_compile - &__GLEW_ARB_parallel_shader_compile, -#endif -#ifdef GL_ARB_pipeline_statistics_query - &__GLEW_ARB_pipeline_statistics_query, -#endif -#ifdef GL_ARB_pixel_buffer_object - &__GLEW_ARB_pixel_buffer_object, -#endif -#ifdef GL_ARB_point_parameters - &__GLEW_ARB_point_parameters, -#endif -#ifdef GL_ARB_point_sprite - &__GLEW_ARB_point_sprite, -#endif -#ifdef GL_ARB_polygon_offset_clamp - &__GLEW_ARB_polygon_offset_clamp, -#endif -#ifdef GL_ARB_post_depth_coverage - &__GLEW_ARB_post_depth_coverage, -#endif -#ifdef GL_ARB_program_interface_query - &__GLEW_ARB_program_interface_query, -#endif -#ifdef GL_ARB_provoking_vertex - &__GLEW_ARB_provoking_vertex, -#endif -#ifdef GL_ARB_query_buffer_object - &__GLEW_ARB_query_buffer_object, -#endif -#ifdef GL_ARB_robust_buffer_access_behavior - &__GLEW_ARB_robust_buffer_access_behavior, -#endif -#ifdef GL_ARB_robustness - &__GLEW_ARB_robustness, -#endif -#ifdef GL_ARB_robustness_application_isolation - &__GLEW_ARB_robustness_application_isolation, -#endif -#ifdef GL_ARB_robustness_share_group_isolation - &__GLEW_ARB_robustness_share_group_isolation, -#endif -#ifdef GL_ARB_sample_locations - &__GLEW_ARB_sample_locations, -#endif -#ifdef GL_ARB_sample_shading - &__GLEW_ARB_sample_shading, -#endif -#ifdef GL_ARB_sampler_objects - &__GLEW_ARB_sampler_objects, -#endif -#ifdef GL_ARB_seamless_cube_map - &__GLEW_ARB_seamless_cube_map, -#endif -#ifdef GL_ARB_seamless_cubemap_per_texture - &__GLEW_ARB_seamless_cubemap_per_texture, -#endif -#ifdef GL_ARB_separate_shader_objects - &__GLEW_ARB_separate_shader_objects, -#endif -#ifdef GL_ARB_shader_atomic_counter_ops - &__GLEW_ARB_shader_atomic_counter_ops, -#endif -#ifdef GL_ARB_shader_atomic_counters - &__GLEW_ARB_shader_atomic_counters, -#endif -#ifdef GL_ARB_shader_ballot - &__GLEW_ARB_shader_ballot, -#endif -#ifdef GL_ARB_shader_bit_encoding - &__GLEW_ARB_shader_bit_encoding, -#endif -#ifdef GL_ARB_shader_clock - &__GLEW_ARB_shader_clock, -#endif -#ifdef GL_ARB_shader_draw_parameters - &__GLEW_ARB_shader_draw_parameters, -#endif -#ifdef GL_ARB_shader_group_vote - &__GLEW_ARB_shader_group_vote, -#endif -#ifdef GL_ARB_shader_image_load_store - &__GLEW_ARB_shader_image_load_store, -#endif -#ifdef GL_ARB_shader_image_size - &__GLEW_ARB_shader_image_size, -#endif -#ifdef GL_ARB_shader_objects - &__GLEW_ARB_shader_objects, -#endif -#ifdef GL_ARB_shader_precision - &__GLEW_ARB_shader_precision, -#endif -#ifdef GL_ARB_shader_stencil_export - &__GLEW_ARB_shader_stencil_export, -#endif -#ifdef GL_ARB_shader_storage_buffer_object - &__GLEW_ARB_shader_storage_buffer_object, -#endif -#ifdef GL_ARB_shader_subroutine - &__GLEW_ARB_shader_subroutine, -#endif -#ifdef GL_ARB_shader_texture_image_samples - &__GLEW_ARB_shader_texture_image_samples, -#endif -#ifdef GL_ARB_shader_texture_lod - &__GLEW_ARB_shader_texture_lod, -#endif -#ifdef GL_ARB_shader_viewport_layer_array - &__GLEW_ARB_shader_viewport_layer_array, -#endif -#ifdef GL_ARB_shading_language_100 - &__GLEW_ARB_shading_language_100, -#endif -#ifdef GL_ARB_shading_language_420pack - &__GLEW_ARB_shading_language_420pack, -#endif -#ifdef GL_ARB_shading_language_include - &__GLEW_ARB_shading_language_include, -#endif -#ifdef GL_ARB_shading_language_packing - &__GLEW_ARB_shading_language_packing, -#endif -#ifdef GL_ARB_shadow - &__GLEW_ARB_shadow, -#endif -#ifdef GL_ARB_shadow_ambient - &__GLEW_ARB_shadow_ambient, -#endif -#ifdef GL_ARB_sparse_buffer - &__GLEW_ARB_sparse_buffer, -#endif -#ifdef GL_ARB_sparse_texture - &__GLEW_ARB_sparse_texture, -#endif -#ifdef GL_ARB_sparse_texture2 - &__GLEW_ARB_sparse_texture2, -#endif -#ifdef GL_ARB_sparse_texture_clamp - &__GLEW_ARB_sparse_texture_clamp, -#endif -#ifdef GL_ARB_spirv_extensions - &__GLEW_ARB_spirv_extensions, -#endif -#ifdef GL_ARB_stencil_texturing - &__GLEW_ARB_stencil_texturing, -#endif -#ifdef GL_ARB_sync - &__GLEW_ARB_sync, -#endif -#ifdef GL_ARB_tessellation_shader - &__GLEW_ARB_tessellation_shader, -#endif -#ifdef GL_ARB_texture_barrier - &__GLEW_ARB_texture_barrier, -#endif -#ifdef GL_ARB_texture_border_clamp - &__GLEW_ARB_texture_border_clamp, -#endif -#ifdef GL_ARB_texture_buffer_object - &__GLEW_ARB_texture_buffer_object, -#endif -#ifdef GL_ARB_texture_buffer_object_rgb32 - &__GLEW_ARB_texture_buffer_object_rgb32, -#endif -#ifdef GL_ARB_texture_buffer_range - &__GLEW_ARB_texture_buffer_range, -#endif -#ifdef GL_ARB_texture_compression - &__GLEW_ARB_texture_compression, -#endif -#ifdef GL_ARB_texture_compression_bptc - &__GLEW_ARB_texture_compression_bptc, -#endif -#ifdef GL_ARB_texture_compression_rgtc - &__GLEW_ARB_texture_compression_rgtc, -#endif -#ifdef GL_ARB_texture_cube_map - &__GLEW_ARB_texture_cube_map, -#endif -#ifdef GL_ARB_texture_cube_map_array - &__GLEW_ARB_texture_cube_map_array, -#endif -#ifdef GL_ARB_texture_env_add - &__GLEW_ARB_texture_env_add, -#endif -#ifdef GL_ARB_texture_env_combine - &__GLEW_ARB_texture_env_combine, -#endif -#ifdef GL_ARB_texture_env_crossbar - &__GLEW_ARB_texture_env_crossbar, -#endif -#ifdef GL_ARB_texture_env_dot3 - &__GLEW_ARB_texture_env_dot3, -#endif -#ifdef GL_ARB_texture_filter_anisotropic - &__GLEW_ARB_texture_filter_anisotropic, -#endif -#ifdef GL_ARB_texture_filter_minmax - &__GLEW_ARB_texture_filter_minmax, -#endif -#ifdef GL_ARB_texture_float - &__GLEW_ARB_texture_float, -#endif -#ifdef GL_ARB_texture_gather - &__GLEW_ARB_texture_gather, -#endif -#ifdef GL_ARB_texture_mirror_clamp_to_edge - &__GLEW_ARB_texture_mirror_clamp_to_edge, -#endif -#ifdef GL_ARB_texture_mirrored_repeat - &__GLEW_ARB_texture_mirrored_repeat, -#endif -#ifdef GL_ARB_texture_multisample - &__GLEW_ARB_texture_multisample, -#endif -#ifdef GL_ARB_texture_non_power_of_two - &__GLEW_ARB_texture_non_power_of_two, -#endif -#ifdef GL_ARB_texture_query_levels - &__GLEW_ARB_texture_query_levels, -#endif -#ifdef GL_ARB_texture_query_lod - &__GLEW_ARB_texture_query_lod, -#endif -#ifdef GL_ARB_texture_rectangle - &__GLEW_ARB_texture_rectangle, -#endif -#ifdef GL_ARB_texture_rg - &__GLEW_ARB_texture_rg, -#endif -#ifdef GL_ARB_texture_rgb10_a2ui - &__GLEW_ARB_texture_rgb10_a2ui, -#endif -#ifdef GL_ARB_texture_stencil8 - &__GLEW_ARB_texture_stencil8, -#endif -#ifdef GL_ARB_texture_storage - &__GLEW_ARB_texture_storage, -#endif -#ifdef GL_ARB_texture_storage_multisample - &__GLEW_ARB_texture_storage_multisample, -#endif -#ifdef GL_ARB_texture_swizzle - &__GLEW_ARB_texture_swizzle, -#endif -#ifdef GL_ARB_texture_view - &__GLEW_ARB_texture_view, -#endif -#ifdef GL_ARB_timer_query - &__GLEW_ARB_timer_query, -#endif -#ifdef GL_ARB_transform_feedback2 - &__GLEW_ARB_transform_feedback2, -#endif -#ifdef GL_ARB_transform_feedback3 - &__GLEW_ARB_transform_feedback3, -#endif -#ifdef GL_ARB_transform_feedback_instanced - &__GLEW_ARB_transform_feedback_instanced, -#endif -#ifdef GL_ARB_transform_feedback_overflow_query - &__GLEW_ARB_transform_feedback_overflow_query, -#endif -#ifdef GL_ARB_transpose_matrix - &__GLEW_ARB_transpose_matrix, -#endif -#ifdef GL_ARB_uniform_buffer_object - &__GLEW_ARB_uniform_buffer_object, -#endif -#ifdef GL_ARB_vertex_array_bgra - &__GLEW_ARB_vertex_array_bgra, -#endif -#ifdef GL_ARB_vertex_array_object - &__GLEW_ARB_vertex_array_object, -#endif -#ifdef GL_ARB_vertex_attrib_64bit - &__GLEW_ARB_vertex_attrib_64bit, -#endif -#ifdef GL_ARB_vertex_attrib_binding - &__GLEW_ARB_vertex_attrib_binding, -#endif -#ifdef GL_ARB_vertex_blend - &__GLEW_ARB_vertex_blend, -#endif -#ifdef GL_ARB_vertex_buffer_object - &__GLEW_ARB_vertex_buffer_object, -#endif -#ifdef GL_ARB_vertex_program - &__GLEW_ARB_vertex_program, -#endif -#ifdef GL_ARB_vertex_shader - &__GLEW_ARB_vertex_shader, -#endif -#ifdef GL_ARB_vertex_type_10f_11f_11f_rev - &__GLEW_ARB_vertex_type_10f_11f_11f_rev, -#endif -#ifdef GL_ARB_vertex_type_2_10_10_10_rev - &__GLEW_ARB_vertex_type_2_10_10_10_rev, -#endif -#ifdef GL_ARB_viewport_array - &__GLEW_ARB_viewport_array, -#endif -#ifdef GL_ARB_window_pos - &__GLEW_ARB_window_pos, -#endif -#ifdef GL_ARM_mali_program_binary - &__GLEW_ARM_mali_program_binary, -#endif -#ifdef GL_ARM_mali_shader_binary - &__GLEW_ARM_mali_shader_binary, -#endif -#ifdef GL_ARM_rgba8 - &__GLEW_ARM_rgba8, -#endif -#ifdef GL_ARM_shader_framebuffer_fetch - &__GLEW_ARM_shader_framebuffer_fetch, -#endif -#ifdef GL_ARM_shader_framebuffer_fetch_depth_stencil - &__GLEW_ARM_shader_framebuffer_fetch_depth_stencil, -#endif -#ifdef GL_ATIX_point_sprites - &__GLEW_ATIX_point_sprites, -#endif -#ifdef GL_ATIX_texture_env_combine3 - &__GLEW_ATIX_texture_env_combine3, -#endif -#ifdef GL_ATIX_texture_env_route - &__GLEW_ATIX_texture_env_route, -#endif -#ifdef GL_ATIX_vertex_shader_output_point_size - &__GLEW_ATIX_vertex_shader_output_point_size, -#endif -#ifdef GL_ATI_draw_buffers - &__GLEW_ATI_draw_buffers, -#endif -#ifdef GL_ATI_element_array - &__GLEW_ATI_element_array, -#endif -#ifdef GL_ATI_envmap_bumpmap - &__GLEW_ATI_envmap_bumpmap, -#endif -#ifdef GL_ATI_fragment_shader - &__GLEW_ATI_fragment_shader, -#endif -#ifdef GL_ATI_map_object_buffer - &__GLEW_ATI_map_object_buffer, -#endif -#ifdef GL_ATI_meminfo - &__GLEW_ATI_meminfo, -#endif -#ifdef GL_ATI_pn_triangles - &__GLEW_ATI_pn_triangles, -#endif -#ifdef GL_ATI_separate_stencil - &__GLEW_ATI_separate_stencil, -#endif -#ifdef GL_ATI_shader_texture_lod - &__GLEW_ATI_shader_texture_lod, -#endif -#ifdef GL_ATI_text_fragment_shader - &__GLEW_ATI_text_fragment_shader, -#endif -#ifdef GL_ATI_texture_compression_3dc - &__GLEW_ATI_texture_compression_3dc, -#endif -#ifdef GL_ATI_texture_env_combine3 - &__GLEW_ATI_texture_env_combine3, -#endif -#ifdef GL_ATI_texture_float - &__GLEW_ATI_texture_float, -#endif -#ifdef GL_ATI_texture_mirror_once - &__GLEW_ATI_texture_mirror_once, -#endif -#ifdef GL_ATI_vertex_array_object - &__GLEW_ATI_vertex_array_object, -#endif -#ifdef GL_ATI_vertex_attrib_array_object - &__GLEW_ATI_vertex_attrib_array_object, -#endif -#ifdef GL_ATI_vertex_streams - &__GLEW_ATI_vertex_streams, -#endif -#ifdef GL_EGL_KHR_context_flush_control - &__GLEW_EGL_KHR_context_flush_control, -#endif -#ifdef GL_EGL_NV_robustness_video_memory_purge - &__GLEW_EGL_NV_robustness_video_memory_purge, -#endif -#ifdef GL_EXT_422_pixels - &__GLEW_EXT_422_pixels, -#endif -#ifdef GL_EXT_Cg_shader - &__GLEW_EXT_Cg_shader, -#endif -#ifdef GL_EXT_EGL_image_array - &__GLEW_EXT_EGL_image_array, -#endif -#ifdef GL_EXT_YUV_target - &__GLEW_EXT_YUV_target, -#endif -#ifdef GL_EXT_abgr - &__GLEW_EXT_abgr, -#endif -#ifdef GL_EXT_base_instance - &__GLEW_EXT_base_instance, -#endif -#ifdef GL_EXT_bgra - &__GLEW_EXT_bgra, -#endif -#ifdef GL_EXT_bindable_uniform - &__GLEW_EXT_bindable_uniform, -#endif -#ifdef GL_EXT_blend_color - &__GLEW_EXT_blend_color, -#endif -#ifdef GL_EXT_blend_equation_separate - &__GLEW_EXT_blend_equation_separate, -#endif -#ifdef GL_EXT_blend_func_extended - &__GLEW_EXT_blend_func_extended, -#endif -#ifdef GL_EXT_blend_func_separate - &__GLEW_EXT_blend_func_separate, -#endif -#ifdef GL_EXT_blend_logic_op - &__GLEW_EXT_blend_logic_op, -#endif -#ifdef GL_EXT_blend_minmax - &__GLEW_EXT_blend_minmax, -#endif -#ifdef GL_EXT_blend_subtract - &__GLEW_EXT_blend_subtract, -#endif -#ifdef GL_EXT_buffer_storage - &__GLEW_EXT_buffer_storage, -#endif -#ifdef GL_EXT_clear_texture - &__GLEW_EXT_clear_texture, -#endif -#ifdef GL_EXT_clip_cull_distance - &__GLEW_EXT_clip_cull_distance, -#endif -#ifdef GL_EXT_clip_volume_hint - &__GLEW_EXT_clip_volume_hint, -#endif -#ifdef GL_EXT_cmyka - &__GLEW_EXT_cmyka, -#endif -#ifdef GL_EXT_color_buffer_float - &__GLEW_EXT_color_buffer_float, -#endif -#ifdef GL_EXT_color_buffer_half_float - &__GLEW_EXT_color_buffer_half_float, -#endif -#ifdef GL_EXT_color_subtable - &__GLEW_EXT_color_subtable, -#endif -#ifdef GL_EXT_compiled_vertex_array - &__GLEW_EXT_compiled_vertex_array, -#endif -#ifdef GL_EXT_compressed_ETC1_RGB8_sub_texture - &__GLEW_EXT_compressed_ETC1_RGB8_sub_texture, -#endif -#ifdef GL_EXT_conservative_depth - &__GLEW_EXT_conservative_depth, -#endif -#ifdef GL_EXT_convolution - &__GLEW_EXT_convolution, -#endif -#ifdef GL_EXT_coordinate_frame - &__GLEW_EXT_coordinate_frame, -#endif -#ifdef GL_EXT_copy_image - &__GLEW_EXT_copy_image, -#endif -#ifdef GL_EXT_copy_texture - &__GLEW_EXT_copy_texture, -#endif -#ifdef GL_EXT_cull_vertex - &__GLEW_EXT_cull_vertex, -#endif -#ifdef GL_EXT_debug_label - &__GLEW_EXT_debug_label, -#endif -#ifdef GL_EXT_debug_marker - &__GLEW_EXT_debug_marker, -#endif -#ifdef GL_EXT_depth_bounds_test - &__GLEW_EXT_depth_bounds_test, -#endif -#ifdef GL_EXT_direct_state_access - &__GLEW_EXT_direct_state_access, -#endif -#ifdef GL_EXT_discard_framebuffer - &__GLEW_EXT_discard_framebuffer, -#endif -#ifdef GL_EXT_draw_buffers - &__GLEW_EXT_draw_buffers, -#endif -#ifdef GL_EXT_draw_buffers2 - &__GLEW_EXT_draw_buffers2, -#endif -#ifdef GL_EXT_draw_buffers_indexed - &__GLEW_EXT_draw_buffers_indexed, -#endif -#ifdef GL_EXT_draw_elements_base_vertex - &__GLEW_EXT_draw_elements_base_vertex, -#endif -#ifdef GL_EXT_draw_instanced - &__GLEW_EXT_draw_instanced, -#endif -#ifdef GL_EXT_draw_range_elements - &__GLEW_EXT_draw_range_elements, -#endif -#ifdef GL_EXT_external_buffer - &__GLEW_EXT_external_buffer, -#endif -#ifdef GL_EXT_float_blend - &__GLEW_EXT_float_blend, -#endif -#ifdef GL_EXT_fog_coord - &__GLEW_EXT_fog_coord, -#endif -#ifdef GL_EXT_frag_depth - &__GLEW_EXT_frag_depth, -#endif -#ifdef GL_EXT_fragment_lighting - &__GLEW_EXT_fragment_lighting, -#endif -#ifdef GL_EXT_framebuffer_blit - &__GLEW_EXT_framebuffer_blit, -#endif -#ifdef GL_EXT_framebuffer_multisample - &__GLEW_EXT_framebuffer_multisample, -#endif -#ifdef GL_EXT_framebuffer_multisample_blit_scaled - &__GLEW_EXT_framebuffer_multisample_blit_scaled, -#endif -#ifdef GL_EXT_framebuffer_object - &__GLEW_EXT_framebuffer_object, -#endif -#ifdef GL_EXT_framebuffer_sRGB - &__GLEW_EXT_framebuffer_sRGB, -#endif -#ifdef GL_EXT_geometry_point_size - &__GLEW_EXT_geometry_point_size, -#endif -#ifdef GL_EXT_geometry_shader - &__GLEW_EXT_geometry_shader, -#endif -#ifdef GL_EXT_geometry_shader4 - &__GLEW_EXT_geometry_shader4, -#endif -#ifdef GL_EXT_gpu_program_parameters - &__GLEW_EXT_gpu_program_parameters, -#endif -#ifdef GL_EXT_gpu_shader4 - &__GLEW_EXT_gpu_shader4, -#endif -#ifdef GL_EXT_gpu_shader5 - &__GLEW_EXT_gpu_shader5, -#endif -#ifdef GL_EXT_histogram - &__GLEW_EXT_histogram, -#endif -#ifdef GL_EXT_index_array_formats - &__GLEW_EXT_index_array_formats, -#endif -#ifdef GL_EXT_index_func - &__GLEW_EXT_index_func, -#endif -#ifdef GL_EXT_index_material - &__GLEW_EXT_index_material, -#endif -#ifdef GL_EXT_index_texture - &__GLEW_EXT_index_texture, -#endif -#ifdef GL_EXT_instanced_arrays - &__GLEW_EXT_instanced_arrays, -#endif -#ifdef GL_EXT_light_texture - &__GLEW_EXT_light_texture, -#endif -#ifdef GL_EXT_map_buffer_range - &__GLEW_EXT_map_buffer_range, -#endif -#ifdef GL_EXT_memory_object - &__GLEW_EXT_memory_object, -#endif -#ifdef GL_EXT_memory_object_fd - &__GLEW_EXT_memory_object_fd, -#endif -#ifdef GL_EXT_memory_object_win32 - &__GLEW_EXT_memory_object_win32, -#endif -#ifdef GL_EXT_misc_attribute - &__GLEW_EXT_misc_attribute, -#endif -#ifdef GL_EXT_multi_draw_arrays - &__GLEW_EXT_multi_draw_arrays, -#endif -#ifdef GL_EXT_multi_draw_indirect - &__GLEW_EXT_multi_draw_indirect, -#endif -#ifdef GL_EXT_multiple_textures - &__GLEW_EXT_multiple_textures, -#endif -#ifdef GL_EXT_multisample - &__GLEW_EXT_multisample, -#endif -#ifdef GL_EXT_multisample_compatibility - &__GLEW_EXT_multisample_compatibility, -#endif -#ifdef GL_EXT_multisampled_render_to_texture - &__GLEW_EXT_multisampled_render_to_texture, -#endif -#ifdef GL_EXT_multisampled_render_to_texture2 - &__GLEW_EXT_multisampled_render_to_texture2, -#endif -#ifdef GL_EXT_multiview_draw_buffers - &__GLEW_EXT_multiview_draw_buffers, -#endif -#ifdef GL_EXT_packed_depth_stencil - &__GLEW_EXT_packed_depth_stencil, -#endif -#ifdef GL_EXT_packed_float - &__GLEW_EXT_packed_float, -#endif -#ifdef GL_EXT_packed_pixels - &__GLEW_EXT_packed_pixels, -#endif -#ifdef GL_EXT_paletted_texture - &__GLEW_EXT_paletted_texture, -#endif -#ifdef GL_EXT_pixel_buffer_object - &__GLEW_EXT_pixel_buffer_object, -#endif -#ifdef GL_EXT_pixel_transform - &__GLEW_EXT_pixel_transform, -#endif -#ifdef GL_EXT_pixel_transform_color_table - &__GLEW_EXT_pixel_transform_color_table, -#endif -#ifdef GL_EXT_point_parameters - &__GLEW_EXT_point_parameters, -#endif -#ifdef GL_EXT_polygon_offset - &__GLEW_EXT_polygon_offset, -#endif -#ifdef GL_EXT_polygon_offset_clamp - &__GLEW_EXT_polygon_offset_clamp, -#endif -#ifdef GL_EXT_post_depth_coverage - &__GLEW_EXT_post_depth_coverage, -#endif -#ifdef GL_EXT_provoking_vertex - &__GLEW_EXT_provoking_vertex, -#endif -#ifdef GL_EXT_pvrtc_sRGB - &__GLEW_EXT_pvrtc_sRGB, -#endif -#ifdef GL_EXT_raster_multisample - &__GLEW_EXT_raster_multisample, -#endif -#ifdef GL_EXT_read_format_bgra - &__GLEW_EXT_read_format_bgra, -#endif -#ifdef GL_EXT_render_snorm - &__GLEW_EXT_render_snorm, -#endif -#ifdef GL_EXT_rescale_normal - &__GLEW_EXT_rescale_normal, -#endif -#ifdef GL_EXT_sRGB - &__GLEW_EXT_sRGB, -#endif -#ifdef GL_EXT_sRGB_write_control - &__GLEW_EXT_sRGB_write_control, -#endif -#ifdef GL_EXT_scene_marker - &__GLEW_EXT_scene_marker, -#endif -#ifdef GL_EXT_secondary_color - &__GLEW_EXT_secondary_color, -#endif -#ifdef GL_EXT_semaphore - &__GLEW_EXT_semaphore, -#endif -#ifdef GL_EXT_semaphore_fd - &__GLEW_EXT_semaphore_fd, -#endif -#ifdef GL_EXT_semaphore_win32 - &__GLEW_EXT_semaphore_win32, -#endif -#ifdef GL_EXT_separate_shader_objects - &__GLEW_EXT_separate_shader_objects, -#endif -#ifdef GL_EXT_separate_specular_color - &__GLEW_EXT_separate_specular_color, -#endif -#ifdef GL_EXT_shader_framebuffer_fetch - &__GLEW_EXT_shader_framebuffer_fetch, -#endif -#ifdef GL_EXT_shader_group_vote - &__GLEW_EXT_shader_group_vote, -#endif -#ifdef GL_EXT_shader_image_load_formatted - &__GLEW_EXT_shader_image_load_formatted, -#endif -#ifdef GL_EXT_shader_image_load_store - &__GLEW_EXT_shader_image_load_store, -#endif -#ifdef GL_EXT_shader_implicit_conversions - &__GLEW_EXT_shader_implicit_conversions, -#endif -#ifdef GL_EXT_shader_integer_mix - &__GLEW_EXT_shader_integer_mix, -#endif -#ifdef GL_EXT_shader_io_blocks - &__GLEW_EXT_shader_io_blocks, -#endif -#ifdef GL_EXT_shader_non_constant_global_initializers - &__GLEW_EXT_shader_non_constant_global_initializers, -#endif -#ifdef GL_EXT_shader_pixel_local_storage - &__GLEW_EXT_shader_pixel_local_storage, -#endif -#ifdef GL_EXT_shader_pixel_local_storage2 - &__GLEW_EXT_shader_pixel_local_storage2, -#endif -#ifdef GL_EXT_shader_texture_lod - &__GLEW_EXT_shader_texture_lod, -#endif -#ifdef GL_EXT_shadow_funcs - &__GLEW_EXT_shadow_funcs, -#endif -#ifdef GL_EXT_shadow_samplers - &__GLEW_EXT_shadow_samplers, -#endif -#ifdef GL_EXT_shared_texture_palette - &__GLEW_EXT_shared_texture_palette, -#endif -#ifdef GL_EXT_sparse_texture - &__GLEW_EXT_sparse_texture, -#endif -#ifdef GL_EXT_sparse_texture2 - &__GLEW_EXT_sparse_texture2, -#endif -#ifdef GL_EXT_stencil_clear_tag - &__GLEW_EXT_stencil_clear_tag, -#endif -#ifdef GL_EXT_stencil_two_side - &__GLEW_EXT_stencil_two_side, -#endif -#ifdef GL_EXT_stencil_wrap - &__GLEW_EXT_stencil_wrap, -#endif -#ifdef GL_EXT_subtexture - &__GLEW_EXT_subtexture, -#endif -#ifdef GL_EXT_texture - &__GLEW_EXT_texture, -#endif -#ifdef GL_EXT_texture3D - &__GLEW_EXT_texture3D, -#endif -#ifdef GL_EXT_texture_array - &__GLEW_EXT_texture_array, -#endif -#ifdef GL_EXT_texture_buffer_object - &__GLEW_EXT_texture_buffer_object, -#endif -#ifdef GL_EXT_texture_compression_astc_decode_mode - &__GLEW_EXT_texture_compression_astc_decode_mode, -#endif -#ifdef GL_EXT_texture_compression_astc_decode_mode_rgb9e5 - &__GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5, -#endif -#ifdef GL_EXT_texture_compression_bptc - &__GLEW_EXT_texture_compression_bptc, -#endif -#ifdef GL_EXT_texture_compression_dxt1 - &__GLEW_EXT_texture_compression_dxt1, -#endif -#ifdef GL_EXT_texture_compression_latc - &__GLEW_EXT_texture_compression_latc, -#endif -#ifdef GL_EXT_texture_compression_rgtc - &__GLEW_EXT_texture_compression_rgtc, -#endif -#ifdef GL_EXT_texture_compression_s3tc - &__GLEW_EXT_texture_compression_s3tc, -#endif -#ifdef GL_EXT_texture_cube_map - &__GLEW_EXT_texture_cube_map, -#endif -#ifdef GL_EXT_texture_cube_map_array - &__GLEW_EXT_texture_cube_map_array, -#endif -#ifdef GL_EXT_texture_edge_clamp - &__GLEW_EXT_texture_edge_clamp, -#endif -#ifdef GL_EXT_texture_env - &__GLEW_EXT_texture_env, -#endif -#ifdef GL_EXT_texture_env_add - &__GLEW_EXT_texture_env_add, -#endif -#ifdef GL_EXT_texture_env_combine - &__GLEW_EXT_texture_env_combine, -#endif -#ifdef GL_EXT_texture_env_dot3 - &__GLEW_EXT_texture_env_dot3, -#endif -#ifdef GL_EXT_texture_filter_anisotropic - &__GLEW_EXT_texture_filter_anisotropic, -#endif -#ifdef GL_EXT_texture_filter_minmax - &__GLEW_EXT_texture_filter_minmax, -#endif -#ifdef GL_EXT_texture_format_BGRA8888 - &__GLEW_EXT_texture_format_BGRA8888, -#endif -#ifdef GL_EXT_texture_integer - &__GLEW_EXT_texture_integer, -#endif -#ifdef GL_EXT_texture_lod_bias - &__GLEW_EXT_texture_lod_bias, -#endif -#ifdef GL_EXT_texture_mirror_clamp - &__GLEW_EXT_texture_mirror_clamp, -#endif -#ifdef GL_EXT_texture_norm16 - &__GLEW_EXT_texture_norm16, -#endif -#ifdef GL_EXT_texture_object - &__GLEW_EXT_texture_object, -#endif -#ifdef GL_EXT_texture_perturb_normal - &__GLEW_EXT_texture_perturb_normal, -#endif -#ifdef GL_EXT_texture_rectangle - &__GLEW_EXT_texture_rectangle, -#endif -#ifdef GL_EXT_texture_rg - &__GLEW_EXT_texture_rg, -#endif -#ifdef GL_EXT_texture_sRGB - &__GLEW_EXT_texture_sRGB, -#endif -#ifdef GL_EXT_texture_sRGB_R8 - &__GLEW_EXT_texture_sRGB_R8, -#endif -#ifdef GL_EXT_texture_sRGB_RG8 - &__GLEW_EXT_texture_sRGB_RG8, -#endif -#ifdef GL_EXT_texture_sRGB_decode - &__GLEW_EXT_texture_sRGB_decode, -#endif -#ifdef GL_EXT_texture_shared_exponent - &__GLEW_EXT_texture_shared_exponent, -#endif -#ifdef GL_EXT_texture_snorm - &__GLEW_EXT_texture_snorm, -#endif -#ifdef GL_EXT_texture_storage - &__GLEW_EXT_texture_storage, -#endif -#ifdef GL_EXT_texture_swizzle - &__GLEW_EXT_texture_swizzle, -#endif -#ifdef GL_EXT_texture_type_2_10_10_10_REV - &__GLEW_EXT_texture_type_2_10_10_10_REV, -#endif -#ifdef GL_EXT_texture_view - &__GLEW_EXT_texture_view, -#endif -#ifdef GL_EXT_timer_query - &__GLEW_EXT_timer_query, -#endif -#ifdef GL_EXT_transform_feedback - &__GLEW_EXT_transform_feedback, -#endif -#ifdef GL_EXT_unpack_subimage - &__GLEW_EXT_unpack_subimage, -#endif -#ifdef GL_EXT_vertex_array - &__GLEW_EXT_vertex_array, -#endif -#ifdef GL_EXT_vertex_array_bgra - &__GLEW_EXT_vertex_array_bgra, -#endif -#ifdef GL_EXT_vertex_array_setXXX - &__GLEW_EXT_vertex_array_setXXX, -#endif -#ifdef GL_EXT_vertex_attrib_64bit - &__GLEW_EXT_vertex_attrib_64bit, -#endif -#ifdef GL_EXT_vertex_shader - &__GLEW_EXT_vertex_shader, -#endif -#ifdef GL_EXT_vertex_weighting - &__GLEW_EXT_vertex_weighting, -#endif -#ifdef GL_EXT_win32_keyed_mutex - &__GLEW_EXT_win32_keyed_mutex, -#endif -#ifdef GL_EXT_window_rectangles - &__GLEW_EXT_window_rectangles, -#endif -#ifdef GL_EXT_x11_sync_object - &__GLEW_EXT_x11_sync_object, -#endif -#ifdef GL_GREMEDY_frame_terminator - &__GLEW_GREMEDY_frame_terminator, -#endif -#ifdef GL_GREMEDY_string_marker - &__GLEW_GREMEDY_string_marker, -#endif -#ifdef GL_HP_convolution_border_modes - &__GLEW_HP_convolution_border_modes, -#endif -#ifdef GL_HP_image_transform - &__GLEW_HP_image_transform, -#endif -#ifdef GL_HP_occlusion_test - &__GLEW_HP_occlusion_test, -#endif -#ifdef GL_HP_texture_lighting - &__GLEW_HP_texture_lighting, -#endif -#ifdef GL_IBM_cull_vertex - &__GLEW_IBM_cull_vertex, -#endif -#ifdef GL_IBM_multimode_draw_arrays - &__GLEW_IBM_multimode_draw_arrays, -#endif -#ifdef GL_IBM_rasterpos_clip - &__GLEW_IBM_rasterpos_clip, -#endif -#ifdef GL_IBM_static_data - &__GLEW_IBM_static_data, -#endif -#ifdef GL_IBM_texture_mirrored_repeat - &__GLEW_IBM_texture_mirrored_repeat, -#endif -#ifdef GL_IBM_vertex_array_lists - &__GLEW_IBM_vertex_array_lists, -#endif -#ifdef GL_INGR_color_clamp - &__GLEW_INGR_color_clamp, -#endif -#ifdef GL_INGR_interlace_read - &__GLEW_INGR_interlace_read, -#endif -#ifdef GL_INTEL_conservative_rasterization - &__GLEW_INTEL_conservative_rasterization, -#endif -#ifdef GL_INTEL_fragment_shader_ordering - &__GLEW_INTEL_fragment_shader_ordering, -#endif -#ifdef GL_INTEL_framebuffer_CMAA - &__GLEW_INTEL_framebuffer_CMAA, -#endif -#ifdef GL_INTEL_map_texture - &__GLEW_INTEL_map_texture, -#endif -#ifdef GL_INTEL_parallel_arrays - &__GLEW_INTEL_parallel_arrays, -#endif -#ifdef GL_INTEL_performance_query - &__GLEW_INTEL_performance_query, -#endif -#ifdef GL_INTEL_texture_scissor - &__GLEW_INTEL_texture_scissor, -#endif -#ifdef GL_KHR_blend_equation_advanced - &__GLEW_KHR_blend_equation_advanced, -#endif -#ifdef GL_KHR_blend_equation_advanced_coherent - &__GLEW_KHR_blend_equation_advanced_coherent, -#endif -#ifdef GL_KHR_context_flush_control - &__GLEW_KHR_context_flush_control, -#endif -#ifdef GL_KHR_debug - &__GLEW_KHR_debug, -#endif -#ifdef GL_KHR_no_error - &__GLEW_KHR_no_error, -#endif -#ifdef GL_KHR_parallel_shader_compile - &__GLEW_KHR_parallel_shader_compile, -#endif -#ifdef GL_KHR_robust_buffer_access_behavior - &__GLEW_KHR_robust_buffer_access_behavior, -#endif -#ifdef GL_KHR_robustness - &__GLEW_KHR_robustness, -#endif -#ifdef GL_KHR_texture_compression_astc_hdr - &__GLEW_KHR_texture_compression_astc_hdr, -#endif -#ifdef GL_KHR_texture_compression_astc_ldr - &__GLEW_KHR_texture_compression_astc_ldr, -#endif -#ifdef GL_KHR_texture_compression_astc_sliced_3d - &__GLEW_KHR_texture_compression_astc_sliced_3d, -#endif -#ifdef GL_KTX_buffer_region - &__GLEW_KTX_buffer_region, -#endif -#ifdef GL_MESAX_texture_stack - &__GLEW_MESAX_texture_stack, -#endif -#ifdef GL_MESA_pack_invert - &__GLEW_MESA_pack_invert, -#endif -#ifdef GL_MESA_resize_buffers - &__GLEW_MESA_resize_buffers, -#endif -#ifdef GL_MESA_shader_integer_functions - &__GLEW_MESA_shader_integer_functions, -#endif -#ifdef GL_MESA_window_pos - &__GLEW_MESA_window_pos, -#endif -#ifdef GL_MESA_ycbcr_texture - &__GLEW_MESA_ycbcr_texture, -#endif -#ifdef GL_NVX_blend_equation_advanced_multi_draw_buffers - &__GLEW_NVX_blend_equation_advanced_multi_draw_buffers, -#endif -#ifdef GL_NVX_conditional_render - &__GLEW_NVX_conditional_render, -#endif -#ifdef GL_NVX_gpu_memory_info - &__GLEW_NVX_gpu_memory_info, -#endif -#ifdef GL_NVX_linked_gpu_multicast - &__GLEW_NVX_linked_gpu_multicast, -#endif -#ifdef GL_NV_3dvision_settings - &__GLEW_NV_3dvision_settings, -#endif -#ifdef GL_NV_EGL_stream_consumer_external - &__GLEW_NV_EGL_stream_consumer_external, -#endif -#ifdef GL_NV_alpha_to_coverage_dither_control - &__GLEW_NV_alpha_to_coverage_dither_control, -#endif -#ifdef GL_NV_bgr - &__GLEW_NV_bgr, -#endif -#ifdef GL_NV_bindless_multi_draw_indirect - &__GLEW_NV_bindless_multi_draw_indirect, -#endif -#ifdef GL_NV_bindless_multi_draw_indirect_count - &__GLEW_NV_bindless_multi_draw_indirect_count, -#endif -#ifdef GL_NV_bindless_texture - &__GLEW_NV_bindless_texture, -#endif -#ifdef GL_NV_blend_equation_advanced - &__GLEW_NV_blend_equation_advanced, -#endif -#ifdef GL_NV_blend_equation_advanced_coherent - &__GLEW_NV_blend_equation_advanced_coherent, -#endif -#ifdef GL_NV_blend_minmax_factor - &__GLEW_NV_blend_minmax_factor, -#endif -#ifdef GL_NV_blend_square - &__GLEW_NV_blend_square, -#endif -#ifdef GL_NV_clip_space_w_scaling - &__GLEW_NV_clip_space_w_scaling, -#endif -#ifdef GL_NV_command_list - &__GLEW_NV_command_list, -#endif -#ifdef GL_NV_compute_program5 - &__GLEW_NV_compute_program5, -#endif -#ifdef GL_NV_conditional_render - &__GLEW_NV_conditional_render, -#endif -#ifdef GL_NV_conservative_raster - &__GLEW_NV_conservative_raster, -#endif -#ifdef GL_NV_conservative_raster_dilate - &__GLEW_NV_conservative_raster_dilate, -#endif -#ifdef GL_NV_conservative_raster_pre_snap_triangles - &__GLEW_NV_conservative_raster_pre_snap_triangles, -#endif -#ifdef GL_NV_copy_buffer - &__GLEW_NV_copy_buffer, -#endif -#ifdef GL_NV_copy_depth_to_color - &__GLEW_NV_copy_depth_to_color, -#endif -#ifdef GL_NV_copy_image - &__GLEW_NV_copy_image, -#endif -#ifdef GL_NV_deep_texture3D - &__GLEW_NV_deep_texture3D, -#endif -#ifdef GL_NV_depth_buffer_float - &__GLEW_NV_depth_buffer_float, -#endif -#ifdef GL_NV_depth_clamp - &__GLEW_NV_depth_clamp, -#endif -#ifdef GL_NV_depth_range_unclamped - &__GLEW_NV_depth_range_unclamped, -#endif -#ifdef GL_NV_draw_buffers - &__GLEW_NV_draw_buffers, -#endif -#ifdef GL_NV_draw_instanced - &__GLEW_NV_draw_instanced, -#endif -#ifdef GL_NV_draw_texture - &__GLEW_NV_draw_texture, -#endif -#ifdef GL_NV_draw_vulkan_image - &__GLEW_NV_draw_vulkan_image, -#endif -#ifdef GL_NV_evaluators - &__GLEW_NV_evaluators, -#endif -#ifdef GL_NV_explicit_attrib_location - &__GLEW_NV_explicit_attrib_location, -#endif -#ifdef GL_NV_explicit_multisample - &__GLEW_NV_explicit_multisample, -#endif -#ifdef GL_NV_fbo_color_attachments - &__GLEW_NV_fbo_color_attachments, -#endif -#ifdef GL_NV_fence - &__GLEW_NV_fence, -#endif -#ifdef GL_NV_fill_rectangle - &__GLEW_NV_fill_rectangle, -#endif -#ifdef GL_NV_float_buffer - &__GLEW_NV_float_buffer, -#endif -#ifdef GL_NV_fog_distance - &__GLEW_NV_fog_distance, -#endif -#ifdef GL_NV_fragment_coverage_to_color - &__GLEW_NV_fragment_coverage_to_color, -#endif -#ifdef GL_NV_fragment_program - &__GLEW_NV_fragment_program, -#endif -#ifdef GL_NV_fragment_program2 - &__GLEW_NV_fragment_program2, -#endif -#ifdef GL_NV_fragment_program4 - &__GLEW_NV_fragment_program4, -#endif -#ifdef GL_NV_fragment_program_option - &__GLEW_NV_fragment_program_option, -#endif -#ifdef GL_NV_fragment_shader_interlock - &__GLEW_NV_fragment_shader_interlock, -#endif -#ifdef GL_NV_framebuffer_blit - &__GLEW_NV_framebuffer_blit, -#endif -#ifdef GL_NV_framebuffer_mixed_samples - &__GLEW_NV_framebuffer_mixed_samples, -#endif -#ifdef GL_NV_framebuffer_multisample - &__GLEW_NV_framebuffer_multisample, -#endif -#ifdef GL_NV_framebuffer_multisample_coverage - &__GLEW_NV_framebuffer_multisample_coverage, -#endif -#ifdef GL_NV_generate_mipmap_sRGB - &__GLEW_NV_generate_mipmap_sRGB, -#endif -#ifdef GL_NV_geometry_program4 - &__GLEW_NV_geometry_program4, -#endif -#ifdef GL_NV_geometry_shader4 - &__GLEW_NV_geometry_shader4, -#endif -#ifdef GL_NV_geometry_shader_passthrough - &__GLEW_NV_geometry_shader_passthrough, -#endif -#ifdef GL_NV_gpu_multicast - &__GLEW_NV_gpu_multicast, -#endif -#ifdef GL_NV_gpu_program4 - &__GLEW_NV_gpu_program4, -#endif -#ifdef GL_NV_gpu_program5 - &__GLEW_NV_gpu_program5, -#endif -#ifdef GL_NV_gpu_program5_mem_extended - &__GLEW_NV_gpu_program5_mem_extended, -#endif -#ifdef GL_NV_gpu_program_fp64 - &__GLEW_NV_gpu_program_fp64, -#endif -#ifdef GL_NV_gpu_shader5 - &__GLEW_NV_gpu_shader5, -#endif -#ifdef GL_NV_half_float - &__GLEW_NV_half_float, -#endif -#ifdef GL_NV_image_formats - &__GLEW_NV_image_formats, -#endif -#ifdef GL_NV_instanced_arrays - &__GLEW_NV_instanced_arrays, -#endif -#ifdef GL_NV_internalformat_sample_query - &__GLEW_NV_internalformat_sample_query, -#endif -#ifdef GL_NV_light_max_exponent - &__GLEW_NV_light_max_exponent, -#endif -#ifdef GL_NV_multisample_coverage - &__GLEW_NV_multisample_coverage, -#endif -#ifdef GL_NV_multisample_filter_hint - &__GLEW_NV_multisample_filter_hint, -#endif -#ifdef GL_NV_non_square_matrices - &__GLEW_NV_non_square_matrices, -#endif -#ifdef GL_NV_occlusion_query - &__GLEW_NV_occlusion_query, -#endif -#ifdef GL_NV_pack_subimage - &__GLEW_NV_pack_subimage, -#endif -#ifdef GL_NV_packed_depth_stencil - &__GLEW_NV_packed_depth_stencil, -#endif -#ifdef GL_NV_packed_float - &__GLEW_NV_packed_float, -#endif -#ifdef GL_NV_packed_float_linear - &__GLEW_NV_packed_float_linear, -#endif -#ifdef GL_NV_parameter_buffer_object - &__GLEW_NV_parameter_buffer_object, -#endif -#ifdef GL_NV_parameter_buffer_object2 - &__GLEW_NV_parameter_buffer_object2, -#endif -#ifdef GL_NV_path_rendering - &__GLEW_NV_path_rendering, -#endif -#ifdef GL_NV_path_rendering_shared_edge - &__GLEW_NV_path_rendering_shared_edge, -#endif -#ifdef GL_NV_pixel_buffer_object - &__GLEW_NV_pixel_buffer_object, -#endif -#ifdef GL_NV_pixel_data_range - &__GLEW_NV_pixel_data_range, -#endif -#ifdef GL_NV_platform_binary - &__GLEW_NV_platform_binary, -#endif -#ifdef GL_NV_point_sprite - &__GLEW_NV_point_sprite, -#endif -#ifdef GL_NV_polygon_mode - &__GLEW_NV_polygon_mode, -#endif -#ifdef GL_NV_present_video - &__GLEW_NV_present_video, -#endif -#ifdef GL_NV_primitive_restart - &__GLEW_NV_primitive_restart, -#endif -#ifdef GL_NV_read_depth - &__GLEW_NV_read_depth, -#endif -#ifdef GL_NV_read_depth_stencil - &__GLEW_NV_read_depth_stencil, -#endif -#ifdef GL_NV_read_stencil - &__GLEW_NV_read_stencil, -#endif -#ifdef GL_NV_register_combiners - &__GLEW_NV_register_combiners, -#endif -#ifdef GL_NV_register_combiners2 - &__GLEW_NV_register_combiners2, -#endif -#ifdef GL_NV_robustness_video_memory_purge - &__GLEW_NV_robustness_video_memory_purge, -#endif -#ifdef GL_NV_sRGB_formats - &__GLEW_NV_sRGB_formats, -#endif -#ifdef GL_NV_sample_locations - &__GLEW_NV_sample_locations, -#endif -#ifdef GL_NV_sample_mask_override_coverage - &__GLEW_NV_sample_mask_override_coverage, -#endif -#ifdef GL_NV_shader_atomic_counters - &__GLEW_NV_shader_atomic_counters, -#endif -#ifdef GL_NV_shader_atomic_float - &__GLEW_NV_shader_atomic_float, -#endif -#ifdef GL_NV_shader_atomic_float64 - &__GLEW_NV_shader_atomic_float64, -#endif -#ifdef GL_NV_shader_atomic_fp16_vector - &__GLEW_NV_shader_atomic_fp16_vector, -#endif -#ifdef GL_NV_shader_atomic_int64 - &__GLEW_NV_shader_atomic_int64, -#endif -#ifdef GL_NV_shader_buffer_load - &__GLEW_NV_shader_buffer_load, -#endif -#ifdef GL_NV_shader_noperspective_interpolation - &__GLEW_NV_shader_noperspective_interpolation, -#endif -#ifdef GL_NV_shader_storage_buffer_object - &__GLEW_NV_shader_storage_buffer_object, -#endif -#ifdef GL_NV_shader_thread_group - &__GLEW_NV_shader_thread_group, -#endif -#ifdef GL_NV_shader_thread_shuffle - &__GLEW_NV_shader_thread_shuffle, -#endif -#ifdef GL_NV_shadow_samplers_array - &__GLEW_NV_shadow_samplers_array, -#endif -#ifdef GL_NV_shadow_samplers_cube - &__GLEW_NV_shadow_samplers_cube, -#endif -#ifdef GL_NV_stereo_view_rendering - &__GLEW_NV_stereo_view_rendering, -#endif -#ifdef GL_NV_tessellation_program5 - &__GLEW_NV_tessellation_program5, -#endif -#ifdef GL_NV_texgen_emboss - &__GLEW_NV_texgen_emboss, -#endif -#ifdef GL_NV_texgen_reflection - &__GLEW_NV_texgen_reflection, -#endif -#ifdef GL_NV_texture_array - &__GLEW_NV_texture_array, -#endif -#ifdef GL_NV_texture_barrier - &__GLEW_NV_texture_barrier, -#endif -#ifdef GL_NV_texture_border_clamp - &__GLEW_NV_texture_border_clamp, -#endif -#ifdef GL_NV_texture_compression_latc - &__GLEW_NV_texture_compression_latc, -#endif -#ifdef GL_NV_texture_compression_s3tc - &__GLEW_NV_texture_compression_s3tc, -#endif -#ifdef GL_NV_texture_compression_s3tc_update - &__GLEW_NV_texture_compression_s3tc_update, -#endif -#ifdef GL_NV_texture_compression_vtc - &__GLEW_NV_texture_compression_vtc, -#endif -#ifdef GL_NV_texture_env_combine4 - &__GLEW_NV_texture_env_combine4, -#endif -#ifdef GL_NV_texture_expand_normal - &__GLEW_NV_texture_expand_normal, -#endif -#ifdef GL_NV_texture_multisample - &__GLEW_NV_texture_multisample, -#endif -#ifdef GL_NV_texture_npot_2D_mipmap - &__GLEW_NV_texture_npot_2D_mipmap, -#endif -#ifdef GL_NV_texture_rectangle - &__GLEW_NV_texture_rectangle, -#endif -#ifdef GL_NV_texture_rectangle_compressed - &__GLEW_NV_texture_rectangle_compressed, -#endif -#ifdef GL_NV_texture_shader - &__GLEW_NV_texture_shader, -#endif -#ifdef GL_NV_texture_shader2 - &__GLEW_NV_texture_shader2, -#endif -#ifdef GL_NV_texture_shader3 - &__GLEW_NV_texture_shader3, -#endif -#ifdef GL_NV_transform_feedback - &__GLEW_NV_transform_feedback, -#endif -#ifdef GL_NV_transform_feedback2 - &__GLEW_NV_transform_feedback2, -#endif -#ifdef GL_NV_uniform_buffer_unified_memory - &__GLEW_NV_uniform_buffer_unified_memory, -#endif -#ifdef GL_NV_vdpau_interop - &__GLEW_NV_vdpau_interop, -#endif -#ifdef GL_NV_vertex_array_range - &__GLEW_NV_vertex_array_range, -#endif -#ifdef GL_NV_vertex_array_range2 - &__GLEW_NV_vertex_array_range2, -#endif -#ifdef GL_NV_vertex_attrib_integer_64bit - &__GLEW_NV_vertex_attrib_integer_64bit, -#endif -#ifdef GL_NV_vertex_buffer_unified_memory - &__GLEW_NV_vertex_buffer_unified_memory, -#endif -#ifdef GL_NV_vertex_program - &__GLEW_NV_vertex_program, -#endif -#ifdef GL_NV_vertex_program1_1 - &__GLEW_NV_vertex_program1_1, -#endif -#ifdef GL_NV_vertex_program2 - &__GLEW_NV_vertex_program2, -#endif -#ifdef GL_NV_vertex_program2_option - &__GLEW_NV_vertex_program2_option, -#endif -#ifdef GL_NV_vertex_program3 - &__GLEW_NV_vertex_program3, -#endif -#ifdef GL_NV_vertex_program4 - &__GLEW_NV_vertex_program4, -#endif -#ifdef GL_NV_video_capture - &__GLEW_NV_video_capture, -#endif -#ifdef GL_NV_viewport_array - &__GLEW_NV_viewport_array, -#endif -#ifdef GL_NV_viewport_array2 - &__GLEW_NV_viewport_array2, -#endif -#ifdef GL_NV_viewport_swizzle - &__GLEW_NV_viewport_swizzle, -#endif -#ifdef GL_OES_byte_coordinates - &__GLEW_OES_byte_coordinates, -#endif -#ifdef GL_OML_interlace - &__GLEW_OML_interlace, -#endif -#ifdef GL_OML_resample - &__GLEW_OML_resample, -#endif -#ifdef GL_OML_subsample - &__GLEW_OML_subsample, -#endif -#ifdef GL_OVR_multiview - &__GLEW_OVR_multiview, -#endif -#ifdef GL_OVR_multiview2 - &__GLEW_OVR_multiview2, -#endif -#ifdef GL_OVR_multiview_multisampled_render_to_texture - &__GLEW_OVR_multiview_multisampled_render_to_texture, -#endif -#ifdef GL_PGI_misc_hints - &__GLEW_PGI_misc_hints, -#endif -#ifdef GL_PGI_vertex_hints - &__GLEW_PGI_vertex_hints, -#endif -#ifdef GL_QCOM_alpha_test - &__GLEW_QCOM_alpha_test, -#endif -#ifdef GL_QCOM_binning_control - &__GLEW_QCOM_binning_control, -#endif -#ifdef GL_QCOM_driver_control - &__GLEW_QCOM_driver_control, -#endif -#ifdef GL_QCOM_extended_get - &__GLEW_QCOM_extended_get, -#endif -#ifdef GL_QCOM_extended_get2 - &__GLEW_QCOM_extended_get2, -#endif -#ifdef GL_QCOM_framebuffer_foveated - &__GLEW_QCOM_framebuffer_foveated, -#endif -#ifdef GL_QCOM_perfmon_global_mode - &__GLEW_QCOM_perfmon_global_mode, -#endif -#ifdef GL_QCOM_shader_framebuffer_fetch_noncoherent - &__GLEW_QCOM_shader_framebuffer_fetch_noncoherent, -#endif -#ifdef GL_QCOM_tiled_rendering - &__GLEW_QCOM_tiled_rendering, -#endif -#ifdef GL_QCOM_writeonly_rendering - &__GLEW_QCOM_writeonly_rendering, -#endif -#ifdef GL_REGAL_ES1_0_compatibility - &__GLEW_REGAL_ES1_0_compatibility, -#endif -#ifdef GL_REGAL_ES1_1_compatibility - &__GLEW_REGAL_ES1_1_compatibility, -#endif -#ifdef GL_REGAL_enable - &__GLEW_REGAL_enable, -#endif -#ifdef GL_REGAL_error_string - &__GLEW_REGAL_error_string, -#endif -#ifdef GL_REGAL_extension_query - &__GLEW_REGAL_extension_query, -#endif -#ifdef GL_REGAL_log - &__GLEW_REGAL_log, -#endif -#ifdef GL_REGAL_proc_address - &__GLEW_REGAL_proc_address, -#endif -#ifdef GL_REND_screen_coordinates - &__GLEW_REND_screen_coordinates, -#endif -#ifdef GL_S3_s3tc - &__GLEW_S3_s3tc, -#endif -#ifdef GL_SGIS_clip_band_hint - &__GLEW_SGIS_clip_band_hint, -#endif -#ifdef GL_SGIS_color_range - &__GLEW_SGIS_color_range, -#endif -#ifdef GL_SGIS_detail_texture - &__GLEW_SGIS_detail_texture, -#endif -#ifdef GL_SGIS_fog_function - &__GLEW_SGIS_fog_function, -#endif -#ifdef GL_SGIS_generate_mipmap - &__GLEW_SGIS_generate_mipmap, -#endif -#ifdef GL_SGIS_line_texgen - &__GLEW_SGIS_line_texgen, -#endif -#ifdef GL_SGIS_multisample - &__GLEW_SGIS_multisample, -#endif -#ifdef GL_SGIS_multitexture - &__GLEW_SGIS_multitexture, -#endif -#ifdef GL_SGIS_pixel_texture - &__GLEW_SGIS_pixel_texture, -#endif -#ifdef GL_SGIS_point_line_texgen - &__GLEW_SGIS_point_line_texgen, -#endif -#ifdef GL_SGIS_shared_multisample - &__GLEW_SGIS_shared_multisample, -#endif -#ifdef GL_SGIS_sharpen_texture - &__GLEW_SGIS_sharpen_texture, -#endif -#ifdef GL_SGIS_texture4D - &__GLEW_SGIS_texture4D, -#endif -#ifdef GL_SGIS_texture_border_clamp - &__GLEW_SGIS_texture_border_clamp, -#endif -#ifdef GL_SGIS_texture_edge_clamp - &__GLEW_SGIS_texture_edge_clamp, -#endif -#ifdef GL_SGIS_texture_filter4 - &__GLEW_SGIS_texture_filter4, -#endif -#ifdef GL_SGIS_texture_lod - &__GLEW_SGIS_texture_lod, -#endif -#ifdef GL_SGIS_texture_select - &__GLEW_SGIS_texture_select, -#endif -#ifdef GL_SGIX_async - &__GLEW_SGIX_async, -#endif -#ifdef GL_SGIX_async_histogram - &__GLEW_SGIX_async_histogram, -#endif -#ifdef GL_SGIX_async_pixel - &__GLEW_SGIX_async_pixel, -#endif -#ifdef GL_SGIX_bali_g_instruments - &__GLEW_SGIX_bali_g_instruments, -#endif -#ifdef GL_SGIX_bali_r_instruments - &__GLEW_SGIX_bali_r_instruments, -#endif -#ifdef GL_SGIX_bali_timer_instruments - &__GLEW_SGIX_bali_timer_instruments, -#endif -#ifdef GL_SGIX_blend_alpha_minmax - &__GLEW_SGIX_blend_alpha_minmax, -#endif -#ifdef GL_SGIX_blend_cadd - &__GLEW_SGIX_blend_cadd, -#endif -#ifdef GL_SGIX_blend_cmultiply - &__GLEW_SGIX_blend_cmultiply, -#endif -#ifdef GL_SGIX_calligraphic_fragment - &__GLEW_SGIX_calligraphic_fragment, -#endif -#ifdef GL_SGIX_clipmap - &__GLEW_SGIX_clipmap, -#endif -#ifdef GL_SGIX_color_matrix_accuracy - &__GLEW_SGIX_color_matrix_accuracy, -#endif -#ifdef GL_SGIX_color_table_index_mode - &__GLEW_SGIX_color_table_index_mode, -#endif -#ifdef GL_SGIX_complex_polar - &__GLEW_SGIX_complex_polar, -#endif -#ifdef GL_SGIX_convolution_accuracy - &__GLEW_SGIX_convolution_accuracy, -#endif -#ifdef GL_SGIX_cube_map - &__GLEW_SGIX_cube_map, -#endif -#ifdef GL_SGIX_cylinder_texgen - &__GLEW_SGIX_cylinder_texgen, -#endif -#ifdef GL_SGIX_datapipe - &__GLEW_SGIX_datapipe, -#endif -#ifdef GL_SGIX_decimation - &__GLEW_SGIX_decimation, -#endif -#ifdef GL_SGIX_depth_pass_instrument - &__GLEW_SGIX_depth_pass_instrument, -#endif -#ifdef GL_SGIX_depth_texture - &__GLEW_SGIX_depth_texture, -#endif -#ifdef GL_SGIX_dvc - &__GLEW_SGIX_dvc, -#endif -#ifdef GL_SGIX_flush_raster - &__GLEW_SGIX_flush_raster, -#endif -#ifdef GL_SGIX_fog_blend - &__GLEW_SGIX_fog_blend, -#endif -#ifdef GL_SGIX_fog_factor_to_alpha - &__GLEW_SGIX_fog_factor_to_alpha, -#endif -#ifdef GL_SGIX_fog_layers - &__GLEW_SGIX_fog_layers, -#endif -#ifdef GL_SGIX_fog_offset - &__GLEW_SGIX_fog_offset, -#endif -#ifdef GL_SGIX_fog_patchy - &__GLEW_SGIX_fog_patchy, -#endif -#ifdef GL_SGIX_fog_scale - &__GLEW_SGIX_fog_scale, -#endif -#ifdef GL_SGIX_fog_texture - &__GLEW_SGIX_fog_texture, -#endif -#ifdef GL_SGIX_fragment_lighting_space - &__GLEW_SGIX_fragment_lighting_space, -#endif -#ifdef GL_SGIX_fragment_specular_lighting - &__GLEW_SGIX_fragment_specular_lighting, -#endif -#ifdef GL_SGIX_fragments_instrument - &__GLEW_SGIX_fragments_instrument, -#endif -#ifdef GL_SGIX_framezoom - &__GLEW_SGIX_framezoom, -#endif -#ifdef GL_SGIX_icc_texture - &__GLEW_SGIX_icc_texture, -#endif -#ifdef GL_SGIX_igloo_interface - &__GLEW_SGIX_igloo_interface, -#endif -#ifdef GL_SGIX_image_compression - &__GLEW_SGIX_image_compression, -#endif -#ifdef GL_SGIX_impact_pixel_texture - &__GLEW_SGIX_impact_pixel_texture, -#endif -#ifdef GL_SGIX_instrument_error - &__GLEW_SGIX_instrument_error, -#endif -#ifdef GL_SGIX_interlace - &__GLEW_SGIX_interlace, -#endif -#ifdef GL_SGIX_ir_instrument1 - &__GLEW_SGIX_ir_instrument1, -#endif -#ifdef GL_SGIX_line_quality_hint - &__GLEW_SGIX_line_quality_hint, -#endif -#ifdef GL_SGIX_list_priority - &__GLEW_SGIX_list_priority, -#endif -#ifdef GL_SGIX_mpeg1 - &__GLEW_SGIX_mpeg1, -#endif -#ifdef GL_SGIX_mpeg2 - &__GLEW_SGIX_mpeg2, -#endif -#ifdef GL_SGIX_nonlinear_lighting_pervertex - &__GLEW_SGIX_nonlinear_lighting_pervertex, -#endif -#ifdef GL_SGIX_nurbs_eval - &__GLEW_SGIX_nurbs_eval, -#endif -#ifdef GL_SGIX_occlusion_instrument - &__GLEW_SGIX_occlusion_instrument, -#endif -#ifdef GL_SGIX_packed_6bytes - &__GLEW_SGIX_packed_6bytes, -#endif -#ifdef GL_SGIX_pixel_texture - &__GLEW_SGIX_pixel_texture, -#endif -#ifdef GL_SGIX_pixel_texture_bits - &__GLEW_SGIX_pixel_texture_bits, -#endif -#ifdef GL_SGIX_pixel_texture_lod - &__GLEW_SGIX_pixel_texture_lod, -#endif -#ifdef GL_SGIX_pixel_tiles - &__GLEW_SGIX_pixel_tiles, -#endif -#ifdef GL_SGIX_polynomial_ffd - &__GLEW_SGIX_polynomial_ffd, -#endif -#ifdef GL_SGIX_quad_mesh - &__GLEW_SGIX_quad_mesh, -#endif -#ifdef GL_SGIX_reference_plane - &__GLEW_SGIX_reference_plane, -#endif -#ifdef GL_SGIX_resample - &__GLEW_SGIX_resample, -#endif -#ifdef GL_SGIX_scalebias_hint - &__GLEW_SGIX_scalebias_hint, -#endif -#ifdef GL_SGIX_shadow - &__GLEW_SGIX_shadow, -#endif -#ifdef GL_SGIX_shadow_ambient - &__GLEW_SGIX_shadow_ambient, -#endif -#ifdef GL_SGIX_slim - &__GLEW_SGIX_slim, -#endif -#ifdef GL_SGIX_spotlight_cutoff - &__GLEW_SGIX_spotlight_cutoff, -#endif -#ifdef GL_SGIX_sprite - &__GLEW_SGIX_sprite, -#endif -#ifdef GL_SGIX_subdiv_patch - &__GLEW_SGIX_subdiv_patch, -#endif -#ifdef GL_SGIX_subsample - &__GLEW_SGIX_subsample, -#endif -#ifdef GL_SGIX_tag_sample_buffer - &__GLEW_SGIX_tag_sample_buffer, -#endif -#ifdef GL_SGIX_texture_add_env - &__GLEW_SGIX_texture_add_env, -#endif -#ifdef GL_SGIX_texture_coordinate_clamp - &__GLEW_SGIX_texture_coordinate_clamp, -#endif -#ifdef GL_SGIX_texture_lod_bias - &__GLEW_SGIX_texture_lod_bias, -#endif -#ifdef GL_SGIX_texture_mipmap_anisotropic - &__GLEW_SGIX_texture_mipmap_anisotropic, -#endif -#ifdef GL_SGIX_texture_multi_buffer - &__GLEW_SGIX_texture_multi_buffer, -#endif -#ifdef GL_SGIX_texture_phase - &__GLEW_SGIX_texture_phase, -#endif -#ifdef GL_SGIX_texture_range - &__GLEW_SGIX_texture_range, -#endif -#ifdef GL_SGIX_texture_scale_bias - &__GLEW_SGIX_texture_scale_bias, -#endif -#ifdef GL_SGIX_texture_supersample - &__GLEW_SGIX_texture_supersample, -#endif -#ifdef GL_SGIX_vector_ops - &__GLEW_SGIX_vector_ops, -#endif -#ifdef GL_SGIX_vertex_array_object - &__GLEW_SGIX_vertex_array_object, -#endif -#ifdef GL_SGIX_vertex_preclip - &__GLEW_SGIX_vertex_preclip, -#endif -#ifdef GL_SGIX_vertex_preclip_hint - &__GLEW_SGIX_vertex_preclip_hint, -#endif -#ifdef GL_SGIX_ycrcb - &__GLEW_SGIX_ycrcb, -#endif -#ifdef GL_SGIX_ycrcb_subsample - &__GLEW_SGIX_ycrcb_subsample, -#endif -#ifdef GL_SGIX_ycrcba - &__GLEW_SGIX_ycrcba, -#endif -#ifdef GL_SGI_color_matrix - &__GLEW_SGI_color_matrix, -#endif -#ifdef GL_SGI_color_table - &__GLEW_SGI_color_table, -#endif -#ifdef GL_SGI_complex - &__GLEW_SGI_complex, -#endif -#ifdef GL_SGI_complex_type - &__GLEW_SGI_complex_type, -#endif -#ifdef GL_SGI_fft - &__GLEW_SGI_fft, -#endif -#ifdef GL_SGI_texture_color_table - &__GLEW_SGI_texture_color_table, -#endif -#ifdef GL_SUNX_constant_data - &__GLEW_SUNX_constant_data, -#endif -#ifdef GL_SUN_convolution_border_modes - &__GLEW_SUN_convolution_border_modes, -#endif -#ifdef GL_SUN_global_alpha - &__GLEW_SUN_global_alpha, -#endif -#ifdef GL_SUN_mesh_array - &__GLEW_SUN_mesh_array, -#endif -#ifdef GL_SUN_read_video_pixels - &__GLEW_SUN_read_video_pixels, -#endif -#ifdef GL_SUN_slice_accum - &__GLEW_SUN_slice_accum, -#endif -#ifdef GL_SUN_triangle_list - &__GLEW_SUN_triangle_list, -#endif -#ifdef GL_SUN_vertex - &__GLEW_SUN_vertex, -#endif -#ifdef GL_WIN_phong_shading - &__GLEW_WIN_phong_shading, -#endif -#ifdef GL_WIN_scene_markerXXX - &__GLEW_WIN_scene_markerXXX, -#endif -#ifdef GL_WIN_specular_fog - &__GLEW_WIN_specular_fog, -#endif -#ifdef GL_WIN_swap_hint - &__GLEW_WIN_swap_hint, -#endif - NULL -}; -static GLboolean _glewInit_GL_VERSION_1_2 (); -static GLboolean _glewInit_GL_VERSION_1_3 (); -static GLboolean _glewInit_GL_VERSION_1_4 (); -static GLboolean _glewInit_GL_VERSION_1_5 (); -static GLboolean _glewInit_GL_VERSION_2_0 (); -static GLboolean _glewInit_GL_VERSION_2_1 (); -static GLboolean _glewInit_GL_VERSION_3_0 (); -static GLboolean _glewInit_GL_VERSION_3_1 (); -static GLboolean _glewInit_GL_VERSION_3_2 (); -static GLboolean _glewInit_GL_VERSION_3_3 (); -static GLboolean _glewInit_GL_VERSION_4_0 (); -static GLboolean _glewInit_GL_VERSION_4_5 (); -static GLboolean _glewInit_GL_VERSION_4_6 (); -static GLboolean _glewInit_GL_3DFX_tbuffer (); -static GLboolean _glewInit_GL_AMD_debug_output (); -static GLboolean _glewInit_GL_AMD_draw_buffers_blend (); -static GLboolean _glewInit_GL_AMD_framebuffer_sample_positions (); -static GLboolean _glewInit_GL_AMD_interleaved_elements (); -static GLboolean _glewInit_GL_AMD_multi_draw_indirect (); -static GLboolean _glewInit_GL_AMD_name_gen_delete (); -static GLboolean _glewInit_GL_AMD_occlusion_query_event (); -static GLboolean _glewInit_GL_AMD_performance_monitor (); -static GLboolean _glewInit_GL_AMD_sample_positions (); -static GLboolean _glewInit_GL_AMD_sparse_texture (); -static GLboolean _glewInit_GL_AMD_stencil_operation_extended (); -static GLboolean _glewInit_GL_AMD_vertex_shader_tessellator (); -static GLboolean _glewInit_GL_ANGLE_framebuffer_blit (); -static GLboolean _glewInit_GL_ANGLE_framebuffer_multisample (); -static GLboolean _glewInit_GL_ANGLE_instanced_arrays (); -static GLboolean _glewInit_GL_ANGLE_timer_query (); -static GLboolean _glewInit_GL_ANGLE_translated_shader_source (); -static GLboolean _glewInit_GL_APPLE_copy_texture_levels (); -static GLboolean _glewInit_GL_APPLE_element_array (); -static GLboolean _glewInit_GL_APPLE_fence (); -static GLboolean _glewInit_GL_APPLE_flush_buffer_range (); -static GLboolean _glewInit_GL_APPLE_framebuffer_multisample (); -static GLboolean _glewInit_GL_APPLE_object_purgeable (); -static GLboolean _glewInit_GL_APPLE_sync (); -static GLboolean _glewInit_GL_APPLE_texture_range (); -static GLboolean _glewInit_GL_APPLE_vertex_array_object (); -static GLboolean _glewInit_GL_APPLE_vertex_array_range (); -static GLboolean _glewInit_GL_APPLE_vertex_program_evaluators (); -static GLboolean _glewInit_GL_ARB_ES2_compatibility (); -static GLboolean _glewInit_GL_ARB_ES3_1_compatibility (); -static GLboolean _glewInit_GL_ARB_ES3_2_compatibility (); -static GLboolean _glewInit_GL_ARB_base_instance (); -static GLboolean _glewInit_GL_ARB_bindless_texture (); -static GLboolean _glewInit_GL_ARB_blend_func_extended (); -static GLboolean _glewInit_GL_ARB_buffer_storage (); -static GLboolean _glewInit_GL_ARB_cl_event (); -static GLboolean _glewInit_GL_ARB_clear_buffer_object (); -static GLboolean _glewInit_GL_ARB_clear_texture (); -static GLboolean _glewInit_GL_ARB_clip_control (); -static GLboolean _glewInit_GL_ARB_color_buffer_float (); -static GLboolean _glewInit_GL_ARB_compute_shader (); -static GLboolean _glewInit_GL_ARB_compute_variable_group_size (); -static GLboolean _glewInit_GL_ARB_copy_buffer (); -static GLboolean _glewInit_GL_ARB_copy_image (); -static GLboolean _glewInit_GL_ARB_debug_output (); -static GLboolean _glewInit_GL_ARB_direct_state_access (); -static GLboolean _glewInit_GL_ARB_draw_buffers (); -static GLboolean _glewInit_GL_ARB_draw_buffers_blend (); -static GLboolean _glewInit_GL_ARB_draw_elements_base_vertex (); -static GLboolean _glewInit_GL_ARB_draw_indirect (); -static GLboolean _glewInit_GL_ARB_framebuffer_no_attachments (); -static GLboolean _glewInit_GL_ARB_framebuffer_object (); -static GLboolean _glewInit_GL_ARB_geometry_shader4 (); -static GLboolean _glewInit_GL_ARB_get_program_binary (); -static GLboolean _glewInit_GL_ARB_get_texture_sub_image (); -static GLboolean _glewInit_GL_ARB_gl_spirv (); -static GLboolean _glewInit_GL_ARB_gpu_shader_fp64 (); -static GLboolean _glewInit_GL_ARB_gpu_shader_int64 (); -static GLboolean _glewInit_GL_ARB_imaging (); -static GLboolean _glewInit_GL_ARB_indirect_parameters (); -static GLboolean _glewInit_GL_ARB_instanced_arrays (); -static GLboolean _glewInit_GL_ARB_internalformat_query (); -static GLboolean _glewInit_GL_ARB_internalformat_query2 (); -static GLboolean _glewInit_GL_ARB_invalidate_subdata (); -static GLboolean _glewInit_GL_ARB_map_buffer_range (); -static GLboolean _glewInit_GL_ARB_matrix_palette (); -static GLboolean _glewInit_GL_ARB_multi_bind (); -static GLboolean _glewInit_GL_ARB_multi_draw_indirect (); -static GLboolean _glewInit_GL_ARB_multisample (); -static GLboolean _glewInit_GL_ARB_multitexture (); -static GLboolean _glewInit_GL_ARB_occlusion_query (); -static GLboolean _glewInit_GL_ARB_parallel_shader_compile (); -static GLboolean _glewInit_GL_ARB_point_parameters (); -static GLboolean _glewInit_GL_ARB_polygon_offset_clamp (); -static GLboolean _glewInit_GL_ARB_program_interface_query (); -static GLboolean _glewInit_GL_ARB_provoking_vertex (); -static GLboolean _glewInit_GL_ARB_robustness (); -static GLboolean _glewInit_GL_ARB_sample_locations (); -static GLboolean _glewInit_GL_ARB_sample_shading (); -static GLboolean _glewInit_GL_ARB_sampler_objects (); -static GLboolean _glewInit_GL_ARB_separate_shader_objects (); -static GLboolean _glewInit_GL_ARB_shader_atomic_counters (); -static GLboolean _glewInit_GL_ARB_shader_image_load_store (); -static GLboolean _glewInit_GL_ARB_shader_objects (); -static GLboolean _glewInit_GL_ARB_shader_storage_buffer_object (); -static GLboolean _glewInit_GL_ARB_shader_subroutine (); -static GLboolean _glewInit_GL_ARB_shading_language_include (); -static GLboolean _glewInit_GL_ARB_sparse_buffer (); -static GLboolean _glewInit_GL_ARB_sparse_texture (); -static GLboolean _glewInit_GL_ARB_sync (); -static GLboolean _glewInit_GL_ARB_tessellation_shader (); -static GLboolean _glewInit_GL_ARB_texture_barrier (); -static GLboolean _glewInit_GL_ARB_texture_buffer_object (); -static GLboolean _glewInit_GL_ARB_texture_buffer_range (); -static GLboolean _glewInit_GL_ARB_texture_compression (); -static GLboolean _glewInit_GL_ARB_texture_multisample (); -static GLboolean _glewInit_GL_ARB_texture_storage (); -static GLboolean _glewInit_GL_ARB_texture_storage_multisample (); -static GLboolean _glewInit_GL_ARB_texture_view (); -static GLboolean _glewInit_GL_ARB_timer_query (); -static GLboolean _glewInit_GL_ARB_transform_feedback2 (); -static GLboolean _glewInit_GL_ARB_transform_feedback3 (); -static GLboolean _glewInit_GL_ARB_transform_feedback_instanced (); -static GLboolean _glewInit_GL_ARB_transpose_matrix (); -static GLboolean _glewInit_GL_ARB_uniform_buffer_object (); -static GLboolean _glewInit_GL_ARB_vertex_array_object (); -static GLboolean _glewInit_GL_ARB_vertex_attrib_64bit (); -static GLboolean _glewInit_GL_ARB_vertex_attrib_binding (); -static GLboolean _glewInit_GL_ARB_vertex_blend (); -static GLboolean _glewInit_GL_ARB_vertex_buffer_object (); -static GLboolean _glewInit_GL_ARB_vertex_program (); -static GLboolean _glewInit_GL_ARB_vertex_shader (); -static GLboolean _glewInit_GL_ARB_vertex_type_2_10_10_10_rev (); -static GLboolean _glewInit_GL_ARB_viewport_array (); -static GLboolean _glewInit_GL_ARB_window_pos (); -static GLboolean _glewInit_GL_ATI_draw_buffers (); -static GLboolean _glewInit_GL_ATI_element_array (); -static GLboolean _glewInit_GL_ATI_envmap_bumpmap (); -static GLboolean _glewInit_GL_ATI_fragment_shader (); -static GLboolean _glewInit_GL_ATI_map_object_buffer (); -static GLboolean _glewInit_GL_ATI_pn_triangles (); -static GLboolean _glewInit_GL_ATI_separate_stencil (); -static GLboolean _glewInit_GL_ATI_vertex_array_object (); -static GLboolean _glewInit_GL_ATI_vertex_attrib_array_object (); -static GLboolean _glewInit_GL_ATI_vertex_streams (); -static GLboolean _glewInit_GL_EXT_base_instance (); -static GLboolean _glewInit_GL_EXT_bindable_uniform (); -static GLboolean _glewInit_GL_EXT_blend_color (); -static GLboolean _glewInit_GL_EXT_blend_equation_separate (); -static GLboolean _glewInit_GL_EXT_blend_func_extended (); -static GLboolean _glewInit_GL_EXT_blend_func_separate (); -static GLboolean _glewInit_GL_EXT_blend_minmax (); -static GLboolean _glewInit_GL_EXT_buffer_storage (); -static GLboolean _glewInit_GL_EXT_clear_texture (); -static GLboolean _glewInit_GL_EXT_color_subtable (); -static GLboolean _glewInit_GL_EXT_compiled_vertex_array (); -static GLboolean _glewInit_GL_EXT_convolution (); -static GLboolean _glewInit_GL_EXT_coordinate_frame (); -static GLboolean _glewInit_GL_EXT_copy_image (); -static GLboolean _glewInit_GL_EXT_copy_texture (); -static GLboolean _glewInit_GL_EXT_cull_vertex (); -static GLboolean _glewInit_GL_EXT_debug_label (); -static GLboolean _glewInit_GL_EXT_debug_marker (); -static GLboolean _glewInit_GL_EXT_depth_bounds_test (); -static GLboolean _glewInit_GL_EXT_direct_state_access (); -static GLboolean _glewInit_GL_EXT_discard_framebuffer (); -static GLboolean _glewInit_GL_EXT_draw_buffers (); -static GLboolean _glewInit_GL_EXT_draw_buffers2 (); -static GLboolean _glewInit_GL_EXT_draw_buffers_indexed (); -static GLboolean _glewInit_GL_EXT_draw_elements_base_vertex (); -static GLboolean _glewInit_GL_EXT_draw_instanced (); -static GLboolean _glewInit_GL_EXT_draw_range_elements (); -static GLboolean _glewInit_GL_EXT_external_buffer (); -static GLboolean _glewInit_GL_EXT_fog_coord (); -static GLboolean _glewInit_GL_EXT_fragment_lighting (); -static GLboolean _glewInit_GL_EXT_framebuffer_blit (); -static GLboolean _glewInit_GL_EXT_framebuffer_multisample (); -static GLboolean _glewInit_GL_EXT_framebuffer_object (); -static GLboolean _glewInit_GL_EXT_geometry_shader4 (); -static GLboolean _glewInit_GL_EXT_gpu_program_parameters (); -static GLboolean _glewInit_GL_EXT_gpu_shader4 (); -static GLboolean _glewInit_GL_EXT_histogram (); -static GLboolean _glewInit_GL_EXT_index_func (); -static GLboolean _glewInit_GL_EXT_index_material (); -static GLboolean _glewInit_GL_EXT_instanced_arrays (); -static GLboolean _glewInit_GL_EXT_light_texture (); -static GLboolean _glewInit_GL_EXT_map_buffer_range (); -static GLboolean _glewInit_GL_EXT_memory_object (); -static GLboolean _glewInit_GL_EXT_memory_object_fd (); -static GLboolean _glewInit_GL_EXT_memory_object_win32 (); -static GLboolean _glewInit_GL_EXT_multi_draw_arrays (); -static GLboolean _glewInit_GL_EXT_multi_draw_indirect (); -static GLboolean _glewInit_GL_EXT_multisample (); -static GLboolean _glewInit_GL_EXT_multisampled_render_to_texture (); -static GLboolean _glewInit_GL_EXT_multiview_draw_buffers (); -static GLboolean _glewInit_GL_EXT_paletted_texture (); -static GLboolean _glewInit_GL_EXT_pixel_transform (); -static GLboolean _glewInit_GL_EXT_point_parameters (); -static GLboolean _glewInit_GL_EXT_polygon_offset (); -static GLboolean _glewInit_GL_EXT_polygon_offset_clamp (); -static GLboolean _glewInit_GL_EXT_provoking_vertex (); -static GLboolean _glewInit_GL_EXT_raster_multisample (); -static GLboolean _glewInit_GL_EXT_scene_marker (); -static GLboolean _glewInit_GL_EXT_secondary_color (); -static GLboolean _glewInit_GL_EXT_semaphore (); -static GLboolean _glewInit_GL_EXT_semaphore_fd (); -static GLboolean _glewInit_GL_EXT_semaphore_win32 (); -static GLboolean _glewInit_GL_EXT_separate_shader_objects (); -static GLboolean _glewInit_GL_EXT_shader_image_load_store (); -static GLboolean _glewInit_GL_EXT_shader_pixel_local_storage2 (); -static GLboolean _glewInit_GL_EXT_sparse_texture (); -static GLboolean _glewInit_GL_EXT_stencil_two_side (); -static GLboolean _glewInit_GL_EXT_subtexture (); -static GLboolean _glewInit_GL_EXT_texture3D (); -static GLboolean _glewInit_GL_EXT_texture_array (); -static GLboolean _glewInit_GL_EXT_texture_buffer_object (); -static GLboolean _glewInit_GL_EXT_texture_integer (); -static GLboolean _glewInit_GL_EXT_texture_object (); -static GLboolean _glewInit_GL_EXT_texture_perturb_normal (); -static GLboolean _glewInit_GL_EXT_texture_storage (); -static GLboolean _glewInit_GL_EXT_texture_view (); -static GLboolean _glewInit_GL_EXT_timer_query (); -static GLboolean _glewInit_GL_EXT_transform_feedback (); -static GLboolean _glewInit_GL_EXT_vertex_array (); -static GLboolean _glewInit_GL_EXT_vertex_array_setXXX (); -static GLboolean _glewInit_GL_EXT_vertex_attrib_64bit (); -static GLboolean _glewInit_GL_EXT_vertex_shader (); -static GLboolean _glewInit_GL_EXT_vertex_weighting (); -static GLboolean _glewInit_GL_EXT_win32_keyed_mutex (); -static GLboolean _glewInit_GL_EXT_window_rectangles (); -static GLboolean _glewInit_GL_EXT_x11_sync_object (); -static GLboolean _glewInit_GL_GREMEDY_frame_terminator (); -static GLboolean _glewInit_GL_GREMEDY_string_marker (); -static GLboolean _glewInit_GL_HP_image_transform (); -static GLboolean _glewInit_GL_IBM_multimode_draw_arrays (); -static GLboolean _glewInit_GL_IBM_vertex_array_lists (); -static GLboolean _glewInit_GL_INTEL_map_texture (); -static GLboolean _glewInit_GL_INTEL_parallel_arrays (); -static GLboolean _glewInit_GL_INTEL_performance_query (); -static GLboolean _glewInit_GL_INTEL_texture_scissor (); -static GLboolean _glewInit_GL_KHR_blend_equation_advanced (); -static GLboolean _glewInit_GL_KHR_debug (); -static GLboolean _glewInit_GL_KHR_parallel_shader_compile (); -static GLboolean _glewInit_GL_KHR_robustness (); -static GLboolean _glewInit_GL_KTX_buffer_region (); -static GLboolean _glewInit_GL_MESA_resize_buffers (); -static GLboolean _glewInit_GL_MESA_window_pos (); -static GLboolean _glewInit_GL_NVX_conditional_render (); -static GLboolean _glewInit_GL_NVX_linked_gpu_multicast (); -static GLboolean _glewInit_GL_NV_3dvision_settings (); -static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect (); -static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect_count (); -static GLboolean _glewInit_GL_NV_bindless_texture (); -static GLboolean _glewInit_GL_NV_blend_equation_advanced (); -static GLboolean _glewInit_GL_NV_clip_space_w_scaling (); -static GLboolean _glewInit_GL_NV_command_list (); -static GLboolean _glewInit_GL_NV_conditional_render (); -static GLboolean _glewInit_GL_NV_conservative_raster (); -static GLboolean _glewInit_GL_NV_conservative_raster_dilate (); -static GLboolean _glewInit_GL_NV_conservative_raster_pre_snap_triangles (); -static GLboolean _glewInit_GL_NV_copy_buffer (); -static GLboolean _glewInit_GL_NV_copy_image (); -static GLboolean _glewInit_GL_NV_depth_buffer_float (); -static GLboolean _glewInit_GL_NV_draw_buffers (); -static GLboolean _glewInit_GL_NV_draw_instanced (); -static GLboolean _glewInit_GL_NV_draw_texture (); -static GLboolean _glewInit_GL_NV_draw_vulkan_image (); -static GLboolean _glewInit_GL_NV_evaluators (); -static GLboolean _glewInit_GL_NV_explicit_multisample (); -static GLboolean _glewInit_GL_NV_fence (); -static GLboolean _glewInit_GL_NV_fragment_coverage_to_color (); -static GLboolean _glewInit_GL_NV_fragment_program (); -static GLboolean _glewInit_GL_NV_framebuffer_blit (); -static GLboolean _glewInit_GL_NV_framebuffer_multisample (); -static GLboolean _glewInit_GL_NV_framebuffer_multisample_coverage (); -static GLboolean _glewInit_GL_NV_geometry_program4 (); -static GLboolean _glewInit_GL_NV_gpu_multicast (); -static GLboolean _glewInit_GL_NV_gpu_program4 (); -static GLboolean _glewInit_GL_NV_gpu_shader5 (); -static GLboolean _glewInit_GL_NV_half_float (); -static GLboolean _glewInit_GL_NV_instanced_arrays (); -static GLboolean _glewInit_GL_NV_internalformat_sample_query (); -static GLboolean _glewInit_GL_NV_non_square_matrices (); -static GLboolean _glewInit_GL_NV_occlusion_query (); -static GLboolean _glewInit_GL_NV_parameter_buffer_object (); -static GLboolean _glewInit_GL_NV_path_rendering (); -static GLboolean _glewInit_GL_NV_pixel_data_range (); -static GLboolean _glewInit_GL_NV_point_sprite (); -static GLboolean _glewInit_GL_NV_polygon_mode (); -static GLboolean _glewInit_GL_NV_present_video (); -static GLboolean _glewInit_GL_NV_primitive_restart (); -static GLboolean _glewInit_GL_NV_register_combiners (); -static GLboolean _glewInit_GL_NV_register_combiners2 (); -static GLboolean _glewInit_GL_NV_sample_locations (); -static GLboolean _glewInit_GL_NV_shader_buffer_load (); -static GLboolean _glewInit_GL_NV_texture_array (); -static GLboolean _glewInit_GL_NV_texture_barrier (); -static GLboolean _glewInit_GL_NV_texture_multisample (); -static GLboolean _glewInit_GL_NV_transform_feedback (); -static GLboolean _glewInit_GL_NV_transform_feedback2 (); -static GLboolean _glewInit_GL_NV_vdpau_interop (); -static GLboolean _glewInit_GL_NV_vertex_array_range (); -static GLboolean _glewInit_GL_NV_vertex_attrib_integer_64bit (); -static GLboolean _glewInit_GL_NV_vertex_buffer_unified_memory (); -static GLboolean _glewInit_GL_NV_vertex_program (); -static GLboolean _glewInit_GL_NV_video_capture (); -static GLboolean _glewInit_GL_NV_viewport_array (); -static GLboolean _glewInit_GL_NV_viewport_swizzle (); -static GLboolean _glewInit_GL_OVR_multiview (); -static GLboolean _glewInit_GL_OVR_multiview_multisampled_render_to_texture (); -static GLboolean _glewInit_GL_QCOM_alpha_test (); -static GLboolean _glewInit_GL_QCOM_driver_control (); -static GLboolean _glewInit_GL_QCOM_extended_get (); -static GLboolean _glewInit_GL_QCOM_extended_get2 (); -static GLboolean _glewInit_GL_QCOM_framebuffer_foveated (); -static GLboolean _glewInit_GL_QCOM_shader_framebuffer_fetch_noncoherent (); -static GLboolean _glewInit_GL_QCOM_tiled_rendering (); -static GLboolean _glewInit_GL_REGAL_ES1_0_compatibility (); -static GLboolean _glewInit_GL_REGAL_ES1_1_compatibility (); -static GLboolean _glewInit_GL_REGAL_error_string (); -static GLboolean _glewInit_GL_REGAL_extension_query (); -static GLboolean _glewInit_GL_REGAL_log (); -static GLboolean _glewInit_GL_REGAL_proc_address (); -static GLboolean _glewInit_GL_SGIS_detail_texture (); -static GLboolean _glewInit_GL_SGIS_fog_function (); -static GLboolean _glewInit_GL_SGIS_multisample (); -static GLboolean _glewInit_GL_SGIS_multitexture (); -static GLboolean _glewInit_GL_SGIS_shared_multisample (); -static GLboolean _glewInit_GL_SGIS_sharpen_texture (); -static GLboolean _glewInit_GL_SGIS_texture4D (); -static GLboolean _glewInit_GL_SGIS_texture_filter4 (); -static GLboolean _glewInit_GL_SGIX_async (); -static GLboolean _glewInit_GL_SGIX_datapipe (); -static GLboolean _glewInit_GL_SGIX_flush_raster (); -static GLboolean _glewInit_GL_SGIX_fog_layers (); -static GLboolean _glewInit_GL_SGIX_fog_texture (); -static GLboolean _glewInit_GL_SGIX_fragment_specular_lighting (); -static GLboolean _glewInit_GL_SGIX_framezoom (); -static GLboolean _glewInit_GL_SGIX_igloo_interface (); -static GLboolean _glewInit_GL_SGIX_mpeg1 (); -static GLboolean _glewInit_GL_SGIX_nonlinear_lighting_pervertex (); -static GLboolean _glewInit_GL_SGIX_pixel_texture (); -static GLboolean _glewInit_GL_SGIX_polynomial_ffd (); -static GLboolean _glewInit_GL_SGIX_quad_mesh (); -static GLboolean _glewInit_GL_SGIX_reference_plane (); -static GLboolean _glewInit_GL_SGIX_sprite (); -static GLboolean _glewInit_GL_SGIX_tag_sample_buffer (); -static GLboolean _glewInit_GL_SGIX_vector_ops (); -static GLboolean _glewInit_GL_SGIX_vertex_array_object (); -static GLboolean _glewInit_GL_SGI_color_table (); -static GLboolean _glewInit_GL_SGI_fft (); -static GLboolean _glewInit_GL_SUNX_constant_data (); -static GLboolean _glewInit_GL_SUN_global_alpha (); -static GLboolean _glewInit_GL_SUN_read_video_pixels (); -static GLboolean _glewInit_GL_SUN_triangle_list (); -static GLboolean _glewInit_GL_SUN_vertex (); -static GLboolean _glewInit_GL_WIN_swap_hint (); - -#ifdef GL_VERSION_1_2 - -static GLboolean _glewInit_GL_VERSION_1_2 () -{ - GLboolean r = GL_FALSE; - - r = ((glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3D")) == NULL) || r; - r = ((glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElements")) == NULL) || r; - r = ((glTexImage3D = (PFNGLTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexImage3D")) == NULL) || r; - r = ((glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3D")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_1_2 */ - -#ifdef GL_VERSION_1_3 - -static GLboolean _glewInit_GL_VERSION_1_3 () -{ - GLboolean r = GL_FALSE; - - r = ((glActiveTexture = (PFNGLACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glActiveTexture")) == NULL) || r; - r = ((glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTexture")) == NULL) || r; - r = ((glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1D")) == NULL) || r; - r = ((glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2D")) == NULL) || r; - r = ((glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3D")) == NULL) || r; - r = ((glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1D")) == NULL) || r; - r = ((glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2D")) == NULL) || r; - r = ((glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3D")) == NULL) || r; - r = ((glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImage")) == NULL) || r; - r = ((glLoadTransposeMatrixd = (PFNGLLOADTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixd")) == NULL) || r; - r = ((glLoadTransposeMatrixf = (PFNGLLOADTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixf")) == NULL) || r; - r = ((glMultTransposeMatrixd = (PFNGLMULTTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixd")) == NULL) || r; - r = ((glMultTransposeMatrixf = (PFNGLMULTTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixf")) == NULL) || r; - r = ((glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1d")) == NULL) || r; - r = ((glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dv")) == NULL) || r; - r = ((glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1f")) == NULL) || r; - r = ((glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fv")) == NULL) || r; - r = ((glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1i")) == NULL) || r; - r = ((glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iv")) == NULL) || r; - r = ((glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1s")) == NULL) || r; - r = ((glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sv")) == NULL) || r; - r = ((glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2d")) == NULL) || r; - r = ((glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dv")) == NULL) || r; - r = ((glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2f")) == NULL) || r; - r = ((glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fv")) == NULL) || r; - r = ((glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2i")) == NULL) || r; - r = ((glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iv")) == NULL) || r; - r = ((glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2s")) == NULL) || r; - r = ((glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sv")) == NULL) || r; - r = ((glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3d")) == NULL) || r; - r = ((glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dv")) == NULL) || r; - r = ((glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3f")) == NULL) || r; - r = ((glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fv")) == NULL) || r; - r = ((glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3i")) == NULL) || r; - r = ((glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iv")) == NULL) || r; - r = ((glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3s")) == NULL) || r; - r = ((glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sv")) == NULL) || r; - r = ((glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4d")) == NULL) || r; - r = ((glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dv")) == NULL) || r; - r = ((glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4f")) == NULL) || r; - r = ((glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fv")) == NULL) || r; - r = ((glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4i")) == NULL) || r; - r = ((glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iv")) == NULL) || r; - r = ((glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4s")) == NULL) || r; - r = ((glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sv")) == NULL) || r; - r = ((glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverage")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_1_3 */ - -#ifdef GL_VERSION_1_4 - -static GLboolean _glewInit_GL_VERSION_1_4 () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendColor = (PFNGLBLENDCOLORPROC)glewGetProcAddress((const GLubyte*)"glBlendColor")) == NULL) || r; - r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r; - r = ((glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparate")) == NULL) || r; - r = ((glFogCoordPointer = (PFNGLFOGCOORDPOINTERPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointer")) == NULL) || r; - r = ((glFogCoordd = (PFNGLFOGCOORDDPROC)glewGetProcAddress((const GLubyte*)"glFogCoordd")) == NULL) || r; - r = ((glFogCoorddv = (PFNGLFOGCOORDDVPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddv")) == NULL) || r; - r = ((glFogCoordf = (PFNGLFOGCOORDFPROC)glewGetProcAddress((const GLubyte*)"glFogCoordf")) == NULL) || r; - r = ((glFogCoordfv = (PFNGLFOGCOORDFVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfv")) == NULL) || r; - r = ((glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArrays")) == NULL) || r; - r = ((glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElements")) == NULL) || r; - r = ((glPointParameterf = (PFNGLPOINTPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glPointParameterf")) == NULL) || r; - r = ((glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfv")) == NULL) || r; - r = ((glPointParameteri = (PFNGLPOINTPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glPointParameteri")) == NULL) || r; - r = ((glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriv")) == NULL) || r; - r = ((glSecondaryColor3b = (PFNGLSECONDARYCOLOR3BPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3b")) == NULL) || r; - r = ((glSecondaryColor3bv = (PFNGLSECONDARYCOLOR3BVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bv")) == NULL) || r; - r = ((glSecondaryColor3d = (PFNGLSECONDARYCOLOR3DPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3d")) == NULL) || r; - r = ((glSecondaryColor3dv = (PFNGLSECONDARYCOLOR3DVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dv")) == NULL) || r; - r = ((glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3f")) == NULL) || r; - r = ((glSecondaryColor3fv = (PFNGLSECONDARYCOLOR3FVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fv")) == NULL) || r; - r = ((glSecondaryColor3i = (PFNGLSECONDARYCOLOR3IPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3i")) == NULL) || r; - r = ((glSecondaryColor3iv = (PFNGLSECONDARYCOLOR3IVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iv")) == NULL) || r; - r = ((glSecondaryColor3s = (PFNGLSECONDARYCOLOR3SPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3s")) == NULL) || r; - r = ((glSecondaryColor3sv = (PFNGLSECONDARYCOLOR3SVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sv")) == NULL) || r; - r = ((glSecondaryColor3ub = (PFNGLSECONDARYCOLOR3UBPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ub")) == NULL) || r; - r = ((glSecondaryColor3ubv = (PFNGLSECONDARYCOLOR3UBVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubv")) == NULL) || r; - r = ((glSecondaryColor3ui = (PFNGLSECONDARYCOLOR3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ui")) == NULL) || r; - r = ((glSecondaryColor3uiv = (PFNGLSECONDARYCOLOR3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiv")) == NULL) || r; - r = ((glSecondaryColor3us = (PFNGLSECONDARYCOLOR3USPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3us")) == NULL) || r; - r = ((glSecondaryColor3usv = (PFNGLSECONDARYCOLOR3USVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usv")) == NULL) || r; - r = ((glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointer")) == NULL) || r; - r = ((glWindowPos2d = (PFNGLWINDOWPOS2DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2d")) == NULL) || r; - r = ((glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dv")) == NULL) || r; - r = ((glWindowPos2f = (PFNGLWINDOWPOS2FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2f")) == NULL) || r; - r = ((glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fv")) == NULL) || r; - r = ((glWindowPos2i = (PFNGLWINDOWPOS2IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2i")) == NULL) || r; - r = ((glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iv")) == NULL) || r; - r = ((glWindowPos2s = (PFNGLWINDOWPOS2SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2s")) == NULL) || r; - r = ((glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sv")) == NULL) || r; - r = ((glWindowPos3d = (PFNGLWINDOWPOS3DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3d")) == NULL) || r; - r = ((glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dv")) == NULL) || r; - r = ((glWindowPos3f = (PFNGLWINDOWPOS3FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3f")) == NULL) || r; - r = ((glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fv")) == NULL) || r; - r = ((glWindowPos3i = (PFNGLWINDOWPOS3IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3i")) == NULL) || r; - r = ((glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iv")) == NULL) || r; - r = ((glWindowPos3s = (PFNGLWINDOWPOS3SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3s")) == NULL) || r; - r = ((glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sv")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_1_4 */ - -#ifdef GL_VERSION_1_5 - -static GLboolean _glewInit_GL_VERSION_1_5 () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginQuery = (PFNGLBEGINQUERYPROC)glewGetProcAddress((const GLubyte*)"glBeginQuery")) == NULL) || r; - r = ((glBindBuffer = (PFNGLBINDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindBuffer")) == NULL) || r; - r = ((glBufferData = (PFNGLBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferData")) == NULL) || r; - r = ((glBufferSubData = (PFNGLBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferSubData")) == NULL) || r; - r = ((glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffers")) == NULL) || r; - r = ((glDeleteQueries = (PFNGLDELETEQUERIESPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueries")) == NULL) || r; - r = ((glEndQuery = (PFNGLENDQUERYPROC)glewGetProcAddress((const GLubyte*)"glEndQuery")) == NULL) || r; - r = ((glGenBuffers = (PFNGLGENBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenBuffers")) == NULL) || r; - r = ((glGenQueries = (PFNGLGENQUERIESPROC)glewGetProcAddress((const GLubyte*)"glGenQueries")) == NULL) || r; - r = ((glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteriv")) == NULL) || r; - r = ((glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointerv")) == NULL) || r; - r = ((glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubData")) == NULL) || r; - r = ((glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectiv")) == NULL) || r; - r = ((glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuiv")) == NULL) || r; - r = ((glGetQueryiv = (PFNGLGETQUERYIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryiv")) == NULL) || r; - r = ((glIsBuffer = (PFNGLISBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsBuffer")) == NULL) || r; - r = ((glIsQuery = (PFNGLISQUERYPROC)glewGetProcAddress((const GLubyte*)"glIsQuery")) == NULL) || r; - r = ((glMapBuffer = (PFNGLMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glMapBuffer")) == NULL) || r; - r = ((glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glUnmapBuffer")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_1_5 */ - -#ifdef GL_VERSION_2_0 - -static GLboolean _glewInit_GL_VERSION_2_0 () -{ - GLboolean r = GL_FALSE; - - r = ((glAttachShader = (PFNGLATTACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glAttachShader")) == NULL) || r; - r = ((glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocation")) == NULL) || r; - r = ((glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparate")) == NULL) || r; - r = ((glCompileShader = (PFNGLCOMPILESHADERPROC)glewGetProcAddress((const GLubyte*)"glCompileShader")) == NULL) || r; - r = ((glCreateProgram = (PFNGLCREATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glCreateProgram")) == NULL) || r; - r = ((glCreateShader = (PFNGLCREATESHADERPROC)glewGetProcAddress((const GLubyte*)"glCreateShader")) == NULL) || r; - r = ((glDeleteProgram = (PFNGLDELETEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgram")) == NULL) || r; - r = ((glDeleteShader = (PFNGLDELETESHADERPROC)glewGetProcAddress((const GLubyte*)"glDeleteShader")) == NULL) || r; - r = ((glDetachShader = (PFNGLDETACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glDetachShader")) == NULL) || r; - r = ((glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArray")) == NULL) || r; - r = ((glDrawBuffers = (PFNGLDRAWBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffers")) == NULL) || r; - r = ((glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArray")) == NULL) || r; - r = ((glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttrib")) == NULL) || r; - r = ((glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniform")) == NULL) || r; - r = ((glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedShaders")) == NULL) || r; - r = ((glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocation")) == NULL) || r; - r = ((glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramInfoLog")) == NULL) || r; - r = ((glGetProgramiv = (PFNGLGETPROGRAMIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramiv")) == NULL) || r; - r = ((glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetShaderInfoLog")) == NULL) || r; - r = ((glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSource")) == NULL) || r; - r = ((glGetShaderiv = (PFNGLGETSHADERIVPROC)glewGetProcAddress((const GLubyte*)"glGetShaderiv")) == NULL) || r; - r = ((glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocation")) == NULL) || r; - r = ((glGetUniformfv = (PFNGLGETUNIFORMFVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfv")) == NULL) || r; - r = ((glGetUniformiv = (PFNGLGETUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformiv")) == NULL) || r; - r = ((glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointerv")) == NULL) || r; - r = ((glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdv")) == NULL) || r; - r = ((glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfv")) == NULL) || r; - r = ((glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribiv")) == NULL) || r; - r = ((glIsProgram = (PFNGLISPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glIsProgram")) == NULL) || r; - r = ((glIsShader = (PFNGLISSHADERPROC)glewGetProcAddress((const GLubyte*)"glIsShader")) == NULL) || r; - r = ((glLinkProgram = (PFNGLLINKPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glLinkProgram")) == NULL) || r; - r = ((glShaderSource = (PFNGLSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glShaderSource")) == NULL) || r; - r = ((glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparate")) == NULL) || r; - r = ((glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilMaskSeparate")) == NULL) || r; - r = ((glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparate")) == NULL) || r; - r = ((glUniform1f = (PFNGLUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glUniform1f")) == NULL) || r; - r = ((glUniform1fv = (PFNGLUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glUniform1fv")) == NULL) || r; - r = ((glUniform1i = (PFNGLUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glUniform1i")) == NULL) || r; - r = ((glUniform1iv = (PFNGLUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glUniform1iv")) == NULL) || r; - r = ((glUniform2f = (PFNGLUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glUniform2f")) == NULL) || r; - r = ((glUniform2fv = (PFNGLUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glUniform2fv")) == NULL) || r; - r = ((glUniform2i = (PFNGLUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glUniform2i")) == NULL) || r; - r = ((glUniform2iv = (PFNGLUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glUniform2iv")) == NULL) || r; - r = ((glUniform3f = (PFNGLUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glUniform3f")) == NULL) || r; - r = ((glUniform3fv = (PFNGLUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glUniform3fv")) == NULL) || r; - r = ((glUniform3i = (PFNGLUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glUniform3i")) == NULL) || r; - r = ((glUniform3iv = (PFNGLUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glUniform3iv")) == NULL) || r; - r = ((glUniform4f = (PFNGLUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glUniform4f")) == NULL) || r; - r = ((glUniform4fv = (PFNGLUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glUniform4fv")) == NULL) || r; - r = ((glUniform4i = (PFNGLUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glUniform4i")) == NULL) || r; - r = ((glUniform4iv = (PFNGLUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glUniform4iv")) == NULL) || r; - r = ((glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fv")) == NULL) || r; - r = ((glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fv")) == NULL) || r; - r = ((glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fv")) == NULL) || r; - r = ((glUseProgram = (PFNGLUSEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glUseProgram")) == NULL) || r; - r = ((glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glValidateProgram")) == NULL) || r; - r = ((glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1d")) == NULL) || r; - r = ((glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dv")) == NULL) || r; - r = ((glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1f")) == NULL) || r; - r = ((glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fv")) == NULL) || r; - r = ((glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1s")) == NULL) || r; - r = ((glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sv")) == NULL) || r; - r = ((glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2d")) == NULL) || r; - r = ((glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dv")) == NULL) || r; - r = ((glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2f")) == NULL) || r; - r = ((glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fv")) == NULL) || r; - r = ((glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2s")) == NULL) || r; - r = ((glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sv")) == NULL) || r; - r = ((glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3d")) == NULL) || r; - r = ((glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dv")) == NULL) || r; - r = ((glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3f")) == NULL) || r; - r = ((glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fv")) == NULL) || r; - r = ((glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3s")) == NULL) || r; - r = ((glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sv")) == NULL) || r; - r = ((glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nbv")) == NULL) || r; - r = ((glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Niv")) == NULL) || r; - r = ((glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nsv")) == NULL) || r; - r = ((glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nub")) == NULL) || r; - r = ((glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nubv")) == NULL) || r; - r = ((glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nuiv")) == NULL) || r; - r = ((glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nusv")) == NULL) || r; - r = ((glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bv")) == NULL) || r; - r = ((glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4d")) == NULL) || r; - r = ((glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dv")) == NULL) || r; - r = ((glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4f")) == NULL) || r; - r = ((glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fv")) == NULL) || r; - r = ((glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4iv")) == NULL) || r; - r = ((glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4s")) == NULL) || r; - r = ((glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sv")) == NULL) || r; - r = ((glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubv")) == NULL) || r; - r = ((glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uiv")) == NULL) || r; - r = ((glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usv")) == NULL) || r; - r = ((glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointer")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_2_0 */ - -#ifdef GL_VERSION_2_1 - -static GLboolean _glewInit_GL_VERSION_2_1 () -{ - GLboolean r = GL_FALSE; - - r = ((glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3fv")) == NULL) || r; - r = ((glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4fv")) == NULL) || r; - r = ((glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2fv")) == NULL) || r; - r = ((glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4fv")) == NULL) || r; - r = ((glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2fv")) == NULL) || r; - r = ((glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3fv")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_2_1 */ - -#ifdef GL_VERSION_3_0 - -static GLboolean _glewInit_GL_VERSION_3_0 () -{ - GLboolean r = GL_FALSE; - - r = _glewInit_GL_ARB_framebuffer_object() || r; - r = _glewInit_GL_ARB_map_buffer_range() || r; - r = _glewInit_GL_ARB_uniform_buffer_object() || r; - r = _glewInit_GL_ARB_vertex_array_object() || r; - - r = ((glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRender")) == NULL) || r; - r = ((glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedback")) == NULL) || r; - r = ((glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocation")) == NULL) || r; - r = ((glClampColor = (PFNGLCLAMPCOLORPROC)glewGetProcAddress((const GLubyte*)"glClampColor")) == NULL) || r; - r = ((glClearBufferfi = (PFNGLCLEARBUFFERFIPROC)glewGetProcAddress((const GLubyte*)"glClearBufferfi")) == NULL) || r; - r = ((glClearBufferfv = (PFNGLCLEARBUFFERFVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferfv")) == NULL) || r; - r = ((glClearBufferiv = (PFNGLCLEARBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferiv")) == NULL) || r; - r = ((glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferuiv")) == NULL) || r; - r = ((glColorMaski = (PFNGLCOLORMASKIPROC)glewGetProcAddress((const GLubyte*)"glColorMaski")) == NULL) || r; - r = ((glDisablei = (PFNGLDISABLEIPROC)glewGetProcAddress((const GLubyte*)"glDisablei")) == NULL) || r; - r = ((glEnablei = (PFNGLENABLEIPROC)glewGetProcAddress((const GLubyte*)"glEnablei")) == NULL) || r; - r = ((glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRender")) == NULL) || r; - r = ((glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedback")) == NULL) || r; - r = ((glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC)glewGetProcAddress((const GLubyte*)"glGetBooleani_v")) == NULL) || r; - r = ((glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataLocation")) == NULL) || r; - r = ((glGetStringi = (PFNGLGETSTRINGIPROC)glewGetProcAddress((const GLubyte*)"glGetStringi")) == NULL) || r; - r = ((glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIiv")) == NULL) || r; - r = ((glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuiv")) == NULL) || r; - r = ((glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVarying")) == NULL) || r; - r = ((glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformuiv")) == NULL) || r; - r = ((glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIiv")) == NULL) || r; - r = ((glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIuiv")) == NULL) || r; - r = ((glIsEnabledi = (PFNGLISENABLEDIPROC)glewGetProcAddress((const GLubyte*)"glIsEnabledi")) == NULL) || r; - r = ((glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIiv")) == NULL) || r; - r = ((glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIuiv")) == NULL) || r; - r = ((glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryings")) == NULL) || r; - r = ((glUniform1ui = (PFNGLUNIFORM1UIPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui")) == NULL) || r; - r = ((glUniform1uiv = (PFNGLUNIFORM1UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform1uiv")) == NULL) || r; - r = ((glUniform2ui = (PFNGLUNIFORM2UIPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui")) == NULL) || r; - r = ((glUniform2uiv = (PFNGLUNIFORM2UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform2uiv")) == NULL) || r; - r = ((glUniform3ui = (PFNGLUNIFORM3UIPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui")) == NULL) || r; - r = ((glUniform3uiv = (PFNGLUNIFORM3UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform3uiv")) == NULL) || r; - r = ((glUniform4ui = (PFNGLUNIFORM4UIPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui")) == NULL) || r; - r = ((glUniform4uiv = (PFNGLUNIFORM4UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform4uiv")) == NULL) || r; - r = ((glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1i")) == NULL) || r; - r = ((glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1iv")) == NULL) || r; - r = ((glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1ui")) == NULL) || r; - r = ((glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uiv")) == NULL) || r; - r = ((glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2i")) == NULL) || r; - r = ((glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2iv")) == NULL) || r; - r = ((glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2ui")) == NULL) || r; - r = ((glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uiv")) == NULL) || r; - r = ((glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3i")) == NULL) || r; - r = ((glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3iv")) == NULL) || r; - r = ((glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3ui")) == NULL) || r; - r = ((glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uiv")) == NULL) || r; - r = ((glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4bv")) == NULL) || r; - r = ((glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4i")) == NULL) || r; - r = ((glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4iv")) == NULL) || r; - r = ((glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4sv")) == NULL) || r; - r = ((glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ubv")) == NULL) || r; - r = ((glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ui")) == NULL) || r; - r = ((glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uiv")) == NULL) || r; - r = ((glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4usv")) == NULL) || r; - r = ((glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIPointer")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_3_0 */ - -#ifdef GL_VERSION_3_1 - -static GLboolean _glewInit_GL_VERSION_3_1 () -{ - GLboolean r = GL_FALSE; - - r = _glewInit_GL_ARB_copy_buffer() || r; - - r = ((glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstanced")) == NULL) || r; - r = ((glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstanced")) == NULL) || r; - r = ((glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndex")) == NULL) || r; - r = ((glTexBuffer = (PFNGLTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glTexBuffer")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_3_1 */ - -#ifdef GL_VERSION_3_2 - -static GLboolean _glewInit_GL_VERSION_3_2 () -{ - GLboolean r = GL_FALSE; - - r = _glewInit_GL_ARB_draw_elements_base_vertex() || r; - r = _glewInit_GL_ARB_provoking_vertex() || r; - r = _glewInit_GL_ARB_sync() || r; - r = _glewInit_GL_ARB_texture_multisample() || r; - - r = ((glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture")) == NULL) || r; - r = ((glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteri64v")) == NULL) || r; - r = ((glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64i_v")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_3_2 */ - -#ifdef GL_VERSION_3_3 - -static GLboolean _glewInit_GL_VERSION_3_3 () -{ - GLboolean r = GL_FALSE; - - r = ((glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisor")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_3_3 */ - -#ifdef GL_VERSION_4_0 - -static GLboolean _glewInit_GL_VERSION_4_0 () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparatei")) == NULL) || r; - r = ((glBlendEquationi = (PFNGLBLENDEQUATIONIPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationi")) == NULL) || r; - r = ((glBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparatei")) == NULL) || r; - r = ((glBlendFunci = (PFNGLBLENDFUNCIPROC)glewGetProcAddress((const GLubyte*)"glBlendFunci")) == NULL) || r; - r = ((glMinSampleShading = (PFNGLMINSAMPLESHADINGPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShading")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_4_0 */ - -#ifdef GL_VERSION_4_5 - -static GLboolean _glewInit_GL_VERSION_4_5 () -{ - GLboolean r = GL_FALSE; - - r = ((glGetGraphicsResetStatus = (PFNGLGETGRAPHICSRESETSTATUSPROC)glewGetProcAddress((const GLubyte*)"glGetGraphicsResetStatus")) == NULL) || r; - r = ((glGetnCompressedTexImage = (PFNGLGETNCOMPRESSEDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetnCompressedTexImage")) == NULL) || r; - r = ((glGetnTexImage = (PFNGLGETNTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetnTexImage")) == NULL) || r; - r = ((glGetnUniformdv = (PFNGLGETNUNIFORMDVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformdv")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_4_5 */ - -#ifdef GL_VERSION_4_6 - -static GLboolean _glewInit_GL_VERSION_4_6 () -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysIndirectCount = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectCount")) == NULL) || r; - r = ((glMultiDrawElementsIndirectCount = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectCount")) == NULL) || r; - r = ((glSpecializeShader = (PFNGLSPECIALIZESHADERPROC)glewGetProcAddress((const GLubyte*)"glSpecializeShader")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_4_6 */ - -#ifdef GL_3DFX_tbuffer - -static GLboolean _glewInit_GL_3DFX_tbuffer () -{ - GLboolean r = GL_FALSE; - - r = ((glTbufferMask3DFX = (PFNGLTBUFFERMASK3DFXPROC)glewGetProcAddress((const GLubyte*)"glTbufferMask3DFX")) == NULL) || r; - - return r; -} - -#endif /* GL_3DFX_tbuffer */ - -#ifdef GL_AMD_debug_output - -static GLboolean _glewInit_GL_AMD_debug_output () -{ - GLboolean r = GL_FALSE; - - r = ((glDebugMessageCallbackAMD = (PFNGLDEBUGMESSAGECALLBACKAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallbackAMD")) == NULL) || r; - r = ((glDebugMessageEnableAMD = (PFNGLDEBUGMESSAGEENABLEAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageEnableAMD")) == NULL) || r; - r = ((glDebugMessageInsertAMD = (PFNGLDEBUGMESSAGEINSERTAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsertAMD")) == NULL) || r; - r = ((glGetDebugMessageLogAMD = (PFNGLGETDEBUGMESSAGELOGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLogAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_debug_output */ - -#ifdef GL_AMD_draw_buffers_blend - -static GLboolean _glewInit_GL_AMD_draw_buffers_blend () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationIndexedAMD = (PFNGLBLENDEQUATIONINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationIndexedAMD")) == NULL) || r; - r = ((glBlendEquationSeparateIndexedAMD = (PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateIndexedAMD")) == NULL) || r; - r = ((glBlendFuncIndexedAMD = (PFNGLBLENDFUNCINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncIndexedAMD")) == NULL) || r; - r = ((glBlendFuncSeparateIndexedAMD = (PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateIndexedAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_draw_buffers_blend */ - -#ifdef GL_AMD_framebuffer_sample_positions - -static GLboolean _glewInit_GL_AMD_framebuffer_sample_positions () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferSamplePositionsfvAMD = (PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC)glewGetProcAddress((const GLubyte*)"glFramebufferSamplePositionsfvAMD")) == NULL) || r; - r = ((glGetFramebufferParameterfvAMD = (PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameterfvAMD")) == NULL) || r; - r = ((glGetNamedFramebufferParameterfvAMD = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameterfvAMD")) == NULL) || r; - r = ((glNamedFramebufferSamplePositionsfvAMD = (PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferSamplePositionsfvAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_framebuffer_sample_positions */ - -#ifdef GL_AMD_interleaved_elements - -static GLboolean _glewInit_GL_AMD_interleaved_elements () -{ - GLboolean r = GL_FALSE; - - r = ((glVertexAttribParameteriAMD = (PFNGLVERTEXATTRIBPARAMETERIAMDPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribParameteriAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_interleaved_elements */ - -#ifdef GL_AMD_multi_draw_indirect - -static GLboolean _glewInit_GL_AMD_multi_draw_indirect () -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysIndirectAMD = (PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectAMD")) == NULL) || r; - r = ((glMultiDrawElementsIndirectAMD = (PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_multi_draw_indirect */ - -#ifdef GL_AMD_name_gen_delete - -static GLboolean _glewInit_GL_AMD_name_gen_delete () -{ - GLboolean r = GL_FALSE; - - r = ((glDeleteNamesAMD = (PFNGLDELETENAMESAMDPROC)glewGetProcAddress((const GLubyte*)"glDeleteNamesAMD")) == NULL) || r; - r = ((glGenNamesAMD = (PFNGLGENNAMESAMDPROC)glewGetProcAddress((const GLubyte*)"glGenNamesAMD")) == NULL) || r; - r = ((glIsNameAMD = (PFNGLISNAMEAMDPROC)glewGetProcAddress((const GLubyte*)"glIsNameAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_name_gen_delete */ - -#ifdef GL_AMD_occlusion_query_event - -static GLboolean _glewInit_GL_AMD_occlusion_query_event () -{ - GLboolean r = GL_FALSE; - - r = ((glQueryObjectParameteruiAMD = (PFNGLQUERYOBJECTPARAMETERUIAMDPROC)glewGetProcAddress((const GLubyte*)"glQueryObjectParameteruiAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_occlusion_query_event */ - -#ifdef GL_AMD_performance_monitor - -static GLboolean _glewInit_GL_AMD_performance_monitor () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginPerfMonitorAMD = (PFNGLBEGINPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)"glBeginPerfMonitorAMD")) == NULL) || r; - r = ((glDeletePerfMonitorsAMD = (PFNGLDELETEPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)"glDeletePerfMonitorsAMD")) == NULL) || r; - r = ((glEndPerfMonitorAMD = (PFNGLENDPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)"glEndPerfMonitorAMD")) == NULL) || r; - r = ((glGenPerfMonitorsAMD = (PFNGLGENPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)"glGenPerfMonitorsAMD")) == NULL) || r; - r = ((glGetPerfMonitorCounterDataAMD = (PFNGLGETPERFMONITORCOUNTERDATAAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterDataAMD")) == NULL) || r; - r = ((glGetPerfMonitorCounterInfoAMD = (PFNGLGETPERFMONITORCOUNTERINFOAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterInfoAMD")) == NULL) || r; - r = ((glGetPerfMonitorCounterStringAMD = (PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterStringAMD")) == NULL) || r; - r = ((glGetPerfMonitorCountersAMD = (PFNGLGETPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCountersAMD")) == NULL) || r; - r = ((glGetPerfMonitorGroupStringAMD = (PFNGLGETPERFMONITORGROUPSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorGroupStringAMD")) == NULL) || r; - r = ((glGetPerfMonitorGroupsAMD = (PFNGLGETPERFMONITORGROUPSAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorGroupsAMD")) == NULL) || r; - r = ((glSelectPerfMonitorCountersAMD = (PFNGLSELECTPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)"glSelectPerfMonitorCountersAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_performance_monitor */ - -#ifdef GL_AMD_sample_positions - -static GLboolean _glewInit_GL_AMD_sample_positions () -{ - GLboolean r = GL_FALSE; - - r = ((glSetMultisamplefvAMD = (PFNGLSETMULTISAMPLEFVAMDPROC)glewGetProcAddress((const GLubyte*)"glSetMultisamplefvAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_sample_positions */ - -#ifdef GL_AMD_sparse_texture - -static GLboolean _glewInit_GL_AMD_sparse_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glTexStorageSparseAMD = (PFNGLTEXSTORAGESPARSEAMDPROC)glewGetProcAddress((const GLubyte*)"glTexStorageSparseAMD")) == NULL) || r; - r = ((glTextureStorageSparseAMD = (PFNGLTEXTURESTORAGESPARSEAMDPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageSparseAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_sparse_texture */ - -#ifdef GL_AMD_stencil_operation_extended - -static GLboolean _glewInit_GL_AMD_stencil_operation_extended () -{ - GLboolean r = GL_FALSE; - - r = ((glStencilOpValueAMD = (PFNGLSTENCILOPVALUEAMDPROC)glewGetProcAddress((const GLubyte*)"glStencilOpValueAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_stencil_operation_extended */ - -#ifdef GL_AMD_vertex_shader_tessellator - -static GLboolean _glewInit_GL_AMD_vertex_shader_tessellator () -{ - GLboolean r = GL_FALSE; - - r = ((glTessellationFactorAMD = (PFNGLTESSELLATIONFACTORAMDPROC)glewGetProcAddress((const GLubyte*)"glTessellationFactorAMD")) == NULL) || r; - r = ((glTessellationModeAMD = (PFNGLTESSELLATIONMODEAMDPROC)glewGetProcAddress((const GLubyte*)"glTessellationModeAMD")) == NULL) || r; - - return r; -} - -#endif /* GL_AMD_vertex_shader_tessellator */ - -#ifdef GL_ANGLE_framebuffer_blit - -static GLboolean _glewInit_GL_ANGLE_framebuffer_blit () -{ - GLboolean r = GL_FALSE; - - r = ((glBlitFramebufferANGLE = (PFNGLBLITFRAMEBUFFERANGLEPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferANGLE")) == NULL) || r; - - return r; -} - -#endif /* GL_ANGLE_framebuffer_blit */ - -#ifdef GL_ANGLE_framebuffer_multisample - -static GLboolean _glewInit_GL_ANGLE_framebuffer_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glRenderbufferStorageMultisampleANGLE = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleANGLE")) == NULL) || r; - - return r; -} - -#endif /* GL_ANGLE_framebuffer_multisample */ - -#ifdef GL_ANGLE_instanced_arrays - -static GLboolean _glewInit_GL_ANGLE_instanced_arrays () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawArraysInstancedANGLE = (PFNGLDRAWARRAYSINSTANCEDANGLEPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedANGLE")) == NULL) || r; - r = ((glDrawElementsInstancedANGLE = (PFNGLDRAWELEMENTSINSTANCEDANGLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedANGLE")) == NULL) || r; - r = ((glVertexAttribDivisorANGLE = (PFNGLVERTEXATTRIBDIVISORANGLEPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorANGLE")) == NULL) || r; - - return r; -} - -#endif /* GL_ANGLE_instanced_arrays */ - -#ifdef GL_ANGLE_timer_query - -static GLboolean _glewInit_GL_ANGLE_timer_query () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginQueryANGLE = (PFNGLBEGINQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryANGLE")) == NULL) || r; - r = ((glDeleteQueriesANGLE = (PFNGLDELETEQUERIESANGLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesANGLE")) == NULL) || r; - r = ((glEndQueryANGLE = (PFNGLENDQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glEndQueryANGLE")) == NULL) || r; - r = ((glGenQueriesANGLE = (PFNGLGENQUERIESANGLEPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesANGLE")) == NULL) || r; - r = ((glGetQueryObjecti64vANGLE = (PFNGLGETQUERYOBJECTI64VANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64vANGLE")) == NULL) || r; - r = ((glGetQueryObjectivANGLE = (PFNGLGETQUERYOBJECTIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivANGLE")) == NULL) || r; - r = ((glGetQueryObjectui64vANGLE = (PFNGLGETQUERYOBJECTUI64VANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64vANGLE")) == NULL) || r; - r = ((glGetQueryObjectuivANGLE = (PFNGLGETQUERYOBJECTUIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivANGLE")) == NULL) || r; - r = ((glGetQueryivANGLE = (PFNGLGETQUERYIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivANGLE")) == NULL) || r; - r = ((glIsQueryANGLE = (PFNGLISQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glIsQueryANGLE")) == NULL) || r; - r = ((glQueryCounterANGLE = (PFNGLQUERYCOUNTERANGLEPROC)glewGetProcAddress((const GLubyte*)"glQueryCounterANGLE")) == NULL) || r; - - return r; -} - -#endif /* GL_ANGLE_timer_query */ - -#ifdef GL_ANGLE_translated_shader_source - -static GLboolean _glewInit_GL_ANGLE_translated_shader_source () -{ - GLboolean r = GL_FALSE; - - r = ((glGetTranslatedShaderSourceANGLE = (PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetTranslatedShaderSourceANGLE")) == NULL) || r; - - return r; -} - -#endif /* GL_ANGLE_translated_shader_source */ - -#ifdef GL_APPLE_copy_texture_levels - -static GLboolean _glewInit_GL_APPLE_copy_texture_levels () -{ - GLboolean r = GL_FALSE; - - r = ((glCopyTextureLevelsAPPLE = (PFNGLCOPYTEXTURELEVELSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureLevelsAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_copy_texture_levels */ - -#ifdef GL_APPLE_element_array - -static GLboolean _glewInit_GL_APPLE_element_array () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawElementArrayAPPLE = (PFNGLDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayAPPLE")) == NULL) || r; - r = ((glDrawRangeElementArrayAPPLE = (PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayAPPLE")) == NULL) || r; - r = ((glElementPointerAPPLE = (PFNGLELEMENTPOINTERAPPLEPROC)glewGetProcAddress((const GLubyte*)"glElementPointerAPPLE")) == NULL) || r; - r = ((glMultiDrawElementArrayAPPLE = (PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementArrayAPPLE")) == NULL) || r; - r = ((glMultiDrawRangeElementArrayAPPLE = (PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawRangeElementArrayAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_element_array */ - -#ifdef GL_APPLE_fence - -static GLboolean _glewInit_GL_APPLE_fence () -{ - GLboolean r = GL_FALSE; - - r = ((glDeleteFencesAPPLE = (PFNGLDELETEFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesAPPLE")) == NULL) || r; - r = ((glFinishFenceAPPLE = (PFNGLFINISHFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceAPPLE")) == NULL) || r; - r = ((glFinishObjectAPPLE = (PFNGLFINISHOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishObjectAPPLE")) == NULL) || r; - r = ((glGenFencesAPPLE = (PFNGLGENFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenFencesAPPLE")) == NULL) || r; - r = ((glIsFenceAPPLE = (PFNGLISFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsFenceAPPLE")) == NULL) || r; - r = ((glSetFenceAPPLE = (PFNGLSETFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glSetFenceAPPLE")) == NULL) || r; - r = ((glTestFenceAPPLE = (PFNGLTESTFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestFenceAPPLE")) == NULL) || r; - r = ((glTestObjectAPPLE = (PFNGLTESTOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestObjectAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_fence */ - -#ifdef GL_APPLE_flush_buffer_range - -static GLboolean _glewInit_GL_APPLE_flush_buffer_range () -{ - GLboolean r = GL_FALSE; - - r = ((glBufferParameteriAPPLE = (PFNGLBUFFERPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBufferParameteriAPPLE")) == NULL) || r; - r = ((glFlushMappedBufferRangeAPPLE = (PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRangeAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_flush_buffer_range */ - -#ifdef GL_APPLE_framebuffer_multisample - -static GLboolean _glewInit_GL_APPLE_framebuffer_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glRenderbufferStorageMultisampleAPPLE = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleAPPLE")) == NULL) || r; - r = ((glResolveMultisampleFramebufferAPPLE = (PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC)glewGetProcAddress((const GLubyte*)"glResolveMultisampleFramebufferAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_framebuffer_multisample */ - -#ifdef GL_APPLE_object_purgeable - -static GLboolean _glewInit_GL_APPLE_object_purgeable () -{ - GLboolean r = GL_FALSE; - - r = ((glGetObjectParameterivAPPLE = (PFNGLGETOBJECTPARAMETERIVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivAPPLE")) == NULL) || r; - r = ((glObjectPurgeableAPPLE = (PFNGLOBJECTPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glObjectPurgeableAPPLE")) == NULL) || r; - r = ((glObjectUnpurgeableAPPLE = (PFNGLOBJECTUNPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glObjectUnpurgeableAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_object_purgeable */ - -#ifdef GL_APPLE_sync - -static GLboolean _glewInit_GL_APPLE_sync () -{ - GLboolean r = GL_FALSE; - - r = ((glClientWaitSyncAPPLE = (PFNGLCLIENTWAITSYNCAPPLEPROC)glewGetProcAddress((const GLubyte*)"glClientWaitSyncAPPLE")) == NULL) || r; - r = ((glDeleteSyncAPPLE = (PFNGLDELETESYNCAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteSyncAPPLE")) == NULL) || r; - r = ((glFenceSyncAPPLE = (PFNGLFENCESYNCAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFenceSyncAPPLE")) == NULL) || r; - r = ((glGetInteger64vAPPLE = (PFNGLGETINTEGER64VAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64vAPPLE")) == NULL) || r; - r = ((glGetSyncivAPPLE = (PFNGLGETSYNCIVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetSyncivAPPLE")) == NULL) || r; - r = ((glIsSyncAPPLE = (PFNGLISSYNCAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsSyncAPPLE")) == NULL) || r; - r = ((glWaitSyncAPPLE = (PFNGLWAITSYNCAPPLEPROC)glewGetProcAddress((const GLubyte*)"glWaitSyncAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_sync */ - -#ifdef GL_APPLE_texture_range - -static GLboolean _glewInit_GL_APPLE_texture_range () -{ - GLboolean r = GL_FALSE; - - r = ((glGetTexParameterPointervAPPLE = (PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterPointervAPPLE")) == NULL) || r; - r = ((glTextureRangeAPPLE = (PFNGLTEXTURERANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureRangeAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_texture_range */ - -#ifdef GL_APPLE_vertex_array_object - -static GLboolean _glewInit_GL_APPLE_vertex_array_object () -{ - GLboolean r = GL_FALSE; - - r = ((glBindVertexArrayAPPLE = (PFNGLBINDVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArrayAPPLE")) == NULL) || r; - r = ((glDeleteVertexArraysAPPLE = (PFNGLDELETEVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArraysAPPLE")) == NULL) || r; - r = ((glGenVertexArraysAPPLE = (PFNGLGENVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArraysAPPLE")) == NULL) || r; - r = ((glIsVertexArrayAPPLE = (PFNGLISVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArrayAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_vertex_array_object */ - -#ifdef GL_APPLE_vertex_array_range - -static GLboolean _glewInit_GL_APPLE_vertex_array_range () -{ - GLboolean r = GL_FALSE; - - r = ((glFlushVertexArrayRangeAPPLE = (PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeAPPLE")) == NULL) || r; - r = ((glVertexArrayParameteriAPPLE = (PFNGLVERTEXARRAYPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayParameteriAPPLE")) == NULL) || r; - r = ((glVertexArrayRangeAPPLE = (PFNGLVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_vertex_array_range */ - -#ifdef GL_APPLE_vertex_program_evaluators - -static GLboolean _glewInit_GL_APPLE_vertex_program_evaluators () -{ - GLboolean r = GL_FALSE; - - r = ((glDisableVertexAttribAPPLE = (PFNGLDISABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribAPPLE")) == NULL) || r; - r = ((glEnableVertexAttribAPPLE = (PFNGLENABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribAPPLE")) == NULL) || r; - r = ((glIsVertexAttribEnabledAPPLE = (PFNGLISVERTEXATTRIBENABLEDAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexAttribEnabledAPPLE")) == NULL) || r; - r = ((glMapVertexAttrib1dAPPLE = (PFNGLMAPVERTEXATTRIB1DAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib1dAPPLE")) == NULL) || r; - r = ((glMapVertexAttrib1fAPPLE = (PFNGLMAPVERTEXATTRIB1FAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib1fAPPLE")) == NULL) || r; - r = ((glMapVertexAttrib2dAPPLE = (PFNGLMAPVERTEXATTRIB2DAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib2dAPPLE")) == NULL) || r; - r = ((glMapVertexAttrib2fAPPLE = (PFNGLMAPVERTEXATTRIB2FAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib2fAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_vertex_program_evaluators */ - -#ifdef GL_ARB_ES2_compatibility - -static GLboolean _glewInit_GL_ARB_ES2_compatibility () -{ - GLboolean r = GL_FALSE; - - r = ((glClearDepthf = (PFNGLCLEARDEPTHFPROC)glewGetProcAddress((const GLubyte*)"glClearDepthf")) == NULL) || r; - r = ((glDepthRangef = (PFNGLDEPTHRANGEFPROC)glewGetProcAddress((const GLubyte*)"glDepthRangef")) == NULL) || r; - r = ((glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC)glewGetProcAddress((const GLubyte*)"glGetShaderPrecisionFormat")) == NULL) || r; - r = ((glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC)glewGetProcAddress((const GLubyte*)"glReleaseShaderCompiler")) == NULL) || r; - r = ((glShaderBinary = (PFNGLSHADERBINARYPROC)glewGetProcAddress((const GLubyte*)"glShaderBinary")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_ES2_compatibility */ - -#ifdef GL_ARB_ES3_1_compatibility - -static GLboolean _glewInit_GL_ARB_ES3_1_compatibility () -{ - GLboolean r = GL_FALSE; - - r = ((glMemoryBarrierByRegion = (PFNGLMEMORYBARRIERBYREGIONPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrierByRegion")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_ES3_1_compatibility */ - -#ifdef GL_ARB_ES3_2_compatibility - -static GLboolean _glewInit_GL_ARB_ES3_2_compatibility () -{ - GLboolean r = GL_FALSE; - - r = ((glPrimitiveBoundingBoxARB = (PFNGLPRIMITIVEBOUNDINGBOXARBPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveBoundingBoxARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_ES3_2_compatibility */ - -#ifdef GL_ARB_base_instance - -static GLboolean _glewInit_GL_ARB_base_instance () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedBaseInstance")) == NULL) || r; - r = ((glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseInstance")) == NULL) || r; - r = ((glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertexBaseInstance")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_base_instance */ - -#ifdef GL_ARB_bindless_texture - -static GLboolean _glewInit_GL_ARB_bindless_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glGetImageHandleARB = (PFNGLGETIMAGEHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetImageHandleARB")) == NULL) || r; - r = ((glGetTextureHandleARB = (PFNGLGETTEXTUREHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetTextureHandleARB")) == NULL) || r; - r = ((glGetTextureSamplerHandleARB = (PFNGLGETTEXTURESAMPLERHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSamplerHandleARB")) == NULL) || r; - r = ((glGetVertexAttribLui64vARB = (PFNGLGETVERTEXATTRIBLUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLui64vARB")) == NULL) || r; - r = ((glIsImageHandleResidentARB = (PFNGLISIMAGEHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glIsImageHandleResidentARB")) == NULL) || r; - r = ((glIsTextureHandleResidentARB = (PFNGLISTEXTUREHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glIsTextureHandleResidentARB")) == NULL) || r; - r = ((glMakeImageHandleNonResidentARB = (PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleNonResidentARB")) == NULL) || r; - r = ((glMakeImageHandleResidentARB = (PFNGLMAKEIMAGEHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleResidentARB")) == NULL) || r; - r = ((glMakeTextureHandleNonResidentARB = (PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleNonResidentARB")) == NULL) || r; - r = ((glMakeTextureHandleResidentARB = (PFNGLMAKETEXTUREHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleResidentARB")) == NULL) || r; - r = ((glProgramUniformHandleui64ARB = (PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64ARB")) == NULL) || r; - r = ((glProgramUniformHandleui64vARB = (PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64vARB")) == NULL) || r; - r = ((glUniformHandleui64ARB = (PFNGLUNIFORMHANDLEUI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64ARB")) == NULL) || r; - r = ((glUniformHandleui64vARB = (PFNGLUNIFORMHANDLEUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64vARB")) == NULL) || r; - r = ((glVertexAttribL1ui64ARB = (PFNGLVERTEXATTRIBL1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64ARB")) == NULL) || r; - r = ((glVertexAttribL1ui64vARB = (PFNGLVERTEXATTRIBL1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64vARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_bindless_texture */ - -#ifdef GL_ARB_blend_func_extended - -static GLboolean _glewInit_GL_ARB_blend_func_extended () -{ - GLboolean r = GL_FALSE; - - r = ((glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationIndexed")) == NULL) || r; - r = ((glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataIndex")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_blend_func_extended */ - -#ifdef GL_ARB_buffer_storage - -static GLboolean _glewInit_GL_ARB_buffer_storage () -{ - GLboolean r = GL_FALSE; - - r = ((glBufferStorage = (PFNGLBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glBufferStorage")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_buffer_storage */ - -#ifdef GL_ARB_cl_event - -static GLboolean _glewInit_GL_ARB_cl_event () -{ - GLboolean r = GL_FALSE; - - r = ((glCreateSyncFromCLeventARB = (PFNGLCREATESYNCFROMCLEVENTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateSyncFromCLeventARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_cl_event */ - -#ifdef GL_ARB_clear_buffer_object - -static GLboolean _glewInit_GL_ARB_clear_buffer_object () -{ - GLboolean r = GL_FALSE; - - r = ((glClearBufferData = (PFNGLCLEARBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glClearBufferData")) == NULL) || r; - r = ((glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glClearBufferSubData")) == NULL) || r; - r = ((glClearNamedBufferDataEXT = (PFNGLCLEARNAMEDBUFFERDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferDataEXT")) == NULL) || r; - r = ((glClearNamedBufferSubDataEXT = (PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferSubDataEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_clear_buffer_object */ - -#ifdef GL_ARB_clear_texture - -static GLboolean _glewInit_GL_ARB_clear_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glClearTexImage = (PFNGLCLEARTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glClearTexImage")) == NULL) || r; - r = ((glClearTexSubImage = (PFNGLCLEARTEXSUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glClearTexSubImage")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_clear_texture */ - -#ifdef GL_ARB_clip_control - -static GLboolean _glewInit_GL_ARB_clip_control () -{ - GLboolean r = GL_FALSE; - - r = ((glClipControl = (PFNGLCLIPCONTROLPROC)glewGetProcAddress((const GLubyte*)"glClipControl")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_clip_control */ - -#ifdef GL_ARB_color_buffer_float - -static GLboolean _glewInit_GL_ARB_color_buffer_float () -{ - GLboolean r = GL_FALSE; - - r = ((glClampColorARB = (PFNGLCLAMPCOLORARBPROC)glewGetProcAddress((const GLubyte*)"glClampColorARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_color_buffer_float */ - -#ifdef GL_ARB_compute_shader - -static GLboolean _glewInit_GL_ARB_compute_shader () -{ - GLboolean r = GL_FALSE; - - r = ((glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC)glewGetProcAddress((const GLubyte*)"glDispatchCompute")) == NULL) || r; - r = ((glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDispatchComputeIndirect")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_compute_shader */ - -#ifdef GL_ARB_compute_variable_group_size - -static GLboolean _glewInit_GL_ARB_compute_variable_group_size () -{ - GLboolean r = GL_FALSE; - - r = ((glDispatchComputeGroupSizeARB = (PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC)glewGetProcAddress((const GLubyte*)"glDispatchComputeGroupSizeARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_compute_variable_group_size */ - -#ifdef GL_ARB_copy_buffer - -static GLboolean _glewInit_GL_ARB_copy_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyBufferSubData")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_copy_buffer */ - -#ifdef GL_ARB_copy_image - -static GLboolean _glewInit_GL_ARB_copy_image () -{ - GLboolean r = GL_FALSE; - - r = ((glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubData")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_copy_image */ - -#ifdef GL_ARB_debug_output - -static GLboolean _glewInit_GL_ARB_debug_output () -{ - GLboolean r = GL_FALSE; - - r = ((glDebugMessageCallbackARB = (PFNGLDEBUGMESSAGECALLBACKARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallbackARB")) == NULL) || r; - r = ((glDebugMessageControlARB = (PFNGLDEBUGMESSAGECONTROLARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageControlARB")) == NULL) || r; - r = ((glDebugMessageInsertARB = (PFNGLDEBUGMESSAGEINSERTARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsertARB")) == NULL) || r; - r = ((glGetDebugMessageLogARB = (PFNGLGETDEBUGMESSAGELOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLogARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_debug_output */ - -#ifdef GL_ARB_direct_state_access - -static GLboolean _glewInit_GL_ARB_direct_state_access () -{ - GLboolean r = GL_FALSE; - - r = ((glBindTextureUnit = (PFNGLBINDTEXTUREUNITPROC)glewGetProcAddress((const GLubyte*)"glBindTextureUnit")) == NULL) || r; - r = ((glBlitNamedFramebuffer = (PFNGLBLITNAMEDFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBlitNamedFramebuffer")) == NULL) || r; - r = ((glCheckNamedFramebufferStatus = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC)glewGetProcAddress((const GLubyte*)"glCheckNamedFramebufferStatus")) == NULL) || r; - r = ((glClearNamedBufferData = (PFNGLCLEARNAMEDBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferData")) == NULL) || r; - r = ((glClearNamedBufferSubData = (PFNGLCLEARNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferSubData")) == NULL) || r; - r = ((glClearNamedFramebufferfi = (PFNGLCLEARNAMEDFRAMEBUFFERFIPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferfi")) == NULL) || r; - r = ((glClearNamedFramebufferfv = (PFNGLCLEARNAMEDFRAMEBUFFERFVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferfv")) == NULL) || r; - r = ((glClearNamedFramebufferiv = (PFNGLCLEARNAMEDFRAMEBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferiv")) == NULL) || r; - r = ((glClearNamedFramebufferuiv = (PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferuiv")) == NULL) || r; - r = ((glCompressedTextureSubImage1D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage1D")) == NULL) || r; - r = ((glCompressedTextureSubImage2D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage2D")) == NULL) || r; - r = ((glCompressedTextureSubImage3D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage3D")) == NULL) || r; - r = ((glCopyNamedBufferSubData = (PFNGLCOPYNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyNamedBufferSubData")) == NULL) || r; - r = ((glCopyTextureSubImage1D = (PFNGLCOPYTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage1D")) == NULL) || r; - r = ((glCopyTextureSubImage2D = (PFNGLCOPYTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage2D")) == NULL) || r; - r = ((glCopyTextureSubImage3D = (PFNGLCOPYTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage3D")) == NULL) || r; - r = ((glCreateBuffers = (PFNGLCREATEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateBuffers")) == NULL) || r; - r = ((glCreateFramebuffers = (PFNGLCREATEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateFramebuffers")) == NULL) || r; - r = ((glCreateProgramPipelines = (PFNGLCREATEPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glCreateProgramPipelines")) == NULL) || r; - r = ((glCreateQueries = (PFNGLCREATEQUERIESPROC)glewGetProcAddress((const GLubyte*)"glCreateQueries")) == NULL) || r; - r = ((glCreateRenderbuffers = (PFNGLCREATERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateRenderbuffers")) == NULL) || r; - r = ((glCreateSamplers = (PFNGLCREATESAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glCreateSamplers")) == NULL) || r; - r = ((glCreateTextures = (PFNGLCREATETEXTURESPROC)glewGetProcAddress((const GLubyte*)"glCreateTextures")) == NULL) || r; - r = ((glCreateTransformFeedbacks = (PFNGLCREATETRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glCreateTransformFeedbacks")) == NULL) || r; - r = ((glCreateVertexArrays = (PFNGLCREATEVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glCreateVertexArrays")) == NULL) || r; - r = ((glDisableVertexArrayAttrib = (PFNGLDISABLEVERTEXARRAYATTRIBPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayAttrib")) == NULL) || r; - r = ((glEnableVertexArrayAttrib = (PFNGLENABLEVERTEXARRAYATTRIBPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayAttrib")) == NULL) || r; - r = ((glFlushMappedNamedBufferRange = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedNamedBufferRange")) == NULL) || r; - r = ((glGenerateTextureMipmap = (PFNGLGENERATETEXTUREMIPMAPPROC)glewGetProcAddress((const GLubyte*)"glGenerateTextureMipmap")) == NULL) || r; - r = ((glGetCompressedTextureImage = (PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureImage")) == NULL) || r; - r = ((glGetNamedBufferParameteri64v = (PFNGLGETNAMEDBUFFERPARAMETERI64VPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameteri64v")) == NULL) || r; - r = ((glGetNamedBufferParameteriv = (PFNGLGETNAMEDBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameteriv")) == NULL) || r; - r = ((glGetNamedBufferPointerv = (PFNGLGETNAMEDBUFFERPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferPointerv")) == NULL) || r; - r = ((glGetNamedBufferSubData = (PFNGLGETNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferSubData")) == NULL) || r; - r = ((glGetNamedFramebufferAttachmentParameteriv = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferAttachmentParameteriv")) == NULL) || r; - r = ((glGetNamedFramebufferParameteriv = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameteriv")) == NULL) || r; - r = ((glGetNamedRenderbufferParameteriv = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedRenderbufferParameteriv")) == NULL) || r; - r = ((glGetQueryBufferObjecti64v = (PFNGLGETQUERYBUFFEROBJECTI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjecti64v")) == NULL) || r; - r = ((glGetQueryBufferObjectiv = (PFNGLGETQUERYBUFFEROBJECTIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectiv")) == NULL) || r; - r = ((glGetQueryBufferObjectui64v = (PFNGLGETQUERYBUFFEROBJECTUI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectui64v")) == NULL) || r; - r = ((glGetQueryBufferObjectuiv = (PFNGLGETQUERYBUFFEROBJECTUIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectuiv")) == NULL) || r; - r = ((glGetTextureImage = (PFNGLGETTEXTUREIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetTextureImage")) == NULL) || r; - r = ((glGetTextureLevelParameterfv = (PFNGLGETTEXTURELEVELPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterfv")) == NULL) || r; - r = ((glGetTextureLevelParameteriv = (PFNGLGETTEXTURELEVELPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameteriv")) == NULL) || r; - r = ((glGetTextureParameterIiv = (PFNGLGETTEXTUREPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIiv")) == NULL) || r; - r = ((glGetTextureParameterIuiv = (PFNGLGETTEXTUREPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIuiv")) == NULL) || r; - r = ((glGetTextureParameterfv = (PFNGLGETTEXTUREPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterfv")) == NULL) || r; - r = ((glGetTextureParameteriv = (PFNGLGETTEXTUREPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameteriv")) == NULL) || r; - r = ((glGetTransformFeedbacki64_v = (PFNGLGETTRANSFORMFEEDBACKI64_VPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbacki64_v")) == NULL) || r; - r = ((glGetTransformFeedbacki_v = (PFNGLGETTRANSFORMFEEDBACKI_VPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbacki_v")) == NULL) || r; - r = ((glGetTransformFeedbackiv = (PFNGLGETTRANSFORMFEEDBACKIVPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackiv")) == NULL) || r; - r = ((glGetVertexArrayIndexed64iv = (PFNGLGETVERTEXARRAYINDEXED64IVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIndexed64iv")) == NULL) || r; - r = ((glGetVertexArrayIndexediv = (PFNGLGETVERTEXARRAYINDEXEDIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIndexediv")) == NULL) || r; - r = ((glGetVertexArrayiv = (PFNGLGETVERTEXARRAYIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayiv")) == NULL) || r; - r = ((glInvalidateNamedFramebufferData = (PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateNamedFramebufferData")) == NULL) || r; - r = ((glInvalidateNamedFramebufferSubData = (PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateNamedFramebufferSubData")) == NULL) || r; - r = ((glMapNamedBuffer = (PFNGLMAPNAMEDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBuffer")) == NULL) || r; - r = ((glMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferRange")) == NULL) || r; - r = ((glNamedBufferData = (PFNGLNAMEDBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferData")) == NULL) || r; - r = ((glNamedBufferStorage = (PFNGLNAMEDBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorage")) == NULL) || r; - r = ((glNamedBufferSubData = (PFNGLNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferSubData")) == NULL) || r; - r = ((glNamedFramebufferDrawBuffer = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferDrawBuffer")) == NULL) || r; - r = ((glNamedFramebufferDrawBuffers = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferDrawBuffers")) == NULL) || r; - r = ((glNamedFramebufferParameteri = (PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferParameteri")) == NULL) || r; - r = ((glNamedFramebufferReadBuffer = (PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferReadBuffer")) == NULL) || r; - r = ((glNamedFramebufferRenderbuffer = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferRenderbuffer")) == NULL) || r; - r = ((glNamedFramebufferTexture = (PFNGLNAMEDFRAMEBUFFERTEXTUREPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture")) == NULL) || r; - r = ((glNamedFramebufferTextureLayer = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureLayer")) == NULL) || r; - r = ((glNamedRenderbufferStorage = (PFNGLNAMEDRENDERBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorage")) == NULL) || r; - r = ((glNamedRenderbufferStorageMultisample = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisample")) == NULL) || r; - r = ((glTextureBuffer = (PFNGLTEXTUREBUFFERPROC)glewGetProcAddress((const GLubyte*)"glTextureBuffer")) == NULL) || r; - r = ((glTextureBufferRange = (PFNGLTEXTUREBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferRange")) == NULL) || r; - r = ((glTextureParameterIiv = (PFNGLTEXTUREPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIiv")) == NULL) || r; - r = ((glTextureParameterIuiv = (PFNGLTEXTUREPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIuiv")) == NULL) || r; - r = ((glTextureParameterf = (PFNGLTEXTUREPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterf")) == NULL) || r; - r = ((glTextureParameterfv = (PFNGLTEXTUREPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfv")) == NULL) || r; - r = ((glTextureParameteri = (PFNGLTEXTUREPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteri")) == NULL) || r; - r = ((glTextureParameteriv = (PFNGLTEXTUREPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteriv")) == NULL) || r; - r = ((glTextureStorage1D = (PFNGLTEXTURESTORAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage1D")) == NULL) || r; - r = ((glTextureStorage2D = (PFNGLTEXTURESTORAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2D")) == NULL) || r; - r = ((glTextureStorage2DMultisample = (PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DMultisample")) == NULL) || r; - r = ((glTextureStorage3D = (PFNGLTEXTURESTORAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3D")) == NULL) || r; - r = ((glTextureStorage3DMultisample = (PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DMultisample")) == NULL) || r; - r = ((glTextureSubImage1D = (PFNGLTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage1D")) == NULL) || r; - r = ((glTextureSubImage2D = (PFNGLTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage2D")) == NULL) || r; - r = ((glTextureSubImage3D = (PFNGLTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage3D")) == NULL) || r; - r = ((glTransformFeedbackBufferBase = (PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackBufferBase")) == NULL) || r; - r = ((glTransformFeedbackBufferRange = (PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackBufferRange")) == NULL) || r; - r = ((glUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glUnmapNamedBuffer")) == NULL) || r; - r = ((glVertexArrayAttribBinding = (PFNGLVERTEXARRAYATTRIBBINDINGPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribBinding")) == NULL) || r; - r = ((glVertexArrayAttribFormat = (PFNGLVERTEXARRAYATTRIBFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribFormat")) == NULL) || r; - r = ((glVertexArrayAttribIFormat = (PFNGLVERTEXARRAYATTRIBIFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribIFormat")) == NULL) || r; - r = ((glVertexArrayAttribLFormat = (PFNGLVERTEXARRAYATTRIBLFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribLFormat")) == NULL) || r; - r = ((glVertexArrayBindingDivisor = (PFNGLVERTEXARRAYBINDINGDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayBindingDivisor")) == NULL) || r; - r = ((glVertexArrayElementBuffer = (PFNGLVERTEXARRAYELEMENTBUFFERPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayElementBuffer")) == NULL) || r; - r = ((glVertexArrayVertexBuffer = (PFNGLVERTEXARRAYVERTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBuffer")) == NULL) || r; - r = ((glVertexArrayVertexBuffers = (PFNGLVERTEXARRAYVERTEXBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBuffers")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_direct_state_access */ - -#ifdef GL_ARB_draw_buffers - -static GLboolean _glewInit_GL_ARB_draw_buffers () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawBuffersARB = (PFNGLDRAWBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_draw_buffers */ - -#ifdef GL_ARB_draw_buffers_blend - -static GLboolean _glewInit_GL_ARB_draw_buffers_blend () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationSeparateiARB = (PFNGLBLENDEQUATIONSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateiARB")) == NULL) || r; - r = ((glBlendEquationiARB = (PFNGLBLENDEQUATIONIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationiARB")) == NULL) || r; - r = ((glBlendFuncSeparateiARB = (PFNGLBLENDFUNCSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateiARB")) == NULL) || r; - r = ((glBlendFunciARB = (PFNGLBLENDFUNCIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendFunciARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_draw_buffers_blend */ - -#ifdef GL_ARB_draw_elements_base_vertex - -static GLboolean _glewInit_GL_ARB_draw_elements_base_vertex () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsBaseVertex")) == NULL) || r; - r = ((glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertex")) == NULL) || r; - r = ((glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsBaseVertex")) == NULL) || r; - r = ((glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsBaseVertex")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_draw_elements_base_vertex */ - -#ifdef GL_ARB_draw_indirect - -static GLboolean _glewInit_GL_ARB_draw_indirect () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysIndirect")) == NULL) || r; - r = ((glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsIndirect")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_draw_indirect */ - -#ifdef GL_ARB_framebuffer_no_attachments - -static GLboolean _glewInit_GL_ARB_framebuffer_no_attachments () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glFramebufferParameteri")) == NULL) || r; - r = ((glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameteriv")) == NULL) || r; - r = ((glGetNamedFramebufferParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameterivEXT")) == NULL) || r; - r = ((glNamedFramebufferParameteriEXT = (PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferParameteriEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_framebuffer_no_attachments */ - -#ifdef GL_ARB_framebuffer_object - -static GLboolean _glewInit_GL_ARB_framebuffer_object () -{ - GLboolean r = GL_FALSE; - - r = ((glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindFramebuffer")) == NULL) || r; - r = ((glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbuffer")) == NULL) || r; - r = ((glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebuffer")) == NULL) || r; - r = ((glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatus")) == NULL) || r; - r = ((glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffers")) == NULL) || r; - r = ((glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffers")) == NULL) || r; - r = ((glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbuffer")) == NULL) || r; - r = ((glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1D")) == NULL) || r; - r = ((glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2D")) == NULL) || r; - r = ((glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3D")) == NULL) || r; - r = ((glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayer")) == NULL) || r; - r = ((glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffers")) == NULL) || r; - r = ((glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffers")) == NULL) || r; - r = ((glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmap")) == NULL) || r; - r = ((glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameteriv")) == NULL) || r; - r = ((glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameteriv")) == NULL) || r; - r = ((glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsFramebuffer")) == NULL) || r; - r = ((glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbuffer")) == NULL) || r; - r = ((glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorage")) == NULL) || r; - r = ((glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisample")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_framebuffer_object */ - -#ifdef GL_ARB_geometry_shader4 - -static GLboolean _glewInit_GL_ARB_geometry_shader4 () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureARB")) == NULL) || r; - r = ((glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureFaceARB")) == NULL) || r; - r = ((glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerARB")) == NULL) || r; - r = ((glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteriARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_geometry_shader4 */ - -#ifdef GL_ARB_get_program_binary - -static GLboolean _glewInit_GL_ARB_get_program_binary () -{ - GLboolean r = GL_FALSE; - - r = ((glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC)glewGetProcAddress((const GLubyte*)"glGetProgramBinary")) == NULL) || r; - r = ((glProgramBinary = (PFNGLPROGRAMBINARYPROC)glewGetProcAddress((const GLubyte*)"glProgramBinary")) == NULL) || r; - r = ((glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteri")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_get_program_binary */ - -#ifdef GL_ARB_get_texture_sub_image - -static GLboolean _glewInit_GL_ARB_get_texture_sub_image () -{ - GLboolean r = GL_FALSE; - - r = ((glGetCompressedTextureSubImage = (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureSubImage")) == NULL) || r; - r = ((glGetTextureSubImage = (PFNGLGETTEXTURESUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSubImage")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_get_texture_sub_image */ - -#ifdef GL_ARB_gl_spirv - -static GLboolean _glewInit_GL_ARB_gl_spirv () -{ - GLboolean r = GL_FALSE; - - r = ((glSpecializeShaderARB = (PFNGLSPECIALIZESHADERARBPROC)glewGetProcAddress((const GLubyte*)"glSpecializeShaderARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_gl_spirv */ - -#ifdef GL_ARB_gpu_shader_fp64 - -static GLboolean _glewInit_GL_ARB_gpu_shader_fp64 () -{ - GLboolean r = GL_FALSE; - - r = ((glGetUniformdv = (PFNGLGETUNIFORMDVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformdv")) == NULL) || r; - r = ((glUniform1d = (PFNGLUNIFORM1DPROC)glewGetProcAddress((const GLubyte*)"glUniform1d")) == NULL) || r; - r = ((glUniform1dv = (PFNGLUNIFORM1DVPROC)glewGetProcAddress((const GLubyte*)"glUniform1dv")) == NULL) || r; - r = ((glUniform2d = (PFNGLUNIFORM2DPROC)glewGetProcAddress((const GLubyte*)"glUniform2d")) == NULL) || r; - r = ((glUniform2dv = (PFNGLUNIFORM2DVPROC)glewGetProcAddress((const GLubyte*)"glUniform2dv")) == NULL) || r; - r = ((glUniform3d = (PFNGLUNIFORM3DPROC)glewGetProcAddress((const GLubyte*)"glUniform3d")) == NULL) || r; - r = ((glUniform3dv = (PFNGLUNIFORM3DVPROC)glewGetProcAddress((const GLubyte*)"glUniform3dv")) == NULL) || r; - r = ((glUniform4d = (PFNGLUNIFORM4DPROC)glewGetProcAddress((const GLubyte*)"glUniform4d")) == NULL) || r; - r = ((glUniform4dv = (PFNGLUNIFORM4DVPROC)glewGetProcAddress((const GLubyte*)"glUniform4dv")) == NULL) || r; - r = ((glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2dv")) == NULL) || r; - r = ((glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3dv")) == NULL) || r; - r = ((glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4dv")) == NULL) || r; - r = ((glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3dv")) == NULL) || r; - r = ((glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2dv")) == NULL) || r; - r = ((glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4dv")) == NULL) || r; - r = ((glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4dv")) == NULL) || r; - r = ((glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2dv")) == NULL) || r; - r = ((glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3dv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_gpu_shader_fp64 */ - -#ifdef GL_ARB_gpu_shader_int64 - -static GLboolean _glewInit_GL_ARB_gpu_shader_int64 () -{ - GLboolean r = GL_FALSE; - - r = ((glGetUniformi64vARB = (PFNGLGETUNIFORMI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformi64vARB")) == NULL) || r; - r = ((glGetUniformui64vARB = (PFNGLGETUNIFORMUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformui64vARB")) == NULL) || r; - r = ((glGetnUniformi64vARB = (PFNGLGETNUNIFORMI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformi64vARB")) == NULL) || r; - r = ((glGetnUniformui64vARB = (PFNGLGETNUNIFORMUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformui64vARB")) == NULL) || r; - r = ((glProgramUniform1i64ARB = (PFNGLPROGRAMUNIFORM1I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64ARB")) == NULL) || r; - r = ((glProgramUniform1i64vARB = (PFNGLPROGRAMUNIFORM1I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64vARB")) == NULL) || r; - r = ((glProgramUniform1ui64ARB = (PFNGLPROGRAMUNIFORM1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64ARB")) == NULL) || r; - r = ((glProgramUniform1ui64vARB = (PFNGLPROGRAMUNIFORM1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64vARB")) == NULL) || r; - r = ((glProgramUniform2i64ARB = (PFNGLPROGRAMUNIFORM2I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64ARB")) == NULL) || r; - r = ((glProgramUniform2i64vARB = (PFNGLPROGRAMUNIFORM2I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64vARB")) == NULL) || r; - r = ((glProgramUniform2ui64ARB = (PFNGLPROGRAMUNIFORM2UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64ARB")) == NULL) || r; - r = ((glProgramUniform2ui64vARB = (PFNGLPROGRAMUNIFORM2UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64vARB")) == NULL) || r; - r = ((glProgramUniform3i64ARB = (PFNGLPROGRAMUNIFORM3I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64ARB")) == NULL) || r; - r = ((glProgramUniform3i64vARB = (PFNGLPROGRAMUNIFORM3I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64vARB")) == NULL) || r; - r = ((glProgramUniform3ui64ARB = (PFNGLPROGRAMUNIFORM3UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64ARB")) == NULL) || r; - r = ((glProgramUniform3ui64vARB = (PFNGLPROGRAMUNIFORM3UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64vARB")) == NULL) || r; - r = ((glProgramUniform4i64ARB = (PFNGLPROGRAMUNIFORM4I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64ARB")) == NULL) || r; - r = ((glProgramUniform4i64vARB = (PFNGLPROGRAMUNIFORM4I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64vARB")) == NULL) || r; - r = ((glProgramUniform4ui64ARB = (PFNGLPROGRAMUNIFORM4UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64ARB")) == NULL) || r; - r = ((glProgramUniform4ui64vARB = (PFNGLPROGRAMUNIFORM4UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64vARB")) == NULL) || r; - r = ((glUniform1i64ARB = (PFNGLUNIFORM1I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64ARB")) == NULL) || r; - r = ((glUniform1i64vARB = (PFNGLUNIFORM1I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64vARB")) == NULL) || r; - r = ((glUniform1ui64ARB = (PFNGLUNIFORM1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64ARB")) == NULL) || r; - r = ((glUniform1ui64vARB = (PFNGLUNIFORM1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64vARB")) == NULL) || r; - r = ((glUniform2i64ARB = (PFNGLUNIFORM2I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64ARB")) == NULL) || r; - r = ((glUniform2i64vARB = (PFNGLUNIFORM2I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64vARB")) == NULL) || r; - r = ((glUniform2ui64ARB = (PFNGLUNIFORM2UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64ARB")) == NULL) || r; - r = ((glUniform2ui64vARB = (PFNGLUNIFORM2UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64vARB")) == NULL) || r; - r = ((glUniform3i64ARB = (PFNGLUNIFORM3I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64ARB")) == NULL) || r; - r = ((glUniform3i64vARB = (PFNGLUNIFORM3I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64vARB")) == NULL) || r; - r = ((glUniform3ui64ARB = (PFNGLUNIFORM3UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64ARB")) == NULL) || r; - r = ((glUniform3ui64vARB = (PFNGLUNIFORM3UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64vARB")) == NULL) || r; - r = ((glUniform4i64ARB = (PFNGLUNIFORM4I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64ARB")) == NULL) || r; - r = ((glUniform4i64vARB = (PFNGLUNIFORM4I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64vARB")) == NULL) || r; - r = ((glUniform4ui64ARB = (PFNGLUNIFORM4UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64ARB")) == NULL) || r; - r = ((glUniform4ui64vARB = (PFNGLUNIFORM4UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64vARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_gpu_shader_int64 */ - -#ifdef GL_ARB_imaging - -static GLboolean _glewInit_GL_ARB_imaging () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r; - r = ((glColorSubTable = (PFNGLCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorSubTable")) == NULL) || r; - r = ((glColorTable = (PFNGLCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorTable")) == NULL) || r; - r = ((glColorTableParameterfv = (PFNGLCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfv")) == NULL) || r; - r = ((glColorTableParameteriv = (PFNGLCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameteriv")) == NULL) || r; - r = ((glConvolutionFilter1D = (PFNGLCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1D")) == NULL) || r; - r = ((glConvolutionFilter2D = (PFNGLCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2D")) == NULL) || r; - r = ((glConvolutionParameterf = (PFNGLCONVOLUTIONPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterf")) == NULL) || r; - r = ((glConvolutionParameterfv = (PFNGLCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfv")) == NULL) || r; - r = ((glConvolutionParameteri = (PFNGLCONVOLUTIONPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteri")) == NULL) || r; - r = ((glConvolutionParameteriv = (PFNGLCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriv")) == NULL) || r; - r = ((glCopyColorSubTable = (PFNGLCOPYCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTable")) == NULL) || r; - r = ((glCopyColorTable = (PFNGLCOPYCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTable")) == NULL) || r; - r = ((glCopyConvolutionFilter1D = (PFNGLCOPYCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1D")) == NULL) || r; - r = ((glCopyConvolutionFilter2D = (PFNGLCOPYCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2D")) == NULL) || r; - r = ((glGetColorTable = (PFNGLGETCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glGetColorTable")) == NULL) || r; - r = ((glGetColorTableParameterfv = (PFNGLGETCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfv")) == NULL) || r; - r = ((glGetColorTableParameteriv = (PFNGLGETCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameteriv")) == NULL) || r; - r = ((glGetConvolutionFilter = (PFNGLGETCONVOLUTIONFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilter")) == NULL) || r; - r = ((glGetConvolutionParameterfv = (PFNGLGETCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfv")) == NULL) || r; - r = ((glGetConvolutionParameteriv = (PFNGLGETCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameteriv")) == NULL) || r; - r = ((glGetHistogram = (PFNGLGETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glGetHistogram")) == NULL) || r; - r = ((glGetHistogramParameterfv = (PFNGLGETHISTOGRAMPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfv")) == NULL) || r; - r = ((glGetHistogramParameteriv = (PFNGLGETHISTOGRAMPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameteriv")) == NULL) || r; - r = ((glGetMinmax = (PFNGLGETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glGetMinmax")) == NULL) || r; - r = ((glGetMinmaxParameterfv = (PFNGLGETMINMAXPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfv")) == NULL) || r; - r = ((glGetMinmaxParameteriv = (PFNGLGETMINMAXPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameteriv")) == NULL) || r; - r = ((glGetSeparableFilter = (PFNGLGETSEPARABLEFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilter")) == NULL) || r; - r = ((glHistogram = (PFNGLHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glHistogram")) == NULL) || r; - r = ((glMinmax = (PFNGLMINMAXPROC)glewGetProcAddress((const GLubyte*)"glMinmax")) == NULL) || r; - r = ((glResetHistogram = (PFNGLRESETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glResetHistogram")) == NULL) || r; - r = ((glResetMinmax = (PFNGLRESETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glResetMinmax")) == NULL) || r; - r = ((glSeparableFilter2D = (PFNGLSEPARABLEFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2D")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_imaging */ - -#ifdef GL_ARB_indirect_parameters - -static GLboolean _glewInit_GL_ARB_indirect_parameters () -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysIndirectCountARB = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectCountARB")) == NULL) || r; - r = ((glMultiDrawElementsIndirectCountARB = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectCountARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_indirect_parameters */ - -#ifdef GL_ARB_instanced_arrays - -static GLboolean _glewInit_GL_ARB_instanced_arrays () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawArraysInstancedARB = (PFNGLDRAWARRAYSINSTANCEDARBPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedARB")) == NULL) || r; - r = ((glDrawElementsInstancedARB = (PFNGLDRAWELEMENTSINSTANCEDARBPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedARB")) == NULL) || r; - r = ((glVertexAttribDivisorARB = (PFNGLVERTEXATTRIBDIVISORARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_instanced_arrays */ - -#ifdef GL_ARB_internalformat_query - -static GLboolean _glewInit_GL_ARB_internalformat_query () -{ - GLboolean r = GL_FALSE; - - r = ((glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformativ")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_internalformat_query */ - -#ifdef GL_ARB_internalformat_query2 - -static GLboolean _glewInit_GL_ARB_internalformat_query2 () -{ - GLboolean r = GL_FALSE; - - r = ((glGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformati64v")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_internalformat_query2 */ - -#ifdef GL_ARB_invalidate_subdata - -static GLboolean _glewInit_GL_ARB_invalidate_subdata () -{ - GLboolean r = GL_FALSE; - - r = ((glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateBufferData")) == NULL) || r; - r = ((glInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateBufferSubData")) == NULL) || r; - r = ((glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glInvalidateFramebuffer")) == NULL) || r; - r = ((glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glInvalidateSubFramebuffer")) == NULL) || r; - r = ((glInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glInvalidateTexImage")) == NULL) || r; - r = ((glInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glInvalidateTexSubImage")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_invalidate_subdata */ - -#ifdef GL_ARB_map_buffer_range - -static GLboolean _glewInit_GL_ARB_map_buffer_range () -{ - GLboolean r = GL_FALSE; - - r = ((glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRange")) == NULL) || r; - r = ((glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glMapBufferRange")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_map_buffer_range */ - -#ifdef GL_ARB_matrix_palette - -static GLboolean _glewInit_GL_ARB_matrix_palette () -{ - GLboolean r = GL_FALSE; - - r = ((glCurrentPaletteMatrixARB = (PFNGLCURRENTPALETTEMATRIXARBPROC)glewGetProcAddress((const GLubyte*)"glCurrentPaletteMatrixARB")) == NULL) || r; - r = ((glMatrixIndexPointerARB = (PFNGLMATRIXINDEXPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexPointerARB")) == NULL) || r; - r = ((glMatrixIndexubvARB = (PFNGLMATRIXINDEXUBVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexubvARB")) == NULL) || r; - r = ((glMatrixIndexuivARB = (PFNGLMATRIXINDEXUIVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexuivARB")) == NULL) || r; - r = ((glMatrixIndexusvARB = (PFNGLMATRIXINDEXUSVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexusvARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_matrix_palette */ - -#ifdef GL_ARB_multi_bind - -static GLboolean _glewInit_GL_ARB_multi_bind () -{ - GLboolean r = GL_FALSE; - - r = ((glBindBuffersBase = (PFNGLBINDBUFFERSBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBuffersBase")) == NULL) || r; - r = ((glBindBuffersRange = (PFNGLBINDBUFFERSRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBuffersRange")) == NULL) || r; - r = ((glBindImageTextures = (PFNGLBINDIMAGETEXTURESPROC)glewGetProcAddress((const GLubyte*)"glBindImageTextures")) == NULL) || r; - r = ((glBindSamplers = (PFNGLBINDSAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glBindSamplers")) == NULL) || r; - r = ((glBindTextures = (PFNGLBINDTEXTURESPROC)glewGetProcAddress((const GLubyte*)"glBindTextures")) == NULL) || r; - r = ((glBindVertexBuffers = (PFNGLBINDVERTEXBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glBindVertexBuffers")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_multi_bind */ - -#ifdef GL_ARB_multi_draw_indirect - -static GLboolean _glewInit_GL_ARB_multi_draw_indirect () -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirect")) == NULL) || r; - r = ((glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirect")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_multi_draw_indirect */ - -#ifdef GL_ARB_multisample - -static GLboolean _glewInit_GL_ARB_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glSampleCoverageARB = (PFNGLSAMPLECOVERAGEARBPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverageARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_multisample */ - -#ifdef GL_ARB_multitexture - -static GLboolean _glewInit_GL_ARB_multitexture () -{ - GLboolean r = GL_FALSE; - - r = ((glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glActiveTextureARB")) == NULL) || r; - r = ((glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTextureARB")) == NULL) || r; - r = ((glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dARB")) == NULL) || r; - r = ((glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dvARB")) == NULL) || r; - r = ((glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fARB")) == NULL) || r; - r = ((glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fvARB")) == NULL) || r; - r = ((glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iARB")) == NULL) || r; - r = ((glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1ivARB")) == NULL) || r; - r = ((glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sARB")) == NULL) || r; - r = ((glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1svARB")) == NULL) || r; - r = ((glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dARB")) == NULL) || r; - r = ((glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dvARB")) == NULL) || r; - r = ((glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fARB")) == NULL) || r; - r = ((glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fvARB")) == NULL) || r; - r = ((glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iARB")) == NULL) || r; - r = ((glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2ivARB")) == NULL) || r; - r = ((glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sARB")) == NULL) || r; - r = ((glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2svARB")) == NULL) || r; - r = ((glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dARB")) == NULL) || r; - r = ((glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dvARB")) == NULL) || r; - r = ((glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fARB")) == NULL) || r; - r = ((glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fvARB")) == NULL) || r; - r = ((glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iARB")) == NULL) || r; - r = ((glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3ivARB")) == NULL) || r; - r = ((glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sARB")) == NULL) || r; - r = ((glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3svARB")) == NULL) || r; - r = ((glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dARB")) == NULL) || r; - r = ((glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dvARB")) == NULL) || r; - r = ((glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fARB")) == NULL) || r; - r = ((glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fvARB")) == NULL) || r; - r = ((glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iARB")) == NULL) || r; - r = ((glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4ivARB")) == NULL) || r; - r = ((glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sARB")) == NULL) || r; - r = ((glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4svARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_multitexture */ - -#ifdef GL_ARB_occlusion_query - -static GLboolean _glewInit_GL_ARB_occlusion_query () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginQueryARB = (PFNGLBEGINQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryARB")) == NULL) || r; - r = ((glDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesARB")) == NULL) || r; - r = ((glEndQueryARB = (PFNGLENDQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glEndQueryARB")) == NULL) || r; - r = ((glGenQueriesARB = (PFNGLGENQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesARB")) == NULL) || r; - r = ((glGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivARB")) == NULL) || r; - r = ((glGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivARB")) == NULL) || r; - r = ((glGetQueryivARB = (PFNGLGETQUERYIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivARB")) == NULL) || r; - r = ((glIsQueryARB = (PFNGLISQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glIsQueryARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_occlusion_query */ - -#ifdef GL_ARB_parallel_shader_compile - -static GLboolean _glewInit_GL_ARB_parallel_shader_compile () -{ - GLboolean r = GL_FALSE; - - r = ((glMaxShaderCompilerThreadsARB = (PFNGLMAXSHADERCOMPILERTHREADSARBPROC)glewGetProcAddress((const GLubyte*)"glMaxShaderCompilerThreadsARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_parallel_shader_compile */ - -#ifdef GL_ARB_point_parameters - -static GLboolean _glewInit_GL_ARB_point_parameters () -{ - GLboolean r = GL_FALSE; - - r = ((glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfARB")) == NULL) || r; - r = ((glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_point_parameters */ - -#ifdef GL_ARB_polygon_offset_clamp - -static GLboolean _glewInit_GL_ARB_polygon_offset_clamp () -{ - GLboolean r = GL_FALSE; - - r = ((glPolygonOffsetClamp = (PFNGLPOLYGONOFFSETCLAMPPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetClamp")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_polygon_offset_clamp */ - -#ifdef GL_ARB_program_interface_query - -static GLboolean _glewInit_GL_ARB_program_interface_query () -{ - GLboolean r = GL_FALSE; - - r = ((glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramInterfaceiv")) == NULL) || r; - r = ((glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceIndex")) == NULL) || r; - r = ((glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocation")) == NULL) || r; - r = ((glGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocationIndex")) == NULL) || r; - r = ((glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceName")) == NULL) || r; - r = ((glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceiv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_program_interface_query */ - -#ifdef GL_ARB_provoking_vertex - -static GLboolean _glewInit_GL_ARB_provoking_vertex () -{ - GLboolean r = GL_FALSE; - - r = ((glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC)glewGetProcAddress((const GLubyte*)"glProvokingVertex")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_provoking_vertex */ - -#ifdef GL_ARB_robustness - -static GLboolean _glewInit_GL_ARB_robustness () -{ - GLboolean r = GL_FALSE; - - r = ((glGetGraphicsResetStatusARB = (PFNGLGETGRAPHICSRESETSTATUSARBPROC)glewGetProcAddress((const GLubyte*)"glGetGraphicsResetStatusARB")) == NULL) || r; - r = ((glGetnColorTableARB = (PFNGLGETNCOLORTABLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnColorTableARB")) == NULL) || r; - r = ((glGetnCompressedTexImageARB = (PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnCompressedTexImageARB")) == NULL) || r; - r = ((glGetnConvolutionFilterARB = (PFNGLGETNCONVOLUTIONFILTERARBPROC)glewGetProcAddress((const GLubyte*)"glGetnConvolutionFilterARB")) == NULL) || r; - r = ((glGetnHistogramARB = (PFNGLGETNHISTOGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glGetnHistogramARB")) == NULL) || r; - r = ((glGetnMapdvARB = (PFNGLGETNMAPDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapdvARB")) == NULL) || r; - r = ((glGetnMapfvARB = (PFNGLGETNMAPFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapfvARB")) == NULL) || r; - r = ((glGetnMapivARB = (PFNGLGETNMAPIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapivARB")) == NULL) || r; - r = ((glGetnMinmaxARB = (PFNGLGETNMINMAXARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMinmaxARB")) == NULL) || r; - r = ((glGetnPixelMapfvARB = (PFNGLGETNPIXELMAPFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapfvARB")) == NULL) || r; - r = ((glGetnPixelMapuivARB = (PFNGLGETNPIXELMAPUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapuivARB")) == NULL) || r; - r = ((glGetnPixelMapusvARB = (PFNGLGETNPIXELMAPUSVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapusvARB")) == NULL) || r; - r = ((glGetnPolygonStippleARB = (PFNGLGETNPOLYGONSTIPPLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPolygonStippleARB")) == NULL) || r; - r = ((glGetnSeparableFilterARB = (PFNGLGETNSEPARABLEFILTERARBPROC)glewGetProcAddress((const GLubyte*)"glGetnSeparableFilterARB")) == NULL) || r; - r = ((glGetnTexImageARB = (PFNGLGETNTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnTexImageARB")) == NULL) || r; - r = ((glGetnUniformdvARB = (PFNGLGETNUNIFORMDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformdvARB")) == NULL) || r; - r = ((glGetnUniformfvARB = (PFNGLGETNUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformfvARB")) == NULL) || r; - r = ((glGetnUniformivARB = (PFNGLGETNUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformivARB")) == NULL) || r; - r = ((glGetnUniformuivARB = (PFNGLGETNUNIFORMUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformuivARB")) == NULL) || r; - r = ((glReadnPixelsARB = (PFNGLREADNPIXELSARBPROC)glewGetProcAddress((const GLubyte*)"glReadnPixelsARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_robustness */ - -#ifdef GL_ARB_sample_locations - -static GLboolean _glewInit_GL_ARB_sample_locations () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferSampleLocationsfvARB = (PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferSampleLocationsfvARB")) == NULL) || r; - r = ((glNamedFramebufferSampleLocationsfvARB = (PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferSampleLocationsfvARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_sample_locations */ - -#ifdef GL_ARB_sample_shading - -static GLboolean _glewInit_GL_ARB_sample_shading () -{ - GLboolean r = GL_FALSE; - - r = ((glMinSampleShadingARB = (PFNGLMINSAMPLESHADINGARBPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShadingARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_sample_shading */ - -#ifdef GL_ARB_sampler_objects - -static GLboolean _glewInit_GL_ARB_sampler_objects () -{ - GLboolean r = GL_FALSE; - - r = ((glBindSampler = (PFNGLBINDSAMPLERPROC)glewGetProcAddress((const GLubyte*)"glBindSampler")) == NULL) || r; - r = ((glDeleteSamplers = (PFNGLDELETESAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteSamplers")) == NULL) || r; - r = ((glGenSamplers = (PFNGLGENSAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glGenSamplers")) == NULL) || r; - r = ((glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIiv")) == NULL) || r; - r = ((glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIuiv")) == NULL) || r; - r = ((glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterfv")) == NULL) || r; - r = ((glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameteriv")) == NULL) || r; - r = ((glIsSampler = (PFNGLISSAMPLERPROC)glewGetProcAddress((const GLubyte*)"glIsSampler")) == NULL) || r; - r = ((glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIiv")) == NULL) || r; - r = ((glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIuiv")) == NULL) || r; - r = ((glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterf")) == NULL) || r; - r = ((glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterfv")) == NULL) || r; - r = ((glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameteri")) == NULL) || r; - r = ((glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameteriv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_sampler_objects */ - -#ifdef GL_ARB_separate_shader_objects - -static GLboolean _glewInit_GL_ARB_separate_shader_objects () -{ - GLboolean r = GL_FALSE; - - r = ((glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glActiveShaderProgram")) == NULL) || r; - r = ((glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glBindProgramPipeline")) == NULL) || r; - r = ((glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderProgramv")) == NULL) || r; - r = ((glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramPipelines")) == NULL) || r; - r = ((glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glGenProgramPipelines")) == NULL) || r; - r = ((glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramPipelineInfoLog")) == NULL) || r; - r = ((glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramPipelineiv")) == NULL) || r; - r = ((glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glIsProgramPipeline")) == NULL) || r; - r = ((glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1d")) == NULL) || r; - r = ((glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1dv")) == NULL) || r; - r = ((glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1f")) == NULL) || r; - r = ((glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fv")) == NULL) || r; - r = ((glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i")) == NULL) || r; - r = ((glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iv")) == NULL) || r; - r = ((glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui")) == NULL) || r; - r = ((glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiv")) == NULL) || r; - r = ((glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2d")) == NULL) || r; - r = ((glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2dv")) == NULL) || r; - r = ((glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2f")) == NULL) || r; - r = ((glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fv")) == NULL) || r; - r = ((glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i")) == NULL) || r; - r = ((glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iv")) == NULL) || r; - r = ((glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui")) == NULL) || r; - r = ((glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiv")) == NULL) || r; - r = ((glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3d")) == NULL) || r; - r = ((glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3dv")) == NULL) || r; - r = ((glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3f")) == NULL) || r; - r = ((glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fv")) == NULL) || r; - r = ((glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i")) == NULL) || r; - r = ((glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iv")) == NULL) || r; - r = ((glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui")) == NULL) || r; - r = ((glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiv")) == NULL) || r; - r = ((glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4d")) == NULL) || r; - r = ((glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4dv")) == NULL) || r; - r = ((glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4f")) == NULL) || r; - r = ((glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fv")) == NULL) || r; - r = ((glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i")) == NULL) || r; - r = ((glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iv")) == NULL) || r; - r = ((glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui")) == NULL) || r; - r = ((glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiv")) == NULL) || r; - r = ((glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2dv")) == NULL) || r; - r = ((glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fv")) == NULL) || r; - r = ((glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3dv")) == NULL) || r; - r = ((glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fv")) == NULL) || r; - r = ((glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4dv")) == NULL) || r; - r = ((glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fv")) == NULL) || r; - r = ((glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3dv")) == NULL) || r; - r = ((glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fv")) == NULL) || r; - r = ((glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2dv")) == NULL) || r; - r = ((glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fv")) == NULL) || r; - r = ((glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4dv")) == NULL) || r; - r = ((glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fv")) == NULL) || r; - r = ((glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4dv")) == NULL) || r; - r = ((glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fv")) == NULL) || r; - r = ((glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2dv")) == NULL) || r; - r = ((glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fv")) == NULL) || r; - r = ((glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3dv")) == NULL) || r; - r = ((glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fv")) == NULL) || r; - r = ((glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC)glewGetProcAddress((const GLubyte*)"glUseProgramStages")) == NULL) || r; - r = ((glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramPipeline")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_separate_shader_objects */ - -#ifdef GL_ARB_shader_atomic_counters - -static GLboolean _glewInit_GL_ARB_shader_atomic_counters () -{ - GLboolean r = GL_FALSE; - - r = ((glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAtomicCounterBufferiv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_shader_atomic_counters */ - -#ifdef GL_ARB_shader_image_load_store - -static GLboolean _glewInit_GL_ARB_shader_image_load_store () -{ - GLboolean r = GL_FALSE; - - r = ((glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glBindImageTexture")) == NULL) || r; - r = ((glMemoryBarrier = (PFNGLMEMORYBARRIERPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrier")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_shader_image_load_store */ - -#ifdef GL_ARB_shader_objects - -static GLboolean _glewInit_GL_ARB_shader_objects () -{ - GLboolean r = GL_FALSE; - - r = ((glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glAttachObjectARB")) == NULL) || r; - r = ((glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderARB")) == NULL) || r; - r = ((glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateProgramObjectARB")) == NULL) || r; - r = ((glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderObjectARB")) == NULL) || r; - r = ((glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteObjectARB")) == NULL) || r; - r = ((glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDetachObjectARB")) == NULL) || r; - r = ((glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformARB")) == NULL) || r; - r = ((glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedObjectsARB")) == NULL) || r; - r = ((glGetHandleARB = (PFNGLGETHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetHandleARB")) == NULL) || r; - r = ((glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetInfoLogARB")) == NULL) || r; - r = ((glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterfvARB")) == NULL) || r; - r = ((glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivARB")) == NULL) || r; - r = ((glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSourceARB")) == NULL) || r; - r = ((glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocationARB")) == NULL) || r; - r = ((glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfvARB")) == NULL) || r; - r = ((glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformivARB")) == NULL) || r; - r = ((glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glLinkProgramARB")) == NULL) || r; - r = ((glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glShaderSourceARB")) == NULL) || r; - r = ((glUniform1fARB = (PFNGLUNIFORM1FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fARB")) == NULL) || r; - r = ((glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fvARB")) == NULL) || r; - r = ((glUniform1iARB = (PFNGLUNIFORM1IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1iARB")) == NULL) || r; - r = ((glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ivARB")) == NULL) || r; - r = ((glUniform2fARB = (PFNGLUNIFORM2FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fARB")) == NULL) || r; - r = ((glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fvARB")) == NULL) || r; - r = ((glUniform2iARB = (PFNGLUNIFORM2IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2iARB")) == NULL) || r; - r = ((glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ivARB")) == NULL) || r; - r = ((glUniform3fARB = (PFNGLUNIFORM3FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fARB")) == NULL) || r; - r = ((glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fvARB")) == NULL) || r; - r = ((glUniform3iARB = (PFNGLUNIFORM3IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3iARB")) == NULL) || r; - r = ((glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ivARB")) == NULL) || r; - r = ((glUniform4fARB = (PFNGLUNIFORM4FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fARB")) == NULL) || r; - r = ((glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fvARB")) == NULL) || r; - r = ((glUniform4iARB = (PFNGLUNIFORM4IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4iARB")) == NULL) || r; - r = ((glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ivARB")) == NULL) || r; - r = ((glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fvARB")) == NULL) || r; - r = ((glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fvARB")) == NULL) || r; - r = ((glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fvARB")) == NULL) || r; - r = ((glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glUseProgramObjectARB")) == NULL) || r; - r = ((glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_shader_objects */ - -#ifdef GL_ARB_shader_storage_buffer_object - -static GLboolean _glewInit_GL_ARB_shader_storage_buffer_object () -{ - GLboolean r = GL_FALSE; - - r = ((glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC)glewGetProcAddress((const GLubyte*)"glShaderStorageBlockBinding")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_shader_storage_buffer_object */ - -#ifdef GL_ARB_shader_subroutine - -static GLboolean _glewInit_GL_ARB_shader_subroutine () -{ - GLboolean r = GL_FALSE; - - r = ((glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineName")) == NULL) || r; - r = ((glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineUniformName")) == NULL) || r; - r = ((glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineUniformiv")) == NULL) || r; - r = ((glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStageiv")) == NULL) || r; - r = ((glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetSubroutineIndex")) == NULL) || r; - r = ((glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetSubroutineUniformLocation")) == NULL) || r; - r = ((glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformSubroutineuiv")) == NULL) || r; - r = ((glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC)glewGetProcAddress((const GLubyte*)"glUniformSubroutinesuiv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_shader_subroutine */ - -#ifdef GL_ARB_shading_language_include - -static GLboolean _glewInit_GL_ARB_shading_language_include () -{ - GLboolean r = GL_FALSE; - - r = ((glCompileShaderIncludeARB = (PFNGLCOMPILESHADERINCLUDEARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderIncludeARB")) == NULL) || r; - r = ((glDeleteNamedStringARB = (PFNGLDELETENAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteNamedStringARB")) == NULL) || r; - r = ((glGetNamedStringARB = (PFNGLGETNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetNamedStringARB")) == NULL) || r; - r = ((glGetNamedStringivARB = (PFNGLGETNAMEDSTRINGIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetNamedStringivARB")) == NULL) || r; - r = ((glIsNamedStringARB = (PFNGLISNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glIsNamedStringARB")) == NULL) || r; - r = ((glNamedStringARB = (PFNGLNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glNamedStringARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_shading_language_include */ - -#ifdef GL_ARB_sparse_buffer - -static GLboolean _glewInit_GL_ARB_sparse_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((glBufferPageCommitmentARB = (PFNGLBUFFERPAGECOMMITMENTARBPROC)glewGetProcAddress((const GLubyte*)"glBufferPageCommitmentARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_sparse_buffer */ - -#ifdef GL_ARB_sparse_texture - -static GLboolean _glewInit_GL_ARB_sparse_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glTexPageCommitmentARB = (PFNGLTEXPAGECOMMITMENTARBPROC)glewGetProcAddress((const GLubyte*)"glTexPageCommitmentARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_sparse_texture */ - -#ifdef GL_ARB_sync - -static GLboolean _glewInit_GL_ARB_sync () -{ - GLboolean r = GL_FALSE; - - r = ((glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"glClientWaitSync")) == NULL) || r; - r = ((glDeleteSync = (PFNGLDELETESYNCPROC)glewGetProcAddress((const GLubyte*)"glDeleteSync")) == NULL) || r; - r = ((glFenceSync = (PFNGLFENCESYNCPROC)glewGetProcAddress((const GLubyte*)"glFenceSync")) == NULL) || r; - r = ((glGetInteger64v = (PFNGLGETINTEGER64VPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64v")) == NULL) || r; - r = ((glGetSynciv = (PFNGLGETSYNCIVPROC)glewGetProcAddress((const GLubyte*)"glGetSynciv")) == NULL) || r; - r = ((glIsSync = (PFNGLISSYNCPROC)glewGetProcAddress((const GLubyte*)"glIsSync")) == NULL) || r; - r = ((glWaitSync = (PFNGLWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"glWaitSync")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_sync */ - -#ifdef GL_ARB_tessellation_shader - -static GLboolean _glewInit_GL_ARB_tessellation_shader () -{ - GLboolean r = GL_FALSE; - - r = ((glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPatchParameterfv")) == NULL) || r; - r = ((glPatchParameteri = (PFNGLPATCHPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glPatchParameteri")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_tessellation_shader */ - -#ifdef GL_ARB_texture_barrier - -static GLboolean _glewInit_GL_ARB_texture_barrier () -{ - GLboolean r = GL_FALSE; - - r = ((glTextureBarrier = (PFNGLTEXTUREBARRIERPROC)glewGetProcAddress((const GLubyte*)"glTextureBarrier")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_barrier */ - -#ifdef GL_ARB_texture_buffer_object - -static GLboolean _glewInit_GL_ARB_texture_buffer_object () -{ - GLboolean r = GL_FALSE; - - r = ((glTexBufferARB = (PFNGLTEXBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glTexBufferARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_buffer_object */ - -#ifdef GL_ARB_texture_buffer_range - -static GLboolean _glewInit_GL_ARB_texture_buffer_range () -{ - GLboolean r = GL_FALSE; - - r = ((glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTexBufferRange")) == NULL) || r; - r = ((glTextureBufferRangeEXT = (PFNGLTEXTUREBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferRangeEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_buffer_range */ - -#ifdef GL_ARB_texture_compression - -static GLboolean _glewInit_GL_ARB_texture_compression () -{ - GLboolean r = GL_FALSE; - - r = ((glCompressedTexImage1DARB = (PFNGLCOMPRESSEDTEXIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1DARB")) == NULL) || r; - r = ((glCompressedTexImage2DARB = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2DARB")) == NULL) || r; - r = ((glCompressedTexImage3DARB = (PFNGLCOMPRESSEDTEXIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3DARB")) == NULL) || r; - r = ((glCompressedTexSubImage1DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1DARB")) == NULL) || r; - r = ((glCompressedTexSubImage2DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2DARB")) == NULL) || r; - r = ((glCompressedTexSubImage3DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3DARB")) == NULL) || r; - r = ((glGetCompressedTexImageARB = (PFNGLGETCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImageARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_compression */ - -#ifdef GL_ARB_texture_multisample - -static GLboolean _glewInit_GL_ARB_texture_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC)glewGetProcAddress((const GLubyte*)"glGetMultisamplefv")) == NULL) || r; - r = ((glSampleMaski = (PFNGLSAMPLEMASKIPROC)glewGetProcAddress((const GLubyte*)"glSampleMaski")) == NULL) || r; - r = ((glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexImage2DMultisample")) == NULL) || r; - r = ((glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DMultisample")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_multisample */ - -#ifdef GL_ARB_texture_storage - -static GLboolean _glewInit_GL_ARB_texture_storage () -{ - GLboolean r = GL_FALSE; - - r = ((glTexStorage1D = (PFNGLTEXSTORAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage1D")) == NULL) || r; - r = ((glTexStorage2D = (PFNGLTEXSTORAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2D")) == NULL) || r; - r = ((glTexStorage3D = (PFNGLTEXSTORAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3D")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_storage */ - -#ifdef GL_ARB_texture_storage_multisample - -static GLboolean _glewInit_GL_ARB_texture_storage_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2DMultisample")) == NULL) || r; - r = ((glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3DMultisample")) == NULL) || r; - r = ((glTextureStorage2DMultisampleEXT = (PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DMultisampleEXT")) == NULL) || r; - r = ((glTextureStorage3DMultisampleEXT = (PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DMultisampleEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_storage_multisample */ - -#ifdef GL_ARB_texture_view - -static GLboolean _glewInit_GL_ARB_texture_view () -{ - GLboolean r = GL_FALSE; - - r = ((glTextureView = (PFNGLTEXTUREVIEWPROC)glewGetProcAddress((const GLubyte*)"glTextureView")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_view */ - -#ifdef GL_ARB_timer_query - -static GLboolean _glewInit_GL_ARB_timer_query () -{ - GLboolean r = GL_FALSE; - - r = ((glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64v")) == NULL) || r; - r = ((glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64v")) == NULL) || r; - r = ((glQueryCounter = (PFNGLQUERYCOUNTERPROC)glewGetProcAddress((const GLubyte*)"glQueryCounter")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_timer_query */ - -#ifdef GL_ARB_transform_feedback2 - -static GLboolean _glewInit_GL_ARB_transform_feedback2 () -{ - GLboolean r = GL_FALSE; - - r = ((glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glBindTransformFeedback")) == NULL) || r; - r = ((glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glDeleteTransformFeedbacks")) == NULL) || r; - r = ((glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedback")) == NULL) || r; - r = ((glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glGenTransformFeedbacks")) == NULL) || r; - r = ((glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glIsTransformFeedback")) == NULL) || r; - r = ((glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glPauseTransformFeedback")) == NULL) || r; - r = ((glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glResumeTransformFeedback")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_transform_feedback2 */ - -#ifdef GL_ARB_transform_feedback3 - -static GLboolean _glewInit_GL_ARB_transform_feedback3 () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryIndexed")) == NULL) || r; - r = ((glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackStream")) == NULL) || r; - r = ((glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glEndQueryIndexed")) == NULL) || r; - r = ((glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryIndexediv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_transform_feedback3 */ - -#ifdef GL_ARB_transform_feedback_instanced - -static GLboolean _glewInit_GL_ARB_transform_feedback_instanced () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackInstanced")) == NULL) || r; - r = ((glDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackStreamInstanced")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_transform_feedback_instanced */ - -#ifdef GL_ARB_transpose_matrix - -static GLboolean _glewInit_GL_ARB_transpose_matrix () -{ - GLboolean r = GL_FALSE; - - r = ((glLoadTransposeMatrixdARB = (PFNGLLOADTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixdARB")) == NULL) || r; - r = ((glLoadTransposeMatrixfARB = (PFNGLLOADTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixfARB")) == NULL) || r; - r = ((glMultTransposeMatrixdARB = (PFNGLMULTTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixdARB")) == NULL) || r; - r = ((glMultTransposeMatrixfARB = (PFNGLMULTTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixfARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_transpose_matrix */ - -#ifdef GL_ARB_uniform_buffer_object - -static GLboolean _glewInit_GL_ARB_uniform_buffer_object () -{ - GLboolean r = GL_FALSE; - - r = ((glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBase")) == NULL) || r; - r = ((glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRange")) == NULL) || r; - r = ((glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformBlockName")) == NULL) || r; - r = ((glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformBlockiv")) == NULL) || r; - r = ((glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformName")) == NULL) || r; - r = ((glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformsiv")) == NULL) || r; - r = ((glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)glewGetProcAddress((const GLubyte*)"glGetIntegeri_v")) == NULL) || r; - r = ((glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetUniformBlockIndex")) == NULL) || r; - r = ((glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC)glewGetProcAddress((const GLubyte*)"glGetUniformIndices")) == NULL) || r; - r = ((glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)glewGetProcAddress((const GLubyte*)"glUniformBlockBinding")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_uniform_buffer_object */ - -#ifdef GL_ARB_vertex_array_object - -static GLboolean _glewInit_GL_ARB_vertex_array_object () -{ - GLboolean r = GL_FALSE; - - r = ((glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArray")) == NULL) || r; - r = ((glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArrays")) == NULL) || r; - r = ((glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArrays")) == NULL) || r; - r = ((glIsVertexArray = (PFNGLISVERTEXARRAYPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArray")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_array_object */ - -#ifdef GL_ARB_vertex_attrib_64bit - -static GLboolean _glewInit_GL_ARB_vertex_attrib_64bit () -{ - GLboolean r = GL_FALSE; - - r = ((glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLdv")) == NULL) || r; - r = ((glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1d")) == NULL) || r; - r = ((glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dv")) == NULL) || r; - r = ((glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2d")) == NULL) || r; - r = ((glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dv")) == NULL) || r; - r = ((glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3d")) == NULL) || r; - r = ((glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dv")) == NULL) || r; - r = ((glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4d")) == NULL) || r; - r = ((glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dv")) == NULL) || r; - r = ((glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLPointer")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_attrib_64bit */ - -#ifdef GL_ARB_vertex_attrib_binding - -static GLboolean _glewInit_GL_ARB_vertex_attrib_binding () -{ - GLboolean r = GL_FALSE; - - r = ((glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindVertexBuffer")) == NULL) || r; - r = ((glVertexArrayBindVertexBufferEXT = (PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayBindVertexBufferEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribBindingEXT = (PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribBindingEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribFormatEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribIFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribIFormatEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribLFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribLFormatEXT")) == NULL) || r; - r = ((glVertexArrayVertexBindingDivisorEXT = (PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBindingDivisorEXT")) == NULL) || r; - r = ((glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribBinding")) == NULL) || r; - r = ((glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribFormat")) == NULL) || r; - r = ((glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIFormat")) == NULL) || r; - r = ((glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLFormat")) == NULL) || r; - r = ((glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexBindingDivisor")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_attrib_binding */ - -#ifdef GL_ARB_vertex_blend - -static GLboolean _glewInit_GL_ARB_vertex_blend () -{ - GLboolean r = GL_FALSE; - - r = ((glVertexBlendARB = (PFNGLVERTEXBLENDARBPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendARB")) == NULL) || r; - r = ((glWeightPointerARB = (PFNGLWEIGHTPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glWeightPointerARB")) == NULL) || r; - r = ((glWeightbvARB = (PFNGLWEIGHTBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightbvARB")) == NULL) || r; - r = ((glWeightdvARB = (PFNGLWEIGHTDVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightdvARB")) == NULL) || r; - r = ((glWeightfvARB = (PFNGLWEIGHTFVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightfvARB")) == NULL) || r; - r = ((glWeightivARB = (PFNGLWEIGHTIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightivARB")) == NULL) || r; - r = ((glWeightsvARB = (PFNGLWEIGHTSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightsvARB")) == NULL) || r; - r = ((glWeightubvARB = (PFNGLWEIGHTUBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightubvARB")) == NULL) || r; - r = ((glWeightuivARB = (PFNGLWEIGHTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightuivARB")) == NULL) || r; - r = ((glWeightusvARB = (PFNGLWEIGHTUSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightusvARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_blend */ - -#ifdef GL_ARB_vertex_buffer_object - -static GLboolean _glewInit_GL_ARB_vertex_buffer_object () -{ - GLboolean r = GL_FALSE; - - r = ((glBindBufferARB = (PFNGLBINDBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glBindBufferARB")) == NULL) || r; - r = ((glBufferDataARB = (PFNGLBUFFERDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferDataARB")) == NULL) || r; - r = ((glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferSubDataARB")) == NULL) || r; - r = ((glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffersARB")) == NULL) || r; - r = ((glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glGenBuffersARB")) == NULL) || r; - r = ((glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterivARB")) == NULL) || r; - r = ((glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointervARB")) == NULL) || r; - r = ((glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubDataARB")) == NULL) || r; - r = ((glIsBufferARB = (PFNGLISBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glIsBufferARB")) == NULL) || r; - r = ((glMapBufferARB = (PFNGLMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glMapBufferARB")) == NULL) || r; - r = ((glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glUnmapBufferARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_buffer_object */ - -#ifdef GL_ARB_vertex_program - -static GLboolean _glewInit_GL_ARB_vertex_program () -{ - GLboolean r = GL_FALSE; - - r = ((glBindProgramARB = (PFNGLBINDPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glBindProgramARB")) == NULL) || r; - r = ((glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsARB")) == NULL) || r; - r = ((glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArrayARB")) == NULL) || r; - r = ((glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArrayARB")) == NULL) || r; - r = ((glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsARB")) == NULL) || r; - r = ((glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterdvARB")) == NULL) || r; - r = ((glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterfvARB")) == NULL) || r; - r = ((glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterdvARB")) == NULL) || r; - r = ((glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterfvARB")) == NULL) || r; - r = ((glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringARB")) == NULL) || r; - r = ((glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivARB")) == NULL) || r; - r = ((glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervARB")) == NULL) || r; - r = ((glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvARB")) == NULL) || r; - r = ((glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvARB")) == NULL) || r; - r = ((glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivARB")) == NULL) || r; - r = ((glIsProgramARB = (PFNGLISPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glIsProgramARB")) == NULL) || r; - r = ((glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dARB")) == NULL) || r; - r = ((glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dvARB")) == NULL) || r; - r = ((glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fARB")) == NULL) || r; - r = ((glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fvARB")) == NULL) || r; - r = ((glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dARB")) == NULL) || r; - r = ((glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dvARB")) == NULL) || r; - r = ((glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fARB")) == NULL) || r; - r = ((glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fvARB")) == NULL) || r; - r = ((glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glProgramStringARB")) == NULL) || r; - r = ((glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dARB")) == NULL) || r; - r = ((glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvARB")) == NULL) || r; - r = ((glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fARB")) == NULL) || r; - r = ((glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvARB")) == NULL) || r; - r = ((glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sARB")) == NULL) || r; - r = ((glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svARB")) == NULL) || r; - r = ((glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dARB")) == NULL) || r; - r = ((glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvARB")) == NULL) || r; - r = ((glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fARB")) == NULL) || r; - r = ((glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvARB")) == NULL) || r; - r = ((glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sARB")) == NULL) || r; - r = ((glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svARB")) == NULL) || r; - r = ((glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dARB")) == NULL) || r; - r = ((glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvARB")) == NULL) || r; - r = ((glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fARB")) == NULL) || r; - r = ((glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvARB")) == NULL) || r; - r = ((glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sARB")) == NULL) || r; - r = ((glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svARB")) == NULL) || r; - r = ((glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NbvARB")) == NULL) || r; - r = ((glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NivARB")) == NULL) || r; - r = ((glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NsvARB")) == NULL) || r; - r = ((glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubARB")) == NULL) || r; - r = ((glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubvARB")) == NULL) || r; - r = ((glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NuivARB")) == NULL) || r; - r = ((glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NusvARB")) == NULL) || r; - r = ((glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bvARB")) == NULL) || r; - r = ((glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dARB")) == NULL) || r; - r = ((glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvARB")) == NULL) || r; - r = ((glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fARB")) == NULL) || r; - r = ((glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvARB")) == NULL) || r; - r = ((glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ivARB")) == NULL) || r; - r = ((glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sARB")) == NULL) || r; - r = ((glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svARB")) == NULL) || r; - r = ((glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvARB")) == NULL) || r; - r = ((glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uivARB")) == NULL) || r; - r = ((glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usvARB")) == NULL) || r; - r = ((glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_program */ - -#ifdef GL_ARB_vertex_shader - -static GLboolean _glewInit_GL_ARB_vertex_shader () -{ - GLboolean r = GL_FALSE; - - r = ((glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocationARB")) == NULL) || r; - r = ((glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttribARB")) == NULL) || r; - r = ((glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocationARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_shader */ - -#ifdef GL_ARB_vertex_type_2_10_10_10_rev - -static GLboolean _glewInit_GL_ARB_vertex_type_2_10_10_10_rev () -{ - GLboolean r = GL_FALSE; - - r = ((glColorP3ui = (PFNGLCOLORP3UIPROC)glewGetProcAddress((const GLubyte*)"glColorP3ui")) == NULL) || r; - r = ((glColorP3uiv = (PFNGLCOLORP3UIVPROC)glewGetProcAddress((const GLubyte*)"glColorP3uiv")) == NULL) || r; - r = ((glColorP4ui = (PFNGLCOLORP4UIPROC)glewGetProcAddress((const GLubyte*)"glColorP4ui")) == NULL) || r; - r = ((glColorP4uiv = (PFNGLCOLORP4UIVPROC)glewGetProcAddress((const GLubyte*)"glColorP4uiv")) == NULL) || r; - r = ((glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP1ui")) == NULL) || r; - r = ((glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP1uiv")) == NULL) || r; - r = ((glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP2ui")) == NULL) || r; - r = ((glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP2uiv")) == NULL) || r; - r = ((glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP3ui")) == NULL) || r; - r = ((glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP3uiv")) == NULL) || r; - r = ((glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP4ui")) == NULL) || r; - r = ((glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP4uiv")) == NULL) || r; - r = ((glNormalP3ui = (PFNGLNORMALP3UIPROC)glewGetProcAddress((const GLubyte*)"glNormalP3ui")) == NULL) || r; - r = ((glNormalP3uiv = (PFNGLNORMALP3UIVPROC)glewGetProcAddress((const GLubyte*)"glNormalP3uiv")) == NULL) || r; - r = ((glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorP3ui")) == NULL) || r; - r = ((glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorP3uiv")) == NULL) || r; - r = ((glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP1ui")) == NULL) || r; - r = ((glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP1uiv")) == NULL) || r; - r = ((glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP2ui")) == NULL) || r; - r = ((glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP2uiv")) == NULL) || r; - r = ((glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP3ui")) == NULL) || r; - r = ((glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP3uiv")) == NULL) || r; - r = ((glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP4ui")) == NULL) || r; - r = ((glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP4uiv")) == NULL) || r; - r = ((glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP1ui")) == NULL) || r; - r = ((glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP1uiv")) == NULL) || r; - r = ((glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP2ui")) == NULL) || r; - r = ((glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP2uiv")) == NULL) || r; - r = ((glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP3ui")) == NULL) || r; - r = ((glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP3uiv")) == NULL) || r; - r = ((glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP4ui")) == NULL) || r; - r = ((glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP4uiv")) == NULL) || r; - r = ((glVertexP2ui = (PFNGLVERTEXP2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP2ui")) == NULL) || r; - r = ((glVertexP2uiv = (PFNGLVERTEXP2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP2uiv")) == NULL) || r; - r = ((glVertexP3ui = (PFNGLVERTEXP3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP3ui")) == NULL) || r; - r = ((glVertexP3uiv = (PFNGLVERTEXP3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP3uiv")) == NULL) || r; - r = ((glVertexP4ui = (PFNGLVERTEXP4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP4ui")) == NULL) || r; - r = ((glVertexP4uiv = (PFNGLVERTEXP4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP4uiv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ - -#ifdef GL_ARB_viewport_array - -static GLboolean _glewInit_GL_ARB_viewport_array () -{ - GLboolean r = GL_FALSE; - - r = ((glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeArrayv")) == NULL) || r; - r = ((glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeIndexed")) == NULL) || r; - r = ((glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC)glewGetProcAddress((const GLubyte*)"glGetDoublei_v")) == NULL) || r; - r = ((glGetFloati_v = (PFNGLGETFLOATI_VPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_v")) == NULL) || r; - r = ((glScissorArrayv = (PFNGLSCISSORARRAYVPROC)glewGetProcAddress((const GLubyte*)"glScissorArrayv")) == NULL) || r; - r = ((glScissorIndexed = (PFNGLSCISSORINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexed")) == NULL) || r; - r = ((glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexedv")) == NULL) || r; - r = ((glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC)glewGetProcAddress((const GLubyte*)"glViewportArrayv")) == NULL) || r; - r = ((glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedf")) == NULL) || r; - r = ((glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedfv")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_viewport_array */ - -#ifdef GL_ARB_window_pos - -static GLboolean _glewInit_GL_ARB_window_pos () -{ - GLboolean r = GL_FALSE; - - r = ((glWindowPos2dARB = (PFNGLWINDOWPOS2DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dARB")) == NULL) || r; - r = ((glWindowPos2dvARB = (PFNGLWINDOWPOS2DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvARB")) == NULL) || r; - r = ((glWindowPos2fARB = (PFNGLWINDOWPOS2FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fARB")) == NULL) || r; - r = ((glWindowPos2fvARB = (PFNGLWINDOWPOS2FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvARB")) == NULL) || r; - r = ((glWindowPos2iARB = (PFNGLWINDOWPOS2IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iARB")) == NULL) || r; - r = ((glWindowPos2ivARB = (PFNGLWINDOWPOS2IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivARB")) == NULL) || r; - r = ((glWindowPos2sARB = (PFNGLWINDOWPOS2SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sARB")) == NULL) || r; - r = ((glWindowPos2svARB = (PFNGLWINDOWPOS2SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svARB")) == NULL) || r; - r = ((glWindowPos3dARB = (PFNGLWINDOWPOS3DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dARB")) == NULL) || r; - r = ((glWindowPos3dvARB = (PFNGLWINDOWPOS3DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvARB")) == NULL) || r; - r = ((glWindowPos3fARB = (PFNGLWINDOWPOS3FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fARB")) == NULL) || r; - r = ((glWindowPos3fvARB = (PFNGLWINDOWPOS3FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvARB")) == NULL) || r; - r = ((glWindowPos3iARB = (PFNGLWINDOWPOS3IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iARB")) == NULL) || r; - r = ((glWindowPos3ivARB = (PFNGLWINDOWPOS3IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivARB")) == NULL) || r; - r = ((glWindowPos3sARB = (PFNGLWINDOWPOS3SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sARB")) == NULL) || r; - r = ((glWindowPos3svARB = (PFNGLWINDOWPOS3SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_window_pos */ - -#ifdef GL_ATI_draw_buffers - -static GLboolean _glewInit_GL_ATI_draw_buffers () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawBuffersATI = (PFNGLDRAWBUFFERSATIPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_draw_buffers */ - -#ifdef GL_ATI_element_array - -static GLboolean _glewInit_GL_ATI_element_array () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawElementArrayATI = (PFNGLDRAWELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayATI")) == NULL) || r; - r = ((glDrawRangeElementArrayATI = (PFNGLDRAWRANGEELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayATI")) == NULL) || r; - r = ((glElementPointerATI = (PFNGLELEMENTPOINTERATIPROC)glewGetProcAddress((const GLubyte*)"glElementPointerATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_element_array */ - -#ifdef GL_ATI_envmap_bumpmap - -static GLboolean _glewInit_GL_ATI_envmap_bumpmap () -{ - GLboolean r = GL_FALSE; - - r = ((glGetTexBumpParameterfvATI = (PFNGLGETTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterfvATI")) == NULL) || r; - r = ((glGetTexBumpParameterivATI = (PFNGLGETTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterivATI")) == NULL) || r; - r = ((glTexBumpParameterfvATI = (PFNGLTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterfvATI")) == NULL) || r; - r = ((glTexBumpParameterivATI = (PFNGLTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterivATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_envmap_bumpmap */ - -#ifdef GL_ATI_fragment_shader - -static GLboolean _glewInit_GL_ATI_fragment_shader () -{ - GLboolean r = GL_FALSE; - - r = ((glAlphaFragmentOp1ATI = (PFNGLALPHAFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp1ATI")) == NULL) || r; - r = ((glAlphaFragmentOp2ATI = (PFNGLALPHAFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp2ATI")) == NULL) || r; - r = ((glAlphaFragmentOp3ATI = (PFNGLALPHAFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp3ATI")) == NULL) || r; - r = ((glBeginFragmentShaderATI = (PFNGLBEGINFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBeginFragmentShaderATI")) == NULL) || r; - r = ((glBindFragmentShaderATI = (PFNGLBINDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBindFragmentShaderATI")) == NULL) || r; - r = ((glColorFragmentOp1ATI = (PFNGLCOLORFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp1ATI")) == NULL) || r; - r = ((glColorFragmentOp2ATI = (PFNGLCOLORFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp2ATI")) == NULL) || r; - r = ((glColorFragmentOp3ATI = (PFNGLCOLORFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp3ATI")) == NULL) || r; - r = ((glDeleteFragmentShaderATI = (PFNGLDELETEFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glDeleteFragmentShaderATI")) == NULL) || r; - r = ((glEndFragmentShaderATI = (PFNGLENDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glEndFragmentShaderATI")) == NULL) || r; - r = ((glGenFragmentShadersATI = (PFNGLGENFRAGMENTSHADERSATIPROC)glewGetProcAddress((const GLubyte*)"glGenFragmentShadersATI")) == NULL) || r; - r = ((glPassTexCoordATI = (PFNGLPASSTEXCOORDATIPROC)glewGetProcAddress((const GLubyte*)"glPassTexCoordATI")) == NULL) || r; - r = ((glSampleMapATI = (PFNGLSAMPLEMAPATIPROC)glewGetProcAddress((const GLubyte*)"glSampleMapATI")) == NULL) || r; - r = ((glSetFragmentShaderConstantATI = (PFNGLSETFRAGMENTSHADERCONSTANTATIPROC)glewGetProcAddress((const GLubyte*)"glSetFragmentShaderConstantATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_fragment_shader */ - -#ifdef GL_ATI_map_object_buffer - -static GLboolean _glewInit_GL_ATI_map_object_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((glMapObjectBufferATI = (PFNGLMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glMapObjectBufferATI")) == NULL) || r; - r = ((glUnmapObjectBufferATI = (PFNGLUNMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUnmapObjectBufferATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_map_object_buffer */ - -#ifdef GL_ATI_pn_triangles - -static GLboolean _glewInit_GL_ATI_pn_triangles () -{ - GLboolean r = GL_FALSE; - - r = ((glPNTrianglesfATI = (PFNGLPNTRIANGLESFATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesfATI")) == NULL) || r; - r = ((glPNTrianglesiATI = (PFNGLPNTRIANGLESIATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesiATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_pn_triangles */ - -#ifdef GL_ATI_separate_stencil - -static GLboolean _glewInit_GL_ATI_separate_stencil () -{ - GLboolean r = GL_FALSE; - - r = ((glStencilFuncSeparateATI = (PFNGLSTENCILFUNCSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparateATI")) == NULL) || r; - r = ((glStencilOpSeparateATI = (PFNGLSTENCILOPSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparateATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_separate_stencil */ - -#ifdef GL_ATI_vertex_array_object - -static GLboolean _glewInit_GL_ATI_vertex_array_object () -{ - GLboolean r = GL_FALSE; - - r = ((glArrayObjectATI = (PFNGLARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glArrayObjectATI")) == NULL) || r; - r = ((glFreeObjectBufferATI = (PFNGLFREEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glFreeObjectBufferATI")) == NULL) || r; - r = ((glGetArrayObjectfvATI = (PFNGLGETARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectfvATI")) == NULL) || r; - r = ((glGetArrayObjectivATI = (PFNGLGETARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectivATI")) == NULL) || r; - r = ((glGetObjectBufferfvATI = (PFNGLGETOBJECTBUFFERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferfvATI")) == NULL) || r; - r = ((glGetObjectBufferivATI = (PFNGLGETOBJECTBUFFERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferivATI")) == NULL) || r; - r = ((glGetVariantArrayObjectfvATI = (PFNGLGETVARIANTARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectfvATI")) == NULL) || r; - r = ((glGetVariantArrayObjectivATI = (PFNGLGETVARIANTARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectivATI")) == NULL) || r; - r = ((glIsObjectBufferATI = (PFNGLISOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glIsObjectBufferATI")) == NULL) || r; - r = ((glNewObjectBufferATI = (PFNGLNEWOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glNewObjectBufferATI")) == NULL) || r; - r = ((glUpdateObjectBufferATI = (PFNGLUPDATEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUpdateObjectBufferATI")) == NULL) || r; - r = ((glVariantArrayObjectATI = (PFNGLVARIANTARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVariantArrayObjectATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_vertex_array_object */ - -#ifdef GL_ATI_vertex_attrib_array_object - -static GLboolean _glewInit_GL_ATI_vertex_attrib_array_object () -{ - GLboolean r = GL_FALSE; - - r = ((glGetVertexAttribArrayObjectfvATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectfvATI")) == NULL) || r; - r = ((glGetVertexAttribArrayObjectivATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectivATI")) == NULL) || r; - r = ((glVertexAttribArrayObjectATI = (PFNGLVERTEXATTRIBARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribArrayObjectATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_vertex_attrib_array_object */ - -#ifdef GL_ATI_vertex_streams - -static GLboolean _glewInit_GL_ATI_vertex_streams () -{ - GLboolean r = GL_FALSE; - - r = ((glClientActiveVertexStreamATI = (PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC)glewGetProcAddress((const GLubyte*)"glClientActiveVertexStreamATI")) == NULL) || r; - r = ((glNormalStream3bATI = (PFNGLNORMALSTREAM3BATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bATI")) == NULL) || r; - r = ((glNormalStream3bvATI = (PFNGLNORMALSTREAM3BVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bvATI")) == NULL) || r; - r = ((glNormalStream3dATI = (PFNGLNORMALSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dATI")) == NULL) || r; - r = ((glNormalStream3dvATI = (PFNGLNORMALSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dvATI")) == NULL) || r; - r = ((glNormalStream3fATI = (PFNGLNORMALSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fATI")) == NULL) || r; - r = ((glNormalStream3fvATI = (PFNGLNORMALSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fvATI")) == NULL) || r; - r = ((glNormalStream3iATI = (PFNGLNORMALSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3iATI")) == NULL) || r; - r = ((glNormalStream3ivATI = (PFNGLNORMALSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3ivATI")) == NULL) || r; - r = ((glNormalStream3sATI = (PFNGLNORMALSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3sATI")) == NULL) || r; - r = ((glNormalStream3svATI = (PFNGLNORMALSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3svATI")) == NULL) || r; - r = ((glVertexBlendEnvfATI = (PFNGLVERTEXBLENDENVFATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnvfATI")) == NULL) || r; - r = ((glVertexBlendEnviATI = (PFNGLVERTEXBLENDENVIATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnviATI")) == NULL) || r; - r = ((glVertexStream1dATI = (PFNGLVERTEXSTREAM1DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1dATI")) == NULL) || r; - r = ((glVertexStream1dvATI = (PFNGLVERTEXSTREAM1DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1dvATI")) == NULL) || r; - r = ((glVertexStream1fATI = (PFNGLVERTEXSTREAM1FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1fATI")) == NULL) || r; - r = ((glVertexStream1fvATI = (PFNGLVERTEXSTREAM1FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1fvATI")) == NULL) || r; - r = ((glVertexStream1iATI = (PFNGLVERTEXSTREAM1IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1iATI")) == NULL) || r; - r = ((glVertexStream1ivATI = (PFNGLVERTEXSTREAM1IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1ivATI")) == NULL) || r; - r = ((glVertexStream1sATI = (PFNGLVERTEXSTREAM1SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1sATI")) == NULL) || r; - r = ((glVertexStream1svATI = (PFNGLVERTEXSTREAM1SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1svATI")) == NULL) || r; - r = ((glVertexStream2dATI = (PFNGLVERTEXSTREAM2DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dATI")) == NULL) || r; - r = ((glVertexStream2dvATI = (PFNGLVERTEXSTREAM2DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dvATI")) == NULL) || r; - r = ((glVertexStream2fATI = (PFNGLVERTEXSTREAM2FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fATI")) == NULL) || r; - r = ((glVertexStream2fvATI = (PFNGLVERTEXSTREAM2FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fvATI")) == NULL) || r; - r = ((glVertexStream2iATI = (PFNGLVERTEXSTREAM2IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2iATI")) == NULL) || r; - r = ((glVertexStream2ivATI = (PFNGLVERTEXSTREAM2IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2ivATI")) == NULL) || r; - r = ((glVertexStream2sATI = (PFNGLVERTEXSTREAM2SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2sATI")) == NULL) || r; - r = ((glVertexStream2svATI = (PFNGLVERTEXSTREAM2SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2svATI")) == NULL) || r; - r = ((glVertexStream3dATI = (PFNGLVERTEXSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dATI")) == NULL) || r; - r = ((glVertexStream3dvATI = (PFNGLVERTEXSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dvATI")) == NULL) || r; - r = ((glVertexStream3fATI = (PFNGLVERTEXSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fATI")) == NULL) || r; - r = ((glVertexStream3fvATI = (PFNGLVERTEXSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fvATI")) == NULL) || r; - r = ((glVertexStream3iATI = (PFNGLVERTEXSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3iATI")) == NULL) || r; - r = ((glVertexStream3ivATI = (PFNGLVERTEXSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3ivATI")) == NULL) || r; - r = ((glVertexStream3sATI = (PFNGLVERTEXSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3sATI")) == NULL) || r; - r = ((glVertexStream3svATI = (PFNGLVERTEXSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3svATI")) == NULL) || r; - r = ((glVertexStream4dATI = (PFNGLVERTEXSTREAM4DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dATI")) == NULL) || r; - r = ((glVertexStream4dvATI = (PFNGLVERTEXSTREAM4DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dvATI")) == NULL) || r; - r = ((glVertexStream4fATI = (PFNGLVERTEXSTREAM4FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fATI")) == NULL) || r; - r = ((glVertexStream4fvATI = (PFNGLVERTEXSTREAM4FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fvATI")) == NULL) || r; - r = ((glVertexStream4iATI = (PFNGLVERTEXSTREAM4IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4iATI")) == NULL) || r; - r = ((glVertexStream4ivATI = (PFNGLVERTEXSTREAM4IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4ivATI")) == NULL) || r; - r = ((glVertexStream4sATI = (PFNGLVERTEXSTREAM4SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4sATI")) == NULL) || r; - r = ((glVertexStream4svATI = (PFNGLVERTEXSTREAM4SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4svATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_vertex_streams */ - -#ifdef GL_EXT_base_instance - -static GLboolean _glewInit_GL_EXT_base_instance () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawArraysInstancedBaseInstanceEXT = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedBaseInstanceEXT")) == NULL) || r; - r = ((glDrawElementsInstancedBaseInstanceEXT = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseInstanceEXT")) == NULL) || r; - r = ((glDrawElementsInstancedBaseVertexBaseInstanceEXT = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertexBaseInstanceEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_base_instance */ - -#ifdef GL_EXT_bindable_uniform - -static GLboolean _glewInit_GL_EXT_bindable_uniform () -{ - GLboolean r = GL_FALSE; - - r = ((glGetUniformBufferSizeEXT = (PFNGLGETUNIFORMBUFFERSIZEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformBufferSizeEXT")) == NULL) || r; - r = ((glGetUniformOffsetEXT = (PFNGLGETUNIFORMOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformOffsetEXT")) == NULL) || r; - r = ((glUniformBufferEXT = (PFNGLUNIFORMBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glUniformBufferEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_bindable_uniform */ - -#ifdef GL_EXT_blend_color - -static GLboolean _glewInit_GL_EXT_blend_color () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendColorEXT = (PFNGLBLENDCOLOREXTPROC)glewGetProcAddress((const GLubyte*)"glBlendColorEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_blend_color */ - -#ifdef GL_EXT_blend_equation_separate - -static GLboolean _glewInit_GL_EXT_blend_equation_separate () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_blend_equation_separate */ - -#ifdef GL_EXT_blend_func_extended - -static GLboolean _glewInit_GL_EXT_blend_func_extended () -{ - GLboolean r = GL_FALSE; - - r = ((glBindFragDataLocationIndexedEXT = (PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationIndexedEXT")) == NULL) || r; - r = ((glGetFragDataIndexEXT = (PFNGLGETFRAGDATAINDEXEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataIndexEXT")) == NULL) || r; - r = ((glGetProgramResourceLocationIndexEXT = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocationIndexEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_blend_func_extended */ - -#ifdef GL_EXT_blend_func_separate - -static GLboolean _glewInit_GL_EXT_blend_func_separate () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_blend_func_separate */ - -#ifdef GL_EXT_blend_minmax - -static GLboolean _glewInit_GL_EXT_blend_minmax () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_blend_minmax */ - -#ifdef GL_EXT_buffer_storage - -static GLboolean _glewInit_GL_EXT_buffer_storage () -{ - GLboolean r = GL_FALSE; - - r = ((glBufferStorageEXT = (PFNGLBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glBufferStorageEXT")) == NULL) || r; - r = ((glNamedBufferStorageEXT = (PFNGLNAMEDBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorageEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_buffer_storage */ - -#ifdef GL_EXT_clear_texture - -static GLboolean _glewInit_GL_EXT_clear_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glClearTexImageEXT = (PFNGLCLEARTEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glClearTexImageEXT")) == NULL) || r; - r = ((glClearTexSubImageEXT = (PFNGLCLEARTEXSUBIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glClearTexSubImageEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_clear_texture */ - -#ifdef GL_EXT_color_subtable - -static GLboolean _glewInit_GL_EXT_color_subtable () -{ - GLboolean r = GL_FALSE; - - r = ((glColorSubTableEXT = (PFNGLCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorSubTableEXT")) == NULL) || r; - r = ((glCopyColorSubTableEXT = (PFNGLCOPYCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTableEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_color_subtable */ - -#ifdef GL_EXT_compiled_vertex_array - -static GLboolean _glewInit_GL_EXT_compiled_vertex_array () -{ - GLboolean r = GL_FALSE; - - r = ((glLockArraysEXT = (PFNGLLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glLockArraysEXT")) == NULL) || r; - r = ((glUnlockArraysEXT = (PFNGLUNLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glUnlockArraysEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_compiled_vertex_array */ - -#ifdef GL_EXT_convolution - -static GLboolean _glewInit_GL_EXT_convolution () -{ - GLboolean r = GL_FALSE; - - r = ((glConvolutionFilter1DEXT = (PFNGLCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1DEXT")) == NULL) || r; - r = ((glConvolutionFilter2DEXT = (PFNGLCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2DEXT")) == NULL) || r; - r = ((glConvolutionParameterfEXT = (PFNGLCONVOLUTIONPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfEXT")) == NULL) || r; - r = ((glConvolutionParameterfvEXT = (PFNGLCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfvEXT")) == NULL) || r; - r = ((glConvolutionParameteriEXT = (PFNGLCONVOLUTIONPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriEXT")) == NULL) || r; - r = ((glConvolutionParameterivEXT = (PFNGLCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterivEXT")) == NULL) || r; - r = ((glCopyConvolutionFilter1DEXT = (PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1DEXT")) == NULL) || r; - r = ((glCopyConvolutionFilter2DEXT = (PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2DEXT")) == NULL) || r; - r = ((glGetConvolutionFilterEXT = (PFNGLGETCONVOLUTIONFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilterEXT")) == NULL) || r; - r = ((glGetConvolutionParameterfvEXT = (PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfvEXT")) == NULL) || r; - r = ((glGetConvolutionParameterivEXT = (PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterivEXT")) == NULL) || r; - r = ((glGetSeparableFilterEXT = (PFNGLGETSEPARABLEFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilterEXT")) == NULL) || r; - r = ((glSeparableFilter2DEXT = (PFNGLSEPARABLEFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2DEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_convolution */ - -#ifdef GL_EXT_coordinate_frame - -static GLboolean _glewInit_GL_EXT_coordinate_frame () -{ - GLboolean r = GL_FALSE; - - r = ((glBinormalPointerEXT = (PFNGLBINORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glBinormalPointerEXT")) == NULL) || r; - r = ((glTangentPointerEXT = (PFNGLTANGENTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTangentPointerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_coordinate_frame */ - -#ifdef GL_EXT_copy_image - -static GLboolean _glewInit_GL_EXT_copy_image () -{ - GLboolean r = GL_FALSE; - - r = ((glCopyImageSubDataEXT = (PFNGLCOPYIMAGESUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubDataEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_copy_image */ - -#ifdef GL_EXT_copy_texture - -static GLboolean _glewInit_GL_EXT_copy_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage1DEXT")) == NULL) || r; - r = ((glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage2DEXT")) == NULL) || r; - r = ((glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage1DEXT")) == NULL) || r; - r = ((glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage2DEXT")) == NULL) || r; - r = ((glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3DEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_copy_texture */ - -#ifdef GL_EXT_cull_vertex - -static GLboolean _glewInit_GL_EXT_cull_vertex () -{ - GLboolean r = GL_FALSE; - - r = ((glCullParameterdvEXT = (PFNGLCULLPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterdvEXT")) == NULL) || r; - r = ((glCullParameterfvEXT = (PFNGLCULLPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterfvEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_cull_vertex */ - -#ifdef GL_EXT_debug_label - -static GLboolean _glewInit_GL_EXT_debug_label () -{ - GLboolean r = GL_FALSE; - - r = ((glGetObjectLabelEXT = (PFNGLGETOBJECTLABELEXTPROC)glewGetProcAddress((const GLubyte*)"glGetObjectLabelEXT")) == NULL) || r; - r = ((glLabelObjectEXT = (PFNGLLABELOBJECTEXTPROC)glewGetProcAddress((const GLubyte*)"glLabelObjectEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_debug_label */ - -#ifdef GL_EXT_debug_marker - -static GLboolean _glewInit_GL_EXT_debug_marker () -{ - GLboolean r = GL_FALSE; - - r = ((glInsertEventMarkerEXT = (PFNGLINSERTEVENTMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glInsertEventMarkerEXT")) == NULL) || r; - r = ((glPopGroupMarkerEXT = (PFNGLPOPGROUPMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glPopGroupMarkerEXT")) == NULL) || r; - r = ((glPushGroupMarkerEXT = (PFNGLPUSHGROUPMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glPushGroupMarkerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_debug_marker */ - -#ifdef GL_EXT_depth_bounds_test - -static GLboolean _glewInit_GL_EXT_depth_bounds_test () -{ - GLboolean r = GL_FALSE; - - r = ((glDepthBoundsEXT = (PFNGLDEPTHBOUNDSEXTPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_depth_bounds_test */ - -#ifdef GL_EXT_direct_state_access - -static GLboolean _glewInit_GL_EXT_direct_state_access () -{ - GLboolean r = GL_FALSE; - - r = ((glBindMultiTextureEXT = (PFNGLBINDMULTITEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindMultiTextureEXT")) == NULL) || r; - r = ((glCheckNamedFramebufferStatusEXT = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)"glCheckNamedFramebufferStatusEXT")) == NULL) || r; - r = ((glClientAttribDefaultEXT = (PFNGLCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)"glClientAttribDefaultEXT")) == NULL) || r; - r = ((glCompressedMultiTexImage1DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage1DEXT")) == NULL) || r; - r = ((glCompressedMultiTexImage2DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage2DEXT")) == NULL) || r; - r = ((glCompressedMultiTexImage3DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage3DEXT")) == NULL) || r; - r = ((glCompressedMultiTexSubImage1DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage1DEXT")) == NULL) || r; - r = ((glCompressedMultiTexSubImage2DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage2DEXT")) == NULL) || r; - r = ((glCompressedMultiTexSubImage3DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage3DEXT")) == NULL) || r; - r = ((glCompressedTextureImage1DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage1DEXT")) == NULL) || r; - r = ((glCompressedTextureImage2DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage2DEXT")) == NULL) || r; - r = ((glCompressedTextureImage3DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage3DEXT")) == NULL) || r; - r = ((glCompressedTextureSubImage1DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage1DEXT")) == NULL) || r; - r = ((glCompressedTextureSubImage2DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage2DEXT")) == NULL) || r; - r = ((glCompressedTextureSubImage3DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage3DEXT")) == NULL) || r; - r = ((glCopyMultiTexImage1DEXT = (PFNGLCOPYMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexImage1DEXT")) == NULL) || r; - r = ((glCopyMultiTexImage2DEXT = (PFNGLCOPYMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexImage2DEXT")) == NULL) || r; - r = ((glCopyMultiTexSubImage1DEXT = (PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage1DEXT")) == NULL) || r; - r = ((glCopyMultiTexSubImage2DEXT = (PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage2DEXT")) == NULL) || r; - r = ((glCopyMultiTexSubImage3DEXT = (PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage3DEXT")) == NULL) || r; - r = ((glCopyTextureImage1DEXT = (PFNGLCOPYTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureImage1DEXT")) == NULL) || r; - r = ((glCopyTextureImage2DEXT = (PFNGLCOPYTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureImage2DEXT")) == NULL) || r; - r = ((glCopyTextureSubImage1DEXT = (PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage1DEXT")) == NULL) || r; - r = ((glCopyTextureSubImage2DEXT = (PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage2DEXT")) == NULL) || r; - r = ((glCopyTextureSubImage3DEXT = (PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage3DEXT")) == NULL) || r; - r = ((glDisableClientStateIndexedEXT = (PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableClientStateIndexedEXT")) == NULL) || r; - r = ((glDisableClientStateiEXT = (PFNGLDISABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableClientStateiEXT")) == NULL) || r; - r = ((glDisableVertexArrayAttribEXT = (PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayAttribEXT")) == NULL) || r; - r = ((glDisableVertexArrayEXT = (PFNGLDISABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayEXT")) == NULL) || r; - r = ((glEnableClientStateIndexedEXT = (PFNGLENABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableClientStateIndexedEXT")) == NULL) || r; - r = ((glEnableClientStateiEXT = (PFNGLENABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableClientStateiEXT")) == NULL) || r; - r = ((glEnableVertexArrayAttribEXT = (PFNGLENABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayAttribEXT")) == NULL) || r; - r = ((glEnableVertexArrayEXT = (PFNGLENABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayEXT")) == NULL) || r; - r = ((glFlushMappedNamedBufferRangeEXT = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedNamedBufferRangeEXT")) == NULL) || r; - r = ((glFramebufferDrawBufferEXT = (PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferDrawBufferEXT")) == NULL) || r; - r = ((glFramebufferDrawBuffersEXT = (PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferDrawBuffersEXT")) == NULL) || r; - r = ((glFramebufferReadBufferEXT = (PFNGLFRAMEBUFFERREADBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferReadBufferEXT")) == NULL) || r; - r = ((glGenerateMultiTexMipmapEXT = (PFNGLGENERATEMULTITEXMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateMultiTexMipmapEXT")) == NULL) || r; - r = ((glGenerateTextureMipmapEXT = (PFNGLGENERATETEXTUREMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateTextureMipmapEXT")) == NULL) || r; - r = ((glGetCompressedMultiTexImageEXT = (PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedMultiTexImageEXT")) == NULL) || r; - r = ((glGetCompressedTextureImageEXT = (PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureImageEXT")) == NULL) || r; - r = ((glGetDoubleIndexedvEXT = (PFNGLGETDOUBLEINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetDoubleIndexedvEXT")) == NULL) || r; - r = ((glGetDoublei_vEXT = (PFNGLGETDOUBLEI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetDoublei_vEXT")) == NULL) || r; - r = ((glGetFloatIndexedvEXT = (PFNGLGETFLOATINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFloatIndexedvEXT")) == NULL) || r; - r = ((glGetFloati_vEXT = (PFNGLGETFLOATI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_vEXT")) == NULL) || r; - r = ((glGetFramebufferParameterivEXT = (PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameterivEXT")) == NULL) || r; - r = ((glGetMultiTexEnvfvEXT = (PFNGLGETMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexEnvfvEXT")) == NULL) || r; - r = ((glGetMultiTexEnvivEXT = (PFNGLGETMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexEnvivEXT")) == NULL) || r; - r = ((glGetMultiTexGendvEXT = (PFNGLGETMULTITEXGENDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGendvEXT")) == NULL) || r; - r = ((glGetMultiTexGenfvEXT = (PFNGLGETMULTITEXGENFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGenfvEXT")) == NULL) || r; - r = ((glGetMultiTexGenivEXT = (PFNGLGETMULTITEXGENIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGenivEXT")) == NULL) || r; - r = ((glGetMultiTexImageEXT = (PFNGLGETMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexImageEXT")) == NULL) || r; - r = ((glGetMultiTexLevelParameterfvEXT = (PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexLevelParameterfvEXT")) == NULL) || r; - r = ((glGetMultiTexLevelParameterivEXT = (PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexLevelParameterivEXT")) == NULL) || r; - r = ((glGetMultiTexParameterIivEXT = (PFNGLGETMULTITEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterIivEXT")) == NULL) || r; - r = ((glGetMultiTexParameterIuivEXT = (PFNGLGETMULTITEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterIuivEXT")) == NULL) || r; - r = ((glGetMultiTexParameterfvEXT = (PFNGLGETMULTITEXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterfvEXT")) == NULL) || r; - r = ((glGetMultiTexParameterivEXT = (PFNGLGETMULTITEXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterivEXT")) == NULL) || r; - r = ((glGetNamedBufferParameterivEXT = (PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameterivEXT")) == NULL) || r; - r = ((glGetNamedBufferPointervEXT = (PFNGLGETNAMEDBUFFERPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferPointervEXT")) == NULL) || r; - r = ((glGetNamedBufferSubDataEXT = (PFNGLGETNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferSubDataEXT")) == NULL) || r; - r = ((glGetNamedFramebufferAttachmentParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferAttachmentParameterivEXT")) == NULL) || r; - r = ((glGetNamedProgramLocalParameterIivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterIivEXT")) == NULL) || r; - r = ((glGetNamedProgramLocalParameterIuivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterIuivEXT")) == NULL) || r; - r = ((glGetNamedProgramLocalParameterdvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterdvEXT")) == NULL) || r; - r = ((glGetNamedProgramLocalParameterfvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterfvEXT")) == NULL) || r; - r = ((glGetNamedProgramStringEXT = (PFNGLGETNAMEDPROGRAMSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramStringEXT")) == NULL) || r; - r = ((glGetNamedProgramivEXT = (PFNGLGETNAMEDPROGRAMIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramivEXT")) == NULL) || r; - r = ((glGetNamedRenderbufferParameterivEXT = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedRenderbufferParameterivEXT")) == NULL) || r; - r = ((glGetPointerIndexedvEXT = (PFNGLGETPOINTERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointerIndexedvEXT")) == NULL) || r; - r = ((glGetPointeri_vEXT = (PFNGLGETPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointeri_vEXT")) == NULL) || r; - r = ((glGetTextureImageEXT = (PFNGLGETTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureImageEXT")) == NULL) || r; - r = ((glGetTextureLevelParameterfvEXT = (PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterfvEXT")) == NULL) || r; - r = ((glGetTextureLevelParameterivEXT = (PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterivEXT")) == NULL) || r; - r = ((glGetTextureParameterIivEXT = (PFNGLGETTEXTUREPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIivEXT")) == NULL) || r; - r = ((glGetTextureParameterIuivEXT = (PFNGLGETTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIuivEXT")) == NULL) || r; - r = ((glGetTextureParameterfvEXT = (PFNGLGETTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterfvEXT")) == NULL) || r; - r = ((glGetTextureParameterivEXT = (PFNGLGETTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterivEXT")) == NULL) || r; - r = ((glGetVertexArrayIntegeri_vEXT = (PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIntegeri_vEXT")) == NULL) || r; - r = ((glGetVertexArrayIntegervEXT = (PFNGLGETVERTEXARRAYINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIntegervEXT")) == NULL) || r; - r = ((glGetVertexArrayPointeri_vEXT = (PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayPointeri_vEXT")) == NULL) || r; - r = ((glGetVertexArrayPointervEXT = (PFNGLGETVERTEXARRAYPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayPointervEXT")) == NULL) || r; - r = ((glMapNamedBufferEXT = (PFNGLMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferEXT")) == NULL) || r; - r = ((glMapNamedBufferRangeEXT = (PFNGLMAPNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferRangeEXT")) == NULL) || r; - r = ((glMatrixFrustumEXT = (PFNGLMATRIXFRUSTUMEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixFrustumEXT")) == NULL) || r; - r = ((glMatrixLoadIdentityEXT = (PFNGLMATRIXLOADIDENTITYEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadIdentityEXT")) == NULL) || r; - r = ((glMatrixLoadTransposedEXT = (PFNGLMATRIXLOADTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTransposedEXT")) == NULL) || r; - r = ((glMatrixLoadTransposefEXT = (PFNGLMATRIXLOADTRANSPOSEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTransposefEXT")) == NULL) || r; - r = ((glMatrixLoaddEXT = (PFNGLMATRIXLOADDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoaddEXT")) == NULL) || r; - r = ((glMatrixLoadfEXT = (PFNGLMATRIXLOADFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadfEXT")) == NULL) || r; - r = ((glMatrixMultTransposedEXT = (PFNGLMATRIXMULTTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTransposedEXT")) == NULL) || r; - r = ((glMatrixMultTransposefEXT = (PFNGLMATRIXMULTTRANSPOSEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTransposefEXT")) == NULL) || r; - r = ((glMatrixMultdEXT = (PFNGLMATRIXMULTDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultdEXT")) == NULL) || r; - r = ((glMatrixMultfEXT = (PFNGLMATRIXMULTFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultfEXT")) == NULL) || r; - r = ((glMatrixOrthoEXT = (PFNGLMATRIXORTHOEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixOrthoEXT")) == NULL) || r; - r = ((glMatrixPopEXT = (PFNGLMATRIXPOPEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixPopEXT")) == NULL) || r; - r = ((glMatrixPushEXT = (PFNGLMATRIXPUSHEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixPushEXT")) == NULL) || r; - r = ((glMatrixRotatedEXT = (PFNGLMATRIXROTATEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixRotatedEXT")) == NULL) || r; - r = ((glMatrixRotatefEXT = (PFNGLMATRIXROTATEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixRotatefEXT")) == NULL) || r; - r = ((glMatrixScaledEXT = (PFNGLMATRIXSCALEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixScaledEXT")) == NULL) || r; - r = ((glMatrixScalefEXT = (PFNGLMATRIXSCALEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixScalefEXT")) == NULL) || r; - r = ((glMatrixTranslatedEXT = (PFNGLMATRIXTRANSLATEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixTranslatedEXT")) == NULL) || r; - r = ((glMatrixTranslatefEXT = (PFNGLMATRIXTRANSLATEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixTranslatefEXT")) == NULL) || r; - r = ((glMultiTexBufferEXT = (PFNGLMULTITEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexBufferEXT")) == NULL) || r; - r = ((glMultiTexCoordPointerEXT = (PFNGLMULTITEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordPointerEXT")) == NULL) || r; - r = ((glMultiTexEnvfEXT = (PFNGLMULTITEXENVFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvfEXT")) == NULL) || r; - r = ((glMultiTexEnvfvEXT = (PFNGLMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvfvEXT")) == NULL) || r; - r = ((glMultiTexEnviEXT = (PFNGLMULTITEXENVIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnviEXT")) == NULL) || r; - r = ((glMultiTexEnvivEXT = (PFNGLMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvivEXT")) == NULL) || r; - r = ((glMultiTexGendEXT = (PFNGLMULTITEXGENDEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGendEXT")) == NULL) || r; - r = ((glMultiTexGendvEXT = (PFNGLMULTITEXGENDVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGendvEXT")) == NULL) || r; - r = ((glMultiTexGenfEXT = (PFNGLMULTITEXGENFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenfEXT")) == NULL) || r; - r = ((glMultiTexGenfvEXT = (PFNGLMULTITEXGENFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenfvEXT")) == NULL) || r; - r = ((glMultiTexGeniEXT = (PFNGLMULTITEXGENIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGeniEXT")) == NULL) || r; - r = ((glMultiTexGenivEXT = (PFNGLMULTITEXGENIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenivEXT")) == NULL) || r; - r = ((glMultiTexImage1DEXT = (PFNGLMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage1DEXT")) == NULL) || r; - r = ((glMultiTexImage2DEXT = (PFNGLMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage2DEXT")) == NULL) || r; - r = ((glMultiTexImage3DEXT = (PFNGLMULTITEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage3DEXT")) == NULL) || r; - r = ((glMultiTexParameterIivEXT = (PFNGLMULTITEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterIivEXT")) == NULL) || r; - r = ((glMultiTexParameterIuivEXT = (PFNGLMULTITEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterIuivEXT")) == NULL) || r; - r = ((glMultiTexParameterfEXT = (PFNGLMULTITEXPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterfEXT")) == NULL) || r; - r = ((glMultiTexParameterfvEXT = (PFNGLMULTITEXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterfvEXT")) == NULL) || r; - r = ((glMultiTexParameteriEXT = (PFNGLMULTITEXPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameteriEXT")) == NULL) || r; - r = ((glMultiTexParameterivEXT = (PFNGLMULTITEXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterivEXT")) == NULL) || r; - r = ((glMultiTexRenderbufferEXT = (PFNGLMULTITEXRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexRenderbufferEXT")) == NULL) || r; - r = ((glMultiTexSubImage1DEXT = (PFNGLMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage1DEXT")) == NULL) || r; - r = ((glMultiTexSubImage2DEXT = (PFNGLMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage2DEXT")) == NULL) || r; - r = ((glMultiTexSubImage3DEXT = (PFNGLMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage3DEXT")) == NULL) || r; - r = ((glNamedBufferDataEXT = (PFNGLNAMEDBUFFERDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferDataEXT")) == NULL) || r; - r = ((glNamedBufferSubDataEXT = (PFNGLNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferSubDataEXT")) == NULL) || r; - r = ((glNamedCopyBufferSubDataEXT = (PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedCopyBufferSubDataEXT")) == NULL) || r; - r = ((glNamedFramebufferRenderbufferEXT = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferRenderbufferEXT")) == NULL) || r; - r = ((glNamedFramebufferTexture1DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture1DEXT")) == NULL) || r; - r = ((glNamedFramebufferTexture2DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture2DEXT")) == NULL) || r; - r = ((glNamedFramebufferTexture3DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture3DEXT")) == NULL) || r; - r = ((glNamedFramebufferTextureEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureEXT")) == NULL) || r; - r = ((glNamedFramebufferTextureFaceEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureFaceEXT")) == NULL) || r; - r = ((glNamedFramebufferTextureLayerEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureLayerEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameter4dEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4dEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameter4dvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4dvEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameter4fEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4fEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameter4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4fvEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameterI4iEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4iEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameterI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4ivEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameterI4uiEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4uiEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameterI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4uivEXT")) == NULL) || r; - r = ((glNamedProgramLocalParameters4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameters4fvEXT")) == NULL) || r; - r = ((glNamedProgramLocalParametersI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParametersI4ivEXT")) == NULL) || r; - r = ((glNamedProgramLocalParametersI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParametersI4uivEXT")) == NULL) || r; - r = ((glNamedProgramStringEXT = (PFNGLNAMEDPROGRAMSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramStringEXT")) == NULL) || r; - r = ((glNamedRenderbufferStorageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageEXT")) == NULL) || r; - r = ((glNamedRenderbufferStorageMultisampleCoverageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleCoverageEXT")) == NULL) || r; - r = ((glNamedRenderbufferStorageMultisampleEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleEXT")) == NULL) || r; - r = ((glProgramUniform1fEXT = (PFNGLPROGRAMUNIFORM1FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fEXT")) == NULL) || r; - r = ((glProgramUniform1fvEXT = (PFNGLPROGRAMUNIFORM1FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fvEXT")) == NULL) || r; - r = ((glProgramUniform1iEXT = (PFNGLPROGRAMUNIFORM1IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iEXT")) == NULL) || r; - r = ((glProgramUniform1ivEXT = (PFNGLPROGRAMUNIFORM1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ivEXT")) == NULL) || r; - r = ((glProgramUniform1uiEXT = (PFNGLPROGRAMUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiEXT")) == NULL) || r; - r = ((glProgramUniform1uivEXT = (PFNGLPROGRAMUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uivEXT")) == NULL) || r; - r = ((glProgramUniform2fEXT = (PFNGLPROGRAMUNIFORM2FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fEXT")) == NULL) || r; - r = ((glProgramUniform2fvEXT = (PFNGLPROGRAMUNIFORM2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fvEXT")) == NULL) || r; - r = ((glProgramUniform2iEXT = (PFNGLPROGRAMUNIFORM2IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iEXT")) == NULL) || r; - r = ((glProgramUniform2ivEXT = (PFNGLPROGRAMUNIFORM2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ivEXT")) == NULL) || r; - r = ((glProgramUniform2uiEXT = (PFNGLPROGRAMUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiEXT")) == NULL) || r; - r = ((glProgramUniform2uivEXT = (PFNGLPROGRAMUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uivEXT")) == NULL) || r; - r = ((glProgramUniform3fEXT = (PFNGLPROGRAMUNIFORM3FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fEXT")) == NULL) || r; - r = ((glProgramUniform3fvEXT = (PFNGLPROGRAMUNIFORM3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fvEXT")) == NULL) || r; - r = ((glProgramUniform3iEXT = (PFNGLPROGRAMUNIFORM3IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iEXT")) == NULL) || r; - r = ((glProgramUniform3ivEXT = (PFNGLPROGRAMUNIFORM3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ivEXT")) == NULL) || r; - r = ((glProgramUniform3uiEXT = (PFNGLPROGRAMUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiEXT")) == NULL) || r; - r = ((glProgramUniform3uivEXT = (PFNGLPROGRAMUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uivEXT")) == NULL) || r; - r = ((glProgramUniform4fEXT = (PFNGLPROGRAMUNIFORM4FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fEXT")) == NULL) || r; - r = ((glProgramUniform4fvEXT = (PFNGLPROGRAMUNIFORM4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fvEXT")) == NULL) || r; - r = ((glProgramUniform4iEXT = (PFNGLPROGRAMUNIFORM4IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iEXT")) == NULL) || r; - r = ((glProgramUniform4ivEXT = (PFNGLPROGRAMUNIFORM4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ivEXT")) == NULL) || r; - r = ((glProgramUniform4uiEXT = (PFNGLPROGRAMUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiEXT")) == NULL) || r; - r = ((glProgramUniform4uivEXT = (PFNGLPROGRAMUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uivEXT")) == NULL) || r; - r = ((glProgramUniformMatrix2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix2x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix2x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix3x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix3x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix4x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix4x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fvEXT")) == NULL) || r; - r = ((glPushClientAttribDefaultEXT = (PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)"glPushClientAttribDefaultEXT")) == NULL) || r; - r = ((glTextureBufferEXT = (PFNGLTEXTUREBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferEXT")) == NULL) || r; - r = ((glTextureImage1DEXT = (PFNGLTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage1DEXT")) == NULL) || r; - r = ((glTextureImage2DEXT = (PFNGLTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DEXT")) == NULL) || r; - r = ((glTextureImage3DEXT = (PFNGLTEXTUREIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DEXT")) == NULL) || r; - r = ((glTextureParameterIivEXT = (PFNGLTEXTUREPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIivEXT")) == NULL) || r; - r = ((glTextureParameterIuivEXT = (PFNGLTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIuivEXT")) == NULL) || r; - r = ((glTextureParameterfEXT = (PFNGLTEXTUREPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfEXT")) == NULL) || r; - r = ((glTextureParameterfvEXT = (PFNGLTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfvEXT")) == NULL) || r; - r = ((glTextureParameteriEXT = (PFNGLTEXTUREPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteriEXT")) == NULL) || r; - r = ((glTextureParameterivEXT = (PFNGLTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterivEXT")) == NULL) || r; - r = ((glTextureRenderbufferEXT = (PFNGLTEXTURERENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTextureRenderbufferEXT")) == NULL) || r; - r = ((glTextureSubImage1DEXT = (PFNGLTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage1DEXT")) == NULL) || r; - r = ((glTextureSubImage2DEXT = (PFNGLTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage2DEXT")) == NULL) || r; - r = ((glTextureSubImage3DEXT = (PFNGLTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage3DEXT")) == NULL) || r; - r = ((glUnmapNamedBufferEXT = (PFNGLUNMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glUnmapNamedBufferEXT")) == NULL) || r; - r = ((glVertexArrayColorOffsetEXT = (PFNGLVERTEXARRAYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayColorOffsetEXT")) == NULL) || r; - r = ((glVertexArrayEdgeFlagOffsetEXT = (PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayEdgeFlagOffsetEXT")) == NULL) || r; - r = ((glVertexArrayFogCoordOffsetEXT = (PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayFogCoordOffsetEXT")) == NULL) || r; - r = ((glVertexArrayIndexOffsetEXT = (PFNGLVERTEXARRAYINDEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayIndexOffsetEXT")) == NULL) || r; - r = ((glVertexArrayMultiTexCoordOffsetEXT = (PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayMultiTexCoordOffsetEXT")) == NULL) || r; - r = ((glVertexArrayNormalOffsetEXT = (PFNGLVERTEXARRAYNORMALOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayNormalOffsetEXT")) == NULL) || r; - r = ((glVertexArraySecondaryColorOffsetEXT = (PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArraySecondaryColorOffsetEXT")) == NULL) || r; - r = ((glVertexArrayTexCoordOffsetEXT = (PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayTexCoordOffsetEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribDivisorEXT = (PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribDivisorEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribIOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribIOffsetEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribOffsetEXT")) == NULL) || r; - r = ((glVertexArrayVertexOffsetEXT = (PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexOffsetEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_direct_state_access */ - -#ifdef GL_EXT_discard_framebuffer - -static GLboolean _glewInit_GL_EXT_discard_framebuffer () -{ - GLboolean r = GL_FALSE; - - r = ((glDiscardFramebufferEXT = (PFNGLDISCARDFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glDiscardFramebufferEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_discard_framebuffer */ - -#ifdef GL_EXT_draw_buffers - -static GLboolean _glewInit_GL_EXT_draw_buffers () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawBuffersEXT = (PFNGLDRAWBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_draw_buffers */ - -#ifdef GL_EXT_draw_buffers2 - -static GLboolean _glewInit_GL_EXT_draw_buffers2 () -{ - GLboolean r = GL_FALSE; - - r = ((glColorMaskIndexedEXT = (PFNGLCOLORMASKINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glColorMaskIndexedEXT")) == NULL) || r; - r = ((glDisableIndexedEXT = (PFNGLDISABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableIndexedEXT")) == NULL) || r; - r = ((glEnableIndexedEXT = (PFNGLENABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableIndexedEXT")) == NULL) || r; - r = ((glGetBooleanIndexedvEXT = (PFNGLGETBOOLEANINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetBooleanIndexedvEXT")) == NULL) || r; - r = ((glGetIntegerIndexedvEXT = (PFNGLGETINTEGERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerIndexedvEXT")) == NULL) || r; - r = ((glIsEnabledIndexedEXT = (PFNGLISENABLEDINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsEnabledIndexedEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_draw_buffers2 */ - -#ifdef GL_EXT_draw_buffers_indexed - -static GLboolean _glewInit_GL_EXT_draw_buffers_indexed () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationSeparateiEXT = (PFNGLBLENDEQUATIONSEPARATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateiEXT")) == NULL) || r; - r = ((glBlendEquationiEXT = (PFNGLBLENDEQUATIONIEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationiEXT")) == NULL) || r; - r = ((glBlendFuncSeparateiEXT = (PFNGLBLENDFUNCSEPARATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateiEXT")) == NULL) || r; - r = ((glBlendFunciEXT = (PFNGLBLENDFUNCIEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendFunciEXT")) == NULL) || r; - r = ((glColorMaskiEXT = (PFNGLCOLORMASKIEXTPROC)glewGetProcAddress((const GLubyte*)"glColorMaskiEXT")) == NULL) || r; - r = ((glDisableiEXT = (PFNGLDISABLEIEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableiEXT")) == NULL) || r; - r = ((glEnableiEXT = (PFNGLENABLEIEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableiEXT")) == NULL) || r; - r = ((glIsEnablediEXT = (PFNGLISENABLEDIEXTPROC)glewGetProcAddress((const GLubyte*)"glIsEnablediEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_draw_buffers_indexed */ - -#ifdef GL_EXT_draw_elements_base_vertex - -static GLboolean _glewInit_GL_EXT_draw_elements_base_vertex () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawElementsBaseVertexEXT = (PFNGLDRAWELEMENTSBASEVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsBaseVertexEXT")) == NULL) || r; - r = ((glDrawElementsInstancedBaseVertexEXT = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertexEXT")) == NULL) || r; - r = ((glDrawRangeElementsBaseVertexEXT = (PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsBaseVertexEXT")) == NULL) || r; - r = ((glMultiDrawElementsBaseVertexEXT = (PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsBaseVertexEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_draw_elements_base_vertex */ - -#ifdef GL_EXT_draw_instanced - -static GLboolean _glewInit_GL_EXT_draw_instanced () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawArraysInstancedEXT = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedEXT")) == NULL) || r; - r = ((glDrawElementsInstancedEXT = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_draw_instanced */ - -#ifdef GL_EXT_draw_range_elements - -static GLboolean _glewInit_GL_EXT_draw_range_elements () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawRangeElementsEXT = (PFNGLDRAWRANGEELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_draw_range_elements */ - -#ifdef GL_EXT_external_buffer - -static GLboolean _glewInit_GL_EXT_external_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((glBufferStorageExternalEXT = (PFNGLBUFFERSTORAGEEXTERNALEXTPROC)glewGetProcAddress((const GLubyte*)"glBufferStorageExternalEXT")) == NULL) || r; - r = ((glNamedBufferStorageExternalEXT = (PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorageExternalEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_external_buffer */ - -#ifdef GL_EXT_fog_coord - -static GLboolean _glewInit_GL_EXT_fog_coord () -{ - GLboolean r = GL_FALSE; - - r = ((glFogCoordPointerEXT = (PFNGLFOGCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerEXT")) == NULL) || r; - r = ((glFogCoorddEXT = (PFNGLFOGCOORDDEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddEXT")) == NULL) || r; - r = ((glFogCoorddvEXT = (PFNGLFOGCOORDDVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddvEXT")) == NULL) || r; - r = ((glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfEXT")) == NULL) || r; - r = ((glFogCoordfvEXT = (PFNGLFOGCOORDFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfvEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_fog_coord */ - -#ifdef GL_EXT_fragment_lighting - -static GLboolean _glewInit_GL_EXT_fragment_lighting () -{ - GLboolean r = GL_FALSE; - - r = ((glFragmentColorMaterialEXT = (PFNGLFRAGMENTCOLORMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialEXT")) == NULL) || r; - r = ((glFragmentLightModelfEXT = (PFNGLFRAGMENTLIGHTMODELFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfEXT")) == NULL) || r; - r = ((glFragmentLightModelfvEXT = (PFNGLFRAGMENTLIGHTMODELFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvEXT")) == NULL) || r; - r = ((glFragmentLightModeliEXT = (PFNGLFRAGMENTLIGHTMODELIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliEXT")) == NULL) || r; - r = ((glFragmentLightModelivEXT = (PFNGLFRAGMENTLIGHTMODELIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivEXT")) == NULL) || r; - r = ((glFragmentLightfEXT = (PFNGLFRAGMENTLIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfEXT")) == NULL) || r; - r = ((glFragmentLightfvEXT = (PFNGLFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvEXT")) == NULL) || r; - r = ((glFragmentLightiEXT = (PFNGLFRAGMENTLIGHTIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiEXT")) == NULL) || r; - r = ((glFragmentLightivEXT = (PFNGLFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivEXT")) == NULL) || r; - r = ((glFragmentMaterialfEXT = (PFNGLFRAGMENTMATERIALFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfEXT")) == NULL) || r; - r = ((glFragmentMaterialfvEXT = (PFNGLFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvEXT")) == NULL) || r; - r = ((glFragmentMaterialiEXT = (PFNGLFRAGMENTMATERIALIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiEXT")) == NULL) || r; - r = ((glFragmentMaterialivEXT = (PFNGLFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivEXT")) == NULL) || r; - r = ((glGetFragmentLightfvEXT = (PFNGLGETFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvEXT")) == NULL) || r; - r = ((glGetFragmentLightivEXT = (PFNGLGETFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivEXT")) == NULL) || r; - r = ((glGetFragmentMaterialfvEXT = (PFNGLGETFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvEXT")) == NULL) || r; - r = ((glGetFragmentMaterialivEXT = (PFNGLGETFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivEXT")) == NULL) || r; - r = ((glLightEnviEXT = (PFNGLLIGHTENVIEXTPROC)glewGetProcAddress((const GLubyte*)"glLightEnviEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_fragment_lighting */ - -#ifdef GL_EXT_framebuffer_blit - -static GLboolean _glewInit_GL_EXT_framebuffer_blit () -{ - GLboolean r = GL_FALSE; - - r = ((glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_framebuffer_blit */ - -#ifdef GL_EXT_framebuffer_multisample - -static GLboolean _glewInit_GL_EXT_framebuffer_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_framebuffer_multisample */ - -#ifdef GL_EXT_framebuffer_object - -static GLboolean _glewInit_GL_EXT_framebuffer_object () -{ - GLboolean r = GL_FALSE; - - r = ((glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindFramebufferEXT")) == NULL) || r; - r = ((glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbufferEXT")) == NULL) || r; - r = ((glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatusEXT")) == NULL) || r; - r = ((glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffersEXT")) == NULL) || r; - r = ((glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffersEXT")) == NULL) || r; - r = ((glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbufferEXT")) == NULL) || r; - r = ((glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1DEXT")) == NULL) || r; - r = ((glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2DEXT")) == NULL) || r; - r = ((glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3DEXT")) == NULL) || r; - r = ((glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffersEXT")) == NULL) || r; - r = ((glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffersEXT")) == NULL) || r; - r = ((glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmapEXT")) == NULL) || r; - r = ((glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameterivEXT")) == NULL) || r; - r = ((glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameterivEXT")) == NULL) || r; - r = ((glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsFramebufferEXT")) == NULL) || r; - r = ((glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbufferEXT")) == NULL) || r; - r = ((glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_framebuffer_object */ - -#ifdef GL_EXT_geometry_shader4 - -static GLboolean _glewInit_GL_EXT_geometry_shader4 () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureEXT")) == NULL) || r; - r = ((glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureFaceEXT")) == NULL) || r; - r = ((glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteriEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_geometry_shader4 */ - -#ifdef GL_EXT_gpu_program_parameters - -static GLboolean _glewInit_GL_EXT_gpu_program_parameters () -{ - GLboolean r = GL_FALSE; - - r = ((glProgramEnvParameters4fvEXT = (PFNGLPROGRAMENVPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameters4fvEXT")) == NULL) || r; - r = ((glProgramLocalParameters4fvEXT = (PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameters4fvEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_gpu_program_parameters */ - -#ifdef GL_EXT_gpu_shader4 - -static GLboolean _glewInit_GL_EXT_gpu_shader4 () -{ - GLboolean r = GL_FALSE; - - r = ((glBindFragDataLocationEXT = (PFNGLBINDFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationEXT")) == NULL) || r; - r = ((glGetFragDataLocationEXT = (PFNGLGETFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataLocationEXT")) == NULL) || r; - r = ((glGetUniformuivEXT = (PFNGLGETUNIFORMUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformuivEXT")) == NULL) || r; - r = ((glGetVertexAttribIivEXT = (PFNGLGETVERTEXATTRIBIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIivEXT")) == NULL) || r; - r = ((glGetVertexAttribIuivEXT = (PFNGLGETVERTEXATTRIBIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIuivEXT")) == NULL) || r; - r = ((glUniform1uiEXT = (PFNGLUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform1uiEXT")) == NULL) || r; - r = ((glUniform1uivEXT = (PFNGLUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform1uivEXT")) == NULL) || r; - r = ((glUniform2uiEXT = (PFNGLUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform2uiEXT")) == NULL) || r; - r = ((glUniform2uivEXT = (PFNGLUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform2uivEXT")) == NULL) || r; - r = ((glUniform3uiEXT = (PFNGLUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform3uiEXT")) == NULL) || r; - r = ((glUniform3uivEXT = (PFNGLUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform3uivEXT")) == NULL) || r; - r = ((glUniform4uiEXT = (PFNGLUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform4uiEXT")) == NULL) || r; - r = ((glUniform4uivEXT = (PFNGLUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform4uivEXT")) == NULL) || r; - r = ((glVertexAttribI1iEXT = (PFNGLVERTEXATTRIBI1IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1iEXT")) == NULL) || r; - r = ((glVertexAttribI1ivEXT = (PFNGLVERTEXATTRIBI1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1ivEXT")) == NULL) || r; - r = ((glVertexAttribI1uiEXT = (PFNGLVERTEXATTRIBI1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uiEXT")) == NULL) || r; - r = ((glVertexAttribI1uivEXT = (PFNGLVERTEXATTRIBI1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uivEXT")) == NULL) || r; - r = ((glVertexAttribI2iEXT = (PFNGLVERTEXATTRIBI2IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2iEXT")) == NULL) || r; - r = ((glVertexAttribI2ivEXT = (PFNGLVERTEXATTRIBI2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2ivEXT")) == NULL) || r; - r = ((glVertexAttribI2uiEXT = (PFNGLVERTEXATTRIBI2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uiEXT")) == NULL) || r; - r = ((glVertexAttribI2uivEXT = (PFNGLVERTEXATTRIBI2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uivEXT")) == NULL) || r; - r = ((glVertexAttribI3iEXT = (PFNGLVERTEXATTRIBI3IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3iEXT")) == NULL) || r; - r = ((glVertexAttribI3ivEXT = (PFNGLVERTEXATTRIBI3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3ivEXT")) == NULL) || r; - r = ((glVertexAttribI3uiEXT = (PFNGLVERTEXATTRIBI3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uiEXT")) == NULL) || r; - r = ((glVertexAttribI3uivEXT = (PFNGLVERTEXATTRIBI3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uivEXT")) == NULL) || r; - r = ((glVertexAttribI4bvEXT = (PFNGLVERTEXATTRIBI4BVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4bvEXT")) == NULL) || r; - r = ((glVertexAttribI4iEXT = (PFNGLVERTEXATTRIBI4IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4iEXT")) == NULL) || r; - r = ((glVertexAttribI4ivEXT = (PFNGLVERTEXATTRIBI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ivEXT")) == NULL) || r; - r = ((glVertexAttribI4svEXT = (PFNGLVERTEXATTRIBI4SVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4svEXT")) == NULL) || r; - r = ((glVertexAttribI4ubvEXT = (PFNGLVERTEXATTRIBI4UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ubvEXT")) == NULL) || r; - r = ((glVertexAttribI4uiEXT = (PFNGLVERTEXATTRIBI4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uiEXT")) == NULL) || r; - r = ((glVertexAttribI4uivEXT = (PFNGLVERTEXATTRIBI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uivEXT")) == NULL) || r; - r = ((glVertexAttribI4usvEXT = (PFNGLVERTEXATTRIBI4USVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4usvEXT")) == NULL) || r; - r = ((glVertexAttribIPointerEXT = (PFNGLVERTEXATTRIBIPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIPointerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_gpu_shader4 */ - -#ifdef GL_EXT_histogram - -static GLboolean _glewInit_GL_EXT_histogram () -{ - GLboolean r = GL_FALSE; - - r = ((glGetHistogramEXT = (PFNGLGETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramEXT")) == NULL) || r; - r = ((glGetHistogramParameterfvEXT = (PFNGLGETHISTOGRAMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfvEXT")) == NULL) || r; - r = ((glGetHistogramParameterivEXT = (PFNGLGETHISTOGRAMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterivEXT")) == NULL) || r; - r = ((glGetMinmaxEXT = (PFNGLGETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxEXT")) == NULL) || r; - r = ((glGetMinmaxParameterfvEXT = (PFNGLGETMINMAXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfvEXT")) == NULL) || r; - r = ((glGetMinmaxParameterivEXT = (PFNGLGETMINMAXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterivEXT")) == NULL) || r; - r = ((glHistogramEXT = (PFNGLHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glHistogramEXT")) == NULL) || r; - r = ((glMinmaxEXT = (PFNGLMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glMinmaxEXT")) == NULL) || r; - r = ((glResetHistogramEXT = (PFNGLRESETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glResetHistogramEXT")) == NULL) || r; - r = ((glResetMinmaxEXT = (PFNGLRESETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glResetMinmaxEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_histogram */ - -#ifdef GL_EXT_index_func - -static GLboolean _glewInit_GL_EXT_index_func () -{ - GLboolean r = GL_FALSE; - - r = ((glIndexFuncEXT = (PFNGLINDEXFUNCEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexFuncEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_index_func */ - -#ifdef GL_EXT_index_material - -static GLboolean _glewInit_GL_EXT_index_material () -{ - GLboolean r = GL_FALSE; - - r = ((glIndexMaterialEXT = (PFNGLINDEXMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexMaterialEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_index_material */ - -#ifdef GL_EXT_instanced_arrays - -static GLboolean _glewInit_GL_EXT_instanced_arrays () -{ - GLboolean r = GL_FALSE; - - r = ((glVertexAttribDivisorEXT = (PFNGLVERTEXATTRIBDIVISOREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_instanced_arrays */ - -#ifdef GL_EXT_light_texture - -static GLboolean _glewInit_GL_EXT_light_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glApplyTextureEXT = (PFNGLAPPLYTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glApplyTextureEXT")) == NULL) || r; - r = ((glTextureLightEXT = (PFNGLTEXTURELIGHTEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureLightEXT")) == NULL) || r; - r = ((glTextureMaterialEXT = (PFNGLTEXTUREMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureMaterialEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_light_texture */ - -#ifdef GL_EXT_map_buffer_range - -static GLboolean _glewInit_GL_EXT_map_buffer_range () -{ - GLboolean r = GL_FALSE; - - r = ((glFlushMappedBufferRangeEXT = (PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRangeEXT")) == NULL) || r; - r = ((glMapBufferRangeEXT = (PFNGLMAPBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glMapBufferRangeEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_map_buffer_range */ - -#ifdef GL_EXT_memory_object - -static GLboolean _glewInit_GL_EXT_memory_object () -{ - GLboolean r = GL_FALSE; - - r = ((glBufferStorageMemEXT = (PFNGLBUFFERSTORAGEMEMEXTPROC)glewGetProcAddress((const GLubyte*)"glBufferStorageMemEXT")) == NULL) || r; - r = ((glCreateMemoryObjectsEXT = (PFNGLCREATEMEMORYOBJECTSEXTPROC)glewGetProcAddress((const GLubyte*)"glCreateMemoryObjectsEXT")) == NULL) || r; - r = ((glDeleteMemoryObjectsEXT = (PFNGLDELETEMEMORYOBJECTSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteMemoryObjectsEXT")) == NULL) || r; - r = ((glGetMemoryObjectParameterivEXT = (PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMemoryObjectParameterivEXT")) == NULL) || r; - r = ((glGetUnsignedBytei_vEXT = (PFNGLGETUNSIGNEDBYTEI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUnsignedBytei_vEXT")) == NULL) || r; - r = ((glGetUnsignedBytevEXT = (PFNGLGETUNSIGNEDBYTEVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUnsignedBytevEXT")) == NULL) || r; - r = ((glIsMemoryObjectEXT = (PFNGLISMEMORYOBJECTEXTPROC)glewGetProcAddress((const GLubyte*)"glIsMemoryObjectEXT")) == NULL) || r; - r = ((glMemoryObjectParameterivEXT = (PFNGLMEMORYOBJECTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMemoryObjectParameterivEXT")) == NULL) || r; - r = ((glNamedBufferStorageMemEXT = (PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorageMemEXT")) == NULL) || r; - r = ((glTexStorageMem1DEXT = (PFNGLTEXSTORAGEMEM1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorageMem1DEXT")) == NULL) || r; - r = ((glTexStorageMem2DEXT = (PFNGLTEXSTORAGEMEM2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorageMem2DEXT")) == NULL) || r; - r = ((glTexStorageMem2DMultisampleEXT = (PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorageMem2DMultisampleEXT")) == NULL) || r; - r = ((glTexStorageMem3DEXT = (PFNGLTEXSTORAGEMEM3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorageMem3DEXT")) == NULL) || r; - r = ((glTexStorageMem3DMultisampleEXT = (PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorageMem3DMultisampleEXT")) == NULL) || r; - r = ((glTextureStorageMem1DEXT = (PFNGLTEXTURESTORAGEMEM1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageMem1DEXT")) == NULL) || r; - r = ((glTextureStorageMem2DEXT = (PFNGLTEXTURESTORAGEMEM2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageMem2DEXT")) == NULL) || r; - r = ((glTextureStorageMem2DMultisampleEXT = (PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageMem2DMultisampleEXT")) == NULL) || r; - r = ((glTextureStorageMem3DEXT = (PFNGLTEXTURESTORAGEMEM3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageMem3DEXT")) == NULL) || r; - r = ((glTextureStorageMem3DMultisampleEXT = (PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageMem3DMultisampleEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_memory_object */ - -#ifdef GL_EXT_memory_object_fd - -static GLboolean _glewInit_GL_EXT_memory_object_fd () -{ - GLboolean r = GL_FALSE; - - r = ((glImportMemoryFdEXT = (PFNGLIMPORTMEMORYFDEXTPROC)glewGetProcAddress((const GLubyte*)"glImportMemoryFdEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_memory_object_fd */ - -#ifdef GL_EXT_memory_object_win32 - -static GLboolean _glewInit_GL_EXT_memory_object_win32 () -{ - GLboolean r = GL_FALSE; - - r = ((glImportMemoryWin32HandleEXT = (PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC)glewGetProcAddress((const GLubyte*)"glImportMemoryWin32HandleEXT")) == NULL) || r; - r = ((glImportMemoryWin32NameEXT = (PFNGLIMPORTMEMORYWIN32NAMEEXTPROC)glewGetProcAddress((const GLubyte*)"glImportMemoryWin32NameEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_memory_object_win32 */ - -#ifdef GL_EXT_multi_draw_arrays - -static GLboolean _glewInit_GL_EXT_multi_draw_arrays () -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysEXT")) == NULL) || r; - r = ((glMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_multi_draw_arrays */ - -#ifdef GL_EXT_multi_draw_indirect - -static GLboolean _glewInit_GL_EXT_multi_draw_indirect () -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysIndirectEXT = (PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectEXT")) == NULL) || r; - r = ((glMultiDrawElementsIndirectEXT = (PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_multi_draw_indirect */ - -#ifdef GL_EXT_multisample - -static GLboolean _glewInit_GL_EXT_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glSampleMaskEXT = (PFNGLSAMPLEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskEXT")) == NULL) || r; - r = ((glSamplePatternEXT = (PFNGLSAMPLEPATTERNEXTPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_multisample */ - -#ifdef GL_EXT_multisampled_render_to_texture - -static GLboolean _glewInit_GL_EXT_multisampled_render_to_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferTexture2DMultisampleEXT = (PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2DMultisampleEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_multisampled_render_to_texture */ - -#ifdef GL_EXT_multiview_draw_buffers - -static GLboolean _glewInit_GL_EXT_multiview_draw_buffers () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawBuffersIndexedEXT = (PFNGLDRAWBUFFERSINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersIndexedEXT")) == NULL) || r; - r = ((glGetIntegeri_vEXT = (PFNGLGETINTEGERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetIntegeri_vEXT")) == NULL) || r; - r = ((glReadBufferIndexedEXT = (PFNGLREADBUFFERINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glReadBufferIndexedEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_multiview_draw_buffers */ - -#ifdef GL_EXT_paletted_texture - -static GLboolean _glewInit_GL_EXT_paletted_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glColorTableEXT = (PFNGLCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorTableEXT")) == NULL) || r; - r = ((glGetColorTableEXT = (PFNGLGETCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableEXT")) == NULL) || r; - r = ((glGetColorTableParameterfvEXT = (PFNGLGETCOLORTABLEPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvEXT")) == NULL) || r; - r = ((glGetColorTableParameterivEXT = (PFNGLGETCOLORTABLEPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_paletted_texture */ - -#ifdef GL_EXT_pixel_transform - -static GLboolean _glewInit_GL_EXT_pixel_transform () -{ - GLboolean r = GL_FALSE; - - r = ((glGetPixelTransformParameterfvEXT = (PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterfvEXT")) == NULL) || r; - r = ((glGetPixelTransformParameterivEXT = (PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterivEXT")) == NULL) || r; - r = ((glPixelTransformParameterfEXT = (PFNGLPIXELTRANSFORMPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfEXT")) == NULL) || r; - r = ((glPixelTransformParameterfvEXT = (PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfvEXT")) == NULL) || r; - r = ((glPixelTransformParameteriEXT = (PFNGLPIXELTRANSFORMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameteriEXT")) == NULL) || r; - r = ((glPixelTransformParameterivEXT = (PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterivEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_pixel_transform */ - -#ifdef GL_EXT_point_parameters - -static GLboolean _glewInit_GL_EXT_point_parameters () -{ - GLboolean r = GL_FALSE; - - r = ((glPointParameterfEXT = (PFNGLPOINTPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfEXT")) == NULL) || r; - r = ((glPointParameterfvEXT = (PFNGLPOINTPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_point_parameters */ - -#ifdef GL_EXT_polygon_offset - -static GLboolean _glewInit_GL_EXT_polygon_offset () -{ - GLboolean r = GL_FALSE; - - r = ((glPolygonOffsetEXT = (PFNGLPOLYGONOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_polygon_offset */ - -#ifdef GL_EXT_polygon_offset_clamp - -static GLboolean _glewInit_GL_EXT_polygon_offset_clamp () -{ - GLboolean r = GL_FALSE; - - r = ((glPolygonOffsetClampEXT = (PFNGLPOLYGONOFFSETCLAMPEXTPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetClampEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_polygon_offset_clamp */ - -#ifdef GL_EXT_provoking_vertex - -static GLboolean _glewInit_GL_EXT_provoking_vertex () -{ - GLboolean r = GL_FALSE; - - r = ((glProvokingVertexEXT = (PFNGLPROVOKINGVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glProvokingVertexEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_provoking_vertex */ - -#ifdef GL_EXT_raster_multisample - -static GLboolean _glewInit_GL_EXT_raster_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glCoverageModulationNV = (PFNGLCOVERAGEMODULATIONNVPROC)glewGetProcAddress((const GLubyte*)"glCoverageModulationNV")) == NULL) || r; - r = ((glCoverageModulationTableNV = (PFNGLCOVERAGEMODULATIONTABLENVPROC)glewGetProcAddress((const GLubyte*)"glCoverageModulationTableNV")) == NULL) || r; - r = ((glGetCoverageModulationTableNV = (PFNGLGETCOVERAGEMODULATIONTABLENVPROC)glewGetProcAddress((const GLubyte*)"glGetCoverageModulationTableNV")) == NULL) || r; - r = ((glRasterSamplesEXT = (PFNGLRASTERSAMPLESEXTPROC)glewGetProcAddress((const GLubyte*)"glRasterSamplesEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_raster_multisample */ - -#ifdef GL_EXT_scene_marker - -static GLboolean _glewInit_GL_EXT_scene_marker () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginSceneEXT = (PFNGLBEGINSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginSceneEXT")) == NULL) || r; - r = ((glEndSceneEXT = (PFNGLENDSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glEndSceneEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_scene_marker */ - -#ifdef GL_EXT_secondary_color - -static GLboolean _glewInit_GL_EXT_secondary_color () -{ - GLboolean r = GL_FALSE; - - r = ((glSecondaryColor3bEXT = (PFNGLSECONDARYCOLOR3BEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bEXT")) == NULL) || r; - r = ((glSecondaryColor3bvEXT = (PFNGLSECONDARYCOLOR3BVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bvEXT")) == NULL) || r; - r = ((glSecondaryColor3dEXT = (PFNGLSECONDARYCOLOR3DEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dEXT")) == NULL) || r; - r = ((glSecondaryColor3dvEXT = (PFNGLSECONDARYCOLOR3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dvEXT")) == NULL) || r; - r = ((glSecondaryColor3fEXT = (PFNGLSECONDARYCOLOR3FEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fEXT")) == NULL) || r; - r = ((glSecondaryColor3fvEXT = (PFNGLSECONDARYCOLOR3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fvEXT")) == NULL) || r; - r = ((glSecondaryColor3iEXT = (PFNGLSECONDARYCOLOR3IEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iEXT")) == NULL) || r; - r = ((glSecondaryColor3ivEXT = (PFNGLSECONDARYCOLOR3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ivEXT")) == NULL) || r; - r = ((glSecondaryColor3sEXT = (PFNGLSECONDARYCOLOR3SEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sEXT")) == NULL) || r; - r = ((glSecondaryColor3svEXT = (PFNGLSECONDARYCOLOR3SVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3svEXT")) == NULL) || r; - r = ((glSecondaryColor3ubEXT = (PFNGLSECONDARYCOLOR3UBEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubEXT")) == NULL) || r; - r = ((glSecondaryColor3ubvEXT = (PFNGLSECONDARYCOLOR3UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubvEXT")) == NULL) || r; - r = ((glSecondaryColor3uiEXT = (PFNGLSECONDARYCOLOR3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiEXT")) == NULL) || r; - r = ((glSecondaryColor3uivEXT = (PFNGLSECONDARYCOLOR3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uivEXT")) == NULL) || r; - r = ((glSecondaryColor3usEXT = (PFNGLSECONDARYCOLOR3USEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usEXT")) == NULL) || r; - r = ((glSecondaryColor3usvEXT = (PFNGLSECONDARYCOLOR3USVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usvEXT")) == NULL) || r; - r = ((glSecondaryColorPointerEXT = (PFNGLSECONDARYCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_secondary_color */ - -#ifdef GL_EXT_semaphore - -static GLboolean _glewInit_GL_EXT_semaphore () -{ - GLboolean r = GL_FALSE; - - r = ((glDeleteSemaphoresEXT = (PFNGLDELETESEMAPHORESEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteSemaphoresEXT")) == NULL) || r; - r = ((glGenSemaphoresEXT = (PFNGLGENSEMAPHORESEXTPROC)glewGetProcAddress((const GLubyte*)"glGenSemaphoresEXT")) == NULL) || r; - r = ((glGetSemaphoreParameterui64vEXT = (PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetSemaphoreParameterui64vEXT")) == NULL) || r; - r = ((glIsSemaphoreEXT = (PFNGLISSEMAPHOREEXTPROC)glewGetProcAddress((const GLubyte*)"glIsSemaphoreEXT")) == NULL) || r; - r = ((glSemaphoreParameterui64vEXT = (PFNGLSEMAPHOREPARAMETERUI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glSemaphoreParameterui64vEXT")) == NULL) || r; - r = ((glSignalSemaphoreEXT = (PFNGLSIGNALSEMAPHOREEXTPROC)glewGetProcAddress((const GLubyte*)"glSignalSemaphoreEXT")) == NULL) || r; - r = ((glWaitSemaphoreEXT = (PFNGLWAITSEMAPHOREEXTPROC)glewGetProcAddress((const GLubyte*)"glWaitSemaphoreEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_semaphore */ - -#ifdef GL_EXT_semaphore_fd - -static GLboolean _glewInit_GL_EXT_semaphore_fd () -{ - GLboolean r = GL_FALSE; - - r = ((glImportSemaphoreFdEXT = (PFNGLIMPORTSEMAPHOREFDEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSemaphoreFdEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_semaphore_fd */ - -#ifdef GL_EXT_semaphore_win32 - -static GLboolean _glewInit_GL_EXT_semaphore_win32 () -{ - GLboolean r = GL_FALSE; - - r = ((glImportSemaphoreWin32HandleEXT = (PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSemaphoreWin32HandleEXT")) == NULL) || r; - r = ((glImportSemaphoreWin32NameEXT = (PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSemaphoreWin32NameEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_semaphore_win32 */ - -#ifdef GL_EXT_separate_shader_objects - -static GLboolean _glewInit_GL_EXT_separate_shader_objects () -{ - GLboolean r = GL_FALSE; - - r = ((glActiveProgramEXT = (PFNGLACTIVEPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveProgramEXT")) == NULL) || r; - r = ((glCreateShaderProgramEXT = (PFNGLCREATESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderProgramEXT")) == NULL) || r; - r = ((glUseShaderProgramEXT = (PFNGLUSESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glUseShaderProgramEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_separate_shader_objects */ - -#ifdef GL_EXT_shader_image_load_store - -static GLboolean _glewInit_GL_EXT_shader_image_load_store () -{ - GLboolean r = GL_FALSE; - - r = ((glBindImageTextureEXT = (PFNGLBINDIMAGETEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindImageTextureEXT")) == NULL) || r; - r = ((glMemoryBarrierEXT = (PFNGLMEMORYBARRIEREXTPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrierEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_shader_image_load_store */ - -#ifdef GL_EXT_shader_pixel_local_storage2 - -static GLboolean _glewInit_GL_EXT_shader_pixel_local_storage2 () -{ - GLboolean r = GL_FALSE; - - r = ((glClearPixelLocalStorageuiEXT = (PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearPixelLocalStorageuiEXT")) == NULL) || r; - r = ((glFramebufferPixelLocalStorageSizeEXT = (PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferPixelLocalStorageSizeEXT")) == NULL) || r; - r = ((glGetFramebufferPixelLocalStorageSizeEXT = (PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferPixelLocalStorageSizeEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_shader_pixel_local_storage2 */ - -#ifdef GL_EXT_sparse_texture - -static GLboolean _glewInit_GL_EXT_sparse_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glTexPageCommitmentEXT = (PFNGLTEXPAGECOMMITMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glTexPageCommitmentEXT")) == NULL) || r; - r = ((glTexturePageCommitmentEXT = (PFNGLTEXTUREPAGECOMMITMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glTexturePageCommitmentEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_sparse_texture */ - -#ifdef GL_EXT_stencil_two_side - -static GLboolean _glewInit_GL_EXT_stencil_two_side () -{ - GLboolean r = GL_FALSE; - - r = ((glActiveStencilFaceEXT = (PFNGLACTIVESTENCILFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveStencilFaceEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_stencil_two_side */ - -#ifdef GL_EXT_subtexture - -static GLboolean _glewInit_GL_EXT_subtexture () -{ - GLboolean r = GL_FALSE; - - r = ((glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage1DEXT")) == NULL) || r; - r = ((glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage2DEXT")) == NULL) || r; - r = ((glTexSubImage3DEXT = (PFNGLTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3DEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_subtexture */ - -#ifdef GL_EXT_texture3D - -static GLboolean _glewInit_GL_EXT_texture3D () -{ - GLboolean r = GL_FALSE; - - r = ((glTexImage3DEXT = (PFNGLTEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture3D */ - -#ifdef GL_EXT_texture_array - -static GLboolean _glewInit_GL_EXT_texture_array () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_array */ - -#ifdef GL_EXT_texture_buffer_object - -static GLboolean _glewInit_GL_EXT_texture_buffer_object () -{ - GLboolean r = GL_FALSE; - - r = ((glTexBufferEXT = (PFNGLTEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexBufferEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_buffer_object */ - -#ifdef GL_EXT_texture_integer - -static GLboolean _glewInit_GL_EXT_texture_integer () -{ - GLboolean r = GL_FALSE; - - r = ((glClearColorIiEXT = (PFNGLCLEARCOLORIIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearColorIiEXT")) == NULL) || r; - r = ((glClearColorIuiEXT = (PFNGLCLEARCOLORIUIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearColorIuiEXT")) == NULL) || r; - r = ((glGetTexParameterIivEXT = (PFNGLGETTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIivEXT")) == NULL) || r; - r = ((glGetTexParameterIuivEXT = (PFNGLGETTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuivEXT")) == NULL) || r; - r = ((glTexParameterIivEXT = (PFNGLTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIivEXT")) == NULL) || r; - r = ((glTexParameterIuivEXT = (PFNGLTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIuivEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_integer */ - -#ifdef GL_EXT_texture_object - -static GLboolean _glewInit_GL_EXT_texture_object () -{ - GLboolean r = GL_FALSE; - - r = ((glAreTexturesResidentEXT = (PFNGLARETEXTURESRESIDENTEXTPROC)glewGetProcAddress((const GLubyte*)"glAreTexturesResidentEXT")) == NULL) || r; - r = ((glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureEXT")) == NULL) || r; - r = ((glDeleteTexturesEXT = (PFNGLDELETETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteTexturesEXT")) == NULL) || r; - r = ((glGenTexturesEXT = (PFNGLGENTEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glGenTexturesEXT")) == NULL) || r; - r = ((glIsTextureEXT = (PFNGLISTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glIsTextureEXT")) == NULL) || r; - r = ((glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glPrioritizeTexturesEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_object */ - -#ifdef GL_EXT_texture_perturb_normal - -static GLboolean _glewInit_GL_EXT_texture_perturb_normal () -{ - GLboolean r = GL_FALSE; - - r = ((glTextureNormalEXT = (PFNGLTEXTURENORMALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureNormalEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_perturb_normal */ - -#ifdef GL_EXT_texture_storage - -static GLboolean _glewInit_GL_EXT_texture_storage () -{ - GLboolean r = GL_FALSE; - - r = ((glTexStorage1DEXT = (PFNGLTEXSTORAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorage1DEXT")) == NULL) || r; - r = ((glTexStorage2DEXT = (PFNGLTEXSTORAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2DEXT")) == NULL) || r; - r = ((glTexStorage3DEXT = (PFNGLTEXSTORAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3DEXT")) == NULL) || r; - r = ((glTextureStorage1DEXT = (PFNGLTEXTURESTORAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage1DEXT")) == NULL) || r; - r = ((glTextureStorage2DEXT = (PFNGLTEXTURESTORAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DEXT")) == NULL) || r; - r = ((glTextureStorage3DEXT = (PFNGLTEXTURESTORAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_storage */ - -#ifdef GL_EXT_texture_view - -static GLboolean _glewInit_GL_EXT_texture_view () -{ - GLboolean r = GL_FALSE; - - r = ((glTextureViewEXT = (PFNGLTEXTUREVIEWEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureViewEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_view */ - -#ifdef GL_EXT_timer_query - -static GLboolean _glewInit_GL_EXT_timer_query () -{ - GLboolean r = GL_FALSE; - - r = ((glGetQueryObjecti64vEXT = (PFNGLGETQUERYOBJECTI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64vEXT")) == NULL) || r; - r = ((glGetQueryObjectui64vEXT = (PFNGLGETQUERYOBJECTUI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64vEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_timer_query */ - -#ifdef GL_EXT_transform_feedback - -static GLboolean _glewInit_GL_EXT_transform_feedback () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginTransformFeedbackEXT = (PFNGLBEGINTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedbackEXT")) == NULL) || r; - r = ((glBindBufferBaseEXT = (PFNGLBINDBUFFERBASEEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBaseEXT")) == NULL) || r; - r = ((glBindBufferOffsetEXT = (PFNGLBINDBUFFEROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferOffsetEXT")) == NULL) || r; - r = ((glBindBufferRangeEXT = (PFNGLBINDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRangeEXT")) == NULL) || r; - r = ((glEndTransformFeedbackEXT = (PFNGLENDTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedbackEXT")) == NULL) || r; - r = ((glGetTransformFeedbackVaryingEXT = (PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVaryingEXT")) == NULL) || r; - r = ((glTransformFeedbackVaryingsEXT = (PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryingsEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_transform_feedback */ - -#ifdef GL_EXT_vertex_array - -static GLboolean _glewInit_GL_EXT_vertex_array () -{ - GLboolean r = GL_FALSE; - - r = ((glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glArrayElementEXT")) == NULL) || r; - r = ((glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glColorPointerEXT")) == NULL) || r; - r = ((glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysEXT")) == NULL) || r; - r = ((glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerEXT")) == NULL) || r; - r = ((glIndexPointerEXT = (PFNGLINDEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerEXT")) == NULL) || r; - r = ((glNormalPointerEXT = (PFNGLNORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerEXT")) == NULL) || r; - r = ((glTexCoordPointerEXT = (PFNGLTEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerEXT")) == NULL) || r; - r = ((glVertexPointerEXT = (PFNGLVERTEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_vertex_array */ - -#ifdef GL_EXT_vertex_array_setXXX - -static GLboolean _glewInit_GL_EXT_vertex_array_setXXX () -{ - GLboolean r = GL_FALSE; - - r = ((glBindArraySetEXT = (PFNGLBINDARRAYSETEXTPROC)glewGetProcAddress((const GLubyte*)"glBindArraySetEXT")) == NULL) || r; - r = ((glCreateArraySetExt = (PFNGLCREATEARRAYSETEXTPROC)glewGetProcAddress((const GLubyte*)"glCreateArraySetExt")) == NULL) || r; - r = ((glDeleteArraySetsEXT = (PFNGLDELETEARRAYSETSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteArraySetsEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_vertex_array_setXXX */ - -#ifdef GL_EXT_vertex_attrib_64bit - -static GLboolean _glewInit_GL_EXT_vertex_attrib_64bit () -{ - GLboolean r = GL_FALSE; - - r = ((glGetVertexAttribLdvEXT = (PFNGLGETVERTEXATTRIBLDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLdvEXT")) == NULL) || r; - r = ((glVertexArrayVertexAttribLOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribLOffsetEXT")) == NULL) || r; - r = ((glVertexAttribL1dEXT = (PFNGLVERTEXATTRIBL1DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dEXT")) == NULL) || r; - r = ((glVertexAttribL1dvEXT = (PFNGLVERTEXATTRIBL1DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dvEXT")) == NULL) || r; - r = ((glVertexAttribL2dEXT = (PFNGLVERTEXATTRIBL2DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dEXT")) == NULL) || r; - r = ((glVertexAttribL2dvEXT = (PFNGLVERTEXATTRIBL2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dvEXT")) == NULL) || r; - r = ((glVertexAttribL3dEXT = (PFNGLVERTEXATTRIBL3DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dEXT")) == NULL) || r; - r = ((glVertexAttribL3dvEXT = (PFNGLVERTEXATTRIBL3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dvEXT")) == NULL) || r; - r = ((glVertexAttribL4dEXT = (PFNGLVERTEXATTRIBL4DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dEXT")) == NULL) || r; - r = ((glVertexAttribL4dvEXT = (PFNGLVERTEXATTRIBL4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dvEXT")) == NULL) || r; - r = ((glVertexAttribLPointerEXT = (PFNGLVERTEXATTRIBLPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLPointerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_vertex_attrib_64bit */ - -#ifdef GL_EXT_vertex_shader - -static GLboolean _glewInit_GL_EXT_vertex_shader () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginVertexShaderEXT = (PFNGLBEGINVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBeginVertexShaderEXT")) == NULL) || r; - r = ((glBindLightParameterEXT = (PFNGLBINDLIGHTPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindLightParameterEXT")) == NULL) || r; - r = ((glBindMaterialParameterEXT = (PFNGLBINDMATERIALPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindMaterialParameterEXT")) == NULL) || r; - r = ((glBindParameterEXT = (PFNGLBINDPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindParameterEXT")) == NULL) || r; - r = ((glBindTexGenParameterEXT = (PFNGLBINDTEXGENPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTexGenParameterEXT")) == NULL) || r; - r = ((glBindTextureUnitParameterEXT = (PFNGLBINDTEXTUREUNITPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureUnitParameterEXT")) == NULL) || r; - r = ((glBindVertexShaderEXT = (PFNGLBINDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindVertexShaderEXT")) == NULL) || r; - r = ((glDeleteVertexShaderEXT = (PFNGLDELETEVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexShaderEXT")) == NULL) || r; - r = ((glDisableVariantClientStateEXT = (PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVariantClientStateEXT")) == NULL) || r; - r = ((glEnableVariantClientStateEXT = (PFNGLENABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVariantClientStateEXT")) == NULL) || r; - r = ((glEndVertexShaderEXT = (PFNGLENDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glEndVertexShaderEXT")) == NULL) || r; - r = ((glExtractComponentEXT = (PFNGLEXTRACTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glExtractComponentEXT")) == NULL) || r; - r = ((glGenSymbolsEXT = (PFNGLGENSYMBOLSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenSymbolsEXT")) == NULL) || r; - r = ((glGenVertexShadersEXT = (PFNGLGENVERTEXSHADERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenVertexShadersEXT")) == NULL) || r; - r = ((glGetInvariantBooleanvEXT = (PFNGLGETINVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantBooleanvEXT")) == NULL) || r; - r = ((glGetInvariantFloatvEXT = (PFNGLGETINVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantFloatvEXT")) == NULL) || r; - r = ((glGetInvariantIntegervEXT = (PFNGLGETINVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantIntegervEXT")) == NULL) || r; - r = ((glGetLocalConstantBooleanvEXT = (PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantBooleanvEXT")) == NULL) || r; - r = ((glGetLocalConstantFloatvEXT = (PFNGLGETLOCALCONSTANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantFloatvEXT")) == NULL) || r; - r = ((glGetLocalConstantIntegervEXT = (PFNGLGETLOCALCONSTANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantIntegervEXT")) == NULL) || r; - r = ((glGetVariantBooleanvEXT = (PFNGLGETVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantBooleanvEXT")) == NULL) || r; - r = ((glGetVariantFloatvEXT = (PFNGLGETVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantFloatvEXT")) == NULL) || r; - r = ((glGetVariantIntegervEXT = (PFNGLGETVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantIntegervEXT")) == NULL) || r; - r = ((glGetVariantPointervEXT = (PFNGLGETVARIANTPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantPointervEXT")) == NULL) || r; - r = ((glInsertComponentEXT = (PFNGLINSERTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glInsertComponentEXT")) == NULL) || r; - r = ((glIsVariantEnabledEXT = (PFNGLISVARIANTENABLEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsVariantEnabledEXT")) == NULL) || r; - r = ((glSetInvariantEXT = (PFNGLSETINVARIANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetInvariantEXT")) == NULL) || r; - r = ((glSetLocalConstantEXT = (PFNGLSETLOCALCONSTANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetLocalConstantEXT")) == NULL) || r; - r = ((glShaderOp1EXT = (PFNGLSHADEROP1EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp1EXT")) == NULL) || r; - r = ((glShaderOp2EXT = (PFNGLSHADEROP2EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp2EXT")) == NULL) || r; - r = ((glShaderOp3EXT = (PFNGLSHADEROP3EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp3EXT")) == NULL) || r; - r = ((glSwizzleEXT = (PFNGLSWIZZLEEXTPROC)glewGetProcAddress((const GLubyte*)"glSwizzleEXT")) == NULL) || r; - r = ((glVariantPointerEXT = (PFNGLVARIANTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVariantPointerEXT")) == NULL) || r; - r = ((glVariantbvEXT = (PFNGLVARIANTBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantbvEXT")) == NULL) || r; - r = ((glVariantdvEXT = (PFNGLVARIANTDVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantdvEXT")) == NULL) || r; - r = ((glVariantfvEXT = (PFNGLVARIANTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantfvEXT")) == NULL) || r; - r = ((glVariantivEXT = (PFNGLVARIANTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantivEXT")) == NULL) || r; - r = ((glVariantsvEXT = (PFNGLVARIANTSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantsvEXT")) == NULL) || r; - r = ((glVariantubvEXT = (PFNGLVARIANTUBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantubvEXT")) == NULL) || r; - r = ((glVariantuivEXT = (PFNGLVARIANTUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantuivEXT")) == NULL) || r; - r = ((glVariantusvEXT = (PFNGLVARIANTUSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantusvEXT")) == NULL) || r; - r = ((glWriteMaskEXT = (PFNGLWRITEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glWriteMaskEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_vertex_shader */ - -#ifdef GL_EXT_vertex_weighting - -static GLboolean _glewInit_GL_EXT_vertex_weighting () -{ - GLboolean r = GL_FALSE; - - r = ((glVertexWeightPointerEXT = (PFNGLVERTEXWEIGHTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightPointerEXT")) == NULL) || r; - r = ((glVertexWeightfEXT = (PFNGLVERTEXWEIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfEXT")) == NULL) || r; - r = ((glVertexWeightfvEXT = (PFNGLVERTEXWEIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfvEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_vertex_weighting */ - -#ifdef GL_EXT_win32_keyed_mutex - -static GLboolean _glewInit_GL_EXT_win32_keyed_mutex () -{ - GLboolean r = GL_FALSE; - - r = ((glAcquireKeyedMutexWin32EXT = (PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC)glewGetProcAddress((const GLubyte*)"glAcquireKeyedMutexWin32EXT")) == NULL) || r; - r = ((glReleaseKeyedMutexWin32EXT = (PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC)glewGetProcAddress((const GLubyte*)"glReleaseKeyedMutexWin32EXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_win32_keyed_mutex */ - -#ifdef GL_EXT_window_rectangles - -static GLboolean _glewInit_GL_EXT_window_rectangles () -{ - GLboolean r = GL_FALSE; - - r = ((glWindowRectanglesEXT = (PFNGLWINDOWRECTANGLESEXTPROC)glewGetProcAddress((const GLubyte*)"glWindowRectanglesEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_window_rectangles */ - -#ifdef GL_EXT_x11_sync_object - -static GLboolean _glewInit_GL_EXT_x11_sync_object () -{ - GLboolean r = GL_FALSE; - - r = ((glImportSyncEXT = (PFNGLIMPORTSYNCEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSyncEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_x11_sync_object */ - -#ifdef GL_GREMEDY_frame_terminator - -static GLboolean _glewInit_GL_GREMEDY_frame_terminator () -{ - GLboolean r = GL_FALSE; - - r = ((glFrameTerminatorGREMEDY = (PFNGLFRAMETERMINATORGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glFrameTerminatorGREMEDY")) == NULL) || r; - - return r; -} - -#endif /* GL_GREMEDY_frame_terminator */ - -#ifdef GL_GREMEDY_string_marker - -static GLboolean _glewInit_GL_GREMEDY_string_marker () -{ - GLboolean r = GL_FALSE; - - r = ((glStringMarkerGREMEDY = (PFNGLSTRINGMARKERGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glStringMarkerGREMEDY")) == NULL) || r; - - return r; -} - -#endif /* GL_GREMEDY_string_marker */ - -#ifdef GL_HP_image_transform - -static GLboolean _glewInit_GL_HP_image_transform () -{ - GLboolean r = GL_FALSE; - - r = ((glGetImageTransformParameterfvHP = (PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterfvHP")) == NULL) || r; - r = ((glGetImageTransformParameterivHP = (PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterivHP")) == NULL) || r; - r = ((glImageTransformParameterfHP = (PFNGLIMAGETRANSFORMPARAMETERFHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfHP")) == NULL) || r; - r = ((glImageTransformParameterfvHP = (PFNGLIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfvHP")) == NULL) || r; - r = ((glImageTransformParameteriHP = (PFNGLIMAGETRANSFORMPARAMETERIHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameteriHP")) == NULL) || r; - r = ((glImageTransformParameterivHP = (PFNGLIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterivHP")) == NULL) || r; - - return r; -} - -#endif /* GL_HP_image_transform */ - -#ifdef GL_IBM_multimode_draw_arrays - -static GLboolean _glewInit_GL_IBM_multimode_draw_arrays () -{ - GLboolean r = GL_FALSE; - - r = ((glMultiModeDrawArraysIBM = (PFNGLMULTIMODEDRAWARRAYSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawArraysIBM")) == NULL) || r; - r = ((glMultiModeDrawElementsIBM = (PFNGLMULTIMODEDRAWELEMENTSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawElementsIBM")) == NULL) || r; - - return r; -} - -#endif /* GL_IBM_multimode_draw_arrays */ - -#ifdef GL_IBM_vertex_array_lists - -static GLboolean _glewInit_GL_IBM_vertex_array_lists () -{ - GLboolean r = GL_FALSE; - - r = ((glColorPointerListIBM = (PFNGLCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glColorPointerListIBM")) == NULL) || r; - r = ((glEdgeFlagPointerListIBM = (PFNGLEDGEFLAGPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerListIBM")) == NULL) || r; - r = ((glFogCoordPointerListIBM = (PFNGLFOGCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerListIBM")) == NULL) || r; - r = ((glIndexPointerListIBM = (PFNGLINDEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerListIBM")) == NULL) || r; - r = ((glNormalPointerListIBM = (PFNGLNORMALPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerListIBM")) == NULL) || r; - r = ((glSecondaryColorPointerListIBM = (PFNGLSECONDARYCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerListIBM")) == NULL) || r; - r = ((glTexCoordPointerListIBM = (PFNGLTEXCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerListIBM")) == NULL) || r; - r = ((glVertexPointerListIBM = (PFNGLVERTEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerListIBM")) == NULL) || r; - - return r; -} - -#endif /* GL_IBM_vertex_array_lists */ - -#ifdef GL_INTEL_map_texture - -static GLboolean _glewInit_GL_INTEL_map_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glMapTexture2DINTEL = (PFNGLMAPTEXTURE2DINTELPROC)glewGetProcAddress((const GLubyte*)"glMapTexture2DINTEL")) == NULL) || r; - r = ((glSyncTextureINTEL = (PFNGLSYNCTEXTUREINTELPROC)glewGetProcAddress((const GLubyte*)"glSyncTextureINTEL")) == NULL) || r; - r = ((glUnmapTexture2DINTEL = (PFNGLUNMAPTEXTURE2DINTELPROC)glewGetProcAddress((const GLubyte*)"glUnmapTexture2DINTEL")) == NULL) || r; - - return r; -} - -#endif /* GL_INTEL_map_texture */ - -#ifdef GL_INTEL_parallel_arrays - -static GLboolean _glewInit_GL_INTEL_parallel_arrays () -{ - GLboolean r = GL_FALSE; - - r = ((glColorPointervINTEL = (PFNGLCOLORPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glColorPointervINTEL")) == NULL) || r; - r = ((glNormalPointervINTEL = (PFNGLNORMALPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glNormalPointervINTEL")) == NULL) || r; - r = ((glTexCoordPointervINTEL = (PFNGLTEXCOORDPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointervINTEL")) == NULL) || r; - r = ((glVertexPointervINTEL = (PFNGLVERTEXPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glVertexPointervINTEL")) == NULL) || r; - - return r; -} - -#endif /* GL_INTEL_parallel_arrays */ - -#ifdef GL_INTEL_performance_query - -static GLboolean _glewInit_GL_INTEL_performance_query () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginPerfQueryINTEL = (PFNGLBEGINPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glBeginPerfQueryINTEL")) == NULL) || r; - r = ((glCreatePerfQueryINTEL = (PFNGLCREATEPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glCreatePerfQueryINTEL")) == NULL) || r; - r = ((glDeletePerfQueryINTEL = (PFNGLDELETEPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glDeletePerfQueryINTEL")) == NULL) || r; - r = ((glEndPerfQueryINTEL = (PFNGLENDPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glEndPerfQueryINTEL")) == NULL) || r; - r = ((glGetFirstPerfQueryIdINTEL = (PFNGLGETFIRSTPERFQUERYIDINTELPROC)glewGetProcAddress((const GLubyte*)"glGetFirstPerfQueryIdINTEL")) == NULL) || r; - r = ((glGetNextPerfQueryIdINTEL = (PFNGLGETNEXTPERFQUERYIDINTELPROC)glewGetProcAddress((const GLubyte*)"glGetNextPerfQueryIdINTEL")) == NULL) || r; - r = ((glGetPerfCounterInfoINTEL = (PFNGLGETPERFCOUNTERINFOINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfCounterInfoINTEL")) == NULL) || r; - r = ((glGetPerfQueryDataINTEL = (PFNGLGETPERFQUERYDATAINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryDataINTEL")) == NULL) || r; - r = ((glGetPerfQueryIdByNameINTEL = (PFNGLGETPERFQUERYIDBYNAMEINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryIdByNameINTEL")) == NULL) || r; - r = ((glGetPerfQueryInfoINTEL = (PFNGLGETPERFQUERYINFOINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryInfoINTEL")) == NULL) || r; - - return r; -} - -#endif /* GL_INTEL_performance_query */ - -#ifdef GL_INTEL_texture_scissor - -static GLboolean _glewInit_GL_INTEL_texture_scissor () -{ - GLboolean r = GL_FALSE; - - r = ((glTexScissorFuncINTEL = (PFNGLTEXSCISSORFUNCINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorFuncINTEL")) == NULL) || r; - r = ((glTexScissorINTEL = (PFNGLTEXSCISSORINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorINTEL")) == NULL) || r; - - return r; -} - -#endif /* GL_INTEL_texture_scissor */ - -#ifdef GL_KHR_blend_equation_advanced - -static GLboolean _glewInit_GL_KHR_blend_equation_advanced () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendBarrierKHR = (PFNGLBLENDBARRIERKHRPROC)glewGetProcAddress((const GLubyte*)"glBlendBarrierKHR")) == NULL) || r; - - return r; -} - -#endif /* GL_KHR_blend_equation_advanced */ - -#ifdef GL_KHR_debug - -static GLboolean _glewInit_GL_KHR_debug () -{ - GLboolean r = GL_FALSE; - - r = ((glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallback")) == NULL) || r; - r = ((glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageControl")) == NULL) || r; - r = ((glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsert")) == NULL) || r; - r = ((glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLog")) == NULL) || r; - r = ((glGetObjectLabel = (PFNGLGETOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectLabel")) == NULL) || r; - r = ((glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectPtrLabel")) == NULL) || r; - r = ((glObjectLabel = (PFNGLOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectLabel")) == NULL) || r; - r = ((glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectPtrLabel")) == NULL) || r; - r = ((glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPopDebugGroup")) == NULL) || r; - r = ((glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPushDebugGroup")) == NULL) || r; - - return r; -} - -#endif /* GL_KHR_debug */ - -#ifdef GL_KHR_parallel_shader_compile - -static GLboolean _glewInit_GL_KHR_parallel_shader_compile () -{ - GLboolean r = GL_FALSE; - - r = ((glMaxShaderCompilerThreadsKHR = (PFNGLMAXSHADERCOMPILERTHREADSKHRPROC)glewGetProcAddress((const GLubyte*)"glMaxShaderCompilerThreadsKHR")) == NULL) || r; - - return r; -} - -#endif /* GL_KHR_parallel_shader_compile */ - -#ifdef GL_KHR_robustness - -static GLboolean _glewInit_GL_KHR_robustness () -{ - GLboolean r = GL_FALSE; - - r = ((glGetnUniformfv = (PFNGLGETNUNIFORMFVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformfv")) == NULL) || r; - r = ((glGetnUniformiv = (PFNGLGETNUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformiv")) == NULL) || r; - r = ((glGetnUniformuiv = (PFNGLGETNUNIFORMUIVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformuiv")) == NULL) || r; - r = ((glReadnPixels = (PFNGLREADNPIXELSPROC)glewGetProcAddress((const GLubyte*)"glReadnPixels")) == NULL) || r; - - return r; -} - -#endif /* GL_KHR_robustness */ - -#ifdef GL_KTX_buffer_region - -static GLboolean _glewInit_GL_KTX_buffer_region () -{ - GLboolean r = GL_FALSE; - - r = ((glBufferRegionEnabled = (PFNGLBUFFERREGIONENABLEDPROC)glewGetProcAddress((const GLubyte*)"glBufferRegionEnabled")) == NULL) || r; - r = ((glDeleteBufferRegion = (PFNGLDELETEBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glDeleteBufferRegion")) == NULL) || r; - r = ((glDrawBufferRegion = (PFNGLDRAWBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glDrawBufferRegion")) == NULL) || r; - r = ((glNewBufferRegion = (PFNGLNEWBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glNewBufferRegion")) == NULL) || r; - r = ((glReadBufferRegion = (PFNGLREADBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glReadBufferRegion")) == NULL) || r; - - return r; -} - -#endif /* GL_KTX_buffer_region */ - -#ifdef GL_MESA_resize_buffers - -static GLboolean _glewInit_GL_MESA_resize_buffers () -{ - GLboolean r = GL_FALSE; - - r = ((glResizeBuffersMESA = (PFNGLRESIZEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glResizeBuffersMESA")) == NULL) || r; - - return r; -} - -#endif /* GL_MESA_resize_buffers */ - -#ifdef GL_MESA_window_pos - -static GLboolean _glewInit_GL_MESA_window_pos () -{ - GLboolean r = GL_FALSE; - - r = ((glWindowPos2dMESA = (PFNGLWINDOWPOS2DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dMESA")) == NULL) || r; - r = ((glWindowPos2dvMESA = (PFNGLWINDOWPOS2DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvMESA")) == NULL) || r; - r = ((glWindowPos2fMESA = (PFNGLWINDOWPOS2FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fMESA")) == NULL) || r; - r = ((glWindowPos2fvMESA = (PFNGLWINDOWPOS2FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvMESA")) == NULL) || r; - r = ((glWindowPos2iMESA = (PFNGLWINDOWPOS2IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iMESA")) == NULL) || r; - r = ((glWindowPos2ivMESA = (PFNGLWINDOWPOS2IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivMESA")) == NULL) || r; - r = ((glWindowPos2sMESA = (PFNGLWINDOWPOS2SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sMESA")) == NULL) || r; - r = ((glWindowPos2svMESA = (PFNGLWINDOWPOS2SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svMESA")) == NULL) || r; - r = ((glWindowPos3dMESA = (PFNGLWINDOWPOS3DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dMESA")) == NULL) || r; - r = ((glWindowPos3dvMESA = (PFNGLWINDOWPOS3DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvMESA")) == NULL) || r; - r = ((glWindowPos3fMESA = (PFNGLWINDOWPOS3FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fMESA")) == NULL) || r; - r = ((glWindowPos3fvMESA = (PFNGLWINDOWPOS3FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvMESA")) == NULL) || r; - r = ((glWindowPos3iMESA = (PFNGLWINDOWPOS3IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iMESA")) == NULL) || r; - r = ((glWindowPos3ivMESA = (PFNGLWINDOWPOS3IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivMESA")) == NULL) || r; - r = ((glWindowPos3sMESA = (PFNGLWINDOWPOS3SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sMESA")) == NULL) || r; - r = ((glWindowPos3svMESA = (PFNGLWINDOWPOS3SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svMESA")) == NULL) || r; - r = ((glWindowPos4dMESA = (PFNGLWINDOWPOS4DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dMESA")) == NULL) || r; - r = ((glWindowPos4dvMESA = (PFNGLWINDOWPOS4DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dvMESA")) == NULL) || r; - r = ((glWindowPos4fMESA = (PFNGLWINDOWPOS4FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fMESA")) == NULL) || r; - r = ((glWindowPos4fvMESA = (PFNGLWINDOWPOS4FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fvMESA")) == NULL) || r; - r = ((glWindowPos4iMESA = (PFNGLWINDOWPOS4IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4iMESA")) == NULL) || r; - r = ((glWindowPos4ivMESA = (PFNGLWINDOWPOS4IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4ivMESA")) == NULL) || r; - r = ((glWindowPos4sMESA = (PFNGLWINDOWPOS4SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4sMESA")) == NULL) || r; - r = ((glWindowPos4svMESA = (PFNGLWINDOWPOS4SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4svMESA")) == NULL) || r; - - return r; -} - -#endif /* GL_MESA_window_pos */ - -#ifdef GL_NVX_conditional_render - -static GLboolean _glewInit_GL_NVX_conditional_render () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginConditionalRenderNVX = (PFNGLBEGINCONDITIONALRENDERNVXPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRenderNVX")) == NULL) || r; - r = ((glEndConditionalRenderNVX = (PFNGLENDCONDITIONALRENDERNVXPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRenderNVX")) == NULL) || r; - - return r; -} - -#endif /* GL_NVX_conditional_render */ - -#ifdef GL_NVX_linked_gpu_multicast - -static GLboolean _glewInit_GL_NVX_linked_gpu_multicast () -{ - GLboolean r = GL_FALSE; - - r = ((glLGPUCopyImageSubDataNVX = (PFNGLLGPUCOPYIMAGESUBDATANVXPROC)glewGetProcAddress((const GLubyte*)"glLGPUCopyImageSubDataNVX")) == NULL) || r; - r = ((glLGPUInterlockNVX = (PFNGLLGPUINTERLOCKNVXPROC)glewGetProcAddress((const GLubyte*)"glLGPUInterlockNVX")) == NULL) || r; - r = ((glLGPUNamedBufferSubDataNVX = (PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC)glewGetProcAddress((const GLubyte*)"glLGPUNamedBufferSubDataNVX")) == NULL) || r; - - return r; -} - -#endif /* GL_NVX_linked_gpu_multicast */ - -#ifdef GL_NV_3dvision_settings - -static GLboolean _glewInit_GL_NV_3dvision_settings () -{ - GLboolean r = GL_FALSE; - - r = ((glStereoParameterfNV = (PFNGLSTEREOPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glStereoParameterfNV")) == NULL) || r; - r = ((glStereoParameteriNV = (PFNGLSTEREOPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glStereoParameteriNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_3dvision_settings */ - -#ifdef GL_NV_bindless_multi_draw_indirect - -static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect () -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysIndirectBindlessNV = (PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectBindlessNV")) == NULL) || r; - r = ((glMultiDrawElementsIndirectBindlessNV = (PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectBindlessNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_bindless_multi_draw_indirect */ - -#ifdef GL_NV_bindless_multi_draw_indirect_count - -static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect_count () -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysIndirectBindlessCountNV = (PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectBindlessCountNV")) == NULL) || r; - r = ((glMultiDrawElementsIndirectBindlessCountNV = (PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectBindlessCountNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_bindless_multi_draw_indirect_count */ - -#ifdef GL_NV_bindless_texture - -static GLboolean _glewInit_GL_NV_bindless_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glGetImageHandleNV = (PFNGLGETIMAGEHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetImageHandleNV")) == NULL) || r; - r = ((glGetTextureHandleNV = (PFNGLGETTEXTUREHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureHandleNV")) == NULL) || r; - r = ((glGetTextureSamplerHandleNV = (PFNGLGETTEXTURESAMPLERHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSamplerHandleNV")) == NULL) || r; - r = ((glIsImageHandleResidentNV = (PFNGLISIMAGEHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsImageHandleResidentNV")) == NULL) || r; - r = ((glIsTextureHandleResidentNV = (PFNGLISTEXTUREHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsTextureHandleResidentNV")) == NULL) || r; - r = ((glMakeImageHandleNonResidentNV = (PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleNonResidentNV")) == NULL) || r; - r = ((glMakeImageHandleResidentNV = (PFNGLMAKEIMAGEHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleResidentNV")) == NULL) || r; - r = ((glMakeTextureHandleNonResidentNV = (PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleNonResidentNV")) == NULL) || r; - r = ((glMakeTextureHandleResidentNV = (PFNGLMAKETEXTUREHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleResidentNV")) == NULL) || r; - r = ((glProgramUniformHandleui64NV = (PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64NV")) == NULL) || r; - r = ((glProgramUniformHandleui64vNV = (PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64vNV")) == NULL) || r; - r = ((glUniformHandleui64NV = (PFNGLUNIFORMHANDLEUI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64NV")) == NULL) || r; - r = ((glUniformHandleui64vNV = (PFNGLUNIFORMHANDLEUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64vNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_bindless_texture */ - -#ifdef GL_NV_blend_equation_advanced - -static GLboolean _glewInit_GL_NV_blend_equation_advanced () -{ - GLboolean r = GL_FALSE; - - r = ((glBlendBarrierNV = (PFNGLBLENDBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glBlendBarrierNV")) == NULL) || r; - r = ((glBlendParameteriNV = (PFNGLBLENDPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glBlendParameteriNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_blend_equation_advanced */ - -#ifdef GL_NV_clip_space_w_scaling - -static GLboolean _glewInit_GL_NV_clip_space_w_scaling () -{ - GLboolean r = GL_FALSE; - - r = ((glViewportPositionWScaleNV = (PFNGLVIEWPORTPOSITIONWSCALENVPROC)glewGetProcAddress((const GLubyte*)"glViewportPositionWScaleNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_clip_space_w_scaling */ - -#ifdef GL_NV_command_list - -static GLboolean _glewInit_GL_NV_command_list () -{ - GLboolean r = GL_FALSE; - - r = ((glCallCommandListNV = (PFNGLCALLCOMMANDLISTNVPROC)glewGetProcAddress((const GLubyte*)"glCallCommandListNV")) == NULL) || r; - r = ((glCommandListSegmentsNV = (PFNGLCOMMANDLISTSEGMENTSNVPROC)glewGetProcAddress((const GLubyte*)"glCommandListSegmentsNV")) == NULL) || r; - r = ((glCompileCommandListNV = (PFNGLCOMPILECOMMANDLISTNVPROC)glewGetProcAddress((const GLubyte*)"glCompileCommandListNV")) == NULL) || r; - r = ((glCreateCommandListsNV = (PFNGLCREATECOMMANDLISTSNVPROC)glewGetProcAddress((const GLubyte*)"glCreateCommandListsNV")) == NULL) || r; - r = ((glCreateStatesNV = (PFNGLCREATESTATESNVPROC)glewGetProcAddress((const GLubyte*)"glCreateStatesNV")) == NULL) || r; - r = ((glDeleteCommandListsNV = (PFNGLDELETECOMMANDLISTSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteCommandListsNV")) == NULL) || r; - r = ((glDeleteStatesNV = (PFNGLDELETESTATESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteStatesNV")) == NULL) || r; - r = ((glDrawCommandsAddressNV = (PFNGLDRAWCOMMANDSADDRESSNVPROC)glewGetProcAddress((const GLubyte*)"glDrawCommandsAddressNV")) == NULL) || r; - r = ((glDrawCommandsNV = (PFNGLDRAWCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glDrawCommandsNV")) == NULL) || r; - r = ((glDrawCommandsStatesAddressNV = (PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC)glewGetProcAddress((const GLubyte*)"glDrawCommandsStatesAddressNV")) == NULL) || r; - r = ((glDrawCommandsStatesNV = (PFNGLDRAWCOMMANDSSTATESNVPROC)glewGetProcAddress((const GLubyte*)"glDrawCommandsStatesNV")) == NULL) || r; - r = ((glGetCommandHeaderNV = (PFNGLGETCOMMANDHEADERNVPROC)glewGetProcAddress((const GLubyte*)"glGetCommandHeaderNV")) == NULL) || r; - r = ((glGetStageIndexNV = (PFNGLGETSTAGEINDEXNVPROC)glewGetProcAddress((const GLubyte*)"glGetStageIndexNV")) == NULL) || r; - r = ((glIsCommandListNV = (PFNGLISCOMMANDLISTNVPROC)glewGetProcAddress((const GLubyte*)"glIsCommandListNV")) == NULL) || r; - r = ((glIsStateNV = (PFNGLISSTATENVPROC)glewGetProcAddress((const GLubyte*)"glIsStateNV")) == NULL) || r; - r = ((glListDrawCommandsStatesClientNV = (PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC)glewGetProcAddress((const GLubyte*)"glListDrawCommandsStatesClientNV")) == NULL) || r; - r = ((glStateCaptureNV = (PFNGLSTATECAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glStateCaptureNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_command_list */ - -#ifdef GL_NV_conditional_render - -static GLboolean _glewInit_GL_NV_conditional_render () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginConditionalRenderNV = (PFNGLBEGINCONDITIONALRENDERNVPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRenderNV")) == NULL) || r; - r = ((glEndConditionalRenderNV = (PFNGLENDCONDITIONALRENDERNVPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRenderNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_conditional_render */ - -#ifdef GL_NV_conservative_raster - -static GLboolean _glewInit_GL_NV_conservative_raster () -{ - GLboolean r = GL_FALSE; - - r = ((glSubpixelPrecisionBiasNV = (PFNGLSUBPIXELPRECISIONBIASNVPROC)glewGetProcAddress((const GLubyte*)"glSubpixelPrecisionBiasNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_conservative_raster */ - -#ifdef GL_NV_conservative_raster_dilate - -static GLboolean _glewInit_GL_NV_conservative_raster_dilate () -{ - GLboolean r = GL_FALSE; - - r = ((glConservativeRasterParameterfNV = (PFNGLCONSERVATIVERASTERPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glConservativeRasterParameterfNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_conservative_raster_dilate */ - -#ifdef GL_NV_conservative_raster_pre_snap_triangles - -static GLboolean _glewInit_GL_NV_conservative_raster_pre_snap_triangles () -{ - GLboolean r = GL_FALSE; - - r = ((glConservativeRasterParameteriNV = (PFNGLCONSERVATIVERASTERPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glConservativeRasterParameteriNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_conservative_raster_pre_snap_triangles */ - -#ifdef GL_NV_copy_buffer - -static GLboolean _glewInit_GL_NV_copy_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((glCopyBufferSubDataNV = (PFNGLCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glCopyBufferSubDataNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_copy_buffer */ - -#ifdef GL_NV_copy_image - -static GLboolean _glewInit_GL_NV_copy_image () -{ - GLboolean r = GL_FALSE; - - r = ((glCopyImageSubDataNV = (PFNGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubDataNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_copy_image */ - -#ifdef GL_NV_depth_buffer_float - -static GLboolean _glewInit_GL_NV_depth_buffer_float () -{ - GLboolean r = GL_FALSE; - - r = ((glClearDepthdNV = (PFNGLCLEARDEPTHDNVPROC)glewGetProcAddress((const GLubyte*)"glClearDepthdNV")) == NULL) || r; - r = ((glDepthBoundsdNV = (PFNGLDEPTHBOUNDSDNVPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsdNV")) == NULL) || r; - r = ((glDepthRangedNV = (PFNGLDEPTHRANGEDNVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangedNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_depth_buffer_float */ - -#ifdef GL_NV_draw_buffers - -static GLboolean _glewInit_GL_NV_draw_buffers () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawBuffersNV = (PFNGLDRAWBUFFERSNVPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_draw_buffers */ - -#ifdef GL_NV_draw_instanced - -static GLboolean _glewInit_GL_NV_draw_instanced () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawArraysInstancedNV = (PFNGLDRAWARRAYSINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedNV")) == NULL) || r; - r = ((glDrawElementsInstancedNV = (PFNGLDRAWELEMENTSINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_draw_instanced */ - -#ifdef GL_NV_draw_texture - -static GLboolean _glewInit_GL_NV_draw_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawTextureNV = (PFNGLDRAWTEXTURENVPROC)glewGetProcAddress((const GLubyte*)"glDrawTextureNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_draw_texture */ - -#ifdef GL_NV_draw_vulkan_image - -static GLboolean _glewInit_GL_NV_draw_vulkan_image () -{ - GLboolean r = GL_FALSE; - - r = ((glDrawVkImageNV = (PFNGLDRAWVKIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glDrawVkImageNV")) == NULL) || r; - r = ((glGetVkProcAddrNV = (PFNGLGETVKPROCADDRNVPROC)glewGetProcAddress((const GLubyte*)"glGetVkProcAddrNV")) == NULL) || r; - r = ((glSignalVkFenceNV = (PFNGLSIGNALVKFENCENVPROC)glewGetProcAddress((const GLubyte*)"glSignalVkFenceNV")) == NULL) || r; - r = ((glSignalVkSemaphoreNV = (PFNGLSIGNALVKSEMAPHORENVPROC)glewGetProcAddress((const GLubyte*)"glSignalVkSemaphoreNV")) == NULL) || r; - r = ((glWaitVkSemaphoreNV = (PFNGLWAITVKSEMAPHORENVPROC)glewGetProcAddress((const GLubyte*)"glWaitVkSemaphoreNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_draw_vulkan_image */ - -#ifdef GL_NV_evaluators - -static GLboolean _glewInit_GL_NV_evaluators () -{ - GLboolean r = GL_FALSE; - - r = ((glEvalMapsNV = (PFNGLEVALMAPSNVPROC)glewGetProcAddress((const GLubyte*)"glEvalMapsNV")) == NULL) || r; - r = ((glGetMapAttribParameterfvNV = (PFNGLGETMAPATTRIBPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterfvNV")) == NULL) || r; - r = ((glGetMapAttribParameterivNV = (PFNGLGETMAPATTRIBPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterivNV")) == NULL) || r; - r = ((glGetMapControlPointsNV = (PFNGLGETMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapControlPointsNV")) == NULL) || r; - r = ((glGetMapParameterfvNV = (PFNGLGETMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterfvNV")) == NULL) || r; - r = ((glGetMapParameterivNV = (PFNGLGETMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterivNV")) == NULL) || r; - r = ((glMapControlPointsNV = (PFNGLMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glMapControlPointsNV")) == NULL) || r; - r = ((glMapParameterfvNV = (PFNGLMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterfvNV")) == NULL) || r; - r = ((glMapParameterivNV = (PFNGLMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_evaluators */ - -#ifdef GL_NV_explicit_multisample - -static GLboolean _glewInit_GL_NV_explicit_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glGetMultisamplefvNV = (PFNGLGETMULTISAMPLEFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMultisamplefvNV")) == NULL) || r; - r = ((glSampleMaskIndexedNV = (PFNGLSAMPLEMASKINDEXEDNVPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskIndexedNV")) == NULL) || r; - r = ((glTexRenderbufferNV = (PFNGLTEXRENDERBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glTexRenderbufferNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_explicit_multisample */ - -#ifdef GL_NV_fence - -static GLboolean _glewInit_GL_NV_fence () -{ - GLboolean r = GL_FALSE; - - r = ((glDeleteFencesNV = (PFNGLDELETEFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesNV")) == NULL) || r; - r = ((glFinishFenceNV = (PFNGLFINISHFENCENVPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceNV")) == NULL) || r; - r = ((glGenFencesNV = (PFNGLGENFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glGenFencesNV")) == NULL) || r; - r = ((glGetFenceivNV = (PFNGLGETFENCEIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFenceivNV")) == NULL) || r; - r = ((glIsFenceNV = (PFNGLISFENCENVPROC)glewGetProcAddress((const GLubyte*)"glIsFenceNV")) == NULL) || r; - r = ((glSetFenceNV = (PFNGLSETFENCENVPROC)glewGetProcAddress((const GLubyte*)"glSetFenceNV")) == NULL) || r; - r = ((glTestFenceNV = (PFNGLTESTFENCENVPROC)glewGetProcAddress((const GLubyte*)"glTestFenceNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_fence */ - -#ifdef GL_NV_fragment_coverage_to_color - -static GLboolean _glewInit_GL_NV_fragment_coverage_to_color () -{ - GLboolean r = GL_FALSE; - - r = ((glFragmentCoverageColorNV = (PFNGLFRAGMENTCOVERAGECOLORNVPROC)glewGetProcAddress((const GLubyte*)"glFragmentCoverageColorNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_fragment_coverage_to_color */ - -#ifdef GL_NV_fragment_program - -static GLboolean _glewInit_GL_NV_fragment_program () -{ - GLboolean r = GL_FALSE; - - r = ((glGetProgramNamedParameterdvNV = (PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterdvNV")) == NULL) || r; - r = ((glGetProgramNamedParameterfvNV = (PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterfvNV")) == NULL) || r; - r = ((glProgramNamedParameter4dNV = (PFNGLPROGRAMNAMEDPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dNV")) == NULL) || r; - r = ((glProgramNamedParameter4dvNV = (PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dvNV")) == NULL) || r; - r = ((glProgramNamedParameter4fNV = (PFNGLPROGRAMNAMEDPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fNV")) == NULL) || r; - r = ((glProgramNamedParameter4fvNV = (PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_fragment_program */ - -#ifdef GL_NV_framebuffer_blit - -static GLboolean _glewInit_GL_NV_framebuffer_blit () -{ - GLboolean r = GL_FALSE; - - r = ((glBlitFramebufferNV = (PFNGLBLITFRAMEBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_framebuffer_blit */ - -#ifdef GL_NV_framebuffer_multisample - -static GLboolean _glewInit_GL_NV_framebuffer_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glRenderbufferStorageMultisampleNV = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_framebuffer_multisample */ - -#ifdef GL_NV_framebuffer_multisample_coverage - -static GLboolean _glewInit_GL_NV_framebuffer_multisample_coverage () -{ - GLboolean r = GL_FALSE; - - r = ((glRenderbufferStorageMultisampleCoverageNV = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleCoverageNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_framebuffer_multisample_coverage */ - -#ifdef GL_NV_geometry_program4 - -static GLboolean _glewInit_GL_NV_geometry_program4 () -{ - GLboolean r = GL_FALSE; - - r = ((glProgramVertexLimitNV = (PFNGLPROGRAMVERTEXLIMITNVPROC)glewGetProcAddress((const GLubyte*)"glProgramVertexLimitNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_geometry_program4 */ - -#ifdef GL_NV_gpu_multicast - -static GLboolean _glewInit_GL_NV_gpu_multicast () -{ - GLboolean r = GL_FALSE; - - r = ((glMulticastBarrierNV = (PFNGLMULTICASTBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastBarrierNV")) == NULL) || r; - r = ((glMulticastBlitFramebufferNV = (PFNGLMULTICASTBLITFRAMEBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastBlitFramebufferNV")) == NULL) || r; - r = ((glMulticastBufferSubDataNV = (PFNGLMULTICASTBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glMulticastBufferSubDataNV")) == NULL) || r; - r = ((glMulticastCopyBufferSubDataNV = (PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glMulticastCopyBufferSubDataNV")) == NULL) || r; - r = ((glMulticastCopyImageSubDataNV = (PFNGLMULTICASTCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glMulticastCopyImageSubDataNV")) == NULL) || r; - r = ((glMulticastFramebufferSampleLocationsfvNV = (PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastFramebufferSampleLocationsfvNV")) == NULL) || r; - r = ((glMulticastGetQueryObjecti64vNV = (PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastGetQueryObjecti64vNV")) == NULL) || r; - r = ((glMulticastGetQueryObjectivNV = (PFNGLMULTICASTGETQUERYOBJECTIVNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastGetQueryObjectivNV")) == NULL) || r; - r = ((glMulticastGetQueryObjectui64vNV = (PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastGetQueryObjectui64vNV")) == NULL) || r; - r = ((glMulticastGetQueryObjectuivNV = (PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastGetQueryObjectuivNV")) == NULL) || r; - r = ((glMulticastWaitSyncNV = (PFNGLMULTICASTWAITSYNCNVPROC)glewGetProcAddress((const GLubyte*)"glMulticastWaitSyncNV")) == NULL) || r; - r = ((glRenderGpuMaskNV = (PFNGLRENDERGPUMASKNVPROC)glewGetProcAddress((const GLubyte*)"glRenderGpuMaskNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_gpu_multicast */ - -#ifdef GL_NV_gpu_program4 - -static GLboolean _glewInit_GL_NV_gpu_program4 () -{ - GLboolean r = GL_FALSE; - - r = ((glProgramEnvParameterI4iNV = (PFNGLPROGRAMENVPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4iNV")) == NULL) || r; - r = ((glProgramEnvParameterI4ivNV = (PFNGLPROGRAMENVPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4ivNV")) == NULL) || r; - r = ((glProgramEnvParameterI4uiNV = (PFNGLPROGRAMENVPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4uiNV")) == NULL) || r; - r = ((glProgramEnvParameterI4uivNV = (PFNGLPROGRAMENVPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4uivNV")) == NULL) || r; - r = ((glProgramEnvParametersI4ivNV = (PFNGLPROGRAMENVPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParametersI4ivNV")) == NULL) || r; - r = ((glProgramEnvParametersI4uivNV = (PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParametersI4uivNV")) == NULL) || r; - r = ((glProgramLocalParameterI4iNV = (PFNGLPROGRAMLOCALPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4iNV")) == NULL) || r; - r = ((glProgramLocalParameterI4ivNV = (PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4ivNV")) == NULL) || r; - r = ((glProgramLocalParameterI4uiNV = (PFNGLPROGRAMLOCALPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4uiNV")) == NULL) || r; - r = ((glProgramLocalParameterI4uivNV = (PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4uivNV")) == NULL) || r; - r = ((glProgramLocalParametersI4ivNV = (PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParametersI4ivNV")) == NULL) || r; - r = ((glProgramLocalParametersI4uivNV = (PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParametersI4uivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_gpu_program4 */ - -#ifdef GL_NV_gpu_shader5 - -static GLboolean _glewInit_GL_NV_gpu_shader5 () -{ - GLboolean r = GL_FALSE; - - r = ((glGetUniformi64vNV = (PFNGLGETUNIFORMI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformi64vNV")) == NULL) || r; - r = ((glGetUniformui64vNV = (PFNGLGETUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformui64vNV")) == NULL) || r; - r = ((glProgramUniform1i64NV = (PFNGLPROGRAMUNIFORM1I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64NV")) == NULL) || r; - r = ((glProgramUniform1i64vNV = (PFNGLPROGRAMUNIFORM1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64vNV")) == NULL) || r; - r = ((glProgramUniform1ui64NV = (PFNGLPROGRAMUNIFORM1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64NV")) == NULL) || r; - r = ((glProgramUniform1ui64vNV = (PFNGLPROGRAMUNIFORM1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64vNV")) == NULL) || r; - r = ((glProgramUniform2i64NV = (PFNGLPROGRAMUNIFORM2I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64NV")) == NULL) || r; - r = ((glProgramUniform2i64vNV = (PFNGLPROGRAMUNIFORM2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64vNV")) == NULL) || r; - r = ((glProgramUniform2ui64NV = (PFNGLPROGRAMUNIFORM2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64NV")) == NULL) || r; - r = ((glProgramUniform2ui64vNV = (PFNGLPROGRAMUNIFORM2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64vNV")) == NULL) || r; - r = ((glProgramUniform3i64NV = (PFNGLPROGRAMUNIFORM3I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64NV")) == NULL) || r; - r = ((glProgramUniform3i64vNV = (PFNGLPROGRAMUNIFORM3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64vNV")) == NULL) || r; - r = ((glProgramUniform3ui64NV = (PFNGLPROGRAMUNIFORM3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64NV")) == NULL) || r; - r = ((glProgramUniform3ui64vNV = (PFNGLPROGRAMUNIFORM3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64vNV")) == NULL) || r; - r = ((glProgramUniform4i64NV = (PFNGLPROGRAMUNIFORM4I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64NV")) == NULL) || r; - r = ((glProgramUniform4i64vNV = (PFNGLPROGRAMUNIFORM4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64vNV")) == NULL) || r; - r = ((glProgramUniform4ui64NV = (PFNGLPROGRAMUNIFORM4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64NV")) == NULL) || r; - r = ((glProgramUniform4ui64vNV = (PFNGLPROGRAMUNIFORM4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64vNV")) == NULL) || r; - r = ((glUniform1i64NV = (PFNGLUNIFORM1I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64NV")) == NULL) || r; - r = ((glUniform1i64vNV = (PFNGLUNIFORM1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64vNV")) == NULL) || r; - r = ((glUniform1ui64NV = (PFNGLUNIFORM1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64NV")) == NULL) || r; - r = ((glUniform1ui64vNV = (PFNGLUNIFORM1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64vNV")) == NULL) || r; - r = ((glUniform2i64NV = (PFNGLUNIFORM2I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64NV")) == NULL) || r; - r = ((glUniform2i64vNV = (PFNGLUNIFORM2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64vNV")) == NULL) || r; - r = ((glUniform2ui64NV = (PFNGLUNIFORM2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64NV")) == NULL) || r; - r = ((glUniform2ui64vNV = (PFNGLUNIFORM2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64vNV")) == NULL) || r; - r = ((glUniform3i64NV = (PFNGLUNIFORM3I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64NV")) == NULL) || r; - r = ((glUniform3i64vNV = (PFNGLUNIFORM3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64vNV")) == NULL) || r; - r = ((glUniform3ui64NV = (PFNGLUNIFORM3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64NV")) == NULL) || r; - r = ((glUniform3ui64vNV = (PFNGLUNIFORM3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64vNV")) == NULL) || r; - r = ((glUniform4i64NV = (PFNGLUNIFORM4I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64NV")) == NULL) || r; - r = ((glUniform4i64vNV = (PFNGLUNIFORM4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64vNV")) == NULL) || r; - r = ((glUniform4ui64NV = (PFNGLUNIFORM4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64NV")) == NULL) || r; - r = ((glUniform4ui64vNV = (PFNGLUNIFORM4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64vNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_gpu_shader5 */ - -#ifdef GL_NV_half_float - -static GLboolean _glewInit_GL_NV_half_float () -{ - GLboolean r = GL_FALSE; - - r = ((glColor3hNV = (PFNGLCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hNV")) == NULL) || r; - r = ((glColor3hvNV = (PFNGLCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hvNV")) == NULL) || r; - r = ((glColor4hNV = (PFNGLCOLOR4HNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hNV")) == NULL) || r; - r = ((glColor4hvNV = (PFNGLCOLOR4HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hvNV")) == NULL) || r; - r = ((glFogCoordhNV = (PFNGLFOGCOORDHNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhNV")) == NULL) || r; - r = ((glFogCoordhvNV = (PFNGLFOGCOORDHVNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhvNV")) == NULL) || r; - r = ((glMultiTexCoord1hNV = (PFNGLMULTITEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hNV")) == NULL) || r; - r = ((glMultiTexCoord1hvNV = (PFNGLMULTITEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hvNV")) == NULL) || r; - r = ((glMultiTexCoord2hNV = (PFNGLMULTITEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hNV")) == NULL) || r; - r = ((glMultiTexCoord2hvNV = (PFNGLMULTITEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hvNV")) == NULL) || r; - r = ((glMultiTexCoord3hNV = (PFNGLMULTITEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hNV")) == NULL) || r; - r = ((glMultiTexCoord3hvNV = (PFNGLMULTITEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hvNV")) == NULL) || r; - r = ((glMultiTexCoord4hNV = (PFNGLMULTITEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hNV")) == NULL) || r; - r = ((glMultiTexCoord4hvNV = (PFNGLMULTITEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hvNV")) == NULL) || r; - r = ((glNormal3hNV = (PFNGLNORMAL3HNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hNV")) == NULL) || r; - r = ((glNormal3hvNV = (PFNGLNORMAL3HVNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hvNV")) == NULL) || r; - r = ((glSecondaryColor3hNV = (PFNGLSECONDARYCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hNV")) == NULL) || r; - r = ((glSecondaryColor3hvNV = (PFNGLSECONDARYCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hvNV")) == NULL) || r; - r = ((glTexCoord1hNV = (PFNGLTEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hNV")) == NULL) || r; - r = ((glTexCoord1hvNV = (PFNGLTEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hvNV")) == NULL) || r; - r = ((glTexCoord2hNV = (PFNGLTEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hNV")) == NULL) || r; - r = ((glTexCoord2hvNV = (PFNGLTEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hvNV")) == NULL) || r; - r = ((glTexCoord3hNV = (PFNGLTEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hNV")) == NULL) || r; - r = ((glTexCoord3hvNV = (PFNGLTEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hvNV")) == NULL) || r; - r = ((glTexCoord4hNV = (PFNGLTEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hNV")) == NULL) || r; - r = ((glTexCoord4hvNV = (PFNGLTEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hvNV")) == NULL) || r; - r = ((glVertex2hNV = (PFNGLVERTEX2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hNV")) == NULL) || r; - r = ((glVertex2hvNV = (PFNGLVERTEX2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hvNV")) == NULL) || r; - r = ((glVertex3hNV = (PFNGLVERTEX3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hNV")) == NULL) || r; - r = ((glVertex3hvNV = (PFNGLVERTEX3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hvNV")) == NULL) || r; - r = ((glVertex4hNV = (PFNGLVERTEX4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hNV")) == NULL) || r; - r = ((glVertex4hvNV = (PFNGLVERTEX4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hvNV")) == NULL) || r; - r = ((glVertexAttrib1hNV = (PFNGLVERTEXATTRIB1HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hNV")) == NULL) || r; - r = ((glVertexAttrib1hvNV = (PFNGLVERTEXATTRIB1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hvNV")) == NULL) || r; - r = ((glVertexAttrib2hNV = (PFNGLVERTEXATTRIB2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hNV")) == NULL) || r; - r = ((glVertexAttrib2hvNV = (PFNGLVERTEXATTRIB2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hvNV")) == NULL) || r; - r = ((glVertexAttrib3hNV = (PFNGLVERTEXATTRIB3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hNV")) == NULL) || r; - r = ((glVertexAttrib3hvNV = (PFNGLVERTEXATTRIB3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hvNV")) == NULL) || r; - r = ((glVertexAttrib4hNV = (PFNGLVERTEXATTRIB4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hNV")) == NULL) || r; - r = ((glVertexAttrib4hvNV = (PFNGLVERTEXATTRIB4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hvNV")) == NULL) || r; - r = ((glVertexAttribs1hvNV = (PFNGLVERTEXATTRIBS1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1hvNV")) == NULL) || r; - r = ((glVertexAttribs2hvNV = (PFNGLVERTEXATTRIBS2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2hvNV")) == NULL) || r; - r = ((glVertexAttribs3hvNV = (PFNGLVERTEXATTRIBS3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3hvNV")) == NULL) || r; - r = ((glVertexAttribs4hvNV = (PFNGLVERTEXATTRIBS4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4hvNV")) == NULL) || r; - r = ((glVertexWeighthNV = (PFNGLVERTEXWEIGHTHNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthNV")) == NULL) || r; - r = ((glVertexWeighthvNV = (PFNGLVERTEXWEIGHTHVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_half_float */ - -#ifdef GL_NV_instanced_arrays - -static GLboolean _glewInit_GL_NV_instanced_arrays () -{ - GLboolean r = GL_FALSE; - - r = ((glVertexAttribDivisorNV = (PFNGLVERTEXATTRIBDIVISORNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_instanced_arrays */ - -#ifdef GL_NV_internalformat_sample_query - -static GLboolean _glewInit_GL_NV_internalformat_sample_query () -{ - GLboolean r = GL_FALSE; - - r = ((glGetInternalformatSampleivNV = (PFNGLGETINTERNALFORMATSAMPLEIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformatSampleivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_internalformat_sample_query */ - -#ifdef GL_NV_non_square_matrices - -static GLboolean _glewInit_GL_NV_non_square_matrices () -{ - GLboolean r = GL_FALSE; - - r = ((glUniformMatrix2x3fvNV = (PFNGLUNIFORMMATRIX2X3FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3fvNV")) == NULL) || r; - r = ((glUniformMatrix2x4fvNV = (PFNGLUNIFORMMATRIX2X4FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4fvNV")) == NULL) || r; - r = ((glUniformMatrix3x2fvNV = (PFNGLUNIFORMMATRIX3X2FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2fvNV")) == NULL) || r; - r = ((glUniformMatrix3x4fvNV = (PFNGLUNIFORMMATRIX3X4FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4fvNV")) == NULL) || r; - r = ((glUniformMatrix4x2fvNV = (PFNGLUNIFORMMATRIX4X2FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2fvNV")) == NULL) || r; - r = ((glUniformMatrix4x3fvNV = (PFNGLUNIFORMMATRIX4X3FVNVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3fvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_non_square_matrices */ - -#ifdef GL_NV_occlusion_query - -static GLboolean _glewInit_GL_NV_occlusion_query () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginOcclusionQueryNV = (PFNGLBEGINOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glBeginOcclusionQueryNV")) == NULL) || r; - r = ((glDeleteOcclusionQueriesNV = (PFNGLDELETEOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteOcclusionQueriesNV")) == NULL) || r; - r = ((glEndOcclusionQueryNV = (PFNGLENDOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glEndOcclusionQueryNV")) == NULL) || r; - r = ((glGenOcclusionQueriesNV = (PFNGLGENOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glGenOcclusionQueriesNV")) == NULL) || r; - r = ((glGetOcclusionQueryivNV = (PFNGLGETOCCLUSIONQUERYIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryivNV")) == NULL) || r; - r = ((glGetOcclusionQueryuivNV = (PFNGLGETOCCLUSIONQUERYUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryuivNV")) == NULL) || r; - r = ((glIsOcclusionQueryNV = (PFNGLISOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glIsOcclusionQueryNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_occlusion_query */ - -#ifdef GL_NV_parameter_buffer_object - -static GLboolean _glewInit_GL_NV_parameter_buffer_object () -{ - GLboolean r = GL_FALSE; - - r = ((glProgramBufferParametersIivNV = (PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersIivNV")) == NULL) || r; - r = ((glProgramBufferParametersIuivNV = (PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersIuivNV")) == NULL) || r; - r = ((glProgramBufferParametersfvNV = (PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersfvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_parameter_buffer_object */ - -#ifdef GL_NV_path_rendering - -static GLboolean _glewInit_GL_NV_path_rendering () -{ - GLboolean r = GL_FALSE; - - r = ((glCopyPathNV = (PFNGLCOPYPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCopyPathNV")) == NULL) || r; - r = ((glCoverFillPathInstancedNV = (PFNGLCOVERFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glCoverFillPathInstancedNV")) == NULL) || r; - r = ((glCoverFillPathNV = (PFNGLCOVERFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCoverFillPathNV")) == NULL) || r; - r = ((glCoverStrokePathInstancedNV = (PFNGLCOVERSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glCoverStrokePathInstancedNV")) == NULL) || r; - r = ((glCoverStrokePathNV = (PFNGLCOVERSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCoverStrokePathNV")) == NULL) || r; - r = ((glDeletePathsNV = (PFNGLDELETEPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glDeletePathsNV")) == NULL) || r; - r = ((glGenPathsNV = (PFNGLGENPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glGenPathsNV")) == NULL) || r; - r = ((glGetPathColorGenfvNV = (PFNGLGETPATHCOLORGENFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathColorGenfvNV")) == NULL) || r; - r = ((glGetPathColorGenivNV = (PFNGLGETPATHCOLORGENIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathColorGenivNV")) == NULL) || r; - r = ((glGetPathCommandsNV = (PFNGLGETPATHCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathCommandsNV")) == NULL) || r; - r = ((glGetPathCoordsNV = (PFNGLGETPATHCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathCoordsNV")) == NULL) || r; - r = ((glGetPathDashArrayNV = (PFNGLGETPATHDASHARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathDashArrayNV")) == NULL) || r; - r = ((glGetPathLengthNV = (PFNGLGETPATHLENGTHNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathLengthNV")) == NULL) || r; - r = ((glGetPathMetricRangeNV = (PFNGLGETPATHMETRICRANGENVPROC)glewGetProcAddress((const GLubyte*)"glGetPathMetricRangeNV")) == NULL) || r; - r = ((glGetPathMetricsNV = (PFNGLGETPATHMETRICSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathMetricsNV")) == NULL) || r; - r = ((glGetPathParameterfvNV = (PFNGLGETPATHPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathParameterfvNV")) == NULL) || r; - r = ((glGetPathParameterivNV = (PFNGLGETPATHPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathParameterivNV")) == NULL) || r; - r = ((glGetPathSpacingNV = (PFNGLGETPATHSPACINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathSpacingNV")) == NULL) || r; - r = ((glGetPathTexGenfvNV = (PFNGLGETPATHTEXGENFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathTexGenfvNV")) == NULL) || r; - r = ((glGetPathTexGenivNV = (PFNGLGETPATHTEXGENIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathTexGenivNV")) == NULL) || r; - r = ((glGetProgramResourcefvNV = (PFNGLGETPROGRAMRESOURCEFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourcefvNV")) == NULL) || r; - r = ((glInterpolatePathsNV = (PFNGLINTERPOLATEPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glInterpolatePathsNV")) == NULL) || r; - r = ((glIsPathNV = (PFNGLISPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPathNV")) == NULL) || r; - r = ((glIsPointInFillPathNV = (PFNGLISPOINTINFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPointInFillPathNV")) == NULL) || r; - r = ((glIsPointInStrokePathNV = (PFNGLISPOINTINSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPointInStrokePathNV")) == NULL) || r; - r = ((glMatrixLoad3x2fNV = (PFNGLMATRIXLOAD3X2FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoad3x2fNV")) == NULL) || r; - r = ((glMatrixLoad3x3fNV = (PFNGLMATRIXLOAD3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoad3x3fNV")) == NULL) || r; - r = ((glMatrixLoadTranspose3x3fNV = (PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTranspose3x3fNV")) == NULL) || r; - r = ((glMatrixMult3x2fNV = (PFNGLMATRIXMULT3X2FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMult3x2fNV")) == NULL) || r; - r = ((glMatrixMult3x3fNV = (PFNGLMATRIXMULT3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMult3x3fNV")) == NULL) || r; - r = ((glMatrixMultTranspose3x3fNV = (PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTranspose3x3fNV")) == NULL) || r; - r = ((glPathColorGenNV = (PFNGLPATHCOLORGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathColorGenNV")) == NULL) || r; - r = ((glPathCommandsNV = (PFNGLPATHCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathCommandsNV")) == NULL) || r; - r = ((glPathCoordsNV = (PFNGLPATHCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathCoordsNV")) == NULL) || r; - r = ((glPathCoverDepthFuncNV = (PFNGLPATHCOVERDEPTHFUNCNVPROC)glewGetProcAddress((const GLubyte*)"glPathCoverDepthFuncNV")) == NULL) || r; - r = ((glPathDashArrayNV = (PFNGLPATHDASHARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathDashArrayNV")) == NULL) || r; - r = ((glPathFogGenNV = (PFNGLPATHFOGGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathFogGenNV")) == NULL) || r; - r = ((glPathGlyphIndexArrayNV = (PFNGLPATHGLYPHINDEXARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphIndexArrayNV")) == NULL) || r; - r = ((glPathGlyphIndexRangeNV = (PFNGLPATHGLYPHINDEXRANGENVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphIndexRangeNV")) == NULL) || r; - r = ((glPathGlyphRangeNV = (PFNGLPATHGLYPHRANGENVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphRangeNV")) == NULL) || r; - r = ((glPathGlyphsNV = (PFNGLPATHGLYPHSNVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphsNV")) == NULL) || r; - r = ((glPathMemoryGlyphIndexArrayNV = (PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathMemoryGlyphIndexArrayNV")) == NULL) || r; - r = ((glPathParameterfNV = (PFNGLPATHPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterfNV")) == NULL) || r; - r = ((glPathParameterfvNV = (PFNGLPATHPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterfvNV")) == NULL) || r; - r = ((glPathParameteriNV = (PFNGLPATHPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glPathParameteriNV")) == NULL) || r; - r = ((glPathParameterivNV = (PFNGLPATHPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterivNV")) == NULL) || r; - r = ((glPathStencilDepthOffsetNV = (PFNGLPATHSTENCILDEPTHOFFSETNVPROC)glewGetProcAddress((const GLubyte*)"glPathStencilDepthOffsetNV")) == NULL) || r; - r = ((glPathStencilFuncNV = (PFNGLPATHSTENCILFUNCNVPROC)glewGetProcAddress((const GLubyte*)"glPathStencilFuncNV")) == NULL) || r; - r = ((glPathStringNV = (PFNGLPATHSTRINGNVPROC)glewGetProcAddress((const GLubyte*)"glPathStringNV")) == NULL) || r; - r = ((glPathSubCommandsNV = (PFNGLPATHSUBCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathSubCommandsNV")) == NULL) || r; - r = ((glPathSubCoordsNV = (PFNGLPATHSUBCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathSubCoordsNV")) == NULL) || r; - r = ((glPathTexGenNV = (PFNGLPATHTEXGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathTexGenNV")) == NULL) || r; - r = ((glPointAlongPathNV = (PFNGLPOINTALONGPATHNVPROC)glewGetProcAddress((const GLubyte*)"glPointAlongPathNV")) == NULL) || r; - r = ((glProgramPathFragmentInputGenNV = (PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC)glewGetProcAddress((const GLubyte*)"glProgramPathFragmentInputGenNV")) == NULL) || r; - r = ((glStencilFillPathInstancedNV = (PFNGLSTENCILFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilFillPathInstancedNV")) == NULL) || r; - r = ((glStencilFillPathNV = (PFNGLSTENCILFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilFillPathNV")) == NULL) || r; - r = ((glStencilStrokePathInstancedNV = (PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilStrokePathInstancedNV")) == NULL) || r; - r = ((glStencilStrokePathNV = (PFNGLSTENCILSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilStrokePathNV")) == NULL) || r; - r = ((glStencilThenCoverFillPathInstancedNV = (PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverFillPathInstancedNV")) == NULL) || r; - r = ((glStencilThenCoverFillPathNV = (PFNGLSTENCILTHENCOVERFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverFillPathNV")) == NULL) || r; - r = ((glStencilThenCoverStrokePathInstancedNV = (PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverStrokePathInstancedNV")) == NULL) || r; - r = ((glStencilThenCoverStrokePathNV = (PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverStrokePathNV")) == NULL) || r; - r = ((glTransformPathNV = (PFNGLTRANSFORMPATHNVPROC)glewGetProcAddress((const GLubyte*)"glTransformPathNV")) == NULL) || r; - r = ((glWeightPathsNV = (PFNGLWEIGHTPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glWeightPathsNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_path_rendering */ - -#ifdef GL_NV_pixel_data_range - -static GLboolean _glewInit_GL_NV_pixel_data_range () -{ - GLboolean r = GL_FALSE; - - r = ((glFlushPixelDataRangeNV = (PFNGLFLUSHPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushPixelDataRangeNV")) == NULL) || r; - r = ((glPixelDataRangeNV = (PFNGLPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glPixelDataRangeNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_pixel_data_range */ - -#ifdef GL_NV_point_sprite - -static GLboolean _glewInit_GL_NV_point_sprite () -{ - GLboolean r = GL_FALSE; - - r = ((glPointParameteriNV = (PFNGLPOINTPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriNV")) == NULL) || r; - r = ((glPointParameterivNV = (PFNGLPOINTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_point_sprite */ - -#ifdef GL_NV_polygon_mode - -static GLboolean _glewInit_GL_NV_polygon_mode () -{ - GLboolean r = GL_FALSE; - - r = ((glPolygonModeNV = (PFNGLPOLYGONMODENVPROC)glewGetProcAddress((const GLubyte*)"glPolygonModeNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_polygon_mode */ - -#ifdef GL_NV_present_video - -static GLboolean _glewInit_GL_NV_present_video () -{ - GLboolean r = GL_FALSE; - - r = ((glGetVideoi64vNV = (PFNGLGETVIDEOI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoi64vNV")) == NULL) || r; - r = ((glGetVideoivNV = (PFNGLGETVIDEOIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoivNV")) == NULL) || r; - r = ((glGetVideoui64vNV = (PFNGLGETVIDEOUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoui64vNV")) == NULL) || r; - r = ((glGetVideouivNV = (PFNGLGETVIDEOUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideouivNV")) == NULL) || r; - r = ((glPresentFrameDualFillNV = (PFNGLPRESENTFRAMEDUALFILLNVPROC)glewGetProcAddress((const GLubyte*)"glPresentFrameDualFillNV")) == NULL) || r; - r = ((glPresentFrameKeyedNV = (PFNGLPRESENTFRAMEKEYEDNVPROC)glewGetProcAddress((const GLubyte*)"glPresentFrameKeyedNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_present_video */ - -#ifdef GL_NV_primitive_restart - -static GLboolean _glewInit_GL_NV_primitive_restart () -{ - GLboolean r = GL_FALSE; - - r = ((glPrimitiveRestartIndexNV = (PFNGLPRIMITIVERESTARTINDEXNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndexNV")) == NULL) || r; - r = ((glPrimitiveRestartNV = (PFNGLPRIMITIVERESTARTNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_primitive_restart */ - -#ifdef GL_NV_register_combiners - -static GLboolean _glewInit_GL_NV_register_combiners () -{ - GLboolean r = GL_FALSE; - - r = ((glCombinerInputNV = (PFNGLCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerInputNV")) == NULL) || r; - r = ((glCombinerOutputNV = (PFNGLCOMBINEROUTPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerOutputNV")) == NULL) || r; - r = ((glCombinerParameterfNV = (PFNGLCOMBINERPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfNV")) == NULL) || r; - r = ((glCombinerParameterfvNV = (PFNGLCOMBINERPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfvNV")) == NULL) || r; - r = ((glCombinerParameteriNV = (PFNGLCOMBINERPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameteriNV")) == NULL) || r; - r = ((glCombinerParameterivNV = (PFNGLCOMBINERPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterivNV")) == NULL) || r; - r = ((glFinalCombinerInputNV = (PFNGLFINALCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glFinalCombinerInputNV")) == NULL) || r; - r = ((glGetCombinerInputParameterfvNV = (PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterfvNV")) == NULL) || r; - r = ((glGetCombinerInputParameterivNV = (PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterivNV")) == NULL) || r; - r = ((glGetCombinerOutputParameterfvNV = (PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterfvNV")) == NULL) || r; - r = ((glGetCombinerOutputParameterivNV = (PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterivNV")) == NULL) || r; - r = ((glGetFinalCombinerInputParameterfvNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterfvNV")) == NULL) || r; - r = ((glGetFinalCombinerInputParameterivNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_register_combiners */ - -#ifdef GL_NV_register_combiners2 - -static GLboolean _glewInit_GL_NV_register_combiners2 () -{ - GLboolean r = GL_FALSE; - - r = ((glCombinerStageParameterfvNV = (PFNGLCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerStageParameterfvNV")) == NULL) || r; - r = ((glGetCombinerStageParameterfvNV = (PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerStageParameterfvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_register_combiners2 */ - -#ifdef GL_NV_sample_locations - -static GLboolean _glewInit_GL_NV_sample_locations () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferSampleLocationsfvNV = (PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)glewGetProcAddress((const GLubyte*)"glFramebufferSampleLocationsfvNV")) == NULL) || r; - r = ((glNamedFramebufferSampleLocationsfvNV = (PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferSampleLocationsfvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_sample_locations */ - -#ifdef GL_NV_shader_buffer_load - -static GLboolean _glewInit_GL_NV_shader_buffer_load () -{ - GLboolean r = GL_FALSE; - - r = ((glGetBufferParameterui64vNV = (PFNGLGETBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterui64vNV")) == NULL) || r; - r = ((glGetIntegerui64vNV = (PFNGLGETINTEGERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerui64vNV")) == NULL) || r; - r = ((glGetNamedBufferParameterui64vNV = (PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameterui64vNV")) == NULL) || r; - r = ((glIsBufferResidentNV = (PFNGLISBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsBufferResidentNV")) == NULL) || r; - r = ((glIsNamedBufferResidentNV = (PFNGLISNAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsNamedBufferResidentNV")) == NULL) || r; - r = ((glMakeBufferNonResidentNV = (PFNGLMAKEBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeBufferNonResidentNV")) == NULL) || r; - r = ((glMakeBufferResidentNV = (PFNGLMAKEBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeBufferResidentNV")) == NULL) || r; - r = ((glMakeNamedBufferNonResidentNV = (PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeNamedBufferNonResidentNV")) == NULL) || r; - r = ((glMakeNamedBufferResidentNV = (PFNGLMAKENAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeNamedBufferResidentNV")) == NULL) || r; - r = ((glProgramUniformui64NV = (PFNGLPROGRAMUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformui64NV")) == NULL) || r; - r = ((glProgramUniformui64vNV = (PFNGLPROGRAMUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformui64vNV")) == NULL) || r; - r = ((glUniformui64NV = (PFNGLUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniformui64NV")) == NULL) || r; - r = ((glUniformui64vNV = (PFNGLUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniformui64vNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_shader_buffer_load */ - -#ifdef GL_NV_texture_array - -static GLboolean _glewInit_GL_NV_texture_array () -{ - GLboolean r = GL_FALSE; - - r = ((glCompressedTexImage3DNV = (PFNGLCOMPRESSEDTEXIMAGE3DNVPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3DNV")) == NULL) || r; - r = ((glCompressedTexSubImage3DNV = (PFNGLCOMPRESSEDTEXSUBIMAGE3DNVPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3DNV")) == NULL) || r; - r = ((glCopyTexSubImage3DNV = (PFNGLCOPYTEXSUBIMAGE3DNVPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3DNV")) == NULL) || r; - r = ((glFramebufferTextureLayerNV = (PFNGLFRAMEBUFFERTEXTURELAYERNVPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerNV")) == NULL) || r; - r = ((glTexImage3DNV = (PFNGLTEXIMAGE3DNVPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DNV")) == NULL) || r; - r = ((glTexSubImage3DNV = (PFNGLTEXSUBIMAGE3DNVPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3DNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_texture_array */ - -#ifdef GL_NV_texture_barrier - -static GLboolean _glewInit_GL_NV_texture_barrier () -{ - GLboolean r = GL_FALSE; - - r = ((glTextureBarrierNV = (PFNGLTEXTUREBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glTextureBarrierNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_texture_barrier */ - -#ifdef GL_NV_texture_multisample - -static GLboolean _glewInit_GL_NV_texture_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glTexImage2DMultisampleCoverageNV = (PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTexImage2DMultisampleCoverageNV")) == NULL) || r; - r = ((glTexImage3DMultisampleCoverageNV = (PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DMultisampleCoverageNV")) == NULL) || r; - r = ((glTextureImage2DMultisampleCoverageNV = (PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DMultisampleCoverageNV")) == NULL) || r; - r = ((glTextureImage2DMultisampleNV = (PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DMultisampleNV")) == NULL) || r; - r = ((glTextureImage3DMultisampleCoverageNV = (PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DMultisampleCoverageNV")) == NULL) || r; - r = ((glTextureImage3DMultisampleNV = (PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DMultisampleNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_texture_multisample */ - -#ifdef GL_NV_transform_feedback - -static GLboolean _glewInit_GL_NV_transform_feedback () -{ - GLboolean r = GL_FALSE; - - r = ((glActiveVaryingNV = (PFNGLACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glActiveVaryingNV")) == NULL) || r; - r = ((glBeginTransformFeedbackNV = (PFNGLBEGINTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedbackNV")) == NULL) || r; - r = ((glBindBufferBaseNV = (PFNGLBINDBUFFERBASENVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBaseNV")) == NULL) || r; - r = ((glBindBufferOffsetNV = (PFNGLBINDBUFFEROFFSETNVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferOffsetNV")) == NULL) || r; - r = ((glBindBufferRangeNV = (PFNGLBINDBUFFERRANGENVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRangeNV")) == NULL) || r; - r = ((glEndTransformFeedbackNV = (PFNGLENDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedbackNV")) == NULL) || r; - r = ((glGetActiveVaryingNV = (PFNGLGETACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveVaryingNV")) == NULL) || r; - r = ((glGetTransformFeedbackVaryingNV = (PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVaryingNV")) == NULL) || r; - r = ((glGetVaryingLocationNV = (PFNGLGETVARYINGLOCATIONNVPROC)glewGetProcAddress((const GLubyte*)"glGetVaryingLocationNV")) == NULL) || r; - r = ((glTransformFeedbackAttribsNV = (PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackAttribsNV")) == NULL) || r; - r = ((glTransformFeedbackVaryingsNV = (PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryingsNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_transform_feedback */ - -#ifdef GL_NV_transform_feedback2 - -static GLboolean _glewInit_GL_NV_transform_feedback2 () -{ - GLboolean r = GL_FALSE; - - r = ((glBindTransformFeedbackNV = (PFNGLBINDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glBindTransformFeedbackNV")) == NULL) || r; - r = ((glDeleteTransformFeedbacksNV = (PFNGLDELETETRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteTransformFeedbacksNV")) == NULL) || r; - r = ((glDrawTransformFeedbackNV = (PFNGLDRAWTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackNV")) == NULL) || r; - r = ((glGenTransformFeedbacksNV = (PFNGLGENTRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)"glGenTransformFeedbacksNV")) == NULL) || r; - r = ((glIsTransformFeedbackNV = (PFNGLISTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glIsTransformFeedbackNV")) == NULL) || r; - r = ((glPauseTransformFeedbackNV = (PFNGLPAUSETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glPauseTransformFeedbackNV")) == NULL) || r; - r = ((glResumeTransformFeedbackNV = (PFNGLRESUMETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glResumeTransformFeedbackNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_transform_feedback2 */ - -#ifdef GL_NV_vdpau_interop - -static GLboolean _glewInit_GL_NV_vdpau_interop () -{ - GLboolean r = GL_FALSE; - - r = ((glVDPAUFiniNV = (PFNGLVDPAUFININVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUFiniNV")) == NULL) || r; - r = ((glVDPAUGetSurfaceivNV = (PFNGLVDPAUGETSURFACEIVNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUGetSurfaceivNV")) == NULL) || r; - r = ((glVDPAUInitNV = (PFNGLVDPAUINITNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUInitNV")) == NULL) || r; - r = ((glVDPAUIsSurfaceNV = (PFNGLVDPAUISSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUIsSurfaceNV")) == NULL) || r; - r = ((glVDPAUMapSurfacesNV = (PFNGLVDPAUMAPSURFACESNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUMapSurfacesNV")) == NULL) || r; - r = ((glVDPAURegisterOutputSurfaceNV = (PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterOutputSurfaceNV")) == NULL) || r; - r = ((glVDPAURegisterVideoSurfaceNV = (PFNGLVDPAUREGISTERVIDEOSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterVideoSurfaceNV")) == NULL) || r; - r = ((glVDPAUSurfaceAccessNV = (PFNGLVDPAUSURFACEACCESSNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUSurfaceAccessNV")) == NULL) || r; - r = ((glVDPAUUnmapSurfacesNV = (PFNGLVDPAUUNMAPSURFACESNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUUnmapSurfacesNV")) == NULL) || r; - r = ((glVDPAUUnregisterSurfaceNV = (PFNGLVDPAUUNREGISTERSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUUnregisterSurfaceNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_vdpau_interop */ - -#ifdef GL_NV_vertex_array_range - -static GLboolean _glewInit_GL_NV_vertex_array_range () -{ - GLboolean r = GL_FALSE; - - r = ((glFlushVertexArrayRangeNV = (PFNGLFLUSHVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeNV")) == NULL) || r; - r = ((glVertexArrayRangeNV = (PFNGLVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_vertex_array_range */ - -#ifdef GL_NV_vertex_attrib_integer_64bit - -static GLboolean _glewInit_GL_NV_vertex_attrib_integer_64bit () -{ - GLboolean r = GL_FALSE; - - r = ((glGetVertexAttribLi64vNV = (PFNGLGETVERTEXATTRIBLI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLi64vNV")) == NULL) || r; - r = ((glGetVertexAttribLui64vNV = (PFNGLGETVERTEXATTRIBLUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLui64vNV")) == NULL) || r; - r = ((glVertexAttribL1i64NV = (PFNGLVERTEXATTRIBL1I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1i64NV")) == NULL) || r; - r = ((glVertexAttribL1i64vNV = (PFNGLVERTEXATTRIBL1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1i64vNV")) == NULL) || r; - r = ((glVertexAttribL1ui64NV = (PFNGLVERTEXATTRIBL1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64NV")) == NULL) || r; - r = ((glVertexAttribL1ui64vNV = (PFNGLVERTEXATTRIBL1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64vNV")) == NULL) || r; - r = ((glVertexAttribL2i64NV = (PFNGLVERTEXATTRIBL2I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2i64NV")) == NULL) || r; - r = ((glVertexAttribL2i64vNV = (PFNGLVERTEXATTRIBL2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2i64vNV")) == NULL) || r; - r = ((glVertexAttribL2ui64NV = (PFNGLVERTEXATTRIBL2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2ui64NV")) == NULL) || r; - r = ((glVertexAttribL2ui64vNV = (PFNGLVERTEXATTRIBL2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2ui64vNV")) == NULL) || r; - r = ((glVertexAttribL3i64NV = (PFNGLVERTEXATTRIBL3I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3i64NV")) == NULL) || r; - r = ((glVertexAttribL3i64vNV = (PFNGLVERTEXATTRIBL3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3i64vNV")) == NULL) || r; - r = ((glVertexAttribL3ui64NV = (PFNGLVERTEXATTRIBL3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3ui64NV")) == NULL) || r; - r = ((glVertexAttribL3ui64vNV = (PFNGLVERTEXATTRIBL3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3ui64vNV")) == NULL) || r; - r = ((glVertexAttribL4i64NV = (PFNGLVERTEXATTRIBL4I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4i64NV")) == NULL) || r; - r = ((glVertexAttribL4i64vNV = (PFNGLVERTEXATTRIBL4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4i64vNV")) == NULL) || r; - r = ((glVertexAttribL4ui64NV = (PFNGLVERTEXATTRIBL4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4ui64NV")) == NULL) || r; - r = ((glVertexAttribL4ui64vNV = (PFNGLVERTEXATTRIBL4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4ui64vNV")) == NULL) || r; - r = ((glVertexAttribLFormatNV = (PFNGLVERTEXATTRIBLFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLFormatNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_vertex_attrib_integer_64bit */ - -#ifdef GL_NV_vertex_buffer_unified_memory - -static GLboolean _glewInit_GL_NV_vertex_buffer_unified_memory () -{ - GLboolean r = GL_FALSE; - - r = ((glBufferAddressRangeNV = (PFNGLBUFFERADDRESSRANGENVPROC)glewGetProcAddress((const GLubyte*)"glBufferAddressRangeNV")) == NULL) || r; - r = ((glColorFormatNV = (PFNGLCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glColorFormatNV")) == NULL) || r; - r = ((glEdgeFlagFormatNV = (PFNGLEDGEFLAGFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagFormatNV")) == NULL) || r; - r = ((glFogCoordFormatNV = (PFNGLFOGCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordFormatNV")) == NULL) || r; - r = ((glGetIntegerui64i_vNV = (PFNGLGETINTEGERUI64I_VNVPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerui64i_vNV")) == NULL) || r; - r = ((glIndexFormatNV = (PFNGLINDEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glIndexFormatNV")) == NULL) || r; - r = ((glNormalFormatNV = (PFNGLNORMALFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glNormalFormatNV")) == NULL) || r; - r = ((glSecondaryColorFormatNV = (PFNGLSECONDARYCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorFormatNV")) == NULL) || r; - r = ((glTexCoordFormatNV = (PFNGLTEXCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordFormatNV")) == NULL) || r; - r = ((glVertexAttribFormatNV = (PFNGLVERTEXATTRIBFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribFormatNV")) == NULL) || r; - r = ((glVertexAttribIFormatNV = (PFNGLVERTEXATTRIBIFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIFormatNV")) == NULL) || r; - r = ((glVertexFormatNV = (PFNGLVERTEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexFormatNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_vertex_buffer_unified_memory */ - -#ifdef GL_NV_vertex_program - -static GLboolean _glewInit_GL_NV_vertex_program () -{ - GLboolean r = GL_FALSE; - - r = ((glAreProgramsResidentNV = (PFNGLAREPROGRAMSRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glAreProgramsResidentNV")) == NULL) || r; - r = ((glBindProgramNV = (PFNGLBINDPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glBindProgramNV")) == NULL) || r; - r = ((glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsNV")) == NULL) || r; - r = ((glExecuteProgramNV = (PFNGLEXECUTEPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glExecuteProgramNV")) == NULL) || r; - r = ((glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsNV")) == NULL) || r; - r = ((glGetProgramParameterdvNV = (PFNGLGETPROGRAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterdvNV")) == NULL) || r; - r = ((glGetProgramParameterfvNV = (PFNGLGETPROGRAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterfvNV")) == NULL) || r; - r = ((glGetProgramStringNV = (PFNGLGETPROGRAMSTRINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringNV")) == NULL) || r; - r = ((glGetProgramivNV = (PFNGLGETPROGRAMIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivNV")) == NULL) || r; - r = ((glGetTrackMatrixivNV = (PFNGLGETTRACKMATRIXIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetTrackMatrixivNV")) == NULL) || r; - r = ((glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervNV")) == NULL) || r; - r = ((glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvNV")) == NULL) || r; - r = ((glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvNV")) == NULL) || r; - r = ((glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivNV")) == NULL) || r; - r = ((glIsProgramNV = (PFNGLISPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glIsProgramNV")) == NULL) || r; - r = ((glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glLoadProgramNV")) == NULL) || r; - r = ((glProgramParameter4dNV = (PFNGLPROGRAMPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dNV")) == NULL) || r; - r = ((glProgramParameter4dvNV = (PFNGLPROGRAMPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dvNV")) == NULL) || r; - r = ((glProgramParameter4fNV = (PFNGLPROGRAMPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fNV")) == NULL) || r; - r = ((glProgramParameter4fvNV = (PFNGLPROGRAMPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fvNV")) == NULL) || r; - r = ((glProgramParameters4dvNV = (PFNGLPROGRAMPARAMETERS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4dvNV")) == NULL) || r; - r = ((glProgramParameters4fvNV = (PFNGLPROGRAMPARAMETERS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4fvNV")) == NULL) || r; - r = ((glRequestResidentProgramsNV = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glRequestResidentProgramsNV")) == NULL) || r; - r = ((glTrackMatrixNV = (PFNGLTRACKMATRIXNVPROC)glewGetProcAddress((const GLubyte*)"glTrackMatrixNV")) == NULL) || r; - r = ((glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dNV")) == NULL) || r; - r = ((glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvNV")) == NULL) || r; - r = ((glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fNV")) == NULL) || r; - r = ((glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvNV")) == NULL) || r; - r = ((glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sNV")) == NULL) || r; - r = ((glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svNV")) == NULL) || r; - r = ((glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dNV")) == NULL) || r; - r = ((glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvNV")) == NULL) || r; - r = ((glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fNV")) == NULL) || r; - r = ((glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvNV")) == NULL) || r; - r = ((glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sNV")) == NULL) || r; - r = ((glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svNV")) == NULL) || r; - r = ((glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dNV")) == NULL) || r; - r = ((glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvNV")) == NULL) || r; - r = ((glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fNV")) == NULL) || r; - r = ((glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvNV")) == NULL) || r; - r = ((glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sNV")) == NULL) || r; - r = ((glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svNV")) == NULL) || r; - r = ((glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dNV")) == NULL) || r; - r = ((glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvNV")) == NULL) || r; - r = ((glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fNV")) == NULL) || r; - r = ((glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvNV")) == NULL) || r; - r = ((glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sNV")) == NULL) || r; - r = ((glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svNV")) == NULL) || r; - r = ((glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubNV")) == NULL) || r; - r = ((glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvNV")) == NULL) || r; - r = ((glVertexAttribPointerNV = (PFNGLVERTEXATTRIBPOINTERNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerNV")) == NULL) || r; - r = ((glVertexAttribs1dvNV = (PFNGLVERTEXATTRIBS1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1dvNV")) == NULL) || r; - r = ((glVertexAttribs1fvNV = (PFNGLVERTEXATTRIBS1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1fvNV")) == NULL) || r; - r = ((glVertexAttribs1svNV = (PFNGLVERTEXATTRIBS1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1svNV")) == NULL) || r; - r = ((glVertexAttribs2dvNV = (PFNGLVERTEXATTRIBS2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2dvNV")) == NULL) || r; - r = ((glVertexAttribs2fvNV = (PFNGLVERTEXATTRIBS2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2fvNV")) == NULL) || r; - r = ((glVertexAttribs2svNV = (PFNGLVERTEXATTRIBS2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2svNV")) == NULL) || r; - r = ((glVertexAttribs3dvNV = (PFNGLVERTEXATTRIBS3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3dvNV")) == NULL) || r; - r = ((glVertexAttribs3fvNV = (PFNGLVERTEXATTRIBS3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3fvNV")) == NULL) || r; - r = ((glVertexAttribs3svNV = (PFNGLVERTEXATTRIBS3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3svNV")) == NULL) || r; - r = ((glVertexAttribs4dvNV = (PFNGLVERTEXATTRIBS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4dvNV")) == NULL) || r; - r = ((glVertexAttribs4fvNV = (PFNGLVERTEXATTRIBS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4fvNV")) == NULL) || r; - r = ((glVertexAttribs4svNV = (PFNGLVERTEXATTRIBS4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4svNV")) == NULL) || r; - r = ((glVertexAttribs4ubvNV = (PFNGLVERTEXATTRIBS4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4ubvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_vertex_program */ - -#ifdef GL_NV_video_capture - -static GLboolean _glewInit_GL_NV_video_capture () -{ - GLboolean r = GL_FALSE; - - r = ((glBeginVideoCaptureNV = (PFNGLBEGINVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glBeginVideoCaptureNV")) == NULL) || r; - r = ((glBindVideoCaptureStreamBufferNV = (PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glBindVideoCaptureStreamBufferNV")) == NULL) || r; - r = ((glBindVideoCaptureStreamTextureNV = (PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC)glewGetProcAddress((const GLubyte*)"glBindVideoCaptureStreamTextureNV")) == NULL) || r; - r = ((glEndVideoCaptureNV = (PFNGLENDVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glEndVideoCaptureNV")) == NULL) || r; - r = ((glGetVideoCaptureStreamdvNV = (PFNGLGETVIDEOCAPTURESTREAMDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamdvNV")) == NULL) || r; - r = ((glGetVideoCaptureStreamfvNV = (PFNGLGETVIDEOCAPTURESTREAMFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamfvNV")) == NULL) || r; - r = ((glGetVideoCaptureStreamivNV = (PFNGLGETVIDEOCAPTURESTREAMIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamivNV")) == NULL) || r; - r = ((glGetVideoCaptureivNV = (PFNGLGETVIDEOCAPTUREIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureivNV")) == NULL) || r; - r = ((glVideoCaptureNV = (PFNGLVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureNV")) == NULL) || r; - r = ((glVideoCaptureStreamParameterdvNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterdvNV")) == NULL) || r; - r = ((glVideoCaptureStreamParameterfvNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterfvNV")) == NULL) || r; - r = ((glVideoCaptureStreamParameterivNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_video_capture */ - -#ifdef GL_NV_viewport_array - -static GLboolean _glewInit_GL_NV_viewport_array () -{ - GLboolean r = GL_FALSE; - - r = ((glDepthRangeArrayfvNV = (PFNGLDEPTHRANGEARRAYFVNVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeArrayfvNV")) == NULL) || r; - r = ((glDepthRangeIndexedfNV = (PFNGLDEPTHRANGEINDEXEDFNVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeIndexedfNV")) == NULL) || r; - r = ((glDisableiNV = (PFNGLDISABLEINVPROC)glewGetProcAddress((const GLubyte*)"glDisableiNV")) == NULL) || r; - r = ((glEnableiNV = (PFNGLENABLEINVPROC)glewGetProcAddress((const GLubyte*)"glEnableiNV")) == NULL) || r; - r = ((glGetFloati_vNV = (PFNGLGETFLOATI_VNVPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_vNV")) == NULL) || r; - r = ((glIsEnablediNV = (PFNGLISENABLEDINVPROC)glewGetProcAddress((const GLubyte*)"glIsEnablediNV")) == NULL) || r; - r = ((glScissorArrayvNV = (PFNGLSCISSORARRAYVNVPROC)glewGetProcAddress((const GLubyte*)"glScissorArrayvNV")) == NULL) || r; - r = ((glScissorIndexedNV = (PFNGLSCISSORINDEXEDNVPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexedNV")) == NULL) || r; - r = ((glScissorIndexedvNV = (PFNGLSCISSORINDEXEDVNVPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexedvNV")) == NULL) || r; - r = ((glViewportArrayvNV = (PFNGLVIEWPORTARRAYVNVPROC)glewGetProcAddress((const GLubyte*)"glViewportArrayvNV")) == NULL) || r; - r = ((glViewportIndexedfNV = (PFNGLVIEWPORTINDEXEDFNVPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedfNV")) == NULL) || r; - r = ((glViewportIndexedfvNV = (PFNGLVIEWPORTINDEXEDFVNVPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedfvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_viewport_array */ - -#ifdef GL_NV_viewport_swizzle - -static GLboolean _glewInit_GL_NV_viewport_swizzle () -{ - GLboolean r = GL_FALSE; - - r = ((glViewportSwizzleNV = (PFNGLVIEWPORTSWIZZLENVPROC)glewGetProcAddress((const GLubyte*)"glViewportSwizzleNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_viewport_swizzle */ - -#ifdef GL_OVR_multiview - -static GLboolean _glewInit_GL_OVR_multiview () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferTextureMultiviewOVR = (PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureMultiviewOVR")) == NULL) || r; - - return r; -} - -#endif /* GL_OVR_multiview */ - -#ifdef GL_OVR_multiview_multisampled_render_to_texture - -static GLboolean _glewInit_GL_OVR_multiview_multisampled_render_to_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferTextureMultisampleMultiviewOVR = (PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureMultisampleMultiviewOVR")) == NULL) || r; - - return r; -} - -#endif /* GL_OVR_multiview_multisampled_render_to_texture */ - -#ifdef GL_QCOM_alpha_test - -static GLboolean _glewInit_GL_QCOM_alpha_test () -{ - GLboolean r = GL_FALSE; - - r = ((glAlphaFuncQCOM = (PFNGLALPHAFUNCQCOMPROC)glewGetProcAddress((const GLubyte*)"glAlphaFuncQCOM")) == NULL) || r; - - return r; -} - -#endif /* GL_QCOM_alpha_test */ - -#ifdef GL_QCOM_driver_control - -static GLboolean _glewInit_GL_QCOM_driver_control () -{ - GLboolean r = GL_FALSE; - - r = ((glDisableDriverControlQCOM = (PFNGLDISABLEDRIVERCONTROLQCOMPROC)glewGetProcAddress((const GLubyte*)"glDisableDriverControlQCOM")) == NULL) || r; - r = ((glEnableDriverControlQCOM = (PFNGLENABLEDRIVERCONTROLQCOMPROC)glewGetProcAddress((const GLubyte*)"glEnableDriverControlQCOM")) == NULL) || r; - r = ((glGetDriverControlStringQCOM = (PFNGLGETDRIVERCONTROLSTRINGQCOMPROC)glewGetProcAddress((const GLubyte*)"glGetDriverControlStringQCOM")) == NULL) || r; - r = ((glGetDriverControlsQCOM = (PFNGLGETDRIVERCONTROLSQCOMPROC)glewGetProcAddress((const GLubyte*)"glGetDriverControlsQCOM")) == NULL) || r; - - return r; -} - -#endif /* GL_QCOM_driver_control */ - -#ifdef GL_QCOM_extended_get - -static GLboolean _glewInit_GL_QCOM_extended_get () -{ - GLboolean r = GL_FALSE; - - r = ((glExtGetBufferPointervQCOM = (PFNGLEXTGETBUFFERPOINTERVQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetBufferPointervQCOM")) == NULL) || r; - r = ((glExtGetBuffersQCOM = (PFNGLEXTGETBUFFERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetBuffersQCOM")) == NULL) || r; - r = ((glExtGetFramebuffersQCOM = (PFNGLEXTGETFRAMEBUFFERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetFramebuffersQCOM")) == NULL) || r; - r = ((glExtGetRenderbuffersQCOM = (PFNGLEXTGETRENDERBUFFERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetRenderbuffersQCOM")) == NULL) || r; - r = ((glExtGetTexLevelParameterivQCOM = (PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetTexLevelParameterivQCOM")) == NULL) || r; - r = ((glExtGetTexSubImageQCOM = (PFNGLEXTGETTEXSUBIMAGEQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetTexSubImageQCOM")) == NULL) || r; - r = ((glExtGetTexturesQCOM = (PFNGLEXTGETTEXTURESQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetTexturesQCOM")) == NULL) || r; - r = ((glExtTexObjectStateOverrideiQCOM = (PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtTexObjectStateOverrideiQCOM")) == NULL) || r; - - return r; -} - -#endif /* GL_QCOM_extended_get */ - -#ifdef GL_QCOM_extended_get2 - -static GLboolean _glewInit_GL_QCOM_extended_get2 () -{ - GLboolean r = GL_FALSE; - - r = ((glExtGetProgramBinarySourceQCOM = (PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetProgramBinarySourceQCOM")) == NULL) || r; - r = ((glExtGetProgramsQCOM = (PFNGLEXTGETPROGRAMSQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetProgramsQCOM")) == NULL) || r; - r = ((glExtGetShadersQCOM = (PFNGLEXTGETSHADERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtGetShadersQCOM")) == NULL) || r; - r = ((glExtIsProgramBinaryQCOM = (PFNGLEXTISPROGRAMBINARYQCOMPROC)glewGetProcAddress((const GLubyte*)"glExtIsProgramBinaryQCOM")) == NULL) || r; - - return r; -} - -#endif /* GL_QCOM_extended_get2 */ - -#ifdef GL_QCOM_framebuffer_foveated - -static GLboolean _glewInit_GL_QCOM_framebuffer_foveated () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferFoveationConfigQCOM = (PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC)glewGetProcAddress((const GLubyte*)"glFramebufferFoveationConfigQCOM")) == NULL) || r; - r = ((glFramebufferFoveationParametersQCOM = (PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC)glewGetProcAddress((const GLubyte*)"glFramebufferFoveationParametersQCOM")) == NULL) || r; - - return r; -} - -#endif /* GL_QCOM_framebuffer_foveated */ - -#ifdef GL_QCOM_shader_framebuffer_fetch_noncoherent - -static GLboolean _glewInit_GL_QCOM_shader_framebuffer_fetch_noncoherent () -{ - GLboolean r = GL_FALSE; - - r = ((glFramebufferFetchBarrierQCOM = (PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC)glewGetProcAddress((const GLubyte*)"glFramebufferFetchBarrierQCOM")) == NULL) || r; - - return r; -} - -#endif /* GL_QCOM_shader_framebuffer_fetch_noncoherent */ - -#ifdef GL_QCOM_tiled_rendering - -static GLboolean _glewInit_GL_QCOM_tiled_rendering () -{ - GLboolean r = GL_FALSE; - - r = ((glEndTilingQCOM = (PFNGLENDTILINGQCOMPROC)glewGetProcAddress((const GLubyte*)"glEndTilingQCOM")) == NULL) || r; - r = ((glStartTilingQCOM = (PFNGLSTARTTILINGQCOMPROC)glewGetProcAddress((const GLubyte*)"glStartTilingQCOM")) == NULL) || r; - - return r; -} - -#endif /* GL_QCOM_tiled_rendering */ - -#ifdef GL_REGAL_ES1_0_compatibility - -static GLboolean _glewInit_GL_REGAL_ES1_0_compatibility () -{ - GLboolean r = GL_FALSE; - - r = ((glAlphaFuncx = (PFNGLALPHAFUNCXPROC)glewGetProcAddress((const GLubyte*)"glAlphaFuncx")) == NULL) || r; - r = ((glClearColorx = (PFNGLCLEARCOLORXPROC)glewGetProcAddress((const GLubyte*)"glClearColorx")) == NULL) || r; - r = ((glClearDepthx = (PFNGLCLEARDEPTHXPROC)glewGetProcAddress((const GLubyte*)"glClearDepthx")) == NULL) || r; - r = ((glColor4x = (PFNGLCOLOR4XPROC)glewGetProcAddress((const GLubyte*)"glColor4x")) == NULL) || r; - r = ((glDepthRangex = (PFNGLDEPTHRANGEXPROC)glewGetProcAddress((const GLubyte*)"glDepthRangex")) == NULL) || r; - r = ((glFogx = (PFNGLFOGXPROC)glewGetProcAddress((const GLubyte*)"glFogx")) == NULL) || r; - r = ((glFogxv = (PFNGLFOGXVPROC)glewGetProcAddress((const GLubyte*)"glFogxv")) == NULL) || r; - r = ((glFrustumf = (PFNGLFRUSTUMFPROC)glewGetProcAddress((const GLubyte*)"glFrustumf")) == NULL) || r; - r = ((glFrustumx = (PFNGLFRUSTUMXPROC)glewGetProcAddress((const GLubyte*)"glFrustumx")) == NULL) || r; - r = ((glLightModelx = (PFNGLLIGHTMODELXPROC)glewGetProcAddress((const GLubyte*)"glLightModelx")) == NULL) || r; - r = ((glLightModelxv = (PFNGLLIGHTMODELXVPROC)glewGetProcAddress((const GLubyte*)"glLightModelxv")) == NULL) || r; - r = ((glLightx = (PFNGLLIGHTXPROC)glewGetProcAddress((const GLubyte*)"glLightx")) == NULL) || r; - r = ((glLightxv = (PFNGLLIGHTXVPROC)glewGetProcAddress((const GLubyte*)"glLightxv")) == NULL) || r; - r = ((glLineWidthx = (PFNGLLINEWIDTHXPROC)glewGetProcAddress((const GLubyte*)"glLineWidthx")) == NULL) || r; - r = ((glLoadMatrixx = (PFNGLLOADMATRIXXPROC)glewGetProcAddress((const GLubyte*)"glLoadMatrixx")) == NULL) || r; - r = ((glMaterialx = (PFNGLMATERIALXPROC)glewGetProcAddress((const GLubyte*)"glMaterialx")) == NULL) || r; - r = ((glMaterialxv = (PFNGLMATERIALXVPROC)glewGetProcAddress((const GLubyte*)"glMaterialxv")) == NULL) || r; - r = ((glMultMatrixx = (PFNGLMULTMATRIXXPROC)glewGetProcAddress((const GLubyte*)"glMultMatrixx")) == NULL) || r; - r = ((glMultiTexCoord4x = (PFNGLMULTITEXCOORD4XPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4x")) == NULL) || r; - r = ((glNormal3x = (PFNGLNORMAL3XPROC)glewGetProcAddress((const GLubyte*)"glNormal3x")) == NULL) || r; - r = ((glOrthof = (PFNGLORTHOFPROC)glewGetProcAddress((const GLubyte*)"glOrthof")) == NULL) || r; - r = ((glOrthox = (PFNGLORTHOXPROC)glewGetProcAddress((const GLubyte*)"glOrthox")) == NULL) || r; - r = ((glPointSizex = (PFNGLPOINTSIZEXPROC)glewGetProcAddress((const GLubyte*)"glPointSizex")) == NULL) || r; - r = ((glPolygonOffsetx = (PFNGLPOLYGONOFFSETXPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetx")) == NULL) || r; - r = ((glRotatex = (PFNGLROTATEXPROC)glewGetProcAddress((const GLubyte*)"glRotatex")) == NULL) || r; - r = ((glSampleCoveragex = (PFNGLSAMPLECOVERAGEXPROC)glewGetProcAddress((const GLubyte*)"glSampleCoveragex")) == NULL) || r; - r = ((glScalex = (PFNGLSCALEXPROC)glewGetProcAddress((const GLubyte*)"glScalex")) == NULL) || r; - r = ((glTexEnvx = (PFNGLTEXENVXPROC)glewGetProcAddress((const GLubyte*)"glTexEnvx")) == NULL) || r; - r = ((glTexEnvxv = (PFNGLTEXENVXVPROC)glewGetProcAddress((const GLubyte*)"glTexEnvxv")) == NULL) || r; - r = ((glTexParameterx = (PFNGLTEXPARAMETERXPROC)glewGetProcAddress((const GLubyte*)"glTexParameterx")) == NULL) || r; - r = ((glTranslatex = (PFNGLTRANSLATEXPROC)glewGetProcAddress((const GLubyte*)"glTranslatex")) == NULL) || r; - - return r; -} - -#endif /* GL_REGAL_ES1_0_compatibility */ - -#ifdef GL_REGAL_ES1_1_compatibility - -static GLboolean _glewInit_GL_REGAL_ES1_1_compatibility () -{ - GLboolean r = GL_FALSE; - - r = ((glClipPlanef = (PFNGLCLIPPLANEFPROC)glewGetProcAddress((const GLubyte*)"glClipPlanef")) == NULL) || r; - r = ((glClipPlanex = (PFNGLCLIPPLANEXPROC)glewGetProcAddress((const GLubyte*)"glClipPlanex")) == NULL) || r; - r = ((glGetClipPlanef = (PFNGLGETCLIPPLANEFPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanef")) == NULL) || r; - r = ((glGetClipPlanex = (PFNGLGETCLIPPLANEXPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanex")) == NULL) || r; - r = ((glGetFixedv = (PFNGLGETFIXEDVPROC)glewGetProcAddress((const GLubyte*)"glGetFixedv")) == NULL) || r; - r = ((glGetLightxv = (PFNGLGETLIGHTXVPROC)glewGetProcAddress((const GLubyte*)"glGetLightxv")) == NULL) || r; - r = ((glGetMaterialxv = (PFNGLGETMATERIALXVPROC)glewGetProcAddress((const GLubyte*)"glGetMaterialxv")) == NULL) || r; - r = ((glGetTexEnvxv = (PFNGLGETTEXENVXVPROC)glewGetProcAddress((const GLubyte*)"glGetTexEnvxv")) == NULL) || r; - r = ((glGetTexParameterxv = (PFNGLGETTEXPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterxv")) == NULL) || r; - r = ((glPointParameterx = (PFNGLPOINTPARAMETERXPROC)glewGetProcAddress((const GLubyte*)"glPointParameterx")) == NULL) || r; - r = ((glPointParameterxv = (PFNGLPOINTPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterxv")) == NULL) || r; - r = ((glPointSizePointerOES = (PFNGLPOINTSIZEPOINTEROESPROC)glewGetProcAddress((const GLubyte*)"glPointSizePointerOES")) == NULL) || r; - r = ((glTexParameterxv = (PFNGLTEXPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterxv")) == NULL) || r; - - return r; -} - -#endif /* GL_REGAL_ES1_1_compatibility */ - -#ifdef GL_REGAL_error_string - -static GLboolean _glewInit_GL_REGAL_error_string () -{ - GLboolean r = GL_FALSE; - - r = ((glErrorStringREGAL = (PFNGLERRORSTRINGREGALPROC)glewGetProcAddress((const GLubyte*)"glErrorStringREGAL")) == NULL) || r; - - return r; -} - -#endif /* GL_REGAL_error_string */ - -#ifdef GL_REGAL_extension_query - -static GLboolean _glewInit_GL_REGAL_extension_query () -{ - GLboolean r = GL_FALSE; - - r = ((glGetExtensionREGAL = (PFNGLGETEXTENSIONREGALPROC)glewGetProcAddress((const GLubyte*)"glGetExtensionREGAL")) == NULL) || r; - r = ((glIsSupportedREGAL = (PFNGLISSUPPORTEDREGALPROC)glewGetProcAddress((const GLubyte*)"glIsSupportedREGAL")) == NULL) || r; - - return r; -} - -#endif /* GL_REGAL_extension_query */ - -#ifdef GL_REGAL_log - -static GLboolean _glewInit_GL_REGAL_log () -{ - GLboolean r = GL_FALSE; - - r = ((glLogMessageCallbackREGAL = (PFNGLLOGMESSAGECALLBACKREGALPROC)glewGetProcAddress((const GLubyte*)"glLogMessageCallbackREGAL")) == NULL) || r; - - return r; -} - -#endif /* GL_REGAL_log */ - -#ifdef GL_REGAL_proc_address - -static GLboolean _glewInit_GL_REGAL_proc_address () -{ - GLboolean r = GL_FALSE; - - r = ((glGetProcAddressREGAL = (PFNGLGETPROCADDRESSREGALPROC)glewGetProcAddress((const GLubyte*)"glGetProcAddressREGAL")) == NULL) || r; - - return r; -} - -#endif /* GL_REGAL_proc_address */ - -#ifdef GL_SGIS_detail_texture - -static GLboolean _glewInit_GL_SGIS_detail_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glDetailTexFuncSGIS = (PFNGLDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glDetailTexFuncSGIS")) == NULL) || r; - r = ((glGetDetailTexFuncSGIS = (PFNGLGETDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetDetailTexFuncSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_detail_texture */ - -#ifdef GL_SGIS_fog_function - -static GLboolean _glewInit_GL_SGIS_fog_function () -{ - GLboolean r = GL_FALSE; - - r = ((glFogFuncSGIS = (PFNGLFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glFogFuncSGIS")) == NULL) || r; - r = ((glGetFogFuncSGIS = (PFNGLGETFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetFogFuncSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_fog_function */ - -#ifdef GL_SGIS_multisample - -static GLboolean _glewInit_GL_SGIS_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glSampleMaskSGIS = (PFNGLSAMPLEMASKSGISPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskSGIS")) == NULL) || r; - r = ((glSamplePatternSGIS = (PFNGLSAMPLEPATTERNSGISPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_multisample */ - -#ifdef GL_SGIS_multitexture - -static GLboolean _glewInit_GL_SGIS_multitexture () -{ - GLboolean r = GL_FALSE; - - r = ((glInterleavedTextureCoordSetsSGIS = (PFNGLINTERLEAVEDTEXTURECOORDSETSSGISPROC)glewGetProcAddress((const GLubyte*)"glInterleavedTextureCoordSetsSGIS")) == NULL) || r; - r = ((glSelectTextureCoordSetSGIS = (PFNGLSELECTTEXTURECOORDSETSGISPROC)glewGetProcAddress((const GLubyte*)"glSelectTextureCoordSetSGIS")) == NULL) || r; - r = ((glSelectTextureSGIS = (PFNGLSELECTTEXTURESGISPROC)glewGetProcAddress((const GLubyte*)"glSelectTextureSGIS")) == NULL) || r; - r = ((glSelectTextureTransformSGIS = (PFNGLSELECTTEXTURETRANSFORMSGISPROC)glewGetProcAddress((const GLubyte*)"glSelectTextureTransformSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_multitexture */ - -#ifdef GL_SGIS_shared_multisample - -static GLboolean _glewInit_GL_SGIS_shared_multisample () -{ - GLboolean r = GL_FALSE; - - r = ((glMultisampleSubRectPosSGIS = (PFNGLMULTISAMPLESUBRECTPOSSGISPROC)glewGetProcAddress((const GLubyte*)"glMultisampleSubRectPosSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_shared_multisample */ - -#ifdef GL_SGIS_sharpen_texture - -static GLboolean _glewInit_GL_SGIS_sharpen_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glGetSharpenTexFuncSGIS = (PFNGLGETSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetSharpenTexFuncSGIS")) == NULL) || r; - r = ((glSharpenTexFuncSGIS = (PFNGLSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glSharpenTexFuncSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_sharpen_texture */ - -#ifdef GL_SGIS_texture4D - -static GLboolean _glewInit_GL_SGIS_texture4D () -{ - GLboolean r = GL_FALSE; - - r = ((glTexImage4DSGIS = (PFNGLTEXIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexImage4DSGIS")) == NULL) || r; - r = ((glTexSubImage4DSGIS = (PFNGLTEXSUBIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage4DSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_texture4D */ - -#ifdef GL_SGIS_texture_filter4 - -static GLboolean _glewInit_GL_SGIS_texture_filter4 () -{ - GLboolean r = GL_FALSE; - - r = ((glGetTexFilterFuncSGIS = (PFNGLGETTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetTexFilterFuncSGIS")) == NULL) || r; - r = ((glTexFilterFuncSGIS = (PFNGLTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glTexFilterFuncSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_texture_filter4 */ - -#ifdef GL_SGIX_async - -static GLboolean _glewInit_GL_SGIX_async () -{ - GLboolean r = GL_FALSE; - - r = ((glAsyncMarkerSGIX = (PFNGLASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glAsyncMarkerSGIX")) == NULL) || r; - r = ((glDeleteAsyncMarkersSGIX = (PFNGLDELETEASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeleteAsyncMarkersSGIX")) == NULL) || r; - r = ((glFinishAsyncSGIX = (PFNGLFINISHASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glFinishAsyncSGIX")) == NULL) || r; - r = ((glGenAsyncMarkersSGIX = (PFNGLGENASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGenAsyncMarkersSGIX")) == NULL) || r; - r = ((glIsAsyncMarkerSGIX = (PFNGLISASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glIsAsyncMarkerSGIX")) == NULL) || r; - r = ((glPollAsyncSGIX = (PFNGLPOLLASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glPollAsyncSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_async */ - -#ifdef GL_SGIX_datapipe - -static GLboolean _glewInit_GL_SGIX_datapipe () -{ - GLboolean r = GL_FALSE; - - r = ((glAddressSpace = (PFNGLADDRESSSPACEPROC)glewGetProcAddress((const GLubyte*)"glAddressSpace")) == NULL) || r; - r = ((glDataPipe = (PFNGLDATAPIPEPROC)glewGetProcAddress((const GLubyte*)"glDataPipe")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_datapipe */ - -#ifdef GL_SGIX_flush_raster - -static GLboolean _glewInit_GL_SGIX_flush_raster () -{ - GLboolean r = GL_FALSE; - - r = ((glFlushRasterSGIX = (PFNGLFLUSHRASTERSGIXPROC)glewGetProcAddress((const GLubyte*)"glFlushRasterSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_flush_raster */ - -#ifdef GL_SGIX_fog_layers - -static GLboolean _glewInit_GL_SGIX_fog_layers () -{ - GLboolean r = GL_FALSE; - - r = ((glFogLayersSGIX = (PFNGLFOGLAYERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glFogLayersSGIX")) == NULL) || r; - r = ((glGetFogLayersSGIX = (PFNGLGETFOGLAYERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFogLayersSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_fog_layers */ - -#ifdef GL_SGIX_fog_texture - -static GLboolean _glewInit_GL_SGIX_fog_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glTextureFogSGIX = (PFNGLTEXTUREFOGSGIXPROC)glewGetProcAddress((const GLubyte*)"glTextureFogSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_fog_texture */ - -#ifdef GL_SGIX_fragment_specular_lighting - -static GLboolean _glewInit_GL_SGIX_fragment_specular_lighting () -{ - GLboolean r = GL_FALSE; - - r = ((glFragmentColorMaterialSGIX = (PFNGLFRAGMENTCOLORMATERIALSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialSGIX")) == NULL) || r; - r = ((glFragmentLightModelfSGIX = (PFNGLFRAGMENTLIGHTMODELFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfSGIX")) == NULL) || r; - r = ((glFragmentLightModelfvSGIX = (PFNGLFRAGMENTLIGHTMODELFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvSGIX")) == NULL) || r; - r = ((glFragmentLightModeliSGIX = (PFNGLFRAGMENTLIGHTMODELISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliSGIX")) == NULL) || r; - r = ((glFragmentLightModelivSGIX = (PFNGLFRAGMENTLIGHTMODELIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivSGIX")) == NULL) || r; - r = ((glFragmentLightfSGIX = (PFNGLFRAGMENTLIGHTFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfSGIX")) == NULL) || r; - r = ((glFragmentLightfvSGIX = (PFNGLFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvSGIX")) == NULL) || r; - r = ((glFragmentLightiSGIX = (PFNGLFRAGMENTLIGHTISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiSGIX")) == NULL) || r; - r = ((glFragmentLightivSGIX = (PFNGLFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivSGIX")) == NULL) || r; - r = ((glFragmentMaterialfSGIX = (PFNGLFRAGMENTMATERIALFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfSGIX")) == NULL) || r; - r = ((glFragmentMaterialfvSGIX = (PFNGLFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvSGIX")) == NULL) || r; - r = ((glFragmentMaterialiSGIX = (PFNGLFRAGMENTMATERIALISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiSGIX")) == NULL) || r; - r = ((glFragmentMaterialivSGIX = (PFNGLFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivSGIX")) == NULL) || r; - r = ((glGetFragmentLightfvSGIX = (PFNGLGETFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvSGIX")) == NULL) || r; - r = ((glGetFragmentLightivSGIX = (PFNGLGETFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivSGIX")) == NULL) || r; - r = ((glGetFragmentMaterialfvSGIX = (PFNGLGETFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvSGIX")) == NULL) || r; - r = ((glGetFragmentMaterialivSGIX = (PFNGLGETFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_fragment_specular_lighting */ - -#ifdef GL_SGIX_framezoom - -static GLboolean _glewInit_GL_SGIX_framezoom () -{ - GLboolean r = GL_FALSE; - - r = ((glFrameZoomSGIX = (PFNGLFRAMEZOOMSGIXPROC)glewGetProcAddress((const GLubyte*)"glFrameZoomSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_framezoom */ - -#ifdef GL_SGIX_igloo_interface - -static GLboolean _glewInit_GL_SGIX_igloo_interface () -{ - GLboolean r = GL_FALSE; - - r = ((glIglooInterfaceSGIX = (PFNGLIGLOOINTERFACESGIXPROC)glewGetProcAddress((const GLubyte*)"glIglooInterfaceSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_igloo_interface */ - -#ifdef GL_SGIX_mpeg1 - -static GLboolean _glewInit_GL_SGIX_mpeg1 () -{ - GLboolean r = GL_FALSE; - - r = ((glAllocMPEGPredictorsSGIX = (PFNGLALLOCMPEGPREDICTORSSGIXPROC)glewGetProcAddress((const GLubyte*)"glAllocMPEGPredictorsSGIX")) == NULL) || r; - r = ((glDeleteMPEGPredictorsSGIX = (PFNGLDELETEMPEGPREDICTORSSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeleteMPEGPredictorsSGIX")) == NULL) || r; - r = ((glGenMPEGPredictorsSGIX = (PFNGLGENMPEGPREDICTORSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGenMPEGPredictorsSGIX")) == NULL) || r; - r = ((glGetMPEGParameterfvSGIX = (PFNGLGETMPEGPARAMETERFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetMPEGParameterfvSGIX")) == NULL) || r; - r = ((glGetMPEGParameterivSGIX = (PFNGLGETMPEGPARAMETERIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetMPEGParameterivSGIX")) == NULL) || r; - r = ((glGetMPEGPredictorSGIX = (PFNGLGETMPEGPREDICTORSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetMPEGPredictorSGIX")) == NULL) || r; - r = ((glGetMPEGQuantTableubv = (PFNGLGETMPEGQUANTTABLEUBVPROC)glewGetProcAddress((const GLubyte*)"glGetMPEGQuantTableubv")) == NULL) || r; - r = ((glIsMPEGPredictorSGIX = (PFNGLISMPEGPREDICTORSGIXPROC)glewGetProcAddress((const GLubyte*)"glIsMPEGPredictorSGIX")) == NULL) || r; - r = ((glMPEGPredictorSGIX = (PFNGLMPEGPREDICTORSGIXPROC)glewGetProcAddress((const GLubyte*)"glMPEGPredictorSGIX")) == NULL) || r; - r = ((glMPEGQuantTableubv = (PFNGLMPEGQUANTTABLEUBVPROC)glewGetProcAddress((const GLubyte*)"glMPEGQuantTableubv")) == NULL) || r; - r = ((glSwapMPEGPredictorsSGIX = (PFNGLSWAPMPEGPREDICTORSSGIXPROC)glewGetProcAddress((const GLubyte*)"glSwapMPEGPredictorsSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_mpeg1 */ - -#ifdef GL_SGIX_nonlinear_lighting_pervertex - -static GLboolean _glewInit_GL_SGIX_nonlinear_lighting_pervertex () -{ - GLboolean r = GL_FALSE; - - r = ((glGetNonlinLightfvSGIX = (PFNGLGETNONLINLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetNonlinLightfvSGIX")) == NULL) || r; - r = ((glGetNonlinMaterialfvSGIX = (PFNGLGETNONLINMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetNonlinMaterialfvSGIX")) == NULL) || r; - r = ((glNonlinLightfvSGIX = (PFNGLNONLINLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glNonlinLightfvSGIX")) == NULL) || r; - r = ((glNonlinMaterialfvSGIX = (PFNGLNONLINMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glNonlinMaterialfvSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_nonlinear_lighting_pervertex */ - -#ifdef GL_SGIX_pixel_texture - -static GLboolean _glewInit_GL_SGIX_pixel_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glPixelTexGenSGIX = (PFNGLPIXELTEXGENSGIXPROC)glewGetProcAddress((const GLubyte*)"glPixelTexGenSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_pixel_texture */ - -#ifdef GL_SGIX_polynomial_ffd - -static GLboolean _glewInit_GL_SGIX_polynomial_ffd () -{ - GLboolean r = GL_FALSE; - - r = ((glDeformSGIX = (PFNGLDEFORMSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeformSGIX")) == NULL) || r; - r = ((glLoadIdentityDeformationMapSGIX = (PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC)glewGetProcAddress((const GLubyte*)"glLoadIdentityDeformationMapSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_polynomial_ffd */ - -#ifdef GL_SGIX_quad_mesh - -static GLboolean _glewInit_GL_SGIX_quad_mesh () -{ - GLboolean r = GL_FALSE; - - r = ((glMeshBreadthSGIX = (PFNGLMESHBREADTHSGIXPROC)glewGetProcAddress((const GLubyte*)"glMeshBreadthSGIX")) == NULL) || r; - r = ((glMeshStrideSGIX = (PFNGLMESHSTRIDESGIXPROC)glewGetProcAddress((const GLubyte*)"glMeshStrideSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_quad_mesh */ - -#ifdef GL_SGIX_reference_plane - -static GLboolean _glewInit_GL_SGIX_reference_plane () -{ - GLboolean r = GL_FALSE; - - r = ((glReferencePlaneSGIX = (PFNGLREFERENCEPLANESGIXPROC)glewGetProcAddress((const GLubyte*)"glReferencePlaneSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_reference_plane */ - -#ifdef GL_SGIX_sprite - -static GLboolean _glewInit_GL_SGIX_sprite () -{ - GLboolean r = GL_FALSE; - - r = ((glSpriteParameterfSGIX = (PFNGLSPRITEPARAMETERFSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfSGIX")) == NULL) || r; - r = ((glSpriteParameterfvSGIX = (PFNGLSPRITEPARAMETERFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfvSGIX")) == NULL) || r; - r = ((glSpriteParameteriSGIX = (PFNGLSPRITEPARAMETERISGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameteriSGIX")) == NULL) || r; - r = ((glSpriteParameterivSGIX = (PFNGLSPRITEPARAMETERIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterivSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_sprite */ - -#ifdef GL_SGIX_tag_sample_buffer - -static GLboolean _glewInit_GL_SGIX_tag_sample_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((glTagSampleBufferSGIX = (PFNGLTAGSAMPLEBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glTagSampleBufferSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_tag_sample_buffer */ - -#ifdef GL_SGIX_vector_ops - -static GLboolean _glewInit_GL_SGIX_vector_ops () -{ - GLboolean r = GL_FALSE; - - r = ((glGetVectorOperationSGIX = (PFNGLGETVECTOROPERATIONSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetVectorOperationSGIX")) == NULL) || r; - r = ((glVectorOperationSGIX = (PFNGLVECTOROPERATIONSGIXPROC)glewGetProcAddress((const GLubyte*)"glVectorOperationSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_vector_ops */ - -#ifdef GL_SGIX_vertex_array_object - -static GLboolean _glewInit_GL_SGIX_vertex_array_object () -{ - GLboolean r = GL_FALSE; - - r = ((glAreVertexArraysResidentSGIX = (PFNGLAREVERTEXARRAYSRESIDENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glAreVertexArraysResidentSGIX")) == NULL) || r; - r = ((glBindVertexArraySGIX = (PFNGLBINDVERTEXARRAYSGIXPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArraySGIX")) == NULL) || r; - r = ((glDeleteVertexArraysSGIX = (PFNGLDELETEVERTEXARRAYSSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArraysSGIX")) == NULL) || r; - r = ((glGenVertexArraysSGIX = (PFNGLGENVERTEXARRAYSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArraysSGIX")) == NULL) || r; - r = ((glIsVertexArraySGIX = (PFNGLISVERTEXARRAYSGIXPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArraySGIX")) == NULL) || r; - r = ((glPrioritizeVertexArraysSGIX = (PFNGLPRIORITIZEVERTEXARRAYSSGIXPROC)glewGetProcAddress((const GLubyte*)"glPrioritizeVertexArraysSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_vertex_array_object */ - -#ifdef GL_SGI_color_table - -static GLboolean _glewInit_GL_SGI_color_table () -{ - GLboolean r = GL_FALSE; - - r = ((glColorTableParameterfvSGI = (PFNGLCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfvSGI")) == NULL) || r; - r = ((glColorTableParameterivSGI = (PFNGLCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterivSGI")) == NULL) || r; - r = ((glColorTableSGI = (PFNGLCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableSGI")) == NULL) || r; - r = ((glCopyColorTableSGI = (PFNGLCOPYCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTableSGI")) == NULL) || r; - r = ((glGetColorTableParameterfvSGI = (PFNGLGETCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvSGI")) == NULL) || r; - r = ((glGetColorTableParameterivSGI = (PFNGLGETCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivSGI")) == NULL) || r; - r = ((glGetColorTableSGI = (PFNGLGETCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableSGI")) == NULL) || r; - - return r; -} - -#endif /* GL_SGI_color_table */ - -#ifdef GL_SGI_fft - -static GLboolean _glewInit_GL_SGI_fft () -{ - GLboolean r = GL_FALSE; - - r = ((glGetPixelTransformParameterfvSGI = (PFNGLGETPIXELTRANSFORMPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterfvSGI")) == NULL) || r; - r = ((glGetPixelTransformParameterivSGI = (PFNGLGETPIXELTRANSFORMPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterivSGI")) == NULL) || r; - r = ((glPixelTransformParameterfSGI = (PFNGLPIXELTRANSFORMPARAMETERFSGIPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfSGI")) == NULL) || r; - r = ((glPixelTransformParameterfvSGI = (PFNGLPIXELTRANSFORMPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfvSGI")) == NULL) || r; - r = ((glPixelTransformParameteriSGI = (PFNGLPIXELTRANSFORMPARAMETERISGIPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameteriSGI")) == NULL) || r; - r = ((glPixelTransformParameterivSGI = (PFNGLPIXELTRANSFORMPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterivSGI")) == NULL) || r; - r = ((glPixelTransformSGI = (PFNGLPIXELTRANSFORMSGIPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformSGI")) == NULL) || r; - - return r; -} - -#endif /* GL_SGI_fft */ - -#ifdef GL_SUNX_constant_data - -static GLboolean _glewInit_GL_SUNX_constant_data () -{ - GLboolean r = GL_FALSE; - - r = ((glFinishTextureSUNX = (PFNGLFINISHTEXTURESUNXPROC)glewGetProcAddress((const GLubyte*)"glFinishTextureSUNX")) == NULL) || r; - - return r; -} - -#endif /* GL_SUNX_constant_data */ - -#ifdef GL_SUN_global_alpha - -static GLboolean _glewInit_GL_SUN_global_alpha () -{ - GLboolean r = GL_FALSE; - - r = ((glGlobalAlphaFactorbSUN = (PFNGLGLOBALALPHAFACTORBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorbSUN")) == NULL) || r; - r = ((glGlobalAlphaFactordSUN = (PFNGLGLOBALALPHAFACTORDSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactordSUN")) == NULL) || r; - r = ((glGlobalAlphaFactorfSUN = (PFNGLGLOBALALPHAFACTORFSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorfSUN")) == NULL) || r; - r = ((glGlobalAlphaFactoriSUN = (PFNGLGLOBALALPHAFACTORISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoriSUN")) == NULL) || r; - r = ((glGlobalAlphaFactorsSUN = (PFNGLGLOBALALPHAFACTORSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorsSUN")) == NULL) || r; - r = ((glGlobalAlphaFactorubSUN = (PFNGLGLOBALALPHAFACTORUBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorubSUN")) == NULL) || r; - r = ((glGlobalAlphaFactoruiSUN = (PFNGLGLOBALALPHAFACTORUISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoruiSUN")) == NULL) || r; - r = ((glGlobalAlphaFactorusSUN = (PFNGLGLOBALALPHAFACTORUSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorusSUN")) == NULL) || r; - - return r; -} - -#endif /* GL_SUN_global_alpha */ - -#ifdef GL_SUN_read_video_pixels - -static GLboolean _glewInit_GL_SUN_read_video_pixels () -{ - GLboolean r = GL_FALSE; - - r = ((glReadVideoPixelsSUN = (PFNGLREADVIDEOPIXELSSUNPROC)glewGetProcAddress((const GLubyte*)"glReadVideoPixelsSUN")) == NULL) || r; - - return r; -} - -#endif /* GL_SUN_read_video_pixels */ - -#ifdef GL_SUN_triangle_list - -static GLboolean _glewInit_GL_SUN_triangle_list () -{ - GLboolean r = GL_FALSE; - - r = ((glReplacementCodePointerSUN = (PFNGLREPLACEMENTCODEPOINTERSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodePointerSUN")) == NULL) || r; - r = ((glReplacementCodeubSUN = (PFNGLREPLACEMENTCODEUBSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubSUN")) == NULL) || r; - r = ((glReplacementCodeubvSUN = (PFNGLREPLACEMENTCODEUBVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubvSUN")) == NULL) || r; - r = ((glReplacementCodeuiSUN = (PFNGLREPLACEMENTCODEUISUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiSUN")) == NULL) || r; - r = ((glReplacementCodeuivSUN = (PFNGLREPLACEMENTCODEUIVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuivSUN")) == NULL) || r; - r = ((glReplacementCodeusSUN = (PFNGLREPLACEMENTCODEUSSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusSUN")) == NULL) || r; - r = ((glReplacementCodeusvSUN = (PFNGLREPLACEMENTCODEUSVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusvSUN")) == NULL) || r; - - return r; -} - -#endif /* GL_SUN_triangle_list */ - -#ifdef GL_SUN_vertex - -static GLboolean _glewInit_GL_SUN_vertex () -{ - GLboolean r = GL_FALSE; - - r = ((glColor3fVertex3fSUN = (PFNGLCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fSUN")) == NULL) || r; - r = ((glColor3fVertex3fvSUN = (PFNGLCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fvSUN")) == NULL) || r; - r = ((glColor4fNormal3fVertex3fSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glColor4fNormal3fVertex3fvSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glColor4ubVertex2fSUN = (PFNGLCOLOR4UBVERTEX2FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fSUN")) == NULL) || r; - r = ((glColor4ubVertex2fvSUN = (PFNGLCOLOR4UBVERTEX2FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fvSUN")) == NULL) || r; - r = ((glColor4ubVertex3fSUN = (PFNGLCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fSUN")) == NULL) || r; - r = ((glColor4ubVertex3fvSUN = (PFNGLCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fvSUN")) == NULL) || r; - r = ((glNormal3fVertex3fSUN = (PFNGLNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fSUN")) == NULL) || r; - r = ((glNormal3fVertex3fvSUN = (PFNGLNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor4ubVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor4ubVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiVertex3fSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiVertex3fvSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord2fColor3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fSUN")) == NULL) || r; - r = ((glTexCoord2fColor3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord2fColor4ubVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fSUN")) == NULL) || r; - r = ((glTexCoord2fColor4ubVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord2fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glTexCoord2fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord2fVertex3fSUN = (PFNGLTEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fSUN")) == NULL) || r; - r = ((glTexCoord2fVertex3fvSUN = (PFNGLTEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord4fColor4fNormal3fVertex4fSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fSUN")) == NULL) || r; - r = ((glTexCoord4fColor4fNormal3fVertex4fvSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fvSUN")) == NULL) || r; - r = ((glTexCoord4fVertex4fSUN = (PFNGLTEXCOORD4FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fSUN")) == NULL) || r; - r = ((glTexCoord4fVertex4fvSUN = (PFNGLTEXCOORD4FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fvSUN")) == NULL) || r; - - return r; -} - -#endif /* GL_SUN_vertex */ - -#ifdef GL_WIN_swap_hint - -static GLboolean _glewInit_GL_WIN_swap_hint () -{ - GLboolean r = GL_FALSE; - - r = ((glAddSwapHintRectWIN = (PFNGLADDSWAPHINTRECTWINPROC)glewGetProcAddress((const GLubyte*)"glAddSwapHintRectWIN")) == NULL) || r; - - return r; -} - -#endif /* GL_WIN_swap_hint */ - -/* ------------------------------------------------------------------------- */ - -static int _glewExtensionCompare(const char *s1, const char *s2) -{ - /* http://www.chanduthedev.com/2012/07/strcmp-implementation-in-c.html */ - while (*s1 || *s2) - { - if (*s1 > *s2) - return 1; - if (*s1 < *s2) - return -1; - s1++; - s2++; - } - return 0; -} - -static ptrdiff_t _glewBsearchExtension(const char* name) -{ - ptrdiff_t lo = 0, hi = sizeof(_glewExtensionLookup) / sizeof(char*) - 2; - - while (lo <= hi) - { - ptrdiff_t mid = (lo + hi) / 2; - const int cmp = _glewExtensionCompare(name, _glewExtensionLookup[mid]); - if (cmp < 0) hi = mid - 1; - else if (cmp > 0) lo = mid + 1; - else return mid; - } - return -1; -} - -static GLboolean *_glewGetExtensionString(const char *name) -{ - ptrdiff_t n = _glewBsearchExtension(name); - if (n >= 0) return &_glewExtensionString[n]; - return NULL; -} - -static GLboolean *_glewGetExtensionEnable(const char *name) -{ - ptrdiff_t n = _glewBsearchExtension(name); - if (n >= 0) return _glewExtensionEnabled[n]; - return NULL; -} - -static const char *_glewNextSpace(const char *i) -{ - const char *j = i; - if (j) - while (*j!=' ' && *j) ++j; - return j; -} - -static const char *_glewNextNonSpace(const char *i) -{ - const char *j = i; - if (j) - while (*j==' ') ++j; - return j; -} - -GLboolean GLEWAPIENTRY glewGetExtension (const char* name) -{ - GLboolean *enable = _glewGetExtensionString(name); - if (enable) - return *enable; - return GL_FALSE; -} - -/* ------------------------------------------------------------------------- */ - -typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGPROC) (GLenum name); -typedef void (GLAPIENTRY * PFNGLGETINTEGERVPROC) (GLenum pname, GLint *params); - -GLenum GLEWAPIENTRY glewContextInit () -{ - PFNGLGETSTRINGPROC getString; - const GLubyte* s; - GLuint dot; - GLint major, minor; - size_t n; - - #ifdef _WIN32 - getString = glGetString; - #else - getString = (PFNGLGETSTRINGPROC) glewGetProcAddress((const GLubyte*)"glGetString"); - if (!getString) - return GLEW_ERROR_NO_GL_VERSION; - #endif - - /* query opengl version */ - s = getString(GL_VERSION); - dot = _glewStrCLen(s, '.'); - if (dot == 0) - return GLEW_ERROR_NO_GL_VERSION; - - major = s[dot-1]-'0'; - minor = s[dot+1]-'0'; - - if (minor < 0 || minor > 9) - minor = 0; - if (major<0 || major>9) - return GLEW_ERROR_NO_GL_VERSION; - - if (major == 1 && minor == 0) - { - return GLEW_ERROR_GL_VERSION_10_ONLY; - } - else - { - GLEW_VERSION_4_6 = ( major > 4 ) || ( major == 4 && minor >= 6 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_4_5 = GLEW_VERSION_4_4 == GL_TRUE || ( major == 4 && minor >= 5 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_4_4 = GLEW_VERSION_4_5 == GL_TRUE || ( major == 4 && minor >= 4 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_4_3 = GLEW_VERSION_4_4 == GL_TRUE || ( major == 4 && minor >= 3 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_4_2 = GLEW_VERSION_4_3 == GL_TRUE || ( major == 4 && minor >= 2 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_4_1 = GLEW_VERSION_4_2 == GL_TRUE || ( major == 4 && minor >= 1 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_4_0 = GLEW_VERSION_4_1 == GL_TRUE || ( major == 4 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_3_3 = GLEW_VERSION_4_0 == GL_TRUE || ( major == 3 && minor >= 3 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_3_2 = GLEW_VERSION_3_3 == GL_TRUE || ( major == 3 && minor >= 2 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_3_1 = GLEW_VERSION_3_2 == GL_TRUE || ( major == 3 && minor >= 1 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_3_0 = GLEW_VERSION_3_1 == GL_TRUE || ( major == 3 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_2_1 = GLEW_VERSION_3_0 == GL_TRUE || ( major == 2 && minor >= 1 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_2_0 = GLEW_VERSION_2_1 == GL_TRUE || ( major == 2 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_1_5 = GLEW_VERSION_2_0 == GL_TRUE || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_1_4 = GLEW_VERSION_1_5 == GL_TRUE || ( major == 1 && minor >= 4 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_1_3 = GLEW_VERSION_1_4 == GL_TRUE || ( major == 1 && minor >= 3 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_1_2_1 = GLEW_VERSION_1_3 == GL_TRUE ? GL_TRUE : GL_FALSE; - GLEW_VERSION_1_2 = GLEW_VERSION_1_2_1 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE; - GLEW_VERSION_1_1 = GLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE; - } - - for (n = 0; n < sizeof(_glewExtensionString) / sizeof(_glewExtensionString[0]); ++n) - _glewExtensionString[n] = GL_FALSE; - - if (GLEW_VERSION_3_0) - { - GLint n = 0; - GLint i; - PFNGLGETINTEGERVPROC getIntegerv; - PFNGLGETSTRINGIPROC getStringi; - const char *ext; - GLboolean *enable; - - #ifdef _WIN32 - getIntegerv = glGetIntegerv; - #else - getIntegerv = (PFNGLGETINTEGERVPROC) glewGetProcAddress((const GLubyte*)"glGetIntegerv"); - #endif - - if (getIntegerv) - getIntegerv(GL_NUM_EXTENSIONS, &n); - - /* glGetStringi is OpenGL 3.0 */ - getStringi = (PFNGLGETSTRINGIPROC) glewGetProcAddress((const GLubyte*)"glGetStringi"); - if (getStringi) - for (i = 0; i= (ptrdiff_t) sizeof(ext)) - continue; - _glewStrCopy(ext, i, ' '); - - /* Based on extension string(s), glewGetExtension purposes */ - enable = _glewGetExtensionString(ext); - if (enable) - *enable = GL_TRUE; - - /* Based on extension string(s), experimental mode, glewIsSupported purposes */ - enable = _glewGetExtensionEnable(ext); - if (enable) - *enable = GL_TRUE; - } - } - } -#ifdef GL_VERSION_1_2 - if (glewExperimental || GLEW_VERSION_1_2) GLEW_VERSION_1_2 = !_glewInit_GL_VERSION_1_2(); -#endif /* GL_VERSION_1_2 */ -#ifdef GL_VERSION_1_3 - if (glewExperimental || GLEW_VERSION_1_3) GLEW_VERSION_1_3 = !_glewInit_GL_VERSION_1_3(); -#endif /* GL_VERSION_1_3 */ -#ifdef GL_VERSION_1_4 - if (glewExperimental || GLEW_VERSION_1_4) GLEW_VERSION_1_4 = !_glewInit_GL_VERSION_1_4(); -#endif /* GL_VERSION_1_4 */ -#ifdef GL_VERSION_1_5 - if (glewExperimental || GLEW_VERSION_1_5) GLEW_VERSION_1_5 = !_glewInit_GL_VERSION_1_5(); -#endif /* GL_VERSION_1_5 */ -#ifdef GL_VERSION_2_0 - if (glewExperimental || GLEW_VERSION_2_0) GLEW_VERSION_2_0 = !_glewInit_GL_VERSION_2_0(); -#endif /* GL_VERSION_2_0 */ -#ifdef GL_VERSION_2_1 - if (glewExperimental || GLEW_VERSION_2_1) GLEW_VERSION_2_1 = !_glewInit_GL_VERSION_2_1(); -#endif /* GL_VERSION_2_1 */ -#ifdef GL_VERSION_3_0 - if (glewExperimental || GLEW_VERSION_3_0) GLEW_VERSION_3_0 = !_glewInit_GL_VERSION_3_0(); -#endif /* GL_VERSION_3_0 */ -#ifdef GL_VERSION_3_1 - if (glewExperimental || GLEW_VERSION_3_1) GLEW_VERSION_3_1 = !_glewInit_GL_VERSION_3_1(); -#endif /* GL_VERSION_3_1 */ -#ifdef GL_VERSION_3_2 - if (glewExperimental || GLEW_VERSION_3_2) GLEW_VERSION_3_2 = !_glewInit_GL_VERSION_3_2(); -#endif /* GL_VERSION_3_2 */ -#ifdef GL_VERSION_3_3 - if (glewExperimental || GLEW_VERSION_3_3) GLEW_VERSION_3_3 = !_glewInit_GL_VERSION_3_3(); -#endif /* GL_VERSION_3_3 */ -#ifdef GL_VERSION_4_0 - if (glewExperimental || GLEW_VERSION_4_0) GLEW_VERSION_4_0 = !_glewInit_GL_VERSION_4_0(); -#endif /* GL_VERSION_4_0 */ -#ifdef GL_VERSION_4_5 - if (glewExperimental || GLEW_VERSION_4_5) GLEW_VERSION_4_5 = !_glewInit_GL_VERSION_4_5(); -#endif /* GL_VERSION_4_5 */ -#ifdef GL_VERSION_4_6 - if (glewExperimental || GLEW_VERSION_4_6) GLEW_VERSION_4_6 = !_glewInit_GL_VERSION_4_6(); -#endif /* GL_VERSION_4_6 */ -#ifdef GL_3DFX_tbuffer - if (glewExperimental || GLEW_3DFX_tbuffer) GLEW_3DFX_tbuffer = !_glewInit_GL_3DFX_tbuffer(); -#endif /* GL_3DFX_tbuffer */ -#ifdef GL_AMD_debug_output - if (glewExperimental || GLEW_AMD_debug_output) GLEW_AMD_debug_output = !_glewInit_GL_AMD_debug_output(); -#endif /* GL_AMD_debug_output */ -#ifdef GL_AMD_draw_buffers_blend - if (glewExperimental || GLEW_AMD_draw_buffers_blend) GLEW_AMD_draw_buffers_blend = !_glewInit_GL_AMD_draw_buffers_blend(); -#endif /* GL_AMD_draw_buffers_blend */ -#ifdef GL_AMD_framebuffer_sample_positions - if (glewExperimental || GLEW_AMD_framebuffer_sample_positions) GLEW_AMD_framebuffer_sample_positions = !_glewInit_GL_AMD_framebuffer_sample_positions(); -#endif /* GL_AMD_framebuffer_sample_positions */ -#ifdef GL_AMD_interleaved_elements - if (glewExperimental || GLEW_AMD_interleaved_elements) GLEW_AMD_interleaved_elements = !_glewInit_GL_AMD_interleaved_elements(); -#endif /* GL_AMD_interleaved_elements */ -#ifdef GL_AMD_multi_draw_indirect - if (glewExperimental || GLEW_AMD_multi_draw_indirect) GLEW_AMD_multi_draw_indirect = !_glewInit_GL_AMD_multi_draw_indirect(); -#endif /* GL_AMD_multi_draw_indirect */ -#ifdef GL_AMD_name_gen_delete - if (glewExperimental || GLEW_AMD_name_gen_delete) GLEW_AMD_name_gen_delete = !_glewInit_GL_AMD_name_gen_delete(); -#endif /* GL_AMD_name_gen_delete */ -#ifdef GL_AMD_occlusion_query_event - if (glewExperimental || GLEW_AMD_occlusion_query_event) GLEW_AMD_occlusion_query_event = !_glewInit_GL_AMD_occlusion_query_event(); -#endif /* GL_AMD_occlusion_query_event */ -#ifdef GL_AMD_performance_monitor - if (glewExperimental || GLEW_AMD_performance_monitor) GLEW_AMD_performance_monitor = !_glewInit_GL_AMD_performance_monitor(); -#endif /* GL_AMD_performance_monitor */ -#ifdef GL_AMD_sample_positions - if (glewExperimental || GLEW_AMD_sample_positions) GLEW_AMD_sample_positions = !_glewInit_GL_AMD_sample_positions(); -#endif /* GL_AMD_sample_positions */ -#ifdef GL_AMD_sparse_texture - if (glewExperimental || GLEW_AMD_sparse_texture) GLEW_AMD_sparse_texture = !_glewInit_GL_AMD_sparse_texture(); -#endif /* GL_AMD_sparse_texture */ -#ifdef GL_AMD_stencil_operation_extended - if (glewExperimental || GLEW_AMD_stencil_operation_extended) GLEW_AMD_stencil_operation_extended = !_glewInit_GL_AMD_stencil_operation_extended(); -#endif /* GL_AMD_stencil_operation_extended */ -#ifdef GL_AMD_vertex_shader_tessellator - if (glewExperimental || GLEW_AMD_vertex_shader_tessellator) GLEW_AMD_vertex_shader_tessellator = !_glewInit_GL_AMD_vertex_shader_tessellator(); -#endif /* GL_AMD_vertex_shader_tessellator */ -#ifdef GL_ANGLE_framebuffer_blit - if (glewExperimental || GLEW_ANGLE_framebuffer_blit) GLEW_ANGLE_framebuffer_blit = !_glewInit_GL_ANGLE_framebuffer_blit(); -#endif /* GL_ANGLE_framebuffer_blit */ -#ifdef GL_ANGLE_framebuffer_multisample - if (glewExperimental || GLEW_ANGLE_framebuffer_multisample) GLEW_ANGLE_framebuffer_multisample = !_glewInit_GL_ANGLE_framebuffer_multisample(); -#endif /* GL_ANGLE_framebuffer_multisample */ -#ifdef GL_ANGLE_instanced_arrays - if (glewExperimental || GLEW_ANGLE_instanced_arrays) GLEW_ANGLE_instanced_arrays = !_glewInit_GL_ANGLE_instanced_arrays(); -#endif /* GL_ANGLE_instanced_arrays */ -#ifdef GL_ANGLE_timer_query - if (glewExperimental || GLEW_ANGLE_timer_query) GLEW_ANGLE_timer_query = !_glewInit_GL_ANGLE_timer_query(); -#endif /* GL_ANGLE_timer_query */ -#ifdef GL_ANGLE_translated_shader_source - if (glewExperimental || GLEW_ANGLE_translated_shader_source) GLEW_ANGLE_translated_shader_source = !_glewInit_GL_ANGLE_translated_shader_source(); -#endif /* GL_ANGLE_translated_shader_source */ -#ifdef GL_APPLE_copy_texture_levels - if (glewExperimental || GLEW_APPLE_copy_texture_levels) GLEW_APPLE_copy_texture_levels = !_glewInit_GL_APPLE_copy_texture_levels(); -#endif /* GL_APPLE_copy_texture_levels */ -#ifdef GL_APPLE_element_array - if (glewExperimental || GLEW_APPLE_element_array) GLEW_APPLE_element_array = !_glewInit_GL_APPLE_element_array(); -#endif /* GL_APPLE_element_array */ -#ifdef GL_APPLE_fence - if (glewExperimental || GLEW_APPLE_fence) GLEW_APPLE_fence = !_glewInit_GL_APPLE_fence(); -#endif /* GL_APPLE_fence */ -#ifdef GL_APPLE_flush_buffer_range - if (glewExperimental || GLEW_APPLE_flush_buffer_range) GLEW_APPLE_flush_buffer_range = !_glewInit_GL_APPLE_flush_buffer_range(); -#endif /* GL_APPLE_flush_buffer_range */ -#ifdef GL_APPLE_framebuffer_multisample - if (glewExperimental || GLEW_APPLE_framebuffer_multisample) GLEW_APPLE_framebuffer_multisample = !_glewInit_GL_APPLE_framebuffer_multisample(); -#endif /* GL_APPLE_framebuffer_multisample */ -#ifdef GL_APPLE_object_purgeable - if (glewExperimental || GLEW_APPLE_object_purgeable) GLEW_APPLE_object_purgeable = !_glewInit_GL_APPLE_object_purgeable(); -#endif /* GL_APPLE_object_purgeable */ -#ifdef GL_APPLE_sync - if (glewExperimental || GLEW_APPLE_sync) GLEW_APPLE_sync = !_glewInit_GL_APPLE_sync(); -#endif /* GL_APPLE_sync */ -#ifdef GL_APPLE_texture_range - if (glewExperimental || GLEW_APPLE_texture_range) GLEW_APPLE_texture_range = !_glewInit_GL_APPLE_texture_range(); -#endif /* GL_APPLE_texture_range */ -#ifdef GL_APPLE_vertex_array_object - if (glewExperimental || GLEW_APPLE_vertex_array_object) GLEW_APPLE_vertex_array_object = !_glewInit_GL_APPLE_vertex_array_object(); -#endif /* GL_APPLE_vertex_array_object */ -#ifdef GL_APPLE_vertex_array_range - if (glewExperimental || GLEW_APPLE_vertex_array_range) GLEW_APPLE_vertex_array_range = !_glewInit_GL_APPLE_vertex_array_range(); -#endif /* GL_APPLE_vertex_array_range */ -#ifdef GL_APPLE_vertex_program_evaluators - if (glewExperimental || GLEW_APPLE_vertex_program_evaluators) GLEW_APPLE_vertex_program_evaluators = !_glewInit_GL_APPLE_vertex_program_evaluators(); -#endif /* GL_APPLE_vertex_program_evaluators */ -#ifdef GL_ARB_ES2_compatibility - if (glewExperimental || GLEW_ARB_ES2_compatibility) GLEW_ARB_ES2_compatibility = !_glewInit_GL_ARB_ES2_compatibility(); -#endif /* GL_ARB_ES2_compatibility */ -#ifdef GL_ARB_ES3_1_compatibility - if (glewExperimental || GLEW_ARB_ES3_1_compatibility) GLEW_ARB_ES3_1_compatibility = !_glewInit_GL_ARB_ES3_1_compatibility(); -#endif /* GL_ARB_ES3_1_compatibility */ -#ifdef GL_ARB_ES3_2_compatibility - if (glewExperimental || GLEW_ARB_ES3_2_compatibility) GLEW_ARB_ES3_2_compatibility = !_glewInit_GL_ARB_ES3_2_compatibility(); -#endif /* GL_ARB_ES3_2_compatibility */ -#ifdef GL_ARB_base_instance - if (glewExperimental || GLEW_ARB_base_instance) GLEW_ARB_base_instance = !_glewInit_GL_ARB_base_instance(); -#endif /* GL_ARB_base_instance */ -#ifdef GL_ARB_bindless_texture - if (glewExperimental || GLEW_ARB_bindless_texture) GLEW_ARB_bindless_texture = !_glewInit_GL_ARB_bindless_texture(); -#endif /* GL_ARB_bindless_texture */ -#ifdef GL_ARB_blend_func_extended - if (glewExperimental || GLEW_ARB_blend_func_extended) GLEW_ARB_blend_func_extended = !_glewInit_GL_ARB_blend_func_extended(); -#endif /* GL_ARB_blend_func_extended */ -#ifdef GL_ARB_buffer_storage - if (glewExperimental || GLEW_ARB_buffer_storage) GLEW_ARB_buffer_storage = !_glewInit_GL_ARB_buffer_storage(); -#endif /* GL_ARB_buffer_storage */ -#ifdef GL_ARB_cl_event - if (glewExperimental || GLEW_ARB_cl_event) GLEW_ARB_cl_event = !_glewInit_GL_ARB_cl_event(); -#endif /* GL_ARB_cl_event */ -#ifdef GL_ARB_clear_buffer_object - if (glewExperimental || GLEW_ARB_clear_buffer_object) GLEW_ARB_clear_buffer_object = !_glewInit_GL_ARB_clear_buffer_object(); -#endif /* GL_ARB_clear_buffer_object */ -#ifdef GL_ARB_clear_texture - if (glewExperimental || GLEW_ARB_clear_texture) GLEW_ARB_clear_texture = !_glewInit_GL_ARB_clear_texture(); -#endif /* GL_ARB_clear_texture */ -#ifdef GL_ARB_clip_control - if (glewExperimental || GLEW_ARB_clip_control) GLEW_ARB_clip_control = !_glewInit_GL_ARB_clip_control(); -#endif /* GL_ARB_clip_control */ -#ifdef GL_ARB_color_buffer_float - if (glewExperimental || GLEW_ARB_color_buffer_float) GLEW_ARB_color_buffer_float = !_glewInit_GL_ARB_color_buffer_float(); -#endif /* GL_ARB_color_buffer_float */ -#ifdef GL_ARB_compute_shader - if (glewExperimental || GLEW_ARB_compute_shader) GLEW_ARB_compute_shader = !_glewInit_GL_ARB_compute_shader(); -#endif /* GL_ARB_compute_shader */ -#ifdef GL_ARB_compute_variable_group_size - if (glewExperimental || GLEW_ARB_compute_variable_group_size) GLEW_ARB_compute_variable_group_size = !_glewInit_GL_ARB_compute_variable_group_size(); -#endif /* GL_ARB_compute_variable_group_size */ -#ifdef GL_ARB_copy_buffer - if (glewExperimental || GLEW_ARB_copy_buffer) GLEW_ARB_copy_buffer = !_glewInit_GL_ARB_copy_buffer(); -#endif /* GL_ARB_copy_buffer */ -#ifdef GL_ARB_copy_image - if (glewExperimental || GLEW_ARB_copy_image) GLEW_ARB_copy_image = !_glewInit_GL_ARB_copy_image(); -#endif /* GL_ARB_copy_image */ -#ifdef GL_ARB_debug_output - if (glewExperimental || GLEW_ARB_debug_output) GLEW_ARB_debug_output = !_glewInit_GL_ARB_debug_output(); -#endif /* GL_ARB_debug_output */ -#ifdef GL_ARB_direct_state_access - if (glewExperimental || GLEW_ARB_direct_state_access) GLEW_ARB_direct_state_access = !_glewInit_GL_ARB_direct_state_access(); -#endif /* GL_ARB_direct_state_access */ -#ifdef GL_ARB_draw_buffers - if (glewExperimental || GLEW_ARB_draw_buffers) GLEW_ARB_draw_buffers = !_glewInit_GL_ARB_draw_buffers(); -#endif /* GL_ARB_draw_buffers */ -#ifdef GL_ARB_draw_buffers_blend - if (glewExperimental || GLEW_ARB_draw_buffers_blend) GLEW_ARB_draw_buffers_blend = !_glewInit_GL_ARB_draw_buffers_blend(); -#endif /* GL_ARB_draw_buffers_blend */ -#ifdef GL_ARB_draw_elements_base_vertex - if (glewExperimental || GLEW_ARB_draw_elements_base_vertex) GLEW_ARB_draw_elements_base_vertex = !_glewInit_GL_ARB_draw_elements_base_vertex(); -#endif /* GL_ARB_draw_elements_base_vertex */ -#ifdef GL_ARB_draw_indirect - if (glewExperimental || GLEW_ARB_draw_indirect) GLEW_ARB_draw_indirect = !_glewInit_GL_ARB_draw_indirect(); -#endif /* GL_ARB_draw_indirect */ -#ifdef GL_ARB_framebuffer_no_attachments - if (glewExperimental || GLEW_ARB_framebuffer_no_attachments) GLEW_ARB_framebuffer_no_attachments = !_glewInit_GL_ARB_framebuffer_no_attachments(); -#endif /* GL_ARB_framebuffer_no_attachments */ -#ifdef GL_ARB_framebuffer_object - if (glewExperimental || GLEW_ARB_framebuffer_object) GLEW_ARB_framebuffer_object = !_glewInit_GL_ARB_framebuffer_object(); -#endif /* GL_ARB_framebuffer_object */ -#ifdef GL_ARB_geometry_shader4 - if (glewExperimental || GLEW_ARB_geometry_shader4) GLEW_ARB_geometry_shader4 = !_glewInit_GL_ARB_geometry_shader4(); -#endif /* GL_ARB_geometry_shader4 */ -#ifdef GL_ARB_get_program_binary - if (glewExperimental || GLEW_ARB_get_program_binary) GLEW_ARB_get_program_binary = !_glewInit_GL_ARB_get_program_binary(); -#endif /* GL_ARB_get_program_binary */ -#ifdef GL_ARB_get_texture_sub_image - if (glewExperimental || GLEW_ARB_get_texture_sub_image) GLEW_ARB_get_texture_sub_image = !_glewInit_GL_ARB_get_texture_sub_image(); -#endif /* GL_ARB_get_texture_sub_image */ -#ifdef GL_ARB_gl_spirv - if (glewExperimental || GLEW_ARB_gl_spirv) GLEW_ARB_gl_spirv = !_glewInit_GL_ARB_gl_spirv(); -#endif /* GL_ARB_gl_spirv */ -#ifdef GL_ARB_gpu_shader_fp64 - if (glewExperimental || GLEW_ARB_gpu_shader_fp64) GLEW_ARB_gpu_shader_fp64 = !_glewInit_GL_ARB_gpu_shader_fp64(); -#endif /* GL_ARB_gpu_shader_fp64 */ -#ifdef GL_ARB_gpu_shader_int64 - if (glewExperimental || GLEW_ARB_gpu_shader_int64) GLEW_ARB_gpu_shader_int64 = !_glewInit_GL_ARB_gpu_shader_int64(); -#endif /* GL_ARB_gpu_shader_int64 */ -#ifdef GL_ARB_imaging - if (glewExperimental || GLEW_ARB_imaging) GLEW_ARB_imaging = !_glewInit_GL_ARB_imaging(); -#endif /* GL_ARB_imaging */ -#ifdef GL_ARB_indirect_parameters - if (glewExperimental || GLEW_ARB_indirect_parameters) GLEW_ARB_indirect_parameters = !_glewInit_GL_ARB_indirect_parameters(); -#endif /* GL_ARB_indirect_parameters */ -#ifdef GL_ARB_instanced_arrays - if (glewExperimental || GLEW_ARB_instanced_arrays) GLEW_ARB_instanced_arrays = !_glewInit_GL_ARB_instanced_arrays(); -#endif /* GL_ARB_instanced_arrays */ -#ifdef GL_ARB_internalformat_query - if (glewExperimental || GLEW_ARB_internalformat_query) GLEW_ARB_internalformat_query = !_glewInit_GL_ARB_internalformat_query(); -#endif /* GL_ARB_internalformat_query */ -#ifdef GL_ARB_internalformat_query2 - if (glewExperimental || GLEW_ARB_internalformat_query2) GLEW_ARB_internalformat_query2 = !_glewInit_GL_ARB_internalformat_query2(); -#endif /* GL_ARB_internalformat_query2 */ -#ifdef GL_ARB_invalidate_subdata - if (glewExperimental || GLEW_ARB_invalidate_subdata) GLEW_ARB_invalidate_subdata = !_glewInit_GL_ARB_invalidate_subdata(); -#endif /* GL_ARB_invalidate_subdata */ -#ifdef GL_ARB_map_buffer_range - if (glewExperimental || GLEW_ARB_map_buffer_range) GLEW_ARB_map_buffer_range = !_glewInit_GL_ARB_map_buffer_range(); -#endif /* GL_ARB_map_buffer_range */ -#ifdef GL_ARB_matrix_palette - if (glewExperimental || GLEW_ARB_matrix_palette) GLEW_ARB_matrix_palette = !_glewInit_GL_ARB_matrix_palette(); -#endif /* GL_ARB_matrix_palette */ -#ifdef GL_ARB_multi_bind - if (glewExperimental || GLEW_ARB_multi_bind) GLEW_ARB_multi_bind = !_glewInit_GL_ARB_multi_bind(); -#endif /* GL_ARB_multi_bind */ -#ifdef GL_ARB_multi_draw_indirect - if (glewExperimental || GLEW_ARB_multi_draw_indirect) GLEW_ARB_multi_draw_indirect = !_glewInit_GL_ARB_multi_draw_indirect(); -#endif /* GL_ARB_multi_draw_indirect */ -#ifdef GL_ARB_multisample - if (glewExperimental || GLEW_ARB_multisample) GLEW_ARB_multisample = !_glewInit_GL_ARB_multisample(); -#endif /* GL_ARB_multisample */ -#ifdef GL_ARB_multitexture - if (glewExperimental || GLEW_ARB_multitexture) GLEW_ARB_multitexture = !_glewInit_GL_ARB_multitexture(); -#endif /* GL_ARB_multitexture */ -#ifdef GL_ARB_occlusion_query - if (glewExperimental || GLEW_ARB_occlusion_query) GLEW_ARB_occlusion_query = !_glewInit_GL_ARB_occlusion_query(); -#endif /* GL_ARB_occlusion_query */ -#ifdef GL_ARB_parallel_shader_compile - if (glewExperimental || GLEW_ARB_parallel_shader_compile) GLEW_ARB_parallel_shader_compile = !_glewInit_GL_ARB_parallel_shader_compile(); -#endif /* GL_ARB_parallel_shader_compile */ -#ifdef GL_ARB_point_parameters - if (glewExperimental || GLEW_ARB_point_parameters) GLEW_ARB_point_parameters = !_glewInit_GL_ARB_point_parameters(); -#endif /* GL_ARB_point_parameters */ -#ifdef GL_ARB_polygon_offset_clamp - if (glewExperimental || GLEW_ARB_polygon_offset_clamp) GLEW_ARB_polygon_offset_clamp = !_glewInit_GL_ARB_polygon_offset_clamp(); -#endif /* GL_ARB_polygon_offset_clamp */ -#ifdef GL_ARB_program_interface_query - if (glewExperimental || GLEW_ARB_program_interface_query) GLEW_ARB_program_interface_query = !_glewInit_GL_ARB_program_interface_query(); -#endif /* GL_ARB_program_interface_query */ -#ifdef GL_ARB_provoking_vertex - if (glewExperimental || GLEW_ARB_provoking_vertex) GLEW_ARB_provoking_vertex = !_glewInit_GL_ARB_provoking_vertex(); -#endif /* GL_ARB_provoking_vertex */ -#ifdef GL_ARB_robustness - if (glewExperimental || GLEW_ARB_robustness) GLEW_ARB_robustness = !_glewInit_GL_ARB_robustness(); -#endif /* GL_ARB_robustness */ -#ifdef GL_ARB_sample_locations - if (glewExperimental || GLEW_ARB_sample_locations) GLEW_ARB_sample_locations = !_glewInit_GL_ARB_sample_locations(); -#endif /* GL_ARB_sample_locations */ -#ifdef GL_ARB_sample_shading - if (glewExperimental || GLEW_ARB_sample_shading) GLEW_ARB_sample_shading = !_glewInit_GL_ARB_sample_shading(); -#endif /* GL_ARB_sample_shading */ -#ifdef GL_ARB_sampler_objects - if (glewExperimental || GLEW_ARB_sampler_objects) GLEW_ARB_sampler_objects = !_glewInit_GL_ARB_sampler_objects(); -#endif /* GL_ARB_sampler_objects */ -#ifdef GL_ARB_separate_shader_objects - if (glewExperimental || GLEW_ARB_separate_shader_objects) GLEW_ARB_separate_shader_objects = !_glewInit_GL_ARB_separate_shader_objects(); -#endif /* GL_ARB_separate_shader_objects */ -#ifdef GL_ARB_shader_atomic_counters - if (glewExperimental || GLEW_ARB_shader_atomic_counters) GLEW_ARB_shader_atomic_counters = !_glewInit_GL_ARB_shader_atomic_counters(); -#endif /* GL_ARB_shader_atomic_counters */ -#ifdef GL_ARB_shader_image_load_store - if (glewExperimental || GLEW_ARB_shader_image_load_store) GLEW_ARB_shader_image_load_store = !_glewInit_GL_ARB_shader_image_load_store(); -#endif /* GL_ARB_shader_image_load_store */ -#ifdef GL_ARB_shader_objects - if (glewExperimental || GLEW_ARB_shader_objects) GLEW_ARB_shader_objects = !_glewInit_GL_ARB_shader_objects(); -#endif /* GL_ARB_shader_objects */ -#ifdef GL_ARB_shader_storage_buffer_object - if (glewExperimental || GLEW_ARB_shader_storage_buffer_object) GLEW_ARB_shader_storage_buffer_object = !_glewInit_GL_ARB_shader_storage_buffer_object(); -#endif /* GL_ARB_shader_storage_buffer_object */ -#ifdef GL_ARB_shader_subroutine - if (glewExperimental || GLEW_ARB_shader_subroutine) GLEW_ARB_shader_subroutine = !_glewInit_GL_ARB_shader_subroutine(); -#endif /* GL_ARB_shader_subroutine */ -#ifdef GL_ARB_shading_language_include - if (glewExperimental || GLEW_ARB_shading_language_include) GLEW_ARB_shading_language_include = !_glewInit_GL_ARB_shading_language_include(); -#endif /* GL_ARB_shading_language_include */ -#ifdef GL_ARB_sparse_buffer - if (glewExperimental || GLEW_ARB_sparse_buffer) GLEW_ARB_sparse_buffer = !_glewInit_GL_ARB_sparse_buffer(); -#endif /* GL_ARB_sparse_buffer */ -#ifdef GL_ARB_sparse_texture - if (glewExperimental || GLEW_ARB_sparse_texture) GLEW_ARB_sparse_texture = !_glewInit_GL_ARB_sparse_texture(); -#endif /* GL_ARB_sparse_texture */ -#ifdef GL_ARB_sync - if (glewExperimental || GLEW_ARB_sync) GLEW_ARB_sync = !_glewInit_GL_ARB_sync(); -#endif /* GL_ARB_sync */ -#ifdef GL_ARB_tessellation_shader - if (glewExperimental || GLEW_ARB_tessellation_shader) GLEW_ARB_tessellation_shader = !_glewInit_GL_ARB_tessellation_shader(); -#endif /* GL_ARB_tessellation_shader */ -#ifdef GL_ARB_texture_barrier - if (glewExperimental || GLEW_ARB_texture_barrier) GLEW_ARB_texture_barrier = !_glewInit_GL_ARB_texture_barrier(); -#endif /* GL_ARB_texture_barrier */ -#ifdef GL_ARB_texture_buffer_object - if (glewExperimental || GLEW_ARB_texture_buffer_object) GLEW_ARB_texture_buffer_object = !_glewInit_GL_ARB_texture_buffer_object(); -#endif /* GL_ARB_texture_buffer_object */ -#ifdef GL_ARB_texture_buffer_range - if (glewExperimental || GLEW_ARB_texture_buffer_range) GLEW_ARB_texture_buffer_range = !_glewInit_GL_ARB_texture_buffer_range(); -#endif /* GL_ARB_texture_buffer_range */ -#ifdef GL_ARB_texture_compression - if (glewExperimental || GLEW_ARB_texture_compression) GLEW_ARB_texture_compression = !_glewInit_GL_ARB_texture_compression(); -#endif /* GL_ARB_texture_compression */ -#ifdef GL_ARB_texture_multisample - if (glewExperimental || GLEW_ARB_texture_multisample) GLEW_ARB_texture_multisample = !_glewInit_GL_ARB_texture_multisample(); -#endif /* GL_ARB_texture_multisample */ -#ifdef GL_ARB_texture_storage - if (glewExperimental || GLEW_ARB_texture_storage) GLEW_ARB_texture_storage = !_glewInit_GL_ARB_texture_storage(); -#endif /* GL_ARB_texture_storage */ -#ifdef GL_ARB_texture_storage_multisample - if (glewExperimental || GLEW_ARB_texture_storage_multisample) GLEW_ARB_texture_storage_multisample = !_glewInit_GL_ARB_texture_storage_multisample(); -#endif /* GL_ARB_texture_storage_multisample */ -#ifdef GL_ARB_texture_view - if (glewExperimental || GLEW_ARB_texture_view) GLEW_ARB_texture_view = !_glewInit_GL_ARB_texture_view(); -#endif /* GL_ARB_texture_view */ -#ifdef GL_ARB_timer_query - if (glewExperimental || GLEW_ARB_timer_query) GLEW_ARB_timer_query = !_glewInit_GL_ARB_timer_query(); -#endif /* GL_ARB_timer_query */ -#ifdef GL_ARB_transform_feedback2 - if (glewExperimental || GLEW_ARB_transform_feedback2) GLEW_ARB_transform_feedback2 = !_glewInit_GL_ARB_transform_feedback2(); -#endif /* GL_ARB_transform_feedback2 */ -#ifdef GL_ARB_transform_feedback3 - if (glewExperimental || GLEW_ARB_transform_feedback3) GLEW_ARB_transform_feedback3 = !_glewInit_GL_ARB_transform_feedback3(); -#endif /* GL_ARB_transform_feedback3 */ -#ifdef GL_ARB_transform_feedback_instanced - if (glewExperimental || GLEW_ARB_transform_feedback_instanced) GLEW_ARB_transform_feedback_instanced = !_glewInit_GL_ARB_transform_feedback_instanced(); -#endif /* GL_ARB_transform_feedback_instanced */ -#ifdef GL_ARB_transpose_matrix - if (glewExperimental || GLEW_ARB_transpose_matrix) GLEW_ARB_transpose_matrix = !_glewInit_GL_ARB_transpose_matrix(); -#endif /* GL_ARB_transpose_matrix */ -#ifdef GL_ARB_uniform_buffer_object - if (glewExperimental || GLEW_ARB_uniform_buffer_object) GLEW_ARB_uniform_buffer_object = !_glewInit_GL_ARB_uniform_buffer_object(); -#endif /* GL_ARB_uniform_buffer_object */ -#ifdef GL_ARB_vertex_array_object - if (glewExperimental || GLEW_ARB_vertex_array_object) GLEW_ARB_vertex_array_object = !_glewInit_GL_ARB_vertex_array_object(); -#endif /* GL_ARB_vertex_array_object */ -#ifdef GL_ARB_vertex_attrib_64bit - if (glewExperimental || GLEW_ARB_vertex_attrib_64bit) GLEW_ARB_vertex_attrib_64bit = !_glewInit_GL_ARB_vertex_attrib_64bit(); -#endif /* GL_ARB_vertex_attrib_64bit */ -#ifdef GL_ARB_vertex_attrib_binding - if (glewExperimental || GLEW_ARB_vertex_attrib_binding) GLEW_ARB_vertex_attrib_binding = !_glewInit_GL_ARB_vertex_attrib_binding(); -#endif /* GL_ARB_vertex_attrib_binding */ -#ifdef GL_ARB_vertex_blend - if (glewExperimental || GLEW_ARB_vertex_blend) GLEW_ARB_vertex_blend = !_glewInit_GL_ARB_vertex_blend(); -#endif /* GL_ARB_vertex_blend */ -#ifdef GL_ARB_vertex_buffer_object - if (glewExperimental || GLEW_ARB_vertex_buffer_object) GLEW_ARB_vertex_buffer_object = !_glewInit_GL_ARB_vertex_buffer_object(); -#endif /* GL_ARB_vertex_buffer_object */ -#ifdef GL_ARB_vertex_program - if (glewExperimental || GLEW_ARB_vertex_program) GLEW_ARB_vertex_program = !_glewInit_GL_ARB_vertex_program(); -#endif /* GL_ARB_vertex_program */ -#ifdef GL_ARB_vertex_shader - if (glewExperimental || GLEW_ARB_vertex_shader) { GLEW_ARB_vertex_shader = !_glewInit_GL_ARB_vertex_shader(); _glewInit_GL_ARB_vertex_program(); } -#endif /* GL_ARB_vertex_shader */ -#ifdef GL_ARB_vertex_type_2_10_10_10_rev - if (glewExperimental || GLEW_ARB_vertex_type_2_10_10_10_rev) GLEW_ARB_vertex_type_2_10_10_10_rev = !_glewInit_GL_ARB_vertex_type_2_10_10_10_rev(); -#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ -#ifdef GL_ARB_viewport_array - if (glewExperimental || GLEW_ARB_viewport_array) GLEW_ARB_viewport_array = !_glewInit_GL_ARB_viewport_array(); -#endif /* GL_ARB_viewport_array */ -#ifdef GL_ARB_window_pos - if (glewExperimental || GLEW_ARB_window_pos) GLEW_ARB_window_pos = !_glewInit_GL_ARB_window_pos(); -#endif /* GL_ARB_window_pos */ -#ifdef GL_ATI_draw_buffers - if (glewExperimental || GLEW_ATI_draw_buffers) GLEW_ATI_draw_buffers = !_glewInit_GL_ATI_draw_buffers(); -#endif /* GL_ATI_draw_buffers */ -#ifdef GL_ATI_element_array - if (glewExperimental || GLEW_ATI_element_array) GLEW_ATI_element_array = !_glewInit_GL_ATI_element_array(); -#endif /* GL_ATI_element_array */ -#ifdef GL_ATI_envmap_bumpmap - if (glewExperimental || GLEW_ATI_envmap_bumpmap) GLEW_ATI_envmap_bumpmap = !_glewInit_GL_ATI_envmap_bumpmap(); -#endif /* GL_ATI_envmap_bumpmap */ -#ifdef GL_ATI_fragment_shader - if (glewExperimental || GLEW_ATI_fragment_shader) GLEW_ATI_fragment_shader = !_glewInit_GL_ATI_fragment_shader(); -#endif /* GL_ATI_fragment_shader */ -#ifdef GL_ATI_map_object_buffer - if (glewExperimental || GLEW_ATI_map_object_buffer) GLEW_ATI_map_object_buffer = !_glewInit_GL_ATI_map_object_buffer(); -#endif /* GL_ATI_map_object_buffer */ -#ifdef GL_ATI_pn_triangles - if (glewExperimental || GLEW_ATI_pn_triangles) GLEW_ATI_pn_triangles = !_glewInit_GL_ATI_pn_triangles(); -#endif /* GL_ATI_pn_triangles */ -#ifdef GL_ATI_separate_stencil - if (glewExperimental || GLEW_ATI_separate_stencil) GLEW_ATI_separate_stencil = !_glewInit_GL_ATI_separate_stencil(); -#endif /* GL_ATI_separate_stencil */ -#ifdef GL_ATI_vertex_array_object - if (glewExperimental || GLEW_ATI_vertex_array_object) GLEW_ATI_vertex_array_object = !_glewInit_GL_ATI_vertex_array_object(); -#endif /* GL_ATI_vertex_array_object */ -#ifdef GL_ATI_vertex_attrib_array_object - if (glewExperimental || GLEW_ATI_vertex_attrib_array_object) GLEW_ATI_vertex_attrib_array_object = !_glewInit_GL_ATI_vertex_attrib_array_object(); -#endif /* GL_ATI_vertex_attrib_array_object */ -#ifdef GL_ATI_vertex_streams - if (glewExperimental || GLEW_ATI_vertex_streams) GLEW_ATI_vertex_streams = !_glewInit_GL_ATI_vertex_streams(); -#endif /* GL_ATI_vertex_streams */ -#ifdef GL_EXT_base_instance - if (glewExperimental || GLEW_EXT_base_instance) GLEW_EXT_base_instance = !_glewInit_GL_EXT_base_instance(); -#endif /* GL_EXT_base_instance */ -#ifdef GL_EXT_bindable_uniform - if (glewExperimental || GLEW_EXT_bindable_uniform) GLEW_EXT_bindable_uniform = !_glewInit_GL_EXT_bindable_uniform(); -#endif /* GL_EXT_bindable_uniform */ -#ifdef GL_EXT_blend_color - if (glewExperimental || GLEW_EXT_blend_color) GLEW_EXT_blend_color = !_glewInit_GL_EXT_blend_color(); -#endif /* GL_EXT_blend_color */ -#ifdef GL_EXT_blend_equation_separate - if (glewExperimental || GLEW_EXT_blend_equation_separate) GLEW_EXT_blend_equation_separate = !_glewInit_GL_EXT_blend_equation_separate(); -#endif /* GL_EXT_blend_equation_separate */ -#ifdef GL_EXT_blend_func_extended - if (glewExperimental || GLEW_EXT_blend_func_extended) GLEW_EXT_blend_func_extended = !_glewInit_GL_EXT_blend_func_extended(); -#endif /* GL_EXT_blend_func_extended */ -#ifdef GL_EXT_blend_func_separate - if (glewExperimental || GLEW_EXT_blend_func_separate) GLEW_EXT_blend_func_separate = !_glewInit_GL_EXT_blend_func_separate(); -#endif /* GL_EXT_blend_func_separate */ -#ifdef GL_EXT_blend_minmax - if (glewExperimental || GLEW_EXT_blend_minmax) GLEW_EXT_blend_minmax = !_glewInit_GL_EXT_blend_minmax(); -#endif /* GL_EXT_blend_minmax */ -#ifdef GL_EXT_buffer_storage - if (glewExperimental || GLEW_EXT_buffer_storage) GLEW_EXT_buffer_storage = !_glewInit_GL_EXT_buffer_storage(); -#endif /* GL_EXT_buffer_storage */ -#ifdef GL_EXT_clear_texture - if (glewExperimental || GLEW_EXT_clear_texture) GLEW_EXT_clear_texture = !_glewInit_GL_EXT_clear_texture(); -#endif /* GL_EXT_clear_texture */ -#ifdef GL_EXT_color_subtable - if (glewExperimental || GLEW_EXT_color_subtable) GLEW_EXT_color_subtable = !_glewInit_GL_EXT_color_subtable(); -#endif /* GL_EXT_color_subtable */ -#ifdef GL_EXT_compiled_vertex_array - if (glewExperimental || GLEW_EXT_compiled_vertex_array) GLEW_EXT_compiled_vertex_array = !_glewInit_GL_EXT_compiled_vertex_array(); -#endif /* GL_EXT_compiled_vertex_array */ -#ifdef GL_EXT_convolution - if (glewExperimental || GLEW_EXT_convolution) GLEW_EXT_convolution = !_glewInit_GL_EXT_convolution(); -#endif /* GL_EXT_convolution */ -#ifdef GL_EXT_coordinate_frame - if (glewExperimental || GLEW_EXT_coordinate_frame) GLEW_EXT_coordinate_frame = !_glewInit_GL_EXT_coordinate_frame(); -#endif /* GL_EXT_coordinate_frame */ -#ifdef GL_EXT_copy_image - if (glewExperimental || GLEW_EXT_copy_image) GLEW_EXT_copy_image = !_glewInit_GL_EXT_copy_image(); -#endif /* GL_EXT_copy_image */ -#ifdef GL_EXT_copy_texture - if (glewExperimental || GLEW_EXT_copy_texture) GLEW_EXT_copy_texture = !_glewInit_GL_EXT_copy_texture(); -#endif /* GL_EXT_copy_texture */ -#ifdef GL_EXT_cull_vertex - if (glewExperimental || GLEW_EXT_cull_vertex) GLEW_EXT_cull_vertex = !_glewInit_GL_EXT_cull_vertex(); -#endif /* GL_EXT_cull_vertex */ -#ifdef GL_EXT_debug_label - if (glewExperimental || GLEW_EXT_debug_label) GLEW_EXT_debug_label = !_glewInit_GL_EXT_debug_label(); -#endif /* GL_EXT_debug_label */ -#ifdef GL_EXT_debug_marker - if (glewExperimental || GLEW_EXT_debug_marker) GLEW_EXT_debug_marker = !_glewInit_GL_EXT_debug_marker(); -#endif /* GL_EXT_debug_marker */ -#ifdef GL_EXT_depth_bounds_test - if (glewExperimental || GLEW_EXT_depth_bounds_test) GLEW_EXT_depth_bounds_test = !_glewInit_GL_EXT_depth_bounds_test(); -#endif /* GL_EXT_depth_bounds_test */ -#ifdef GL_EXT_direct_state_access - if (glewExperimental || GLEW_EXT_direct_state_access) GLEW_EXT_direct_state_access = !_glewInit_GL_EXT_direct_state_access(); -#endif /* GL_EXT_direct_state_access */ -#ifdef GL_EXT_discard_framebuffer - if (glewExperimental || GLEW_EXT_discard_framebuffer) GLEW_EXT_discard_framebuffer = !_glewInit_GL_EXT_discard_framebuffer(); -#endif /* GL_EXT_discard_framebuffer */ -#ifdef GL_EXT_draw_buffers - if (glewExperimental || GLEW_EXT_draw_buffers) GLEW_EXT_draw_buffers = !_glewInit_GL_EXT_draw_buffers(); -#endif /* GL_EXT_draw_buffers */ -#ifdef GL_EXT_draw_buffers2 - if (glewExperimental || GLEW_EXT_draw_buffers2) GLEW_EXT_draw_buffers2 = !_glewInit_GL_EXT_draw_buffers2(); -#endif /* GL_EXT_draw_buffers2 */ -#ifdef GL_EXT_draw_buffers_indexed - if (glewExperimental || GLEW_EXT_draw_buffers_indexed) GLEW_EXT_draw_buffers_indexed = !_glewInit_GL_EXT_draw_buffers_indexed(); -#endif /* GL_EXT_draw_buffers_indexed */ -#ifdef GL_EXT_draw_elements_base_vertex - if (glewExperimental || GLEW_EXT_draw_elements_base_vertex) GLEW_EXT_draw_elements_base_vertex = !_glewInit_GL_EXT_draw_elements_base_vertex(); -#endif /* GL_EXT_draw_elements_base_vertex */ -#ifdef GL_EXT_draw_instanced - if (glewExperimental || GLEW_EXT_draw_instanced) GLEW_EXT_draw_instanced = !_glewInit_GL_EXT_draw_instanced(); -#endif /* GL_EXT_draw_instanced */ -#ifdef GL_EXT_draw_range_elements - if (glewExperimental || GLEW_EXT_draw_range_elements) GLEW_EXT_draw_range_elements = !_glewInit_GL_EXT_draw_range_elements(); -#endif /* GL_EXT_draw_range_elements */ -#ifdef GL_EXT_external_buffer - if (glewExperimental || GLEW_EXT_external_buffer) GLEW_EXT_external_buffer = !_glewInit_GL_EXT_external_buffer(); -#endif /* GL_EXT_external_buffer */ -#ifdef GL_EXT_fog_coord - if (glewExperimental || GLEW_EXT_fog_coord) GLEW_EXT_fog_coord = !_glewInit_GL_EXT_fog_coord(); -#endif /* GL_EXT_fog_coord */ -#ifdef GL_EXT_fragment_lighting - if (glewExperimental || GLEW_EXT_fragment_lighting) GLEW_EXT_fragment_lighting = !_glewInit_GL_EXT_fragment_lighting(); -#endif /* GL_EXT_fragment_lighting */ -#ifdef GL_EXT_framebuffer_blit - if (glewExperimental || GLEW_EXT_framebuffer_blit) GLEW_EXT_framebuffer_blit = !_glewInit_GL_EXT_framebuffer_blit(); -#endif /* GL_EXT_framebuffer_blit */ -#ifdef GL_EXT_framebuffer_multisample - if (glewExperimental || GLEW_EXT_framebuffer_multisample) GLEW_EXT_framebuffer_multisample = !_glewInit_GL_EXT_framebuffer_multisample(); -#endif /* GL_EXT_framebuffer_multisample */ -#ifdef GL_EXT_framebuffer_object - if (glewExperimental || GLEW_EXT_framebuffer_object) GLEW_EXT_framebuffer_object = !_glewInit_GL_EXT_framebuffer_object(); -#endif /* GL_EXT_framebuffer_object */ -#ifdef GL_EXT_geometry_shader4 - if (glewExperimental || GLEW_EXT_geometry_shader4) GLEW_EXT_geometry_shader4 = !_glewInit_GL_EXT_geometry_shader4(); -#endif /* GL_EXT_geometry_shader4 */ -#ifdef GL_EXT_gpu_program_parameters - if (glewExperimental || GLEW_EXT_gpu_program_parameters) GLEW_EXT_gpu_program_parameters = !_glewInit_GL_EXT_gpu_program_parameters(); -#endif /* GL_EXT_gpu_program_parameters */ -#ifdef GL_EXT_gpu_shader4 - if (glewExperimental || GLEW_EXT_gpu_shader4) GLEW_EXT_gpu_shader4 = !_glewInit_GL_EXT_gpu_shader4(); -#endif /* GL_EXT_gpu_shader4 */ -#ifdef GL_EXT_histogram - if (glewExperimental || GLEW_EXT_histogram) GLEW_EXT_histogram = !_glewInit_GL_EXT_histogram(); -#endif /* GL_EXT_histogram */ -#ifdef GL_EXT_index_func - if (glewExperimental || GLEW_EXT_index_func) GLEW_EXT_index_func = !_glewInit_GL_EXT_index_func(); -#endif /* GL_EXT_index_func */ -#ifdef GL_EXT_index_material - if (glewExperimental || GLEW_EXT_index_material) GLEW_EXT_index_material = !_glewInit_GL_EXT_index_material(); -#endif /* GL_EXT_index_material */ -#ifdef GL_EXT_instanced_arrays - if (glewExperimental || GLEW_EXT_instanced_arrays) GLEW_EXT_instanced_arrays = !_glewInit_GL_EXT_instanced_arrays(); -#endif /* GL_EXT_instanced_arrays */ -#ifdef GL_EXT_light_texture - if (glewExperimental || GLEW_EXT_light_texture) GLEW_EXT_light_texture = !_glewInit_GL_EXT_light_texture(); -#endif /* GL_EXT_light_texture */ -#ifdef GL_EXT_map_buffer_range - if (glewExperimental || GLEW_EXT_map_buffer_range) GLEW_EXT_map_buffer_range = !_glewInit_GL_EXT_map_buffer_range(); -#endif /* GL_EXT_map_buffer_range */ -#ifdef GL_EXT_memory_object - if (glewExperimental || GLEW_EXT_memory_object) GLEW_EXT_memory_object = !_glewInit_GL_EXT_memory_object(); -#endif /* GL_EXT_memory_object */ -#ifdef GL_EXT_memory_object_fd - if (glewExperimental || GLEW_EXT_memory_object_fd) GLEW_EXT_memory_object_fd = !_glewInit_GL_EXT_memory_object_fd(); -#endif /* GL_EXT_memory_object_fd */ -#ifdef GL_EXT_memory_object_win32 - if (glewExperimental || GLEW_EXT_memory_object_win32) GLEW_EXT_memory_object_win32 = !_glewInit_GL_EXT_memory_object_win32(); -#endif /* GL_EXT_memory_object_win32 */ -#ifdef GL_EXT_multi_draw_arrays - if (glewExperimental || GLEW_EXT_multi_draw_arrays) GLEW_EXT_multi_draw_arrays = !_glewInit_GL_EXT_multi_draw_arrays(); -#endif /* GL_EXT_multi_draw_arrays */ -#ifdef GL_EXT_multi_draw_indirect - if (glewExperimental || GLEW_EXT_multi_draw_indirect) GLEW_EXT_multi_draw_indirect = !_glewInit_GL_EXT_multi_draw_indirect(); -#endif /* GL_EXT_multi_draw_indirect */ -#ifdef GL_EXT_multisample - if (glewExperimental || GLEW_EXT_multisample) GLEW_EXT_multisample = !_glewInit_GL_EXT_multisample(); -#endif /* GL_EXT_multisample */ -#ifdef GL_EXT_multisampled_render_to_texture - if (glewExperimental || GLEW_EXT_multisampled_render_to_texture) GLEW_EXT_multisampled_render_to_texture = !_glewInit_GL_EXT_multisampled_render_to_texture(); -#endif /* GL_EXT_multisampled_render_to_texture */ -#ifdef GL_EXT_multiview_draw_buffers - if (glewExperimental || GLEW_EXT_multiview_draw_buffers) GLEW_EXT_multiview_draw_buffers = !_glewInit_GL_EXT_multiview_draw_buffers(); -#endif /* GL_EXT_multiview_draw_buffers */ -#ifdef GL_EXT_paletted_texture - if (glewExperimental || GLEW_EXT_paletted_texture) GLEW_EXT_paletted_texture = !_glewInit_GL_EXT_paletted_texture(); -#endif /* GL_EXT_paletted_texture */ -#ifdef GL_EXT_pixel_transform - if (glewExperimental || GLEW_EXT_pixel_transform) GLEW_EXT_pixel_transform = !_glewInit_GL_EXT_pixel_transform(); -#endif /* GL_EXT_pixel_transform */ -#ifdef GL_EXT_point_parameters - if (glewExperimental || GLEW_EXT_point_parameters) GLEW_EXT_point_parameters = !_glewInit_GL_EXT_point_parameters(); -#endif /* GL_EXT_point_parameters */ -#ifdef GL_EXT_polygon_offset - if (glewExperimental || GLEW_EXT_polygon_offset) GLEW_EXT_polygon_offset = !_glewInit_GL_EXT_polygon_offset(); -#endif /* GL_EXT_polygon_offset */ -#ifdef GL_EXT_polygon_offset_clamp - if (glewExperimental || GLEW_EXT_polygon_offset_clamp) GLEW_EXT_polygon_offset_clamp = !_glewInit_GL_EXT_polygon_offset_clamp(); -#endif /* GL_EXT_polygon_offset_clamp */ -#ifdef GL_EXT_provoking_vertex - if (glewExperimental || GLEW_EXT_provoking_vertex) GLEW_EXT_provoking_vertex = !_glewInit_GL_EXT_provoking_vertex(); -#endif /* GL_EXT_provoking_vertex */ -#ifdef GL_EXT_raster_multisample - if (glewExperimental || GLEW_EXT_raster_multisample) GLEW_EXT_raster_multisample = !_glewInit_GL_EXT_raster_multisample(); -#endif /* GL_EXT_raster_multisample */ -#ifdef GL_EXT_scene_marker - if (glewExperimental || GLEW_EXT_scene_marker) GLEW_EXT_scene_marker = !_glewInit_GL_EXT_scene_marker(); -#endif /* GL_EXT_scene_marker */ -#ifdef GL_EXT_secondary_color - if (glewExperimental || GLEW_EXT_secondary_color) GLEW_EXT_secondary_color = !_glewInit_GL_EXT_secondary_color(); -#endif /* GL_EXT_secondary_color */ -#ifdef GL_EXT_semaphore - if (glewExperimental || GLEW_EXT_semaphore) GLEW_EXT_semaphore = !_glewInit_GL_EXT_semaphore(); -#endif /* GL_EXT_semaphore */ -#ifdef GL_EXT_semaphore_fd - if (glewExperimental || GLEW_EXT_semaphore_fd) GLEW_EXT_semaphore_fd = !_glewInit_GL_EXT_semaphore_fd(); -#endif /* GL_EXT_semaphore_fd */ -#ifdef GL_EXT_semaphore_win32 - if (glewExperimental || GLEW_EXT_semaphore_win32) GLEW_EXT_semaphore_win32 = !_glewInit_GL_EXT_semaphore_win32(); -#endif /* GL_EXT_semaphore_win32 */ -#ifdef GL_EXT_separate_shader_objects - if (glewExperimental || GLEW_EXT_separate_shader_objects) GLEW_EXT_separate_shader_objects = !_glewInit_GL_EXT_separate_shader_objects(); -#endif /* GL_EXT_separate_shader_objects */ -#ifdef GL_EXT_shader_image_load_store - if (glewExperimental || GLEW_EXT_shader_image_load_store) GLEW_EXT_shader_image_load_store = !_glewInit_GL_EXT_shader_image_load_store(); -#endif /* GL_EXT_shader_image_load_store */ -#ifdef GL_EXT_shader_pixel_local_storage2 - if (glewExperimental || GLEW_EXT_shader_pixel_local_storage2) GLEW_EXT_shader_pixel_local_storage2 = !_glewInit_GL_EXT_shader_pixel_local_storage2(); -#endif /* GL_EXT_shader_pixel_local_storage2 */ -#ifdef GL_EXT_sparse_texture - if (glewExperimental || GLEW_EXT_sparse_texture) GLEW_EXT_sparse_texture = !_glewInit_GL_EXT_sparse_texture(); -#endif /* GL_EXT_sparse_texture */ -#ifdef GL_EXT_stencil_two_side - if (glewExperimental || GLEW_EXT_stencil_two_side) GLEW_EXT_stencil_two_side = !_glewInit_GL_EXT_stencil_two_side(); -#endif /* GL_EXT_stencil_two_side */ -#ifdef GL_EXT_subtexture - if (glewExperimental || GLEW_EXT_subtexture) GLEW_EXT_subtexture = !_glewInit_GL_EXT_subtexture(); -#endif /* GL_EXT_subtexture */ -#ifdef GL_EXT_texture3D - if (glewExperimental || GLEW_EXT_texture3D) GLEW_EXT_texture3D = !_glewInit_GL_EXT_texture3D(); -#endif /* GL_EXT_texture3D */ -#ifdef GL_EXT_texture_array - if (glewExperimental || GLEW_EXT_texture_array) GLEW_EXT_texture_array = !_glewInit_GL_EXT_texture_array(); -#endif /* GL_EXT_texture_array */ -#ifdef GL_EXT_texture_buffer_object - if (glewExperimental || GLEW_EXT_texture_buffer_object) GLEW_EXT_texture_buffer_object = !_glewInit_GL_EXT_texture_buffer_object(); -#endif /* GL_EXT_texture_buffer_object */ -#ifdef GL_EXT_texture_integer - if (glewExperimental || GLEW_EXT_texture_integer) GLEW_EXT_texture_integer = !_glewInit_GL_EXT_texture_integer(); -#endif /* GL_EXT_texture_integer */ -#ifdef GL_EXT_texture_object - if (glewExperimental || GLEW_EXT_texture_object) GLEW_EXT_texture_object = !_glewInit_GL_EXT_texture_object(); -#endif /* GL_EXT_texture_object */ -#ifdef GL_EXT_texture_perturb_normal - if (glewExperimental || GLEW_EXT_texture_perturb_normal) GLEW_EXT_texture_perturb_normal = !_glewInit_GL_EXT_texture_perturb_normal(); -#endif /* GL_EXT_texture_perturb_normal */ -#ifdef GL_EXT_texture_storage - if (glewExperimental || GLEW_EXT_texture_storage) GLEW_EXT_texture_storage = !_glewInit_GL_EXT_texture_storage(); -#endif /* GL_EXT_texture_storage */ -#ifdef GL_EXT_texture_view - if (glewExperimental || GLEW_EXT_texture_view) GLEW_EXT_texture_view = !_glewInit_GL_EXT_texture_view(); -#endif /* GL_EXT_texture_view */ -#ifdef GL_EXT_timer_query - if (glewExperimental || GLEW_EXT_timer_query) GLEW_EXT_timer_query = !_glewInit_GL_EXT_timer_query(); -#endif /* GL_EXT_timer_query */ -#ifdef GL_EXT_transform_feedback - if (glewExperimental || GLEW_EXT_transform_feedback) GLEW_EXT_transform_feedback = !_glewInit_GL_EXT_transform_feedback(); -#endif /* GL_EXT_transform_feedback */ -#ifdef GL_EXT_vertex_array - if (glewExperimental || GLEW_EXT_vertex_array) GLEW_EXT_vertex_array = !_glewInit_GL_EXT_vertex_array(); -#endif /* GL_EXT_vertex_array */ -#ifdef GL_EXT_vertex_array_setXXX - if (glewExperimental || GLEW_EXT_vertex_array_setXXX) GLEW_EXT_vertex_array_setXXX = !_glewInit_GL_EXT_vertex_array_setXXX(); -#endif /* GL_EXT_vertex_array_setXXX */ -#ifdef GL_EXT_vertex_attrib_64bit - if (glewExperimental || GLEW_EXT_vertex_attrib_64bit) GLEW_EXT_vertex_attrib_64bit = !_glewInit_GL_EXT_vertex_attrib_64bit(); -#endif /* GL_EXT_vertex_attrib_64bit */ -#ifdef GL_EXT_vertex_shader - if (glewExperimental || GLEW_EXT_vertex_shader) GLEW_EXT_vertex_shader = !_glewInit_GL_EXT_vertex_shader(); -#endif /* GL_EXT_vertex_shader */ -#ifdef GL_EXT_vertex_weighting - if (glewExperimental || GLEW_EXT_vertex_weighting) GLEW_EXT_vertex_weighting = !_glewInit_GL_EXT_vertex_weighting(); -#endif /* GL_EXT_vertex_weighting */ -#ifdef GL_EXT_win32_keyed_mutex - if (glewExperimental || GLEW_EXT_win32_keyed_mutex) GLEW_EXT_win32_keyed_mutex = !_glewInit_GL_EXT_win32_keyed_mutex(); -#endif /* GL_EXT_win32_keyed_mutex */ -#ifdef GL_EXT_window_rectangles - if (glewExperimental || GLEW_EXT_window_rectangles) GLEW_EXT_window_rectangles = !_glewInit_GL_EXT_window_rectangles(); -#endif /* GL_EXT_window_rectangles */ -#ifdef GL_EXT_x11_sync_object - if (glewExperimental || GLEW_EXT_x11_sync_object) GLEW_EXT_x11_sync_object = !_glewInit_GL_EXT_x11_sync_object(); -#endif /* GL_EXT_x11_sync_object */ -#ifdef GL_GREMEDY_frame_terminator - if (glewExperimental || GLEW_GREMEDY_frame_terminator) GLEW_GREMEDY_frame_terminator = !_glewInit_GL_GREMEDY_frame_terminator(); -#endif /* GL_GREMEDY_frame_terminator */ -#ifdef GL_GREMEDY_string_marker - if (glewExperimental || GLEW_GREMEDY_string_marker) GLEW_GREMEDY_string_marker = !_glewInit_GL_GREMEDY_string_marker(); -#endif /* GL_GREMEDY_string_marker */ -#ifdef GL_HP_image_transform - if (glewExperimental || GLEW_HP_image_transform) GLEW_HP_image_transform = !_glewInit_GL_HP_image_transform(); -#endif /* GL_HP_image_transform */ -#ifdef GL_IBM_multimode_draw_arrays - if (glewExperimental || GLEW_IBM_multimode_draw_arrays) GLEW_IBM_multimode_draw_arrays = !_glewInit_GL_IBM_multimode_draw_arrays(); -#endif /* GL_IBM_multimode_draw_arrays */ -#ifdef GL_IBM_vertex_array_lists - if (glewExperimental || GLEW_IBM_vertex_array_lists) GLEW_IBM_vertex_array_lists = !_glewInit_GL_IBM_vertex_array_lists(); -#endif /* GL_IBM_vertex_array_lists */ -#ifdef GL_INTEL_map_texture - if (glewExperimental || GLEW_INTEL_map_texture) GLEW_INTEL_map_texture = !_glewInit_GL_INTEL_map_texture(); -#endif /* GL_INTEL_map_texture */ -#ifdef GL_INTEL_parallel_arrays - if (glewExperimental || GLEW_INTEL_parallel_arrays) GLEW_INTEL_parallel_arrays = !_glewInit_GL_INTEL_parallel_arrays(); -#endif /* GL_INTEL_parallel_arrays */ -#ifdef GL_INTEL_performance_query - if (glewExperimental || GLEW_INTEL_performance_query) GLEW_INTEL_performance_query = !_glewInit_GL_INTEL_performance_query(); -#endif /* GL_INTEL_performance_query */ -#ifdef GL_INTEL_texture_scissor - if (glewExperimental || GLEW_INTEL_texture_scissor) GLEW_INTEL_texture_scissor = !_glewInit_GL_INTEL_texture_scissor(); -#endif /* GL_INTEL_texture_scissor */ -#ifdef GL_KHR_blend_equation_advanced - if (glewExperimental || GLEW_KHR_blend_equation_advanced) GLEW_KHR_blend_equation_advanced = !_glewInit_GL_KHR_blend_equation_advanced(); -#endif /* GL_KHR_blend_equation_advanced */ -#ifdef GL_KHR_debug - if (glewExperimental || GLEW_KHR_debug) GLEW_KHR_debug = !_glewInit_GL_KHR_debug(); -#endif /* GL_KHR_debug */ -#ifdef GL_KHR_parallel_shader_compile - if (glewExperimental || GLEW_KHR_parallel_shader_compile) GLEW_KHR_parallel_shader_compile = !_glewInit_GL_KHR_parallel_shader_compile(); -#endif /* GL_KHR_parallel_shader_compile */ -#ifdef GL_KHR_robustness - if (glewExperimental || GLEW_KHR_robustness) GLEW_KHR_robustness = !_glewInit_GL_KHR_robustness(); -#endif /* GL_KHR_robustness */ -#ifdef GL_KTX_buffer_region - if (glewExperimental || GLEW_KTX_buffer_region) GLEW_KTX_buffer_region = !_glewInit_GL_KTX_buffer_region(); -#endif /* GL_KTX_buffer_region */ -#ifdef GL_MESA_resize_buffers - if (glewExperimental || GLEW_MESA_resize_buffers) GLEW_MESA_resize_buffers = !_glewInit_GL_MESA_resize_buffers(); -#endif /* GL_MESA_resize_buffers */ -#ifdef GL_MESA_window_pos - if (glewExperimental || GLEW_MESA_window_pos) GLEW_MESA_window_pos = !_glewInit_GL_MESA_window_pos(); -#endif /* GL_MESA_window_pos */ -#ifdef GL_NVX_conditional_render - if (glewExperimental || GLEW_NVX_conditional_render) GLEW_NVX_conditional_render = !_glewInit_GL_NVX_conditional_render(); -#endif /* GL_NVX_conditional_render */ -#ifdef GL_NVX_linked_gpu_multicast - if (glewExperimental || GLEW_NVX_linked_gpu_multicast) GLEW_NVX_linked_gpu_multicast = !_glewInit_GL_NVX_linked_gpu_multicast(); -#endif /* GL_NVX_linked_gpu_multicast */ -#ifdef GL_NV_3dvision_settings - if (glewExperimental || GLEW_NV_3dvision_settings) GLEW_NV_3dvision_settings = !_glewInit_GL_NV_3dvision_settings(); -#endif /* GL_NV_3dvision_settings */ -#ifdef GL_NV_bindless_multi_draw_indirect - if (glewExperimental || GLEW_NV_bindless_multi_draw_indirect) GLEW_NV_bindless_multi_draw_indirect = !_glewInit_GL_NV_bindless_multi_draw_indirect(); -#endif /* GL_NV_bindless_multi_draw_indirect */ -#ifdef GL_NV_bindless_multi_draw_indirect_count - if (glewExperimental || GLEW_NV_bindless_multi_draw_indirect_count) GLEW_NV_bindless_multi_draw_indirect_count = !_glewInit_GL_NV_bindless_multi_draw_indirect_count(); -#endif /* GL_NV_bindless_multi_draw_indirect_count */ -#ifdef GL_NV_bindless_texture - if (glewExperimental || GLEW_NV_bindless_texture) GLEW_NV_bindless_texture = !_glewInit_GL_NV_bindless_texture(); -#endif /* GL_NV_bindless_texture */ -#ifdef GL_NV_blend_equation_advanced - if (glewExperimental || GLEW_NV_blend_equation_advanced) GLEW_NV_blend_equation_advanced = !_glewInit_GL_NV_blend_equation_advanced(); -#endif /* GL_NV_blend_equation_advanced */ -#ifdef GL_NV_clip_space_w_scaling - if (glewExperimental || GLEW_NV_clip_space_w_scaling) GLEW_NV_clip_space_w_scaling = !_glewInit_GL_NV_clip_space_w_scaling(); -#endif /* GL_NV_clip_space_w_scaling */ -#ifdef GL_NV_command_list - if (glewExperimental || GLEW_NV_command_list) GLEW_NV_command_list = !_glewInit_GL_NV_command_list(); -#endif /* GL_NV_command_list */ -#ifdef GL_NV_conditional_render - if (glewExperimental || GLEW_NV_conditional_render) GLEW_NV_conditional_render = !_glewInit_GL_NV_conditional_render(); -#endif /* GL_NV_conditional_render */ -#ifdef GL_NV_conservative_raster - if (glewExperimental || GLEW_NV_conservative_raster) GLEW_NV_conservative_raster = !_glewInit_GL_NV_conservative_raster(); -#endif /* GL_NV_conservative_raster */ -#ifdef GL_NV_conservative_raster_dilate - if (glewExperimental || GLEW_NV_conservative_raster_dilate) GLEW_NV_conservative_raster_dilate = !_glewInit_GL_NV_conservative_raster_dilate(); -#endif /* GL_NV_conservative_raster_dilate */ -#ifdef GL_NV_conservative_raster_pre_snap_triangles - if (glewExperimental || GLEW_NV_conservative_raster_pre_snap_triangles) GLEW_NV_conservative_raster_pre_snap_triangles = !_glewInit_GL_NV_conservative_raster_pre_snap_triangles(); -#endif /* GL_NV_conservative_raster_pre_snap_triangles */ -#ifdef GL_NV_copy_buffer - if (glewExperimental || GLEW_NV_copy_buffer) GLEW_NV_copy_buffer = !_glewInit_GL_NV_copy_buffer(); -#endif /* GL_NV_copy_buffer */ -#ifdef GL_NV_copy_image - if (glewExperimental || GLEW_NV_copy_image) GLEW_NV_copy_image = !_glewInit_GL_NV_copy_image(); -#endif /* GL_NV_copy_image */ -#ifdef GL_NV_depth_buffer_float - if (glewExperimental || GLEW_NV_depth_buffer_float) GLEW_NV_depth_buffer_float = !_glewInit_GL_NV_depth_buffer_float(); -#endif /* GL_NV_depth_buffer_float */ -#ifdef GL_NV_draw_buffers - if (glewExperimental || GLEW_NV_draw_buffers) GLEW_NV_draw_buffers = !_glewInit_GL_NV_draw_buffers(); -#endif /* GL_NV_draw_buffers */ -#ifdef GL_NV_draw_instanced - if (glewExperimental || GLEW_NV_draw_instanced) GLEW_NV_draw_instanced = !_glewInit_GL_NV_draw_instanced(); -#endif /* GL_NV_draw_instanced */ -#ifdef GL_NV_draw_texture - if (glewExperimental || GLEW_NV_draw_texture) GLEW_NV_draw_texture = !_glewInit_GL_NV_draw_texture(); -#endif /* GL_NV_draw_texture */ -#ifdef GL_NV_draw_vulkan_image - if (glewExperimental || GLEW_NV_draw_vulkan_image) GLEW_NV_draw_vulkan_image = !_glewInit_GL_NV_draw_vulkan_image(); -#endif /* GL_NV_draw_vulkan_image */ -#ifdef GL_NV_evaluators - if (glewExperimental || GLEW_NV_evaluators) GLEW_NV_evaluators = !_glewInit_GL_NV_evaluators(); -#endif /* GL_NV_evaluators */ -#ifdef GL_NV_explicit_multisample - if (glewExperimental || GLEW_NV_explicit_multisample) GLEW_NV_explicit_multisample = !_glewInit_GL_NV_explicit_multisample(); -#endif /* GL_NV_explicit_multisample */ -#ifdef GL_NV_fence - if (glewExperimental || GLEW_NV_fence) GLEW_NV_fence = !_glewInit_GL_NV_fence(); -#endif /* GL_NV_fence */ -#ifdef GL_NV_fragment_coverage_to_color - if (glewExperimental || GLEW_NV_fragment_coverage_to_color) GLEW_NV_fragment_coverage_to_color = !_glewInit_GL_NV_fragment_coverage_to_color(); -#endif /* GL_NV_fragment_coverage_to_color */ -#ifdef GL_NV_fragment_program - if (glewExperimental || GLEW_NV_fragment_program) GLEW_NV_fragment_program = !_glewInit_GL_NV_fragment_program(); -#endif /* GL_NV_fragment_program */ -#ifdef GL_NV_framebuffer_blit - if (glewExperimental || GLEW_NV_framebuffer_blit) GLEW_NV_framebuffer_blit = !_glewInit_GL_NV_framebuffer_blit(); -#endif /* GL_NV_framebuffer_blit */ -#ifdef GL_NV_framebuffer_multisample - if (glewExperimental || GLEW_NV_framebuffer_multisample) GLEW_NV_framebuffer_multisample = !_glewInit_GL_NV_framebuffer_multisample(); -#endif /* GL_NV_framebuffer_multisample */ -#ifdef GL_NV_framebuffer_multisample_coverage - if (glewExperimental || GLEW_NV_framebuffer_multisample_coverage) GLEW_NV_framebuffer_multisample_coverage = !_glewInit_GL_NV_framebuffer_multisample_coverage(); -#endif /* GL_NV_framebuffer_multisample_coverage */ -#ifdef GL_NV_geometry_program4 - if (glewExperimental || GLEW_NV_geometry_program4) GLEW_NV_geometry_program4 = !_glewInit_GL_NV_geometry_program4(); -#endif /* GL_NV_geometry_program4 */ -#ifdef GL_NV_gpu_multicast - if (glewExperimental || GLEW_NV_gpu_multicast) GLEW_NV_gpu_multicast = !_glewInit_GL_NV_gpu_multicast(); -#endif /* GL_NV_gpu_multicast */ -#ifdef GL_NV_gpu_program4 - if (glewExperimental || GLEW_NV_gpu_program4) GLEW_NV_gpu_program4 = !_glewInit_GL_NV_gpu_program4(); -#endif /* GL_NV_gpu_program4 */ -#ifdef GL_NV_gpu_shader5 - if (glewExperimental || GLEW_NV_gpu_shader5) GLEW_NV_gpu_shader5 = !_glewInit_GL_NV_gpu_shader5(); -#endif /* GL_NV_gpu_shader5 */ -#ifdef GL_NV_half_float - if (glewExperimental || GLEW_NV_half_float) GLEW_NV_half_float = !_glewInit_GL_NV_half_float(); -#endif /* GL_NV_half_float */ -#ifdef GL_NV_instanced_arrays - if (glewExperimental || GLEW_NV_instanced_arrays) GLEW_NV_instanced_arrays = !_glewInit_GL_NV_instanced_arrays(); -#endif /* GL_NV_instanced_arrays */ -#ifdef GL_NV_internalformat_sample_query - if (glewExperimental || GLEW_NV_internalformat_sample_query) GLEW_NV_internalformat_sample_query = !_glewInit_GL_NV_internalformat_sample_query(); -#endif /* GL_NV_internalformat_sample_query */ -#ifdef GL_NV_non_square_matrices - if (glewExperimental || GLEW_NV_non_square_matrices) GLEW_NV_non_square_matrices = !_glewInit_GL_NV_non_square_matrices(); -#endif /* GL_NV_non_square_matrices */ -#ifdef GL_NV_occlusion_query - if (glewExperimental || GLEW_NV_occlusion_query) GLEW_NV_occlusion_query = !_glewInit_GL_NV_occlusion_query(); -#endif /* GL_NV_occlusion_query */ -#ifdef GL_NV_parameter_buffer_object - if (glewExperimental || GLEW_NV_parameter_buffer_object) GLEW_NV_parameter_buffer_object = !_glewInit_GL_NV_parameter_buffer_object(); -#endif /* GL_NV_parameter_buffer_object */ -#ifdef GL_NV_path_rendering - if (glewExperimental || GLEW_NV_path_rendering) GLEW_NV_path_rendering = !_glewInit_GL_NV_path_rendering(); -#endif /* GL_NV_path_rendering */ -#ifdef GL_NV_pixel_data_range - if (glewExperimental || GLEW_NV_pixel_data_range) GLEW_NV_pixel_data_range = !_glewInit_GL_NV_pixel_data_range(); -#endif /* GL_NV_pixel_data_range */ -#ifdef GL_NV_point_sprite - if (glewExperimental || GLEW_NV_point_sprite) GLEW_NV_point_sprite = !_glewInit_GL_NV_point_sprite(); -#endif /* GL_NV_point_sprite */ -#ifdef GL_NV_polygon_mode - if (glewExperimental || GLEW_NV_polygon_mode) GLEW_NV_polygon_mode = !_glewInit_GL_NV_polygon_mode(); -#endif /* GL_NV_polygon_mode */ -#ifdef GL_NV_present_video - if (glewExperimental || GLEW_NV_present_video) GLEW_NV_present_video = !_glewInit_GL_NV_present_video(); -#endif /* GL_NV_present_video */ -#ifdef GL_NV_primitive_restart - if (glewExperimental || GLEW_NV_primitive_restart) GLEW_NV_primitive_restart = !_glewInit_GL_NV_primitive_restart(); -#endif /* GL_NV_primitive_restart */ -#ifdef GL_NV_register_combiners - if (glewExperimental || GLEW_NV_register_combiners) GLEW_NV_register_combiners = !_glewInit_GL_NV_register_combiners(); -#endif /* GL_NV_register_combiners */ -#ifdef GL_NV_register_combiners2 - if (glewExperimental || GLEW_NV_register_combiners2) GLEW_NV_register_combiners2 = !_glewInit_GL_NV_register_combiners2(); -#endif /* GL_NV_register_combiners2 */ -#ifdef GL_NV_sample_locations - if (glewExperimental || GLEW_NV_sample_locations) GLEW_NV_sample_locations = !_glewInit_GL_NV_sample_locations(); -#endif /* GL_NV_sample_locations */ -#ifdef GL_NV_shader_buffer_load - if (glewExperimental || GLEW_NV_shader_buffer_load) GLEW_NV_shader_buffer_load = !_glewInit_GL_NV_shader_buffer_load(); -#endif /* GL_NV_shader_buffer_load */ -#ifdef GL_NV_texture_array - if (glewExperimental || GLEW_NV_texture_array) GLEW_NV_texture_array = !_glewInit_GL_NV_texture_array(); -#endif /* GL_NV_texture_array */ -#ifdef GL_NV_texture_barrier - if (glewExperimental || GLEW_NV_texture_barrier) GLEW_NV_texture_barrier = !_glewInit_GL_NV_texture_barrier(); -#endif /* GL_NV_texture_barrier */ -#ifdef GL_NV_texture_multisample - if (glewExperimental || GLEW_NV_texture_multisample) GLEW_NV_texture_multisample = !_glewInit_GL_NV_texture_multisample(); -#endif /* GL_NV_texture_multisample */ -#ifdef GL_NV_transform_feedback - if (glewExperimental || GLEW_NV_transform_feedback) GLEW_NV_transform_feedback = !_glewInit_GL_NV_transform_feedback(); -#endif /* GL_NV_transform_feedback */ -#ifdef GL_NV_transform_feedback2 - if (glewExperimental || GLEW_NV_transform_feedback2) GLEW_NV_transform_feedback2 = !_glewInit_GL_NV_transform_feedback2(); -#endif /* GL_NV_transform_feedback2 */ -#ifdef GL_NV_vdpau_interop - if (glewExperimental || GLEW_NV_vdpau_interop) GLEW_NV_vdpau_interop = !_glewInit_GL_NV_vdpau_interop(); -#endif /* GL_NV_vdpau_interop */ -#ifdef GL_NV_vertex_array_range - if (glewExperimental || GLEW_NV_vertex_array_range) GLEW_NV_vertex_array_range = !_glewInit_GL_NV_vertex_array_range(); -#endif /* GL_NV_vertex_array_range */ -#ifdef GL_NV_vertex_attrib_integer_64bit - if (glewExperimental || GLEW_NV_vertex_attrib_integer_64bit) GLEW_NV_vertex_attrib_integer_64bit = !_glewInit_GL_NV_vertex_attrib_integer_64bit(); -#endif /* GL_NV_vertex_attrib_integer_64bit */ -#ifdef GL_NV_vertex_buffer_unified_memory - if (glewExperimental || GLEW_NV_vertex_buffer_unified_memory) GLEW_NV_vertex_buffer_unified_memory = !_glewInit_GL_NV_vertex_buffer_unified_memory(); -#endif /* GL_NV_vertex_buffer_unified_memory */ -#ifdef GL_NV_vertex_program - if (glewExperimental || GLEW_NV_vertex_program) GLEW_NV_vertex_program = !_glewInit_GL_NV_vertex_program(); -#endif /* GL_NV_vertex_program */ -#ifdef GL_NV_video_capture - if (glewExperimental || GLEW_NV_video_capture) GLEW_NV_video_capture = !_glewInit_GL_NV_video_capture(); -#endif /* GL_NV_video_capture */ -#ifdef GL_NV_viewport_array - if (glewExperimental || GLEW_NV_viewport_array) GLEW_NV_viewport_array = !_glewInit_GL_NV_viewport_array(); -#endif /* GL_NV_viewport_array */ -#ifdef GL_NV_viewport_swizzle - if (glewExperimental || GLEW_NV_viewport_swizzle) GLEW_NV_viewport_swizzle = !_glewInit_GL_NV_viewport_swizzle(); -#endif /* GL_NV_viewport_swizzle */ -#ifdef GL_OVR_multiview - if (glewExperimental || GLEW_OVR_multiview) GLEW_OVR_multiview = !_glewInit_GL_OVR_multiview(); -#endif /* GL_OVR_multiview */ -#ifdef GL_OVR_multiview_multisampled_render_to_texture - if (glewExperimental || GLEW_OVR_multiview_multisampled_render_to_texture) GLEW_OVR_multiview_multisampled_render_to_texture = !_glewInit_GL_OVR_multiview_multisampled_render_to_texture(); -#endif /* GL_OVR_multiview_multisampled_render_to_texture */ -#ifdef GL_QCOM_alpha_test - if (glewExperimental || GLEW_QCOM_alpha_test) GLEW_QCOM_alpha_test = !_glewInit_GL_QCOM_alpha_test(); -#endif /* GL_QCOM_alpha_test */ -#ifdef GL_QCOM_driver_control - if (glewExperimental || GLEW_QCOM_driver_control) GLEW_QCOM_driver_control = !_glewInit_GL_QCOM_driver_control(); -#endif /* GL_QCOM_driver_control */ -#ifdef GL_QCOM_extended_get - if (glewExperimental || GLEW_QCOM_extended_get) GLEW_QCOM_extended_get = !_glewInit_GL_QCOM_extended_get(); -#endif /* GL_QCOM_extended_get */ -#ifdef GL_QCOM_extended_get2 - if (glewExperimental || GLEW_QCOM_extended_get2) GLEW_QCOM_extended_get2 = !_glewInit_GL_QCOM_extended_get2(); -#endif /* GL_QCOM_extended_get2 */ -#ifdef GL_QCOM_framebuffer_foveated - if (glewExperimental || GLEW_QCOM_framebuffer_foveated) GLEW_QCOM_framebuffer_foveated = !_glewInit_GL_QCOM_framebuffer_foveated(); -#endif /* GL_QCOM_framebuffer_foveated */ -#ifdef GL_QCOM_shader_framebuffer_fetch_noncoherent - if (glewExperimental || GLEW_QCOM_shader_framebuffer_fetch_noncoherent) GLEW_QCOM_shader_framebuffer_fetch_noncoherent = !_glewInit_GL_QCOM_shader_framebuffer_fetch_noncoherent(); -#endif /* GL_QCOM_shader_framebuffer_fetch_noncoherent */ -#ifdef GL_QCOM_tiled_rendering - if (glewExperimental || GLEW_QCOM_tiled_rendering) GLEW_QCOM_tiled_rendering = !_glewInit_GL_QCOM_tiled_rendering(); -#endif /* GL_QCOM_tiled_rendering */ -#ifdef GL_REGAL_ES1_0_compatibility - if (glewExperimental || GLEW_REGAL_ES1_0_compatibility) GLEW_REGAL_ES1_0_compatibility = !_glewInit_GL_REGAL_ES1_0_compatibility(); -#endif /* GL_REGAL_ES1_0_compatibility */ -#ifdef GL_REGAL_ES1_1_compatibility - if (glewExperimental || GLEW_REGAL_ES1_1_compatibility) GLEW_REGAL_ES1_1_compatibility = !_glewInit_GL_REGAL_ES1_1_compatibility(); -#endif /* GL_REGAL_ES1_1_compatibility */ -#ifdef GL_REGAL_error_string - if (glewExperimental || GLEW_REGAL_error_string) GLEW_REGAL_error_string = !_glewInit_GL_REGAL_error_string(); -#endif /* GL_REGAL_error_string */ -#ifdef GL_REGAL_extension_query - if (glewExperimental || GLEW_REGAL_extension_query) GLEW_REGAL_extension_query = !_glewInit_GL_REGAL_extension_query(); -#endif /* GL_REGAL_extension_query */ -#ifdef GL_REGAL_log - if (glewExperimental || GLEW_REGAL_log) GLEW_REGAL_log = !_glewInit_GL_REGAL_log(); -#endif /* GL_REGAL_log */ -#ifdef GL_REGAL_proc_address - if (glewExperimental || GLEW_REGAL_proc_address) GLEW_REGAL_proc_address = !_glewInit_GL_REGAL_proc_address(); -#endif /* GL_REGAL_proc_address */ -#ifdef GL_SGIS_detail_texture - if (glewExperimental || GLEW_SGIS_detail_texture) GLEW_SGIS_detail_texture = !_glewInit_GL_SGIS_detail_texture(); -#endif /* GL_SGIS_detail_texture */ -#ifdef GL_SGIS_fog_function - if (glewExperimental || GLEW_SGIS_fog_function) GLEW_SGIS_fog_function = !_glewInit_GL_SGIS_fog_function(); -#endif /* GL_SGIS_fog_function */ -#ifdef GL_SGIS_multisample - if (glewExperimental || GLEW_SGIS_multisample) GLEW_SGIS_multisample = !_glewInit_GL_SGIS_multisample(); -#endif /* GL_SGIS_multisample */ -#ifdef GL_SGIS_multitexture - if (glewExperimental || GLEW_SGIS_multitexture) GLEW_SGIS_multitexture = !_glewInit_GL_SGIS_multitexture(); -#endif /* GL_SGIS_multitexture */ -#ifdef GL_SGIS_shared_multisample - if (glewExperimental || GLEW_SGIS_shared_multisample) GLEW_SGIS_shared_multisample = !_glewInit_GL_SGIS_shared_multisample(); -#endif /* GL_SGIS_shared_multisample */ -#ifdef GL_SGIS_sharpen_texture - if (glewExperimental || GLEW_SGIS_sharpen_texture) GLEW_SGIS_sharpen_texture = !_glewInit_GL_SGIS_sharpen_texture(); -#endif /* GL_SGIS_sharpen_texture */ -#ifdef GL_SGIS_texture4D - if (glewExperimental || GLEW_SGIS_texture4D) GLEW_SGIS_texture4D = !_glewInit_GL_SGIS_texture4D(); -#endif /* GL_SGIS_texture4D */ -#ifdef GL_SGIS_texture_filter4 - if (glewExperimental || GLEW_SGIS_texture_filter4) GLEW_SGIS_texture_filter4 = !_glewInit_GL_SGIS_texture_filter4(); -#endif /* GL_SGIS_texture_filter4 */ -#ifdef GL_SGIX_async - if (glewExperimental || GLEW_SGIX_async) GLEW_SGIX_async = !_glewInit_GL_SGIX_async(); -#endif /* GL_SGIX_async */ -#ifdef GL_SGIX_datapipe - if (glewExperimental || GLEW_SGIX_datapipe) GLEW_SGIX_datapipe = !_glewInit_GL_SGIX_datapipe(); -#endif /* GL_SGIX_datapipe */ -#ifdef GL_SGIX_flush_raster - if (glewExperimental || GLEW_SGIX_flush_raster) GLEW_SGIX_flush_raster = !_glewInit_GL_SGIX_flush_raster(); -#endif /* GL_SGIX_flush_raster */ -#ifdef GL_SGIX_fog_layers - if (glewExperimental || GLEW_SGIX_fog_layers) GLEW_SGIX_fog_layers = !_glewInit_GL_SGIX_fog_layers(); -#endif /* GL_SGIX_fog_layers */ -#ifdef GL_SGIX_fog_texture - if (glewExperimental || GLEW_SGIX_fog_texture) GLEW_SGIX_fog_texture = !_glewInit_GL_SGIX_fog_texture(); -#endif /* GL_SGIX_fog_texture */ -#ifdef GL_SGIX_fragment_specular_lighting - if (glewExperimental || GLEW_SGIX_fragment_specular_lighting) GLEW_SGIX_fragment_specular_lighting = !_glewInit_GL_SGIX_fragment_specular_lighting(); -#endif /* GL_SGIX_fragment_specular_lighting */ -#ifdef GL_SGIX_framezoom - if (glewExperimental || GLEW_SGIX_framezoom) GLEW_SGIX_framezoom = !_glewInit_GL_SGIX_framezoom(); -#endif /* GL_SGIX_framezoom */ -#ifdef GL_SGIX_igloo_interface - if (glewExperimental || GLEW_SGIX_igloo_interface) GLEW_SGIX_igloo_interface = !_glewInit_GL_SGIX_igloo_interface(); -#endif /* GL_SGIX_igloo_interface */ -#ifdef GL_SGIX_mpeg1 - if (glewExperimental || GLEW_SGIX_mpeg1) GLEW_SGIX_mpeg1 = !_glewInit_GL_SGIX_mpeg1(); -#endif /* GL_SGIX_mpeg1 */ -#ifdef GL_SGIX_nonlinear_lighting_pervertex - if (glewExperimental || GLEW_SGIX_nonlinear_lighting_pervertex) GLEW_SGIX_nonlinear_lighting_pervertex = !_glewInit_GL_SGIX_nonlinear_lighting_pervertex(); -#endif /* GL_SGIX_nonlinear_lighting_pervertex */ -#ifdef GL_SGIX_pixel_texture - if (glewExperimental || GLEW_SGIX_pixel_texture) GLEW_SGIX_pixel_texture = !_glewInit_GL_SGIX_pixel_texture(); -#endif /* GL_SGIX_pixel_texture */ -#ifdef GL_SGIX_polynomial_ffd - if (glewExperimental || GLEW_SGIX_polynomial_ffd) GLEW_SGIX_polynomial_ffd = !_glewInit_GL_SGIX_polynomial_ffd(); -#endif /* GL_SGIX_polynomial_ffd */ -#ifdef GL_SGIX_quad_mesh - if (glewExperimental || GLEW_SGIX_quad_mesh) GLEW_SGIX_quad_mesh = !_glewInit_GL_SGIX_quad_mesh(); -#endif /* GL_SGIX_quad_mesh */ -#ifdef GL_SGIX_reference_plane - if (glewExperimental || GLEW_SGIX_reference_plane) GLEW_SGIX_reference_plane = !_glewInit_GL_SGIX_reference_plane(); -#endif /* GL_SGIX_reference_plane */ -#ifdef GL_SGIX_sprite - if (glewExperimental || GLEW_SGIX_sprite) GLEW_SGIX_sprite = !_glewInit_GL_SGIX_sprite(); -#endif /* GL_SGIX_sprite */ -#ifdef GL_SGIX_tag_sample_buffer - if (glewExperimental || GLEW_SGIX_tag_sample_buffer) GLEW_SGIX_tag_sample_buffer = !_glewInit_GL_SGIX_tag_sample_buffer(); -#endif /* GL_SGIX_tag_sample_buffer */ -#ifdef GL_SGIX_vector_ops - if (glewExperimental || GLEW_SGIX_vector_ops) GLEW_SGIX_vector_ops = !_glewInit_GL_SGIX_vector_ops(); -#endif /* GL_SGIX_vector_ops */ -#ifdef GL_SGIX_vertex_array_object - if (glewExperimental || GLEW_SGIX_vertex_array_object) GLEW_SGIX_vertex_array_object = !_glewInit_GL_SGIX_vertex_array_object(); -#endif /* GL_SGIX_vertex_array_object */ -#ifdef GL_SGI_color_table - if (glewExperimental || GLEW_SGI_color_table) GLEW_SGI_color_table = !_glewInit_GL_SGI_color_table(); -#endif /* GL_SGI_color_table */ -#ifdef GL_SGI_fft - if (glewExperimental || GLEW_SGI_fft) GLEW_SGI_fft = !_glewInit_GL_SGI_fft(); -#endif /* GL_SGI_fft */ -#ifdef GL_SUNX_constant_data - if (glewExperimental || GLEW_SUNX_constant_data) GLEW_SUNX_constant_data = !_glewInit_GL_SUNX_constant_data(); -#endif /* GL_SUNX_constant_data */ -#ifdef GL_SUN_global_alpha - if (glewExperimental || GLEW_SUN_global_alpha) GLEW_SUN_global_alpha = !_glewInit_GL_SUN_global_alpha(); -#endif /* GL_SUN_global_alpha */ -#ifdef GL_SUN_read_video_pixels - if (glewExperimental || GLEW_SUN_read_video_pixels) GLEW_SUN_read_video_pixels = !_glewInit_GL_SUN_read_video_pixels(); -#endif /* GL_SUN_read_video_pixels */ -#ifdef GL_SUN_triangle_list - if (glewExperimental || GLEW_SUN_triangle_list) GLEW_SUN_triangle_list = !_glewInit_GL_SUN_triangle_list(); -#endif /* GL_SUN_triangle_list */ -#ifdef GL_SUN_vertex - if (glewExperimental || GLEW_SUN_vertex) GLEW_SUN_vertex = !_glewInit_GL_SUN_vertex(); -#endif /* GL_SUN_vertex */ -#ifdef GL_WIN_swap_hint - if (glewExperimental || GLEW_WIN_swap_hint) GLEW_WIN_swap_hint = !_glewInit_GL_WIN_swap_hint(); -#endif /* GL_WIN_swap_hint */ -#ifdef GL_NV_fragment_program4 - GLEW_NV_fragment_program4 = GLEW_NV_gpu_program4; -#endif /* GL_NV_fragment_program4 */ -#ifdef GL_NV_geometry_program4 - GLEW_NV_geometry_program4 = GLEW_NV_gpu_program4; -#endif /* GL_NV_geometry_program4 */ -#ifdef GL_NV_tessellation_program5 - GLEW_NV_tessellation_program5 = GLEW_NV_gpu_program5; -#endif /* GL_NV_tessellation_program5 */ -#ifdef GL_NV_vertex_program4 - GLEW_NV_vertex_program4 = GLEW_NV_gpu_program4; -#endif /* GL_NV_vertex_program4 */ - - return GLEW_OK; -} - - -#if defined(GLEW_OSMESA) - -#elif defined(GLEW_EGL) - -PFNEGLCHOOSECONFIGPROC __eglewChooseConfig = NULL; -PFNEGLCOPYBUFFERSPROC __eglewCopyBuffers = NULL; -PFNEGLCREATECONTEXTPROC __eglewCreateContext = NULL; -PFNEGLCREATEPBUFFERSURFACEPROC __eglewCreatePbufferSurface = NULL; -PFNEGLCREATEPIXMAPSURFACEPROC __eglewCreatePixmapSurface = NULL; -PFNEGLCREATEWINDOWSURFACEPROC __eglewCreateWindowSurface = NULL; -PFNEGLDESTROYCONTEXTPROC __eglewDestroyContext = NULL; -PFNEGLDESTROYSURFACEPROC __eglewDestroySurface = NULL; -PFNEGLGETCONFIGATTRIBPROC __eglewGetConfigAttrib = NULL; -PFNEGLGETCONFIGSPROC __eglewGetConfigs = NULL; -PFNEGLGETCURRENTDISPLAYPROC __eglewGetCurrentDisplay = NULL; -PFNEGLGETCURRENTSURFACEPROC __eglewGetCurrentSurface = NULL; -PFNEGLGETDISPLAYPROC __eglewGetDisplay = NULL; -PFNEGLGETERRORPROC __eglewGetError = NULL; -PFNEGLINITIALIZEPROC __eglewInitialize = NULL; -PFNEGLMAKECURRENTPROC __eglewMakeCurrent = NULL; -PFNEGLQUERYCONTEXTPROC __eglewQueryContext = NULL; -PFNEGLQUERYSTRINGPROC __eglewQueryString = NULL; -PFNEGLQUERYSURFACEPROC __eglewQuerySurface = NULL; -PFNEGLSWAPBUFFERSPROC __eglewSwapBuffers = NULL; -PFNEGLTERMINATEPROC __eglewTerminate = NULL; -PFNEGLWAITGLPROC __eglewWaitGL = NULL; -PFNEGLWAITNATIVEPROC __eglewWaitNative = NULL; - -PFNEGLBINDTEXIMAGEPROC __eglewBindTexImage = NULL; -PFNEGLRELEASETEXIMAGEPROC __eglewReleaseTexImage = NULL; -PFNEGLSURFACEATTRIBPROC __eglewSurfaceAttrib = NULL; -PFNEGLSWAPINTERVALPROC __eglewSwapInterval = NULL; - -PFNEGLBINDAPIPROC __eglewBindAPI = NULL; -PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC __eglewCreatePbufferFromClientBuffer = NULL; -PFNEGLQUERYAPIPROC __eglewQueryAPI = NULL; -PFNEGLRELEASETHREADPROC __eglewReleaseThread = NULL; -PFNEGLWAITCLIENTPROC __eglewWaitClient = NULL; - -PFNEGLGETCURRENTCONTEXTPROC __eglewGetCurrentContext = NULL; - -PFNEGLCLIENTWAITSYNCPROC __eglewClientWaitSync = NULL; -PFNEGLCREATEIMAGEPROC __eglewCreateImage = NULL; -PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC __eglewCreatePlatformPixmapSurface = NULL; -PFNEGLCREATEPLATFORMWINDOWSURFACEPROC __eglewCreatePlatformWindowSurface = NULL; -PFNEGLCREATESYNCPROC __eglewCreateSync = NULL; -PFNEGLDESTROYIMAGEPROC __eglewDestroyImage = NULL; -PFNEGLDESTROYSYNCPROC __eglewDestroySync = NULL; -PFNEGLGETPLATFORMDISPLAYPROC __eglewGetPlatformDisplay = NULL; -PFNEGLGETSYNCATTRIBPROC __eglewGetSyncAttrib = NULL; -PFNEGLWAITSYNCPROC __eglewWaitSync = NULL; - -PFNEGLSETBLOBCACHEFUNCSANDROIDPROC __eglewSetBlobCacheFuncsANDROID = NULL; - -PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC __eglewCreateNativeClientBufferANDROID = NULL; - -PFNEGLDUPNATIVEFENCEFDANDROIDPROC __eglewDupNativeFenceFDANDROID = NULL; - -PFNEGLPRESENTATIONTIMEANDROIDPROC __eglewPresentationTimeANDROID = NULL; - -PFNEGLQUERYSURFACEPOINTERANGLEPROC __eglewQuerySurfacePointerANGLE = NULL; - -PFNEGLQUERYDEVICESEXTPROC __eglewQueryDevicesEXT = NULL; - -PFNEGLQUERYDEVICEATTRIBEXTPROC __eglewQueryDeviceAttribEXT = NULL; -PFNEGLQUERYDEVICESTRINGEXTPROC __eglewQueryDeviceStringEXT = NULL; -PFNEGLQUERYDISPLAYATTRIBEXTPROC __eglewQueryDisplayAttribEXT = NULL; - -PFNEGLQUERYDMABUFFORMATSEXTPROC __eglewQueryDmaBufFormatsEXT = NULL; -PFNEGLQUERYDMABUFMODIFIERSEXTPROC __eglewQueryDmaBufModifiersEXT = NULL; - -PFNEGLGETOUTPUTLAYERSEXTPROC __eglewGetOutputLayersEXT = NULL; -PFNEGLGETOUTPUTPORTSEXTPROC __eglewGetOutputPortsEXT = NULL; -PFNEGLOUTPUTLAYERATTRIBEXTPROC __eglewOutputLayerAttribEXT = NULL; -PFNEGLOUTPUTPORTATTRIBEXTPROC __eglewOutputPortAttribEXT = NULL; -PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC __eglewQueryOutputLayerAttribEXT = NULL; -PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC __eglewQueryOutputLayerStringEXT = NULL; -PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC __eglewQueryOutputPortAttribEXT = NULL; -PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC __eglewQueryOutputPortStringEXT = NULL; - -PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC __eglewCreatePlatformPixmapSurfaceEXT = NULL; -PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC __eglewCreatePlatformWindowSurfaceEXT = NULL; -PFNEGLGETPLATFORMDISPLAYEXTPROC __eglewGetPlatformDisplayEXT = NULL; - -PFNEGLSTREAMCONSUMEROUTPUTEXTPROC __eglewStreamConsumerOutputEXT = NULL; - -PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC __eglewSwapBuffersWithDamageEXT = NULL; - -PFNEGLCREATEPIXMAPSURFACEHIPROC __eglewCreatePixmapSurfaceHI = NULL; - -PFNEGLCREATESYNC64KHRPROC __eglewCreateSync64KHR = NULL; - -PFNEGLDEBUGMESSAGECONTROLKHRPROC __eglewDebugMessageControlKHR = NULL; -PFNEGLLABELOBJECTKHRPROC __eglewLabelObjectKHR = NULL; -PFNEGLQUERYDEBUGKHRPROC __eglewQueryDebugKHR = NULL; - -PFNEGLCREATEIMAGEKHRPROC __eglewCreateImageKHR = NULL; -PFNEGLDESTROYIMAGEKHRPROC __eglewDestroyImageKHR = NULL; - -PFNEGLLOCKSURFACEKHRPROC __eglewLockSurfaceKHR = NULL; -PFNEGLUNLOCKSURFACEKHRPROC __eglewUnlockSurfaceKHR = NULL; - -PFNEGLQUERYSURFACE64KHRPROC __eglewQuerySurface64KHR = NULL; - -PFNEGLSETDAMAGEREGIONKHRPROC __eglewSetDamageRegionKHR = NULL; - -PFNEGLCLIENTWAITSYNCKHRPROC __eglewClientWaitSyncKHR = NULL; -PFNEGLCREATESYNCKHRPROC __eglewCreateSyncKHR = NULL; -PFNEGLDESTROYSYNCKHRPROC __eglewDestroySyncKHR = NULL; -PFNEGLGETSYNCATTRIBKHRPROC __eglewGetSyncAttribKHR = NULL; -PFNEGLSIGNALSYNCKHRPROC __eglewSignalSyncKHR = NULL; - -PFNEGLCREATESTREAMKHRPROC __eglewCreateStreamKHR = NULL; -PFNEGLDESTROYSTREAMKHRPROC __eglewDestroyStreamKHR = NULL; -PFNEGLQUERYSTREAMKHRPROC __eglewQueryStreamKHR = NULL; -PFNEGLQUERYSTREAMU64KHRPROC __eglewQueryStreamu64KHR = NULL; -PFNEGLSTREAMATTRIBKHRPROC __eglewStreamAttribKHR = NULL; - -PFNEGLCREATESTREAMATTRIBKHRPROC __eglewCreateStreamAttribKHR = NULL; -PFNEGLQUERYSTREAMATTRIBKHRPROC __eglewQueryStreamAttribKHR = NULL; -PFNEGLSETSTREAMATTRIBKHRPROC __eglewSetStreamAttribKHR = NULL; -PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC __eglewStreamConsumerAcquireAttribKHR = NULL; -PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC __eglewStreamConsumerReleaseAttribKHR = NULL; - -PFNEGLSTREAMCONSUMERACQUIREKHRPROC __eglewStreamConsumerAcquireKHR = NULL; -PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC __eglewStreamConsumerGLTextureExternalKHR = NULL; -PFNEGLSTREAMCONSUMERRELEASEKHRPROC __eglewStreamConsumerReleaseKHR = NULL; - -PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC __eglewCreateStreamFromFileDescriptorKHR = NULL; -PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC __eglewGetStreamFileDescriptorKHR = NULL; - -PFNEGLQUERYSTREAMTIMEKHRPROC __eglewQueryStreamTimeKHR = NULL; - -PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC __eglewCreateStreamProducerSurfaceKHR = NULL; - -PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC __eglewSwapBuffersWithDamageKHR = NULL; - -PFNEGLWAITSYNCKHRPROC __eglewWaitSyncKHR = NULL; - -PFNEGLCREATEDRMIMAGEMESAPROC __eglewCreateDRMImageMESA = NULL; -PFNEGLEXPORTDRMIMAGEMESAPROC __eglewExportDRMImageMESA = NULL; - -PFNEGLEXPORTDMABUFIMAGEMESAPROC __eglewExportDMABUFImageMESA = NULL; -PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC __eglewExportDMABUFImageQueryMESA = NULL; - -PFNEGLSWAPBUFFERSREGIONNOKPROC __eglewSwapBuffersRegionNOK = NULL; - -PFNEGLSWAPBUFFERSREGION2NOKPROC __eglewSwapBuffersRegion2NOK = NULL; - -PFNEGLQUERYNATIVEDISPLAYNVPROC __eglewQueryNativeDisplayNV = NULL; -PFNEGLQUERYNATIVEPIXMAPNVPROC __eglewQueryNativePixmapNV = NULL; -PFNEGLQUERYNATIVEWINDOWNVPROC __eglewQueryNativeWindowNV = NULL; - -PFNEGLPOSTSUBBUFFERNVPROC __eglewPostSubBufferNV = NULL; - -PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC __eglewStreamConsumerGLTextureExternalAttribsNV = NULL; - -PFNEGLQUERYDISPLAYATTRIBNVPROC __eglewQueryDisplayAttribNV = NULL; -PFNEGLQUERYSTREAMMETADATANVPROC __eglewQueryStreamMetadataNV = NULL; -PFNEGLSETSTREAMMETADATANVPROC __eglewSetStreamMetadataNV = NULL; - -PFNEGLRESETSTREAMNVPROC __eglewResetStreamNV = NULL; - -PFNEGLCREATESTREAMSYNCNVPROC __eglewCreateStreamSyncNV = NULL; - -PFNEGLCLIENTWAITSYNCNVPROC __eglewClientWaitSyncNV = NULL; -PFNEGLCREATEFENCESYNCNVPROC __eglewCreateFenceSyncNV = NULL; -PFNEGLDESTROYSYNCNVPROC __eglewDestroySyncNV = NULL; -PFNEGLFENCENVPROC __eglewFenceNV = NULL; -PFNEGLGETSYNCATTRIBNVPROC __eglewGetSyncAttribNV = NULL; -PFNEGLSIGNALSYNCNVPROC __eglewSignalSyncNV = NULL; - -PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC __eglewGetSystemTimeFrequencyNV = NULL; -PFNEGLGETSYSTEMTIMENVPROC __eglewGetSystemTimeNV = NULL; -GLboolean __EGLEW_VERSION_1_0 = GL_FALSE; -GLboolean __EGLEW_VERSION_1_1 = GL_FALSE; -GLboolean __EGLEW_VERSION_1_2 = GL_FALSE; -GLboolean __EGLEW_VERSION_1_3 = GL_FALSE; -GLboolean __EGLEW_VERSION_1_4 = GL_FALSE; -GLboolean __EGLEW_VERSION_1_5 = GL_FALSE; -GLboolean __EGLEW_ANDROID_blob_cache = GL_FALSE; -GLboolean __EGLEW_ANDROID_create_native_client_buffer = GL_FALSE; -GLboolean __EGLEW_ANDROID_framebuffer_target = GL_FALSE; -GLboolean __EGLEW_ANDROID_front_buffer_auto_refresh = GL_FALSE; -GLboolean __EGLEW_ANDROID_image_native_buffer = GL_FALSE; -GLboolean __EGLEW_ANDROID_native_fence_sync = GL_FALSE; -GLboolean __EGLEW_ANDROID_presentation_time = GL_FALSE; -GLboolean __EGLEW_ANDROID_recordable = GL_FALSE; -GLboolean __EGLEW_ANGLE_d3d_share_handle_client_buffer = GL_FALSE; -GLboolean __EGLEW_ANGLE_device_d3d = GL_FALSE; -GLboolean __EGLEW_ANGLE_query_surface_pointer = GL_FALSE; -GLboolean __EGLEW_ANGLE_surface_d3d_texture_2d_share_handle = GL_FALSE; -GLboolean __EGLEW_ANGLE_window_fixed_size = GL_FALSE; -GLboolean __EGLEW_ARM_implicit_external_sync = GL_FALSE; -GLboolean __EGLEW_ARM_pixmap_multisample_discard = GL_FALSE; -GLboolean __EGLEW_EXT_buffer_age = GL_FALSE; -GLboolean __EGLEW_EXT_client_extensions = GL_FALSE; -GLboolean __EGLEW_EXT_create_context_robustness = GL_FALSE; -GLboolean __EGLEW_EXT_device_base = GL_FALSE; -GLboolean __EGLEW_EXT_device_drm = GL_FALSE; -GLboolean __EGLEW_EXT_device_enumeration = GL_FALSE; -GLboolean __EGLEW_EXT_device_openwf = GL_FALSE; -GLboolean __EGLEW_EXT_device_query = GL_FALSE; -GLboolean __EGLEW_EXT_gl_colorspace_bt2020_linear = GL_FALSE; -GLboolean __EGLEW_EXT_gl_colorspace_bt2020_pq = GL_FALSE; -GLboolean __EGLEW_EXT_gl_colorspace_scrgb_linear = GL_FALSE; -GLboolean __EGLEW_EXT_image_dma_buf_import = GL_FALSE; -GLboolean __EGLEW_EXT_image_dma_buf_import_modifiers = GL_FALSE; -GLboolean __EGLEW_EXT_multiview_window = GL_FALSE; -GLboolean __EGLEW_EXT_output_base = GL_FALSE; -GLboolean __EGLEW_EXT_output_drm = GL_FALSE; -GLboolean __EGLEW_EXT_output_openwf = GL_FALSE; -GLboolean __EGLEW_EXT_pixel_format_float = GL_FALSE; -GLboolean __EGLEW_EXT_platform_base = GL_FALSE; -GLboolean __EGLEW_EXT_platform_device = GL_FALSE; -GLboolean __EGLEW_EXT_platform_wayland = GL_FALSE; -GLboolean __EGLEW_EXT_platform_x11 = GL_FALSE; -GLboolean __EGLEW_EXT_protected_content = GL_FALSE; -GLboolean __EGLEW_EXT_protected_surface = GL_FALSE; -GLboolean __EGLEW_EXT_stream_consumer_egloutput = GL_FALSE; -GLboolean __EGLEW_EXT_surface_SMPTE2086_metadata = GL_FALSE; -GLboolean __EGLEW_EXT_swap_buffers_with_damage = GL_FALSE; -GLboolean __EGLEW_EXT_yuv_surface = GL_FALSE; -GLboolean __EGLEW_HI_clientpixmap = GL_FALSE; -GLboolean __EGLEW_HI_colorformats = GL_FALSE; -GLboolean __EGLEW_IMG_context_priority = GL_FALSE; -GLboolean __EGLEW_IMG_image_plane_attribs = GL_FALSE; -GLboolean __EGLEW_KHR_cl_event = GL_FALSE; -GLboolean __EGLEW_KHR_cl_event2 = GL_FALSE; -GLboolean __EGLEW_KHR_client_get_all_proc_addresses = GL_FALSE; -GLboolean __EGLEW_KHR_config_attribs = GL_FALSE; -GLboolean __EGLEW_KHR_context_flush_control = GL_FALSE; -GLboolean __EGLEW_KHR_create_context = GL_FALSE; -GLboolean __EGLEW_KHR_create_context_no_error = GL_FALSE; -GLboolean __EGLEW_KHR_debug = GL_FALSE; -GLboolean __EGLEW_KHR_fence_sync = GL_FALSE; -GLboolean __EGLEW_KHR_get_all_proc_addresses = GL_FALSE; -GLboolean __EGLEW_KHR_gl_colorspace = GL_FALSE; -GLboolean __EGLEW_KHR_gl_renderbuffer_image = GL_FALSE; -GLboolean __EGLEW_KHR_gl_texture_2D_image = GL_FALSE; -GLboolean __EGLEW_KHR_gl_texture_3D_image = GL_FALSE; -GLboolean __EGLEW_KHR_gl_texture_cubemap_image = GL_FALSE; -GLboolean __EGLEW_KHR_image = GL_FALSE; -GLboolean __EGLEW_KHR_image_base = GL_FALSE; -GLboolean __EGLEW_KHR_image_pixmap = GL_FALSE; -GLboolean __EGLEW_KHR_lock_surface = GL_FALSE; -GLboolean __EGLEW_KHR_lock_surface2 = GL_FALSE; -GLboolean __EGLEW_KHR_lock_surface3 = GL_FALSE; -GLboolean __EGLEW_KHR_mutable_render_buffer = GL_FALSE; -GLboolean __EGLEW_KHR_no_config_context = GL_FALSE; -GLboolean __EGLEW_KHR_partial_update = GL_FALSE; -GLboolean __EGLEW_KHR_platform_android = GL_FALSE; -GLboolean __EGLEW_KHR_platform_gbm = GL_FALSE; -GLboolean __EGLEW_KHR_platform_wayland = GL_FALSE; -GLboolean __EGLEW_KHR_platform_x11 = GL_FALSE; -GLboolean __EGLEW_KHR_reusable_sync = GL_FALSE; -GLboolean __EGLEW_KHR_stream = GL_FALSE; -GLboolean __EGLEW_KHR_stream_attrib = GL_FALSE; -GLboolean __EGLEW_KHR_stream_consumer_gltexture = GL_FALSE; -GLboolean __EGLEW_KHR_stream_cross_process_fd = GL_FALSE; -GLboolean __EGLEW_KHR_stream_fifo = GL_FALSE; -GLboolean __EGLEW_KHR_stream_producer_aldatalocator = GL_FALSE; -GLboolean __EGLEW_KHR_stream_producer_eglsurface = GL_FALSE; -GLboolean __EGLEW_KHR_surfaceless_context = GL_FALSE; -GLboolean __EGLEW_KHR_swap_buffers_with_damage = GL_FALSE; -GLboolean __EGLEW_KHR_vg_parent_image = GL_FALSE; -GLboolean __EGLEW_KHR_wait_sync = GL_FALSE; -GLboolean __EGLEW_MESA_drm_image = GL_FALSE; -GLboolean __EGLEW_MESA_image_dma_buf_export = GL_FALSE; -GLboolean __EGLEW_MESA_platform_gbm = GL_FALSE; -GLboolean __EGLEW_MESA_platform_surfaceless = GL_FALSE; -GLboolean __EGLEW_NOK_swap_region = GL_FALSE; -GLboolean __EGLEW_NOK_swap_region2 = GL_FALSE; -GLboolean __EGLEW_NOK_texture_from_pixmap = GL_FALSE; -GLboolean __EGLEW_NV_3dvision_surface = GL_FALSE; -GLboolean __EGLEW_NV_coverage_sample = GL_FALSE; -GLboolean __EGLEW_NV_coverage_sample_resolve = GL_FALSE; -GLboolean __EGLEW_NV_cuda_event = GL_FALSE; -GLboolean __EGLEW_NV_depth_nonlinear = GL_FALSE; -GLboolean __EGLEW_NV_device_cuda = GL_FALSE; -GLboolean __EGLEW_NV_native_query = GL_FALSE; -GLboolean __EGLEW_NV_post_convert_rounding = GL_FALSE; -GLboolean __EGLEW_NV_post_sub_buffer = GL_FALSE; -GLboolean __EGLEW_NV_robustness_video_memory_purge = GL_FALSE; -GLboolean __EGLEW_NV_stream_consumer_gltexture_yuv = GL_FALSE; -GLboolean __EGLEW_NV_stream_cross_display = GL_FALSE; -GLboolean __EGLEW_NV_stream_cross_object = GL_FALSE; -GLboolean __EGLEW_NV_stream_cross_partition = GL_FALSE; -GLboolean __EGLEW_NV_stream_cross_process = GL_FALSE; -GLboolean __EGLEW_NV_stream_cross_system = GL_FALSE; -GLboolean __EGLEW_NV_stream_fifo_next = GL_FALSE; -GLboolean __EGLEW_NV_stream_fifo_synchronous = GL_FALSE; -GLboolean __EGLEW_NV_stream_frame_limits = GL_FALSE; -GLboolean __EGLEW_NV_stream_metadata = GL_FALSE; -GLboolean __EGLEW_NV_stream_remote = GL_FALSE; -GLboolean __EGLEW_NV_stream_reset = GL_FALSE; -GLboolean __EGLEW_NV_stream_socket = GL_FALSE; -GLboolean __EGLEW_NV_stream_socket_inet = GL_FALSE; -GLboolean __EGLEW_NV_stream_socket_unix = GL_FALSE; -GLboolean __EGLEW_NV_stream_sync = GL_FALSE; -GLboolean __EGLEW_NV_sync = GL_FALSE; -GLboolean __EGLEW_NV_system_time = GL_FALSE; -GLboolean __EGLEW_TIZEN_image_native_buffer = GL_FALSE; -GLboolean __EGLEW_TIZEN_image_native_surface = GL_FALSE; -#ifdef EGL_VERSION_1_0 - -static GLboolean _glewInit_EGL_VERSION_1_0 () -{ - GLboolean r = GL_FALSE; - - r = ((eglChooseConfig = (PFNEGLCHOOSECONFIGPROC)glewGetProcAddress((const GLubyte*)"eglChooseConfig")) == NULL) || r; - r = ((eglCopyBuffers = (PFNEGLCOPYBUFFERSPROC)glewGetProcAddress((const GLubyte*)"eglCopyBuffers")) == NULL) || r; - r = ((eglCreateContext = (PFNEGLCREATECONTEXTPROC)glewGetProcAddress((const GLubyte*)"eglCreateContext")) == NULL) || r; - r = ((eglCreatePbufferSurface = (PFNEGLCREATEPBUFFERSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglCreatePbufferSurface")) == NULL) || r; - r = ((eglCreatePixmapSurface = (PFNEGLCREATEPIXMAPSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglCreatePixmapSurface")) == NULL) || r; - r = ((eglCreateWindowSurface = (PFNEGLCREATEWINDOWSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglCreateWindowSurface")) == NULL) || r; - r = ((eglDestroyContext = (PFNEGLDESTROYCONTEXTPROC)glewGetProcAddress((const GLubyte*)"eglDestroyContext")) == NULL) || r; - r = ((eglDestroySurface = (PFNEGLDESTROYSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglDestroySurface")) == NULL) || r; - r = ((eglGetConfigAttrib = (PFNEGLGETCONFIGATTRIBPROC)glewGetProcAddress((const GLubyte*)"eglGetConfigAttrib")) == NULL) || r; - r = ((eglGetConfigs = (PFNEGLGETCONFIGSPROC)glewGetProcAddress((const GLubyte*)"eglGetConfigs")) == NULL) || r; - r = ((eglGetCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC)glewGetProcAddress((const GLubyte*)"eglGetCurrentDisplay")) == NULL) || r; - r = ((eglGetCurrentSurface = (PFNEGLGETCURRENTSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglGetCurrentSurface")) == NULL) || r; - r = ((eglGetDisplay = (PFNEGLGETDISPLAYPROC)glewGetProcAddress((const GLubyte*)"eglGetDisplay")) == NULL) || r; - r = ((eglGetError = (PFNEGLGETERRORPROC)glewGetProcAddress((const GLubyte*)"eglGetError")) == NULL) || r; - r = ((eglInitialize = (PFNEGLINITIALIZEPROC)glewGetProcAddress((const GLubyte*)"eglInitialize")) == NULL) || r; - r = ((eglMakeCurrent = (PFNEGLMAKECURRENTPROC)glewGetProcAddress((const GLubyte*)"eglMakeCurrent")) == NULL) || r; - r = ((eglQueryContext = (PFNEGLQUERYCONTEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryContext")) == NULL) || r; - r = ((eglQueryString = (PFNEGLQUERYSTRINGPROC)glewGetProcAddress((const GLubyte*)"eglQueryString")) == NULL) || r; - r = ((eglQuerySurface = (PFNEGLQUERYSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglQuerySurface")) == NULL) || r; - r = ((eglSwapBuffers = (PFNEGLSWAPBUFFERSPROC)glewGetProcAddress((const GLubyte*)"eglSwapBuffers")) == NULL) || r; - r = ((eglTerminate = (PFNEGLTERMINATEPROC)glewGetProcAddress((const GLubyte*)"eglTerminate")) == NULL) || r; - r = ((eglWaitGL = (PFNEGLWAITGLPROC)glewGetProcAddress((const GLubyte*)"eglWaitGL")) == NULL) || r; - r = ((eglWaitNative = (PFNEGLWAITNATIVEPROC)glewGetProcAddress((const GLubyte*)"eglWaitNative")) == NULL) || r; - - return r; -} - -#endif /* EGL_VERSION_1_0 */ - -#ifdef EGL_VERSION_1_1 - -static GLboolean _glewInit_EGL_VERSION_1_1 () -{ - GLboolean r = GL_FALSE; - - r = ((eglBindTexImage = (PFNEGLBINDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"eglBindTexImage")) == NULL) || r; - r = ((eglReleaseTexImage = (PFNEGLRELEASETEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"eglReleaseTexImage")) == NULL) || r; - r = ((eglSurfaceAttrib = (PFNEGLSURFACEATTRIBPROC)glewGetProcAddress((const GLubyte*)"eglSurfaceAttrib")) == NULL) || r; - r = ((eglSwapInterval = (PFNEGLSWAPINTERVALPROC)glewGetProcAddress((const GLubyte*)"eglSwapInterval")) == NULL) || r; - - return r; -} - -#endif /* EGL_VERSION_1_1 */ - -#ifdef EGL_VERSION_1_2 - -static GLboolean _glewInit_EGL_VERSION_1_2 () -{ - GLboolean r = GL_FALSE; - - r = ((eglBindAPI = (PFNEGLBINDAPIPROC)glewGetProcAddress((const GLubyte*)"eglBindAPI")) == NULL) || r; - r = ((eglCreatePbufferFromClientBuffer = (PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC)glewGetProcAddress((const GLubyte*)"eglCreatePbufferFromClientBuffer")) == NULL) || r; - r = ((eglQueryAPI = (PFNEGLQUERYAPIPROC)glewGetProcAddress((const GLubyte*)"eglQueryAPI")) == NULL) || r; - r = ((eglReleaseThread = (PFNEGLRELEASETHREADPROC)glewGetProcAddress((const GLubyte*)"eglReleaseThread")) == NULL) || r; - r = ((eglWaitClient = (PFNEGLWAITCLIENTPROC)glewGetProcAddress((const GLubyte*)"eglWaitClient")) == NULL) || r; - - return r; -} - -#endif /* EGL_VERSION_1_2 */ - -#ifdef EGL_VERSION_1_4 - -static GLboolean _glewInit_EGL_VERSION_1_4 () -{ - GLboolean r = GL_FALSE; - - r = ((eglGetCurrentContext = (PFNEGLGETCURRENTCONTEXTPROC)glewGetProcAddress((const GLubyte*)"eglGetCurrentContext")) == NULL) || r; - - return r; -} - -#endif /* EGL_VERSION_1_4 */ - -#ifdef EGL_VERSION_1_5 - -static GLboolean _glewInit_EGL_VERSION_1_5 () -{ - GLboolean r = GL_FALSE; - - r = ((eglClientWaitSync = (PFNEGLCLIENTWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"eglClientWaitSync")) == NULL) || r; - r = ((eglCreateImage = (PFNEGLCREATEIMAGEPROC)glewGetProcAddress((const GLubyte*)"eglCreateImage")) == NULL) || r; - r = ((eglCreatePlatformPixmapSurface = (PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglCreatePlatformPixmapSurface")) == NULL) || r; - r = ((eglCreatePlatformWindowSurface = (PFNEGLCREATEPLATFORMWINDOWSURFACEPROC)glewGetProcAddress((const GLubyte*)"eglCreatePlatformWindowSurface")) == NULL) || r; - r = ((eglCreateSync = (PFNEGLCREATESYNCPROC)glewGetProcAddress((const GLubyte*)"eglCreateSync")) == NULL) || r; - r = ((eglDestroyImage = (PFNEGLDESTROYIMAGEPROC)glewGetProcAddress((const GLubyte*)"eglDestroyImage")) == NULL) || r; - r = ((eglDestroySync = (PFNEGLDESTROYSYNCPROC)glewGetProcAddress((const GLubyte*)"eglDestroySync")) == NULL) || r; - r = ((eglGetPlatformDisplay = (PFNEGLGETPLATFORMDISPLAYPROC)glewGetProcAddress((const GLubyte*)"eglGetPlatformDisplay")) == NULL) || r; - r = ((eglGetSyncAttrib = (PFNEGLGETSYNCATTRIBPROC)glewGetProcAddress((const GLubyte*)"eglGetSyncAttrib")) == NULL) || r; - r = ((eglWaitSync = (PFNEGLWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"eglWaitSync")) == NULL) || r; - - return r; -} - -#endif /* EGL_VERSION_1_5 */ - -#ifdef EGL_ANDROID_blob_cache - -static GLboolean _glewInit_EGL_ANDROID_blob_cache () -{ - GLboolean r = GL_FALSE; - - r = ((eglSetBlobCacheFuncsANDROID = (PFNEGLSETBLOBCACHEFUNCSANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglSetBlobCacheFuncsANDROID")) == NULL) || r; - - return r; -} - -#endif /* EGL_ANDROID_blob_cache */ - -#ifdef EGL_ANDROID_create_native_client_buffer - -static GLboolean _glewInit_EGL_ANDROID_create_native_client_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreateNativeClientBufferANDROID = (PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglCreateNativeClientBufferANDROID")) == NULL) || r; - - return r; -} - -#endif /* EGL_ANDROID_create_native_client_buffer */ - -#ifdef EGL_ANDROID_native_fence_sync - -static GLboolean _glewInit_EGL_ANDROID_native_fence_sync () -{ - GLboolean r = GL_FALSE; - - r = ((eglDupNativeFenceFDANDROID = (PFNEGLDUPNATIVEFENCEFDANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglDupNativeFenceFDANDROID")) == NULL) || r; - - return r; -} - -#endif /* EGL_ANDROID_native_fence_sync */ - -#ifdef EGL_ANDROID_presentation_time - -static GLboolean _glewInit_EGL_ANDROID_presentation_time () -{ - GLboolean r = GL_FALSE; - - r = ((eglPresentationTimeANDROID = (PFNEGLPRESENTATIONTIMEANDROIDPROC)glewGetProcAddress((const GLubyte*)"eglPresentationTimeANDROID")) == NULL) || r; - - return r; -} - -#endif /* EGL_ANDROID_presentation_time */ - -#ifdef EGL_ANGLE_query_surface_pointer - -static GLboolean _glewInit_EGL_ANGLE_query_surface_pointer () -{ - GLboolean r = GL_FALSE; - - r = ((eglQuerySurfacePointerANGLE = (PFNEGLQUERYSURFACEPOINTERANGLEPROC)glewGetProcAddress((const GLubyte*)"eglQuerySurfacePointerANGLE")) == NULL) || r; - - return r; -} - -#endif /* EGL_ANGLE_query_surface_pointer */ - -#ifdef EGL_EXT_device_enumeration - -static GLboolean _glewInit_EGL_EXT_device_enumeration () -{ - GLboolean r = GL_FALSE; - - r = ((eglQueryDevicesEXT = (PFNEGLQUERYDEVICESEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDevicesEXT")) == NULL) || r; - - return r; -} - -#endif /* EGL_EXT_device_enumeration */ - -#ifdef EGL_EXT_device_query - -static GLboolean _glewInit_EGL_EXT_device_query () -{ - GLboolean r = GL_FALSE; - - r = ((eglQueryDeviceAttribEXT = (PFNEGLQUERYDEVICEATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDeviceAttribEXT")) == NULL) || r; - r = ((eglQueryDeviceStringEXT = (PFNEGLQUERYDEVICESTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDeviceStringEXT")) == NULL) || r; - r = ((eglQueryDisplayAttribEXT = (PFNEGLQUERYDISPLAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDisplayAttribEXT")) == NULL) || r; - - return r; -} - -#endif /* EGL_EXT_device_query */ - -#ifdef EGL_EXT_image_dma_buf_import_modifiers - -static GLboolean _glewInit_EGL_EXT_image_dma_buf_import_modifiers () -{ - GLboolean r = GL_FALSE; - - r = ((eglQueryDmaBufFormatsEXT = (PFNEGLQUERYDMABUFFORMATSEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDmaBufFormatsEXT")) == NULL) || r; - r = ((eglQueryDmaBufModifiersEXT = (PFNEGLQUERYDMABUFMODIFIERSEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryDmaBufModifiersEXT")) == NULL) || r; - - return r; -} - -#endif /* EGL_EXT_image_dma_buf_import_modifiers */ - -#ifdef EGL_EXT_output_base - -static GLboolean _glewInit_EGL_EXT_output_base () -{ - GLboolean r = GL_FALSE; - - r = ((eglGetOutputLayersEXT = (PFNEGLGETOUTPUTLAYERSEXTPROC)glewGetProcAddress((const GLubyte*)"eglGetOutputLayersEXT")) == NULL) || r; - r = ((eglGetOutputPortsEXT = (PFNEGLGETOUTPUTPORTSEXTPROC)glewGetProcAddress((const GLubyte*)"eglGetOutputPortsEXT")) == NULL) || r; - r = ((eglOutputLayerAttribEXT = (PFNEGLOUTPUTLAYERATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglOutputLayerAttribEXT")) == NULL) || r; - r = ((eglOutputPortAttribEXT = (PFNEGLOUTPUTPORTATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglOutputPortAttribEXT")) == NULL) || r; - r = ((eglQueryOutputLayerAttribEXT = (PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryOutputLayerAttribEXT")) == NULL) || r; - r = ((eglQueryOutputLayerStringEXT = (PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryOutputLayerStringEXT")) == NULL) || r; - r = ((eglQueryOutputPortAttribEXT = (PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryOutputPortAttribEXT")) == NULL) || r; - r = ((eglQueryOutputPortStringEXT = (PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"eglQueryOutputPortStringEXT")) == NULL) || r; - - return r; -} - -#endif /* EGL_EXT_output_base */ - -#ifdef EGL_EXT_platform_base - -static GLboolean _glewInit_EGL_EXT_platform_base () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreatePlatformPixmapSurfaceEXT = (PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC)glewGetProcAddress((const GLubyte*)"eglCreatePlatformPixmapSurfaceEXT")) == NULL) || r; - r = ((eglCreatePlatformWindowSurfaceEXT = (PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)glewGetProcAddress((const GLubyte*)"eglCreatePlatformWindowSurfaceEXT")) == NULL) || r; - r = ((eglGetPlatformDisplayEXT = (PFNEGLGETPLATFORMDISPLAYEXTPROC)glewGetProcAddress((const GLubyte*)"eglGetPlatformDisplayEXT")) == NULL) || r; - - return r; -} - -#endif /* EGL_EXT_platform_base */ - -#ifdef EGL_EXT_stream_consumer_egloutput - -static GLboolean _glewInit_EGL_EXT_stream_consumer_egloutput () -{ - GLboolean r = GL_FALSE; - - r = ((eglStreamConsumerOutputEXT = (PFNEGLSTREAMCONSUMEROUTPUTEXTPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerOutputEXT")) == NULL) || r; - - return r; -} - -#endif /* EGL_EXT_stream_consumer_egloutput */ - -#ifdef EGL_EXT_swap_buffers_with_damage - -static GLboolean _glewInit_EGL_EXT_swap_buffers_with_damage () -{ - GLboolean r = GL_FALSE; - - r = ((eglSwapBuffersWithDamageEXT = (PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"eglSwapBuffersWithDamageEXT")) == NULL) || r; - - return r; -} - -#endif /* EGL_EXT_swap_buffers_with_damage */ - -#ifdef EGL_HI_clientpixmap - -static GLboolean _glewInit_EGL_HI_clientpixmap () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreatePixmapSurfaceHI = (PFNEGLCREATEPIXMAPSURFACEHIPROC)glewGetProcAddress((const GLubyte*)"eglCreatePixmapSurfaceHI")) == NULL) || r; - - return r; -} - -#endif /* EGL_HI_clientpixmap */ - -#ifdef EGL_KHR_cl_event2 - -static GLboolean _glewInit_EGL_KHR_cl_event2 () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreateSync64KHR = (PFNEGLCREATESYNC64KHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateSync64KHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_cl_event2 */ - -#ifdef EGL_KHR_debug - -static GLboolean _glewInit_EGL_KHR_debug () -{ - GLboolean r = GL_FALSE; - - r = ((eglDebugMessageControlKHR = (PFNEGLDEBUGMESSAGECONTROLKHRPROC)glewGetProcAddress((const GLubyte*)"eglDebugMessageControlKHR")) == NULL) || r; - r = ((eglLabelObjectKHR = (PFNEGLLABELOBJECTKHRPROC)glewGetProcAddress((const GLubyte*)"eglLabelObjectKHR")) == NULL) || r; - r = ((eglQueryDebugKHR = (PFNEGLQUERYDEBUGKHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryDebugKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_debug */ - -#ifdef EGL_KHR_image - -static GLboolean _glewInit_EGL_KHR_image () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateImageKHR")) == NULL) || r; - r = ((eglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC)glewGetProcAddress((const GLubyte*)"eglDestroyImageKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_image */ - -#ifdef EGL_KHR_lock_surface - -static GLboolean _glewInit_EGL_KHR_lock_surface () -{ - GLboolean r = GL_FALSE; - - r = ((eglLockSurfaceKHR = (PFNEGLLOCKSURFACEKHRPROC)glewGetProcAddress((const GLubyte*)"eglLockSurfaceKHR")) == NULL) || r; - r = ((eglUnlockSurfaceKHR = (PFNEGLUNLOCKSURFACEKHRPROC)glewGetProcAddress((const GLubyte*)"eglUnlockSurfaceKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_lock_surface */ - -#ifdef EGL_KHR_lock_surface3 - -static GLboolean _glewInit_EGL_KHR_lock_surface3 () -{ - GLboolean r = GL_FALSE; - - r = ((eglQuerySurface64KHR = (PFNEGLQUERYSURFACE64KHRPROC)glewGetProcAddress((const GLubyte*)"eglQuerySurface64KHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_lock_surface3 */ - -#ifdef EGL_KHR_partial_update - -static GLboolean _glewInit_EGL_KHR_partial_update () -{ - GLboolean r = GL_FALSE; - - r = ((eglSetDamageRegionKHR = (PFNEGLSETDAMAGEREGIONKHRPROC)glewGetProcAddress((const GLubyte*)"eglSetDamageRegionKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_partial_update */ - -#ifdef EGL_KHR_reusable_sync - -static GLboolean _glewInit_EGL_KHR_reusable_sync () -{ - GLboolean r = GL_FALSE; - - r = ((eglClientWaitSyncKHR = (PFNEGLCLIENTWAITSYNCKHRPROC)glewGetProcAddress((const GLubyte*)"eglClientWaitSyncKHR")) == NULL) || r; - r = ((eglCreateSyncKHR = (PFNEGLCREATESYNCKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateSyncKHR")) == NULL) || r; - r = ((eglDestroySyncKHR = (PFNEGLDESTROYSYNCKHRPROC)glewGetProcAddress((const GLubyte*)"eglDestroySyncKHR")) == NULL) || r; - r = ((eglGetSyncAttribKHR = (PFNEGLGETSYNCATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglGetSyncAttribKHR")) == NULL) || r; - r = ((eglSignalSyncKHR = (PFNEGLSIGNALSYNCKHRPROC)glewGetProcAddress((const GLubyte*)"eglSignalSyncKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_reusable_sync */ - -#ifdef EGL_KHR_stream - -static GLboolean _glewInit_EGL_KHR_stream () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreateStreamKHR = (PFNEGLCREATESTREAMKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateStreamKHR")) == NULL) || r; - r = ((eglDestroyStreamKHR = (PFNEGLDESTROYSTREAMKHRPROC)glewGetProcAddress((const GLubyte*)"eglDestroyStreamKHR")) == NULL) || r; - r = ((eglQueryStreamKHR = (PFNEGLQUERYSTREAMKHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryStreamKHR")) == NULL) || r; - r = ((eglQueryStreamu64KHR = (PFNEGLQUERYSTREAMU64KHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryStreamu64KHR")) == NULL) || r; - r = ((eglStreamAttribKHR = (PFNEGLSTREAMATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamAttribKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_stream */ - -#ifdef EGL_KHR_stream_attrib - -static GLboolean _glewInit_EGL_KHR_stream_attrib () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreateStreamAttribKHR = (PFNEGLCREATESTREAMATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateStreamAttribKHR")) == NULL) || r; - r = ((eglQueryStreamAttribKHR = (PFNEGLQUERYSTREAMATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryStreamAttribKHR")) == NULL) || r; - r = ((eglSetStreamAttribKHR = (PFNEGLSETSTREAMATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglSetStreamAttribKHR")) == NULL) || r; - r = ((eglStreamConsumerAcquireAttribKHR = (PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerAcquireAttribKHR")) == NULL) || r; - r = ((eglStreamConsumerReleaseAttribKHR = (PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerReleaseAttribKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_stream_attrib */ - -#ifdef EGL_KHR_stream_consumer_gltexture - -static GLboolean _glewInit_EGL_KHR_stream_consumer_gltexture () -{ - GLboolean r = GL_FALSE; - - r = ((eglStreamConsumerAcquireKHR = (PFNEGLSTREAMCONSUMERACQUIREKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerAcquireKHR")) == NULL) || r; - r = ((eglStreamConsumerGLTextureExternalKHR = (PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerGLTextureExternalKHR")) == NULL) || r; - r = ((eglStreamConsumerReleaseKHR = (PFNEGLSTREAMCONSUMERRELEASEKHRPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerReleaseKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_stream_consumer_gltexture */ - -#ifdef EGL_KHR_stream_cross_process_fd - -static GLboolean _glewInit_EGL_KHR_stream_cross_process_fd () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreateStreamFromFileDescriptorKHR = (PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateStreamFromFileDescriptorKHR")) == NULL) || r; - r = ((eglGetStreamFileDescriptorKHR = (PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC)glewGetProcAddress((const GLubyte*)"eglGetStreamFileDescriptorKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_stream_cross_process_fd */ - -#ifdef EGL_KHR_stream_fifo - -static GLboolean _glewInit_EGL_KHR_stream_fifo () -{ - GLboolean r = GL_FALSE; - - r = ((eglQueryStreamTimeKHR = (PFNEGLQUERYSTREAMTIMEKHRPROC)glewGetProcAddress((const GLubyte*)"eglQueryStreamTimeKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_stream_fifo */ - -#ifdef EGL_KHR_stream_producer_eglsurface - -static GLboolean _glewInit_EGL_KHR_stream_producer_eglsurface () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreateStreamProducerSurfaceKHR = (PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC)glewGetProcAddress((const GLubyte*)"eglCreateStreamProducerSurfaceKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_stream_producer_eglsurface */ - -#ifdef EGL_KHR_swap_buffers_with_damage - -static GLboolean _glewInit_EGL_KHR_swap_buffers_with_damage () -{ - GLboolean r = GL_FALSE; - - r = ((eglSwapBuffersWithDamageKHR = (PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC)glewGetProcAddress((const GLubyte*)"eglSwapBuffersWithDamageKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_swap_buffers_with_damage */ - -#ifdef EGL_KHR_wait_sync - -static GLboolean _glewInit_EGL_KHR_wait_sync () -{ - GLboolean r = GL_FALSE; - - r = ((eglWaitSyncKHR = (PFNEGLWAITSYNCKHRPROC)glewGetProcAddress((const GLubyte*)"eglWaitSyncKHR")) == NULL) || r; - - return r; -} - -#endif /* EGL_KHR_wait_sync */ - -#ifdef EGL_MESA_drm_image - -static GLboolean _glewInit_EGL_MESA_drm_image () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreateDRMImageMESA = (PFNEGLCREATEDRMIMAGEMESAPROC)glewGetProcAddress((const GLubyte*)"eglCreateDRMImageMESA")) == NULL) || r; - r = ((eglExportDRMImageMESA = (PFNEGLEXPORTDRMIMAGEMESAPROC)glewGetProcAddress((const GLubyte*)"eglExportDRMImageMESA")) == NULL) || r; - - return r; -} - -#endif /* EGL_MESA_drm_image */ - -#ifdef EGL_MESA_image_dma_buf_export - -static GLboolean _glewInit_EGL_MESA_image_dma_buf_export () -{ - GLboolean r = GL_FALSE; - - r = ((eglExportDMABUFImageMESA = (PFNEGLEXPORTDMABUFIMAGEMESAPROC)glewGetProcAddress((const GLubyte*)"eglExportDMABUFImageMESA")) == NULL) || r; - r = ((eglExportDMABUFImageQueryMESA = (PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC)glewGetProcAddress((const GLubyte*)"eglExportDMABUFImageQueryMESA")) == NULL) || r; - - return r; -} - -#endif /* EGL_MESA_image_dma_buf_export */ - -#ifdef EGL_NOK_swap_region - -static GLboolean _glewInit_EGL_NOK_swap_region () -{ - GLboolean r = GL_FALSE; - - r = ((eglSwapBuffersRegionNOK = (PFNEGLSWAPBUFFERSREGIONNOKPROC)glewGetProcAddress((const GLubyte*)"eglSwapBuffersRegionNOK")) == NULL) || r; - - return r; -} - -#endif /* EGL_NOK_swap_region */ - -#ifdef EGL_NOK_swap_region2 - -static GLboolean _glewInit_EGL_NOK_swap_region2 () -{ - GLboolean r = GL_FALSE; - - r = ((eglSwapBuffersRegion2NOK = (PFNEGLSWAPBUFFERSREGION2NOKPROC)glewGetProcAddress((const GLubyte*)"eglSwapBuffersRegion2NOK")) == NULL) || r; - - return r; -} - -#endif /* EGL_NOK_swap_region2 */ - -#ifdef EGL_NV_native_query - -static GLboolean _glewInit_EGL_NV_native_query () -{ - GLboolean r = GL_FALSE; - - r = ((eglQueryNativeDisplayNV = (PFNEGLQUERYNATIVEDISPLAYNVPROC)glewGetProcAddress((const GLubyte*)"eglQueryNativeDisplayNV")) == NULL) || r; - r = ((eglQueryNativePixmapNV = (PFNEGLQUERYNATIVEPIXMAPNVPROC)glewGetProcAddress((const GLubyte*)"eglQueryNativePixmapNV")) == NULL) || r; - r = ((eglQueryNativeWindowNV = (PFNEGLQUERYNATIVEWINDOWNVPROC)glewGetProcAddress((const GLubyte*)"eglQueryNativeWindowNV")) == NULL) || r; - - return r; -} - -#endif /* EGL_NV_native_query */ - -#ifdef EGL_NV_post_sub_buffer - -static GLboolean _glewInit_EGL_NV_post_sub_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((eglPostSubBufferNV = (PFNEGLPOSTSUBBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"eglPostSubBufferNV")) == NULL) || r; - - return r; -} - -#endif /* EGL_NV_post_sub_buffer */ - -#ifdef EGL_NV_stream_consumer_gltexture_yuv - -static GLboolean _glewInit_EGL_NV_stream_consumer_gltexture_yuv () -{ - GLboolean r = GL_FALSE; - - r = ((eglStreamConsumerGLTextureExternalAttribsNV = (PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC)glewGetProcAddress((const GLubyte*)"eglStreamConsumerGLTextureExternalAttribsNV")) == NULL) || r; - - return r; -} - -#endif /* EGL_NV_stream_consumer_gltexture_yuv */ - -#ifdef EGL_NV_stream_metadata - -static GLboolean _glewInit_EGL_NV_stream_metadata () -{ - GLboolean r = GL_FALSE; - - r = ((eglQueryDisplayAttribNV = (PFNEGLQUERYDISPLAYATTRIBNVPROC)glewGetProcAddress((const GLubyte*)"eglQueryDisplayAttribNV")) == NULL) || r; - r = ((eglQueryStreamMetadataNV = (PFNEGLQUERYSTREAMMETADATANVPROC)glewGetProcAddress((const GLubyte*)"eglQueryStreamMetadataNV")) == NULL) || r; - r = ((eglSetStreamMetadataNV = (PFNEGLSETSTREAMMETADATANVPROC)glewGetProcAddress((const GLubyte*)"eglSetStreamMetadataNV")) == NULL) || r; - - return r; -} - -#endif /* EGL_NV_stream_metadata */ - -#ifdef EGL_NV_stream_reset - -static GLboolean _glewInit_EGL_NV_stream_reset () -{ - GLboolean r = GL_FALSE; - - r = ((eglResetStreamNV = (PFNEGLRESETSTREAMNVPROC)glewGetProcAddress((const GLubyte*)"eglResetStreamNV")) == NULL) || r; - - return r; -} - -#endif /* EGL_NV_stream_reset */ - -#ifdef EGL_NV_stream_sync - -static GLboolean _glewInit_EGL_NV_stream_sync () -{ - GLboolean r = GL_FALSE; - - r = ((eglCreateStreamSyncNV = (PFNEGLCREATESTREAMSYNCNVPROC)glewGetProcAddress((const GLubyte*)"eglCreateStreamSyncNV")) == NULL) || r; - - return r; -} - -#endif /* EGL_NV_stream_sync */ - -#ifdef EGL_NV_sync - -static GLboolean _glewInit_EGL_NV_sync () -{ - GLboolean r = GL_FALSE; - - r = ((eglClientWaitSyncNV = (PFNEGLCLIENTWAITSYNCNVPROC)glewGetProcAddress((const GLubyte*)"eglClientWaitSyncNV")) == NULL) || r; - r = ((eglCreateFenceSyncNV = (PFNEGLCREATEFENCESYNCNVPROC)glewGetProcAddress((const GLubyte*)"eglCreateFenceSyncNV")) == NULL) || r; - r = ((eglDestroySyncNV = (PFNEGLDESTROYSYNCNVPROC)glewGetProcAddress((const GLubyte*)"eglDestroySyncNV")) == NULL) || r; - r = ((eglFenceNV = (PFNEGLFENCENVPROC)glewGetProcAddress((const GLubyte*)"eglFenceNV")) == NULL) || r; - r = ((eglGetSyncAttribNV = (PFNEGLGETSYNCATTRIBNVPROC)glewGetProcAddress((const GLubyte*)"eglGetSyncAttribNV")) == NULL) || r; - r = ((eglSignalSyncNV = (PFNEGLSIGNALSYNCNVPROC)glewGetProcAddress((const GLubyte*)"eglSignalSyncNV")) == NULL) || r; - - return r; -} - -#endif /* EGL_NV_sync */ - -#ifdef EGL_NV_system_time - -static GLboolean _glewInit_EGL_NV_system_time () -{ - GLboolean r = GL_FALSE; - - r = ((eglGetSystemTimeFrequencyNV = (PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC)glewGetProcAddress((const GLubyte*)"eglGetSystemTimeFrequencyNV")) == NULL) || r; - r = ((eglGetSystemTimeNV = (PFNEGLGETSYSTEMTIMENVPROC)glewGetProcAddress((const GLubyte*)"eglGetSystemTimeNV")) == NULL) || r; - - return r; -} - -#endif /* EGL_NV_system_time */ - - /* ------------------------------------------------------------------------ */ - -GLboolean eglewGetExtension (const char* name) -{ - const GLubyte* start; - const GLubyte* end; - - start = (const GLubyte*) eglQueryString(eglGetCurrentDisplay(), EGL_EXTENSIONS); - if (0 == start) return GL_FALSE; - end = start + _glewStrLen(start); - return _glewSearchExtension(name, start, end); -} - -GLenum eglewInit (EGLDisplay display) -{ - EGLint major, minor; - const GLubyte* extStart; - const GLubyte* extEnd; - PFNEGLINITIALIZEPROC initialize = NULL; - PFNEGLQUERYSTRINGPROC queryString = NULL; - - /* Load necessary entry points */ - initialize = (PFNEGLINITIALIZEPROC) glewGetProcAddress("eglInitialize"); - queryString = (PFNEGLQUERYSTRINGPROC) glewGetProcAddress("eglQueryString"); - if (!initialize || !queryString) - return 1; - - /* query EGK version */ - if (initialize(display, &major, &minor) != EGL_TRUE) - return 1; - - EGLEW_VERSION_1_5 = ( major > 1 ) || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE; - EGLEW_VERSION_1_4 = EGLEW_VERSION_1_5 == GL_TRUE || ( major == 1 && minor >= 4 ) ? GL_TRUE : GL_FALSE; - EGLEW_VERSION_1_3 = EGLEW_VERSION_1_4 == GL_TRUE || ( major == 1 && minor >= 3 ) ? GL_TRUE : GL_FALSE; - EGLEW_VERSION_1_2 = EGLEW_VERSION_1_3 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE; - EGLEW_VERSION_1_1 = EGLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE; - EGLEW_VERSION_1_0 = EGLEW_VERSION_1_1 == GL_TRUE || ( major == 1 && minor >= 0 ) ? GL_TRUE : GL_FALSE; - - /* query EGL extension string */ - extStart = (const GLubyte*) queryString(display, EGL_EXTENSIONS); - if (extStart == 0) - extStart = (const GLubyte *)""; - extEnd = extStart + _glewStrLen(extStart); - - /* initialize extensions */ -#ifdef EGL_VERSION_1_0 - if (glewExperimental || EGLEW_VERSION_1_0) EGLEW_VERSION_1_0 = !_glewInit_EGL_VERSION_1_0(); -#endif /* EGL_VERSION_1_0 */ -#ifdef EGL_VERSION_1_1 - if (glewExperimental || EGLEW_VERSION_1_1) EGLEW_VERSION_1_1 = !_glewInit_EGL_VERSION_1_1(); -#endif /* EGL_VERSION_1_1 */ -#ifdef EGL_VERSION_1_2 - if (glewExperimental || EGLEW_VERSION_1_2) EGLEW_VERSION_1_2 = !_glewInit_EGL_VERSION_1_2(); -#endif /* EGL_VERSION_1_2 */ -#ifdef EGL_VERSION_1_4 - if (glewExperimental || EGLEW_VERSION_1_4) EGLEW_VERSION_1_4 = !_glewInit_EGL_VERSION_1_4(); -#endif /* EGL_VERSION_1_4 */ -#ifdef EGL_VERSION_1_5 - if (glewExperimental || EGLEW_VERSION_1_5) EGLEW_VERSION_1_5 = !_glewInit_EGL_VERSION_1_5(); -#endif /* EGL_VERSION_1_5 */ -#ifdef EGL_ANDROID_blob_cache - EGLEW_ANDROID_blob_cache = _glewSearchExtension("EGL_ANDROID_blob_cache", extStart, extEnd); - if (glewExperimental || EGLEW_ANDROID_blob_cache) EGLEW_ANDROID_blob_cache = !_glewInit_EGL_ANDROID_blob_cache(); -#endif /* EGL_ANDROID_blob_cache */ -#ifdef EGL_ANDROID_create_native_client_buffer - EGLEW_ANDROID_create_native_client_buffer = _glewSearchExtension("EGL_ANDROID_create_native_client_buffer", extStart, extEnd); - if (glewExperimental || EGLEW_ANDROID_create_native_client_buffer) EGLEW_ANDROID_create_native_client_buffer = !_glewInit_EGL_ANDROID_create_native_client_buffer(); -#endif /* EGL_ANDROID_create_native_client_buffer */ -#ifdef EGL_ANDROID_framebuffer_target - EGLEW_ANDROID_framebuffer_target = _glewSearchExtension("EGL_ANDROID_framebuffer_target", extStart, extEnd); -#endif /* EGL_ANDROID_framebuffer_target */ -#ifdef EGL_ANDROID_front_buffer_auto_refresh - EGLEW_ANDROID_front_buffer_auto_refresh = _glewSearchExtension("EGL_ANDROID_front_buffer_auto_refresh", extStart, extEnd); -#endif /* EGL_ANDROID_front_buffer_auto_refresh */ -#ifdef EGL_ANDROID_image_native_buffer - EGLEW_ANDROID_image_native_buffer = _glewSearchExtension("EGL_ANDROID_image_native_buffer", extStart, extEnd); -#endif /* EGL_ANDROID_image_native_buffer */ -#ifdef EGL_ANDROID_native_fence_sync - EGLEW_ANDROID_native_fence_sync = _glewSearchExtension("EGL_ANDROID_native_fence_sync", extStart, extEnd); - if (glewExperimental || EGLEW_ANDROID_native_fence_sync) EGLEW_ANDROID_native_fence_sync = !_glewInit_EGL_ANDROID_native_fence_sync(); -#endif /* EGL_ANDROID_native_fence_sync */ -#ifdef EGL_ANDROID_presentation_time - EGLEW_ANDROID_presentation_time = _glewSearchExtension("EGL_ANDROID_presentation_time", extStart, extEnd); - if (glewExperimental || EGLEW_ANDROID_presentation_time) EGLEW_ANDROID_presentation_time = !_glewInit_EGL_ANDROID_presentation_time(); -#endif /* EGL_ANDROID_presentation_time */ -#ifdef EGL_ANDROID_recordable - EGLEW_ANDROID_recordable = _glewSearchExtension("EGL_ANDROID_recordable", extStart, extEnd); -#endif /* EGL_ANDROID_recordable */ -#ifdef EGL_ANGLE_d3d_share_handle_client_buffer - EGLEW_ANGLE_d3d_share_handle_client_buffer = _glewSearchExtension("EGL_ANGLE_d3d_share_handle_client_buffer", extStart, extEnd); -#endif /* EGL_ANGLE_d3d_share_handle_client_buffer */ -#ifdef EGL_ANGLE_device_d3d - EGLEW_ANGLE_device_d3d = _glewSearchExtension("EGL_ANGLE_device_d3d", extStart, extEnd); -#endif /* EGL_ANGLE_device_d3d */ -#ifdef EGL_ANGLE_query_surface_pointer - EGLEW_ANGLE_query_surface_pointer = _glewSearchExtension("EGL_ANGLE_query_surface_pointer", extStart, extEnd); - if (glewExperimental || EGLEW_ANGLE_query_surface_pointer) EGLEW_ANGLE_query_surface_pointer = !_glewInit_EGL_ANGLE_query_surface_pointer(); -#endif /* EGL_ANGLE_query_surface_pointer */ -#ifdef EGL_ANGLE_surface_d3d_texture_2d_share_handle - EGLEW_ANGLE_surface_d3d_texture_2d_share_handle = _glewSearchExtension("EGL_ANGLE_surface_d3d_texture_2d_share_handle", extStart, extEnd); -#endif /* EGL_ANGLE_surface_d3d_texture_2d_share_handle */ -#ifdef EGL_ANGLE_window_fixed_size - EGLEW_ANGLE_window_fixed_size = _glewSearchExtension("EGL_ANGLE_window_fixed_size", extStart, extEnd); -#endif /* EGL_ANGLE_window_fixed_size */ -#ifdef EGL_ARM_implicit_external_sync - EGLEW_ARM_implicit_external_sync = _glewSearchExtension("EGL_ARM_implicit_external_sync", extStart, extEnd); -#endif /* EGL_ARM_implicit_external_sync */ -#ifdef EGL_ARM_pixmap_multisample_discard - EGLEW_ARM_pixmap_multisample_discard = _glewSearchExtension("EGL_ARM_pixmap_multisample_discard", extStart, extEnd); -#endif /* EGL_ARM_pixmap_multisample_discard */ -#ifdef EGL_EXT_buffer_age - EGLEW_EXT_buffer_age = _glewSearchExtension("EGL_EXT_buffer_age", extStart, extEnd); -#endif /* EGL_EXT_buffer_age */ -#ifdef EGL_EXT_client_extensions - EGLEW_EXT_client_extensions = _glewSearchExtension("EGL_EXT_client_extensions", extStart, extEnd); -#endif /* EGL_EXT_client_extensions */ -#ifdef EGL_EXT_create_context_robustness - EGLEW_EXT_create_context_robustness = _glewSearchExtension("EGL_EXT_create_context_robustness", extStart, extEnd); -#endif /* EGL_EXT_create_context_robustness */ -#ifdef EGL_EXT_device_base - EGLEW_EXT_device_base = _glewSearchExtension("EGL_EXT_device_base", extStart, extEnd); -#endif /* EGL_EXT_device_base */ -#ifdef EGL_EXT_device_drm - EGLEW_EXT_device_drm = _glewSearchExtension("EGL_EXT_device_drm", extStart, extEnd); -#endif /* EGL_EXT_device_drm */ -#ifdef EGL_EXT_device_enumeration - EGLEW_EXT_device_enumeration = _glewSearchExtension("EGL_EXT_device_enumeration", extStart, extEnd); - if (glewExperimental || EGLEW_EXT_device_enumeration) EGLEW_EXT_device_enumeration = !_glewInit_EGL_EXT_device_enumeration(); -#endif /* EGL_EXT_device_enumeration */ -#ifdef EGL_EXT_device_openwf - EGLEW_EXT_device_openwf = _glewSearchExtension("EGL_EXT_device_openwf", extStart, extEnd); -#endif /* EGL_EXT_device_openwf */ -#ifdef EGL_EXT_device_query - EGLEW_EXT_device_query = _glewSearchExtension("EGL_EXT_device_query", extStart, extEnd); - if (glewExperimental || EGLEW_EXT_device_query) EGLEW_EXT_device_query = !_glewInit_EGL_EXT_device_query(); -#endif /* EGL_EXT_device_query */ -#ifdef EGL_EXT_gl_colorspace_bt2020_linear - EGLEW_EXT_gl_colorspace_bt2020_linear = _glewSearchExtension("EGL_EXT_gl_colorspace_bt2020_linear", extStart, extEnd); -#endif /* EGL_EXT_gl_colorspace_bt2020_linear */ -#ifdef EGL_EXT_gl_colorspace_bt2020_pq - EGLEW_EXT_gl_colorspace_bt2020_pq = _glewSearchExtension("EGL_EXT_gl_colorspace_bt2020_pq", extStart, extEnd); -#endif /* EGL_EXT_gl_colorspace_bt2020_pq */ -#ifdef EGL_EXT_gl_colorspace_scrgb_linear - EGLEW_EXT_gl_colorspace_scrgb_linear = _glewSearchExtension("EGL_EXT_gl_colorspace_scrgb_linear", extStart, extEnd); -#endif /* EGL_EXT_gl_colorspace_scrgb_linear */ -#ifdef EGL_EXT_image_dma_buf_import - EGLEW_EXT_image_dma_buf_import = _glewSearchExtension("EGL_EXT_image_dma_buf_import", extStart, extEnd); -#endif /* EGL_EXT_image_dma_buf_import */ -#ifdef EGL_EXT_image_dma_buf_import_modifiers - EGLEW_EXT_image_dma_buf_import_modifiers = _glewSearchExtension("EGL_EXT_image_dma_buf_import_modifiers", extStart, extEnd); - if (glewExperimental || EGLEW_EXT_image_dma_buf_import_modifiers) EGLEW_EXT_image_dma_buf_import_modifiers = !_glewInit_EGL_EXT_image_dma_buf_import_modifiers(); -#endif /* EGL_EXT_image_dma_buf_import_modifiers */ -#ifdef EGL_EXT_multiview_window - EGLEW_EXT_multiview_window = _glewSearchExtension("EGL_EXT_multiview_window", extStart, extEnd); -#endif /* EGL_EXT_multiview_window */ -#ifdef EGL_EXT_output_base - EGLEW_EXT_output_base = _glewSearchExtension("EGL_EXT_output_base", extStart, extEnd); - if (glewExperimental || EGLEW_EXT_output_base) EGLEW_EXT_output_base = !_glewInit_EGL_EXT_output_base(); -#endif /* EGL_EXT_output_base */ -#ifdef EGL_EXT_output_drm - EGLEW_EXT_output_drm = _glewSearchExtension("EGL_EXT_output_drm", extStart, extEnd); -#endif /* EGL_EXT_output_drm */ -#ifdef EGL_EXT_output_openwf - EGLEW_EXT_output_openwf = _glewSearchExtension("EGL_EXT_output_openwf", extStart, extEnd); -#endif /* EGL_EXT_output_openwf */ -#ifdef EGL_EXT_pixel_format_float - EGLEW_EXT_pixel_format_float = _glewSearchExtension("EGL_EXT_pixel_format_float", extStart, extEnd); -#endif /* EGL_EXT_pixel_format_float */ -#ifdef EGL_EXT_platform_base - EGLEW_EXT_platform_base = _glewSearchExtension("EGL_EXT_platform_base", extStart, extEnd); - if (glewExperimental || EGLEW_EXT_platform_base) EGLEW_EXT_platform_base = !_glewInit_EGL_EXT_platform_base(); -#endif /* EGL_EXT_platform_base */ -#ifdef EGL_EXT_platform_device - EGLEW_EXT_platform_device = _glewSearchExtension("EGL_EXT_platform_device", extStart, extEnd); -#endif /* EGL_EXT_platform_device */ -#ifdef EGL_EXT_platform_wayland - EGLEW_EXT_platform_wayland = _glewSearchExtension("EGL_EXT_platform_wayland", extStart, extEnd); -#endif /* EGL_EXT_platform_wayland */ -#ifdef EGL_EXT_platform_x11 - EGLEW_EXT_platform_x11 = _glewSearchExtension("EGL_EXT_platform_x11", extStart, extEnd); -#endif /* EGL_EXT_platform_x11 */ -#ifdef EGL_EXT_protected_content - EGLEW_EXT_protected_content = _glewSearchExtension("EGL_EXT_protected_content", extStart, extEnd); -#endif /* EGL_EXT_protected_content */ -#ifdef EGL_EXT_protected_surface - EGLEW_EXT_protected_surface = _glewSearchExtension("EGL_EXT_protected_surface", extStart, extEnd); -#endif /* EGL_EXT_protected_surface */ -#ifdef EGL_EXT_stream_consumer_egloutput - EGLEW_EXT_stream_consumer_egloutput = _glewSearchExtension("EGL_EXT_stream_consumer_egloutput", extStart, extEnd); - if (glewExperimental || EGLEW_EXT_stream_consumer_egloutput) EGLEW_EXT_stream_consumer_egloutput = !_glewInit_EGL_EXT_stream_consumer_egloutput(); -#endif /* EGL_EXT_stream_consumer_egloutput */ -#ifdef EGL_EXT_surface_SMPTE2086_metadata - EGLEW_EXT_surface_SMPTE2086_metadata = _glewSearchExtension("EGL_EXT_surface_SMPTE2086_metadata", extStart, extEnd); -#endif /* EGL_EXT_surface_SMPTE2086_metadata */ -#ifdef EGL_EXT_swap_buffers_with_damage - EGLEW_EXT_swap_buffers_with_damage = _glewSearchExtension("EGL_EXT_swap_buffers_with_damage", extStart, extEnd); - if (glewExperimental || EGLEW_EXT_swap_buffers_with_damage) EGLEW_EXT_swap_buffers_with_damage = !_glewInit_EGL_EXT_swap_buffers_with_damage(); -#endif /* EGL_EXT_swap_buffers_with_damage */ -#ifdef EGL_EXT_yuv_surface - EGLEW_EXT_yuv_surface = _glewSearchExtension("EGL_EXT_yuv_surface", extStart, extEnd); -#endif /* EGL_EXT_yuv_surface */ -#ifdef EGL_HI_clientpixmap - EGLEW_HI_clientpixmap = _glewSearchExtension("EGL_HI_clientpixmap", extStart, extEnd); - if (glewExperimental || EGLEW_HI_clientpixmap) EGLEW_HI_clientpixmap = !_glewInit_EGL_HI_clientpixmap(); -#endif /* EGL_HI_clientpixmap */ -#ifdef EGL_HI_colorformats - EGLEW_HI_colorformats = _glewSearchExtension("EGL_HI_colorformats", extStart, extEnd); -#endif /* EGL_HI_colorformats */ -#ifdef EGL_IMG_context_priority - EGLEW_IMG_context_priority = _glewSearchExtension("EGL_IMG_context_priority", extStart, extEnd); -#endif /* EGL_IMG_context_priority */ -#ifdef EGL_IMG_image_plane_attribs - EGLEW_IMG_image_plane_attribs = _glewSearchExtension("EGL_IMG_image_plane_attribs", extStart, extEnd); -#endif /* EGL_IMG_image_plane_attribs */ -#ifdef EGL_KHR_cl_event - EGLEW_KHR_cl_event = _glewSearchExtension("EGL_KHR_cl_event", extStart, extEnd); -#endif /* EGL_KHR_cl_event */ -#ifdef EGL_KHR_cl_event2 - EGLEW_KHR_cl_event2 = _glewSearchExtension("EGL_KHR_cl_event2", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_cl_event2) EGLEW_KHR_cl_event2 = !_glewInit_EGL_KHR_cl_event2(); -#endif /* EGL_KHR_cl_event2 */ -#ifdef EGL_KHR_client_get_all_proc_addresses - EGLEW_KHR_client_get_all_proc_addresses = _glewSearchExtension("EGL_KHR_client_get_all_proc_addresses", extStart, extEnd); -#endif /* EGL_KHR_client_get_all_proc_addresses */ -#ifdef EGL_KHR_config_attribs - EGLEW_KHR_config_attribs = _glewSearchExtension("EGL_KHR_config_attribs", extStart, extEnd); -#endif /* EGL_KHR_config_attribs */ -#ifdef EGL_KHR_context_flush_control - EGLEW_KHR_context_flush_control = _glewSearchExtension("EGL_KHR_context_flush_control", extStart, extEnd); -#endif /* EGL_KHR_context_flush_control */ -#ifdef EGL_KHR_create_context - EGLEW_KHR_create_context = _glewSearchExtension("EGL_KHR_create_context", extStart, extEnd); -#endif /* EGL_KHR_create_context */ -#ifdef EGL_KHR_create_context_no_error - EGLEW_KHR_create_context_no_error = _glewSearchExtension("EGL_KHR_create_context_no_error", extStart, extEnd); -#endif /* EGL_KHR_create_context_no_error */ -#ifdef EGL_KHR_debug - EGLEW_KHR_debug = _glewSearchExtension("EGL_KHR_debug", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_debug) EGLEW_KHR_debug = !_glewInit_EGL_KHR_debug(); -#endif /* EGL_KHR_debug */ -#ifdef EGL_KHR_fence_sync - EGLEW_KHR_fence_sync = _glewSearchExtension("EGL_KHR_fence_sync", extStart, extEnd); -#endif /* EGL_KHR_fence_sync */ -#ifdef EGL_KHR_get_all_proc_addresses - EGLEW_KHR_get_all_proc_addresses = _glewSearchExtension("EGL_KHR_get_all_proc_addresses", extStart, extEnd); -#endif /* EGL_KHR_get_all_proc_addresses */ -#ifdef EGL_KHR_gl_colorspace - EGLEW_KHR_gl_colorspace = _glewSearchExtension("EGL_KHR_gl_colorspace", extStart, extEnd); -#endif /* EGL_KHR_gl_colorspace */ -#ifdef EGL_KHR_gl_renderbuffer_image - EGLEW_KHR_gl_renderbuffer_image = _glewSearchExtension("EGL_KHR_gl_renderbuffer_image", extStart, extEnd); -#endif /* EGL_KHR_gl_renderbuffer_image */ -#ifdef EGL_KHR_gl_texture_2D_image - EGLEW_KHR_gl_texture_2D_image = _glewSearchExtension("EGL_KHR_gl_texture_2D_image", extStart, extEnd); -#endif /* EGL_KHR_gl_texture_2D_image */ -#ifdef EGL_KHR_gl_texture_3D_image - EGLEW_KHR_gl_texture_3D_image = _glewSearchExtension("EGL_KHR_gl_texture_3D_image", extStart, extEnd); -#endif /* EGL_KHR_gl_texture_3D_image */ -#ifdef EGL_KHR_gl_texture_cubemap_image - EGLEW_KHR_gl_texture_cubemap_image = _glewSearchExtension("EGL_KHR_gl_texture_cubemap_image", extStart, extEnd); -#endif /* EGL_KHR_gl_texture_cubemap_image */ -#ifdef EGL_KHR_image - EGLEW_KHR_image = _glewSearchExtension("EGL_KHR_image", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_image) EGLEW_KHR_image = !_glewInit_EGL_KHR_image(); -#endif /* EGL_KHR_image */ -#ifdef EGL_KHR_image_base - EGLEW_KHR_image_base = _glewSearchExtension("EGL_KHR_image_base", extStart, extEnd); -#endif /* EGL_KHR_image_base */ -#ifdef EGL_KHR_image_pixmap - EGLEW_KHR_image_pixmap = _glewSearchExtension("EGL_KHR_image_pixmap", extStart, extEnd); -#endif /* EGL_KHR_image_pixmap */ -#ifdef EGL_KHR_lock_surface - EGLEW_KHR_lock_surface = _glewSearchExtension("EGL_KHR_lock_surface", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_lock_surface) EGLEW_KHR_lock_surface = !_glewInit_EGL_KHR_lock_surface(); -#endif /* EGL_KHR_lock_surface */ -#ifdef EGL_KHR_lock_surface2 - EGLEW_KHR_lock_surface2 = _glewSearchExtension("EGL_KHR_lock_surface2", extStart, extEnd); -#endif /* EGL_KHR_lock_surface2 */ -#ifdef EGL_KHR_lock_surface3 - EGLEW_KHR_lock_surface3 = _glewSearchExtension("EGL_KHR_lock_surface3", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_lock_surface3) EGLEW_KHR_lock_surface3 = !_glewInit_EGL_KHR_lock_surface3(); -#endif /* EGL_KHR_lock_surface3 */ -#ifdef EGL_KHR_mutable_render_buffer - EGLEW_KHR_mutable_render_buffer = _glewSearchExtension("EGL_KHR_mutable_render_buffer", extStart, extEnd); -#endif /* EGL_KHR_mutable_render_buffer */ -#ifdef EGL_KHR_no_config_context - EGLEW_KHR_no_config_context = _glewSearchExtension("EGL_KHR_no_config_context", extStart, extEnd); -#endif /* EGL_KHR_no_config_context */ -#ifdef EGL_KHR_partial_update - EGLEW_KHR_partial_update = _glewSearchExtension("EGL_KHR_partial_update", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_partial_update) EGLEW_KHR_partial_update = !_glewInit_EGL_KHR_partial_update(); -#endif /* EGL_KHR_partial_update */ -#ifdef EGL_KHR_platform_android - EGLEW_KHR_platform_android = _glewSearchExtension("EGL_KHR_platform_android", extStart, extEnd); -#endif /* EGL_KHR_platform_android */ -#ifdef EGL_KHR_platform_gbm - EGLEW_KHR_platform_gbm = _glewSearchExtension("EGL_KHR_platform_gbm", extStart, extEnd); -#endif /* EGL_KHR_platform_gbm */ -#ifdef EGL_KHR_platform_wayland - EGLEW_KHR_platform_wayland = _glewSearchExtension("EGL_KHR_platform_wayland", extStart, extEnd); -#endif /* EGL_KHR_platform_wayland */ -#ifdef EGL_KHR_platform_x11 - EGLEW_KHR_platform_x11 = _glewSearchExtension("EGL_KHR_platform_x11", extStart, extEnd); -#endif /* EGL_KHR_platform_x11 */ -#ifdef EGL_KHR_reusable_sync - EGLEW_KHR_reusable_sync = _glewSearchExtension("EGL_KHR_reusable_sync", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_reusable_sync) EGLEW_KHR_reusable_sync = !_glewInit_EGL_KHR_reusable_sync(); -#endif /* EGL_KHR_reusable_sync */ -#ifdef EGL_KHR_stream - EGLEW_KHR_stream = _glewSearchExtension("EGL_KHR_stream", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_stream) EGLEW_KHR_stream = !_glewInit_EGL_KHR_stream(); -#endif /* EGL_KHR_stream */ -#ifdef EGL_KHR_stream_attrib - EGLEW_KHR_stream_attrib = _glewSearchExtension("EGL_KHR_stream_attrib", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_stream_attrib) EGLEW_KHR_stream_attrib = !_glewInit_EGL_KHR_stream_attrib(); -#endif /* EGL_KHR_stream_attrib */ -#ifdef EGL_KHR_stream_consumer_gltexture - EGLEW_KHR_stream_consumer_gltexture = _glewSearchExtension("EGL_KHR_stream_consumer_gltexture", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_stream_consumer_gltexture) EGLEW_KHR_stream_consumer_gltexture = !_glewInit_EGL_KHR_stream_consumer_gltexture(); -#endif /* EGL_KHR_stream_consumer_gltexture */ -#ifdef EGL_KHR_stream_cross_process_fd - EGLEW_KHR_stream_cross_process_fd = _glewSearchExtension("EGL_KHR_stream_cross_process_fd", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_stream_cross_process_fd) EGLEW_KHR_stream_cross_process_fd = !_glewInit_EGL_KHR_stream_cross_process_fd(); -#endif /* EGL_KHR_stream_cross_process_fd */ -#ifdef EGL_KHR_stream_fifo - EGLEW_KHR_stream_fifo = _glewSearchExtension("EGL_KHR_stream_fifo", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_stream_fifo) EGLEW_KHR_stream_fifo = !_glewInit_EGL_KHR_stream_fifo(); -#endif /* EGL_KHR_stream_fifo */ -#ifdef EGL_KHR_stream_producer_aldatalocator - EGLEW_KHR_stream_producer_aldatalocator = _glewSearchExtension("EGL_KHR_stream_producer_aldatalocator", extStart, extEnd); -#endif /* EGL_KHR_stream_producer_aldatalocator */ -#ifdef EGL_KHR_stream_producer_eglsurface - EGLEW_KHR_stream_producer_eglsurface = _glewSearchExtension("EGL_KHR_stream_producer_eglsurface", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_stream_producer_eglsurface) EGLEW_KHR_stream_producer_eglsurface = !_glewInit_EGL_KHR_stream_producer_eglsurface(); -#endif /* EGL_KHR_stream_producer_eglsurface */ -#ifdef EGL_KHR_surfaceless_context - EGLEW_KHR_surfaceless_context = _glewSearchExtension("EGL_KHR_surfaceless_context", extStart, extEnd); -#endif /* EGL_KHR_surfaceless_context */ -#ifdef EGL_KHR_swap_buffers_with_damage - EGLEW_KHR_swap_buffers_with_damage = _glewSearchExtension("EGL_KHR_swap_buffers_with_damage", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_swap_buffers_with_damage) EGLEW_KHR_swap_buffers_with_damage = !_glewInit_EGL_KHR_swap_buffers_with_damage(); -#endif /* EGL_KHR_swap_buffers_with_damage */ -#ifdef EGL_KHR_vg_parent_image - EGLEW_KHR_vg_parent_image = _glewSearchExtension("EGL_KHR_vg_parent_image", extStart, extEnd); -#endif /* EGL_KHR_vg_parent_image */ -#ifdef EGL_KHR_wait_sync - EGLEW_KHR_wait_sync = _glewSearchExtension("EGL_KHR_wait_sync", extStart, extEnd); - if (glewExperimental || EGLEW_KHR_wait_sync) EGLEW_KHR_wait_sync = !_glewInit_EGL_KHR_wait_sync(); -#endif /* EGL_KHR_wait_sync */ -#ifdef EGL_MESA_drm_image - EGLEW_MESA_drm_image = _glewSearchExtension("EGL_MESA_drm_image", extStart, extEnd); - if (glewExperimental || EGLEW_MESA_drm_image) EGLEW_MESA_drm_image = !_glewInit_EGL_MESA_drm_image(); -#endif /* EGL_MESA_drm_image */ -#ifdef EGL_MESA_image_dma_buf_export - EGLEW_MESA_image_dma_buf_export = _glewSearchExtension("EGL_MESA_image_dma_buf_export", extStart, extEnd); - if (glewExperimental || EGLEW_MESA_image_dma_buf_export) EGLEW_MESA_image_dma_buf_export = !_glewInit_EGL_MESA_image_dma_buf_export(); -#endif /* EGL_MESA_image_dma_buf_export */ -#ifdef EGL_MESA_platform_gbm - EGLEW_MESA_platform_gbm = _glewSearchExtension("EGL_MESA_platform_gbm", extStart, extEnd); -#endif /* EGL_MESA_platform_gbm */ -#ifdef EGL_MESA_platform_surfaceless - EGLEW_MESA_platform_surfaceless = _glewSearchExtension("EGL_MESA_platform_surfaceless", extStart, extEnd); -#endif /* EGL_MESA_platform_surfaceless */ -#ifdef EGL_NOK_swap_region - EGLEW_NOK_swap_region = _glewSearchExtension("EGL_NOK_swap_region", extStart, extEnd); - if (glewExperimental || EGLEW_NOK_swap_region) EGLEW_NOK_swap_region = !_glewInit_EGL_NOK_swap_region(); -#endif /* EGL_NOK_swap_region */ -#ifdef EGL_NOK_swap_region2 - EGLEW_NOK_swap_region2 = _glewSearchExtension("EGL_NOK_swap_region2", extStart, extEnd); - if (glewExperimental || EGLEW_NOK_swap_region2) EGLEW_NOK_swap_region2 = !_glewInit_EGL_NOK_swap_region2(); -#endif /* EGL_NOK_swap_region2 */ -#ifdef EGL_NOK_texture_from_pixmap - EGLEW_NOK_texture_from_pixmap = _glewSearchExtension("EGL_NOK_texture_from_pixmap", extStart, extEnd); -#endif /* EGL_NOK_texture_from_pixmap */ -#ifdef EGL_NV_3dvision_surface - EGLEW_NV_3dvision_surface = _glewSearchExtension("EGL_NV_3dvision_surface", extStart, extEnd); -#endif /* EGL_NV_3dvision_surface */ -#ifdef EGL_NV_coverage_sample - EGLEW_NV_coverage_sample = _glewSearchExtension("EGL_NV_coverage_sample", extStart, extEnd); -#endif /* EGL_NV_coverage_sample */ -#ifdef EGL_NV_coverage_sample_resolve - EGLEW_NV_coverage_sample_resolve = _glewSearchExtension("EGL_NV_coverage_sample_resolve", extStart, extEnd); -#endif /* EGL_NV_coverage_sample_resolve */ -#ifdef EGL_NV_cuda_event - EGLEW_NV_cuda_event = _glewSearchExtension("EGL_NV_cuda_event", extStart, extEnd); -#endif /* EGL_NV_cuda_event */ -#ifdef EGL_NV_depth_nonlinear - EGLEW_NV_depth_nonlinear = _glewSearchExtension("EGL_NV_depth_nonlinear", extStart, extEnd); -#endif /* EGL_NV_depth_nonlinear */ -#ifdef EGL_NV_device_cuda - EGLEW_NV_device_cuda = _glewSearchExtension("EGL_NV_device_cuda", extStart, extEnd); -#endif /* EGL_NV_device_cuda */ -#ifdef EGL_NV_native_query - EGLEW_NV_native_query = _glewSearchExtension("EGL_NV_native_query", extStart, extEnd); - if (glewExperimental || EGLEW_NV_native_query) EGLEW_NV_native_query = !_glewInit_EGL_NV_native_query(); -#endif /* EGL_NV_native_query */ -#ifdef EGL_NV_post_convert_rounding - EGLEW_NV_post_convert_rounding = _glewSearchExtension("EGL_NV_post_convert_rounding", extStart, extEnd); -#endif /* EGL_NV_post_convert_rounding */ -#ifdef EGL_NV_post_sub_buffer - EGLEW_NV_post_sub_buffer = _glewSearchExtension("EGL_NV_post_sub_buffer", extStart, extEnd); - if (glewExperimental || EGLEW_NV_post_sub_buffer) EGLEW_NV_post_sub_buffer = !_glewInit_EGL_NV_post_sub_buffer(); -#endif /* EGL_NV_post_sub_buffer */ -#ifdef EGL_NV_robustness_video_memory_purge - EGLEW_NV_robustness_video_memory_purge = _glewSearchExtension("EGL_NV_robustness_video_memory_purge", extStart, extEnd); -#endif /* EGL_NV_robustness_video_memory_purge */ -#ifdef EGL_NV_stream_consumer_gltexture_yuv - EGLEW_NV_stream_consumer_gltexture_yuv = _glewSearchExtension("EGL_NV_stream_consumer_gltexture_yuv", extStart, extEnd); - if (glewExperimental || EGLEW_NV_stream_consumer_gltexture_yuv) EGLEW_NV_stream_consumer_gltexture_yuv = !_glewInit_EGL_NV_stream_consumer_gltexture_yuv(); -#endif /* EGL_NV_stream_consumer_gltexture_yuv */ -#ifdef EGL_NV_stream_cross_display - EGLEW_NV_stream_cross_display = _glewSearchExtension("EGL_NV_stream_cross_display", extStart, extEnd); -#endif /* EGL_NV_stream_cross_display */ -#ifdef EGL_NV_stream_cross_object - EGLEW_NV_stream_cross_object = _glewSearchExtension("EGL_NV_stream_cross_object", extStart, extEnd); -#endif /* EGL_NV_stream_cross_object */ -#ifdef EGL_NV_stream_cross_partition - EGLEW_NV_stream_cross_partition = _glewSearchExtension("EGL_NV_stream_cross_partition", extStart, extEnd); -#endif /* EGL_NV_stream_cross_partition */ -#ifdef EGL_NV_stream_cross_process - EGLEW_NV_stream_cross_process = _glewSearchExtension("EGL_NV_stream_cross_process", extStart, extEnd); -#endif /* EGL_NV_stream_cross_process */ -#ifdef EGL_NV_stream_cross_system - EGLEW_NV_stream_cross_system = _glewSearchExtension("EGL_NV_stream_cross_system", extStart, extEnd); -#endif /* EGL_NV_stream_cross_system */ -#ifdef EGL_NV_stream_fifo_next - EGLEW_NV_stream_fifo_next = _glewSearchExtension("EGL_NV_stream_fifo_next", extStart, extEnd); -#endif /* EGL_NV_stream_fifo_next */ -#ifdef EGL_NV_stream_fifo_synchronous - EGLEW_NV_stream_fifo_synchronous = _glewSearchExtension("EGL_NV_stream_fifo_synchronous", extStart, extEnd); -#endif /* EGL_NV_stream_fifo_synchronous */ -#ifdef EGL_NV_stream_frame_limits - EGLEW_NV_stream_frame_limits = _glewSearchExtension("EGL_NV_stream_frame_limits", extStart, extEnd); -#endif /* EGL_NV_stream_frame_limits */ -#ifdef EGL_NV_stream_metadata - EGLEW_NV_stream_metadata = _glewSearchExtension("EGL_NV_stream_metadata", extStart, extEnd); - if (glewExperimental || EGLEW_NV_stream_metadata) EGLEW_NV_stream_metadata = !_glewInit_EGL_NV_stream_metadata(); -#endif /* EGL_NV_stream_metadata */ -#ifdef EGL_NV_stream_remote - EGLEW_NV_stream_remote = _glewSearchExtension("EGL_NV_stream_remote", extStart, extEnd); -#endif /* EGL_NV_stream_remote */ -#ifdef EGL_NV_stream_reset - EGLEW_NV_stream_reset = _glewSearchExtension("EGL_NV_stream_reset", extStart, extEnd); - if (glewExperimental || EGLEW_NV_stream_reset) EGLEW_NV_stream_reset = !_glewInit_EGL_NV_stream_reset(); -#endif /* EGL_NV_stream_reset */ -#ifdef EGL_NV_stream_socket - EGLEW_NV_stream_socket = _glewSearchExtension("EGL_NV_stream_socket", extStart, extEnd); -#endif /* EGL_NV_stream_socket */ -#ifdef EGL_NV_stream_socket_inet - EGLEW_NV_stream_socket_inet = _glewSearchExtension("EGL_NV_stream_socket_inet", extStart, extEnd); -#endif /* EGL_NV_stream_socket_inet */ -#ifdef EGL_NV_stream_socket_unix - EGLEW_NV_stream_socket_unix = _glewSearchExtension("EGL_NV_stream_socket_unix", extStart, extEnd); -#endif /* EGL_NV_stream_socket_unix */ -#ifdef EGL_NV_stream_sync - EGLEW_NV_stream_sync = _glewSearchExtension("EGL_NV_stream_sync", extStart, extEnd); - if (glewExperimental || EGLEW_NV_stream_sync) EGLEW_NV_stream_sync = !_glewInit_EGL_NV_stream_sync(); -#endif /* EGL_NV_stream_sync */ -#ifdef EGL_NV_sync - EGLEW_NV_sync = _glewSearchExtension("EGL_NV_sync", extStart, extEnd); - if (glewExperimental || EGLEW_NV_sync) EGLEW_NV_sync = !_glewInit_EGL_NV_sync(); -#endif /* EGL_NV_sync */ -#ifdef EGL_NV_system_time - EGLEW_NV_system_time = _glewSearchExtension("EGL_NV_system_time", extStart, extEnd); - if (glewExperimental || EGLEW_NV_system_time) EGLEW_NV_system_time = !_glewInit_EGL_NV_system_time(); -#endif /* EGL_NV_system_time */ -#ifdef EGL_TIZEN_image_native_buffer - EGLEW_TIZEN_image_native_buffer = _glewSearchExtension("EGL_TIZEN_image_native_buffer", extStart, extEnd); -#endif /* EGL_TIZEN_image_native_buffer */ -#ifdef EGL_TIZEN_image_native_surface - EGLEW_TIZEN_image_native_surface = _glewSearchExtension("EGL_TIZEN_image_native_surface", extStart, extEnd); -#endif /* EGL_TIZEN_image_native_surface */ - - return GLEW_OK; -} - -#elif defined(_WIN32) - -PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL = NULL; - -PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD = NULL; -PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD = NULL; -PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD = NULL; -PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD = NULL; -PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD = NULL; -PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD = NULL; -PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD = NULL; -PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD = NULL; -PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD = NULL; - -PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB = NULL; -PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB = NULL; -PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB = NULL; -PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB = NULL; - -PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB = NULL; - -PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB = NULL; - -PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB = NULL; -PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB = NULL; - -PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB = NULL; -PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB = NULL; -PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB = NULL; -PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB = NULL; -PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB = NULL; - -PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB = NULL; -PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB = NULL; -PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB = NULL; - -PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB = NULL; -PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB = NULL; -PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB = NULL; - -PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT = NULL; -PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT = NULL; -PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT = NULL; -PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT = NULL; - -PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT = NULL; - -PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT = NULL; -PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT = NULL; - -PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT = NULL; -PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT = NULL; -PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT = NULL; -PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT = NULL; -PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT = NULL; - -PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT = NULL; -PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT = NULL; -PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT = NULL; - -PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT = NULL; -PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT = NULL; - -PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D = NULL; -PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D = NULL; - -PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D = NULL; -PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D = NULL; -PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D = NULL; -PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D = NULL; - -PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D = NULL; -PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D = NULL; -PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D = NULL; -PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D = NULL; -PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D = NULL; -PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D = NULL; -PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D = NULL; -PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D = NULL; -PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D = NULL; -PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D = NULL; -PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D = NULL; -PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D = NULL; - -PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D = NULL; -PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D = NULL; -PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D = NULL; -PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D = NULL; - -PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D = NULL; -PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D = NULL; -PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D = NULL; -PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D = NULL; - -PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D = NULL; -PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D = NULL; -PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D = NULL; -PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D = NULL; - -PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV = NULL; -PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV = NULL; -PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV = NULL; -PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV = NULL; -PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV = NULL; -PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV = NULL; -PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV = NULL; -PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV = NULL; - -PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV = NULL; - -PFNWGLDELAYBEFORESWAPNVPROC __wglewDelayBeforeSwapNV = NULL; - -PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV = NULL; -PFNWGLDELETEDCNVPROC __wglewDeleteDCNV = NULL; -PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV = NULL; -PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV = NULL; -PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV = NULL; - -PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV = NULL; -PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV = NULL; -PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV = NULL; - -PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV = NULL; -PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV = NULL; -PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV = NULL; -PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV = NULL; -PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV = NULL; -PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV = NULL; - -PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV = NULL; -PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV = NULL; - -PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV = NULL; -PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV = NULL; -PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV = NULL; -PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV = NULL; -PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV = NULL; - -PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV = NULL; -PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV = NULL; -PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV = NULL; -PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV = NULL; -PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV = NULL; -PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV = NULL; - -PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML = NULL; -PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML = NULL; -PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML = NULL; -PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML = NULL; -PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML = NULL; -PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML = NULL; -GLboolean __WGLEW_3DFX_multisample = GL_FALSE; -GLboolean __WGLEW_3DL_stereo_control = GL_FALSE; -GLboolean __WGLEW_AMD_gpu_association = GL_FALSE; -GLboolean __WGLEW_ARB_buffer_region = GL_FALSE; -GLboolean __WGLEW_ARB_context_flush_control = GL_FALSE; -GLboolean __WGLEW_ARB_create_context = GL_FALSE; -GLboolean __WGLEW_ARB_create_context_no_error = GL_FALSE; -GLboolean __WGLEW_ARB_create_context_profile = GL_FALSE; -GLboolean __WGLEW_ARB_create_context_robustness = GL_FALSE; -GLboolean __WGLEW_ARB_extensions_string = GL_FALSE; -GLboolean __WGLEW_ARB_framebuffer_sRGB = GL_FALSE; -GLboolean __WGLEW_ARB_make_current_read = GL_FALSE; -GLboolean __WGLEW_ARB_multisample = GL_FALSE; -GLboolean __WGLEW_ARB_pbuffer = GL_FALSE; -GLboolean __WGLEW_ARB_pixel_format = GL_FALSE; -GLboolean __WGLEW_ARB_pixel_format_float = GL_FALSE; -GLboolean __WGLEW_ARB_render_texture = GL_FALSE; -GLboolean __WGLEW_ARB_robustness_application_isolation = GL_FALSE; -GLboolean __WGLEW_ARB_robustness_share_group_isolation = GL_FALSE; -GLboolean __WGLEW_ATI_pixel_format_float = GL_FALSE; -GLboolean __WGLEW_ATI_render_texture_rectangle = GL_FALSE; -GLboolean __WGLEW_EXT_colorspace = GL_FALSE; -GLboolean __WGLEW_EXT_create_context_es2_profile = GL_FALSE; -GLboolean __WGLEW_EXT_create_context_es_profile = GL_FALSE; -GLboolean __WGLEW_EXT_depth_float = GL_FALSE; -GLboolean __WGLEW_EXT_display_color_table = GL_FALSE; -GLboolean __WGLEW_EXT_extensions_string = GL_FALSE; -GLboolean __WGLEW_EXT_framebuffer_sRGB = GL_FALSE; -GLboolean __WGLEW_EXT_make_current_read = GL_FALSE; -GLboolean __WGLEW_EXT_multisample = GL_FALSE; -GLboolean __WGLEW_EXT_pbuffer = GL_FALSE; -GLboolean __WGLEW_EXT_pixel_format = GL_FALSE; -GLboolean __WGLEW_EXT_pixel_format_packed_float = GL_FALSE; -GLboolean __WGLEW_EXT_swap_control = GL_FALSE; -GLboolean __WGLEW_EXT_swap_control_tear = GL_FALSE; -GLboolean __WGLEW_I3D_digital_video_control = GL_FALSE; -GLboolean __WGLEW_I3D_gamma = GL_FALSE; -GLboolean __WGLEW_I3D_genlock = GL_FALSE; -GLboolean __WGLEW_I3D_image_buffer = GL_FALSE; -GLboolean __WGLEW_I3D_swap_frame_lock = GL_FALSE; -GLboolean __WGLEW_I3D_swap_frame_usage = GL_FALSE; -GLboolean __WGLEW_NV_DX_interop = GL_FALSE; -GLboolean __WGLEW_NV_DX_interop2 = GL_FALSE; -GLboolean __WGLEW_NV_copy_image = GL_FALSE; -GLboolean __WGLEW_NV_delay_before_swap = GL_FALSE; -GLboolean __WGLEW_NV_float_buffer = GL_FALSE; -GLboolean __WGLEW_NV_gpu_affinity = GL_FALSE; -GLboolean __WGLEW_NV_multisample_coverage = GL_FALSE; -GLboolean __WGLEW_NV_present_video = GL_FALSE; -GLboolean __WGLEW_NV_render_depth_texture = GL_FALSE; -GLboolean __WGLEW_NV_render_texture_rectangle = GL_FALSE; -GLboolean __WGLEW_NV_swap_group = GL_FALSE; -GLboolean __WGLEW_NV_vertex_array_range = GL_FALSE; -GLboolean __WGLEW_NV_video_capture = GL_FALSE; -GLboolean __WGLEW_NV_video_output = GL_FALSE; -GLboolean __WGLEW_OML_sync_control = GL_FALSE; -#ifdef WGL_3DL_stereo_control - -static GLboolean _glewInit_WGL_3DL_stereo_control () -{ - GLboolean r = GL_FALSE; - - r = ((wglSetStereoEmitterState3DL = (PFNWGLSETSTEREOEMITTERSTATE3DLPROC)glewGetProcAddress((const GLubyte*)"wglSetStereoEmitterState3DL")) == NULL) || r; - - return r; -} - -#endif /* WGL_3DL_stereo_control */ - -#ifdef WGL_AMD_gpu_association - -static GLboolean _glewInit_WGL_AMD_gpu_association () -{ - GLboolean r = GL_FALSE; - - r = ((wglBlitContextFramebufferAMD = (PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)"wglBlitContextFramebufferAMD")) == NULL) || r; - r = ((wglCreateAssociatedContextAMD = (PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglCreateAssociatedContextAMD")) == NULL) || r; - r = ((wglCreateAssociatedContextAttribsAMD = (PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)"wglCreateAssociatedContextAttribsAMD")) == NULL) || r; - r = ((wglDeleteAssociatedContextAMD = (PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglDeleteAssociatedContextAMD")) == NULL) || r; - r = ((wglGetContextGPUIDAMD = (PFNWGLGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetContextGPUIDAMD")) == NULL) || r; - r = ((wglGetCurrentAssociatedContextAMD = (PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentAssociatedContextAMD")) == NULL) || r; - r = ((wglGetGPUIDsAMD = (PFNWGLGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetGPUIDsAMD")) == NULL) || r; - r = ((wglGetGPUInfoAMD = (PFNWGLGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetGPUInfoAMD")) == NULL) || r; - r = ((wglMakeAssociatedContextCurrentAMD = (PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)"wglMakeAssociatedContextCurrentAMD")) == NULL) || r; - - return r; -} - -#endif /* WGL_AMD_gpu_association */ - -#ifdef WGL_ARB_buffer_region - -static GLboolean _glewInit_WGL_ARB_buffer_region () -{ - GLboolean r = GL_FALSE; - - r = ((wglCreateBufferRegionARB = (PFNWGLCREATEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglCreateBufferRegionARB")) == NULL) || r; - r = ((wglDeleteBufferRegionARB = (PFNWGLDELETEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglDeleteBufferRegionARB")) == NULL) || r; - r = ((wglRestoreBufferRegionARB = (PFNWGLRESTOREBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglRestoreBufferRegionARB")) == NULL) || r; - r = ((wglSaveBufferRegionARB = (PFNWGLSAVEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglSaveBufferRegionARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_buffer_region */ - -#ifdef WGL_ARB_create_context - -static GLboolean _glewInit_WGL_ARB_create_context () -{ - GLboolean r = GL_FALSE; - - r = ((wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)glewGetProcAddress((const GLubyte*)"wglCreateContextAttribsARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_create_context */ - -#ifdef WGL_ARB_extensions_string - -static GLboolean _glewInit_WGL_ARB_extensions_string () -{ - GLboolean r = GL_FALSE; - - r = ((wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_extensions_string */ - -#ifdef WGL_ARB_make_current_read - -static GLboolean _glewInit_WGL_ARB_make_current_read () -{ - GLboolean r = GL_FALSE; - - r = ((wglGetCurrentReadDCARB = (PFNWGLGETCURRENTREADDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCARB")) == NULL) || r; - r = ((wglMakeContextCurrentARB = (PFNWGLMAKECONTEXTCURRENTARBPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_make_current_read */ - -#ifdef WGL_ARB_pbuffer - -static GLboolean _glewInit_WGL_ARB_pbuffer () -{ - GLboolean r = GL_FALSE; - - r = ((wglCreatePbufferARB = (PFNWGLCREATEPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferARB")) == NULL) || r; - r = ((wglDestroyPbufferARB = (PFNWGLDESTROYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferARB")) == NULL) || r; - r = ((wglGetPbufferDCARB = (PFNWGLGETPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCARB")) == NULL) || r; - r = ((wglQueryPbufferARB = (PFNWGLQUERYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferARB")) == NULL) || r; - r = ((wglReleasePbufferDCARB = (PFNWGLRELEASEPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_pbuffer */ - -#ifdef WGL_ARB_pixel_format - -static GLboolean _glewInit_WGL_ARB_pixel_format () -{ - GLboolean r = GL_FALSE; - - r = ((wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatARB")) == NULL) || r; - r = ((wglGetPixelFormatAttribfvARB = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvARB")) == NULL) || r; - r = ((wglGetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_pixel_format */ - -#ifdef WGL_ARB_render_texture - -static GLboolean _glewInit_WGL_ARB_render_texture () -{ - GLboolean r = GL_FALSE; - - r = ((wglBindTexImageARB = (PFNWGLBINDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglBindTexImageARB")) == NULL) || r; - r = ((wglReleaseTexImageARB = (PFNWGLRELEASETEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglReleaseTexImageARB")) == NULL) || r; - r = ((wglSetPbufferAttribARB = (PFNWGLSETPBUFFERATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"wglSetPbufferAttribARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_render_texture */ - -#ifdef WGL_EXT_display_color_table - -static GLboolean _glewInit_WGL_EXT_display_color_table () -{ - GLboolean r = GL_FALSE; - - r = ((wglBindDisplayColorTableEXT = (PFNWGLBINDDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglBindDisplayColorTableEXT")) == NULL) || r; - r = ((wglCreateDisplayColorTableEXT = (PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglCreateDisplayColorTableEXT")) == NULL) || r; - r = ((wglDestroyDisplayColorTableEXT = (PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyDisplayColorTableEXT")) == NULL) || r; - r = ((wglLoadDisplayColorTableEXT = (PFNWGLLOADDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglLoadDisplayColorTableEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_display_color_table */ - -#ifdef WGL_EXT_extensions_string - -static GLboolean _glewInit_WGL_EXT_extensions_string () -{ - GLboolean r = GL_FALSE; - - r = ((wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_extensions_string */ - -#ifdef WGL_EXT_make_current_read - -static GLboolean _glewInit_WGL_EXT_make_current_read () -{ - GLboolean r = GL_FALSE; - - r = ((wglGetCurrentReadDCEXT = (PFNWGLGETCURRENTREADDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCEXT")) == NULL) || r; - r = ((wglMakeContextCurrentEXT = (PFNWGLMAKECONTEXTCURRENTEXTPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_make_current_read */ - -#ifdef WGL_EXT_pbuffer - -static GLboolean _glewInit_WGL_EXT_pbuffer () -{ - GLboolean r = GL_FALSE; - - r = ((wglCreatePbufferEXT = (PFNWGLCREATEPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferEXT")) == NULL) || r; - r = ((wglDestroyPbufferEXT = (PFNWGLDESTROYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferEXT")) == NULL) || r; - r = ((wglGetPbufferDCEXT = (PFNWGLGETPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCEXT")) == NULL) || r; - r = ((wglQueryPbufferEXT = (PFNWGLQUERYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferEXT")) == NULL) || r; - r = ((wglReleasePbufferDCEXT = (PFNWGLRELEASEPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_pbuffer */ - -#ifdef WGL_EXT_pixel_format - -static GLboolean _glewInit_WGL_EXT_pixel_format () -{ - GLboolean r = GL_FALSE; - - r = ((wglChoosePixelFormatEXT = (PFNWGLCHOOSEPIXELFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatEXT")) == NULL) || r; - r = ((wglGetPixelFormatAttribfvEXT = (PFNWGLGETPIXELFORMATATTRIBFVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvEXT")) == NULL) || r; - r = ((wglGetPixelFormatAttribivEXT = (PFNWGLGETPIXELFORMATATTRIBIVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_pixel_format */ - -#ifdef WGL_EXT_swap_control - -static GLboolean _glewInit_WGL_EXT_swap_control () -{ - GLboolean r = GL_FALSE; - - r = ((wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetSwapIntervalEXT")) == NULL) || r; - r = ((wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglSwapIntervalEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_swap_control */ - -#ifdef WGL_I3D_digital_video_control - -static GLboolean _glewInit_WGL_I3D_digital_video_control () -{ - GLboolean r = GL_FALSE; - - r = ((wglGetDigitalVideoParametersI3D = (PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetDigitalVideoParametersI3D")) == NULL) || r; - r = ((wglSetDigitalVideoParametersI3D = (PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetDigitalVideoParametersI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_digital_video_control */ - -#ifdef WGL_I3D_gamma - -static GLboolean _glewInit_WGL_I3D_gamma () -{ - GLboolean r = GL_FALSE; - - r = ((wglGetGammaTableI3D = (PFNWGLGETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableI3D")) == NULL) || r; - r = ((wglGetGammaTableParametersI3D = (PFNWGLGETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableParametersI3D")) == NULL) || r; - r = ((wglSetGammaTableI3D = (PFNWGLSETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableI3D")) == NULL) || r; - r = ((wglSetGammaTableParametersI3D = (PFNWGLSETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableParametersI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_gamma */ - -#ifdef WGL_I3D_genlock - -static GLboolean _glewInit_WGL_I3D_genlock () -{ - GLboolean r = GL_FALSE; - - r = ((wglDisableGenlockI3D = (PFNWGLDISABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableGenlockI3D")) == NULL) || r; - r = ((wglEnableGenlockI3D = (PFNWGLENABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableGenlockI3D")) == NULL) || r; - r = ((wglGenlockSampleRateI3D = (PFNWGLGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSampleRateI3D")) == NULL) || r; - r = ((wglGenlockSourceDelayI3D = (PFNWGLGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceDelayI3D")) == NULL) || r; - r = ((wglGenlockSourceEdgeI3D = (PFNWGLGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceEdgeI3D")) == NULL) || r; - r = ((wglGenlockSourceI3D = (PFNWGLGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceI3D")) == NULL) || r; - r = ((wglGetGenlockSampleRateI3D = (PFNWGLGETGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSampleRateI3D")) == NULL) || r; - r = ((wglGetGenlockSourceDelayI3D = (PFNWGLGETGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceDelayI3D")) == NULL) || r; - r = ((wglGetGenlockSourceEdgeI3D = (PFNWGLGETGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceEdgeI3D")) == NULL) || r; - r = ((wglGetGenlockSourceI3D = (PFNWGLGETGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceI3D")) == NULL) || r; - r = ((wglIsEnabledGenlockI3D = (PFNWGLISENABLEDGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledGenlockI3D")) == NULL) || r; - r = ((wglQueryGenlockMaxSourceDelayI3D = (PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryGenlockMaxSourceDelayI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_genlock */ - -#ifdef WGL_I3D_image_buffer - -static GLboolean _glewInit_WGL_I3D_image_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((wglAssociateImageBufferEventsI3D = (PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglAssociateImageBufferEventsI3D")) == NULL) || r; - r = ((wglCreateImageBufferI3D = (PFNWGLCREATEIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglCreateImageBufferI3D")) == NULL) || r; - r = ((wglDestroyImageBufferI3D = (PFNWGLDESTROYIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglDestroyImageBufferI3D")) == NULL) || r; - r = ((wglReleaseImageBufferEventsI3D = (PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglReleaseImageBufferEventsI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_image_buffer */ - -#ifdef WGL_I3D_swap_frame_lock - -static GLboolean _glewInit_WGL_I3D_swap_frame_lock () -{ - GLboolean r = GL_FALSE; - - r = ((wglDisableFrameLockI3D = (PFNWGLDISABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableFrameLockI3D")) == NULL) || r; - r = ((wglEnableFrameLockI3D = (PFNWGLENABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableFrameLockI3D")) == NULL) || r; - r = ((wglIsEnabledFrameLockI3D = (PFNWGLISENABLEDFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledFrameLockI3D")) == NULL) || r; - r = ((wglQueryFrameLockMasterI3D = (PFNWGLQUERYFRAMELOCKMASTERI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameLockMasterI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_swap_frame_lock */ - -#ifdef WGL_I3D_swap_frame_usage - -static GLboolean _glewInit_WGL_I3D_swap_frame_usage () -{ - GLboolean r = GL_FALSE; - - r = ((wglBeginFrameTrackingI3D = (PFNWGLBEGINFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglBeginFrameTrackingI3D")) == NULL) || r; - r = ((wglEndFrameTrackingI3D = (PFNWGLENDFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglEndFrameTrackingI3D")) == NULL) || r; - r = ((wglGetFrameUsageI3D = (PFNWGLGETFRAMEUSAGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetFrameUsageI3D")) == NULL) || r; - r = ((wglQueryFrameTrackingI3D = (PFNWGLQUERYFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameTrackingI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_swap_frame_usage */ - -#ifdef WGL_NV_DX_interop - -static GLboolean _glewInit_WGL_NV_DX_interop () -{ - GLboolean r = GL_FALSE; - - r = ((wglDXCloseDeviceNV = (PFNWGLDXCLOSEDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglDXCloseDeviceNV")) == NULL) || r; - r = ((wglDXLockObjectsNV = (PFNWGLDXLOCKOBJECTSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXLockObjectsNV")) == NULL) || r; - r = ((wglDXObjectAccessNV = (PFNWGLDXOBJECTACCESSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXObjectAccessNV")) == NULL) || r; - r = ((wglDXOpenDeviceNV = (PFNWGLDXOPENDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglDXOpenDeviceNV")) == NULL) || r; - r = ((wglDXRegisterObjectNV = (PFNWGLDXREGISTEROBJECTNVPROC)glewGetProcAddress((const GLubyte*)"wglDXRegisterObjectNV")) == NULL) || r; - r = ((wglDXSetResourceShareHandleNV = (PFNWGLDXSETRESOURCESHAREHANDLENVPROC)glewGetProcAddress((const GLubyte*)"wglDXSetResourceShareHandleNV")) == NULL) || r; - r = ((wglDXUnlockObjectsNV = (PFNWGLDXUNLOCKOBJECTSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXUnlockObjectsNV")) == NULL) || r; - r = ((wglDXUnregisterObjectNV = (PFNWGLDXUNREGISTEROBJECTNVPROC)glewGetProcAddress((const GLubyte*)"wglDXUnregisterObjectNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_DX_interop */ - -#ifdef WGL_NV_copy_image - -static GLboolean _glewInit_WGL_NV_copy_image () -{ - GLboolean r = GL_FALSE; - - r = ((wglCopyImageSubDataNV = (PFNWGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"wglCopyImageSubDataNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_copy_image */ - -#ifdef WGL_NV_delay_before_swap - -static GLboolean _glewInit_WGL_NV_delay_before_swap () -{ - GLboolean r = GL_FALSE; - - r = ((wglDelayBeforeSwapNV = (PFNWGLDELAYBEFORESWAPNVPROC)glewGetProcAddress((const GLubyte*)"wglDelayBeforeSwapNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_delay_before_swap */ - -#ifdef WGL_NV_gpu_affinity - -static GLboolean _glewInit_WGL_NV_gpu_affinity () -{ - GLboolean r = GL_FALSE; - - r = ((wglCreateAffinityDCNV = (PFNWGLCREATEAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)"wglCreateAffinityDCNV")) == NULL) || r; - r = ((wglDeleteDCNV = (PFNWGLDELETEDCNVPROC)glewGetProcAddress((const GLubyte*)"wglDeleteDCNV")) == NULL) || r; - r = ((wglEnumGpuDevicesNV = (PFNWGLENUMGPUDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpuDevicesNV")) == NULL) || r; - r = ((wglEnumGpusFromAffinityDCNV = (PFNWGLENUMGPUSFROMAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpusFromAffinityDCNV")) == NULL) || r; - r = ((wglEnumGpusNV = (PFNWGLENUMGPUSNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpusNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_gpu_affinity */ - -#ifdef WGL_NV_present_video - -static GLboolean _glewInit_WGL_NV_present_video () -{ - GLboolean r = GL_FALSE; - - r = ((wglBindVideoDeviceNV = (PFNWGLBINDVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoDeviceNV")) == NULL) || r; - r = ((wglEnumerateVideoDevicesNV = (PFNWGLENUMERATEVIDEODEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumerateVideoDevicesNV")) == NULL) || r; - r = ((wglQueryCurrentContextNV = (PFNWGLQUERYCURRENTCONTEXTNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryCurrentContextNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_present_video */ - -#ifdef WGL_NV_swap_group - -static GLboolean _glewInit_WGL_NV_swap_group () -{ - GLboolean r = GL_FALSE; - - r = ((wglBindSwapBarrierNV = (PFNWGLBINDSWAPBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"wglBindSwapBarrierNV")) == NULL) || r; - r = ((wglJoinSwapGroupNV = (PFNWGLJOINSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"wglJoinSwapGroupNV")) == NULL) || r; - r = ((wglQueryFrameCountNV = (PFNWGLQUERYFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameCountNV")) == NULL) || r; - r = ((wglQueryMaxSwapGroupsNV = (PFNWGLQUERYMAXSWAPGROUPSNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryMaxSwapGroupsNV")) == NULL) || r; - r = ((wglQuerySwapGroupNV = (PFNWGLQUERYSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"wglQuerySwapGroupNV")) == NULL) || r; - r = ((wglResetFrameCountNV = (PFNWGLRESETFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"wglResetFrameCountNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_swap_group */ - -#ifdef WGL_NV_vertex_array_range - -static GLboolean _glewInit_WGL_NV_vertex_array_range () -{ - GLboolean r = GL_FALSE; - - r = ((wglAllocateMemoryNV = (PFNWGLALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglAllocateMemoryNV")) == NULL) || r; - r = ((wglFreeMemoryNV = (PFNWGLFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglFreeMemoryNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_vertex_array_range */ - -#ifdef WGL_NV_video_capture - -static GLboolean _glewInit_WGL_NV_video_capture () -{ - GLboolean r = GL_FALSE; - - r = ((wglBindVideoCaptureDeviceNV = (PFNWGLBINDVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoCaptureDeviceNV")) == NULL) || r; - r = ((wglEnumerateVideoCaptureDevicesNV = (PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumerateVideoCaptureDevicesNV")) == NULL) || r; - r = ((wglLockVideoCaptureDeviceNV = (PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglLockVideoCaptureDeviceNV")) == NULL) || r; - r = ((wglQueryVideoCaptureDeviceNV = (PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglQueryVideoCaptureDeviceNV")) == NULL) || r; - r = ((wglReleaseVideoCaptureDeviceNV = (PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoCaptureDeviceNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_video_capture */ - -#ifdef WGL_NV_video_output - -static GLboolean _glewInit_WGL_NV_video_output () -{ - GLboolean r = GL_FALSE; - - r = ((wglBindVideoImageNV = (PFNWGLBINDVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoImageNV")) == NULL) || r; - r = ((wglGetVideoDeviceNV = (PFNWGLGETVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglGetVideoDeviceNV")) == NULL) || r; - r = ((wglGetVideoInfoNV = (PFNWGLGETVIDEOINFONVPROC)glewGetProcAddress((const GLubyte*)"wglGetVideoInfoNV")) == NULL) || r; - r = ((wglReleaseVideoDeviceNV = (PFNWGLRELEASEVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoDeviceNV")) == NULL) || r; - r = ((wglReleaseVideoImageNV = (PFNWGLRELEASEVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoImageNV")) == NULL) || r; - r = ((wglSendPbufferToVideoNV = (PFNWGLSENDPBUFFERTOVIDEONVPROC)glewGetProcAddress((const GLubyte*)"wglSendPbufferToVideoNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_video_output */ - -#ifdef WGL_OML_sync_control - -static GLboolean _glewInit_WGL_OML_sync_control () -{ - GLboolean r = GL_FALSE; - - r = ((wglGetMscRateOML = (PFNWGLGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetMscRateOML")) == NULL) || r; - r = ((wglGetSyncValuesOML = (PFNWGLGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetSyncValuesOML")) == NULL) || r; - r = ((wglSwapBuffersMscOML = (PFNWGLSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapBuffersMscOML")) == NULL) || r; - r = ((wglSwapLayerBuffersMscOML = (PFNWGLSWAPLAYERBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapLayerBuffersMscOML")) == NULL) || r; - r = ((wglWaitForMscOML = (PFNWGLWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForMscOML")) == NULL) || r; - r = ((wglWaitForSbcOML = (PFNWGLWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForSbcOML")) == NULL) || r; - - return r; -} - -#endif /* WGL_OML_sync_control */ - -/* ------------------------------------------------------------------------- */ - -static PFNWGLGETEXTENSIONSSTRINGARBPROC _wglewGetExtensionsStringARB = NULL; -static PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglewGetExtensionsStringEXT = NULL; - -GLboolean GLEWAPIENTRY wglewGetExtension (const char* name) -{ - const GLubyte* start; - const GLubyte* end; - if (_wglewGetExtensionsStringARB == NULL) - if (_wglewGetExtensionsStringEXT == NULL) - return GL_FALSE; - else - start = (const GLubyte*)_wglewGetExtensionsStringEXT(); - else - start = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC()); - if (start == 0) - return GL_FALSE; - end = start + _glewStrLen(start); - return _glewSearchExtension(name, start, end); -} - -GLenum GLEWAPIENTRY wglewInit () -{ - GLboolean crippled; - const GLubyte* extStart; - const GLubyte* extEnd; - /* find wgl extension string query functions */ - _wglewGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB"); - _wglewGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT"); - /* query wgl extension string */ - if (_wglewGetExtensionsStringARB == NULL) - if (_wglewGetExtensionsStringEXT == NULL) - extStart = (const GLubyte*)""; - else - extStart = (const GLubyte*)_wglewGetExtensionsStringEXT(); - else - extStart = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC()); - extEnd = extStart + _glewStrLen(extStart); - /* initialize extensions */ - crippled = _wglewGetExtensionsStringARB == NULL && _wglewGetExtensionsStringEXT == NULL; -#ifdef WGL_3DFX_multisample - WGLEW_3DFX_multisample = _glewSearchExtension("WGL_3DFX_multisample", extStart, extEnd); -#endif /* WGL_3DFX_multisample */ -#ifdef WGL_3DL_stereo_control - WGLEW_3DL_stereo_control = _glewSearchExtension("WGL_3DL_stereo_control", extStart, extEnd); - if (glewExperimental || WGLEW_3DL_stereo_control|| crippled) WGLEW_3DL_stereo_control= !_glewInit_WGL_3DL_stereo_control(); -#endif /* WGL_3DL_stereo_control */ -#ifdef WGL_AMD_gpu_association - WGLEW_AMD_gpu_association = _glewSearchExtension("WGL_AMD_gpu_association", extStart, extEnd); - if (glewExperimental || WGLEW_AMD_gpu_association|| crippled) WGLEW_AMD_gpu_association= !_glewInit_WGL_AMD_gpu_association(); -#endif /* WGL_AMD_gpu_association */ -#ifdef WGL_ARB_buffer_region - WGLEW_ARB_buffer_region = _glewSearchExtension("WGL_ARB_buffer_region", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_buffer_region|| crippled) WGLEW_ARB_buffer_region= !_glewInit_WGL_ARB_buffer_region(); -#endif /* WGL_ARB_buffer_region */ -#ifdef WGL_ARB_context_flush_control - WGLEW_ARB_context_flush_control = _glewSearchExtension("WGL_ARB_context_flush_control", extStart, extEnd); -#endif /* WGL_ARB_context_flush_control */ -#ifdef WGL_ARB_create_context - WGLEW_ARB_create_context = _glewSearchExtension("WGL_ARB_create_context", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_create_context|| crippled) WGLEW_ARB_create_context= !_glewInit_WGL_ARB_create_context(); -#endif /* WGL_ARB_create_context */ -#ifdef WGL_ARB_create_context_no_error - WGLEW_ARB_create_context_no_error = _glewSearchExtension("WGL_ARB_create_context_no_error", extStart, extEnd); -#endif /* WGL_ARB_create_context_no_error */ -#ifdef WGL_ARB_create_context_profile - WGLEW_ARB_create_context_profile = _glewSearchExtension("WGL_ARB_create_context_profile", extStart, extEnd); -#endif /* WGL_ARB_create_context_profile */ -#ifdef WGL_ARB_create_context_robustness - WGLEW_ARB_create_context_robustness = _glewSearchExtension("WGL_ARB_create_context_robustness", extStart, extEnd); -#endif /* WGL_ARB_create_context_robustness */ -#ifdef WGL_ARB_extensions_string - WGLEW_ARB_extensions_string = _glewSearchExtension("WGL_ARB_extensions_string", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_extensions_string|| crippled) WGLEW_ARB_extensions_string= !_glewInit_WGL_ARB_extensions_string(); -#endif /* WGL_ARB_extensions_string */ -#ifdef WGL_ARB_framebuffer_sRGB - WGLEW_ARB_framebuffer_sRGB = _glewSearchExtension("WGL_ARB_framebuffer_sRGB", extStart, extEnd); -#endif /* WGL_ARB_framebuffer_sRGB */ -#ifdef WGL_ARB_make_current_read - WGLEW_ARB_make_current_read = _glewSearchExtension("WGL_ARB_make_current_read", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_make_current_read|| crippled) WGLEW_ARB_make_current_read= !_glewInit_WGL_ARB_make_current_read(); -#endif /* WGL_ARB_make_current_read */ -#ifdef WGL_ARB_multisample - WGLEW_ARB_multisample = _glewSearchExtension("WGL_ARB_multisample", extStart, extEnd); -#endif /* WGL_ARB_multisample */ -#ifdef WGL_ARB_pbuffer - WGLEW_ARB_pbuffer = _glewSearchExtension("WGL_ARB_pbuffer", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_pbuffer|| crippled) WGLEW_ARB_pbuffer= !_glewInit_WGL_ARB_pbuffer(); -#endif /* WGL_ARB_pbuffer */ -#ifdef WGL_ARB_pixel_format - WGLEW_ARB_pixel_format = _glewSearchExtension("WGL_ARB_pixel_format", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_pixel_format|| crippled) WGLEW_ARB_pixel_format= !_glewInit_WGL_ARB_pixel_format(); -#endif /* WGL_ARB_pixel_format */ -#ifdef WGL_ARB_pixel_format_float - WGLEW_ARB_pixel_format_float = _glewSearchExtension("WGL_ARB_pixel_format_float", extStart, extEnd); -#endif /* WGL_ARB_pixel_format_float */ -#ifdef WGL_ARB_render_texture - WGLEW_ARB_render_texture = _glewSearchExtension("WGL_ARB_render_texture", extStart, extEnd); - if (glewExperimental || WGLEW_ARB_render_texture|| crippled) WGLEW_ARB_render_texture= !_glewInit_WGL_ARB_render_texture(); -#endif /* WGL_ARB_render_texture */ -#ifdef WGL_ARB_robustness_application_isolation - WGLEW_ARB_robustness_application_isolation = _glewSearchExtension("WGL_ARB_robustness_application_isolation", extStart, extEnd); -#endif /* WGL_ARB_robustness_application_isolation */ -#ifdef WGL_ARB_robustness_share_group_isolation - WGLEW_ARB_robustness_share_group_isolation = _glewSearchExtension("WGL_ARB_robustness_share_group_isolation", extStart, extEnd); -#endif /* WGL_ARB_robustness_share_group_isolation */ -#ifdef WGL_ATI_pixel_format_float - WGLEW_ATI_pixel_format_float = _glewSearchExtension("WGL_ATI_pixel_format_float", extStart, extEnd); -#endif /* WGL_ATI_pixel_format_float */ -#ifdef WGL_ATI_render_texture_rectangle - WGLEW_ATI_render_texture_rectangle = _glewSearchExtension("WGL_ATI_render_texture_rectangle", extStart, extEnd); -#endif /* WGL_ATI_render_texture_rectangle */ -#ifdef WGL_EXT_colorspace - WGLEW_EXT_colorspace = _glewSearchExtension("WGL_EXT_colorspace", extStart, extEnd); -#endif /* WGL_EXT_colorspace */ -#ifdef WGL_EXT_create_context_es2_profile - WGLEW_EXT_create_context_es2_profile = _glewSearchExtension("WGL_EXT_create_context_es2_profile", extStart, extEnd); -#endif /* WGL_EXT_create_context_es2_profile */ -#ifdef WGL_EXT_create_context_es_profile - WGLEW_EXT_create_context_es_profile = _glewSearchExtension("WGL_EXT_create_context_es_profile", extStart, extEnd); -#endif /* WGL_EXT_create_context_es_profile */ -#ifdef WGL_EXT_depth_float - WGLEW_EXT_depth_float = _glewSearchExtension("WGL_EXT_depth_float", extStart, extEnd); -#endif /* WGL_EXT_depth_float */ -#ifdef WGL_EXT_display_color_table - WGLEW_EXT_display_color_table = _glewSearchExtension("WGL_EXT_display_color_table", extStart, extEnd); - if (glewExperimental || WGLEW_EXT_display_color_table|| crippled) WGLEW_EXT_display_color_table= !_glewInit_WGL_EXT_display_color_table(); -#endif /* WGL_EXT_display_color_table */ -#ifdef WGL_EXT_extensions_string - WGLEW_EXT_extensions_string = _glewSearchExtension("WGL_EXT_extensions_string", extStart, extEnd); - if (glewExperimental || WGLEW_EXT_extensions_string|| crippled) WGLEW_EXT_extensions_string= !_glewInit_WGL_EXT_extensions_string(); -#endif /* WGL_EXT_extensions_string */ -#ifdef WGL_EXT_framebuffer_sRGB - WGLEW_EXT_framebuffer_sRGB = _glewSearchExtension("WGL_EXT_framebuffer_sRGB", extStart, extEnd); -#endif /* WGL_EXT_framebuffer_sRGB */ -#ifdef WGL_EXT_make_current_read - WGLEW_EXT_make_current_read = _glewSearchExtension("WGL_EXT_make_current_read", extStart, extEnd); - if (glewExperimental || WGLEW_EXT_make_current_read|| crippled) WGLEW_EXT_make_current_read= !_glewInit_WGL_EXT_make_current_read(); -#endif /* WGL_EXT_make_current_read */ -#ifdef WGL_EXT_multisample - WGLEW_EXT_multisample = _glewSearchExtension("WGL_EXT_multisample", extStart, extEnd); -#endif /* WGL_EXT_multisample */ -#ifdef WGL_EXT_pbuffer - WGLEW_EXT_pbuffer = _glewSearchExtension("WGL_EXT_pbuffer", extStart, extEnd); - if (glewExperimental || WGLEW_EXT_pbuffer|| crippled) WGLEW_EXT_pbuffer= !_glewInit_WGL_EXT_pbuffer(); -#endif /* WGL_EXT_pbuffer */ -#ifdef WGL_EXT_pixel_format - WGLEW_EXT_pixel_format = _glewSearchExtension("WGL_EXT_pixel_format", extStart, extEnd); - if (glewExperimental || WGLEW_EXT_pixel_format|| crippled) WGLEW_EXT_pixel_format= !_glewInit_WGL_EXT_pixel_format(); -#endif /* WGL_EXT_pixel_format */ -#ifdef WGL_EXT_pixel_format_packed_float - WGLEW_EXT_pixel_format_packed_float = _glewSearchExtension("WGL_EXT_pixel_format_packed_float", extStart, extEnd); -#endif /* WGL_EXT_pixel_format_packed_float */ -#ifdef WGL_EXT_swap_control - WGLEW_EXT_swap_control = _glewSearchExtension("WGL_EXT_swap_control", extStart, extEnd); - if (glewExperimental || WGLEW_EXT_swap_control|| crippled) WGLEW_EXT_swap_control= !_glewInit_WGL_EXT_swap_control(); -#endif /* WGL_EXT_swap_control */ -#ifdef WGL_EXT_swap_control_tear - WGLEW_EXT_swap_control_tear = _glewSearchExtension("WGL_EXT_swap_control_tear", extStart, extEnd); -#endif /* WGL_EXT_swap_control_tear */ -#ifdef WGL_I3D_digital_video_control - WGLEW_I3D_digital_video_control = _glewSearchExtension("WGL_I3D_digital_video_control", extStart, extEnd); - if (glewExperimental || WGLEW_I3D_digital_video_control|| crippled) WGLEW_I3D_digital_video_control= !_glewInit_WGL_I3D_digital_video_control(); -#endif /* WGL_I3D_digital_video_control */ -#ifdef WGL_I3D_gamma - WGLEW_I3D_gamma = _glewSearchExtension("WGL_I3D_gamma", extStart, extEnd); - if (glewExperimental || WGLEW_I3D_gamma|| crippled) WGLEW_I3D_gamma= !_glewInit_WGL_I3D_gamma(); -#endif /* WGL_I3D_gamma */ -#ifdef WGL_I3D_genlock - WGLEW_I3D_genlock = _glewSearchExtension("WGL_I3D_genlock", extStart, extEnd); - if (glewExperimental || WGLEW_I3D_genlock|| crippled) WGLEW_I3D_genlock= !_glewInit_WGL_I3D_genlock(); -#endif /* WGL_I3D_genlock */ -#ifdef WGL_I3D_image_buffer - WGLEW_I3D_image_buffer = _glewSearchExtension("WGL_I3D_image_buffer", extStart, extEnd); - if (glewExperimental || WGLEW_I3D_image_buffer|| crippled) WGLEW_I3D_image_buffer= !_glewInit_WGL_I3D_image_buffer(); -#endif /* WGL_I3D_image_buffer */ -#ifdef WGL_I3D_swap_frame_lock - WGLEW_I3D_swap_frame_lock = _glewSearchExtension("WGL_I3D_swap_frame_lock", extStart, extEnd); - if (glewExperimental || WGLEW_I3D_swap_frame_lock|| crippled) WGLEW_I3D_swap_frame_lock= !_glewInit_WGL_I3D_swap_frame_lock(); -#endif /* WGL_I3D_swap_frame_lock */ -#ifdef WGL_I3D_swap_frame_usage - WGLEW_I3D_swap_frame_usage = _glewSearchExtension("WGL_I3D_swap_frame_usage", extStart, extEnd); - if (glewExperimental || WGLEW_I3D_swap_frame_usage|| crippled) WGLEW_I3D_swap_frame_usage= !_glewInit_WGL_I3D_swap_frame_usage(); -#endif /* WGL_I3D_swap_frame_usage */ -#ifdef WGL_NV_DX_interop - WGLEW_NV_DX_interop = _glewSearchExtension("WGL_NV_DX_interop", extStart, extEnd); - if (glewExperimental || WGLEW_NV_DX_interop|| crippled) WGLEW_NV_DX_interop= !_glewInit_WGL_NV_DX_interop(); -#endif /* WGL_NV_DX_interop */ -#ifdef WGL_NV_DX_interop2 - WGLEW_NV_DX_interop2 = _glewSearchExtension("WGL_NV_DX_interop2", extStart, extEnd); -#endif /* WGL_NV_DX_interop2 */ -#ifdef WGL_NV_copy_image - WGLEW_NV_copy_image = _glewSearchExtension("WGL_NV_copy_image", extStart, extEnd); - if (glewExperimental || WGLEW_NV_copy_image|| crippled) WGLEW_NV_copy_image= !_glewInit_WGL_NV_copy_image(); -#endif /* WGL_NV_copy_image */ -#ifdef WGL_NV_delay_before_swap - WGLEW_NV_delay_before_swap = _glewSearchExtension("WGL_NV_delay_before_swap", extStart, extEnd); - if (glewExperimental || WGLEW_NV_delay_before_swap|| crippled) WGLEW_NV_delay_before_swap= !_glewInit_WGL_NV_delay_before_swap(); -#endif /* WGL_NV_delay_before_swap */ -#ifdef WGL_NV_float_buffer - WGLEW_NV_float_buffer = _glewSearchExtension("WGL_NV_float_buffer", extStart, extEnd); -#endif /* WGL_NV_float_buffer */ -#ifdef WGL_NV_gpu_affinity - WGLEW_NV_gpu_affinity = _glewSearchExtension("WGL_NV_gpu_affinity", extStart, extEnd); - if (glewExperimental || WGLEW_NV_gpu_affinity|| crippled) WGLEW_NV_gpu_affinity= !_glewInit_WGL_NV_gpu_affinity(); -#endif /* WGL_NV_gpu_affinity */ -#ifdef WGL_NV_multisample_coverage - WGLEW_NV_multisample_coverage = _glewSearchExtension("WGL_NV_multisample_coverage", extStart, extEnd); -#endif /* WGL_NV_multisample_coverage */ -#ifdef WGL_NV_present_video - WGLEW_NV_present_video = _glewSearchExtension("WGL_NV_present_video", extStart, extEnd); - if (glewExperimental || WGLEW_NV_present_video|| crippled) WGLEW_NV_present_video= !_glewInit_WGL_NV_present_video(); -#endif /* WGL_NV_present_video */ -#ifdef WGL_NV_render_depth_texture - WGLEW_NV_render_depth_texture = _glewSearchExtension("WGL_NV_render_depth_texture", extStart, extEnd); -#endif /* WGL_NV_render_depth_texture */ -#ifdef WGL_NV_render_texture_rectangle - WGLEW_NV_render_texture_rectangle = _glewSearchExtension("WGL_NV_render_texture_rectangle", extStart, extEnd); -#endif /* WGL_NV_render_texture_rectangle */ -#ifdef WGL_NV_swap_group - WGLEW_NV_swap_group = _glewSearchExtension("WGL_NV_swap_group", extStart, extEnd); - if (glewExperimental || WGLEW_NV_swap_group|| crippled) WGLEW_NV_swap_group= !_glewInit_WGL_NV_swap_group(); -#endif /* WGL_NV_swap_group */ -#ifdef WGL_NV_vertex_array_range - WGLEW_NV_vertex_array_range = _glewSearchExtension("WGL_NV_vertex_array_range", extStart, extEnd); - if (glewExperimental || WGLEW_NV_vertex_array_range|| crippled) WGLEW_NV_vertex_array_range= !_glewInit_WGL_NV_vertex_array_range(); -#endif /* WGL_NV_vertex_array_range */ -#ifdef WGL_NV_video_capture - WGLEW_NV_video_capture = _glewSearchExtension("WGL_NV_video_capture", extStart, extEnd); - if (glewExperimental || WGLEW_NV_video_capture|| crippled) WGLEW_NV_video_capture= !_glewInit_WGL_NV_video_capture(); -#endif /* WGL_NV_video_capture */ -#ifdef WGL_NV_video_output - WGLEW_NV_video_output = _glewSearchExtension("WGL_NV_video_output", extStart, extEnd); - if (glewExperimental || WGLEW_NV_video_output|| crippled) WGLEW_NV_video_output= !_glewInit_WGL_NV_video_output(); -#endif /* WGL_NV_video_output */ -#ifdef WGL_OML_sync_control - WGLEW_OML_sync_control = _glewSearchExtension("WGL_OML_sync_control", extStart, extEnd); - if (glewExperimental || WGLEW_OML_sync_control|| crippled) WGLEW_OML_sync_control= !_glewInit_WGL_OML_sync_control(); -#endif /* WGL_OML_sync_control */ - - return GLEW_OK; -} - -#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) - -PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay = NULL; - -PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig = NULL; -PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext = NULL; -PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer = NULL; -PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap = NULL; -PFNGLXCREATEWINDOWPROC __glewXCreateWindow = NULL; -PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer = NULL; -PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap = NULL; -PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow = NULL; -PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable = NULL; -PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib = NULL; -PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs = NULL; -PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent = NULL; -PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig = NULL; -PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent = NULL; -PFNGLXQUERYCONTEXTPROC __glewXQueryContext = NULL; -PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable = NULL; -PFNGLXSELECTEVENTPROC __glewXSelectEvent = NULL; - -PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD = NULL; -PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD = NULL; -PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD = NULL; -PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD = NULL; -PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD = NULL; -PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD = NULL; -PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD = NULL; -PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD = NULL; -PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD = NULL; - -PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB = NULL; - -PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI = NULL; -PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI = NULL; -PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI = NULL; - -PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT = NULL; -PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT = NULL; -PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT = NULL; -PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT = NULL; - -PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT = NULL; - -PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT = NULL; -PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT = NULL; - -PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA = NULL; - -PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA = NULL; - -PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA = NULL; - -PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC __glewXQueryCurrentRendererIntegerMESA = NULL; -PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC __glewXQueryCurrentRendererStringMESA = NULL; -PFNGLXQUERYRENDERERINTEGERMESAPROC __glewXQueryRendererIntegerMESA = NULL; -PFNGLXQUERYRENDERERSTRINGMESAPROC __glewXQueryRendererStringMESA = NULL; - -PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA = NULL; - -PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA = NULL; - -PFNGLXGETSWAPINTERVALMESAPROC __glewXGetSwapIntervalMESA = NULL; -PFNGLXSWAPINTERVALMESAPROC __glewXSwapIntervalMESA = NULL; - -PFNGLXCOPYBUFFERSUBDATANVPROC __glewXCopyBufferSubDataNV = NULL; -PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC __glewXNamedCopyBufferSubDataNV = NULL; - -PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV = NULL; - -PFNGLXDELAYBEFORESWAPNVPROC __glewXDelayBeforeSwapNV = NULL; - -PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV = NULL; -PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV = NULL; - -PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV = NULL; -PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV = NULL; -PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV = NULL; -PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV = NULL; -PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV = NULL; -PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV = NULL; - -PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV = NULL; -PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV = NULL; - -PFNGLXBINDVIDEOCAPTUREDEVICENVPROC __glewXBindVideoCaptureDeviceNV = NULL; -PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC __glewXEnumerateVideoCaptureDevicesNV = NULL; -PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC __glewXLockVideoCaptureDeviceNV = NULL; -PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC __glewXQueryVideoCaptureDeviceNV = NULL; -PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC __glewXReleaseVideoCaptureDeviceNV = NULL; - -PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV = NULL; -PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV = NULL; -PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV = NULL; -PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV = NULL; -PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV = NULL; -PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV = NULL; - -PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML = NULL; -PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML = NULL; -PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML = NULL; -PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML = NULL; -PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML = NULL; - -PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX = NULL; -PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX = NULL; -PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX = NULL; -PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX = NULL; -PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX = NULL; -PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX = NULL; - -PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX = NULL; -PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX = NULL; -PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX = NULL; -PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX = NULL; -PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX = NULL; -PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX = NULL; -PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX = NULL; -PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX = NULL; - -PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX = NULL; -PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX = NULL; -PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX = NULL; -PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX = NULL; -PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX = NULL; - -PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX = NULL; -PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX = NULL; - -PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX = NULL; - -PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX = NULL; -PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX = NULL; -PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX = NULL; -PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX = NULL; -PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX = NULL; - -PFNGLXCUSHIONSGIPROC __glewXCushionSGI = NULL; - -PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI = NULL; -PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI = NULL; - -PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI = NULL; - -PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI = NULL; -PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI = NULL; - -PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN = NULL; - -PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN = NULL; -PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN = NULL; - -GLboolean __GLXEW_VERSION_1_0 = GL_FALSE; -GLboolean __GLXEW_VERSION_1_1 = GL_FALSE; -GLboolean __GLXEW_VERSION_1_2 = GL_FALSE; -GLboolean __GLXEW_VERSION_1_3 = GL_FALSE; -GLboolean __GLXEW_VERSION_1_4 = GL_FALSE; -GLboolean __GLXEW_3DFX_multisample = GL_FALSE; -GLboolean __GLXEW_AMD_gpu_association = GL_FALSE; -GLboolean __GLXEW_ARB_context_flush_control = GL_FALSE; -GLboolean __GLXEW_ARB_create_context = GL_FALSE; -GLboolean __GLXEW_ARB_create_context_no_error = GL_FALSE; -GLboolean __GLXEW_ARB_create_context_profile = GL_FALSE; -GLboolean __GLXEW_ARB_create_context_robustness = GL_FALSE; -GLboolean __GLXEW_ARB_fbconfig_float = GL_FALSE; -GLboolean __GLXEW_ARB_framebuffer_sRGB = GL_FALSE; -GLboolean __GLXEW_ARB_get_proc_address = GL_FALSE; -GLboolean __GLXEW_ARB_multisample = GL_FALSE; -GLboolean __GLXEW_ARB_robustness_application_isolation = GL_FALSE; -GLboolean __GLXEW_ARB_robustness_share_group_isolation = GL_FALSE; -GLboolean __GLXEW_ARB_vertex_buffer_object = GL_FALSE; -GLboolean __GLXEW_ATI_pixel_format_float = GL_FALSE; -GLboolean __GLXEW_ATI_render_texture = GL_FALSE; -GLboolean __GLXEW_EXT_buffer_age = GL_FALSE; -GLboolean __GLXEW_EXT_create_context_es2_profile = GL_FALSE; -GLboolean __GLXEW_EXT_create_context_es_profile = GL_FALSE; -GLboolean __GLXEW_EXT_fbconfig_packed_float = GL_FALSE; -GLboolean __GLXEW_EXT_framebuffer_sRGB = GL_FALSE; -GLboolean __GLXEW_EXT_import_context = GL_FALSE; -GLboolean __GLXEW_EXT_libglvnd = GL_FALSE; -GLboolean __GLXEW_EXT_scene_marker = GL_FALSE; -GLboolean __GLXEW_EXT_stereo_tree = GL_FALSE; -GLboolean __GLXEW_EXT_swap_control = GL_FALSE; -GLboolean __GLXEW_EXT_swap_control_tear = GL_FALSE; -GLboolean __GLXEW_EXT_texture_from_pixmap = GL_FALSE; -GLboolean __GLXEW_EXT_visual_info = GL_FALSE; -GLboolean __GLXEW_EXT_visual_rating = GL_FALSE; -GLboolean __GLXEW_INTEL_swap_event = GL_FALSE; -GLboolean __GLXEW_MESA_agp_offset = GL_FALSE; -GLboolean __GLXEW_MESA_copy_sub_buffer = GL_FALSE; -GLboolean __GLXEW_MESA_pixmap_colormap = GL_FALSE; -GLboolean __GLXEW_MESA_query_renderer = GL_FALSE; -GLboolean __GLXEW_MESA_release_buffers = GL_FALSE; -GLboolean __GLXEW_MESA_set_3dfx_mode = GL_FALSE; -GLboolean __GLXEW_MESA_swap_control = GL_FALSE; -GLboolean __GLXEW_NV_copy_buffer = GL_FALSE; -GLboolean __GLXEW_NV_copy_image = GL_FALSE; -GLboolean __GLXEW_NV_delay_before_swap = GL_FALSE; -GLboolean __GLXEW_NV_float_buffer = GL_FALSE; -GLboolean __GLXEW_NV_multisample_coverage = GL_FALSE; -GLboolean __GLXEW_NV_present_video = GL_FALSE; -GLboolean __GLXEW_NV_robustness_video_memory_purge = GL_FALSE; -GLboolean __GLXEW_NV_swap_group = GL_FALSE; -GLboolean __GLXEW_NV_vertex_array_range = GL_FALSE; -GLboolean __GLXEW_NV_video_capture = GL_FALSE; -GLboolean __GLXEW_NV_video_out = GL_FALSE; -GLboolean __GLXEW_OML_swap_method = GL_FALSE; -GLboolean __GLXEW_OML_sync_control = GL_FALSE; -GLboolean __GLXEW_SGIS_blended_overlay = GL_FALSE; -GLboolean __GLXEW_SGIS_color_range = GL_FALSE; -GLboolean __GLXEW_SGIS_multisample = GL_FALSE; -GLboolean __GLXEW_SGIS_shared_multisample = GL_FALSE; -GLboolean __GLXEW_SGIX_fbconfig = GL_FALSE; -GLboolean __GLXEW_SGIX_hyperpipe = GL_FALSE; -GLboolean __GLXEW_SGIX_pbuffer = GL_FALSE; -GLboolean __GLXEW_SGIX_swap_barrier = GL_FALSE; -GLboolean __GLXEW_SGIX_swap_group = GL_FALSE; -GLboolean __GLXEW_SGIX_video_resize = GL_FALSE; -GLboolean __GLXEW_SGIX_visual_select_group = GL_FALSE; -GLboolean __GLXEW_SGI_cushion = GL_FALSE; -GLboolean __GLXEW_SGI_make_current_read = GL_FALSE; -GLboolean __GLXEW_SGI_swap_control = GL_FALSE; -GLboolean __GLXEW_SGI_video_sync = GL_FALSE; -GLboolean __GLXEW_SUN_get_transparent_index = GL_FALSE; -GLboolean __GLXEW_SUN_video_resize = GL_FALSE; -#ifdef GLX_VERSION_1_2 - -static GLboolean _glewInit_GLX_VERSION_1_2 () -{ - GLboolean r = GL_FALSE; - - r = ((glXGetCurrentDisplay = (PFNGLXGETCURRENTDISPLAYPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentDisplay")) == NULL) || r; - - return r; -} - -#endif /* GLX_VERSION_1_2 */ - -#ifdef GLX_VERSION_1_3 - -static GLboolean _glewInit_GLX_VERSION_1_3 () -{ - GLboolean r = GL_FALSE; - - r = ((glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfig")) == NULL) || r; - r = ((glXCreateNewContext = (PFNGLXCREATENEWCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXCreateNewContext")) == NULL) || r; - r = ((glXCreatePbuffer = (PFNGLXCREATEPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXCreatePbuffer")) == NULL) || r; - r = ((glXCreatePixmap = (PFNGLXCREATEPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXCreatePixmap")) == NULL) || r; - r = ((glXCreateWindow = (PFNGLXCREATEWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXCreateWindow")) == NULL) || r; - r = ((glXDestroyPbuffer = (PFNGLXDESTROYPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPbuffer")) == NULL) || r; - r = ((glXDestroyPixmap = (PFNGLXDESTROYPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPixmap")) == NULL) || r; - r = ((glXDestroyWindow = (PFNGLXDESTROYWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXDestroyWindow")) == NULL) || r; - r = ((glXGetCurrentReadDrawable = (PFNGLXGETCURRENTREADDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawable")) == NULL) || r; - r = ((glXGetFBConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttrib")) == NULL) || r; - r = ((glXGetFBConfigs = (PFNGLXGETFBCONFIGSPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigs")) == NULL) || r; - r = ((glXGetSelectedEvent = (PFNGLXGETSELECTEDEVENTPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEvent")) == NULL) || r; - r = ((glXGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfig")) == NULL) || r; - r = ((glXMakeContextCurrent = (PFNGLXMAKECONTEXTCURRENTPROC)glewGetProcAddress((const GLubyte*)"glXMakeContextCurrent")) == NULL) || r; - r = ((glXQueryContext = (PFNGLXQUERYCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContext")) == NULL) || r; - r = ((glXQueryDrawable = (PFNGLXQUERYDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXQueryDrawable")) == NULL) || r; - r = ((glXSelectEvent = (PFNGLXSELECTEVENTPROC)glewGetProcAddress((const GLubyte*)"glXSelectEvent")) == NULL) || r; - - return r; -} - -#endif /* GLX_VERSION_1_3 */ - -#ifdef GLX_AMD_gpu_association - -static GLboolean _glewInit_GLX_AMD_gpu_association () -{ - GLboolean r = GL_FALSE; - - r = ((glXBlitContextFramebufferAMD = (PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)"glXBlitContextFramebufferAMD")) == NULL) || r; - r = ((glXCreateAssociatedContextAMD = (PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXCreateAssociatedContextAMD")) == NULL) || r; - r = ((glXCreateAssociatedContextAttribsAMD = (PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)"glXCreateAssociatedContextAttribsAMD")) == NULL) || r; - r = ((glXDeleteAssociatedContextAMD = (PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXDeleteAssociatedContextAMD")) == NULL) || r; - r = ((glXGetContextGPUIDAMD = (PFNGLXGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetContextGPUIDAMD")) == NULL) || r; - r = ((glXGetCurrentAssociatedContextAMD = (PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentAssociatedContextAMD")) == NULL) || r; - r = ((glXGetGPUIDsAMD = (PFNGLXGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetGPUIDsAMD")) == NULL) || r; - r = ((glXGetGPUInfoAMD = (PFNGLXGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetGPUInfoAMD")) == NULL) || r; - r = ((glXMakeAssociatedContextCurrentAMD = (PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)"glXMakeAssociatedContextCurrentAMD")) == NULL) || r; - - return r; -} - -#endif /* GLX_AMD_gpu_association */ - -#ifdef GLX_ARB_create_context - -static GLboolean _glewInit_GLX_ARB_create_context () -{ - GLboolean r = GL_FALSE; - - r = ((glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)glewGetProcAddress((const GLubyte*)"glXCreateContextAttribsARB")) == NULL) || r; - - return r; -} - -#endif /* GLX_ARB_create_context */ - -#ifdef GLX_ATI_render_texture - -static GLboolean _glewInit_GLX_ATI_render_texture () -{ - GLboolean r = GL_FALSE; - - r = ((glXBindTexImageATI = (PFNGLXBINDTEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageATI")) == NULL) || r; - r = ((glXDrawableAttribATI = (PFNGLXDRAWABLEATTRIBATIPROC)glewGetProcAddress((const GLubyte*)"glXDrawableAttribATI")) == NULL) || r; - r = ((glXReleaseTexImageATI = (PFNGLXRELEASETEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageATI")) == NULL) || r; - - return r; -} - -#endif /* GLX_ATI_render_texture */ - -#ifdef GLX_EXT_import_context - -static GLboolean _glewInit_GLX_EXT_import_context () -{ - GLboolean r = GL_FALSE; - - r = ((glXFreeContextEXT = (PFNGLXFREECONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXFreeContextEXT")) == NULL) || r; - r = ((glXGetContextIDEXT = (PFNGLXGETCONTEXTIDEXTPROC)glewGetProcAddress((const GLubyte*)"glXGetContextIDEXT")) == NULL) || r; - r = ((glXImportContextEXT = (PFNGLXIMPORTCONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXImportContextEXT")) == NULL) || r; - r = ((glXQueryContextInfoEXT = (PFNGLXQUERYCONTEXTINFOEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContextInfoEXT")) == NULL) || r; - - return r; -} - -#endif /* GLX_EXT_import_context */ - -#ifdef GLX_EXT_swap_control - -static GLboolean _glewInit_GLX_EXT_swap_control () -{ - GLboolean r = GL_FALSE; - - r = ((glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalEXT")) == NULL) || r; - - return r; -} - -#endif /* GLX_EXT_swap_control */ - -#ifdef GLX_EXT_texture_from_pixmap - -static GLboolean _glewInit_GLX_EXT_texture_from_pixmap () -{ - GLboolean r = GL_FALSE; - - r = ((glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageEXT")) == NULL) || r; - r = ((glXReleaseTexImageEXT = (PFNGLXRELEASETEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageEXT")) == NULL) || r; - - return r; -} - -#endif /* GLX_EXT_texture_from_pixmap */ - -#ifdef GLX_MESA_agp_offset - -static GLboolean _glewInit_GLX_MESA_agp_offset () -{ - GLboolean r = GL_FALSE; - - r = ((glXGetAGPOffsetMESA = (PFNGLXGETAGPOFFSETMESAPROC)glewGetProcAddress((const GLubyte*)"glXGetAGPOffsetMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_agp_offset */ - -#ifdef GLX_MESA_copy_sub_buffer - -static GLboolean _glewInit_GLX_MESA_copy_sub_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((glXCopySubBufferMESA = (PFNGLXCOPYSUBBUFFERMESAPROC)glewGetProcAddress((const GLubyte*)"glXCopySubBufferMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_copy_sub_buffer */ - -#ifdef GLX_MESA_pixmap_colormap - -static GLboolean _glewInit_GLX_MESA_pixmap_colormap () -{ - GLboolean r = GL_FALSE; - - r = ((glXCreateGLXPixmapMESA = (PFNGLXCREATEGLXPIXMAPMESAPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_pixmap_colormap */ - -#ifdef GLX_MESA_query_renderer - -static GLboolean _glewInit_GLX_MESA_query_renderer () -{ - GLboolean r = GL_FALSE; - - r = ((glXQueryCurrentRendererIntegerMESA = (PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryCurrentRendererIntegerMESA")) == NULL) || r; - r = ((glXQueryCurrentRendererStringMESA = (PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryCurrentRendererStringMESA")) == NULL) || r; - r = ((glXQueryRendererIntegerMESA = (PFNGLXQUERYRENDERERINTEGERMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryRendererIntegerMESA")) == NULL) || r; - r = ((glXQueryRendererStringMESA = (PFNGLXQUERYRENDERERSTRINGMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryRendererStringMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_query_renderer */ - -#ifdef GLX_MESA_release_buffers - -static GLboolean _glewInit_GLX_MESA_release_buffers () -{ - GLboolean r = GL_FALSE; - - r = ((glXReleaseBuffersMESA = (PFNGLXRELEASEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glXReleaseBuffersMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_release_buffers */ - -#ifdef GLX_MESA_set_3dfx_mode - -static GLboolean _glewInit_GLX_MESA_set_3dfx_mode () -{ - GLboolean r = GL_FALSE; - - r = ((glXSet3DfxModeMESA = (PFNGLXSET3DFXMODEMESAPROC)glewGetProcAddress((const GLubyte*)"glXSet3DfxModeMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_set_3dfx_mode */ - -#ifdef GLX_MESA_swap_control - -static GLboolean _glewInit_GLX_MESA_swap_control () -{ - GLboolean r = GL_FALSE; - - r = ((glXGetSwapIntervalMESA = (PFNGLXGETSWAPINTERVALMESAPROC)glewGetProcAddress((const GLubyte*)"glXGetSwapIntervalMESA")) == NULL) || r; - r = ((glXSwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_swap_control */ - -#ifdef GLX_NV_copy_buffer - -static GLboolean _glewInit_GLX_NV_copy_buffer () -{ - GLboolean r = GL_FALSE; - - r = ((glXCopyBufferSubDataNV = (PFNGLXCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXCopyBufferSubDataNV")) == NULL) || r; - r = ((glXNamedCopyBufferSubDataNV = (PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXNamedCopyBufferSubDataNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_copy_buffer */ - -#ifdef GLX_NV_copy_image - -static GLboolean _glewInit_GLX_NV_copy_image () -{ - GLboolean r = GL_FALSE; - - r = ((glXCopyImageSubDataNV = (PFNGLXCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXCopyImageSubDataNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_copy_image */ - -#ifdef GLX_NV_delay_before_swap - -static GLboolean _glewInit_GLX_NV_delay_before_swap () -{ - GLboolean r = GL_FALSE; - - r = ((glXDelayBeforeSwapNV = (PFNGLXDELAYBEFORESWAPNVPROC)glewGetProcAddress((const GLubyte*)"glXDelayBeforeSwapNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_delay_before_swap */ - -#ifdef GLX_NV_present_video - -static GLboolean _glewInit_GLX_NV_present_video () -{ - GLboolean r = GL_FALSE; - - r = ((glXBindVideoDeviceNV = (PFNGLXBINDVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoDeviceNV")) == NULL) || r; - r = ((glXEnumerateVideoDevicesNV = (PFNGLXENUMERATEVIDEODEVICESNVPROC)glewGetProcAddress((const GLubyte*)"glXEnumerateVideoDevicesNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_present_video */ - -#ifdef GLX_NV_swap_group - -static GLboolean _glewInit_GLX_NV_swap_group () -{ - GLboolean r = GL_FALSE; - - r = ((glXBindSwapBarrierNV = (PFNGLXBINDSWAPBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glXBindSwapBarrierNV")) == NULL) || r; - r = ((glXJoinSwapGroupNV = (PFNGLXJOINSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"glXJoinSwapGroupNV")) == NULL) || r; - r = ((glXQueryFrameCountNV = (PFNGLXQUERYFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glXQueryFrameCountNV")) == NULL) || r; - r = ((glXQueryMaxSwapGroupsNV = (PFNGLXQUERYMAXSWAPGROUPSNVPROC)glewGetProcAddress((const GLubyte*)"glXQueryMaxSwapGroupsNV")) == NULL) || r; - r = ((glXQuerySwapGroupNV = (PFNGLXQUERYSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"glXQuerySwapGroupNV")) == NULL) || r; - r = ((glXResetFrameCountNV = (PFNGLXRESETFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glXResetFrameCountNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_swap_group */ - -#ifdef GLX_NV_vertex_array_range - -static GLboolean _glewInit_GLX_NV_vertex_array_range () -{ - GLboolean r = GL_FALSE; - - r = ((glXAllocateMemoryNV = (PFNGLXALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXAllocateMemoryNV")) == NULL) || r; - r = ((glXFreeMemoryNV = (PFNGLXFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXFreeMemoryNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_vertex_array_range */ - -#ifdef GLX_NV_video_capture - -static GLboolean _glewInit_GLX_NV_video_capture () -{ - GLboolean r = GL_FALSE; - - r = ((glXBindVideoCaptureDeviceNV = (PFNGLXBINDVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoCaptureDeviceNV")) == NULL) || r; - r = ((glXEnumerateVideoCaptureDevicesNV = (PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"glXEnumerateVideoCaptureDevicesNV")) == NULL) || r; - r = ((glXLockVideoCaptureDeviceNV = (PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXLockVideoCaptureDeviceNV")) == NULL) || r; - r = ((glXQueryVideoCaptureDeviceNV = (PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXQueryVideoCaptureDeviceNV")) == NULL) || r; - r = ((glXReleaseVideoCaptureDeviceNV = (PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoCaptureDeviceNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_video_capture */ - -#ifdef GLX_NV_video_out - -static GLboolean _glewInit_GLX_NV_video_out () -{ - GLboolean r = GL_FALSE; - - r = ((glXBindVideoImageNV = (PFNGLXBINDVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoImageNV")) == NULL) || r; - r = ((glXGetVideoDeviceNV = (PFNGLXGETVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoDeviceNV")) == NULL) || r; - r = ((glXGetVideoInfoNV = (PFNGLXGETVIDEOINFONVPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoInfoNV")) == NULL) || r; - r = ((glXReleaseVideoDeviceNV = (PFNGLXRELEASEVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoDeviceNV")) == NULL) || r; - r = ((glXReleaseVideoImageNV = (PFNGLXRELEASEVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoImageNV")) == NULL) || r; - r = ((glXSendPbufferToVideoNV = (PFNGLXSENDPBUFFERTOVIDEONVPROC)glewGetProcAddress((const GLubyte*)"glXSendPbufferToVideoNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_video_out */ - -#ifdef GLX_OML_sync_control - -static GLboolean _glewInit_GLX_OML_sync_control () -{ - GLboolean r = GL_FALSE; - - r = ((glXGetMscRateOML = (PFNGLXGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetMscRateOML")) == NULL) || r; - r = ((glXGetSyncValuesOML = (PFNGLXGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetSyncValuesOML")) == NULL) || r; - r = ((glXSwapBuffersMscOML = (PFNGLXSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXSwapBuffersMscOML")) == NULL) || r; - r = ((glXWaitForMscOML = (PFNGLXWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForMscOML")) == NULL) || r; - r = ((glXWaitForSbcOML = (PFNGLXWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForSbcOML")) == NULL) || r; - - return r; -} - -#endif /* GLX_OML_sync_control */ - -#ifdef GLX_SGIX_fbconfig - -static GLboolean _glewInit_GLX_SGIX_fbconfig () -{ - GLboolean r = GL_FALSE; - - r = ((glXChooseFBConfigSGIX = (PFNGLXCHOOSEFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfigSGIX")) == NULL) || r; - r = ((glXCreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateContextWithConfigSGIX")) == NULL) || r; - r = ((glXCreateGLXPixmapWithConfigSGIX = (PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapWithConfigSGIX")) == NULL) || r; - r = ((glXGetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttribSGIX")) == NULL) || r; - r = ((glXGetFBConfigFromVisualSGIX = (PFNGLXGETFBCONFIGFROMVISUALSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigFromVisualSGIX")) == NULL) || r; - r = ((glXGetVisualFromFBConfigSGIX = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfigSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_fbconfig */ - -#ifdef GLX_SGIX_hyperpipe - -static GLboolean _glewInit_GLX_SGIX_hyperpipe () -{ - GLboolean r = GL_FALSE; - - r = ((glXBindHyperpipeSGIX = (PFNGLXBINDHYPERPIPESGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindHyperpipeSGIX")) == NULL) || r; - r = ((glXDestroyHyperpipeConfigSGIX = (PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyHyperpipeConfigSGIX")) == NULL) || r; - r = ((glXHyperpipeAttribSGIX = (PFNGLXHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXHyperpipeAttribSGIX")) == NULL) || r; - r = ((glXHyperpipeConfigSGIX = (PFNGLXHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXHyperpipeConfigSGIX")) == NULL) || r; - r = ((glXQueryHyperpipeAttribSGIX = (PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeAttribSGIX")) == NULL) || r; - r = ((glXQueryHyperpipeBestAttribSGIX = (PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeBestAttribSGIX")) == NULL) || r; - r = ((glXQueryHyperpipeConfigSGIX = (PFNGLXQUERYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeConfigSGIX")) == NULL) || r; - r = ((glXQueryHyperpipeNetworkSGIX = (PFNGLXQUERYHYPERPIPENETWORKSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeNetworkSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_hyperpipe */ - -#ifdef GLX_SGIX_pbuffer - -static GLboolean _glewInit_GLX_SGIX_pbuffer () -{ - GLboolean r = GL_FALSE; - - r = ((glXCreateGLXPbufferSGIX = (PFNGLXCREATEGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPbufferSGIX")) == NULL) || r; - r = ((glXDestroyGLXPbufferSGIX = (PFNGLXDESTROYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyGLXPbufferSGIX")) == NULL) || r; - r = ((glXGetSelectedEventSGIX = (PFNGLXGETSELECTEDEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEventSGIX")) == NULL) || r; - r = ((glXQueryGLXPbufferSGIX = (PFNGLXQUERYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryGLXPbufferSGIX")) == NULL) || r; - r = ((glXSelectEventSGIX = (PFNGLXSELECTEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXSelectEventSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_pbuffer */ - -#ifdef GLX_SGIX_swap_barrier - -static GLboolean _glewInit_GLX_SGIX_swap_barrier () -{ - GLboolean r = GL_FALSE; - - r = ((glXBindSwapBarrierSGIX = (PFNGLXBINDSWAPBARRIERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindSwapBarrierSGIX")) == NULL) || r; - r = ((glXQueryMaxSwapBarriersSGIX = (PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryMaxSwapBarriersSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_swap_barrier */ - -#ifdef GLX_SGIX_swap_group - -static GLboolean _glewInit_GLX_SGIX_swap_group () -{ - GLboolean r = GL_FALSE; - - r = ((glXJoinSwapGroupSGIX = (PFNGLXJOINSWAPGROUPSGIXPROC)glewGetProcAddress((const GLubyte*)"glXJoinSwapGroupSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_swap_group */ - -#ifdef GLX_SGIX_video_resize - -static GLboolean _glewInit_GLX_SGIX_video_resize () -{ - GLboolean r = GL_FALSE; - - r = ((glXBindChannelToWindowSGIX = (PFNGLXBINDCHANNELTOWINDOWSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindChannelToWindowSGIX")) == NULL) || r; - r = ((glXChannelRectSGIX = (PFNGLXCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSGIX")) == NULL) || r; - r = ((glXChannelRectSyncSGIX = (PFNGLXCHANNELRECTSYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSyncSGIX")) == NULL) || r; - r = ((glXQueryChannelDeltasSGIX = (PFNGLXQUERYCHANNELDELTASSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelDeltasSGIX")) == NULL) || r; - r = ((glXQueryChannelRectSGIX = (PFNGLXQUERYCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelRectSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_video_resize */ - -#ifdef GLX_SGI_cushion - -static GLboolean _glewInit_GLX_SGI_cushion () -{ - GLboolean r = GL_FALSE; - - r = ((glXCushionSGI = (PFNGLXCUSHIONSGIPROC)glewGetProcAddress((const GLubyte*)"glXCushionSGI")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGI_cushion */ - -#ifdef GLX_SGI_make_current_read - -static GLboolean _glewInit_GLX_SGI_make_current_read () -{ - GLboolean r = GL_FALSE; - - r = ((glXGetCurrentReadDrawableSGI = (PFNGLXGETCURRENTREADDRAWABLESGIPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawableSGI")) == NULL) || r; - r = ((glXMakeCurrentReadSGI = (PFNGLXMAKECURRENTREADSGIPROC)glewGetProcAddress((const GLubyte*)"glXMakeCurrentReadSGI")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGI_make_current_read */ - -#ifdef GLX_SGI_swap_control - -static GLboolean _glewInit_GLX_SGI_swap_control () -{ - GLboolean r = GL_FALSE; - - r = ((glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalSGI")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGI_swap_control */ - -#ifdef GLX_SGI_video_sync - -static GLboolean _glewInit_GLX_SGI_video_sync () -{ - GLboolean r = GL_FALSE; - - r = ((glXGetVideoSyncSGI = (PFNGLXGETVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoSyncSGI")) == NULL) || r; - r = ((glXWaitVideoSyncSGI = (PFNGLXWAITVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXWaitVideoSyncSGI")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGI_video_sync */ - -#ifdef GLX_SUN_get_transparent_index - -static GLboolean _glewInit_GLX_SUN_get_transparent_index () -{ - GLboolean r = GL_FALSE; - - r = ((glXGetTransparentIndexSUN = (PFNGLXGETTRANSPARENTINDEXSUNPROC)glewGetProcAddress((const GLubyte*)"glXGetTransparentIndexSUN")) == NULL) || r; - - return r; -} - -#endif /* GLX_SUN_get_transparent_index */ - -#ifdef GLX_SUN_video_resize - -static GLboolean _glewInit_GLX_SUN_video_resize () -{ - GLboolean r = GL_FALSE; - - r = ((glXGetVideoResizeSUN = (PFNGLXGETVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoResizeSUN")) == NULL) || r; - r = ((glXVideoResizeSUN = (PFNGLXVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXVideoResizeSUN")) == NULL) || r; - - return r; -} - -#endif /* GLX_SUN_video_resize */ - -/* ------------------------------------------------------------------------ */ - -GLboolean glxewGetExtension (const char* name) -{ - const GLubyte* start; - const GLubyte* end; - - if (glXGetCurrentDisplay == NULL) return GL_FALSE; - start = (const GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS); - if (0 == start) return GL_FALSE; - end = start + _glewStrLen(start); - return _glewSearchExtension(name, start, end); -} - -GLenum glxewInit () -{ - Display* display; - int major, minor; - const GLubyte* extStart; - const GLubyte* extEnd; - /* initialize core GLX 1.2 */ - if (_glewInit_GLX_VERSION_1_2()) return GLEW_ERROR_GLX_VERSION_11_ONLY; - /* check for a display */ - display = glXGetCurrentDisplay(); - if (display == NULL) return GLEW_ERROR_NO_GLX_DISPLAY; - /* initialize flags */ - GLXEW_VERSION_1_0 = GL_TRUE; - GLXEW_VERSION_1_1 = GL_TRUE; - GLXEW_VERSION_1_2 = GL_TRUE; - GLXEW_VERSION_1_3 = GL_TRUE; - GLXEW_VERSION_1_4 = GL_TRUE; - /* query GLX version */ - glXQueryVersion(display, &major, &minor); - if (major == 1 && minor <= 3) - { - switch (minor) - { - case 3: - GLXEW_VERSION_1_4 = GL_FALSE; - break; - case 2: - GLXEW_VERSION_1_4 = GL_FALSE; - GLXEW_VERSION_1_3 = GL_FALSE; - break; - default: - return GLEW_ERROR_GLX_VERSION_11_ONLY; - break; - } - } - /* query GLX extension string */ - extStart = 0; - if (glXGetCurrentDisplay != NULL) - extStart = (const GLubyte*)glXGetClientString(display, GLX_EXTENSIONS); - if (extStart == 0) - extStart = (const GLubyte *)""; - extEnd = extStart + _glewStrLen(extStart); - /* initialize extensions */ -#ifdef GLX_VERSION_1_3 - if (glewExperimental || GLXEW_VERSION_1_3) GLXEW_VERSION_1_3 = !_glewInit_GLX_VERSION_1_3(); -#endif /* GLX_VERSION_1_3 */ -#ifdef GLX_3DFX_multisample - GLXEW_3DFX_multisample = _glewSearchExtension("GLX_3DFX_multisample", extStart, extEnd); -#endif /* GLX_3DFX_multisample */ -#ifdef GLX_AMD_gpu_association - GLXEW_AMD_gpu_association = _glewSearchExtension("GLX_AMD_gpu_association", extStart, extEnd); - if (glewExperimental || GLXEW_AMD_gpu_association) GLXEW_AMD_gpu_association = !_glewInit_GLX_AMD_gpu_association(); -#endif /* GLX_AMD_gpu_association */ -#ifdef GLX_ARB_context_flush_control - GLXEW_ARB_context_flush_control = _glewSearchExtension("GLX_ARB_context_flush_control", extStart, extEnd); -#endif /* GLX_ARB_context_flush_control */ -#ifdef GLX_ARB_create_context - GLXEW_ARB_create_context = _glewSearchExtension("GLX_ARB_create_context", extStart, extEnd); - if (glewExperimental || GLXEW_ARB_create_context) GLXEW_ARB_create_context = !_glewInit_GLX_ARB_create_context(); -#endif /* GLX_ARB_create_context */ -#ifdef GLX_ARB_create_context_no_error - GLXEW_ARB_create_context_no_error = _glewSearchExtension("GLX_ARB_create_context_no_error", extStart, extEnd); -#endif /* GLX_ARB_create_context_no_error */ -#ifdef GLX_ARB_create_context_profile - GLXEW_ARB_create_context_profile = _glewSearchExtension("GLX_ARB_create_context_profile", extStart, extEnd); -#endif /* GLX_ARB_create_context_profile */ -#ifdef GLX_ARB_create_context_robustness - GLXEW_ARB_create_context_robustness = _glewSearchExtension("GLX_ARB_create_context_robustness", extStart, extEnd); -#endif /* GLX_ARB_create_context_robustness */ -#ifdef GLX_ARB_fbconfig_float - GLXEW_ARB_fbconfig_float = _glewSearchExtension("GLX_ARB_fbconfig_float", extStart, extEnd); -#endif /* GLX_ARB_fbconfig_float */ -#ifdef GLX_ARB_framebuffer_sRGB - GLXEW_ARB_framebuffer_sRGB = _glewSearchExtension("GLX_ARB_framebuffer_sRGB", extStart, extEnd); -#endif /* GLX_ARB_framebuffer_sRGB */ -#ifdef GLX_ARB_get_proc_address - GLXEW_ARB_get_proc_address = _glewSearchExtension("GLX_ARB_get_proc_address", extStart, extEnd); -#endif /* GLX_ARB_get_proc_address */ -#ifdef GLX_ARB_multisample - GLXEW_ARB_multisample = _glewSearchExtension("GLX_ARB_multisample", extStart, extEnd); -#endif /* GLX_ARB_multisample */ -#ifdef GLX_ARB_robustness_application_isolation - GLXEW_ARB_robustness_application_isolation = _glewSearchExtension("GLX_ARB_robustness_application_isolation", extStart, extEnd); -#endif /* GLX_ARB_robustness_application_isolation */ -#ifdef GLX_ARB_robustness_share_group_isolation - GLXEW_ARB_robustness_share_group_isolation = _glewSearchExtension("GLX_ARB_robustness_share_group_isolation", extStart, extEnd); -#endif /* GLX_ARB_robustness_share_group_isolation */ -#ifdef GLX_ARB_vertex_buffer_object - GLXEW_ARB_vertex_buffer_object = _glewSearchExtension("GLX_ARB_vertex_buffer_object", extStart, extEnd); -#endif /* GLX_ARB_vertex_buffer_object */ -#ifdef GLX_ATI_pixel_format_float - GLXEW_ATI_pixel_format_float = _glewSearchExtension("GLX_ATI_pixel_format_float", extStart, extEnd); -#endif /* GLX_ATI_pixel_format_float */ -#ifdef GLX_ATI_render_texture - GLXEW_ATI_render_texture = _glewSearchExtension("GLX_ATI_render_texture", extStart, extEnd); - if (glewExperimental || GLXEW_ATI_render_texture) GLXEW_ATI_render_texture = !_glewInit_GLX_ATI_render_texture(); -#endif /* GLX_ATI_render_texture */ -#ifdef GLX_EXT_buffer_age - GLXEW_EXT_buffer_age = _glewSearchExtension("GLX_EXT_buffer_age", extStart, extEnd); -#endif /* GLX_EXT_buffer_age */ -#ifdef GLX_EXT_create_context_es2_profile - GLXEW_EXT_create_context_es2_profile = _glewSearchExtension("GLX_EXT_create_context_es2_profile", extStart, extEnd); -#endif /* GLX_EXT_create_context_es2_profile */ -#ifdef GLX_EXT_create_context_es_profile - GLXEW_EXT_create_context_es_profile = _glewSearchExtension("GLX_EXT_create_context_es_profile", extStart, extEnd); -#endif /* GLX_EXT_create_context_es_profile */ -#ifdef GLX_EXT_fbconfig_packed_float - GLXEW_EXT_fbconfig_packed_float = _glewSearchExtension("GLX_EXT_fbconfig_packed_float", extStart, extEnd); -#endif /* GLX_EXT_fbconfig_packed_float */ -#ifdef GLX_EXT_framebuffer_sRGB - GLXEW_EXT_framebuffer_sRGB = _glewSearchExtension("GLX_EXT_framebuffer_sRGB", extStart, extEnd); -#endif /* GLX_EXT_framebuffer_sRGB */ -#ifdef GLX_EXT_import_context - GLXEW_EXT_import_context = _glewSearchExtension("GLX_EXT_import_context", extStart, extEnd); - if (glewExperimental || GLXEW_EXT_import_context) GLXEW_EXT_import_context = !_glewInit_GLX_EXT_import_context(); -#endif /* GLX_EXT_import_context */ -#ifdef GLX_EXT_libglvnd - GLXEW_EXT_libglvnd = _glewSearchExtension("GLX_EXT_libglvnd", extStart, extEnd); -#endif /* GLX_EXT_libglvnd */ -#ifdef GLX_EXT_scene_marker - GLXEW_EXT_scene_marker = _glewSearchExtension("GLX_EXT_scene_marker", extStart, extEnd); -#endif /* GLX_EXT_scene_marker */ -#ifdef GLX_EXT_stereo_tree - GLXEW_EXT_stereo_tree = _glewSearchExtension("GLX_EXT_stereo_tree", extStart, extEnd); -#endif /* GLX_EXT_stereo_tree */ -#ifdef GLX_EXT_swap_control - GLXEW_EXT_swap_control = _glewSearchExtension("GLX_EXT_swap_control", extStart, extEnd); - if (glewExperimental || GLXEW_EXT_swap_control) GLXEW_EXT_swap_control = !_glewInit_GLX_EXT_swap_control(); -#endif /* GLX_EXT_swap_control */ -#ifdef GLX_EXT_swap_control_tear - GLXEW_EXT_swap_control_tear = _glewSearchExtension("GLX_EXT_swap_control_tear", extStart, extEnd); -#endif /* GLX_EXT_swap_control_tear */ -#ifdef GLX_EXT_texture_from_pixmap - GLXEW_EXT_texture_from_pixmap = _glewSearchExtension("GLX_EXT_texture_from_pixmap", extStart, extEnd); - if (glewExperimental || GLXEW_EXT_texture_from_pixmap) GLXEW_EXT_texture_from_pixmap = !_glewInit_GLX_EXT_texture_from_pixmap(); -#endif /* GLX_EXT_texture_from_pixmap */ -#ifdef GLX_EXT_visual_info - GLXEW_EXT_visual_info = _glewSearchExtension("GLX_EXT_visual_info", extStart, extEnd); -#endif /* GLX_EXT_visual_info */ -#ifdef GLX_EXT_visual_rating - GLXEW_EXT_visual_rating = _glewSearchExtension("GLX_EXT_visual_rating", extStart, extEnd); -#endif /* GLX_EXT_visual_rating */ -#ifdef GLX_INTEL_swap_event - GLXEW_INTEL_swap_event = _glewSearchExtension("GLX_INTEL_swap_event", extStart, extEnd); -#endif /* GLX_INTEL_swap_event */ -#ifdef GLX_MESA_agp_offset - GLXEW_MESA_agp_offset = _glewSearchExtension("GLX_MESA_agp_offset", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_agp_offset) GLXEW_MESA_agp_offset = !_glewInit_GLX_MESA_agp_offset(); -#endif /* GLX_MESA_agp_offset */ -#ifdef GLX_MESA_copy_sub_buffer - GLXEW_MESA_copy_sub_buffer = _glewSearchExtension("GLX_MESA_copy_sub_buffer", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_copy_sub_buffer) GLXEW_MESA_copy_sub_buffer = !_glewInit_GLX_MESA_copy_sub_buffer(); -#endif /* GLX_MESA_copy_sub_buffer */ -#ifdef GLX_MESA_pixmap_colormap - GLXEW_MESA_pixmap_colormap = _glewSearchExtension("GLX_MESA_pixmap_colormap", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_pixmap_colormap) GLXEW_MESA_pixmap_colormap = !_glewInit_GLX_MESA_pixmap_colormap(); -#endif /* GLX_MESA_pixmap_colormap */ -#ifdef GLX_MESA_query_renderer - GLXEW_MESA_query_renderer = _glewSearchExtension("GLX_MESA_query_renderer", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_query_renderer) GLXEW_MESA_query_renderer = !_glewInit_GLX_MESA_query_renderer(); -#endif /* GLX_MESA_query_renderer */ -#ifdef GLX_MESA_release_buffers - GLXEW_MESA_release_buffers = _glewSearchExtension("GLX_MESA_release_buffers", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_release_buffers) GLXEW_MESA_release_buffers = !_glewInit_GLX_MESA_release_buffers(); -#endif /* GLX_MESA_release_buffers */ -#ifdef GLX_MESA_set_3dfx_mode - GLXEW_MESA_set_3dfx_mode = _glewSearchExtension("GLX_MESA_set_3dfx_mode", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_set_3dfx_mode) GLXEW_MESA_set_3dfx_mode = !_glewInit_GLX_MESA_set_3dfx_mode(); -#endif /* GLX_MESA_set_3dfx_mode */ -#ifdef GLX_MESA_swap_control - GLXEW_MESA_swap_control = _glewSearchExtension("GLX_MESA_swap_control", extStart, extEnd); - if (glewExperimental || GLXEW_MESA_swap_control) GLXEW_MESA_swap_control = !_glewInit_GLX_MESA_swap_control(); -#endif /* GLX_MESA_swap_control */ -#ifdef GLX_NV_copy_buffer - GLXEW_NV_copy_buffer = _glewSearchExtension("GLX_NV_copy_buffer", extStart, extEnd); - if (glewExperimental || GLXEW_NV_copy_buffer) GLXEW_NV_copy_buffer = !_glewInit_GLX_NV_copy_buffer(); -#endif /* GLX_NV_copy_buffer */ -#ifdef GLX_NV_copy_image - GLXEW_NV_copy_image = _glewSearchExtension("GLX_NV_copy_image", extStart, extEnd); - if (glewExperimental || GLXEW_NV_copy_image) GLXEW_NV_copy_image = !_glewInit_GLX_NV_copy_image(); -#endif /* GLX_NV_copy_image */ -#ifdef GLX_NV_delay_before_swap - GLXEW_NV_delay_before_swap = _glewSearchExtension("GLX_NV_delay_before_swap", extStart, extEnd); - if (glewExperimental || GLXEW_NV_delay_before_swap) GLXEW_NV_delay_before_swap = !_glewInit_GLX_NV_delay_before_swap(); -#endif /* GLX_NV_delay_before_swap */ -#ifdef GLX_NV_float_buffer - GLXEW_NV_float_buffer = _glewSearchExtension("GLX_NV_float_buffer", extStart, extEnd); -#endif /* GLX_NV_float_buffer */ -#ifdef GLX_NV_multisample_coverage - GLXEW_NV_multisample_coverage = _glewSearchExtension("GLX_NV_multisample_coverage", extStart, extEnd); -#endif /* GLX_NV_multisample_coverage */ -#ifdef GLX_NV_present_video - GLXEW_NV_present_video = _glewSearchExtension("GLX_NV_present_video", extStart, extEnd); - if (glewExperimental || GLXEW_NV_present_video) GLXEW_NV_present_video = !_glewInit_GLX_NV_present_video(); -#endif /* GLX_NV_present_video */ -#ifdef GLX_NV_robustness_video_memory_purge - GLXEW_NV_robustness_video_memory_purge = _glewSearchExtension("GLX_NV_robustness_video_memory_purge", extStart, extEnd); -#endif /* GLX_NV_robustness_video_memory_purge */ -#ifdef GLX_NV_swap_group - GLXEW_NV_swap_group = _glewSearchExtension("GLX_NV_swap_group", extStart, extEnd); - if (glewExperimental || GLXEW_NV_swap_group) GLXEW_NV_swap_group = !_glewInit_GLX_NV_swap_group(); -#endif /* GLX_NV_swap_group */ -#ifdef GLX_NV_vertex_array_range - GLXEW_NV_vertex_array_range = _glewSearchExtension("GLX_NV_vertex_array_range", extStart, extEnd); - if (glewExperimental || GLXEW_NV_vertex_array_range) GLXEW_NV_vertex_array_range = !_glewInit_GLX_NV_vertex_array_range(); -#endif /* GLX_NV_vertex_array_range */ -#ifdef GLX_NV_video_capture - GLXEW_NV_video_capture = _glewSearchExtension("GLX_NV_video_capture", extStart, extEnd); - if (glewExperimental || GLXEW_NV_video_capture) GLXEW_NV_video_capture = !_glewInit_GLX_NV_video_capture(); -#endif /* GLX_NV_video_capture */ -#ifdef GLX_NV_video_out - GLXEW_NV_video_out = _glewSearchExtension("GLX_NV_video_out", extStart, extEnd); - if (glewExperimental || GLXEW_NV_video_out) GLXEW_NV_video_out = !_glewInit_GLX_NV_video_out(); -#endif /* GLX_NV_video_out */ -#ifdef GLX_OML_swap_method - GLXEW_OML_swap_method = _glewSearchExtension("GLX_OML_swap_method", extStart, extEnd); -#endif /* GLX_OML_swap_method */ -#ifdef GLX_OML_sync_control - GLXEW_OML_sync_control = _glewSearchExtension("GLX_OML_sync_control", extStart, extEnd); - if (glewExperimental || GLXEW_OML_sync_control) GLXEW_OML_sync_control = !_glewInit_GLX_OML_sync_control(); -#endif /* GLX_OML_sync_control */ -#ifdef GLX_SGIS_blended_overlay - GLXEW_SGIS_blended_overlay = _glewSearchExtension("GLX_SGIS_blended_overlay", extStart, extEnd); -#endif /* GLX_SGIS_blended_overlay */ -#ifdef GLX_SGIS_color_range - GLXEW_SGIS_color_range = _glewSearchExtension("GLX_SGIS_color_range", extStart, extEnd); -#endif /* GLX_SGIS_color_range */ -#ifdef GLX_SGIS_multisample - GLXEW_SGIS_multisample = _glewSearchExtension("GLX_SGIS_multisample", extStart, extEnd); -#endif /* GLX_SGIS_multisample */ -#ifdef GLX_SGIS_shared_multisample - GLXEW_SGIS_shared_multisample = _glewSearchExtension("GLX_SGIS_shared_multisample", extStart, extEnd); -#endif /* GLX_SGIS_shared_multisample */ -#ifdef GLX_SGIX_fbconfig - GLXEW_SGIX_fbconfig = _glewSearchExtension("GLX_SGIX_fbconfig", extStart, extEnd); - if (glewExperimental || GLXEW_SGIX_fbconfig) GLXEW_SGIX_fbconfig = !_glewInit_GLX_SGIX_fbconfig(); -#endif /* GLX_SGIX_fbconfig */ -#ifdef GLX_SGIX_hyperpipe - GLXEW_SGIX_hyperpipe = _glewSearchExtension("GLX_SGIX_hyperpipe", extStart, extEnd); - if (glewExperimental || GLXEW_SGIX_hyperpipe) GLXEW_SGIX_hyperpipe = !_glewInit_GLX_SGIX_hyperpipe(); -#endif /* GLX_SGIX_hyperpipe */ -#ifdef GLX_SGIX_pbuffer - GLXEW_SGIX_pbuffer = _glewSearchExtension("GLX_SGIX_pbuffer", extStart, extEnd); - if (glewExperimental || GLXEW_SGIX_pbuffer) GLXEW_SGIX_pbuffer = !_glewInit_GLX_SGIX_pbuffer(); -#endif /* GLX_SGIX_pbuffer */ -#ifdef GLX_SGIX_swap_barrier - GLXEW_SGIX_swap_barrier = _glewSearchExtension("GLX_SGIX_swap_barrier", extStart, extEnd); - if (glewExperimental || GLXEW_SGIX_swap_barrier) GLXEW_SGIX_swap_barrier = !_glewInit_GLX_SGIX_swap_barrier(); -#endif /* GLX_SGIX_swap_barrier */ -#ifdef GLX_SGIX_swap_group - GLXEW_SGIX_swap_group = _glewSearchExtension("GLX_SGIX_swap_group", extStart, extEnd); - if (glewExperimental || GLXEW_SGIX_swap_group) GLXEW_SGIX_swap_group = !_glewInit_GLX_SGIX_swap_group(); -#endif /* GLX_SGIX_swap_group */ -#ifdef GLX_SGIX_video_resize - GLXEW_SGIX_video_resize = _glewSearchExtension("GLX_SGIX_video_resize", extStart, extEnd); - if (glewExperimental || GLXEW_SGIX_video_resize) GLXEW_SGIX_video_resize = !_glewInit_GLX_SGIX_video_resize(); -#endif /* GLX_SGIX_video_resize */ -#ifdef GLX_SGIX_visual_select_group - GLXEW_SGIX_visual_select_group = _glewSearchExtension("GLX_SGIX_visual_select_group", extStart, extEnd); -#endif /* GLX_SGIX_visual_select_group */ -#ifdef GLX_SGI_cushion - GLXEW_SGI_cushion = _glewSearchExtension("GLX_SGI_cushion", extStart, extEnd); - if (glewExperimental || GLXEW_SGI_cushion) GLXEW_SGI_cushion = !_glewInit_GLX_SGI_cushion(); -#endif /* GLX_SGI_cushion */ -#ifdef GLX_SGI_make_current_read - GLXEW_SGI_make_current_read = _glewSearchExtension("GLX_SGI_make_current_read", extStart, extEnd); - if (glewExperimental || GLXEW_SGI_make_current_read) GLXEW_SGI_make_current_read = !_glewInit_GLX_SGI_make_current_read(); -#endif /* GLX_SGI_make_current_read */ -#ifdef GLX_SGI_swap_control - GLXEW_SGI_swap_control = _glewSearchExtension("GLX_SGI_swap_control", extStart, extEnd); - if (glewExperimental || GLXEW_SGI_swap_control) GLXEW_SGI_swap_control = !_glewInit_GLX_SGI_swap_control(); -#endif /* GLX_SGI_swap_control */ -#ifdef GLX_SGI_video_sync - GLXEW_SGI_video_sync = _glewSearchExtension("GLX_SGI_video_sync", extStart, extEnd); - if (glewExperimental || GLXEW_SGI_video_sync) GLXEW_SGI_video_sync = !_glewInit_GLX_SGI_video_sync(); -#endif /* GLX_SGI_video_sync */ -#ifdef GLX_SUN_get_transparent_index - GLXEW_SUN_get_transparent_index = _glewSearchExtension("GLX_SUN_get_transparent_index", extStart, extEnd); - if (glewExperimental || GLXEW_SUN_get_transparent_index) GLXEW_SUN_get_transparent_index = !_glewInit_GLX_SUN_get_transparent_index(); -#endif /* GLX_SUN_get_transparent_index */ -#ifdef GLX_SUN_video_resize - GLXEW_SUN_video_resize = _glewSearchExtension("GLX_SUN_video_resize", extStart, extEnd); - if (glewExperimental || GLXEW_SUN_video_resize) GLXEW_SUN_video_resize = !_glewInit_GLX_SUN_video_resize(); -#endif /* GLX_SUN_video_resize */ - - return GLEW_OK; -} - -#endif /* !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) */ - -/* ------------------------------------------------------------------------ */ - -const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error) -{ - static const GLubyte* _glewErrorString[] = - { - (const GLubyte*)"No error", - (const GLubyte*)"Missing GL version", - (const GLubyte*)"GL 1.1 and up are not supported", - (const GLubyte*)"GLX 1.2 and up are not supported", - (const GLubyte*)"Unknown error" - }; - const size_t max_error = sizeof(_glewErrorString)/sizeof(*_glewErrorString) - 1; - return _glewErrorString[(size_t)error > max_error ? max_error : (size_t)error]; -} - -const GLubyte * GLEWAPIENTRY glewGetString (GLenum name) -{ - static const GLubyte* _glewString[] = - { - (const GLubyte*)NULL, - (const GLubyte*)"2.1.0", - (const GLubyte*)"2", - (const GLubyte*)"1", - (const GLubyte*)"0" - }; - const size_t max_string = sizeof(_glewString)/sizeof(*_glewString) - 1; - return _glewString[(size_t)name > max_string ? 0 : (size_t)name]; -} - -/* ------------------------------------------------------------------------ */ - -GLboolean glewExperimental = GL_FALSE; - -GLenum GLEWAPIENTRY glewInit (void) -{ - GLenum r; -#if defined(GLEW_EGL) - PFNEGLGETCURRENTDISPLAYPROC getCurrentDisplay = NULL; -#endif - r = glewContextInit(); - if ( r != 0 ) return r; -#if defined(GLEW_EGL) - getCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC) glewGetProcAddress("eglGetCurrentDisplay"); - return eglewInit(getCurrentDisplay()); -#elif defined(GLEW_OSMESA) || defined(__ANDROID__) || defined(__native_client__) || defined(__HAIKU__) - return r; -#elif defined(_WIN32) - return wglewInit(); -#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) /* _UNIX */ - return glxewInit(); -#else - return r; -#endif /* _WIN32 */ -} - -#if defined(_WIN32) && defined(GLEW_BUILD) && defined(__GNUC__) -/* GCC requires a DLL entry point even without any standard library included. */ -/* Types extracted from windows.h to avoid polluting the rest of the file. */ -int __stdcall DllMainCRTStartup(void* instance, unsigned reason, void* reserved) -{ - (void) instance; - (void) reason; - (void) reserved; - return 1; -} -#endif -GLboolean GLEWAPIENTRY glewIsSupported (const char* name) -{ - const GLubyte* pos = (const GLubyte*)name; - GLuint len = _glewStrLen(pos); - GLboolean ret = GL_TRUE; - while (ret && len > 0) - { - if (_glewStrSame1(&pos, &len, (const GLubyte*)"GL_", 3)) - { - if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) - { -#ifdef GL_VERSION_1_2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) - { - ret = GLEW_VERSION_1_2; - continue; - } -#endif -#ifdef GL_VERSION_1_2_1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2_1", 5)) - { - ret = GLEW_VERSION_1_2_1; - continue; - } -#endif -#ifdef GL_VERSION_1_3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) - { - ret = GLEW_VERSION_1_3; - continue; - } -#endif -#ifdef GL_VERSION_1_4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) - { - ret = GLEW_VERSION_1_4; - continue; - } -#endif -#ifdef GL_VERSION_1_5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_5", 3)) - { - ret = GLEW_VERSION_1_5; - continue; - } -#endif -#ifdef GL_VERSION_2_0 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_0", 3)) - { - ret = GLEW_VERSION_2_0; - continue; - } -#endif -#ifdef GL_VERSION_2_1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_1", 3)) - { - ret = GLEW_VERSION_2_1; - continue; - } -#endif -#ifdef GL_VERSION_3_0 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_0", 3)) - { - ret = GLEW_VERSION_3_0; - continue; - } -#endif -#ifdef GL_VERSION_3_1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_1", 3)) - { - ret = GLEW_VERSION_3_1; - continue; - } -#endif -#ifdef GL_VERSION_3_2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_2", 3)) - { - ret = GLEW_VERSION_3_2; - continue; - } -#endif -#ifdef GL_VERSION_3_3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_3", 3)) - { - ret = GLEW_VERSION_3_3; - continue; - } -#endif -#ifdef GL_VERSION_4_0 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_0", 3)) - { - ret = GLEW_VERSION_4_0; - continue; - } -#endif -#ifdef GL_VERSION_4_1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_1", 3)) - { - ret = GLEW_VERSION_4_1; - continue; - } -#endif -#ifdef GL_VERSION_4_2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_2", 3)) - { - ret = GLEW_VERSION_4_2; - continue; - } -#endif -#ifdef GL_VERSION_4_3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_3", 3)) - { - ret = GLEW_VERSION_4_3; - continue; - } -#endif -#ifdef GL_VERSION_4_4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_4", 3)) - { - ret = GLEW_VERSION_4_4; - continue; - } -#endif -#ifdef GL_VERSION_4_5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_5", 3)) - { - ret = GLEW_VERSION_4_5; - continue; - } -#endif -#ifdef GL_VERSION_4_6 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_6", 3)) - { - ret = GLEW_VERSION_4_6; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) - { -#ifdef GL_3DFX_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLEW_3DFX_multisample; - continue; - } -#endif -#ifdef GL_3DFX_tbuffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tbuffer", 7)) - { - ret = GLEW_3DFX_tbuffer; - continue; - } -#endif -#ifdef GL_3DFX_texture_compression_FXT1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_FXT1", 24)) - { - ret = GLEW_3DFX_texture_compression_FXT1; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) - { -#ifdef GL_AMD_blend_minmax_factor - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax_factor", 19)) - { - ret = GLEW_AMD_blend_minmax_factor; - continue; - } -#endif -#ifdef GL_AMD_compressed_3DC_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_3DC_texture", 22)) - { - ret = GLEW_AMD_compressed_3DC_texture; - continue; - } -#endif -#ifdef GL_AMD_compressed_ATC_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_ATC_texture", 22)) - { - ret = GLEW_AMD_compressed_ATC_texture; - continue; - } -#endif -#ifdef GL_AMD_conservative_depth - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) - { - ret = GLEW_AMD_conservative_depth; - continue; - } -#endif -#ifdef GL_AMD_debug_output - if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_output", 12)) - { - ret = GLEW_AMD_debug_output; - continue; - } -#endif -#ifdef GL_AMD_depth_clamp_separate - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp_separate", 20)) - { - ret = GLEW_AMD_depth_clamp_separate; - continue; - } -#endif -#ifdef GL_AMD_draw_buffers_blend - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_blend", 18)) - { - ret = GLEW_AMD_draw_buffers_blend; - continue; - } -#endif -#ifdef GL_AMD_framebuffer_sample_positions - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sample_positions", 28)) - { - ret = GLEW_AMD_framebuffer_sample_positions; - continue; - } -#endif -#ifdef GL_AMD_gcn_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gcn_shader", 10)) - { - ret = GLEW_AMD_gcn_shader; - continue; - } -#endif -#ifdef GL_AMD_gpu_shader_half_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_half_float", 21)) - { - ret = GLEW_AMD_gpu_shader_half_float; - continue; - } -#endif -#ifdef GL_AMD_gpu_shader_int16 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_int16", 16)) - { - ret = GLEW_AMD_gpu_shader_int16; - continue; - } -#endif -#ifdef GL_AMD_gpu_shader_int64 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_int64", 16)) - { - ret = GLEW_AMD_gpu_shader_int64; - continue; - } -#endif -#ifdef GL_AMD_interleaved_elements - if (_glewStrSame3(&pos, &len, (const GLubyte*)"interleaved_elements", 20)) - { - ret = GLEW_AMD_interleaved_elements; - continue; - } -#endif -#ifdef GL_AMD_multi_draw_indirect - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) - { - ret = GLEW_AMD_multi_draw_indirect; - continue; - } -#endif -#ifdef GL_AMD_name_gen_delete - if (_glewStrSame3(&pos, &len, (const GLubyte*)"name_gen_delete", 15)) - { - ret = GLEW_AMD_name_gen_delete; - continue; - } -#endif -#ifdef GL_AMD_occlusion_query_event - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query_event", 21)) - { - ret = GLEW_AMD_occlusion_query_event; - continue; - } -#endif -#ifdef GL_AMD_performance_monitor - if (_glewStrSame3(&pos, &len, (const GLubyte*)"performance_monitor", 19)) - { - ret = GLEW_AMD_performance_monitor; - continue; - } -#endif -#ifdef GL_AMD_pinned_memory - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pinned_memory", 13)) - { - ret = GLEW_AMD_pinned_memory; - continue; - } -#endif -#ifdef GL_AMD_program_binary_Z400 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_binary_Z400", 19)) - { - ret = GLEW_AMD_program_binary_Z400; - continue; - } -#endif -#ifdef GL_AMD_query_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_buffer_object", 19)) - { - ret = GLEW_AMD_query_buffer_object; - continue; - } -#endif -#ifdef GL_AMD_sample_positions - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_positions", 16)) - { - ret = GLEW_AMD_sample_positions; - continue; - } -#endif -#ifdef GL_AMD_seamless_cubemap_per_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cubemap_per_texture", 28)) - { - ret = GLEW_AMD_seamless_cubemap_per_texture; - continue; - } -#endif -#ifdef GL_AMD_shader_atomic_counter_ops - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counter_ops", 25)) - { - ret = GLEW_AMD_shader_atomic_counter_ops; - continue; - } -#endif -#ifdef GL_AMD_shader_ballot - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_ballot", 13)) - { - ret = GLEW_AMD_shader_ballot; - continue; - } -#endif -#ifdef GL_AMD_shader_explicit_vertex_parameter - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_explicit_vertex_parameter", 32)) - { - ret = GLEW_AMD_shader_explicit_vertex_parameter; - continue; - } -#endif -#ifdef GL_AMD_shader_stencil_export - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_export", 21)) - { - ret = GLEW_AMD_shader_stencil_export; - continue; - } -#endif -#ifdef GL_AMD_shader_stencil_value_export - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_value_export", 27)) - { - ret = GLEW_AMD_shader_stencil_value_export; - continue; - } -#endif -#ifdef GL_AMD_shader_trinary_minmax - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_trinary_minmax", 21)) - { - ret = GLEW_AMD_shader_trinary_minmax; - continue; - } -#endif -#ifdef GL_AMD_sparse_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) - { - ret = GLEW_AMD_sparse_texture; - continue; - } -#endif -#ifdef GL_AMD_stencil_operation_extended - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_operation_extended", 26)) - { - ret = GLEW_AMD_stencil_operation_extended; - continue; - } -#endif -#ifdef GL_AMD_texture_gather_bias_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_gather_bias_lod", 23)) - { - ret = GLEW_AMD_texture_gather_bias_lod; - continue; - } -#endif -#ifdef GL_AMD_texture_texture4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_texture4", 16)) - { - ret = GLEW_AMD_texture_texture4; - continue; - } -#endif -#ifdef GL_AMD_transform_feedback3_lines_triangles - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback3_lines_triangles", 35)) - { - ret = GLEW_AMD_transform_feedback3_lines_triangles; - continue; - } -#endif -#ifdef GL_AMD_transform_feedback4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback4", 19)) - { - ret = GLEW_AMD_transform_feedback4; - continue; - } -#endif -#ifdef GL_AMD_vertex_shader_layer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_layer", 19)) - { - ret = GLEW_AMD_vertex_shader_layer; - continue; - } -#endif -#ifdef GL_AMD_vertex_shader_tessellator - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_tessellator", 25)) - { - ret = GLEW_AMD_vertex_shader_tessellator; - continue; - } -#endif -#ifdef GL_AMD_vertex_shader_viewport_index - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_viewport_index", 28)) - { - ret = GLEW_AMD_vertex_shader_viewport_index; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANDROID_", 8)) - { -#ifdef GL_ANDROID_extension_pack_es31a - if (_glewStrSame3(&pos, &len, (const GLubyte*)"extension_pack_es31a", 20)) - { - ret = GLEW_ANDROID_extension_pack_es31a; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANGLE_", 6)) - { -#ifdef GL_ANGLE_depth_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) - { - ret = GLEW_ANGLE_depth_texture; - continue; - } -#endif -#ifdef GL_ANGLE_framebuffer_blit - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) - { - ret = GLEW_ANGLE_framebuffer_blit; - continue; - } -#endif -#ifdef GL_ANGLE_framebuffer_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) - { - ret = GLEW_ANGLE_framebuffer_multisample; - continue; - } -#endif -#ifdef GL_ANGLE_instanced_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) - { - ret = GLEW_ANGLE_instanced_arrays; - continue; - } -#endif -#ifdef GL_ANGLE_pack_reverse_row_order - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_reverse_row_order", 22)) - { - ret = GLEW_ANGLE_pack_reverse_row_order; - continue; - } -#endif -#ifdef GL_ANGLE_program_binary - if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_binary", 14)) - { - ret = GLEW_ANGLE_program_binary; - continue; - } -#endif -#ifdef GL_ANGLE_texture_compression_dxt1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24)) - { - ret = GLEW_ANGLE_texture_compression_dxt1; - continue; - } -#endif -#ifdef GL_ANGLE_texture_compression_dxt3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt3", 24)) - { - ret = GLEW_ANGLE_texture_compression_dxt3; - continue; - } -#endif -#ifdef GL_ANGLE_texture_compression_dxt5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt5", 24)) - { - ret = GLEW_ANGLE_texture_compression_dxt5; - continue; - } -#endif -#ifdef GL_ANGLE_texture_usage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_usage", 13)) - { - ret = GLEW_ANGLE_texture_usage; - continue; - } -#endif -#ifdef GL_ANGLE_timer_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) - { - ret = GLEW_ANGLE_timer_query; - continue; - } -#endif -#ifdef GL_ANGLE_translated_shader_source - if (_glewStrSame3(&pos, &len, (const GLubyte*)"translated_shader_source", 24)) - { - ret = GLEW_ANGLE_translated_shader_source; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"APPLE_", 6)) - { -#ifdef GL_APPLE_aux_depth_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"aux_depth_stencil", 17)) - { - ret = GLEW_APPLE_aux_depth_stencil; - continue; - } -#endif -#ifdef GL_APPLE_client_storage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_storage", 14)) - { - ret = GLEW_APPLE_client_storage; - continue; - } -#endif -#ifdef GL_APPLE_clip_distance - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_distance", 13)) - { - ret = GLEW_APPLE_clip_distance; - continue; - } -#endif -#ifdef GL_APPLE_color_buffer_packed_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_packed_float", 25)) - { - ret = GLEW_APPLE_color_buffer_packed_float; - continue; - } -#endif -#ifdef GL_APPLE_copy_texture_levels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_texture_levels", 19)) - { - ret = GLEW_APPLE_copy_texture_levels; - continue; - } -#endif -#ifdef GL_APPLE_element_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13)) - { - ret = GLEW_APPLE_element_array; - continue; - } -#endif -#ifdef GL_APPLE_fence - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5)) - { - ret = GLEW_APPLE_fence; - continue; - } -#endif -#ifdef GL_APPLE_float_pixels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_pixels", 12)) - { - ret = GLEW_APPLE_float_pixels; - continue; - } -#endif -#ifdef GL_APPLE_flush_buffer_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_buffer_range", 18)) - { - ret = GLEW_APPLE_flush_buffer_range; - continue; - } -#endif -#ifdef GL_APPLE_framebuffer_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) - { - ret = GLEW_APPLE_framebuffer_multisample; - continue; - } -#endif -#ifdef GL_APPLE_object_purgeable - if (_glewStrSame3(&pos, &len, (const GLubyte*)"object_purgeable", 16)) - { - ret = GLEW_APPLE_object_purgeable; - continue; - } -#endif -#ifdef GL_APPLE_pixel_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer", 12)) - { - ret = GLEW_APPLE_pixel_buffer; - continue; - } -#endif -#ifdef GL_APPLE_rgb_422 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"rgb_422", 7)) - { - ret = GLEW_APPLE_rgb_422; - continue; - } -#endif -#ifdef GL_APPLE_row_bytes - if (_glewStrSame3(&pos, &len, (const GLubyte*)"row_bytes", 9)) - { - ret = GLEW_APPLE_row_bytes; - continue; - } -#endif -#ifdef GL_APPLE_specular_vector - if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_vector", 15)) - { - ret = GLEW_APPLE_specular_vector; - continue; - } -#endif -#ifdef GL_APPLE_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync", 4)) - { - ret = GLEW_APPLE_sync; - continue; - } -#endif -#ifdef GL_APPLE_texture_2D_limited_npot - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_2D_limited_npot", 23)) - { - ret = GLEW_APPLE_texture_2D_limited_npot; - continue; - } -#endif -#ifdef GL_APPLE_texture_format_BGRA8888 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_format_BGRA8888", 23)) - { - ret = GLEW_APPLE_texture_format_BGRA8888; - continue; - } -#endif -#ifdef GL_APPLE_texture_max_level - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_max_level", 17)) - { - ret = GLEW_APPLE_texture_max_level; - continue; - } -#endif -#ifdef GL_APPLE_texture_packed_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_packed_float", 20)) - { - ret = GLEW_APPLE_texture_packed_float; - continue; - } -#endif -#ifdef GL_APPLE_texture_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13)) - { - ret = GLEW_APPLE_texture_range; - continue; - } -#endif -#ifdef GL_APPLE_transform_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_hint", 14)) - { - ret = GLEW_APPLE_transform_hint; - continue; - } -#endif -#ifdef GL_APPLE_vertex_array_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) - { - ret = GLEW_APPLE_vertex_array_object; - continue; - } -#endif -#ifdef GL_APPLE_vertex_array_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) - { - ret = GLEW_APPLE_vertex_array_range; - continue; - } -#endif -#ifdef GL_APPLE_vertex_program_evaluators - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program_evaluators", 25)) - { - ret = GLEW_APPLE_vertex_program_evaluators; - continue; - } -#endif -#ifdef GL_APPLE_ycbcr_422 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_422", 9)) - { - ret = GLEW_APPLE_ycbcr_422; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) - { -#ifdef GL_ARB_ES2_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES2_compatibility", 17)) - { - ret = GLEW_ARB_ES2_compatibility; - continue; - } -#endif -#ifdef GL_ARB_ES3_1_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_1_compatibility", 19)) - { - ret = GLEW_ARB_ES3_1_compatibility; - continue; - } -#endif -#ifdef GL_ARB_ES3_2_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_2_compatibility", 19)) - { - ret = GLEW_ARB_ES3_2_compatibility; - continue; - } -#endif -#ifdef GL_ARB_ES3_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_compatibility", 17)) - { - ret = GLEW_ARB_ES3_compatibility; - continue; - } -#endif -#ifdef GL_ARB_arrays_of_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"arrays_of_arrays", 16)) - { - ret = GLEW_ARB_arrays_of_arrays; - continue; - } -#endif -#ifdef GL_ARB_base_instance - if (_glewStrSame3(&pos, &len, (const GLubyte*)"base_instance", 13)) - { - ret = GLEW_ARB_base_instance; - continue; - } -#endif -#ifdef GL_ARB_bindless_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16)) - { - ret = GLEW_ARB_bindless_texture; - continue; - } -#endif -#ifdef GL_ARB_blend_func_extended - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_extended", 19)) - { - ret = GLEW_ARB_blend_func_extended; - continue; - } -#endif -#ifdef GL_ARB_buffer_storage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_storage", 14)) - { - ret = GLEW_ARB_buffer_storage; - continue; - } -#endif -#ifdef GL_ARB_cl_event - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cl_event", 8)) - { - ret = GLEW_ARB_cl_event; - continue; - } -#endif -#ifdef GL_ARB_clear_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_buffer_object", 19)) - { - ret = GLEW_ARB_clear_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_clear_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_texture", 13)) - { - ret = GLEW_ARB_clear_texture; - continue; - } -#endif -#ifdef GL_ARB_clip_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_control", 12)) - { - ret = GLEW_ARB_clip_control; - continue; - } -#endif -#ifdef GL_ARB_color_buffer_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_float", 18)) - { - ret = GLEW_ARB_color_buffer_float; - continue; - } -#endif -#ifdef GL_ARB_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compatibility", 13)) - { - ret = GLEW_ARB_compatibility; - continue; - } -#endif -#ifdef GL_ARB_compressed_texture_pixel_storage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_texture_pixel_storage", 32)) - { - ret = GLEW_ARB_compressed_texture_pixel_storage; - continue; - } -#endif -#ifdef GL_ARB_compute_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_shader", 14)) - { - ret = GLEW_ARB_compute_shader; - continue; - } -#endif -#ifdef GL_ARB_compute_variable_group_size - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_variable_group_size", 27)) - { - ret = GLEW_ARB_compute_variable_group_size; - continue; - } -#endif -#ifdef GL_ARB_conditional_render_inverted - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render_inverted", 27)) - { - ret = GLEW_ARB_conditional_render_inverted; - continue; - } -#endif -#ifdef GL_ARB_conservative_depth - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) - { - ret = GLEW_ARB_conservative_depth; - continue; - } -#endif -#ifdef GL_ARB_copy_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11)) - { - ret = GLEW_ARB_copy_buffer; - continue; - } -#endif -#ifdef GL_ARB_copy_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) - { - ret = GLEW_ARB_copy_image; - continue; - } -#endif -#ifdef GL_ARB_cull_distance - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_distance", 13)) - { - ret = GLEW_ARB_cull_distance; - continue; - } -#endif -#ifdef GL_ARB_debug_output - if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_output", 12)) - { - ret = GLEW_ARB_debug_output; - continue; - } -#endif -#ifdef GL_ARB_depth_buffer_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18)) - { - ret = GLEW_ARB_depth_buffer_float; - continue; - } -#endif -#ifdef GL_ARB_depth_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11)) - { - ret = GLEW_ARB_depth_clamp; - continue; - } -#endif -#ifdef GL_ARB_depth_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) - { - ret = GLEW_ARB_depth_texture; - continue; - } -#endif -#ifdef GL_ARB_derivative_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"derivative_control", 18)) - { - ret = GLEW_ARB_derivative_control; - continue; - } -#endif -#ifdef GL_ARB_direct_state_access - if (_glewStrSame3(&pos, &len, (const GLubyte*)"direct_state_access", 19)) - { - ret = GLEW_ARB_direct_state_access; - continue; - } -#endif -#ifdef GL_ARB_draw_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) - { - ret = GLEW_ARB_draw_buffers; - continue; - } -#endif -#ifdef GL_ARB_draw_buffers_blend - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_blend", 18)) - { - ret = GLEW_ARB_draw_buffers_blend; - continue; - } -#endif -#ifdef GL_ARB_draw_elements_base_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_elements_base_vertex", 25)) - { - ret = GLEW_ARB_draw_elements_base_vertex; - continue; - } -#endif -#ifdef GL_ARB_draw_indirect - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_indirect", 13)) - { - ret = GLEW_ARB_draw_indirect; - continue; - } -#endif -#ifdef GL_ARB_draw_instanced - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) - { - ret = GLEW_ARB_draw_instanced; - continue; - } -#endif -#ifdef GL_ARB_enhanced_layouts - if (_glewStrSame3(&pos, &len, (const GLubyte*)"enhanced_layouts", 16)) - { - ret = GLEW_ARB_enhanced_layouts; - continue; - } -#endif -#ifdef GL_ARB_explicit_attrib_location - if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_attrib_location", 24)) - { - ret = GLEW_ARB_explicit_attrib_location; - continue; - } -#endif -#ifdef GL_ARB_explicit_uniform_location - if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_uniform_location", 25)) - { - ret = GLEW_ARB_explicit_uniform_location; - continue; - } -#endif -#ifdef GL_ARB_fragment_coord_conventions - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_coord_conventions", 26)) - { - ret = GLEW_ARB_fragment_coord_conventions; - continue; - } -#endif -#ifdef GL_ARB_fragment_layer_viewport - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_layer_viewport", 23)) - { - ret = GLEW_ARB_fragment_layer_viewport; - continue; - } -#endif -#ifdef GL_ARB_fragment_program - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16)) - { - ret = GLEW_ARB_fragment_program; - continue; - } -#endif -#ifdef GL_ARB_fragment_program_shadow - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_shadow", 23)) - { - ret = GLEW_ARB_fragment_program_shadow; - continue; - } -#endif -#ifdef GL_ARB_fragment_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15)) - { - ret = GLEW_ARB_fragment_shader; - continue; - } -#endif -#ifdef GL_ARB_fragment_shader_interlock - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_interlock", 25)) - { - ret = GLEW_ARB_fragment_shader_interlock; - continue; - } -#endif -#ifdef GL_ARB_framebuffer_no_attachments - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_no_attachments", 26)) - { - ret = GLEW_ARB_framebuffer_no_attachments; - continue; - } -#endif -#ifdef GL_ARB_framebuffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18)) - { - ret = GLEW_ARB_framebuffer_object; - continue; - } -#endif -#ifdef GL_ARB_framebuffer_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) - { - ret = GLEW_ARB_framebuffer_sRGB; - continue; - } -#endif -#ifdef GL_ARB_geometry_shader4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) - { - ret = GLEW_ARB_geometry_shader4; - continue; - } -#endif -#ifdef GL_ARB_get_program_binary - if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_program_binary", 18)) - { - ret = GLEW_ARB_get_program_binary; - continue; - } -#endif -#ifdef GL_ARB_get_texture_sub_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_texture_sub_image", 21)) - { - ret = GLEW_ARB_get_texture_sub_image; - continue; - } -#endif -#ifdef GL_ARB_gl_spirv - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_spirv", 8)) - { - ret = GLEW_ARB_gl_spirv; - continue; - } -#endif -#ifdef GL_ARB_gpu_shader5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) - { - ret = GLEW_ARB_gpu_shader5; - continue; - } -#endif -#ifdef GL_ARB_gpu_shader_fp64 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_fp64", 15)) - { - ret = GLEW_ARB_gpu_shader_fp64; - continue; - } -#endif -#ifdef GL_ARB_gpu_shader_int64 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_int64", 16)) - { - ret = GLEW_ARB_gpu_shader_int64; - continue; - } -#endif -#ifdef GL_ARB_half_float_pixel - if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_pixel", 16)) - { - ret = GLEW_ARB_half_float_pixel; - continue; - } -#endif -#ifdef GL_ARB_half_float_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_vertex", 17)) - { - ret = GLEW_ARB_half_float_vertex; - continue; - } -#endif -#ifdef GL_ARB_imaging - if (_glewStrSame3(&pos, &len, (const GLubyte*)"imaging", 7)) - { - ret = GLEW_ARB_imaging; - continue; - } -#endif -#ifdef GL_ARB_indirect_parameters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"indirect_parameters", 19)) - { - ret = GLEW_ARB_indirect_parameters; - continue; - } -#endif -#ifdef GL_ARB_instanced_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) - { - ret = GLEW_ARB_instanced_arrays; - continue; - } -#endif -#ifdef GL_ARB_internalformat_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_query", 20)) - { - ret = GLEW_ARB_internalformat_query; - continue; - } -#endif -#ifdef GL_ARB_internalformat_query2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_query2", 21)) - { - ret = GLEW_ARB_internalformat_query2; - continue; - } -#endif -#ifdef GL_ARB_invalidate_subdata - if (_glewStrSame3(&pos, &len, (const GLubyte*)"invalidate_subdata", 18)) - { - ret = GLEW_ARB_invalidate_subdata; - continue; - } -#endif -#ifdef GL_ARB_map_buffer_alignment - if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_alignment", 20)) - { - ret = GLEW_ARB_map_buffer_alignment; - continue; - } -#endif -#ifdef GL_ARB_map_buffer_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_range", 16)) - { - ret = GLEW_ARB_map_buffer_range; - continue; - } -#endif -#ifdef GL_ARB_matrix_palette - if (_glewStrSame3(&pos, &len, (const GLubyte*)"matrix_palette", 14)) - { - ret = GLEW_ARB_matrix_palette; - continue; - } -#endif -#ifdef GL_ARB_multi_bind - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_bind", 10)) - { - ret = GLEW_ARB_multi_bind; - continue; - } -#endif -#ifdef GL_ARB_multi_draw_indirect - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) - { - ret = GLEW_ARB_multi_draw_indirect; - continue; - } -#endif -#ifdef GL_ARB_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLEW_ARB_multisample; - continue; - } -#endif -#ifdef GL_ARB_multitexture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multitexture", 12)) - { - ret = GLEW_ARB_multitexture; - continue; - } -#endif -#ifdef GL_ARB_occlusion_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15)) - { - ret = GLEW_ARB_occlusion_query; - continue; - } -#endif -#ifdef GL_ARB_occlusion_query2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query2", 16)) - { - ret = GLEW_ARB_occlusion_query2; - continue; - } -#endif -#ifdef GL_ARB_parallel_shader_compile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_shader_compile", 23)) - { - ret = GLEW_ARB_parallel_shader_compile; - continue; - } -#endif -#ifdef GL_ARB_pipeline_statistics_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pipeline_statistics_query", 25)) - { - ret = GLEW_ARB_pipeline_statistics_query; - continue; - } -#endif -#ifdef GL_ARB_pixel_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) - { - ret = GLEW_ARB_pixel_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_point_parameters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16)) - { - ret = GLEW_ARB_point_parameters; - continue; - } -#endif -#ifdef GL_ARB_point_sprite - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) - { - ret = GLEW_ARB_point_sprite; - continue; - } -#endif -#ifdef GL_ARB_polygon_offset_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset_clamp", 20)) - { - ret = GLEW_ARB_polygon_offset_clamp; - continue; - } -#endif -#ifdef GL_ARB_post_depth_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_depth_coverage", 19)) - { - ret = GLEW_ARB_post_depth_coverage; - continue; - } -#endif -#ifdef GL_ARB_program_interface_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_interface_query", 23)) - { - ret = GLEW_ARB_program_interface_query; - continue; - } -#endif -#ifdef GL_ARB_provoking_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"provoking_vertex", 16)) - { - ret = GLEW_ARB_provoking_vertex; - continue; - } -#endif -#ifdef GL_ARB_query_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_buffer_object", 19)) - { - ret = GLEW_ARB_query_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_robust_buffer_access_behavior - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robust_buffer_access_behavior", 29)) - { - ret = GLEW_ARB_robust_buffer_access_behavior; - continue; - } -#endif -#ifdef GL_ARB_robustness - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness", 10)) - { - ret = GLEW_ARB_robustness; - continue; - } -#endif -#ifdef GL_ARB_robustness_application_isolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) - { - ret = GLEW_ARB_robustness_application_isolation; - continue; - } -#endif -#ifdef GL_ARB_robustness_share_group_isolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) - { - ret = GLEW_ARB_robustness_share_group_isolation; - continue; - } -#endif -#ifdef GL_ARB_sample_locations - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_locations", 16)) - { - ret = GLEW_ARB_sample_locations; - continue; - } -#endif -#ifdef GL_ARB_sample_shading - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_shading", 14)) - { - ret = GLEW_ARB_sample_shading; - continue; - } -#endif -#ifdef GL_ARB_sampler_objects - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sampler_objects", 15)) - { - ret = GLEW_ARB_sampler_objects; - continue; - } -#endif -#ifdef GL_ARB_seamless_cube_map - if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cube_map", 17)) - { - ret = GLEW_ARB_seamless_cube_map; - continue; - } -#endif -#ifdef GL_ARB_seamless_cubemap_per_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cubemap_per_texture", 28)) - { - ret = GLEW_ARB_seamless_cubemap_per_texture; - continue; - } -#endif -#ifdef GL_ARB_separate_shader_objects - if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23)) - { - ret = GLEW_ARB_separate_shader_objects; - continue; - } -#endif -#ifdef GL_ARB_shader_atomic_counter_ops - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counter_ops", 25)) - { - ret = GLEW_ARB_shader_atomic_counter_ops; - continue; - } -#endif -#ifdef GL_ARB_shader_atomic_counters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counters", 22)) - { - ret = GLEW_ARB_shader_atomic_counters; - continue; - } -#endif -#ifdef GL_ARB_shader_ballot - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_ballot", 13)) - { - ret = GLEW_ARB_shader_ballot; - continue; - } -#endif -#ifdef GL_ARB_shader_bit_encoding - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_bit_encoding", 19)) - { - ret = GLEW_ARB_shader_bit_encoding; - continue; - } -#endif -#ifdef GL_ARB_shader_clock - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_clock", 12)) - { - ret = GLEW_ARB_shader_clock; - continue; - } -#endif -#ifdef GL_ARB_shader_draw_parameters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_draw_parameters", 22)) - { - ret = GLEW_ARB_shader_draw_parameters; - continue; - } -#endif -#ifdef GL_ARB_shader_group_vote - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_group_vote", 17)) - { - ret = GLEW_ARB_shader_group_vote; - continue; - } -#endif -#ifdef GL_ARB_shader_image_load_store - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23)) - { - ret = GLEW_ARB_shader_image_load_store; - continue; - } -#endif -#ifdef GL_ARB_shader_image_size - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_size", 17)) - { - ret = GLEW_ARB_shader_image_size; - continue; - } -#endif -#ifdef GL_ARB_shader_objects - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_objects", 14)) - { - ret = GLEW_ARB_shader_objects; - continue; - } -#endif -#ifdef GL_ARB_shader_precision - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_precision", 16)) - { - ret = GLEW_ARB_shader_precision; - continue; - } -#endif -#ifdef GL_ARB_shader_stencil_export - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_export", 21)) - { - ret = GLEW_ARB_shader_stencil_export; - continue; - } -#endif -#ifdef GL_ARB_shader_storage_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_storage_buffer_object", 28)) - { - ret = GLEW_ARB_shader_storage_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_shader_subroutine - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_subroutine", 17)) - { - ret = GLEW_ARB_shader_subroutine; - continue; - } -#endif -#ifdef GL_ARB_shader_texture_image_samples - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_image_samples", 28)) - { - ret = GLEW_ARB_shader_texture_image_samples; - continue; - } -#endif -#ifdef GL_ARB_shader_texture_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) - { - ret = GLEW_ARB_shader_texture_lod; - continue; - } -#endif -#ifdef GL_ARB_shader_viewport_layer_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_viewport_layer_array", 27)) - { - ret = GLEW_ARB_shader_viewport_layer_array; - continue; - } -#endif -#ifdef GL_ARB_shading_language_100 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_100", 20)) - { - ret = GLEW_ARB_shading_language_100; - continue; - } -#endif -#ifdef GL_ARB_shading_language_420pack - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_420pack", 24)) - { - ret = GLEW_ARB_shading_language_420pack; - continue; - } -#endif -#ifdef GL_ARB_shading_language_include - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_include", 24)) - { - ret = GLEW_ARB_shading_language_include; - continue; - } -#endif -#ifdef GL_ARB_shading_language_packing - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_packing", 24)) - { - ret = GLEW_ARB_shading_language_packing; - continue; - } -#endif -#ifdef GL_ARB_shadow - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6)) - { - ret = GLEW_ARB_shadow; - continue; - } -#endif -#ifdef GL_ARB_shadow_ambient - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14)) - { - ret = GLEW_ARB_shadow_ambient; - continue; - } -#endif -#ifdef GL_ARB_sparse_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_buffer", 13)) - { - ret = GLEW_ARB_sparse_buffer; - continue; - } -#endif -#ifdef GL_ARB_sparse_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) - { - ret = GLEW_ARB_sparse_texture; - continue; - } -#endif -#ifdef GL_ARB_sparse_texture2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture2", 15)) - { - ret = GLEW_ARB_sparse_texture2; - continue; - } -#endif -#ifdef GL_ARB_sparse_texture_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture_clamp", 20)) - { - ret = GLEW_ARB_sparse_texture_clamp; - continue; - } -#endif -#ifdef GL_ARB_spirv_extensions - if (_glewStrSame3(&pos, &len, (const GLubyte*)"spirv_extensions", 16)) - { - ret = GLEW_ARB_spirv_extensions; - continue; - } -#endif -#ifdef GL_ARB_stencil_texturing - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_texturing", 17)) - { - ret = GLEW_ARB_stencil_texturing; - continue; - } -#endif -#ifdef GL_ARB_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync", 4)) - { - ret = GLEW_ARB_sync; - continue; - } -#endif -#ifdef GL_ARB_tessellation_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_shader", 19)) - { - ret = GLEW_ARB_tessellation_shader; - continue; - } -#endif -#ifdef GL_ARB_texture_barrier - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_barrier", 15)) - { - ret = GLEW_ARB_texture_barrier; - continue; - } -#endif -#ifdef GL_ARB_texture_border_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) - { - ret = GLEW_ARB_texture_border_clamp; - continue; - } -#endif -#ifdef GL_ARB_texture_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object", 21)) - { - ret = GLEW_ARB_texture_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_texture_buffer_object_rgb32 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object_rgb32", 27)) - { - ret = GLEW_ARB_texture_buffer_object_rgb32; - continue; - } -#endif -#ifdef GL_ARB_texture_buffer_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_range", 20)) - { - ret = GLEW_ARB_texture_buffer_range; - continue; - } -#endif -#ifdef GL_ARB_texture_compression - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression", 19)) - { - ret = GLEW_ARB_texture_compression; - continue; - } -#endif -#ifdef GL_ARB_texture_compression_bptc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_bptc", 24)) - { - ret = GLEW_ARB_texture_compression_bptc; - continue; - } -#endif -#ifdef GL_ARB_texture_compression_rgtc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_rgtc", 24)) - { - ret = GLEW_ARB_texture_compression_rgtc; - continue; - } -#endif -#ifdef GL_ARB_texture_cube_map - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) - { - ret = GLEW_ARB_texture_cube_map; - continue; - } -#endif -#ifdef GL_ARB_texture_cube_map_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map_array", 22)) - { - ret = GLEW_ARB_texture_cube_map_array; - continue; - } -#endif -#ifdef GL_ARB_texture_env_add - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15)) - { - ret = GLEW_ARB_texture_env_add; - continue; - } -#endif -#ifdef GL_ARB_texture_env_combine - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19)) - { - ret = GLEW_ARB_texture_env_combine; - continue; - } -#endif -#ifdef GL_ARB_texture_env_crossbar - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_crossbar", 20)) - { - ret = GLEW_ARB_texture_env_crossbar; - continue; - } -#endif -#ifdef GL_ARB_texture_env_dot3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16)) - { - ret = GLEW_ARB_texture_env_dot3; - continue; - } -#endif -#ifdef GL_ARB_texture_filter_anisotropic - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_anisotropic", 26)) - { - ret = GLEW_ARB_texture_filter_anisotropic; - continue; - } -#endif -#ifdef GL_ARB_texture_filter_minmax - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_minmax", 21)) - { - ret = GLEW_ARB_texture_filter_minmax; - continue; - } -#endif -#ifdef GL_ARB_texture_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13)) - { - ret = GLEW_ARB_texture_float; - continue; - } -#endif -#ifdef GL_ARB_texture_gather - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_gather", 14)) - { - ret = GLEW_ARB_texture_gather; - continue; - } -#endif -#ifdef GL_ARB_texture_mirror_clamp_to_edge - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp_to_edge", 28)) - { - ret = GLEW_ARB_texture_mirror_clamp_to_edge; - continue; - } -#endif -#ifdef GL_ARB_texture_mirrored_repeat - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) - { - ret = GLEW_ARB_texture_mirrored_repeat; - continue; - } -#endif -#ifdef GL_ARB_texture_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multisample", 19)) - { - ret = GLEW_ARB_texture_multisample; - continue; - } -#endif -#ifdef GL_ARB_texture_non_power_of_two - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_non_power_of_two", 24)) - { - ret = GLEW_ARB_texture_non_power_of_two; - continue; - } -#endif -#ifdef GL_ARB_texture_query_levels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_query_levels", 20)) - { - ret = GLEW_ARB_texture_query_levels; - continue; - } -#endif -#ifdef GL_ARB_texture_query_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_query_lod", 17)) - { - ret = GLEW_ARB_texture_query_lod; - continue; - } -#endif -#ifdef GL_ARB_texture_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) - { - ret = GLEW_ARB_texture_rectangle; - continue; - } -#endif -#ifdef GL_ARB_texture_rg - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rg", 10)) - { - ret = GLEW_ARB_texture_rg; - continue; - } -#endif -#ifdef GL_ARB_texture_rgb10_a2ui - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rgb10_a2ui", 18)) - { - ret = GLEW_ARB_texture_rgb10_a2ui; - continue; - } -#endif -#ifdef GL_ARB_texture_stencil8 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stencil8", 16)) - { - ret = GLEW_ARB_texture_stencil8; - continue; - } -#endif -#ifdef GL_ARB_texture_storage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage", 15)) - { - ret = GLEW_ARB_texture_storage; - continue; - } -#endif -#ifdef GL_ARB_texture_storage_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage_multisample", 27)) - { - ret = GLEW_ARB_texture_storage_multisample; - continue; - } -#endif -#ifdef GL_ARB_texture_swizzle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_swizzle", 15)) - { - ret = GLEW_ARB_texture_swizzle; - continue; - } -#endif -#ifdef GL_ARB_texture_view - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_view", 12)) - { - ret = GLEW_ARB_texture_view; - continue; - } -#endif -#ifdef GL_ARB_timer_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) - { - ret = GLEW_ARB_timer_query; - continue; - } -#endif -#ifdef GL_ARB_transform_feedback2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback2", 19)) - { - ret = GLEW_ARB_transform_feedback2; - continue; - } -#endif -#ifdef GL_ARB_transform_feedback3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback3", 19)) - { - ret = GLEW_ARB_transform_feedback3; - continue; - } -#endif -#ifdef GL_ARB_transform_feedback_instanced - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback_instanced", 28)) - { - ret = GLEW_ARB_transform_feedback_instanced; - continue; - } -#endif -#ifdef GL_ARB_transform_feedback_overflow_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback_overflow_query", 33)) - { - ret = GLEW_ARB_transform_feedback_overflow_query; - continue; - } -#endif -#ifdef GL_ARB_transpose_matrix - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transpose_matrix", 16)) - { - ret = GLEW_ARB_transpose_matrix; - continue; - } -#endif -#ifdef GL_ARB_uniform_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"uniform_buffer_object", 21)) - { - ret = GLEW_ARB_uniform_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_vertex_array_bgra - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_bgra", 17)) - { - ret = GLEW_ARB_vertex_array_bgra; - continue; - } -#endif -#ifdef GL_ARB_vertex_array_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) - { - ret = GLEW_ARB_vertex_array_object; - continue; - } -#endif -#ifdef GL_ARB_vertex_attrib_64bit - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_64bit", 19)) - { - ret = GLEW_ARB_vertex_attrib_64bit; - continue; - } -#endif -#ifdef GL_ARB_vertex_attrib_binding - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_binding", 21)) - { - ret = GLEW_ARB_vertex_attrib_binding; - continue; - } -#endif -#ifdef GL_ARB_vertex_blend - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_blend", 12)) - { - ret = GLEW_ARB_vertex_blend; - continue; - } -#endif -#ifdef GL_ARB_vertex_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20)) - { - ret = GLEW_ARB_vertex_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_vertex_program - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14)) - { - ret = GLEW_ARB_vertex_program; - continue; - } -#endif -#ifdef GL_ARB_vertex_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13)) - { - ret = GLEW_ARB_vertex_shader; - continue; - } -#endif -#ifdef GL_ARB_vertex_type_10f_11f_11f_rev - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_10f_11f_11f_rev", 27)) - { - ret = GLEW_ARB_vertex_type_10f_11f_11f_rev; - continue; - } -#endif -#ifdef GL_ARB_vertex_type_2_10_10_10_rev - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_2_10_10_10_rev", 26)) - { - ret = GLEW_ARB_vertex_type_2_10_10_10_rev; - continue; - } -#endif -#ifdef GL_ARB_viewport_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array", 14)) - { - ret = GLEW_ARB_viewport_array; - continue; - } -#endif -#ifdef GL_ARB_window_pos - if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10)) - { - ret = GLEW_ARB_window_pos; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARM_", 4)) - { -#ifdef GL_ARM_mali_program_binary - if (_glewStrSame3(&pos, &len, (const GLubyte*)"mali_program_binary", 19)) - { - ret = GLEW_ARM_mali_program_binary; - continue; - } -#endif -#ifdef GL_ARM_mali_shader_binary - if (_glewStrSame3(&pos, &len, (const GLubyte*)"mali_shader_binary", 18)) - { - ret = GLEW_ARM_mali_shader_binary; - continue; - } -#endif -#ifdef GL_ARM_rgba8 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"rgba8", 5)) - { - ret = GLEW_ARM_rgba8; - continue; - } -#endif -#ifdef GL_ARM_shader_framebuffer_fetch - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_framebuffer_fetch", 24)) - { - ret = GLEW_ARM_shader_framebuffer_fetch; - continue; - } -#endif -#ifdef GL_ARM_shader_framebuffer_fetch_depth_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_framebuffer_fetch_depth_stencil", 38)) - { - ret = GLEW_ARM_shader_framebuffer_fetch_depth_stencil; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATIX_", 5)) - { -#ifdef GL_ATIX_point_sprites - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprites", 13)) - { - ret = GLEW_ATIX_point_sprites; - continue; - } -#endif -#ifdef GL_ATIX_texture_env_combine3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20)) - { - ret = GLEW_ATIX_texture_env_combine3; - continue; - } -#endif -#ifdef GL_ATIX_texture_env_route - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_route", 17)) - { - ret = GLEW_ATIX_texture_env_route; - continue; - } -#endif -#ifdef GL_ATIX_vertex_shader_output_point_size - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_output_point_size", 31)) - { - ret = GLEW_ATIX_vertex_shader_output_point_size; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) - { -#ifdef GL_ATI_draw_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) - { - ret = GLEW_ATI_draw_buffers; - continue; - } -#endif -#ifdef GL_ATI_element_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13)) - { - ret = GLEW_ATI_element_array; - continue; - } -#endif -#ifdef GL_ATI_envmap_bumpmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"envmap_bumpmap", 14)) - { - ret = GLEW_ATI_envmap_bumpmap; - continue; - } -#endif -#ifdef GL_ATI_fragment_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15)) - { - ret = GLEW_ATI_fragment_shader; - continue; - } -#endif -#ifdef GL_ATI_map_object_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_object_buffer", 17)) - { - ret = GLEW_ATI_map_object_buffer; - continue; - } -#endif -#ifdef GL_ATI_meminfo - if (_glewStrSame3(&pos, &len, (const GLubyte*)"meminfo", 7)) - { - ret = GLEW_ATI_meminfo; - continue; - } -#endif -#ifdef GL_ATI_pn_triangles - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pn_triangles", 12)) - { - ret = GLEW_ATI_pn_triangles; - continue; - } -#endif -#ifdef GL_ATI_separate_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_stencil", 16)) - { - ret = GLEW_ATI_separate_stencil; - continue; - } -#endif -#ifdef GL_ATI_shader_texture_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) - { - ret = GLEW_ATI_shader_texture_lod; - continue; - } -#endif -#ifdef GL_ATI_text_fragment_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"text_fragment_shader", 20)) - { - ret = GLEW_ATI_text_fragment_shader; - continue; - } -#endif -#ifdef GL_ATI_texture_compression_3dc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_3dc", 23)) - { - ret = GLEW_ATI_texture_compression_3dc; - continue; - } -#endif -#ifdef GL_ATI_texture_env_combine3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20)) - { - ret = GLEW_ATI_texture_env_combine3; - continue; - } -#endif -#ifdef GL_ATI_texture_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13)) - { - ret = GLEW_ATI_texture_float; - continue; - } -#endif -#ifdef GL_ATI_texture_mirror_once - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_once", 19)) - { - ret = GLEW_ATI_texture_mirror_once; - continue; - } -#endif -#ifdef GL_ATI_vertex_array_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) - { - ret = GLEW_ATI_vertex_array_object; - continue; - } -#endif -#ifdef GL_ATI_vertex_attrib_array_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_array_object", 26)) - { - ret = GLEW_ATI_vertex_attrib_array_object; - continue; - } -#endif -#ifdef GL_ATI_vertex_streams - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_streams", 14)) - { - ret = GLEW_ATI_vertex_streams; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"EGL_", 4)) - { -#ifdef GL_EGL_KHR_context_flush_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"KHR_context_flush_control", 25)) - { - ret = GLEW_EGL_KHR_context_flush_control; - continue; - } -#endif -#ifdef GL_EGL_NV_robustness_video_memory_purge - if (_glewStrSame3(&pos, &len, (const GLubyte*)"NV_robustness_video_memory_purge", 32)) - { - ret = GLEW_EGL_NV_robustness_video_memory_purge; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) - { -#ifdef GL_EXT_422_pixels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"422_pixels", 10)) - { - ret = GLEW_EXT_422_pixels; - continue; - } -#endif -#ifdef GL_EXT_Cg_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"Cg_shader", 9)) - { - ret = GLEW_EXT_Cg_shader; - continue; - } -#endif -#ifdef GL_EXT_EGL_image_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"EGL_image_array", 15)) - { - ret = GLEW_EXT_EGL_image_array; - continue; - } -#endif -#ifdef GL_EXT_YUV_target - if (_glewStrSame3(&pos, &len, (const GLubyte*)"YUV_target", 10)) - { - ret = GLEW_EXT_YUV_target; - continue; - } -#endif -#ifdef GL_EXT_abgr - if (_glewStrSame3(&pos, &len, (const GLubyte*)"abgr", 4)) - { - ret = GLEW_EXT_abgr; - continue; - } -#endif -#ifdef GL_EXT_base_instance - if (_glewStrSame3(&pos, &len, (const GLubyte*)"base_instance", 13)) - { - ret = GLEW_EXT_base_instance; - continue; - } -#endif -#ifdef GL_EXT_bgra - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bgra", 4)) - { - ret = GLEW_EXT_bgra; - continue; - } -#endif -#ifdef GL_EXT_bindable_uniform - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindable_uniform", 16)) - { - ret = GLEW_EXT_bindable_uniform; - continue; - } -#endif -#ifdef GL_EXT_blend_color - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_color", 11)) - { - ret = GLEW_EXT_blend_color; - continue; - } -#endif -#ifdef GL_EXT_blend_equation_separate - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_separate", 23)) - { - ret = GLEW_EXT_blend_equation_separate; - continue; - } -#endif -#ifdef GL_EXT_blend_func_extended - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_extended", 19)) - { - ret = GLEW_EXT_blend_func_extended; - continue; - } -#endif -#ifdef GL_EXT_blend_func_separate - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_separate", 19)) - { - ret = GLEW_EXT_blend_func_separate; - continue; - } -#endif -#ifdef GL_EXT_blend_logic_op - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_logic_op", 14)) - { - ret = GLEW_EXT_blend_logic_op; - continue; - } -#endif -#ifdef GL_EXT_blend_minmax - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax", 12)) - { - ret = GLEW_EXT_blend_minmax; - continue; - } -#endif -#ifdef GL_EXT_blend_subtract - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_subtract", 14)) - { - ret = GLEW_EXT_blend_subtract; - continue; - } -#endif -#ifdef GL_EXT_buffer_storage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_storage", 14)) - { - ret = GLEW_EXT_buffer_storage; - continue; - } -#endif -#ifdef GL_EXT_clear_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_texture", 13)) - { - ret = GLEW_EXT_clear_texture; - continue; - } -#endif -#ifdef GL_EXT_clip_cull_distance - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_cull_distance", 18)) - { - ret = GLEW_EXT_clip_cull_distance; - continue; - } -#endif -#ifdef GL_EXT_clip_volume_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_volume_hint", 16)) - { - ret = GLEW_EXT_clip_volume_hint; - continue; - } -#endif -#ifdef GL_EXT_cmyka - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cmyka", 5)) - { - ret = GLEW_EXT_cmyka; - continue; - } -#endif -#ifdef GL_EXT_color_buffer_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_float", 18)) - { - ret = GLEW_EXT_color_buffer_float; - continue; - } -#endif -#ifdef GL_EXT_color_buffer_half_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_half_float", 23)) - { - ret = GLEW_EXT_color_buffer_half_float; - continue; - } -#endif -#ifdef GL_EXT_color_subtable - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_subtable", 14)) - { - ret = GLEW_EXT_color_subtable; - continue; - } -#endif -#ifdef GL_EXT_compiled_vertex_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compiled_vertex_array", 21)) - { - ret = GLEW_EXT_compiled_vertex_array; - continue; - } -#endif -#ifdef GL_EXT_compressed_ETC1_RGB8_sub_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_ETC1_RGB8_sub_texture", 32)) - { - ret = GLEW_EXT_compressed_ETC1_RGB8_sub_texture; - continue; - } -#endif -#ifdef GL_EXT_conservative_depth - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) - { - ret = GLEW_EXT_conservative_depth; - continue; - } -#endif -#ifdef GL_EXT_convolution - if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution", 11)) - { - ret = GLEW_EXT_convolution; - continue; - } -#endif -#ifdef GL_EXT_coordinate_frame - if (_glewStrSame3(&pos, &len, (const GLubyte*)"coordinate_frame", 16)) - { - ret = GLEW_EXT_coordinate_frame; - continue; - } -#endif -#ifdef GL_EXT_copy_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) - { - ret = GLEW_EXT_copy_image; - continue; - } -#endif -#ifdef GL_EXT_copy_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_texture", 12)) - { - ret = GLEW_EXT_copy_texture; - continue; - } -#endif -#ifdef GL_EXT_cull_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11)) - { - ret = GLEW_EXT_cull_vertex; - continue; - } -#endif -#ifdef GL_EXT_debug_label - if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_label", 11)) - { - ret = GLEW_EXT_debug_label; - continue; - } -#endif -#ifdef GL_EXT_debug_marker - if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_marker", 12)) - { - ret = GLEW_EXT_debug_marker; - continue; - } -#endif -#ifdef GL_EXT_depth_bounds_test - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_bounds_test", 17)) - { - ret = GLEW_EXT_depth_bounds_test; - continue; - } -#endif -#ifdef GL_EXT_direct_state_access - if (_glewStrSame3(&pos, &len, (const GLubyte*)"direct_state_access", 19)) - { - ret = GLEW_EXT_direct_state_access; - continue; - } -#endif -#ifdef GL_EXT_discard_framebuffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"discard_framebuffer", 19)) - { - ret = GLEW_EXT_discard_framebuffer; - continue; - } -#endif -#ifdef GL_EXT_draw_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) - { - ret = GLEW_EXT_draw_buffers; - continue; - } -#endif -#ifdef GL_EXT_draw_buffers2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers2", 13)) - { - ret = GLEW_EXT_draw_buffers2; - continue; - } -#endif -#ifdef GL_EXT_draw_buffers_indexed - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_indexed", 20)) - { - ret = GLEW_EXT_draw_buffers_indexed; - continue; - } -#endif -#ifdef GL_EXT_draw_elements_base_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_elements_base_vertex", 25)) - { - ret = GLEW_EXT_draw_elements_base_vertex; - continue; - } -#endif -#ifdef GL_EXT_draw_instanced - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) - { - ret = GLEW_EXT_draw_instanced; - continue; - } -#endif -#ifdef GL_EXT_draw_range_elements - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_range_elements", 19)) - { - ret = GLEW_EXT_draw_range_elements; - continue; - } -#endif -#ifdef GL_EXT_external_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"external_buffer", 15)) - { - ret = GLEW_EXT_external_buffer; - continue; - } -#endif -#ifdef GL_EXT_float_blend - if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_blend", 11)) - { - ret = GLEW_EXT_float_blend; - continue; - } -#endif -#ifdef GL_EXT_fog_coord - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_coord", 9)) - { - ret = GLEW_EXT_fog_coord; - continue; - } -#endif -#ifdef GL_EXT_frag_depth - if (_glewStrSame3(&pos, &len, (const GLubyte*)"frag_depth", 10)) - { - ret = GLEW_EXT_frag_depth; - continue; - } -#endif -#ifdef GL_EXT_fragment_lighting - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_lighting", 17)) - { - ret = GLEW_EXT_fragment_lighting; - continue; - } -#endif -#ifdef GL_EXT_framebuffer_blit - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) - { - ret = GLEW_EXT_framebuffer_blit; - continue; - } -#endif -#ifdef GL_EXT_framebuffer_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) - { - ret = GLEW_EXT_framebuffer_multisample; - continue; - } -#endif -#ifdef GL_EXT_framebuffer_multisample_blit_scaled - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample_blit_scaled", 35)) - { - ret = GLEW_EXT_framebuffer_multisample_blit_scaled; - continue; - } -#endif -#ifdef GL_EXT_framebuffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18)) - { - ret = GLEW_EXT_framebuffer_object; - continue; - } -#endif -#ifdef GL_EXT_framebuffer_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) - { - ret = GLEW_EXT_framebuffer_sRGB; - continue; - } -#endif -#ifdef GL_EXT_geometry_point_size - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_point_size", 19)) - { - ret = GLEW_EXT_geometry_point_size; - continue; - } -#endif -#ifdef GL_EXT_geometry_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader", 15)) - { - ret = GLEW_EXT_geometry_shader; - continue; - } -#endif -#ifdef GL_EXT_geometry_shader4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) - { - ret = GLEW_EXT_geometry_shader4; - continue; - } -#endif -#ifdef GL_EXT_gpu_program_parameters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_parameters", 22)) - { - ret = GLEW_EXT_gpu_program_parameters; - continue; - } -#endif -#ifdef GL_EXT_gpu_shader4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader4", 11)) - { - ret = GLEW_EXT_gpu_shader4; - continue; - } -#endif -#ifdef GL_EXT_gpu_shader5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) - { - ret = GLEW_EXT_gpu_shader5; - continue; - } -#endif -#ifdef GL_EXT_histogram - if (_glewStrSame3(&pos, &len, (const GLubyte*)"histogram", 9)) - { - ret = GLEW_EXT_histogram; - continue; - } -#endif -#ifdef GL_EXT_index_array_formats - if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_array_formats", 19)) - { - ret = GLEW_EXT_index_array_formats; - continue; - } -#endif -#ifdef GL_EXT_index_func - if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_func", 10)) - { - ret = GLEW_EXT_index_func; - continue; - } -#endif -#ifdef GL_EXT_index_material - if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_material", 14)) - { - ret = GLEW_EXT_index_material; - continue; - } -#endif -#ifdef GL_EXT_index_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_texture", 13)) - { - ret = GLEW_EXT_index_texture; - continue; - } -#endif -#ifdef GL_EXT_instanced_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) - { - ret = GLEW_EXT_instanced_arrays; - continue; - } -#endif -#ifdef GL_EXT_light_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_texture", 13)) - { - ret = GLEW_EXT_light_texture; - continue; - } -#endif -#ifdef GL_EXT_map_buffer_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_range", 16)) - { - ret = GLEW_EXT_map_buffer_range; - continue; - } -#endif -#ifdef GL_EXT_memory_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"memory_object", 13)) - { - ret = GLEW_EXT_memory_object; - continue; - } -#endif -#ifdef GL_EXT_memory_object_fd - if (_glewStrSame3(&pos, &len, (const GLubyte*)"memory_object_fd", 16)) - { - ret = GLEW_EXT_memory_object_fd; - continue; - } -#endif -#ifdef GL_EXT_memory_object_win32 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"memory_object_win32", 19)) - { - ret = GLEW_EXT_memory_object_win32; - continue; - } -#endif -#ifdef GL_EXT_misc_attribute - if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_attribute", 14)) - { - ret = GLEW_EXT_misc_attribute; - continue; - } -#endif -#ifdef GL_EXT_multi_draw_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_arrays", 17)) - { - ret = GLEW_EXT_multi_draw_arrays; - continue; - } -#endif -#ifdef GL_EXT_multi_draw_indirect - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) - { - ret = GLEW_EXT_multi_draw_indirect; - continue; - } -#endif -#ifdef GL_EXT_multiple_textures - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiple_textures", 17)) - { - ret = GLEW_EXT_multiple_textures; - continue; - } -#endif -#ifdef GL_EXT_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLEW_EXT_multisample; - continue; - } -#endif -#ifdef GL_EXT_multisample_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_compatibility", 25)) - { - ret = GLEW_EXT_multisample_compatibility; - continue; - } -#endif -#ifdef GL_EXT_multisampled_render_to_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisampled_render_to_texture", 30)) - { - ret = GLEW_EXT_multisampled_render_to_texture; - continue; - } -#endif -#ifdef GL_EXT_multisampled_render_to_texture2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisampled_render_to_texture2", 31)) - { - ret = GLEW_EXT_multisampled_render_to_texture2; - continue; - } -#endif -#ifdef GL_EXT_multiview_draw_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview_draw_buffers", 22)) - { - ret = GLEW_EXT_multiview_draw_buffers; - continue; - } -#endif -#ifdef GL_EXT_packed_depth_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) - { - ret = GLEW_EXT_packed_depth_stencil; - continue; - } -#endif -#ifdef GL_EXT_packed_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_float", 12)) - { - ret = GLEW_EXT_packed_float; - continue; - } -#endif -#ifdef GL_EXT_packed_pixels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_pixels", 13)) - { - ret = GLEW_EXT_packed_pixels; - continue; - } -#endif -#ifdef GL_EXT_paletted_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"paletted_texture", 16)) - { - ret = GLEW_EXT_paletted_texture; - continue; - } -#endif -#ifdef GL_EXT_pixel_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) - { - ret = GLEW_EXT_pixel_buffer_object; - continue; - } -#endif -#ifdef GL_EXT_pixel_transform - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform", 15)) - { - ret = GLEW_EXT_pixel_transform; - continue; - } -#endif -#ifdef GL_EXT_pixel_transform_color_table - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform_color_table", 27)) - { - ret = GLEW_EXT_pixel_transform_color_table; - continue; - } -#endif -#ifdef GL_EXT_point_parameters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16)) - { - ret = GLEW_EXT_point_parameters; - continue; - } -#endif -#ifdef GL_EXT_polygon_offset - if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset", 14)) - { - ret = GLEW_EXT_polygon_offset; - continue; - } -#endif -#ifdef GL_EXT_polygon_offset_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset_clamp", 20)) - { - ret = GLEW_EXT_polygon_offset_clamp; - continue; - } -#endif -#ifdef GL_EXT_post_depth_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_depth_coverage", 19)) - { - ret = GLEW_EXT_post_depth_coverage; - continue; - } -#endif -#ifdef GL_EXT_provoking_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"provoking_vertex", 16)) - { - ret = GLEW_EXT_provoking_vertex; - continue; - } -#endif -#ifdef GL_EXT_pvrtc_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pvrtc_sRGB", 10)) - { - ret = GLEW_EXT_pvrtc_sRGB; - continue; - } -#endif -#ifdef GL_EXT_raster_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"raster_multisample", 18)) - { - ret = GLEW_EXT_raster_multisample; - continue; - } -#endif -#ifdef GL_EXT_read_format_bgra - if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_format_bgra", 16)) - { - ret = GLEW_EXT_read_format_bgra; - continue; - } -#endif -#ifdef GL_EXT_render_snorm - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_snorm", 12)) - { - ret = GLEW_EXT_render_snorm; - continue; - } -#endif -#ifdef GL_EXT_rescale_normal - if (_glewStrSame3(&pos, &len, (const GLubyte*)"rescale_normal", 14)) - { - ret = GLEW_EXT_rescale_normal; - continue; - } -#endif -#ifdef GL_EXT_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sRGB", 4)) - { - ret = GLEW_EXT_sRGB; - continue; - } -#endif -#ifdef GL_EXT_sRGB_write_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sRGB_write_control", 18)) - { - ret = GLEW_EXT_sRGB_write_control; - continue; - } -#endif -#ifdef GL_EXT_scene_marker - if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12)) - { - ret = GLEW_EXT_scene_marker; - continue; - } -#endif -#ifdef GL_EXT_secondary_color - if (_glewStrSame3(&pos, &len, (const GLubyte*)"secondary_color", 15)) - { - ret = GLEW_EXT_secondary_color; - continue; - } -#endif -#ifdef GL_EXT_semaphore - if (_glewStrSame3(&pos, &len, (const GLubyte*)"semaphore", 9)) - { - ret = GLEW_EXT_semaphore; - continue; - } -#endif -#ifdef GL_EXT_semaphore_fd - if (_glewStrSame3(&pos, &len, (const GLubyte*)"semaphore_fd", 12)) - { - ret = GLEW_EXT_semaphore_fd; - continue; - } -#endif -#ifdef GL_EXT_semaphore_win32 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"semaphore_win32", 15)) - { - ret = GLEW_EXT_semaphore_win32; - continue; - } -#endif -#ifdef GL_EXT_separate_shader_objects - if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23)) - { - ret = GLEW_EXT_separate_shader_objects; - continue; - } -#endif -#ifdef GL_EXT_separate_specular_color - if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_specular_color", 23)) - { - ret = GLEW_EXT_separate_specular_color; - continue; - } -#endif -#ifdef GL_EXT_shader_framebuffer_fetch - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_framebuffer_fetch", 24)) - { - ret = GLEW_EXT_shader_framebuffer_fetch; - continue; - } -#endif -#ifdef GL_EXT_shader_group_vote - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_group_vote", 17)) - { - ret = GLEW_EXT_shader_group_vote; - continue; - } -#endif -#ifdef GL_EXT_shader_image_load_formatted - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_formatted", 27)) - { - ret = GLEW_EXT_shader_image_load_formatted; - continue; - } -#endif -#ifdef GL_EXT_shader_image_load_store - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23)) - { - ret = GLEW_EXT_shader_image_load_store; - continue; - } -#endif -#ifdef GL_EXT_shader_implicit_conversions - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_implicit_conversions", 27)) - { - ret = GLEW_EXT_shader_implicit_conversions; - continue; - } -#endif -#ifdef GL_EXT_shader_integer_mix - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_integer_mix", 18)) - { - ret = GLEW_EXT_shader_integer_mix; - continue; - } -#endif -#ifdef GL_EXT_shader_io_blocks - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_io_blocks", 16)) - { - ret = GLEW_EXT_shader_io_blocks; - continue; - } -#endif -#ifdef GL_EXT_shader_non_constant_global_initializers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_non_constant_global_initializers", 39)) - { - ret = GLEW_EXT_shader_non_constant_global_initializers; - continue; - } -#endif -#ifdef GL_EXT_shader_pixel_local_storage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_pixel_local_storage", 26)) - { - ret = GLEW_EXT_shader_pixel_local_storage; - continue; - } -#endif -#ifdef GL_EXT_shader_pixel_local_storage2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_pixel_local_storage2", 27)) - { - ret = GLEW_EXT_shader_pixel_local_storage2; - continue; - } -#endif -#ifdef GL_EXT_shader_texture_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) - { - ret = GLEW_EXT_shader_texture_lod; - continue; - } -#endif -#ifdef GL_EXT_shadow_funcs - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_funcs", 12)) - { - ret = GLEW_EXT_shadow_funcs; - continue; - } -#endif -#ifdef GL_EXT_shadow_samplers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_samplers", 15)) - { - ret = GLEW_EXT_shadow_samplers; - continue; - } -#endif -#ifdef GL_EXT_shared_texture_palette - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_texture_palette", 22)) - { - ret = GLEW_EXT_shared_texture_palette; - continue; - } -#endif -#ifdef GL_EXT_sparse_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) - { - ret = GLEW_EXT_sparse_texture; - continue; - } -#endif -#ifdef GL_EXT_sparse_texture2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture2", 15)) - { - ret = GLEW_EXT_sparse_texture2; - continue; - } -#endif -#ifdef GL_EXT_stencil_clear_tag - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_clear_tag", 17)) - { - ret = GLEW_EXT_stencil_clear_tag; - continue; - } -#endif -#ifdef GL_EXT_stencil_two_side - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_two_side", 16)) - { - ret = GLEW_EXT_stencil_two_side; - continue; - } -#endif -#ifdef GL_EXT_stencil_wrap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_wrap", 12)) - { - ret = GLEW_EXT_stencil_wrap; - continue; - } -#endif -#ifdef GL_EXT_subtexture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"subtexture", 10)) - { - ret = GLEW_EXT_subtexture; - continue; - } -#endif -#ifdef GL_EXT_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture", 7)) - { - ret = GLEW_EXT_texture; - continue; - } -#endif -#ifdef GL_EXT_texture3D - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture3D", 9)) - { - ret = GLEW_EXT_texture3D; - continue; - } -#endif -#ifdef GL_EXT_texture_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_array", 13)) - { - ret = GLEW_EXT_texture_array; - continue; - } -#endif -#ifdef GL_EXT_texture_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object", 21)) - { - ret = GLEW_EXT_texture_buffer_object; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_astc_decode_mode - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_decode_mode", 36)) - { - ret = GLEW_EXT_texture_compression_astc_decode_mode; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_astc_decode_mode_rgb9e5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_decode_mode_rgb9e5", 43)) - { - ret = GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_bptc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_bptc", 24)) - { - ret = GLEW_EXT_texture_compression_bptc; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_dxt1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24)) - { - ret = GLEW_EXT_texture_compression_dxt1; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_latc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_latc", 24)) - { - ret = GLEW_EXT_texture_compression_latc; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_rgtc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_rgtc", 24)) - { - ret = GLEW_EXT_texture_compression_rgtc; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_s3tc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_s3tc", 24)) - { - ret = GLEW_EXT_texture_compression_s3tc; - continue; - } -#endif -#ifdef GL_EXT_texture_cube_map - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) - { - ret = GLEW_EXT_texture_cube_map; - continue; - } -#endif -#ifdef GL_EXT_texture_cube_map_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map_array", 22)) - { - ret = GLEW_EXT_texture_cube_map_array; - continue; - } -#endif -#ifdef GL_EXT_texture_edge_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18)) - { - ret = GLEW_EXT_texture_edge_clamp; - continue; - } -#endif -#ifdef GL_EXT_texture_env - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env", 11)) - { - ret = GLEW_EXT_texture_env; - continue; - } -#endif -#ifdef GL_EXT_texture_env_add - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15)) - { - ret = GLEW_EXT_texture_env_add; - continue; - } -#endif -#ifdef GL_EXT_texture_env_combine - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19)) - { - ret = GLEW_EXT_texture_env_combine; - continue; - } -#endif -#ifdef GL_EXT_texture_env_dot3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16)) - { - ret = GLEW_EXT_texture_env_dot3; - continue; - } -#endif -#ifdef GL_EXT_texture_filter_anisotropic - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_anisotropic", 26)) - { - ret = GLEW_EXT_texture_filter_anisotropic; - continue; - } -#endif -#ifdef GL_EXT_texture_filter_minmax - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_minmax", 21)) - { - ret = GLEW_EXT_texture_filter_minmax; - continue; - } -#endif -#ifdef GL_EXT_texture_format_BGRA8888 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_format_BGRA8888", 23)) - { - ret = GLEW_EXT_texture_format_BGRA8888; - continue; - } -#endif -#ifdef GL_EXT_texture_integer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_integer", 15)) - { - ret = GLEW_EXT_texture_integer; - continue; - } -#endif -#ifdef GL_EXT_texture_lod_bias - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16)) - { - ret = GLEW_EXT_texture_lod_bias; - continue; - } -#endif -#ifdef GL_EXT_texture_mirror_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp", 20)) - { - ret = GLEW_EXT_texture_mirror_clamp; - continue; - } -#endif -#ifdef GL_EXT_texture_norm16 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_norm16", 14)) - { - ret = GLEW_EXT_texture_norm16; - continue; - } -#endif -#ifdef GL_EXT_texture_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_object", 14)) - { - ret = GLEW_EXT_texture_object; - continue; - } -#endif -#ifdef GL_EXT_texture_perturb_normal - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_perturb_normal", 22)) - { - ret = GLEW_EXT_texture_perturb_normal; - continue; - } -#endif -#ifdef GL_EXT_texture_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) - { - ret = GLEW_EXT_texture_rectangle; - continue; - } -#endif -#ifdef GL_EXT_texture_rg - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rg", 10)) - { - ret = GLEW_EXT_texture_rg; - continue; - } -#endif -#ifdef GL_EXT_texture_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB", 12)) - { - ret = GLEW_EXT_texture_sRGB; - continue; - } -#endif -#ifdef GL_EXT_texture_sRGB_R8 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB_R8", 15)) - { - ret = GLEW_EXT_texture_sRGB_R8; - continue; - } -#endif -#ifdef GL_EXT_texture_sRGB_RG8 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB_RG8", 16)) - { - ret = GLEW_EXT_texture_sRGB_RG8; - continue; - } -#endif -#ifdef GL_EXT_texture_sRGB_decode - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB_decode", 19)) - { - ret = GLEW_EXT_texture_sRGB_decode; - continue; - } -#endif -#ifdef GL_EXT_texture_shared_exponent - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shared_exponent", 23)) - { - ret = GLEW_EXT_texture_shared_exponent; - continue; - } -#endif -#ifdef GL_EXT_texture_snorm - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_snorm", 13)) - { - ret = GLEW_EXT_texture_snorm; - continue; - } -#endif -#ifdef GL_EXT_texture_storage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage", 15)) - { - ret = GLEW_EXT_texture_storage; - continue; - } -#endif -#ifdef GL_EXT_texture_swizzle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_swizzle", 15)) - { - ret = GLEW_EXT_texture_swizzle; - continue; - } -#endif -#ifdef GL_EXT_texture_type_2_10_10_10_REV - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_type_2_10_10_10_REV", 27)) - { - ret = GLEW_EXT_texture_type_2_10_10_10_REV; - continue; - } -#endif -#ifdef GL_EXT_texture_view - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_view", 12)) - { - ret = GLEW_EXT_texture_view; - continue; - } -#endif -#ifdef GL_EXT_timer_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) - { - ret = GLEW_EXT_timer_query; - continue; - } -#endif -#ifdef GL_EXT_transform_feedback - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback", 18)) - { - ret = GLEW_EXT_transform_feedback; - continue; - } -#endif -#ifdef GL_EXT_unpack_subimage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"unpack_subimage", 15)) - { - ret = GLEW_EXT_unpack_subimage; - continue; - } -#endif -#ifdef GL_EXT_vertex_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array", 12)) - { - ret = GLEW_EXT_vertex_array; - continue; - } -#endif -#ifdef GL_EXT_vertex_array_bgra - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_bgra", 17)) - { - ret = GLEW_EXT_vertex_array_bgra; - continue; - } -#endif -#ifdef GL_EXT_vertex_array_setXXX - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_setXXX", 19)) - { - ret = GLEW_EXT_vertex_array_setXXX; - continue; - } -#endif -#ifdef GL_EXT_vertex_attrib_64bit - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_64bit", 19)) - { - ret = GLEW_EXT_vertex_attrib_64bit; - continue; - } -#endif -#ifdef GL_EXT_vertex_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13)) - { - ret = GLEW_EXT_vertex_shader; - continue; - } -#endif -#ifdef GL_EXT_vertex_weighting - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_weighting", 16)) - { - ret = GLEW_EXT_vertex_weighting; - continue; - } -#endif -#ifdef GL_EXT_win32_keyed_mutex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"win32_keyed_mutex", 17)) - { - ret = GLEW_EXT_win32_keyed_mutex; - continue; - } -#endif -#ifdef GL_EXT_window_rectangles - if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_rectangles", 17)) - { - ret = GLEW_EXT_window_rectangles; - continue; - } -#endif -#ifdef GL_EXT_x11_sync_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"x11_sync_object", 15)) - { - ret = GLEW_EXT_x11_sync_object; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"GREMEDY_", 8)) - { -#ifdef GL_GREMEDY_frame_terminator - if (_glewStrSame3(&pos, &len, (const GLubyte*)"frame_terminator", 16)) - { - ret = GLEW_GREMEDY_frame_terminator; - continue; - } -#endif -#ifdef GL_GREMEDY_string_marker - if (_glewStrSame3(&pos, &len, (const GLubyte*)"string_marker", 13)) - { - ret = GLEW_GREMEDY_string_marker; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"HP_", 3)) - { -#ifdef GL_HP_convolution_border_modes - if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24)) - { - ret = GLEW_HP_convolution_border_modes; - continue; - } -#endif -#ifdef GL_HP_image_transform - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_transform", 15)) - { - ret = GLEW_HP_image_transform; - continue; - } -#endif -#ifdef GL_HP_occlusion_test - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_test", 14)) - { - ret = GLEW_HP_occlusion_test; - continue; - } -#endif -#ifdef GL_HP_texture_lighting - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lighting", 16)) - { - ret = GLEW_HP_texture_lighting; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"IBM_", 4)) - { -#ifdef GL_IBM_cull_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11)) - { - ret = GLEW_IBM_cull_vertex; - continue; - } -#endif -#ifdef GL_IBM_multimode_draw_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multimode_draw_arrays", 21)) - { - ret = GLEW_IBM_multimode_draw_arrays; - continue; - } -#endif -#ifdef GL_IBM_rasterpos_clip - if (_glewStrSame3(&pos, &len, (const GLubyte*)"rasterpos_clip", 14)) - { - ret = GLEW_IBM_rasterpos_clip; - continue; - } -#endif -#ifdef GL_IBM_static_data - if (_glewStrSame3(&pos, &len, (const GLubyte*)"static_data", 11)) - { - ret = GLEW_IBM_static_data; - continue; - } -#endif -#ifdef GL_IBM_texture_mirrored_repeat - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) - { - ret = GLEW_IBM_texture_mirrored_repeat; - continue; - } -#endif -#ifdef GL_IBM_vertex_array_lists - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_lists", 18)) - { - ret = GLEW_IBM_vertex_array_lists; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"INGR_", 5)) - { -#ifdef GL_INGR_color_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_clamp", 11)) - { - ret = GLEW_INGR_color_clamp; - continue; - } -#endif -#ifdef GL_INGR_interlace_read - if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace_read", 14)) - { - ret = GLEW_INGR_interlace_read; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6)) - { -#ifdef GL_INTEL_conservative_rasterization - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_rasterization", 26)) - { - ret = GLEW_INTEL_conservative_rasterization; - continue; - } -#endif -#ifdef GL_INTEL_fragment_shader_ordering - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_ordering", 24)) - { - ret = GLEW_INTEL_fragment_shader_ordering; - continue; - } -#endif -#ifdef GL_INTEL_framebuffer_CMAA - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_CMAA", 16)) - { - ret = GLEW_INTEL_framebuffer_CMAA; - continue; - } -#endif -#ifdef GL_INTEL_map_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_texture", 11)) - { - ret = GLEW_INTEL_map_texture; - continue; - } -#endif -#ifdef GL_INTEL_parallel_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_arrays", 15)) - { - ret = GLEW_INTEL_parallel_arrays; - continue; - } -#endif -#ifdef GL_INTEL_performance_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"performance_query", 17)) - { - ret = GLEW_INTEL_performance_query; - continue; - } -#endif -#ifdef GL_INTEL_texture_scissor - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scissor", 15)) - { - ret = GLEW_INTEL_texture_scissor; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"KHR_", 4)) - { -#ifdef GL_KHR_blend_equation_advanced - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced", 23)) - { - ret = GLEW_KHR_blend_equation_advanced; - continue; - } -#endif -#ifdef GL_KHR_blend_equation_advanced_coherent - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_coherent", 32)) - { - ret = GLEW_KHR_blend_equation_advanced_coherent; - continue; - } -#endif -#ifdef GL_KHR_context_flush_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) - { - ret = GLEW_KHR_context_flush_control; - continue; - } -#endif -#ifdef GL_KHR_debug - if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug", 5)) - { - ret = GLEW_KHR_debug; - continue; - } -#endif -#ifdef GL_KHR_no_error - if (_glewStrSame3(&pos, &len, (const GLubyte*)"no_error", 8)) - { - ret = GLEW_KHR_no_error; - continue; - } -#endif -#ifdef GL_KHR_parallel_shader_compile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_shader_compile", 23)) - { - ret = GLEW_KHR_parallel_shader_compile; - continue; - } -#endif -#ifdef GL_KHR_robust_buffer_access_behavior - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robust_buffer_access_behavior", 29)) - { - ret = GLEW_KHR_robust_buffer_access_behavior; - continue; - } -#endif -#ifdef GL_KHR_robustness - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness", 10)) - { - ret = GLEW_KHR_robustness; - continue; - } -#endif -#ifdef GL_KHR_texture_compression_astc_hdr - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_hdr", 28)) - { - ret = GLEW_KHR_texture_compression_astc_hdr; - continue; - } -#endif -#ifdef GL_KHR_texture_compression_astc_ldr - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_ldr", 28)) - { - ret = GLEW_KHR_texture_compression_astc_ldr; - continue; - } -#endif -#ifdef GL_KHR_texture_compression_astc_sliced_3d - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_sliced_3d", 34)) - { - ret = GLEW_KHR_texture_compression_astc_sliced_3d; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"KTX_", 4)) - { -#ifdef GL_KTX_buffer_region - if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13)) - { - ret = GLEW_KTX_buffer_region; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESAX_", 6)) - { -#ifdef GL_MESAX_texture_stack - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stack", 13)) - { - ret = GLEW_MESAX_texture_stack; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) - { -#ifdef GL_MESA_pack_invert - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_invert", 11)) - { - ret = GLEW_MESA_pack_invert; - continue; - } -#endif -#ifdef GL_MESA_resize_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"resize_buffers", 14)) - { - ret = GLEW_MESA_resize_buffers; - continue; - } -#endif -#ifdef GL_MESA_shader_integer_functions - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_integer_functions", 24)) - { - ret = GLEW_MESA_shader_integer_functions; - continue; - } -#endif -#ifdef GL_MESA_window_pos - if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10)) - { - ret = GLEW_MESA_window_pos; - continue; - } -#endif -#ifdef GL_MESA_ycbcr_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_texture", 13)) - { - ret = GLEW_MESA_ycbcr_texture; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"NVX_", 4)) - { -#ifdef GL_NVX_blend_equation_advanced_multi_draw_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_multi_draw_buffers", 42)) - { - ret = GLEW_NVX_blend_equation_advanced_multi_draw_buffers; - continue; - } -#endif -#ifdef GL_NVX_conditional_render - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18)) - { - ret = GLEW_NVX_conditional_render; - continue; - } -#endif -#ifdef GL_NVX_gpu_memory_info - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_memory_info", 15)) - { - ret = GLEW_NVX_gpu_memory_info; - continue; - } -#endif -#ifdef GL_NVX_linked_gpu_multicast - if (_glewStrSame3(&pos, &len, (const GLubyte*)"linked_gpu_multicast", 20)) - { - ret = GLEW_NVX_linked_gpu_multicast; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) - { -#ifdef GL_NV_3dvision_settings - if (_glewStrSame3(&pos, &len, (const GLubyte*)"3dvision_settings", 17)) - { - ret = GLEW_NV_3dvision_settings; - continue; - } -#endif -#ifdef GL_NV_EGL_stream_consumer_external - if (_glewStrSame3(&pos, &len, (const GLubyte*)"EGL_stream_consumer_external", 28)) - { - ret = GLEW_NV_EGL_stream_consumer_external; - continue; - } -#endif -#ifdef GL_NV_alpha_to_coverage_dither_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"alpha_to_coverage_dither_control", 32)) - { - ret = GLEW_NV_alpha_to_coverage_dither_control; - continue; - } -#endif -#ifdef GL_NV_bgr - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bgr", 3)) - { - ret = GLEW_NV_bgr; - continue; - } -#endif -#ifdef GL_NV_bindless_multi_draw_indirect - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_multi_draw_indirect", 28)) - { - ret = GLEW_NV_bindless_multi_draw_indirect; - continue; - } -#endif -#ifdef GL_NV_bindless_multi_draw_indirect_count - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_multi_draw_indirect_count", 34)) - { - ret = GLEW_NV_bindless_multi_draw_indirect_count; - continue; - } -#endif -#ifdef GL_NV_bindless_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16)) - { - ret = GLEW_NV_bindless_texture; - continue; - } -#endif -#ifdef GL_NV_blend_equation_advanced - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced", 23)) - { - ret = GLEW_NV_blend_equation_advanced; - continue; - } -#endif -#ifdef GL_NV_blend_equation_advanced_coherent - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_coherent", 32)) - { - ret = GLEW_NV_blend_equation_advanced_coherent; - continue; - } -#endif -#ifdef GL_NV_blend_minmax_factor - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax_factor", 19)) - { - ret = GLEW_NV_blend_minmax_factor; - continue; - } -#endif -#ifdef GL_NV_blend_square - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_square", 12)) - { - ret = GLEW_NV_blend_square; - continue; - } -#endif -#ifdef GL_NV_clip_space_w_scaling - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_space_w_scaling", 20)) - { - ret = GLEW_NV_clip_space_w_scaling; - continue; - } -#endif -#ifdef GL_NV_command_list - if (_glewStrSame3(&pos, &len, (const GLubyte*)"command_list", 12)) - { - ret = GLEW_NV_command_list; - continue; - } -#endif -#ifdef GL_NV_compute_program5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_program5", 16)) - { - ret = GLEW_NV_compute_program5; - continue; - } -#endif -#ifdef GL_NV_conditional_render - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18)) - { - ret = GLEW_NV_conditional_render; - continue; - } -#endif -#ifdef GL_NV_conservative_raster - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster", 19)) - { - ret = GLEW_NV_conservative_raster; - continue; - } -#endif -#ifdef GL_NV_conservative_raster_dilate - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster_dilate", 26)) - { - ret = GLEW_NV_conservative_raster_dilate; - continue; - } -#endif -#ifdef GL_NV_conservative_raster_pre_snap_triangles - if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster_pre_snap_triangles", 38)) - { - ret = GLEW_NV_conservative_raster_pre_snap_triangles; - continue; - } -#endif -#ifdef GL_NV_copy_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11)) - { - ret = GLEW_NV_copy_buffer; - continue; - } -#endif -#ifdef GL_NV_copy_depth_to_color - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_depth_to_color", 19)) - { - ret = GLEW_NV_copy_depth_to_color; - continue; - } -#endif -#ifdef GL_NV_copy_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) - { - ret = GLEW_NV_copy_image; - continue; - } -#endif -#ifdef GL_NV_deep_texture3D - if (_glewStrSame3(&pos, &len, (const GLubyte*)"deep_texture3D", 14)) - { - ret = GLEW_NV_deep_texture3D; - continue; - } -#endif -#ifdef GL_NV_depth_buffer_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18)) - { - ret = GLEW_NV_depth_buffer_float; - continue; - } -#endif -#ifdef GL_NV_depth_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11)) - { - ret = GLEW_NV_depth_clamp; - continue; - } -#endif -#ifdef GL_NV_depth_range_unclamped - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_range_unclamped", 21)) - { - ret = GLEW_NV_depth_range_unclamped; - continue; - } -#endif -#ifdef GL_NV_draw_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) - { - ret = GLEW_NV_draw_buffers; - continue; - } -#endif -#ifdef GL_NV_draw_instanced - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) - { - ret = GLEW_NV_draw_instanced; - continue; - } -#endif -#ifdef GL_NV_draw_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_texture", 12)) - { - ret = GLEW_NV_draw_texture; - continue; - } -#endif -#ifdef GL_NV_draw_vulkan_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_vulkan_image", 17)) - { - ret = GLEW_NV_draw_vulkan_image; - continue; - } -#endif -#ifdef GL_NV_evaluators - if (_glewStrSame3(&pos, &len, (const GLubyte*)"evaluators", 10)) - { - ret = GLEW_NV_evaluators; - continue; - } -#endif -#ifdef GL_NV_explicit_attrib_location - if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_attrib_location", 24)) - { - ret = GLEW_NV_explicit_attrib_location; - continue; - } -#endif -#ifdef GL_NV_explicit_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_multisample", 20)) - { - ret = GLEW_NV_explicit_multisample; - continue; - } -#endif -#ifdef GL_NV_fbo_color_attachments - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbo_color_attachments", 21)) - { - ret = GLEW_NV_fbo_color_attachments; - continue; - } -#endif -#ifdef GL_NV_fence - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5)) - { - ret = GLEW_NV_fence; - continue; - } -#endif -#ifdef GL_NV_fill_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fill_rectangle", 14)) - { - ret = GLEW_NV_fill_rectangle; - continue; - } -#endif -#ifdef GL_NV_float_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) - { - ret = GLEW_NV_float_buffer; - continue; - } -#endif -#ifdef GL_NV_fog_distance - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_distance", 12)) - { - ret = GLEW_NV_fog_distance; - continue; - } -#endif -#ifdef GL_NV_fragment_coverage_to_color - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_coverage_to_color", 26)) - { - ret = GLEW_NV_fragment_coverage_to_color; - continue; - } -#endif -#ifdef GL_NV_fragment_program - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16)) - { - ret = GLEW_NV_fragment_program; - continue; - } -#endif -#ifdef GL_NV_fragment_program2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program2", 17)) - { - ret = GLEW_NV_fragment_program2; - continue; - } -#endif -#ifdef GL_NV_fragment_program4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program4", 17)) - { - ret = GLEW_NV_fragment_program4; - continue; - } -#endif -#ifdef GL_NV_fragment_program_option - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_option", 23)) - { - ret = GLEW_NV_fragment_program_option; - continue; - } -#endif -#ifdef GL_NV_fragment_shader_interlock - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_interlock", 25)) - { - ret = GLEW_NV_fragment_shader_interlock; - continue; - } -#endif -#ifdef GL_NV_framebuffer_blit - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) - { - ret = GLEW_NV_framebuffer_blit; - continue; - } -#endif -#ifdef GL_NV_framebuffer_mixed_samples - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_mixed_samples", 25)) - { - ret = GLEW_NV_framebuffer_mixed_samples; - continue; - } -#endif -#ifdef GL_NV_framebuffer_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) - { - ret = GLEW_NV_framebuffer_multisample; - continue; - } -#endif -#ifdef GL_NV_framebuffer_multisample_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample_coverage", 32)) - { - ret = GLEW_NV_framebuffer_multisample_coverage; - continue; - } -#endif -#ifdef GL_NV_generate_mipmap_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"generate_mipmap_sRGB", 20)) - { - ret = GLEW_NV_generate_mipmap_sRGB; - continue; - } -#endif -#ifdef GL_NV_geometry_program4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_program4", 17)) - { - ret = GLEW_NV_geometry_program4; - continue; - } -#endif -#ifdef GL_NV_geometry_shader4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) - { - ret = GLEW_NV_geometry_shader4; - continue; - } -#endif -#ifdef GL_NV_geometry_shader_passthrough - if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader_passthrough", 27)) - { - ret = GLEW_NV_geometry_shader_passthrough; - continue; - } -#endif -#ifdef GL_NV_gpu_multicast - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_multicast", 13)) - { - ret = GLEW_NV_gpu_multicast; - continue; - } -#endif -#ifdef GL_NV_gpu_program4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program4", 12)) - { - ret = GLEW_NV_gpu_program4; - continue; - } -#endif -#ifdef GL_NV_gpu_program5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program5", 12)) - { - ret = GLEW_NV_gpu_program5; - continue; - } -#endif -#ifdef GL_NV_gpu_program5_mem_extended - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program5_mem_extended", 25)) - { - ret = GLEW_NV_gpu_program5_mem_extended; - continue; - } -#endif -#ifdef GL_NV_gpu_program_fp64 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_fp64", 16)) - { - ret = GLEW_NV_gpu_program_fp64; - continue; - } -#endif -#ifdef GL_NV_gpu_shader5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) - { - ret = GLEW_NV_gpu_shader5; - continue; - } -#endif -#ifdef GL_NV_half_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float", 10)) - { - ret = GLEW_NV_half_float; - continue; - } -#endif -#ifdef GL_NV_image_formats - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_formats", 13)) - { - ret = GLEW_NV_image_formats; - continue; - } -#endif -#ifdef GL_NV_instanced_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) - { - ret = GLEW_NV_instanced_arrays; - continue; - } -#endif -#ifdef GL_NV_internalformat_sample_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_sample_query", 27)) - { - ret = GLEW_NV_internalformat_sample_query; - continue; - } -#endif -#ifdef GL_NV_light_max_exponent - if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_max_exponent", 18)) - { - ret = GLEW_NV_light_max_exponent; - continue; - } -#endif -#ifdef GL_NV_multisample_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) - { - ret = GLEW_NV_multisample_coverage; - continue; - } -#endif -#ifdef GL_NV_multisample_filter_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_filter_hint", 23)) - { - ret = GLEW_NV_multisample_filter_hint; - continue; - } -#endif -#ifdef GL_NV_non_square_matrices - if (_glewStrSame3(&pos, &len, (const GLubyte*)"non_square_matrices", 19)) - { - ret = GLEW_NV_non_square_matrices; - continue; - } -#endif -#ifdef GL_NV_occlusion_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15)) - { - ret = GLEW_NV_occlusion_query; - continue; - } -#endif -#ifdef GL_NV_pack_subimage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_subimage", 13)) - { - ret = GLEW_NV_pack_subimage; - continue; - } -#endif -#ifdef GL_NV_packed_depth_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) - { - ret = GLEW_NV_packed_depth_stencil; - continue; - } -#endif -#ifdef GL_NV_packed_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_float", 12)) - { - ret = GLEW_NV_packed_float; - continue; - } -#endif -#ifdef GL_NV_packed_float_linear - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_float_linear", 19)) - { - ret = GLEW_NV_packed_float_linear; - continue; - } -#endif -#ifdef GL_NV_parameter_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"parameter_buffer_object", 23)) - { - ret = GLEW_NV_parameter_buffer_object; - continue; - } -#endif -#ifdef GL_NV_parameter_buffer_object2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"parameter_buffer_object2", 24)) - { - ret = GLEW_NV_parameter_buffer_object2; - continue; - } -#endif -#ifdef GL_NV_path_rendering - if (_glewStrSame3(&pos, &len, (const GLubyte*)"path_rendering", 14)) - { - ret = GLEW_NV_path_rendering; - continue; - } -#endif -#ifdef GL_NV_path_rendering_shared_edge - if (_glewStrSame3(&pos, &len, (const GLubyte*)"path_rendering_shared_edge", 26)) - { - ret = GLEW_NV_path_rendering_shared_edge; - continue; - } -#endif -#ifdef GL_NV_pixel_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) - { - ret = GLEW_NV_pixel_buffer_object; - continue; - } -#endif -#ifdef GL_NV_pixel_data_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_data_range", 16)) - { - ret = GLEW_NV_pixel_data_range; - continue; - } -#endif -#ifdef GL_NV_platform_binary - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_binary", 15)) - { - ret = GLEW_NV_platform_binary; - continue; - } -#endif -#ifdef GL_NV_point_sprite - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) - { - ret = GLEW_NV_point_sprite; - continue; - } -#endif -#ifdef GL_NV_polygon_mode - if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_mode", 12)) - { - ret = GLEW_NV_polygon_mode; - continue; - } -#endif -#ifdef GL_NV_present_video - if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) - { - ret = GLEW_NV_present_video; - continue; - } -#endif -#ifdef GL_NV_primitive_restart - if (_glewStrSame3(&pos, &len, (const GLubyte*)"primitive_restart", 17)) - { - ret = GLEW_NV_primitive_restart; - continue; - } -#endif -#ifdef GL_NV_read_depth - if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_depth", 10)) - { - ret = GLEW_NV_read_depth; - continue; - } -#endif -#ifdef GL_NV_read_depth_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_depth_stencil", 18)) - { - ret = GLEW_NV_read_depth_stencil; - continue; - } -#endif -#ifdef GL_NV_read_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_stencil", 12)) - { - ret = GLEW_NV_read_stencil; - continue; - } -#endif -#ifdef GL_NV_register_combiners - if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners", 18)) - { - ret = GLEW_NV_register_combiners; - continue; - } -#endif -#ifdef GL_NV_register_combiners2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners2", 19)) - { - ret = GLEW_NV_register_combiners2; - continue; - } -#endif -#ifdef GL_NV_robustness_video_memory_purge - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_video_memory_purge", 29)) - { - ret = GLEW_NV_robustness_video_memory_purge; - continue; - } -#endif -#ifdef GL_NV_sRGB_formats - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sRGB_formats", 12)) - { - ret = GLEW_NV_sRGB_formats; - continue; - } -#endif -#ifdef GL_NV_sample_locations - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_locations", 16)) - { - ret = GLEW_NV_sample_locations; - continue; - } -#endif -#ifdef GL_NV_sample_mask_override_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_mask_override_coverage", 29)) - { - ret = GLEW_NV_sample_mask_override_coverage; - continue; - } -#endif -#ifdef GL_NV_shader_atomic_counters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counters", 22)) - { - ret = GLEW_NV_shader_atomic_counters; - continue; - } -#endif -#ifdef GL_NV_shader_atomic_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_float", 19)) - { - ret = GLEW_NV_shader_atomic_float; - continue; - } -#endif -#ifdef GL_NV_shader_atomic_float64 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_float64", 21)) - { - ret = GLEW_NV_shader_atomic_float64; - continue; - } -#endif -#ifdef GL_NV_shader_atomic_fp16_vector - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_fp16_vector", 25)) - { - ret = GLEW_NV_shader_atomic_fp16_vector; - continue; - } -#endif -#ifdef GL_NV_shader_atomic_int64 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_int64", 19)) - { - ret = GLEW_NV_shader_atomic_int64; - continue; - } -#endif -#ifdef GL_NV_shader_buffer_load - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_buffer_load", 18)) - { - ret = GLEW_NV_shader_buffer_load; - continue; - } -#endif -#ifdef GL_NV_shader_noperspective_interpolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_noperspective_interpolation", 34)) - { - ret = GLEW_NV_shader_noperspective_interpolation; - continue; - } -#endif -#ifdef GL_NV_shader_storage_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_storage_buffer_object", 28)) - { - ret = GLEW_NV_shader_storage_buffer_object; - continue; - } -#endif -#ifdef GL_NV_shader_thread_group - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_thread_group", 19)) - { - ret = GLEW_NV_shader_thread_group; - continue; - } -#endif -#ifdef GL_NV_shader_thread_shuffle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_thread_shuffle", 21)) - { - ret = GLEW_NV_shader_thread_shuffle; - continue; - } -#endif -#ifdef GL_NV_shadow_samplers_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_samplers_array", 21)) - { - ret = GLEW_NV_shadow_samplers_array; - continue; - } -#endif -#ifdef GL_NV_shadow_samplers_cube - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_samplers_cube", 20)) - { - ret = GLEW_NV_shadow_samplers_cube; - continue; - } -#endif -#ifdef GL_NV_stereo_view_rendering - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_view_rendering", 21)) - { - ret = GLEW_NV_stereo_view_rendering; - continue; - } -#endif -#ifdef GL_NV_tessellation_program5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_program5", 21)) - { - ret = GLEW_NV_tessellation_program5; - continue; - } -#endif -#ifdef GL_NV_texgen_emboss - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_emboss", 13)) - { - ret = GLEW_NV_texgen_emboss; - continue; - } -#endif -#ifdef GL_NV_texgen_reflection - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_reflection", 17)) - { - ret = GLEW_NV_texgen_reflection; - continue; - } -#endif -#ifdef GL_NV_texture_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_array", 13)) - { - ret = GLEW_NV_texture_array; - continue; - } -#endif -#ifdef GL_NV_texture_barrier - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_barrier", 15)) - { - ret = GLEW_NV_texture_barrier; - continue; - } -#endif -#ifdef GL_NV_texture_border_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) - { - ret = GLEW_NV_texture_border_clamp; - continue; - } -#endif -#ifdef GL_NV_texture_compression_latc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_latc", 24)) - { - ret = GLEW_NV_texture_compression_latc; - continue; - } -#endif -#ifdef GL_NV_texture_compression_s3tc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_s3tc", 24)) - { - ret = GLEW_NV_texture_compression_s3tc; - continue; - } -#endif -#ifdef GL_NV_texture_compression_s3tc_update - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_s3tc_update", 31)) - { - ret = GLEW_NV_texture_compression_s3tc_update; - continue; - } -#endif -#ifdef GL_NV_texture_compression_vtc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_vtc", 23)) - { - ret = GLEW_NV_texture_compression_vtc; - continue; - } -#endif -#ifdef GL_NV_texture_env_combine4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine4", 20)) - { - ret = GLEW_NV_texture_env_combine4; - continue; - } -#endif -#ifdef GL_NV_texture_expand_normal - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_expand_normal", 21)) - { - ret = GLEW_NV_texture_expand_normal; - continue; - } -#endif -#ifdef GL_NV_texture_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multisample", 19)) - { - ret = GLEW_NV_texture_multisample; - continue; - } -#endif -#ifdef GL_NV_texture_npot_2D_mipmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_npot_2D_mipmap", 22)) - { - ret = GLEW_NV_texture_npot_2D_mipmap; - continue; - } -#endif -#ifdef GL_NV_texture_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) - { - ret = GLEW_NV_texture_rectangle; - continue; - } -#endif -#ifdef GL_NV_texture_rectangle_compressed - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle_compressed", 28)) - { - ret = GLEW_NV_texture_rectangle_compressed; - continue; - } -#endif -#ifdef GL_NV_texture_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader", 14)) - { - ret = GLEW_NV_texture_shader; - continue; - } -#endif -#ifdef GL_NV_texture_shader2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader2", 15)) - { - ret = GLEW_NV_texture_shader2; - continue; - } -#endif -#ifdef GL_NV_texture_shader3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader3", 15)) - { - ret = GLEW_NV_texture_shader3; - continue; - } -#endif -#ifdef GL_NV_transform_feedback - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback", 18)) - { - ret = GLEW_NV_transform_feedback; - continue; - } -#endif -#ifdef GL_NV_transform_feedback2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback2", 19)) - { - ret = GLEW_NV_transform_feedback2; - continue; - } -#endif -#ifdef GL_NV_uniform_buffer_unified_memory - if (_glewStrSame3(&pos, &len, (const GLubyte*)"uniform_buffer_unified_memory", 29)) - { - ret = GLEW_NV_uniform_buffer_unified_memory; - continue; - } -#endif -#ifdef GL_NV_vdpau_interop - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vdpau_interop", 13)) - { - ret = GLEW_NV_vdpau_interop; - continue; - } -#endif -#ifdef GL_NV_vertex_array_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) - { - ret = GLEW_NV_vertex_array_range; - continue; - } -#endif -#ifdef GL_NV_vertex_array_range2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range2", 19)) - { - ret = GLEW_NV_vertex_array_range2; - continue; - } -#endif -#ifdef GL_NV_vertex_attrib_integer_64bit - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_integer_64bit", 27)) - { - ret = GLEW_NV_vertex_attrib_integer_64bit; - continue; - } -#endif -#ifdef GL_NV_vertex_buffer_unified_memory - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_unified_memory", 28)) - { - ret = GLEW_NV_vertex_buffer_unified_memory; - continue; - } -#endif -#ifdef GL_NV_vertex_program - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14)) - { - ret = GLEW_NV_vertex_program; - continue; - } -#endif -#ifdef GL_NV_vertex_program1_1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program1_1", 17)) - { - ret = GLEW_NV_vertex_program1_1; - continue; - } -#endif -#ifdef GL_NV_vertex_program2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2", 15)) - { - ret = GLEW_NV_vertex_program2; - continue; - } -#endif -#ifdef GL_NV_vertex_program2_option - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2_option", 22)) - { - ret = GLEW_NV_vertex_program2_option; - continue; - } -#endif -#ifdef GL_NV_vertex_program3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program3", 15)) - { - ret = GLEW_NV_vertex_program3; - continue; - } -#endif -#ifdef GL_NV_vertex_program4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program4", 15)) - { - ret = GLEW_NV_vertex_program4; - continue; - } -#endif -#ifdef GL_NV_video_capture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) - { - ret = GLEW_NV_video_capture; - continue; - } -#endif -#ifdef GL_NV_viewport_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array", 14)) - { - ret = GLEW_NV_viewport_array; - continue; - } -#endif -#ifdef GL_NV_viewport_array2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array2", 15)) - { - ret = GLEW_NV_viewport_array2; - continue; - } -#endif -#ifdef GL_NV_viewport_swizzle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_swizzle", 16)) - { - ret = GLEW_NV_viewport_swizzle; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"OES_", 4)) - { -#ifdef GL_OES_byte_coordinates - if (_glewStrSame3(&pos, &len, (const GLubyte*)"byte_coordinates", 16)) - { - ret = GLEW_OES_byte_coordinates; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) - { -#ifdef GL_OML_interlace - if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9)) - { - ret = GLEW_OML_interlace; - continue; - } -#endif -#ifdef GL_OML_resample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8)) - { - ret = GLEW_OML_resample; - continue; - } -#endif -#ifdef GL_OML_subsample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"subsample", 9)) - { - ret = GLEW_OML_subsample; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"OVR_", 4)) - { -#ifdef GL_OVR_multiview - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview", 9)) - { - ret = GLEW_OVR_multiview; - continue; - } -#endif -#ifdef GL_OVR_multiview2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview2", 10)) - { - ret = GLEW_OVR_multiview2; - continue; - } -#endif -#ifdef GL_OVR_multiview_multisampled_render_to_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview_multisampled_render_to_texture", 40)) - { - ret = GLEW_OVR_multiview_multisampled_render_to_texture; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"PGI_", 4)) - { -#ifdef GL_PGI_misc_hints - if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_hints", 10)) - { - ret = GLEW_PGI_misc_hints; - continue; - } -#endif -#ifdef GL_PGI_vertex_hints - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_hints", 12)) - { - ret = GLEW_PGI_vertex_hints; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"QCOM_", 5)) - { -#ifdef GL_QCOM_alpha_test - if (_glewStrSame3(&pos, &len, (const GLubyte*)"alpha_test", 10)) - { - ret = GLEW_QCOM_alpha_test; - continue; - } -#endif -#ifdef GL_QCOM_binning_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"binning_control", 15)) - { - ret = GLEW_QCOM_binning_control; - continue; - } -#endif -#ifdef GL_QCOM_driver_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"driver_control", 14)) - { - ret = GLEW_QCOM_driver_control; - continue; - } -#endif -#ifdef GL_QCOM_extended_get - if (_glewStrSame3(&pos, &len, (const GLubyte*)"extended_get", 12)) - { - ret = GLEW_QCOM_extended_get; - continue; - } -#endif -#ifdef GL_QCOM_extended_get2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"extended_get2", 13)) - { - ret = GLEW_QCOM_extended_get2; - continue; - } -#endif -#ifdef GL_QCOM_framebuffer_foveated - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_foveated", 20)) - { - ret = GLEW_QCOM_framebuffer_foveated; - continue; - } -#endif -#ifdef GL_QCOM_perfmon_global_mode - if (_glewStrSame3(&pos, &len, (const GLubyte*)"perfmon_global_mode", 19)) - { - ret = GLEW_QCOM_perfmon_global_mode; - continue; - } -#endif -#ifdef GL_QCOM_shader_framebuffer_fetch_noncoherent - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_framebuffer_fetch_noncoherent", 36)) - { - ret = GLEW_QCOM_shader_framebuffer_fetch_noncoherent; - continue; - } -#endif -#ifdef GL_QCOM_tiled_rendering - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tiled_rendering", 15)) - { - ret = GLEW_QCOM_tiled_rendering; - continue; - } -#endif -#ifdef GL_QCOM_writeonly_rendering - if (_glewStrSame3(&pos, &len, (const GLubyte*)"writeonly_rendering", 19)) - { - ret = GLEW_QCOM_writeonly_rendering; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"REGAL_", 6)) - { -#ifdef GL_REGAL_ES1_0_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES1_0_compatibility", 19)) - { - ret = GLEW_REGAL_ES1_0_compatibility; - continue; - } -#endif -#ifdef GL_REGAL_ES1_1_compatibility - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES1_1_compatibility", 19)) - { - ret = GLEW_REGAL_ES1_1_compatibility; - continue; - } -#endif -#ifdef GL_REGAL_enable - if (_glewStrSame3(&pos, &len, (const GLubyte*)"enable", 6)) - { - ret = GLEW_REGAL_enable; - continue; - } -#endif -#ifdef GL_REGAL_error_string - if (_glewStrSame3(&pos, &len, (const GLubyte*)"error_string", 12)) - { - ret = GLEW_REGAL_error_string; - continue; - } -#endif -#ifdef GL_REGAL_extension_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"extension_query", 15)) - { - ret = GLEW_REGAL_extension_query; - continue; - } -#endif -#ifdef GL_REGAL_log - if (_glewStrSame3(&pos, &len, (const GLubyte*)"log", 3)) - { - ret = GLEW_REGAL_log; - continue; - } -#endif -#ifdef GL_REGAL_proc_address - if (_glewStrSame3(&pos, &len, (const GLubyte*)"proc_address", 12)) - { - ret = GLEW_REGAL_proc_address; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"REND_", 5)) - { -#ifdef GL_REND_screen_coordinates - if (_glewStrSame3(&pos, &len, (const GLubyte*)"screen_coordinates", 18)) - { - ret = GLEW_REND_screen_coordinates; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"S3_", 3)) - { -#ifdef GL_S3_s3tc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"s3tc", 4)) - { - ret = GLEW_S3_s3tc; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5)) - { -#ifdef GL_SGIS_clip_band_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_band_hint", 14)) - { - ret = GLEW_SGIS_clip_band_hint; - continue; - } -#endif -#ifdef GL_SGIS_color_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11)) - { - ret = GLEW_SGIS_color_range; - continue; - } -#endif -#ifdef GL_SGIS_detail_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"detail_texture", 14)) - { - ret = GLEW_SGIS_detail_texture; - continue; - } -#endif -#ifdef GL_SGIS_fog_function - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_function", 12)) - { - ret = GLEW_SGIS_fog_function; - continue; - } -#endif -#ifdef GL_SGIS_generate_mipmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"generate_mipmap", 15)) - { - ret = GLEW_SGIS_generate_mipmap; - continue; - } -#endif -#ifdef GL_SGIS_line_texgen - if (_glewStrSame3(&pos, &len, (const GLubyte*)"line_texgen", 11)) - { - ret = GLEW_SGIS_line_texgen; - continue; - } -#endif -#ifdef GL_SGIS_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLEW_SGIS_multisample; - continue; - } -#endif -#ifdef GL_SGIS_multitexture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multitexture", 12)) - { - ret = GLEW_SGIS_multitexture; - continue; - } -#endif -#ifdef GL_SGIS_pixel_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13)) - { - ret = GLEW_SGIS_pixel_texture; - continue; - } -#endif -#ifdef GL_SGIS_point_line_texgen - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_line_texgen", 17)) - { - ret = GLEW_SGIS_point_line_texgen; - continue; - } -#endif -#ifdef GL_SGIS_shared_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_multisample", 18)) - { - ret = GLEW_SGIS_shared_multisample; - continue; - } -#endif -#ifdef GL_SGIS_sharpen_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sharpen_texture", 15)) - { - ret = GLEW_SGIS_sharpen_texture; - continue; - } -#endif -#ifdef GL_SGIS_texture4D - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture4D", 9)) - { - ret = GLEW_SGIS_texture4D; - continue; - } -#endif -#ifdef GL_SGIS_texture_border_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) - { - ret = GLEW_SGIS_texture_border_clamp; - continue; - } -#endif -#ifdef GL_SGIS_texture_edge_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18)) - { - ret = GLEW_SGIS_texture_edge_clamp; - continue; - } -#endif -#ifdef GL_SGIS_texture_filter4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter4", 15)) - { - ret = GLEW_SGIS_texture_filter4; - continue; - } -#endif -#ifdef GL_SGIS_texture_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod", 11)) - { - ret = GLEW_SGIS_texture_lod; - continue; - } -#endif -#ifdef GL_SGIS_texture_select - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_select", 14)) - { - ret = GLEW_SGIS_texture_select; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5)) - { -#ifdef GL_SGIX_async - if (_glewStrSame3(&pos, &len, (const GLubyte*)"async", 5)) - { - ret = GLEW_SGIX_async; - continue; - } -#endif -#ifdef GL_SGIX_async_histogram - if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_histogram", 15)) - { - ret = GLEW_SGIX_async_histogram; - continue; - } -#endif -#ifdef GL_SGIX_async_pixel - if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_pixel", 11)) - { - ret = GLEW_SGIX_async_pixel; - continue; - } -#endif -#ifdef GL_SGIX_bali_g_instruments - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bali_g_instruments", 18)) - { - ret = GLEW_SGIX_bali_g_instruments; - continue; - } -#endif -#ifdef GL_SGIX_bali_r_instruments - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bali_r_instruments", 18)) - { - ret = GLEW_SGIX_bali_r_instruments; - continue; - } -#endif -#ifdef GL_SGIX_bali_timer_instruments - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bali_timer_instruments", 22)) - { - ret = GLEW_SGIX_bali_timer_instruments; - continue; - } -#endif -#ifdef GL_SGIX_blend_alpha_minmax - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_alpha_minmax", 18)) - { - ret = GLEW_SGIX_blend_alpha_minmax; - continue; - } -#endif -#ifdef GL_SGIX_blend_cadd - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_cadd", 10)) - { - ret = GLEW_SGIX_blend_cadd; - continue; - } -#endif -#ifdef GL_SGIX_blend_cmultiply - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_cmultiply", 15)) - { - ret = GLEW_SGIX_blend_cmultiply; - continue; - } -#endif -#ifdef GL_SGIX_calligraphic_fragment - if (_glewStrSame3(&pos, &len, (const GLubyte*)"calligraphic_fragment", 21)) - { - ret = GLEW_SGIX_calligraphic_fragment; - continue; - } -#endif -#ifdef GL_SGIX_clipmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clipmap", 7)) - { - ret = GLEW_SGIX_clipmap; - continue; - } -#endif -#ifdef GL_SGIX_color_matrix_accuracy - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_matrix_accuracy", 21)) - { - ret = GLEW_SGIX_color_matrix_accuracy; - continue; - } -#endif -#ifdef GL_SGIX_color_table_index_mode - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_table_index_mode", 22)) - { - ret = GLEW_SGIX_color_table_index_mode; - continue; - } -#endif -#ifdef GL_SGIX_complex_polar - if (_glewStrSame3(&pos, &len, (const GLubyte*)"complex_polar", 13)) - { - ret = GLEW_SGIX_complex_polar; - continue; - } -#endif -#ifdef GL_SGIX_convolution_accuracy - if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_accuracy", 20)) - { - ret = GLEW_SGIX_convolution_accuracy; - continue; - } -#endif -#ifdef GL_SGIX_cube_map - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cube_map", 8)) - { - ret = GLEW_SGIX_cube_map; - continue; - } -#endif -#ifdef GL_SGIX_cylinder_texgen - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cylinder_texgen", 15)) - { - ret = GLEW_SGIX_cylinder_texgen; - continue; - } -#endif -#ifdef GL_SGIX_datapipe - if (_glewStrSame3(&pos, &len, (const GLubyte*)"datapipe", 8)) - { - ret = GLEW_SGIX_datapipe; - continue; - } -#endif -#ifdef GL_SGIX_decimation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"decimation", 10)) - { - ret = GLEW_SGIX_decimation; - continue; - } -#endif -#ifdef GL_SGIX_depth_pass_instrument - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_pass_instrument", 21)) - { - ret = GLEW_SGIX_depth_pass_instrument; - continue; - } -#endif -#ifdef GL_SGIX_depth_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) - { - ret = GLEW_SGIX_depth_texture; - continue; - } -#endif -#ifdef GL_SGIX_dvc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"dvc", 3)) - { - ret = GLEW_SGIX_dvc; - continue; - } -#endif -#ifdef GL_SGIX_flush_raster - if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_raster", 12)) - { - ret = GLEW_SGIX_flush_raster; - continue; - } -#endif -#ifdef GL_SGIX_fog_blend - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_blend", 9)) - { - ret = GLEW_SGIX_fog_blend; - continue; - } -#endif -#ifdef GL_SGIX_fog_factor_to_alpha - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_factor_to_alpha", 19)) - { - ret = GLEW_SGIX_fog_factor_to_alpha; - continue; - } -#endif -#ifdef GL_SGIX_fog_layers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_layers", 10)) - { - ret = GLEW_SGIX_fog_layers; - continue; - } -#endif -#ifdef GL_SGIX_fog_offset - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_offset", 10)) - { - ret = GLEW_SGIX_fog_offset; - continue; - } -#endif -#ifdef GL_SGIX_fog_patchy - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_patchy", 10)) - { - ret = GLEW_SGIX_fog_patchy; - continue; - } -#endif -#ifdef GL_SGIX_fog_scale - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_scale", 9)) - { - ret = GLEW_SGIX_fog_scale; - continue; - } -#endif -#ifdef GL_SGIX_fog_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_texture", 11)) - { - ret = GLEW_SGIX_fog_texture; - continue; - } -#endif -#ifdef GL_SGIX_fragment_lighting_space - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_lighting_space", 23)) - { - ret = GLEW_SGIX_fragment_lighting_space; - continue; - } -#endif -#ifdef GL_SGIX_fragment_specular_lighting - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_specular_lighting", 26)) - { - ret = GLEW_SGIX_fragment_specular_lighting; - continue; - } -#endif -#ifdef GL_SGIX_fragments_instrument - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragments_instrument", 20)) - { - ret = GLEW_SGIX_fragments_instrument; - continue; - } -#endif -#ifdef GL_SGIX_framezoom - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framezoom", 9)) - { - ret = GLEW_SGIX_framezoom; - continue; - } -#endif -#ifdef GL_SGIX_icc_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"icc_texture", 11)) - { - ret = GLEW_SGIX_icc_texture; - continue; - } -#endif -#ifdef GL_SGIX_igloo_interface - if (_glewStrSame3(&pos, &len, (const GLubyte*)"igloo_interface", 15)) - { - ret = GLEW_SGIX_igloo_interface; - continue; - } -#endif -#ifdef GL_SGIX_image_compression - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_compression", 17)) - { - ret = GLEW_SGIX_image_compression; - continue; - } -#endif -#ifdef GL_SGIX_impact_pixel_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"impact_pixel_texture", 20)) - { - ret = GLEW_SGIX_impact_pixel_texture; - continue; - } -#endif -#ifdef GL_SGIX_instrument_error - if (_glewStrSame3(&pos, &len, (const GLubyte*)"instrument_error", 16)) - { - ret = GLEW_SGIX_instrument_error; - continue; - } -#endif -#ifdef GL_SGIX_interlace - if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9)) - { - ret = GLEW_SGIX_interlace; - continue; - } -#endif -#ifdef GL_SGIX_ir_instrument1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ir_instrument1", 14)) - { - ret = GLEW_SGIX_ir_instrument1; - continue; - } -#endif -#ifdef GL_SGIX_line_quality_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"line_quality_hint", 17)) - { - ret = GLEW_SGIX_line_quality_hint; - continue; - } -#endif -#ifdef GL_SGIX_list_priority - if (_glewStrSame3(&pos, &len, (const GLubyte*)"list_priority", 13)) - { - ret = GLEW_SGIX_list_priority; - continue; - } -#endif -#ifdef GL_SGIX_mpeg1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"mpeg1", 5)) - { - ret = GLEW_SGIX_mpeg1; - continue; - } -#endif -#ifdef GL_SGIX_mpeg2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"mpeg2", 5)) - { - ret = GLEW_SGIX_mpeg2; - continue; - } -#endif -#ifdef GL_SGIX_nonlinear_lighting_pervertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"nonlinear_lighting_pervertex", 28)) - { - ret = GLEW_SGIX_nonlinear_lighting_pervertex; - continue; - } -#endif -#ifdef GL_SGIX_nurbs_eval - if (_glewStrSame3(&pos, &len, (const GLubyte*)"nurbs_eval", 10)) - { - ret = GLEW_SGIX_nurbs_eval; - continue; - } -#endif -#ifdef GL_SGIX_occlusion_instrument - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_instrument", 20)) - { - ret = GLEW_SGIX_occlusion_instrument; - continue; - } -#endif -#ifdef GL_SGIX_packed_6bytes - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_6bytes", 13)) - { - ret = GLEW_SGIX_packed_6bytes; - continue; - } -#endif -#ifdef GL_SGIX_pixel_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13)) - { - ret = GLEW_SGIX_pixel_texture; - continue; - } -#endif -#ifdef GL_SGIX_pixel_texture_bits - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture_bits", 18)) - { - ret = GLEW_SGIX_pixel_texture_bits; - continue; - } -#endif -#ifdef GL_SGIX_pixel_texture_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture_lod", 17)) - { - ret = GLEW_SGIX_pixel_texture_lod; - continue; - } -#endif -#ifdef GL_SGIX_pixel_tiles - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_tiles", 11)) - { - ret = GLEW_SGIX_pixel_tiles; - continue; - } -#endif -#ifdef GL_SGIX_polynomial_ffd - if (_glewStrSame3(&pos, &len, (const GLubyte*)"polynomial_ffd", 14)) - { - ret = GLEW_SGIX_polynomial_ffd; - continue; - } -#endif -#ifdef GL_SGIX_quad_mesh - if (_glewStrSame3(&pos, &len, (const GLubyte*)"quad_mesh", 9)) - { - ret = GLEW_SGIX_quad_mesh; - continue; - } -#endif -#ifdef GL_SGIX_reference_plane - if (_glewStrSame3(&pos, &len, (const GLubyte*)"reference_plane", 15)) - { - ret = GLEW_SGIX_reference_plane; - continue; - } -#endif -#ifdef GL_SGIX_resample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8)) - { - ret = GLEW_SGIX_resample; - continue; - } -#endif -#ifdef GL_SGIX_scalebias_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"scalebias_hint", 14)) - { - ret = GLEW_SGIX_scalebias_hint; - continue; - } -#endif -#ifdef GL_SGIX_shadow - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6)) - { - ret = GLEW_SGIX_shadow; - continue; - } -#endif -#ifdef GL_SGIX_shadow_ambient - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14)) - { - ret = GLEW_SGIX_shadow_ambient; - continue; - } -#endif -#ifdef GL_SGIX_slim - if (_glewStrSame3(&pos, &len, (const GLubyte*)"slim", 4)) - { - ret = GLEW_SGIX_slim; - continue; - } -#endif -#ifdef GL_SGIX_spotlight_cutoff - if (_glewStrSame3(&pos, &len, (const GLubyte*)"spotlight_cutoff", 16)) - { - ret = GLEW_SGIX_spotlight_cutoff; - continue; - } -#endif -#ifdef GL_SGIX_sprite - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sprite", 6)) - { - ret = GLEW_SGIX_sprite; - continue; - } -#endif -#ifdef GL_SGIX_subdiv_patch - if (_glewStrSame3(&pos, &len, (const GLubyte*)"subdiv_patch", 12)) - { - ret = GLEW_SGIX_subdiv_patch; - continue; - } -#endif -#ifdef GL_SGIX_subsample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"subsample", 9)) - { - ret = GLEW_SGIX_subsample; - continue; - } -#endif -#ifdef GL_SGIX_tag_sample_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tag_sample_buffer", 17)) - { - ret = GLEW_SGIX_tag_sample_buffer; - continue; - } -#endif -#ifdef GL_SGIX_texture_add_env - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_add_env", 15)) - { - ret = GLEW_SGIX_texture_add_env; - continue; - } -#endif -#ifdef GL_SGIX_texture_coordinate_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_coordinate_clamp", 24)) - { - ret = GLEW_SGIX_texture_coordinate_clamp; - continue; - } -#endif -#ifdef GL_SGIX_texture_lod_bias - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16)) - { - ret = GLEW_SGIX_texture_lod_bias; - continue; - } -#endif -#ifdef GL_SGIX_texture_mipmap_anisotropic - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mipmap_anisotropic", 26)) - { - ret = GLEW_SGIX_texture_mipmap_anisotropic; - continue; - } -#endif -#ifdef GL_SGIX_texture_multi_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multi_buffer", 20)) - { - ret = GLEW_SGIX_texture_multi_buffer; - continue; - } -#endif -#ifdef GL_SGIX_texture_phase - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_phase", 13)) - { - ret = GLEW_SGIX_texture_phase; - continue; - } -#endif -#ifdef GL_SGIX_texture_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13)) - { - ret = GLEW_SGIX_texture_range; - continue; - } -#endif -#ifdef GL_SGIX_texture_scale_bias - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scale_bias", 18)) - { - ret = GLEW_SGIX_texture_scale_bias; - continue; - } -#endif -#ifdef GL_SGIX_texture_supersample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_supersample", 19)) - { - ret = GLEW_SGIX_texture_supersample; - continue; - } -#endif -#ifdef GL_SGIX_vector_ops - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vector_ops", 10)) - { - ret = GLEW_SGIX_vector_ops; - continue; - } -#endif -#ifdef GL_SGIX_vertex_array_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) - { - ret = GLEW_SGIX_vertex_array_object; - continue; - } -#endif -#ifdef GL_SGIX_vertex_preclip - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip", 14)) - { - ret = GLEW_SGIX_vertex_preclip; - continue; - } -#endif -#ifdef GL_SGIX_vertex_preclip_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip_hint", 19)) - { - ret = GLEW_SGIX_vertex_preclip_hint; - continue; - } -#endif -#ifdef GL_SGIX_ycrcb - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycrcb", 5)) - { - ret = GLEW_SGIX_ycrcb; - continue; - } -#endif -#ifdef GL_SGIX_ycrcb_subsample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycrcb_subsample", 15)) - { - ret = GLEW_SGIX_ycrcb_subsample; - continue; - } -#endif -#ifdef GL_SGIX_ycrcba - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycrcba", 6)) - { - ret = GLEW_SGIX_ycrcba; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4)) - { -#ifdef GL_SGI_color_matrix - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_matrix", 12)) - { - ret = GLEW_SGI_color_matrix; - continue; - } -#endif -#ifdef GL_SGI_color_table - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_table", 11)) - { - ret = GLEW_SGI_color_table; - continue; - } -#endif -#ifdef GL_SGI_complex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"complex", 7)) - { - ret = GLEW_SGI_complex; - continue; - } -#endif -#ifdef GL_SGI_complex_type - if (_glewStrSame3(&pos, &len, (const GLubyte*)"complex_type", 12)) - { - ret = GLEW_SGI_complex_type; - continue; - } -#endif -#ifdef GL_SGI_fft - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fft", 3)) - { - ret = GLEW_SGI_fft; - continue; - } -#endif -#ifdef GL_SGI_texture_color_table - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_color_table", 19)) - { - ret = GLEW_SGI_texture_color_table; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUNX_", 5)) - { -#ifdef GL_SUNX_constant_data - if (_glewStrSame3(&pos, &len, (const GLubyte*)"constant_data", 13)) - { - ret = GLEW_SUNX_constant_data; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4)) - { -#ifdef GL_SUN_convolution_border_modes - if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24)) - { - ret = GLEW_SUN_convolution_border_modes; - continue; - } -#endif -#ifdef GL_SUN_global_alpha - if (_glewStrSame3(&pos, &len, (const GLubyte*)"global_alpha", 12)) - { - ret = GLEW_SUN_global_alpha; - continue; - } -#endif -#ifdef GL_SUN_mesh_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"mesh_array", 10)) - { - ret = GLEW_SUN_mesh_array; - continue; - } -#endif -#ifdef GL_SUN_read_video_pixels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_video_pixels", 17)) - { - ret = GLEW_SUN_read_video_pixels; - continue; - } -#endif -#ifdef GL_SUN_slice_accum - if (_glewStrSame3(&pos, &len, (const GLubyte*)"slice_accum", 11)) - { - ret = GLEW_SUN_slice_accum; - continue; - } -#endif -#ifdef GL_SUN_triangle_list - if (_glewStrSame3(&pos, &len, (const GLubyte*)"triangle_list", 13)) - { - ret = GLEW_SUN_triangle_list; - continue; - } -#endif -#ifdef GL_SUN_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex", 6)) - { - ret = GLEW_SUN_vertex; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"WIN_", 4)) - { -#ifdef GL_WIN_phong_shading - if (_glewStrSame3(&pos, &len, (const GLubyte*)"phong_shading", 13)) - { - ret = GLEW_WIN_phong_shading; - continue; - } -#endif -#ifdef GL_WIN_scene_markerXXX - if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_markerXXX", 15)) - { - ret = GLEW_WIN_scene_markerXXX; - continue; - } -#endif -#ifdef GL_WIN_specular_fog - if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_fog", 12)) - { - ret = GLEW_WIN_specular_fog; - continue; - } -#endif -#ifdef GL_WIN_swap_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_hint", 9)) - { - ret = GLEW_WIN_swap_hint; - continue; - } -#endif - } - } - ret = (len == 0); - } - return ret; -} - -#if defined(_WIN32) && !defined(GLEW_EGL) && !defined(GLEW_OSMESA) - -GLboolean GLEWAPIENTRY wglewIsSupported (const char* name) -{ - const GLubyte* pos = (const GLubyte*)name; - GLuint len = _glewStrLen(pos); - GLboolean ret = GL_TRUE; - while (ret && len > 0) - { - if (_glewStrSame1(&pos, &len, (const GLubyte*)"WGL_", 4)) - { - if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) - { -#ifdef WGL_3DFX_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = WGLEW_3DFX_multisample; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DL_", 4)) - { -#ifdef WGL_3DL_stereo_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_control", 14)) - { - ret = WGLEW_3DL_stereo_control; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) - { -#ifdef WGL_AMD_gpu_association - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_association", 15)) - { - ret = WGLEW_AMD_gpu_association; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) - { -#ifdef WGL_ARB_buffer_region - if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13)) - { - ret = WGLEW_ARB_buffer_region; - continue; - } -#endif -#ifdef WGL_ARB_context_flush_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) - { - ret = WGLEW_ARB_context_flush_control; - continue; - } -#endif -#ifdef WGL_ARB_create_context - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14)) - { - ret = WGLEW_ARB_create_context; - continue; - } -#endif -#ifdef WGL_ARB_create_context_no_error - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_no_error", 23)) - { - ret = WGLEW_ARB_create_context_no_error; - continue; - } -#endif -#ifdef WGL_ARB_create_context_profile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_profile", 22)) - { - ret = WGLEW_ARB_create_context_profile; - continue; - } -#endif -#ifdef WGL_ARB_create_context_robustness - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25)) - { - ret = WGLEW_ARB_create_context_robustness; - continue; - } -#endif -#ifdef WGL_ARB_extensions_string - if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17)) - { - ret = WGLEW_ARB_extensions_string; - continue; - } -#endif -#ifdef WGL_ARB_framebuffer_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) - { - ret = WGLEW_ARB_framebuffer_sRGB; - continue; - } -#endif -#ifdef WGL_ARB_make_current_read - if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) - { - ret = WGLEW_ARB_make_current_read; - continue; - } -#endif -#ifdef WGL_ARB_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = WGLEW_ARB_multisample; - continue; - } -#endif -#ifdef WGL_ARB_pbuffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) - { - ret = WGLEW_ARB_pbuffer; - continue; - } -#endif -#ifdef WGL_ARB_pixel_format - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12)) - { - ret = WGLEW_ARB_pixel_format; - continue; - } -#endif -#ifdef WGL_ARB_pixel_format_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) - { - ret = WGLEW_ARB_pixel_format_float; - continue; - } -#endif -#ifdef WGL_ARB_render_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14)) - { - ret = WGLEW_ARB_render_texture; - continue; - } -#endif -#ifdef WGL_ARB_robustness_application_isolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) - { - ret = WGLEW_ARB_robustness_application_isolation; - continue; - } -#endif -#ifdef WGL_ARB_robustness_share_group_isolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) - { - ret = WGLEW_ARB_robustness_share_group_isolation; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) - { -#ifdef WGL_ATI_pixel_format_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) - { - ret = WGLEW_ATI_pixel_format_float; - continue; - } -#endif -#ifdef WGL_ATI_render_texture_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24)) - { - ret = WGLEW_ATI_render_texture_rectangle; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) - { -#ifdef WGL_EXT_colorspace - if (_glewStrSame3(&pos, &len, (const GLubyte*)"colorspace", 10)) - { - ret = WGLEW_EXT_colorspace; - continue; - } -#endif -#ifdef WGL_EXT_create_context_es2_profile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26)) - { - ret = WGLEW_EXT_create_context_es2_profile; - continue; - } -#endif -#ifdef WGL_EXT_create_context_es_profile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es_profile", 25)) - { - ret = WGLEW_EXT_create_context_es_profile; - continue; - } -#endif -#ifdef WGL_EXT_depth_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_float", 11)) - { - ret = WGLEW_EXT_depth_float; - continue; - } -#endif -#ifdef WGL_EXT_display_color_table - if (_glewStrSame3(&pos, &len, (const GLubyte*)"display_color_table", 19)) - { - ret = WGLEW_EXT_display_color_table; - continue; - } -#endif -#ifdef WGL_EXT_extensions_string - if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17)) - { - ret = WGLEW_EXT_extensions_string; - continue; - } -#endif -#ifdef WGL_EXT_framebuffer_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) - { - ret = WGLEW_EXT_framebuffer_sRGB; - continue; - } -#endif -#ifdef WGL_EXT_make_current_read - if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) - { - ret = WGLEW_EXT_make_current_read; - continue; - } -#endif -#ifdef WGL_EXT_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = WGLEW_EXT_multisample; - continue; - } -#endif -#ifdef WGL_EXT_pbuffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) - { - ret = WGLEW_EXT_pbuffer; - continue; - } -#endif -#ifdef WGL_EXT_pixel_format - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12)) - { - ret = WGLEW_EXT_pixel_format; - continue; - } -#endif -#ifdef WGL_EXT_pixel_format_packed_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_packed_float", 25)) - { - ret = WGLEW_EXT_pixel_format_packed_float; - continue; - } -#endif -#ifdef WGL_EXT_swap_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) - { - ret = WGLEW_EXT_swap_control; - continue; - } -#endif -#ifdef WGL_EXT_swap_control_tear - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control_tear", 17)) - { - ret = WGLEW_EXT_swap_control_tear; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"I3D_", 4)) - { -#ifdef WGL_I3D_digital_video_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"digital_video_control", 21)) - { - ret = WGLEW_I3D_digital_video_control; - continue; - } -#endif -#ifdef WGL_I3D_gamma - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gamma", 5)) - { - ret = WGLEW_I3D_gamma; - continue; - } -#endif -#ifdef WGL_I3D_genlock - if (_glewStrSame3(&pos, &len, (const GLubyte*)"genlock", 7)) - { - ret = WGLEW_I3D_genlock; - continue; - } -#endif -#ifdef WGL_I3D_image_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_buffer", 12)) - { - ret = WGLEW_I3D_image_buffer; - continue; - } -#endif -#ifdef WGL_I3D_swap_frame_lock - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_lock", 15)) - { - ret = WGLEW_I3D_swap_frame_lock; - continue; - } -#endif -#ifdef WGL_I3D_swap_frame_usage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_usage", 16)) - { - ret = WGLEW_I3D_swap_frame_usage; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) - { -#ifdef WGL_NV_DX_interop - if (_glewStrSame3(&pos, &len, (const GLubyte*)"DX_interop", 10)) - { - ret = WGLEW_NV_DX_interop; - continue; - } -#endif -#ifdef WGL_NV_DX_interop2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"DX_interop2", 11)) - { - ret = WGLEW_NV_DX_interop2; - continue; - } -#endif -#ifdef WGL_NV_copy_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) - { - ret = WGLEW_NV_copy_image; - continue; - } -#endif -#ifdef WGL_NV_delay_before_swap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"delay_before_swap", 17)) - { - ret = WGLEW_NV_delay_before_swap; - continue; - } -#endif -#ifdef WGL_NV_float_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) - { - ret = WGLEW_NV_float_buffer; - continue; - } -#endif -#ifdef WGL_NV_gpu_affinity - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_affinity", 12)) - { - ret = WGLEW_NV_gpu_affinity; - continue; - } -#endif -#ifdef WGL_NV_multisample_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) - { - ret = WGLEW_NV_multisample_coverage; - continue; - } -#endif -#ifdef WGL_NV_present_video - if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) - { - ret = WGLEW_NV_present_video; - continue; - } -#endif -#ifdef WGL_NV_render_depth_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_depth_texture", 20)) - { - ret = WGLEW_NV_render_depth_texture; - continue; - } -#endif -#ifdef WGL_NV_render_texture_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24)) - { - ret = WGLEW_NV_render_texture_rectangle; - continue; - } -#endif -#ifdef WGL_NV_swap_group - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) - { - ret = WGLEW_NV_swap_group; - continue; - } -#endif -#ifdef WGL_NV_vertex_array_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) - { - ret = WGLEW_NV_vertex_array_range; - continue; - } -#endif -#ifdef WGL_NV_video_capture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) - { - ret = WGLEW_NV_video_capture; - continue; - } -#endif -#ifdef WGL_NV_video_output - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_output", 12)) - { - ret = WGLEW_NV_video_output; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) - { -#ifdef WGL_OML_sync_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12)) - { - ret = WGLEW_OML_sync_control; - continue; - } -#endif - } - } - ret = (len == 0); - } - return ret; -} - -#elif !defined(GLEW_OSMESA) && !defined(GLEW_EGL) && !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) - -GLboolean glxewIsSupported (const char* name) -{ - const GLubyte* pos = (const GLubyte*)name; - GLuint len = _glewStrLen(pos); - GLboolean ret = GL_TRUE; - while (ret && len > 0) - { - if(_glewStrSame1(&pos, &len, (const GLubyte*)"GLX_", 4)) - { - if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) - { -#ifdef GLX_VERSION_1_2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) - { - ret = GLXEW_VERSION_1_2; - continue; - } -#endif -#ifdef GLX_VERSION_1_3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) - { - ret = GLXEW_VERSION_1_3; - continue; - } -#endif -#ifdef GLX_VERSION_1_4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) - { - ret = GLXEW_VERSION_1_4; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) - { -#ifdef GLX_3DFX_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLXEW_3DFX_multisample; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) - { -#ifdef GLX_AMD_gpu_association - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_association", 15)) - { - ret = GLXEW_AMD_gpu_association; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) - { -#ifdef GLX_ARB_context_flush_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) - { - ret = GLXEW_ARB_context_flush_control; - continue; - } -#endif -#ifdef GLX_ARB_create_context - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14)) - { - ret = GLXEW_ARB_create_context; - continue; - } -#endif -#ifdef GLX_ARB_create_context_no_error - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_no_error", 23)) - { - ret = GLXEW_ARB_create_context_no_error; - continue; - } -#endif -#ifdef GLX_ARB_create_context_profile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_profile", 22)) - { - ret = GLXEW_ARB_create_context_profile; - continue; - } -#endif -#ifdef GLX_ARB_create_context_robustness - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25)) - { - ret = GLXEW_ARB_create_context_robustness; - continue; - } -#endif -#ifdef GLX_ARB_fbconfig_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_float", 14)) - { - ret = GLXEW_ARB_fbconfig_float; - continue; - } -#endif -#ifdef GLX_ARB_framebuffer_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) - { - ret = GLXEW_ARB_framebuffer_sRGB; - continue; - } -#endif -#ifdef GLX_ARB_get_proc_address - if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_proc_address", 16)) - { - ret = GLXEW_ARB_get_proc_address; - continue; - } -#endif -#ifdef GLX_ARB_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLXEW_ARB_multisample; - continue; - } -#endif -#ifdef GLX_ARB_robustness_application_isolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) - { - ret = GLXEW_ARB_robustness_application_isolation; - continue; - } -#endif -#ifdef GLX_ARB_robustness_share_group_isolation - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) - { - ret = GLXEW_ARB_robustness_share_group_isolation; - continue; - } -#endif -#ifdef GLX_ARB_vertex_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20)) - { - ret = GLXEW_ARB_vertex_buffer_object; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) - { -#ifdef GLX_ATI_pixel_format_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) - { - ret = GLXEW_ATI_pixel_format_float; - continue; - } -#endif -#ifdef GLX_ATI_render_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14)) - { - ret = GLXEW_ATI_render_texture; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) - { -#ifdef GLX_EXT_buffer_age - if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_age", 10)) - { - ret = GLXEW_EXT_buffer_age; - continue; - } -#endif -#ifdef GLX_EXT_create_context_es2_profile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26)) - { - ret = GLXEW_EXT_create_context_es2_profile; - continue; - } -#endif -#ifdef GLX_EXT_create_context_es_profile - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es_profile", 25)) - { - ret = GLXEW_EXT_create_context_es_profile; - continue; - } -#endif -#ifdef GLX_EXT_fbconfig_packed_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_packed_float", 21)) - { - ret = GLXEW_EXT_fbconfig_packed_float; - continue; - } -#endif -#ifdef GLX_EXT_framebuffer_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) - { - ret = GLXEW_EXT_framebuffer_sRGB; - continue; - } -#endif -#ifdef GLX_EXT_import_context - if (_glewStrSame3(&pos, &len, (const GLubyte*)"import_context", 14)) - { - ret = GLXEW_EXT_import_context; - continue; - } -#endif -#ifdef GLX_EXT_libglvnd - if (_glewStrSame3(&pos, &len, (const GLubyte*)"libglvnd", 8)) - { - ret = GLXEW_EXT_libglvnd; - continue; - } -#endif -#ifdef GLX_EXT_scene_marker - if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12)) - { - ret = GLXEW_EXT_scene_marker; - continue; - } -#endif -#ifdef GLX_EXT_stereo_tree - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_tree", 11)) - { - ret = GLXEW_EXT_stereo_tree; - continue; - } -#endif -#ifdef GLX_EXT_swap_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) - { - ret = GLXEW_EXT_swap_control; - continue; - } -#endif -#ifdef GLX_EXT_swap_control_tear - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control_tear", 17)) - { - ret = GLXEW_EXT_swap_control_tear; - continue; - } -#endif -#ifdef GLX_EXT_texture_from_pixmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_from_pixmap", 19)) - { - ret = GLXEW_EXT_texture_from_pixmap; - continue; - } -#endif -#ifdef GLX_EXT_visual_info - if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_info", 11)) - { - ret = GLXEW_EXT_visual_info; - continue; - } -#endif -#ifdef GLX_EXT_visual_rating - if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_rating", 13)) - { - ret = GLXEW_EXT_visual_rating; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6)) - { -#ifdef GLX_INTEL_swap_event - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_event", 10)) - { - ret = GLXEW_INTEL_swap_event; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) - { -#ifdef GLX_MESA_agp_offset - if (_glewStrSame3(&pos, &len, (const GLubyte*)"agp_offset", 10)) - { - ret = GLXEW_MESA_agp_offset; - continue; - } -#endif -#ifdef GLX_MESA_copy_sub_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_sub_buffer", 15)) - { - ret = GLXEW_MESA_copy_sub_buffer; - continue; - } -#endif -#ifdef GLX_MESA_pixmap_colormap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixmap_colormap", 15)) - { - ret = GLXEW_MESA_pixmap_colormap; - continue; - } -#endif -#ifdef GLX_MESA_query_renderer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_renderer", 14)) - { - ret = GLXEW_MESA_query_renderer; - continue; - } -#endif -#ifdef GLX_MESA_release_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"release_buffers", 15)) - { - ret = GLXEW_MESA_release_buffers; - continue; - } -#endif -#ifdef GLX_MESA_set_3dfx_mode - if (_glewStrSame3(&pos, &len, (const GLubyte*)"set_3dfx_mode", 13)) - { - ret = GLXEW_MESA_set_3dfx_mode; - continue; - } -#endif -#ifdef GLX_MESA_swap_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) - { - ret = GLXEW_MESA_swap_control; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) - { -#ifdef GLX_NV_copy_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11)) - { - ret = GLXEW_NV_copy_buffer; - continue; - } -#endif -#ifdef GLX_NV_copy_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) - { - ret = GLXEW_NV_copy_image; - continue; - } -#endif -#ifdef GLX_NV_delay_before_swap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"delay_before_swap", 17)) - { - ret = GLXEW_NV_delay_before_swap; - continue; - } -#endif -#ifdef GLX_NV_float_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) - { - ret = GLXEW_NV_float_buffer; - continue; - } -#endif -#ifdef GLX_NV_multisample_coverage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) - { - ret = GLXEW_NV_multisample_coverage; - continue; - } -#endif -#ifdef GLX_NV_present_video - if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) - { - ret = GLXEW_NV_present_video; - continue; - } -#endif -#ifdef GLX_NV_robustness_video_memory_purge - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_video_memory_purge", 29)) - { - ret = GLXEW_NV_robustness_video_memory_purge; - continue; - } -#endif -#ifdef GLX_NV_swap_group - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) - { - ret = GLXEW_NV_swap_group; - continue; - } -#endif -#ifdef GLX_NV_vertex_array_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) - { - ret = GLXEW_NV_vertex_array_range; - continue; - } -#endif -#ifdef GLX_NV_video_capture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) - { - ret = GLXEW_NV_video_capture; - continue; - } -#endif -#ifdef GLX_NV_video_out - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_out", 9)) - { - ret = GLXEW_NV_video_out; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) - { -#ifdef GLX_OML_swap_method - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_method", 11)) - { - ret = GLXEW_OML_swap_method; - continue; - } -#endif -#ifdef GLX_OML_sync_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12)) - { - ret = GLXEW_OML_sync_control; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5)) - { -#ifdef GLX_SGIS_blended_overlay - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blended_overlay", 15)) - { - ret = GLXEW_SGIS_blended_overlay; - continue; - } -#endif -#ifdef GLX_SGIS_color_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11)) - { - ret = GLXEW_SGIS_color_range; - continue; - } -#endif -#ifdef GLX_SGIS_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLXEW_SGIS_multisample; - continue; - } -#endif -#ifdef GLX_SGIS_shared_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_multisample", 18)) - { - ret = GLXEW_SGIS_shared_multisample; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5)) - { -#ifdef GLX_SGIX_fbconfig - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig", 8)) - { - ret = GLXEW_SGIX_fbconfig; - continue; - } -#endif -#ifdef GLX_SGIX_hyperpipe - if (_glewStrSame3(&pos, &len, (const GLubyte*)"hyperpipe", 9)) - { - ret = GLXEW_SGIX_hyperpipe; - continue; - } -#endif -#ifdef GLX_SGIX_pbuffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) - { - ret = GLXEW_SGIX_pbuffer; - continue; - } -#endif -#ifdef GLX_SGIX_swap_barrier - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_barrier", 12)) - { - ret = GLXEW_SGIX_swap_barrier; - continue; - } -#endif -#ifdef GLX_SGIX_swap_group - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) - { - ret = GLXEW_SGIX_swap_group; - continue; - } -#endif -#ifdef GLX_SGIX_video_resize - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12)) - { - ret = GLXEW_SGIX_video_resize; - continue; - } -#endif -#ifdef GLX_SGIX_visual_select_group - if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_select_group", 19)) - { - ret = GLXEW_SGIX_visual_select_group; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4)) - { -#ifdef GLX_SGI_cushion - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cushion", 7)) - { - ret = GLXEW_SGI_cushion; - continue; - } -#endif -#ifdef GLX_SGI_make_current_read - if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) - { - ret = GLXEW_SGI_make_current_read; - continue; - } -#endif -#ifdef GLX_SGI_swap_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) - { - ret = GLXEW_SGI_swap_control; - continue; - } -#endif -#ifdef GLX_SGI_video_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_sync", 10)) - { - ret = GLXEW_SGI_video_sync; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4)) - { -#ifdef GLX_SUN_get_transparent_index - if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_transparent_index", 21)) - { - ret = GLXEW_SUN_get_transparent_index; - continue; - } -#endif -#ifdef GLX_SUN_video_resize - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12)) - { - ret = GLXEW_SUN_video_resize; - continue; - } -#endif - } - } - ret = (len == 0); - } - return ret; -} - -#elif defined(GLEW_EGL) - -GLboolean eglewIsSupported (const char* name) -{ - const GLubyte* pos = (const GLubyte*)name; - GLuint len = _glewStrLen(pos); - GLboolean ret = GL_TRUE; - while (ret && len > 0) - { - if(_glewStrSame1(&pos, &len, (const GLubyte*)"EGL_", 4)) - { - if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) - { -#ifdef EGL_VERSION_1_0 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_0", 3)) - { - ret = EGLEW_VERSION_1_0; - continue; - } -#endif -#ifdef EGL_VERSION_1_1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_1", 3)) - { - ret = EGLEW_VERSION_1_1; - continue; - } -#endif -#ifdef EGL_VERSION_1_2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) - { - ret = EGLEW_VERSION_1_2; - continue; - } -#endif -#ifdef EGL_VERSION_1_3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) - { - ret = EGLEW_VERSION_1_3; - continue; - } -#endif -#ifdef EGL_VERSION_1_4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) - { - ret = EGLEW_VERSION_1_4; - continue; - } -#endif -#ifdef EGL_VERSION_1_5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_5", 3)) - { - ret = EGLEW_VERSION_1_5; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANDROID_", 8)) - { -#ifdef EGL_ANDROID_blob_cache - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blob_cache", 10)) - { - ret = EGLEW_ANDROID_blob_cache; - continue; - } -#endif -#ifdef EGL_ANDROID_create_native_client_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_native_client_buffer", 27)) - { - ret = EGLEW_ANDROID_create_native_client_buffer; - continue; - } -#endif -#ifdef EGL_ANDROID_framebuffer_target - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_target", 18)) - { - ret = EGLEW_ANDROID_framebuffer_target; - continue; - } -#endif -#ifdef EGL_ANDROID_front_buffer_auto_refresh - if (_glewStrSame3(&pos, &len, (const GLubyte*)"front_buffer_auto_refresh", 25)) - { - ret = EGLEW_ANDROID_front_buffer_auto_refresh; - continue; - } -#endif -#ifdef EGL_ANDROID_image_native_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_native_buffer", 19)) - { - ret = EGLEW_ANDROID_image_native_buffer; - continue; - } -#endif -#ifdef EGL_ANDROID_native_fence_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"native_fence_sync", 17)) - { - ret = EGLEW_ANDROID_native_fence_sync; - continue; - } -#endif -#ifdef EGL_ANDROID_presentation_time - if (_glewStrSame3(&pos, &len, (const GLubyte*)"presentation_time", 17)) - { - ret = EGLEW_ANDROID_presentation_time; - continue; - } -#endif -#ifdef EGL_ANDROID_recordable - if (_glewStrSame3(&pos, &len, (const GLubyte*)"recordable", 10)) - { - ret = EGLEW_ANDROID_recordable; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANGLE_", 6)) - { -#ifdef EGL_ANGLE_d3d_share_handle_client_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"d3d_share_handle_client_buffer", 30)) - { - ret = EGLEW_ANGLE_d3d_share_handle_client_buffer; - continue; - } -#endif -#ifdef EGL_ANGLE_device_d3d - if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_d3d", 10)) - { - ret = EGLEW_ANGLE_device_d3d; - continue; - } -#endif -#ifdef EGL_ANGLE_query_surface_pointer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_surface_pointer", 21)) - { - ret = EGLEW_ANGLE_query_surface_pointer; - continue; - } -#endif -#ifdef EGL_ANGLE_surface_d3d_texture_2d_share_handle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"surface_d3d_texture_2d_share_handle", 35)) - { - ret = EGLEW_ANGLE_surface_d3d_texture_2d_share_handle; - continue; - } -#endif -#ifdef EGL_ANGLE_window_fixed_size - if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_fixed_size", 17)) - { - ret = EGLEW_ANGLE_window_fixed_size; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARM_", 4)) - { -#ifdef EGL_ARM_implicit_external_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"implicit_external_sync", 22)) - { - ret = EGLEW_ARM_implicit_external_sync; - continue; - } -#endif -#ifdef EGL_ARM_pixmap_multisample_discard - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixmap_multisample_discard", 26)) - { - ret = EGLEW_ARM_pixmap_multisample_discard; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) - { -#ifdef EGL_EXT_buffer_age - if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_age", 10)) - { - ret = EGLEW_EXT_buffer_age; - continue; - } -#endif -#ifdef EGL_EXT_client_extensions - if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_extensions", 17)) - { - ret = EGLEW_EXT_client_extensions; - continue; - } -#endif -#ifdef EGL_EXT_create_context_robustness - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25)) - { - ret = EGLEW_EXT_create_context_robustness; - continue; - } -#endif -#ifdef EGL_EXT_device_base - if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_base", 11)) - { - ret = EGLEW_EXT_device_base; - continue; - } -#endif -#ifdef EGL_EXT_device_drm - if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_drm", 10)) - { - ret = EGLEW_EXT_device_drm; - continue; - } -#endif -#ifdef EGL_EXT_device_enumeration - if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_enumeration", 18)) - { - ret = EGLEW_EXT_device_enumeration; - continue; - } -#endif -#ifdef EGL_EXT_device_openwf - if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_openwf", 13)) - { - ret = EGLEW_EXT_device_openwf; - continue; - } -#endif -#ifdef EGL_EXT_device_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_query", 12)) - { - ret = EGLEW_EXT_device_query; - continue; - } -#endif -#ifdef EGL_EXT_gl_colorspace_bt2020_linear - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_colorspace_bt2020_linear", 27)) - { - ret = EGLEW_EXT_gl_colorspace_bt2020_linear; - continue; - } -#endif -#ifdef EGL_EXT_gl_colorspace_bt2020_pq - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_colorspace_bt2020_pq", 23)) - { - ret = EGLEW_EXT_gl_colorspace_bt2020_pq; - continue; - } -#endif -#ifdef EGL_EXT_gl_colorspace_scrgb_linear - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_colorspace_scrgb_linear", 26)) - { - ret = EGLEW_EXT_gl_colorspace_scrgb_linear; - continue; - } -#endif -#ifdef EGL_EXT_image_dma_buf_import - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_dma_buf_import", 20)) - { - ret = EGLEW_EXT_image_dma_buf_import; - continue; - } -#endif -#ifdef EGL_EXT_image_dma_buf_import_modifiers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_dma_buf_import_modifiers", 30)) - { - ret = EGLEW_EXT_image_dma_buf_import_modifiers; - continue; - } -#endif -#ifdef EGL_EXT_multiview_window - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview_window", 16)) - { - ret = EGLEW_EXT_multiview_window; - continue; - } -#endif -#ifdef EGL_EXT_output_base - if (_glewStrSame3(&pos, &len, (const GLubyte*)"output_base", 11)) - { - ret = EGLEW_EXT_output_base; - continue; - } -#endif -#ifdef EGL_EXT_output_drm - if (_glewStrSame3(&pos, &len, (const GLubyte*)"output_drm", 10)) - { - ret = EGLEW_EXT_output_drm; - continue; - } -#endif -#ifdef EGL_EXT_output_openwf - if (_glewStrSame3(&pos, &len, (const GLubyte*)"output_openwf", 13)) - { - ret = EGLEW_EXT_output_openwf; - continue; - } -#endif -#ifdef EGL_EXT_pixel_format_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) - { - ret = EGLEW_EXT_pixel_format_float; - continue; - } -#endif -#ifdef EGL_EXT_platform_base - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_base", 13)) - { - ret = EGLEW_EXT_platform_base; - continue; - } -#endif -#ifdef EGL_EXT_platform_device - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_device", 15)) - { - ret = EGLEW_EXT_platform_device; - continue; - } -#endif -#ifdef EGL_EXT_platform_wayland - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_wayland", 16)) - { - ret = EGLEW_EXT_platform_wayland; - continue; - } -#endif -#ifdef EGL_EXT_platform_x11 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_x11", 12)) - { - ret = EGLEW_EXT_platform_x11; - continue; - } -#endif -#ifdef EGL_EXT_protected_content - if (_glewStrSame3(&pos, &len, (const GLubyte*)"protected_content", 17)) - { - ret = EGLEW_EXT_protected_content; - continue; - } -#endif -#ifdef EGL_EXT_protected_surface - if (_glewStrSame3(&pos, &len, (const GLubyte*)"protected_surface", 17)) - { - ret = EGLEW_EXT_protected_surface; - continue; - } -#endif -#ifdef EGL_EXT_stream_consumer_egloutput - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_consumer_egloutput", 25)) - { - ret = EGLEW_EXT_stream_consumer_egloutput; - continue; - } -#endif -#ifdef EGL_EXT_surface_SMPTE2086_metadata - if (_glewStrSame3(&pos, &len, (const GLubyte*)"surface_SMPTE2086_metadata", 26)) - { - ret = EGLEW_EXT_surface_SMPTE2086_metadata; - continue; - } -#endif -#ifdef EGL_EXT_swap_buffers_with_damage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_buffers_with_damage", 24)) - { - ret = EGLEW_EXT_swap_buffers_with_damage; - continue; - } -#endif -#ifdef EGL_EXT_yuv_surface - if (_glewStrSame3(&pos, &len, (const GLubyte*)"yuv_surface", 11)) - { - ret = EGLEW_EXT_yuv_surface; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"HI_", 3)) - { -#ifdef EGL_HI_clientpixmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clientpixmap", 12)) - { - ret = EGLEW_HI_clientpixmap; - continue; - } -#endif -#ifdef EGL_HI_colorformats - if (_glewStrSame3(&pos, &len, (const GLubyte*)"colorformats", 12)) - { - ret = EGLEW_HI_colorformats; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"IMG_", 4)) - { -#ifdef EGL_IMG_context_priority - if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_priority", 16)) - { - ret = EGLEW_IMG_context_priority; - continue; - } -#endif -#ifdef EGL_IMG_image_plane_attribs - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_plane_attribs", 19)) - { - ret = EGLEW_IMG_image_plane_attribs; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"KHR_", 4)) - { -#ifdef EGL_KHR_cl_event - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cl_event", 8)) - { - ret = EGLEW_KHR_cl_event; - continue; - } -#endif -#ifdef EGL_KHR_cl_event2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cl_event2", 9)) - { - ret = EGLEW_KHR_cl_event2; - continue; - } -#endif -#ifdef EGL_KHR_client_get_all_proc_addresses - if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_get_all_proc_addresses", 29)) - { - ret = EGLEW_KHR_client_get_all_proc_addresses; - continue; - } -#endif -#ifdef EGL_KHR_config_attribs - if (_glewStrSame3(&pos, &len, (const GLubyte*)"config_attribs", 14)) - { - ret = EGLEW_KHR_config_attribs; - continue; - } -#endif -#ifdef EGL_KHR_context_flush_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) - { - ret = EGLEW_KHR_context_flush_control; - continue; - } -#endif -#ifdef EGL_KHR_create_context - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14)) - { - ret = EGLEW_KHR_create_context; - continue; - } -#endif -#ifdef EGL_KHR_create_context_no_error - if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_no_error", 23)) - { - ret = EGLEW_KHR_create_context_no_error; - continue; - } -#endif -#ifdef EGL_KHR_debug - if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug", 5)) - { - ret = EGLEW_KHR_debug; - continue; - } -#endif -#ifdef EGL_KHR_fence_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence_sync", 10)) - { - ret = EGLEW_KHR_fence_sync; - continue; - } -#endif -#ifdef EGL_KHR_get_all_proc_addresses - if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_all_proc_addresses", 22)) - { - ret = EGLEW_KHR_get_all_proc_addresses; - continue; - } -#endif -#ifdef EGL_KHR_gl_colorspace - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_colorspace", 13)) - { - ret = EGLEW_KHR_gl_colorspace; - continue; - } -#endif -#ifdef EGL_KHR_gl_renderbuffer_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_renderbuffer_image", 21)) - { - ret = EGLEW_KHR_gl_renderbuffer_image; - continue; - } -#endif -#ifdef EGL_KHR_gl_texture_2D_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_texture_2D_image", 19)) - { - ret = EGLEW_KHR_gl_texture_2D_image; - continue; - } -#endif -#ifdef EGL_KHR_gl_texture_3D_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_texture_3D_image", 19)) - { - ret = EGLEW_KHR_gl_texture_3D_image; - continue; - } -#endif -#ifdef EGL_KHR_gl_texture_cubemap_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gl_texture_cubemap_image", 24)) - { - ret = EGLEW_KHR_gl_texture_cubemap_image; - continue; - } -#endif -#ifdef EGL_KHR_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image", 5)) - { - ret = EGLEW_KHR_image; - continue; - } -#endif -#ifdef EGL_KHR_image_base - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_base", 10)) - { - ret = EGLEW_KHR_image_base; - continue; - } -#endif -#ifdef EGL_KHR_image_pixmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_pixmap", 12)) - { - ret = EGLEW_KHR_image_pixmap; - continue; - } -#endif -#ifdef EGL_KHR_lock_surface - if (_glewStrSame3(&pos, &len, (const GLubyte*)"lock_surface", 12)) - { - ret = EGLEW_KHR_lock_surface; - continue; - } -#endif -#ifdef EGL_KHR_lock_surface2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"lock_surface2", 13)) - { - ret = EGLEW_KHR_lock_surface2; - continue; - } -#endif -#ifdef EGL_KHR_lock_surface3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"lock_surface3", 13)) - { - ret = EGLEW_KHR_lock_surface3; - continue; - } -#endif -#ifdef EGL_KHR_mutable_render_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"mutable_render_buffer", 21)) - { - ret = EGLEW_KHR_mutable_render_buffer; - continue; - } -#endif -#ifdef EGL_KHR_no_config_context - if (_glewStrSame3(&pos, &len, (const GLubyte*)"no_config_context", 17)) - { - ret = EGLEW_KHR_no_config_context; - continue; - } -#endif -#ifdef EGL_KHR_partial_update - if (_glewStrSame3(&pos, &len, (const GLubyte*)"partial_update", 14)) - { - ret = EGLEW_KHR_partial_update; - continue; - } -#endif -#ifdef EGL_KHR_platform_android - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_android", 16)) - { - ret = EGLEW_KHR_platform_android; - continue; - } -#endif -#ifdef EGL_KHR_platform_gbm - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_gbm", 12)) - { - ret = EGLEW_KHR_platform_gbm; - continue; - } -#endif -#ifdef EGL_KHR_platform_wayland - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_wayland", 16)) - { - ret = EGLEW_KHR_platform_wayland; - continue; - } -#endif -#ifdef EGL_KHR_platform_x11 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_x11", 12)) - { - ret = EGLEW_KHR_platform_x11; - continue; - } -#endif -#ifdef EGL_KHR_reusable_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"reusable_sync", 13)) - { - ret = EGLEW_KHR_reusable_sync; - continue; - } -#endif -#ifdef EGL_KHR_stream - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream", 6)) - { - ret = EGLEW_KHR_stream; - continue; - } -#endif -#ifdef EGL_KHR_stream_attrib - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_attrib", 13)) - { - ret = EGLEW_KHR_stream_attrib; - continue; - } -#endif -#ifdef EGL_KHR_stream_consumer_gltexture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_consumer_gltexture", 25)) - { - ret = EGLEW_KHR_stream_consumer_gltexture; - continue; - } -#endif -#ifdef EGL_KHR_stream_cross_process_fd - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_process_fd", 23)) - { - ret = EGLEW_KHR_stream_cross_process_fd; - continue; - } -#endif -#ifdef EGL_KHR_stream_fifo - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_fifo", 11)) - { - ret = EGLEW_KHR_stream_fifo; - continue; - } -#endif -#ifdef EGL_KHR_stream_producer_aldatalocator - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_producer_aldatalocator", 29)) - { - ret = EGLEW_KHR_stream_producer_aldatalocator; - continue; - } -#endif -#ifdef EGL_KHR_stream_producer_eglsurface - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_producer_eglsurface", 26)) - { - ret = EGLEW_KHR_stream_producer_eglsurface; - continue; - } -#endif -#ifdef EGL_KHR_surfaceless_context - if (_glewStrSame3(&pos, &len, (const GLubyte*)"surfaceless_context", 19)) - { - ret = EGLEW_KHR_surfaceless_context; - continue; - } -#endif -#ifdef EGL_KHR_swap_buffers_with_damage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_buffers_with_damage", 24)) - { - ret = EGLEW_KHR_swap_buffers_with_damage; - continue; - } -#endif -#ifdef EGL_KHR_vg_parent_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vg_parent_image", 15)) - { - ret = EGLEW_KHR_vg_parent_image; - continue; - } -#endif -#ifdef EGL_KHR_wait_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"wait_sync", 9)) - { - ret = EGLEW_KHR_wait_sync; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) - { -#ifdef EGL_MESA_drm_image - if (_glewStrSame3(&pos, &len, (const GLubyte*)"drm_image", 9)) - { - ret = EGLEW_MESA_drm_image; - continue; - } -#endif -#ifdef EGL_MESA_image_dma_buf_export - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_dma_buf_export", 20)) - { - ret = EGLEW_MESA_image_dma_buf_export; - continue; - } -#endif -#ifdef EGL_MESA_platform_gbm - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_gbm", 12)) - { - ret = EGLEW_MESA_platform_gbm; - continue; - } -#endif -#ifdef EGL_MESA_platform_surfaceless - if (_glewStrSame3(&pos, &len, (const GLubyte*)"platform_surfaceless", 20)) - { - ret = EGLEW_MESA_platform_surfaceless; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"NOK_", 4)) - { -#ifdef EGL_NOK_swap_region - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_region", 11)) - { - ret = EGLEW_NOK_swap_region; - continue; - } -#endif -#ifdef EGL_NOK_swap_region2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_region2", 12)) - { - ret = EGLEW_NOK_swap_region2; - continue; - } -#endif -#ifdef EGL_NOK_texture_from_pixmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_from_pixmap", 19)) - { - ret = EGLEW_NOK_texture_from_pixmap; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) - { -#ifdef EGL_NV_3dvision_surface - if (_glewStrSame3(&pos, &len, (const GLubyte*)"3dvision_surface", 16)) - { - ret = EGLEW_NV_3dvision_surface; - continue; - } -#endif -#ifdef EGL_NV_coverage_sample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"coverage_sample", 15)) - { - ret = EGLEW_NV_coverage_sample; - continue; - } -#endif -#ifdef EGL_NV_coverage_sample_resolve - if (_glewStrSame3(&pos, &len, (const GLubyte*)"coverage_sample_resolve", 23)) - { - ret = EGLEW_NV_coverage_sample_resolve; - continue; - } -#endif -#ifdef EGL_NV_cuda_event - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cuda_event", 10)) - { - ret = EGLEW_NV_cuda_event; - continue; - } -#endif -#ifdef EGL_NV_depth_nonlinear - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_nonlinear", 15)) - { - ret = EGLEW_NV_depth_nonlinear; - continue; - } -#endif -#ifdef EGL_NV_device_cuda - if (_glewStrSame3(&pos, &len, (const GLubyte*)"device_cuda", 11)) - { - ret = EGLEW_NV_device_cuda; - continue; - } -#endif -#ifdef EGL_NV_native_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"native_query", 12)) - { - ret = EGLEW_NV_native_query; - continue; - } -#endif -#ifdef EGL_NV_post_convert_rounding - if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_convert_rounding", 21)) - { - ret = EGLEW_NV_post_convert_rounding; - continue; - } -#endif -#ifdef EGL_NV_post_sub_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_sub_buffer", 15)) - { - ret = EGLEW_NV_post_sub_buffer; - continue; - } -#endif -#ifdef EGL_NV_robustness_video_memory_purge - if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_video_memory_purge", 29)) - { - ret = EGLEW_NV_robustness_video_memory_purge; - continue; - } -#endif -#ifdef EGL_NV_stream_consumer_gltexture_yuv - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_consumer_gltexture_yuv", 29)) - { - ret = EGLEW_NV_stream_consumer_gltexture_yuv; - continue; - } -#endif -#ifdef EGL_NV_stream_cross_display - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_display", 20)) - { - ret = EGLEW_NV_stream_cross_display; - continue; - } -#endif -#ifdef EGL_NV_stream_cross_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_object", 19)) - { - ret = EGLEW_NV_stream_cross_object; - continue; - } -#endif -#ifdef EGL_NV_stream_cross_partition - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_partition", 22)) - { - ret = EGLEW_NV_stream_cross_partition; - continue; - } -#endif -#ifdef EGL_NV_stream_cross_process - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_process", 20)) - { - ret = EGLEW_NV_stream_cross_process; - continue; - } -#endif -#ifdef EGL_NV_stream_cross_system - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_cross_system", 19)) - { - ret = EGLEW_NV_stream_cross_system; - continue; - } -#endif -#ifdef EGL_NV_stream_fifo_next - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_fifo_next", 16)) - { - ret = EGLEW_NV_stream_fifo_next; - continue; - } -#endif -#ifdef EGL_NV_stream_fifo_synchronous - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_fifo_synchronous", 23)) - { - ret = EGLEW_NV_stream_fifo_synchronous; - continue; - } -#endif -#ifdef EGL_NV_stream_frame_limits - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_frame_limits", 19)) - { - ret = EGLEW_NV_stream_frame_limits; - continue; - } -#endif -#ifdef EGL_NV_stream_metadata - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_metadata", 15)) - { - ret = EGLEW_NV_stream_metadata; - continue; - } -#endif -#ifdef EGL_NV_stream_remote - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_remote", 13)) - { - ret = EGLEW_NV_stream_remote; - continue; - } -#endif -#ifdef EGL_NV_stream_reset - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_reset", 12)) - { - ret = EGLEW_NV_stream_reset; - continue; - } -#endif -#ifdef EGL_NV_stream_socket - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_socket", 13)) - { - ret = EGLEW_NV_stream_socket; - continue; - } -#endif -#ifdef EGL_NV_stream_socket_inet - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_socket_inet", 18)) - { - ret = EGLEW_NV_stream_socket_inet; - continue; - } -#endif -#ifdef EGL_NV_stream_socket_unix - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_socket_unix", 18)) - { - ret = EGLEW_NV_stream_socket_unix; - continue; - } -#endif -#ifdef EGL_NV_stream_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stream_sync", 11)) - { - ret = EGLEW_NV_stream_sync; - continue; - } -#endif -#ifdef EGL_NV_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync", 4)) - { - ret = EGLEW_NV_sync; - continue; - } -#endif -#ifdef EGL_NV_system_time - if (_glewStrSame3(&pos, &len, (const GLubyte*)"system_time", 11)) - { - ret = EGLEW_NV_system_time; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"TIZEN_", 6)) - { -#ifdef EGL_TIZEN_image_native_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_native_buffer", 19)) - { - ret = EGLEW_TIZEN_image_native_buffer; - continue; - } -#endif -#ifdef EGL_TIZEN_image_native_surface - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_native_surface", 20)) - { - ret = EGLEW_TIZEN_image_native_surface; - continue; - } -#endif - } - } - ret = (len == 0); - } - return ret; -} - -#endif /* _WIN32 */ diff --git a/src/engine/external/wavpack/VERSION.txt b/src/engine/external/wavpack/VERSION.txt deleted file mode 100644 index df83b62e9e..0000000000 --- a/src/engine/external/wavpack/VERSION.txt +++ /dev/null @@ -1 +0,0 @@ -Tiny Decoder 4.40 diff --git a/src/engine/external/wavpack/arm.S b/src/engine/external/wavpack/arm.S deleted file mode 100644 index 4f2998923b..0000000000 --- a/src/engine/external/wavpack/arm.S +++ /dev/null @@ -1,461 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2006 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -/* This is an assembly optimized version of the following WavPack function: - * - * void decorr_stereo_pass_cont (struct decorr_pass *dpp, - * long *buffer, long sample_count); - * - * It performs a single pass of stereo decorrelation on the provided buffer. - * Note that this version of the function requires that the 8 previous stereo - * samples are visible and correct. In other words, it ignores the "samples_*" - * fields in the decorr_pass structure and gets the history data directly - * from the buffer. It does, however, return the appropriate history samples - * to the decorr_pass structure before returning. - * - * This is written to work on a ARM7TDMI processor. This version only uses the - * 32-bit multiply-accumulate instruction and so will overflow with 24-bit - * WavPack files. - */ - .text - .align - .global decorr_stereo_pass_cont_arm - -/* - * on entry: - * - * r0 = struct decorr_pass *dpp - * r1 = long *buffer - * r2 = long sample_count - */ - -decorr_stereo_pass_cont_arm: - - stmfd sp!, {r4 - r8, r10, r11, lr} - mov r5, r0 @ r5 = dpp - mov r11, #512 @ r11 = 512 for rounding - ldrsh r6, [r0, #2] @ r6 = dpp->delta - ldrsh r4, [r0, #4] @ r4 = dpp->weight_A - ldrsh r0, [r0, #6] @ r0 = dpp->weight_B - cmp r2, #0 @ exit if no samples to process - beq common_exit - - add r7, r1, r2, asl #3 @ r7 = buffer ending position - ldrsh r2, [r5, #0] @ r2 = dpp->term - cmp r2, #0 - bmi minus_term - - ldr lr, [r1, #-16] @ load 2 sample history from buffer - ldr r10, [r1, #-12] @ for terms 2, 17, and 18 - ldr r8, [r1, #-8] - ldr r3, [r1, #-4] - cmp r2, #17 - beq term_17_loop - cmp r2, #18 - beq term_18_loop - cmp r2, #2 - beq term_2_loop - b term_default_loop @ else handle default (1-8, except 2) - -minus_term: - mov r10, #1024 @ r10 = -1024 for weight clipping - rsb r10, r10, #0 @ (only used for negative terms) - cmn r2, #1 - beq term_minus_1 - cmn r2, #2 - beq term_minus_2 - cmn r2, #3 - beq term_minus_3 - b common_exit - -/* - ****************************************************************************** - * Loop to handle term = 17 condition - * - * r0 = dpp->weight_B r8 = previous left sample - * r1 = bptr r9 = - * r2 = current sample r10 = second previous left sample - * r3 = previous right sample r11 = 512 (for rounding) - * r4 = dpp->weight_A ip = current decorrelation value - * r5 = dpp sp = - * r6 = dpp->delta lr = second previous right sample - * r7 = eptr pc = - ******************************************************************************* - */ - -term_17_loop: - rsbs ip, lr, r8, asl #1 @ decorr value = (2 * prev) - 2nd prev - mov lr, r8 @ previous becomes 2nd previous - ldr r2, [r1], #4 @ get sample & update pointer - mla r8, ip, r4, r11 @ mult decorr value by weight, round, - add r8, r2, r8, asr #10 @ shift, and add to new sample - strne r8, [r1, #-4] @ if change possible, store sample back - cmpne r2, #0 - beq .L325 - teq ip, r2 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - -.L325: rsbs ip, r10, r3, asl #1 @ do same thing for right channel - mov r10, r3 - ldr r2, [r1], #4 - mla r3, ip, r0, r11 - add r3, r2, r3, asr #10 - strne r3, [r1, #-4] - cmpne r2, #0 - beq .L329 - teq ip, r2 - submi r0, r0, r6 - addpl r0, r0, r6 - -.L329: cmp r7, r1 @ loop back if more samples to do - bhi term_17_loop - b store_1718 @ common exit for terms 17 & 18 - -/* - ****************************************************************************** - * Loop to handle term = 18 condition - * - * r0 = dpp->weight_B r8 = previous left sample - * r1 = bptr r9 = - * r2 = current sample r10 = second previous left sample - * r3 = previous right sample r11 = 512 (for rounding) - * r4 = dpp->weight_A ip = decorrelation value - * r5 = dpp sp = - * r6 = dpp->delta lr = second previous right sample - * r7 = eptr pc = - ******************************************************************************* - */ - -term_18_loop: - sub ip, r8, lr @ decorr value = - mov lr, r8 @ ((3 * prev) - 2nd prev) >> 1 - adds ip, r8, ip, asr #1 - ldr r2, [r1], #4 @ get sample & update pointer - mla r8, ip, r4, r11 @ mult decorr value by weight, round, - add r8, r2, r8, asr #10 @ shift, and add to new sample - strne r8, [r1, #-4] @ if change possible, store sample back - cmpne r2, #0 - beq .L337 - teq ip, r2 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - -.L337: sub ip, r3, r10 @ do same thing for right channel - mov r10, r3 - adds ip, r3, ip, asr #1 - ldr r2, [r1], #4 - mla r3, ip, r0, r11 - add r3, r2, r3, asr #10 - strne r3, [r1, #-4] - cmpne r2, #0 - beq .L341 - teq ip, r2 - submi r0, r0, r6 - addpl r0, r0, r6 - -.L341: cmp r7, r1 @ loop back if more samples to do - bhi term_18_loop - -/* common exit for terms 17 & 18 */ - -store_1718: - str r3, [r5, #40] @ store sample history into struct - str r8, [r5, #8] - str r10, [r5, #44] - str lr, [r5, #12] - b common_exit @ and return - -/* - ****************************************************************************** - * Loop to handle term = 2 condition - * (note that this case can be handled by the default term handler (1-8), but - * this special case is faster because it doesn't have to read memory twice) - * - * r0 = dpp->weight_B r8 = previous left sample - * r1 = bptr r9 = - * r2 = current sample r10 = second previous left sample - * r3 = previous right sample r11 = 512 (for rounding) - * r4 = dpp->weight_A ip = decorrelation value - * r5 = dpp sp = - * r6 = dpp->delta lr = second previous right sample - * r7 = eptr pc = - ******************************************************************************* - */ - -term_2_loop: - movs ip, lr @ get decorrelation value & test - mov lr, r8 @ previous becomes 2nd previous - ldr r2, [r1], #4 @ get sample & update pointer - mla r8, ip, r4, r11 @ mult decorr value by weight, round, - add r8, r2, r8, asr #10 @ shift, and add to new sample - strne r8, [r1, #-4] @ if change possible, store sample back - cmpne r2, #0 - beq .L225 - teq ip, r2 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - -.L225: movs ip, r10 @ do same thing for right channel - mov r10, r3 - ldr r2, [r1], #4 - mla r3, ip, r0, r11 - add r3, r2, r3, asr #10 - strne r3, [r1, #-4] - cmpne r2, #0 - beq .L229 - teq ip, r2 - submi r0, r0, r6 - addpl r0, r0, r6 - -.L229: cmp r7, r1 @ loop back if more samples to do - bhi term_2_loop - b default_term_exit @ this exit updates all dpp->samples - -/* - ****************************************************************************** - * Loop to handle default term condition - * - * r0 = dpp->weight_B r8 = result accumulator - * r1 = bptr r9 = - * r2 = dpp->term r10 = - * r3 = decorrelation value r11 = 512 (for rounding) - * r4 = dpp->weight_A ip = current sample - * r5 = dpp sp = - * r6 = dpp->delta lr = - * r7 = eptr pc = - ******************************************************************************* - */ - -term_default_loop: - ldr ip, [r1] @ get original sample - ldr r3, [r1, -r2, asl #3] @ get decorrelation value based on term - mla r8, r3, r4, r11 @ mult decorr value by weight, round, - add r8, ip, r8, asr #10 @ shift and add to new sample - str r8, [r1], #4 @ store update sample - cmp r3, #0 - cmpne ip, #0 - beq .L350 - teq ip, r3 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - -.L350: ldr ip, [r1] @ do the same thing for right channel - ldr r3, [r1, -r2, asl #3] - mla r8, r3, r0, r11 - add r8, ip, r8, asr #10 - str r8, [r1], #4 - cmp r3, #0 - cmpne ip, #0 - beq .L354 - teq ip, r3 - submi r0, r0, r6 - addpl r0, r0, r6 - -.L354: cmp r7, r1 @ loop back if more samples to do - bhi term_default_loop - -/* - * This exit is used by terms 1-8 to store the previous 8 samples into the decorr - * structure (even if they are not all used for the given term) - */ - -default_term_exit: - ldrsh r3, [r5, #0] - sub ip, r3, #1 - mov lr, #7 - -.L358: and r3, ip, #7 - add r3, r5, r3, asl #2 - ldr r2, [r1, #-4] - str r2, [r3, #40] - ldr r2, [r1, #-8]! - str r2, [r3, #8] - sub ip, ip, #1 - sub lr, lr, #1 - cmn lr, #1 - bne .L358 - b common_exit - -/* - ****************************************************************************** - * Loop to handle term = -1 condition - * - * r0 = dpp->weight_B r8 = - * r1 = bptr r9 = - * r2 = intermediate result r10 = -1024 (for clipping) - * r3 = previous right sample r11 = 512 (for rounding) - * r4 = dpp->weight_A ip = current sample - * r5 = dpp sp = - * r6 = dpp->delta lr = updated left sample - * r7 = eptr pc = - ******************************************************************************* - */ - -term_minus_1: - ldr r3, [r1, #-4] - -term_minus_1_loop: - ldr ip, [r1] @ for left channel the decorrelation value - mla r2, r3, r4, r11 @ is the previous right sample (in r3) - add lr, ip, r2, asr #10 - str lr, [r1], #8 - cmp r3, #0 - cmpne ip, #0 - beq .L361 - teq ip, r3 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - cmp r4, #1024 - movgt r4, #1024 - cmp r4, r10 - movlt r4, r10 - -.L361: ldr r2, [r1, #-4] @ for right channel the decorrelation value - mla r3, lr, r0, r11 @ is the just updated right sample (in lr) - add r3, r2, r3, asr #10 - str r3, [r1, #-4] - cmp lr, #0 - cmpne r2, #0 - beq .L369 - teq r2, lr - submi r0, r0, r6 - addpl r0, r0, r6 - cmp r0, #1024 @ then clip weight to +/-1024 - movgt r0, #1024 - cmp r0, r10 - movlt r0, r10 - -.L369: cmp r7, r1 @ loop back if more samples to do - bhi term_minus_1_loop - - str r3, [r5, #8] @ else store right sample and exit - b common_exit - -/* - ****************************************************************************** - * Loop to handle term = -2 condition - * (note that the channels are processed in the reverse order here) - * - * r0 = dpp->weight_B r8 = - * r1 = bptr r9 = - * r2 = intermediate result r10 = -1024 (for clipping) - * r3 = previous left sample r11 = 512 (for rounding) - * r4 = dpp->weight_A ip = current sample - * r5 = dpp sp = - * r6 = dpp->delta lr = updated right sample - * r7 = eptr pc = - ******************************************************************************* - */ - -term_minus_2: - ldr r3, [r1, #-8] - -term_minus_2_loop: - ldr ip, [r1, #4] @ for right channel the decorrelation value - mla r2, r3, r0, r11 @ is the previous left sample (in r3) - add lr, ip, r2, asr #10 - str lr, [r1, #4] - cmp r3, #0 - cmpne ip, #0 - beq .L380 - teq ip, r3 @ update weight based on signs - submi r0, r0, r6 - addpl r0, r0, r6 - cmp r0, #1024 @ then clip weight to +/-1024 - movgt r0, #1024 - cmp r0, r10 - movlt r0, r10 - -.L380: ldr r2, [r1, #0] @ for left channel the decorrelation value - mla r3, lr, r4, r11 @ is the just updated left sample (in lr) - add r3, r2, r3, asr #10 - str r3, [r1], #8 - cmp lr, #0 - cmpne r2, #0 - beq .L388 - teq r2, lr - submi r4, r4, r6 - addpl r4, r4, r6 - cmp r4, #1024 - movgt r4, #1024 - cmp r4, r10 - movlt r4, r10 - -.L388: cmp r7, r1 @ loop back if more samples to do - bhi term_minus_2_loop - - str r3, [r5, #40] @ else store left channel and exit - b common_exit - -/* - ****************************************************************************** - * Loop to handle term = -3 condition - * - * r0 = dpp->weight_B r8 = previous left sample - * r1 = bptr r9 = - * r2 = current left sample r10 = -1024 (for clipping) - * r3 = previous right sample r11 = 512 (for rounding) - * r4 = dpp->weight_A ip = intermediate result - * r5 = dpp sp = - * r6 = dpp->delta lr = - * r7 = eptr pc = - ******************************************************************************* - */ - -term_minus_3: - ldr r3, [r1, #-4] @ load previous samples - ldr r8, [r1, #-8] - -term_minus_3_loop: - ldr ip, [r1] - mla r2, r3, r4, r11 - add r2, ip, r2, asr #10 - str r2, [r1], #4 - cmp r3, #0 - cmpne ip, #0 - beq .L399 - teq ip, r3 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - cmp r4, #1024 @ then clip weight to +/-1024 - movgt r4, #1024 - cmp r4, r10 - movlt r4, r10 - -.L399: movs ip, r8 @ ip = previous left we use now - mov r8, r2 @ r8 = current left we use next time - ldr r2, [r1], #4 - mla r3, ip, r0, r11 - add r3, r2, r3, asr #10 - strne r3, [r1, #-4] - cmpne r2, #0 - beq .L407 - teq ip, r2 - submi r0, r0, r6 - addpl r0, r0, r6 - cmp r0, #1024 - movgt r0, #1024 - cmp r0, r10 - movlt r0, r10 - -.L407: cmp r7, r1 @ loop back if more samples to do - bhi term_minus_3_loop - - str r3, [r5, #8] @ else store previous samples & exit - str r8, [r5, #40] - -/* - * Before finally exiting we must store weights back for next time - */ - -common_exit: - strh r4, [r5, #4] - strh r0, [r5, #6] - ldmfd sp!, {r4 - r8, r10, r11, pc} - diff --git a/src/engine/external/wavpack/arml.S b/src/engine/external/wavpack/arml.S deleted file mode 100644 index 7da0051397..0000000000 --- a/src/engine/external/wavpack/arml.S +++ /dev/null @@ -1,491 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2006 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -/* This is an assembly optimized version of the following WavPack function: - * - * void decorr_stereo_pass_cont (struct decorr_pass *dpp, - * long *buffer, long sample_count); - * - * It performs a single pass of stereo decorrelation on the provided buffer. - * Note that this version of the function requires that the 8 previous stereo - * samples are visible and correct. In other words, it ignores the "samples_*" - * fields in the decorr_pass structure and gets the history data directly - * from the buffer. It does, however, return the appropriate history samples - * to the decorr_pass structure before returning. - * - * This is written to work on a ARM7TDMI processor. This version uses the - * 64-bit multiply-accumulate instruction and so can be used with all - * WavPack files. However, for optimum performance with 16-bit WavPack - * files, there is a faster version that only uses the 32-bit MLA - * instruction. - */ - - .text - .align - .global decorr_stereo_pass_cont_arml - -/* - * on entry: - * - * r0 = struct decorr_pass *dpp - * r1 = long *buffer - * r2 = long sample_count - */ - -decorr_stereo_pass_cont_arml: - - stmfd sp!, {r4 - r8, r10, r11, lr} - mov r5, r0 @ r5 = dpp - mov r11, #512 @ r11 = 512 for rounding - ldrsh r6, [r0, #2] @ r6 = dpp->delta - ldrsh r4, [r0, #4] @ r4 = dpp->weight_A - ldrsh r0, [r0, #6] @ r0 = dpp->weight_B - cmp r2, #0 @ exit if no samples to process - beq common_exit - - mov r0, r0, asl #18 @ for 64-bit math we use weights << 18 - mov r4, r4, asl #18 - mov r6, r6, asl #18 - add r7, r1, r2, asl #3 @ r7 = buffer ending position - ldrsh r2, [r5, #0] @ r2 = dpp->term - cmp r2, #0 - blt minus_term - - ldr lr, [r1, #-16] @ load 2 sample history from buffer - ldr r10, [r1, #-12] @ for terms 2, 17, and 18 - ldr r8, [r1, #-8] - ldr r3, [r1, #-4] - - cmp r2, #18 - beq term_18_loop - mov lr, lr, asl #4 - mov r10, r10, asl #4 - cmp r2, #2 - beq term_2_loop - cmp r2, #17 - beq term_17_loop - b term_default_loop - -minus_term: - mov r10, #(1024 << 18) @ r10 = -1024 << 18 for weight clipping - rsb r10, r10, #0 @ (only used for negative terms) - cmn r2, #1 - beq term_minus_1 - cmn r2, #2 - beq term_minus_2 - cmn r2, #3 - beq term_minus_3 - b common_exit - -/* - ****************************************************************************** - * Loop to handle term = 17 condition - * - * r0 = dpp->weight_B r8 = previous left sample - * r1 = bptr r9 = - * r2 = current sample r10 = second previous left sample << 4 - * r3 = previous right sample r11 = lo accumulator (for rounding) - * r4 = dpp->weight_A ip = current decorrelation value - * r5 = dpp sp = - * r6 = dpp->delta lr = second previous right sample << 4 - * r7 = eptr pc = - ******************************************************************************* - */ - -term_17_loop: - rsbs ip, lr, r8, asl #5 @ decorr value = (2 * prev) - 2nd prev - mov lr, r8, asl #4 @ previous becomes 2nd previous - ldr r2, [r1], #4 @ get sample & update pointer - mov r11, #0x80000000 - mov r8, r2 - smlalne r11, r8, r4, ip - strne r8, [r1, #-4] @ if change possible, store sample back - cmpne r2, #0 - beq .L325 - teq ip, r2 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - -.L325: rsbs ip, r10, r3, asl #5 @ do same thing for right channel - mov r10, r3, asl #4 - ldr r2, [r1], #4 - mov r11, #0x80000000 - mov r3, r2 - smlalne r11, r3, r0, ip - strne r3, [r1, #-4] - cmpne r2, #0 - beq .L329 - teq ip, r2 - submi r0, r0, r6 - addpl r0, r0, r6 - -.L329: cmp r7, r1 @ loop back if more samples to do - bhi term_17_loop - mov lr, lr, asr #4 - mov r10, r10, asr #4 - b store_1718 @ common exit for terms 17 & 18 - -/* - ****************************************************************************** - * Loop to handle term = 18 condition - * - * r0 = dpp->weight_B r8 = previous left sample - * r1 = bptr r9 = - * r2 = current sample r10 = second previous left sample - * r3 = previous right sample r11 = lo accumulator (for rounding) - * r4 = dpp->weight_A ip = decorrelation value - * r5 = dpp sp = - * r6 = dpp->delta lr = second previous right sample - * r7 = eptr pc = - ******************************************************************************* - */ - -term_18_loop: - rsb ip, lr, r8 @ decorr value = - mov lr, r8 @ ((3 * prev) - 2nd prev) >> 1 - add ip, lr, ip, asr #1 - movs ip, ip, asl #4 - ldr r2, [r1], #4 @ get sample & update pointer - mov r11, #0x80000000 - mov r8, r2 - smlalne r11, r8, r4, ip - strne r8, [r1, #-4] @ if change possible, store sample back - cmpne r2, #0 - beq .L337 - teq ip, r2 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - -.L337: rsb ip, r10, r3 @ do same thing for right channel - mov r10, r3 - add ip, r10, ip, asr #1 - movs ip, ip, asl #4 - ldr r2, [r1], #4 - mov r11, #0x80000000 - mov r3, r2 - smlalne r11, r3, r0, ip - strne r3, [r1, #-4] - cmpne r2, #0 - beq .L341 - teq ip, r2 - submi r0, r0, r6 - addpl r0, r0, r6 - -.L341: cmp r7, r1 @ loop back if more samples to do - bhi term_18_loop - -/* common exit for terms 17 & 18 */ - -store_1718: - str r3, [r5, #40] @ store sample history into struct - str r8, [r5, #8] - str r10, [r5, #44] - str lr, [r5, #12] - b common_exit @ and return - -/* - ****************************************************************************** - * Loop to handle term = 2 condition - * (note that this case can be handled by the default term handler (1-8), but - * this special case is faster because it doesn't have to read memory twice) - * - * r0 = dpp->weight_B r8 = previous left sample - * r1 = bptr r9 = - * r2 = current sample r10 = second previous left sample << 4 - * r3 = previous right sample r11 = lo accumulator (for rounding) - * r4 = dpp->weight_A ip = decorrelation value - * r5 = dpp sp = - * r6 = dpp->delta lr = second previous right sample << 4 - * r7 = eptr pc = - ******************************************************************************* - */ - -term_2_loop: - movs ip, lr @ get decorrelation value & test - ldr r2, [r1], #4 @ get sample & update pointer - mov lr, r8, asl #4 @ previous becomes 2nd previous - mov r11, #0x80000000 - mov r8, r2 - smlalne r11, r8, r4, ip - strne r8, [r1, #-4] @ if change possible, store sample back - cmpne r2, #0 - beq .L225 - teq ip, r2 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - -.L225: movs ip, r10 @ do same thing for right channel - ldr r2, [r1], #4 - mov r10, r3, asl #4 - mov r11, #0x80000000 - mov r3, r2 - smlalne r11, r3, r0, ip - strne r3, [r1, #-4] - cmpne r2, #0 - beq .L229 - teq ip, r2 - submi r0, r0, r6 - addpl r0, r0, r6 - -.L229: cmp r7, r1 @ loop back if more samples to do - bhi term_2_loop - - b default_term_exit @ this exit updates all dpp->samples - -/* - ****************************************************************************** - * Loop to handle default term condition - * - * r0 = dpp->weight_B r8 = result accumulator - * r1 = bptr r9 = - * r2 = dpp->term r10 = - * r3 = decorrelation value r11 = lo accumulator (for rounding) - * r4 = dpp->weight_A ip = current sample - * r5 = dpp sp = - * r6 = dpp->delta lr = - * r7 = eptr pc = - ******************************************************************************* - */ - -term_default_loop: - ldr r3, [r1, -r2, asl #3] @ get decorrelation value based on term - ldr ip, [r1], #4 @ get original sample and bump ptr - movs r3, r3, asl #4 - mov r11, #0x80000000 - mov r8, ip - smlalne r11, r8, r4, r3 - strne r8, [r1, #-4] @ if possibly changed, store updated sample - cmpne ip, #0 - beq .L350 - teq ip, r3 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - -.L350: ldr r3, [r1, -r2, asl #3] @ do the same thing for right channel - ldr ip, [r1], #4 - movs r3, r3, asl #4 - mov r11, #0x80000000 - mov r8, ip - smlalne r11, r8, r0, r3 - strne r8, [r1, #-4] - cmpne ip, #0 - beq .L354 - teq ip, r3 - submi r0, r0, r6 - addpl r0, r0, r6 - -.L354: cmp r7, r1 @ loop back if more samples to do - bhi term_default_loop - -/* - * This exit is used by terms 1-8 to store the previous 8 samples into the decorr - * structure (even if they are not all used for the given term) - */ - -default_term_exit: - ldrsh r3, [r5, #0] - sub ip, r3, #1 - mov lr, #7 - -.L358: and r3, ip, #7 - add r3, r5, r3, asl #2 - ldr r2, [r1, #-4] - str r2, [r3, #40] - ldr r2, [r1, #-8]! - str r2, [r3, #8] - sub ip, ip, #1 - sub lr, lr, #1 - cmn lr, #1 - bne .L358 - b common_exit - -/* - ****************************************************************************** - * Loop to handle term = -1 condition - * - * r0 = dpp->weight_B r8 = - * r1 = bptr r9 = - * r2 = intermediate result r10 = -1024 (for clipping) - * r3 = previous right sample r11 = lo accumulator (for rounding) - * r4 = dpp->weight_A ip = current sample - * r5 = dpp sp = - * r6 = dpp->delta lr = updated left sample - * r7 = eptr pc = - ******************************************************************************* - */ - -term_minus_1: - ldr r3, [r1, #-4] - -term_minus_1_loop: - ldr ip, [r1], #8 @ for left channel the decorrelation value - movs r3, r3, asl #4 @ is the previous right sample (in r3) - mov r11, #0x80000000 - mov lr, ip - smlalne r11, lr, r4, r3 - strne lr, [r1, #-8] - cmpne ip, #0 - beq .L361 - teq ip, r3 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - cmp r4, #(1024 << 18) - movgt r4, #(1024 << 18) - cmp r4, r10 - movlt r4, r10 - -.L361: ldr r2, [r1, #-4] @ for right channel the decorrelation value - movs lr, lr, asl #4 - mov r11, #0x80000000 - mov r3, r2 - smlalne r11, r3, r0, lr - strne r3, [r1, #-4] - cmpne r2, #0 - beq .L369 - teq r2, lr - submi r0, r0, r6 - addpl r0, r0, r6 - cmp r0, #(1024 << 18) @ then clip weight to +/-1024 - movgt r0, #(1024 << 18) - cmp r0, r10 - movlt r0, r10 - -.L369: cmp r7, r1 @ loop back if more samples to do - bhi term_minus_1_loop - - str r3, [r5, #8] @ else store right sample and exit - b common_exit - -/* - ****************************************************************************** - * Loop to handle term = -2 condition - * (note that the channels are processed in the reverse order here) - * - * r0 = dpp->weight_B r8 = - * r1 = bptr r9 = - * r2 = intermediate result r10 = -1024 (for clipping) - * r3 = previous left sample r11 = lo accumulator (for rounding) - * r4 = dpp->weight_A ip = current sample - * r5 = dpp sp = - * r6 = dpp->delta lr = updated right sample - * r7 = eptr pc = - ******************************************************************************* - */ - -term_minus_2: - ldr r3, [r1, #-8] - -term_minus_2_loop: - ldr ip, [r1, #4] @ for right channel the decorrelation value - movs r3, r3, asl #4 @ is the previous left sample (in r3) - mov r11, #0x80000000 - mov lr, ip - smlalne r11, lr, r0, r3 - strne lr, [r1, #4] - cmpne ip, #0 - beq .L380 - teq ip, r3 @ update weight based on signs - submi r0, r0, r6 - addpl r0, r0, r6 - cmp r0, #(1024 << 18) @ then clip weight to +/-1024 - movgt r0, #(1024 << 18) - cmp r0, r10 - movlt r0, r10 - -.L380: ldr r2, [r1], #8 @ for left channel the decorrelation value - movs lr, lr, asl #4 - mov r11, #0x80000000 - mov r3, r2 - smlalne r11, r3, r4, lr - strne r3, [r1, #-8] - cmpne r2, #0 - beq .L388 - teq r2, lr - submi r4, r4, r6 - addpl r4, r4, r6 - cmp r4, #(1024 << 18) - movgt r4, #(1024 << 18) - cmp r4, r10 - movlt r4, r10 - -.L388: cmp r7, r1 @ loop back if more samples to do - bhi term_minus_2_loop - - str r3, [r5, #40] @ else store left channel and exit - b common_exit - -/* - ****************************************************************************** - * Loop to handle term = -3 condition - * - * r0 = dpp->weight_B r8 = previous left sample - * r1 = bptr r9 = - * r2 = current left sample r10 = -1024 (for clipping) - * r3 = previous right sample r11 = lo accumulator (for rounding) - * r4 = dpp->weight_A ip = intermediate result - * r5 = dpp sp = - * r6 = dpp->delta lr = - * r7 = eptr pc = - ******************************************************************************* - */ - -term_minus_3: - ldr r3, [r1, #-4] @ load previous samples - ldr r8, [r1, #-8] - -term_minus_3_loop: - ldr ip, [r1], #4 - movs r3, r3, asl #4 - mov r11, #0x80000000 - mov r2, ip - smlalne r11, r2, r4, r3 - strne r2, [r1, #-4] - cmpne ip, #0 - beq .L399 - teq ip, r3 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - cmp r4, #(1024 << 18) @ then clip weight to +/-1024 - movgt r4, #(1024 << 18) - cmp r4, r10 - movlt r4, r10 - -.L399: movs ip, r8, asl #4 @ ip = previous left we use now - mov r8, r2 @ r8 = current left we use next time - ldr r2, [r1], #4 - mov r11, #0x80000000 - mov r3, r2 - smlalne r11, r3, r0, ip - strne r3, [r1, #-4] - cmpne r2, #0 - beq .L407 - teq ip, r2 - submi r0, r0, r6 - addpl r0, r0, r6 - cmp r0, #(1024 << 18) - movgt r0, #(1024 << 18) - cmp r0, r10 - movlt r0, r10 - -.L407: cmp r7, r1 @ loop back if more samples to do - bhi term_minus_3_loop - - str r3, [r5, #8] @ else store previous samples & exit - str r8, [r5, #40] - -/* - * Before finally exiting we must store weights back for next time - */ - -common_exit: - mov r0, r0, asr #18 @ restore weights to real magnitude - mov r4, r4, asr #18 - strh r4, [r5, #4] - strh r0, [r5, #6] - ldmfd sp!, {r4 - r8, r10, r11, pc} - diff --git a/src/engine/external/wavpack/bits.c b/src/engine/external/wavpack/bits.c deleted file mode 100644 index b4f03385e9..0000000000 --- a/src/engine/external/wavpack/bits.c +++ /dev/null @@ -1,140 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2006 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// bits.c - -// This module provides utilities to support the BitStream structure which is -// used to read and write all WavPack audio data streams. It also contains a -// wrapper for the stream I/O functions and a set of functions dealing with -// endian-ness, both for enhancing portability. Finally, a debug wrapper for -// the malloc() system is provided. - -#include "wavpack.h" - -#include -#include - -////////////////////////// Bitstream functions //////////////////////////////// - -// Open the specified BitStream and associate with the specified buffer. - -static void bs_read (Bitstream *bs); - -void bs_open_read (Bitstream *bs, uchar *buffer_start, uchar *buffer_end, read_stream file, uint32_t file_bytes) -{ - CLEAR (*bs); - bs->buf = buffer_start; - bs->end = buffer_end; - - if (file) { - bs->ptr = bs->end - 1; - bs->file_bytes = file_bytes; - bs->file = file; - } - else - bs->ptr = bs->buf - 1; - - bs->wrap = bs_read; -} - -// This function is only called from the getbit() and getbits() macros when -// the BitStream has been exhausted and more data is required. Sinve these -// bistreams no longer access files, this function simple sets an error and -// resets the buffer. - -static void bs_read (Bitstream *bs) -{ - if (bs->file && bs->file_bytes) { - uint32_t bytes_read, bytes_to_read = bs->end - bs->buf; - - if (bytes_to_read > bs->file_bytes) - bytes_to_read = bs->file_bytes; - - bytes_read = bs->file (bs->buf, bytes_to_read); - - if (bytes_read) { - bs->end = bs->buf + bytes_read; - bs->file_bytes -= bytes_read; - } - else { - memset (bs->buf, -1, bs->end - bs->buf); - bs->error = 1; - } - } - else - bs->error = 1; - - if (bs->error) - memset (bs->buf, -1, bs->end - bs->buf); - - bs->ptr = bs->buf; -} - -/////////////////////// Endian Correction Routines //////////////////////////// - -void little_endian_to_native (void *data, char *format) -{ - uchar *cp = (uchar *) data; - int32_t temp; - - while (*format) { - switch (*format) { - case 'L': - temp = cp [0] + ((int32_t) cp [1] << 8) + ((int32_t) cp [2] << 16) + ((int32_t) cp [3] << 24); - * (int32_t *) cp = temp; - cp += 4; - break; - - case 'S': - temp = cp [0] + (cp [1] << 8); - * (short *) cp = (short) temp; - cp += 2; - break; - - default: - if (isdigit (*format)) - cp += *format - '0'; - - break; - } - - format++; - } -} - -void native_to_little_endian (void *data, char *format) -{ - uchar *cp = (uchar *) data; - int32_t temp; - - while (*format) { - switch (*format) { - case 'L': - temp = * (int32_t *) cp; - *cp++ = (uchar) temp; - *cp++ = (uchar) (temp >> 8); - *cp++ = (uchar) (temp >> 16); - *cp++ = (uchar) (temp >> 24); - break; - - case 'S': - temp = * (short *) cp; - *cp++ = (uchar) temp; - *cp++ = (uchar) (temp >> 8); - break; - - default: - if (isdigit (*format)) - cp += *format - '0'; - - break; - } - - format++; - } -} diff --git a/src/engine/external/wavpack/coldfire.S b/src/engine/external/wavpack/coldfire.S deleted file mode 100644 index 83530900cf..0000000000 --- a/src/engine/external/wavpack/coldfire.S +++ /dev/null @@ -1,525 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2006 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -/* This is an assembly optimized version of the following WavPack function: - * - * void decorr_stereo_pass_cont (struct decorr_pass *dpp, - * long *buffer, long sample_count); - * - * It performs a single pass of stereo decorrelation on the provided buffer. - * Note that this version of the function requires that the 8 previous stereo - * samples are visible and correct. In other words, it ignores the "samples_*" - * fields in the decorr_pass structure and gets the history data directly - * from the buffer. It does, however, return the appropriate history samples - * to the decorr_pass structure before returning. - * - * This is written to work on a MCF5249 processor, or any processor based on - * the ColdFire V2 core with an EMAC unit. The EMAC is perfectly suited for - * the "apply_weight" function of WavPack decorrelation because it provides - * the requires 40-bit product. The fractional rounding mode of the EMAC is not - * configurable and uses "round to even" while WavPack uses "round to larger", - * so the rounding has to be done manually. - */ - - .text - .align 2 - .global decorr_stereo_pass_cont_mcf5249 - -decorr_stereo_pass_cont_mcf5249: - - lea (-44, %sp), %sp - movem.l %d2-%d7/%a2-%a6, (%sp) - move.l 44+4(%sp), %a2 | a2 = dpp-> - move.l 44+8(%sp), %a1 | a1 = bptr - move.w 2(%a2), %a3 | a3 = dpp->delta - move.w 4(%a2), %d3 | d3 = dpp->weight_A (sign extended) - ext.l %d3 - move.w 6(%a2), %d4 | d4 = dpp->weight_B (sign extended) - ext.l %d4 - move.l 44+12(%sp), %d0 | d0 = sample_count - jbeq return_only | if zero, nothing to do - - lsl.l #3, %d0 | d5 = bptr + (sample_count * 8) - move.l %d0, %d5 - add.l %a1, %d5 - - moveq.l #17, %d0 | left shift weights & delta 17 places - asl.l %d0, %d3 - asl.l %d0, %d4 - move.l %a3, %d1 - asl.l %d0, %d1 - move.l %d1, %a3 - - moveq.l #0x20, %d6 - move.l %d6, %macsr | set fractional mode for MAC - move.l #0, %acc1 | acc1 = 0x00 0000 80 (for rounding) - move.l #0x800000, %accext01 - - move.l #1024<<17, %d6 | d6 & d7 are weight clipping limits - move.l #-1024<<17, %d7 | (only used by negative terms) - - move.w (%a2), %d0 | d0 = term - ext.l %d0 - cmp.l #17, %d0 - jbeq term_17 | term = 17 - cmp.l #18, %d0 - jbeq term_18 | term = 18 - addq.l #1, %d0 - jbeq term_minus_1 | term = -1 - addq.l #1, %d0 - jbeq term_minus_2 | term = -2 - addq.l #1, %d0 - jbeq term_minus_3 | term = -3 - jbra term_default | default term = 1 - 8 - -|------------------------------------------------------------------------------ -| Loop to handle term = 17 condition -| -| a0 = d0 = (2 * bptr [-1]) - bptr [-2] -| a1 = bptr d1 = initial bptr [0] -| a2 = dpp-> d2 = updated bptr [0] -| a3 = dpp->delta << 17 d3 = dpp->weight_A << 17 -| a4 = d4 = dpp->weight_B << 17 -| a5 = d5 = eptr -| macsr = 0x20 acc1 = 0x00 0000 80 -|------------------------------------------------------------------------------ - -term_17: - move.l -8(%a1), %d0 | d0 = 2 * bptr [-1] - bptr [-2] - add.l %d0, %d0 - sub.l -16(%a1), %d0 - beq .L251 | if zero, skip calculation - move.l %acc1, %acc0 - asl.l #4, %d0 | acc0 = acc1 + (d0 << 4) * weight_A - mac.l %d0, %d3, %acc0 - move.l (%a1), %d1 - beq .L255 - eor.l %d1, %d0 | else compare signs - bge .L256 | if same, add delta to weight - sub.l %a3, %d3 | else subtract delta from weight - sub.l %a3, %d3 | subtract again instead of branch -.L256: add.l %a3, %d3 | add delta to weight - -.L255: move.l %acc0, %d2 | d2 = rounded product - add.l %d1, %d2 | update bptr [0] and store - move.l %d2, (%a1)+ - -.L253: move.l -8(%a1), %d0 | d0 = 2 * bptr [-1] - bptr [-2] - add.l %d0, %d0 - sub.l -16(%a1), %d0 - beq .L257 | if zero, skip calculations - move.l %acc1, %acc0 - asl.l #4, %d0 | acc0 = acc1 + (d0 << 4) * weight_B - mac.l %d0, %d4, %acc0 - move.l (%a1), %d1 - beq .L254 - eor.l %d1, %d0 | else compare signs - bge .L259 | if same, add delta to weight - sub.l %a3, %d4 | else subtract delta from weight - sub.l %a3, %d4 | subtract again instead of branch -.L259: add.l %a3, %d4 | add delta to weight - -.L254: move.l %acc0, %d2 | d2 = rounded product - add.l %d1, %d2 | update bptr [0] and store - move.l %d2, (%a1)+ - -.L252: cmp.l %a1, %d5 | loop if bptr < eptr - jbhi term_17 - bra term_17_18_finish | exit through common path - -.L251: addq.l #4, %a1 | update point and jump back into loop - bra .L253 - -.L257: addq.l #4, %a1 | update point and jump back into loop - bra .L252 - -|------------------------------------------------------------------------------ -| Loop to handle term = 18 condition -| -| a0 = d0 = ((3 * bptr [-1]) - bptr [-2]) >> 1 -| a1 = bptr d1 = initial bptr [0] -| a2 = dpp-> d2 = updated bptr [0] -| a3 = dpp->delta << 17 d3 = dpp->weight_A << 17 -| a4 = d4 = dpp->weight_B << 17 -| a5 = d5 = eptr -| macsr = 0x20 acc1 = 0x00 0000 80 -|------------------------------------------------------------------------------ - -term_18: - move.l -8(%a1), %a0 | d0 = (3 * bptr [-1] - bptr [-2]) >> 1 - lea (%a0,%a0.l*2), %a0 - move.l %a0, %d0 - sub.l -16(%a1), %d0 - asr.l #1, %d0 - beq .L260 - move.l %acc1, %acc0 - asl.l #4, %d0 | acc0 = acc1 + (d0 << 4) * weight_A - mac.l %d0, %d3, %acc0 - move.l (%a1), %d1 - beq .L266 - eor.l %d1, %d0 | else compare signs - bge .L267 | if same, add delta to weight - sub.l %a3, %d3 | else subtract delta from weight - sub.l %a3, %d3 | subtract again instead of branch -.L267: add.l %a3, %d3 | add delta to weight - -.L266: move.l %acc0, %d2 | d2 = rounded product - add.l %d1, %d2 | add applied weight to bptr [0], store - move.l %d2, (%a1)+ - -.L268: move.l -8(%a1), %a0 | d0 = (3 * bptr [-1] - bptr [-2]) >> 1 - lea (%a0,%a0.l*2), %a0 - move.l %a0, %d0 - sub.l -16(%a1), %d0 - asr.l #1, %d0 - beq .L261 - move.l %acc1, %acc0 - asl.l #4, %d0 | acc0 = acc1 + (d0 << 4) * weight_B - mac.l %d0, %d4, %acc0 - move.l (%a1), %d1 - beq .L265 - eor.l %d1, %d0 | else compare signs - bge .L270 | if same, add delta to weight - sub.l %a3, %d4 | else subtract delta from weight - sub.l %a3, %d4 | subtract again instead of branch -.L270: add.l %a3, %d4 | add delta to weight - -.L265: move.l %acc0, %d2 | d2 = rounded product - add.l %d1, %d2 | add applied weight to bptr [0], store - move.l %d2, (%a1)+ - -.L269: cmp.l %a1, %d5 | loop if bptr < eptr - jbhi term_18 - bra term_17_18_finish | exit through common path - -.L260: addq.l #4, %a1 | bump pointer and jump back into loop - bra .L268 - -.L261: addq.l #4, %a1 | bump pointer and jump back into loop - bra .L269 - -term_17_18_finish: - move.l -4(%a1), 40(%a2) | restore dpp->samples_A [0-1], B [0-1] - move.l -8(%a1), 8(%a2) - move.l -12(%a1), 44(%a2) - move.l -16(%a1), 12(%a2) - jbra finish_up - -|------------------------------------------------------------------------------ -| Loop to handle default terms (i.e. 1 - 8) -| -| a0 = tptr d0 = tptr [0] -| a1 = bptr d1 = initial bptr [0] -| a2 = dpp-> d2 = updated bptr [0] -| a3 = dpp->delta << 17 d3 = dpp->weight_A << 17 -| a4 = d4 = dpp->weight_B << 17 -| a5 = d5 = eptr -| macsr = 0x20 acc1 = 0x00 0000 80 -|------------------------------------------------------------------------------ - -term_default: - move.w (%a2), %d0 | a0 = a1 - (dpp->term * 8) - ext.l %d0 - lsl.l #3, %d0 - move.l %a1, %a0 - sub.l %d0, %a0 - -term_default_loop: - move.l (%a0)+, %d0 | d0 = tptr [0], skip ahead if zero - beq .L271 - move.l %acc1, %acc0 - asl.l #4, %d0 | acc0 = acc1 + (d0 << 4) * weight_A - mac.l %d0, %d3, %acc0 - move.l (%a1), %d1 - beq .L277 - eor.l %d1, %d0 | else compare signs - bge .L278 | if same, add delta to weight - sub.l %a3, %d3 | else subtract delta from weight - sub.l %a3, %d3 | subtract again instead of branch -.L278: add.l %a3, %d3 | add delta to weight - -.L277: move.l %acc0, %d2 | d2 = rounded product - add.l %d1, %d2 | add applied weight to bptr [0], store - move.l %d2, (%a1)+ - -.L275: move.l (%a0)+, %d0 | d0 = tptr [0], skip ahead if zero - beq .L272 - move.l %acc1, %acc0 - asl.l #4, %d0 | acc0 = acc1 + (d0 << 4) * weight_B - mac.l %d0, %d4, %acc0 - move.l (%a1), %d1 - beq .L276 - eor.l %d1, %d0 | else compare signs - bge .L281 | if same, add delta to weight - sub.l %a3, %d4 | else subtract delta from weight - sub.l %a3, %d4 | subtract again instead of branch -.L281: add.l %a3, %d4 | add delta to weight - -.L276: move.l %acc0, %d2 | d2 = rounded product - add.l %d1, %d2 | add applied weight to bptr [0], store - move.l %d2, (%a1)+ - -.L274: cmp.l %a1, %d5 | loop back if bptr < eptr - jbhi term_default_loop - move.w (%a2), %d0 | d0 = term - 1 - moveq.l #8, %d1 | d1 = loop counter - -.L323: subq.l #1, %d0 | back up & mask index - and.l #7, %d0 - move.l -(%a1), 40(%a2,%d0.l*4) | store dpp->samples_B [d0] - move.l -(%a1), 8(%a2,%d0.l*4) | store dpp->samples_A [d0] - subq.l #1, %d1 | loop on count - jbne .L323 - jbra finish_up - -.L271: addq.l #4, %a1 | bump pointer and jump back into loop - bra .L275 - -.L272: addq.l #4, %a1 | bump pointer and jump back into loop - bra .L274 - - -|------------------------------------------------------------------------------ -| Loop to handle term = -1 condition -| -| a0 = d0 = decorrelation sample -| a1 = bptr d1 = initial bptr [0] -| a2 = dpp-> d2 = updated bptr [0] -| a3 = dpp->delta << 17 d3 = dpp->weight_A << 17 -| a4 = d4 = dpp->weight_B << 17 -| a5 = d5 = eptr -| a6 = d6 = 1024 << 17 -| a7 = d7 = -1024 << 17 -| macsr = 0x20 acc1 = 0x00 0000 80 -|------------------------------------------------------------------------------ - -term_minus_1: - move.l -4(%a1), %d0 | d0 = bptr [-1] - beq .L402 - move.l %acc1, %acc0 - asl.l #4, %d0 | acc0 = acc1 + ((d0 << 4) * weight_A) - mac.l %d0, %d3, %acc0 - move.l (%a1), %d1 - beq .L405 - eor.l %d1, %d0 | else compare signs - bge .L404 | if same, add delta to weight - sub.l %a3, %d3 | else subtract delta from weight - cmp.l %d7, %d3 | check for negative clip limit - bge .L405 - move.l %d7, %d3 - bra .L405 - -.L404: add.l %a3, %d3 | add delta to weight - cmp.l %d6, %d3 | check for positive clip limit - ble .L405 - move.l %d6, %d3 - -.L405: move.l %acc0, %d0 | d2 = rounded product - add.l %d1, %d0 | add applied weight to bptr [0], store - move.l %d0, (%a1)+ - beq .L401 - -.L410: move.l %acc1, %acc0 - asl.l #4, %d0 | acc0 = acc1 + ((d0 << 4) * weight_B) - mac.l %d0, %d4, %acc0 - move.l (%a1), %d1 - beq .L403 - eor.l %d1, %d0 | else compare signs - bge .L407 | if same, add delta to weight - sub.l %a3, %d4 | else subtract delta from weight - cmp.l %d7, %d4 | check for negative clip limit - bge .L403 - move.l %d7, %d4 - bra .L403 - -.L407: add.l %a3, %d4 | add delta to weight - cmp.l %d6, %d4 | check for positive clip limit - ble .L403 - move.l %d6, %d4 - -.L403: move.l %acc0, %d2 | d2 = rounded product - add.l %d1, %d2 | add applied weight to bptr [1], store - move.l %d2, (%a1)+ - -.L411: cmp.l %a1, %d5 | loop back if bptr < eptr - jbhi term_minus_1 - move.l -4(%a1), 8(%a2) | dpp->samples_A [0] = bptr [-1] - jbra finish_up - -.L402: move.l (%a1)+, %d0 - bne .L410 - -.L401: addq.l #4, %a1 - bra .L411 - - -|------------------------------------------------------------------------------ -| Loop to handle term = -2 condition -| -| a0 = d0 = decorrelation sample -| a1 = bptr d1 = initial bptr [0] -| a2 = dpp-> d2 = updated bptr [0] -| a3 = dpp->delta << 17 d3 = dpp->weight_A << 17 -| a4 = d4 = dpp->weight_B << 17 -| a5 = d5 = eptr -| a6 = d6 = 1024 << 17 -| a7 = d7 = -1024 << 17 -| macsr = 0x20 acc1 = 0x00 0000 80 -|------------------------------------------------------------------------------ - -term_minus_2: - move.l -8(%a1), %d0 | d0 = bptr [-2] - beq .L511 - move.l %acc1, %acc0 - asl.l #4, %d0 | acc0 = acc1 + ((d0 << 4) * weight_B) - mac.l %d0, %d4, %acc0 - move.l 4(%a1), %d1 - beq .L505 - eor.l %d1, %d0 | else compare signs - bge .L504 | if same, add delta to weight - sub.l %a3, %d4 | else subtract delta from weight - cmp.l %d7, %d4 | ckeck for negative clip limit - bge .L505 - move.l %d7, %d4 - bra .L505 - -.L504: add.l %a3, %d4 | add delta to weight - cmp.l %d6, %d4 | check for positive clip limit - ble .L505 - move.l %d6, %d4 - -.L505: move.l %acc0, %d0 | d2 = rounded product - add.l %d1, %d0 | add applied weight to bptr [0], store - move.l %d0, 4(%a1) - beq .L512 - -.L510: move.l %acc1, %acc0 - asl.l #4, %d0 | acc0 = acc1 + ((d0 << 4) * weight_A) - mac.l %d0, %d3, %acc0 - move.l (%a1), %d1 - beq .L503 - eor.l %d1, %d0 | else compare signs - bge .L507 | if same, add delta to weight - sub.l %a3, %d3 | else subtract delta from weight - cmp.l %d7, %d3 | check for negative clip limit - bge .L503 - move.l %d7, %d3 - bra .L503 - -.L507: add.l %a3, %d3 | add delta to weight - cmp.l %d6, %d3 | check for negative clip limit - ble .L503 - move.l %d6, %d3 - -.L503: move.l %acc0, %d2 | d2 = rounded product - add.l %d1, %d2 | add applied weight to bptr [1], store - move.l %d2, (%a1) - -.L512: addq.l #8, %a1 - cmp.l %a1, %d5 | loop if bptr < eptr - jbhi term_minus_2 - move.l -8(%a1), 40(%a2) | dpp->samples_B [0] = bptr [-4] - jbra finish_up - -.L511: move.l 4(%a1), %d0 - beq .L512 - bra .L510 - - -|------------------------------------------------------------------------------ -| Loop to handle term = -3 condition -| -| a0 = d0 = decorrelation sample -| a1 = bptr d1 = initial bptr [0] -| a2 = dpp-> d2 = updated bptr [0] -| a3 = dpp->delta << 17 d3 = dpp->weight_A << 17 -| a4 = d4 = dpp->weight_B << 17 -| a5 = d5 = eptr -| a6 = d6 = 1024 << 17 -| a7 = d7 = -1024 << 17 -| macsr = 0x20 acc1 = 0x00 0000 80 -|------------------------------------------------------------------------------ - -term_minus_3: - move.l -4(%a1), %d0 | d0 = bptr [-1] - beq .L301 - move.l %acc1, %acc0 - asl.l #4, %d0 | acc0 = acc1 + ((d0 << 4) * weight_A) - mac.l %d0, %d3, %acc0 - move.l (%a1), %d1 - beq .L320 - eor.l %d1, %d0 | else compare signs - bge .L319 | if same, add delta to weight - sub.l %a3, %d3 | else subtract delta from weight - cmp.l %d7, %d3 | check for negative clip limit - bge .L320 - move.l %d7, %d3 - bra .L320 - -.L319: add.l %a3, %d3 | add delta to weight - cmp.l %d6, %d3 | check for positive clip limit - ble .L320 - move.l %d6, %d3 - -.L320: move.l %acc0, %d2 | d2 = rounded product - add.l %d1, %d2 | add applied weight to bptr [0], store - move.l %d2, (%a1)+ - -.L330: move.l -12(%a1), %d0 | d0 = bptr [-2] - beq .L302 - move.l %acc1, %acc0 - asl.l #4, %d0 | acc0 = acc1 + ((d0 << 4) * weight_B) - mac.l %d0, %d4, %acc0 - move.l (%a1), %d1 - beq .L318 - eor.l %d1, %d0 | else compare signs - bge .L322 | if same, add delta to weight - sub.l %a3, %d4 | else subtract delta from weight - cmp.l %d7, %d4 | check for negative clip limit - bge .L318 - move.l %d7, %d4 - bra .L318 - -.L322: add.l %a3, %d4 | add delta to weight - cmp.l %d6, %d4 | check for positive clip limit - ble .L318 - move.l %d6, %d4 - -.L318: move.l %acc0, %d2 | d2 = rounded product - add.l %d1, %d2 | add applied weight to bptr [1], store - move.l %d2, (%a1)+ - -.L331: cmp.l %a1, %d5 | bptr, eptr - jbhi term_minus_3 - move.l -4(%a1), 8(%a2) | dpp->samples_A [0] = bptr [-1] - move.l -8(%a1), 40(%a2) | dpp->samples_B [0] = bptr [-2] - jbra finish_up - -.L301: addq.l #4, %a1 - bra .L330 - -.L302: addq.l #4, %a1 - bra .L331 - -| finish and return - -finish_up: - moveq.l #17, %d0 - asr.l %d0, %d3 - asr.l %d0, %d4 - move.w %d3, 4(%a2) | weight_A, dpp->weight_A - move.w %d4, 6(%a2) | weight_B, dpp->weight_B - - clr.l %d0 | clear up EMAC - move.l %d0, %acc0 - move.l %d0, %acc1 - -return_only: - movem.l (%sp), %d2-%d7/%a2-%a6 - lea (44,%sp), %sp - rts diff --git a/src/engine/external/wavpack/float.c b/src/engine/external/wavpack/float.c deleted file mode 100644 index 09f0e4c36c..0000000000 --- a/src/engine/external/wavpack/float.c +++ /dev/null @@ -1,50 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2006 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// float.c - -#include "wavpack.h" - -int read_float_info (WavpackStream *wps, WavpackMetadata *wpmd) -{ - int bytecnt = wpmd->byte_length; - char *byteptr = wpmd->data; - - if (bytecnt != 4) - return FALSE; - - wps->float_flags = *byteptr++; - wps->float_shift = *byteptr++; - wps->float_max_exp = *byteptr++; - wps->float_norm_exp = *byteptr; - return TRUE; -} - -void float_values (WavpackStream *wps, int32_t *values, int32_t num_values) -{ - int shift = wps->float_max_exp - wps->float_norm_exp + wps->float_shift; - - if (shift > 32) - shift = 32; - else if (shift < -32) - shift = -32; - - while (num_values--) { - if (shift > 0) - *values <<= shift; - else if (shift < 0) - *values >>= -shift; - - if (*values > 8388607L) - *values = 8388607L; - else if (*values < -8388608L) - *values = -8388608L; - - values++; - } -} diff --git a/src/engine/external/wavpack/license.txt b/src/engine/external/wavpack/license.txt deleted file mode 100644 index d2ee90fc74..0000000000 --- a/src/engine/external/wavpack/license.txt +++ /dev/null @@ -1,25 +0,0 @@ - Copyright (c) 1998 - 2006 Conifer Software - All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Conifer Software nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/engine/external/wavpack/metadata.c b/src/engine/external/wavpack/metadata.c deleted file mode 100644 index 6a19ac9bb3..0000000000 --- a/src/engine/external/wavpack/metadata.c +++ /dev/null @@ -1,105 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2006 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// metadata.c - -// This module handles the metadata structure introduced in WavPack 4.0 - -#include "wavpack.h" - -int read_metadata_buff (WavpackContext *wpc, WavpackMetadata *wpmd) -{ - uchar tchar; - - if (!wpc->infile (&wpmd->id, 1) || !wpc->infile (&tchar, 1)) - return FALSE; - - wpmd->byte_length = tchar << 1; - - if (wpmd->id & ID_LARGE) { - wpmd->id &= ~ID_LARGE; - - if (!wpc->infile (&tchar, 1)) - return FALSE; - - wpmd->byte_length += (int32_t) tchar << 9; - - if (!wpc->infile (&tchar, 1)) - return FALSE; - - wpmd->byte_length += (int32_t) tchar << 17; - } - - if (wpmd->id & ID_ODD_SIZE) { - wpmd->id &= ~ID_ODD_SIZE; - wpmd->byte_length--; - } - - if (wpmd->byte_length && wpmd->byte_length <= sizeof (wpc->read_buffer)) { - uint32_t bytes_to_read = wpmd->byte_length + (wpmd->byte_length & 1); - - if (wpc->infile (wpc->read_buffer, bytes_to_read) != (int32_t) bytes_to_read) { - wpmd->data = NULL; - return FALSE; - } - - wpmd->data = wpc->read_buffer; - } - else - wpmd->data = NULL; - - return TRUE; -} - -int process_metadata (WavpackContext *wpc, WavpackMetadata *wpmd) -{ - WavpackStream *wps = &wpc->stream; - - switch (wpmd->id) { - case ID_DUMMY: - return TRUE; - - case ID_DECORR_TERMS: - return read_decorr_terms (wps, wpmd); - - case ID_DECORR_WEIGHTS: - return read_decorr_weights (wps, wpmd); - - case ID_DECORR_SAMPLES: - return read_decorr_samples (wps, wpmd); - - case ID_ENTROPY_VARS: - return read_entropy_vars (wps, wpmd); - - case ID_HYBRID_PROFILE: - return read_hybrid_profile (wps, wpmd); - - case ID_FLOAT_INFO: - return read_float_info (wps, wpmd); - - case ID_INT32_INFO: - return read_int32_info (wps, wpmd); - - case ID_CHANNEL_INFO: - return read_channel_info (wpc, wpmd); - - case ID_CONFIG_BLOCK: - return read_config_info (wpc, wpmd); - - case ID_WV_BITSTREAM: - return init_wv_bitstream (wpc, wpmd); - - case ID_SHAPING_WEIGHTS: - case ID_WVC_BITSTREAM: - case ID_WVX_BITSTREAM: - return TRUE; - - default: - return (wpmd->id & ID_OPTIONAL_DATA) ? TRUE : FALSE; - } -} diff --git a/src/engine/external/wavpack/readme.txt b/src/engine/external/wavpack/readme.txt deleted file mode 100644 index 07b7a261dd..0000000000 --- a/src/engine/external/wavpack/readme.txt +++ /dev/null @@ -1,68 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2006 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -This package contains a tiny version of the WavPack 4.40 decoder that might -be used in a "resource limited" CPU environment or form the basis for a -hardware decoding implementation. It is packaged with a demo command-line -program that accepts a WavPack audio file on stdin and outputs a RIFF wav -file to stdout. The program is standard C, and a win32 executable is -included which was compiled under MS Visual C++ 6.0 using this command: - -cl /O1 /DWIN32 wvfilter.c wputils.c unpack.c float.c metadata.c words.c bits.c - -WavPack data is read with a stream reading callback. No direct seeking is -provided for, but it is possible to start decoding anywhere in a WavPack -stream. In this case, WavPack will be able to provide the sample-accurate -position when it synchs with the data and begins decoding. The WIN32 macro -is used for Windows to force the stdin and stdout streams to be binary mode. - -Compared to the previous version, this library has been optimized somewhat -for improved performance in exchange for slightly larger code size. The -library also now includes hand-optimized assembly language versions of the -decorrelation functions for both the ColdFire (w/EMAC) and ARM processors. - -For demonstration purposes this uses a single static copy of the -WavpackContext structure, so obviously it cannot be used for more than one -file at a time. Also, this decoder will not handle "correction" files, plays -only the first two channels of multi-channel files, and is limited in -resolution in some large integer or floating point files (but always -provides at least 24 bits of resolution). It also will not accept WavPack -files from before version 4.0. - -The previous version of this library would handle float files by returning -32-bit floating-point data (even though no floating point math was used). -Because this library would normally be used for simply playing WavPack -files where lossless performance (beyond 24-bits) is not relevant, I have -changed this behavior. Now, these files will generate clipped 24-bit data. -The MODE_FLOAT flag will still be returned by WavpackGetMode(), but the -BitsPerSample and BytesPerSample queries will be 24 and 3, respectfully. -What this means is that an application that can handle 24-bit data will -now be able to handle floating point data (assuming that the MODE_FLOAT -flag is ignored). - -To make this code viable on the greatest number of hardware platforms, the -following are true: - - speed is about 5x realtime on an AMD K6 300 MHz - ("high" mode 16/44 stereo; normal mode is about twice that fast) - - no floating-point math required; just 32b * 32b = 32b int multiply - - large data areas are static and less than 4K total - executable code and tables are less than 40K - no malloc / free usage - -To maintain compatibility on various platforms, the following conventions -are used: - - a "char" must be exactly 8-bits - a "short" must be exactly 16-bits - an "int" must be at least 16-bits, but may be larger - the "long" type is not used to avoid problems with 64-bit compilers - -Questions or comments should be directed to david@wavpack.com diff --git a/src/engine/external/wavpack/unpack.c b/src/engine/external/wavpack/unpack.c deleted file mode 100644 index 317fe2227f..0000000000 --- a/src/engine/external/wavpack/unpack.c +++ /dev/null @@ -1,785 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2006 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// unpack.c - -// This module actually handles the decompression of the audio data, except -// for the entropy decoding which is handled by the words.c module. For -// maximum efficiency, the conversion is isolated to tight loops that handle -// an entire buffer. - -#include "wavpack.h" - -#include -#include - -#define LOSSY_MUTE - -///////////////////////////// executable code //////////////////////////////// - -// This function initializes everything required to unpack a WavPack block -// and must be called before unpack_samples() is called to obtain audio data. -// It is assumed that the WavpackHeader has been read into the wps->wphdr -// (in the current WavpackStream). This is where all the metadata blocks are -// scanned up to the one containing the audio bitstream. - -int unpack_init (WavpackContext *wpc) -{ - WavpackStream *wps = &wpc->stream; - WavpackMetadata wpmd; - - if (wps->wphdr.block_samples && wps->wphdr.block_index != (uint32_t) -1) - wps->sample_index = wps->wphdr.block_index; - - wps->mute_error = FALSE; - wps->crc = 0xffffffff; - CLEAR (wps->wvbits); - CLEAR (wps->decorr_passes); - CLEAR (wps->w); - - while (read_metadata_buff (wpc, &wpmd)) { - if (!process_metadata (wpc, &wpmd)) { - strcpy (wpc->error_message, "invalid metadata!"); - return FALSE; - } - - if (wpmd.id == ID_WV_BITSTREAM) - break; - } - - if (wps->wphdr.block_samples && !bs_is_open (&wps->wvbits)) { - strcpy (wpc->error_message, "invalid WavPack file!"); - return FALSE; - } - - if (wps->wphdr.block_samples) { - if ((wps->wphdr.flags & INT32_DATA) && wps->int32_sent_bits) - wpc->lossy_blocks = TRUE; - - if ((wps->wphdr.flags & FLOAT_DATA) && - wps->float_flags & (FLOAT_EXCEPTIONS | FLOAT_ZEROS_SENT | FLOAT_SHIFT_SENT | FLOAT_SHIFT_SAME)) - wpc->lossy_blocks = TRUE; - } - - return TRUE; -} - -// This function initialzes the main bitstream for audio samples, which must -// be in the "wv" file. - -int init_wv_bitstream (WavpackContext *wpc, WavpackMetadata *wpmd) -{ - WavpackStream *wps = &wpc->stream; - - if (wpmd->data) - bs_open_read (&wps->wvbits, wpmd->data, (unsigned char *) wpmd->data + wpmd->byte_length, NULL, 0); - else if (wpmd->byte_length) - bs_open_read (&wps->wvbits, wpc->read_buffer, wpc->read_buffer + sizeof (wpc->read_buffer), - wpc->infile, wpmd->byte_length + (wpmd->byte_length & 1)); - - return TRUE; -} - -// Read decorrelation terms from specified metadata block into the -// decorr_passes array. The terms range from -3 to 8, plus 17 & 18; -// other values are reserved and generate errors for now. The delta -// ranges from 0 to 7 with all values valid. Note that the terms are -// stored in the opposite order in the decorr_passes array compared -// to packing. - -int read_decorr_terms (WavpackStream *wps, WavpackMetadata *wpmd) -{ - int termcnt = wpmd->byte_length; - uchar *byteptr = wpmd->data; - struct decorr_pass *dpp; - - if (termcnt > MAX_NTERMS) - return FALSE; - - wps->num_terms = termcnt; - - for (dpp = wps->decorr_passes + termcnt - 1; termcnt--; dpp--) { - dpp->term = (int)(*byteptr & 0x1f) - 5; - dpp->delta = (*byteptr++ >> 5) & 0x7; - - if (!dpp->term || dpp->term < -3 || (dpp->term > MAX_TERM && dpp->term < 17) || dpp->term > 18) - return FALSE; - } - - return TRUE; -} - -// Read decorrelation weights from specified metadata block into the -// decorr_passes array. The weights range +/-1024, but are rounded and -// truncated to fit in signed chars for metadata storage. Weights are -// separate for the two channels and are specified from the "last" term -// (first during encode). Unspecified weights are set to zero. - -int read_decorr_weights (WavpackStream *wps, WavpackMetadata *wpmd) -{ - int termcnt = wpmd->byte_length, tcount; - signed char *byteptr = wpmd->data; - struct decorr_pass *dpp; - - if (!(wps->wphdr.flags & MONO_DATA)) - termcnt /= 2; - - if (termcnt > wps->num_terms) - return FALSE; - - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) - dpp->weight_A = dpp->weight_B = 0; - - while (--dpp >= wps->decorr_passes && termcnt--) { - dpp->weight_A = restore_weight (*byteptr++); - - if (!(wps->wphdr.flags & MONO_DATA)) - dpp->weight_B = restore_weight (*byteptr++); - } - - return TRUE; -} - -// Read decorrelation samples from specified metadata block into the -// decorr_passes array. The samples are signed 32-bit values, but are -// converted to signed log2 values for storage in metadata. Values are -// stored for both channels and are specified from the "last" term -// (first during encode) with unspecified samples set to zero. The -// number of samples stored varies with the actual term value, so -// those must obviously come first in the metadata. - -int read_decorr_samples (WavpackStream *wps, WavpackMetadata *wpmd) -{ - uchar *byteptr = wpmd->data; - uchar *endptr = byteptr + wpmd->byte_length; - struct decorr_pass *dpp; - int tcount; - - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) { - CLEAR (dpp->samples_A); - CLEAR (dpp->samples_B); - } - - if (wps->wphdr.version == 0x402 && (wps->wphdr.flags & HYBRID_FLAG)) { - byteptr += 2; - - if (!(wps->wphdr.flags & MONO_DATA)) - byteptr += 2; - } - - while (dpp-- > wps->decorr_passes && byteptr < endptr) - if (dpp->term > MAX_TERM) { - dpp->samples_A [0] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8))); - dpp->samples_A [1] = exp2s ((short)(byteptr [2] + (byteptr [3] << 8))); - byteptr += 4; - - if (!(wps->wphdr.flags & MONO_DATA)) { - dpp->samples_B [0] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8))); - dpp->samples_B [1] = exp2s ((short)(byteptr [2] + (byteptr [3] << 8))); - byteptr += 4; - } - } - else if (dpp->term < 0) { - dpp->samples_A [0] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8))); - dpp->samples_B [0] = exp2s ((short)(byteptr [2] + (byteptr [3] << 8))); - byteptr += 4; - } - else { - int m = 0, cnt = dpp->term; - - while (cnt--) { - dpp->samples_A [m] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8))); - byteptr += 2; - - if (!(wps->wphdr.flags & MONO_DATA)) { - dpp->samples_B [m] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8))); - byteptr += 2; - } - - m++; - } - } - - return byteptr == endptr; -} - -// Read the int32 data from the specified metadata into the specified stream. -// This data is used for integer data that has more than 24 bits of magnitude -// or, in some cases, used to eliminate redundant bits from any audio stream. - -int read_int32_info (WavpackStream *wps, WavpackMetadata *wpmd) -{ - int bytecnt = wpmd->byte_length; - char *byteptr = wpmd->data; - - if (bytecnt != 4) - return FALSE; - - wps->int32_sent_bits = *byteptr++; - wps->int32_zeros = *byteptr++; - wps->int32_ones = *byteptr++; - wps->int32_dups = *byteptr; - return TRUE; -} - -// Read multichannel information from metadata. The first byte is the total -// number of channels and the following bytes represent the channel_mask -// as described for Microsoft WAVEFORMATEX. - -int read_channel_info (WavpackContext *wpc, WavpackMetadata *wpmd) -{ - int bytecnt = wpmd->byte_length, shift = 0; - char *byteptr = wpmd->data; - uint32_t mask = 0; - - if (!bytecnt || bytecnt > 5) - return FALSE; - - wpc->config.num_channels = *byteptr++; - - while (--bytecnt) { - mask |= (uint32_t) *byteptr++ << shift; - shift += 8; - } - - wpc->config.channel_mask = mask; - return TRUE; -} - -// Read configuration information from metadata. - -int read_config_info (WavpackContext *wpc, WavpackMetadata *wpmd) -{ - int bytecnt = wpmd->byte_length; - uchar *byteptr = wpmd->data; - - if (bytecnt >= 3) { - wpc->config.flags &= 0xff; - wpc->config.flags |= (int32_t) *byteptr++ << 8; - wpc->config.flags |= (int32_t) *byteptr++ << 16; - wpc->config.flags |= (int32_t) *byteptr << 24; - } - - return TRUE; -} - -// This monster actually unpacks the WavPack bitstream(s) into the specified -// buffer as 32-bit integers or floats (depending on orignal data). Lossy -// samples will be clipped to their original limits (i.e. 8-bit samples are -// clipped to -128/+127) but are still returned in int32_ts. It is up to the -// caller to potentially reformat this for the final output including any -// multichannel distribution, block alignment or endian compensation. The -// function unpack_init() must have been called and the entire WavPack block -// must still be visible (although wps->blockbuff will not be accessed again). -// For maximum clarity, the function is broken up into segments that handle -// various modes. This makes for a few extra infrequent flag checks, but -// makes the code easier to follow because the nesting does not become so -// deep. For maximum efficiency, the conversion is isolated to tight loops -// that handle an entire buffer. The function returns the total number of -// samples unpacked, which can be less than the number requested if an error -// occurs or the end of the block is reached. - -#if defined(CPU_COLDFIRE) && !defined(SIMULATOR) -extern void decorr_stereo_pass_cont_mcf5249 (struct decorr_pass *dpp, int32_t *buffer, int32_t sample_count); -#elif defined(CPU_ARM) && !defined(SIMULATOR) -extern void decorr_stereo_pass_cont_arm (struct decorr_pass *dpp, int32_t *buffer, int32_t sample_count); -extern void decorr_stereo_pass_cont_arml (struct decorr_pass *dpp, int32_t *buffer, int32_t sample_count); -#else -static void decorr_stereo_pass_cont (struct decorr_pass *dpp, int32_t *buffer, int32_t sample_count); -#endif - -static void decorr_mono_pass (struct decorr_pass *dpp, int32_t *buffer, int32_t sample_count); -static void decorr_stereo_pass (struct decorr_pass *dpp, int32_t *buffer, int32_t sample_count); -static void fixup_samples (WavpackStream *wps, int32_t *buffer, uint32_t sample_count); - -int32_t unpack_samples (WavpackContext *wpc, int32_t *buffer, uint32_t sample_count) -{ - WavpackStream *wps = &wpc->stream; - uint32_t flags = wps->wphdr.flags, crc = wps->crc, i; - int32_t mute_limit = (1L << ((flags & MAG_MASK) >> MAG_LSB)) + 2; - struct decorr_pass *dpp; - int32_t *bptr, *eptr; - int tcount; - - if (wps->sample_index + sample_count > wps->wphdr.block_index + wps->wphdr.block_samples) - sample_count = wps->wphdr.block_index + wps->wphdr.block_samples - wps->sample_index; - - if (wps->mute_error) { - memset (buffer, 0, sample_count * (flags & MONO_FLAG ? 4 : 8)); - wps->sample_index += sample_count; - return sample_count; - } - - if (flags & HYBRID_FLAG) - mute_limit *= 2; - - ///////////////////// handle version 4 mono data ///////////////////////// - - if (flags & MONO_DATA) { - eptr = buffer + sample_count; - i = get_words (buffer, sample_count, flags, &wps->w, &wps->wvbits); - - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) - decorr_mono_pass (dpp, buffer, sample_count); - - for (bptr = buffer; bptr < eptr; ++bptr) { - if (labs (bptr [0]) > mute_limit) { - i = bptr - buffer; - break; - } - - crc = crc * 3 + bptr [0]; - } - } - - //////////////////// handle version 4 stereo data //////////////////////// - - else { - eptr = buffer + (sample_count * 2); - i = get_words (buffer, sample_count, flags, &wps->w, &wps->wvbits); - - if (sample_count < 16) - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) - decorr_stereo_pass (dpp, buffer, sample_count); - else - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) { - decorr_stereo_pass (dpp, buffer, 8); -#if defined(CPU_COLDFIRE) && !defined(SIMULATOR) - decorr_stereo_pass_cont_mcf5249 (dpp, buffer + 16, sample_count - 8); -#elif defined(CPU_ARM) && !defined(SIMULATOR) - if (((flags & MAG_MASK) >> MAG_LSB) > 15) - decorr_stereo_pass_cont_arml (dpp, buffer + 16, sample_count - 8); - else - decorr_stereo_pass_cont_arm (dpp, buffer + 16, sample_count - 8); -#else - decorr_stereo_pass_cont (dpp, buffer + 16, sample_count - 8); -#endif - } - - if (flags & JOINT_STEREO) - for (bptr = buffer; bptr < eptr; bptr += 2) { - bptr [0] += (bptr [1] -= (bptr [0] >> 1)); - - if (labs (bptr [0]) > mute_limit || labs (bptr [1]) > mute_limit) { - i = (bptr - buffer) / 2; - break; - } - - crc = (crc * 3 + bptr [0]) * 3 + bptr [1]; - } - else - for (bptr = buffer; bptr < eptr; bptr += 2) { - if (labs (bptr [0]) > mute_limit || labs (bptr [1]) > mute_limit) { - i = (bptr - buffer) / 2; - break; - } - - crc = (crc * 3 + bptr [0]) * 3 + bptr [1]; - } - } - - if (i != sample_count) { - memset (buffer, 0, sample_count * (flags & MONO_FLAG ? 4 : 8)); - wps->mute_error = TRUE; - i = sample_count; - } - - fixup_samples (wps, buffer, i); - - if (flags & FALSE_STEREO) { - int32_t *dptr = buffer + i * 2; - int32_t *sptr = buffer + i; - int32_t c = i; - - while (c--) { - *--dptr = *--sptr; - *--dptr = *sptr; - } - } - - wps->sample_index += i; - wps->crc = crc; - - return i; -} - -static void decorr_stereo_pass (struct decorr_pass *dpp, int32_t *buffer, int32_t sample_count) -{ - int32_t delta = dpp->delta, weight_A = dpp->weight_A, weight_B = dpp->weight_B; - int32_t *bptr, *eptr = buffer + (sample_count * 2), sam_A, sam_B; - int m, k; - - switch (dpp->term) { - - case 17: - for (bptr = buffer; bptr < eptr; bptr += 2) { - sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1]; - dpp->samples_A [1] = dpp->samples_A [0]; - dpp->samples_A [0] = apply_weight (weight_A, sam_A) + bptr [0]; - update_weight (weight_A, delta, sam_A, bptr [0]); - bptr [0] = dpp->samples_A [0]; - - sam_A = 2 * dpp->samples_B [0] - dpp->samples_B [1]; - dpp->samples_B [1] = dpp->samples_B [0]; - dpp->samples_B [0] = apply_weight (weight_B, sam_A) + bptr [1]; - update_weight (weight_B, delta, sam_A, bptr [1]); - bptr [1] = dpp->samples_B [0]; - } - - break; - - case 18: - for (bptr = buffer; bptr < eptr; bptr += 2) { - sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1; - dpp->samples_A [1] = dpp->samples_A [0]; - dpp->samples_A [0] = apply_weight (weight_A, sam_A) + bptr [0]; - update_weight (weight_A, delta, sam_A, bptr [0]); - bptr [0] = dpp->samples_A [0]; - - sam_A = (3 * dpp->samples_B [0] - dpp->samples_B [1]) >> 1; - dpp->samples_B [1] = dpp->samples_B [0]; - dpp->samples_B [0] = apply_weight (weight_B, sam_A) + bptr [1]; - update_weight (weight_B, delta, sam_A, bptr [1]); - bptr [1] = dpp->samples_B [0]; - } - - break; - - default: - for (m = 0, k = dpp->term & (MAX_TERM - 1), bptr = buffer; bptr < eptr; bptr += 2) { - sam_A = dpp->samples_A [m]; - dpp->samples_A [k] = apply_weight (weight_A, sam_A) + bptr [0]; - update_weight (weight_A, delta, sam_A, bptr [0]); - bptr [0] = dpp->samples_A [k]; - - sam_A = dpp->samples_B [m]; - dpp->samples_B [k] = apply_weight (weight_B, sam_A) + bptr [1]; - update_weight (weight_B, delta, sam_A, bptr [1]); - bptr [1] = dpp->samples_B [k]; - - m = (m + 1) & (MAX_TERM - 1); - k = (k + 1) & (MAX_TERM - 1); - } - - if (m) { - int32_t temp_samples [MAX_TERM]; - - memcpy (temp_samples, dpp->samples_A, sizeof (dpp->samples_A)); - - for (k = 0; k < MAX_TERM; k++, m++) - dpp->samples_A [k] = temp_samples [m & (MAX_TERM - 1)]; - - memcpy (temp_samples, dpp->samples_B, sizeof (dpp->samples_B)); - - for (k = 0; k < MAX_TERM; k++, m++) - dpp->samples_B [k] = temp_samples [m & (MAX_TERM - 1)]; - } - - break; - - case -1: - for (bptr = buffer; bptr < eptr; bptr += 2) { - sam_A = bptr [0] + apply_weight (weight_A, dpp->samples_A [0]); - update_weight_clip (weight_A, delta, dpp->samples_A [0], bptr [0]); - bptr [0] = sam_A; - dpp->samples_A [0] = bptr [1] + apply_weight (weight_B, sam_A); - update_weight_clip (weight_B, delta, sam_A, bptr [1]); - bptr [1] = dpp->samples_A [0]; - } - - break; - - case -2: - for (bptr = buffer; bptr < eptr; bptr += 2) { - sam_B = bptr [1] + apply_weight (weight_B, dpp->samples_B [0]); - update_weight_clip (weight_B, delta, dpp->samples_B [0], bptr [1]); - bptr [1] = sam_B; - dpp->samples_B [0] = bptr [0] + apply_weight (weight_A, sam_B); - update_weight_clip (weight_A, delta, sam_B, bptr [0]); - bptr [0] = dpp->samples_B [0]; - } - - break; - - case -3: - for (bptr = buffer; bptr < eptr; bptr += 2) { - sam_A = bptr [0] + apply_weight (weight_A, dpp->samples_A [0]); - update_weight_clip (weight_A, delta, dpp->samples_A [0], bptr [0]); - sam_B = bptr [1] + apply_weight (weight_B, dpp->samples_B [0]); - update_weight_clip (weight_B, delta, dpp->samples_B [0], bptr [1]); - bptr [0] = dpp->samples_B [0] = sam_A; - bptr [1] = dpp->samples_A [0] = sam_B; - } - - break; - } - - dpp->weight_A = weight_A; - dpp->weight_B = weight_B; -} - -#if (!defined(CPU_COLDFIRE) && !defined(CPU_ARM)) || defined(SIMULATOR) - -static void decorr_stereo_pass_cont (struct decorr_pass *dpp, int32_t *buffer, int32_t sample_count) -{ - int32_t delta = dpp->delta, weight_A = dpp->weight_A, weight_B = dpp->weight_B; - int32_t *bptr, *tptr, *eptr = buffer + (sample_count * 2), sam_A, sam_B; - int k, i; - - switch (dpp->term) { - - case 17: - for (bptr = buffer; bptr < eptr; bptr += 2) { - sam_A = 2 * bptr [-2] - bptr [-4]; - bptr [0] = apply_weight (weight_A, sam_A) + (sam_B = bptr [0]); - update_weight (weight_A, delta, sam_A, sam_B); - - sam_A = 2 * bptr [-1] - bptr [-3]; - bptr [1] = apply_weight (weight_B, sam_A) + (sam_B = bptr [1]); - update_weight (weight_B, delta, sam_A, sam_B); - } - - dpp->samples_B [0] = bptr [-1]; - dpp->samples_A [0] = bptr [-2]; - dpp->samples_B [1] = bptr [-3]; - dpp->samples_A [1] = bptr [-4]; - break; - - case 18: - for (bptr = buffer; bptr < eptr; bptr += 2) { - sam_A = (3 * bptr [-2] - bptr [-4]) >> 1; - bptr [0] = apply_weight (weight_A, sam_A) + (sam_B = bptr [0]); - update_weight (weight_A, delta, sam_A, sam_B); - - sam_A = (3 * bptr [-1] - bptr [-3]) >> 1; - bptr [1] = apply_weight (weight_B, sam_A) + (sam_B = bptr [1]); - update_weight (weight_B, delta, sam_A, sam_B); - } - - dpp->samples_B [0] = bptr [-1]; - dpp->samples_A [0] = bptr [-2]; - dpp->samples_B [1] = bptr [-3]; - dpp->samples_A [1] = bptr [-4]; - break; - - default: - for (bptr = buffer, tptr = buffer - (dpp->term * 2); bptr < eptr; bptr += 2, tptr += 2) { - bptr [0] = apply_weight (weight_A, tptr [0]) + (sam_A = bptr [0]); - update_weight (weight_A, delta, tptr [0], sam_A); - - bptr [1] = apply_weight (weight_B, tptr [1]) + (sam_A = bptr [1]); - update_weight (weight_B, delta, tptr [1], sam_A); - } - - for (k = dpp->term - 1, i = 8; i--; k--) { - dpp->samples_B [k & (MAX_TERM - 1)] = *--bptr; - dpp->samples_A [k & (MAX_TERM - 1)] = *--bptr; - } - - break; - - case -1: - for (bptr = buffer; bptr < eptr; bptr += 2) { - bptr [0] = apply_weight (weight_A, bptr [-1]) + (sam_A = bptr [0]); - update_weight_clip (weight_A, delta, bptr [-1], sam_A); - bptr [1] = apply_weight (weight_B, bptr [0]) + (sam_A = bptr [1]); - update_weight_clip (weight_B, delta, bptr [0], sam_A); - } - - dpp->samples_A [0] = bptr [-1]; - break; - - case -2: - for (bptr = buffer; bptr < eptr; bptr += 2) { - bptr [1] = apply_weight (weight_B, bptr [-2]) + (sam_A = bptr [1]); - update_weight_clip (weight_B, delta, bptr [-2], sam_A); - bptr [0] = apply_weight (weight_A, bptr [1]) + (sam_A = bptr [0]); - update_weight_clip (weight_A, delta, bptr [1], sam_A); - } - - dpp->samples_B [0] = bptr [-2]; - break; - - case -3: - for (bptr = buffer; bptr < eptr; bptr += 2) { - bptr [0] = apply_weight (weight_A, bptr [-1]) + (sam_A = bptr [0]); - update_weight_clip (weight_A, delta, bptr [-1], sam_A); - bptr [1] = apply_weight (weight_B, bptr [-2]) + (sam_A = bptr [1]); - update_weight_clip (weight_B, delta, bptr [-2], sam_A); - } - - dpp->samples_A [0] = bptr [-1]; - dpp->samples_B [0] = bptr [-2]; - break; - } - - dpp->weight_A = weight_A; - dpp->weight_B = weight_B; -} - -#endif - -static void decorr_mono_pass (struct decorr_pass *dpp, int32_t *buffer, int32_t sample_count) -{ - int32_t delta = dpp->delta, weight_A = dpp->weight_A; - int32_t *bptr, *eptr = buffer + sample_count, sam_A; - int m, k; - - switch (dpp->term) { - - case 17: - for (bptr = buffer; bptr < eptr; bptr++) { - sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1]; - dpp->samples_A [1] = dpp->samples_A [0]; - dpp->samples_A [0] = apply_weight (weight_A, sam_A) + bptr [0]; - update_weight (weight_A, delta, sam_A, bptr [0]); - bptr [0] = dpp->samples_A [0]; - } - - break; - - case 18: - for (bptr = buffer; bptr < eptr; bptr++) { - sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1; - dpp->samples_A [1] = dpp->samples_A [0]; - dpp->samples_A [0] = apply_weight (weight_A, sam_A) + bptr [0]; - update_weight (weight_A, delta, sam_A, bptr [0]); - bptr [0] = dpp->samples_A [0]; - } - - break; - - default: - for (m = 0, k = dpp->term & (MAX_TERM - 1), bptr = buffer; bptr < eptr; bptr++) { - sam_A = dpp->samples_A [m]; - dpp->samples_A [k] = apply_weight (weight_A, sam_A) + bptr [0]; - update_weight (weight_A, delta, sam_A, bptr [0]); - bptr [0] = dpp->samples_A [k]; - m = (m + 1) & (MAX_TERM - 1); - k = (k + 1) & (MAX_TERM - 1); - } - - if (m) { - int32_t temp_samples [MAX_TERM]; - - memcpy (temp_samples, dpp->samples_A, sizeof (dpp->samples_A)); - - for (k = 0; k < MAX_TERM; k++, m++) - dpp->samples_A [k] = temp_samples [m & (MAX_TERM - 1)]; - } - - break; - } - - dpp->weight_A = weight_A; -} - - -// This is a helper function for unpack_samples() that applies several final -// operations. First, if the data is 32-bit float data, then that conversion -// is done in the float.c module (whether lossy or lossless) and we return. -// Otherwise, if the extended integer data applies, then that operation is -// executed first. If the unpacked data is lossy (and not corrected) then -// it is clipped and shifted in a single operation. Otherwise, if it's -// lossless then the last step is to apply the final shift (if any). - -static void fixup_samples (WavpackStream *wps, int32_t *buffer, uint32_t sample_count) -{ - uint32_t flags = wps->wphdr.flags; - int shift = (flags & SHIFT_MASK) >> SHIFT_LSB; - - if (flags & FLOAT_DATA) { - float_values (wps, buffer, (flags & MONO_FLAG) ? sample_count : sample_count * 2); - return; - } - - if (flags & INT32_DATA) { - uint32_t count = (flags & MONO_FLAG) ? sample_count : sample_count * 2; - int sent_bits = wps->int32_sent_bits, zeros = wps->int32_zeros; - int ones = wps->int32_ones, dups = wps->int32_dups; - int32_t *dptr = buffer; - - if (!(flags & HYBRID_FLAG) && !sent_bits && (zeros + ones + dups)) - while (count--) { - if (zeros) - *dptr <<= zeros; - else if (ones) - *dptr = ((*dptr + 1) << ones) - 1; - else if (dups) - *dptr = ((*dptr + (*dptr & 1)) << dups) - (*dptr & 1); - - dptr++; - } - else - shift += zeros + sent_bits + ones + dups; - } - - if (flags & HYBRID_FLAG) { - int32_t min_value, max_value, min_shifted, max_shifted; - - switch (flags & BYTES_STORED) { - case 0: - min_shifted = (min_value = -128 >> shift) << shift; - max_shifted = (max_value = 127 >> shift) << shift; - break; - - case 1: - min_shifted = (min_value = -32768 >> shift) << shift; - max_shifted = (max_value = 32767 >> shift) << shift; - break; - - case 2: - min_shifted = (min_value = -8388608 >> shift) << shift; - max_shifted = (max_value = 8388607 >> shift) << shift; - break; - - case 3: - default: - min_shifted = (min_value = (int32_t) 0x80000000 >> shift) << shift; - max_shifted = (max_value = (int32_t) 0x7FFFFFFF >> shift) << shift; - break; - } - - if (!(flags & MONO_FLAG)) - sample_count *= 2; - - while (sample_count--) { - if (*buffer < min_value) - *buffer++ = min_shifted; - else if (*buffer > max_value) - *buffer++ = max_shifted; - else - *buffer++ <<= shift; - } - } - else if (shift) { - if (!(flags & MONO_FLAG)) - sample_count *= 2; - - while (sample_count--) - *buffer++ <<= shift; - } -} - -// This function checks the crc value(s) for an unpacked block, returning the -// number of actual crc errors detected for the block. The block must be -// completely unpacked before this test is valid. For losslessly unpacked -// blocks of float or extended integer data the extended crc is also checked. -// Note that WavPack's crc is not a CCITT approved polynomial algorithm, but -// is a much simpler method that is virtually as robust for real world data. - -int check_crc_error (WavpackContext *wpc) -{ - WavpackStream *wps = &wpc->stream; - int result = 0; - - if (wps->crc != wps->wphdr.crc) - ++result; - - return result; -} diff --git a/src/engine/external/wavpack/wavpack.h b/src/engine/external/wavpack/wavpack.h deleted file mode 100644 index 2e22fc51ea..0000000000 --- a/src/engine/external/wavpack/wavpack.h +++ /dev/null @@ -1,384 +0,0 @@ -/*////////////////////////////////////////////////////////////////////////// */ -/* **** WAVPACK **** // */ -/* Hybrid Lossless Wavefile Compressor // */ -/* Copyright (c) 1998 - 2004 Conifer Software. // */ -/* All Rights Reserved. // */ -/* Distributed under the BSD Software License (see license.txt) // */ -/*////////////////////////////////////////////////////////////////////////// */ - -/* wavpack.h */ - -#include - -/* This header file contains all the definitions required by WavPack. */ - -#ifdef __BORLANDC__ -typedef unsigned long uint32_t; -typedef long int32_t; -#elif defined(_WIN32) && !defined(__MINGW32__) -#include -typedef unsigned __int64 uint64_t; -typedef unsigned __int32 uint32_t; -typedef __int64 int64_t; -typedef __int32 int32_t; -#else -#include -#endif - -typedef unsigned char uchar; - -#if !defined(__GNUC__) || defined(WIN32) -typedef unsigned short ushort; -typedef unsigned int uint; -#endif - -#include - -#define FALSE 0 -#define TRUE 1 - -/*//////////////////////////// WavPack Header ///////////////////////////////// */ - -/* Note that this is the ONLY structure that is written to (or read from) */ -/* WavPack 4.0 files, and is the preamble to every block in both the .wv */ -/* and .wvc files. */ - -typedef struct { - char ckID [4]; - uint32_t ckSize; - short version; - uchar track_no, index_no; - uint32_t total_samples, block_index, block_samples, flags, crc; -} WavpackHeader; - -#define WavpackHeaderFormat "4LS2LLLLL" - -/* or-values for "flags" */ - -#define BYTES_STORED 3 /* 1-4 bytes/sample */ -#define MONO_FLAG 4 /* not stereo */ -#define HYBRID_FLAG 8 /* hybrid mode */ -#define JOINT_STEREO 0x10 /* joint stereo */ -#define CROSS_DECORR 0x20 /* no-delay cross decorrelation */ -#define HYBRID_SHAPE 0x40 /* noise shape (hybrid mode only) */ -#define FLOAT_DATA 0x80 /* ieee 32-bit floating point data */ - -#define INT32_DATA 0x100 /* special extended int handling */ -#define HYBRID_BITRATE 0x200 /* bitrate noise (hybrid mode only) */ -#define HYBRID_BALANCE 0x400 /* balance noise (hybrid stereo mode only) */ - -#define INITIAL_BLOCK 0x800 /* initial block of multichannel segment */ -#define FINAL_BLOCK 0x1000 /* final block of multichannel segment */ - -#define SHIFT_LSB 13 -#define SHIFT_MASK (0x1fL << SHIFT_LSB) - -#define MAG_LSB 18 -#define MAG_MASK (0x1fL << MAG_LSB) - -#define SRATE_LSB 23 -#define SRATE_MASK (0xfL << SRATE_LSB) - -#define FALSE_STEREO 0x40000000 /* block is stereo, but data is mono */ - -#define IGNORED_FLAGS 0x18000000 /* reserved, but ignore if encountered */ -#define NEW_SHAPING 0x20000000 /* use IIR filter for negative shaping */ -#define UNKNOWN_FLAGS 0x80000000 /* also reserved, but refuse decode if */ - /* encountered */ - -#define MONO_DATA (MONO_FLAG | FALSE_STEREO) - -#define MIN_STREAM_VERS 0x402 /* lowest stream version we'll decode */ -#define MAX_STREAM_VERS 0x410 /* highest stream version we'll decode */ - -/*////////////////////////// WavPack Metadata ///////////////////////////////// */ - -/* This is an internal representation of metadata. */ - -typedef struct { - int32_t byte_length; - void *data; - uchar id; -} WavpackMetadata; - -#define ID_OPTIONAL_DATA 0x20 -#define ID_ODD_SIZE 0x40 -#define ID_LARGE 0x80 - -#define ID_DUMMY 0x0 -#define ID_ENCODER_INFO 0x1 -#define ID_DECORR_TERMS 0x2 -#define ID_DECORR_WEIGHTS 0x3 -#define ID_DECORR_SAMPLES 0x4 -#define ID_ENTROPY_VARS 0x5 -#define ID_HYBRID_PROFILE 0x6 -#define ID_SHAPING_WEIGHTS 0x7 -#define ID_FLOAT_INFO 0x8 -#define ID_INT32_INFO 0x9 -#define ID_WV_BITSTREAM 0xa -#define ID_WVC_BITSTREAM 0xb -#define ID_WVX_BITSTREAM 0xc -#define ID_CHANNEL_INFO 0xd - -#define ID_RIFF_HEADER (ID_OPTIONAL_DATA | 0x1) -#define ID_RIFF_TRAILER (ID_OPTIONAL_DATA | 0x2) -#define ID_REPLAY_GAIN (ID_OPTIONAL_DATA | 0x3) -#define ID_CUESHEET (ID_OPTIONAL_DATA | 0x4) -#define ID_CONFIG_BLOCK (ID_OPTIONAL_DATA | 0x5) -#define ID_MD5_CHECKSUM (ID_OPTIONAL_DATA | 0x6) - -/*/////////////////////// WavPack Configuration /////////////////////////////// */ - -/* This internal structure is used during encode to provide configuration to */ -/* the encoding engine and during decoding to provide fle information back to */ -/* the higher level functions. Not all fields are used in both modes. */ - -typedef struct { - int bits_per_sample, bytes_per_sample; - int num_channels, float_norm_exp; - uint32_t flags, sample_rate, channel_mask; -} WavpackConfig; - -#define CONFIG_BYTES_STORED 3 /* 1-4 bytes/sample */ -#define CONFIG_MONO_FLAG 4 /* not stereo */ -#define CONFIG_HYBRID_FLAG 8 /* hybrid mode */ -#define CONFIG_JOINT_STEREO 0x10 /* joint stereo */ -#define CONFIG_CROSS_DECORR 0x20 /* no-delay cross decorrelation */ -#define CONFIG_HYBRID_SHAPE 0x40 /* noise shape (hybrid mode only) */ -#define CONFIG_FLOAT_DATA 0x80 /* ieee 32-bit floating point data */ - -#define CONFIG_FAST_FLAG 0x200 /* fast mode */ -#define CONFIG_HIGH_FLAG 0x800 /* high quality mode */ -#define CONFIG_VERY_HIGH_FLAG 0x1000 /* very high */ -#define CONFIG_BITRATE_KBPS 0x2000 /* bitrate is kbps, not bits / sample */ -#define CONFIG_AUTO_SHAPING 0x4000 /* automatic noise shaping */ -#define CONFIG_SHAPE_OVERRIDE 0x8000 /* shaping mode specified */ -#define CONFIG_JOINT_OVERRIDE 0x10000 /* joint-stereo mode specified */ -#define CONFIG_CREATE_EXE 0x40000 /* create executable */ -#define CONFIG_CREATE_WVC 0x80000 /* create correction file */ -#define CONFIG_OPTIMIZE_WVC 0x100000 /* maximize bybrid compression */ -#define CONFIG_CALC_NOISE 0x800000 /* calc noise in hybrid mode */ -#define CONFIG_LOSSY_MODE 0x1000000 /* obsolete (for information) */ -#define CONFIG_EXTRA_MODE 0x2000000 /* extra processing mode */ -#define CONFIG_SKIP_WVX 0x4000000 /* no wvx stream w/ floats & big ints */ -#define CONFIG_MD5_CHECKSUM 0x8000000 /* compute & store MD5 signature */ -#define CONFIG_OPTIMIZE_MONO 0x80000000 /* optimize for mono streams posing as stereo */ - -/*////////////////////////////// WavPack Stream /////////////////////////////// */ - -/* This internal structure contains everything required to handle a WavPack */ -/* "stream", which is defined as a stereo or mono stream of audio samples. For */ -/* multichannel audio several of these would be required. Each stream contains */ -/* pointers to hold a complete allocated block of WavPack data, although it's */ -/* possible to decode WavPack blocks without buffering an entire block. */ - -typedef int32_t (*read_stream)(void *, int32_t); - -typedef struct bs { - uchar *buf, *end, *ptr; - void (*wrap)(struct bs *bs); - uint32_t file_bytes, sr; - int error, bc; - read_stream file; -} Bitstream; - -#define MAX_NTERMS 16 -#define MAX_TERM 8 - -struct decorr_pass { - short term, delta, weight_A, weight_B; - int32_t samples_A [MAX_TERM], samples_B [MAX_TERM]; -}; - -struct entropy_data { - uint32_t median [3], slow_level, error_limit; -}; - -struct words_data { - uint32_t bitrate_delta [2], bitrate_acc [2]; - uint32_t pend_data, holding_one, zeros_acc; - int holding_zero, pend_count; - struct entropy_data c [2]; -}; - -typedef struct { - WavpackHeader wphdr; - Bitstream wvbits; - - struct words_data w; - - int num_terms, mute_error; - uint32_t sample_index, crc; - - uchar int32_sent_bits, int32_zeros, int32_ones, int32_dups; - uchar float_flags, float_shift, float_max_exp, float_norm_exp; - - struct decorr_pass decorr_passes [MAX_NTERMS]; - -} WavpackStream; - -/* flags for float_flags: */ - -#define FLOAT_SHIFT_ONES 1 /* bits left-shifted into float = '1' */ -#define FLOAT_SHIFT_SAME 2 /* bits left-shifted into float are the same */ -#define FLOAT_SHIFT_SENT 4 /* bits shifted into float are sent literally */ -#define FLOAT_ZEROS_SENT 8 /* "zeros" are not all real zeros */ -#define FLOAT_NEG_ZEROS 0x10 /* contains negative zeros */ -#define FLOAT_EXCEPTIONS 0x20 /* contains exceptions (inf, nan, etc.) */ - -/*///////////////////////////// WavPack Context /////////////////////////////// */ - -/* This internal structure holds everything required to encode or decode WavPack */ -/* files. It is recommended that direct access to this structure be minimized */ -/* and the provided utilities used instead. */ - -typedef struct { - WavpackConfig config; - WavpackStream stream; - - uchar read_buffer [1024]; - char error_message [80]; - - read_stream infile; - uint32_t total_samples, crc_errors, first_flags; - int open_flags, norm_offset, reduced_channels, lossy_blocks; - -} WavpackContext; - -/*////////////////////// function prototypes and macros ////////////////////// */ - -#define CLEAR(destin) memset (&destin, 0, sizeof (destin)); - -/* bits.c */ - -void bs_open_read (Bitstream *bs, uchar *buffer_start, uchar *buffer_end, read_stream file, uint32_t file_bytes); - -#define bs_is_open(bs) ((bs)->ptr != NULL) - -#define getbit(bs) ( \ - (((bs)->bc) ? \ - ((bs)->bc--, (bs)->sr & 1) : \ - (((++((bs)->ptr) != (bs)->end) ? (void) 0 : (bs)->wrap (bs)), (bs)->bc = 7, ((bs)->sr = *((bs)->ptr)) & 1) \ - ) ? \ - ((bs)->sr >>= 1, 1) : \ - ((bs)->sr >>= 1, 0) \ -) - -#define getbits(value, nbits, bs) { \ - while ((nbits) > (bs)->bc) { \ - if (++((bs)->ptr) == (bs)->end) (bs)->wrap (bs); \ - (bs)->sr |= (int32_t)*((bs)->ptr) << (bs)->bc; \ - (bs)->bc += 8; \ - } \ - *(value) = (bs)->sr; \ - if ((bs)->bc > 32) { \ - (bs)->bc -= (nbits); \ - (bs)->sr = *((bs)->ptr) >> (8 - (bs)->bc); \ - } \ - else { \ - (bs)->bc -= (nbits); \ - (bs)->sr >>= (nbits); \ - } \ -} - -void little_endian_to_native (void *data, char *format); -void native_to_little_endian (void *data, char *format); - -/* These macros implement the weight application and update operations */ -/* that are at the heart of the decorrelation loops. Note that when there */ -/* are several alternative versions of the same macro (marked with PERFCOND) */ -/* then the versions are functionally equivalent with respect to WavPack */ -/* decoding and the user should choose the one that provides the best */ -/* performance. This may be easier to check when NOT using the assembly */ -/* language optimizations. */ - -#if 1 /* PERFCOND */ -#define apply_weight_i(weight, sample) ((weight * sample + 512) >> 10) -#else -#define apply_weight_i(weight, sample) ((((weight * sample) >> 8) + 2) >> 2) -#endif - -#define apply_weight_f(weight, sample) (((((sample & 0xffffL) * weight) >> 9) + \ - (((sample & ~0xffffL) >> 9) * weight) + 1) >> 1) - -#if 1 /* PERFCOND */ -#define apply_weight(weight, sample) (sample != (short) sample ? \ - apply_weight_f (weight, sample) : apply_weight_i (weight, sample)) -#else -#define apply_weight(weight, sample) ((int32_t)((weight * (int64_t) sample + 512) >> 10)) -#endif - -#if 0 /* PERFCOND */ -#define update_weight(weight, delta, source, result) \ - if (source && result) { int32_t s = (int32_t) (source ^ result) >> 31; weight = (delta ^ s) + (weight - s); } -#elif 1 -#define update_weight(weight, delta, source, result) \ - if (source && result) weight += (((source ^ result) >> 30) | 1) * delta -#else -#define update_weight(weight, delta, source, result) \ - if (source && result) (source ^ result) < 0 ? (weight -= delta) : (weight += delta) -#endif - -#define update_weight_clip(weight, delta, source, result) \ - if (source && result && ((source ^ result) < 0 ? (weight -= delta) < -1024 : (weight += delta) > 1024)) \ - weight = weight < 0 ? -1024 : 1024 - -/* unpack.c */ - -int unpack_init (WavpackContext *wpc); -int init_wv_bitstream (WavpackContext *wpc, WavpackMetadata *wpmd); -int read_decorr_terms (WavpackStream *wps, WavpackMetadata *wpmd); -int read_decorr_weights (WavpackStream *wps, WavpackMetadata *wpmd); -int read_decorr_samples (WavpackStream *wps, WavpackMetadata *wpmd); -int read_float_info (WavpackStream *wps, WavpackMetadata *wpmd); -int read_int32_info (WavpackStream *wps, WavpackMetadata *wpmd); -int read_channel_info (WavpackContext *wpc, WavpackMetadata *wpmd); -int read_config_info (WavpackContext *wpc, WavpackMetadata *wpmd); -int32_t unpack_samples (WavpackContext *wpc, int32_t *buffer, uint32_t sample_count); -int check_crc_error (WavpackContext *wpc); - -/* metadata.c stuff */ - -int read_metadata_buff (WavpackContext *wpc, WavpackMetadata *wpmd); -int process_metadata (WavpackContext *wpc, WavpackMetadata *wpmd); - -/* words.c stuff */ - -int read_entropy_vars (WavpackStream *wps, WavpackMetadata *wpmd); -int read_hybrid_profile (WavpackStream *wps, WavpackMetadata *wpmd); -int32_t get_words (int32_t *buffer, int nsamples, uint32_t flags, - struct words_data *w, Bitstream *bs); -int32_t exp2s (int log); -int restore_weight (signed char weight); - -#define WORD_EOF (1L << 31) - -/* float.c */ - -int read_float_info (WavpackStream *wps, WavpackMetadata *wpmd); -void float_values (WavpackStream *wps, int32_t *values, int32_t num_values); - -/* wputils.c */ - -WavpackContext *WavpackOpenFileInput (read_stream infile, char *error); - -int WavpackGetMode (WavpackContext *wpc); - -#define MODE_WVC 0x1 -#define MODE_LOSSLESS 0x2 -#define MODE_HYBRID 0x4 -#define MODE_FLOAT 0x8 -#define MODE_VALID_TAG 0x10 -#define MODE_HIGH 0x20 -#define MODE_FAST 0x40 - -uint32_t WavpackUnpackSamples (WavpackContext *wpc, int32_t *buffer, uint32_t samples); -uint32_t WavpackGetNumSamples (WavpackContext *wpc); -uint32_t WavpackGetSampleIndex (WavpackContext *wpc); -int WavpackGetNumErrors (WavpackContext *wpc); -int WavpackLossyBlocks (WavpackContext *wpc); -uint32_t WavpackGetSampleRate (WavpackContext *wpc); -int WavpackGetBitsPerSample (WavpackContext *wpc); -int WavpackGetBytesPerSample (WavpackContext *wpc); -int WavpackGetNumChannels (WavpackContext *wpc); -int WavpackGetReducedChannels (WavpackContext *wpc); diff --git a/src/engine/external/wavpack/words.c b/src/engine/external/wavpack/words.c deleted file mode 100644 index d39563b0ca..0000000000 --- a/src/engine/external/wavpack/words.c +++ /dev/null @@ -1,560 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2006 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// words.c - -// This module provides entropy word encoding and decoding functions using -// a variation on the Rice method. This was introduced in version 3.93 -// because it allows splitting the data into a "lossy" stream and a -// "correction" stream in a very efficient manner and is therefore ideal -// for the "hybrid" mode. For 4.0, the efficiency of this method was -// significantly improved by moving away from the normal Rice restriction of -// using powers of two for the modulus divisions and now the method can be -// used for both hybrid and pure lossless encoding. - -// Samples are divided by median probabilities at 5/7 (71.43%), 10/49 (20.41%), -// and 20/343 (5.83%). Each zone has 3.5 times fewer samples than the -// previous. Using standard Rice coding on this data would result in 1.4 -// bits per sample average (not counting sign bit). However, there is a -// very simple encoding that is over 99% efficient with this data and -// results in about 1.22 bits per sample. - -#include "wavpack.h" - -#include - -//////////////////////////////// local macros ///////////////////////////////// - -#define LIMIT_ONES 16 // maximum consecutive 1s sent for "div" data - -// these control the time constant "slow_level" which is used for hybrid mode -// that controls bitrate as a function of residual level (HYBRID_BITRATE). -#define SLS 8 -#define SLO ((1 << (SLS - 1))) - -// these control the time constant of the 3 median level breakpoints -#define DIV0 128 // 5/7 of samples -#define DIV1 64 // 10/49 of samples -#define DIV2 32 // 20/343 of samples - -// this macro retrieves the specified median breakpoint (without frac; min = 1) -#define GET_MED(med) (((c->median [med]) >> 4) + 1) - -// These macros update the specified median breakpoints. Note that the median -// is incremented when the sample is higher than the median, else decremented. -// They are designed so that the median will never drop below 1 and the value -// is essentially stationary if there are 2 increments for every 5 decrements. - -#define INC_MED0() (c->median [0] += ((c->median [0] + DIV0) / DIV0) * 5) -#define DEC_MED0() (c->median [0] -= ((c->median [0] + (DIV0-2)) / DIV0) * 2) -#define INC_MED1() (c->median [1] += ((c->median [1] + DIV1) / DIV1) * 5) -#define DEC_MED1() (c->median [1] -= ((c->median [1] + (DIV1-2)) / DIV1) * 2) -#define INC_MED2() (c->median [2] += ((c->median [2] + DIV2) / DIV2) * 5) -#define DEC_MED2() (c->median [2] -= ((c->median [2] + (DIV2-2)) / DIV2) * 2) - -#define count_bits(av) ( \ - (av) < (1 << 8) ? nbits_table [av] : \ - ( \ - (av) < (1L << 16) ? nbits_table [(av) >> 8] + 8 : \ - ((av) < (1L << 24) ? nbits_table [(av) >> 16] + 16 : nbits_table [(av) >> 24] + 24) \ - ) \ -) - -///////////////////////////// local table storage //////////////////////////// - -const char nbits_table [] = { - 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, // 0 - 15 - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, // 16 - 31 - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, // 32 - 47 - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, // 48 - 63 - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 64 - 79 - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 80 - 95 - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 96 - 111 - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 112 - 127 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 128 - 143 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 144 - 159 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 160 - 175 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 176 - 191 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 192 - 207 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 208 - 223 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 224 - 239 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 // 240 - 255 -}; - -static const uchar log2_table [] = { - 0x00, 0x01, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, 0x15, - 0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a, - 0x2c, 0x2d, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e, - 0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x50, 0x51, - 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, - 0x64, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75, - 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, - 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, - 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, - 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb2, - 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc0, - 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcd, 0xce, - 0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd8, 0xd9, 0xda, 0xdb, - 0xdc, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe4, 0xe5, 0xe6, 0xe7, 0xe7, - 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xee, 0xef, 0xf0, 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, - 0xf4, 0xf5, 0xf6, 0xf7, 0xf7, 0xf8, 0xf9, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, 0xff, 0xff -}; - -static const uchar exp2_table [] = { - 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b, - 0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x15, 0x16, 0x16, - 0x17, 0x18, 0x19, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x20, 0x21, 0x22, 0x23, - 0x24, 0x24, 0x25, 0x26, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3a, 0x3b, 0x3c, 0x3d, - 0x3e, 0x3f, 0x40, 0x41, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x48, 0x49, 0x4a, 0x4b, - 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, - 0x5b, 0x5c, 0x5d, 0x5e, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, - 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, - 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8a, - 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, - 0x9c, 0x9d, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, - 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, - 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc8, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf, 0xd0, 0xd2, 0xd3, 0xd4, - 0xd6, 0xd7, 0xd8, 0xd9, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe8, 0xe9, - 0xea, 0xec, 0xed, 0xee, 0xf0, 0xf1, 0xf2, 0xf4, 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xff -}; - -static const char ones_count_table [] = { - 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5, - 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6, - 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5, - 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7, - 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5, - 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6, - 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5, - 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,8 -}; - -///////////////////////////// executable code //////////////////////////////// - -void init_words (WavpackStream *wps) -{ - CLEAR (wps->w); -} - -static int mylog2 (uint32_t avalue); - -// Read the median log2 values from the specifed metadata structure, convert -// them back to 32-bit unsigned values and store them. If length is not -// exactly correct then we flag and return an error. - -int read_entropy_vars (WavpackStream *wps, WavpackMetadata *wpmd) -{ - uchar *byteptr = wpmd->data; - - if (wpmd->byte_length != ((wps->wphdr.flags & MONO_DATA) ? 6 : 12)) - return FALSE; - - wps->w.c [0].median [0] = exp2s (byteptr [0] + (byteptr [1] << 8)); - wps->w.c [0].median [1] = exp2s (byteptr [2] + (byteptr [3] << 8)); - wps->w.c [0].median [2] = exp2s (byteptr [4] + (byteptr [5] << 8)); - - if (!(wps->wphdr.flags & MONO_DATA)) { - wps->w.c [1].median [0] = exp2s (byteptr [6] + (byteptr [7] << 8)); - wps->w.c [1].median [1] = exp2s (byteptr [8] + (byteptr [9] << 8)); - wps->w.c [1].median [2] = exp2s (byteptr [10] + (byteptr [11] << 8)); - } - - return TRUE; -} - -// Read the hybrid related values from the specifed metadata structure, convert -// them back to their internal formats and store them. The extended profile -// stuff is not implemented yet, so return an error if we get more data than -// we know what to do with. - -int read_hybrid_profile (WavpackStream *wps, WavpackMetadata *wpmd) -{ - uchar *byteptr = wpmd->data; - uchar *endptr = byteptr + wpmd->byte_length; - - if (wps->wphdr.flags & HYBRID_BITRATE) { - wps->w.c [0].slow_level = exp2s (byteptr [0] + (byteptr [1] << 8)); - byteptr += 2; - - if (!(wps->wphdr.flags & MONO_DATA)) { - wps->w.c [1].slow_level = exp2s (byteptr [0] + (byteptr [1] << 8)); - byteptr += 2; - } - } - - wps->w.bitrate_acc [0] = (int32_t)(byteptr [0] + (byteptr [1] << 8)) << 16; - byteptr += 2; - - if (!(wps->wphdr.flags & MONO_DATA)) { - wps->w.bitrate_acc [1] = (int32_t)(byteptr [0] + (byteptr [1] << 8)) << 16; - byteptr += 2; - } - - if (byteptr < endptr) { - wps->w.bitrate_delta [0] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8))); - byteptr += 2; - - if (!(wps->wphdr.flags & MONO_DATA)) { - wps->w.bitrate_delta [1] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8))); - byteptr += 2; - } - - if (byteptr < endptr) - return FALSE; - } - else - wps->w.bitrate_delta [0] = wps->w.bitrate_delta [1] = 0; - - return TRUE; -} - -// This function is called during both encoding and decoding of hybrid data to -// update the "error_limit" variable which determines the maximum sample error -// allowed in the main bitstream. In the HYBRID_BITRATE mode (which is the only -// currently implemented) this is calculated from the slow_level values and the -// bitrate accumulators. Note that the bitrate accumulators can be changing. - -void update_error_limit (struct words_data *w, uint32_t flags) -{ - int bitrate_0 = (w->bitrate_acc [0] += w->bitrate_delta [0]) >> 16; - - if (flags & MONO_DATA) { - if (flags & HYBRID_BITRATE) { - int slow_log_0 = (w->c [0].slow_level + SLO) >> SLS; - - if (slow_log_0 - bitrate_0 > -0x100) - w->c [0].error_limit = exp2s (slow_log_0 - bitrate_0 + 0x100); - else - w->c [0].error_limit = 0; - } - else - w->c [0].error_limit = exp2s (bitrate_0); - } - else { - int bitrate_1 = (w->bitrate_acc [1] += w->bitrate_delta [1]) >> 16; - - if (flags & HYBRID_BITRATE) { - int slow_log_0 = (w->c [0].slow_level + SLO) >> SLS; - int slow_log_1 = (w->c [1].slow_level + SLO) >> SLS; - - if (flags & HYBRID_BALANCE) { - int balance = (slow_log_1 - slow_log_0 + bitrate_1 + 1) >> 1; - - if (balance > bitrate_0) { - bitrate_1 = bitrate_0 * 2; - bitrate_0 = 0; - } - else if (-balance > bitrate_0) { - bitrate_0 = bitrate_0 * 2; - bitrate_1 = 0; - } - else { - bitrate_1 = bitrate_0 + balance; - bitrate_0 = bitrate_0 - balance; - } - } - - if (slow_log_0 - bitrate_0 > -0x100) - w->c [0].error_limit = exp2s (slow_log_0 - bitrate_0 + 0x100); - else - w->c [0].error_limit = 0; - - if (slow_log_1 - bitrate_1 > -0x100) - w->c [1].error_limit = exp2s (slow_log_1 - bitrate_1 + 0x100); - else - w->c [1].error_limit = 0; - } - else { - w->c [0].error_limit = exp2s (bitrate_0); - w->c [1].error_limit = exp2s (bitrate_1); - } - } -} - -static uint32_t read_code (Bitstream *bs, uint32_t maxcode); - -// Read the next word from the bitstream "wvbits" and return the value. This -// function can be used for hybrid or lossless streams, but since an -// optimized version is available for lossless this function would normally -// be used for hybrid only. If a hybrid lossless stream is being read then -// the "correction" offset is written at the specified pointer. A return value -// of WORD_EOF indicates that the end of the bitstream was reached (all 1s) or -// some other error occurred. - -int32_t get_words (int32_t *buffer, int nsamples, uint32_t flags, - struct words_data *w, Bitstream *bs) -{ - register struct entropy_data *c = w->c; - int csamples; - - if (!(flags & MONO_DATA)) - nsamples *= 2; - - for (csamples = 0; csamples < nsamples; ++csamples) { - uint32_t ones_count, low, mid, high; - - if (!(flags & MONO_DATA)) - c = w->c + (csamples & 1); - - if (!(w->c [0].median [0] & ~1) && !w->holding_zero && !w->holding_one && !(w->c [1].median [0] & ~1)) { - uint32_t mask; - int cbits; - - if (w->zeros_acc) { - if (--w->zeros_acc) { - c->slow_level -= (c->slow_level + SLO) >> SLS; - *buffer++ = 0; - continue; - } - } - else { - for (cbits = 0; cbits < 33 && getbit (bs); ++cbits); - - if (cbits == 33) - break; - - if (cbits < 2) - w->zeros_acc = cbits; - else { - for (mask = 1, w->zeros_acc = 0; --cbits; mask <<= 1) - if (getbit (bs)) - w->zeros_acc |= mask; - - w->zeros_acc |= mask; - } - - if (w->zeros_acc) { - c->slow_level -= (c->slow_level + SLO) >> SLS; - CLEAR (w->c [0].median); - CLEAR (w->c [1].median); - *buffer++ = 0; - continue; - } - } - } - - if (w->holding_zero) - ones_count = w->holding_zero = 0; - else { - int next8; - - if (bs->bc < 8) { - if (++(bs->ptr) == bs->end) - bs->wrap (bs); - - next8 = (bs->sr |= *(bs->ptr) << bs->bc) & 0xff; - bs->bc += 8; - } - else - next8 = bs->sr & 0xff; - - if (next8 == 0xff) { - bs->bc -= 8; - bs->sr >>= 8; - - for (ones_count = 8; ones_count < (LIMIT_ONES + 1) && getbit (bs); ++ones_count); - - if (ones_count == (LIMIT_ONES + 1)) - break; - - if (ones_count == LIMIT_ONES) { - uint32_t mask; - int cbits; - - for (cbits = 0; cbits < 33 && getbit (bs); ++cbits); - - if (cbits == 33) - break; - - if (cbits < 2) - ones_count = cbits; - else { - for (mask = 1, ones_count = 0; --cbits; mask <<= 1) - if (getbit (bs)) - ones_count |= mask; - - ones_count |= mask; - } - - ones_count += LIMIT_ONES; - } - } - else { - bs->bc -= (ones_count = ones_count_table [next8]) + 1; - bs->sr >>= ones_count + 1; - } - - if (w->holding_one) { - w->holding_one = ones_count & 1; - ones_count = (ones_count >> 1) + 1; - } - else { - w->holding_one = ones_count & 1; - ones_count >>= 1; - } - - w->holding_zero = ~w->holding_one & 1; - } - - if ((flags & HYBRID_FLAG) && ((flags & MONO_DATA) || !(csamples & 1))) - update_error_limit (w, flags); - - if (ones_count == 0) { - low = 0; - high = GET_MED (0) - 1; - DEC_MED0 (); - } - else { - low = GET_MED (0); - INC_MED0 (); - - if (ones_count == 1) { - high = low + GET_MED (1) - 1; - DEC_MED1 (); - } - else { - low += GET_MED (1); - INC_MED1 (); - - if (ones_count == 2) { - high = low + GET_MED (2) - 1; - DEC_MED2 (); - } - else { - low += (ones_count - 2) * GET_MED (2); - high = low + GET_MED (2) - 1; - INC_MED2 (); - } - } - } - - mid = (high + low + 1) >> 1; - - if (!c->error_limit) - mid = read_code (bs, high - low) + low; - else while (high - low > c->error_limit) { - if (getbit (bs)) - mid = (high + (low = mid) + 1) >> 1; - else - mid = ((high = mid - 1) + low + 1) >> 1; - } - - *buffer++ = getbit (bs) ? ~mid : mid; - - if (flags & HYBRID_BITRATE) - c->slow_level = c->slow_level - ((c->slow_level + SLO) >> SLS) + mylog2 (mid); - } - - return (flags & MONO_DATA) ? csamples : (csamples / 2); -} - -// Read a single unsigned value from the specified bitstream with a value -// from 0 to maxcode. If there are exactly a power of two number of possible -// codes then this will read a fixed number of bits; otherwise it reads the -// minimum number of bits and then determines whether another bit is needed -// to define the code. - -static uint32_t read_code (Bitstream *bs, uint32_t maxcode) -{ - int bitcount = count_bits (maxcode); - uint32_t extras = (1L << bitcount) - maxcode - 1, code; - - if (!bitcount) - return 0; - - getbits (&code, bitcount - 1, bs); - code &= (1L << (bitcount - 1)) - 1; - - if (code >= extras) { - code = (code << 1) - extras; - - if (getbit (bs)) - ++code; - } - - return code; -} - -// The concept of a base 2 logarithm is used in many parts of WavPack. It is -// a way of sufficiently accurately representing 32-bit signed and unsigned -// values storing only 16 bits (actually fewer). It is also used in the hybrid -// mode for quickly comparing the relative magnitude of large values (i.e. -// division) and providing smooth exponentials using only addition. - -// These are not strict logarithms in that they become linear around zero and -// can therefore represent both zero and negative values. They have 8 bits -// of precision and in "roundtrip" conversions the total error never exceeds 1 -// part in 225 except for the cases of +/-115 and +/-195 (which error by 1). - - -// This function returns the log2 for the specified 32-bit unsigned value. -// The maximum value allowed is about 0xff800000 and returns 8447. - -static int mylog2 (uint32_t avalue) -{ - int dbits; - - if ((avalue += avalue >> 9) < (1 << 8)) { - dbits = nbits_table [avalue]; - return (dbits << 8) + log2_table [(avalue << (9 - dbits)) & 0xff]; - } - else { - if (avalue < (1L << 16)) - dbits = nbits_table [avalue >> 8] + 8; - else if (avalue < (1L << 24)) - dbits = nbits_table [avalue >> 16] + 16; - else - dbits = nbits_table [avalue >> 24] + 24; - - return (dbits << 8) + log2_table [(avalue >> (dbits - 9)) & 0xff]; - } -} - -// This function returns the log2 for the specified 32-bit signed value. -// All input values are valid and the return values are in the range of -// +/- 8192. - -int log2s (int32_t value) -{ - return (value < 0) ? -mylog2 (-value) : mylog2 (value); -} - -// This function returns the original integer represented by the supplied -// logarithm (at least within the provided accuracy). The log is signed, -// but since a full 32-bit value is returned this can be used for unsigned -// conversions as well (i.e. the input range is -8192 to +8447). - -int32_t exp2s (int log) -{ - uint32_t value; - - if (log < 0) - return -exp2s (-log); - - value = exp2_table [log & 0xff] | 0x100; - - if ((log >>= 8) <= 9) - return value >> (9 - log); - else - return value << (log - 9); -} - -// These two functions convert internal weights (which are normally +/-1024) -// to and from an 8-bit signed character version for storage in metadata. The -// weights are clipped here in the case that they are outside that range. - -int restore_weight (signed char weight) -{ - int result; - - if ((result = (int) weight << 3) > 0) - result += (result + 64) >> 7; - - return result; -} diff --git a/src/engine/external/wavpack/wputils.c b/src/engine/external/wavpack/wputils.c deleted file mode 100644 index 1bc656103d..0000000000 --- a/src/engine/external/wavpack/wputils.c +++ /dev/null @@ -1,351 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2006 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// wputils.c - -// This module provides a high-level interface for decoding WavPack 4.0 audio -// streams and files. WavPack data is read with a stream reading callback. No -// direct seeking is provided for, but it is possible to start decoding -// anywhere in a WavPack stream. In this case, WavPack will be able to provide -// the sample-accurate position when it synchs with the data and begins -// decoding. - -#include "wavpack.h" - -#include - -///////////////////////////// local table storage //////////////////////////// - -const uint32_t sample_rates [] = { 6000, 8000, 9600, 11025, 12000, 16000, 22050, - 24000, 32000, 44100, 48000, 64000, 88200, 96000, 192000 }; - -///////////////////////////// executable code //////////////////////////////// - -static uint32_t read_next_header (read_stream infile, WavpackHeader *wphdr); - -// This function reads data from the specified stream in search of a valid -// WavPack 4.0 audio block. If this fails in 1 megabyte (or an invalid or -// unsupported WavPack block is encountered) then an appropriate message is -// copied to "error" and NULL is returned, otherwise a pointer to a -// WavpackContext structure is returned (which is used to call all other -// functions in this module). This can be initiated at the beginning of a -// WavPack file, or anywhere inside a WavPack file. To determine the exact -// position within the file use WavpackGetSampleIndex(). For demonstration -// purposes this uses a single static copy of the WavpackContext structure, -// so obviously it cannot be used for more than one file at a time. Also, -// this function will not handle "correction" files, plays only the first -// two channels of multi-channel files, and is limited in resolution in some -// large integer or floating point files (but always provides at least 24 bits -// of resolution). - -static WavpackContext wpc; - -WavpackContext *WavpackOpenFileInput (read_stream infile, char *error) -{ - WavpackStream *wps = &wpc.stream; - uint32_t bcount; - - CLEAR (wpc); - wpc.infile = infile; - wpc.total_samples = (uint32_t) -1; - wpc.norm_offset = 0; - wpc.open_flags = 0; - - // open the source file for reading and store the size - - while (!wps->wphdr.block_samples) { - - bcount = read_next_header (wpc.infile, &wps->wphdr); - - if (bcount == (uint32_t) -1) { - strcpy (error, "not compatible with this version of WavPack file!"); - return NULL; - } - - if (wps->wphdr.block_samples && wps->wphdr.total_samples != (uint32_t) -1) - wpc.total_samples = wps->wphdr.total_samples; - - if (!unpack_init (&wpc)) { - strcpy (error, wpc.error_message [0] ? wpc.error_message : - "not compatible with this version of WavPack file!"); - - return NULL; - } - } - - wpc.config.flags &= ~0xff; - wpc.config.flags |= wps->wphdr.flags & 0xff; - wpc.config.bytes_per_sample = (wps->wphdr.flags & BYTES_STORED) + 1; - wpc.config.float_norm_exp = wps->float_norm_exp; - - wpc.config.bits_per_sample = (wpc.config.bytes_per_sample * 8) - - ((wps->wphdr.flags & SHIFT_MASK) >> SHIFT_LSB); - - if (wpc.config.flags & FLOAT_DATA) { - wpc.config.bytes_per_sample = 3; - wpc.config.bits_per_sample = 24; - } - - if (!wpc.config.sample_rate) { - if (!wps || !wps->wphdr.block_samples || (wps->wphdr.flags & SRATE_MASK) == SRATE_MASK) - wpc.config.sample_rate = 44100; - else - wpc.config.sample_rate = sample_rates [(wps->wphdr.flags & SRATE_MASK) >> SRATE_LSB]; - } - - if (!wpc.config.num_channels) { - wpc.config.num_channels = (wps->wphdr.flags & MONO_FLAG) ? 1 : 2; - wpc.config.channel_mask = 0x5 - wpc.config.num_channels; - } - - if (!(wps->wphdr.flags & FINAL_BLOCK)) - wpc.reduced_channels = (wps->wphdr.flags & MONO_FLAG) ? 1 : 2; - - return &wpc; -} - -// This function obtains general information about an open file and returns -// a mask with the following bit values: - -// MODE_LOSSLESS: file is lossless (pure lossless only) -// MODE_HYBRID: file is hybrid mode (lossy part only) -// MODE_FLOAT: audio data is 32-bit ieee floating point (but will provided -// in 24-bit integers for convenience) -// MODE_HIGH: file was created in "high" mode (information only) -// MODE_FAST: file was created in "fast" mode (information only) - -int WavpackGetMode (WavpackContext *wpc) -{ - int mode = 0; - - if (wpc) { - if (wpc->config.flags & CONFIG_HYBRID_FLAG) - mode |= MODE_HYBRID; - else if (!(wpc->config.flags & CONFIG_LOSSY_MODE)) - mode |= MODE_LOSSLESS; - - if (wpc->lossy_blocks) - mode &= ~MODE_LOSSLESS; - - if (wpc->config.flags & CONFIG_FLOAT_DATA) - mode |= MODE_FLOAT; - - if (wpc->config.flags & CONFIG_HIGH_FLAG) - mode |= MODE_HIGH; - - if (wpc->config.flags & CONFIG_FAST_FLAG) - mode |= MODE_FAST; - } - - return mode; -} - -// Unpack the specified number of samples from the current file position. -// Note that "samples" here refers to "complete" samples, which would be -// 2 longs for stereo files. The audio data is returned right-justified in -// 32-bit longs in the endian mode native to the executing processor. So, -// if the original data was 16-bit, then the values returned would be -// +/-32k. Floating point data will be returned as 24-bit integers (and may -// also be clipped). The actual number of samples unpacked is returned, -// which should be equal to the number requested unless the end of fle is -// encountered or an error occurs. - -uint32_t WavpackUnpackSamples (WavpackContext *wpc, int32_t *buffer, uint32_t samples) -{ - WavpackStream *wps = &wpc->stream; - uint32_t bcount, samples_unpacked = 0, samples_to_unpack; - int num_channels = wpc->config.num_channels; - - while (samples) { - if (!wps->wphdr.block_samples || !(wps->wphdr.flags & INITIAL_BLOCK) || - wps->sample_index >= wps->wphdr.block_index + wps->wphdr.block_samples) { - bcount = read_next_header (wpc->infile, &wps->wphdr); - - if (bcount == (uint32_t) -1) - break; - - if (!wps->wphdr.block_samples || wps->sample_index == wps->wphdr.block_index) - if (!unpack_init (wpc)) - break; - } - - if (!wps->wphdr.block_samples || !(wps->wphdr.flags & INITIAL_BLOCK) || - wps->sample_index >= wps->wphdr.block_index + wps->wphdr.block_samples) - continue; - - if (wps->sample_index < wps->wphdr.block_index) { - samples_to_unpack = wps->wphdr.block_index - wps->sample_index; - - if (samples_to_unpack > samples) - samples_to_unpack = samples; - - wps->sample_index += samples_to_unpack; - samples_unpacked += samples_to_unpack; - samples -= samples_to_unpack; - - if (wpc->reduced_channels) - samples_to_unpack *= wpc->reduced_channels; - else - samples_to_unpack *= num_channels; - - while (samples_to_unpack--) - *buffer++ = 0; - - continue; - } - - samples_to_unpack = wps->wphdr.block_index + wps->wphdr.block_samples - wps->sample_index; - - if (samples_to_unpack > samples) - samples_to_unpack = samples; - - unpack_samples (wpc, buffer, samples_to_unpack); - - if (wpc->reduced_channels) - buffer += samples_to_unpack * wpc->reduced_channels; - else - buffer += samples_to_unpack * num_channels; - - samples_unpacked += samples_to_unpack; - samples -= samples_to_unpack; - - if (wps->sample_index == wps->wphdr.block_index + wps->wphdr.block_samples) { - if (check_crc_error (wpc)) - wpc->crc_errors++; - } - - if (wps->sample_index == wpc->total_samples) - break; - } - - return samples_unpacked; -} - -// Get total number of samples contained in the WavPack file, or -1 if unknown - -uint32_t WavpackGetNumSamples (WavpackContext *wpc) -{ - return wpc ? wpc->total_samples : (uint32_t) -1; -} - -// Get the current sample index position, or -1 if unknown - -uint32_t WavpackGetSampleIndex (WavpackContext *wpc) -{ - if (wpc) - return wpc->stream.sample_index; - - return (uint32_t) -1; -} - -// Get the number of errors encountered so far - -int WavpackGetNumErrors (WavpackContext *wpc) -{ - return wpc ? wpc->crc_errors : 0; -} - -// return TRUE if any uncorrected lossy blocks were actually written or read - -int WavpackLossyBlocks (WavpackContext *wpc) -{ - return wpc ? wpc->lossy_blocks : 0; -} - -// Returns the sample rate of the specified WavPack file - -uint32_t WavpackGetSampleRate (WavpackContext *wpc) -{ - return wpc ? wpc->config.sample_rate : 44100; -} - -// Returns the number of channels of the specified WavPack file. Note that -// this is the actual number of channels contained in the file, but this -// version can only decode the first two. - -int WavpackGetNumChannels (WavpackContext *wpc) -{ - return wpc ? wpc->config.num_channels : 2; -} - -// Returns the actual number of valid bits per sample contained in the -// original file, which may or may not be a multiple of 8. Floating data -// always has 32 bits, integers may be from 1 to 32 bits each. When this -// value is not a multiple of 8, then the "extra" bits are located in the -// LSBs of the results. That is, values are right justified when unpacked -// into longs, but are left justified in the number of bytes used by the -// original data. - -int WavpackGetBitsPerSample (WavpackContext *wpc) -{ - return wpc ? wpc->config.bits_per_sample : 16; -} - -// Returns the number of bytes used for each sample (1 to 4) in the original -// file. This is required information for the user of this module because the -// audio data is returned in the LOWER bytes of the long buffer and must be -// left-shifted 8, 16, or 24 bits if normalized longs are required. - -int WavpackGetBytesPerSample (WavpackContext *wpc) -{ - return wpc ? wpc->config.bytes_per_sample : 2; -} - -// This function will return the actual number of channels decoded from the -// file (which may or may not be less than the actual number of channels, but -// will always be 1 or 2). Normally, this will be the front left and right -// channels of a multi-channel file. - -int WavpackGetReducedChannels (WavpackContext *wpc) -{ - if (wpc) - return wpc->reduced_channels ? wpc->reduced_channels : wpc->config.num_channels; - else - return 2; -} - -// Read from current file position until a valid 32-byte WavPack 4.0 header is -// found and read into the specified pointer. The number of bytes skipped is -// returned. If no WavPack header is found within 1 meg, then a -1 is returned -// to indicate the error. No additional bytes are read past the header and it -// is returned in the processor's native endian mode. Seeking is not required. - -static uint32_t read_next_header (read_stream infile, WavpackHeader *wphdr) -{ - char buffer [sizeof (*wphdr)], *sp = buffer + sizeof (*wphdr), *ep = sp; - uint32_t bytes_skipped = 0; - int bleft; - - while (1) { - if (sp < ep) { - bleft = ep - sp; - memcpy (buffer, sp, bleft); - } - else - bleft = 0; - - if (infile (buffer + bleft, sizeof (*wphdr) - bleft) != (int32_t) sizeof (*wphdr) - bleft) - return -1; - - sp = buffer; - - if (*sp++ == 'w' && *sp == 'v' && *++sp == 'p' && *++sp == 'k' && - !(*++sp & 1) && sp [2] < 16 && !sp [3] && sp [5] == 4 && - sp [4] >= (MIN_STREAM_VERS & 0xff) && sp [4] <= (MAX_STREAM_VERS & 0xff)) { - memcpy (wphdr, buffer, sizeof (*wphdr)); - little_endian_to_native (wphdr, WavpackHeaderFormat); - return bytes_skipped; - } - - while (sp < ep && *sp != 'w') - sp++; - - if ((bytes_skipped += sp - buffer) > 1048576L) - return -1; - } -} diff --git a/src/engine/external/wavpack/wvfilter.c.no_compile b/src/engine/external/wavpack/wvfilter.c.no_compile deleted file mode 100644 index 236912dacd..0000000000 --- a/src/engine/external/wavpack/wvfilter.c.no_compile +++ /dev/null @@ -1,200 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2006 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// wv_filter.c - -// This is the main module for the demonstration WavPack command-line -// decoder filter. It uses the tiny "hardware" version of the decoder and -// accepts WavPack files on stdin and outputs a standard MS wav file to -// stdout. Note that this involves converting the data to little-endian -// (if the executing processor is not), possibly packing the data into -// fewer bytes per sample, and generating an appropriate riff wav header. -// Note that this is NOT the copy of the RIFF header that might be stored -// in the file, and any additional RIFF information and tags are lost. -// See wputils.c for further limitations. - -#include "wavpack.h" - -#if defined(WIN32) -#include -#include -#endif - -#include - -// These structures are used to place a wav riff header at the beginning of -// the output. - -typedef struct { - char ckID [4]; - uint32_t ckSize; - char formType [4]; -} RiffChunkHeader; - -typedef struct { - char ckID [4]; - uint32_t ckSize; -} ChunkHeader; - -#define ChunkHeaderFormat "4L" - -typedef struct { - ushort FormatTag, NumChannels; - uint32_t SampleRate, BytesPerSecond; - ushort BlockAlign, BitsPerSample; -} WaveHeader; - -#define WaveHeaderFormat "SSLLSS" - -static uchar *format_samples (int bps, uchar *dst, int32_t *src, uint32_t samcnt); -static int32_t read_bytes (void *buff, int32_t bcount); -static int32_t temp_buffer [256]; - -int main () -{ - ChunkHeader FormatChunkHeader, DataChunkHeader; - RiffChunkHeader RiffChunkHeader; - WaveHeader WaveHeader; - - uint32_t total_unpacked_samples = 0, total_samples; - int num_channels, bps; - WavpackContext *wpc; - char error [80]; - -#if defined(WIN32) - setmode (fileno (stdin), O_BINARY); - setmode (fileno (stdout), O_BINARY); -#endif - - wpc = WavpackOpenFileInput (read_bytes, error); - - if (!wpc) { - fputs (error, stderr); - fputs ("\n", stderr); - return 1; - } - - num_channels = WavpackGetReducedChannels (wpc); - total_samples = WavpackGetNumSamples (wpc); - bps = WavpackGetBytesPerSample (wpc); - - strncpy (RiffChunkHeader.ckID, "RIFF", sizeof (RiffChunkHeader.ckID)); - RiffChunkHeader.ckSize = total_samples * num_channels * bps + sizeof (ChunkHeader) * 2 + sizeof (WaveHeader) + 4; - strncpy (RiffChunkHeader.formType, "WAVE", sizeof (RiffChunkHeader.formType)); - - strncpy (FormatChunkHeader.ckID, "fmt ", sizeof (FormatChunkHeader.ckID)); - FormatChunkHeader.ckSize = sizeof (WaveHeader); - - WaveHeader.FormatTag = 1; - WaveHeader.NumChannels = num_channels; - WaveHeader.SampleRate = WavpackGetSampleRate (wpc); - WaveHeader.BlockAlign = num_channels * bps; - WaveHeader.BytesPerSecond = WaveHeader.SampleRate * WaveHeader.BlockAlign; - WaveHeader.BitsPerSample = WavpackGetBitsPerSample (wpc); - - strncpy (DataChunkHeader.ckID, "data", sizeof (DataChunkHeader.ckID)); - DataChunkHeader.ckSize = total_samples * num_channels * bps; - - native_to_little_endian (&RiffChunkHeader, ChunkHeaderFormat); - native_to_little_endian (&FormatChunkHeader, ChunkHeaderFormat); - native_to_little_endian (&WaveHeader, WaveHeaderFormat); - native_to_little_endian (&DataChunkHeader, ChunkHeaderFormat); - - if (!fwrite (&RiffChunkHeader, sizeof (RiffChunkHeader), 1, stdout) || - !fwrite (&FormatChunkHeader, sizeof (FormatChunkHeader), 1, stdout) || - !fwrite (&WaveHeader, sizeof (WaveHeader), 1, stdout) || - !fwrite (&DataChunkHeader, sizeof (DataChunkHeader), 1, stdout)) { - fputs ("can't write .WAV data, disk probably full!\n", stderr); - return 1; - } - - while (1) { - uint32_t samples_unpacked; - - samples_unpacked = WavpackUnpackSamples (wpc, temp_buffer, 256 / num_channels); - total_unpacked_samples += samples_unpacked; - - if (samples_unpacked) { - format_samples (bps, (uchar *) temp_buffer, temp_buffer, samples_unpacked *= num_channels); - - if (fwrite (temp_buffer, bps, samples_unpacked, stdout) != samples_unpacked) { - fputs ("can't write .WAV data, disk probably full!\n", stderr); - return 1; - } - } - - if (!samples_unpacked) - break; - } - - fflush (stdout); - - if (WavpackGetNumSamples (wpc) != (uint32_t) -1 && - total_unpacked_samples != WavpackGetNumSamples (wpc)) { - fputs ("incorrect number of samples!\n", stderr); - return 1; - } - - if (WavpackGetNumErrors (wpc)) { - fputs ("crc errors detected!\n", stderr); - return 1; - } - - return 0; -} - -static int32_t read_bytes (void *buff, int32_t bcount) -{ - return fread (buff, 1, bcount, stdin); -} - -// Reformat samples from longs in processor's native endian mode to -// little-endian data with (possibly) less than 4 bytes / sample. - -static uchar *format_samples (int bps, uchar *dst, int32_t *src, uint32_t samcnt) -{ - int32_t temp; - - switch (bps) { - - case 1: - while (samcnt--) - *dst++ = *src++ + 128; - - break; - - case 2: - while (samcnt--) { - *dst++ = (uchar)(temp = *src++); - *dst++ = (uchar)(temp >> 8); - } - - break; - - case 3: - while (samcnt--) { - *dst++ = (uchar)(temp = *src++); - *dst++ = (uchar)(temp >> 8); - *dst++ = (uchar)(temp >> 16); - } - - break; - - case 4: - while (samcnt--) { - *dst++ = (uchar)(temp = *src++); - *dst++ = (uchar)(temp >> 8); - *dst++ = (uchar)(temp >> 16); - *dst++ = (uchar)(temp >> 24); - } - - break; - } - - return dst; -} diff --git a/src/engine/favorites.h b/src/engine/favorites.h deleted file mode 100644 index 4515bd9a8b..0000000000 --- a/src/engine/favorites.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef ENGINE_FAVORITES_H -#define ENGINE_FAVORITES_H - -#include - -#include -#include - -#include "kernel.h" - -class IConfigManager; - -class IFavorites : public IInterface -{ - MACRO_INTERFACE("favorites") - -protected: - virtual void OnConfigSave(IConfigManager *pConfigManager) = 0; - -public: - class CEntry - { - public: - int m_NumAddrs; - NETADDR m_aAddrs[MAX_SERVER_ADDRESSES]; - bool m_AllowPing; - }; - - virtual ~IFavorites() {} - - virtual TRISTATE IsFavorite(const NETADDR *pAddrs, int NumAddrs) const = 0; - // Only considers the addresses that are actually favorites. - virtual TRISTATE IsPingAllowed(const NETADDR *pAddrs, int NumAddrs) const = 0; - virtual void Add(const NETADDR *pAddrs, int NumAddrs) = 0; - // Only considers the addresses that are actually favorites. - virtual void AllowPing(const NETADDR *pAddrs, int NumAddrs, bool AllowPing) = 0; - virtual void Remove(const NETADDR *pAddrs, int NumAddrs) = 0; - virtual void AllEntries(const CEntry **ppEntries, int *pNumEntries) = 0; - - // Pass the `IFavorites` instance as callback. - static void ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData); -}; - -std::unique_ptr CreateFavorites(); -#endif // ENGINE_FAVORITES_H diff --git a/src/engine/friends.h b/src/engine/friends.h deleted file mode 100644 index 17a8bdbca8..0000000000 --- a/src/engine/friends.h +++ /dev/null @@ -1,42 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef ENGINE_FRIENDS_H -#define ENGINE_FRIENDS_H - -#include - -#include "kernel.h" - -struct CFriendInfo -{ - char m_aName[MAX_NAME_LENGTH]; - char m_aClan[MAX_CLAN_LENGTH]; - unsigned m_NameHash; - unsigned m_ClanHash; -}; - -class IFriends : public IInterface -{ - MACRO_INTERFACE("friends") -public: - enum - { - FRIEND_NO = 0, - FRIEND_CLAN, - FRIEND_PLAYER, - - MAX_FRIENDS = 4096, - }; - - virtual void Init(bool Foes = false) = 0; - - virtual int NumFriends() const = 0; - virtual const CFriendInfo *GetFriend(int Index) const = 0; - virtual int GetFriendState(const char *pName, const char *pClan) const = 0; - virtual bool IsFriend(const char *pName, const char *pClan, bool PlayersOnly) const = 0; - - virtual void AddFriend(const char *pName, const char *pClan) = 0; - virtual void RemoveFriend(const char *pName, const char *pClan) = 0; -}; - -#endif diff --git a/src/engine/gfx/image.cpp b/src/engine/gfx/image.cpp deleted file mode 100644 index 78475aae06..0000000000 --- a/src/engine/gfx/image.cpp +++ /dev/null @@ -1,120 +0,0 @@ -#include - -#include - -void CImageInfo::Free() -{ - m_Width = 0; - m_Height = 0; - m_Format = FORMAT_UNDEFINED; - free(m_pData); - m_pData = nullptr; -} - -size_t CImageInfo::PixelSize(EImageFormat Format) -{ - dbg_assert(Format != FORMAT_UNDEFINED, "Format undefined"); - static const size_t s_aSizes[] = {3, 4, 1, 2}; - return s_aSizes[(int)Format]; -} - -const char *CImageInfo::FormatName(EImageFormat Format) -{ - static const char *s_apNames[] = {"UNDEFINED", "RGBA", "RGB", "R", "RA"}; - return s_apNames[(int)Format + 1]; -} - -size_t CImageInfo::PixelSize() const -{ - return PixelSize(m_Format); -} - -const char *CImageInfo::FormatName() const -{ - return FormatName(m_Format); -} - -size_t CImageInfo::DataSize() const -{ - return m_Width * m_Height * PixelSize(m_Format); -} - -bool CImageInfo::DataEquals(const CImageInfo &Other) const -{ - if(m_Width != Other.m_Width || m_Height != Other.m_Height || m_Format != Other.m_Format) - return false; - if(m_pData == nullptr && Other.m_pData == nullptr) - return true; - if(m_pData == nullptr || Other.m_pData == nullptr) - return false; - return mem_comp(m_pData, Other.m_pData, DataSize()) == 0; -} - -ColorRGBA CImageInfo::PixelColor(size_t x, size_t y) const -{ - const size_t PixelStartIndex = (x + m_Width * y) * PixelSize(); - - ColorRGBA Color; - if(m_Format == FORMAT_R) - { - Color.r = Color.g = Color.b = 1.0f; - Color.a = m_pData[PixelStartIndex] / 255.0f; - } - else if(m_Format == FORMAT_RA) - { - Color.r = Color.g = Color.b = m_pData[PixelStartIndex] / 255.0f; - Color.a = m_pData[PixelStartIndex + 1] / 255.0f; - } - else - { - Color.r = m_pData[PixelStartIndex + 0] / 255.0f; - Color.g = m_pData[PixelStartIndex + 1] / 255.0f; - Color.b = m_pData[PixelStartIndex + 2] / 255.0f; - if(m_Format == FORMAT_RGBA) - { - Color.a = m_pData[PixelStartIndex + 3] / 255.0f; - } - else - { - Color.a = 1.0f; - } - } - return Color; -} - -void CImageInfo::SetPixelColor(size_t x, size_t y, ColorRGBA Color) const -{ - const size_t PixelStartIndex = (x + m_Width * y) * PixelSize(); - - if(m_Format == FORMAT_R) - { - m_pData[PixelStartIndex] = round_to_int(Color.a * 255.0f); - } - else if(m_Format == FORMAT_RA) - { - m_pData[PixelStartIndex] = round_to_int((Color.r + Color.g + Color.b) / 3.0f * 255.0f); - m_pData[PixelStartIndex + 1] = round_to_int(Color.a * 255.0f); - } - else - { - m_pData[PixelStartIndex + 0] = round_to_int(Color.r * 255.0f); - m_pData[PixelStartIndex + 1] = round_to_int(Color.g * 255.0f); - m_pData[PixelStartIndex + 2] = round_to_int(Color.b * 255.0f); - if(m_Format == FORMAT_RGBA) - { - m_pData[PixelStartIndex + 3] = round_to_int(Color.a * 255.0f); - } - } -} - -void CImageInfo::CopyRectFrom(const CImageInfo &SrcImage, size_t SrcX, size_t SrcY, size_t Width, size_t Height, size_t DestX, size_t DestY) const -{ - const size_t PixelSize = SrcImage.PixelSize(); - const size_t CopySize = Width * PixelSize; - for(size_t Y = 0; Y < Height; ++Y) - { - const size_t SrcOffset = ((SrcY + Y) * SrcImage.m_Width + SrcX) * PixelSize; - const size_t DestOffset = ((DestY + Y) * m_Width + DestX) * PixelSize; - mem_copy(&m_pData[DestOffset], &SrcImage.m_pData[SrcOffset], CopySize); - } -} diff --git a/src/engine/gfx/image_loader.cpp b/src/engine/gfx/image_loader.cpp deleted file mode 100644 index a60d06f3b9..0000000000 --- a/src/engine/gfx/image_loader.cpp +++ /dev/null @@ -1,407 +0,0 @@ -#include "image_loader.h" - -#include -#include - -#include -#include - -#include - -bool CByteBufferReader::Read(void *pData, size_t Size) -{ - if(m_Error) - return false; - - if(m_ReadOffset + Size <= m_Size) - { - mem_copy(pData, &m_pData[m_ReadOffset], Size); - m_ReadOffset += Size; - return true; - } - else - { - m_Error = true; - return false; - } -} - -void CByteBufferWriter::Write(const void *pData, size_t Size) -{ - if(!Size) - return; - - const size_t WriteOffset = m_vBuffer.size(); - m_vBuffer.resize(WriteOffset + Size); - mem_copy(&m_vBuffer[WriteOffset], pData, Size); -} - -class CUserErrorStruct -{ -public: - CByteBufferReader *m_pReader; - const char *m_pContextName; - std::jmp_buf m_JmpBuf; -}; - -[[noreturn]] static void PngErrorCallback(png_structp pPngStruct, png_const_charp pErrorMessage) -{ - CUserErrorStruct *pUserStruct = static_cast(png_get_error_ptr(pPngStruct)); - log_error("png", "error for file \"%s\": %s", pUserStruct->m_pContextName, pErrorMessage); - std::longjmp(pUserStruct->m_JmpBuf, 1); -} - -static void PngWarningCallback(png_structp pPngStruct, png_const_charp pWarningMessage) -{ - CUserErrorStruct *pUserStruct = static_cast(png_get_error_ptr(pPngStruct)); - log_warn("png", "warning for file \"%s\": %s", pUserStruct->m_pContextName, pWarningMessage); -} - -static void PngReadDataCallback(png_structp pPngStruct, png_bytep pOutBytes, png_size_t ByteCountToRead) -{ - CByteBufferReader *pReader = static_cast(png_get_io_ptr(pPngStruct)); - if(!pReader->Read(pOutBytes, ByteCountToRead)) - { - png_error(pPngStruct, "Could not read all bytes, file was too small"); - } -} - -static CImageInfo::EImageFormat ImageFormatFromChannelCount(int ColorChannelCount) -{ - switch(ColorChannelCount) - { - case 1: - return CImageInfo::FORMAT_R; - case 2: - return CImageInfo::FORMAT_RA; - case 3: - return CImageInfo::FORMAT_RGB; - case 4: - return CImageInfo::FORMAT_RGBA; - default: - dbg_assert(false, "ColorChannelCount invalid"); - dbg_break(); - } -} - -static int PngliteIncompatibility(png_structp pPngStruct, png_infop pPngInfo) -{ - int Result = 0; - - const int ColorType = png_get_color_type(pPngStruct, pPngInfo); - switch(ColorType) - { - case PNG_COLOR_TYPE_GRAY: - case PNG_COLOR_TYPE_RGB: - case PNG_COLOR_TYPE_RGB_ALPHA: - case PNG_COLOR_TYPE_GRAY_ALPHA: - break; - default: - log_debug("png", "color type %d unsupported by pnglite", ColorType); - Result |= CImageLoader::PNGLITE_COLOR_TYPE; - } - - const int BitDepth = png_get_bit_depth(pPngStruct, pPngInfo); - switch(BitDepth) - { - case 8: - case 16: - break; - default: - log_debug("png", "bit depth %d unsupported by pnglite", BitDepth); - Result |= CImageLoader::PNGLITE_BIT_DEPTH; - } - - const int InterlaceType = png_get_interlace_type(pPngStruct, pPngInfo); - if(InterlaceType != PNG_INTERLACE_NONE) - { - log_debug("png", "interlace type %d unsupported by pnglite", InterlaceType); - Result |= CImageLoader::PNGLITE_INTERLACE_TYPE; - } - - if(png_get_compression_type(pPngStruct, pPngInfo) != PNG_COMPRESSION_TYPE_BASE) - { - log_debug("png", "non-default compression type unsupported by pnglite"); - Result |= CImageLoader::PNGLITE_COMPRESSION_TYPE; - } - - if(png_get_filter_type(pPngStruct, pPngInfo) != PNG_FILTER_TYPE_BASE) - { - log_debug("png", "non-default filter type unsupported by pnglite"); - Result |= CImageLoader::PNGLITE_FILTER_TYPE; - } - - return Result; -} - -bool CImageLoader::LoadPng(CByteBufferReader &Reader, const char *pContextName, CImageInfo &Image, int &PngliteIncompatible) -{ - CUserErrorStruct UserErrorStruct = {&Reader, pContextName, {}}; - - png_structp pPngStruct = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); - if(pPngStruct == nullptr) - { - log_error("png", "libpng internal failure: png_create_read_struct failed."); - return false; - } - - png_infop pPngInfo = nullptr; - png_bytepp pRowPointers = nullptr; - int Height = 0; // ensure this is not undefined for the Cleanup function - const auto &&Cleanup = [&]() { - if(pRowPointers != nullptr) - { - for(int y = 0; y < Height; ++y) - { - delete[] pRowPointers[y]; - } - } - delete[] pRowPointers; - if(pPngInfo != nullptr) - { - png_destroy_info_struct(pPngStruct, &pPngInfo); - } - png_destroy_read_struct(&pPngStruct, nullptr, nullptr); - }; - if(setjmp(UserErrorStruct.m_JmpBuf)) - { - Cleanup(); - return false; - } - png_set_error_fn(pPngStruct, &UserErrorStruct, PngErrorCallback, PngWarningCallback); - - pPngInfo = png_create_info_struct(pPngStruct); - if(pPngInfo == nullptr) - { - Cleanup(); - log_error("png", "libpng internal failure: png_create_info_struct failed."); - return false; - } - - png_byte aSignature[8]; - if(!Reader.Read(aSignature, sizeof(aSignature)) || png_sig_cmp(aSignature, 0, sizeof(aSignature)) != 0) - { - Cleanup(); - log_error("png", "file is not a valid PNG file (signature mismatch)."); - return false; - } - - png_set_read_fn(pPngStruct, (png_bytep)&Reader, PngReadDataCallback); - png_set_sig_bytes(pPngStruct, sizeof(aSignature)); - - png_read_info(pPngStruct, pPngInfo); - - if(Reader.Error()) - { - // error already logged - Cleanup(); - return false; - } - - const int Width = png_get_image_width(pPngStruct, pPngInfo); - Height = png_get_image_height(pPngStruct, pPngInfo); - const png_byte BitDepth = png_get_bit_depth(pPngStruct, pPngInfo); - const int ColorType = png_get_color_type(pPngStruct, pPngInfo); - - if(Width == 0 || Height == 0) - { - log_error("png", "image has width (%d) or height (%d) of 0.", Width, Height); - Cleanup(); - return false; - } - - if(BitDepth == 16) - { - png_set_strip_16(pPngStruct); - } - else if(BitDepth > 8 || BitDepth == 0) - { - log_error("png", "bit depth %d not supported.", BitDepth); - Cleanup(); - return false; - } - - if(ColorType == PNG_COLOR_TYPE_PALETTE) - { - png_set_palette_to_rgb(pPngStruct); - } - - if(ColorType == PNG_COLOR_TYPE_GRAY && BitDepth < 8) - { - png_set_expand_gray_1_2_4_to_8(pPngStruct); - } - - if(png_get_valid(pPngStruct, pPngInfo, PNG_INFO_tRNS)) - { - png_set_tRNS_to_alpha(pPngStruct); - } - - png_read_update_info(pPngStruct, pPngInfo); - - const int ColorChannelCount = png_get_channels(pPngStruct, pPngInfo); - const int BytesInRow = png_get_rowbytes(pPngStruct, pPngInfo); - dbg_assert(BytesInRow == Width * ColorChannelCount, "bytes in row incorrect."); - - pRowPointers = new png_bytep[Height]; - for(int y = 0; y < Height; ++y) - { - pRowPointers[y] = new png_byte[BytesInRow]; - } - - png_read_image(pPngStruct, pRowPointers); - - if(!Reader.Error()) - { - Image.m_Width = Width; - Image.m_Height = Height; - Image.m_Format = ImageFormatFromChannelCount(ColorChannelCount); - Image.m_pData = static_cast(malloc(Image.DataSize())); - for(int y = 0; y < Height; ++y) - { - mem_copy(&Image.m_pData[y * BytesInRow], pRowPointers[y], BytesInRow); - } - PngliteIncompatible = PngliteIncompatibility(pPngStruct, pPngInfo); - } - - Cleanup(); - - return !Reader.Error(); -} - -bool CImageLoader::LoadPng(IOHANDLE File, const char *pFilename, CImageInfo &Image, int &PngliteIncompatible) -{ - if(!File) - { - log_error("png", "failed to open file for reading. filename='%s'", pFilename); - return false; - } - - void *pFileData; - unsigned FileDataSize; - const bool ReadSuccess = io_read_all(File, &pFileData, &FileDataSize); - io_close(File); - if(!ReadSuccess) - { - log_error("png", "failed to read file. filename='%s'", pFilename); - return false; - } - - CByteBufferReader ImageReader(static_cast(pFileData), FileDataSize); - - const bool LoadResult = CImageLoader::LoadPng(ImageReader, pFilename, Image, PngliteIncompatible); - free(pFileData); - if(!LoadResult) - { - log_error("png", "failed to load image from file. filename='%s'", pFilename); - return false; - } - - if(Image.m_Format != CImageInfo::FORMAT_RGB && Image.m_Format != CImageInfo::FORMAT_RGBA) - { - log_error("png", "image has unsupported format. filename='%s' format='%s'", pFilename, Image.FormatName()); - Image.Free(); - return false; - } - - return true; -} - -static void PngWriteDataCallback(png_structp pPngStruct, png_bytep pOutBytes, png_size_t ByteCountToWrite) -{ - CByteBufferWriter *pWriter = static_cast(png_get_io_ptr(pPngStruct)); - pWriter->Write(pOutBytes, ByteCountToWrite); -} - -static void PngOutputFlushCallback(png_structp pPngStruct) -{ - // no need to flush memory buffer -} - -static int PngColorTypeFromFormat(CImageInfo::EImageFormat Format) -{ - switch(Format) - { - case CImageInfo::FORMAT_R: - return PNG_COLOR_TYPE_GRAY; - case CImageInfo::FORMAT_RA: - return PNG_COLOR_TYPE_GRAY_ALPHA; - case CImageInfo::FORMAT_RGB: - return PNG_COLOR_TYPE_RGB; - case CImageInfo::FORMAT_RGBA: - return PNG_COLOR_TYPE_RGBA; - default: - dbg_assert(false, "Format invalid"); - dbg_break(); - } -} - -bool CImageLoader::SavePng(CByteBufferWriter &Writer, const CImageInfo &Image) -{ - png_structp pPngStruct = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); - if(pPngStruct == nullptr) - { - log_error("png", "libpng internal failure: png_create_write_struct failed."); - return false; - } - - png_infop pPngInfo = png_create_info_struct(pPngStruct); - if(pPngInfo == nullptr) - { - png_destroy_read_struct(&pPngStruct, nullptr, nullptr); - log_error("png", "libpng internal failure: png_create_info_struct failed."); - return false; - } - - png_set_write_fn(pPngStruct, (png_bytep)&Writer, PngWriteDataCallback, PngOutputFlushCallback); - - png_set_IHDR(pPngStruct, pPngInfo, Image.m_Width, Image.m_Height, 8, PngColorTypeFromFormat(Image.m_Format), PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); - png_write_info(pPngStruct, pPngInfo); - - png_bytepp pRowPointers = new png_bytep[Image.m_Height]; - const int WidthBytes = Image.m_Width * Image.PixelSize(); - ptrdiff_t BufferOffset = 0; - for(size_t y = 0; y < Image.m_Height; ++y) - { - pRowPointers[y] = new png_byte[WidthBytes]; - mem_copy(pRowPointers[y], Image.m_pData + BufferOffset, WidthBytes); - BufferOffset += (ptrdiff_t)WidthBytes; - } - png_write_image(pPngStruct, pRowPointers); - png_write_end(pPngStruct, pPngInfo); - - for(size_t y = 0; y < Image.m_Height; ++y) - { - delete[] pRowPointers[y]; - } - delete[] pRowPointers; - - png_destroy_info_struct(pPngStruct, &pPngInfo); - png_destroy_write_struct(&pPngStruct, nullptr); - - return true; -} - -bool CImageLoader::SavePng(IOHANDLE File, const char *pFilename, const CImageInfo &Image) -{ - if(!File) - { - log_error("png", "failed to open file for writing. filename='%s'", pFilename); - return false; - } - - CByteBufferWriter Writer; - if(!CImageLoader::SavePng(Writer, Image)) - { - // error already logged - io_close(File); - return false; - } - - const bool WriteSuccess = io_write(File, Writer.Data(), Writer.Size()) == Writer.Size(); - if(!WriteSuccess) - { - log_error("png", "failed to write PNG data to file. filename='%s'", pFilename); - } - io_close(File); - return WriteSuccess; -} diff --git a/src/engine/gfx/image_loader.h b/src/engine/gfx/image_loader.h deleted file mode 100644 index c2658a6e3c..0000000000 --- a/src/engine/gfx/image_loader.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef ENGINE_GFX_IMAGE_LOADER_H -#define ENGINE_GFX_IMAGE_LOADER_H - -#include - -#include - -#include - -class CByteBufferReader -{ - const uint8_t *m_pData; - size_t m_Size; - size_t m_ReadOffset = 0; - bool m_Error = false; - -public: - CByteBufferReader(const uint8_t *pData, size_t Size) : - m_pData(pData), - m_Size(Size) {} - - bool Read(void *pData, size_t Size); - bool Error() const { return m_Error; } -}; - -class CByteBufferWriter -{ - std::vector m_vBuffer; - -public: - void Write(const void *pData, size_t Size); - const uint8_t *Data() const { return m_vBuffer.data(); } - size_t Size() const { return m_vBuffer.size(); } -}; - -class CImageLoader -{ - CImageLoader() = delete; - -public: - enum - { - PNGLITE_COLOR_TYPE = 1 << 0, - PNGLITE_BIT_DEPTH = 1 << 1, - PNGLITE_INTERLACE_TYPE = 1 << 2, - PNGLITE_COMPRESSION_TYPE = 1 << 3, - PNGLITE_FILTER_TYPE = 1 << 4, - }; - - static bool LoadPng(CByteBufferReader &Reader, const char *pContextName, CImageInfo &Image, int &PngliteIncompatible); - static bool LoadPng(IOHANDLE File, const char *pFilename, CImageInfo &Image, int &PngliteIncompatible); - - static bool SavePng(CByteBufferWriter &Writer, const CImageInfo &Image); - static bool SavePng(IOHANDLE File, const char *pFilename, const CImageInfo &Image); -}; - -#endif // ENGINE_GFX_IMAGE_LOADER_H diff --git a/src/engine/gfx/image_manipulation.cpp b/src/engine/gfx/image_manipulation.cpp deleted file mode 100644 index ad4bcc91a3..0000000000 --- a/src/engine/gfx/image_manipulation.cpp +++ /dev/null @@ -1,295 +0,0 @@ -#include "image_manipulation.h" - -#include -#include - -bool ConvertToRgba(uint8_t *pDest, const CImageInfo &SourceImage) -{ - if(SourceImage.m_Format == CImageInfo::FORMAT_RGBA) - { - mem_copy(pDest, SourceImage.m_pData, SourceImage.DataSize()); - return true; - } - else - { - const size_t SrcChannelCount = CImageInfo::PixelSize(SourceImage.m_Format); - const size_t DstChannelCount = CImageInfo::PixelSize(CImageInfo::FORMAT_RGBA); - for(size_t Y = 0; Y < SourceImage.m_Height; ++Y) - { - for(size_t X = 0; X < SourceImage.m_Width; ++X) - { - size_t ImgOffsetSrc = (Y * SourceImage.m_Width * SrcChannelCount) + (X * SrcChannelCount); - size_t ImgOffsetDest = (Y * SourceImage.m_Width * DstChannelCount) + (X * DstChannelCount); - if(SourceImage.m_Format == CImageInfo::FORMAT_RGB) - { - mem_copy(&pDest[ImgOffsetDest], &SourceImage.m_pData[ImgOffsetSrc], SrcChannelCount); - pDest[ImgOffsetDest + 3] = 255; - } - else if(SourceImage.m_Format == CImageInfo::FORMAT_RA) - { - pDest[ImgOffsetDest + 0] = SourceImage.m_pData[ImgOffsetSrc]; - pDest[ImgOffsetDest + 1] = SourceImage.m_pData[ImgOffsetSrc]; - pDest[ImgOffsetDest + 2] = SourceImage.m_pData[ImgOffsetSrc]; - pDest[ImgOffsetDest + 3] = SourceImage.m_pData[ImgOffsetSrc + 1]; - } - else if(SourceImage.m_Format == CImageInfo::FORMAT_R) - { - pDest[ImgOffsetDest + 0] = 255; - pDest[ImgOffsetDest + 1] = 255; - pDest[ImgOffsetDest + 2] = 255; - pDest[ImgOffsetDest + 3] = SourceImage.m_pData[ImgOffsetSrc]; - } - else - { - dbg_assert(false, "SourceImage.m_Format invalid"); - } - } - } - return false; - } -} - -bool ConvertToRgbaAlloc(uint8_t *&pDest, const CImageInfo &SourceImage) -{ - pDest = static_cast(malloc(SourceImage.m_Width * SourceImage.m_Height * CImageInfo::PixelSize(CImageInfo::FORMAT_RGBA))); - return ConvertToRgba(pDest, SourceImage); -} - -bool ConvertToRgba(CImageInfo &Image) -{ - if(Image.m_Format == CImageInfo::FORMAT_RGBA) - return true; - - uint8_t *pRgbaData; - ConvertToRgbaAlloc(pRgbaData, Image); - free(Image.m_pData); - Image.m_pData = pRgbaData; - Image.m_Format = CImageInfo::FORMAT_RGBA; - return false; -} - -void ConvertToGrayscale(const CImageInfo &Image) -{ - if(Image.m_Format == CImageInfo::FORMAT_R || Image.m_Format == CImageInfo::FORMAT_RA) - return; - - const size_t Step = Image.PixelSize(); - for(size_t i = 0; i < Image.m_Width * Image.m_Height; ++i) - { - const int Average = (Image.m_pData[i * Step] + Image.m_pData[i * Step + 1] + Image.m_pData[i * Step + 2]) / 3; - Image.m_pData[i * Step] = Average; - Image.m_pData[i * Step + 1] = Average; - Image.m_pData[i * Step + 2] = Average; - } -} - -static constexpr int DILATE_BPP = 4; // RGBA assumed -static constexpr uint8_t DILATE_ALPHA_THRESHOLD = 10; - -static void Dilate(int w, int h, const uint8_t *pSrc, uint8_t *pDest) -{ - const int aDirX[] = {0, -1, 1, 0}; - const int aDirY[] = {-1, 0, 0, 1}; - - int m = 0; - for(int y = 0; y < h; y++) - { - for(int x = 0; x < w; x++, m += DILATE_BPP) - { - for(int i = 0; i < DILATE_BPP; ++i) - pDest[m + i] = pSrc[m + i]; - if(pSrc[m + DILATE_BPP - 1] > DILATE_ALPHA_THRESHOLD) - continue; - - // --- Implementation Note --- - // The sum and counter variable can be used to compute a smoother dilated image. - // In this reference implementation, the loop breaks as soon as Counter == 1. - // We break the loop here to match the selection of the previously used algorithm. - int aSumOfOpaque[] = {0, 0, 0}; - int Counter = 0; - for(int c = 0; c < 4; c++) - { - const int ClampedX = clamp(x + aDirX[c], 0, w - 1); - const int ClampedY = clamp(y + aDirY[c], 0, h - 1); - const int SrcIndex = ClampedY * w * DILATE_BPP + ClampedX * DILATE_BPP; - if(pSrc[SrcIndex + DILATE_BPP - 1] > DILATE_ALPHA_THRESHOLD) - { - for(int p = 0; p < DILATE_BPP - 1; ++p) - aSumOfOpaque[p] += pSrc[SrcIndex + p]; - ++Counter; - break; - } - } - - if(Counter > 0) - { - for(int i = 0; i < DILATE_BPP - 1; ++i) - { - aSumOfOpaque[i] /= Counter; - pDest[m + i] = (uint8_t)aSumOfOpaque[i]; - } - - pDest[m + DILATE_BPP - 1] = 255; - } - } - } -} - -static void CopyColorValues(int w, int h, const uint8_t *pSrc, uint8_t *pDest) -{ - int m = 0; - for(int y = 0; y < h; y++) - { - for(int x = 0; x < w; x++, m += DILATE_BPP) - { - if(pDest[m + DILATE_BPP - 1] == 0) - { - mem_copy(&pDest[m], &pSrc[m], DILATE_BPP - 1); - } - } - } -} - -void DilateImage(uint8_t *pImageBuff, int w, int h) -{ - DilateImageSub(pImageBuff, w, h, 0, 0, w, h); -} - -void DilateImage(const CImageInfo &Image) -{ - dbg_assert(Image.m_Format == CImageInfo::FORMAT_RGBA, "Dilate requires RGBA format"); - DilateImage(Image.m_pData, Image.m_Width, Image.m_Height); -} - -void DilateImageSub(uint8_t *pImageBuff, int w, int h, int x, int y, int SubWidth, int SubHeight) -{ - uint8_t *apBuffer[2] = {nullptr, nullptr}; - - const size_t ImageSize = (size_t)SubWidth * SubHeight * sizeof(uint8_t) * DILATE_BPP; - apBuffer[0] = (uint8_t *)malloc(ImageSize); - apBuffer[1] = (uint8_t *)malloc(ImageSize); - uint8_t *pBufferOriginal = (uint8_t *)malloc(ImageSize); - - for(int Y = 0; Y < SubHeight; ++Y) - { - int SrcImgOffset = ((y + Y) * w * DILATE_BPP) + (x * DILATE_BPP); - int DstImgOffset = (Y * SubWidth * DILATE_BPP); - int CopySize = SubWidth * DILATE_BPP; - mem_copy(&pBufferOriginal[DstImgOffset], &pImageBuff[SrcImgOffset], CopySize); - } - - Dilate(SubWidth, SubHeight, pBufferOriginal, apBuffer[0]); - - for(int i = 0; i < 5; i++) - { - Dilate(SubWidth, SubHeight, apBuffer[0], apBuffer[1]); - Dilate(SubWidth, SubHeight, apBuffer[1], apBuffer[0]); - } - - CopyColorValues(SubWidth, SubHeight, apBuffer[0], pBufferOriginal); - - free(apBuffer[0]); - free(apBuffer[1]); - - for(int Y = 0; Y < SubHeight; ++Y) - { - int SrcImgOffset = ((y + Y) * w * DILATE_BPP) + (x * DILATE_BPP); - int DstImgOffset = (Y * SubWidth * DILATE_BPP); - int CopySize = SubWidth * DILATE_BPP; - mem_copy(&pImageBuff[SrcImgOffset], &pBufferOriginal[DstImgOffset], CopySize); - } - - free(pBufferOriginal); -} - -static float CubicHermite(float A, float B, float C, float D, float t) -{ - float a = -A / 2.0f + (3.0f * B) / 2.0f - (3.0f * C) / 2.0f + D / 2.0f; - float b = A - (5.0f * B) / 2.0f + 2.0f * C - D / 2.0f; - float c = -A / 2.0f + C / 2.0f; - float d = B; - - return (a * t * t * t) + (b * t * t) + (c * t) + d; -} - -static void GetPixelClamped(const uint8_t *pSourceImage, int x, int y, uint32_t W, uint32_t H, size_t BPP, uint8_t aSample[4]) -{ - x = clamp(x, 0, (int)W - 1); - y = clamp(y, 0, (int)H - 1); - - mem_copy(aSample, &pSourceImage[x * BPP + (W * BPP * y)], BPP); -} - -static void SampleBicubic(const uint8_t *pSourceImage, float u, float v, uint32_t W, uint32_t H, size_t BPP, uint8_t aSample[4]) -{ - float X = (u * W) - 0.5f; - int xInt = (int)X; - float xFract = X - std::floor(X); - - float Y = (v * H) - 0.5f; - int yInt = (int)Y; - float yFract = Y - std::floor(Y); - - uint8_t aaaSamples[4][4][4]; - for(int y = 0; y < 4; ++y) - { - for(int x = 0; x < 4; ++x) - { - GetPixelClamped(pSourceImage, xInt + x - 1, yInt + y - 1, W, H, BPP, aaaSamples[x][y]); - } - } - - for(size_t i = 0; i < BPP; i++) - { - float aRows[4]; - for(int y = 0; y < 4; ++y) - { - aRows[y] = CubicHermite(aaaSamples[0][y][i], aaaSamples[1][y][i], aaaSamples[2][y][i], aaaSamples[3][y][i], xFract); - } - aSample[i] = (uint8_t)clamp(CubicHermite(aRows[0], aRows[1], aRows[2], aRows[3], yFract), 0.0f, 255.0f); - } -} - -static void ResizeImage(const uint8_t *pSourceImage, uint32_t SW, uint32_t SH, uint8_t *pDestinationImage, uint32_t W, uint32_t H, size_t BPP) -{ - for(int y = 0; y < (int)H; ++y) - { - float v = (float)y / (float)(H - 1); - for(int x = 0; x < (int)W; ++x) - { - float u = (float)x / (float)(W - 1); - uint8_t aSample[4]; - SampleBicubic(pSourceImage, u, v, SW, SH, BPP, aSample); - mem_copy(&pDestinationImage[x * BPP + ((W * BPP) * y)], aSample, BPP); - } - } -} - -uint8_t *ResizeImage(const uint8_t *pImageData, int Width, int Height, int NewWidth, int NewHeight, int BPP) -{ - uint8_t *pTmpData = (uint8_t *)malloc((size_t)NewWidth * NewHeight * BPP); - ResizeImage(pImageData, Width, Height, pTmpData, NewWidth, NewHeight, BPP); - return pTmpData; -} - -void ResizeImage(CImageInfo &Image, int NewWidth, int NewHeight) -{ - uint8_t *pNewData = ResizeImage(Image.m_pData, Image.m_Width, Image.m_Height, NewWidth, NewHeight, Image.PixelSize()); - free(Image.m_pData); - Image.m_pData = pNewData; - Image.m_Width = NewWidth; - Image.m_Height = NewHeight; -} - -int HighestBit(int OfVar) -{ - if(!OfVar) - return 0; - - int RetV = 1; - - while(OfVar >>= 1) - RetV <<= 1; - - return RetV; -} diff --git a/src/engine/gfx/image_manipulation.h b/src/engine/gfx/image_manipulation.h deleted file mode 100644 index ae39144e24..0000000000 --- a/src/engine/gfx/image_manipulation.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef ENGINE_GFX_IMAGE_MANIPULATION_H -#define ENGINE_GFX_IMAGE_MANIPULATION_H - -#include - -#include - -// Destination must have appropriate size for RGBA data -bool ConvertToRgba(uint8_t *pDest, const CImageInfo &SourceImage); -// Allocates appropriate buffer with malloc, must be freed by caller -bool ConvertToRgbaAlloc(uint8_t *&pDest, const CImageInfo &SourceImage); -// Replaces existing image data with RGBA data (unless already RGBA) -bool ConvertToRgba(CImageInfo &Image); - -// Changes the image data (not the format) -void ConvertToGrayscale(const CImageInfo &Image); - -// These functions assume that the image data is 4 bytes per pixel RGBA -void DilateImage(uint8_t *pImageBuff, int w, int h); -void DilateImage(const CImageInfo &Image); -void DilateImageSub(uint8_t *pImageBuff, int w, int h, int x, int y, int SubWidth, int SubHeight); - -// Returned buffer is allocated with malloc, must be freed by caller -uint8_t *ResizeImage(const uint8_t *pImageData, int Width, int Height, int NewWidth, int NewHeight, int BPP); -// Replaces existing image data with resized buffer -void ResizeImage(CImageInfo &Image, int NewWidth, int NewHeight); - -int HighestBit(int OfVar); - -#endif // ENGINE_GFX_IMAGE_MANIPULATION_H diff --git a/src/engine/ghost.h b/src/engine/ghost.h deleted file mode 100644 index a972ec7fb0..0000000000 --- a/src/engine/ghost.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef ENGINE_GHOST_H -#define ENGINE_GHOST_H - -#include -#include - -#include "kernel.h" - -class CGhostInfo -{ -public: - char m_aOwner[MAX_NAME_LENGTH]; - char m_aMap[64]; - int m_NumTicks; - int m_Time; -}; - -class IGhostRecorder : public IInterface -{ - MACRO_INTERFACE("ghostrecorder") -public: - virtual ~IGhostRecorder() {} - - virtual int Start(const char *pFilename, const char *pMap, const SHA256_DIGEST &MapSha256, const char *pName) = 0; - virtual void Stop(int Ticks, int Time) = 0; - - virtual void WriteData(int Type, const void *pData, size_t Size) = 0; - virtual bool IsRecording() const = 0; -}; - -class IGhostLoader : public IInterface -{ - MACRO_INTERFACE("ghostloader") -public: - virtual ~IGhostLoader() {} - - virtual bool Load(const char *pFilename, const char *pMap, const SHA256_DIGEST &MapSha256, unsigned MapCrc) = 0; - virtual void Close() = 0; - - virtual const CGhostInfo *GetInfo() const = 0; - - virtual bool ReadNextType(int *pType) = 0; - virtual bool ReadData(int Type, void *pData, size_t Size) = 0; - - virtual bool GetGhostInfo(const char *pFilename, CGhostInfo *pInfo, const char *pMap, const SHA256_DIGEST &MapSha256, unsigned MapCrc) = 0; -}; - -#endif diff --git a/src/engine/graphics.h b/src/engine/graphics.h deleted file mode 100644 index c3a9439832..0000000000 --- a/src/engine/graphics.h +++ /dev/null @@ -1,502 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef ENGINE_GRAPHICS_H -#define ENGINE_GRAPHICS_H - -#include "image.h" -#include "kernel.h" -#include "warning.h" - -#include -#include - -#include -#include -#include -#include -#include - -#define GRAPHICS_TYPE_UNSIGNED_BYTE 0x1401 -#define GRAPHICS_TYPE_UNSIGNED_SHORT 0x1403 -#define GRAPHICS_TYPE_INT 0x1404 -#define GRAPHICS_TYPE_UNSIGNED_INT 0x1405 -#define GRAPHICS_TYPE_FLOAT 0x1406 - -struct SBufferContainerInfo -{ - int m_Stride; - int m_VertBufferBindingIndex; - - // the attributes of the container - struct SAttribute - { - int m_DataTypeCount; - unsigned int m_Type; - bool m_Normalized; - void *m_pOffset; - - //0: float, 1:integer - unsigned int m_FuncType; - }; - std::vector m_vAttributes; -}; - -struct SQuadRenderInfo -{ - ColorRGBA m_Color; - vec2 m_Offsets; - float m_Rotation; - // allows easier upload for uniform buffers because of the alignment requirements - float m_Padding; -}; - -struct SGraphicTile -{ - vec2 m_TopLeft; - vec2 m_TopRight; - vec2 m_BottomRight; - vec2 m_BottomLeft; -}; - -struct SGraphicTileTexureCoords -{ - ubvec4 m_TexCoordTopLeft; - ubvec4 m_TexCoordTopRight; - ubvec4 m_TexCoordBottomRight; - ubvec4 m_TexCoordBottomLeft; -}; - -/* - Structure: CVideoMode -*/ -class CVideoMode -{ -public: - int m_CanvasWidth, m_CanvasHeight; - int m_WindowWidth, m_WindowHeight; - int m_RefreshRate; - int m_Red, m_Green, m_Blue; - uint32_t m_Format; -}; - -typedef vec2 GL_SPoint; -typedef vec2 GL_STexCoord; - -struct GL_STexCoord3D -{ - GL_STexCoord3D &operator=(const GL_STexCoord &TexCoord) - { - u = TexCoord.u; - v = TexCoord.v; - return *this; - } - - GL_STexCoord3D &operator=(const vec3 &TexCoord) - { - u = TexCoord.u; - v = TexCoord.v; - w = TexCoord.w; - return *this; - } - - float u, v, w; -}; - -typedef ColorRGBA GL_SColorf; -//use normalized color values -typedef vector4_base GL_SColor; - -struct GL_SVertex -{ - GL_SPoint m_Pos; - GL_STexCoord m_Tex; - GL_SColor m_Color; -}; - -struct GL_SVertexTex3D -{ - GL_SPoint m_Pos; - GL_SColorf m_Color; - GL_STexCoord3D m_Tex; -}; - -struct GL_SVertexTex3DStream -{ - GL_SPoint m_Pos; - GL_SColor m_Color; - GL_STexCoord3D m_Tex; -}; - -static constexpr size_t gs_GraphicsMaxQuadsRenderCount = 256; -static constexpr size_t gs_GraphicsMaxParticlesRenderCount = 512; - -enum EGraphicsDriverAgeType -{ - GRAPHICS_DRIVER_AGE_TYPE_LEGACY = 0, - GRAPHICS_DRIVER_AGE_TYPE_DEFAULT, - GRAPHICS_DRIVER_AGE_TYPE_MODERN, - - GRAPHICS_DRIVER_AGE_TYPE_COUNT, -}; - -enum EBackendType -{ - BACKEND_TYPE_OPENGL = 0, - BACKEND_TYPE_OPENGL_ES, - BACKEND_TYPE_VULKAN, - - // special value to tell the backend to identify the current backend - BACKEND_TYPE_AUTO, - - BACKEND_TYPE_COUNT, -}; - -struct STWGraphicGpu -{ - enum ETWGraphicsGpuType - { - GRAPHICS_GPU_TYPE_DISCRETE = 0, - GRAPHICS_GPU_TYPE_INTEGRATED, - GRAPHICS_GPU_TYPE_VIRTUAL, - GRAPHICS_GPU_TYPE_CPU, - - // should stay at last position in this enum - GRAPHICS_GPU_TYPE_INVALID, - }; - - struct STWGraphicGpuItem - { - char m_aName[256]; - ETWGraphicsGpuType m_GpuType; - }; - std::vector m_vGpus; - STWGraphicGpuItem m_AutoGpu; -}; - -typedef STWGraphicGpu TTwGraphicsGpuList; - -typedef std::function WINDOW_RESIZE_FUNC; -typedef std::function WINDOW_PROPS_CHANGED_FUNC; - -typedef std::function &vDstData)> TGLBackendReadPresentedImageData; - -class IGraphics : public IInterface -{ - MACRO_INTERFACE("graphics") -protected: - int m_ScreenWidth; - int m_ScreenHeight; - int m_ScreenRefreshRate; - float m_ScreenHiDPIScale; - -public: - enum - { - TEXLOAD_TO_3D_TEXTURE = 1 << 0, - TEXLOAD_TO_2D_ARRAY_TEXTURE = 1 << 1, - TEXLOAD_NO_2D_TEXTURE = 1 << 2, - }; - - class CTextureHandle - { - friend class IGraphics; - int m_Id; - - public: - CTextureHandle() : - m_Id(-1) - { - } - - bool IsValid() const { return Id() >= 0; } - bool IsNullTexture() const { return Id() == 0; } - int Id() const { return m_Id; } - void Invalidate() { m_Id = -1; } - }; - - int ScreenWidth() const { return m_ScreenWidth; } - int ScreenHeight() const { return m_ScreenHeight; } - float ScreenAspect() const { return (float)ScreenWidth() / (float)ScreenHeight(); } - float ScreenHiDPIScale() const { return m_ScreenHiDPIScale; } - int WindowWidth() const { return m_ScreenWidth / m_ScreenHiDPIScale; } - int WindowHeight() const { return m_ScreenHeight / m_ScreenHiDPIScale; } - - virtual void WarnPngliteIncompatibleImages(bool Warn) = 0; - virtual void SetWindowParams(int FullscreenMode, bool IsBorderless) = 0; - virtual bool SetWindowScreen(int Index) = 0; - virtual bool SetVSync(bool State) = 0; - virtual bool SetMultiSampling(uint32_t ReqMultiSamplingCount, uint32_t &MultiSamplingCountBackend) = 0; - virtual int GetWindowScreen() = 0; - virtual void Move(int x, int y) = 0; - virtual bool Resize(int w, int h, int RefreshRate) = 0; - virtual void ResizeToScreen() = 0; - virtual void GotResized(int w, int h, int RefreshRate) = 0; - virtual void UpdateViewport(int X, int Y, int W, int H, bool ByResize) = 0; - - /** - * Listens to a resize event of the canvas, which is usually caused by a window resize. - * Will only be triggered if the actual size changed. - */ - virtual void AddWindowResizeListener(WINDOW_RESIZE_FUNC pFunc) = 0; - /** - * Listens to various window property changes, such as minimize, maximize, move, fullscreen mode - */ - virtual void AddWindowPropChangeListener(WINDOW_PROPS_CHANGED_FUNC pFunc) = 0; - - virtual void WindowDestroyNtf(uint32_t WindowId) = 0; - virtual void WindowCreateNtf(uint32_t WindowId) = 0; - - // ForceClearNow forces the backend to trigger a clear, even at performance cost, else it might be delayed by one frame - virtual void Clear(float r, float g, float b, bool ForceClearNow = false) = 0; - - virtual void ClipEnable(int x, int y, int w, int h) = 0; - virtual void ClipDisable() = 0; - - virtual void MapScreen(float TopLeftX, float TopLeftY, float BottomRightX, float BottomRightY) = 0; - virtual void GetScreen(float *pTopLeftX, float *pTopLeftY, float *pBottomRightX, float *pBottomRightY) = 0; - - // TODO: These should perhaps not be virtuals - virtual void BlendNone() = 0; - virtual void BlendNormal() = 0; - virtual void BlendAdditive() = 0; - virtual void WrapNormal() = 0; - virtual void WrapClamp() = 0; - - virtual uint64_t TextureMemoryUsage() const = 0; - virtual uint64_t BufferMemoryUsage() const = 0; - virtual uint64_t StreamedMemoryUsage() const = 0; - virtual uint64_t StagingMemoryUsage() const = 0; - - virtual const TTwGraphicsGpuList &GetGpus() const = 0; - - virtual bool LoadPng(CImageInfo &Image, const char *pFilename, int StorageType) = 0; - virtual bool LoadPng(CImageInfo &Image, const uint8_t *pData, size_t DataSize, const char *pContextName) = 0; - - virtual bool CheckImageDivisibility(const char *pContextName, CImageInfo &Image, int DivX, int DivY, bool AllowResize) = 0; - virtual bool IsImageFormatRgba(const char *pContextName, const CImageInfo &Image) = 0; - - virtual void UnloadTexture(CTextureHandle *pIndex) = 0; - virtual CTextureHandle LoadTextureRaw(const CImageInfo &Image, int Flags, const char *pTexName = nullptr) = 0; - virtual CTextureHandle LoadTextureRawMove(CImageInfo &Image, int Flags, const char *pTexName = nullptr) = 0; - virtual CTextureHandle LoadTexture(const char *pFilename, int StorageType, int Flags = 0) = 0; - virtual void TextureSet(CTextureHandle Texture) = 0; - void TextureClear() { TextureSet(CTextureHandle()); } - - // pTextData & pTextOutlineData are automatically free'd - virtual bool LoadTextTextures(size_t Width, size_t Height, CTextureHandle &TextTexture, CTextureHandle &TextOutlineTexture, uint8_t *pTextData, uint8_t *pTextOutlineData) = 0; - virtual bool UnloadTextTextures(CTextureHandle &TextTexture, CTextureHandle &TextOutlineTexture) = 0; - virtual bool UpdateTextTexture(CTextureHandle TextureId, int x, int y, size_t Width, size_t Height, uint8_t *pData, bool IsMovedPointer) = 0; - - virtual CTextureHandle LoadSpriteTexture(const CImageInfo &FromImageInfo, const struct CDataSprite *pSprite) = 0; - - virtual bool IsImageSubFullyTransparent(const CImageInfo &FromImageInfo, int x, int y, int w, int h) = 0; - virtual bool IsSpriteTextureFullyTransparent(const CImageInfo &FromImageInfo, const struct CDataSprite *pSprite) = 0; - - virtual void FlushVertices(bool KeepVertices = false) = 0; - virtual void FlushVerticesTex3D() = 0; - - // specific render functions - virtual void RenderTileLayer(int BufferContainerIndex, const ColorRGBA &Color, char **pOffsets, unsigned int *pIndicedVertexDrawNum, size_t NumIndicesOffset) = 0; - virtual void RenderBorderTiles(int BufferContainerIndex, const ColorRGBA &Color, char *pIndexBufferOffset, const vec2 &Offset, const vec2 &Scale, uint32_t DrawNum) = 0; - virtual void RenderQuadLayer(int BufferContainerIndex, SQuadRenderInfo *pQuadInfo, size_t QuadNum, int QuadOffset) = 0; - virtual void RenderText(int BufferContainerIndex, int TextQuadNum, int TextureSize, int TextureTextIndex, int TextureTextOutlineIndex, const ColorRGBA &TextColor, const ColorRGBA &TextOutlineColor) = 0; - - // opengl 3.3 functions - - enum EBufferObjectCreateFlags - { - // tell the backend that the buffer only needs to be valid for the span of one frame. Buffer size is not allowed to be bigger than GL_SVertex * MAX_VERTICES - BUFFER_OBJECT_CREATE_FLAGS_ONE_TIME_USE_BIT = 1 << 0, - }; - - // if a pointer is passed as moved pointer, it requires to be allocated with malloc() - virtual int CreateBufferObject(size_t UploadDataSize, void *pUploadData, int CreateFlags, bool IsMovedPointer = false) = 0; - virtual void RecreateBufferObject(int BufferIndex, size_t UploadDataSize, void *pUploadData, int CreateFlags, bool IsMovedPointer = false) = 0; - virtual void DeleteBufferObject(int BufferIndex) = 0; - - virtual int CreateBufferContainer(struct SBufferContainerInfo *pContainerInfo) = 0; - // destroying all buffer objects means, that all referenced VBOs are destroyed automatically, so the user does not need to save references to them - virtual void DeleteBufferContainer(int &ContainerIndex, bool DestroyAllBO = true) = 0; - virtual void IndicesNumRequiredNotify(unsigned int RequiredIndicesCount) = 0; - - // returns true if the driver age type is supported, passing BACKEND_TYPE_AUTO for BackendType will query the values for the currently used backend - virtual bool GetDriverVersion(EGraphicsDriverAgeType DriverAgeType, int &Major, int &Minor, int &Patch, const char *&pName, EBackendType BackendType) = 0; - virtual bool IsConfigModernAPI() = 0; - virtual bool IsTileBufferingEnabled() = 0; - virtual bool IsQuadBufferingEnabled() = 0; - virtual bool IsTextBufferingEnabled() = 0; - virtual bool IsQuadContainerBufferingEnabled() = 0; - virtual bool Uses2DTextureArrays() = 0; - virtual bool HasTextureArraysSupport() = 0; - - virtual const char *GetVendorString() = 0; - virtual const char *GetVersionString() = 0; - virtual const char *GetRendererString() = 0; - - struct CLineItem - { - float m_X0, m_Y0, m_X1, m_Y1; - CLineItem() {} - CLineItem(float x0, float y0, float x1, float y1) : - m_X0(x0), m_Y0(y0), m_X1(x1), m_Y1(y1) {} - }; - virtual void LinesBegin() = 0; - virtual void LinesEnd() = 0; - virtual void LinesDraw(const CLineItem *pArray, int Num) = 0; - - virtual void QuadsBegin() = 0; - virtual void QuadsEnd() = 0; - virtual void QuadsTex3DBegin() = 0; - virtual void QuadsTex3DEnd() = 0; - virtual void TrianglesBegin() = 0; - virtual void TrianglesEnd() = 0; - virtual void QuadsEndKeepVertices() = 0; - virtual void QuadsDrawCurrentVertices(bool KeepVertices = true) = 0; - virtual void QuadsSetRotation(float Angle) = 0; - virtual void QuadsSetSubset(float TopLeftU, float TopLeftV, float BottomRightU, float BottomRightV) = 0; - virtual void QuadsSetSubsetFree(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, int Index = -1) = 0; - - struct CFreeformItem - { - float m_X0, m_Y0, m_X1, m_Y1, m_X2, m_Y2, m_X3, m_Y3; - CFreeformItem() {} - CFreeformItem(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3) : - m_X0(x0), m_Y0(y0), m_X1(x1), m_Y1(y1), m_X2(x2), m_Y2(y2), m_X3(x3), m_Y3(y3) {} - }; - - struct CQuadItem - { - float m_X, m_Y, m_Width, m_Height; - CQuadItem() {} - CQuadItem(float x, float y, float w, float h) : - m_X(x), m_Y(y), m_Width(w), m_Height(h) {} - }; - virtual void QuadsDraw(CQuadItem *pArray, int Num) = 0; - virtual void QuadsDrawTL(const CQuadItem *pArray, int Num) = 0; - - virtual void QuadsTex3DDrawTL(const CQuadItem *pArray, int Num) = 0; - - virtual int CreateQuadContainer(bool AutomaticUpload = true) = 0; - virtual void QuadContainerChangeAutomaticUpload(int ContainerIndex, bool AutomaticUpload) = 0; - virtual void QuadContainerUpload(int ContainerIndex) = 0; - virtual int QuadContainerAddQuads(int ContainerIndex, CQuadItem *pArray, int Num) = 0; - virtual int QuadContainerAddQuads(int ContainerIndex, CFreeformItem *pArray, int Num) = 0; - virtual void QuadContainerReset(int ContainerIndex) = 0; - virtual void DeleteQuadContainer(int &ContainerIndex) = 0; - virtual void RenderQuadContainer(int ContainerIndex, int QuadDrawNum) = 0; - virtual void RenderQuadContainer(int ContainerIndex, int QuadOffset, int QuadDrawNum, bool ChangeWrapMode = true) = 0; - virtual void RenderQuadContainerEx(int ContainerIndex, int QuadOffset, int QuadDrawNum, float X, float Y, float ScaleX = 1.f, float ScaleY = 1.f) = 0; - virtual void RenderQuadContainerAsSprite(int ContainerIndex, int QuadOffset, float X, float Y, float ScaleX = 1.f, float ScaleY = 1.f) = 0; - - struct SRenderSpriteInfo - { - vec2 m_Pos; - float m_Scale; - float m_Rotation; - }; - - virtual void RenderQuadContainerAsSpriteMultiple(int ContainerIndex, int QuadOffset, int DrawCount, SRenderSpriteInfo *pRenderInfo) = 0; - - virtual void QuadsDrawFreeform(const CFreeformItem *pArray, int Num) = 0; - virtual void QuadsText(float x, float y, float Size, const char *pText) = 0; - - enum - { - CORNER_NONE = 0, - CORNER_TL = 1, - CORNER_TR = 2, - CORNER_BL = 4, - CORNER_BR = 8, - - CORNER_T = CORNER_TL | CORNER_TR, - CORNER_B = CORNER_BL | CORNER_BR, - CORNER_R = CORNER_TR | CORNER_BR, - CORNER_L = CORNER_TL | CORNER_BL, - - CORNER_ALL = CORNER_T | CORNER_B, - }; - virtual void DrawRectExt(float x, float y, float w, float h, float r, int Corners) = 0; - virtual void DrawRectExt4(float x, float y, float w, float h, ColorRGBA ColorTopLeft, ColorRGBA ColorTopRight, ColorRGBA ColorBottomLeft, ColorRGBA ColorBottomRight, float r, int Corners) = 0; - virtual int CreateRectQuadContainer(float x, float y, float w, float h, float r, int Corners) = 0; - virtual void DrawRect(float x, float y, float w, float h, ColorRGBA Color, int Corners, float Rounding) = 0; - virtual void DrawRect4(float x, float y, float w, float h, ColorRGBA ColorTopLeft, ColorRGBA ColorTopRight, ColorRGBA ColorBottomLeft, ColorRGBA ColorBottomRight, int Corners, float Rounding) = 0; - virtual void DrawCircle(float CenterX, float CenterY, float Radius, int Segments) = 0; - - struct CColorVertex - { - int m_Index; - float m_R, m_G, m_B, m_A; - CColorVertex() {} - CColorVertex(int i, float r, float g, float b, float a) : - m_Index(i), m_R(r), m_G(g), m_B(b), m_A(a) {} - CColorVertex(int i, ColorRGBA Color) : - m_Index(i), m_R(Color.r), m_G(Color.g), m_B(Color.b), m_A(Color.a) {} - }; - virtual void SetColorVertex(const CColorVertex *pArray, size_t Num) = 0; - virtual void SetColor(float r, float g, float b, float a) = 0; - virtual void SetColor(ColorRGBA Color) = 0; - virtual void SetColor4(ColorRGBA TopLeft, ColorRGBA TopRight, ColorRGBA BottomLeft, ColorRGBA BottomRight) = 0; - virtual void ChangeColorOfCurrentQuadVertices(float r, float g, float b, float a) = 0; - virtual void ChangeColorOfQuadVertices(size_t QuadOffset, unsigned char r, unsigned char g, unsigned char b, unsigned char a) = 0; - - /** - * Reads the color at the specified position from the backbuffer once, - * after the next swap operation. - * - * @param Position The pixel position to read. - * @param pColor Pointer that will receive the read pixel color. - * The pointer must be valid until the next swap operation. - */ - virtual void ReadPixel(ivec2 Position, ColorRGBA *pColor) = 0; - virtual void TakeScreenshot(const char *pFilename) = 0; - virtual void TakeCustomScreenshot(const char *pFilename) = 0; - virtual int GetVideoModes(CVideoMode *pModes, int MaxModes, int Screen) = 0; - virtual void GetCurrentVideoMode(CVideoMode &CurMode, int Screen) = 0; - virtual void Swap() = 0; - virtual int GetNumScreens() const = 0; - virtual const char *GetScreenName(int Screen) const = 0; - - // synchronization - virtual void InsertSignal(class CSemaphore *pSemaphore) = 0; - virtual bool IsIdle() const = 0; - virtual void WaitForIdle() = 0; - - virtual void SetWindowGrab(bool Grab) = 0; - virtual void NotifyWindow() = 0; - - // be aware that this function should only be called from the graphics thread, and even then you should really know what you are doing - // this function always returns the pixels in RGB - virtual TGLBackendReadPresentedImageData &GetReadPresentedImageDataFuncUnsafe() = 0; - - virtual std::optional CurrentWarning() = 0; - - // returns true if the error msg was shown - virtual bool ShowMessageBox(unsigned Type, const char *pTitle, const char *pMsg) = 0; - virtual bool IsBackendInitialized() = 0; - -protected: - inline CTextureHandle CreateTextureHandle(int Index) - { - CTextureHandle Tex; - Tex.m_Id = Index; - return Tex; - } -}; - -class IEngineGraphics : public IGraphics -{ - MACRO_INTERFACE("enginegraphics") -public: - virtual int Init() = 0; - virtual void Shutdown() override = 0; - - virtual void Minimize() = 0; - virtual void Maximize() = 0; - - virtual int WindowActive() = 0; - virtual int WindowOpen() = 0; -}; - -extern IEngineGraphics *CreateEngineGraphicsThreaded(); - -#endif diff --git a/src/engine/image.h b/src/engine/image.h deleted file mode 100644 index 6b794952aa..0000000000 --- a/src/engine/image.h +++ /dev/null @@ -1,137 +0,0 @@ -#ifndef ENGINE_IMAGE_H -#define ENGINE_IMAGE_H - -#include - -#include - -/** - * Represents an image that has been loaded into main memory. - */ -class CImageInfo -{ -public: - /** - * Defines the format of image data. - */ - enum EImageFormat - { - FORMAT_UNDEFINED = -1, - FORMAT_RGB = 0, - FORMAT_RGBA = 1, - FORMAT_R = 2, - FORMAT_RA = 3, - }; - - /** - * Width of the image. - */ - size_t m_Width = 0; - - /** - * Height of the image. - */ - size_t m_Height = 0; - - /** - * Format of the image. - * - * @see EImageFormat - */ - EImageFormat m_Format = FORMAT_UNDEFINED; - - /** - * Pointer to the image data. - */ - uint8_t *m_pData = nullptr; - - /** - * Frees the image data and clears all info. - */ - void Free(); - - /** - * Returns the pixel size in bytes for the given image format. - * - * @param Format Image format, must not be `FORMAT_UNDEFINED`. - * - * @return Size of one pixel with the given image format. - */ - static size_t PixelSize(EImageFormat Format); - - /** - * Returns a readable name for the given image format. - * - * @param Format Image format. - * - * @return Readable name for the given image format. - */ - static const char *FormatName(EImageFormat Format); - - /** - * Returns the pixel size in bytes for the format of this image. - * - * @return Size of one pixel with the format of this image. - * - * @remark The format must not be `FORMAT_UNDEFINED`. - */ - size_t PixelSize() const; - - /** - * Returns a readable name for the format of this image. - * - * @return Readable name for the format of this image. - */ - const char *FormatName() const; - - /** - * Returns the size of the data, as derived from the width, height and pixel size. - * - * @return Expected size of the image data. - */ - size_t DataSize() const; - - /** - * Returns whether this image is equal to the given image - * in width, height, format and data. - * - * @param Other The image to compare with. - * - * @return `true` if the images are identical, `false` otherwise. - */ - bool DataEquals(const CImageInfo &Other) const; - - /** - * Returns the color of the pixel at the specified position. - * - * @param x The x-coordinate to read from. - * @param y The y-coordinate to read from. - * - * @return Pixel color converted to normalized RGBA. - */ - ColorRGBA PixelColor(size_t x, size_t y) const; - - /** - * Sets the color of the pixel at the specified position. - * - * @param x The x-coordinate to write to. - * @param y The y-coordinate to write to. - * @param Color The normalized RGBA color to write. - */ - void SetPixelColor(size_t x, size_t y, ColorRGBA Color) const; - - /** - * Copies a rectangle of image data from the given image to this image. - * - * @param SrcImage The image to copy data from. - * @param SrcX The x-offset in the source image. - * @param SrcY The y-offset in the source image. - * @param Width The width of the rectangle to copy. - * @param Height The height of the rectangle to copy. - * @param DestX The x-offset in the destination image (this). - * @param DestY The y-offset in the destination image (this). - */ - void CopyRectFrom(const CImageInfo &SrcImage, size_t SrcX, size_t SrcY, size_t Width, size_t Height, size_t DestX, size_t DestY) const; -}; - -#endif diff --git a/src/engine/input.h b/src/engine/input.h deleted file mode 100644 index 86eb20d655..0000000000 --- a/src/engine/input.h +++ /dev/null @@ -1,214 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef ENGINE_INPUT_H -#define ENGINE_INPUT_H - -#include "kernel.h" - -#include -#include - -#include -#include -#include -#include -#include - -class IInput : public IInterface -{ - MACRO_INTERFACE("input") -public: - class CEvent - { - public: - int m_Flags; - int m_Key; - uint32_t m_InputCount; - char m_aText[32]; // SDL_TEXTINPUTEVENT_TEXT_SIZE - }; - - enum - { - FLAG_PRESS = 1 << 0, - FLAG_RELEASE = 1 << 1, - FLAG_TEXT = 1 << 2, - }; - enum ECursorType - { - CURSOR_NONE, - CURSOR_MOUSE, - CURSOR_JOYSTICK, - }; - - // events - virtual void ConsumeEvents(std::function Consumer) const = 0; - /** - * Clears the events and @link KeyPress @endlink state for this frame. Must be called at the end of each frame. - */ - virtual void Clear() = 0; - - /** - * @return Rolling average of the time in seconds between - * calls of the Update function. - */ - virtual float GetUpdateTime() const = 0; - - // keys - virtual bool ModifierIsPressed() const = 0; - virtual bool ShiftIsPressed() const = 0; - virtual bool AltIsPressed() const = 0; - /** - * Returns whether the given key is currently pressed down. This directly represents the state of pressed keys - * based on all handled input events. - * - * This function should be used to trigger behavior continuously while a specific key is held down, e.g. for - * showing a list of all keys that are currently being pressed. - * - * @param Key The key code (see `keys.h`). - * - * @return `true` if key is currently pressed down, `false` otherwise. - */ - virtual bool KeyIsPressed(int Key) const = 0; - /** - * Returns whether the given key was pressed down during input updates for current frame. This state is - * cleared at the end of each frame by calling the @link Clear @endlink function. - * - * This function should be used to trigger behavior only once per key press event per frame, e.g. for menu - * hotkeys that should activate behavior once per key press. - * - * @param Key The key code (see `keys.h`). - * - * @return `true` if key was pressed down during input updates for the current frame, `false` otherwise. - */ - virtual bool KeyPress(int Key) const = 0; - virtual const char *KeyName(int Key) const = 0; - virtual int FindKeyByName(const char *pKeyName) const = 0; - - // joystick - class IJoystick - { - public: - virtual int GetIndex() const = 0; - virtual const char *GetName() const = 0; - virtual int GetNumAxes() const = 0; - virtual int GetNumButtons() const = 0; - virtual int GetNumBalls() const = 0; - virtual int GetNumHats() const = 0; - virtual float GetAxisValue(int Axis) = 0; - virtual void GetHatValue(int Hat, int (&HatKeys)[2]) = 0; - virtual bool Relative(float *pX, float *pY) = 0; - virtual bool Absolute(float *pX, float *pY) = 0; - }; - virtual size_t NumJoysticks() const = 0; - virtual IJoystick *GetJoystick(size_t Index) = 0; - virtual IJoystick *GetActiveJoystick() = 0; - virtual void SetActiveJoystick(size_t Index) = 0; - - // mouse - virtual vec2 NativeMousePos() const = 0; - virtual bool NativeMousePressed(int Index) const = 0; - virtual void MouseModeRelative() = 0; - virtual void MouseModeAbsolute() = 0; - virtual bool MouseRelative(float *pX, float *pY) = 0; - - // touch - /** - * Represents a unique finger for a current touch event. If there are multiple touch input devices, they - * are handled transparently like different fingers. The concrete values of the member variables of this - * class are arbitrary based on the touch device driver and should only be used to uniquely identify touch - * fingers. Note that once a finger has been released, the same finger value may also be reused again. - */ - class CTouchFinger - { - friend class CInput; - - int64_t m_DeviceId; - int64_t m_FingerId; - - public: - bool operator==(const CTouchFinger &Other) const { return m_DeviceId == Other.m_DeviceId && m_FingerId == Other.m_FingerId; } - bool operator!=(const CTouchFinger &Other) const { return !(*this == Other); } - }; - /** - * Represents the state of a particular touch finger currently being pressed down on a touch device. - */ - class CTouchFingerState - { - public: - /** - * The unique finger which this state is associated with. - */ - CTouchFinger m_Finger; - /** - * The current position of the finger. The x- and y-components of the position are normalized to the - * range `0.0f`-`1.0f` representing the absolute position of the finger on the current touch device. - */ - vec2 m_Position; - /** - * The current delta of the finger. The x- and y-components of the delta are normalized to the - * range `0.0f`-`1.0f` representing the absolute delta of the finger on the current touch device. - * - * @remark This is reset to zero at the end of each frame. - */ - vec2 m_Delta; - /** - * The time when this finger was first pressed down. - */ - std::chrono::nanoseconds m_PressTime; - }; - /** - * Returns a vector of the states of all touch fingers currently being pressed down on touch devices. - * Note that this only contains fingers which are pressed down, i.e. released fingers are never stored. - * The order of the fingers in this vector is based on the order in which the fingers where pressed. - * - * @return vector of all touch finger states - */ - virtual const std::vector &TouchFingerStates() const = 0; - /** - * Must be called after the touch finger states have been used during the client update to ensure that - * touch deltas are only accumulated until the next update. If the touch states are only used during - * rendering, i.e. for user interfaces, then this is called automatically by calling @link Clear @endlink. - */ - virtual void ClearTouchDeltas() = 0; - - // clipboard - virtual std::string GetClipboardText() = 0; - virtual void SetClipboardText(const char *pText) = 0; - - // text editing - virtual void StartTextInput() = 0; - virtual void StopTextInput() = 0; - virtual const char *GetComposition() const = 0; - virtual bool HasComposition() const = 0; - virtual int GetCompositionCursor() const = 0; - virtual int GetCompositionLength() const = 0; - virtual const char *GetCandidate(int Index) const = 0; - virtual int GetCandidateCount() const = 0; - virtual int GetCandidateSelectedIndex() const = 0; - virtual void SetCompositionWindowPosition(float X, float Y, float H) = 0; - - virtual bool GetDropFile(char *aBuf, int Len) = 0; - - ECursorType CursorRelative(float *pX, float *pY) - { - if(MouseRelative(pX, pY)) - return CURSOR_MOUSE; - IJoystick *pJoystick = GetActiveJoystick(); - if(pJoystick && pJoystick->Relative(pX, pY)) - return CURSOR_JOYSTICK; - return CURSOR_NONE; - } -}; - -class IEngineInput : public IInput -{ - MACRO_INTERFACE("engineinput") -public: - virtual void Init() = 0; - virtual void Shutdown() override = 0; - virtual int Update() = 0; -}; - -extern IEngineInput *CreateEngineInput(); - -#endif diff --git a/src/engine/keys.h b/src/engine/keys.h deleted file mode 100644 index 246fffff06..0000000000 --- a/src/engine/keys.h +++ /dev/null @@ -1,330 +0,0 @@ -#ifndef ENGINE_KEYS_H -#define ENGINE_KEYS_H -#if defined(CONF_FAMILY_WINDOWS) - #undef KEY_EXECUTE -#endif -/* AUTO GENERATED! DO NOT EDIT MANUALLY! */ -enum -{ - KEY_FIRST = 0, - KEY_UNKNOWN = 0, - KEY_A = 4, - KEY_B = 5, - KEY_C = 6, - KEY_D = 7, - KEY_E = 8, - KEY_F = 9, - KEY_G = 10, - KEY_H = 11, - KEY_I = 12, - KEY_J = 13, - KEY_K = 14, - KEY_L = 15, - KEY_M = 16, - KEY_N = 17, - KEY_O = 18, - KEY_P = 19, - KEY_Q = 20, - KEY_R = 21, - KEY_S = 22, - KEY_T = 23, - KEY_U = 24, - KEY_V = 25, - KEY_W = 26, - KEY_X = 27, - KEY_Y = 28, - KEY_Z = 29, - KEY_1 = 30, - KEY_2 = 31, - KEY_3 = 32, - KEY_4 = 33, - KEY_5 = 34, - KEY_6 = 35, - KEY_7 = 36, - KEY_8 = 37, - KEY_9 = 38, - KEY_0 = 39, - KEY_RETURN = 40, - KEY_ESCAPE = 41, - KEY_BACKSPACE = 42, - KEY_TAB = 43, - KEY_SPACE = 44, - KEY_MINUS = 45, - KEY_EQUALS = 46, - KEY_LEFTBRACKET = 47, - KEY_RIGHTBRACKET = 48, - KEY_BACKSLASH = 49, - KEY_NONUSHASH = 50, - KEY_SEMICOLON = 51, - KEY_APOSTROPHE = 52, - KEY_GRAVE = 53, - KEY_COMMA = 54, - KEY_PERIOD = 55, - KEY_SLASH = 56, - KEY_CAPSLOCK = 57, - KEY_F1 = 58, - KEY_F2 = 59, - KEY_F3 = 60, - KEY_F4 = 61, - KEY_F5 = 62, - KEY_F6 = 63, - KEY_F7 = 64, - KEY_F8 = 65, - KEY_F9 = 66, - KEY_F10 = 67, - KEY_F11 = 68, - KEY_F12 = 69, - KEY_PRINTSCREEN = 70, - KEY_SCROLLLOCK = 71, - KEY_PAUSE = 72, - KEY_INSERT = 73, - KEY_HOME = 74, - KEY_PAGEUP = 75, - KEY_DELETE = 76, - KEY_END = 77, - KEY_PAGEDOWN = 78, - KEY_RIGHT = 79, - KEY_LEFT = 80, - KEY_DOWN = 81, - KEY_UP = 82, - KEY_NUMLOCKCLEAR = 83, - KEY_KP_DIVIDE = 84, - KEY_KP_MULTIPLY = 85, - KEY_KP_MINUS = 86, - KEY_KP_PLUS = 87, - KEY_KP_ENTER = 88, - KEY_KP_1 = 89, - KEY_KP_2 = 90, - KEY_KP_3 = 91, - KEY_KP_4 = 92, - KEY_KP_5 = 93, - KEY_KP_6 = 94, - KEY_KP_7 = 95, - KEY_KP_8 = 96, - KEY_KP_9 = 97, - KEY_KP_0 = 98, - KEY_KP_PERIOD = 99, - KEY_NONUSBACKSLASH = 100, - KEY_APPLICATION = 101, - KEY_POWER = 102, - KEY_KP_EQUALS = 103, - KEY_F13 = 104, - KEY_F14 = 105, - KEY_F15 = 106, - KEY_F16 = 107, - KEY_F17 = 108, - KEY_F18 = 109, - KEY_F19 = 110, - KEY_F20 = 111, - KEY_F21 = 112, - KEY_F22 = 113, - KEY_F23 = 114, - KEY_F24 = 115, - KEY_EXECUTE = 116, - KEY_HELP = 117, - KEY_MENU = 118, - KEY_SELECT = 119, - KEY_STOP = 120, - KEY_AGAIN = 121, - KEY_UNDO = 122, - KEY_CUT = 123, - KEY_COPY = 124, - KEY_PASTE = 125, - KEY_FIND = 126, - KEY_MUTE = 127, - KEY_VOLUMEUP = 128, - KEY_VOLUMEDOWN = 129, - KEY_KP_COMMA = 133, - KEY_KP_EQUALSAS400 = 134, - KEY_INTERNATIONAL1 = 135, - KEY_INTERNATIONAL2 = 136, - KEY_INTERNATIONAL3 = 137, - KEY_INTERNATIONAL4 = 138, - KEY_INTERNATIONAL5 = 139, - KEY_INTERNATIONAL6 = 140, - KEY_INTERNATIONAL7 = 141, - KEY_INTERNATIONAL8 = 142, - KEY_INTERNATIONAL9 = 143, - KEY_LANG1 = 144, - KEY_LANG2 = 145, - KEY_LANG3 = 146, - KEY_LANG4 = 147, - KEY_LANG5 = 148, - KEY_LANG6 = 149, - KEY_LANG7 = 150, - KEY_LANG8 = 151, - KEY_LANG9 = 152, - KEY_ALTERASE = 153, - KEY_SYSREQ = 154, - KEY_CANCEL = 155, - KEY_CLEAR = 156, - KEY_PRIOR = 157, - KEY_RETURN2 = 158, - KEY_SEPARATOR = 159, - KEY_OUT = 160, - KEY_OPER = 161, - KEY_CLEARAGAIN = 162, - KEY_CRSEL = 163, - KEY_EXSEL = 164, - KEY_KP_00 = 176, - KEY_KP_000 = 177, - KEY_THOUSANDSSEPARATOR = 178, - KEY_DECIMALSEPARATOR = 179, - KEY_CURRENCYUNIT = 180, - KEY_CURRENCYSUBUNIT = 181, - KEY_KP_LEFTPAREN = 182, - KEY_KP_RIGHTPAREN = 183, - KEY_KP_LEFTBRACE = 184, - KEY_KP_RIGHTBRACE = 185, - KEY_KP_TAB = 186, - KEY_KP_BACKSPACE = 187, - KEY_KP_A = 188, - KEY_KP_B = 189, - KEY_KP_C = 190, - KEY_KP_D = 191, - KEY_KP_E = 192, - KEY_KP_F = 193, - KEY_KP_XOR = 194, - KEY_KP_POWER = 195, - KEY_KP_PERCENT = 196, - KEY_KP_LESS = 197, - KEY_KP_GREATER = 198, - KEY_KP_AMPERSAND = 199, - KEY_KP_DBLAMPERSAND = 200, - KEY_KP_VERTICALBAR = 201, - KEY_KP_DBLVERTICALBAR = 202, - KEY_KP_COLON = 203, - KEY_KP_HASH = 204, - KEY_KP_SPACE = 205, - KEY_KP_AT = 206, - KEY_KP_EXCLAM = 207, - KEY_KP_MEMSTORE = 208, - KEY_KP_MEMRECALL = 209, - KEY_KP_MEMCLEAR = 210, - KEY_KP_MEMADD = 211, - KEY_KP_MEMSUBTRACT = 212, - KEY_KP_MEMMULTIPLY = 213, - KEY_KP_MEMDIVIDE = 214, - KEY_KP_PLUSMINUS = 215, - KEY_KP_CLEAR = 216, - KEY_KP_CLEARENTRY = 217, - KEY_KP_BINARY = 218, - KEY_KP_OCTAL = 219, - KEY_KP_DECIMAL = 220, - KEY_KP_HEXADECIMAL = 221, - KEY_LCTRL = 224, - KEY_LSHIFT = 225, - KEY_LALT = 226, - KEY_LGUI = 227, - KEY_RCTRL = 228, - KEY_RSHIFT = 229, - KEY_RALT = 230, - KEY_RGUI = 231, - KEY_MODE = 257, - KEY_AUDIONEXT = 258, - KEY_AUDIOPREV = 259, - KEY_AUDIOSTOP = 260, - KEY_AUDIOPLAY = 261, - KEY_AUDIOMUTE = 262, - KEY_MEDIASELECT = 263, - KEY_WWW = 264, - KEY_MAIL = 265, - KEY_CALCULATOR = 266, - KEY_COMPUTER = 267, - KEY_AC_SEARCH = 268, - KEY_AC_HOME = 269, - KEY_AC_BACK = 270, - KEY_AC_FORWARD = 271, - KEY_AC_STOP = 272, - KEY_AC_REFRESH = 273, - KEY_AC_BOOKMARKS = 274, - KEY_BRIGHTNESSDOWN = 275, - KEY_BRIGHTNESSUP = 276, - KEY_DISPLAYSWITCH = 277, - KEY_KBDILLUMTOGGLE = 278, - KEY_KBDILLUMDOWN = 279, - KEY_KBDILLUMUP = 280, - KEY_EJECT = 281, - KEY_SLEEP = 282, - KEY_APP1 = 283, - KEY_APP2 = 284, - KEY_AUDIOREWIND = 285, - KEY_AUDIOFASTFORWARD = 286, - KEY_SOFTLEFT = 287, - KEY_SOFTRIGHT = 288, - KEY_CALL = 289, - KEY_ENDCALL = 290, - - KEY_MOUSE_1 = 291, - KEY_MOUSE_2 = 292, - KEY_MOUSE_3 = 293, - KEY_MOUSE_4 = 294, - KEY_MOUSE_5 = 295, - KEY_MOUSE_6 = 296, - KEY_MOUSE_7 = 297, - KEY_MOUSE_8 = 298, - KEY_MOUSE_9 = 299, - KEY_MOUSE_WHEEL_UP = 300, - KEY_MOUSE_WHEEL_DOWN = 301, - KEY_MOUSE_WHEEL_LEFT = 302, - KEY_MOUSE_WHEEL_RIGHT = 303, - - KEY_JOYSTICK_BUTTON_0 = 304, - KEY_JOYSTICK_BUTTON_1 = 305, - KEY_JOYSTICK_BUTTON_2 = 306, - KEY_JOYSTICK_BUTTON_3 = 307, - KEY_JOYSTICK_BUTTON_4 = 308, - KEY_JOYSTICK_BUTTON_5 = 309, - KEY_JOYSTICK_BUTTON_6 = 310, - KEY_JOYSTICK_BUTTON_7 = 311, - KEY_JOYSTICK_BUTTON_8 = 312, - KEY_JOYSTICK_BUTTON_9 = 313, - KEY_JOYSTICK_BUTTON_10 = 314, - KEY_JOYSTICK_BUTTON_11 = 315, - - KEY_JOY_HAT0_UP = 316, - KEY_JOY_HAT0_LEFT = 317, - KEY_JOY_HAT0_RIGHT = 318, - KEY_JOY_HAT0_DOWN = 319, - KEY_JOY_HAT1_UP = 320, - KEY_JOY_HAT1_LEFT = 321, - KEY_JOY_HAT1_RIGHT = 322, - KEY_JOY_HAT1_DOWN = 323, - - KEY_JOY_AXIS_0_LEFT = 324, - KEY_JOY_AXIS_0_RIGHT = 325, - KEY_JOY_AXIS_1_LEFT = 326, - KEY_JOY_AXIS_1_RIGHT = 327, - KEY_JOY_AXIS_2_LEFT = 328, - KEY_JOY_AXIS_2_RIGHT = 329, - KEY_JOY_AXIS_3_LEFT = 330, - KEY_JOY_AXIS_3_RIGHT = 331, - KEY_JOY_AXIS_4_LEFT = 332, - KEY_JOY_AXIS_4_RIGHT = 333, - KEY_JOY_AXIS_5_LEFT = 334, - KEY_JOY_AXIS_5_RIGHT = 335, - KEY_JOY_AXIS_6_LEFT = 336, - KEY_JOY_AXIS_6_RIGHT = 337, - KEY_JOY_AXIS_7_LEFT = 338, - KEY_JOY_AXIS_7_RIGHT = 339, - KEY_JOY_AXIS_8_LEFT = 340, - KEY_JOY_AXIS_8_RIGHT = 341, - KEY_JOY_AXIS_9_LEFT = 342, - KEY_JOY_AXIS_9_RIGHT = 343, - KEY_JOY_AXIS_10_LEFT = 344, - KEY_JOY_AXIS_10_RIGHT = 345, - KEY_JOY_AXIS_11_LEFT = 346, - KEY_JOY_AXIS_11_RIGHT = 347, - - KEY_LAST = 512, - - NUM_JOYSTICK_BUTTONS = KEY_JOYSTICK_BUTTON_11 - KEY_JOYSTICK_BUTTON_0 + 1, - NUM_JOYSTICK_AXES_BUTTONS = KEY_JOY_AXIS_11_RIGHT - KEY_JOY_AXIS_0_LEFT + 1, - NUM_JOYSTICK_BUTTONS_PER_AXIS = KEY_JOY_AXIS_0_RIGHT - KEY_JOY_AXIS_0_LEFT + 1, - NUM_JOYSTICK_AXES = NUM_JOYSTICK_AXES_BUTTONS / NUM_JOYSTICK_BUTTONS_PER_AXIS, - NUM_JOYSTICK_HAT_BUTTONS = KEY_JOY_HAT1_DOWN - KEY_JOY_HAT0_UP + 1, - NUM_JOYSTICK_BUTTONS_PER_HAT = KEY_JOY_HAT1_DOWN - KEY_JOY_HAT1_UP + 1, - NUM_JOYSTICK_HATS = NUM_JOYSTICK_HAT_BUTTONS / NUM_JOYSTICK_BUTTONS_PER_HAT, -}; - -#endif diff --git a/src/engine/lib.rs b/src/engine/lib.rs deleted file mode 100644 index eef3120d38..0000000000 --- a/src/engine/lib.rs +++ /dev/null @@ -1,19 +0,0 @@ -//! DDNet's engine interfaces, Rust part. -//! -//! DDNet's code base is separated into three major parts, `base`, `engine` and -//! `game`. -//! -//! The engine consists of game-independent code such as display setup, -//! low-level network protocol, low-level map format, etc. -//! -//! This crate in particular corresponds to the `src/engine` directory that only -//! contains interfaces used by `engine` and `game` code. - -#![warn(missing_docs)] - -#[cfg(test)] -extern crate ddnet_test; - -mod console; - -pub use console::*; diff --git a/src/engine/notifications.h b/src/engine/notifications.h deleted file mode 100644 index 38cfe88b0a..0000000000 --- a/src/engine/notifications.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef ENGINE_NOTIFICATIONS_H -#define ENGINE_NOTIFICATIONS_H - -#include "kernel.h" - -class INotifications : public IInterface -{ - MACRO_INTERFACE("notifications") -public: - virtual void Init(const char *pAppname) = 0; - virtual void Shutdown() override = 0; - virtual void Notify(const char *pTitle, const char *pMessage) = 0; -}; - -INotifications *CreateNotifications(); - -#endif // ENGINE_NOTIFICATIONS_H diff --git a/src/engine/rust.h b/src/engine/rust.h deleted file mode 100644 index 6e6ac2e123..0000000000 --- a/src/engine/rust.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef ENGINE_RUST_H -#define ENGINE_RUST_H -#include "console.h" - -typedef IConsole::IResult IConsole_IResult; -typedef IConsole::FCommandCallback IConsole_FCommandCallback; -#endif // ENGINE_RUST_H diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index c81ec1edc0..39aa8710ab 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -32,7 +32,7 @@ #include #include #include -#include + #include #include @@ -3912,8 +3912,6 @@ void CServer::RegisterCommands() Console()->Register("reload_announcement", "", CFGFLAG_SERVER, ConReloadAnnouncement, this, "Reload the announcements"); - RustVersionRegister(*Console()); - Console()->Chain("sv_name", ConchainSpecialInfoupdate, this); Console()->Chain("password", ConchainSpecialInfoupdate, this); Console()->Chain("sv_spectator_slots", ConchainSpecialInfoupdate, this); diff --git a/src/engine/serverbrowser.h b/src/engine/serverbrowser.h deleted file mode 100644 index b0a7fba4ac..0000000000 --- a/src/engine/serverbrowser.h +++ /dev/null @@ -1,367 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef ENGINE_SERVERBROWSER_H -#define ENGINE_SERVERBROWSER_H - -#include -#include - -#include -#include - -#include "kernel.h" - -#include -#include - -static constexpr const char *DDNET_INFO_FILE = "ddnet-info.json"; -static constexpr const char *DDNET_INFO_URL = "https://info.ddnet.org/info"; - -class CUIElement; - -class CServerInfo -{ -public: - enum - { - LOC_UNKNOWN = 0, - LOC_AFRICA, - LOC_ASIA, - LOC_AUSTRALIA, - LOC_EUROPE, - LOC_NORTH_AMERICA, - LOC_SOUTH_AMERICA, - // Special case China because it has an exceptionally bad - // connection to the outside due to the Great Firewall of - // China: - // https://en.wikipedia.org/w/index.php?title=Great_Firewall&oldid=1019589632 - LOC_CHINA, - NUM_LOCS, - }; - - enum EClientScoreKind - { - CLIENT_SCORE_KIND_UNSPECIFIED, - CLIENT_SCORE_KIND_POINTS, - CLIENT_SCORE_KIND_TIME, - CLIENT_SCORE_KIND_TIME_BACKCOMPAT, - }; - - enum ERankState - { - RANK_UNAVAILABLE, - RANK_RANKED, - RANK_UNRANKED, - }; - - enum - { - MAX_COMMUNITY_ID_LENGTH = 32, - MAX_COMMUNITY_COUNTRY_LENGTH = 32, - MAX_COMMUNITY_TYPE_LENGTH = 32, - }; - - class CClient - { - public: - char m_aName[MAX_NAME_LENGTH]; - char m_aClan[MAX_CLAN_LENGTH]; - int m_Country; - int m_Score; - bool m_Player; - bool m_Afk; - - // skin info - char m_aSkin[MAX_SKIN_LENGTH]; - bool m_CustomSkinColors; - int m_CustomSkinColorBody; - int m_CustomSkinColorFeet; - - int m_FriendState; - }; - - int m_ServerIndex; - - int m_Type; - uint64_t m_ReceivedPackets; - int m_NumReceivedClients; - - int m_NumAddresses; - NETADDR m_aAddresses[MAX_SERVER_ADDRESSES]; - - int m_QuickSearchHit; - int m_FriendState; - int m_FriendNum; - - int m_MaxClients; - int m_NumClients; - int m_MaxPlayers; - int m_NumPlayers; - int m_Flags; - EClientScoreKind m_ClientScoreKind; - TRISTATE m_Favorite; - TRISTATE m_FavoriteAllowPing; - char m_aCommunityId[MAX_COMMUNITY_ID_LENGTH]; - char m_aCommunityCountry[MAX_COMMUNITY_COUNTRY_LENGTH]; - char m_aCommunityType[MAX_COMMUNITY_TYPE_LENGTH]; - int m_Location; - bool m_LatencyIsEstimated; - int m_Latency; // in ms - ERankState m_HasRank; - char m_aGameType[16]; - char m_aName[64]; - char m_aMap[MAX_MAP_LENGTH]; - int m_MapCrc; - int m_MapSize; - char m_aVersion[32]; - char m_aAddress[MAX_SERVER_ADDRESSES * NETADDR_MAXSTRSIZE]; - CClient m_aClients[SERVERINFO_MAX_CLIENTS]; - int m_NumFilteredPlayers; - bool m_RequiresLogin; - - static int EstimateLatency(int Loc1, int Loc2); - static bool ParseLocation(int *pResult, const char *pString); -}; - -class CCommunityCountryServer -{ - NETADDR m_Address; - char m_aTypeName[CServerInfo::MAX_COMMUNITY_TYPE_LENGTH]; - -public: - CCommunityCountryServer(NETADDR Address, const char *pTypeName) : - m_Address(Address) - { - str_copy(m_aTypeName, pTypeName); - } - - NETADDR Address() const { return m_Address; } - const char *TypeName() const { return m_aTypeName; } -}; - -class CCommunityCountry -{ - friend class CServerBrowser; - - char m_aName[CServerInfo::MAX_COMMUNITY_COUNTRY_LENGTH]; - int m_FlagId; - std::vector m_vServers; - -public: - CCommunityCountry(const char *pName, int FlagId) : - m_FlagId(FlagId) - { - str_copy(m_aName, pName); - } - - const char *Name() const { return m_aName; } - int FlagId() const { return m_FlagId; } - const std::vector &Servers() const { return m_vServers; } -}; - -class CCommunityType -{ - char m_aName[CServerInfo::MAX_COMMUNITY_TYPE_LENGTH]; - -public: - CCommunityType(const char *pName) - { - str_copy(m_aName, pName); - } - - const char *Name() const { return m_aName; } -}; - -class CCommunityMap -{ - char m_aName[MAX_MAP_LENGTH]; - -public: - CCommunityMap(const char *pName) - { - str_copy(m_aName, pName); - } - - const char *Name() const { return m_aName; } - - bool operator==(const CCommunityMap &Other) const - { - return str_comp(Name(), Other.Name()) == 0; - } - - bool operator!=(const CCommunityMap &Other) const - { - return !(*this == Other); - } - - struct SHash - { - size_t operator()(const CCommunityMap &Map) const - { - return str_quickhash(Map.Name()); - } - }; -}; - -class CCommunity -{ - friend class CServerBrowser; - - char m_aId[CServerInfo::MAX_COMMUNITY_ID_LENGTH]; - char m_aName[64]; - SHA256_DIGEST m_IconSha256; - char m_aIconUrl[128]; - std::vector m_vCountries; - std::vector m_vTypes; - bool m_HasFinishes = false; - std::unordered_set m_FinishedMaps; - -public: - CCommunity(const char *pId, const char *pName, SHA256_DIGEST IconSha256, const char *pIconUrl) : - m_IconSha256(IconSha256) - { - str_copy(m_aId, pId); - str_copy(m_aName, pName); - str_copy(m_aIconUrl, pIconUrl); - } - - const char *Id() const { return m_aId; } - const char *Name() const { return m_aName; } - const char *IconUrl() const { return m_aIconUrl; } - const SHA256_DIGEST &IconSha256() const { return m_IconSha256; } - const std::vector &Countries() const { return m_vCountries; } - const std::vector &Types() const { return m_vTypes; } - bool HasCountry(const char *pCountryName) const; - bool HasType(const char *pTypeName) const; - bool HasRanks() const { return m_HasFinishes; } - CServerInfo::ERankState HasRank(const char *pMap) const; -}; - -class IFilterList -{ -public: - virtual void Add(const char *pElement) = 0; - virtual void Remove(const char *pElement) = 0; - virtual void Clear() = 0; - virtual bool Empty() const = 0; - virtual bool Filtered(const char *pElement) const = 0; -}; - -class ICommunityCache -{ -public: - virtual void Update(bool Force) = 0; - virtual const std::vector &SelectedCommunities() const = 0; - virtual const std::vector &SelectableCountries() const = 0; - virtual const std::vector &SelectableTypes() const = 0; - virtual bool AnyRanksAvailable() const = 0; - virtual bool CountriesTypesFilterAvailable() const = 0; - virtual const char *CountryTypeFilterKey() const = 0; -}; - -class IServerBrowser : public IInterface -{ - MACRO_INTERFACE("serverbrowser") -public: - /* Constants: Server Browser Sorting - SORT_NAME - Sort by name. - SORT_PING - Sort by ping. - SORT_MAP - Sort by map - SORT_GAMETYPE - Sort by game type. DM, TDM etc. - SORT_NUMPLAYERS - Sort after how many players there are on the server. - SORT_NUMFRIENDS - Sort after how many friends there are on the server. - */ - enum - { - SORT_NAME = 0, - SORT_PING, - SORT_MAP, - SORT_GAMETYPE, - SORT_NUMPLAYERS, - SORT_NUMFRIENDS, - - QUICK_SERVERNAME = 1, - QUICK_PLAYER = 2, - QUICK_MAPNAME = 4, - - TYPE_INTERNET = 0, - TYPE_LAN, - TYPE_FAVORITES, - TYPE_FAVORITE_COMMUNITY_1, - TYPE_FAVORITE_COMMUNITY_2, - TYPE_FAVORITE_COMMUNITY_3, - TYPE_FAVORITE_COMMUNITY_4, - TYPE_FAVORITE_COMMUNITY_5, - NUM_TYPES, - - LAN_PORT_BEGIN = 8303, - LAN_PORT_END = 8310, - }; - - class CServerEntry - { - public: - int64_t m_RequestTime; - bool m_RequestIgnoreInfo; - int m_GotInfo; - CServerInfo m_Info; - - CServerEntry *m_pPrevReq; // request list - CServerEntry *m_pNextReq; - }; - - static constexpr const char *COMMUNITY_DDNET = "ddnet"; - static constexpr const char *COMMUNITY_NONE = "none"; - - static constexpr const char *COMMUNITY_COUNTRY_NONE = "none"; - static constexpr const char *COMMUNITY_TYPE_NONE = "None"; - /** - * Special community value for country/type filters that - * affect all communities. - */ - static constexpr const char *COMMUNITY_ALL = "all"; - - static constexpr const char *SEARCH_EXCLUDE_TOKEN = ";"; - - virtual void Refresh(int Type, bool Force = false) = 0; - virtual bool IsGettingServerlist() const = 0; - virtual bool IsRefreshing() const = 0; - virtual int LoadingProgression() const = 0; - - virtual int NumServers() const = 0; - - virtual int Players(const CServerInfo &Item) const = 0; - virtual int Max(const CServerInfo &Item) const = 0; - - virtual int NumSortedServers() const = 0; - virtual int NumSortedPlayers() const = 0; - virtual const CServerInfo *SortedGet(int Index) const = 0; - - virtual const std::vector &Communities() const = 0; - virtual const CCommunity *Community(const char *pCommunityId) const = 0; - virtual std::vector SelectedCommunities() const = 0; - virtual std::vector FavoriteCommunities() const = 0; - virtual std::vector CurrentCommunities() const = 0; - virtual unsigned CurrentCommunitiesHash() const = 0; - - virtual bool DDNetInfoAvailable() const = 0; - virtual SHA256_DIGEST DDNetInfoSha256() const = 0; - - virtual ICommunityCache &CommunityCache() = 0; - virtual const ICommunityCache &CommunityCache() const = 0; - virtual IFilterList &FavoriteCommunitiesFilter() = 0; - virtual IFilterList &CommunitiesFilter() = 0; - virtual IFilterList &CountriesFilter() = 0; - virtual IFilterList &TypesFilter() = 0; - virtual const IFilterList &FavoriteCommunitiesFilter() const = 0; - virtual const IFilterList &CommunitiesFilter() const = 0; - virtual const IFilterList &CountriesFilter() const = 0; - virtual const IFilterList &TypesFilter() const = 0; - virtual void CleanFilters() = 0; - - virtual CServerEntry *Find(const NETADDR &Addr) = 0; - virtual int GetCurrentType() = 0; - virtual const char *GetTutorialServer() = 0; -}; - -#endif diff --git a/src/engine/shared/Cargo.toml b/src/engine/shared/Cargo.toml deleted file mode 100644 index 690081ea0f..0000000000 --- a/src/engine/shared/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "ddnet-engine-shared" -version = "0.0.1" -edition = "2021" -publish = false -license = "Zlib" - -[lib] -crate-type = ["rlib", "staticlib"] -path = "lib.rs" - -[dependencies] -ddnet-base = { path = "../../base" } -ddnet-engine = { path = ".." } - -cxx = "1.0" - -[dev-dependencies] -ddnet-test = { path = "../../rust-bridge/test", features = ["link-test-libraries"] } diff --git a/src/engine/shared/build.rs b/src/engine/shared/build.rs deleted file mode 100644 index a9d62f96b5..0000000000 --- a/src/engine/shared/build.rs +++ /dev/null @@ -1,18 +0,0 @@ -use std::env; -use std::fs; -use std::path::PathBuf; -use std::process::Command; - -fn main() { - let mut out = PathBuf::from(env::var_os("OUT_DIR").expect("OUT_DIR")); - out.push("rustc-version"); - let rustc = env::var_os("RUSTC").expect("RUSTC"); - let rustc_output = Command::new(rustc) - .arg("--version") - .output() - .expect("rustc --version"); - if !rustc_output.status.success() { - panic!("rustc --version: exit status {}", rustc_output.status); - } - fs::write(&out, rustc_output.stdout).expect("file write"); -} diff --git a/src/engine/shared/config.cpp b/src/engine/shared/config.cpp index 57ddfccd52..1295ac1d97 100644 --- a/src/engine/shared/config.cpp +++ b/src/engine/shared/config.cpp @@ -366,76 +366,6 @@ void CConfigManager::SetReadOnly(const char *pScriptName, bool ReadOnly) dbg_assert(false, aBuf); } -bool CConfigManager::Save() -{ - if(!m_pStorage || !g_Config.m_ClSaveSettings) - return true; - - char aConfigFileTmp[IO_MAX_PATH_LENGTH]; - m_ConfigFile = m_pStorage->OpenFile(IStorage::FormatTmpPath(aConfigFileTmp, sizeof(aConfigFileTmp), CONFIG_FILE), IOFLAG_WRITE, IStorage::TYPE_SAVE); - - if(!m_ConfigFile) - { - log_error("config", "ERROR: opening %s failed", aConfigFileTmp); - return false; - } - - m_Failed = false; - - char aLineBuf[2048]; - for(const SConfigVariable *pVariable : m_vpAllVariables) - { - if((pVariable->m_Flags & CFGFLAG_SAVE) != 0 && !pVariable->IsDefault()) - { - pVariable->Serialize(aLineBuf, sizeof(aLineBuf)); - WriteLine(aLineBuf); - } - } - - for(const auto &Callback : m_vCallbacks) - { - Callback.m_pfnFunc(this, Callback.m_pUserData); - } - - for(const char *pCommand : m_vpUnknownCommands) - { - WriteLine(pCommand); - } - - if(m_Failed) - { - log_error("config", "ERROR: writing to %s failed", aConfigFileTmp); - } - - if(io_sync(m_ConfigFile) != 0) - { - m_Failed = true; - log_error("config", "ERROR: synchronizing %s failed", aConfigFileTmp); - } - - if(io_close(m_ConfigFile) != 0) - { - m_Failed = true; - log_error("config", "ERROR: closing %s failed", aConfigFileTmp); - } - - m_ConfigFile = 0; - - if(m_Failed) - { - return false; - } - - if(!m_pStorage->RenameFile(aConfigFileTmp, CONFIG_FILE, IStorage::TYPE_SAVE)) - { - log_error("config", "ERROR: renaming %s to " CONFIG_FILE " failed", aConfigFileTmp); - return false; - } - - log_info("config", "saved to " CONFIG_FILE); - return true; -} - void CConfigManager::RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData) { m_vCallbacks.emplace_back(pfnFunc, pUserData); diff --git a/src/engine/shared/config.h b/src/engine/shared/config.h index 431ca02728..5bfb5d8448 100644 --- a/src/engine/shared/config.h +++ b/src/engine/shared/config.h @@ -229,7 +229,6 @@ class CConfigManager : public IConfigManager void Reset(const char *pScriptName) override; void ResetGameSettings() override; void SetReadOnly(const char *pScriptName, bool ReadOnly) override; - bool Save() override; CConfig *Values() override { return &g_Config; } void RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData) override; diff --git a/src/engine/shared/config.rs b/src/engine/shared/config.rs deleted file mode 100644 index 968f18025e..0000000000 --- a/src/engine/shared/config.rs +++ /dev/null @@ -1,65 +0,0 @@ -/// Config variable that is saved when the client is closed. -/// -/// Has no effect on other commands. -pub const CFGFLAG_SAVE: i32 = 1 << 0; - -/// Command that is available in the client. -pub const CFGFLAG_CLIENT: i32 = 1 << 1; - -/// Command that is available on the server. -pub const CFGFLAG_SERVER: i32 = 1 << 2; - -/// Command that is delayed in the execution until -/// `IConsole::StoreCommands(false)` is called. -pub const CFGFLAG_STORE: i32 = 1 << 3; - -/// Command that is available in the master server. -pub const CFGFLAG_MASTER: i32 = 1 << 4; - -/// Command that has something to do with the external console (econ). -pub const CFGFLAG_ECON: i32 = 1 << 5; - -/// Command that can be used for testing or cheating maps. Only available if -/// `sv_test_cmds 1` is set. -pub const CMDFLAG_TEST: i32 = 1 << 6; - -/// Command that can be used from the chat on the server. -pub const CFGFLAG_CHAT: i32 = 1 << 7; - -/// Command that can be used from a map config. -/// -/// Only commands that are not security sensitive should have this flag. -pub const CFGFLAG_GAME: i32 = 1 << 8; - -/// Command that is not recorded into teehistorian. -/// -/// This should only be set for security sensitive commands like passwords etc. -/// that should not be recorded. -pub const CFGFLAG_NONTEEHISTORIC: i32 = 1 << 9; - -/// Color config variable that can only have lightness 0.5 to 1.0. -/// -/// This is achieved by dividing the lightness channel by and adding 0.5, i.e. -/// remapping all the colors. -/// -/// Has no effect on other commands or config variables. -pub const CFGFLAG_COLLIGHT: i32 = 1 << 10; - -/// Color config variable that can only have lightness (61/255) to 1.0. -/// -/// This is achieved by dividing the lightness channel by and adding (61/255), i.e. -/// remapping all the colors. -/// -/// Has no effect on other commands or config variables. -pub const CFGFLAG_COLLIGHT7: i32 = 1 << 11; - -/// Color config variable that includes an alpha (opacity) value. -/// -/// Has no effect on other commands or config variables. -pub const CFGFLAG_COLALPHA: i32 = 1 << 12; - -/// Config variable with insensitive data that can be included in client -/// integrity checks. -/// -/// This should only be set on config variables the server could observe anyway. -pub const CFGFLAG_INSENSITIVE: i32 = 1 << 13; diff --git a/src/engine/shared/config_variables.h b/src/engine/shared/config_variables.h index bf23c4870d..3a299201a9 100644 --- a/src/engine/shared/config_variables.h +++ b/src/engine/shared/config_variables.h @@ -10,232 +10,6 @@ #define MACRO_CONFIG_STR(Name, ScriptName, Len, Def, Save, Desc) ; #endif -// client -MACRO_CONFIG_INT(ClPredict, cl_predict, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Predict client movements") -MACRO_CONFIG_INT(ClPredictDummy, cl_predict_dummy, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Predict dummy movements") -MACRO_CONFIG_INT(ClAntiPingLimit, cl_antiping_limit, 0, 0, 200, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Antiping limit (0 to disable)") -MACRO_CONFIG_INT(ClAntiPing, cl_antiping, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Enable antiping, i. e. more aggressive prediction.") -MACRO_CONFIG_INT(ClAntiPingPlayers, cl_antiping_players, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Predict other player's movement more aggressively (only enabled if cl_antiping is set to 1)") -MACRO_CONFIG_INT(ClAntiPingGrenade, cl_antiping_grenade, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Predict grenades (only enabled if cl_antiping is set to 1)") -MACRO_CONFIG_INT(ClAntiPingWeapons, cl_antiping_weapons, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Predict weapon projectiles (only enabled if cl_antiping is set to 1)") -MACRO_CONFIG_INT(ClAntiPingSmooth, cl_antiping_smooth, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Make the prediction of other player's movement smoother") -MACRO_CONFIG_INT(ClAntiPingGunfire, cl_antiping_gunfire, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Predict gunfire and show predicted weapon physics (with cl_antiping_grenade 1 and cl_antiping_weapons 1)") -MACRO_CONFIG_INT(ClPredictionMargin, cl_prediction_margin, 10, 1, 300, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Prediction margin in ms (adds latency, can reduce lag from ping jumps)") -MACRO_CONFIG_INT(ClSubTickAiming, cl_sub_tick_aiming, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Send aiming data at sub-tick accuracy") -#if defined(CONF_PLATFORM_ANDROID) -MACRO_CONFIG_INT(ClTouchControls, cl_touch_controls, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Enable ingame touch controls") -#else -MACRO_CONFIG_INT(ClTouchControls, cl_touch_controls, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Enable ingame touch controls") -#endif - -MACRO_CONFIG_INT(ClNamePlates, cl_nameplates, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show name plates") -MACRO_CONFIG_INT(ClNamePlatesAlways, cl_nameplates_always, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Always show name plates disregarding of distance") -MACRO_CONFIG_INT(ClNamePlatesTeamcolors, cl_nameplates_teamcolors, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Use team colors for name plates") -MACRO_CONFIG_INT(ClNamePlatesSize, cl_nameplates_size, 50, -50, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Size of the name plates") -MACRO_CONFIG_INT(ClNamePlatesClan, cl_nameplates_clan, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show clan in name plates") -MACRO_CONFIG_INT(ClNamePlatesClanSize, cl_nameplates_clan_size, 30, -50, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Size of the clan plates") -MACRO_CONFIG_INT(ClNamePlatesIds, cl_nameplates_ids, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show client IDs in name plates") -MACRO_CONFIG_INT(ClNamePlatesOwn, cl_nameplates_own, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show own name plate (useful for demo recording)") -MACRO_CONFIG_INT(ClNamePlatesFriendMark, cl_nameplates_friendmark, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show friend mark (♥) in name plates") -MACRO_CONFIG_INT(ClNamePlatesStrong, cl_nameplates_strong, 0, 0, 2, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show strong/weak in name plates (0 - off, 1 - icons, 2 - icons + numbers)") -MACRO_CONFIG_INT(ClNamePlatesStrongSize, cl_nameplates_strong_size, 30, -50, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Size of strong/weak state icons and numbers") - -MACRO_CONFIG_INT(ClAfkEmote, cl_afk_emote, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show zzz emote next to afk players") -MACRO_CONFIG_INT(ClTextEntities, cl_text_entities, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Render textual entity data") -MACRO_CONFIG_INT(ClTextEntitiesSize, cl_text_entities_size, 100, 1, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Size of textual entity data from 1 to 100%") -MACRO_CONFIG_INT(ClStreamerMode, cl_streamer_mode, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Censor sensitive information such as /save password") - -MACRO_CONFIG_COL(ClAuthedPlayerColor, cl_authed_player_color, 5898211, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Color of name of authenticated player in scoreboard") -MACRO_CONFIG_COL(ClSameClanColor, cl_same_clan_color, 5898211, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Clan color of players with the same clan as you in scoreboard.") - -MACRO_CONFIG_INT(ClEnablePingColor, cl_enable_ping_color, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether ping is colored in scoreboard.") -MACRO_CONFIG_INT(ClAutoswitchWeapons, cl_autoswitch_weapons, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Auto switch weapon on pickup") -MACRO_CONFIG_INT(ClAutoswitchWeaponsOutOfAmmo, cl_autoswitch_weapons_out_of_ammo, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Auto switch weapon when out of ammo") - -MACRO_CONFIG_INT(ClShowhud, cl_showhud, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame HUD") -MACRO_CONFIG_INT(ClShowhudHealthAmmo, cl_showhud_healthammo, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame HUD (Health + Ammo)") -MACRO_CONFIG_INT(ClShowhudScore, cl_showhud_score, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame HUD (Score)") -MACRO_CONFIG_INT(ClShowhudTimer, cl_showhud_timer, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame HUD (Timer)") -MACRO_CONFIG_INT(ClShowhudTimeCpDiff, cl_showhud_time_cp_diff, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame HUD (Time Checkpoint Difference)") -MACRO_CONFIG_INT(ClShowhudDummyActions, cl_showhud_dummy_actions, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame HUD (Dummy Actions)") -MACRO_CONFIG_INT(ClShowhudPlayerPosition, cl_showhud_player_position, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame HUD (Player Position)") -MACRO_CONFIG_INT(ClShowhudPlayerSpeed, cl_showhud_player_speed, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame HUD (Player Speed)") -MACRO_CONFIG_INT(ClShowhudPlayerAngle, cl_showhud_player_angle, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame HUD (Player Aim Angle)") -MACRO_CONFIG_INT(ClShowhudDDRace, cl_showhud_ddrace, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Show ingame HUD (DDRace HUD)") -MACRO_CONFIG_INT(ClShowhudJumpsIndicator, cl_showhud_jumps_indicator, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Show ingame HUD (Jumps you have and have used)") -MACRO_CONFIG_INT(ClShowFreezeBars, cl_show_freeze_bars, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Whether to show a freeze bar under frozen players to indicate the thaw time") -MACRO_CONFIG_INT(ClFreezeBarsAlphaInsideFreeze, cl_freezebars_alpha_inside_freeze, 0, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Opacity of freeze bars inside freeze (0 invisible, 100 fully visible)") -MACRO_CONFIG_INT(ClShowRecord, cl_showrecord, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show old style DDRace client records") -MACRO_CONFIG_INT(ClShowNotifications, cl_shownotifications, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Make the client notify when someone highlights you") -MACRO_CONFIG_INT(ClShowEmotes, cl_showemotes, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show tee emotes") -MACRO_CONFIG_INT(ClShowChat, cl_showchat, 1, 0, 2, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show chat (2 to always show large chat area)") -MACRO_CONFIG_INT(ClShowChatFriends, cl_show_chat_friends, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show only chat messages from friends") -MACRO_CONFIG_INT(ClShowChatTeamMembersOnly, cl_show_chat_team_members_only, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show only chat messages from team members") -MACRO_CONFIG_INT(ClShowChatSystem, cl_show_chat_system, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show chat messages from the server") -MACRO_CONFIG_INT(ClShowKillMessages, cl_showkillmessages, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show kill messages") -MACRO_CONFIG_INT(ClShowFinishMessages, cl_show_finish_messages, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show finish messages") -MACRO_CONFIG_INT(ClShowVotesAfterVoting, cl_show_votes_after_voting, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show votes window after voting") -MACRO_CONFIG_INT(ClShowLocalTimeAlways, cl_show_local_time_always, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Always show local time") -MACRO_CONFIG_INT(ClShowfps, cl_showfps, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame FPS counter") -MACRO_CONFIG_INT(ClShowpred, cl_showpred, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame prediction time in milliseconds") -MACRO_CONFIG_INT(ClEyeWheel, cl_eye_wheel, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show eye wheel along together with emotes") -MACRO_CONFIG_INT(ClEyeDuration, cl_eye_duration, 999999, 1, 999999, CFGFLAG_CLIENT | CFGFLAG_SAVE, "How long the eyes emotes last") -MACRO_CONFIG_INT(ClFreezeStars, cl_freeze_stars, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show old star particles for frozen tees") - -MACRO_CONFIG_INT(ClSpecCursor, cl_spec_cursor, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Enable the cursor of spectating player if available") - -MACRO_CONFIG_INT(ClAirjumpindicator, cl_airjumpindicator, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show the air jump indicator") -MACRO_CONFIG_INT(ClThreadsoundloading, cl_threadsoundloading, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Load sound files threaded") - -MACRO_CONFIG_INT(ClWarningTeambalance, cl_warning_teambalance, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Warn about team balance") - -MACRO_CONFIG_INT(ClMouseDeadzone, cl_mouse_deadzone, 0, 0, 3000, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Deadzone for the camera to follow the cursor") -MACRO_CONFIG_INT(ClMouseFollowfactor, cl_mouse_followfactor, 0, 0, 200, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Factor for the camera to follow the cursor") -MACRO_CONFIG_INT(ClMouseMaxDistance, cl_mouse_max_distance, 400, 0, 5000, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Maximum cursor distance") -MACRO_CONFIG_INT(ClMouseMinDistance, cl_mouse_min_distance, 0, 0, 5000, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Minimum cursor distance") - -MACRO_CONFIG_INT(ClDyncam, cl_dyncam, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Enable dyncam") -MACRO_CONFIG_INT(ClDyncamMaxDistance, cl_dyncam_max_distance, 1000, 0, 2000, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Maximum dynamic camera cursor distance") -MACRO_CONFIG_INT(ClDyncamMinDistance, cl_dyncam_min_distance, 0, 0, 2000, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Minimum dynamic camera cursor distance") -MACRO_CONFIG_INT(ClDyncamMousesens, cl_dyncam_mousesens, 0, 0, 100000, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Mouse sens used when dyncam is toggled on") -MACRO_CONFIG_INT(ClDyncamDeadzone, cl_dyncam_deadzone, 300, 1, 1300, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Deadzone for the dynamic camera to follow the cursor") -MACRO_CONFIG_INT(ClDyncamFollowFactor, cl_dyncam_follow_factor, 60, 0, 200, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Factor for the dynamic camera to follow the cursor") - -MACRO_CONFIG_INT(ClDyncamSmoothness, cl_dyncam_smoothness, 0, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Transition amount of the camera movement, 0=instant, 100=slow and smooth") -MACRO_CONFIG_INT(ClDyncamStabilizing, cl_dyncam_stabilizing, 0, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Amount of camera slowdown during fast cursor movement. High value can cause delay in camera movement") - -MACRO_CONFIG_INT(ClMultiViewSensitivity, cl_multiview_sensitivity, 100, 0, 200, CFGFLAG_CLIENT | CFGFLAG_INSENSITIVE, "Set how fast the camera will move to the desired location (higher = faster)") -MACRO_CONFIG_INT(ClMultiViewZoomSmoothness, cl_multiview_zoom_smoothness, 1300, 50, 5000, CFGFLAG_CLIENT | CFGFLAG_INSENSITIVE, "Set the smoothness of the multi-view zoom (in ms, higher = slower)") - -MACRO_CONFIG_INT(ClSpectatorMouseclicks, cl_spectator_mouseclicks, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Enables left-click to toggle between spectating the closest player and free-view") -MACRO_CONFIG_INT(ClSmoothSpectatingTime, cl_smooth_spectating_time, 300, 0, 5000, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Time of smooth camera switch animation when spectating in ms (0 for off)") - -MACRO_CONFIG_INT(EdAutosaveInterval, ed_autosave_interval, 10, 0, 240, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Interval in minutes at which a copy of the current editor map is automatically saved to the 'auto' folder (0 for off)") -MACRO_CONFIG_INT(EdAutosaveMax, ed_autosave_max, 10, 0, 1000, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Maximum number of autosaves that are kept per map name (0 = no limit)") -MACRO_CONFIG_INT(EdSmoothZoomTime, ed_smooth_zoom_time, 250, 0, 5000, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Time of smooth zoom animation in the editor in ms (0 for off)") -MACRO_CONFIG_INT(EdLimitMaxZoomLevel, ed_limit_max_zoom_level, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Specifies, if zooming in the editor should be limited or not (0 = no limit)") -MACRO_CONFIG_INT(EdZoomTarget, ed_zoom_target, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Zoom to the current mouse target") -MACRO_CONFIG_INT(EdShowkeys, ed_showkeys, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show pressed keys") -MACRO_CONFIG_INT(EdAlignQuads, ed_align_quads, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Enable/disable quad alignment. When enabled, red lines appear to show how quad/points are aligned and snapped to other quads/points when moving them") -MACRO_CONFIG_INT(EdShowQuadsRect, ed_show_quads_rect, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show the bounds of the selected quad. In case of multiple quads, it shows the bounds of the englobing rect. Can be helpful when aligning a group of quads") -MACRO_CONFIG_INT(EdAutoMapReload, ed_auto_map_reload, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Run 'hot_reload' on the local server while rcon authed on map save") -MACRO_CONFIG_INT(EdLayerSelector, ed_layer_selector, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Ctrl+right click tiles to select their layers in the editor") - -MACRO_CONFIG_INT(ClShowWelcome, cl_show_welcome, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show welcome message indicating the first launch of the client") -MACRO_CONFIG_INT(ClMotdTime, cl_motd_time, 10, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "How long to show the server message of the day") - -// http map download -MACRO_CONFIG_STR(ClMapDownloadUrl, cl_map_download_url, 100, "https://maps.ddnet.org", CFGFLAG_CLIENT | CFGFLAG_SAVE, "URL used to download maps (can start with http:// or https://)") -MACRO_CONFIG_INT(ClMapDownloadConnectTimeoutMs, cl_map_download_connect_timeout_ms, 2000, 0, 100000, CFGFLAG_CLIENT | CFGFLAG_SAVE, "HTTP map downloads: timeout for the connect phase in milliseconds (0 to disable)") -MACRO_CONFIG_INT(ClMapDownloadLowSpeedLimit, cl_map_download_low_speed_limit, 4000, 0, 100000, CFGFLAG_CLIENT | CFGFLAG_SAVE, "HTTP map downloads: Set low speed limit in bytes per second (0 to disable)") -MACRO_CONFIG_INT(ClMapDownloadLowSpeedTime, cl_map_download_low_speed_time, 3, 0, 100000, CFGFLAG_CLIENT | CFGFLAG_SAVE, "HTTP map downloads: Set low speed limit time period (0 to disable)") - -MACRO_CONFIG_STR(ClLanguagefile, cl_languagefile, 255, "", CFGFLAG_CLIENT | CFGFLAG_SAVE, "What language file to use") -MACRO_CONFIG_STR(ClSkinDownloadUrl, cl_skin_download_url, 100, "https://skins.ddnet.org/skin/", CFGFLAG_CLIENT | CFGFLAG_SAVE, "URL used to download skins") -MACRO_CONFIG_STR(ClSkinCommunityDownloadUrl, cl_skin_community_download_url, 100, "https://skins.ddnet.org/skin/community/", CFGFLAG_CLIENT | CFGFLAG_SAVE, "URL used to download community skins") -MACRO_CONFIG_INT(ClVanillaSkinsOnly, cl_vanilla_skins_only, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Only show skins available in Vanilla Teeworlds") -MACRO_CONFIG_INT(ClDownloadSkins, cl_download_skins, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Download skins from cl_skin_download_url on-the-fly") -MACRO_CONFIG_INT(ClDownloadCommunitySkins, cl_download_community_skins, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Allow to download skins created by the community. Uses cl_skin_community_download_url instead of cl_skin_download_url for the download") -MACRO_CONFIG_INT(ClAutoStatboardScreenshot, cl_auto_statboard_screenshot, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Automatically take game over statboard screenshot") -MACRO_CONFIG_INT(ClAutoStatboardScreenshotMax, cl_auto_statboard_screenshot_max, 10, 0, 1000, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Maximum number of automatically created statboard screenshots (0 = no limit)") - -MACRO_CONFIG_INT(ClDefaultZoom, cl_default_zoom, 10, 0, 20, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Default zoom level") -MACRO_CONFIG_INT(ClSmoothZoomTime, cl_smooth_zoom_time, 250, 0, 5000, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Time of smooth zoom animation ingame in ms (0 for off)") -MACRO_CONFIG_INT(ClLimitMaxZoomLevel, cl_limit_max_zoom_level, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Specifies, if zooming ingame should be limited or not (0 = no limit)") - -MACRO_CONFIG_INT(ClPlayerUseCustomColor, player_use_custom_color, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Toggles usage of custom colors") -MACRO_CONFIG_COL(ClPlayerColorBody, player_color_body, 65408, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT | CFGFLAG_INSENSITIVE, "Player body color") -MACRO_CONFIG_COL(ClPlayerColorFeet, player_color_feet, 65408, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT | CFGFLAG_INSENSITIVE, "Player feet color") -MACRO_CONFIG_STR(ClPlayerSkin, player_skin, 24, "default", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Player skin") -MACRO_CONFIG_INT(ClPlayerDefaultEyes, player_default_eyes, 0, 0, 5, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Player eyes when joining server. 0 = normal, 1 = pain, 2 = happy, 3 = surprise, 4 = angry, 5 = blink") -MACRO_CONFIG_STR(ClSkinPrefix, cl_skin_prefix, 12, "", CFGFLAG_CLIENT | CFGFLAG_SAVE, "Replace the skins by skins with this prefix (e.g. kitty, santa)") -MACRO_CONFIG_INT(ClFatSkins, cl_fat_skins, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Enable fat skins") - -MACRO_CONFIG_COL(ClPlayer7ColorBody, player7_color_body, 0x1B6F74, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT7 | CFGFLAG_INSENSITIVE, "Player body color") -MACRO_CONFIG_COL(ClPlayer7ColorFeet, player7_color_feet, 0x1C873E, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT7 | CFGFLAG_INSENSITIVE, "Player feet color") - -MACRO_CONFIG_COL(ClPlayer7ColorMarking, player7_color_marking, 0xFF0000FF, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT7 | CFGFLAG_COLALPHA | CFGFLAG_INSENSITIVE, "Player marking color") -MACRO_CONFIG_COL(ClPlayer7ColorDecoration, player7_color_decoration, 0x1B6F74, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT7 | CFGFLAG_INSENSITIVE, "Player decoration color") -MACRO_CONFIG_COL(ClPlayer7ColorHands, player7_color_hands, 0x1B759E, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT7 | CFGFLAG_INSENSITIVE, "Player hands color") -MACRO_CONFIG_COL(ClPlayer7ColorEyes, player7_color_eyes, 0x0000FF, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT7 | CFGFLAG_INSENSITIVE, "Player eyes color") -MACRO_CONFIG_INT(ClPlayer7UseCustomColorBody, player7_use_custom_color_body, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Toggles usage of custom colors for body") -MACRO_CONFIG_INT(ClPlayer7UseCustomColorMarking, player7_use_custom_color_marking, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Toggles usage of custom colors for marking") -MACRO_CONFIG_INT(ClPlayer7UseCustomColorDecoration, player7_use_custom_color_decoration, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Toggles usage of custom colors for decoration") -MACRO_CONFIG_INT(ClPlayer7UseCustomColorHands, player7_use_custom_color_hands, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Toggles usage of custom colors for hands") -MACRO_CONFIG_INT(ClPlayer7UseCustomColorFeet, player7_use_custom_color_feet, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Toggles usage of custom colors for feet") -MACRO_CONFIG_INT(ClPlayer7UseCustomColorEyes, player7_use_custom_color_eyes, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Toggles usage of custom colors for eyes") -MACRO_CONFIG_STR(ClPlayer7Skin, player7_skin, protocol7::MAX_SKIN_ARRAY_SIZE, "default", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Player skin") -MACRO_CONFIG_STR(ClPlayer7SkinBody, player7_skin_body, protocol7::MAX_SKIN_ARRAY_SIZE, "standard", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Player skin body") -MACRO_CONFIG_STR(ClPlayer7SkinMarking, player7_skin_marking, protocol7::MAX_SKIN_ARRAY_SIZE, "", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Player skin marking") -MACRO_CONFIG_STR(ClPlayer7SkinDecoration, player7_skin_decoration, protocol7::MAX_SKIN_ARRAY_SIZE, "", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Player skin decoration") -MACRO_CONFIG_STR(ClPlayer7SkinHands, player7_skin_hands, protocol7::MAX_SKIN_ARRAY_SIZE, "standard", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Player skin hands") -MACRO_CONFIG_STR(ClPlayer7SkinFeet, player7_skin_feet, protocol7::MAX_SKIN_ARRAY_SIZE, "standard", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Player skin feet") -MACRO_CONFIG_STR(ClPlayer7SkinEyes, player7_skin_eyes, protocol7::MAX_SKIN_ARRAY_SIZE, "standard", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Player skin eyes") - -MACRO_CONFIG_COL(ClDummy7ColorBody, dummy7_color_body, 0x1B6F74, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT7 | CFGFLAG_INSENSITIVE, "Dummy body color") -MACRO_CONFIG_COL(ClDummy7ColorFeet, dummy7_color_feet, 0x1C873E, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT7 | CFGFLAG_INSENSITIVE, "Dummy feet color") - -MACRO_CONFIG_COL(ClDummy7ColorMarking, dummy7_color_marking, 0xFF0000FF, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT7 | CFGFLAG_COLALPHA | CFGFLAG_INSENSITIVE, "Dummy marking color") -MACRO_CONFIG_COL(ClDummy7ColorDecoration, dummy7_color_decoration, 0x1B6F74, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT7 | CFGFLAG_INSENSITIVE, "Dummy decoration color") -MACRO_CONFIG_COL(ClDummy7ColorHands, dummy7_color_hands, 0x1B759E, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT7 | CFGFLAG_INSENSITIVE, "Dummy hands color") -MACRO_CONFIG_COL(ClDummy7ColorEyes, dummy7_color_eyes, 0x0000FF, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT7 | CFGFLAG_INSENSITIVE, "Dummy eyes color") -MACRO_CONFIG_INT(ClDummy7UseCustomColorBody, dummy7_use_custom_color_body, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Toggles usage of custom colors for body") -MACRO_CONFIG_INT(ClDummy7UseCustomColorMarking, dummy7_use_custom_color_marking, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Toggles usage of custom colors for marking") -MACRO_CONFIG_INT(ClDummy7UseCustomColorDecoration, dummy7_use_custom_color_decoration, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Toggles usage of custom colors for decoration") -MACRO_CONFIG_INT(ClDummy7UseCustomColorHands, dummy7_use_custom_color_hands, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Toggles usage of custom colors for hands") -MACRO_CONFIG_INT(ClDummy7UseCustomColorFeet, dummy7_use_custom_color_feet, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Toggles usage of custom colors for feet") -MACRO_CONFIG_INT(ClDummy7UseCustomColorEyes, dummy7_use_custom_color_eyes, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Toggles usage of custom colors for eyes") -MACRO_CONFIG_STR(ClDummy7Skin, dummy7_skin, protocol7::MAX_SKIN_ARRAY_SIZE, "default", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Dummy skin") -MACRO_CONFIG_STR(ClDummy7SkinBody, dummy7_skin_body, protocol7::MAX_SKIN_ARRAY_SIZE, "standard", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Dummy skin body") -MACRO_CONFIG_STR(ClDummy7SkinMarking, dummy7_skin_marking, protocol7::MAX_SKIN_ARRAY_SIZE, "", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Dummy skin marking") -MACRO_CONFIG_STR(ClDummy7SkinDecoration, dummy7_skin_decoration, protocol7::MAX_SKIN_ARRAY_SIZE, "", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Dummy skin decoration") -MACRO_CONFIG_STR(ClDummy7SkinHands, dummy7_skin_hands, protocol7::MAX_SKIN_ARRAY_SIZE, "standard", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Dummy skin hands") -MACRO_CONFIG_STR(ClDummy7SkinFeet, dummy7_skin_feet, protocol7::MAX_SKIN_ARRAY_SIZE, "standard", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Dummy skin feet") -MACRO_CONFIG_STR(ClDummy7SkinEyes, dummy7_skin_eyes, protocol7::MAX_SKIN_ARRAY_SIZE, "standard", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Dummy skin eyes") - -MACRO_CONFIG_INT(UiPage, ui_page, 6, 6, 13, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Interface page") -MACRO_CONFIG_INT(UiSettingsPage, ui_settings_page, 0, 0, 9, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Interface settings page") -MACRO_CONFIG_INT(UiToolboxPage, ui_toolbox_page, 0, 0, 2, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Toolbox page") -MACRO_CONFIG_STR(UiServerAddress, ui_server_address, 1024, "localhost:8303", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Interface server address") -MACRO_CONFIG_INT(UiMousesens, ui_mousesens, 200, 1, 100000, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Mouse sensitivity for menus/editor") -MACRO_CONFIG_INT(UiControllerSens, ui_controller_sens, 100, 1, 100000, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Controller sensitivity for menus/editor") -MACRO_CONFIG_INT(UiSmoothScrollTime, ui_smooth_scroll_time, 500, 0, 5000, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Time of smooth scrolling animation in menus/editor in ms (0 for off)") - -MACRO_CONFIG_COL(UiColor, ui_color, 0xE4A046AF, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLALPHA, "Interface color") // 160 70 175 228 hasalpha - -MACRO_CONFIG_INT(UiColorizePing, ui_colorize_ping, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Highlight ping") -MACRO_CONFIG_INT(UiColorizeGametype, ui_colorize_gametype, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Highlight gametype") - -MACRO_CONFIG_INT(UiCloseWindowAfterChangingSetting, ui_close_window_after_changing_setting, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Close window after changing setting") -MACRO_CONFIG_INT(UiUnreadNews, ui_unread_news, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether there is unread news") - -MACRO_CONFIG_INT(GfxNoclip, gfx_noclip, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Disable clipping") - -// dummy -MACRO_CONFIG_STR(ClDummyName, dummy_name, 16, "", CFGFLAG_SAVE | CFGFLAG_CLIENT | CFGFLAG_INSENSITIVE, "Name of the dummy") -MACRO_CONFIG_STR(ClDummyClan, dummy_clan, 12, "", CFGFLAG_SAVE | CFGFLAG_CLIENT | CFGFLAG_INSENSITIVE, "Clan of the dummy") -MACRO_CONFIG_INT(ClDummyCountry, dummy_country, -1, -1, 1000, CFGFLAG_SAVE | CFGFLAG_CLIENT | CFGFLAG_INSENSITIVE, "Country of the Dummy") -MACRO_CONFIG_INT(ClDummyUseCustomColor, dummy_use_custom_color, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Toggles usage of custom colors") -MACRO_CONFIG_COL(ClDummyColorBody, dummy_color_body, 65408, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT | CFGFLAG_INSENSITIVE, "Dummy body color") -MACRO_CONFIG_COL(ClDummyColorFeet, dummy_color_feet, 65408, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT | CFGFLAG_INSENSITIVE, "Dummy feet color") -MACRO_CONFIG_STR(ClDummySkin, dummy_skin, 24, "default", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Dummy skin") -MACRO_CONFIG_INT(ClDummyDefaultEyes, dummy_default_eyes, 0, 0, 5, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Dummy eyes when joining server (0 = normal, 1 = pain, 2 = happy, 3 = surprise, 4 = angry, 5 = blink)") -MACRO_CONFIG_INT(ClDummy, cl_dummy, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_INSENSITIVE, "Whether you control your player (0) or your dummy (1)") -MACRO_CONFIG_INT(ClDummyHammer, cl_dummy_hammer, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_INSENSITIVE, "Whether dummy is hammering for a hammerfly") -MACRO_CONFIG_INT(ClDummyResetOnSwitch, cl_dummy_resetonswitch, 0, 0, 2, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Whether dummy or player should stop pressing keys when you switch (0 = off, 1 = dummy, 2 = player)") -MACRO_CONFIG_INT(ClDummyRestoreWeapon, cl_dummy_restore_weapon, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Whether dummy should switch to last weapon after hammerfly") -MACRO_CONFIG_INT(ClDummyCopyMoves, cl_dummy_copy_moves, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_INSENSITIVE, "Whether dummy should copy your moves") - -// more controllable dummy command -MACRO_CONFIG_INT(ClDummyControl, cl_dummy_control, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_INSENSITIVE, "Whether you can control dummy at the same time (cl_dummy_jump, cl_dummy_fire, cl_dummy_hook)") -MACRO_CONFIG_INT(ClDummyJump, cl_dummy_jump, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_INSENSITIVE, "Whether dummy is jumping (requires cl_dummy_control 1)") -MACRO_CONFIG_INT(ClDummyFire, cl_dummy_fire, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_INSENSITIVE, "Whether dummy is firing (requires cl_dummy_control 1)") -MACRO_CONFIG_INT(ClDummyHook, cl_dummy_hook, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_INSENSITIVE, "Whether dummy is hooking (requires cl_dummy_control 1)") - -// start menu -MACRO_CONFIG_INT(ClShowStartMenuImages, cl_show_start_menu_images, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show start menu images") -MACRO_CONFIG_INT(ClSkipStartMenu, cl_skip_start_menu, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Skip the start menu") - // server MACRO_CONFIG_INT(SvWarmup, sv_warmup, 0, 0, 0, CFGFLAG_SERVER, "Number of seconds to do warmup before round starts") MACRO_CONFIG_STR(SvMotd, sv_motd, 900, "", CFGFLAG_SERVER, "Message of the day to display for the clients") @@ -272,29 +46,13 @@ MACRO_CONFIG_INT(SvRescue, sv_rescue, 0, 0, 1, CFGFLAG_SERVER, "Allow /rescue co MACRO_CONFIG_INT(SvRescueDelay, sv_rescue_delay, 1, 0, 1000, CFGFLAG_SERVER, "Number of seconds between two rescues") MACRO_CONFIG_INT(SvPractice, sv_practice, 1, 0, 1, CFGFLAG_SERVER, "Enable practice mode for teams. Means you can use /rescue, but in turn your rank doesn't count.") -MACRO_CONFIG_INT(ClVideoPauseWithDemo, cl_video_pausewithdemo, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Pause video rendering when demo playing pause") -MACRO_CONFIG_INT(ClVideoShowhud, cl_video_showhud, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame HUD when rendering video") -MACRO_CONFIG_INT(ClVideoShowChat, cl_video_showchat, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show chat when rendering video") -MACRO_CONFIG_INT(ClVideoSndEnable, cl_video_sound_enable, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Use sound when rendering video") -MACRO_CONFIG_INT(ClVideoShowHookCollOther, cl_video_show_hook_coll_other, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show other players' hook collision lines when rendering video") -MACRO_CONFIG_INT(ClVideoShowDirection, cl_video_show_direction, 0, 0, 3, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show players' key presses when rendering video (1 = other players', 2 = also your own, 3 = only your own)") -MACRO_CONFIG_INT(ClVideoX264Crf, cl_video_crf, 18, 0, 51, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Set crf when encode video with libx264 (0 for highest quality, 51 for lowest)") -MACRO_CONFIG_INT(ClVideoX264Preset, cl_video_preset, 5, 0, 9, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Set preset when encode video with libx264, default is 5 (medium), 0 is ultrafast, 9 is placebo (the slowest, not recommend)") - // debug #ifdef CONF_DEBUG MACRO_CONFIG_INT(DbgDummies, dbg_dummies, 0, 0, MAX_CLIENTS, CFGFLAG_SERVER, "Add debug dummies to server (Debug build only)") #endif -MACRO_CONFIG_INT(DbgTuning, dbg_tuning, 0, 0, 2, CFGFLAG_CLIENT, "Display information about the tuning parameters that affect the own player (0 = off, 1 = show changed, 2 = show all)") - -MACRO_CONFIG_STR(PlayerName, player_name, 16, "", CFGFLAG_SAVE | CFGFLAG_CLIENT | CFGFLAG_INSENSITIVE, "Name of the player") -MACRO_CONFIG_STR(PlayerClan, player_clan, 12, "", CFGFLAG_SAVE | CFGFLAG_CLIENT | CFGFLAG_INSENSITIVE, "Clan of the player") -MACRO_CONFIG_INT(PlayerCountry, player_country, -1, -1, 1000, CFGFLAG_SAVE | CFGFLAG_CLIENT | CFGFLAG_INSENSITIVE, "Country of the player") - MACRO_CONFIG_STR(Password, password, 256, "", CFGFLAG_CLIENT | CFGFLAG_SERVER | CFGFLAG_NONTEEHISTORIC, "Password to the server") MACRO_CONFIG_INT(Events, events, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT | CFGFLAG_SERVER, "Enable triggering of events, (eye emotes on some holidays in server, christmas skins in client).") -MACRO_CONFIG_STR(SteamName, steam_name, 16, "", CFGFLAG_SAVE | CFGFLAG_CLIENT, "Last seen name of the Steam profile") MACRO_CONFIG_STR(Logfile, logfile, 128, "", CFGFLAG_SAVE | CFGFLAG_CLIENT | CFGFLAG_SERVER, "Filename to log all output to") MACRO_CONFIG_INT(Logappend, logappend, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT | CFGFLAG_SERVER, "Append to logfile instead of overwriting it every time") @@ -303,132 +61,6 @@ MACRO_CONFIG_INT(StdoutOutputLevel, stdout_output_level, 0, -3, 2, CFGFLAG_SAVE MACRO_CONFIG_INT(ConsoleOutputLevel, console_output_level, 0, -3, 2, CFGFLAG_SAVE | CFGFLAG_CLIENT | CFGFLAG_SERVER, "Adjusts the amount of information in the local/remote console (-3 = none, -2 = error only, -1 = warn, 0 = info, 1 = debug, 2 = trace)") MACRO_CONFIG_INT(ConsoleEnableColors, console_enable_colors, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT | CFGFLAG_SERVER, "Enable colors in console output") -MACRO_CONFIG_INT(ClSaveSettings, cl_save_settings, 1, 0, 1, CFGFLAG_CLIENT, "Write the settings file on exit") -MACRO_CONFIG_INT(ClRefreshRate, cl_refresh_rate, 0, 0, 10000, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Refresh rate for updating the game (in Hz)") -MACRO_CONFIG_INT(ClRefreshRateInactive, cl_refresh_rate_inactive, 120, 0, 10000, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Refresh rate for updating the game when the window is inactive (in Hz)") -MACRO_CONFIG_INT(ClEditor, cl_editor, 0, 0, 1, CFGFLAG_CLIENT, "Open the map editor") -MACRO_CONFIG_INT(ClEditorDilate, cl_editor_dilate, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Automatically dilates embedded images") -MACRO_CONFIG_STR(ClSkinFilterString, cl_skin_filter_string, 25, "", CFGFLAG_SAVE | CFGFLAG_CLIENT, "Skin filtering string") -MACRO_CONFIG_INT(ClEditorMaxHistory, cl_editor_max_history, 50, 1, 500, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Maximum number of undo actions in the editor history (not shared between editor, envelope editor and server settings editor)") - -MACRO_CONFIG_INT(ClAutoDemoRecord, cl_auto_demo_record, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Automatically record demos") -MACRO_CONFIG_INT(ClAutoDemoOnConnect, cl_auto_demo_on_connect, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Only start a new demo when connect while automatically record demos") -MACRO_CONFIG_INT(ClAutoDemoMax, cl_auto_demo_max, 10, 0, 1000, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Maximum number of automatically recorded demos (0 = no limit)") -MACRO_CONFIG_INT(ClAutoScreenshot, cl_auto_screenshot, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Automatically take game over screenshot") -MACRO_CONFIG_INT(ClAutoScreenshotMax, cl_auto_screenshot_max, 10, 0, 1000, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Maximum number of automatically created screenshots (0 = no limit)") -MACRO_CONFIG_INT(ClAutoCSV, cl_auto_csv, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Automatically create game over csv") -MACRO_CONFIG_INT(ClAutoCSVMax, cl_auto_csv_max, 10, 0, 1000, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Maximum number of automatically created csvs (0 = no limit)") -MACRO_CONFIG_INT(ClShowBroadcasts, cl_show_broadcasts, 1, 0, 1, CFGFLAG_CLIENT, "Show broadcasts ingame") -MACRO_CONFIG_INT(ClPrintBroadcasts, cl_print_broadcasts, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Print broadcasts to console") -MACRO_CONFIG_INT(ClPrintMotd, cl_print_motd, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Print motd to console") -MACRO_CONFIG_INT(ClFriendsIgnoreClan, cl_friends_ignore_clan, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Ignore clan tag when searching for friends") - -MACRO_CONFIG_STR(ClAssetsEntities, cl_assets_entities, 50, "default", CFGFLAG_SAVE | CFGFLAG_CLIENT, "The asset/assets for entities") -MACRO_CONFIG_STR(ClAssetGame, cl_asset_game, 50, "default", CFGFLAG_SAVE | CFGFLAG_CLIENT, "The asset for game") -MACRO_CONFIG_STR(ClAssetEmoticons, cl_asset_emoticons, 50, "default", CFGFLAG_SAVE | CFGFLAG_CLIENT, "The asset for emoticons") -MACRO_CONFIG_STR(ClAssetParticles, cl_asset_particles, 50, "default", CFGFLAG_SAVE | CFGFLAG_CLIENT, "The asset for particles") -MACRO_CONFIG_STR(ClAssetHud, cl_asset_hud, 50, "default", CFGFLAG_SAVE | CFGFLAG_CLIENT, "The asset for HUD") -MACRO_CONFIG_STR(ClAssetExtras, cl_asset_extras, 50, "default", CFGFLAG_SAVE | CFGFLAG_CLIENT, "The asset for the game graphics that do not come from Teeworlds") - -MACRO_CONFIG_STR(BrFilterString, br_filter_string, 128, "Novice", CFGFLAG_SAVE | CFGFLAG_CLIENT, "Server browser filtering string") -MACRO_CONFIG_STR(BrExcludeString, br_exclude_string, 128, "", CFGFLAG_SAVE | CFGFLAG_CLIENT, "Server browser exclusion string") -MACRO_CONFIG_INT(BrFilterFull, br_filter_full, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Filter out full server in browser") -MACRO_CONFIG_INT(BrFilterEmpty, br_filter_empty, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Filter out empty server in browser") -MACRO_CONFIG_INT(BrFilterSpectators, br_filter_spectators, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Filter out spectators from player numbers") -MACRO_CONFIG_INT(BrFilterFriends, br_filter_friends, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Filter out servers with no friends") -MACRO_CONFIG_INT(BrFilterCountry, br_filter_country, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Filter out servers with non-matching player country") -MACRO_CONFIG_INT(BrFilterCountryIndex, br_filter_country_index, -1, -1, 999, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Player country to filter by in the server browser") -MACRO_CONFIG_INT(BrFilterPw, br_filter_pw, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Filter out password protected servers in browser") -MACRO_CONFIG_STR(BrFilterGametype, br_filter_gametype, 128, "", CFGFLAG_SAVE | CFGFLAG_CLIENT, "Game types to filter") -MACRO_CONFIG_INT(BrFilterGametypeStrict, br_filter_gametype_strict, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Strict gametype filter") -MACRO_CONFIG_INT(BrFilterConnectingPlayers, br_filter_connecting_players, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Filter connecting players") -MACRO_CONFIG_STR(BrFilterServerAddress, br_filter_serveraddress, 128, "", CFGFLAG_SAVE | CFGFLAG_CLIENT, "Server address to filter") -MACRO_CONFIG_INT(BrFilterUnfinishedMap, br_filter_unfinished_map, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Show only servers with unfinished maps") -MACRO_CONFIG_INT(BrFilterLogin, br_filter_login, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Filter out servers that require login") - -MACRO_CONFIG_INT(BrIndicateFinished, br_indicate_finished, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Show whether you have finished a DDNet map (transmits your player name to info.ddnet.org/info)") -MACRO_CONFIG_STR(BrLocation, br_location, 16, "auto", CFGFLAG_SAVE | CFGFLAG_CLIENT, "Override location for ping estimation, available: auto, af, as, as:cn, eu, na, oc, sa (Automatic, Africa, Asia, China, Europe, North America, Oceania/Australia, South America") -MACRO_CONFIG_STR(BrCachedBestServerinfoUrl, br_cached_best_serverinfo_url, 256, "", CFGFLAG_SAVE | CFGFLAG_CLIENT, "Do not set this variable, instead create a ddnet-serverlist-urls.cfg next to settings_ddnet.cfg to specify all possible serverlist URLs") - -MACRO_CONFIG_INT(BrSort, br_sort, 4, 0, 256, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Sorting column in server browser") -MACRO_CONFIG_INT(BrSortOrder, br_sort_order, 2, 0, 2, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Sorting order in server browser") -MACRO_CONFIG_INT(BrMaxRequests, br_max_requests, 100, 0, 1000, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Number of concurrent requests to use when refreshing server browser") - -MACRO_CONFIG_INT(BrDemoSort, br_demo_sort, 0, 0, 2, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Sorting column in demo browser") -MACRO_CONFIG_INT(BrDemoSortOrder, br_demo_sort_order, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Sorting order in demo browser") -MACRO_CONFIG_INT(BrDemoFetchInfo, br_demo_fetch_info, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Whether to auto fetch demo infos on refresh") - -MACRO_CONFIG_INT(GhSort, gh_sort, 1, 0, 2, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Sorting column in ghost list") -MACRO_CONFIG_INT(GhSortOrder, gh_sort_order, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Sorting order in ghost list") - -MACRO_CONFIG_INT(SndBufferSize, snd_buffer_size, 512, 128, 32768, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Sound buffer size (may cause delay if large)") -MACRO_CONFIG_INT(SndRate, snd_rate, 48000, 5512, 384000, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Sound mixing rate") -MACRO_CONFIG_INT(SndEnable, snd_enable, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Sound enable") -MACRO_CONFIG_INT(SndMusic, snd_enable_music, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Play background music") -MACRO_CONFIG_INT(SndVolume, snd_volume, 30, 0, 100, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Sound volume") -MACRO_CONFIG_INT(SndChatSoundVolume, snd_chat_volume, 30, 0, 100, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Chat sound volume") -MACRO_CONFIG_INT(SndGameSoundVolume, snd_game_volume, 30, 0, 100, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Game sound volume") -MACRO_CONFIG_INT(SndMapSoundVolume, snd_ambient_volume, 30, 0, 100, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Map Sound sound volume") -MACRO_CONFIG_INT(SndBackgroundMusicVolume, snd_background_music_volume, 30, 0, 100, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Background music sound volume") - -MACRO_CONFIG_INT(SndNonactiveMute, snd_nonactive_mute, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Mute sounds when window is not active") -MACRO_CONFIG_INT(SndGame, snd_game, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Enable game sounds") -MACRO_CONFIG_INT(SndGun, snd_gun, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Enable gun sound") -MACRO_CONFIG_INT(SndLongPain, snd_long_pain, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Enable long pain sound (used when shooting in freeze)") -MACRO_CONFIG_INT(SndChat, snd_chat, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Enable regular chat sound") -MACRO_CONFIG_INT(SndTeamChat, snd_team_chat, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Enable team chat sound") -MACRO_CONFIG_INT(SndServerMessage, snd_servermessage, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Enable server message sound") -MACRO_CONFIG_INT(SndHighlight, snd_highlight, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Enable highlighted chat sound") - -MACRO_CONFIG_INT(GfxScreen, gfx_screen, 0, 0, 15, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Screen index") -MACRO_CONFIG_INT(GfxScreenWidth, gfx_screen_width, 0, 0, 0, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Screen resolution width") -MACRO_CONFIG_INT(GfxScreenHeight, gfx_screen_height, 0, 0, 0, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Screen resolution height") -MACRO_CONFIG_INT(GfxScreenRefreshRate, gfx_screen_refresh_rate, 0, 0, 0, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Screen refresh rate") - -MACRO_CONFIG_INT(GfxDesktopWidth, gfx_desktop_width, 0, 0, 0, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Desktop resolution width for detecting display changes (not recommended to change manually)") -MACRO_CONFIG_INT(GfxDesktopHeight, gfx_desktop_height, 0, 0, 0, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Desktop resolution height for detecting display changes (not recommended to change manually)") -#if !defined(CONF_PLATFORM_MACOS) -MACRO_CONFIG_INT(GfxBorderless, gfx_borderless, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Borderless window (not to be used with fullscreen)") -#if !defined(CONF_WEBASM) -MACRO_CONFIG_INT(GfxFullscreen, gfx_fullscreen, 1, 0, 3, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Set fullscreen mode: 0=no fullscreen, 1=pure fullscreen, 2=desktop fullscreen, 3=windowed fullscreen") -#else -MACRO_CONFIG_INT(GfxFullscreen, gfx_fullscreen, 0, 0, 3, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Set fullscreen mode: 0=no fullscreen, 1=pure fullscreen, 2=desktop fullscreen, 3=windowed fullscreen") -#endif -#else -MACRO_CONFIG_INT(GfxBorderless, gfx_borderless, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Borderless window (not to be used with fullscreen)") -MACRO_CONFIG_INT(GfxFullscreen, gfx_fullscreen, 0, 0, 3, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Set fullscreen mode: 0=no fullscreen, 1=pure fullscreen, 2=desktop fullscreen, 3=windowed fullscreen") -#endif -MACRO_CONFIG_INT(GfxHighdpi, gfx_highdpi, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Enable high-dpi") -MACRO_CONFIG_INT(GfxColorDepth, gfx_color_depth, 24, 16, 24, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Colors bits for framebuffer (fullscreen only)") -MACRO_CONFIG_INT(GfxVsync, gfx_vsync, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Vertical sync (may cause delay)") -MACRO_CONFIG_INT(GfxDisplayAllVideoModes, gfx_display_all_video_modes, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Show all video modes") -MACRO_CONFIG_INT(GfxHighDetail, gfx_high_detail, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "High detail") -MACRO_CONFIG_INT(GfxFsaaSamples, gfx_fsaa_samples, 0, 0, 64, CFGFLAG_SAVE | CFGFLAG_CLIENT, "FSAA samples (may cause delay)") -MACRO_CONFIG_INT(GfxRefreshRate, gfx_refresh_rate, 0, 0, 10000, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Screen refresh rate") -MACRO_CONFIG_INT(GfxBackgroundRender, gfx_backgroundrender, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Render graphics when window is in background") -MACRO_CONFIG_INT(GfxTextOverlay, gfx_text_overlay, 10, 1, 100, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Stop rendering textoverlay in editor or with entities: high value = less details = more speed") -MACRO_CONFIG_INT(GfxAsyncRenderOld, gfx_asyncrender_old, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "During an update cycle, skip the render cycle, if the render cycle would need to wait for the previous render cycle to finish") -MACRO_CONFIG_INT(GfxQuadAsTriangle, gfx_quad_as_triangle, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Render quads as triangles (fixes quad coloring on some GPUs)") - -MACRO_CONFIG_INT(InpMousesens, inp_mousesens, 200, 1, 100000, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Mouse sensitivity") -MACRO_CONFIG_INT(InpTranslatedKeys, inp_translated_keys, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Translate keys before interpreting them, respects keyboard layouts") -MACRO_CONFIG_INT(InpIgnoredModifiers, inp_ignored_modifiers, 0, 0, 65536, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Ignored keyboard modifier mask") -#if defined(CONF_FAMILY_WINDOWS) -MACRO_CONFIG_INT(InpImeNativeUi, inp_ime_native_ui, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Use native UI for IME (may cause IME to not work in fullscreen mode) (changing requires restart)") -#endif - -MACRO_CONFIG_INT(InpControllerEnable, inp_controller_enable, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Enable controller") -MACRO_CONFIG_STR(InpControllerGUID, inp_controller_guid, 34, "", CFGFLAG_SAVE | CFGFLAG_CLIENT, "Controller GUID which uniquely identifies the active controller") -MACRO_CONFIG_INT(InpControllerAbsolute, inp_controller_absolute, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Enable absolute controller aiming ingame") -MACRO_CONFIG_INT(InpControllerSens, inp_controller_sens, 100, 1, 100000, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Ingame controller sensitivity") -MACRO_CONFIG_INT(InpControllerX, inp_controller_x, 0, 0, 12, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Controller axis that controls X axis of cursor") -MACRO_CONFIG_INT(InpControllerY, inp_controller_y, 1, 0, 12, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Controller axis that controls Y axis of cursor") -MACRO_CONFIG_INT(InpControllerTolerance, inp_controller_tolerance, 5, 0, 50, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Controller axis tolerance to account for jitter") - -MACRO_CONFIG_INT(ClPort, cl_port, 0, 0, 65535, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Port to use for client connections to server (0 to choose a random port, 1024 or higher to set a manual port, requires a restart)") -MACRO_CONFIG_INT(ClDummyPort, cl_dummy_port, 0, 0, 65535, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Port to use for dummy connections to server (0 to choose a random port, 1024 or higher to set a manual port, requires a restart)") -MACRO_CONFIG_INT(ClContactPort, cl_contact_port, 0, 0, 65535, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Port to use for serverinfo connections to server (0 to choose a random port, 1024 or higher to set a manual port, requires a restart)") - MACRO_CONFIG_STR(SvName, sv_name, 128, "unnamed server", CFGFLAG_SERVER, "Server name") MACRO_CONFIG_STR(Bindaddr, bindaddr, 128, "", CFGFLAG_CLIENT | CFGFLAG_SERVER | CFGFLAG_MASTER, "Address to bind the client/server to") MACRO_CONFIG_INT(SvIpv4Only, sv_ipv4only, 0, 0, 1, CFGFLAG_SERVER, "Whether to bind only to ipv4, otherwise bind to all available interfaces") @@ -477,12 +109,6 @@ MACRO_CONFIG_INT(EcOutputLevel, ec_output_level, 0, -3, 2, CFGFLAG_ECON, "Adjust MACRO_CONFIG_INT(Debug, debug, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SERVER, "Debug mode") MACRO_CONFIG_INT(DbgSql, dbg_sql, 1, 0, 1, CFGFLAG_SERVER, "Debug SQL") MACRO_CONFIG_INT(DbgCurl, dbg_curl, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SERVER, "Debug curl") -MACRO_CONFIG_INT(DbgGraphs, dbg_graphs, 0, 0, 1, CFGFLAG_CLIENT, "Performance graphs") -MACRO_CONFIG_INT(DbgGfx, dbg_gfx, 0, 0, 4, CFGFLAG_CLIENT, "Show graphic library warnings and errors, if the GPU supports it (0: none, 1: minimal, 2: affects performance, 3: verbose, 4: all)") -#ifdef CONF_DEBUG -MACRO_CONFIG_INT(DbgStress, dbg_stress, 0, 0, 1, CFGFLAG_CLIENT, "Stress systems (Debug build only)") -MACRO_CONFIG_STR(DbgStressServer, dbg_stress_server, 32, "localhost", CFGFLAG_CLIENT, "Server to stress (Debug build only)") -#endif MACRO_CONFIG_INT(HttpAllowInsecure, http_allow_insecure, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SERVER, "Allow insecure HTTP protocol in addition to the secure HTTPS one. Mostly useful for testing.") @@ -495,7 +121,7 @@ MACRO_CONFIG_INT(SvHit, sv_hit, 1, 0, 1, CFGFLAG_SERVER | CFGFLAG_GAME, "Whether MACRO_CONFIG_INT(SvEndlessDrag, sv_endless_drag, 0, 0, 1, CFGFLAG_SERVER | CFGFLAG_GAME, "Turns endless hooking on/off") MACRO_CONFIG_INT(SvTestingCommands, sv_test_cmds, 0, 0, 1, CFGFLAG_SERVER, "Turns testing commands aka cheats on/off (setting only works in initial config)") MACRO_CONFIG_INT(SvFreezeDelay, sv_freeze_delay, 3, 1, 30, CFGFLAG_SERVER | CFGFLAG_GAME, "How many seconds the players will remain frozen (applies to all except delayed freeze in switch layer & deepfreeze)") -MACRO_CONFIG_INT(ClDDRaceBindsSet, cl_race_binds_set, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "What level the DDRace binds are set to (this is automated, you don't need to use this)") + MACRO_CONFIG_INT(SvEndlessSuperHook, sv_endless_super_hook, 0, 0, 1, CFGFLAG_SERVER, "Endless hook for super players on/off") MACRO_CONFIG_INT(SvHideScore, sv_hide_score, 0, 0, 1, CFGFLAG_SERVER, "Whether players scores will be announced or not") MACRO_CONFIG_INT(SvSaveWorseScores, sv_save_worse_scores, 1, 0, 1, CFGFLAG_SERVER | CFGFLAG_GAME, "Whether to save worse scores when you already have a better one") @@ -573,62 +199,13 @@ MACRO_CONFIG_INT(SvRejoinTeam0, sv_rejoin_team_0, 1, 0, 1, CFGFLAG_SERVER, "Make MACRO_CONFIG_INT(SvNoWeakHook, sv_no_weak_hook, 0, 0, 1, CFGFLAG_SERVER | CFGFLAG_GAME, "Whether to use an alternative calculation for world ticks, that makes the hook behave like all players have strong.") -MACRO_CONFIG_INT(ClReconnectTimeout, cl_reconnect_timeout, 120, 0, 600, CFGFLAG_CLIENT | CFGFLAG_SAVE, "How many seconds to wait before reconnecting (after timeout, 0 for off)") -MACRO_CONFIG_INT(ClReconnectFull, cl_reconnect_full, 5, 0, 600, CFGFLAG_CLIENT | CFGFLAG_SAVE, "How many seconds to wait before reconnecting (when server is full, 0 for off)") - -MACRO_CONFIG_COL(ClMessageSystemColor, cl_message_system_color, 2817983, CFGFLAG_CLIENT | CFGFLAG_SAVE, "System message color") -MACRO_CONFIG_COL(ClMessageClientColor, cl_message_client_color, 9633471, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Client message color") -MACRO_CONFIG_COL(ClMessageHighlightColor, cl_message_highlight_color, 65471, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Highlighted message color") -MACRO_CONFIG_COL(ClMessageTeamColor, cl_message_team_color, 5636050, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Team message color") -MACRO_CONFIG_COL(ClMessageColor, cl_message_color, 255, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Message color") -MACRO_CONFIG_COL(ClLaserRifleInnerColor, cl_laser_rifle_inner_color, 11206591, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Laser inner color for Rifle") -MACRO_CONFIG_COL(ClLaserRifleOutlineColor, cl_laser_rifle_outline_color, 11176233, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Laser outline color for Rifle") -MACRO_CONFIG_COL(ClLaserShotgunInnerColor, cl_laser_sg_inner_color, 1467241, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Laser inner color for Shotgun") -MACRO_CONFIG_COL(ClLaserShotgunOutlineColor, cl_laser_sg_outline_color, 1866773, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Laser outline color for Shotgun") -MACRO_CONFIG_COL(ClLaserDoorInnerColor, cl_laser_door_inner_color, 7701379, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Laser inner color for doors") -MACRO_CONFIG_COL(ClLaserDoorOutlineColor, cl_laser_door_outline_color, 7667473, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Laser outline color for doors") -MACRO_CONFIG_COL(ClLaserFreezeInnerColor, cl_laser_freeze_inner_color, 12001153, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Laser inner color for freezes") -MACRO_CONFIG_COL(ClLaserFreezeOutlineColor, cl_laser_freeze_outline_color, 11613223, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Laser outline color for freezes") -MACRO_CONFIG_COL(ClKillMessageNormalColor, cl_kill_message_normal_color, 255, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLALPHA, "Kill message normal color") -MACRO_CONFIG_COL(ClKillMessageHighlightColor, cl_kill_message_highlight_color, 255, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLALPHA, "Kill message highlight color") - -MACRO_CONFIG_INT(ClMessageFriend, cl_message_friend, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Enable coloring and the heart for friends") -MACRO_CONFIG_COL(ClMessageFriendColor, cl_message_friend_color, 65425, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Friend message color") - MACRO_CONFIG_INT(ConnTimeout, conn_timeout, 100, 5, 1000, CFGFLAG_SAVE | CFGFLAG_CLIENT | CFGFLAG_SERVER, "Network timeout") MACRO_CONFIG_INT(ConnTimeoutProtection, conn_timeout_protection, 1000, 5, 10000, CFGFLAG_SERVER, "Network timeout protection") -MACRO_CONFIG_INT(ClShowIds, cl_show_ids, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Whether to show client IDs in scoreboard, chat and spectator menu") -MACRO_CONFIG_INT(ClScoreboardOnDeath, cl_scoreboard_on_death, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Whether to show scoreboard after death or not") -MACRO_CONFIG_INT(ClAutoRaceRecord, cl_auto_race_record, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Save the best demo of each race") -MACRO_CONFIG_INT(ClReplays, cl_replays, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Enable/disable replays") -MACRO_CONFIG_INT(ClReplayLength, cl_replay_length, 30, 10, 0, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Set the default length of the replays") -MACRO_CONFIG_INT(ClRaceRecordServerControl, cl_race_record_server_control, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Let the server start the race recorder") -MACRO_CONFIG_INT(ClDemoName, cl_demo_name, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Save the player name within the demo") -MACRO_CONFIG_INT(ClRaceGhost, cl_race_ghost, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Enable ghost") -MACRO_CONFIG_INT(ClRaceGhostServerControl, cl_race_ghost_server_control, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Let the server start the ghost") -MACRO_CONFIG_INT(ClRaceShowGhost, cl_race_show_ghost, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ghost") -MACRO_CONFIG_INT(ClRaceSaveGhost, cl_race_save_ghost, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Save ghost") -MACRO_CONFIG_INT(ClRaceGhostStrictMap, cl_race_ghost_strict_map, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Match ghosts by map version instead of only map name") -MACRO_CONFIG_INT(ClRaceGhostSaveBest, cl_race_ghost_save_best, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Save only ghosts that are better than the previous record.") -MACRO_CONFIG_INT(ClRaceGhostAlpha, cl_race_ghost_alpha, 40, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Visbility of ghosts (alpha value, 0 invisible, 100 fully visible)") MACRO_CONFIG_INT(SvResetPickups, sv_reset_pickups, 0, 0, 1, CFGFLAG_SERVER | CFGFLAG_GAME, "Whether the weapons are reset on passing the start tile or not") -MACRO_CONFIG_INT(ClShowOthers, cl_show_others, 0, 0, 2, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show players in other teams (2 to show own team only)") -MACRO_CONFIG_INT(ClShowOthersAlpha, cl_show_others_alpha, 40, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show players in other teams (alpha value, 0 invisible, 100 fully visible)") -MACRO_CONFIG_INT(ClOverlayEntities, cl_overlay_entities, 0, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Overlay game tiles with a percentage of opacity") -MACRO_CONFIG_INT(ClShowQuads, cl_showquads, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show quads (only interesting for mappers, or if your system has extremely bad performance)") -MACRO_CONFIG_COL(ClBackgroundColor, cl_background_color, 128, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Background color") // 0 0 128 -MACRO_CONFIG_COL(ClBackgroundEntitiesColor, cl_background_entities_color, 128, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Background (entities) color") // 0 0 128 -MACRO_CONFIG_STR(ClBackgroundEntities, cl_background_entities, IO_MAX_PATH_LENGTH, "", CFGFLAG_CLIENT | CFGFLAG_SAVE, "Background (entities)") -MACRO_CONFIG_STR(ClRunOnJoin, cl_run_on_join, 100, "", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Command to run when joining a server") // menu background map -MACRO_CONFIG_STR(ClMenuMap, cl_menu_map, 100, "auto", CFGFLAG_CLIENT | CFGFLAG_SAVE, "Background map in the menu") -MACRO_CONFIG_INT(ClRotationRadius, cl_rotation_radius, 30, 1, 500, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Menu camera rotation radius") -MACRO_CONFIG_INT(ClRotationSpeed, cl_rotation_speed, 40, 1, 120, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Menu camera rotations in seconds") -MACRO_CONFIG_INT(ClCameraSpeed, cl_camera_speed, 5, 1, 40, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Menu camera speed") -MACRO_CONFIG_INT(ClBackgroundShowTilesLayers, cl_background_show_tiles_layers, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether draw tiles layers when using custom background (entities)") MACRO_CONFIG_INT(SvShowOthers, sv_show_others, 1, 0, 1, CFGFLAG_SERVER, "Whether players can use the command showothers or not") MACRO_CONFIG_INT(SvShowOthersDefault, sv_show_others_default, 0, 0, 2, CFGFLAG_SERVER | CFGFLAG_GAME, "Whether players see others by default (2 for own team)") MACRO_CONFIG_INT(SvShowAllDefault, sv_show_all_default, 0, 0, 1, CFGFLAG_SERVER, "Whether players see all tees by default") @@ -671,80 +248,3 @@ MACRO_CONFIG_INT(SvConnlimitTime, sv_connlimit_time, 20, 0, 1000, CFGFLAG_SERVER #if defined(CONF_FAMILY_UNIX) MACRO_CONFIG_STR(SvConnLoggingServer, sv_conn_logging_server, 128, "", CFGFLAG_SERVER, "Unix socket server for IP address logging (Unix only)") #endif - -MACRO_CONFIG_INT(ClUnpredictedShadow, cl_unpredicted_shadow, 0, -1, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show unpredicted shadow tee (0 = off, 1 = on, -1 = don't even show in debug mode)") -MACRO_CONFIG_INT(ClPredictFreeze, cl_predict_freeze, 1, 0, 2, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Predict freeze tiles (0 = off, 1 = on, 2 = partial (allow a small amount of movement in freeze)") -MACRO_CONFIG_INT(ClShowNinja, cl_show_ninja, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ninja skin") -MACRO_CONFIG_INT(ClShowHookCollOther, cl_show_hook_coll_other, 1, 0, 2, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show other players' hook collision line (2 to always show)") -MACRO_CONFIG_INT(ClShowHookCollOwn, cl_show_hook_coll_own, 1, 0, 2, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show own players' hook collision line (2 to always show)") -MACRO_CONFIG_INT(ClHookCollSize, cl_hook_coll_size, 0, 0, 20, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Width of your own hook collision line") -MACRO_CONFIG_INT(ClHookCollSizeOther, cl_hook_coll_size_other, 0, 0, 20, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Width of others' hook collision line") -MACRO_CONFIG_INT(ClHookCollAlpha, cl_hook_coll_alpha, 100, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Alpha of hook collision line (0 invisible, 100 fully visible)") - -MACRO_CONFIG_COL(ClHookCollColorNoColl, cl_hook_coll_color_no_coll, 65407, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Specifies the color of a hookline that hits nothing.") -MACRO_CONFIG_COL(ClHookCollColorHookableColl, cl_hook_coll_color_hookable_coll, 6401973, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Specifies the color of a hookline that hits hookable tiles.") -MACRO_CONFIG_COL(ClHookCollColorTeeColl, cl_hook_coll_color_tee_coll, 2817919, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Specifies the color of a hookline that hits tees.") - -MACRO_CONFIG_INT(ClChatTeamColors, cl_chat_teamcolors, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show names in chat in team colors") -MACRO_CONFIG_INT(ClChatReset, cl_chat_reset, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Reset chat when pressing escape") -MACRO_CONFIG_INT(ClChatOld, cl_chat_old, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Old chat style: No tee, no background") -MACRO_CONFIG_INT(ClChatFontSize, cl_chat_size, 60, 10, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Chat font size") -MACRO_CONFIG_INT(ClChatWidth, cl_chat_width, 200, 140, 400, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Chat width") - -MACRO_CONFIG_INT(ClShowDirection, cl_show_direction, 1, 0, 3, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Show key presses (1 = other players', 2 = everyone, 3 = only your own") -MACRO_CONFIG_INT(ClDirectionSize, cl_direction_size, 30, -50, 100, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Size of key press icons") -MACRO_CONFIG_INT(ClOldGunPosition, cl_old_gun_position, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Tees hold gun a bit higher like in TW 0.6.1 and older") -MACRO_CONFIG_INT(ClConfirmDisconnectTime, cl_confirm_disconnect_time, 20, -1, 1440, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Confirmation popup before disconnecting after game time (in minutes, -1 to turn off, 0 to always turn on)") -MACRO_CONFIG_INT(ClConfirmQuitTime, cl_confirm_quit_time, 20, -1, 1440, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Confirmation popup before quitting after game time (in minutes, -1 to turn off, 0 to always turn on)") -MACRO_CONFIG_STR(ClTimeoutCode, cl_timeout_code, 64, "", CFGFLAG_SAVE | CFGFLAG_CLIENT, "Timeout code to use") -MACRO_CONFIG_STR(ClDummyTimeoutCode, cl_dummy_timeout_code, 64, "", CFGFLAG_SAVE | CFGFLAG_CLIENT, "Dummy Timeout code to use") -MACRO_CONFIG_STR(ClTimeoutSeed, cl_timeout_seed, 64, "", CFGFLAG_SAVE | CFGFLAG_CLIENT, "Timeout seed") -MACRO_CONFIG_STR(ClInputFifo, cl_input_fifo, 128, "", CFGFLAG_SAVE | CFGFLAG_CLIENT, "Fifo file (non-Windows) or Named Pipe (Windows) to use as input for client console") -MACRO_CONFIG_INT(ClConfigVersion, cl_config_version, 0, 0, 0, CFGFLAG_CLIENT | CFGFLAG_SAVE, "The config version. Helps newer clients fix bugs with older configs.") - -// demo editor -MACRO_CONFIG_INT(ClDemoSliceBegin, cl_demo_slice_begin, -1, 0, 0, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Begin marker for demo slice") -MACRO_CONFIG_INT(ClDemoSliceEnd, cl_demo_slice_end, -1, 0, 0, CFGFLAG_SAVE | CFGFLAG_CLIENT, "End marker for demo slice") -MACRO_CONFIG_INT(ClDemoShowSpeed, cl_demo_show_speed, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Show speed meter on change") -MACRO_CONFIG_INT(ClDemoShowPause, cl_demo_show_pause, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Show pause/play indicator on change") -MACRO_CONFIG_INT(ClDemoKeyboardShortcuts, cl_demo_keyboard_shortcuts, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Enable keyboard shortcuts in demo player") - -// graphic library -#if !defined(CONF_ARCH_IA32) && !defined(CONF_PLATFORM_MACOS) -MACRO_CONFIG_INT(GfxGLMajor, gfx_gl_major, 1, 1, 10, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Graphic library major version") -#elif !defined(CONF_ARCH_IA32) -MACRO_CONFIG_INT(GfxGLMajor, gfx_gl_major, 3, 1, 10, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Graphic library major version") -#else -MACRO_CONFIG_INT(GfxGLMajor, gfx_gl_major, 1, 1, 10, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Graphic library major version") -#endif -#if !defined(CONF_PLATFORM_MACOS) -MACRO_CONFIG_INT(GfxGLMinor, gfx_gl_minor, 1, 0, 10, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Graphic library minor version") -#else -MACRO_CONFIG_INT(GfxGLMinor, gfx_gl_minor, 3, 0, 10, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Graphic library minor version") -#endif -MACRO_CONFIG_INT(GfxGLPatch, gfx_gl_patch, 0, 0, 10, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Graphic library patch version") - -// float multiplied with 1000 -MACRO_CONFIG_INT(GfxGLTextureLODBIAS, gfx_gl_texture_lod_bias, -500, -15000, 15000, CFGFLAG_SAVE | CFGFLAG_CLIENT, "The lod bias for graphic library texture sampling multiplied by 1000") - -MACRO_CONFIG_INT(Gfx3DTextureAnalysisRan, gfx_3d_texture_analysis_ran, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Ran an analyzer to check if sampling 3D/2D array textures works correctly") -MACRO_CONFIG_STR(Gfx3DTextureAnalysisRenderer, gfx_3d_texture_analysis_renderer, 128, "", CFGFLAG_SAVE | CFGFLAG_CLIENT, "The renderer on which the analysis was performed") -MACRO_CONFIG_STR(Gfx3DTextureAnalysisVersion, gfx_3d_texture_analysis_version, 128, "", CFGFLAG_SAVE | CFGFLAG_CLIENT, "The version on which the analysis was performed") - -MACRO_CONFIG_STR(GfxGpuName, gfx_gpu_name, 256, "auto", CFGFLAG_SAVE | CFGFLAG_CLIENT, "The GPU's name, which will be selected by the backend. (if supported by the backend)") -#if defined(CONF_PLATFORM_ANDROID) -MACRO_CONFIG_STR(GfxBackend, gfx_backend, 256, "GLES", CFGFLAG_SAVE | CFGFLAG_CLIENT, "The backend to use (e.g. GLES or Vulkan)") -#elif !defined(CONF_ARCH_IA32) && !defined(CONF_PLATFORM_MACOS) -MACRO_CONFIG_STR(GfxBackend, gfx_backend, 256, "Vulkan", CFGFLAG_SAVE | CFGFLAG_CLIENT, "The backend to use (e.g. OpenGL or Vulkan)") -#else -MACRO_CONFIG_STR(GfxBackend, gfx_backend, 256, "OpenGL", CFGFLAG_SAVE | CFGFLAG_CLIENT, "The backend to use (e.g. OpenGL or Vulkan)") -#endif -MACRO_CONFIG_INT(GfxRenderThreadCount, gfx_render_thread_count, 3, 0, 0, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Number of threads the backend can use for rendering. (note: the value can be ignored by the backend)") - -MACRO_CONFIG_INT(GfxDriverIsBlocked, gfx_driver_is_blocked, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "If 1, the current driver is in a blocked error state.") - -MACRO_CONFIG_INT(ClVideoRecorderFPS, cl_video_recorder_fps, 60, 1, 1000, CFGFLAG_SAVE | CFGFLAG_CLIENT, "At which FPS the videorecorder should record demos.") - -/* - * Add config variables for mods below this comment to avoid merge conflicts. - */ diff --git a/src/engine/shared/console.cpp b/src/engine/shared/console.cpp index 2c93380623..d2a5c55389 100644 --- a/src/engine/shared/console.cpp +++ b/src/engine/shared/console.cpp @@ -6,7 +6,6 @@ #include #include -#include #include #include @@ -351,24 +350,6 @@ void CConsole::SetUnknownCommandCallback(FUnknownCommandCallback pfnCallback, vo m_pUnknownCommandUserdata = pUser; } -void CConsole::InitChecksum(CChecksumData *pData) const -{ - pData->m_NumCommands = 0; - for(CCommand *pCommand = m_pFirstCommand; pCommand; pCommand = pCommand->m_pNext) - { - if(pData->m_NumCommands < (int)(std::size(pData->m_aCommandsChecksum))) - { - FCommandCallback pfnCallback = pCommand->m_pfnCallback; - void *pUserData = pCommand->m_pUserData; - TraverseChain(&pfnCallback, &pUserData); - int CallbackBits = (uintptr_t)pfnCallback & 0xfff; - int *pTarget = &pData->m_aCommandsChecksum[pData->m_NumCommands]; - *pTarget = ((uint8_t)pCommand->m_pName[0]) | ((uint8_t)pCommand->m_pName[1] << 8) | (CallbackBits << 16); - } - pData->m_NumCommands += 1; - } -} - bool CConsole::LineIsValid(const char *pStr) { if(!pStr || *pStr == 0) diff --git a/src/engine/shared/console.h b/src/engine/shared/console.h index 1bc68407dd..db7421495f 100644 --- a/src/engine/shared/console.h +++ b/src/engine/shared/console.h @@ -200,7 +200,6 @@ class CConsole : public IConsole void Print(int Level, const char *pFrom, const char *pStr, ColorRGBA PrintColor = gs_ConsoleDefaultColor) const override; void SetTeeHistorianCommandCallback(FTeeHistorianCommandCallback pfnCallback, void *pUser) override; void SetUnknownCommandCallback(FUnknownCommandCallback pfnCallback, void *pUser) override; - void InitChecksum(CChecksumData *pData) const override; void SetAccessLevel(int AccessLevel) override { m_AccessLevel = clamp(AccessLevel, (int)(ACCESS_LEVEL_ADMIN), (int)(ACCESS_LEVEL_USER)); } diff --git a/src/engine/shared/demo.cpp b/src/engine/shared/demo.cpp index 23c3a12494..4340489c2b 100644 --- a/src/engine/shared/demo.cpp +++ b/src/engine/shared/demo.cpp @@ -853,10 +853,6 @@ int CDemoPlayer::Load(class IStorage *pStorage, class IConsole *pConsole, const return -1; } - // reset slice markers - g_Config.m_ClDemoSliceBegin = -1; - g_Config.m_ClDemoSliceEnd = -1; - // ready for playback return 0; } diff --git a/src/engine/shared/http.cpp b/src/engine/shared/http.cpp index e2e1928e9f..c87e443bf1 100644 --- a/src/engine/shared/http.cpp +++ b/src/engine/shared/http.cpp @@ -394,14 +394,7 @@ void CHttpRequest::WriteToFile(IStorage *pStorage, const char *pDest, int Storag { m_WriteToFile = true; str_copy(m_aDest, pDest); - if(StorageType == -2) - { - pStorage->GetBinaryPath(m_aDest, m_aDestAbsolute, sizeof(m_aDestAbsolute)); - } - else - { - pStorage->GetCompletePath(StorageType, m_aDest, m_aDestAbsolute, sizeof(m_aDestAbsolute)); - } + pStorage->GetCompletePath(StorageType, m_aDest, m_aDestAbsolute, sizeof(m_aDestAbsolute)); } void CHttpRequest::Header(const char *pNameColonValue) diff --git a/src/engine/shared/lib.rs b/src/engine/shared/lib.rs deleted file mode 100644 index 95002283b4..0000000000 --- a/src/engine/shared/lib.rs +++ /dev/null @@ -1,21 +0,0 @@ -//! DDNet's engine interfaces, Rust part. -//! -//! DDNet's code base is separated into three major parts, `base`, `engine` and -//! `game`. -//! -//! The engine consists of game-independent code such as display setup, -//! low-level network protocol, low-level map format, etc. -//! -//! This crate in particular corresponds to the `src/engine/shared` directory -//! that contains code shared between client, server and other components. - -#![warn(missing_docs)] - -#[cfg(test)] -extern crate ddnet_test; - -mod config; -mod rust_version; - -pub use config::*; -pub use rust_version::*; diff --git a/src/engine/shared/network.h b/src/engine/shared/network.h index 5622d2100f..fdbc4f04e6 100644 --- a/src/engine/shared/network.h +++ b/src/engine/shared/network.h @@ -516,49 +516,6 @@ class CNetConsole CNetBan *NetBan() const { return m_pNetBan; } }; -// client side -class CNetClient -{ - CNetConnection m_Connection; - CNetRecvUnpacker m_RecvUnpacker; - - CStun *m_pStun = nullptr; - -public: - NETSOCKET m_Socket; - // openness - bool Open(NETADDR BindAddr); - int Close(); - - // connection state - int Disconnect(const char *pReason); - int Connect(const NETADDR *pAddr, int NumAddrs); - int Connect7(const NETADDR *pAddr, int NumAddrs); - - // communication - int Recv(CNetChunk *pChunk, SECURITY_TOKEN *pResponseToken, bool Sixup); - int Send(CNetChunk *pChunk); - - // pumping - int Update(); - int Flush(); - - int ResetErrorString(); - - // error and state - int NetType() const { return net_socket_type(m_Socket); } - int State(); - const NETADDR *ServerAddress() const { return m_Connection.PeerAddress(); } - void ConnectAddresses(const NETADDR **ppAddrs, int *pNumAddrs) const { m_Connection.ConnectAddresses(ppAddrs, pNumAddrs); } - int GotProblems(int64_t MaxLatency) const; - const char *ErrorString() const; - - // stun - void FeedStunServer(NETADDR StunServer); - void RefreshStun(); - CONNECTIVITY GetConnectivity(int NetType, NETADDR *pGlobalAddr); -}; - // TODO: both, fix these. This feels like a junk class for stuff that doesn't fit anywhere class CNetBase { diff --git a/src/engine/shared/network_client.cpp b/src/engine/shared/network_client.cpp deleted file mode 100644 index 7d80272153..0000000000 --- a/src/engine/shared/network_client.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include "network.h" -#include - -bool CNetClient::Open(NETADDR BindAddr) -{ - // open socket - NETSOCKET Socket; - Socket = net_udp_create(BindAddr); - if(!Socket) - return false; - - // clean it - *this = CNetClient{}; - - // init - m_Socket = Socket; - m_pStun = new CStun(m_Socket); - m_Connection.Init(m_Socket, false); - - return true; -} - -int CNetClient::Close() -{ - if(!m_Socket) - return 0; - if(m_pStun) - { - delete m_pStun; - m_pStun = nullptr; - } - return net_udp_close(m_Socket); -} - -int CNetClient::Disconnect(const char *pReason) -{ - //dbg_msg("netclient", "disconnected. reason=\"%s\"", pReason); - m_Connection.Disconnect(pReason); - return 0; -} - -int CNetClient::Update() -{ - m_Connection.Update(); - if(m_Connection.State() == NET_CONNSTATE_ERROR) - Disconnect(m_Connection.ErrorString()); - m_pStun->Update(); - return 0; -} - -int CNetClient::Connect(const NETADDR *pAddr, int NumAddrs) -{ - m_Connection.Connect(pAddr, NumAddrs); - return 0; -} - -int CNetClient::Connect7(const NETADDR *pAddr, int NumAddrs) -{ - m_Connection.Connect7(pAddr, NumAddrs); - return 0; -} - -int CNetClient::ResetErrorString() -{ - m_Connection.ResetErrorString(); - return 0; -} - -int CNetClient::Recv(CNetChunk *pChunk, SECURITY_TOKEN *pResponseToken, bool Sixup) -{ - while(true) - { - // check for a chunk - if(m_RecvUnpacker.FetchChunk(pChunk)) - return 1; - - // TODO: empty the recvinfo - NETADDR Addr; - unsigned char *pData; - int Bytes = net_udp_recv(m_Socket, &Addr, &pData); - - // no more packets for now - if(Bytes <= 0) - break; - - if(m_pStun->OnPacket(Addr, pData, Bytes)) - { - continue; - } - if(Sixup) - Addr.type |= NETTYPE_TW7; - - SECURITY_TOKEN Token; - *pResponseToken = NET_SECURITY_TOKEN_UNKNOWN; - if(CNetBase::UnpackPacket(pData, Bytes, &m_RecvUnpacker.m_Data, Sixup, &Token, pResponseToken) == 0) - { - if(m_RecvUnpacker.m_Data.m_Flags & NET_PACKETFLAG_CONNLESS) - { - pChunk->m_Flags = NETSENDFLAG_CONNLESS; - pChunk->m_ClientId = -1; - pChunk->m_Address = Addr; - pChunk->m_DataSize = m_RecvUnpacker.m_Data.m_DataSize; - pChunk->m_pData = m_RecvUnpacker.m_Data.m_aChunkData; - if(m_RecvUnpacker.m_Data.m_Flags & NET_PACKETFLAG_EXTENDED) - { - pChunk->m_Flags |= NETSENDFLAG_EXTENDED; - mem_copy(pChunk->m_aExtraData, m_RecvUnpacker.m_Data.m_aExtraData, sizeof(pChunk->m_aExtraData)); - } - return 1; - } - else - { - if(m_Connection.State() != NET_CONNSTATE_OFFLINE && m_Connection.State() != NET_CONNSTATE_ERROR && m_Connection.Feed(&m_RecvUnpacker.m_Data, &Addr, Token, *pResponseToken)) - m_RecvUnpacker.Start(&Addr, &m_Connection, 0); - } - } - } - return 0; -} - -int CNetClient::Send(CNetChunk *pChunk) -{ - if(pChunk->m_DataSize >= NET_MAX_PAYLOAD) - { - dbg_msg("netclient", "chunk payload too big. %d. dropping chunk", pChunk->m_DataSize); - return -1; - } - - if(pChunk->m_Flags & NETSENDFLAG_CONNLESS) - { - // send connectionless packet - CNetBase::SendPacketConnless(m_Socket, &pChunk->m_Address, pChunk->m_pData, pChunk->m_DataSize, - pChunk->m_Flags & NETSENDFLAG_EXTENDED, pChunk->m_aExtraData); - } - else - { - int Flags = 0; - dbg_assert(pChunk->m_ClientId == 0, "erroneous client id"); - - if(pChunk->m_Flags & NETSENDFLAG_VITAL) - Flags = NET_CHUNKFLAG_VITAL; - - m_Connection.QueueChunk(Flags, pChunk->m_DataSize, pChunk->m_pData); - - if(pChunk->m_Flags & NETSENDFLAG_FLUSH) - m_Connection.Flush(); - } - return 0; -} - -int CNetClient::State() -{ - if(m_Connection.State() == NET_CONNSTATE_ONLINE) - return NETSTATE_ONLINE; - if(m_Connection.State() == NET_CONNSTATE_OFFLINE) - return NETSTATE_OFFLINE; - return NETSTATE_CONNECTING; -} - -int CNetClient::Flush() -{ - return m_Connection.Flush(); -} - -int CNetClient::GotProblems(int64_t MaxLatency) const -{ - if(time_get() - m_Connection.LastRecvTime() > MaxLatency) - return 1; - return 0; -} - -const char *CNetClient::ErrorString() const -{ - return m_Connection.ErrorString(); -} - -void CNetClient::FeedStunServer(NETADDR StunServer) -{ - m_pStun->FeedStunServer(StunServer); -} - -void CNetClient::RefreshStun() -{ - m_pStun->Refresh(); -} - -CONNECTIVITY CNetClient::GetConnectivity(int NetType, NETADDR *pGlobalAddr) -{ - return m_pStun->GetConnectivity(NetType, pGlobalAddr); -} diff --git a/src/engine/shared/rust_version.rs b/src/engine/shared/rust_version.rs deleted file mode 100644 index dc65764dcb..0000000000 --- a/src/engine/shared/rust_version.rs +++ /dev/null @@ -1,59 +0,0 @@ -use super::CFGFLAG_CLIENT; -use super::CFGFLAG_SERVER; -use ddnet_base::s; -use ddnet_base::UserPtr; -use ddnet_engine::gs_ConsoleDefaultColor; -use ddnet_engine::IConsole; -use ddnet_engine::IConsole_FCommandCallback; -use ddnet_engine::IConsole_IResult; -use ddnet_engine::IConsole_OUTPUT_LEVEL_STANDARD; -use std::pin::Pin; - -#[cxx::bridge] -mod ffi { - extern "C++" { - include!("base/rust.h"); - include!("engine/console.h"); - - type IConsole = ddnet_engine::IConsole; - } - extern "Rust" { - fn RustVersionPrint(console: &IConsole); - fn RustVersionRegister(console: Pin<&mut IConsole>); - } -} - -/// Print the Rust version used for compiling this crate. -/// -/// Uses [`IConsole::Print`] for printing. -#[allow(non_snake_case)] -pub fn RustVersionPrint(console: &IConsole) { - console.Print( - IConsole_OUTPUT_LEVEL_STANDARD, - s!("rust_version"), - s!(include_str!(concat!(env!("OUT_DIR"), "/rustc-version"))), - gs_ConsoleDefaultColor, - ); -} - -#[allow(non_snake_case)] -extern "C" fn PrintRustVersionCallback(_: &IConsole_IResult, user: UserPtr) { - RustVersionPrint(unsafe { user.cast() }) -} - -/// Register the `rust_version` command to the given console instance. -/// -/// This command calls the [`RustVersionPrint`] function to print the Rust -/// version used for compiling this crate. -#[allow(non_snake_case)] -pub fn RustVersionRegister(console: Pin<&mut IConsole>) { - let user = console.as_ref().get_ref().into(); - console.Register( - s!("rust_version"), - s!(""), - CFGFLAG_CLIENT | CFGFLAG_SERVER, - IConsole_FCommandCallback(PrintRustVersionCallback), - user, - s!("Prints the Rust version used to compile DDNet"), - ); -} diff --git a/src/engine/shared/serverinfo.cpp b/src/engine/shared/serverinfo.cpp deleted file mode 100644 index 3e6ef8e570..0000000000 --- a/src/engine/shared/serverinfo.cpp +++ /dev/null @@ -1,262 +0,0 @@ -#include "serverinfo.h" - -#include "json.h" -#include -#include -#include - -#include - -static bool IsAllowedHex(char c) -{ - static const char ALLOWED[] = "0123456789abcdefABCDEF"; - for(int i = 0; i < (int)sizeof(ALLOWED) - 1; i++) - { - if(c == ALLOWED[i]) - { - return true; - } - } - return false; -} - -bool ParseCrc(unsigned int *pResult, const char *pString) -{ - if(str_length(pString) != 8) - { - return true; - } - for(int i = 0; i < 8; i++) - { - if(!IsAllowedHex(pString[i])) - { - return true; - } - } - return sscanf(pString, "%08x", pResult) != 1; -} - -bool CServerInfo2::FromJson(CServerInfo2 *pOut, const json_value *pJson) -{ - bool Result = FromJsonRaw(pOut, pJson); - if(Result) - { - return Result; - } - return pOut->Validate(); -} - -bool CServerInfo2::Validate() const -{ - bool Error = false; - Error = Error || m_MaxClients < m_MaxPlayers; - Error = Error || m_NumClients < m_NumPlayers; - Error = Error || m_MaxClients < m_NumClients; - Error = Error || m_MaxPlayers < m_NumPlayers; - return Error; -} - -bool CServerInfo2::FromJsonRaw(CServerInfo2 *pOut, const json_value *pJson) -{ - mem_zero(pOut, sizeof(*pOut)); - bool Error; - - const json_value &ServerInfo = *pJson; - const json_value &MaxClients = ServerInfo["max_clients"]; - const json_value &MaxPlayers = ServerInfo["max_players"]; - const json_value &ClientScoreKind = ServerInfo["client_score_kind"]; - const json_value &Passworded = ServerInfo["passworded"]; - const json_value &GameType = ServerInfo["game_type"]; - const json_value &Name = ServerInfo["name"]; - const json_value &MapName = ServerInfo["map"]["name"]; - const json_value &Version = ServerInfo["version"]; - const json_value &Clients = ServerInfo["clients"]; - const json_value &RequiresLogin = ServerInfo["requires_login"]; - - Error = false; - Error = Error || MaxClients.type != json_integer; - Error = Error || MaxPlayers.type != json_integer; - Error = Error || Passworded.type != json_boolean; - Error = Error || (ClientScoreKind.type != json_none && ClientScoreKind.type != json_string); - Error = Error || GameType.type != json_string || str_has_cc(GameType); - Error = Error || Name.type != json_string || str_has_cc(Name); - Error = Error || MapName.type != json_string || str_has_cc(MapName); - Error = Error || Version.type != json_string || str_has_cc(Version); - Error = Error || Clients.type != json_array; - if(Error) - { - return true; - } - pOut->m_MaxClients = json_int_get(&MaxClients); - pOut->m_MaxPlayers = json_int_get(&MaxPlayers); - pOut->m_ClientScoreKind = CServerInfo::CLIENT_SCORE_KIND_UNSPECIFIED; - if(ClientScoreKind.type == json_string && str_startswith(ClientScoreKind, "points")) - { - pOut->m_ClientScoreKind = CServerInfo::CLIENT_SCORE_KIND_POINTS; - } - else if(ClientScoreKind.type == json_string && str_startswith(ClientScoreKind, "time")) - { - pOut->m_ClientScoreKind = CServerInfo::CLIENT_SCORE_KIND_TIME; - } - pOut->m_RequiresLogin = false; - if(RequiresLogin.type == json_boolean) - { - pOut->m_RequiresLogin = RequiresLogin; - } - pOut->m_Passworded = Passworded; - str_copy(pOut->m_aGameType, GameType); - str_copy(pOut->m_aName, Name); - str_copy(pOut->m_aMapName, MapName); - str_copy(pOut->m_aVersion, Version); - - pOut->m_NumClients = 0; - pOut->m_NumPlayers = 0; - for(unsigned i = 0; i < Clients.u.array.length; i++) - { - const json_value &Client = Clients[i]; - const json_value &ClientName = Client["name"]; - const json_value &Clan = Client["clan"]; - const json_value &Country = Client["country"]; - const json_value &Score = Client["score"]; - const json_value &IsPlayer = Client["is_player"]; - const json_value &IsAfk = Client["afk"]; - Error = false; - Error = Error || ClientName.type != json_string || str_has_cc(ClientName); - Error = Error || Clan.type != json_string || str_has_cc(ClientName); - Error = Error || Country.type != json_integer; - Error = Error || Score.type != json_integer; - Error = Error || IsPlayer.type != json_boolean; - if(Error) - { - return true; - } - if(i < SERVERINFO_MAX_CLIENTS) - { - CClient *pClient = &pOut->m_aClients[i]; - str_copy(pClient->m_aName, ClientName); - str_copy(pClient->m_aClan, Clan); - pClient->m_Country = json_int_get(&Country); - pClient->m_Score = json_int_get(&Score); - pClient->m_IsPlayer = IsPlayer; - - pClient->m_IsAfk = false; - if(IsAfk.type == json_boolean) - pClient->m_IsAfk = IsAfk; - - // check if a skin is also available - bool HasSkin = false; - const json_value &SkinObj = Client["skin"]; - if(SkinObj.type == json_object) - { - const json_value &SkinName = SkinObj["name"]; - const json_value &SkinBodyColor = SkinObj["color_body"]; - const json_value &SkinFeetColor = SkinObj["color_feet"]; - if(SkinName.type == json_string) - { - HasSkin = true; - str_copy(pClient->m_aSkin, SkinName.u.string.ptr); - // if skin json value existed, then always at least default to "default" - if(pClient->m_aSkin[0] == '\0') - str_copy(pClient->m_aSkin, "default"); - // if skin also has custom colors, add them - if(SkinBodyColor.type == json_integer && SkinFeetColor.type == json_integer) - { - pClient->m_CustomSkinColors = true; - pClient->m_CustomSkinColorBody = SkinBodyColor.u.integer; - pClient->m_CustomSkinColorFeet = SkinFeetColor.u.integer; - } - // else set custom colors off - else - { - pClient->m_CustomSkinColors = false; - } - } - } - - // else make it null terminated - if(!HasSkin) - { - pClient->m_aSkin[0] = '\0'; - } - } - - pOut->m_NumClients++; - if((bool)IsPlayer) - { - pOut->m_NumPlayers++; - } - } - return false; -} - -bool CServerInfo2::operator==(const CServerInfo2 &Other) const -{ - bool Unequal; - Unequal = false; - Unequal = Unequal || m_MaxClients != Other.m_MaxClients; - Unequal = Unequal || m_NumClients != Other.m_NumClients; - Unequal = Unequal || m_MaxPlayers != Other.m_MaxPlayers; - Unequal = Unequal || m_NumPlayers != Other.m_NumPlayers; - Unequal = Unequal || m_ClientScoreKind != Other.m_ClientScoreKind; - Unequal = Unequal || m_Passworded != Other.m_Passworded; - Unequal = Unequal || str_comp(m_aGameType, Other.m_aGameType) != 0; - Unequal = Unequal || str_comp(m_aName, Other.m_aName) != 0; - Unequal = Unequal || str_comp(m_aMapName, Other.m_aMapName) != 0; - Unequal = Unequal || str_comp(m_aVersion, Other.m_aVersion) != 0; - Unequal = Unequal || m_RequiresLogin != Other.m_RequiresLogin; - if(Unequal) - { - return false; - } - for(int i = 0; i < m_NumClients; i++) - { - Unequal = false; - Unequal = Unequal || str_comp(m_aClients[i].m_aName, Other.m_aClients[i].m_aName) != 0; - Unequal = Unequal || str_comp(m_aClients[i].m_aClan, Other.m_aClients[i].m_aClan) != 0; - Unequal = Unequal || m_aClients[i].m_Country != Other.m_aClients[i].m_Country; - Unequal = Unequal || m_aClients[i].m_Score != Other.m_aClients[i].m_Score; - Unequal = Unequal || m_aClients[i].m_IsPlayer != Other.m_aClients[i].m_IsPlayer; - Unequal = Unequal || m_aClients[i].m_IsAfk != Other.m_aClients[i].m_IsAfk; - if(Unequal) - { - return false; - } - } - return true; -} - -CServerInfo2::operator CServerInfo() const -{ - CServerInfo Result = {0}; - Result.m_MaxClients = m_MaxClients; - Result.m_NumClients = m_NumClients; - Result.m_MaxPlayers = m_MaxPlayers; - Result.m_NumPlayers = m_NumPlayers; - Result.m_ClientScoreKind = m_ClientScoreKind; - Result.m_RequiresLogin = m_RequiresLogin; - Result.m_Flags = m_Passworded ? SERVER_FLAG_PASSWORD : 0; - str_copy(Result.m_aGameType, m_aGameType); - str_copy(Result.m_aName, m_aName); - str_copy(Result.m_aMap, m_aMapName); - str_copy(Result.m_aVersion, m_aVersion); - - for(int i = 0; i < minimum(m_NumClients, (int)SERVERINFO_MAX_CLIENTS); i++) - { - str_copy(Result.m_aClients[i].m_aName, m_aClients[i].m_aName); - str_copy(Result.m_aClients[i].m_aClan, m_aClients[i].m_aClan); - Result.m_aClients[i].m_Country = m_aClients[i].m_Country; - Result.m_aClients[i].m_Score = m_aClients[i].m_Score; - Result.m_aClients[i].m_Player = m_aClients[i].m_IsPlayer; - Result.m_aClients[i].m_Afk = m_aClients[i].m_IsAfk; - - str_copy(Result.m_aClients[i].m_aSkin, m_aClients[i].m_aSkin); - Result.m_aClients[i].m_CustomSkinColors = m_aClients[i].m_CustomSkinColors; - Result.m_aClients[i].m_CustomSkinColorBody = m_aClients[i].m_CustomSkinColorBody; - Result.m_aClients[i].m_CustomSkinColorFeet = m_aClients[i].m_CustomSkinColorFeet; - } - - Result.m_NumReceivedClients = minimum(m_NumClients, (int)SERVERINFO_MAX_CLIENTS); - Result.m_Latency = -1; - - return Result; -} diff --git a/src/engine/shared/serverinfo.h b/src/engine/shared/serverinfo.h deleted file mode 100644 index b8ec2f18ce..0000000000 --- a/src/engine/shared/serverinfo.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef ENGINE_SHARED_SERVERINFO_H -#define ENGINE_SHARED_SERVERINFO_H - -#include "protocol.h" - -#include -#include - -typedef struct _json_value json_value; -class CServerInfo; - -class CServerInfo2 -{ -public: - class CClient - { - public: - char m_aName[MAX_NAME_LENGTH]; - char m_aClan[MAX_CLAN_LENGTH]; - int m_Country; - int m_Score; - bool m_IsPlayer; - bool m_IsAfk; - char m_aSkin[MAX_SKIN_LENGTH]; - bool m_CustomSkinColors; - int m_CustomSkinColorBody; - int m_CustomSkinColorFeet; - }; - - CClient m_aClients[SERVERINFO_MAX_CLIENTS]; - int m_MaxClients; - int m_NumClients; // Indirectly serialized. - int m_MaxPlayers; - int m_NumPlayers; // Not serialized. - CServerInfo::EClientScoreKind m_ClientScoreKind; - bool m_Passworded; - char m_aGameType[16]; - char m_aName[64]; - char m_aMapName[MAX_MAP_LENGTH]; - char m_aVersion[32]; - bool m_RequiresLogin; - - bool operator==(const CServerInfo2 &Other) const; - bool operator!=(const CServerInfo2 &Other) const { return !(*this == Other); } - static bool FromJson(CServerInfo2 *pOut, const json_value *pJson); - static bool FromJsonRaw(CServerInfo2 *pOut, const json_value *pJson); - bool Validate() const; - void ToJson(char *pBuffer, int BufferSize) const; - - operator CServerInfo() const; -}; - -bool ParseCrc(unsigned int *pResult, const char *pString); - -#endif // ENGINE_SHARED_SERVERINFO_H diff --git a/src/engine/shared/storage.cpp b/src/engine/shared/storage.cpp index 4425b0c0af..3d9c17d2e5 100644 --- a/src/engine/shared/storage.cpp +++ b/src/engine/shared/storage.cpp @@ -5,7 +5,6 @@ #include #include -#include #include #include @@ -25,7 +24,6 @@ class CStorage : public IStorage char m_aDatadir[IO_MAX_PATH_LENGTH]; char m_aUserdir[IO_MAX_PATH_LENGTH]; char m_aCurrentdir[IO_MAX_PATH_LENGTH]; - char m_aBinarydir[IO_MAX_PATH_LENGTH]; CStorage() { @@ -34,7 +32,6 @@ class CStorage : public IStorage m_aDatadir[0] = '\0'; m_aUserdir[0] = '\0'; m_aCurrentdir[0] = '\0'; - m_aBinarydir[0] = '\0'; } int Init(int StorageType, int NumArgs, const char **ppArguments) @@ -65,9 +62,6 @@ class CStorage : public IStorage // get datadir FindDatadir(ppArguments[0]); - // get binarydir - FindBinarydir(ppArguments[0]); - // get currentdir if(!fs_getcwd(m_aCurrentdir, sizeof(m_aCurrentdir))) { @@ -310,44 +304,6 @@ class CStorage : public IStorage dbg_msg("storage", "warning: no data directory found"); } - void FindBinarydir(const char *pArgv0) - { -#if defined(BINARY_DIR) - str_copy(m_aBinarydir, BINARY_DIR, sizeof(m_aBinarydir)); - return; -#endif - - // check for usable path in argv[0] - { - unsigned int Pos = ~0U; - for(unsigned i = 0; pArgv0[i]; i++) - if(pArgv0[i] == '/' || pArgv0[i] == '\\') - Pos = i; - - if(Pos < IO_MAX_PATH_LENGTH) - { - char aBuf[IO_MAX_PATH_LENGTH]; - str_copy(m_aBinarydir, pArgv0, Pos + 1); - str_format(aBuf, sizeof(aBuf), "%s/" PLAT_SERVER_EXEC, m_aBinarydir); - if(fs_is_file(aBuf)) - { - return; - } -#if defined(CONF_PLATFORM_MACOS) - str_append(m_aBinarydir, "/../../../DDNet-Server.app/Contents/MacOS"); - str_format(aBuf, sizeof(aBuf), "%s/" PLAT_SERVER_EXEC, m_aBinarydir); - if(fs_is_file(aBuf)) - { - return; - } -#endif - } - } - - // no binary directory found, use $PATH on Posix, $PWD on Windows - m_aBinarydir[0] = '\0'; - } - int NumPaths() const override { return m_NumPaths; @@ -781,17 +737,6 @@ class CStorage : public IStorage return Success; } - bool RemoveBinaryFile(const char *pFilename) override - { - char aBuffer[IO_MAX_PATH_LENGTH]; - GetBinaryPath(pFilename, aBuffer, sizeof(aBuffer)); - - bool Success = !fs_remove(aBuffer); - if(!Success) - dbg_msg("storage", "failed to remove binary: %s", aBuffer); - return Success; - } - bool RenameFile(const char *pOldFilename, const char *pNewFilename, int Type) override { dbg_assert(Type >= TYPE_SAVE && Type < m_NumPaths, "Type invalid"); @@ -807,25 +752,6 @@ class CStorage : public IStorage return Success; } - bool RenameBinaryFile(const char *pOldFilename, const char *pNewFilename) override - { - char aOldBuffer[IO_MAX_PATH_LENGTH]; - char aNewBuffer[IO_MAX_PATH_LENGTH]; - GetBinaryPath(pOldFilename, aOldBuffer, sizeof(aOldBuffer)); - GetBinaryPath(pNewFilename, aNewBuffer, sizeof(aNewBuffer)); - - if(fs_makedir_rec_for(aNewBuffer) < 0) - { - dbg_msg("storage", "cannot create folder for: %s", aNewBuffer); - return false; - } - - bool Success = !fs_rename(aOldBuffer, aNewBuffer); - if(!Success) - dbg_msg("storage", "failed to rename: %s -> %s", aOldBuffer, aNewBuffer); - return Success; - } - bool CreateFolder(const char *pFoldername, int Type) override { dbg_assert(Type >= TYPE_SAVE && Type < m_NumPaths, "Type invalid"); @@ -846,29 +772,6 @@ class CStorage : public IStorage GetPath(Type, pDir, pBuffer, BufferSize); } - const char *GetBinaryPath(const char *pFilename, char *pBuffer, unsigned BufferSize) override - { - str_format(pBuffer, BufferSize, "%s%s%s", m_aBinarydir, !m_aBinarydir[0] ? "" : "/", pFilename); - return pBuffer; - } - - const char *GetBinaryPathAbsolute(const char *pFilename, char *pBuffer, unsigned BufferSize) override - { - char aBinaryPath[IO_MAX_PATH_LENGTH]; - GetBinaryPath(PLAT_CLIENT_EXEC, aBinaryPath, sizeof(aBinaryPath)); - if(fs_is_relative_path(aBinaryPath)) - { - if(fs_getcwd(pBuffer, BufferSize)) - { - str_append(pBuffer, "/", BufferSize); - str_append(pBuffer, aBinaryPath, BufferSize); - } - } - else - str_copy(pBuffer, aBinaryPath, BufferSize); - return pBuffer; - } - static IStorage *Create(int StorageType, int NumArgs, const char **ppArguments) { CStorage *pStorage = new CStorage(); diff --git a/src/engine/shared/translation_context.cpp b/src/engine/shared/translation_context.cpp deleted file mode 100644 index 0214f2c22d..0000000000 --- a/src/engine/shared/translation_context.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include - -#include "translation_context.h" - -void CTranslationContext::Reset() -{ - m_ServerSettings.Reset(); - - std::fill(std::begin(m_apPlayerInfosRace), std::end(m_apPlayerInfosRace), nullptr); - - for(CClientData &Client : m_aClients) - Client.Reset(); - - std::fill(std::begin(m_aDamageTaken), std::end(m_aDamageTaken), 0); - std::fill(std::begin(m_aDamageTakenTick), std::end(m_aDamageTakenTick), 0); - std::fill(std::begin(m_aLocalClientId), std::end(m_aLocalClientId), -1); - - m_ShouldSendGameInfo = false; - m_GameStateFlags7 = 0; - - m_GameFlags = 0; - m_ScoreLimit = 0; - m_TimeLimit = 0; - m_MatchNum = 0; - m_MatchCurrent = 0; - - m_MapdownloadTotalsize = -1; - m_MapDownloadChunkSize = 0; - m_MapDownloadChunksPerRequest = 0; - - m_FlagCarrierBlue = 0; - m_FlagCarrierRed = 0; - m_TeamscoreRed = 0; - m_TeamscoreBlue = 0; - - m_GameStartTick7 = 0; - m_GameStateEndTick7 = 0; -} diff --git a/src/engine/shared/translation_context.h b/src/engine/shared/translation_context.h deleted file mode 100644 index 7c574955bc..0000000000 --- a/src/engine/shared/translation_context.h +++ /dev/null @@ -1,123 +0,0 @@ -#ifndef ENGINE_SHARED_TRANSLATION_CONTEXT_H -#define ENGINE_SHARED_TRANSLATION_CONTEXT_H - -#include -#include - -#include - -class CTranslationContext -{ -public: - CTranslationContext() - { - Reset(); - } - - void Reset(); - - // this class is not used - // it could be used in the in game menu - // to grey out buttons and similar - // - // but that can not be done without mixing it - // into the 0.6 code so it is out of scope for ddnet - class CServerSettings - { - public: - bool m_KickVote; - int m_KickMin; - bool m_SpecVote; - bool m_TeamLock; - bool m_TeamBalance; - int m_PlayerSlots; - - CServerSettings() - { - Reset(); - } - - void Reset() - { - m_KickVote = false; - m_KickMin = 0; - m_SpecVote = false; - m_TeamLock = false; - m_TeamBalance = false; - m_PlayerSlots = 0; - } - - } m_ServerSettings; - - class CClientData - { - public: - CClientData() - { - Reset(); - } - - void Reset() - { - m_Active = false; - - m_UseCustomColor = 0; - m_ColorBody = 0; - m_ColorFeet = 0; - - m_aName[0] = '\0'; - m_aClan[0] = '\0'; - m_Country = 0; - m_aSkinName[0] = '\0'; - m_SkinColor = 0; - m_Team = 0; - m_PlayerFlags7 = 0; - } - - bool m_Active; - - int m_UseCustomColor; - int m_ColorBody; - int m_ColorFeet; - - char m_aName[MAX_NAME_LENGTH]; - char m_aClan[MAX_CLAN_LENGTH]; - int m_Country; - char m_aSkinName[protocol7::MAX_SKIN_LENGTH]; - int m_SkinColor; - int m_Team; - int m_PlayerFlags7; - }; - - const protocol7::CNetObj_PlayerInfoRace *m_apPlayerInfosRace[MAX_CLIENTS]; - CClientData m_aClients[MAX_CLIENTS]; - int m_aDamageTaken[MAX_CLIENTS]; - float m_aDamageTakenTick[MAX_CLIENTS]; - - int m_aLocalClientId[NUM_DUMMIES]; - - bool m_ShouldSendGameInfo; - int m_GameStateFlags7; - // 0.7 game flags - // use in combination with protocol7::GAMEFLAG_* - // for example protocol7::GAMEFLAG_TEAMS - int m_GameFlags; - int m_ScoreLimit; - int m_TimeLimit; - int m_MatchNum; - int m_MatchCurrent; - - int m_MapdownloadTotalsize; - int m_MapDownloadChunkSize; - int m_MapDownloadChunksPerRequest; - - int m_FlagCarrierBlue; - int m_FlagCarrierRed; - int m_TeamscoreRed; - int m_TeamscoreBlue; - - int m_GameStartTick7; - int m_GameStateEndTick7; -}; - -#endif diff --git a/src/engine/sound.h b/src/engine/sound.h deleted file mode 100644 index ccf1c5df80..0000000000 --- a/src/engine/sound.h +++ /dev/null @@ -1,125 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef ENGINE_SOUND_H -#define ENGINE_SOUND_H - -#include -#include - -#include - -class ISound : public IInterface -{ - MACRO_INTERFACE("sound") -public: - enum - { - FLAG_LOOP = 1 << 0, - FLAG_POS = 1 << 1, - FLAG_NO_PANNING = 1 << 2, - FLAG_PREVIEW = 1 << 3, - FLAG_ALL = FLAG_LOOP | FLAG_POS | FLAG_NO_PANNING | FLAG_PREVIEW, - }; - - enum - { - SHAPE_CIRCLE, - SHAPE_RECTANGLE, - }; - - // unused - struct CSampleHandle - { - int m_SampleId; - }; - - struct CVoiceShapeCircle - { - float m_Radius; - }; - - struct CVoiceShapeRectangle - { - float m_Width; - float m_Height; - }; - - class CVoiceHandle - { - friend class ISound; - int m_Id; - int m_Age; - - public: - CVoiceHandle() : - m_Id(-1), m_Age(-1) - { - } - - bool IsValid() const { return (Id() >= 0) && (Age() >= 0); } - int Id() const { return m_Id; } - int Age() const { return m_Age; } - - bool operator==(const CVoiceHandle &Other) const { return m_Id == Other.m_Id && m_Age == Other.m_Age; } - }; - - virtual bool IsSoundEnabled() = 0; - - virtual int LoadOpus(const char *pFilename, int StorageType = IStorage::TYPE_ALL) = 0; - virtual int LoadWV(const char *pFilename, int StorageType = IStorage::TYPE_ALL) = 0; - virtual int LoadOpusFromMem(const void *pData, unsigned DataSize, bool ForceLoad = false) = 0; - virtual int LoadWVFromMem(const void *pData, unsigned DataSize, bool ForceLoad = false) = 0; - virtual void UnloadSample(int SampleId) = 0; - - virtual float GetSampleTotalTime(int SampleId) = 0; // in s - virtual float GetSampleCurrentTime(int SampleId) = 0; // in s - virtual void SetSampleCurrentTime(int SampleId, float Time) = 0; - - virtual void SetChannel(int ChannelId, float Volume, float Panning) = 0; - virtual void SetListenerPosition(vec2 Position) = 0; - - virtual void SetVoiceVolume(CVoiceHandle Voice, float Volume) = 0; - virtual void SetVoiceFalloff(CVoiceHandle Voice, float Falloff) = 0; - virtual void SetVoicePosition(CVoiceHandle Voice, vec2 Position) = 0; - virtual void SetVoiceTimeOffset(CVoiceHandle Voice, float TimeOffset) = 0; // in s - - virtual void SetVoiceCircle(CVoiceHandle Voice, float Radius) = 0; - virtual void SetVoiceRectangle(CVoiceHandle Voice, float Width, float Height) = 0; - - virtual CVoiceHandle PlayAt(int ChannelId, int SampleId, int Flags, float Volume, vec2 Position) = 0; - virtual CVoiceHandle Play(int ChannelId, int SampleId, int Flags, float Volume) = 0; - virtual void Pause(int SampleId) = 0; - virtual void Stop(int SampleId) = 0; - virtual void StopAll() = 0; - virtual void StopVoice(CVoiceHandle Voice) = 0; - virtual bool IsPlaying(int SampleId) = 0; - - virtual int MixingRate() const = 0; - virtual void Mix(short *pFinalOut, unsigned Frames) = 0; - - // useful for thread synchronization - virtual void PauseAudioDevice() = 0; - virtual void UnpauseAudioDevice() = 0; - -protected: - inline CVoiceHandle CreateVoiceHandle(int Index, int Age) - { - CVoiceHandle Voice; - Voice.m_Id = Index; - Voice.m_Age = Age; - return Voice; - } -}; - -class IEngineSound : public ISound -{ - MACRO_INTERFACE("enginesound") -public: - virtual int Init() = 0; - virtual int Update() = 0; - virtual void Shutdown() override = 0; -}; - -extern IEngineSound *CreateEngineSound(); - -#endif diff --git a/src/engine/sqlite.h b/src/engine/sqlite.h deleted file mode 100644 index 348322a4e9..0000000000 --- a/src/engine/sqlite.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef ENGINE_SQLITE_H -#define ENGINE_SQLITE_H -#include - -struct sqlite3; -struct sqlite3_stmt; -class IConsole; -class IStorage; - -class CSqliteDeleter -{ -public: - void operator()(sqlite3 *pSqlite); -}; -class CSqliteStmtDeleter -{ -public: - void operator()(sqlite3_stmt *pStmt); -}; -typedef std::unique_ptr CSqlite; -typedef std::unique_ptr CSqliteStmt; - -int SqliteHandleError(IConsole *pConsole, int Error, sqlite3 *pSqlite, const char *pContext); -#define SQLITE_HANDLE_ERROR(x) SqliteHandleError(pConsole, x, &*pSqlite, #x) - -CSqlite SqliteOpen(IConsole *pConsole, IStorage *pStorage, const char *pPath); -CSqliteStmt SqlitePrepare(IConsole *pConsole, sqlite3 *pSqlite, const char *pStatement); -#endif // ENGINE_SQLITE_H diff --git a/src/engine/steam.h b/src/engine/steam.h deleted file mode 100644 index 20341e2b04..0000000000 --- a/src/engine/steam.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef ENGINE_STEAM_H -#define ENGINE_STEAM_H - -#include - -#include "kernel.h" - -class ISteam : public IInterface -{ - MACRO_INTERFACE("steam") -public: - // Returns NULL if the name cannot be determined. - virtual const char *GetPlayerName() = 0; - - // Returns NULL if the no server needs to be joined. - // Can change while the game is running. - virtual const NETADDR *GetConnectAddress() = 0; - virtual void ClearConnectAddress() = 0; - - virtual void Update() = 0; - - virtual void ClearGameInfo() = 0; - virtual void SetGameInfo(const NETADDR &ServerAddr, const char *pMapName, bool AnnounceAddr) = 0; -}; - -ISteam *CreateSteam(); - -#endif // ENGINE_STEAM_H diff --git a/src/engine/storage.h b/src/engine/storage.h index eeb146588c..ee64fd2eba 100644 --- a/src/engine/storage.h +++ b/src/engine/storage.h @@ -64,11 +64,6 @@ class IStorage : public IInterface virtual bool CreateFolder(const char *pFoldername, int Type) = 0; virtual void GetCompletePath(int Type, const char *pDir, char *pBuffer, unsigned BufferSize) = 0; - virtual bool RemoveBinaryFile(const char *pFilename) = 0; - virtual bool RenameBinaryFile(const char *pOldFilename, const char *pNewFilename) = 0; - virtual const char *GetBinaryPath(const char *pFilename, char *pBuffer, unsigned BufferSize) = 0; - virtual const char *GetBinaryPathAbsolute(const char *pFilename, char *pBuffer, unsigned BufferSize) = 0; - static void StripPathAndExtension(const char *pFilename, char *pBuffer, int BufferSize); static const char *FormatTmpPath(char *aBuf, unsigned BufSize, const char *pPath); }; diff --git a/src/engine/textrender.h b/src/engine/textrender.h deleted file mode 100644 index 0b728f307a..0000000000 --- a/src/engine/textrender.h +++ /dev/null @@ -1,384 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef ENGINE_TEXTRENDER_H -#define ENGINE_TEXTRENDER_H -#include "kernel.h" - -#include - -#include - -#include -#include - -enum -{ - TEXTFLAG_RENDER = 1 << 0, - TEXTFLAG_DISALLOW_NEWLINE = 1 << 1, - TEXTFLAG_STOP_AT_END = 1 << 2, - TEXTFLAG_ELLIPSIS_AT_END = 1 << 3, -}; - -enum ETextAlignment -{ - TEXTALIGN_LEFT = 0, - TEXTALIGN_CENTER = 1 << 1, - TEXTALIGN_RIGHT = 1 << 2, - TEXTALIGN_TOP = 0, // this is also 0, so the default alignment is top-left - TEXTALIGN_MIDDLE = 1 << 3, - TEXTALIGN_BOTTOM = 1 << 4, - - TEXTALIGN_TL = TEXTALIGN_TOP | TEXTALIGN_LEFT, - TEXTALIGN_TC = TEXTALIGN_TOP | TEXTALIGN_CENTER, - TEXTALIGN_TR = TEXTALIGN_TOP | TEXTALIGN_RIGHT, - TEXTALIGN_ML = TEXTALIGN_MIDDLE | TEXTALIGN_LEFT, - TEXTALIGN_MC = TEXTALIGN_MIDDLE | TEXTALIGN_CENTER, - TEXTALIGN_MR = TEXTALIGN_MIDDLE | TEXTALIGN_RIGHT, - TEXTALIGN_BL = TEXTALIGN_BOTTOM | TEXTALIGN_LEFT, - TEXTALIGN_BC = TEXTALIGN_BOTTOM | TEXTALIGN_CENTER, - TEXTALIGN_BR = TEXTALIGN_BOTTOM | TEXTALIGN_RIGHT, - - TEXTALIGN_MASK_HORIZONTAL = TEXTALIGN_LEFT | TEXTALIGN_CENTER | TEXTALIGN_RIGHT, - TEXTALIGN_MASK_VERTICAL = TEXTALIGN_TOP | TEXTALIGN_MIDDLE | TEXTALIGN_BOTTOM, -}; - -enum ETextRenderFlags -{ - TEXT_RENDER_FLAG_NO_X_BEARING = 1 << 0, - TEXT_RENDER_FLAG_NO_Y_BEARING = 1 << 1, - TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH = 1 << 2, - TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT = 1 << 3, - TEXT_RENDER_FLAG_KERNING = 1 << 4, - TEXT_RENDER_FLAG_NO_OVERSIZE = 1 << 5, - TEXT_RENDER_FLAG_NO_FIRST_CHARACTER_X_BEARING = 1 << 6, - TEXT_RENDER_FLAG_NO_LAST_CHARACTER_ADVANCE = 1 << 7, - TEXT_RENDER_FLAG_NO_AUTOMATIC_QUAD_UPLOAD = 1 << 8, - // text is only rendered once and then discarded (a hint for buffer creation) - TEXT_RENDER_FLAG_ONE_TIME_USE = 1 << 9, -}; - -enum class EFontPreset -{ - DEFAULT_FONT, - ICON_FONT, -}; - -namespace FontIcons { -// Each font icon is named according to its official name in Font Awesome -MAYBE_UNUSED static const char *FONT_ICON_PLUS = "+"; -MAYBE_UNUSED static const char *FONT_ICON_MINUS = "-"; -MAYBE_UNUSED static const char *FONT_ICON_LOCK = "\xEF\x80\xA3"; -MAYBE_UNUSED static const char *FONT_ICON_MAGNIFYING_GLASS = "\xEF\x80\x82"; -MAYBE_UNUSED static const char *FONT_ICON_HEART = "\xEF\x80\x84"; -MAYBE_UNUSED static const char *FONT_ICON_STAR = "\xEF\x80\x85"; -MAYBE_UNUSED static const char *FONT_ICON_XMARK = "\xEF\x80\x8D"; -MAYBE_UNUSED static const char *FONT_ICON_CIRCLE = "\xEF\x84\x91"; -MAYBE_UNUSED static const char *FONT_ICON_ARROW_ROTATE_LEFT = "\xEF\x83\xA2"; -MAYBE_UNUSED static const char *FONT_ICON_ARROW_ROTATE_RIGHT = "\xEF\x80\x9E"; -MAYBE_UNUSED static const char *FONT_ICON_FLAG_CHECKERED = "\xEF\x84\x9E"; -MAYBE_UNUSED static const char *FONT_ICON_BAN = "\xEF\x81\x9E"; -MAYBE_UNUSED static const char *FONT_ICON_CIRCLE_CHEVRON_DOWN = "\xEF\x84\xBA"; -MAYBE_UNUSED static const char *FONT_ICON_SQUARE_MINUS = "\xEF\x85\x86"; -MAYBE_UNUSED static const char *FONT_ICON_SQUARE_PLUS = "\xEF\x83\xBE"; -MAYBE_UNUSED static const char *FONT_ICON_SORT_UP = "\xEF\x83\x9E"; -MAYBE_UNUSED static const char *FONT_ICON_SORT_DOWN = "\xEF\x83\x9D"; - -MAYBE_UNUSED static const char *FONT_ICON_HOUSE = "\xEF\x80\x95"; -MAYBE_UNUSED static const char *FONT_ICON_NEWSPAPER = "\xEF\x87\xAA"; -MAYBE_UNUSED static const char *FONT_ICON_POWER_OFF = "\xEF\x80\x91"; -MAYBE_UNUSED static const char *FONT_ICON_GEAR = "\xEF\x80\x93"; -MAYBE_UNUSED static const char *FONT_ICON_PEN_TO_SQUARE = "\xEF\x81\x84"; -MAYBE_UNUSED static const char *FONT_ICON_CLAPPERBOARD = "\xEE\x84\xB1"; -MAYBE_UNUSED static const char *FONT_ICON_EARTH_AMERICAS = "\xEF\x95\xBD"; -MAYBE_UNUSED static const char *FONT_ICON_NETWORK_WIRED = "\xEF\x9B\xBF"; -MAYBE_UNUSED static const char *FONT_ICON_LIST_UL = "\xEF\x83\x8A"; -MAYBE_UNUSED static const char *FONT_ICON_INFO = "\xEF\x84\xA9"; -MAYBE_UNUSED static const char *FONT_ICON_TERMINAL = "\xEF\x84\xA0"; - -MAYBE_UNUSED static const char *FONT_ICON_SLASH = "\xEF\x9C\x95"; -MAYBE_UNUSED static const char *FONT_ICON_PLAY = "\xEF\x81\x8B"; -MAYBE_UNUSED static const char *FONT_ICON_PAUSE = "\xEF\x81\x8C"; -MAYBE_UNUSED static const char *FONT_ICON_STOP = "\xEF\x81\x8D"; -MAYBE_UNUSED static const char *FONT_ICON_CHEVRON_LEFT = "\xEF\x81\x93"; -MAYBE_UNUSED static const char *FONT_ICON_CHEVRON_RIGHT = "\xEF\x81\x94"; -MAYBE_UNUSED static const char *FONT_ICON_CHEVRON_UP = "\xEF\x81\xB7"; -MAYBE_UNUSED static const char *FONT_ICON_CHEVRON_DOWN = "\xEF\x81\xB8"; -MAYBE_UNUSED static const char *FONT_ICON_BACKWARD = "\xEF\x81\x8A"; -MAYBE_UNUSED static const char *FONT_ICON_FORWARD = "\xEF\x81\x8E"; -MAYBE_UNUSED static const char *FONT_ICON_RIGHT_FROM_BRACKET = "\xEF\x8B\xB5"; -MAYBE_UNUSED static const char *FONT_ICON_RIGHT_TO_BRACKET = "\xEF\x8B\xB6"; -MAYBE_UNUSED static const char *FONT_ICON_ARROW_UP_RIGHT_FROM_SQUARE = "\xEF\x82\x8E"; -MAYBE_UNUSED static const char *FONT_ICON_BACKWARD_STEP = "\xEF\x81\x88"; -MAYBE_UNUSED static const char *FONT_ICON_FORWARD_STEP = "\xEF\x81\x91"; -MAYBE_UNUSED static const char *FONT_ICON_BACKWARD_FAST = "\xEF\x81\x89"; -MAYBE_UNUSED static const char *FONT_ICON_FORWARD_FAST = "\xEF\x81\x90"; -MAYBE_UNUSED static const char *FONT_ICON_KEYBOARD = "\xE2\x8C\xA8"; -MAYBE_UNUSED static const char *FONT_ICON_ELLIPSIS = "\xEF\x85\x81"; - -MAYBE_UNUSED static const char *FONT_ICON_FOLDER = "\xEF\x81\xBB"; -MAYBE_UNUSED static const char *FONT_ICON_FOLDER_OPEN = "\xEF\x81\xBC"; -MAYBE_UNUSED static const char *FONT_ICON_FOLDER_TREE = "\xEF\xA0\x82"; -MAYBE_UNUSED static const char *FONT_ICON_FILM = "\xEF\x80\x88"; -MAYBE_UNUSED static const char *FONT_ICON_VIDEO = "\xEF\x80\xBD"; -MAYBE_UNUSED static const char *FONT_ICON_MAP = "\xEF\x89\xB9"; -MAYBE_UNUSED static const char *FONT_ICON_IMAGE = "\xEF\x80\xBE"; -MAYBE_UNUSED static const char *FONT_ICON_MUSIC = "\xEF\x80\x81"; -MAYBE_UNUSED static const char *FONT_ICON_FILE = "\xEF\x85\x9B"; - -MAYBE_UNUSED static const char *FONT_ICON_PENCIL = "\xEF\x8C\x83"; -MAYBE_UNUSED static const char *FONT_ICON_TRASH = "\xEF\x87\xB8"; - -MAYBE_UNUSED static const char *FONT_ICON_ARROWS_LEFT_RIGHT = "\xEF\x8C\xB7"; -MAYBE_UNUSED static const char *FONT_ICON_ARROWS_UP_DOWN = "\xEF\x81\xBD"; -MAYBE_UNUSED static const char *FONT_ICON_CIRCLE_PLAY = "\xEF\x85\x84"; -MAYBE_UNUSED static const char *FONT_ICON_BORDER_ALL = "\xEF\xA1\x8C"; -MAYBE_UNUSED static const char *FONT_ICON_EYE = "\xEF\x81\xAE"; -MAYBE_UNUSED static const char *FONT_ICON_EYE_SLASH = "\xEF\x81\xB0"; -MAYBE_UNUSED static const char *FONT_ICON_EYE_DROPPER = "\xEF\x87\xBB"; - -MAYBE_UNUSED static const char *FONT_ICON_DICE_ONE = "\xEF\x94\xA5"; -MAYBE_UNUSED static const char *FONT_ICON_DICE_TWO = "\xEF\x94\xA8"; -MAYBE_UNUSED static const char *FONT_ICON_DICE_THREE = "\xEF\x94\xA7"; -MAYBE_UNUSED static const char *FONT_ICON_DICE_FOUR = "\xEF\x94\xA4"; -MAYBE_UNUSED static const char *FONT_ICON_DICE_FIVE = "\xEF\x94\xA3"; -MAYBE_UNUSED static const char *FONT_ICON_DICE_SIX = "\xEF\x94\xA6"; - -MAYBE_UNUSED static const char *FONT_ICON_LAYER_GROUP = "\xEF\x97\xBD"; -MAYBE_UNUSED static const char *FONT_ICON_UNDO = "\xEF\x8B\xAA"; -MAYBE_UNUSED static const char *FONT_ICON_REDO = "\xEF\x8B\xB9"; - -MAYBE_UNUSED static const char *FONT_ICON_ARROWS_ROTATE = "\xEF\x80\xA1"; -MAYBE_UNUSED static const char *FONT_ICON_QUESTION = "?"; - -MAYBE_UNUSED static const char *FONT_ICON_CAMERA = "\xEF\x80\xB0"; -} // end namespace FontIcons - -enum ETextCursorSelectionMode -{ - // ignore any kind of selection - TEXT_CURSOR_SELECTION_MODE_NONE = 0, - // calculates the selection based on the mouse press and release cursor position - TEXT_CURSOR_SELECTION_MODE_CALCULATE, - // sets the selection based on the character start and end count(these values have to be decoded character offsets) - TEXT_CURSOR_SELECTION_MODE_SET, -}; - -enum ETextCursorCursorMode -{ - // ignore any kind of cursor - TEXT_CURSOR_CURSOR_MODE_NONE = 0, - // calculates the cursor based on the mouse release cursor position - TEXT_CURSOR_CURSOR_MODE_CALCULATE, - // sets the cursor based on the current character (this value has to be decoded character offset) - TEXT_CURSOR_CURSOR_MODE_SET, -}; - -struct STextBoundingBox -{ - float m_X; - float m_Y; - float m_W; - float m_H; - - float Right() const { return m_X + m_W; } - float Bottom() const { return m_Y + m_H; } - vec2 Size() const { return vec2(m_W, m_H); } - void MoveBy(vec2 Offset) - { - m_X += Offset.x; - m_Y += Offset.y; - } -}; - -// Allow to render multi colored text in one go without having to call TextEx() multiple times. -// Needed to allow multi colored multi line texts -struct STextColorSplit -{ - int m_CharIndex; // Which index within the text should the split occur - int m_Length; // How long is the split - ColorRGBA m_Color; // The color the text should be starting from m_CharIndex - - STextColorSplit(int CharIndex, int Length, const ColorRGBA &Color) : - m_CharIndex(CharIndex), m_Length(Length), m_Color(Color) {} -}; - -class CTextCursor -{ -public: - int m_Flags; - int m_LineCount; - int m_GlyphCount; - int m_CharCount; - int m_MaxLines; - - float m_StartX; - float m_StartY; - float m_LineWidth; - float m_X, m_Y; - float m_MaxCharacterHeight; - float m_LongestLineWidth; - - float m_FontSize; - float m_AlignedFontSize; - float m_LineSpacing; - float m_AlignedLineSpacing; - - ETextCursorSelectionMode m_CalculateSelectionMode; - float m_SelectionHeightFactor; - - // these coordinates are respected if selection mode is set to calculate @see ETextCursorSelectionMode - vec2 m_PressMouse; - // these coordinates are respected if selection/cursor mode is set to calculate @see ETextCursorSelectionMode / @see ETextCursorCursorMode - vec2 m_ReleaseMouse; - - // note m_SelectionStart can be bigger than m_SelectionEnd, depending on how the mouse cursor was dragged - // also note, that these are the character offsets decoded - int m_SelectionStart; - int m_SelectionEnd; - - ETextCursorCursorMode m_CursorMode; - bool m_ForceCursorRendering; - // note this is the decoded character offset - int m_CursorCharacter; - vec2 m_CursorRenderedPosition; - - // Color splits of the cursor to allow multicolored text - std::vector m_vColorSplits; - - float Height() const - { - return m_LineCount * (m_AlignedFontSize + m_AlignedLineSpacing); - } - - STextBoundingBox BoundingBox() const - { - return {m_StartX, m_StartY, m_LongestLineWidth, Height()}; - } - - void Reset() - { - m_Flags = 0; - m_LineCount = 0; - m_GlyphCount = 0; - m_CharCount = 0; - m_MaxLines = 0; - m_StartX = 0; - m_StartY = 0; - m_LineWidth = 0; - m_X = 0; - m_Y = 0; - m_MaxCharacterHeight = 0; - m_LongestLineWidth = 0; - m_FontSize = 0; - m_AlignedFontSize = 0; - m_LineSpacing = 0; - m_CalculateSelectionMode = TEXT_CURSOR_SELECTION_MODE_NONE; - m_SelectionHeightFactor = 0; - m_PressMouse = vec2(); - m_ReleaseMouse = vec2(); - m_SelectionStart = 0; - m_SelectionEnd = 0; - m_CursorMode = TEXT_CURSOR_CURSOR_MODE_NONE; - m_ForceCursorRendering = false; - m_CursorCharacter = 0; - m_CursorRenderedPosition = vec2(); - m_vColorSplits.clear(); - } -}; - -struct STextContainerUsages -{ - int m_Dummy = 0; -}; - -struct STextContainerIndex -{ - int m_Index; - std::shared_ptr m_UseCount = - std::make_shared(STextContainerUsages()); - - STextContainerIndex() { Reset(); } - bool Valid() const { return m_Index >= 0; } - void Reset() { m_Index = -1; } -}; - -struct STextSizeProperties -{ - float *m_pHeight = nullptr; - float *m_pAlignedFontSize = nullptr; - float *m_pMaxCharacterHeightInLine = nullptr; - int *m_pLineCount = nullptr; -}; - -class ITextRender : public IInterface -{ - MACRO_INTERFACE("textrender") -public: - virtual void SetCursor(CTextCursor *pCursor, float x, float y, float FontSize, int Flags) const = 0; - virtual void MoveCursor(CTextCursor *pCursor, float x, float y) const = 0; - virtual void SetCursorPosition(CTextCursor *pCursor, float x, float y) const = 0; - - virtual bool LoadFonts() = 0; - virtual void SetFontPreset(EFontPreset FontPreset) = 0; - virtual void SetFontLanguageVariant(const char *pLanguageFile) = 0; - - virtual void SetRenderFlags(unsigned Flags) = 0; - virtual unsigned GetRenderFlags() const = 0; - - ColorRGBA DefaultTextColor() const { return ColorRGBA(1, 1, 1, 1); } - ColorRGBA DefaultTextOutlineColor() const { return ColorRGBA(0, 0, 0, 0.3f); } - ColorRGBA DefaultTextSelectionColor() const { return ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f); } - - // - virtual void TextEx(CTextCursor *pCursor, const char *pText, int Length = -1) = 0; - virtual bool CreateTextContainer(STextContainerIndex &TextContainerIndex, CTextCursor *pCursor, const char *pText, int Length = -1) = 0; - virtual void AppendTextContainer(STextContainerIndex TextContainerIndex, CTextCursor *pCursor, const char *pText, int Length = -1) = 0; - // either creates a new text container or appends to a existing one - virtual bool CreateOrAppendTextContainer(STextContainerIndex &TextContainerIndex, CTextCursor *pCursor, const char *pText, int Length = -1) = 0; - // just deletes and creates text container - virtual void RecreateTextContainer(STextContainerIndex &TextContainerIndex, CTextCursor *pCursor, const char *pText, int Length = -1) = 0; - virtual void RecreateTextContainerSoft(STextContainerIndex &TextContainerIndex, CTextCursor *pCursor, const char *pText, int Length = -1) = 0; - virtual void DeleteTextContainer(STextContainerIndex &TextContainerIndex) = 0; - - virtual void UploadTextContainer(STextContainerIndex TextContainerIndex) = 0; - - virtual void RenderTextContainer(STextContainerIndex TextContainerIndex, const ColorRGBA &TextColor, const ColorRGBA &TextOutlineColor) = 0; - virtual void RenderTextContainer(STextContainerIndex TextContainerIndex, const ColorRGBA &TextColor, const ColorRGBA &TextOutlineColor, float X, float Y) = 0; - - virtual STextBoundingBox GetBoundingBoxTextContainer(STextContainerIndex TextContainerIndex) = 0; - - virtual void UploadEntityLayerText(const CImageInfo &TextImage, int TexSubWidth, int TexSubHeight, const char *pText, int Length, float x, float y, int FontSize) = 0; - virtual int AdjustFontSize(const char *pText, int TextLength, int MaxSize, int MaxWidth) const = 0; - virtual float GetGlyphOffsetX(int FontSize, char TextCharacter) const = 0; - virtual int CalculateTextWidth(const char *pText, int TextLength, int FontWidth, int FontSize) const = 0; - - // old foolish interface - virtual void TextColor(float r, float g, float b, float a) = 0; - virtual void TextColor(ColorRGBA Color) = 0; - virtual void TextOutlineColor(float r, float g, float b, float a) = 0; - virtual void TextOutlineColor(ColorRGBA Color) = 0; - virtual void TextSelectionColor(float r, float g, float b, float a) = 0; - virtual void TextSelectionColor(ColorRGBA Color) = 0; - virtual void Text(float x, float y, float Size, const char *pText, float LineWidth = -1.0f) = 0; - virtual float TextWidth(float Size, const char *pText, int StrLength = -1, float LineWidth = -1.0f, int Flags = 0, const STextSizeProperties &TextSizeProps = {}) = 0; - virtual STextBoundingBox TextBoundingBox(float Size, const char *pText, int StrLength = -1, float LineWidth = -1.0f, float LineSpacing = 0.0f, int Flags = 0) = 0; - - virtual ColorRGBA GetTextColor() const = 0; - virtual ColorRGBA GetTextOutlineColor() const = 0; - virtual ColorRGBA GetTextSelectionColor() const = 0; - - virtual void OnPreWindowResize() = 0; - virtual void OnWindowResize() = 0; -}; - -class IEngineTextRender : public ITextRender -{ - MACRO_INTERFACE("enginetextrender") -public: - virtual void Init() = 0; - virtual void Shutdown() override = 0; -}; - -extern IEngineTextRender *CreateEngineTextRender(); - -#endif diff --git a/src/engine/updater.h b/src/engine/updater.h deleted file mode 100644 index 3de864091c..0000000000 --- a/src/engine/updater.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef ENGINE_UPDATER_H -#define ENGINE_UPDATER_H - -#include "kernel.h" - -class IUpdater : public IInterface -{ - MACRO_INTERFACE("updater") -public: - enum EUpdaterState - { - CLEAN, - GETTING_MANIFEST, - GOT_MANIFEST, - PARSING_UPDATE, - DOWNLOADING, - MOVE_FILES, - NEED_RESTART, - FAIL, - }; - - virtual void Update() = 0; - virtual void InitiateUpdate() = 0; - - virtual EUpdaterState GetCurrentState() = 0; - virtual void GetCurrentFile(char *pBuf, int BufSize) = 0; - virtual int GetCurrentPercent() = 0; -}; - -#endif diff --git a/src/engine/warning.h b/src/engine/warning.h deleted file mode 100644 index 5eb1ae5294..0000000000 --- a/src/engine/warning.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef ENGINE_WARNING_H -#define ENGINE_WARNING_H - -struct SWarning -{ - SWarning() = default; - SWarning(const SWarning &Other); - SWarning(const char *pMsg); - SWarning(const char *pTitle, const char *pMsg); - - SWarning &operator=(const SWarning &Other); - - char m_aWarningTitle[128] = ""; - char m_aWarningMsg[256] = ""; - bool m_AutoHide = true; -}; - -#endif diff --git a/src/game/client/animstate.cpp b/src/game/client/animstate.cpp deleted file mode 100644 index 2a61155a28..0000000000 --- a/src/game/client/animstate.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include -#include - -#include "animstate.h" - -static void AnimSeqEval(const CAnimSequence *pSeq, float Time, CAnimKeyframe *pFrame) -{ - if(pSeq->m_NumFrames == 0) - { - pFrame->m_Time = 0; - pFrame->m_X = 0; - pFrame->m_Y = 0; - pFrame->m_Angle = 0; - } - else if(pSeq->m_NumFrames == 1) - { - *pFrame = pSeq->m_aFrames[0]; - } - else - { - CAnimKeyframe *pFrame1 = nullptr; - CAnimKeyframe *pFrame2 = nullptr; - float Blend = 0.0f; - - // TODO: make this smarter.. binary search - for(int i = 1; i < pSeq->m_NumFrames; i++) - { - if(pSeq->m_aFrames[i - 1].m_Time <= Time && pSeq->m_aFrames[i].m_Time >= Time) - { - pFrame1 = &pSeq->m_aFrames[i - 1]; - pFrame2 = &pSeq->m_aFrames[i]; - Blend = (Time - pFrame1->m_Time) / (pFrame2->m_Time - pFrame1->m_Time); - break; - } - } - - if(pFrame1 != nullptr && pFrame2 != nullptr) - { - pFrame->m_Time = Time; - pFrame->m_X = mix(pFrame1->m_X, pFrame2->m_X, Blend); - pFrame->m_Y = mix(pFrame1->m_Y, pFrame2->m_Y, Blend); - pFrame->m_Angle = mix(pFrame1->m_Angle, pFrame2->m_Angle, Blend); - } - } -} - -static void AnimAddKeyframe(CAnimKeyframe *pSeq, const CAnimKeyframe *pAdded, float Amount) -{ - // AnimSeqEval fills m_X for any case, clang-analyzer assumes going into the - // final else branch with pSeq->m_NumFrames < 2, which is impossible. - pSeq->m_X += pAdded->m_X * Amount; // NOLINT(clang-analyzer-core.UndefinedBinaryOperatorResult) - pSeq->m_Y += pAdded->m_Y * Amount; - pSeq->m_Angle += pAdded->m_Angle * Amount; -} - -void CAnimState::AnimAdd(CAnimState *pState, const CAnimState *pAdded, float Amount) -{ - AnimAddKeyframe(&pState->m_Body, pAdded->GetBody(), Amount); - AnimAddKeyframe(&pState->m_BackFoot, pAdded->GetBackFoot(), Amount); - AnimAddKeyframe(&pState->m_FrontFoot, pAdded->GetFrontFoot(), Amount); - AnimAddKeyframe(&pState->m_Attach, pAdded->GetAttach(), Amount); -} - -void CAnimState::Set(CAnimation *pAnim, float Time) -{ - AnimSeqEval(&pAnim->m_Body, Time, &m_Body); - AnimSeqEval(&pAnim->m_BackFoot, Time, &m_BackFoot); - AnimSeqEval(&pAnim->m_FrontFoot, Time, &m_FrontFoot); - AnimSeqEval(&pAnim->m_Attach, Time, &m_Attach); -} - -void CAnimState::Add(CAnimation *pAnim, float Time, float Amount) -{ - CAnimState Add; - Add.Set(pAnim, Time); - AnimAdd(this, &Add, Amount); -} - -const CAnimState *CAnimState::GetIdle() -{ - static CAnimState s_State; - static bool s_Init = true; - - if(s_Init) - { - s_State.Set(&g_pData->m_aAnimations[ANIM_BASE], 0.0f); - s_State.Add(&g_pData->m_aAnimations[ANIM_IDLE], 0.0f, 1.0f); - s_Init = false; - } - - return &s_State; -} diff --git a/src/game/client/animstate.h b/src/game/client/animstate.h deleted file mode 100644 index 45accba6f3..0000000000 --- a/src/game/client/animstate.h +++ /dev/null @@ -1,28 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_ANIMSTATE_H -#define GAME_CLIENT_ANIMSTATE_H - -#include - -class CAnimState -{ - CAnimKeyframe m_Body; - CAnimKeyframe m_BackFoot; - CAnimKeyframe m_FrontFoot; - CAnimKeyframe m_Attach; - - void AnimAdd(CAnimState *pState, const CAnimState *pAdded, float Amount); - -public: - const CAnimKeyframe *GetBody() const { return &m_Body; } - const CAnimKeyframe *GetBackFoot() const { return &m_BackFoot; } - const CAnimKeyframe *GetFrontFoot() const { return &m_FrontFoot; } - const CAnimKeyframe *GetAttach() const { return &m_Attach; } - void Set(CAnimation *pAnim, float Time); - void Add(CAnimation *pAnim, float Time, float Amount); - - const static CAnimState *GetIdle(); -}; - -#endif diff --git a/src/game/client/component.cpp b/src/game/client/component.cpp deleted file mode 100644 index c682d7457d..0000000000 --- a/src/game/client/component.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include "component.h" - -#include "gameclient.h" - -#include - -class IKernel *CComponent::Kernel() const { return m_pClient->Kernel(); } -class IEngine *CComponent::Engine() const { return m_pClient->Engine(); } -class IGraphics *CComponent::Graphics() const { return m_pClient->Graphics(); } -class ITextRender *CComponent::TextRender() const { return m_pClient->TextRender(); } -class IInput *CComponent::Input() const { return m_pClient->Input(); } -class IStorage *CComponent::Storage() const { return m_pClient->Storage(); } -class CUi *CComponent::Ui() const { return m_pClient->Ui(); } -class ISound *CComponent::Sound() const { return m_pClient->Sound(); } -class CRenderTools *CComponent::RenderTools() const { return m_pClient->RenderTools(); } -class IConfigManager *CComponent::ConfigManager() const { return m_pClient->ConfigManager(); } -class CConfig *CComponent::Config() const { return m_pClient->Config(); } -class IConsole *CComponent::Console() const { return m_pClient->Console(); } -class IDemoPlayer *CComponent::DemoPlayer() const { return m_pClient->DemoPlayer(); } -class IDemoRecorder *CComponent::DemoRecorder(int Recorder) const { return m_pClient->DemoRecorder(Recorder); } -class IFavorites *CComponent::Favorites() const { return m_pClient->Favorites(); } -class IServerBrowser *CComponent::ServerBrowser() const { return m_pClient->ServerBrowser(); } -class CLayers *CComponent::Layers() const { return m_pClient->Layers(); } -class CCollision *CComponent::Collision() const { return m_pClient->Collision(); } -#if defined(CONF_AUTOUPDATE) -class IUpdater *CComponent::Updater() const -{ - return m_pClient->Updater(); -} -#endif - -int64_t CComponent::time() const -{ -#if defined(CONF_VIDEORECORDER) - return IVideo::Current() ? IVideo::Time() : time_get(); -#else - return time_get(); -#endif -} - -float CComponent::LocalTime() const -{ -#if defined(CONF_VIDEORECORDER) - return IVideo::Current() ? IVideo::LocalTime() : Client()->LocalTime(); -#else - return Client()->LocalTime(); -#endif -} - -class IClient *CComponent::Client() const -{ - return m_pClient->Client(); -} - -class IHttp *CComponent::Http() const { return m_pClient->Http(); } diff --git a/src/game/client/component.h b/src/game/client/component.h deleted file mode 100644 index 9d14615a05..0000000000 --- a/src/game/client/component.h +++ /dev/null @@ -1,225 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENT_H -#define GAME_CLIENT_COMPONENT_H - -#if defined(CONF_VIDEORECORDER) -#include -#endif - -#include - -class CGameClient; - -/** -* This class is inherited by all the client components. -* -* These components can implement the virtual methods such as OnInit(), OnMessage(int Msg, void *pRawMsg) to provide their functionality. -*/ -class CComponent -{ -protected: - friend class CGameClient; - - CGameClient *m_pClient; - - // perhaps propagate pointers for these as well - - /** - * Get the kernel interface. - */ - class IKernel *Kernel() const; - class IEngine *Engine() const; - /** - * Get the graphics interface. - */ - class IGraphics *Graphics() const; - /** - * Get the text rendering interface. - */ - class ITextRender *TextRender() const; - /** - * Get the input interface. - */ - class IInput *Input() const; - /** - * Get the storage interface. - */ - class IStorage *Storage() const; - /** - * Get the ui interface. - */ - class CUi *Ui() const; - /** - * Get the sound interface. - */ - class ISound *Sound() const; - /** - * Get the render tools interface. - */ - class CRenderTools *RenderTools() const; - /** - * Get the config manager interface. - */ - class IConfigManager *ConfigManager() const; - /** - * Get the config interface. - */ - class CConfig *Config() const; - /** - * Get the console interface. - */ - class IConsole *Console() const; - /** - * Get the demo player interface. - */ - class IDemoPlayer *DemoPlayer() const; - /** - * Get the demo recorder interface. - * - * @param Recorder A member of the RECORDER_x enum - * @see RECORDER_MANUAL - * @see RECORDER_AUTO - * @see RECORDER_RACE - * @see RECORDER_REPLAYS - */ - class IDemoRecorder *DemoRecorder(int Recorder) const; - class IFavorites *Favorites() const; - /** - * Get the server browser interface. - */ - class IServerBrowser *ServerBrowser() const; - /** - * Get the layers interface. - */ - class CLayers *Layers() const; - /** - * Get the collision interface. - */ - class CCollision *Collision() const; -#if defined(CONF_AUTOUPDATE) - /** - * Get the updater interface. - */ - class IUpdater *Updater() const; -#endif - - /** - * Gets the current time. - * @see time_get() - */ - int64_t time() const; - - /** - * Gets the local time. - */ - float LocalTime() const; - - /** - * Get the http interface - */ - class IHttp *Http() const; - -public: - /** - * The component virtual destructor. - */ - virtual ~CComponent() {} - /** - * Gets the size of the non-abstract component. - */ - virtual int Sizeof() const = 0; - /** - * Get a pointer to the game client. - */ - class CGameClient *GameClient() const { return m_pClient; } - /** - * Get the client interface. - */ - class IClient *Client() const; - - /** - * This method is called when the client changes state, e.g from offline to online. - * @see IClient::STATE_CONNECTING - * @see IClient::STATE_LOADING - * @see IClient::STATE_ONLINE - */ - virtual void OnStateChange(int NewState, int OldState){}; - /** - * Called to let the components register their console commands. - */ - virtual void OnConsoleInit(){}; - /** - * Called to let the components run initialization code. - */ - virtual void OnInit(){}; - /** - * Called to cleanup the component. - * This method is called when the client is closed. - */ - virtual void OnShutdown(){}; - /** - * Called to reset the component. - * This method is usually called on your component constructor to avoid code duplication. - * @see CHud::CHud() - * @see CHud::OnReset() - */ - virtual void OnReset(){}; - /** - * Called when the window has been resized. - */ - virtual void OnWindowResize() {} - /** - * Called when skins have been invalidated and must be updated. - */ - virtual void OnRefreshSkins() {} - /** - * Called when the component should get rendered. - * - * The render order depends on the component insertion order. - */ - virtual void OnRender(){}; - /** - * Called when a new snapshot is received. - */ - virtual void OnNewSnapshot(){}; - /** - * Called when the input gets released, for example when a text box loses focus. - */ - virtual void OnRelease(){}; - /** - * Called on map load. - */ - virtual void OnMapLoad(){}; - /** - * Called when receiving a network message. - * @param Msg The message type. - * @param pRawMsg The message data. - * @see NETMSGTYPE_SV_DDRACETIME - * @see CNetMsg_Sv_DDRaceTime - */ - virtual void OnMessage(int Msg, void *pRawMsg) {} - /** - * Called on mouse movement, where the x and y values are deltas. - * - * @param x The amount of change in the x coordinate since the last call. - * @param y The amount of change in the y coordinate since the last call. - * @param CursorType The type of cursor that caused the movement. - */ - virtual bool OnCursorMove(float x, float y, IInput::ECursorType CursorType) { return false; } - /** - * Called on a input event. - * @param Event The input event. - */ - virtual bool OnInput(const IInput::CEvent &Event) { return false; } - /** - * Called with all current touch finger states. - * - * @param vTouchFingerStates The touch finger states to be handled. - * - * @return `true` if the component used the touch events, `false` otherwise - */ - virtual bool OnTouchState(const std::vector &vTouchFingerStates) { return false; } -}; - -#endif diff --git a/src/game/client/components/background.cpp b/src/game/client/components/background.cpp deleted file mode 100644 index cf1fb23fd3..0000000000 --- a/src/game/client/components/background.cpp +++ /dev/null @@ -1,118 +0,0 @@ -#include - -#include -#include - -#include -#include - -#include -#include -#include - -#include "background.h" - -CBackground::CBackground(int MapType, bool OnlineOnly) : - CMapLayers(MapType, OnlineOnly) -{ - m_pLayers = new CLayers; - m_pBackgroundLayers = m_pLayers; - m_pImages = new CMapImages; - m_pBackgroundImages = m_pImages; - m_Loaded = false; - m_aMapName[0] = '\0'; -} - -CBackground::~CBackground() -{ - delete m_pBackgroundLayers; - delete m_pBackgroundImages; -} - -CBackgroundEngineMap *CBackground::CreateBGMap() -{ - return new CBackgroundEngineMap; -} - -const char *CBackground::LoadingTitle() const -{ - return Localize("Loading background map"); -} - -void CBackground::OnInit() -{ - m_pBackgroundMap = CreateBGMap(); - m_pMap = m_pBackgroundMap; - - m_pImages->m_pClient = GameClient(); - Kernel()->RegisterInterface(m_pBackgroundMap); - if(g_Config.m_ClBackgroundEntities[0] != '\0' && str_comp(g_Config.m_ClBackgroundEntities, CURRENT_MAP)) - LoadBackground(); -} - -void CBackground::LoadBackground() -{ - if(m_Loaded && m_pMap == m_pBackgroundMap) - m_pMap->Unload(); - - m_Loaded = false; - m_pMap = m_pBackgroundMap; - m_pLayers = m_pBackgroundLayers; - m_pImages = m_pBackgroundImages; - - str_copy(m_aMapName, g_Config.m_ClBackgroundEntities); - if(g_Config.m_ClBackgroundEntities[0] != '\0') - { - bool NeedImageLoading = false; - - char aBuf[IO_MAX_PATH_LENGTH]; - str_format(aBuf, sizeof(aBuf), "maps/%s%s", g_Config.m_ClBackgroundEntities, str_endswith(g_Config.m_ClBackgroundEntities, ".map") ? "" : ".map"); - if(str_comp(g_Config.m_ClBackgroundEntities, CURRENT_MAP) == 0) - { - m_pMap = Kernel()->RequestInterface(); - if(m_pMap->IsLoaded()) - { - m_pLayers = GameClient()->Layers(); - m_pImages = &GameClient()->m_MapImages; - m_Loaded = true; - } - } - else if(m_pMap->Load(aBuf)) - { - m_pLayers->Init(m_pMap, true); - NeedImageLoading = true; - m_Loaded = true; - } - - if(m_Loaded) - { - if(NeedImageLoading) - { - m_pImages->LoadBackground(m_pLayers, m_pMap); - } - CMapLayers::OnMapLoad(); - } - } -} - -void CBackground::OnMapLoad() -{ - if(str_comp(g_Config.m_ClBackgroundEntities, CURRENT_MAP) == 0 || str_comp(g_Config.m_ClBackgroundEntities, m_aMapName)) - { - LoadBackground(); - } -} - -void CBackground::OnRender() -{ - if(!m_Loaded) - return; - - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - if(g_Config.m_ClOverlayEntities != 100) - return; - - CMapLayers::OnRender(); -} diff --git a/src/game/client/components/background.h b/src/game/client/components/background.h deleted file mode 100644 index df838ece74..0000000000 --- a/src/game/client/components/background.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef GAME_CLIENT_COMPONENTS_BACKGROUND_H -#define GAME_CLIENT_COMPONENTS_BACKGROUND_H - -#include - -#include - -#include - -class CLayers; -class CMapImages; - -// Special value to use background of current map -#define CURRENT_MAP "%current%" - -class CBackgroundEngineMap : public CMap -{ - MACRO_INTERFACE("background_enginemap") -}; - -class CBackground : public CMapLayers -{ -protected: - IEngineMap *m_pMap; - bool m_Loaded; - char m_aMapName[MAX_MAP_LENGTH]; - - //to avoid memory leak when switching to %current% - CBackgroundEngineMap *m_pBackgroundMap; - CLayers *m_pBackgroundLayers; - CMapImages *m_pBackgroundImages; - - virtual CBackgroundEngineMap *CreateBGMap(); - - const char *LoadingTitle() const override; - -public: - CBackground(int MapType = CMapLayers::TYPE_BACKGROUND_FORCE, bool OnlineOnly = true); - virtual ~CBackground(); - virtual int Sizeof() const override { return sizeof(*this); } - - virtual void OnInit() override; - virtual void OnMapLoad() override; - virtual void OnRender() override; - - void LoadBackground(); - const char *MapName() const { return m_aMapName; } -}; - -#endif diff --git a/src/game/client/components/binds.cpp b/src/game/client/components/binds.cpp deleted file mode 100644 index 3a79f98199..0000000000 --- a/src/game/client/components/binds.cpp +++ /dev/null @@ -1,539 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include "binds.h" -#include -#include -#include - -#include -#include -#include - -static const ColorRGBA gs_BindPrintColor{1.0f, 1.0f, 0.8f, 1.0f}; - -bool CBinds::CBindsSpecial::OnInput(const IInput::CEvent &Event) -{ - if((Event.m_Flags & (IInput::FLAG_PRESS | IInput::FLAG_RELEASE)) == 0) - return false; - - // only handle F and composed F binds - // do not handle F5 bind while menu is active - if(((Event.m_Key >= KEY_F1 && Event.m_Key <= KEY_F12) || (Event.m_Key >= KEY_F13 && Event.m_Key <= KEY_F24)) && - (Event.m_Key != KEY_F5 || !m_pClient->m_Menus.IsActive())) - { - return m_pBinds->OnInput(Event); - } - - return false; -} - -CBinds::CBinds() -{ - mem_zero(m_aapKeyBindings, sizeof(m_aapKeyBindings)); - m_SpecialBinds.m_pBinds = this; -} - -CBinds::~CBinds() -{ - UnbindAll(); -} - -void CBinds::Bind(int KeyId, const char *pStr, bool FreeOnly, int ModifierCombination) -{ - dbg_assert(KeyId >= KEY_FIRST && KeyId < KEY_LAST, "KeyId invalid"); - dbg_assert(ModifierCombination >= MODIFIER_NONE && ModifierCombination < MODIFIER_COMBINATION_COUNT, "ModifierCombination invalid"); - - if(FreeOnly && Get(KeyId, ModifierCombination)[0]) - return; - - free(m_aapKeyBindings[ModifierCombination][KeyId]); - m_aapKeyBindings[ModifierCombination][KeyId] = nullptr; - - char aBuf[256]; - char aModifiers[128]; - GetKeyBindModifiersName(ModifierCombination, aModifiers, sizeof(aModifiers)); - if(!pStr[0]) - { - str_format(aBuf, sizeof(aBuf), "unbound %s%s (%d)", aModifiers, Input()->KeyName(KeyId), KeyId); - } - else - { - int Size = str_length(pStr) + 1; - m_aapKeyBindings[ModifierCombination][KeyId] = (char *)malloc(Size); - str_copy(m_aapKeyBindings[ModifierCombination][KeyId], pStr, Size); - str_format(aBuf, sizeof(aBuf), "bound %s%s (%d) = %s", aModifiers, Input()->KeyName(KeyId), KeyId, m_aapKeyBindings[ModifierCombination][KeyId]); - } - Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "binds", aBuf, gs_BindPrintColor); -} - -int CBinds::GetModifierMask(IInput *pInput) -{ - int Mask = 0; - static const auto s_aModifierKeys = { - KEY_LSHIFT, - KEY_RSHIFT, - KEY_LCTRL, - KEY_RCTRL, - KEY_LALT, - KEY_RALT, - KEY_LGUI, - KEY_RGUI, - }; - for(const auto Key : s_aModifierKeys) - { - if(pInput->KeyIsPressed(Key)) - { - Mask |= GetModifierMaskOfKey(Key); - } - } - - return Mask; -} - -int CBinds::GetModifierMaskOfKey(int Key) -{ - switch(Key) - { - case KEY_LSHIFT: - case KEY_RSHIFT: - return 1 << CBinds::MODIFIER_SHIFT; - case KEY_LCTRL: - case KEY_RCTRL: - return 1 << CBinds::MODIFIER_CTRL; - case KEY_LALT: - case KEY_RALT: - return 1 << CBinds::MODIFIER_ALT; - case KEY_LGUI: - case KEY_RGUI: - return 1 << CBinds::MODIFIER_GUI; - default: - return CBinds::MODIFIER_NONE; - } -} - -bool CBinds::OnInput(const IInput::CEvent &Event) -{ - if((Event.m_Flags & (IInput::FLAG_PRESS | IInput::FLAG_RELEASE)) == 0) - return false; - - const int KeyModifierMask = GetModifierMaskOfKey(Event.m_Key); - const int ModifierMask = GetModifierMask(Input()) & ~KeyModifierMask; - - bool Handled = false; - - if(Event.m_Flags & IInput::FLAG_PRESS) - { - auto ActiveBind = std::find_if(m_vActiveBinds.begin(), m_vActiveBinds.end(), [&](const CBindSlot &Bind) { - return Event.m_Key == Bind.m_Key; - }); - if(ActiveBind == m_vActiveBinds.end()) - { - const auto &&OnKeyPress = [&](int Mask) { - const char *pBind = m_aapKeyBindings[Mask][Event.m_Key]; - if(g_Config.m_ClSubTickAiming) - { - if(str_comp("+fire", pBind) == 0 || str_comp("+hook", pBind) == 0) - { - m_MouseOnAction = true; - } - } - Console()->ExecuteLineStroked(1, pBind); - m_vActiveBinds.emplace_back(Event.m_Key, Mask); - }; - - if(m_aapKeyBindings[ModifierMask][Event.m_Key]) - { - OnKeyPress(ModifierMask); - Handled = true; - } - else if(m_aapKeyBindings[MODIFIER_NONE][Event.m_Key] && - ModifierMask != ((1 << MODIFIER_CTRL) | (1 << MODIFIER_SHIFT)) && - ModifierMask != ((1 << MODIFIER_GUI) | (1 << MODIFIER_SHIFT))) - { - OnKeyPress(MODIFIER_NONE); - Handled = true; - } - } - else - { - // Repeat active bind while key is held down - // Have to check for nullptr again because the previous execute can unbind itself - if(m_aapKeyBindings[ActiveBind->m_ModifierMask][ActiveBind->m_Key]) - { - Console()->ExecuteLineStroked(1, m_aapKeyBindings[ActiveBind->m_ModifierMask][ActiveBind->m_Key]); - } - Handled = true; - } - } - - if(Event.m_Flags & IInput::FLAG_RELEASE) - { - const auto &&OnKeyRelease = [&](const CBindSlot &Bind) { - // Prevent binds from being deactivated while chat, console and menus are open, as these components will - // still allow key release events to be forwarded to this component, so the active binds can be cleared. - if(GameClient()->m_Chat.IsActive() || - !GameClient()->m_GameConsole.IsClosed() || - GameClient()->m_Menus.IsActive()) - { - return; - } - // Have to check for nullptr again because the previous execute can unbind itself - if(!m_aapKeyBindings[Bind.m_ModifierMask][Bind.m_Key]) - { - return; - } - Console()->ExecuteLineStroked(0, m_aapKeyBindings[Bind.m_ModifierMask][Bind.m_Key]); - }; - - // Release active bind that uses this primary key - auto ActiveBind = std::find_if(m_vActiveBinds.begin(), m_vActiveBinds.end(), [&](const CBindSlot &Bind) { - return Event.m_Key == Bind.m_Key; - }); - if(ActiveBind != m_vActiveBinds.end()) - { - OnKeyRelease(*ActiveBind); - m_vActiveBinds.erase(ActiveBind); - Handled = true; - } - - // Release all active binds that use this modifier key - if(KeyModifierMask != MODIFIER_NONE) - { - while(true) - { - auto ActiveModifierBind = std::find_if(m_vActiveBinds.begin(), m_vActiveBinds.end(), [&](const CBindSlot &Bind) { - return (Bind.m_ModifierMask & KeyModifierMask) != 0; - }); - if(ActiveModifierBind == m_vActiveBinds.end()) - break; - OnKeyRelease(*ActiveModifierBind); - m_vActiveBinds.erase(ActiveModifierBind); - Handled = true; - } - } - } - - return Handled; -} - -void CBinds::UnbindAll() -{ - for(auto &apKeyBinding : m_aapKeyBindings) - { - for(auto &pKeyBinding : apKeyBinding) - { - free(pKeyBinding); - pKeyBinding = nullptr; - } - } -} - -const char *CBinds::Get(int KeyId, int ModifierCombination) -{ - dbg_assert(KeyId >= KEY_FIRST && KeyId < KEY_LAST, "KeyId invalid"); - dbg_assert(ModifierCombination >= MODIFIER_NONE && ModifierCombination < MODIFIER_COMBINATION_COUNT, "ModifierCombination invalid"); - return m_aapKeyBindings[ModifierCombination][KeyId] ? m_aapKeyBindings[ModifierCombination][KeyId] : ""; -} - -void CBinds::GetKey(const char *pBindStr, char *pBuf, size_t BufSize) -{ - pBuf[0] = '\0'; - for(int Modifier = MODIFIER_NONE; Modifier < MODIFIER_COMBINATION_COUNT; Modifier++) - { - char aModifiers[128]; - GetKeyBindModifiersName(Modifier, aModifiers, sizeof(aModifiers)); - for(int KeyId = KEY_FIRST; KeyId < KEY_LAST; KeyId++) - { - const char *pBind = Get(KeyId, Modifier); - if(!pBind[0]) - continue; - - if(str_comp(pBind, pBindStr) == 0) - { - str_format(pBuf, BufSize, "%s%s", aModifiers, Input()->KeyName(KeyId)); - return; - } - } - } -} - -void CBinds::SetDefaults() -{ - UnbindAll(); - - Bind(KEY_F1, "toggle_local_console"); - Bind(KEY_F2, "toggle_remote_console"); - Bind(KEY_TAB, "+scoreboard"); - Bind(KEY_EQUALS, "+statboard"); - Bind(KEY_F10, "screenshot"); - - Bind(KEY_A, "+left"); - Bind(KEY_D, "+right"); - - Bind(KEY_SPACE, "+jump"); - Bind(KEY_MOUSE_1, "+fire"); - Bind(KEY_MOUSE_2, "+hook"); - Bind(KEY_LSHIFT, "+emote"); - Bind(KEY_RETURN, "+show_chat; chat all"); - Bind(KEY_RIGHT, "spectate_next"); - Bind(KEY_LEFT, "spectate_previous"); - Bind(KEY_RSHIFT, "+spectate"); - - Bind(KEY_1, "+weapon1"); - Bind(KEY_2, "+weapon2"); - Bind(KEY_3, "+weapon3"); - Bind(KEY_4, "+weapon4"); - Bind(KEY_5, "+weapon5"); - - Bind(KEY_MOUSE_WHEEL_UP, "+prevweapon"); - Bind(KEY_MOUSE_WHEEL_DOWN, "+nextweapon"); - - Bind(KEY_T, "+show_chat; chat all"); - Bind(KEY_Y, "+show_chat; chat team"); - Bind(KEY_U, "+show_chat"); - Bind(KEY_I, "+show_chat; chat all /c "); - - Bind(KEY_F3, "vote yes"); - Bind(KEY_F4, "vote no"); - - Bind(KEY_K, "kill"); - Bind(KEY_Q, "say /spec"); - Bind(KEY_P, "say /pause"); - - g_Config.m_ClDDRaceBindsSet = 0; - SetDDRaceBinds(false); -} - -void CBinds::OnConsoleInit() -{ - ConfigManager()->RegisterCallback(ConfigSaveCallback, this); - - Console()->Register("bind", "s[key] ?r[command]", CFGFLAG_CLIENT, ConBind, this, "Bind key to execute a command or view keybindings"); - Console()->Register("binds", "?s[key]", CFGFLAG_CLIENT, ConBinds, this, "Print command executed by this keybinding or all binds"); - Console()->Register("unbind", "s[key]", CFGFLAG_CLIENT, ConUnbind, this, "Unbind key"); - Console()->Register("unbindall", "", CFGFLAG_CLIENT, ConUnbindAll, this, "Unbind all keys"); - - SetDefaults(); -} - -void CBinds::ConBind(IConsole::IResult *pResult, void *pUserData) -{ - CBinds *pBinds = (CBinds *)pUserData; - const char *pBindStr = pResult->GetString(0); - const CBindSlot BindSlot = pBinds->GetBindSlot(pBindStr); - - if(!BindSlot.m_Key) - { - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "key %s not found", pBindStr); - pBinds->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "binds", aBuf, gs_BindPrintColor); - return; - } - - if(pResult->NumArguments() == 1) - { - char aBuf[256]; - const char *pKeyName = pResult->GetString(0); - - if(!pBinds->m_aapKeyBindings[BindSlot.m_ModifierMask][BindSlot.m_Key]) - str_format(aBuf, sizeof(aBuf), "%s (%d) is not bound", pKeyName, BindSlot.m_Key); - else - str_format(aBuf, sizeof(aBuf), "%s (%d) = %s", pKeyName, BindSlot.m_Key, pBinds->m_aapKeyBindings[BindSlot.m_ModifierMask][BindSlot.m_Key]); - - pBinds->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "binds", aBuf, gs_BindPrintColor); - return; - } - - pBinds->Bind(BindSlot.m_Key, pResult->GetString(1), false, BindSlot.m_ModifierMask); -} - -void CBinds::ConBinds(IConsole::IResult *pResult, void *pUserData) -{ - CBinds *pBinds = (CBinds *)pUserData; - if(pResult->NumArguments() == 1) - { - char aBuf[256]; - const char *pKeyName = pResult->GetString(0); - const CBindSlot BindSlot = pBinds->GetBindSlot(pKeyName); - if(!BindSlot.m_Key) - { - str_format(aBuf, sizeof(aBuf), "key '%s' not found", pKeyName); - pBinds->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "binds", aBuf, gs_BindPrintColor); - } - else - { - if(!pBinds->m_aapKeyBindings[BindSlot.m_ModifierMask][BindSlot.m_Key]) - str_format(aBuf, sizeof(aBuf), "%s (%d) is not bound", pKeyName, BindSlot.m_Key); - else - str_format(aBuf, sizeof(aBuf), "%s (%d) = %s", pKeyName, BindSlot.m_Key, pBinds->m_aapKeyBindings[BindSlot.m_ModifierMask][BindSlot.m_Key]); - - pBinds->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "binds", aBuf, gs_BindPrintColor); - } - } - else - { - char aBuf[1024]; - for(int Modifier = MODIFIER_NONE; Modifier < MODIFIER_COMBINATION_COUNT; Modifier++) - { - char aModifiers[128]; - GetKeyBindModifiersName(Modifier, aModifiers, sizeof(aModifiers)); - for(int Key = KEY_FIRST; Key < KEY_LAST; Key++) - { - if(!pBinds->m_aapKeyBindings[Modifier][Key]) - continue; - - str_format(aBuf, sizeof(aBuf), "%s%s (%d) = %s", aModifiers, pBinds->Input()->KeyName(Key), Key, pBinds->m_aapKeyBindings[Modifier][Key]); - pBinds->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "binds", aBuf, gs_BindPrintColor); - } - } - } -} - -void CBinds::ConUnbind(IConsole::IResult *pResult, void *pUserData) -{ - CBinds *pBinds = (CBinds *)pUserData; - const char *pKeyName = pResult->GetString(0); - const CBindSlot BindSlot = pBinds->GetBindSlot(pKeyName); - - if(!BindSlot.m_Key) - { - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "key %s not found", pKeyName); - pBinds->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "binds", aBuf, gs_BindPrintColor); - return; - } - - pBinds->Bind(BindSlot.m_Key, "", false, BindSlot.m_ModifierMask); -} - -void CBinds::ConUnbindAll(IConsole::IResult *pResult, void *pUserData) -{ - CBinds *pBinds = (CBinds *)pUserData; - pBinds->UnbindAll(); -} - -CBinds::CBindSlot CBinds::GetBindSlot(const char *pBindString) const -{ - int ModifierMask = MODIFIER_NONE; - char aMod[32]; - aMod[0] = '\0'; - const char *pKey = str_next_token(pBindString, "+", aMod, sizeof(aMod)); - while(aMod[0] && *(pKey)) - { - if(!str_comp_nocase(aMod, "shift")) - ModifierMask |= (1 << MODIFIER_SHIFT); - else if(!str_comp_nocase(aMod, "ctrl")) - ModifierMask |= (1 << MODIFIER_CTRL); - else if(!str_comp_nocase(aMod, "alt")) - ModifierMask |= (1 << MODIFIER_ALT); - else if(!str_comp_nocase(aMod, "gui")) - ModifierMask |= (1 << MODIFIER_GUI); - else - return {KEY_UNKNOWN, MODIFIER_NONE}; - - if(str_find(pKey + 1, "+")) - pKey = str_next_token(pKey + 1, "+", aMod, sizeof(aMod)); - else - break; - } - return {Input()->FindKeyByName(ModifierMask == MODIFIER_NONE ? aMod : pKey + 1), ModifierMask}; -} - -const char *CBinds::GetModifierName(int Modifier) -{ - switch(Modifier) - { - case MODIFIER_SHIFT: - return "shift"; - case MODIFIER_CTRL: - return "ctrl"; - case MODIFIER_ALT: - return "alt"; - case MODIFIER_GUI: - return "gui"; - case MODIFIER_NONE: - default: - return ""; - } -} - -void CBinds::GetKeyBindModifiersName(int ModifierCombination, char *pBuf, size_t BufSize) -{ - pBuf[0] = '\0'; - for(int k = 1; k < MODIFIER_COUNT; k++) - { - if(ModifierCombination & (1 << k)) - { - str_append(pBuf, GetModifierName(k), BufSize); - str_append(pBuf, "+", BufSize); - } - } -} - -void CBinds::ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData) -{ - CBinds *pSelf = (CBinds *)pUserData; - - pConfigManager->WriteLine("unbindall"); - for(int Modifier = MODIFIER_NONE; Modifier < MODIFIER_COMBINATION_COUNT; Modifier++) - { - char aModifiers[128]; - GetKeyBindModifiersName(Modifier, aModifiers, sizeof(aModifiers)); - for(int Key = KEY_FIRST; Key < KEY_LAST; Key++) - { - if(!pSelf->m_aapKeyBindings[Modifier][Key]) - continue; - - // worst case the str_escape can double the string length - int Size = str_length(pSelf->m_aapKeyBindings[Modifier][Key]) * 2 + 30; - char *pBuffer = (char *)malloc(Size); - char *pEnd = pBuffer + Size; - - str_format(pBuffer, Size, "bind %s%s \"", aModifiers, pSelf->Input()->KeyName(Key)); - // process the string. we need to escape some characters - char *pDst = pBuffer + str_length(pBuffer); - str_escape(&pDst, pSelf->m_aapKeyBindings[Modifier][Key], pEnd); - str_append(pBuffer, "\"", Size); - - pConfigManager->WriteLine(pBuffer); - free(pBuffer); - } - } -} - -// DDRace - -void CBinds::SetDDRaceBinds(bool FreeOnly) -{ - if(g_Config.m_ClDDRaceBindsSet < 1) - { - Bind(KEY_KP_PLUS, "zoom+", FreeOnly); - Bind(KEY_KP_MINUS, "zoom-", FreeOnly); - Bind(KEY_KP_MULTIPLY, "zoom", FreeOnly); - Bind(KEY_PAUSE, "say /pause", FreeOnly); - Bind(KEY_UP, "+jump", FreeOnly); - Bind(KEY_LEFT, "+left", FreeOnly); - Bind(KEY_RIGHT, "+right", FreeOnly); - Bind(KEY_LEFTBRACKET, "+prevweapon", FreeOnly); - Bind(KEY_RIGHTBRACKET, "+nextweapon", FreeOnly); - Bind(KEY_C, "say /rank", FreeOnly); - Bind(KEY_V, "say /info", FreeOnly); - Bind(KEY_B, "say /top5", FreeOnly); - Bind(KEY_S, "+showhookcoll", FreeOnly); - Bind(KEY_X, "toggle cl_dummy 0 1", FreeOnly); - Bind(KEY_H, "toggle cl_dummy_hammer 0 1", FreeOnly); - Bind(KEY_SLASH, "+show_chat; chat all /", FreeOnly); - Bind(KEY_PAGEUP, "toggle cl_overlay_entities 0 100", FreeOnly); - Bind(KEY_KP_0, "say /emote normal 999999", FreeOnly); - Bind(KEY_KP_1, "say /emote happy 999999", FreeOnly); - Bind(KEY_KP_2, "say /emote angry 999999", FreeOnly); - Bind(KEY_KP_3, "say /emote pain 999999", FreeOnly); - Bind(KEY_KP_4, "say /emote surprise 999999", FreeOnly); - Bind(KEY_KP_5, "say /emote blink 999999", FreeOnly); - Bind(KEY_MOUSE_3, "+spectate", FreeOnly); - Bind(KEY_MINUS, "spectate_previous", FreeOnly); - Bind(KEY_EQUALS, "spectate_next", FreeOnly); - } - - g_Config.m_ClDDRaceBindsSet = 1; -} diff --git a/src/game/client/components/binds.h b/src/game/client/components/binds.h deleted file mode 100644 index 21daf9c988..0000000000 --- a/src/game/client/components/binds.h +++ /dev/null @@ -1,88 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_BINDS_H -#define GAME_CLIENT_COMPONENTS_BINDS_H - -#include -#include - -#include - -#include - -class IConfigManager; - -class CBinds : public CComponent -{ - static void ConBind(IConsole::IResult *pResult, void *pUserData); - static void ConBinds(IConsole::IResult *pResult, void *pUserData); - static void ConUnbind(IConsole::IResult *pResult, void *pUserData); - static void ConUnbindAll(IConsole::IResult *pResult, void *pUserData); - class IConsole *GetConsole() const { return Console(); } - - static void ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData); - - class CBindSlot - { - public: - int m_Key; - int m_ModifierMask; - - CBindSlot(int Key, int ModifierMask) : - m_Key(Key), - m_ModifierMask(ModifierMask) - { - } - }; - CBindSlot GetBindSlot(const char *pBindString) const; - -public: - CBinds(); - ~CBinds(); - virtual int Sizeof() const override { return sizeof(*this); } - - class CBindsSpecial : public CComponent - { - public: - CBinds *m_pBinds; - virtual int Sizeof() const override { return sizeof(*this); } - virtual bool OnInput(const IInput::CEvent &Event) override; - }; - - bool m_MouseOnAction; - - enum - { - MODIFIER_NONE = 0, - MODIFIER_CTRL, - MODIFIER_ALT, - MODIFIER_SHIFT, - MODIFIER_GUI, - MODIFIER_COUNT, - MODIFIER_COMBINATION_COUNT = 1 << MODIFIER_COUNT - }; - - CBindsSpecial m_SpecialBinds; - - void Bind(int KeyId, const char *pStr, bool FreeOnly = false, int ModifierCombination = MODIFIER_NONE); - void SetDefaults(); - void UnbindAll(); - const char *Get(int KeyId, int ModifierCombination); - void GetKey(const char *pBindStr, char *pBuf, size_t BufSize); - static int GetModifierMask(IInput *pInput); - static int GetModifierMaskOfKey(int Key); - static const char *GetModifierName(int Modifier); - static void GetKeyBindModifiersName(int ModifierCombination, char *pBuf, size_t BufSize); - - virtual void OnConsoleInit() override; - virtual bool OnInput(const IInput::CEvent &Event) override; - - // DDRace - - void SetDDRaceBinds(bool FreeOnly); - -private: - char *m_aapKeyBindings[MODIFIER_COMBINATION_COUNT][KEY_LAST]; - std::vector m_vActiveBinds; -}; -#endif diff --git a/src/game/client/components/broadcast.cpp b/src/game/client/components/broadcast.cpp deleted file mode 100644 index 87a1c0f604..0000000000 --- a/src/game/client/components/broadcast.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include -#include - -#include - -#include - -#include -#include - -#include "broadcast.h" - -void CBroadcast::OnReset() -{ - m_BroadcastTick = 0; - m_BroadcastRenderOffset = -1.0f; - TextRender()->DeleteTextContainer(m_TextContainerIndex); -} - -void CBroadcast::OnWindowResize() -{ - m_BroadcastRenderOffset = -1.0f; - TextRender()->DeleteTextContainer(m_TextContainerIndex); -} - -void CBroadcast::OnRender() -{ - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - RenderServerBroadcast(); -} - -void CBroadcast::RenderServerBroadcast() -{ - if(m_pClient->m_Scoreboard.Active() || m_pClient->m_Motd.IsActive() || !g_Config.m_ClShowBroadcasts) - return; - const float SecondsRemaining = (m_BroadcastTick - Client()->GameTick(g_Config.m_ClDummy)) / (float)Client()->GameTickSpeed(); - if(SecondsRemaining <= 0.0f) - { - TextRender()->DeleteTextContainer(m_TextContainerIndex); - return; - } - - const float Height = 300.0f; - const float Width = Height * Graphics()->ScreenAspect(); - Graphics()->MapScreen(0.0f, 0.0f, Width, Height); - - if(m_BroadcastRenderOffset < 0.0f) - m_BroadcastRenderOffset = Width / 2.0f - TextRender()->TextWidth(12.0f, m_aBroadcastText, -1, Width) / 2.0f; - - if(!m_TextContainerIndex.Valid()) - { - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, m_BroadcastRenderOffset, 40.0f, 12.0f, TEXTFLAG_RENDER); - Cursor.m_LineWidth = Width; - TextRender()->CreateTextContainer(m_TextContainerIndex, &Cursor, m_aBroadcastText); - } - if(m_TextContainerIndex.Valid()) - { - const float Alpha = SecondsRemaining >= 1.0f ? 1.0f : SecondsRemaining; - ColorRGBA TextColor = TextRender()->DefaultTextColor(); - TextColor.a *= Alpha; - ColorRGBA OutlineColor = TextRender()->DefaultTextOutlineColor(); - OutlineColor.a *= Alpha; - TextRender()->RenderTextContainer(m_TextContainerIndex, TextColor, OutlineColor); - } -} - -void CBroadcast::OnMessage(int MsgType, void *pRawMsg) -{ - if(MsgType == NETMSGTYPE_SV_BROADCAST) - { - const CNetMsg_Sv_Broadcast *pMsg = (CNetMsg_Sv_Broadcast *)pRawMsg; - DoBroadcast(pMsg->m_pMessage); - } -} - -void CBroadcast::DoBroadcast(const char *pText) -{ - str_copy(m_aBroadcastText, pText); - m_BroadcastTick = Client()->GameTick(g_Config.m_ClDummy) + Client()->GameTickSpeed() * 10; - m_BroadcastRenderOffset = -1.0f; - TextRender()->DeleteTextContainer(m_TextContainerIndex); - - if(g_Config.m_ClPrintBroadcasts) - { - char aLine[sizeof(m_aBroadcastText)]; - while((pText = str_next_token(pText, "\n", aLine, sizeof(aLine)))) - { - if(aLine[0] != '\0') - { - m_pClient->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "broadcast", aLine, color_cast(ColorHSLA(g_Config.m_ClMessageHighlightColor))); - } - } - } -} diff --git a/src/game/client/components/broadcast.h b/src/game/client/components/broadcast.h deleted file mode 100644 index 11942764dd..0000000000 --- a/src/game/client/components/broadcast.h +++ /dev/null @@ -1,32 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_BROADCAST_H -#define GAME_CLIENT_COMPONENTS_BROADCAST_H - -#include -#include - -#include - -class CBroadcast : public CComponent -{ - // broadcasts - char m_aBroadcastText[1024]; - int m_BroadcastTick; - float m_BroadcastRenderOffset; - STextContainerIndex m_TextContainerIndex; - - void RenderServerBroadcast(); - void OnBroadcastMessage(const CNetMsg_Sv_Broadcast *pMsg); - -public: - virtual int Sizeof() const override { return sizeof(*this); } - virtual void OnReset() override; - virtual void OnWindowResize() override; - virtual void OnRender() override; - virtual void OnMessage(int MsgType, void *pRawMsg) override; - - void DoBroadcast(const char *pText); -}; - -#endif diff --git a/src/game/client/components/camera.cpp b/src/game/client/components/camera.cpp deleted file mode 100644 index 5f2fba738b..0000000000 --- a/src/game/client/components/camera.cpp +++ /dev/null @@ -1,629 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include - -#include -#include -#include -#include -#include -#include - -#include "camera.h" -#include "controls.h" - -#include - -CCamera::CCamera() -{ - m_CamType = CAMTYPE_UNDEFINED; - m_ZoomSet = false; - m_Zoom = 1.0f; - m_Zooming = false; - m_ForceFreeview = false; - m_GotoSwitchOffset = 0; - m_GotoTeleOffset = 0; - m_GotoSwitchLastPos = ivec2(-1, -1); - m_GotoTeleLastPos = ivec2(-1, -1); - - mem_zero(m_aLastPos, sizeof(m_aLastPos)); - m_PrevCenter = vec2(0, 0); - m_Center = vec2(0, 0); - - m_PrevSpecId = -1; - m_WasSpectating = false; - - m_CameraSmoothing = false; - - m_LastTargetPos = vec2(0, 0); - m_DyncamTargetCameraOffset = vec2(0, 0); - mem_zero(m_aDyncamCurrentCameraOffset, sizeof(m_aDyncamCurrentCameraOffset)); - m_DyncamSmoothingSpeedBias = 0.5f; - - m_AutoSpecCamera = true; - m_AutoSpecCameraZooming = false; - m_UsingAutoSpecCamera = false; -} - -float CCamera::CameraSmoothingProgress(float CurrentTime) const -{ - float Progress = (CurrentTime - m_CameraSmoothingStart) / (m_CameraSmoothingEnd - m_CameraSmoothingStart); - return 1.0 - std::pow(2.0, -10.0 * Progress); -} - -float CCamera::ZoomProgress(float CurrentTime) const -{ - return (CurrentTime - m_ZoomSmoothingStart) / (m_ZoomSmoothingEnd - m_ZoomSmoothingStart); -} - -void CCamera::ScaleZoom(float Factor) -{ - float CurrentTarget = m_Zooming ? m_ZoomSmoothingTarget : m_Zoom; - ChangeZoom(CurrentTarget * Factor, m_pClient->m_Snap.m_SpecInfo.m_Active && GameClient()->m_MultiViewActivated ? g_Config.m_ClMultiViewZoomSmoothness : g_Config.m_ClSmoothZoomTime, true); - - if(m_IsSpectatingPlayer) - { - m_AutoSpecCamera = false; - } -} - -float CCamera::MaxZoomLevel() -{ - return (g_Config.m_ClLimitMaxZoomLevel) ? ((Graphics()->IsTileBufferingEnabled() ? 240 : 30)) : std::numeric_limits::max(); -} - -float CCamera::MinZoomLevel() -{ - return 0.01f; -} - -void CCamera::ChangeZoom(float Target, int Smoothness, bool IsUser) -{ - if(Target > MaxZoomLevel() || Target < MinZoomLevel()) - { - return; - } - - float Now = Client()->LocalTime(); - float Current = m_Zoom; - float Derivative = 0.0f; - if(m_Zooming) - { - float Progress = ZoomProgress(Now); - Current = m_ZoomSmoothing.Evaluate(Progress); - Derivative = m_ZoomSmoothing.Derivative(Progress); - } - - m_ZoomSmoothingTarget = Target; - m_ZoomSmoothing = CCubicBezier::With(Current, Derivative, 0, m_ZoomSmoothingTarget); - m_ZoomSmoothingStart = Now; - m_ZoomSmoothingEnd = Now + (float)Smoothness / 1000; - - if(IsUser) - m_UserZoomTarget = Target; - - m_Zooming = true; -} - -void CCamera::ResetAutoSpecCamera() -{ - m_AutoSpecCamera = true; -} - -void CCamera::UpdateCamera() -{ - // use hardcoded smooth camera for spectating unless player explictly turn it off - bool IsSpectatingPlayer = !GameClient()->m_MultiViewActivated; - if(Client()->State() == IClient::STATE_DEMOPLAYBACK) - { - IsSpectatingPlayer = IsSpectatingPlayer && m_pClient->m_Snap.m_SpecInfo.m_SpectatorId >= 0; - } - else - { - IsSpectatingPlayer = IsSpectatingPlayer && m_pClient->m_Snap.m_SpecInfo.m_Active && - m_pClient->m_Snap.m_SpecInfo.m_SpectatorId >= 0 && - m_pClient->m_Snap.m_SpecInfo.m_SpectatorId != m_pClient->m_aLocalIds[0] && - (!m_pClient->Client()->DummyConnected() || m_pClient->m_Snap.m_SpecInfo.m_SpectatorId != m_pClient->m_aLocalIds[1]); - } - - bool UsingAutoSpecCamera = m_AutoSpecCamera && CanUseAutoSpecCamera(); - float CurrentZoom = m_Zooming ? m_ZoomSmoothingTarget : m_Zoom; - - if(IsSpectatingPlayer && UsingAutoSpecCamera && CurrentZoom != m_pClient->m_Snap.m_SpecInfo.m_Zoom) - { - bool ChangeTarget = m_PrevSpecId != m_pClient->m_Snap.m_SpecInfo.m_SpectatorId; - float SmoothTime = ChangeTarget ? g_Config.m_ClSmoothSpectatingTime : 250; - ChangeZoom(m_pClient->m_Snap.m_SpecInfo.m_Zoom, SmoothTime, false); - - // it is auto spec camera zooming if only the zoom is changed during activation, not at the start of the activation - m_AutoSpecCameraZooming = !ChangeTarget && IsSpectatingPlayer && m_UsingAutoSpecCamera; - - // snap zoom when going in and out of spectating - if(!m_WasSpectating) - { - m_Zoom = m_ZoomSmoothingTarget; - m_Zooming = false; - } - } - else if((IsSpectatingPlayer && !UsingAutoSpecCamera) && CurrentZoom != m_UserZoomTarget) - { - ChangeZoom(m_UserZoomTarget, g_Config.m_ClSmoothZoomTime, false); - m_AutoSpecCameraZooming = false; - } - else if(!IsSpectatingPlayer && CurrentZoom != m_UserZoomTarget) - { - ChangeZoom(m_UserZoomTarget, GameClient()->m_MultiViewActivated ? g_Config.m_ClMultiViewZoomSmoothness : g_Config.m_ClSmoothZoomTime, false); - m_AutoSpecCameraZooming = false; - - // snap zoom when going in and out of spectating - if(m_WasSpectating && !m_pClient->m_Snap.m_SpecInfo.m_Active) - { - m_Zoom = m_ZoomSmoothingTarget; - m_Zooming = false; - } - } - - if(m_Zooming) - { - float Time = Client()->LocalTime(); - if(Time >= m_ZoomSmoothingEnd) - { - m_Zoom = m_ZoomSmoothingTarget; - m_Zooming = false; - m_AutoSpecCameraZooming = false; - } - else - { - const float OldLevel = m_Zoom; - m_Zoom = m_ZoomSmoothing.Evaluate(ZoomProgress(Time)); - if((OldLevel < m_ZoomSmoothingTarget && m_Zoom > m_ZoomSmoothingTarget) || (OldLevel > m_ZoomSmoothingTarget && m_Zoom < m_ZoomSmoothingTarget)) - { - m_Zoom = m_ZoomSmoothingTarget; - m_Zooming = false; - m_AutoSpecCameraZooming = false; - } - } - m_Zoom = clamp(m_Zoom, MinZoomLevel(), MaxZoomLevel()); - } - - if(!ZoomAllowed()) - { - m_ZoomSet = false; - m_Zoom = 1.0f; - m_Zooming = false; - m_AutoSpecCameraZooming = false; - } - else if(!m_ZoomSet && g_Config.m_ClDefaultZoom != 10) - { - m_ZoomSet = true; - OnReset(); - } - - if(m_pClient->m_Snap.m_SpecInfo.m_Active && !m_pClient->m_Snap.m_SpecInfo.m_UsePosition) - { - m_aDyncamCurrentCameraOffset[g_Config.m_ClDummy] = vec2(0, 0); - m_IsSpectatingPlayer = IsSpectatingPlayer; - m_UsingAutoSpecCamera = UsingAutoSpecCamera; - return; - } - - vec2 TargetPos = IsSpectatingPlayer ? m_pClient->m_CursorInfo.Target() : m_pClient->m_Controls.m_aMousePos[g_Config.m_ClDummy]; - int Smoothness = IsSpectatingPlayer ? 50 : g_Config.m_ClDyncamSmoothness; - int Stabilizing = IsSpectatingPlayer ? 50 : g_Config.m_ClDyncamStabilizing; - bool IsDyncam = IsSpectatingPlayer ? true : g_Config.m_ClDyncam; - - float DeltaTime = Client()->RenderFrameTime(); - - if(Smoothness > 0) - { - float CameraSpeed = (1.0f - (Smoothness / 100.0f)) * 9.5f + 0.5f; - float CameraStabilizingFactor = 1 + Stabilizing / 100.0f; - - m_DyncamSmoothingSpeedBias += CameraSpeed * DeltaTime; - if(IsDyncam) - { - m_DyncamSmoothingSpeedBias -= length(TargetPos - m_LastTargetPos) * std::log10(CameraStabilizingFactor) * 0.02f; - m_DyncamSmoothingSpeedBias = clamp(m_DyncamSmoothingSpeedBias, 0.5f, CameraSpeed); - } - else - { - m_DyncamSmoothingSpeedBias = maximum(5.0f, CameraSpeed); // make sure toggle back is fast - } - } - - m_DyncamTargetCameraOffset = vec2(0, 0); - float l = length(TargetPos); - if(l > 0.0001f) // make sure that this isn't 0 - { - float CurrentDeadzone = Deadzone(); - float CurrentFollowFactor = FollowFactor(); - - // use provided camera setting from server - if(IsSpectatingPlayer) - { - CurrentDeadzone = m_pClient->m_Snap.m_SpecInfo.m_Deadzone; - CurrentFollowFactor = m_pClient->m_Snap.m_SpecInfo.m_FollowFactor; - - if(!UsingAutoSpecCamera) - { - // turn off dyncam if user zooms when spectating - CurrentDeadzone = 0; - CurrentFollowFactor = 0; - } - } - - float OffsetAmount = maximum(l - CurrentDeadzone, 0.0f) * (CurrentFollowFactor / 100.0f); - m_DyncamTargetCameraOffset = normalize(TargetPos) * OffsetAmount; - } - - m_LastTargetPos = TargetPos; - vec2 CurrentCameraOffset = m_aDyncamCurrentCameraOffset[g_Config.m_ClDummy]; - float SpeedBias = m_CameraSmoothing ? 50.0f : m_DyncamSmoothingSpeedBias; - if(Smoothness > 0) - CurrentCameraOffset += (m_DyncamTargetCameraOffset - CurrentCameraOffset) * minimum(DeltaTime * SpeedBias, 1.0f); - else - CurrentCameraOffset = m_DyncamTargetCameraOffset; - - // directly put the camera in place when switching in and out of freeview or spectate mode - if(m_IsSpectatingPlayer != IsSpectatingPlayer) - { - CurrentCameraOffset = m_DyncamTargetCameraOffset; - } - - m_aDyncamCurrentCameraOffset[g_Config.m_ClDummy] = CurrentCameraOffset; - m_IsSpectatingPlayer = IsSpectatingPlayer; - m_UsingAutoSpecCamera = UsingAutoSpecCamera; -} - -void CCamera::OnRender() -{ - if(m_CameraSmoothing) - { - if(!m_pClient->m_Snap.m_SpecInfo.m_Active) - { - m_Center = m_CameraSmoothingTarget; - m_CameraSmoothing = false; - } - else - { - float Time = Client()->LocalTime(); - if(Time >= m_CameraSmoothingEnd) - { - m_Center = m_CameraSmoothingTarget; - m_CameraSmoothing = false; - } - else - { - m_CameraSmoothingCenter = vec2(m_CameraSmoothingBezierX.Evaluate(CameraSmoothingProgress(Time)), m_CameraSmoothingBezierY.Evaluate(CameraSmoothingProgress(Time))); - if(distance(m_CameraSmoothingCenter, m_CameraSmoothingTarget) <= 0.1f) - { - m_Center = m_CameraSmoothingTarget; - m_CameraSmoothing = false; - } - } - } - } - - // update camera center - if(m_pClient->m_Snap.m_SpecInfo.m_Active && !m_pClient->m_Snap.m_SpecInfo.m_UsePosition) - { - if(m_CamType != CAMTYPE_SPEC) - { - m_aLastPos[g_Config.m_ClDummy] = m_pClient->m_Controls.m_aMousePos[g_Config.m_ClDummy]; - m_pClient->m_Controls.m_aMousePos[g_Config.m_ClDummy] = m_PrevCenter; - m_pClient->m_Controls.ClampMousePos(); - m_CamType = CAMTYPE_SPEC; - } - m_Center = m_pClient->m_Controls.m_aMousePos[g_Config.m_ClDummy]; - } - else - { - if(m_CamType != CAMTYPE_PLAYER) - { - m_pClient->m_Controls.m_aMousePos[g_Config.m_ClDummy] = m_aLastPos[g_Config.m_ClDummy]; - m_pClient->m_Controls.ClampMousePos(); - m_CamType = CAMTYPE_PLAYER; - } - - if(m_pClient->m_Snap.m_SpecInfo.m_Active) - m_Center = m_pClient->m_Snap.m_SpecInfo.m_Position + m_aDyncamCurrentCameraOffset[g_Config.m_ClDummy]; - else - m_Center = m_pClient->m_LocalCharacterPos + m_aDyncamCurrentCameraOffset[g_Config.m_ClDummy]; - } - - if(m_ForceFreeview && m_CamType == CAMTYPE_SPEC) - { - m_Center = m_pClient->m_Controls.m_aMousePos[g_Config.m_ClDummy] = m_ForceFreeviewPos; - m_ForceFreeview = false; - } - else - m_ForceFreeviewPos = m_Center; - - const int SpecId = m_pClient->m_Snap.m_SpecInfo.m_SpectatorId; - - // start smoothing from the current position when the target changes - if(m_CameraSmoothing && SpecId != m_PrevSpecId) - m_CameraSmoothing = false; - - if(m_pClient->m_Snap.m_SpecInfo.m_Active && - (SpecId != m_PrevSpecId || - (m_CameraSmoothing && m_CameraSmoothingTarget != m_Center)) && // the target is moving during camera smoothing - !(!m_WasSpectating && m_Center != m_PrevCenter) && // dont smooth when starting to spectate - m_CamType != CAMTYPE_SPEC && - !GameClient()->m_MultiViewActivated) - { - float Now = Client()->LocalTime(); - if(!m_CameraSmoothing) - m_CenterBeforeSmoothing = m_PrevCenter; - - vec2 Derivative = {0.f, 0.f}; - if(m_CameraSmoothing) - { - float Progress = CameraSmoothingProgress(Now); - Derivative.x = m_CameraSmoothingBezierX.Derivative(Progress); - Derivative.y = m_CameraSmoothingBezierY.Derivative(Progress); - } - - m_CameraSmoothingTarget = m_Center; - m_CameraSmoothingBezierX = CCubicBezier::With(m_CenterBeforeSmoothing.x, Derivative.x, 0, m_CameraSmoothingTarget.x); - m_CameraSmoothingBezierY = CCubicBezier::With(m_CenterBeforeSmoothing.y, Derivative.y, 0, m_CameraSmoothingTarget.y); - - if(!m_CameraSmoothing) - { - m_CameraSmoothingStart = Now; - m_CameraSmoothingEnd = Now + (float)g_Config.m_ClSmoothSpectatingTime / 1000.0f; - } - - if(!m_CameraSmoothing) - m_CameraSmoothingCenter = m_PrevCenter; - - m_CameraSmoothing = true; - } - - if(m_CameraSmoothing) - m_Center = m_CameraSmoothingCenter; - - m_PrevCenter = m_Center; - m_PrevSpecId = SpecId; - m_WasSpectating = m_pClient->m_Snap.m_SpecInfo.m_Active; -} - -void CCamera::OnConsoleInit() -{ - Console()->Register("zoom+", "?f[amount]", CFGFLAG_CLIENT, ConZoomPlus, this, "Zoom increase"); - Console()->Register("zoom-", "?f[amount]", CFGFLAG_CLIENT, ConZoomMinus, this, "Zoom decrease"); - Console()->Register("zoom", "?f", CFGFLAG_CLIENT, ConZoom, this, "Change zoom"); - Console()->Register("set_view", "i[x]i[y]", CFGFLAG_CLIENT, ConSetView, this, "Set camera position to x and y in the map"); - Console()->Register("set_view_relative", "i[x]i[y]", CFGFLAG_CLIENT, ConSetViewRelative, this, "Set camera position relative to current view in the map"); - Console()->Register("goto_switch", "i[number]?i[offset]", CFGFLAG_CLIENT, ConGotoSwitch, this, "View switch found (at offset) with given number"); - Console()->Register("goto_tele", "i[number]?i[offset]", CFGFLAG_CLIENT, ConGotoTele, this, "View tele found (at offset) with given number"); -} - -void CCamera::OnReset() -{ - m_CameraSmoothing = false; - - m_Zoom = CCamera::ZoomStepsToValue(g_Config.m_ClDefaultZoom - 10); - m_Zooming = false; - m_AutoSpecCameraZooming = false; - m_UserZoomTarget = CCamera::ZoomStepsToValue(g_Config.m_ClDefaultZoom - 10); -} - -void CCamera::ConZoomPlus(IConsole::IResult *pResult, void *pUserData) -{ - CCamera *pSelf = (CCamera *)pUserData; - if(!pSelf->ZoomAllowed()) - return; - - float ZoomAmount = pResult->NumArguments() ? pResult->GetFloat(0) : 1.0f; - - pSelf->ScaleZoom(CCamera::ZoomStepsToValue(ZoomAmount)); - - if(pSelf->GameClient()->m_MultiViewActivated) - pSelf->GameClient()->m_MultiViewPersonalZoom += ZoomAmount; -} -void CCamera::ConZoomMinus(IConsole::IResult *pResult, void *pUserData) -{ - CCamera *pSelf = (CCamera *)pUserData; - if(!pSelf->ZoomAllowed()) - return; - - float ZoomAmount = pResult->NumArguments() ? pResult->GetFloat(0) : 1.0f; - ZoomAmount *= -1.0f; - - pSelf->ScaleZoom(CCamera::ZoomStepsToValue(ZoomAmount)); - - if(pSelf->GameClient()->m_MultiViewActivated) - pSelf->GameClient()->m_MultiViewPersonalZoom += ZoomAmount; -} -void CCamera::ConZoom(IConsole::IResult *pResult, void *pUserData) -{ - CCamera *pSelf = (CCamera *)pUserData; - if(!pSelf->ZoomAllowed()) - return; - - bool IsReset = !pResult->NumArguments(); - bool IsSpectating = pSelf->m_IsSpectatingPlayer; - - float TargetLevel = !IsReset ? pResult->GetFloat(0) : g_Config.m_ClDefaultZoom; - if(IsSpectating && IsReset) - pSelf->ResetAutoSpecCamera(); - else - pSelf->ChangeZoom(CCamera::ZoomStepsToValue(TargetLevel - 10.0f), pSelf->m_pClient->m_Snap.m_SpecInfo.m_Active && pSelf->GameClient()->m_MultiViewActivated ? g_Config.m_ClMultiViewZoomSmoothness : g_Config.m_ClSmoothZoomTime, true); - - if(IsSpectating && !IsReset) - { - pSelf->m_AutoSpecCamera = false; - } - - if(pSelf->GameClient()->m_MultiViewActivated && pSelf->m_pClient->m_Snap.m_SpecInfo.m_Active) - pSelf->GameClient()->m_MultiViewPersonalZoom = TargetLevel - 10.0f; -} -void CCamera::ConSetView(IConsole::IResult *pResult, void *pUserData) -{ - CCamera *pSelf = (CCamera *)pUserData; - // wait until free view camera type to update the position - pSelf->SetView(ivec2(pResult->GetInteger(0), pResult->GetInteger(1))); -} -void CCamera::ConSetViewRelative(IConsole::IResult *pResult, void *pUserData) -{ - CCamera *pSelf = (CCamera *)pUserData; - // wait until free view camera type to update the position - pSelf->SetView(ivec2(pResult->GetInteger(0), pResult->GetInteger(1)), true); -} -void CCamera::ConGotoSwitch(IConsole::IResult *pResult, void *pUserData) -{ - CCamera *pSelf = (CCamera *)pUserData; - pSelf->GotoSwitch(pResult->GetInteger(0), pResult->NumArguments() > 1 ? pResult->GetInteger(1) : -1); -} -void CCamera::ConGotoTele(IConsole::IResult *pResult, void *pUserData) -{ - CCamera *pSelf = (CCamera *)pUserData; - pSelf->GotoTele(pResult->GetInteger(0), pResult->NumArguments() > 1 ? pResult->GetInteger(1) : -1); -} - -void CCamera::SetView(ivec2 Pos, bool Relative) -{ - vec2 RealPos = vec2(Pos.x * 32.0, Pos.y * 32.0); - vec2 UntestedViewPos = Relative ? m_ForceFreeviewPos + RealPos : RealPos; - - m_ForceFreeview = true; - - m_ForceFreeviewPos = vec2( - clamp(UntestedViewPos.x, 200.0f, Collision()->GetWidth() * 32 - 200.0f), - clamp(UntestedViewPos.y, 200.0f, Collision()->GetWidth() * 32 - 200.0f)); -} - -void CCamera::GotoSwitch(int Number, int Offset) -{ - if(Collision()->SwitchLayer() == nullptr) - return; - - int Match = -1; - ivec2 MatchPos = ivec2(-1, -1); - - auto FindTile = [this, &Match, &MatchPos, &Number, &Offset]() { - for(int x = 0; x < Collision()->GetWidth(); x++) - { - for(int y = 0; y < Collision()->GetHeight(); y++) - { - int i = y * Collision()->GetWidth() + x; - if(Number == Collision()->GetSwitchNumber(i)) - { - Match++; - if(Offset != -1) - { - if(Match == Offset) - { - MatchPos = ivec2(x, y); - m_GotoSwitchOffset = Match; - return; - } - continue; - } - MatchPos = ivec2(x, y); - if(Match == m_GotoSwitchOffset) - return; - } - } - } - }; - FindTile(); - - if(MatchPos == ivec2(-1, -1)) - return; - if(Match < m_GotoSwitchOffset) - m_GotoSwitchOffset = -1; - SetView(MatchPos); - m_GotoSwitchOffset++; -} - -void CCamera::GotoTele(int Number, int Offset) -{ - if(Collision()->TeleLayer() == nullptr) - return; - Number--; - - if(m_GotoTeleLastNumber != Number) - m_GotoTeleLastPos = ivec2(-1, -1); - - ivec2 MatchPos = ivec2(-1, -1); - const size_t NumTeles = Collision()->TeleAllSize(Number); - if(!NumTeles) - { - log_error("camera", "No teleporter with number %d found.", Number + 1); - return; - } - - if(Offset != -1 || m_GotoTeleLastPos == ivec2(-1, -1)) - { - if((size_t)Offset >= NumTeles || Offset < 0) - Offset = 0; - vec2 Tele = Collision()->TeleAllGet(Number, Offset); - MatchPos = ivec2(Tele.x / 32, Tele.y / 32); - m_GotoTeleOffset = Offset; - } - else - { - bool FullRound = false; - do - { - vec2 Tele = Collision()->TeleAllGet(Number, m_GotoTeleOffset); - MatchPos = ivec2(Tele.x / 32, Tele.y / 32); - m_GotoTeleOffset++; - if((size_t)m_GotoTeleOffset >= NumTeles) - { - m_GotoTeleOffset = 0; - if(FullRound) - { - MatchPos = m_GotoTeleLastPos; - break; - } - else - { - FullRound = true; - } - } - } while(distance(m_GotoTeleLastPos, MatchPos) < 10.0f); - } - - if(MatchPos == ivec2(-1, -1)) - return; - m_GotoTeleLastPos = MatchPos; - m_GotoTeleLastNumber = Number; - SetView(MatchPos); -} - -void CCamera::SetZoom(float Target, int Smoothness, bool IsUser) -{ - ChangeZoom(Target, Smoothness, IsUser); -} - -bool CCamera::ZoomAllowed() const -{ - return GameClient()->m_Snap.m_SpecInfo.m_Active || - GameClient()->m_GameInfo.m_AllowZoom || - Client()->State() == IClient::STATE_DEMOPLAYBACK; -} - -int CCamera::Deadzone() const -{ - return g_Config.m_ClDyncam ? g_Config.m_ClDyncamDeadzone : g_Config.m_ClMouseDeadzone; -} - -int CCamera::FollowFactor() const -{ - return g_Config.m_ClDyncam ? g_Config.m_ClDyncamFollowFactor : g_Config.m_ClMouseFollowfactor; -} - -bool CCamera::CanUseAutoSpecCamera() const -{ - if(Client()->State() == IClient::STATE_DEMOPLAYBACK) - { - // only follow mode has the correct camera info - return m_pClient->m_Snap.m_SpecInfo.m_HasCameraInfo && m_pClient->m_DemoSpecId == SPEC_FOLLOW; - } - - return m_pClient->m_Snap.m_SpecInfo.m_HasCameraInfo && m_pClient->m_Snap.m_SpecInfo.m_SpectatorId != m_pClient->m_Snap.m_LocalClientId; -} diff --git a/src/game/client/components/camera.h b/src/game/client/components/camera.h deleted file mode 100644 index 088b9d6346..0000000000 --- a/src/game/client/components/camera.h +++ /dev/null @@ -1,127 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_CAMERA_H -#define GAME_CLIENT_COMPONENTS_CAMERA_H -#include -#include - -#include -#include - -#include - -class CCamera : public CComponent -{ - friend class CMenuBackground; - -public: - enum - { - CAMTYPE_UNDEFINED = -1, - CAMTYPE_SPEC, - CAMTYPE_PLAYER, - }; - -private: - int m_CamType; - vec2 m_aLastPos[NUM_DUMMIES]; - vec2 m_PrevCenter; - - int m_PrevSpecId; - bool m_WasSpectating; - - bool m_CameraSmoothing; - vec2 m_CameraSmoothingCenter; - vec2 m_CameraSmoothingTarget; - CCubicBezier m_CameraSmoothingBezierX; - CCubicBezier m_CameraSmoothingBezierY; - float m_CameraSmoothingStart; - float m_CameraSmoothingEnd; - vec2 m_CenterBeforeSmoothing; - - float CameraSmoothingProgress(float CurrentTime) const; - - CCubicBezier m_ZoomSmoothing; - float m_ZoomSmoothingStart; - float m_ZoomSmoothingEnd; - - void ScaleZoom(float Factor); - void ChangeZoom(float Target, int Smoothness, bool IsUser); - float ZoomProgress(float CurrentTime) const; - - float MinZoomLevel(); - float MaxZoomLevel(); - - vec2 m_LastTargetPos; - float m_DyncamSmoothingSpeedBias; - bool m_IsSpectatingPlayer; - bool m_UsingAutoSpecCamera; - -public: - static constexpr float ZOOM_STEP = 0.866025f; - - /** - * Convert zoom steps to zoom value - * - * @param Steps - Zoom steps, 0.0f converts to default zoom (returns 1.0f) - * @return converted zoom value - **/ - static inline float ZoomStepsToValue(float Steps) { return std::pow(CCamera::ZOOM_STEP, Steps); } - - vec2 m_Center; - bool m_ZoomSet; - bool m_Zooming; - float m_Zoom; - float m_ZoomSmoothingTarget; - - bool m_AutoSpecCameraZooming; - bool m_AutoSpecCamera; - float m_UserZoomTarget; - - vec2 m_DyncamTargetCameraOffset; - vec2 m_aDyncamCurrentCameraOffset[NUM_DUMMIES]; - - CCamera(); - virtual int Sizeof() const override { return sizeof(*this); } - virtual void OnRender() override; - - // DDRace - - virtual void OnConsoleInit() override; - virtual void OnReset() override; - - void SetView(ivec2 Pos, bool Relative = false); - void GotoSwitch(int Number, int Offset = -1); - void GotoTele(int Number, int Offset = -1); - - void SetZoom(float Target, int Smoothness, bool IsUser); - bool ZoomAllowed() const; - - int Deadzone() const; - int FollowFactor() const; - int CamType() const { return m_CamType; } - - void UpdateCamera(); - void ResetAutoSpecCamera(); - bool SpectatingPlayer() const { return m_IsSpectatingPlayer; } - bool CanUseAutoSpecCamera() const; - -private: - static void ConZoomPlus(IConsole::IResult *pResult, void *pUserData); - static void ConZoomMinus(IConsole::IResult *pResult, void *pUserData); - static void ConZoom(IConsole::IResult *pResult, void *pUserData); - static void ConSetView(IConsole::IResult *pResult, void *pUserData); - static void ConSetViewRelative(IConsole::IResult *pResult, void *pUserData); - static void ConGotoSwitch(IConsole::IResult *pResult, void *pUserData); - static void ConGotoTele(IConsole::IResult *pResult, void *pUserData); - - bool m_ForceFreeview; - vec2 m_ForceFreeviewPos; - int m_GotoSwitchOffset; - int m_GotoTeleOffset; - ivec2 m_GotoSwitchLastPos; - ivec2 m_GotoTeleLastPos; - int m_GotoTeleLastNumber = -1; -}; - -#endif diff --git a/src/game/client/components/chat.cpp b/src/game/client/components/chat.cpp deleted file mode 100644 index 0c357ec883..0000000000 --- a/src/game/client/components/chat.cpp +++ /dev/null @@ -1,1387 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "chat.h" - -char CChat::ms_aDisplayText[MAX_LINE_LENGTH] = {'\0'}; - -CChat::CChat() -{ - for(auto &Line : m_aLines) - { - // reset the container indices, so the text containers can be deleted on reset - Line.m_TextContainerIndex.Reset(); - Line.m_QuadContainerIndex = -1; - } - - m_Mode = MODE_NONE; - - m_Input.SetClipboardLineCallback([this](const char *pStr) { SendChatQueued(pStr); }); - m_Input.SetCalculateOffsetCallback([this]() { return m_IsInputCensored; }); - m_Input.SetDisplayTextCallback([this](char *pStr, size_t NumChars) { - m_IsInputCensored = false; - if( - g_Config.m_ClStreamerMode && - (str_startswith(pStr, "/login ") || - str_startswith(pStr, "/register ") || - str_startswith(pStr, "/code ") || - str_startswith(pStr, "/timeout ") || - str_startswith(pStr, "/save ") || - str_startswith(pStr, "/load "))) - { - bool Censor = false; - const size_t NumLetters = minimum(NumChars, sizeof(ms_aDisplayText) - 1); - for(size_t i = 0; i < NumLetters; ++i) - { - if(Censor) - ms_aDisplayText[i] = '*'; - else - ms_aDisplayText[i] = pStr[i]; - if(pStr[i] == ' ') - { - Censor = true; - m_IsInputCensored = true; - } - } - ms_aDisplayText[NumLetters] = '\0'; - return ms_aDisplayText; - } - return pStr; - }); -} - -void CChat::RegisterCommand(const char *pName, const char *pParams, const char *pHelpText) -{ - // Don't allow duplicate commands. - for(const auto &Command : m_vCommands) - if(str_comp(Command.m_aName, pName) == 0) - return; - - m_vCommands.emplace_back(pName, pParams, pHelpText); - m_CommandsNeedSorting = true; -} - -void CChat::UnregisterCommand(const char *pName) -{ - m_vCommands.erase(std::remove_if(m_vCommands.begin(), m_vCommands.end(), [pName](const CCommand &Command) { return str_comp(Command.m_aName, pName) == 0; }), m_vCommands.end()); -} - -void CChat::RebuildChat() -{ - for(auto &Line : m_aLines) - { - TextRender()->DeleteTextContainer(Line.m_TextContainerIndex); - Graphics()->DeleteQuadContainer(Line.m_QuadContainerIndex); - // recalculate sizes - Line.m_aYOffset[0] = -1.f; - Line.m_aYOffset[1] = -1.f; - } -} - -void CChat::ClearLines() -{ - for(auto &Line : m_aLines) - { - TextRender()->DeleteTextContainer(Line.m_TextContainerIndex); - Graphics()->DeleteQuadContainer(Line.m_QuadContainerIndex); - Line.m_Time = 0; - Line.m_aText[0] = 0; - Line.m_aName[0] = 0; - Line.m_Friend = false; - Line.m_TimesRepeated = 0; - Line.m_HasRenderTee = false; - } - m_PrevScoreBoardShowed = false; - m_PrevShowChat = false; -} - -void CChat::OnWindowResize() -{ - RebuildChat(); -} - -void CChat::Reset() -{ - ClearLines(); - - m_Show = false; - m_CompletionUsed = false; - m_CompletionChosen = -1; - m_aCompletionBuffer[0] = 0; - m_PlaceholderOffset = 0; - m_PlaceholderLength = 0; - m_pHistoryEntry = 0x0; - m_PendingChatCounter = 0; - m_LastChatSend = 0; - m_CurrentLine = 0; - m_IsInputCensored = false; - m_EditingNewLine = true; - m_ServerSupportsCommandInfo = false; - m_CommandsNeedSorting = false; - mem_zero(m_aCurrentInputText, sizeof(m_aCurrentInputText)); - DisableMode(); - m_vCommands.clear(); - - for(int64_t &LastSoundPlayed : m_aLastSoundPlayed) - LastSoundPlayed = 0; -} - -void CChat::OnRelease() -{ - m_Show = false; -} - -void CChat::OnStateChange(int NewState, int OldState) -{ - if(OldState <= IClient::STATE_CONNECTING) - Reset(); -} - -void CChat::ConSay(IConsole::IResult *pResult, void *pUserData) -{ - ((CChat *)pUserData)->SendChat(0, pResult->GetString(0)); -} - -void CChat::ConSayTeam(IConsole::IResult *pResult, void *pUserData) -{ - ((CChat *)pUserData)->SendChat(1, pResult->GetString(0)); -} - -void CChat::ConChat(IConsole::IResult *pResult, void *pUserData) -{ - const char *pMode = pResult->GetString(0); - if(str_comp(pMode, "all") == 0) - ((CChat *)pUserData)->EnableMode(0); - else if(str_comp(pMode, "team") == 0) - ((CChat *)pUserData)->EnableMode(1); - else - ((CChat *)pUserData)->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "console", "expected all or team as mode"); - - if(pResult->GetString(1)[0] || g_Config.m_ClChatReset) - ((CChat *)pUserData)->m_Input.Set(pResult->GetString(1)); -} - -void CChat::ConShowChat(IConsole::IResult *pResult, void *pUserData) -{ - ((CChat *)pUserData)->m_Show = pResult->GetInteger(0) != 0; -} - -void CChat::ConEcho(IConsole::IResult *pResult, void *pUserData) -{ - ((CChat *)pUserData)->Echo(pResult->GetString(0)); -} - -void CChat::ConClearChat(IConsole::IResult *pResult, void *pUserData) -{ - ((CChat *)pUserData)->ClearLines(); -} - -void CChat::ConchainChatOld(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - pfnCallback(pResult, pCallbackUserData); - ((CChat *)pUserData)->RebuildChat(); -} - -void CChat::ConchainChatFontSize(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - pfnCallback(pResult, pCallbackUserData); - CChat *pChat = (CChat *)pUserData; - pChat->EnsureCoherentWidth(); - pChat->RebuildChat(); -} - -void CChat::ConchainChatWidth(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - pfnCallback(pResult, pCallbackUserData); - CChat *pChat = (CChat *)pUserData; - pChat->EnsureCoherentFontSize(); - pChat->RebuildChat(); -} - -void CChat::Echo(const char *pString) -{ - AddLine(CLIENT_MSG, 0, pString); -} - -void CChat::OnConsoleInit() -{ - Console()->Register("say", "r[message]", CFGFLAG_CLIENT, ConSay, this, "Say in chat"); - Console()->Register("say_team", "r[message]", CFGFLAG_CLIENT, ConSayTeam, this, "Say in team chat"); - Console()->Register("chat", "s['team'|'all'] ?r[message]", CFGFLAG_CLIENT, ConChat, this, "Enable chat with all/team mode"); - Console()->Register("+show_chat", "", CFGFLAG_CLIENT, ConShowChat, this, "Show chat"); - Console()->Register("echo", "r[message]", CFGFLAG_CLIENT | CFGFLAG_STORE, ConEcho, this, "Echo the text in chat window"); - Console()->Register("clear_chat", "", CFGFLAG_CLIENT | CFGFLAG_STORE, ConClearChat, this, "Clear chat messages"); -} - -void CChat::OnInit() -{ - Reset(); - Console()->Chain("cl_chat_old", ConchainChatOld, this); - Console()->Chain("cl_chat_size", ConchainChatFontSize, this); - Console()->Chain("cl_chat_width", ConchainChatWidth, this); -} - -bool CChat::OnInput(const IInput::CEvent &Event) -{ - if(m_Mode == MODE_NONE) - return false; - - if(Event.m_Flags & IInput::FLAG_PRESS && Event.m_Key == KEY_ESCAPE) - { - DisableMode(); - m_pClient->OnRelease(); - if(g_Config.m_ClChatReset) - { - m_Input.Clear(); - m_pHistoryEntry = nullptr; - } - } - else if(Event.m_Flags & IInput::FLAG_PRESS && (Event.m_Key == KEY_RETURN || Event.m_Key == KEY_KP_ENTER)) - { - if(m_CommandsNeedSorting) - { - std::sort(m_vCommands.begin(), m_vCommands.end()); - m_CommandsNeedSorting = false; - } - - SendChatQueued(m_Input.GetString()); - m_pHistoryEntry = nullptr; - DisableMode(); - m_pClient->OnRelease(); - m_Input.Clear(); - } - if(Event.m_Flags & IInput::FLAG_PRESS && Event.m_Key == KEY_TAB) - { - const bool ShiftPressed = Input()->ShiftIsPressed(); - - // fill the completion buffer - if(!m_CompletionUsed) - { - const char *pCursor = m_Input.GetString() + m_Input.GetCursorOffset(); - for(size_t Count = 0; Count < m_Input.GetCursorOffset() && *(pCursor - 1) != ' '; --pCursor, ++Count) - ; - m_PlaceholderOffset = pCursor - m_Input.GetString(); - - for(m_PlaceholderLength = 0; *pCursor && *pCursor != ' '; ++pCursor) - ++m_PlaceholderLength; - - str_truncate(m_aCompletionBuffer, sizeof(m_aCompletionBuffer), m_Input.GetString() + m_PlaceholderOffset, m_PlaceholderLength); - } - - if(!m_CompletionUsed && m_aCompletionBuffer[0] != '/') - { - // Create the completion list of player names through which the player can iterate - const char *PlayerName, *FoundInput; - m_PlayerCompletionListLength = 0; - for(auto &PlayerInfo : m_pClient->m_Snap.m_apInfoByName) - { - if(PlayerInfo) - { - PlayerName = m_pClient->m_aClients[PlayerInfo->m_ClientId].m_aName; - FoundInput = str_utf8_find_nocase(PlayerName, m_aCompletionBuffer); - if(FoundInput != 0) - { - m_aPlayerCompletionList[m_PlayerCompletionListLength].ClientId = PlayerInfo->m_ClientId; - // The score for suggesting a player name is determined by the distance of the search input to the beginning of the player name - m_aPlayerCompletionList[m_PlayerCompletionListLength].Score = (int)(FoundInput - PlayerName); - m_PlayerCompletionListLength++; - } - } - } - std::stable_sort(m_aPlayerCompletionList, m_aPlayerCompletionList + m_PlayerCompletionListLength, - [](const CRateablePlayer &p1, const CRateablePlayer &p2) -> bool { - return p1.Score < p2.Score; - }); - } - - if(m_aCompletionBuffer[0] == '/' && !m_vCommands.empty()) - { - CCommand *pCompletionCommand = 0; - - const size_t NumCommands = m_vCommands.size(); - - if(ShiftPressed && m_CompletionUsed) - m_CompletionChosen--; - else if(!ShiftPressed) - m_CompletionChosen++; - m_CompletionChosen = (m_CompletionChosen + 2 * NumCommands) % (2 * NumCommands); - - m_CompletionUsed = true; - - const char *pCommandStart = m_aCompletionBuffer + 1; - for(size_t i = 0; i < 2 * NumCommands; ++i) - { - int SearchType; - int Index; - - if(ShiftPressed) - { - SearchType = ((m_CompletionChosen - i + 2 * NumCommands) % (2 * NumCommands)) / NumCommands; - Index = (m_CompletionChosen - i + NumCommands) % NumCommands; - } - else - { - SearchType = ((m_CompletionChosen + i) % (2 * NumCommands)) / NumCommands; - Index = (m_CompletionChosen + i) % NumCommands; - } - - auto &Command = m_vCommands[Index]; - - if(str_startswith_nocase(Command.m_aName, pCommandStart)) - { - pCompletionCommand = &Command; - m_CompletionChosen = Index + SearchType * NumCommands; - break; - } - } - - // insert the command - if(pCompletionCommand) - { - char aBuf[MAX_LINE_LENGTH]; - // add part before the name - str_truncate(aBuf, sizeof(aBuf), m_Input.GetString(), m_PlaceholderOffset); - - // add the command - str_append(aBuf, "/"); - str_append(aBuf, pCompletionCommand->m_aName); - - // add separator - const char *pSeparator = pCompletionCommand->m_aParams[0] == '\0' ? "" : " "; - str_append(aBuf, pSeparator); - - // add part after the name - str_append(aBuf, m_Input.GetString() + m_PlaceholderOffset + m_PlaceholderLength); - - m_PlaceholderLength = str_length(pSeparator) + str_length(pCompletionCommand->m_aName) + 1; - m_Input.Set(aBuf); - m_Input.SetCursorOffset(m_PlaceholderOffset + m_PlaceholderLength); - } - } - else - { - // find next possible name - const char *pCompletionString = 0; - if(m_PlayerCompletionListLength > 0) - { - // We do this in a loop, if a player left the game during the repeated pressing of Tab, they are skipped - CGameClient::CClientData *pCompletionClientData; - for(int i = 0; i < m_PlayerCompletionListLength; ++i) - { - if(ShiftPressed && m_CompletionUsed) - { - m_CompletionChosen--; - } - else if(!ShiftPressed) - { - m_CompletionChosen++; - } - if(m_CompletionChosen < 0) - { - m_CompletionChosen += m_PlayerCompletionListLength; - } - m_CompletionChosen %= m_PlayerCompletionListLength; - m_CompletionUsed = true; - - pCompletionClientData = &m_pClient->m_aClients[m_aPlayerCompletionList[m_CompletionChosen].ClientId]; - if(!pCompletionClientData->m_Active) - { - continue; - } - - pCompletionString = pCompletionClientData->m_aName; - break; - } - } - - // insert the name - if(pCompletionString) - { - char aBuf[MAX_LINE_LENGTH]; - // add part before the name - str_truncate(aBuf, sizeof(aBuf), m_Input.GetString(), m_PlaceholderOffset); - - // quote the name - char aQuoted[128]; - if(m_Input.GetString()[0] == '/' && (str_find(pCompletionString, " ") || str_find(pCompletionString, "\""))) - { - // escape the name - str_copy(aQuoted, "\""); - char *pDst = aQuoted + str_length(aQuoted); - str_escape(&pDst, pCompletionString, aQuoted + sizeof(aQuoted)); - str_append(aQuoted, "\""); - - pCompletionString = aQuoted; - } - - // add the name - str_append(aBuf, pCompletionString); - - // add separator - const char *pSeparator = ""; - if(*(m_Input.GetString() + m_PlaceholderOffset + m_PlaceholderLength) != ' ') - pSeparator = m_PlaceholderOffset == 0 ? ": " : " "; - else if(m_PlaceholderOffset == 0) - pSeparator = ":"; - if(*pSeparator) - str_append(aBuf, pSeparator); - - // add part after the name - str_append(aBuf, m_Input.GetString() + m_PlaceholderOffset + m_PlaceholderLength); - - m_PlaceholderLength = str_length(pSeparator) + str_length(pCompletionString); - m_Input.Set(aBuf); - m_Input.SetCursorOffset(m_PlaceholderOffset + m_PlaceholderLength); - } - } - } - else - { - // reset name completion process - if(Event.m_Flags & IInput::FLAG_PRESS && Event.m_Key != KEY_TAB && Event.m_Key != KEY_LSHIFT && Event.m_Key != KEY_RSHIFT) - { - m_CompletionChosen = -1; - m_CompletionUsed = false; - } - - m_Input.ProcessInput(Event); - } - - if(Event.m_Flags & IInput::FLAG_PRESS && Event.m_Key == KEY_UP) - { - if(m_EditingNewLine) - { - str_copy(m_aCurrentInputText, m_Input.GetString()); - m_EditingNewLine = false; - } - - if(m_pHistoryEntry) - { - CHistoryEntry *pTest = m_History.Prev(m_pHistoryEntry); - - if(pTest) - m_pHistoryEntry = pTest; - } - else - m_pHistoryEntry = m_History.Last(); - - if(m_pHistoryEntry) - m_Input.Set(m_pHistoryEntry->m_aText); - } - else if(Event.m_Flags & IInput::FLAG_PRESS && Event.m_Key == KEY_DOWN) - { - if(m_pHistoryEntry) - m_pHistoryEntry = m_History.Next(m_pHistoryEntry); - - if(m_pHistoryEntry) - { - m_Input.Set(m_pHistoryEntry->m_aText); - } - else if(!m_EditingNewLine) - { - m_Input.Set(m_aCurrentInputText); - m_EditingNewLine = true; - } - } - - return true; -} - -void CChat::EnableMode(int Team) -{ - if(Client()->State() == IClient::STATE_DEMOPLAYBACK) - return; - - if(m_Mode == MODE_NONE) - { - if(Team) - m_Mode = MODE_TEAM; - else - m_Mode = MODE_ALL; - - Input()->Clear(); - m_CompletionChosen = -1; - m_CompletionUsed = false; - m_Input.Activate(EInputPriority::CHAT); - } -} - -void CChat::DisableMode() -{ - if(m_Mode != MODE_NONE) - { - m_Mode = MODE_NONE; - m_Input.Deactivate(); - } -} - -void CChat::OnMessage(int MsgType, void *pRawMsg) -{ - if(m_pClient->m_SuppressEvents) - return; - - if(MsgType == NETMSGTYPE_SV_CHAT) - { - CNetMsg_Sv_Chat *pMsg = (CNetMsg_Sv_Chat *)pRawMsg; - AddLine(pMsg->m_ClientId, pMsg->m_Team, pMsg->m_pMessage); - } - else if(MsgType == NETMSGTYPE_SV_COMMANDINFO) - { - CNetMsg_Sv_CommandInfo *pMsg = (CNetMsg_Sv_CommandInfo *)pRawMsg; - if(!m_ServerSupportsCommandInfo) - { - m_vCommands.clear(); - m_ServerSupportsCommandInfo = true; - } - RegisterCommand(pMsg->m_pName, pMsg->m_pArgsFormat, pMsg->m_pHelpText); - } - else if(MsgType == NETMSGTYPE_SV_COMMANDINFOREMOVE) - { - CNetMsg_Sv_CommandInfoRemove *pMsg = (CNetMsg_Sv_CommandInfoRemove *)pRawMsg; - UnregisterCommand(pMsg->m_pName); - } -} - -bool CChat::LineShouldHighlight(const char *pLine, const char *pName) -{ - const char *pHit = str_utf8_find_nocase(pLine, pName); - - while(pHit) - { - int Length = str_length(pName); - - if(Length > 0 && (pLine == pHit || pHit[-1] == ' ') && (pHit[Length] == 0 || pHit[Length] == ' ' || pHit[Length] == '.' || pHit[Length] == '!' || pHit[Length] == ',' || pHit[Length] == '?' || pHit[Length] == ':')) - return true; - - pHit = str_utf8_find_nocase(pHit + 1, pName); - } - - return false; -} - -#define SAVES_FILE "ddnet-saves.txt" -const char *SAVES_HEADER[] = { - "Time", - "Player", - "Map", - "Code", -}; - -void CChat::StoreSave(const char *pText) -{ - const char *pStart = str_find(pText, "Team successfully saved by "); - const char *pMid = str_find(pText, ". Use '/load "); - const char *pOn = str_find(pText, "' on "); - const char *pEnd = str_find(pText, pOn ? " to continue" : "' to continue"); - - if(!pStart || !pMid || !pEnd || pMid < pStart || pEnd < pMid || (pOn && (pOn < pMid || pEnd < pOn))) - return; - - char aName[16]; - str_truncate(aName, sizeof(aName), pStart + 27, pMid - pStart - 27); - - char aSaveCode[64]; - - str_truncate(aSaveCode, sizeof(aSaveCode), pMid + 13, (pOn ? pOn : pEnd) - pMid - 13); - - char aTimestamp[20]; - str_timestamp_format(aTimestamp, sizeof(aTimestamp), FORMAT_SPACE); - - // TODO: Find a simple way to get the names of team members. This doesn't - // work since team is killed first, then save message gets sent: - /* - for(int i = 0; i < MAX_CLIENTS; i++) - { - const CNetObj_PlayerInfo *pInfo = GameClient()->m_Snap.m_paInfoByDDTeam[i]; - if(!pInfo) - continue; - pInfo->m_Team // All 0 - } - */ - - const bool SavesFileExists = Storage()->FileExists(SAVES_FILE, IStorage::TYPE_SAVE); - IOHANDLE File = Storage()->OpenFile(SAVES_FILE, IOFLAG_APPEND, IStorage::TYPE_SAVE); - if(!File) - return; - - const char *apColumns[4] = { - aTimestamp, - aName, - Client()->GetCurrentMap(), - aSaveCode, - }; - - if(!SavesFileExists) - { - CsvWrite(File, 4, SAVES_HEADER); - } - CsvWrite(File, 4, apColumns); - io_close(File); -} - -void CChat::AddLine(int ClientId, int Team, const char *pLine) -{ - if(*pLine == 0 || - (ClientId == SERVER_MSG && !g_Config.m_ClShowChatSystem) || - (ClientId >= 0 && (m_pClient->m_aClients[ClientId].m_aName[0] == '\0' || // unknown client - m_pClient->m_aClients[ClientId].m_ChatIgnore || - (m_pClient->m_Snap.m_LocalClientId != ClientId && g_Config.m_ClShowChatFriends && !m_pClient->m_aClients[ClientId].m_Friend) || - (m_pClient->m_Snap.m_LocalClientId != ClientId && g_Config.m_ClShowChatTeamMembersOnly && m_pClient->IsOtherTeam(ClientId) && m_pClient->m_Teams.Team(m_pClient->m_Snap.m_LocalClientId) != TEAM_FLOCK) || - (m_pClient->m_Snap.m_LocalClientId != ClientId && m_pClient->m_aClients[ClientId].m_Foe)))) - return; - - // trim right and set maximum length to 256 utf8-characters - int Length = 0; - const char *pStr = pLine; - const char *pEnd = 0; - while(*pStr) - { - const char *pStrOld = pStr; - int Code = str_utf8_decode(&pStr); - - // check if unicode is not empty - if(!str_utf8_isspace(Code)) - { - pEnd = 0; - } - else if(pEnd == 0) - pEnd = pStrOld; - - if(++Length >= MAX_LINE_LENGTH) - { - *(const_cast(pStr)) = 0; - break; - } - } - if(pEnd != 0) - *(const_cast(pEnd)) = 0; - - if(*pLine == 0) - return; - - bool Highlighted = false; - - auto &&FChatMsgCheckAndPrint = [this](CLine *pLine_) { - if(pLine_->m_ClientId < 0) // server or client message - { - if(Client()->State() != IClient::STATE_DEMOPLAYBACK) - StoreSave(pLine_->m_aText); - } - - char aBuf[1024]; - str_format(aBuf, sizeof(aBuf), "%s%s%s", pLine_->m_aName, pLine_->m_ClientId >= 0 ? ": " : "", pLine_->m_aText); - - ColorRGBA ChatLogColor{1, 1, 1, 1}; - if(pLine_->m_Highlighted) - { - ChatLogColor = color_cast(ColorHSLA(g_Config.m_ClMessageHighlightColor)); - } - else - { - if(pLine_->m_Friend && g_Config.m_ClMessageFriend) - ChatLogColor = color_cast(ColorHSLA(g_Config.m_ClMessageFriendColor)); - else if(pLine_->m_Team) - ChatLogColor = color_cast(ColorHSLA(g_Config.m_ClMessageTeamColor)); - else if(pLine_->m_ClientId == SERVER_MSG) - ChatLogColor = color_cast(ColorHSLA(g_Config.m_ClMessageSystemColor)); - else if(pLine_->m_ClientId == CLIENT_MSG) - ChatLogColor = color_cast(ColorHSLA(g_Config.m_ClMessageClientColor)); - else // regular message - ChatLogColor = color_cast(ColorHSLA(g_Config.m_ClMessageColor)); - } - - const char *pFrom; - if(pLine_->m_Whisper) - pFrom = "chat/whisper"; - else if(pLine_->m_Team) - pFrom = "chat/team"; - else if(pLine_->m_ClientId == SERVER_MSG) - pFrom = "chat/server"; - else if(pLine_->m_ClientId == CLIENT_MSG) - pFrom = "chat/client"; - else - pFrom = "chat/all"; - - Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, pFrom, aBuf, ChatLogColor); - }; - - // Custom color for new line - std::optional CustomColor = std::nullopt; - if(ClientId == CLIENT_MSG) - CustomColor = color_cast(ColorHSLA(g_Config.m_ClMessageClientColor)); - - CLine *pCurrentLine = &m_aLines[m_CurrentLine]; - - // Team Number: - // 0 = global; 1 = team; 2 = sending whisper; 3 = receiving whisper - - // If it's a client message, m_aText will have ": " prepended so we have to work around it. - if(pCurrentLine->m_TeamNumber == Team && pCurrentLine->m_ClientId == ClientId && str_comp(pCurrentLine->m_aText, pLine) == 0 && pCurrentLine->m_CustomColor == CustomColor) - { - pCurrentLine->m_TimesRepeated++; - TextRender()->DeleteTextContainer(pCurrentLine->m_TextContainerIndex); - Graphics()->DeleteQuadContainer(pCurrentLine->m_QuadContainerIndex); - pCurrentLine->m_Time = time(); - pCurrentLine->m_aYOffset[0] = -1.f; - pCurrentLine->m_aYOffset[1] = -1.f; - - FChatMsgCheckAndPrint(pCurrentLine); - return; - } - - m_CurrentLine = (m_CurrentLine + 1) % MAX_LINES; - - pCurrentLine = &m_aLines[m_CurrentLine]; - pCurrentLine->m_TimesRepeated = 0; - pCurrentLine->m_Time = time(); - pCurrentLine->m_aYOffset[0] = -1.0f; - pCurrentLine->m_aYOffset[1] = -1.0f; - pCurrentLine->m_ClientId = ClientId; - pCurrentLine->m_TeamNumber = Team; - pCurrentLine->m_Team = Team == 1; - pCurrentLine->m_Whisper = Team >= 2; - pCurrentLine->m_NameColor = -2; - pCurrentLine->m_Friend = false; - pCurrentLine->m_HasRenderTee = false; - pCurrentLine->m_CustomColor = CustomColor; - - TextRender()->DeleteTextContainer(pCurrentLine->m_TextContainerIndex); - Graphics()->DeleteQuadContainer(pCurrentLine->m_QuadContainerIndex); - - // check for highlighted name - if(Client()->State() != IClient::STATE_DEMOPLAYBACK) - { - if(ClientId >= 0 && ClientId != m_pClient->m_aLocalIds[0] && (!m_pClient->Client()->DummyConnected() || ClientId != m_pClient->m_aLocalIds[1])) - { - // main character - Highlighted |= LineShouldHighlight(pLine, m_pClient->m_aClients[m_pClient->m_aLocalIds[0]].m_aName); - // dummy - Highlighted |= m_pClient->Client()->DummyConnected() && LineShouldHighlight(pLine, m_pClient->m_aClients[m_pClient->m_aLocalIds[1]].m_aName); - } - } - else - { - // on demo playback use local id from snap directly, - // since m_aLocalIds isn't valid there - Highlighted |= m_pClient->m_Snap.m_LocalClientId >= 0 && LineShouldHighlight(pLine, m_pClient->m_aClients[m_pClient->m_Snap.m_LocalClientId].m_aName); - } - - pCurrentLine->m_Highlighted = Highlighted; - - if(pCurrentLine->m_ClientId == SERVER_MSG) - { - str_copy(pCurrentLine->m_aName, "*** "); - str_copy(pCurrentLine->m_aText, pLine); - } - else if(pCurrentLine->m_ClientId == CLIENT_MSG) - { - str_copy(pCurrentLine->m_aName, "— "); - str_copy(pCurrentLine->m_aText, pLine); - } - else - { - auto &LineAuthor = m_pClient->m_aClients[pCurrentLine->m_ClientId]; - - if(LineAuthor.m_Team == TEAM_SPECTATORS) - pCurrentLine->m_NameColor = TEAM_SPECTATORS; - - if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS) - { - if(LineAuthor.m_Team == TEAM_RED) - pCurrentLine->m_NameColor = TEAM_RED; - else if(LineAuthor.m_Team == TEAM_BLUE) - pCurrentLine->m_NameColor = TEAM_BLUE; - } - - if(Team == TEAM_WHISPER_SEND) - { - str_format(pCurrentLine->m_aName, sizeof(pCurrentLine->m_aName), "→ %s", LineAuthor.m_aName); - pCurrentLine->m_NameColor = TEAM_BLUE; - pCurrentLine->m_Highlighted = false; - Highlighted = false; - } - else if(Team == TEAM_WHISPER_RECV) - { - str_format(pCurrentLine->m_aName, sizeof(pCurrentLine->m_aName), "← %s", LineAuthor.m_aName); - pCurrentLine->m_NameColor = TEAM_RED; - pCurrentLine->m_Highlighted = true; - Highlighted = true; - } - else - str_copy(pCurrentLine->m_aName, LineAuthor.m_aName); - - str_copy(pCurrentLine->m_aText, pLine); - pCurrentLine->m_Friend = LineAuthor.m_Friend; - - if(pCurrentLine->m_aName[0] != '\0') - { - if(!g_Config.m_ClChatOld) - { - str_copy(pCurrentLine->m_aSkinName, LineAuthor.m_aSkinName); - pCurrentLine->m_TeeRenderInfo = LineAuthor.m_RenderInfo; - pCurrentLine->m_HasRenderTee = true; - } - } - } - - FChatMsgCheckAndPrint(pCurrentLine); - - // play sound - int64_t Now = time(); - if(ClientId == SERVER_MSG) - { - if(Now - m_aLastSoundPlayed[CHAT_SERVER] >= time_freq() * 3 / 10) - { - if(g_Config.m_SndServerMessage) - { - m_pClient->m_Sounds.Play(CSounds::CHN_GUI, SOUND_CHAT_SERVER, 1.0f); - m_aLastSoundPlayed[CHAT_SERVER] = Now; - } - } - } - else if(ClientId == CLIENT_MSG) - { - // No sound yet - } - else if(Highlighted && Client()->State() != IClient::STATE_DEMOPLAYBACK) - { - if(Now - m_aLastSoundPlayed[CHAT_HIGHLIGHT] >= time_freq() * 3 / 10) - { - char aBuf[1024]; - str_format(aBuf, sizeof(aBuf), "%s: %s", m_aLines[m_CurrentLine].m_aName, m_aLines[m_CurrentLine].m_aText); - Client()->Notify("DDNet Chat", aBuf); - if(g_Config.m_SndHighlight) - { - m_pClient->m_Sounds.Play(CSounds::CHN_GUI, SOUND_CHAT_HIGHLIGHT, 1.0f); - m_aLastSoundPlayed[CHAT_HIGHLIGHT] = Now; - } - - if(g_Config.m_ClEditor) - { - GameClient()->Editor()->UpdateMentions(); - } - } - } - else if(Team != TEAM_WHISPER_SEND) - { - if(Now - m_aLastSoundPlayed[CHAT_CLIENT] >= time_freq() * 3 / 10) - { - bool PlaySound = m_aLines[m_CurrentLine].m_Team ? g_Config.m_SndTeamChat : g_Config.m_SndChat; -#if defined(CONF_VIDEORECORDER) - if(IVideo::Current()) - { - PlaySound &= (bool)g_Config.m_ClVideoShowChat; - } -#endif - if(PlaySound) - { - m_pClient->m_Sounds.Play(CSounds::CHN_GUI, SOUND_CHAT_CLIENT, 1.0f); - m_aLastSoundPlayed[CHAT_CLIENT] = Now; - } - } - } -} - -void CChat::OnRefreshSkins() -{ - for(auto &Line : m_aLines) - { - if(Line.m_HasRenderTee) - { - Line.m_TeeRenderInfo.Apply(m_pClient->m_Skins.Find(Line.m_aSkinName)); - } - else - { - Line.m_TeeRenderInfo.Reset(); - } - } -} - -void CChat::OnPrepareLines(float y) -{ - float x = 5.0f; - float FontSize = this->FontSize(); - - const bool IsScoreBoardOpen = m_pClient->m_Scoreboard.Active() && (Graphics()->ScreenAspect() > 1.7f); // only assume scoreboard when screen ratio is widescreen(something around 16:9) - const bool ShowLargeArea = m_Show || (m_Mode != MODE_NONE && g_Config.m_ClShowChat == 1) || g_Config.m_ClShowChat == 2; - const bool ForceRecreate = IsScoreBoardOpen != m_PrevScoreBoardShowed || ShowLargeArea != m_PrevShowChat; - m_PrevScoreBoardShowed = IsScoreBoardOpen; - m_PrevShowChat = ShowLargeArea; - - const int TeeSize = MessageTeeSize(); - float RealMsgPaddingX = MessagePaddingX(); - float RealMsgPaddingY = MessagePaddingY(); - float RealMsgPaddingTee = TeeSize + MESSAGE_TEE_PADDING_RIGHT; - - if(g_Config.m_ClChatOld) - { - RealMsgPaddingX = 0; - RealMsgPaddingY = 0; - RealMsgPaddingTee = 0; - } - - int64_t Now = time(); - float LineWidth = (IsScoreBoardOpen ? maximum(85.f, (FontSize * 85.0f / 6.f)) : g_Config.m_ClChatWidth) - (RealMsgPaddingX * 1.5f) - RealMsgPaddingTee; - - float HeightLimit = IsScoreBoardOpen ? 180.0f : (m_PrevShowChat ? 50.0f : 200.0f); - float Begin = x; - float TextBegin = Begin + RealMsgPaddingX / 2.0f; - CTextCursor Cursor; - int OffsetType = IsScoreBoardOpen ? 1 : 0; - - for(int i = 0; i < MAX_LINES; i++) - { - CLine &Line = m_aLines[((m_CurrentLine - i) + MAX_LINES) % MAX_LINES]; - - if(Now > Line.m_Time + 16 * time_freq() && !m_PrevShowChat) - break; - - if(Line.m_TextContainerIndex.Valid() && !ForceRecreate) - continue; - - TextRender()->DeleteTextContainer(Line.m_TextContainerIndex); - Graphics()->DeleteQuadContainer(Line.m_QuadContainerIndex); - - char aClientId[16] = ""; - if(g_Config.m_ClShowIds && Line.m_ClientId >= 0 && Line.m_aName[0] != '\0') - { - GameClient()->FormatClientId(Line.m_ClientId, aClientId, EClientIdFormat::INDENT_AUTO); - } - - char aCount[12]; - if(Line.m_ClientId < 0) - str_format(aCount, sizeof(aCount), "[%d] ", Line.m_TimesRepeated + 1); - else - str_format(aCount, sizeof(aCount), " [%d]", Line.m_TimesRepeated + 1); - - const char *pText = Line.m_aText; - if(Config()->m_ClStreamerMode && Line.m_ClientId == SERVER_MSG) - { - if(str_startswith(Line.m_aText, "Team save in progress. You'll be able to load with '/load ") && str_endswith(Line.m_aText, "'")) - { - pText = "Team save in progress. You'll be able to load with '/load ***'"; - } - else if(str_startswith(Line.m_aText, "Team save in progress. You'll be able to load with '/load") && str_endswith(Line.m_aText, "if it fails")) - { - pText = "Team save in progress. You'll be able to load with '/load ***' if save is successful or with '/load *** *** ***' if it fails"; - } - else if(str_startswith(Line.m_aText, "Team successfully saved by ") && str_endswith(Line.m_aText, " to continue")) - { - pText = "Team successfully saved by ***. Use '/load ***' to continue"; - } - } - - if(g_Config.m_ClChatOld) - { - Line.m_HasRenderTee = false; - } - - // get the y offset (calculate it if we haven't done that yet) - if(Line.m_aYOffset[OffsetType] < 0.0f) - { - TextRender()->SetCursor(&Cursor, TextBegin, 0.0f, FontSize, 0); - Cursor.m_LineWidth = LineWidth; - - if(Line.m_ClientId >= 0 && Line.m_aName[0] != '\0') - { - Cursor.m_X += RealMsgPaddingTee; - - if(Line.m_Friend && g_Config.m_ClMessageFriend) - { - TextRender()->TextEx(&Cursor, "♥ "); - } - } - - TextRender()->TextEx(&Cursor, aClientId); - TextRender()->TextEx(&Cursor, Line.m_aName); - if(Line.m_TimesRepeated > 0) - TextRender()->TextEx(&Cursor, aCount); - - if(Line.m_ClientId >= 0 && Line.m_aName[0] != '\0') - { - TextRender()->TextEx(&Cursor, ": "); - } - - CTextCursor AppendCursor = Cursor; - AppendCursor.m_LongestLineWidth = 0.0f; - if(!IsScoreBoardOpen && !g_Config.m_ClChatOld) - { - AppendCursor.m_StartX = Cursor.m_X; - AppendCursor.m_LineWidth -= Cursor.m_LongestLineWidth; - } - - TextRender()->TextEx(&AppendCursor, pText); - - Line.m_aYOffset[OffsetType] = AppendCursor.Height() + RealMsgPaddingY; - } - - y -= Line.m_aYOffset[OffsetType]; - - // cut off if msgs waste too much space - if(y < HeightLimit) - break; - - // the position the text was created - Line.m_TextYOffset = y + RealMsgPaddingY / 2.f; - - int CurRenderFlags = TextRender()->GetRenderFlags(); - TextRender()->SetRenderFlags(CurRenderFlags | ETextRenderFlags::TEXT_RENDER_FLAG_NO_AUTOMATIC_QUAD_UPLOAD); - - // reset the cursor - TextRender()->SetCursor(&Cursor, TextBegin, Line.m_TextYOffset, FontSize, TEXTFLAG_RENDER); - Cursor.m_LineWidth = LineWidth; - - // Message is from valid player - if(Line.m_ClientId >= 0 && Line.m_aName[0] != '\0') - { - Cursor.m_X += RealMsgPaddingTee; - - if(Line.m_Friend && g_Config.m_ClMessageFriend) - { - TextRender()->TextColor(color_cast(ColorHSLA(g_Config.m_ClMessageFriendColor)).WithAlpha(1.f)); - TextRender()->CreateOrAppendTextContainer(Line.m_TextContainerIndex, &Cursor, "♥ "); - } - } - - // render name - ColorRGBA NameColor; - if(Line.m_CustomColor) - NameColor = *Line.m_CustomColor; - else if(Line.m_ClientId == SERVER_MSG) - NameColor = color_cast(ColorHSLA(g_Config.m_ClMessageSystemColor)); - else if(Line.m_ClientId == CLIENT_MSG) - NameColor = color_cast(ColorHSLA(g_Config.m_ClMessageClientColor)); - else if(Line.m_Team) - NameColor = CalculateNameColor(ColorHSLA(g_Config.m_ClMessageTeamColor)); - else if(Line.m_NameColor == TEAM_RED) - NameColor = ColorRGBA(1.0f, 0.5f, 0.5f, 1.f); - else if(Line.m_NameColor == TEAM_BLUE) - NameColor = ColorRGBA(0.7f, 0.7f, 1.0f, 1.f); - else if(Line.m_NameColor == TEAM_SPECTATORS) - NameColor = ColorRGBA(0.75f, 0.5f, 0.75f, 1.f); - else if(Line.m_ClientId >= 0 && g_Config.m_ClChatTeamColors && m_pClient->m_Teams.Team(Line.m_ClientId)) - NameColor = m_pClient->GetDDTeamColor(m_pClient->m_Teams.Team(Line.m_ClientId), 0.75f); - else - NameColor = ColorRGBA(0.8f, 0.8f, 0.8f, 1.f); - - TextRender()->TextColor(NameColor); - TextRender()->CreateOrAppendTextContainer(Line.m_TextContainerIndex, &Cursor, aClientId); - TextRender()->CreateOrAppendTextContainer(Line.m_TextContainerIndex, &Cursor, Line.m_aName); - - if(Line.m_TimesRepeated > 0) - { - TextRender()->TextColor(1.0f, 1.0f, 1.0f, 0.3f); - TextRender()->CreateOrAppendTextContainer(Line.m_TextContainerIndex, &Cursor, aCount); - } - - if(Line.m_ClientId >= 0 && Line.m_aName[0] != '\0') - { - TextRender()->TextColor(NameColor); - TextRender()->CreateOrAppendTextContainer(Line.m_TextContainerIndex, &Cursor, ": "); - } - - ColorRGBA Color; - if(Line.m_CustomColor) - Color = *Line.m_CustomColor; - else if(Line.m_ClientId == SERVER_MSG) - Color = color_cast(ColorHSLA(g_Config.m_ClMessageSystemColor)); - else if(Line.m_ClientId == CLIENT_MSG) - Color = color_cast(ColorHSLA(g_Config.m_ClMessageClientColor)); - else if(Line.m_Highlighted) - Color = color_cast(ColorHSLA(g_Config.m_ClMessageHighlightColor)); - else if(Line.m_Team) - Color = color_cast(ColorHSLA(g_Config.m_ClMessageTeamColor)); - else // regular message - Color = color_cast(ColorHSLA(g_Config.m_ClMessageColor)); - TextRender()->TextColor(Color); - - CTextCursor AppendCursor = Cursor; - AppendCursor.m_LongestLineWidth = 0.0f; - if(!IsScoreBoardOpen && !g_Config.m_ClChatOld) - { - AppendCursor.m_StartX = Cursor.m_X; - AppendCursor.m_LineWidth -= Cursor.m_LongestLineWidth; - } - - TextRender()->CreateOrAppendTextContainer(Line.m_TextContainerIndex, &AppendCursor, pText); - - if(!g_Config.m_ClChatOld && (Line.m_aText[0] != '\0' || Line.m_aName[0] != '\0')) - { - float FullWidth = RealMsgPaddingX * 1.5f; - if(!IsScoreBoardOpen && !g_Config.m_ClChatOld) - { - FullWidth += Cursor.m_LongestLineWidth + AppendCursor.m_LongestLineWidth; - } - else - { - FullWidth += maximum(Cursor.m_LongestLineWidth, AppendCursor.m_LongestLineWidth); - } - Graphics()->SetColor(1, 1, 1, 1); - Line.m_QuadContainerIndex = Graphics()->CreateRectQuadContainer(Begin, y, FullWidth, Line.m_aYOffset[OffsetType], MessageRounding(), IGraphics::CORNER_ALL); - } - - TextRender()->SetRenderFlags(CurRenderFlags); - if(Line.m_TextContainerIndex.Valid()) - TextRender()->UploadTextContainer(Line.m_TextContainerIndex); - } - - TextRender()->TextColor(TextRender()->DefaultTextColor()); -} - -void CChat::OnRender() -{ - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - // send pending chat messages - if(m_PendingChatCounter > 0 && m_LastChatSend + time_freq() < time()) - { - CHistoryEntry *pEntry = m_History.Last(); - for(int i = m_PendingChatCounter - 1; pEntry; --i, pEntry = m_History.Prev(pEntry)) - { - if(i == 0) - { - SendChat(pEntry->m_Team, pEntry->m_aText); - break; - } - } - --m_PendingChatCounter; - } - - const float Height = 300.0f; - const float Width = Height * Graphics()->ScreenAspect(); - Graphics()->MapScreen(0.0f, 0.0f, Width, Height); - - float x = 5.0f; - float y = 300.0f - 20.0f * FontSize() / 6.f; - float ScaledFontSize = FontSize() * (8 / 6.f); - if(m_Mode != MODE_NONE) - { - // render chat input - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, x, y, ScaledFontSize, TEXTFLAG_RENDER); - Cursor.m_LineWidth = Width - 190.0f; - - if(m_Mode == MODE_ALL) - TextRender()->TextEx(&Cursor, Localize("All")); - else if(m_Mode == MODE_TEAM) - TextRender()->TextEx(&Cursor, Localize("Team")); - else - TextRender()->TextEx(&Cursor, Localize("Chat")); - - TextRender()->TextEx(&Cursor, ": "); - - const float MessageMaxWidth = Cursor.m_LineWidth - (Cursor.m_X - Cursor.m_StartX); - const CUIRect ClippingRect = {Cursor.m_X, Cursor.m_Y, MessageMaxWidth, 2.25f * Cursor.m_FontSize}; - const float XScale = Graphics()->ScreenWidth() / Width; - const float YScale = Graphics()->ScreenHeight() / Height; - Graphics()->ClipEnable((int)(ClippingRect.x * XScale), (int)(ClippingRect.y * YScale), (int)(ClippingRect.w * XScale), (int)(ClippingRect.h * YScale)); - - float ScrollOffset = m_Input.GetScrollOffset(); - float ScrollOffsetChange = m_Input.GetScrollOffsetChange(); - - m_Input.Activate(EInputPriority::CHAT); // Ensure that the input is active - const CUIRect InputCursorRect = {Cursor.m_X, Cursor.m_Y - ScrollOffset, 0.0f, 0.0f}; - const bool WasChanged = m_Input.WasChanged(); - const bool WasCursorChanged = m_Input.WasCursorChanged(); - const bool Changed = WasChanged || WasCursorChanged; - const STextBoundingBox BoundingBox = m_Input.Render(&InputCursorRect, Cursor.m_FontSize, TEXTALIGN_TL, Changed, MessageMaxWidth, 0.0f); - - Graphics()->ClipDisable(); - - // Scroll up or down to keep the caret inside the clipping rect - const float CaretPositionY = m_Input.GetCaretPosition().y - ScrollOffsetChange; - if(CaretPositionY < ClippingRect.y) - ScrollOffsetChange -= ClippingRect.y - CaretPositionY; - else if(CaretPositionY + Cursor.m_FontSize > ClippingRect.y + ClippingRect.h) - ScrollOffsetChange += CaretPositionY + Cursor.m_FontSize - (ClippingRect.y + ClippingRect.h); - - Ui()->DoSmoothScrollLogic(&ScrollOffset, &ScrollOffsetChange, ClippingRect.h, BoundingBox.m_H); - - m_Input.SetScrollOffset(ScrollOffset); - m_Input.SetScrollOffsetChange(ScrollOffsetChange); - - // Autocompletion hint - if(m_Input.GetString()[0] == '/' && m_Input.GetString()[1] != '\0' && !m_vCommands.empty()) - { - for(const auto &Command : m_vCommands) - { - if(str_startswith_nocase(Command.m_aName, m_Input.GetString() + 1)) - { - Cursor.m_X = Cursor.m_X + TextRender()->TextWidth(Cursor.m_FontSize, m_Input.GetString(), -1, Cursor.m_LineWidth); - Cursor.m_Y = m_Input.GetCaretPosition().y; - TextRender()->TextColor(1.0f, 1.0f, 1.0f, 0.5f); - TextRender()->TextEx(&Cursor, Command.m_aName + str_length(m_Input.GetString() + 1)); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - break; - } - } - } - } - -#if defined(CONF_VIDEORECORDER) - if(!((g_Config.m_ClShowChat && !IVideo::Current()) || (g_Config.m_ClVideoShowChat && IVideo::Current()))) -#else - if(!g_Config.m_ClShowChat) -#endif - return; - - y -= ScaledFontSize; - - OnPrepareLines(y); - - bool IsScoreBoardOpen = m_pClient->m_Scoreboard.Active() && (Graphics()->ScreenAspect() > 1.7f); // only assume scoreboard when screen ratio is widescreen(something around 16:9) - - int64_t Now = time(); - float HeightLimit = IsScoreBoardOpen ? 180.0f : (m_PrevShowChat ? 50.0f : 200.0f); - int OffsetType = IsScoreBoardOpen ? 1 : 0; - - float RealMsgPaddingX = MessagePaddingX(); - float RealMsgPaddingY = MessagePaddingY(); - - if(g_Config.m_ClChatOld) - { - RealMsgPaddingX = 0; - RealMsgPaddingY = 0; - } - - for(int i = 0; i < MAX_LINES; i++) - { - CLine &Line = m_aLines[((m_CurrentLine - i) + MAX_LINES) % MAX_LINES]; - if(Now > Line.m_Time + 16 * time_freq() && !m_PrevShowChat) - break; - - y -= Line.m_aYOffset[OffsetType]; - - // cut off if msgs waste too much space - if(y < HeightLimit) - break; - - float Blend = Now > Line.m_Time + 14 * time_freq() && !m_PrevShowChat ? 1.0f - (Now - Line.m_Time - 14 * time_freq()) / (2.0f * time_freq()) : 1.0f; - - // Draw backgrounds for messages in one batch - if(!g_Config.m_ClChatOld) - { - Graphics()->TextureClear(); - if(Line.m_QuadContainerIndex != -1) - { - Graphics()->SetColor(0, 0, 0, 0.12f * Blend); - Graphics()->RenderQuadContainerEx(Line.m_QuadContainerIndex, 0, -1, 0, ((y + RealMsgPaddingY / 2.0f) - Line.m_TextYOffset)); - } - } - - if(Line.m_TextContainerIndex.Valid()) - { - if(!g_Config.m_ClChatOld && Line.m_HasRenderTee) - { - const int TeeSize = MessageTeeSize(); - Line.m_TeeRenderInfo.m_Size = TeeSize; - - float RowHeight = FontSize() + RealMsgPaddingY; - float OffsetTeeY = TeeSize / 2.0f; - float FullHeightMinusTee = RowHeight - TeeSize; - - const CAnimState *pIdleState = CAnimState::GetIdle(); - vec2 OffsetToMid; - CRenderTools::GetRenderTeeOffsetToRenderedTee(pIdleState, &Line.m_TeeRenderInfo, OffsetToMid); - vec2 TeeRenderPos(x + (RealMsgPaddingX + TeeSize) / 2.0f, y + OffsetTeeY + FullHeightMinusTee / 2.0f + OffsetToMid.y); - RenderTools()->RenderTee(pIdleState, &Line.m_TeeRenderInfo, EMOTE_NORMAL, vec2(1, 0.1f), TeeRenderPos, Blend); - } - - const ColorRGBA TextColor = TextRender()->DefaultTextColor().WithMultipliedAlpha(Blend); - const ColorRGBA TextOutlineColor = TextRender()->DefaultTextOutlineColor().WithMultipliedAlpha(Blend); - TextRender()->RenderTextContainer(Line.m_TextContainerIndex, TextColor, TextOutlineColor, 0, (y + RealMsgPaddingY / 2.0f) - Line.m_TextYOffset); - } - } -} - -void CChat::EnsureCoherentFontSize() const -{ - // Adjust font size based on width - if(g_Config.m_ClChatWidth / (float)g_Config.m_ClChatFontSize >= CHAT_FONTSIZE_WIDTH_RATIO) - return; - - // We want to keep a ration between font size and font width so that we don't have a weird rendering - g_Config.m_ClChatFontSize = g_Config.m_ClChatWidth / CHAT_FONTSIZE_WIDTH_RATIO; -} - -void CChat::EnsureCoherentWidth() const -{ - // Adjust width based on font size - if(g_Config.m_ClChatWidth / (float)g_Config.m_ClChatFontSize >= CHAT_FONTSIZE_WIDTH_RATIO) - return; - - // We want to keep a ration between font size and font width so that we don't have a weird rendering - g_Config.m_ClChatWidth = CHAT_FONTSIZE_WIDTH_RATIO * g_Config.m_ClChatFontSize; -} - -// ----- send functions ----- - -void CChat::SendChat(int Team, const char *pLine) -{ - // don't send empty messages - if(*str_utf8_skip_whitespaces(pLine) == '\0') - return; - - m_LastChatSend = time(); - - if(m_pClient->Client()->IsSixup()) - { - protocol7::CNetMsg_Cl_Say Msg7; - Msg7.m_Mode = Team == 1 ? protocol7::CHAT_TEAM : protocol7::CHAT_ALL; - Msg7.m_Target = -1; - Msg7.m_pMessage = pLine; - Client()->SendPackMsgActive(&Msg7, MSGFLAG_VITAL, true); - return; - } - - // send chat message - CNetMsg_Cl_Say Msg; - Msg.m_Team = Team; - Msg.m_pMessage = pLine; - Client()->SendPackMsgActive(&Msg, MSGFLAG_VITAL); -} - -void CChat::SendChatQueued(const char *pLine) -{ - if(!pLine || str_length(pLine) < 1) - return; - - bool AddEntry = false; - - if(m_LastChatSend + time_freq() < time()) - { - SendChat(m_Mode == MODE_ALL ? 0 : 1, pLine); - AddEntry = true; - } - else if(m_PendingChatCounter < 3) - { - ++m_PendingChatCounter; - AddEntry = true; - } - - if(AddEntry) - { - const int Length = str_length(pLine); - CHistoryEntry *pEntry = m_History.Allocate(sizeof(CHistoryEntry) + Length); - pEntry->m_Team = m_Mode == MODE_ALL ? 0 : 1; - str_copy(pEntry->m_aText, pLine, Length + 1); - } -} diff --git a/src/game/client/components/chat.h b/src/game/client/components/chat.h deleted file mode 100644 index abf80809e8..0000000000 --- a/src/game/client/components/chat.h +++ /dev/null @@ -1,203 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_CHAT_H -#define GAME_CLIENT_COMPONENTS_CHAT_H -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -class CChat : public CComponent -{ - static constexpr float CHAT_HEIGHT_FULL = 200.0f; - static constexpr float CHAT_HEIGHT_MIN = 50.0f; - static constexpr float CHAT_FONTSIZE_WIDTH_RATIO = 2.5f; - - enum - { - MAX_LINES = 64, - MAX_LINE_LENGTH = 256 - }; - - CLineInputBuffered m_Input; - struct CLine - { - int64_t m_Time; - float m_aYOffset[2]; - int m_ClientId; - int m_TeamNumber; - bool m_Team; - bool m_Whisper; - int m_NameColor; - char m_aName[64]; - char m_aText[MAX_LINE_LENGTH]; - bool m_Friend; - bool m_Highlighted; - std::optional m_CustomColor; - - STextContainerIndex m_TextContainerIndex; - int m_QuadContainerIndex; - - char m_aSkinName[std::size(g_Config.m_ClPlayerSkin)]; - bool m_HasRenderTee; - CTeeRenderInfo m_TeeRenderInfo; - - float m_TextYOffset; - - int m_TimesRepeated; - }; - - bool m_PrevScoreBoardShowed; - bool m_PrevShowChat; - - CLine m_aLines[MAX_LINES]; - int m_CurrentLine; - - enum - { - // client IDs for special messages - CLIENT_MSG = -2, - SERVER_MSG = -1, - - MODE_NONE = 0, - MODE_ALL, - MODE_TEAM, - - CHAT_SERVER = 0, - CHAT_HIGHLIGHT, - CHAT_CLIENT, - CHAT_NUM, - }; - - int m_Mode; - bool m_Show; - bool m_CompletionUsed; - int m_CompletionChosen; - char m_aCompletionBuffer[MAX_LINE_LENGTH]; - int m_PlaceholderOffset; - int m_PlaceholderLength; - static char ms_aDisplayText[MAX_LINE_LENGTH]; - struct CRateablePlayer - { - int ClientId; - int Score; - }; - CRateablePlayer m_aPlayerCompletionList[MAX_CLIENTS]; - int m_PlayerCompletionListLength; - - struct CCommand - { - char m_aName[IConsole::TEMPCMD_NAME_LENGTH]; - char m_aParams[IConsole::TEMPCMD_PARAMS_LENGTH]; - char m_aHelpText[IConsole::TEMPCMD_HELP_LENGTH]; - - CCommand() = default; - CCommand(const char *pName, const char *pParams, const char *pHelpText) - { - str_copy(m_aName, pName); - str_copy(m_aParams, pParams); - str_copy(m_aHelpText, pHelpText); - } - - bool operator<(const CCommand &Other) const { return str_comp(m_aName, Other.m_aName) < 0; } - bool operator<=(const CCommand &Other) const { return str_comp(m_aName, Other.m_aName) <= 0; } - bool operator==(const CCommand &Other) const { return str_comp(m_aName, Other.m_aName) == 0; } - }; - - std::vector m_vCommands; - bool m_CommandsNeedSorting; - - struct CHistoryEntry - { - int m_Team; - char m_aText[1]; - }; - CHistoryEntry *m_pHistoryEntry; - CStaticRingBuffer m_History; - int m_PendingChatCounter; - int64_t m_LastChatSend; - int64_t m_aLastSoundPlayed[CHAT_NUM]; - bool m_IsInputCensored; - char m_aCurrentInputText[MAX_LINE_LENGTH]; - bool m_EditingNewLine; - - bool m_ServerSupportsCommandInfo; - - static void ConSay(IConsole::IResult *pResult, void *pUserData); - static void ConSayTeam(IConsole::IResult *pResult, void *pUserData); - static void ConChat(IConsole::IResult *pResult, void *pUserData); - static void ConShowChat(IConsole::IResult *pResult, void *pUserData); - static void ConEcho(IConsole::IResult *pResult, void *pUserData); - static void ConClearChat(IConsole::IResult *pResult, void *pUserData); - - static void ConchainChatOld(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainChatFontSize(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainChatWidth(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - - bool LineShouldHighlight(const char *pLine, const char *pName); - void StoreSave(const char *pText); - -public: - CChat(); - int Sizeof() const override { return sizeof(*this); } - - static constexpr float MESSAGE_TEE_PADDING_RIGHT = 0.5f; - - bool IsActive() const { return m_Mode != MODE_NONE; } - void AddLine(int ClientId, int Team, const char *pLine); - void EnableMode(int Team); - void DisableMode(); - void RegisterCommand(const char *pName, const char *pParams, const char *pHelpText); - void UnregisterCommand(const char *pName); - void Echo(const char *pString); - - void OnWindowResize() override; - void OnConsoleInit() override; - void OnStateChange(int NewState, int OldState) override; - void OnRefreshSkins() override; - void OnRender() override; - void OnPrepareLines(float y); - void Reset(); - void OnRelease() override; - void OnMessage(int MsgType, void *pRawMsg) override; - bool OnInput(const IInput::CEvent &Event) override; - void OnInit() override; - - void RebuildChat(); - void ClearLines(); - - void EnsureCoherentFontSize() const; - void EnsureCoherentWidth() const; - - float FontSize() const { return g_Config.m_ClChatFontSize / 10.0f; } - float MessagePaddingX() const { return FontSize() * (5 / 6.f); } - float MessagePaddingY() const { return FontSize() * (1 / 6.f); } - float MessageTeeSize() const { return FontSize() * (7 / 6.f); } - float MessageRounding() const { return FontSize() * (1 / 2.f); } - - // ----- send functions ----- - - // Sends a chat message to the server. - // - // @param Team MODE_ALL=0 MODE_TEAM=1 - // @param pLine the chat message - void SendChat(int Team, const char *pLine); - - // Sends a chat message to the server. - // - // It uses a queue with a maximum of 3 entries - // that ensures there is a minimum delay of one second - // between sent messages. - // - // It uses team or public chat depending on m_Mode. - void SendChatQueued(const char *pLine); -}; -#endif diff --git a/src/game/client/components/console.cpp b/src/game/client/components/console.cpp deleted file mode 100644 index 3ce0d7a21b..0000000000 --- a/src/game/client/components/console.cpp +++ /dev/null @@ -1,1626 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -#include - -#include "console.h" - -static constexpr float FONT_SIZE = 10.0f; -static constexpr float LINE_SPACING = 1.0f; - -class CConsoleLogger : public ILogger -{ - CGameConsole *m_pConsole; - CLock m_ConsoleMutex; - -public: - CConsoleLogger(CGameConsole *pConsole) : - m_pConsole(pConsole) - { - dbg_assert(pConsole != nullptr, "console pointer must not be null"); - } - - void Log(const CLogMessage *pMessage) override REQUIRES(!m_ConsoleMutex); - void OnConsoleDeletion() REQUIRES(!m_ConsoleMutex); -}; - -void CConsoleLogger::Log(const CLogMessage *pMessage) -{ - if(m_Filter.Filters(pMessage)) - { - return; - } - ColorRGBA Color = gs_ConsoleDefaultColor; - if(pMessage->m_HaveColor) - { - Color.r = pMessage->m_Color.r / 255.0; - Color.g = pMessage->m_Color.g / 255.0; - Color.b = pMessage->m_Color.b / 255.0; - } - const CLockScope LockScope(m_ConsoleMutex); - if(m_pConsole) - { - m_pConsole->m_LocalConsole.PrintLine(pMessage->m_aLine, pMessage->m_LineLength, Color); - } -} - -void CConsoleLogger::OnConsoleDeletion() -{ - const CLockScope LockScope(m_ConsoleMutex); - m_pConsole = nullptr; -} - -enum class EArgumentCompletionType -{ - NONE, - TUNE, - SETTING, - KEY, -}; - -class CArgumentCompletionEntry -{ -public: - EArgumentCompletionType m_Type; - const char *m_pCommandName; - int m_ArgumentIndex; -}; - -static const CArgumentCompletionEntry gs_aArgumentCompletionEntries[] = { - {EArgumentCompletionType::TUNE, "tune", 0}, - {EArgumentCompletionType::TUNE, "tune_reset", 0}, - {EArgumentCompletionType::TUNE, "toggle_tune", 0}, - {EArgumentCompletionType::TUNE, "tune_zone", 1}, - {EArgumentCompletionType::SETTING, "reset", 0}, - {EArgumentCompletionType::SETTING, "toggle", 0}, - {EArgumentCompletionType::SETTING, "access_level", 0}, - {EArgumentCompletionType::SETTING, "+toggle", 0}, - {EArgumentCompletionType::KEY, "bind", 0}, - {EArgumentCompletionType::KEY, "binds", 0}, - {EArgumentCompletionType::KEY, "unbind", 0}, -}; - -static std::pair ArgumentCompletion(const char *pStr) -{ - const char *pCommandStart = pStr; - const char *pIt = pStr; - pIt = str_skip_to_whitespace_const(pIt); - int CommandLength = pIt - pCommandStart; - const char *pCommandEnd = pIt; - - if(!CommandLength) - return {EArgumentCompletionType::NONE, -1}; - - pIt = str_skip_whitespaces_const(pIt); - if(pIt == pCommandEnd) - return {EArgumentCompletionType::NONE, -1}; - - for(const auto &Entry : gs_aArgumentCompletionEntries) - { - int Length = maximum(str_length(Entry.m_pCommandName), CommandLength); - if(str_comp_nocase_num(Entry.m_pCommandName, pCommandStart, Length) == 0) - { - int CurrentArg = 0; - const char *pArgStart = nullptr, *pArgEnd = nullptr; - while(CurrentArg < Entry.m_ArgumentIndex) - { - pArgStart = pIt; - pIt = str_skip_to_whitespace_const(pIt); // Skip argument value - pArgEnd = pIt; - - if(!pIt[0] || pArgStart == pIt) // Check that argument is not empty - return {EArgumentCompletionType::NONE, -1}; - - pIt = str_skip_whitespaces_const(pIt); // Go to next argument position - CurrentArg++; - } - if(pIt == pArgEnd) - return {EArgumentCompletionType::NONE, -1}; // Check that there is at least one space after - return {Entry.m_Type, pIt - pStr}; - } - } - return {EArgumentCompletionType::NONE, -1}; -} - -static int PossibleTunings(const char *pStr, IConsole::FPossibleCallback pfnCallback = IConsole::EmptyPossibleCommandCallback, void *pUser = nullptr) -{ - int Index = 0; - for(int i = 0; i < CTuningParams::Num(); i++) - { - if(str_find_nocase(CTuningParams::Name(i), pStr)) - { - pfnCallback(Index, CTuningParams::Name(i), pUser); - Index++; - } - } - return Index; -} - -static int PossibleKeys(const char *pStr, IInput *pInput, IConsole::FPossibleCallback pfnCallback = IConsole::EmptyPossibleCommandCallback, void *pUser = nullptr) -{ - int Index = 0; - for(int Key = KEY_A; Key < KEY_JOY_AXIS_11_RIGHT; Key++) - { - // Ignore unnamed keys starting with '&' - const char *pKeyName = pInput->KeyName(Key); - if(pKeyName[0] != '&' && str_find_nocase(pKeyName, pStr)) - { - pfnCallback(Index, pKeyName, pUser); - Index++; - } - } - return Index; -} - -const ColorRGBA CGameConsole::ms_SearchHighlightColor = ColorRGBA(1.0f, 0.0f, 0.0f, 1.0f); -const ColorRGBA CGameConsole::ms_SearchSelectedColor = ColorRGBA(1.0f, 1.0f, 0.0f, 1.0f); - -CGameConsole::CInstance::CInstance(int Type) -{ - m_pHistoryEntry = 0x0; - - m_Type = Type; - - if(Type == CGameConsole::CONSOLETYPE_LOCAL) - { - m_pName = "local_console"; - m_CompletionFlagmask = CFGFLAG_CLIENT; - } - else - { - m_pName = "remote_console"; - m_CompletionFlagmask = CFGFLAG_SERVER; - } - - m_aCompletionBuffer[0] = 0; - m_CompletionChosen = -1; - m_aCompletionBufferArgument[0] = 0; - m_CompletionChosenArgument = -1; - m_CompletionArgumentPosition = 0; - Reset(); - - m_aUser[0] = '\0'; - m_UserGot = false; - m_UsernameReq = false; - - m_IsCommand = false; - - m_Backlog.SetPopCallback([this](CBacklogEntry *pEntry) { - if(pEntry->m_LineCount != -1) - { - m_NewLineCounter -= pEntry->m_LineCount; - } - }); - - m_Input.SetClipboardLineCallback([this](const char *pStr) { ExecuteLine(pStr); }); - - m_CurrentMatchIndex = -1; - m_aCurrentSearchString[0] = '\0'; -} - -void CGameConsole::CInstance::Init(CGameConsole *pGameConsole) -{ - m_pGameConsole = pGameConsole; -} - -void CGameConsole::CInstance::ClearBacklog() -{ - { - // We must ensure that no log messages are printed while owning - // m_BacklogPendingLock or this will result in a dead lock. - const CLockScope LockScope(m_BacklogPendingLock); - m_BacklogPending.Init(); - } - - m_Backlog.Init(); - m_BacklogCurLine = 0; - ClearSearch(); -} - -void CGameConsole::CInstance::UpdateBacklogTextAttributes() -{ - // Pending backlog entries are not handled because they don't have text attributes yet. - for(CBacklogEntry *pEntry = m_Backlog.First(); pEntry; pEntry = m_Backlog.Next(pEntry)) - { - UpdateEntryTextAttributes(pEntry); - } -} - -void CGameConsole::CInstance::PumpBacklogPending() -{ - { - // We must ensure that no log messages are printed while owning - // m_BacklogPendingLock or this will result in a dead lock. - const CLockScope LockScopePending(m_BacklogPendingLock); - for(CBacklogEntry *pPendingEntry = m_BacklogPending.First(); pPendingEntry; pPendingEntry = m_BacklogPending.Next(pPendingEntry)) - { - const size_t EntrySize = sizeof(CBacklogEntry) + pPendingEntry->m_Length; - CBacklogEntry *pEntry = m_Backlog.Allocate(EntrySize); - mem_copy(pEntry, pPendingEntry, EntrySize); - } - - m_BacklogPending.Init(); - } - - // Update text attributes and count number of added lines - m_pGameConsole->Ui()->MapScreen(); - for(CBacklogEntry *pEntry = m_Backlog.First(); pEntry; pEntry = m_Backlog.Next(pEntry)) - { - if(pEntry->m_LineCount == -1) - { - UpdateEntryTextAttributes(pEntry); - m_NewLineCounter += pEntry->m_LineCount; - } - } -} - -void CGameConsole::CInstance::ClearHistory() -{ - m_History.Init(); - m_pHistoryEntry = 0; -} - -void CGameConsole::CInstance::Reset() -{ - m_CompletionRenderOffset = 0.0f; - m_CompletionRenderOffsetChange = 0.0f; - m_pCommandName = ""; - m_pCommandHelp = ""; - m_pCommandParams = ""; - m_CompletionArgumentPosition = 0; -} - -void CGameConsole::CInstance::ExecuteLine(const char *pLine) -{ - if(m_Type == CONSOLETYPE_LOCAL || m_pGameConsole->Client()->RconAuthed()) - { - const char *pPrevEntry = m_History.Last(); - if(pPrevEntry == nullptr || str_comp(pPrevEntry, pLine) != 0) - { - const size_t Size = str_length(pLine) + 1; - char *pEntry = m_History.Allocate(Size); - str_copy(pEntry, pLine, Size); - } - // print out the user's commands before they get run - char aBuf[IConsole::CMDLINE_LENGTH + 3]; - str_format(aBuf, sizeof(aBuf), "> %s", pLine); - m_pGameConsole->PrintLine(m_Type, aBuf); - } - - if(m_Type == CGameConsole::CONSOLETYPE_LOCAL) - { - m_pGameConsole->m_pConsole->ExecuteLine(pLine); - } - else - { - if(m_pGameConsole->Client()->RconAuthed()) - { - m_pGameConsole->Client()->Rcon(pLine); - } - else - { - if(!m_UserGot && m_UsernameReq) - { - m_UserGot = true; - str_copy(m_aUser, pLine); - } - else - { - m_pGameConsole->Client()->RconAuth(m_aUser, pLine, g_Config.m_ClDummy); - m_UserGot = false; - } - } - } -} - -void CGameConsole::CInstance::PossibleCommandsCompleteCallback(int Index, const char *pStr, void *pUser) -{ - CGameConsole::CInstance *pInstance = (CGameConsole::CInstance *)pUser; - if(pInstance->m_CompletionChosen == Index) - { - char aBefore[IConsole::CMDLINE_LENGTH]; - str_truncate(aBefore, sizeof(aBefore), pInstance->m_aCompletionBuffer, pInstance->m_CompletionCommandStart); - char aBuf[IConsole::CMDLINE_LENGTH]; - str_format(aBuf, sizeof(aBuf), "%s%s%s", aBefore, pStr, pInstance->m_aCompletionBuffer + pInstance->m_CompletionCommandEnd); - pInstance->m_Input.Set(aBuf); - pInstance->m_Input.SetCursorOffset(str_length(pStr) + pInstance->m_CompletionCommandStart); - } -} - -void CGameConsole::CInstance::GetCommand(const char *pInput, char (&aCmd)[IConsole::CMDLINE_LENGTH]) -{ - char aInput[IConsole::CMDLINE_LENGTH]; - str_copy(aInput, pInput); - m_CompletionCommandStart = 0; - m_CompletionCommandEnd = 0; - - char aaSeparators[][2] = {";", "\""}; - for(auto *pSeparator : aaSeparators) - { - int Start, End; - str_delimiters_around_offset(aInput + m_CompletionCommandStart, pSeparator, m_Input.GetCursorOffset() - m_CompletionCommandStart, &Start, &End); - m_CompletionCommandStart += Start; - m_CompletionCommandEnd = m_CompletionCommandStart + (End - Start); - aInput[m_CompletionCommandEnd] = '\0'; - } - - str_copy(aCmd, aInput + m_CompletionCommandStart, sizeof(aCmd)); -} - -static void StrCopyUntilSpace(char *pDest, size_t DestSize, const char *pSrc) -{ - const char *pSpace = str_find(pSrc, " "); - str_copy(pDest, pSrc, minimum(pSpace ? pSpace - pSrc + 1 : 1, DestSize)); -} - -void CGameConsole::CInstance::PossibleArgumentsCompleteCallback(int Index, const char *pStr, void *pUser) -{ - CGameConsole::CInstance *pInstance = (CGameConsole::CInstance *)pUser; - if(pInstance->m_CompletionChosenArgument == Index) - { - // get command - char aBuf[IConsole::CMDLINE_LENGTH]; - str_copy(aBuf, pInstance->GetString(), pInstance->m_CompletionArgumentPosition); - str_append(aBuf, " "); - - // append argument - str_append(aBuf, pStr); - pInstance->m_Input.Set(aBuf); - } -} - -bool CGameConsole::CInstance::OnInput(const IInput::CEvent &Event) -{ - bool Handled = false; - - // Don't allow input while the console is opening/closing - if(m_pGameConsole->m_ConsoleState == CONSOLE_OPENING || m_pGameConsole->m_ConsoleState == CONSOLE_CLOSING) - return Handled; - - auto &&SelectNextSearchMatch = [&](int Direction) { - if(!m_vSearchMatches.empty()) - { - m_CurrentMatchIndex += Direction; - if(m_CurrentMatchIndex >= (int)m_vSearchMatches.size()) - m_CurrentMatchIndex = 0; - if(m_CurrentMatchIndex < 0) - m_CurrentMatchIndex = (int)m_vSearchMatches.size() - 1; - m_HasSelection = false; - // Also scroll to the correct line - ScrollToCenter(m_vSearchMatches[m_CurrentMatchIndex].m_StartLine, m_vSearchMatches[m_CurrentMatchIndex].m_EndLine); - } - }; - - const int BacklogPrevLine = m_BacklogCurLine; - if(Event.m_Flags & IInput::FLAG_PRESS) - { - if(Event.m_Key == KEY_RETURN || Event.m_Key == KEY_KP_ENTER) - { - if(!m_Searching) - { - if(!m_Input.IsEmpty() || (m_UsernameReq && !m_pGameConsole->Client()->RconAuthed() && !m_UserGot)) - { - ExecuteLine(m_Input.GetString()); - m_Input.Clear(); - m_pHistoryEntry = nullptr; - } - } - else - { - SelectNextSearchMatch(m_pGameConsole->m_pClient->Input()->ShiftIsPressed() ? -1 : 1); - } - - Handled = true; - } - else if(Event.m_Key == KEY_UP) - { - if(m_Searching) - { - SelectNextSearchMatch(-1); - } - else if(m_Type == CONSOLETYPE_LOCAL || m_pGameConsole->Client()->RconAuthed()) - { - if(m_pHistoryEntry) - { - char *pTest = m_History.Prev(m_pHistoryEntry); - - if(pTest) - m_pHistoryEntry = pTest; - } - else - m_pHistoryEntry = m_History.Last(); - - if(m_pHistoryEntry) - m_Input.Set(m_pHistoryEntry); - } - Handled = true; - } - else if(Event.m_Key == KEY_DOWN) - { - if(m_Searching) - { - SelectNextSearchMatch(1); - } - else if(m_Type == CONSOLETYPE_LOCAL || m_pGameConsole->Client()->RconAuthed()) - { - if(m_pHistoryEntry) - m_pHistoryEntry = m_History.Next(m_pHistoryEntry); - - if(m_pHistoryEntry) - m_Input.Set(m_pHistoryEntry); - else - m_Input.Clear(); - } - Handled = true; - } - else if(Event.m_Key == KEY_TAB) - { - const int Direction = m_pGameConsole->m_pClient->Input()->ShiftIsPressed() ? -1 : 1; - - if(!m_Searching) - { - char aSearch[IConsole::CMDLINE_LENGTH]; - GetCommand(m_aCompletionBuffer, aSearch); - - // command completion - const bool UseTempCommands = m_Type == CGameConsole::CONSOLETYPE_REMOTE && m_pGameConsole->Client()->RconAuthed() && m_pGameConsole->Client()->UseTempRconCommands(); - int CompletionEnumerationCount = m_pGameConsole->m_pConsole->PossibleCommands(aSearch, m_CompletionFlagmask, UseTempCommands); - if(m_Type == CGameConsole::CONSOLETYPE_LOCAL || m_pGameConsole->Client()->RconAuthed()) - { - if(CompletionEnumerationCount) - { - if(m_CompletionChosen == -1 && Direction < 0) - m_CompletionChosen = 0; - m_CompletionChosen = (m_CompletionChosen + Direction + CompletionEnumerationCount) % CompletionEnumerationCount; - m_CompletionArgumentPosition = 0; - m_pGameConsole->m_pConsole->PossibleCommands(aSearch, m_CompletionFlagmask, UseTempCommands, PossibleCommandsCompleteCallback, this); - } - else if(m_CompletionChosen != -1) - { - m_CompletionChosen = -1; - Reset(); - } - } - - // Argument completion - const auto [CompletionType, CompletionPos] = ArgumentCompletion(GetString()); - if(CompletionType == EArgumentCompletionType::TUNE) - CompletionEnumerationCount = PossibleTunings(m_aCompletionBufferArgument); - else if(CompletionType == EArgumentCompletionType::SETTING) - CompletionEnumerationCount = m_pGameConsole->m_pConsole->PossibleCommands(m_aCompletionBufferArgument, m_CompletionFlagmask, UseTempCommands); - else if(CompletionType == EArgumentCompletionType::KEY) - CompletionEnumerationCount = PossibleKeys(m_aCompletionBufferArgument, m_pGameConsole->Input()); - - if(CompletionEnumerationCount) - { - if(m_CompletionChosenArgument == -1 && Direction < 0) - m_CompletionChosenArgument = 0; - m_CompletionChosenArgument = (m_CompletionChosenArgument + Direction + CompletionEnumerationCount) % CompletionEnumerationCount; - m_CompletionArgumentPosition = CompletionPos; - if(CompletionType == EArgumentCompletionType::TUNE) - PossibleTunings(m_aCompletionBufferArgument, PossibleArgumentsCompleteCallback, this); - else if(CompletionType == EArgumentCompletionType::SETTING) - m_pGameConsole->m_pConsole->PossibleCommands(m_aCompletionBufferArgument, m_CompletionFlagmask, UseTempCommands, PossibleArgumentsCompleteCallback, this); - else if(CompletionType == EArgumentCompletionType::KEY) - PossibleKeys(m_aCompletionBufferArgument, m_pGameConsole->Input(), PossibleArgumentsCompleteCallback, this); - } - else if(m_CompletionChosenArgument != -1) - { - m_CompletionChosenArgument = -1; - Reset(); - } - } - else - { - // Use Tab / Shift-Tab to cycle through search matches - SelectNextSearchMatch(Direction); - } - Handled = true; - } - else if(Event.m_Key == KEY_PAGEUP) - { - m_BacklogCurLine += GetLinesToScroll(-1, m_LinesRendered); - Handled = true; - } - else if(Event.m_Key == KEY_PAGEDOWN) - { - m_BacklogCurLine -= GetLinesToScroll(1, m_LinesRendered); - if(m_BacklogCurLine < 0) - { - m_BacklogCurLine = 0; - } - Handled = true; - } - else if(Event.m_Key == KEY_MOUSE_WHEEL_UP) - { - m_BacklogCurLine += GetLinesToScroll(-1, 1); - Handled = true; - } - else if(Event.m_Key == KEY_MOUSE_WHEEL_DOWN) - { - --m_BacklogCurLine; - if(m_BacklogCurLine < 0) - { - m_BacklogCurLine = 0; - } - Handled = true; - } - // in order not to conflict with CLineInput's handling of Home/End only - // react to it when the input is empty - else if(Event.m_Key == KEY_HOME && m_Input.IsEmpty()) - { - m_BacklogCurLine += GetLinesToScroll(-1, -1); - m_BacklogLastActiveLine = m_BacklogCurLine; - Handled = true; - } - else if(Event.m_Key == KEY_END && m_Input.IsEmpty()) - { - m_BacklogCurLine = 0; - Handled = true; - } - else if(Event.m_Key == KEY_ESCAPE && m_Searching) - { - SetSearching(false); - Handled = true; - } - else if(Event.m_Key == KEY_F && m_pGameConsole->Input()->ModifierIsPressed()) - { - SetSearching(true); - Handled = true; - } - } - - if(m_BacklogCurLine != BacklogPrevLine) - { - m_HasSelection = false; - } - - if(!Handled) - { - Handled = m_Input.ProcessInput(Event); - if(Handled) - UpdateSearch(); - } - - if(Event.m_Flags & (IInput::FLAG_PRESS | IInput::FLAG_TEXT)) - { - if(Event.m_Key != KEY_TAB && Event.m_Key != KEY_LSHIFT && Event.m_Key != KEY_RSHIFT) - { - const char *pInputStr = m_Input.GetString(); - - m_CompletionChosen = -1; - str_copy(m_aCompletionBuffer, pInputStr); - - const auto [CompletionType, CompletionPos] = ArgumentCompletion(GetString()); - if(CompletionType != EArgumentCompletionType::NONE) - { - for(const auto &Entry : gs_aArgumentCompletionEntries) - { - if(Entry.m_Type != CompletionType) - continue; - const int Len = str_length(Entry.m_pCommandName); - if(str_comp_nocase_num(pInputStr, Entry.m_pCommandName, Len) == 0 && str_isspace(pInputStr[Len])) - { - m_CompletionChosenArgument = -1; - str_copy(m_aCompletionBufferArgument, &pInputStr[CompletionPos]); - } - } - } - - Reset(); - } - - // find the current command - { - char aCmd[IConsole::CMDLINE_LENGTH]; - GetCommand(GetString(), aCmd); - char aBuf[IConsole::CMDLINE_LENGTH]; - StrCopyUntilSpace(aBuf, sizeof(aBuf), aCmd); - - const IConsole::CCommandInfo *pCommand = m_pGameConsole->m_pConsole->GetCommandInfo(aBuf, m_CompletionFlagmask, - m_Type != CGameConsole::CONSOLETYPE_LOCAL && m_pGameConsole->Client()->RconAuthed() && m_pGameConsole->Client()->UseTempRconCommands()); - if(pCommand) - { - m_IsCommand = true; - m_pCommandName = pCommand->m_pName; - m_pCommandHelp = pCommand->m_pHelp; - m_pCommandParams = pCommand->m_pParams; - } - else - m_IsCommand = false; - } - } - - return Handled; -} - -void CGameConsole::CInstance::PrintLine(const char *pLine, int Len, ColorRGBA PrintColor) -{ - // We must ensure that no log messages are printed while owning - // m_BacklogPendingLock or this will result in a dead lock. - const CLockScope LockScope(m_BacklogPendingLock); - CBacklogEntry *pEntry = m_BacklogPending.Allocate(sizeof(CBacklogEntry) + Len); - pEntry->m_YOffset = -1.0f; - pEntry->m_PrintColor = PrintColor; - pEntry->m_Length = Len; - pEntry->m_LineCount = -1; - str_copy(pEntry->m_aText, pLine, Len + 1); -} - -int CGameConsole::CInstance::GetLinesToScroll(int Direction, int LinesToScroll) -{ - auto *pEntry = m_Backlog.Last(); - int Line = 0; - int LinesToSkip = (Direction == -1 ? m_BacklogCurLine + m_LinesRendered : m_BacklogCurLine - 1); - while(Line < LinesToSkip && pEntry) - { - if(pEntry->m_LineCount == -1) - UpdateEntryTextAttributes(pEntry); - Line += pEntry->m_LineCount; - pEntry = m_Backlog.Prev(pEntry); - } - - int Amount = maximum(0, Line - LinesToSkip); - while(pEntry && (LinesToScroll > 0 ? Amount < LinesToScroll : true)) - { - if(pEntry->m_LineCount == -1) - UpdateEntryTextAttributes(pEntry); - Amount += pEntry->m_LineCount; - pEntry = Direction == -1 ? m_Backlog.Prev(pEntry) : m_Backlog.Next(pEntry); - } - - return LinesToScroll > 0 ? minimum(Amount, LinesToScroll) : Amount; -} - -void CGameConsole::CInstance::ScrollToCenter(int StartLine, int EndLine) -{ - // This method is used to scroll lines from `StartLine` to `EndLine` to the center of the screen, if possible. - - // Find target line - int Target = maximum(0, (int)ceil(StartLine - minimum(StartLine - EndLine, m_LinesRendered) / 2) - m_LinesRendered / 2); - if(m_BacklogCurLine == Target) - return; - - // Compute acutal amount of lines to scroll to make sure lines fit in viewport and we don't have empty space - int Direction = m_BacklogCurLine - Target < 0 ? -1 : 1; - int LinesToScroll = absolute(Target - m_BacklogCurLine); - int ComputedLines = GetLinesToScroll(Direction, LinesToScroll); - - if(Direction == -1) - m_BacklogCurLine += ComputedLines; - else - m_BacklogCurLine -= ComputedLines; -} - -void CGameConsole::CInstance::UpdateEntryTextAttributes(CBacklogEntry *pEntry) const -{ - CTextCursor Cursor; - m_pGameConsole->TextRender()->SetCursor(&Cursor, 0.0f, 0.0f, FONT_SIZE, 0); - Cursor.m_LineWidth = m_pGameConsole->Ui()->Screen()->w - 10; - Cursor.m_MaxLines = 10; - Cursor.m_LineSpacing = LINE_SPACING; - m_pGameConsole->TextRender()->TextEx(&Cursor, pEntry->m_aText, -1); - pEntry->m_YOffset = Cursor.Height(); - pEntry->m_LineCount = Cursor.m_LineCount; -} - -void CGameConsole::CInstance::SetSearching(bool Searching) -{ - m_Searching = Searching; - if(Searching) - { - m_Input.SetClipboardLineCallback(nullptr); // restore default behavior (replace newlines with spaces) - m_Input.Set(m_aCurrentSearchString); - m_Input.SelectAll(); - UpdateSearch(); - } - else - { - m_Input.SetClipboardLineCallback([this](const char *pLine) { ExecuteLine(pLine); }); - m_Input.Clear(); - } -} - -void CGameConsole::CInstance::ClearSearch() -{ - m_vSearchMatches.clear(); - m_CurrentMatchIndex = -1; - m_Input.Clear(); - m_aCurrentSearchString[0] = '\0'; -} - -void CGameConsole::CInstance::UpdateSearch() -{ - if(!m_Searching) - return; - - const char *pSearchText = m_Input.GetString(); - bool SearchChanged = str_utf8_comp_nocase(pSearchText, m_aCurrentSearchString) != 0; - - int SearchLength = m_Input.GetLength(); - str_copy(m_aCurrentSearchString, pSearchText); - - m_vSearchMatches.clear(); - if(pSearchText[0] == '\0') - { - m_CurrentMatchIndex = -1; - return; - } - - if(SearchChanged) - { - m_CurrentMatchIndex = -1; - m_HasSelection = false; - } - - ITextRender *pTextRender = m_pGameConsole->Ui()->TextRender(); - const int LineWidth = m_pGameConsole->Ui()->Screen()->w - 10.0f; - - CBacklogEntry *pEntry = m_Backlog.Last(); - int EntryLine = 0, LineToScrollStart = 0, LineToScrollEnd = 0; - - for(; pEntry; EntryLine += pEntry->m_LineCount, pEntry = m_Backlog.Prev(pEntry)) - { - const char *pSearchPos = str_utf8_find_nocase(pEntry->m_aText, pSearchText); - if(!pSearchPos) - continue; - - int EntryLineCount = pEntry->m_LineCount; - - // Find all occurences of the search string and save their positions - while(pSearchPos) - { - int Pos = pSearchPos - pEntry->m_aText; - - if(EntryLineCount == 1) - { - m_vSearchMatches.emplace_back(Pos, EntryLine, EntryLine, EntryLine); - if(EntryLine > LineToScrollStart) - { - LineToScrollStart = EntryLine; - LineToScrollEnd = EntryLine; - } - } - else - { - // A match can span multiple lines in case of a multiline entry, so we need to know which line the match starts at - // and which line it ends at in order to put it in viewport properly - STextSizeProperties Props; - int LineCount; - Props.m_pLineCount = &LineCount; - - // Compute line of end match - pTextRender->TextWidth(FONT_SIZE, pEntry->m_aText, Pos + SearchLength, LineWidth, 0, Props); - int EndLine = (EntryLineCount - LineCount); - int MatchEndLine = EntryLine + EndLine; - - // Compute line of start of match - int MatchStartLine = MatchEndLine; - if(LineCount > 1) - { - pTextRender->TextWidth(FONT_SIZE, pEntry->m_aText, Pos, LineWidth, 0, Props); - int StartLine = (EntryLineCount - LineCount); - MatchStartLine = EntryLine + StartLine; - } - - if(MatchStartLine > LineToScrollStart) - { - LineToScrollStart = MatchStartLine; - LineToScrollEnd = MatchEndLine; - } - - m_vSearchMatches.emplace_back(Pos, MatchStartLine, MatchEndLine, EntryLine); - } - - pSearchPos = str_utf8_find_nocase(pEntry->m_aText + Pos + SearchLength, pSearchText); - } - } - - if(!m_vSearchMatches.empty() && SearchChanged) - m_CurrentMatchIndex = 0; - else - m_CurrentMatchIndex = std::clamp(m_CurrentMatchIndex, -1, (int)m_vSearchMatches.size() - 1); - - // Reverse order of lines by sorting so we have matches from top to bottom instead of bottom to top - std::sort(m_vSearchMatches.begin(), m_vSearchMatches.end(), [](const SSearchMatch &MatchA, const SSearchMatch &MatchB) { - if(MatchA.m_StartLine == MatchB.m_StartLine) - return MatchA.m_Pos < MatchB.m_Pos; // Make sure to keep position order - return MatchA.m_StartLine > MatchB.m_StartLine; - }); - - if(!m_vSearchMatches.empty() && SearchChanged) - { - ScrollToCenter(LineToScrollStart, LineToScrollEnd); - } -} - -void CGameConsole::CInstance::Dump() -{ - char aTimestamp[20]; - str_timestamp(aTimestamp, sizeof(aTimestamp)); - char aFilename[IO_MAX_PATH_LENGTH]; - str_format(aFilename, sizeof(aFilename), "dumps/%s_dump_%s.txt", m_pName, aTimestamp); - IOHANDLE File = m_pGameConsole->Storage()->OpenFile(aFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE); - if(File) - { - PumpBacklogPending(); - for(CInstance::CBacklogEntry *pEntry = m_Backlog.First(); pEntry; pEntry = m_Backlog.Next(pEntry)) - { - io_write(File, pEntry->m_aText, pEntry->m_Length); - io_write_newline(File); - } - io_close(File); - log_info("console", "%s contents were written to '%s'", m_pName, aFilename); - } - else - { - log_error("console", "Failed to open '%s'", aFilename); - } -} - -CGameConsole::CGameConsole() : - m_LocalConsole(CONSOLETYPE_LOCAL), m_RemoteConsole(CONSOLETYPE_REMOTE) -{ - m_ConsoleType = CONSOLETYPE_LOCAL; - m_ConsoleState = CONSOLE_CLOSED; - m_StateChangeEnd = 0.0f; - m_StateChangeDuration = 0.1f; - - m_pConsoleLogger = new CConsoleLogger(this); -} - -CGameConsole::~CGameConsole() -{ - if(m_pConsoleLogger) - m_pConsoleLogger->OnConsoleDeletion(); -} - -CGameConsole::CInstance *CGameConsole::ConsoleForType(int ConsoleType) -{ - if(ConsoleType == CONSOLETYPE_REMOTE) - return &m_RemoteConsole; - return &m_LocalConsole; -} - -CGameConsole::CInstance *CGameConsole::CurrentConsole() -{ - return ConsoleForType(m_ConsoleType); -} - -void CGameConsole::OnReset() -{ - m_RemoteConsole.Reset(); -} - -// only defined for 0<=t<=1 -static float ConsoleScaleFunc(float t) -{ - return std::sin(std::acos(1.0f - t)); -} - -struct CCompletionOptionRenderInfo -{ - CGameConsole *m_pSelf; - CTextCursor m_Cursor; - const char *m_pCurrentCmd; - int m_WantedCompletion; - float m_Offset; - float *m_pOffsetChange; - float m_Width; - float m_TotalWidth; -}; - -void CGameConsole::PossibleCommandsRenderCallback(int Index, const char *pStr, void *pUser) -{ - CCompletionOptionRenderInfo *pInfo = static_cast(pUser); - - ColorRGBA TextColor; - if(Index == pInfo->m_WantedCompletion) - { - TextColor = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - const float TextWidth = pInfo->m_pSelf->TextRender()->TextWidth(pInfo->m_Cursor.m_FontSize, pStr); - const CUIRect Rect = {pInfo->m_Cursor.m_X - 2.0f, pInfo->m_Cursor.m_Y - 2.0f, TextWidth + 4.0f, pInfo->m_Cursor.m_FontSize + 4.0f}; - Rect.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.85f), IGraphics::CORNER_ALL, 2.0f); - - // scroll when out of sight - const bool MoveLeft = Rect.x - *pInfo->m_pOffsetChange < 0.0f; - const bool MoveRight = Rect.x + Rect.w - *pInfo->m_pOffsetChange > pInfo->m_Width; - if(MoveLeft && !MoveRight) - { - *pInfo->m_pOffsetChange -= -Rect.x + pInfo->m_Width / 4.0f; - } - else if(!MoveLeft && MoveRight) - { - *pInfo->m_pOffsetChange += Rect.x + Rect.w - pInfo->m_Width + pInfo->m_Width / 4.0f; - } - } - else - { - TextColor = ColorRGBA(0.75f, 0.75f, 0.75f, 1.0f); - } - - const char *pMatchStart = str_find_nocase(pStr, pInfo->m_pCurrentCmd); - if(pMatchStart) - { - pInfo->m_pSelf->TextRender()->TextColor(TextColor); - pInfo->m_pSelf->TextRender()->TextEx(&pInfo->m_Cursor, pStr, pMatchStart - pStr); - pInfo->m_pSelf->TextRender()->TextColor(1.0f, 0.75f, 0.0f, 1.0f); - pInfo->m_pSelf->TextRender()->TextEx(&pInfo->m_Cursor, pMatchStart, str_length(pInfo->m_pCurrentCmd)); - pInfo->m_pSelf->TextRender()->TextColor(TextColor); - pInfo->m_pSelf->TextRender()->TextEx(&pInfo->m_Cursor, pMatchStart + str_length(pInfo->m_pCurrentCmd)); - } - else - { - pInfo->m_pSelf->TextRender()->TextColor(TextColor); - pInfo->m_pSelf->TextRender()->TextEx(&pInfo->m_Cursor, pStr); - } - - pInfo->m_Cursor.m_X += 7.0f; - pInfo->m_TotalWidth = pInfo->m_Cursor.m_X + pInfo->m_Offset; -} - -void CGameConsole::Prompt(char (&aPrompt)[32]) -{ - CInstance *pConsole = CurrentConsole(); - if(pConsole->m_Searching) - { - str_format(aPrompt, sizeof(aPrompt), "%s: ", Localize("Searching")); - } - else if(m_ConsoleType == CONSOLETYPE_REMOTE) - { - if(Client()->State() == IClient::STATE_LOADING || Client()->State() == IClient::STATE_ONLINE) - { - if(Client()->RconAuthed()) - str_copy(aPrompt, "rcon> "); - else if(pConsole->m_UsernameReq && !pConsole->m_UserGot) - str_format(aPrompt, sizeof(aPrompt), "%s> ", Localize("Enter Username")); - else - str_format(aPrompt, sizeof(aPrompt), "%s> ", Localize("Enter Password")); - } - else - str_format(aPrompt, sizeof(aPrompt), "%s> ", Localize("NOT CONNECTED")); - } - else - { - str_copy(aPrompt, "> "); - } -} - -void CGameConsole::OnRender() -{ - CUIRect Screen = *Ui()->Screen(); - CInstance *pConsole = CurrentConsole(); - - const float MaxConsoleHeight = Screen.h * 3 / 5.0f; - float Progress = (Client()->GlobalTime() - (m_StateChangeEnd - m_StateChangeDuration)) / m_StateChangeDuration; - - if(Progress >= 1.0f) - { - if(m_ConsoleState == CONSOLE_CLOSING) - { - m_ConsoleState = CONSOLE_CLOSED; - pConsole->m_BacklogLastActiveLine = -1; - } - else if(m_ConsoleState == CONSOLE_OPENING) - { - m_ConsoleState = CONSOLE_OPEN; - pConsole->m_Input.Activate(EInputPriority::CONSOLE); - } - - Progress = 1.0f; - } - - if(m_ConsoleState == CONSOLE_OPEN && g_Config.m_ClEditor) - Toggle(CONSOLETYPE_LOCAL); - - if(m_ConsoleState == CONSOLE_CLOSED) - return; - - if(m_ConsoleState == CONSOLE_OPEN) - Input()->MouseModeAbsolute(); - - float ConsoleHeightScale; - if(m_ConsoleState == CONSOLE_OPENING) - ConsoleHeightScale = ConsoleScaleFunc(Progress); - else if(m_ConsoleState == CONSOLE_CLOSING) - ConsoleHeightScale = ConsoleScaleFunc(1.0f - Progress); - else // CONSOLE_OPEN - ConsoleHeightScale = ConsoleScaleFunc(1.0f); - - const float ConsoleHeight = ConsoleHeightScale * MaxConsoleHeight; - - const ColorRGBA ShadowColor = ColorRGBA(0.0f, 0.0f, 0.0f, 0.4f); - const ColorRGBA TransparentColor = ColorRGBA(0.0f, 0.0f, 0.0f, 0.0f); - const ColorRGBA aBackgroundColors[NUM_CONSOLETYPES] = {ColorRGBA(0.2f, 0.2f, 0.2f, 0.9f), ColorRGBA(0.4f, 0.2f, 0.2f, 0.9f)}; - const ColorRGBA aBorderColors[NUM_CONSOLETYPES] = {ColorRGBA(0.1f, 0.1f, 0.1f, 0.9f), ColorRGBA(0.2f, 0.1f, 0.1f, 0.9f)}; - - Ui()->MapScreen(); - - // background - Graphics()->TextureSet(g_pData->m_aImages[IMAGE_BACKGROUND_NOISE].m_Id); - Graphics()->QuadsBegin(); - Graphics()->SetColor(aBackgroundColors[m_ConsoleType]); - Graphics()->QuadsSetSubset(0, 0, Screen.w / 80.0f, ConsoleHeight / 80.0f); - IGraphics::CQuadItem QuadItemBackground(0.0f, 0.0f, Screen.w, ConsoleHeight); - Graphics()->QuadsDrawTL(&QuadItemBackground, 1); - Graphics()->QuadsEnd(); - - // bottom border - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - Graphics()->SetColor(aBorderColors[m_ConsoleType]); - IGraphics::CQuadItem QuadItemBorder(0.0f, ConsoleHeight, Screen.w, 1.0f); - Graphics()->QuadsDrawTL(&QuadItemBorder, 1); - Graphics()->QuadsEnd(); - - // bottom shadow - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - Graphics()->SetColor4(ShadowColor, ShadowColor, TransparentColor, TransparentColor); - IGraphics::CQuadItem QuadItemShadow(0.0f, ConsoleHeight + 1.0f, Screen.w, 10.0f); - Graphics()->QuadsDrawTL(&QuadItemShadow, 1); - Graphics()->QuadsEnd(); - - { - // Get height of 1 line - const float LineHeight = TextRender()->TextBoundingBox(FONT_SIZE, " ", -1, -1.0f, LINE_SPACING).m_H; - - const float RowHeight = FONT_SIZE * 2.0f; - - float x = 3; - float y = ConsoleHeight - RowHeight - 18.0f; - - const float InitialX = x; - const float InitialY = y; - - // render prompt - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, x, y + FONT_SIZE / 2.0f, FONT_SIZE, TEXTFLAG_RENDER); - - char aPrompt[32]; - Prompt(aPrompt); - TextRender()->TextEx(&Cursor, aPrompt); - - // check if mouse is pressed - const vec2 WindowSize = vec2(Graphics()->WindowWidth(), Graphics()->WindowHeight()); - const vec2 ScreenSize = vec2(Screen.w, Screen.h); - Ui()->UpdateTouchState(m_TouchState); - const auto &&GetMousePosition = [&]() -> vec2 { - if(m_TouchState.m_PrimaryPressed) - { - return m_TouchState.m_PrimaryPosition * ScreenSize; - } - else - { - return Input()->NativeMousePos() / WindowSize * ScreenSize; - } - }; - if(!pConsole->m_MouseIsPress && (m_TouchState.m_PrimaryPressed || Input()->NativeMousePressed(1))) - { - pConsole->m_MouseIsPress = true; - pConsole->m_MousePress = GetMousePosition(); - } - if(pConsole->m_MouseIsPress && !m_TouchState.m_PrimaryPressed && !Input()->NativeMousePressed(1)) - { - pConsole->m_MouseIsPress = false; - } - if(pConsole->m_MouseIsPress) - { - pConsole->m_MouseRelease = GetMousePosition(); - } - const float ScaledRowHeight = RowHeight / ScreenSize.y; - if(absolute(m_TouchState.m_ScrollAmount.y) >= ScaledRowHeight) - { - if(m_TouchState.m_ScrollAmount.y > 0.0f) - { - pConsole->m_BacklogCurLine += pConsole->GetLinesToScroll(-1, 1); - m_TouchState.m_ScrollAmount.y -= ScaledRowHeight; - } - else - { - --pConsole->m_BacklogCurLine; - if(pConsole->m_BacklogCurLine < 0) - pConsole->m_BacklogCurLine = 0; - m_TouchState.m_ScrollAmount.y += ScaledRowHeight; - } - pConsole->m_HasSelection = false; - } - - x = Cursor.m_X; - - if(m_ConsoleState == CONSOLE_OPEN) - { - if(pConsole->m_MousePress.y >= pConsole->m_BoundingBox.m_Y && pConsole->m_MousePress.y < pConsole->m_BoundingBox.m_Y + pConsole->m_BoundingBox.m_H) - { - CLineInput::SMouseSelection *pMouseSelection = pConsole->m_Input.GetMouseSelection(); - pMouseSelection->m_Selecting = pConsole->m_MouseIsPress; - pMouseSelection->m_PressMouse = pConsole->m_MousePress; - pMouseSelection->m_ReleaseMouse = pConsole->m_MouseRelease; - } - else if(pConsole->m_MouseIsPress) - { - pConsole->m_Input.SelectNothing(); - } - } - - // render console input (wrap line) - pConsole->m_Input.SetHidden(m_ConsoleType == CONSOLETYPE_REMOTE && Client()->State() == IClient::STATE_ONLINE && !Client()->RconAuthed() && (pConsole->m_UserGot || !pConsole->m_UsernameReq)); - if(m_ConsoleState == CONSOLE_OPEN) - { - pConsole->m_Input.Activate(EInputPriority::CONSOLE); // Ensure that the input is active - } - const CUIRect InputCursorRect = {x, y + FONT_SIZE * 1.5f, 0.0f, 0.0f}; - const bool WasChanged = pConsole->m_Input.WasChanged(); - const bool WasCursorChanged = pConsole->m_Input.WasCursorChanged(); - const bool Changed = WasChanged || WasCursorChanged; - pConsole->m_BoundingBox = pConsole->m_Input.Render(&InputCursorRect, FONT_SIZE, TEXTALIGN_BL, Changed, Screen.w - 10.0f - x, LINE_SPACING); - if(pConsole->m_LastInputHeight == 0.0f && pConsole->m_BoundingBox.m_H != 0.0f) - pConsole->m_LastInputHeight = pConsole->m_BoundingBox.m_H; - if(pConsole->m_Input.HasSelection()) - pConsole->m_HasSelection = false; // Clear console selection if we have a line input selection - - y -= pConsole->m_BoundingBox.m_H - FONT_SIZE; - TextRender()->SetCursor(&Cursor, x, y, FONT_SIZE, TEXTFLAG_RENDER); - Cursor.m_LineWidth = Screen.w - 10.0f - x; - Cursor.m_LineSpacing = LINE_SPACING; - - if(pConsole->m_LastInputHeight != pConsole->m_BoundingBox.m_H) - { - pConsole->m_HasSelection = false; - pConsole->m_MouseIsPress = false; - pConsole->m_LastInputHeight = pConsole->m_BoundingBox.m_H; - } - - // render possible commands - if(!pConsole->m_Searching && (m_ConsoleType == CONSOLETYPE_LOCAL || Client()->RconAuthed()) && !pConsole->m_Input.IsEmpty()) - { - CCompletionOptionRenderInfo Info; - Info.m_pSelf = this; - Info.m_WantedCompletion = pConsole->m_CompletionChosen; - Info.m_Offset = pConsole->m_CompletionRenderOffset; - Info.m_pOffsetChange = &pConsole->m_CompletionRenderOffsetChange; - Info.m_Width = Screen.w; - Info.m_TotalWidth = 0.0f; - char aCmd[IConsole::CMDLINE_LENGTH]; - pConsole->GetCommand(pConsole->m_aCompletionBuffer, aCmd); - Info.m_pCurrentCmd = aCmd; - - TextRender()->SetCursor(&Info.m_Cursor, InitialX - Info.m_Offset, InitialY + RowHeight + 2.0f, FONT_SIZE, TEXTFLAG_RENDER | TEXTFLAG_STOP_AT_END); - Info.m_Cursor.m_LineWidth = std::numeric_limits::max(); - const int NumCommands = m_pConsole->PossibleCommands(Info.m_pCurrentCmd, pConsole->m_CompletionFlagmask, m_ConsoleType != CGameConsole::CONSOLETYPE_LOCAL && Client()->RconAuthed() && Client()->UseTempRconCommands(), PossibleCommandsRenderCallback, &Info); - pConsole->m_CompletionRenderOffset = Info.m_Offset; - - if(NumCommands <= 0 && pConsole->m_IsCommand) - { - const auto [CompletionType, _] = ArgumentCompletion(Info.m_pCurrentCmd); - int NumArguments = 0; - if(CompletionType != EArgumentCompletionType::NONE) - { - Info.m_WantedCompletion = pConsole->m_CompletionChosenArgument; - Info.m_TotalWidth = 0.0f; - Info.m_pCurrentCmd = pConsole->m_aCompletionBufferArgument; - if(CompletionType == EArgumentCompletionType::TUNE) - NumArguments = PossibleTunings(Info.m_pCurrentCmd, PossibleCommandsRenderCallback, &Info); - else if(CompletionType == EArgumentCompletionType::SETTING) - NumArguments = m_pConsole->PossibleCommands(Info.m_pCurrentCmd, pConsole->m_CompletionFlagmask, m_ConsoleType != CGameConsole::CONSOLETYPE_LOCAL && Client()->RconAuthed() && Client()->UseTempRconCommands(), PossibleCommandsRenderCallback, &Info); - else if(CompletionType == EArgumentCompletionType::KEY) - NumArguments = PossibleKeys(Info.m_pCurrentCmd, Input(), PossibleCommandsRenderCallback, &Info); - pConsole->m_CompletionRenderOffset = Info.m_Offset; - } - - if(NumArguments <= 0 && pConsole->m_IsCommand) - { - char aBuf[1024]; - str_format(aBuf, sizeof(aBuf), "Help: %s ", pConsole->m_pCommandHelp); - TextRender()->TextEx(&Info.m_Cursor, aBuf, -1); - TextRender()->TextColor(0.75f, 0.75f, 0.75f, 1); - str_format(aBuf, sizeof(aBuf), "Usage: %s %s", pConsole->m_pCommandName, pConsole->m_pCommandParams); - TextRender()->TextEx(&Info.m_Cursor, aBuf, -1); - } - } - - Ui()->DoSmoothScrollLogic(&pConsole->m_CompletionRenderOffset, &pConsole->m_CompletionRenderOffsetChange, Info.m_Width, Info.m_TotalWidth); - } - else if(pConsole->m_Searching && !pConsole->m_Input.IsEmpty()) - { // Render current match and match count - CTextCursor MatchInfoCursor; - TextRender()->SetCursor(&MatchInfoCursor, InitialX, InitialY + RowHeight + 2.0f, FONT_SIZE, TEXTFLAG_RENDER); - TextRender()->TextColor(0.8f, 0.8f, 0.8f, 1.0f); - if(!pConsole->m_vSearchMatches.empty()) - { - char aBuf[64]; - str_format(aBuf, sizeof(aBuf), Localize("Match %d of %d"), pConsole->m_CurrentMatchIndex + 1, (int)pConsole->m_vSearchMatches.size()); - TextRender()->TextEx(&MatchInfoCursor, aBuf, -1); - } - else - { - TextRender()->TextEx(&MatchInfoCursor, Localize("No results"), -1); - } - } - - pConsole->PumpBacklogPending(); - if(pConsole->m_NewLineCounter != 0) - { - pConsole->UpdateSearch(); - - // keep scroll position when new entries are printed. - if(pConsole->m_BacklogCurLine != 0 || pConsole->m_HasSelection) - { - pConsole->m_BacklogCurLine += pConsole->m_NewLineCounter; - pConsole->m_BacklogLastActiveLine += pConsole->m_NewLineCounter; - } - if(pConsole->m_NewLineCounter < 0) - pConsole->m_NewLineCounter = 0; - } - - // render console log (current entry, status, wrap lines) - CInstance::CBacklogEntry *pEntry = pConsole->m_Backlog.Last(); - float OffsetY = 0.0f; - - std::string SelectionString; - - if(pConsole->m_BacklogLastActiveLine < 0) - pConsole->m_BacklogLastActiveLine = pConsole->m_BacklogCurLine; - - int LineNum = -1; - pConsole->m_LinesRendered = 0; - - int SkippedLines = 0; - bool First = true; - - const float XScale = Graphics()->ScreenWidth() / Screen.w; - const float YScale = Graphics()->ScreenHeight() / Screen.h; - const float CalcOffsetY = LineHeight * std::floor((y - RowHeight) / LineHeight); - const float ClipStartY = (y - CalcOffsetY) * YScale; - Graphics()->ClipEnable(0, ClipStartY, Screen.w * XScale, (y + 2.0f) * YScale - ClipStartY); - - while(pEntry) - { - if(pEntry->m_LineCount == -1) - pConsole->UpdateEntryTextAttributes(pEntry); - - LineNum += pEntry->m_LineCount; - if(LineNum < pConsole->m_BacklogLastActiveLine) - { - SkippedLines += pEntry->m_LineCount; - pEntry = pConsole->m_Backlog.Prev(pEntry); - continue; - } - TextRender()->TextColor(pEntry->m_PrintColor); - - if(First) - { - OffsetY -= (pConsole->m_BacklogLastActiveLine - SkippedLines) * LineHeight; - } - - const float LocalOffsetY = OffsetY + pEntry->m_YOffset / (float)pEntry->m_LineCount; - OffsetY += pEntry->m_YOffset; - - // Only apply offset if we do not keep scroll position (m_BacklogCurLine == 0) - if((pConsole->m_HasSelection || pConsole->m_MouseIsPress) && pConsole->m_NewLineCounter > 0 && pConsole->m_BacklogCurLine == 0) - { - pConsole->m_MousePress.y -= pEntry->m_YOffset; - if(!pConsole->m_MouseIsPress) - pConsole->m_MouseRelease.y -= pEntry->m_YOffset; - } - - // stop rendering when lines reach the top - const bool Outside = y - OffsetY <= RowHeight; - const bool CanRenderOneLine = y - LocalOffsetY > RowHeight; - if(Outside && !CanRenderOneLine) - break; - - const int LinesNotRendered = pEntry->m_LineCount - minimum((int)std::floor((y - LocalOffsetY) / RowHeight), pEntry->m_LineCount); - pConsole->m_LinesRendered -= LinesNotRendered; - - TextRender()->SetCursor(&Cursor, 0.0f, y - OffsetY, FONT_SIZE, TEXTFLAG_RENDER); - Cursor.m_LineWidth = Screen.w - 10.0f; - Cursor.m_MaxLines = pEntry->m_LineCount; - Cursor.m_LineSpacing = LINE_SPACING; - Cursor.m_CalculateSelectionMode = (m_ConsoleState == CONSOLE_OPEN && pConsole->m_MousePress.y < pConsole->m_BoundingBox.m_Y && (pConsole->m_MouseIsPress || (pConsole->m_CurSelStart != pConsole->m_CurSelEnd) || pConsole->m_HasSelection)) ? TEXT_CURSOR_SELECTION_MODE_CALCULATE : TEXT_CURSOR_SELECTION_MODE_NONE; - Cursor.m_PressMouse = pConsole->m_MousePress; - Cursor.m_ReleaseMouse = pConsole->m_MouseRelease; - - if(pConsole->m_Searching && pConsole->m_CurrentMatchIndex != -1) - { - std::vector vMatches; - std::copy_if(pConsole->m_vSearchMatches.begin(), pConsole->m_vSearchMatches.end(), std::back_inserter(vMatches), [&](const CInstance::SSearchMatch &Match) { return Match.m_EntryLine == LineNum + 1 - pEntry->m_LineCount; }); - - auto CurrentSelectedOccurrence = pConsole->m_vSearchMatches[pConsole->m_CurrentMatchIndex]; - - std::vector vColorSplits; - for(const auto &Match : vMatches) - { - bool IsSelected = CurrentSelectedOccurrence.m_EntryLine == Match.m_EntryLine && CurrentSelectedOccurrence.m_Pos == Match.m_Pos; - Cursor.m_vColorSplits.emplace_back( - Match.m_Pos, - pConsole->m_Input.GetLength(), - IsSelected ? ms_SearchSelectedColor : ms_SearchHighlightColor); - } - } - - TextRender()->TextEx(&Cursor, pEntry->m_aText, -1); - Cursor.m_vColorSplits = {}; - - if(Cursor.m_CalculateSelectionMode == TEXT_CURSOR_SELECTION_MODE_CALCULATE) - { - pConsole->m_CurSelStart = minimum(Cursor.m_SelectionStart, Cursor.m_SelectionEnd); - pConsole->m_CurSelEnd = maximum(Cursor.m_SelectionStart, Cursor.m_SelectionEnd); - } - pConsole->m_LinesRendered += First ? pEntry->m_LineCount - (pConsole->m_BacklogLastActiveLine - SkippedLines) : pEntry->m_LineCount; - - if(pConsole->m_CurSelStart != pConsole->m_CurSelEnd) - { - if(m_WantsSelectionCopy) - { - const bool HasNewLine = !SelectionString.empty(); - const size_t OffUTF8Start = str_utf8_offset_chars_to_bytes(pEntry->m_aText, pConsole->m_CurSelStart); - const size_t OffUTF8End = str_utf8_offset_chars_to_bytes(pEntry->m_aText, pConsole->m_CurSelEnd); - SelectionString.insert(0, (std::string(&pEntry->m_aText[OffUTF8Start], OffUTF8End - OffUTF8Start) + (HasNewLine ? "\n" : ""))); - } - pConsole->m_HasSelection = true; - } - - if(pConsole->m_NewLineCounter > 0) // Decrease by the entry line count since we can have multiline entries - pConsole->m_NewLineCounter -= pEntry->m_LineCount; - - pEntry = pConsole->m_Backlog.Prev(pEntry); - - // reset color - TextRender()->TextColor(TextRender()->DefaultTextColor()); - First = false; - - if(!pEntry) - break; - } - - // Make sure to reset m_NewLineCounter when we are done drawing - // This is because otherwise, if many entries are printed at once while console is - // hidden, m_NewLineCounter will always be > 0 since the console won't be able to render - // them all, thus wont be able to decrease m_NewLineCounter to 0. - // This leads to an infinite increase of m_BacklogCurLine and m_BacklogLastActiveLine - // when we want to keep scroll position. - pConsole->m_NewLineCounter = 0; - - Graphics()->ClipDisable(); - - pConsole->m_BacklogLastActiveLine = pConsole->m_BacklogCurLine; - - if(m_WantsSelectionCopy && !SelectionString.empty()) - { - pConsole->m_HasSelection = false; - pConsole->m_CurSelStart = -1; - pConsole->m_CurSelEnd = -1; - Input()->SetClipboardText(SelectionString.c_str()); - m_WantsSelectionCopy = false; - } - - TextRender()->TextColor(TextRender()->DefaultTextColor()); - - // render current lines and status (locked, following) - char aBuf[128]; - str_format(aBuf, sizeof(aBuf), Localize("Lines %d - %d (%s)"), pConsole->m_BacklogCurLine + 1, pConsole->m_BacklogCurLine + pConsole->m_LinesRendered, pConsole->m_BacklogCurLine != 0 ? Localize("Locked") : Localize("Following")); - TextRender()->Text(10.0f, FONT_SIZE / 2.f, FONT_SIZE, aBuf); - - if(m_ConsoleType == CONSOLETYPE_REMOTE && Client()->ReceivingRconCommands()) - { - float Percentage = Client()->GotRconCommandsPercentage(); - SProgressSpinnerProperties ProgressProps; - ProgressProps.m_Progress = Percentage; - Ui()->RenderProgressSpinner(vec2(Screen.w / 4.0f + FONT_SIZE / 2.f, FONT_SIZE), FONT_SIZE / 2.f, ProgressProps); - - char aLoading[128]; - str_copy(aLoading, Localize("Loading commands…")); - if(Percentage > 0) - { - char aPercentage[8]; - str_format(aPercentage, sizeof(aPercentage), " %d%%", (int)(Percentage * 100)); - str_append(aLoading, aPercentage); - } - TextRender()->Text(Screen.w / 4.0f + FONT_SIZE + 2.0f, FONT_SIZE / 2.f, FONT_SIZE, aLoading); - } - - // render version - str_copy(aBuf, "v" GAME_VERSION " on " CONF_PLATFORM_STRING " " CONF_ARCH_STRING); - TextRender()->Text(Screen.w - TextRender()->TextWidth(FONT_SIZE, aBuf) - 10.0f, FONT_SIZE / 2.f, FONT_SIZE, aBuf); - } -} - -void CGameConsole::OnMessage(int MsgType, void *pRawMsg) -{ -} - -bool CGameConsole::OnInput(const IInput::CEvent &Event) -{ - // accept input when opening, but not at first frame to discard the input that caused the console to open - if(m_ConsoleState != CONSOLE_OPEN && (m_ConsoleState != CONSOLE_OPENING || m_StateChangeEnd == Client()->GlobalTime() + m_StateChangeDuration)) - return false; - if((Event.m_Key >= KEY_F1 && Event.m_Key <= KEY_F12) || (Event.m_Key >= KEY_F13 && Event.m_Key <= KEY_F24)) - return false; - - if(Event.m_Key == KEY_ESCAPE && (Event.m_Flags & IInput::FLAG_PRESS) && !CurrentConsole()->m_Searching) - Toggle(m_ConsoleType); - else if(!CurrentConsole()->OnInput(Event)) - { - if(m_pClient->Input()->ModifierIsPressed() && Event.m_Flags & IInput::FLAG_PRESS && Event.m_Key == KEY_C) - m_WantsSelectionCopy = true; - } - - return true; -} - -void CGameConsole::Toggle(int Type) -{ - if(m_ConsoleType != Type && (m_ConsoleState == CONSOLE_OPEN || m_ConsoleState == CONSOLE_OPENING)) - { - // don't toggle console, just switch what console to use - } - else - { - if(m_ConsoleState == CONSOLE_CLOSED || m_ConsoleState == CONSOLE_OPEN) - { - m_StateChangeEnd = Client()->GlobalTime() + m_StateChangeDuration; - } - else - { - float Progress = m_StateChangeEnd - Client()->GlobalTime(); - float ReversedProgress = m_StateChangeDuration - Progress; - - m_StateChangeEnd = Client()->GlobalTime() + ReversedProgress; - } - - if(m_ConsoleState == CONSOLE_CLOSED || m_ConsoleState == CONSOLE_CLOSING) - { - Ui()->SetEnabled(false); - m_ConsoleState = CONSOLE_OPENING; - } - else - { - ConsoleForType(Type)->m_Input.Deactivate(); - Input()->MouseModeRelative(); - Ui()->SetEnabled(true); - m_pClient->OnRelease(); - m_ConsoleState = CONSOLE_CLOSING; - } - } - m_ConsoleType = Type; -} - -void CGameConsole::ConToggleLocalConsole(IConsole::IResult *pResult, void *pUserData) -{ - ((CGameConsole *)pUserData)->Toggle(CONSOLETYPE_LOCAL); -} - -void CGameConsole::ConToggleRemoteConsole(IConsole::IResult *pResult, void *pUserData) -{ - ((CGameConsole *)pUserData)->Toggle(CONSOLETYPE_REMOTE); -} - -void CGameConsole::ConClearLocalConsole(IConsole::IResult *pResult, void *pUserData) -{ - ((CGameConsole *)pUserData)->m_LocalConsole.ClearBacklog(); -} - -void CGameConsole::ConClearRemoteConsole(IConsole::IResult *pResult, void *pUserData) -{ - ((CGameConsole *)pUserData)->m_RemoteConsole.ClearBacklog(); -} - -void CGameConsole::ConDumpLocalConsole(IConsole::IResult *pResult, void *pUserData) -{ - ((CGameConsole *)pUserData)->m_LocalConsole.Dump(); -} - -void CGameConsole::ConDumpRemoteConsole(IConsole::IResult *pResult, void *pUserData) -{ - ((CGameConsole *)pUserData)->m_RemoteConsole.Dump(); -} - -void CGameConsole::ConConsolePageUp(IConsole::IResult *pResult, void *pUserData) -{ - CInstance *pConsole = ((CGameConsole *)pUserData)->CurrentConsole(); - pConsole->m_BacklogCurLine += pConsole->GetLinesToScroll(-1, pConsole->m_LinesRendered); - pConsole->m_HasSelection = false; -} - -void CGameConsole::ConConsolePageDown(IConsole::IResult *pResult, void *pUserData) -{ - CInstance *pConsole = ((CGameConsole *)pUserData)->CurrentConsole(); - pConsole->m_BacklogCurLine -= pConsole->GetLinesToScroll(1, pConsole->m_LinesRendered); - pConsole->m_HasSelection = false; - if(pConsole->m_BacklogCurLine < 0) - pConsole->m_BacklogCurLine = 0; -} - -void CGameConsole::ConchainConsoleOutputLevel(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - CGameConsole *pSelf = (CGameConsole *)pUserData; - pfnCallback(pResult, pCallbackUserData); - if(pResult->NumArguments()) - { - pSelf->m_pConsoleLogger->SetFilter(CLogFilter{IConsole::ToLogLevelFilter(g_Config.m_ConsoleOutputLevel)}); - } -} - -void CGameConsole::RequireUsername(bool UsernameReq) -{ - if((m_RemoteConsole.m_UsernameReq = UsernameReq)) - { - m_RemoteConsole.m_aUser[0] = '\0'; - m_RemoteConsole.m_UserGot = false; - } -} - -void CGameConsole::PrintLine(int Type, const char *pLine) -{ - if(Type == CONSOLETYPE_LOCAL) - m_LocalConsole.PrintLine(pLine, str_length(pLine), TextRender()->DefaultTextColor()); - else if(Type == CONSOLETYPE_REMOTE) - m_RemoteConsole.PrintLine(pLine, str_length(pLine), TextRender()->DefaultTextColor()); -} - -void CGameConsole::OnConsoleInit() -{ - // init console instances - m_LocalConsole.Init(this); - m_RemoteConsole.Init(this); - - m_pConsole = Kernel()->RequestInterface(); - - Console()->Register("toggle_local_console", "", CFGFLAG_CLIENT, ConToggleLocalConsole, this, "Toggle local console"); - Console()->Register("toggle_remote_console", "", CFGFLAG_CLIENT, ConToggleRemoteConsole, this, "Toggle remote console"); - Console()->Register("clear_local_console", "", CFGFLAG_CLIENT, ConClearLocalConsole, this, "Clear local console"); - Console()->Register("clear_remote_console", "", CFGFLAG_CLIENT, ConClearRemoteConsole, this, "Clear remote console"); - Console()->Register("dump_local_console", "", CFGFLAG_CLIENT, ConDumpLocalConsole, this, "Write local console contents to a text file"); - Console()->Register("dump_remote_console", "", CFGFLAG_CLIENT, ConDumpRemoteConsole, this, "Write remote console contents to a text file"); - - Console()->Register("console_page_up", "", CFGFLAG_CLIENT, ConConsolePageUp, this, "Previous page in console"); - Console()->Register("console_page_down", "", CFGFLAG_CLIENT, ConConsolePageDown, this, "Next page in console"); - Console()->Chain("console_output_level", ConchainConsoleOutputLevel, this); -} - -void CGameConsole::OnInit() -{ - Engine()->SetAdditionalLogger(std::unique_ptr(m_pConsoleLogger)); - // add resize event - Graphics()->AddWindowResizeListener([this]() { - m_LocalConsole.UpdateBacklogTextAttributes(); - m_LocalConsole.m_HasSelection = false; - m_RemoteConsole.UpdateBacklogTextAttributes(); - m_RemoteConsole.m_HasSelection = false; - }); -} - -void CGameConsole::OnStateChange(int NewState, int OldState) -{ - if(OldState <= IClient::STATE_ONLINE && NewState == IClient::STATE_OFFLINE) - { - m_RemoteConsole.m_UserGot = false; - m_RemoteConsole.m_aUser[0] = '\0'; - m_RemoteConsole.m_Input.Clear(); - m_RemoteConsole.m_UsernameReq = false; - } -} diff --git a/src/game/client/components/console.h b/src/game/client/components/console.h deleted file mode 100644 index 3ad5355d64..0000000000 --- a/src/game/client/components/console.h +++ /dev/null @@ -1,202 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_CONSOLE_H -#define GAME_CLIENT_COMPONENTS_CONSOLE_H - -#include - -#include -#include - -#include -#include -#include - -enum -{ - CONSOLE_CLOSED, - CONSOLE_OPENING, - CONSOLE_OPEN, - CONSOLE_CLOSING, -}; - -class CConsoleLogger; - -class CGameConsole : public CComponent -{ - friend class CConsoleLogger; - class CInstance - { - public: - struct CBacklogEntry - { - float m_YOffset; - int m_LineCount; - ColorRGBA m_PrintColor; - size_t m_Length; - char m_aText[1]; - }; - CStaticRingBuffer m_Backlog; - CLock m_BacklogPendingLock; - CStaticRingBuffer m_BacklogPending GUARDED_BY(m_BacklogPendingLock); - CStaticRingBuffer m_History; - char *m_pHistoryEntry; - - CLineInputBuffered m_Input; - const char *m_pName; - int m_Type; - int m_BacklogCurLine; - int m_BacklogLastActiveLine = -1; - int m_LinesRendered; - - STextBoundingBox m_BoundingBox = {0.0f, 0.0f, 0.0f, 0.0f}; - float m_LastInputHeight = 0.0f; - - bool m_MouseIsPress = false; - vec2 m_MousePress = vec2(0.0f, 0.0f); - vec2 m_MouseRelease = vec2(0.0f, 0.0f); - int m_CurSelStart = 0; - int m_CurSelEnd = 0; - bool m_HasSelection = false; - int m_NewLineCounter = 0; - - CGameConsole *m_pGameConsole; - - char m_aCompletionBuffer[IConsole::CMDLINE_LENGTH]; - int m_CompletionChosen; - char m_aCompletionBufferArgument[IConsole::CMDLINE_LENGTH]; - int m_CompletionChosenArgument; - int m_CompletionFlagmask; - float m_CompletionRenderOffset; - float m_CompletionRenderOffsetChange; - int m_CompletionArgumentPosition; - int m_CompletionCommandStart = 0; - int m_CompletionCommandEnd = 0; - - char m_aUser[32]; - bool m_UserGot; - bool m_UsernameReq; - - bool m_IsCommand; - const char *m_pCommandName; - const char *m_pCommandHelp; - const char *m_pCommandParams; - - bool m_Searching = false; - struct SSearchMatch - { - int m_Pos; - int m_StartLine; - int m_EndLine; - int m_EntryLine; - - SSearchMatch(int Pos, int StartLine, int EndLine, int EntryLine) : - m_Pos(Pos), m_StartLine(StartLine), m_EndLine(EndLine), m_EntryLine(EntryLine) {} - }; - int m_CurrentMatchIndex; - char m_aCurrentSearchString[IConsole::CMDLINE_LENGTH]; - std::vector m_vSearchMatches; - - CInstance(int t); - void Init(CGameConsole *pGameConsole); - - void ClearBacklog() REQUIRES(!m_BacklogPendingLock); - void UpdateBacklogTextAttributes(); - void PumpBacklogPending() REQUIRES(!m_BacklogPendingLock); - void ClearHistory(); - void Reset(); - - void ExecuteLine(const char *pLine); - - bool OnInput(const IInput::CEvent &Event); - void PrintLine(const char *pLine, int Len, ColorRGBA PrintColor) REQUIRES(!m_BacklogPendingLock); - int GetLinesToScroll(int Direction, int LinesToScroll); - void ScrollToCenter(int StartLine, int EndLine); - void Dump() REQUIRES(!m_BacklogPendingLock); - - const char *GetString() const { return m_Input.GetString(); } - /** - * Gets the command at the current cursor including surrounding spaces. - * Commands are split by semicolons. - * - * So if the current console input is for example "hello; world ;foo" - * ^ - * and the cursor is here -------------/ - * The result would be " world " - * - * @param pInput the console input line - * @param aCmd the command the cursor is at - */ - void GetCommand(const char *pInput, char (&aCmd)[IConsole::CMDLINE_LENGTH]); - static void PossibleCommandsCompleteCallback(int Index, const char *pStr, void *pUser); - static void PossibleArgumentsCompleteCallback(int Index, const char *pStr, void *pUser); - - void UpdateEntryTextAttributes(CBacklogEntry *pEntry) const; - - private: - void SetSearching(bool Searching); - void ClearSearch(); - void UpdateSearch(); - - friend class CGameConsole; - }; - - class IConsole *m_pConsole; - CConsoleLogger *m_pConsoleLogger = nullptr; - - CInstance m_LocalConsole; - CInstance m_RemoteConsole; - - CInstance *ConsoleForType(int ConsoleType); - CInstance *CurrentConsole(); - - int m_ConsoleType; - int m_ConsoleState; - float m_StateChangeEnd; - float m_StateChangeDuration; - - bool m_WantsSelectionCopy = false; - CUi::CTouchState m_TouchState; - - static const ColorRGBA ms_SearchHighlightColor; - static const ColorRGBA ms_SearchSelectedColor; - - static void PossibleCommandsRenderCallback(int Index, const char *pStr, void *pUser); - static void ConToggleLocalConsole(IConsole::IResult *pResult, void *pUserData); - static void ConToggleRemoteConsole(IConsole::IResult *pResult, void *pUserData); - static void ConClearLocalConsole(IConsole::IResult *pResult, void *pUserData); - static void ConClearRemoteConsole(IConsole::IResult *pResult, void *pUserData); - static void ConDumpLocalConsole(IConsole::IResult *pResult, void *pUserData); - static void ConDumpRemoteConsole(IConsole::IResult *pResult, void *pUserData); - static void ConConsolePageUp(IConsole::IResult *pResult, void *pUserData); - static void ConConsolePageDown(IConsole::IResult *pResult, void *pUserData); - static void ConchainConsoleOutputLevel(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - -public: - enum - { - CONSOLETYPE_LOCAL = 0, - CONSOLETYPE_REMOTE, - NUM_CONSOLETYPES - }; - - CGameConsole(); - ~CGameConsole(); - virtual int Sizeof() const override { return sizeof(*this); } - - void PrintLine(int Type, const char *pLine); - void RequireUsername(bool UsernameReq); - - virtual void OnStateChange(int NewState, int OldState) override; - virtual void OnConsoleInit() override; - virtual void OnInit() override; - virtual void OnReset() override; - virtual void OnRender() override; - virtual void OnMessage(int MsgType, void *pRawMsg) override; - virtual bool OnInput(const IInput::CEvent &Event) override; - void Prompt(char (&aPrompt)[32]); - - void Toggle(int Type); - bool IsClosed() { return m_ConsoleState == CONSOLE_CLOSED; } -}; -#endif diff --git a/src/game/client/components/controls.cpp b/src/game/client/components/controls.cpp deleted file mode 100644 index a6b63f7042..0000000000 --- a/src/game/client/components/controls.cpp +++ /dev/null @@ -1,446 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include "controls.h" - -CControls::CControls() -{ - mem_zero(&m_aLastData, sizeof(m_aLastData)); - mem_zero(m_aMousePos, sizeof(m_aMousePos)); - mem_zero(m_aMousePosOnAction, sizeof(m_aMousePosOnAction)); - mem_zero(m_aTargetPos, sizeof(m_aTargetPos)); -} - -void CControls::OnReset() -{ - ResetInput(0); - ResetInput(1); - - for(int &AmmoCount : m_aAmmoCount) - AmmoCount = 0; - - m_LastSendTime = 0; -} - -void CControls::ResetInput(int Dummy) -{ - m_aLastData[Dummy].m_Direction = 0; - // simulate releasing the fire button - if((m_aLastData[Dummy].m_Fire & 1) != 0) - m_aLastData[Dummy].m_Fire++; - m_aLastData[Dummy].m_Fire &= INPUT_STATE_MASK; - m_aLastData[Dummy].m_Jump = 0; - m_aInputData[Dummy] = m_aLastData[Dummy]; - - m_aInputDirectionLeft[Dummy] = 0; - m_aInputDirectionRight[Dummy] = 0; -} - -void CControls::OnPlayerDeath() -{ - for(int &AmmoCount : m_aAmmoCount) - AmmoCount = 0; -} - -struct CInputState -{ - CControls *m_pControls; - int *m_apVariables[NUM_DUMMIES]; -}; - -static void ConKeyInputState(IConsole::IResult *pResult, void *pUserData) -{ - CInputState *pState = (CInputState *)pUserData; - - if(pState->m_pControls->GameClient()->m_GameInfo.m_BugDDRaceInput && pState->m_pControls->GameClient()->m_Snap.m_SpecInfo.m_Active) - return; - - *pState->m_apVariables[g_Config.m_ClDummy] = pResult->GetInteger(0); -} - -static void ConKeyInputCounter(IConsole::IResult *pResult, void *pUserData) -{ - CInputState *pState = (CInputState *)pUserData; - - if((pState->m_pControls->GameClient()->m_GameInfo.m_BugDDRaceInput && pState->m_pControls->GameClient()->m_Snap.m_SpecInfo.m_Active) || pState->m_pControls->GameClient()->m_Spectator.IsActive()) - return; - - int *pVariable = pState->m_apVariables[g_Config.m_ClDummy]; - if(((*pVariable) & 1) != pResult->GetInteger(0)) - (*pVariable)++; - *pVariable &= INPUT_STATE_MASK; -} - -struct CInputSet -{ - CControls *m_pControls; - int *m_apVariables[NUM_DUMMIES]; - int m_Value; -}; - -static void ConKeyInputSet(IConsole::IResult *pResult, void *pUserData) -{ - CInputSet *pSet = (CInputSet *)pUserData; - if(pResult->GetInteger(0)) - { - *pSet->m_apVariables[g_Config.m_ClDummy] = pSet->m_Value; - } -} - -static void ConKeyInputNextPrevWeapon(IConsole::IResult *pResult, void *pUserData) -{ - CInputSet *pSet = (CInputSet *)pUserData; - ConKeyInputCounter(pResult, pSet); - pSet->m_pControls->m_aInputData[g_Config.m_ClDummy].m_WantedWeapon = 0; -} - -void CControls::OnConsoleInit() -{ - // game commands - { - static CInputState s_State = {this, {&m_aInputDirectionLeft[0], &m_aInputDirectionLeft[1]}}; - Console()->Register("+left", "", CFGFLAG_CLIENT, ConKeyInputState, &s_State, "Move left"); - } - { - static CInputState s_State = {this, {&m_aInputDirectionRight[0], &m_aInputDirectionRight[1]}}; - Console()->Register("+right", "", CFGFLAG_CLIENT, ConKeyInputState, &s_State, "Move right"); - } - { - static CInputState s_State = {this, {&m_aInputData[0].m_Jump, &m_aInputData[1].m_Jump}}; - Console()->Register("+jump", "", CFGFLAG_CLIENT, ConKeyInputState, &s_State, "Jump"); - } - { - static CInputState s_State = {this, {&m_aInputData[0].m_Hook, &m_aInputData[1].m_Hook}}; - Console()->Register("+hook", "", CFGFLAG_CLIENT, ConKeyInputState, &s_State, "Hook"); - } - { - static CInputState s_State = {this, {&m_aInputData[0].m_Fire, &m_aInputData[1].m_Fire}}; - Console()->Register("+fire", "", CFGFLAG_CLIENT, ConKeyInputCounter, &s_State, "Fire"); - } - { - static CInputState s_State = {this, {&m_aShowHookColl[0], &m_aShowHookColl[1]}}; - Console()->Register("+showhookcoll", "", CFGFLAG_CLIENT, ConKeyInputState, &s_State, "Show Hook Collision"); - } - - { - static CInputSet s_Set = {this, {&m_aInputData[0].m_WantedWeapon, &m_aInputData[1].m_WantedWeapon}, 1}; - Console()->Register("+weapon1", "", CFGFLAG_CLIENT, ConKeyInputSet, &s_Set, "Switch to hammer"); - } - { - static CInputSet s_Set = {this, {&m_aInputData[0].m_WantedWeapon, &m_aInputData[1].m_WantedWeapon}, 2}; - Console()->Register("+weapon2", "", CFGFLAG_CLIENT, ConKeyInputSet, &s_Set, "Switch to gun"); - } - { - static CInputSet s_Set = {this, {&m_aInputData[0].m_WantedWeapon, &m_aInputData[1].m_WantedWeapon}, 3}; - Console()->Register("+weapon3", "", CFGFLAG_CLIENT, ConKeyInputSet, &s_Set, "Switch to shotgun"); - } - { - static CInputSet s_Set = {this, {&m_aInputData[0].m_WantedWeapon, &m_aInputData[1].m_WantedWeapon}, 4}; - Console()->Register("+weapon4", "", CFGFLAG_CLIENT, ConKeyInputSet, &s_Set, "Switch to grenade"); - } - { - static CInputSet s_Set = {this, {&m_aInputData[0].m_WantedWeapon, &m_aInputData[1].m_WantedWeapon}, 5}; - Console()->Register("+weapon5", "", CFGFLAG_CLIENT, ConKeyInputSet, &s_Set, "Switch to laser"); - } - - { - static CInputSet s_Set = {this, {&m_aInputData[0].m_NextWeapon, &m_aInputData[1].m_NextWeapon}, 0}; - Console()->Register("+nextweapon", "", CFGFLAG_CLIENT, ConKeyInputNextPrevWeapon, &s_Set, "Switch to next weapon"); - } - { - static CInputSet s_Set = {this, {&m_aInputData[0].m_PrevWeapon, &m_aInputData[1].m_PrevWeapon}, 0}; - Console()->Register("+prevweapon", "", CFGFLAG_CLIENT, ConKeyInputNextPrevWeapon, &s_Set, "Switch to previous weapon"); - } -} - -void CControls::OnMessage(int Msg, void *pRawMsg) -{ - if(Msg == NETMSGTYPE_SV_WEAPONPICKUP) - { - CNetMsg_Sv_WeaponPickup *pMsg = (CNetMsg_Sv_WeaponPickup *)pRawMsg; - if(g_Config.m_ClAutoswitchWeapons) - m_aInputData[g_Config.m_ClDummy].m_WantedWeapon = pMsg->m_Weapon + 1; - // We don't really know ammo count, until we'll switch to that weapon, but any non-zero count will suffice here - m_aAmmoCount[maximum(0, pMsg->m_Weapon % NUM_WEAPONS)] = 10; - } -} - -int CControls::SnapInput(int *pData) -{ - // update player state - if(m_pClient->m_Chat.IsActive()) - m_aInputData[g_Config.m_ClDummy].m_PlayerFlags = PLAYERFLAG_CHATTING; - else if(m_pClient->m_Menus.IsActive()) - m_aInputData[g_Config.m_ClDummy].m_PlayerFlags = PLAYERFLAG_IN_MENU; - else - m_aInputData[g_Config.m_ClDummy].m_PlayerFlags = PLAYERFLAG_PLAYING; - - if(m_pClient->m_Scoreboard.Active()) - m_aInputData[g_Config.m_ClDummy].m_PlayerFlags |= PLAYERFLAG_SCOREBOARD; - - if(Client()->ServerCapAnyPlayerFlag() && m_pClient->m_Controls.m_aShowHookColl[g_Config.m_ClDummy]) - m_aInputData[g_Config.m_ClDummy].m_PlayerFlags |= PLAYERFLAG_AIM; - - if(Client()->ServerCapAnyPlayerFlag() && m_pClient->m_Camera.CamType() == CCamera::CAMTYPE_SPEC) - m_aInputData[g_Config.m_ClDummy].m_PlayerFlags |= PLAYERFLAG_SPEC_CAM; - - bool Send = m_aLastData[g_Config.m_ClDummy].m_PlayerFlags != m_aInputData[g_Config.m_ClDummy].m_PlayerFlags; - - m_aLastData[g_Config.m_ClDummy].m_PlayerFlags = m_aInputData[g_Config.m_ClDummy].m_PlayerFlags; - - // we freeze the input if chat or menu is activated - if(!(m_aInputData[g_Config.m_ClDummy].m_PlayerFlags & PLAYERFLAG_PLAYING)) - { - if(!GameClient()->m_GameInfo.m_BugDDRaceInput) - ResetInput(g_Config.m_ClDummy); - - mem_copy(pData, &m_aInputData[g_Config.m_ClDummy], sizeof(m_aInputData[0])); - - // set the target anyway though so that we can keep seeing our surroundings, - // even if chat or menu are activated - m_aInputData[g_Config.m_ClDummy].m_TargetX = (int)m_aMousePos[g_Config.m_ClDummy].x; - m_aInputData[g_Config.m_ClDummy].m_TargetY = (int)m_aMousePos[g_Config.m_ClDummy].y; - - // send once a second just to be sure - Send = Send || time_get() > m_LastSendTime + time_freq(); - } - else - { - m_aInputData[g_Config.m_ClDummy].m_TargetX = (int)m_aMousePos[g_Config.m_ClDummy].x; - m_aInputData[g_Config.m_ClDummy].m_TargetY = (int)m_aMousePos[g_Config.m_ClDummy].y; - - if(g_Config.m_ClSubTickAiming && m_aMousePosOnAction[g_Config.m_ClDummy] != vec2(0.0f, 0.0f)) - { - m_aInputData[g_Config.m_ClDummy].m_TargetX = (int)m_aMousePosOnAction[g_Config.m_ClDummy].x; - m_aInputData[g_Config.m_ClDummy].m_TargetY = (int)m_aMousePosOnAction[g_Config.m_ClDummy].y; - m_aMousePosOnAction[g_Config.m_ClDummy] = vec2(0.0f, 0.0f); - } - - if(!m_aInputData[g_Config.m_ClDummy].m_TargetX && !m_aInputData[g_Config.m_ClDummy].m_TargetY) - { - m_aInputData[g_Config.m_ClDummy].m_TargetX = 1; - m_aMousePos[g_Config.m_ClDummy].x = 1; - } - - // set direction - m_aInputData[g_Config.m_ClDummy].m_Direction = 0; - if(m_aInputDirectionLeft[g_Config.m_ClDummy] && !m_aInputDirectionRight[g_Config.m_ClDummy]) - m_aInputData[g_Config.m_ClDummy].m_Direction = -1; - if(!m_aInputDirectionLeft[g_Config.m_ClDummy] && m_aInputDirectionRight[g_Config.m_ClDummy]) - m_aInputData[g_Config.m_ClDummy].m_Direction = 1; - - // dummy copy moves - if(g_Config.m_ClDummyCopyMoves) - { - CNetObj_PlayerInput *pDummyInput = &m_pClient->m_DummyInput; - pDummyInput->m_Direction = m_aInputData[g_Config.m_ClDummy].m_Direction; - pDummyInput->m_Hook = m_aInputData[g_Config.m_ClDummy].m_Hook; - pDummyInput->m_Jump = m_aInputData[g_Config.m_ClDummy].m_Jump; - pDummyInput->m_PlayerFlags = m_aInputData[g_Config.m_ClDummy].m_PlayerFlags; - pDummyInput->m_TargetX = m_aInputData[g_Config.m_ClDummy].m_TargetX; - pDummyInput->m_TargetY = m_aInputData[g_Config.m_ClDummy].m_TargetY; - pDummyInput->m_WantedWeapon = m_aInputData[g_Config.m_ClDummy].m_WantedWeapon; - - if(!g_Config.m_ClDummyControl) - pDummyInput->m_Fire += m_aInputData[g_Config.m_ClDummy].m_Fire - m_aLastData[g_Config.m_ClDummy].m_Fire; - - pDummyInput->m_NextWeapon += m_aInputData[g_Config.m_ClDummy].m_NextWeapon - m_aLastData[g_Config.m_ClDummy].m_NextWeapon; - pDummyInput->m_PrevWeapon += m_aInputData[g_Config.m_ClDummy].m_PrevWeapon - m_aLastData[g_Config.m_ClDummy].m_PrevWeapon; - - m_aInputData[!g_Config.m_ClDummy] = *pDummyInput; - } - - if(g_Config.m_ClDummyControl) - { - CNetObj_PlayerInput *pDummyInput = &m_pClient->m_DummyInput; - pDummyInput->m_Jump = g_Config.m_ClDummyJump; - - if(g_Config.m_ClDummyFire) - pDummyInput->m_Fire = g_Config.m_ClDummyFire; - else if((pDummyInput->m_Fire & 1) != 0) - pDummyInput->m_Fire++; - - pDummyInput->m_Hook = g_Config.m_ClDummyHook; - } - - // stress testing -#ifdef CONF_DEBUG - if(g_Config.m_DbgStress) - { - float t = Client()->LocalTime(); - mem_zero(&m_aInputData[g_Config.m_ClDummy], sizeof(m_aInputData[0])); - - m_aInputData[g_Config.m_ClDummy].m_Direction = ((int)t / 2) & 1; - m_aInputData[g_Config.m_ClDummy].m_Jump = ((int)t); - m_aInputData[g_Config.m_ClDummy].m_Fire = ((int)(t * 10)); - m_aInputData[g_Config.m_ClDummy].m_Hook = ((int)(t * 2)) & 1; - m_aInputData[g_Config.m_ClDummy].m_WantedWeapon = ((int)t) % NUM_WEAPONS; - m_aInputData[g_Config.m_ClDummy].m_TargetX = (int)(std::sin(t * 3) * 100.0f); - m_aInputData[g_Config.m_ClDummy].m_TargetY = (int)(std::cos(t * 3) * 100.0f); - } -#endif - // check if we need to send input - Send = Send || m_aInputData[g_Config.m_ClDummy].m_Direction != m_aLastData[g_Config.m_ClDummy].m_Direction; - Send = Send || m_aInputData[g_Config.m_ClDummy].m_Jump != m_aLastData[g_Config.m_ClDummy].m_Jump; - Send = Send || m_aInputData[g_Config.m_ClDummy].m_Fire != m_aLastData[g_Config.m_ClDummy].m_Fire; - Send = Send || m_aInputData[g_Config.m_ClDummy].m_Hook != m_aLastData[g_Config.m_ClDummy].m_Hook; - Send = Send || m_aInputData[g_Config.m_ClDummy].m_WantedWeapon != m_aLastData[g_Config.m_ClDummy].m_WantedWeapon; - Send = Send || m_aInputData[g_Config.m_ClDummy].m_NextWeapon != m_aLastData[g_Config.m_ClDummy].m_NextWeapon; - Send = Send || m_aInputData[g_Config.m_ClDummy].m_PrevWeapon != m_aLastData[g_Config.m_ClDummy].m_PrevWeapon; - Send = Send || time_get() > m_LastSendTime + time_freq() / 25; // send at least 25 Hz - Send = Send || (m_pClient->m_Snap.m_pLocalCharacter && m_pClient->m_Snap.m_pLocalCharacter->m_Weapon == WEAPON_NINJA && (m_aInputData[g_Config.m_ClDummy].m_Direction || m_aInputData[g_Config.m_ClDummy].m_Jump || m_aInputData[g_Config.m_ClDummy].m_Hook)); - } - - // copy and return size - m_aLastData[g_Config.m_ClDummy] = m_aInputData[g_Config.m_ClDummy]; - - if(!Send) - return 0; - - m_LastSendTime = time_get(); - mem_copy(pData, &m_aInputData[g_Config.m_ClDummy], sizeof(m_aInputData[0])); - return sizeof(m_aInputData[0]); -} - -void CControls::OnRender() -{ - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - if(g_Config.m_ClAutoswitchWeaponsOutOfAmmo && !GameClient()->m_GameInfo.m_UnlimitedAmmo && m_pClient->m_Snap.m_pLocalCharacter) - { - // Keep track of ammo count, we know weapon ammo only when we switch to that weapon, this is tracked on server and protocol does not track that - m_aAmmoCount[maximum(0, m_pClient->m_Snap.m_pLocalCharacter->m_Weapon % NUM_WEAPONS)] = m_pClient->m_Snap.m_pLocalCharacter->m_AmmoCount; - // Autoswitch weapon if we're out of ammo - if(m_aInputData[g_Config.m_ClDummy].m_Fire % 2 != 0 && - m_pClient->m_Snap.m_pLocalCharacter->m_AmmoCount == 0 && - m_pClient->m_Snap.m_pLocalCharacter->m_Weapon != WEAPON_HAMMER && - m_pClient->m_Snap.m_pLocalCharacter->m_Weapon != WEAPON_NINJA) - { - int Weapon; - for(Weapon = WEAPON_LASER; Weapon > WEAPON_GUN; Weapon--) - { - if(Weapon == m_pClient->m_Snap.m_pLocalCharacter->m_Weapon) - continue; - if(m_aAmmoCount[Weapon] > 0) - break; - } - if(Weapon != m_pClient->m_Snap.m_pLocalCharacter->m_Weapon) - m_aInputData[g_Config.m_ClDummy].m_WantedWeapon = Weapon + 1; - } - } - - // update target pos - if(m_pClient->m_Snap.m_pGameInfoObj && !m_pClient->m_Snap.m_SpecInfo.m_Active) - { - // make sure to compensate for smooth dyncam to ensure the cursor stays still in world space if zoomed - vec2 DyncamOffsetDelta = m_pClient->m_Camera.m_DyncamTargetCameraOffset - m_pClient->m_Camera.m_aDyncamCurrentCameraOffset[g_Config.m_ClDummy]; - float Zoom = m_pClient->m_Camera.m_Zoom; - m_aTargetPos[g_Config.m_ClDummy] = m_pClient->m_LocalCharacterPos + m_aMousePos[g_Config.m_ClDummy] - DyncamOffsetDelta + DyncamOffsetDelta / Zoom; - } - else if(m_pClient->m_Snap.m_SpecInfo.m_Active && m_pClient->m_Snap.m_SpecInfo.m_UsePosition) - { - m_aTargetPos[g_Config.m_ClDummy] = m_pClient->m_Snap.m_SpecInfo.m_Position + m_aMousePos[g_Config.m_ClDummy]; - } - else - { - m_aTargetPos[g_Config.m_ClDummy] = m_aMousePos[g_Config.m_ClDummy]; - } -} - -bool CControls::OnCursorMove(float x, float y, IInput::ECursorType CursorType) -{ - if(m_pClient->m_Snap.m_pGameInfoObj && (m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_PAUSED)) - return false; - - if(CursorType == IInput::CURSOR_JOYSTICK && g_Config.m_InpControllerAbsolute && m_pClient->m_Snap.m_pGameInfoObj && !m_pClient->m_Snap.m_SpecInfo.m_Active) - { - vec2 AbsoluteDirection; - if(Input()->GetActiveJoystick()->Absolute(&AbsoluteDirection.x, &AbsoluteDirection.y)) - m_aMousePos[g_Config.m_ClDummy] = AbsoluteDirection * GetMaxMouseDistance(); - return true; - } - - float Factor = 1.0f; - if(g_Config.m_ClDyncam && g_Config.m_ClDyncamMousesens) - { - Factor = g_Config.m_ClDyncamMousesens / 100.0f; - } - else - { - switch(CursorType) - { - case IInput::CURSOR_MOUSE: - Factor = g_Config.m_InpMousesens / 100.0f; - break; - case IInput::CURSOR_JOYSTICK: - Factor = g_Config.m_InpControllerSens / 100.0f; - break; - default: - dbg_msg("assert", "CControls::OnCursorMove CursorType %d", (int)CursorType); - dbg_break(); - break; - } - } - - if(m_pClient->m_Snap.m_SpecInfo.m_Active && m_pClient->m_Snap.m_SpecInfo.m_SpectatorId < 0) - Factor *= m_pClient->m_Camera.m_Zoom; - - m_aMousePos[g_Config.m_ClDummy] += vec2(x, y) * Factor; - ClampMousePos(); - return true; -} - -void CControls::ClampMousePos() -{ - if(m_pClient->m_Snap.m_SpecInfo.m_Active && m_pClient->m_Snap.m_SpecInfo.m_SpectatorId < 0) - { - m_aMousePos[g_Config.m_ClDummy].x = clamp(m_aMousePos[g_Config.m_ClDummy].x, -201.0f * 32, (Collision()->GetWidth() + 201.0f) * 32.0f); - m_aMousePos[g_Config.m_ClDummy].y = clamp(m_aMousePos[g_Config.m_ClDummy].y, -201.0f * 32, (Collision()->GetHeight() + 201.0f) * 32.0f); - } - else - { - const float MouseMin = GetMinMouseDistance(); - const float MouseMax = GetMaxMouseDistance(); - - float MouseDistance = length(m_aMousePos[g_Config.m_ClDummy]); - if(MouseDistance < 0.001f) - { - m_aMousePos[g_Config.m_ClDummy].x = 0.001f; - m_aMousePos[g_Config.m_ClDummy].y = 0; - MouseDistance = 0.001f; - } - if(MouseDistance < MouseMin) - m_aMousePos[g_Config.m_ClDummy] = normalize_pre_length(m_aMousePos[g_Config.m_ClDummy], MouseDistance) * MouseMin; - MouseDistance = length(m_aMousePos[g_Config.m_ClDummy]); - if(MouseDistance > MouseMax) - m_aMousePos[g_Config.m_ClDummy] = normalize_pre_length(m_aMousePos[g_Config.m_ClDummy], MouseDistance) * MouseMax; - } -} - -float CControls::GetMinMouseDistance() const -{ - return g_Config.m_ClDyncam ? g_Config.m_ClDyncamMinDistance : g_Config.m_ClMouseMinDistance; -} - -float CControls::GetMaxMouseDistance() const -{ - float CameraMaxDistance = 200.0f; - float FollowFactor = (g_Config.m_ClDyncam ? g_Config.m_ClDyncamFollowFactor : g_Config.m_ClMouseFollowfactor) / 100.0f; - float DeadZone = g_Config.m_ClDyncam ? g_Config.m_ClDyncamDeadzone : g_Config.m_ClMouseDeadzone; - float MaxDistance = g_Config.m_ClDyncam ? g_Config.m_ClDyncamMaxDistance : g_Config.m_ClMouseMaxDistance; - return minimum((FollowFactor != 0 ? CameraMaxDistance / FollowFactor + DeadZone : MaxDistance), MaxDistance); -} diff --git a/src/game/client/components/controls.h b/src/game/client/components/controls.h deleted file mode 100644 index 11eecdde03..0000000000 --- a/src/game/client/components/controls.h +++ /dev/null @@ -1,46 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_CONTROLS_H -#define GAME_CLIENT_COMPONENTS_CONTROLS_H - -#include - -#include - -#include -#include - -class CControls : public CComponent -{ -public: - float GetMinMouseDistance() const; - float GetMaxMouseDistance() const; - - vec2 m_aMousePos[NUM_DUMMIES]; - vec2 m_aMousePosOnAction[NUM_DUMMIES]; - vec2 m_aTargetPos[NUM_DUMMIES]; - - int m_aAmmoCount[NUM_WEAPONS]; - - int64_t m_LastSendTime; - CNetObj_PlayerInput m_aInputData[NUM_DUMMIES]; - CNetObj_PlayerInput m_aLastData[NUM_DUMMIES]; - int m_aInputDirectionLeft[NUM_DUMMIES]; - int m_aInputDirectionRight[NUM_DUMMIES]; - int m_aShowHookColl[NUM_DUMMIES]; - - CControls(); - virtual int Sizeof() const override { return sizeof(*this); } - - virtual void OnReset() override; - virtual void OnRender() override; - virtual void OnMessage(int MsgType, void *pRawMsg) override; - virtual bool OnCursorMove(float x, float y, IInput::ECursorType CursorType) override; - virtual void OnConsoleInit() override; - virtual void OnPlayerDeath(); - - int SnapInput(int *pData); - void ClampMousePos(); - void ResetInput(int Dummy); -}; -#endif diff --git a/src/game/client/components/countryflags.cpp b/src/game/client/components/countryflags.cpp deleted file mode 100644 index b05778596e..0000000000 --- a/src/game/client/components/countryflags.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include - -#include -#include -#include -#include -#include - -#include "countryflags.h" - -#include - -void CCountryFlags::LoadCountryflagsIndexfile() -{ - const char *pFilename = "countryflags/index.txt"; - CLineReader LineReader; - if(!LineReader.OpenFile(Storage()->OpenFile(pFilename, IOFLAG_READ, IStorage::TYPE_ALL))) - { - char aBuf[128]; - str_format(aBuf, sizeof(aBuf), "couldn't open index file '%s'", pFilename); - Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "countryflags", aBuf); - return; - } - - char aOrigin[128]; - while(const char *pLine = LineReader.Get()) - { - if(!str_length(pLine) || pLine[0] == '#') // skip empty lines and comments - continue; - - str_copy(aOrigin, pLine); - const char *pReplacement = LineReader.Get(); - if(!pReplacement) - { - Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "countryflags", "unexpected end of index file"); - break; - } - - if(pReplacement[0] != '=' || pReplacement[1] != '=' || pReplacement[2] != ' ') - { - char aBuf[128]; - str_format(aBuf, sizeof(aBuf), "malform replacement for index '%s'", aOrigin); - Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "countryflags", aBuf); - continue; - } - - int CountryCode = str_toint(pReplacement + 3); - if(CountryCode < CODE_LB || CountryCode > CODE_UB) - { - char aBuf[128]; - str_format(aBuf, sizeof(aBuf), "country code '%i' not within valid code range [%i..%i]", CountryCode, CODE_LB, CODE_UB); - Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "countryflags", aBuf); - continue; - } - - // load the graphic file - char aBuf[128]; - CImageInfo Info; - str_format(aBuf, sizeof(aBuf), "countryflags/%s.png", aOrigin); - if(!Graphics()->LoadPng(Info, aBuf, IStorage::TYPE_ALL)) - { - char aMsg[128]; - str_format(aMsg, sizeof(aMsg), "failed to load '%s'", aBuf); - Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "countryflags", aMsg); - continue; - } - - // add entry - CCountryFlag CountryFlag; - CountryFlag.m_CountryCode = CountryCode; - str_copy(CountryFlag.m_aCountryCodeString, aOrigin); - CountryFlag.m_Texture = Graphics()->LoadTextureRawMove(Info, 0, aBuf); - - if(g_Config.m_Debug) - { - str_format(aBuf, sizeof(aBuf), "loaded country flag '%s'", aOrigin); - Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "countryflags", aBuf); - } - m_vCountryFlags.push_back(CountryFlag); - } - - std::sort(m_vCountryFlags.begin(), m_vCountryFlags.end()); - - // find index of default item - size_t DefaultIndex = 0; - for(size_t Index = 0; Index < m_vCountryFlags.size(); ++Index) - if(m_vCountryFlags[Index].m_CountryCode == -1) - { - DefaultIndex = Index; - break; - } - - // init LUT - if(DefaultIndex != 0) - for(size_t &CodeIndexLUT : m_aCodeIndexLUT) - CodeIndexLUT = DefaultIndex; - else - mem_zero(m_aCodeIndexLUT, sizeof(m_aCodeIndexLUT)); - for(size_t i = 0; i < m_vCountryFlags.size(); ++i) - m_aCodeIndexLUT[maximum(0, (m_vCountryFlags[i].m_CountryCode - CODE_LB) % CODE_RANGE)] = i; -} - -void CCountryFlags::OnInit() -{ - // load country flags - m_vCountryFlags.clear(); - LoadCountryflagsIndexfile(); - if(m_vCountryFlags.empty()) - { - Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "countryflags", "failed to load country flags. folder='countryflags/'"); - CCountryFlag DummyEntry; - DummyEntry.m_CountryCode = -1; - mem_zero(DummyEntry.m_aCountryCodeString, sizeof(DummyEntry.m_aCountryCodeString)); - m_vCountryFlags.push_back(DummyEntry); - } - - m_FlagsQuadContainerIndex = Graphics()->CreateQuadContainer(false); - Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - RenderTools()->QuadContainerAddSprite(m_FlagsQuadContainerIndex, 0, 0, 1, 1); - Graphics()->QuadContainerUpload(m_FlagsQuadContainerIndex); -} - -size_t CCountryFlags::Num() const -{ - return m_vCountryFlags.size(); -} - -const CCountryFlags::CCountryFlag *CCountryFlags::GetByCountryCode(int CountryCode) const -{ - return GetByIndex(m_aCodeIndexLUT[maximum(0, (CountryCode - CODE_LB) % CODE_RANGE)]); -} - -const CCountryFlags::CCountryFlag *CCountryFlags::GetByIndex(size_t Index) const -{ - return &m_vCountryFlags[Index % m_vCountryFlags.size()]; -} - -void CCountryFlags::Render(const CCountryFlag *pFlag, ColorRGBA Color, float x, float y, float w, float h) -{ - if(pFlag->m_Texture.IsValid()) - { - Graphics()->TextureSet(pFlag->m_Texture); - Graphics()->SetColor(Color); - Graphics()->RenderQuadContainerEx(m_FlagsQuadContainerIndex, 0, -1, x, y, w, h); - } -} - -void CCountryFlags::Render(int CountryCode, ColorRGBA Color, float x, float y, float w, float h) -{ - Render(GetByCountryCode(CountryCode), Color, x, y, w, h); -} diff --git a/src/game/client/components/countryflags.h b/src/game/client/components/countryflags.h deleted file mode 100644 index 9af9302d6e..0000000000 --- a/src/game/client/components/countryflags.h +++ /dev/null @@ -1,45 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_COUNTRYFLAGS_H -#define GAME_CLIENT_COMPONENTS_COUNTRYFLAGS_H - -#include -#include -#include - -class CCountryFlags : public CComponent -{ -public: - struct CCountryFlag - { - int m_CountryCode; - char m_aCountryCodeString[8]; - IGraphics::CTextureHandle m_Texture; - - bool operator<(const CCountryFlag &Other) const { return str_comp(m_aCountryCodeString, Other.m_aCountryCodeString) < 0; } - }; - - virtual int Sizeof() const override { return sizeof(*this); } - void OnInit() override; - - size_t Num() const; - const CCountryFlag *GetByCountryCode(int CountryCode) const; - const CCountryFlag *GetByIndex(size_t Index) const; - void Render(const CCountryFlag *pFlag, ColorRGBA Color, float x, float y, float w, float h); - void Render(int CountryCode, ColorRGBA Color, float x, float y, float w, float h); - -private: - enum - { - CODE_LB = -1, - CODE_UB = 999, - CODE_RANGE = CODE_UB - CODE_LB + 1, - }; - std::vector m_vCountryFlags; - size_t m_aCodeIndexLUT[CODE_RANGE]; - - int m_FlagsQuadContainerIndex; - - void LoadCountryflagsIndexfile(); -}; -#endif diff --git a/src/game/client/components/damageind.cpp b/src/game/client/components/damageind.cpp deleted file mode 100644 index 0ac462da08..0000000000 --- a/src/game/client/components/damageind.cpp +++ /dev/null @@ -1,97 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include -#include -#include -#include -#include -#include - -#include "damageind.h" - -CDamageInd::CDamageInd() -{ - m_NumItems = 0; -} - -void CDamageInd::Create(vec2 Pos, vec2 Dir, float Alpha) -{ - if(m_NumItems >= MAX_ITEMS) - return; - - CItem *pItem = &m_aItems[m_NumItems]; - pItem->m_Pos = Pos; - pItem->m_Dir = -Dir; - pItem->m_RemainingLife = 0.75f; - pItem->m_StartAngle = -random_angle(); - pItem->m_Color = ColorRGBA(1.0f, 1.0f, 1.0f, Alpha); - ++m_NumItems; -} - -void CDamageInd::OnRender() -{ - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - static float s_LastLocalTime = LocalTime(); - float LifeAdjustment; - if(Client()->State() == IClient::STATE_DEMOPLAYBACK) - { - const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); - if(pInfo->m_Paused) - LifeAdjustment = 0.0f; - else - LifeAdjustment = (LocalTime() - s_LastLocalTime) * pInfo->m_Speed; - } - else - { - const auto &pGameInfoObj = GameClient()->m_Snap.m_pGameInfoObj; - if(pGameInfoObj && pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_PAUSED) - LifeAdjustment = 0.0f; - else - LifeAdjustment = LocalTime() - s_LastLocalTime; - } - s_LastLocalTime = LocalTime(); - - Graphics()->TextureSet(GameClient()->m_GameSkin.m_aSpriteStars[0]); - for(int i = 0; i < m_NumItems;) - { - m_aItems[i].m_RemainingLife -= LifeAdjustment; - if(m_aItems[i].m_RemainingLife < 0.0f) - { - --m_NumItems; - m_aItems[i] = m_aItems[m_NumItems]; - } - else - { - vec2 Pos = mix(m_aItems[i].m_Pos + m_aItems[i].m_Dir * 75.0f, m_aItems[i].m_Pos, clamp((m_aItems[i].m_RemainingLife - 0.60f) / 0.15f, 0.0f, 1.0f)); - const float LifeAlpha = m_aItems[i].m_RemainingLife / 0.1f; - Graphics()->SetColor(m_aItems[i].m_Color.WithMultipliedAlpha(LifeAlpha)); - Graphics()->QuadsSetRotation(m_aItems[i].m_StartAngle + m_aItems[i].m_RemainingLife * 2.0f); - Graphics()->RenderQuadContainerAsSprite(m_DmgIndQuadContainerIndex, 0, Pos.x, Pos.y); - i++; - } - } - - Graphics()->QuadsSetRotation(0); - Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); -} - -void CDamageInd::OnInit() -{ - Graphics()->QuadsSetRotation(0); - Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); - - m_DmgIndQuadContainerIndex = Graphics()->CreateQuadContainer(false); - float ScaleX, ScaleY; - RenderTools()->GetSpriteScale(SPRITE_STAR1, ScaleX, ScaleY); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - RenderTools()->QuadContainerAddSprite(m_DmgIndQuadContainerIndex, 48.f * ScaleX, 48.f * ScaleY); - Graphics()->QuadContainerUpload(m_DmgIndQuadContainerIndex); -} - -void CDamageInd::OnReset() -{ - m_NumItems = 0; -} diff --git a/src/game/client/components/damageind.h b/src/game/client/components/damageind.h deleted file mode 100644 index 8b45acc8bc..0000000000 --- a/src/game/client/components/damageind.h +++ /dev/null @@ -1,39 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_DAMAGEIND_H -#define GAME_CLIENT_COMPONENTS_DAMAGEIND_H -#include -#include -#include - -class CDamageInd : public CComponent -{ - struct CItem - { - vec2 m_Pos; - vec2 m_Dir; - float m_RemainingLife; - float m_StartAngle; - ColorRGBA m_Color; - }; - - enum - { - MAX_ITEMS = 64, - }; - - CItem m_aItems[MAX_ITEMS]; - int m_NumItems; - - int m_DmgIndQuadContainerIndex; - -public: - CDamageInd(); - virtual int Sizeof() const override { return sizeof(*this); } - - void Create(vec2 Pos, vec2 Dir, float Alpha); - virtual void OnReset() override; - virtual void OnRender() override; - virtual void OnInit() override; -}; -#endif diff --git a/src/game/client/components/debughud.cpp b/src/game/client/components/debughud.cpp deleted file mode 100644 index 3b0afb0795..0000000000 --- a/src/game/client/components/debughud.cpp +++ /dev/null @@ -1,270 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include -#include - -#include - -#include -#include -#include - -#include "debughud.h" - -static constexpr int64_t GRAPH_MAX_VALUES = 128; - -CDebugHud::CDebugHud() : - m_RampGraph(GRAPH_MAX_VALUES), - m_ZoomedInGraph(GRAPH_MAX_VALUES) -{ -} - -void CDebugHud::RenderNetCorrections() -{ - if(!g_Config.m_Debug || g_Config.m_DbgGraphs || !m_pClient->m_Snap.m_pLocalCharacter || !m_pClient->m_Snap.m_pLocalPrevCharacter) - return; - - const float Height = 300.0f; - const float Width = Height * Graphics()->ScreenAspect(); - Graphics()->MapScreen(0.0f, 0.0f, Width, Height); - - const float Velspeed = length(vec2(m_pClient->m_Snap.m_pLocalCharacter->m_VelX / 256.0f, m_pClient->m_Snap.m_pLocalCharacter->m_VelY / 256.0f)) * Client()->GameTickSpeed(); - const float VelspeedX = m_pClient->m_Snap.m_pLocalCharacter->m_VelX / 256.0f * Client()->GameTickSpeed(); - const float VelspeedY = m_pClient->m_Snap.m_pLocalCharacter->m_VelY / 256.0f * Client()->GameTickSpeed(); - const float Ramp = VelocityRamp(Velspeed, m_pClient->m_aTuning[g_Config.m_ClDummy].m_VelrampStart, m_pClient->m_aTuning[g_Config.m_ClDummy].m_VelrampRange, m_pClient->m_aTuning[g_Config.m_ClDummy].m_VelrampCurvature); - const CCharacter *pCharacter = m_pClient->m_GameWorld.GetCharacterById(m_pClient->m_Snap.m_LocalClientId); - - const float FontSize = 5.0f; - const float LineHeight = FontSize + 1.0f; - - float y = 50.0f; - char aBuf[128]; - const auto &&RenderRow = [&](const char *pLabel, const char *pValue) { - TextRender()->Text(Width - 100.0f, y, FontSize, pLabel); - TextRender()->Text(Width - 10.0f - TextRender()->TextWidth(FontSize, pValue), y, FontSize, pValue); - y += LineHeight; - }; - - TextRender()->TextColor(TextRender()->DefaultTextColor()); - - str_format(aBuf, sizeof(aBuf), "%.0f Bps", Velspeed / 32); - RenderRow("Velspeed:", aBuf); - - str_format(aBuf, sizeof(aBuf), "%.0f Bps", VelspeedX / 32 * Ramp); - RenderRow("Velspeed.x * Ramp:", aBuf); - - str_format(aBuf, sizeof(aBuf), "%.0f Bps", VelspeedY / 32); - RenderRow("Velspeed.y:", aBuf); - - str_format(aBuf, sizeof(aBuf), "%.2f", Ramp); - RenderRow("Ramp:", aBuf); - - str_format(aBuf, sizeof(aBuf), "%d", pCharacter == nullptr ? -1 : pCharacter->m_TeleCheckpoint); - RenderRow("Checkpoint:", aBuf); - - str_format(aBuf, sizeof(aBuf), "%d", pCharacter == nullptr ? -1 : pCharacter->m_TuneZone); - RenderRow("Tune zone:", aBuf); - - str_format(aBuf, sizeof(aBuf), "%.2f", m_pClient->m_Snap.m_pLocalCharacter->m_X / 32.0f); - RenderRow("Pos.x:", aBuf); - - str_format(aBuf, sizeof(aBuf), "%.2f", m_pClient->m_Snap.m_pLocalCharacter->m_Y / 32.0f); - RenderRow("Pos.y:", aBuf); - - str_format(aBuf, sizeof(aBuf), "%d", m_pClient->m_Snap.m_pLocalCharacter->m_Angle); - RenderRow("Angle:", aBuf); - - str_format(aBuf, sizeof(aBuf), "%d", m_pClient->NetobjNumCorrections()); - RenderRow("Netobj corrections", aBuf); - RenderRow(" on:", m_pClient->NetobjCorrectedOn()); -} - -void CDebugHud::RenderTuning() -{ - enum - { - DBG_TUNING_OFF = 0, - DBG_TUNING_SHOW_CHANGED, - DBG_TUNING_SHOW_ALL, - }; - - if(g_Config.m_DbgTuning == DBG_TUNING_OFF) - return; - - const CCharacter *pCharacter = m_pClient->m_GameWorld.GetCharacterById(m_pClient->m_Snap.m_LocalClientId); - - const CTuningParams StandardTuning; - const CTuningParams *pGlobalTuning = m_pClient->GetTuning(0); - const CTuningParams *pZoneTuning = !m_pClient->m_GameWorld.m_WorldConfig.m_UseTuneZones || pCharacter == nullptr ? nullptr : m_pClient->GetTuning(pCharacter->m_TuneZone); - const CTuningParams *pActiveTuning = pZoneTuning == nullptr ? pGlobalTuning : pZoneTuning; - - const float Height = 300.0f; - const float Width = Height * Graphics()->ScreenAspect(); - Graphics()->MapScreen(0.0f, 0.0f, Width, Height); - - const float FontSize = 5.0f; - - const float StartY = 50.0f; - float y = StartY; - float StartX = 30.0f; - const auto &&RenderRow = [&](const char *pCol1, const char *pCol2, const char *pCol3) { - float x = StartX; - TextRender()->Text(x - TextRender()->TextWidth(FontSize, pCol1), y, FontSize, pCol1); - - x += 30.0f; - TextRender()->Text(x - TextRender()->TextWidth(FontSize, pCol2), y, FontSize, pCol2); - - x += 10.0f; - TextRender()->Text(x, y, FontSize, pCol3); - - y += FontSize + 1.0f; - - if(y >= Height - 80.0f) - { - y = StartY; - StartX += 130.0f; - } - }; - - for(int i = 0; i < CTuningParams::Num(); i++) - { - float CurrentGlobal, CurrentZone, Standard; - pGlobalTuning->Get(i, &CurrentGlobal); - if(pZoneTuning == nullptr) - CurrentZone = 0.0f; - else - pZoneTuning->Get(i, &CurrentZone); - StandardTuning.Get(i, &Standard); - - if(g_Config.m_DbgTuning == DBG_TUNING_SHOW_CHANGED && Standard == CurrentGlobal && (pZoneTuning == nullptr || Standard == CurrentZone)) - continue; // skip unchanged params - - if(y == StartY) - { - TextRender()->TextColor(TextRender()->DefaultTextColor()); - RenderRow("Standard", "Current", "Tuning"); - } - - ColorRGBA TextColor; - if(g_Config.m_DbgTuning == DBG_TUNING_SHOW_ALL && Standard == CurrentGlobal && (pZoneTuning == nullptr || Standard == CurrentZone)) - TextColor = ColorRGBA(0.75f, 0.75f, 0.75f, 1.0f); // grey: value unchanged globally and in current zone - else if(Standard == CurrentGlobal && pZoneTuning != nullptr && Standard != CurrentZone) - TextColor = ColorRGBA(0.6f, 0.6f, 1.0f, 1.0f); // blue: value changed only in current zone - else if(Standard != CurrentGlobal && pZoneTuning != nullptr && Standard == CurrentZone) - TextColor = ColorRGBA(0.4f, 1.0f, 0.4f, 1.0f); // green: value changed globally but reset to default by tune zone - else - TextColor = ColorRGBA(1.0f, 0.5f, 0.5f, 1.0f); // red: value changed globally - TextRender()->TextColor(TextColor); - - char aBufStandard[32]; - str_format(aBufStandard, sizeof(aBufStandard), "%.2f", Standard); - char aBufCurrent[32]; - str_format(aBufCurrent, sizeof(aBufCurrent), "%.2f", pZoneTuning == nullptr ? CurrentGlobal : CurrentZone); - RenderRow(aBufStandard, aBufCurrent, CTuningParams::Name(i)); - } - - TextRender()->TextColor(TextRender()->DefaultTextColor()); - if(g_Config.m_DbgTuning == DBG_TUNING_SHOW_CHANGED) - return; - - // Render Velspeed.X * Ramp Graphs - Graphics()->MapScreen(0.0f, 0.0f, Graphics()->ScreenWidth(), Graphics()->ScreenHeight()); - const float GraphSpacing = Graphics()->ScreenWidth() / 100.0f; - const float GraphW = Graphics()->ScreenWidth() / 4.0f; - const float GraphH = Graphics()->ScreenHeight() / 6.0f; - const float GraphX = GraphW; - const float GraphY = Graphics()->ScreenHeight() - GraphH - GraphSpacing; - - const int StepSizeRampGraph = 270; - const int StepSizeZoomedInGraph = 14; - if(m_OldVelrampStart != pActiveTuning->m_VelrampStart || m_OldVelrampRange != pActiveTuning->m_VelrampRange || m_OldVelrampCurvature != pActiveTuning->m_VelrampCurvature) - { - m_OldVelrampStart = pActiveTuning->m_VelrampStart; - m_OldVelrampRange = pActiveTuning->m_VelrampRange; - m_OldVelrampCurvature = pActiveTuning->m_VelrampCurvature; - - m_RampGraph.Init(0.0f, 0.0f); - m_SpeedTurningPoint = 0; - float PreviousRampedSpeed = 1.0f; - for(int64_t i = 0; i < GRAPH_MAX_VALUES; i++) - { - // This is a calculation of the speed values per second on the X axis, from 270 to 34560 in steps of 270 - const float Speed = (i + 1) * StepSizeRampGraph; - const float Ramp = VelocityRamp(Speed, m_pClient->m_aTuning[g_Config.m_ClDummy].m_VelrampStart, m_pClient->m_aTuning[g_Config.m_ClDummy].m_VelrampRange, m_pClient->m_aTuning[g_Config.m_ClDummy].m_VelrampCurvature); - const float RampedSpeed = Speed * Ramp; - if(RampedSpeed >= PreviousRampedSpeed) - { - m_RampGraph.InsertAt(i, RampedSpeed / 32, ColorRGBA(0.0f, 1.0f, 0.0f, 0.75f)); - m_SpeedTurningPoint = Speed; - } - else - { - m_RampGraph.InsertAt(i, RampedSpeed / 32, ColorRGBA(1.0f, 0.0f, 0.0f, 0.75f)); - } - PreviousRampedSpeed = RampedSpeed; - } - m_RampGraph.Scale(GRAPH_MAX_VALUES - 1); - - m_ZoomedInGraph.Init(0.0f, 0.0f); - PreviousRampedSpeed = 1.0f; - MiddleOfZoomedInGraph = m_SpeedTurningPoint; - for(int64_t i = 0; i < GRAPH_MAX_VALUES; i++) - { - // This is a calculation of the speed values per second on the X axis, from (MiddleOfZoomedInGraph - 64 * StepSize) to (MiddleOfZoomedInGraph + 64 * StepSize) - const float Speed = MiddleOfZoomedInGraph - 64 * StepSizeZoomedInGraph + i * StepSizeZoomedInGraph; - const float Ramp = VelocityRamp(Speed, m_pClient->m_aTuning[g_Config.m_ClDummy].m_VelrampStart, m_pClient->m_aTuning[g_Config.m_ClDummy].m_VelrampRange, m_pClient->m_aTuning[g_Config.m_ClDummy].m_VelrampCurvature); - const float RampedSpeed = Speed * Ramp; - if(RampedSpeed >= PreviousRampedSpeed) - { - m_ZoomedInGraph.InsertAt(i, RampedSpeed / 32, ColorRGBA(0.0f, 1.0f, 0.0f, 0.75f)); - m_SpeedTurningPoint = Speed; - } - else - { - m_ZoomedInGraph.InsertAt(i, RampedSpeed / 32, ColorRGBA(1.0f, 0.0f, 0.0f, 0.75f)); - } - if(i == 0) - { - m_ZoomedInGraph.SetMin(RampedSpeed / 32); - } - PreviousRampedSpeed = RampedSpeed; - } - m_ZoomedInGraph.Scale(GRAPH_MAX_VALUES - 1); - } - - const float GraphFontSize = 12.0f; - char aBuf[128]; - str_format(aBuf, sizeof(aBuf), "Velspeed.X * Ramp in Bps (Velspeed %d to %d)", StepSizeRampGraph / 32, 128 * StepSizeRampGraph / 32); - m_RampGraph.Render(Graphics(), TextRender(), GraphX, GraphY, GraphW, GraphH, aBuf); - str_format(aBuf, sizeof(aBuf), "Max Velspeed before it ramps off: %.2f Bps", m_SpeedTurningPoint / 32); - TextRender()->Text(GraphX, GraphY - GraphFontSize, GraphFontSize, aBuf); - str_format(aBuf, sizeof(aBuf), "Zoomed in on turning point (Velspeed %d to %d)", ((int)MiddleOfZoomedInGraph - 64 * StepSizeZoomedInGraph) / 32, ((int)MiddleOfZoomedInGraph + 64 * StepSizeZoomedInGraph) / 32); - m_ZoomedInGraph.Render(Graphics(), TextRender(), GraphX + GraphW + GraphSpacing, GraphY, GraphW, GraphH, aBuf); -} - -void CDebugHud::RenderHint() -{ - if(!g_Config.m_Debug) - return; - - const float Height = 300.0f; - const float Width = Height * Graphics()->ScreenAspect(); - Graphics()->MapScreen(0.0f, 0.0f, Width, Height); - - const float FontSize = 5.0f; - const float Spacing = 5.0f; - - TextRender()->TextColor(TextRender()->DefaultTextColor()); - TextRender()->Text(Spacing, Height - FontSize - Spacing, FontSize, Localize("Debug mode enabled. Press Ctrl+Shift+D to disable debug mode.")); -} - -void CDebugHud::OnRender() -{ - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - RenderTuning(); - RenderNetCorrections(); - RenderHint(); -} diff --git a/src/game/client/components/debughud.h b/src/game/client/components/debughud.h deleted file mode 100644 index 3dc326d73e..0000000000 --- a/src/game/client/components/debughud.h +++ /dev/null @@ -1,29 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_DEBUGHUD_H -#define GAME_CLIENT_COMPONENTS_DEBUGHUD_H -#include - -#include - -class CDebugHud : public CComponent -{ - void RenderNetCorrections(); - void RenderTuning(); - void RenderHint(); - - CGraph m_RampGraph; - CGraph m_ZoomedInGraph; - float m_SpeedTurningPoint; - float MiddleOfZoomedInGraph; - float m_OldVelrampStart; - float m_OldVelrampRange; - float m_OldVelrampCurvature; - -public: - CDebugHud(); - virtual int Sizeof() const override { return sizeof(*this); } - virtual void OnRender() override; -}; - -#endif diff --git a/src/game/client/components/effects.cpp b/src/game/client/components/effects.cpp deleted file mode 100644 index ae2a1bdb48..0000000000 --- a/src/game/client/components/effects.cpp +++ /dev/null @@ -1,424 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include - -#include - -#include - -#include -#include -#include -#include -#include - -#include "effects.h" - -CEffects::CEffects() -{ - m_Add5hz = false; - m_Add50hz = false; - m_Add100hz = false; -} - -void CEffects::AirJump(vec2 Pos, float Alpha) -{ - CParticle p; - p.SetDefault(); - p.m_Spr = SPRITE_PART_AIRJUMP; - p.m_Pos = Pos + vec2(-6.0f, 16.0f); - p.m_Vel = vec2(0, -200); - p.m_LifeSpan = 0.5f; - p.m_StartSize = 48.0f; - p.m_EndSize = 0; - p.m_Rot = random_angle(); - p.m_Rotspeed = pi * 2; - p.m_Gravity = 500; - p.m_Friction = 0.7f; - p.m_FlowAffected = 0.0f; - p.m_Color.a = Alpha; - p.m_StartAlpha = Alpha; - m_pClient->m_Particles.Add(CParticles::GROUP_GENERAL, &p); - - p.m_Pos = Pos + vec2(6.0f, 16.0f); - m_pClient->m_Particles.Add(CParticles::GROUP_GENERAL, &p); - - if(g_Config.m_SndGame) - m_pClient->m_Sounds.PlayAt(CSounds::CHN_WORLD, SOUND_PLAYER_AIRJUMP, 1.0f, Pos); -} - -void CEffects::DamageIndicator(vec2 Pos, vec2 Dir, float Alpha) -{ - m_pClient->m_DamageInd.Create(Pos, Dir, Alpha); -} - -void CEffects::PowerupShine(vec2 Pos, vec2 Size, float Alpha) -{ - if(!m_Add50hz) - return; - - CParticle p; - p.SetDefault(); - p.m_Spr = SPRITE_PART_SLICE; - p.m_Pos = Pos + vec2(random_float(-0.5f, 0.5f), random_float(-0.5f, 0.5f)) * Size; - p.m_Vel = vec2(0, 0); - p.m_LifeSpan = 0.5f; - p.m_StartSize = 16.0f; - p.m_EndSize = 0; - p.m_Rot = random_angle(); - p.m_Rotspeed = pi * 2; - p.m_Gravity = 500; - p.m_Friction = 0.9f; - p.m_FlowAffected = 0.0f; - p.m_Color.a = Alpha; - p.m_StartAlpha = Alpha; - m_pClient->m_Particles.Add(CParticles::GROUP_GENERAL, &p); -} - -void CEffects::FreezingFlakes(vec2 Pos, vec2 Size, float Alpha) -{ - if(!m_Add5hz) - return; - - CParticle p; - p.SetDefault(); - p.m_Spr = SPRITE_PART_SNOWFLAKE; - p.m_Pos = Pos + vec2(random_float(-0.5f, 0.5f), random_float(-0.5f, 0.5f)) * Size; - p.m_Vel = vec2(0, 0); - p.m_LifeSpan = 1.5f; - p.m_StartSize = random_float(0.5f, 1.5f) * 16.0f; - p.m_EndSize = p.m_StartSize * 0.5f; - p.m_UseAlphaFading = true; - p.m_StartAlpha = 1.0f; - p.m_EndAlpha = 0.0f; - p.m_Rot = random_angle(); - p.m_Rotspeed = pi; - p.m_Gravity = random_float(250.0f); - p.m_Friction = 0.9f; - p.m_FlowAffected = 0.0f; - p.m_Collides = false; - p.m_Color.a = Alpha; - p.m_StartAlpha = Alpha; - m_pClient->m_Particles.Add(CParticles::GROUP_EXTRA, &p); -} - -void CEffects::SparkleTrail(vec2 Pos, float Alpha) -{ - if(!m_Add50hz) - return; - - CParticle p; - p.SetDefault(); - p.m_Spr = SPRITE_PART_SPARKLE; - p.m_Pos = Pos + random_direction() * random_float(40.0f); - p.m_Vel = vec2(0, 0); - p.m_LifeSpan = 0.5f; - p.m_StartSize = 0.0f; - p.m_EndSize = random_float(20.0f, 30.0f); - p.m_UseAlphaFading = true; - p.m_StartAlpha = Alpha; - p.m_EndAlpha = std::min(0.2f, Alpha); - p.m_Collides = false; - m_pClient->m_Particles.Add(CParticles::GROUP_TRAIL_EXTRA, &p); -} - -void CEffects::SmokeTrail(vec2 Pos, vec2 Vel, float Alpha, float TimePassed) -{ - if(!m_Add50hz && TimePassed < 0.001f) - return; - - CParticle p; - p.SetDefault(); - p.m_Spr = SPRITE_PART_SMOKE; - p.m_Pos = Pos; - p.m_Vel = Vel + random_direction() * 50.0f; - p.m_LifeSpan = random_float(0.5f, 1.0f); - p.m_StartSize = random_float(12.0f, 20.0f); - p.m_EndSize = 0; - p.m_Friction = 0.7f; - p.m_Gravity = random_float(-500.0f); - p.m_Color.a = Alpha; - p.m_StartAlpha = Alpha; - m_pClient->m_Particles.Add(CParticles::GROUP_PROJECTILE_TRAIL, &p, TimePassed); -} - -void CEffects::SkidTrail(vec2 Pos, vec2 Vel, float Alpha) -{ - if(!m_Add100hz) - return; - - CParticle p; - p.SetDefault(); - p.m_Spr = SPRITE_PART_SMOKE; - p.m_Pos = Pos; - p.m_Vel = Vel + random_direction() * 50.0f; - p.m_LifeSpan = random_float(0.5f, 1.0f); - p.m_StartSize = random_float(24.0f, 36.0f); - p.m_EndSize = 0; - p.m_Friction = 0.7f; - p.m_Gravity = random_float(-500.0f); - p.m_Color = ColorRGBA(0.75f, 0.75f, 0.75f, Alpha); - p.m_StartAlpha = Alpha; - m_pClient->m_Particles.Add(CParticles::GROUP_GENERAL, &p); -} - -void CEffects::BulletTrail(vec2 Pos, float Alpha, float TimePassed) -{ - if(!m_Add100hz && TimePassed < 0.001f) - return; - - CParticle p; - p.SetDefault(); - p.m_Spr = SPRITE_PART_BALL; - p.m_Pos = Pos; - p.m_LifeSpan = random_float(0.25f, 0.5f); - p.m_StartSize = 8.0f; - p.m_EndSize = 0; - p.m_Friction = 0.7f; - p.m_Color.a *= Alpha; - p.m_StartAlpha = Alpha; - m_pClient->m_Particles.Add(CParticles::GROUP_PROJECTILE_TRAIL, &p, TimePassed); -} - -void CEffects::PlayerSpawn(vec2 Pos, float Alpha) -{ - for(int i = 0; i < 32; i++) - { - CParticle p; - p.SetDefault(); - p.m_Spr = SPRITE_PART_SHELL; - p.m_Pos = Pos; - p.m_Vel = random_direction() * (std::pow(random_float(), 3) * 600.0f); - p.m_LifeSpan = random_float(0.3f, 0.6f); - p.m_StartSize = random_float(64.0f, 96.0f); - p.m_EndSize = 0; - p.m_Rot = random_angle(); - p.m_Rotspeed = random_float(); - p.m_Gravity = random_float(-400.0f); - p.m_Friction = 0.7f; - p.m_Color = ColorRGBA(0xb5 / 255.0f, 0x50 / 255.0f, 0xcb / 255.0f, Alpha); - p.m_StartAlpha = Alpha; - m_pClient->m_Particles.Add(CParticles::GROUP_GENERAL, &p); - } - if(g_Config.m_SndGame) - m_pClient->m_Sounds.PlayAt(CSounds::CHN_WORLD, SOUND_PLAYER_SPAWN, 1.0f, Pos); -} - -void CEffects::PlayerDeath(vec2 Pos, int ClientId, float Alpha) -{ - ColorRGBA BloodColor(1.0f, 1.0f, 1.0f); - - if(ClientId >= 0) - { - // Use m_RenderInfo.m_CustomColoredSkin instead of m_UseCustomColor - // m_UseCustomColor says if the player's skin has a custom color (value sent from the client side) - - // m_RenderInfo.m_CustomColoredSkin Defines if in the context of the game the color is being customized, - // Using this value if the game is teams (red and blue), this value will be true even if the skin is with the normal color. - // And will use the team body color to create player death effect instead of tee color - if(m_pClient->m_aClients[ClientId].m_RenderInfo.m_CustomColoredSkin) - BloodColor = m_pClient->m_aClients[ClientId].m_RenderInfo.m_ColorBody; - else - { - BloodColor = m_pClient->m_aClients[ClientId].m_RenderInfo.m_BloodColor; - } - } - - for(int i = 0; i < 64; i++) - { - CParticle p; - p.SetDefault(); - p.m_Spr = SPRITE_PART_SPLAT01 + (rand() % 3); - p.m_Pos = Pos; - p.m_Vel = random_direction() * (random_float(0.1f, 1.1f) * 900.0f); - p.m_LifeSpan = random_float(0.3f, 0.6f); - p.m_StartSize = random_float(24.0f, 40.0f); - p.m_EndSize = 0; - p.m_Rot = random_angle(); - p.m_Rotspeed = random_float(-0.5f, 0.5f) * pi; - p.m_Gravity = 800.0f; - p.m_Friction = 0.8f; - ColorRGBA c = BloodColor.v4() * random_float(0.75f, 1.0f); - p.m_Color = ColorRGBA(c.r, c.g, c.b, 0.75f * Alpha); - p.m_StartAlpha = Alpha; - m_pClient->m_Particles.Add(CParticles::GROUP_GENERAL, &p); - } -} - -void CEffects::Confetti(vec2 Pos, float Alpha) -{ - ColorRGBA Red(1.0f, 0.4f, 0.4f); - ColorRGBA Green(0.4f, 1.0f, 0.4f); - ColorRGBA Blue(0.4f, 0.4f, 1.0f); - ColorRGBA Yellow(1.0f, 1.0f, 0.4f); - ColorRGBA Cyan(0.4f, 1.0f, 1.0f); - ColorRGBA Magenta(1.0f, 0.4f, 1.0f); - - ColorRGBA aConfettiColors[] = {Red, Green, Blue, Yellow, Cyan, Magenta}; - - // powerful confettis - for(int i = 0; i < 32; i++) - { - CParticle p; - p.SetDefault(); - p.m_Spr = SPRITE_PART_SPLAT01 + (rand() % 3); - p.m_Pos = Pos; - p.m_Vel = direction(-0.5f * pi + random_float(-0.2f, 0.2f)) * random_float(0.01f, 1.0f) * 2000.0f; - p.m_LifeSpan = random_float(1.0f, 1.2f); - p.m_StartSize = random_float(12.0f, 24.0f); - p.m_EndSize = 0; - p.m_Rot = random_angle(); - p.m_Rotspeed = random_float(-0.5f, 0.5f) * pi; - p.m_Gravity = -700.0f; - p.m_Friction = 0.6f; - ColorRGBA c = aConfettiColors[(rand() % std::size(aConfettiColors))]; - p.m_Color = c.WithMultipliedAlpha(0.75f * Alpha); - p.m_StartAlpha = Alpha; - m_pClient->m_Particles.Add(CParticles::GROUP_GENERAL, &p); - } - - // broader confettis - for(int i = 0; i < 32; i++) - { - CParticle p; - p.SetDefault(); - p.m_Spr = SPRITE_PART_SPLAT01 + (rand() % 3); - p.m_Pos = Pos; - p.m_Vel = direction(-0.5f * pi + random_float(-0.8f, 0.8f)) * random_float(0.01f, 1.0f) * 1500.0f; - p.m_LifeSpan = random_float(0.8f, 1.0f); - p.m_StartSize = random_float(12.0f, 24.0f); - p.m_EndSize = 0; - p.m_Rot = random_angle(); - p.m_Rotspeed = random_float(-0.5f, 0.5f) * pi; - p.m_Gravity = -700.0f; - p.m_Friction = 0.6f; - ColorRGBA c = aConfettiColors[(rand() % std::size(aConfettiColors))]; - p.m_Color = c.WithMultipliedAlpha(0.75f * Alpha); - p.m_StartAlpha = Alpha; - m_pClient->m_Particles.Add(CParticles::GROUP_GENERAL, &p); - } -} - -void CEffects::Explosion(vec2 Pos, float Alpha) -{ - // add to flow - for(int y = -8; y <= 8; y++) - for(int x = -8; x <= 8; x++) - { - if(x == 0 && y == 0) - continue; - - float a = 1 - (length(vec2(x, y)) / length(vec2(8, 8))); - m_pClient->m_Flow.Add(Pos + vec2(x, y) * 16, normalize(vec2(x, y)) * 5000.0f * a, 10.0f); - } - - // add the explosion - CParticle p; - p.SetDefault(); - p.m_Spr = SPRITE_PART_EXPL01; - p.m_Pos = Pos; - p.m_LifeSpan = 0.4f; - p.m_StartSize = 150.0f; - p.m_EndSize = 0; - p.m_Rot = random_angle(); - p.m_Color.a = Alpha; - p.m_StartAlpha = Alpha; - m_pClient->m_Particles.Add(CParticles::GROUP_EXPLOSIONS, &p); - - // Nudge position slightly to edge of closest tile so the - // smoke doesn't get stuck inside the tile. - if(Collision()->CheckPoint(Pos)) - { - const vec2 DistanceToTopLeft = Pos - vec2(round_truncate(Pos.x / 32), round_truncate(Pos.y / 32)) * 32; - - vec2 CheckOffset; - CheckOffset.x = (DistanceToTopLeft.x > 16 ? 32 : -1); - CheckOffset.y = (DistanceToTopLeft.y > 16 ? 32 : -1); - CheckOffset -= DistanceToTopLeft; - - for(vec2 Mask : {vec2(1.0f, 0.0f), vec2(0.0f, 1.0f), vec2(1.0f, 1.0f)}) - { - const vec2 NewPos = Pos + CheckOffset * Mask; - if(!Collision()->CheckPoint(NewPos)) - { - Pos = NewPos; - break; - } - } - } - - // add the smoke - for(int i = 0; i < 24; i++) - { - p.SetDefault(); - p.m_Spr = SPRITE_PART_SMOKE; - p.m_Pos = Pos; - p.m_Vel = random_direction() * (random_float(1.0f, 1.2f) * 1000.0f); - p.m_LifeSpan = random_float(0.5f, 0.9f); - p.m_StartSize = random_float(32.0f, 40.0f); - p.m_EndSize = 0; - p.m_Gravity = random_float(-800.0f); - p.m_Friction = 0.4f; - p.m_Color = mix(vec4(0.75f, 0.75f, 0.75f, 1.0f), vec4(0.5f, 0.5f, 0.5f, 1.0f), random_float()); - p.m_Color.a *= Alpha; - p.m_StartAlpha = p.m_Color.a; - m_pClient->m_Particles.Add(CParticles::GROUP_GENERAL, &p); - } -} - -void CEffects::HammerHit(vec2 Pos, float Alpha) -{ - // add the explosion - CParticle p; - p.SetDefault(); - p.m_Spr = SPRITE_PART_HIT01; - p.m_Pos = Pos; - p.m_LifeSpan = 0.3f; - p.m_StartSize = 120.0f; - p.m_EndSize = 0; - p.m_Rot = random_angle(); - p.m_Color.a = Alpha; - p.m_StartAlpha = Alpha; - m_pClient->m_Particles.Add(CParticles::GROUP_EXPLOSIONS, &p); - if(g_Config.m_SndGame) - m_pClient->m_Sounds.PlayAt(CSounds::CHN_WORLD, SOUND_HAMMER_HIT, 1.0f, Pos); -} - -void CEffects::OnRender() -{ - static int64_t s_LastUpdate100hz = 0; - static int64_t s_LastUpdate50hz = 0; - static int64_t s_LastUpdate5hz = 0; - - float Speed = 1.0f; - if(Client()->State() == IClient::STATE_DEMOPLAYBACK) - Speed = DemoPlayer()->BaseInfo()->m_Speed; - - if(time() - s_LastUpdate100hz > time_freq() / (100 * Speed)) - { - m_Add100hz = true; - s_LastUpdate100hz = time(); - } - else - m_Add100hz = false; - - if(time() - s_LastUpdate50hz > time_freq() / (50 * Speed)) - { - m_Add50hz = true; - s_LastUpdate50hz = time(); - } - else - m_Add50hz = false; - - if(time() - s_LastUpdate5hz > time_freq() / (5 * Speed)) - { - m_Add5hz = true; - s_LastUpdate5hz = time(); - } - else - m_Add5hz = false; - - if(m_Add50hz) - m_pClient->m_Flow.Update(); -} diff --git a/src/game/client/components/effects.h b/src/game/client/components/effects.h deleted file mode 100644 index 703eff397e..0000000000 --- a/src/game/client/components/effects.h +++ /dev/null @@ -1,38 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_EFFECTS_H -#define GAME_CLIENT_COMPONENTS_EFFECTS_H - -#include - -#include - -class CEffects : public CComponent -{ - bool m_Add5hz; - bool m_Add50hz; - bool m_Add100hz; - -public: - CEffects(); - virtual int Sizeof() const override { return sizeof(*this); } - - virtual void OnRender() override; - - void BulletTrail(vec2 Pos, float Alpha = 1.f, float TimePassed = 0.f); - void SmokeTrail(vec2 Pos, vec2 Vel, float Alpha = 1.f, float TimePassed = 0.f); - void SkidTrail(vec2 Pos, vec2 Vel, float Alpha = 1.0f); - void Explosion(vec2 Pos, float Alpha = 1.0f); - void HammerHit(vec2 Pos, float Alpha = 1.0f); - void AirJump(vec2 Pos, float Alpha = 1.0f); - void DamageIndicator(vec2 Pos, vec2 Dir, float Alpha = 1.0f); - void PlayerSpawn(vec2 Pos, float Alpha = 1.0f); - void PlayerDeath(vec2 Pos, int ClientId, float Alpha = 1.0f); - void PowerupShine(vec2 Pos, vec2 Size, float Alpha = 1.0f); - void FreezingFlakes(vec2 Pos, vec2 Size, float Alpha = 1.0f); - void SparkleTrail(vec2 Pos, float Alpha = 1.0f); - void Confetti(vec2 Pos, float Alpha = 1.0f); - - void Update(); -}; -#endif diff --git a/src/game/client/components/emoticon.cpp b/src/game/client/components/emoticon.cpp deleted file mode 100644 index e7c0963d0c..0000000000 --- a/src/game/client/components/emoticon.cpp +++ /dev/null @@ -1,242 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include -#include - -#include "chat.h" -#include "emoticon.h" -#include -#include -#include - -#include - -CEmoticon::CEmoticon() -{ - OnReset(); -} - -void CEmoticon::ConKeyEmoticon(IConsole::IResult *pResult, void *pUserData) -{ - CEmoticon *pSelf = (CEmoticon *)pUserData; - if(!pSelf->m_pClient->m_Snap.m_SpecInfo.m_Active && pSelf->Client()->State() != IClient::STATE_DEMOPLAYBACK) - pSelf->m_Active = pResult->GetInteger(0) != 0; -} - -void CEmoticon::ConEmote(IConsole::IResult *pResult, void *pUserData) -{ - ((CEmoticon *)pUserData)->Emote(pResult->GetInteger(0)); -} - -void CEmoticon::OnConsoleInit() -{ - Console()->Register("+emote", "", CFGFLAG_CLIENT, ConKeyEmoticon, this, "Open emote selector"); - Console()->Register("emote", "i[emote-id]", CFGFLAG_CLIENT, ConEmote, this, "Use emote"); -} - -void CEmoticon::OnReset() -{ - m_WasActive = false; - m_Active = false; - m_SelectedEmote = -1; - m_SelectedEyeEmote = -1; - m_TouchPressedOutside = false; -} - -void CEmoticon::OnRelease() -{ - m_Active = false; -} - -bool CEmoticon::OnCursorMove(float x, float y, IInput::ECursorType CursorType) -{ - if(!m_Active) - return false; - - Ui()->ConvertMouseMove(&x, &y, CursorType); - m_SelectorMouse += vec2(x, y); - return true; -} - -bool CEmoticon::OnInput(const IInput::CEvent &Event) -{ - if(IsActive() && Event.m_Flags & IInput::FLAG_PRESS && Event.m_Key == KEY_ESCAPE) - { - OnRelease(); - return true; - } - return false; -} - -void CEmoticon::OnRender() -{ - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - if(!m_Active) - { - if(m_TouchPressedOutside) - { - m_SelectedEmote = -1; - m_SelectedEyeEmote = -1; - m_TouchPressedOutside = false; - } - - if(m_WasActive && m_SelectedEmote != -1) - Emote(m_SelectedEmote); - if(m_WasActive && m_SelectedEyeEmote != -1) - EyeEmote(m_SelectedEyeEmote); - m_WasActive = false; - return; - } - - if(m_pClient->m_Snap.m_SpecInfo.m_Active) - { - m_Active = false; - m_WasActive = false; - return; - } - - m_WasActive = true; - - const CUIRect Screen = *Ui()->Screen(); - - const bool WasTouchPressed = m_TouchState.m_AnyPressed; - Ui()->UpdateTouchState(m_TouchState); - if(m_TouchState.m_AnyPressed) - { - const vec2 TouchPos = (m_TouchState.m_PrimaryPosition - vec2(0.5f, 0.5f)) * Screen.Size(); - const float TouchCenterDistance = length(TouchPos); - if(TouchCenterDistance <= 170.0f) - { - m_SelectorMouse = TouchPos; - } - else if(TouchCenterDistance > 190.0f) - { - m_TouchPressedOutside = true; - } - } - else if(WasTouchPressed) - { - m_Active = false; - return; - } - - if(length(m_SelectorMouse) > 170.0f) - m_SelectorMouse = normalize(m_SelectorMouse) * 170.0f; - - float SelectedAngle = angle(m_SelectorMouse) + 2 * pi / 24; - if(SelectedAngle < 0) - SelectedAngle += 2 * pi; - - m_SelectedEmote = -1; - m_SelectedEyeEmote = -1; - if(length(m_SelectorMouse) > 110.0f) - m_SelectedEmote = (int)(SelectedAngle / (2 * pi) * NUM_EMOTICONS); - else if(length(m_SelectorMouse) > 40.0f) - m_SelectedEyeEmote = (int)(SelectedAngle / (2 * pi) * NUM_EMOTES); - - const vec2 ScreenCenter = Screen.Center(); - - Ui()->MapScreen(); - - Graphics()->BlendNormal(); - - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - Graphics()->SetColor(0, 0, 0, 0.3f); - Graphics()->DrawCircle(ScreenCenter.x, ScreenCenter.y, 190.0f, 64); - Graphics()->QuadsEnd(); - - Graphics()->WrapClamp(); - for(int Emote = 0; Emote < NUM_EMOTICONS; Emote++) - { - float Angle = 2 * pi * Emote / NUM_EMOTICONS; - if(Angle > pi) - Angle -= 2 * pi; - - Graphics()->TextureSet(GameClient()->m_EmoticonsSkin.m_aSpriteEmoticons[Emote]); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - Graphics()->QuadsBegin(); - const vec2 Nudge = direction(Angle) * 150.0f; - const float Size = m_SelectedEmote == Emote ? 80.0f : 50.0f; - IGraphics::CQuadItem QuadItem(ScreenCenter.x + Nudge.x, ScreenCenter.y + Nudge.y, Size, Size); - Graphics()->QuadsDraw(&QuadItem, 1); - Graphics()->QuadsEnd(); - } - Graphics()->WrapNormal(); - - if(GameClient()->m_GameInfo.m_AllowEyeWheel && g_Config.m_ClEyeWheel) - { - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.0, 1.0, 1.0, 0.3f); - Graphics()->DrawCircle(ScreenCenter.x, ScreenCenter.y, 100.0f, 64); - Graphics()->QuadsEnd(); - - CTeeRenderInfo TeeInfo = m_pClient->m_aClients[m_pClient->m_aLocalIds[g_Config.m_ClDummy]].m_RenderInfo; - - for(int Emote = 0; Emote < NUM_EMOTES; Emote++) - { - float Angle = 2 * pi * Emote / NUM_EMOTES; - if(Angle > pi) - Angle -= 2 * pi; - - const vec2 Nudge = direction(Angle) * 70.0f; - TeeInfo.m_Size = m_SelectedEyeEmote == Emote ? 64.0f : 48.0f; - RenderTools()->RenderTee(CAnimState::GetIdle(), &TeeInfo, Emote, vec2(-1, 0), ScreenCenter + Nudge); - } - - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - Graphics()->SetColor(0, 0, 0, 0.3f); - Graphics()->DrawCircle(ScreenCenter.x, ScreenCenter.y, 30.0f, 64); - Graphics()->QuadsEnd(); - } - else - m_SelectedEyeEmote = -1; - - RenderTools()->RenderCursor(ScreenCenter + m_SelectorMouse, 24.0f); -} - -void CEmoticon::Emote(int Emoticon) -{ - CNetMsg_Cl_Emoticon Msg; - Msg.m_Emoticon = Emoticon; - Client()->SendPackMsgActive(&Msg, MSGFLAG_VITAL); - - if(g_Config.m_ClDummyCopyMoves) - { - CMsgPacker MsgDummy(NETMSGTYPE_CL_EMOTICON, false); - MsgDummy.AddInt(Emoticon); - Client()->SendMsg(!g_Config.m_ClDummy, &MsgDummy, MSGFLAG_VITAL); - } -} - -void CEmoticon::EyeEmote(int Emote) -{ - char aBuf[32]; - switch(Emote) - { - case EMOTE_NORMAL: - str_format(aBuf, sizeof(aBuf), "/emote normal %d", g_Config.m_ClEyeDuration); - break; - case EMOTE_PAIN: - str_format(aBuf, sizeof(aBuf), "/emote pain %d", g_Config.m_ClEyeDuration); - break; - case EMOTE_HAPPY: - str_format(aBuf, sizeof(aBuf), "/emote happy %d", g_Config.m_ClEyeDuration); - break; - case EMOTE_SURPRISE: - str_format(aBuf, sizeof(aBuf), "/emote surprise %d", g_Config.m_ClEyeDuration); - break; - case EMOTE_ANGRY: - str_format(aBuf, sizeof(aBuf), "/emote angry %d", g_Config.m_ClEyeDuration); - break; - case EMOTE_BLINK: - str_format(aBuf, sizeof(aBuf), "/emote blink %d", g_Config.m_ClEyeDuration); - break; - } - GameClient()->m_Chat.SendChat(0, aBuf); -} diff --git a/src/game/client/components/emoticon.h b/src/game/client/components/emoticon.h deleted file mode 100644 index 890f1c80ef..0000000000 --- a/src/game/client/components/emoticon.h +++ /dev/null @@ -1,43 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_EMOTICON_H -#define GAME_CLIENT_COMPONENTS_EMOTICON_H -#include -#include - -#include -#include - -class CEmoticon : public CComponent -{ - bool m_WasActive; - bool m_Active; - - vec2 m_SelectorMouse; - int m_SelectedEmote; - int m_SelectedEyeEmote; - - CUi::CTouchState m_TouchState; - bool m_TouchPressedOutside; - - static void ConKeyEmoticon(IConsole::IResult *pResult, void *pUserData); - static void ConEmote(IConsole::IResult *pResult, void *pUserData); - -public: - CEmoticon(); - virtual int Sizeof() const override { return sizeof(*this); } - - virtual void OnReset() override; - virtual void OnConsoleInit() override; - virtual void OnRender() override; - virtual void OnRelease() override; - virtual bool OnCursorMove(float x, float y, IInput::ECursorType CursorType) override; - virtual bool OnInput(const IInput::CEvent &Event) override; - - void Emote(int Emoticon); - void EyeEmote(int EyeEmote); - - bool IsActive() const { return m_Active; } -}; - -#endif diff --git a/src/game/client/components/flow.cpp b/src/game/client/components/flow.cpp deleted file mode 100644 index 634edb29b2..0000000000 --- a/src/game/client/components/flow.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include "flow.h" -#include -#include -#include - -CFlow::CFlow() -{ - m_pCells = 0; - m_Height = 0; - m_Width = 0; - m_Spacing = 16; -} - -void CFlow::DbgRender() -{ - if(!m_pCells) - return; - - IGraphics::CLineItem Array[1024]; - int NumItems = 0; - Graphics()->TextureClear(); - Graphics()->LinesBegin(); - for(int y = 0; y < m_Height; y++) - for(int x = 0; x < m_Width; x++) - { - vec2 Pos(x * m_Spacing, y * m_Spacing); - vec2 Vel = m_pCells[y * m_Width + x].m_Vel * 0.01f; - Array[NumItems++] = IGraphics::CLineItem(Pos.x, Pos.y, Pos.x + Vel.x, Pos.y + Vel.y); - if(NumItems == 1024) - { - Graphics()->LinesDraw(Array, 1024); - NumItems = 0; - } - } - - if(NumItems) - Graphics()->LinesDraw(Array, NumItems); - Graphics()->LinesEnd(); -} - -void CFlow::Init() -{ - free(m_pCells); - m_pCells = 0; - - CMapItemLayerTilemap *pTilemap = Layers()->GameLayer(); - m_Width = pTilemap->m_Width * 32 / m_Spacing; - m_Height = pTilemap->m_Height * 32 / m_Spacing; - - // allocate and clear - m_pCells = (CCell *)calloc((size_t)m_Width * m_Height, sizeof(CCell)); - for(int y = 0; y < m_Height; y++) - for(int x = 0; x < m_Width; x++) - m_pCells[y * m_Width + x].m_Vel = vec2(0.0f, 0.0f); -} - -void CFlow::Update() -{ - if(!m_pCells) - return; - - for(int y = 0; y < m_Height; y++) - for(int x = 0; x < m_Width; x++) - m_pCells[y * m_Width + x].m_Vel *= 0.85f; -} - -vec2 CFlow::Get(vec2 Pos) -{ - if(!m_pCells) - return vec2(0, 0); - - int x = (int)(Pos.x / m_Spacing); - int y = (int)(Pos.y / m_Spacing); - if(x < 0 || y < 0 || x >= m_Width || y >= m_Height) - return vec2(0, 0); - - return m_pCells[y * m_Width + x].m_Vel; -} - -void CFlow::Add(vec2 Pos, vec2 Vel, float Size) -{ - if(!m_pCells) - return; - - int x = (int)(Pos.x / m_Spacing); - int y = (int)(Pos.y / m_Spacing); - if(x < 0 || y < 0 || x >= m_Width || y >= m_Height) - return; - - m_pCells[y * m_Width + x].m_Vel += Vel; -} diff --git a/src/game/client/components/flow.h b/src/game/client/components/flow.h deleted file mode 100644 index ab4274e134..0000000000 --- a/src/game/client/components/flow.h +++ /dev/null @@ -1,32 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_FLOW_H -#define GAME_CLIENT_COMPONENTS_FLOW_H -#include -#include - -class CFlow : public CComponent -{ - struct CCell - { - vec2 m_Vel; - }; - - CCell *m_pCells; - int m_Height; - int m_Width; - int m_Spacing; - - void DbgRender(); - void Init(); - -public: - CFlow(); - virtual int Sizeof() const override { return sizeof(*this); } - - vec2 Get(vec2 Pos); - void Add(vec2 Pos, vec2 Vel, float Size); - void Update(); -}; - -#endif diff --git a/src/game/client/components/freezebars.cpp b/src/game/client/components/freezebars.cpp deleted file mode 100644 index 1f5f0204ee..0000000000 --- a/src/game/client/components/freezebars.cpp +++ /dev/null @@ -1,242 +0,0 @@ -#include - -#include "freezebars.h" - -void CFreezeBars::RenderFreezeBar(const int ClientId) -{ - const float FreezeBarWidth = 64.0f; - const float FreezeBarHalfWidth = 32.0f; - const float FreezeBarHight = 16.0f; - - // pCharacter contains the predicted character for local players or the last snap for players who are spectated - CCharacterCore *pCharacter = &m_pClient->m_aClients[ClientId].m_Predicted; - - if(pCharacter->m_FreezeEnd <= 0 || pCharacter->m_FreezeStart == 0 || pCharacter->m_FreezeEnd <= pCharacter->m_FreezeStart || !m_pClient->m_Snap.m_aCharacters[ClientId].m_HasExtendedDisplayInfo || (pCharacter->m_IsInFreeze && g_Config.m_ClFreezeBarsAlphaInsideFreeze == 0)) - { - return; - } - - const int Max = pCharacter->m_FreezeEnd - pCharacter->m_FreezeStart; - float FreezeProgress = clamp(Max - (Client()->GameTick(g_Config.m_ClDummy) - pCharacter->m_FreezeStart), 0, Max) / (float)Max; - if(FreezeProgress <= 0.0f) - { - return; - } - - vec2 Position = m_pClient->m_aClients[ClientId].m_RenderPos; - Position.x -= FreezeBarHalfWidth; - Position.y += 32; - - float Alpha = m_pClient->IsOtherTeam(ClientId) ? g_Config.m_ClShowOthersAlpha / 100.0f : 1.0f; - if(pCharacter->m_IsInFreeze) - { - Alpha *= g_Config.m_ClFreezeBarsAlphaInsideFreeze / 100.0f; - } - - RenderFreezeBarPos(Position.x, Position.y, FreezeBarWidth, FreezeBarHight, FreezeProgress, Alpha); -} - -void CFreezeBars::RenderFreezeBarPos(float x, const float y, const float Width, const float Height, float Progress, const float Alpha) -{ - Progress = clamp(Progress, 0.0f, 1.0f); - - // what percentage of the end pieces is used for the progress indicator and how much is the rest - // half of the ends are used for the progress display - const float RestPct = 0.5f; - const float ProgPct = 0.5f; - - const float EndWidth = Height; // to keep the correct scale - the height of the sprite is as long as the width - const float BarHeight = Height; - const float WholeBarWidth = Width; - const float MiddleBarWidth = WholeBarWidth - (EndWidth * 2.0f); - const float EndProgressWidth = EndWidth * ProgPct; - const float EndRestWidth = EndWidth * RestPct; - const float ProgressBarWidth = WholeBarWidth - (EndProgressWidth * 2.0f); - const float EndProgressProportion = EndProgressWidth / ProgressBarWidth; - const float MiddleProgressProportion = MiddleBarWidth / ProgressBarWidth; - - // beginning piece - float BeginningPieceProgress = 1; - if(Progress <= EndProgressProportion) - { - BeginningPieceProgress = Progress / EndProgressProportion; - } - - // full - Graphics()->WrapClamp(); - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudFreezeBarFullLeft); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.f, 1.f, 1.f, Alpha); - // Subset: top_l, top_m, btm_m, btm_l - Graphics()->QuadsSetSubsetFree(0, 0, RestPct + ProgPct * BeginningPieceProgress, 0, RestPct + ProgPct * BeginningPieceProgress, 1, 0, 1); - IGraphics::CQuadItem QuadFullBeginning(x, y, EndRestWidth + EndProgressWidth * BeginningPieceProgress, BarHeight); - Graphics()->QuadsDrawTL(&QuadFullBeginning, 1); - Graphics()->QuadsEnd(); - - // empty - if(BeginningPieceProgress < 1.0f) - { - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudFreezeBarEmptyRight); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.f, 1.f, 1.f, Alpha); - // Subset: top_m, top_l, btm_l, btm_m | it is mirrored on the horizontal axe and rotated 180 degrees - Graphics()->QuadsSetSubsetFree(ProgPct - ProgPct * BeginningPieceProgress, 0, 0, 0, 0, 1, ProgPct - ProgPct * BeginningPieceProgress, 1); - IGraphics::CQuadItem QuadEmptyBeginning(x + EndRestWidth + EndProgressWidth * BeginningPieceProgress, y, EndProgressWidth * (1.0f - BeginningPieceProgress), BarHeight); - Graphics()->QuadsDrawTL(&QuadEmptyBeginning, 1); - Graphics()->QuadsEnd(); - } - - // middle piece - x += EndWidth; - - float MiddlePieceProgress = 1; - if(Progress <= EndProgressProportion + MiddleProgressProportion) - { - if(Progress <= EndProgressProportion) - { - MiddlePieceProgress = 0; - } - else - { - MiddlePieceProgress = (Progress - EndProgressProportion) / MiddleProgressProportion; - } - } - - const float FullMiddleBarWidth = MiddleBarWidth * MiddlePieceProgress; - const float EmptyMiddleBarWidth = MiddleBarWidth - FullMiddleBarWidth; - - // full freeze bar - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudFreezeBarFull); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.f, 1.f, 1.f, Alpha); - // select the middle portion of the sprite so we don't get edge bleeding - if(FullMiddleBarWidth <= EndWidth) - { - // prevent pixel puree, select only a small slice - // Subset: top_l, top_m, btm_m, btm_l - Graphics()->QuadsSetSubsetFree(0, 0, FullMiddleBarWidth / EndWidth, 0, FullMiddleBarWidth / EndWidth, 1, 0, 1); - } - else - { - // Subset: top_l, top_r, btm_r, btm_l - Graphics()->QuadsSetSubsetFree(0, 0, 1, 0, 1, 1, 0, 1); - } - IGraphics::CQuadItem QuadFull(x, y, FullMiddleBarWidth, BarHeight); - Graphics()->QuadsDrawTL(&QuadFull, 1); - Graphics()->QuadsEnd(); - - // empty freeze bar - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudFreezeBarEmpty); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.f, 1.f, 1.f, Alpha); - // select the middle portion of the sprite so we don't get edge bleeding - if(EmptyMiddleBarWidth <= EndWidth) - { - // prevent pixel puree, select only a small slice - // Subset: top_m, top_l, btm_l, btm_m | it is mirrored on the horizontal axe and rotated 180 degrees - Graphics()->QuadsSetSubsetFree(EmptyMiddleBarWidth / EndWidth, 0, 0, 0, 0, 1, EmptyMiddleBarWidth / EndWidth, 1); - } - else - { - // Subset: top_r, top_l, btm_l, btm_r | it is mirrored on the horizontal axe and rotated 180 degrees - Graphics()->QuadsSetSubsetFree(1, 0, 0, 0, 0, 1, 1, 1); - } - - IGraphics::CQuadItem QuadEmpty(x + FullMiddleBarWidth, y, EmptyMiddleBarWidth, BarHeight); - Graphics()->QuadsDrawTL(&QuadEmpty, 1); - Graphics()->QuadsEnd(); - - // end piece - x += MiddleBarWidth; - float EndingPieceProgress = 1; - if(Progress <= 1) - { - if(Progress <= (EndProgressProportion + MiddleProgressProportion)) - { - EndingPieceProgress = 0; - } - else - { - EndingPieceProgress = (Progress - EndProgressProportion - MiddleProgressProportion) / EndProgressProportion; - } - } - if(EndingPieceProgress > 0.0f) - { - // full - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudFreezeBarFullLeft); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.f, 1.f, 1.f, Alpha); - // Subset: top_r, top_m, btm_m, btm_r | it is mirrored on the horizontal axe and rotated 180 degrees - Graphics()->QuadsSetSubsetFree(1, 0, 1.0f - ProgPct * EndingPieceProgress, 0, 1.0f - ProgPct * EndingPieceProgress, 1, 1, 1); - IGraphics::CQuadItem QuadFullEnding(x, y, EndProgressWidth * EndingPieceProgress, BarHeight); - Graphics()->QuadsDrawTL(&QuadFullEnding, 1); - Graphics()->QuadsEnd(); - } - // empty - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudFreezeBarEmptyRight); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.f, 1.f, 1.f, Alpha); - // Subset: top_m, top_r, btm_r, btm_m - Graphics()->QuadsSetSubsetFree(ProgPct - ProgPct * (1.0f - EndingPieceProgress), 0, 1, 0, 1, 1, ProgPct - ProgPct * (1.0f - EndingPieceProgress), 1); - IGraphics::CQuadItem QuadEmptyEnding(x + EndProgressWidth * EndingPieceProgress, y, EndProgressWidth * (1.0f - EndingPieceProgress) + EndRestWidth, BarHeight); - Graphics()->QuadsDrawTL(&QuadEmptyEnding, 1); - Graphics()->QuadsEnd(); - - Graphics()->QuadsSetSubset(0, 0, 1, 1); - Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); - Graphics()->WrapNormal(); -} - -inline bool CFreezeBars::IsPlayerInfoAvailable(int ClientId) const -{ - const void *pPrevInfo = Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_PLAYERINFO, ClientId); - const void *pInfo = Client()->SnapFindItem(IClient::SNAP_CURRENT, NETOBJTYPE_PLAYERINFO, ClientId); - return pPrevInfo && pInfo; -} - -void CFreezeBars::OnRender() -{ - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - if(!g_Config.m_ClShowFreezeBars) - { - return; - } - // get screen edges to avoid rendering offscreen - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - // expand the edges to prevent popping in/out onscreen - // - // it is assumed that the tee with the freeze bar fit into a 240x240 box centered on the tee - // this may need to be changed or calculated differently in the future - float BorderBuffer = 120; - ScreenX0 -= BorderBuffer; - ScreenX1 += BorderBuffer; - ScreenY0 -= BorderBuffer; - ScreenY1 += BorderBuffer; - - int LocalClientId = m_pClient->m_Snap.m_LocalClientId; - - // render everyone else's freeze bar, then our own - for(int ClientId = 0; ClientId < MAX_CLIENTS; ClientId++) - { - if(ClientId == LocalClientId || !m_pClient->m_Snap.m_aCharacters[ClientId].m_Active || !IsPlayerInfoAvailable(ClientId)) - { - continue; - } - - //don't render if the tee is offscreen - vec2 *pRenderPos = &m_pClient->m_aClients[ClientId].m_RenderPos; - if(pRenderPos->x < ScreenX0 || pRenderPos->x > ScreenX1 || pRenderPos->y < ScreenY0 || pRenderPos->y > ScreenY1) - { - continue; - } - - RenderFreezeBar(ClientId); - } - if(LocalClientId != -1 && m_pClient->m_Snap.m_aCharacters[LocalClientId].m_Active && IsPlayerInfoAvailable(LocalClientId)) - { - RenderFreezeBar(LocalClientId); - } -} diff --git a/src/game/client/components/freezebars.h b/src/game/client/components/freezebars.h deleted file mode 100644 index 1f8307453e..0000000000 --- a/src/game/client/components/freezebars.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef GAME_CLIENT_COMPONENTS_FREEZEBARS_H -#define GAME_CLIENT_COMPONENTS_FREEZEBARS_H -#include - -class CFreezeBars : public CComponent -{ - void RenderFreezeBar(const int ClientId); - void RenderFreezeBarPos(float x, const float y, const float Width, const float Height, float Progress, float Alpha = 1.0f); - bool IsPlayerInfoAvailable(int ClientId) const; - -public: - virtual int Sizeof() const override { return sizeof(*this); } - virtual void OnRender() override; -}; - -#endif diff --git a/src/game/client/components/ghost.cpp b/src/game/client/components/ghost.cpp deleted file mode 100644 index 1554cb7456..0000000000 --- a/src/game/client/components/ghost.cpp +++ /dev/null @@ -1,665 +0,0 @@ -/* (c) Rajh, Redix and Sushi. */ - -#include "ghost.h" - -#include - -#include -#include -#include - -#include -#include -#include -#include -#include - -const char *CGhost::ms_pGhostDir = "ghosts"; - -static const LOG_COLOR LOG_COLOR_GHOST{165, 153, 153}; - -void CGhost::GetGhostSkin(CGhostSkin *pSkin, const char *pSkinName, int UseCustomColor, int ColorBody, int ColorFeet) -{ - StrToInts(&pSkin->m_Skin0, 6, pSkinName); - pSkin->m_UseCustomColor = UseCustomColor; - pSkin->m_ColorBody = ColorBody; - pSkin->m_ColorFeet = ColorFeet; -} - -void CGhost::GetGhostCharacter(CGhostCharacter *pGhostChar, const CNetObj_Character *pChar, const CNetObj_DDNetCharacter *pDDnetChar) -{ - pGhostChar->m_X = pChar->m_X; - pGhostChar->m_Y = pChar->m_Y; - pGhostChar->m_VelX = pChar->m_VelX; - pGhostChar->m_VelY = 0; - pGhostChar->m_Angle = pChar->m_Angle; - pGhostChar->m_Direction = pChar->m_Direction; - int Weapon = pChar->m_Weapon; - if(pDDnetChar != nullptr && pDDnetChar->m_FreezeEnd != 0) - { - Weapon = WEAPON_NINJA; - } - pGhostChar->m_Weapon = Weapon; - pGhostChar->m_HookState = pChar->m_HookState; - pGhostChar->m_HookX = pChar->m_HookX; - pGhostChar->m_HookY = pChar->m_HookY; - pGhostChar->m_AttackTick = pChar->m_AttackTick; - pGhostChar->m_Tick = pChar->m_Tick; -} - -void CGhost::GetNetObjCharacter(CNetObj_Character *pChar, const CGhostCharacter *pGhostChar) -{ - mem_zero(pChar, sizeof(CNetObj_Character)); - pChar->m_X = pGhostChar->m_X; - pChar->m_Y = pGhostChar->m_Y; - pChar->m_VelX = pGhostChar->m_VelX; - pChar->m_VelY = 0; - pChar->m_Angle = pGhostChar->m_Angle; - pChar->m_Direction = pGhostChar->m_Direction; - pChar->m_Weapon = pGhostChar->m_Weapon; - pChar->m_HookState = pGhostChar->m_HookState; - pChar->m_HookX = pGhostChar->m_HookX; - pChar->m_HookY = pGhostChar->m_HookY; - pChar->m_AttackTick = pGhostChar->m_AttackTick; - pChar->m_HookedPlayer = -1; - pChar->m_Tick = pGhostChar->m_Tick; -} - -CGhost::CGhostPath::CGhostPath(CGhostPath &&Other) noexcept : - m_ChunkSize(Other.m_ChunkSize), m_NumItems(Other.m_NumItems), m_vpChunks(std::move(Other.m_vpChunks)) -{ - Other.m_NumItems = 0; - Other.m_vpChunks.clear(); -} - -CGhost::CGhostPath &CGhost::CGhostPath::operator=(CGhostPath &&Other) noexcept -{ - Reset(Other.m_ChunkSize); - m_NumItems = Other.m_NumItems; - m_vpChunks = std::move(Other.m_vpChunks); - Other.m_NumItems = 0; - Other.m_vpChunks.clear(); - return *this; -} - -void CGhost::CGhostPath::Reset(int ChunkSize) -{ - for(auto &pChunk : m_vpChunks) - free(pChunk); - m_vpChunks.clear(); - m_ChunkSize = ChunkSize; - m_NumItems = 0; -} - -void CGhost::CGhostPath::SetSize(int Items) -{ - int Chunks = m_vpChunks.size(); - int NeededChunks = (Items + m_ChunkSize - 1) / m_ChunkSize; - - if(NeededChunks > Chunks) - { - m_vpChunks.resize(NeededChunks); - for(int i = Chunks; i < NeededChunks; i++) - m_vpChunks[i] = (CGhostCharacter *)calloc(m_ChunkSize, sizeof(CGhostCharacter)); - } - - m_NumItems = Items; -} - -void CGhost::CGhostPath::Add(const CGhostCharacter &Char) -{ - SetSize(m_NumItems + 1); - *Get(m_NumItems - 1) = Char; -} - -CGhostCharacter *CGhost::CGhostPath::Get(int Index) -{ - if(Index < 0 || Index >= m_NumItems) - return 0; - - int Chunk = Index / m_ChunkSize; - int Pos = Index % m_ChunkSize; - return &m_vpChunks[Chunk][Pos]; -} - -void CGhost::GetPath(char *pBuf, int Size, const char *pPlayerName, int Time) const -{ - const char *pMap = Client()->GetCurrentMap(); - SHA256_DIGEST Sha256 = Client()->GetCurrentMapSha256(); - char aSha256[SHA256_MAXSTRSIZE]; - sha256_str(Sha256, aSha256, sizeof(aSha256)); - - char aPlayerName[MAX_NAME_LENGTH]; - str_copy(aPlayerName, pPlayerName); - str_sanitize_filename(aPlayerName); - - char aTimestamp[32]; - str_timestamp_format(aTimestamp, sizeof(aTimestamp), FORMAT_NOSPACE); - - if(Time < 0) - str_format(pBuf, Size, "%s/%s_%s_%s_tmp_%d.gho", ms_pGhostDir, pMap, aPlayerName, aSha256, pid()); - else - str_format(pBuf, Size, "%s/%s_%s_%d.%03d_%s_%s.gho", ms_pGhostDir, pMap, aPlayerName, Time / 1000, Time % 1000, aTimestamp, aSha256); -} - -void CGhost::AddInfos(const CNetObj_Character *pChar, const CNetObj_DDNetCharacter *pDDnetChar) -{ - int NumTicks = m_CurGhost.m_Path.Size(); - - // do not start writing to file as long as we still touch the start line - if(g_Config.m_ClRaceSaveGhost && !GhostRecorder()->IsRecording() && NumTicks > 0) - { - GetPath(m_aTmpFilename, sizeof(m_aTmpFilename), m_CurGhost.m_aPlayer); - GhostRecorder()->Start(m_aTmpFilename, Client()->GetCurrentMap(), Client()->GetCurrentMapSha256(), m_CurGhost.m_aPlayer); - - GhostRecorder()->WriteData(GHOSTDATA_TYPE_START_TICK, &m_CurGhost.m_StartTick, sizeof(int)); - GhostRecorder()->WriteData(GHOSTDATA_TYPE_SKIN, &m_CurGhost.m_Skin, sizeof(CGhostSkin)); - for(int i = 0; i < NumTicks; i++) - GhostRecorder()->WriteData(GHOSTDATA_TYPE_CHARACTER, m_CurGhost.m_Path.Get(i), sizeof(CGhostCharacter)); - } - - CGhostCharacter GhostChar; - GetGhostCharacter(&GhostChar, pChar, pDDnetChar); - m_CurGhost.m_Path.Add(GhostChar); - if(GhostRecorder()->IsRecording()) - GhostRecorder()->WriteData(GHOSTDATA_TYPE_CHARACTER, &GhostChar, sizeof(CGhostCharacter)); -} - -int CGhost::GetSlot() const -{ - for(int i = 0; i < MAX_ACTIVE_GHOSTS; i++) - if(m_aActiveGhosts[i].Empty()) - return i; - return -1; -} - -int CGhost::FreeSlots() const -{ - int Num = 0; - for(const auto &ActiveGhost : m_aActiveGhosts) - if(ActiveGhost.Empty()) - Num++; - return Num; -} - -void CGhost::CheckStart() -{ - int RaceTick = -m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer; - int RenderTick = m_NewRenderTick; - - if(GameClient()->LastRaceTick() != RaceTick && Client()->GameTick(g_Config.m_ClDummy) - RaceTick < Client()->GameTickSpeed()) - { - if(m_Rendering && m_RenderingStartedByServer) // race restarted: stop rendering - StopRender(); - if(m_Recording && GameClient()->LastRaceTick() != -1) // race restarted: activate restarting for local start detection so we have a smooth transition - m_AllowRestart = true; - if(GameClient()->LastRaceTick() == -1) // no restart: reset rendering preparations - m_NewRenderTick = -1; - if(GhostRecorder()->IsRecording()) // race restarted: stop recording - GhostRecorder()->Stop(0, -1); - int StartTick = RaceTick; - - if(GameClient()->m_GameInfo.m_BugDDRaceGhost) // the client recognizes the start one tick earlier than ddrace servers - StartTick--; - StartRecord(StartTick); - RenderTick = StartTick; - } - - TryRenderStart(RenderTick, true); -} - -void CGhost::CheckStartLocal(bool Predicted) -{ - if(Predicted) // rendering - { - int RenderTick = m_NewRenderTick; - - vec2 PrevPos = m_pClient->m_PredictedPrevChar.m_Pos; - vec2 Pos = m_pClient->m_PredictedChar.m_Pos; - if(((!m_Rendering && RenderTick == -1) || m_AllowRestart) && GameClient()->RaceHelper()->IsStart(PrevPos, Pos)) - { - if(m_Rendering && !m_RenderingStartedByServer) // race restarted: stop rendering - StopRender(); - RenderTick = Client()->PredGameTick(g_Config.m_ClDummy); - } - - TryRenderStart(RenderTick, false); - } - else // recording - { - int PrevTick = m_pClient->m_Snap.m_pLocalPrevCharacter->m_Tick; - int CurTick = m_pClient->m_Snap.m_pLocalCharacter->m_Tick; - vec2 PrevPos = vec2(m_pClient->m_Snap.m_pLocalPrevCharacter->m_X, m_pClient->m_Snap.m_pLocalPrevCharacter->m_Y); - vec2 Pos = vec2(m_pClient->m_Snap.m_pLocalCharacter->m_X, m_pClient->m_Snap.m_pLocalCharacter->m_Y); - - // detecting death, needed because race allows immediate respawning - if((!m_Recording || m_AllowRestart) && m_LastDeathTick < PrevTick) - { - // estimate the exact start tick - int RecordTick = -1; - int TickDiff = CurTick - PrevTick; - for(int i = 0; i < TickDiff; i++) - { - if(GameClient()->RaceHelper()->IsStart(mix(PrevPos, Pos, (float)i / TickDiff), mix(PrevPos, Pos, (float)(i + 1) / TickDiff))) - { - RecordTick = PrevTick + i + 1; - if(!m_AllowRestart) - break; - } - } - if(RecordTick != -1) - { - if(GhostRecorder()->IsRecording()) // race restarted: stop recording - GhostRecorder()->Stop(0, -1); - StartRecord(RecordTick); - } - } - } -} - -void CGhost::TryRenderStart(int Tick, bool ServerControl) -{ - // only restart rendering if it did not change since last tick to prevent stuttering - if(m_NewRenderTick != -1 && m_NewRenderTick == Tick) - { - StartRender(Tick); - Tick = -1; - m_RenderingStartedByServer = ServerControl; - } - m_NewRenderTick = Tick; -} - -void CGhost::OnNewSnapshot() -{ - if(!GameClient()->m_GameInfo.m_Race || !g_Config.m_ClRaceGhost || Client()->State() != IClient::STATE_ONLINE) - return; - if(!m_pClient->m_Snap.m_pGameInfoObj || m_pClient->m_Snap.m_SpecInfo.m_Active || !m_pClient->m_Snap.m_pLocalCharacter || !m_pClient->m_Snap.m_pLocalPrevCharacter) - return; - - const bool RaceFlag = m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_RACETIME; - const bool ServerControl = RaceFlag && g_Config.m_ClRaceGhostServerControl; - - if(!ServerControl) - CheckStartLocal(false); - else - CheckStart(); - - if(m_Recording) - AddInfos(m_pClient->m_Snap.m_pLocalCharacter, (m_pClient->m_Snap.m_LocalClientId != -1 && m_pClient->m_Snap.m_aCharacters[m_pClient->m_Snap.m_LocalClientId].m_HasExtendedData) ? &m_pClient->m_Snap.m_aCharacters[m_pClient->m_Snap.m_LocalClientId].m_ExtendedData : nullptr); -} - -void CGhost::OnNewPredictedSnapshot() -{ - if(!GameClient()->m_GameInfo.m_Race || !g_Config.m_ClRaceGhost || Client()->State() != IClient::STATE_ONLINE) - return; - if(!m_pClient->m_Snap.m_pGameInfoObj || m_pClient->m_Snap.m_SpecInfo.m_Active || !m_pClient->m_Snap.m_pLocalCharacter || !m_pClient->m_Snap.m_pLocalPrevCharacter) - return; - - const bool RaceFlag = m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_RACETIME; - const bool ServerControl = RaceFlag && g_Config.m_ClRaceGhostServerControl; - - if(!ServerControl) - CheckStartLocal(true); -} - -void CGhost::OnRender() -{ - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - // Play the ghost - if(!m_Rendering || !g_Config.m_ClRaceShowGhost) - return; - - int PlaybackTick = Client()->PredGameTick(g_Config.m_ClDummy) - m_StartRenderTick; - - for(auto &Ghost : m_aActiveGhosts) - { - if(Ghost.Empty()) - continue; - - int GhostTick = Ghost.m_StartTick + PlaybackTick; - while(Ghost.m_PlaybackPos >= 0 && Ghost.m_Path.Get(Ghost.m_PlaybackPos)->m_Tick < GhostTick) - { - if(Ghost.m_PlaybackPos < Ghost.m_Path.Size() - 1) - Ghost.m_PlaybackPos++; - else - Ghost.m_PlaybackPos = -1; - } - - if(Ghost.m_PlaybackPos < 0) - continue; - - int CurPos = Ghost.m_PlaybackPos; - int PrevPos = maximum(0, CurPos - 1); - if(Ghost.m_Path.Get(PrevPos)->m_Tick > GhostTick) - continue; - - CNetObj_Character Player, Prev; - GetNetObjCharacter(&Player, Ghost.m_Path.Get(CurPos)); - GetNetObjCharacter(&Prev, Ghost.m_Path.Get(PrevPos)); - - int TickDiff = Player.m_Tick - Prev.m_Tick; - float IntraTick = 0.f; - if(TickDiff > 0) - IntraTick = (GhostTick - Prev.m_Tick - 1 + Client()->PredIntraGameTick(g_Config.m_ClDummy)) / TickDiff; - - Player.m_AttackTick += Client()->GameTick(g_Config.m_ClDummy) - GhostTick; - - CTeeRenderInfo *pRenderInfo = &Ghost.m_RenderInfo; - CTeeRenderInfo GhostNinjaRenderInfo; - if(Player.m_Weapon == WEAPON_NINJA && g_Config.m_ClShowNinja) - { - // change the skin for the ghost to the ninja - const auto *pSkin = m_pClient->m_Skins.FindOrNullptr("x_ninja"); - if(pSkin != nullptr) - { - bool IsTeamplay = false; - if(m_pClient->m_Snap.m_pGameInfoObj) - IsTeamplay = (m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS) != 0; - - GhostNinjaRenderInfo = Ghost.m_RenderInfo; - GhostNinjaRenderInfo.Apply(pSkin); - GhostNinjaRenderInfo.m_CustomColoredSkin = IsTeamplay; - if(!IsTeamplay) - { - GhostNinjaRenderInfo.m_ColorBody = ColorRGBA(1, 1, 1); - GhostNinjaRenderInfo.m_ColorFeet = ColorRGBA(1, 1, 1); - } - pRenderInfo = &GhostNinjaRenderInfo; - } - } - - m_pClient->m_Players.RenderHook(&Prev, &Player, pRenderInfo, -2, IntraTick); - m_pClient->m_Players.RenderHookCollLine(&Prev, &Player, -2, IntraTick); - m_pClient->m_Players.RenderPlayer(&Prev, &Player, pRenderInfo, -2, IntraTick); - } -} - -void CGhost::InitRenderInfos(CGhostItem *pGhost) -{ - char aSkinName[MAX_SKIN_LENGTH]; - IntsToStr(&pGhost->m_Skin.m_Skin0, 6, aSkinName, std::size(aSkinName)); - CTeeRenderInfo *pRenderInfo = &pGhost->m_RenderInfo; - pRenderInfo->Apply(m_pClient->m_Skins.Find(aSkinName)); - pRenderInfo->ApplyColors(pGhost->m_Skin.m_UseCustomColor, pGhost->m_Skin.m_ColorBody, pGhost->m_Skin.m_ColorFeet); - pRenderInfo->m_Size = 64; -} - -void CGhost::StartRecord(int Tick) -{ - m_Recording = true; - m_CurGhost.Reset(); - m_CurGhost.m_StartTick = Tick; - - const CGameClient::CClientData *pData = &m_pClient->m_aClients[m_pClient->m_Snap.m_LocalClientId]; - str_copy(m_CurGhost.m_aPlayer, Client()->PlayerName()); - GetGhostSkin(&m_CurGhost.m_Skin, pData->m_aSkinName, pData->m_UseCustomColor, pData->m_ColorBody, pData->m_ColorFeet); - InitRenderInfos(&m_CurGhost); -} - -void CGhost::StopRecord(int Time) -{ - m_Recording = false; - bool RecordingToFile = GhostRecorder()->IsRecording(); - - CMenus::CGhostItem *pOwnGhost = m_pClient->m_Menus.GetOwnGhost(); - const bool StoreGhost = Time > 0 && (!pOwnGhost || Time < pOwnGhost->m_Time || !g_Config.m_ClRaceGhostSaveBest); - - if(RecordingToFile) - GhostRecorder()->Stop(m_CurGhost.m_Path.Size(), StoreGhost ? Time : -1); - - if(StoreGhost) - { - // add to active ghosts - int Slot = GetSlot(); - if(Slot != -1 && (!pOwnGhost || Time < pOwnGhost->m_Time)) - m_aActiveGhosts[Slot] = std::move(m_CurGhost); - - if(pOwnGhost && pOwnGhost->Active() && Time < pOwnGhost->m_Time) - Unload(pOwnGhost->m_Slot); - - // create ghost item - CMenus::CGhostItem Item; - if(RecordingToFile) - GetPath(Item.m_aFilename, sizeof(Item.m_aFilename), m_CurGhost.m_aPlayer, Time); - str_copy(Item.m_aPlayer, m_CurGhost.m_aPlayer); - Item.m_Time = Time; - Item.m_Slot = Slot; - - // save new ghost file - if(Item.HasFile()) - Storage()->RenameFile(m_aTmpFilename, Item.m_aFilename, IStorage::TYPE_SAVE); - - // add item to menu list - m_pClient->m_Menus.UpdateOwnGhost(Item); - } - - m_aTmpFilename[0] = '\0'; - m_CurGhost.Reset(); -} - -void CGhost::StartRender(int Tick) -{ - m_Rendering = true; - m_StartRenderTick = Tick; - for(auto &Ghost : m_aActiveGhosts) - Ghost.m_PlaybackPos = 0; -} - -void CGhost::StopRender() -{ - m_Rendering = false; - m_NewRenderTick = -1; -} - -int CGhost::Load(const char *pFilename) -{ - int Slot = GetSlot(); - if(Slot == -1) - return -1; - - if(!GhostLoader()->Load(pFilename, Client()->GetCurrentMap(), Client()->GetCurrentMapSha256(), Client()->GetCurrentMapCrc())) - return -1; - - const CGhostInfo *pInfo = GhostLoader()->GetInfo(); - - // select ghost - CGhostItem *pGhost = &m_aActiveGhosts[Slot]; - pGhost->Reset(); - pGhost->m_Path.SetSize(pInfo->m_NumTicks); - - str_copy(pGhost->m_aPlayer, pInfo->m_aOwner); - - int Index = 0; - bool FoundSkin = false; - bool NoTick = false; - bool Error = false; - - int Type; - while(!Error && GhostLoader()->ReadNextType(&Type)) - { - if(Index == pInfo->m_NumTicks && (Type == GHOSTDATA_TYPE_CHARACTER || Type == GHOSTDATA_TYPE_CHARACTER_NO_TICK)) - { - Error = true; - break; - } - - if(Type == GHOSTDATA_TYPE_SKIN && !FoundSkin) - { - FoundSkin = true; - if(!GhostLoader()->ReadData(Type, &pGhost->m_Skin, sizeof(CGhostSkin))) - Error = true; - } - else if(Type == GHOSTDATA_TYPE_CHARACTER_NO_TICK) - { - NoTick = true; - if(!GhostLoader()->ReadData(Type, pGhost->m_Path.Get(Index++), sizeof(CGhostCharacter_NoTick))) - Error = true; - } - else if(Type == GHOSTDATA_TYPE_CHARACTER) - { - if(!GhostLoader()->ReadData(Type, pGhost->m_Path.Get(Index++), sizeof(CGhostCharacter))) - Error = true; - } - else if(Type == GHOSTDATA_TYPE_START_TICK) - { - if(!GhostLoader()->ReadData(Type, &pGhost->m_StartTick, sizeof(int))) - Error = true; - } - } - - GhostLoader()->Close(); - - if(Error || Index != pInfo->m_NumTicks) - { - log_error_color(LOG_COLOR_GHOST, "ghost", "Failed to read all ghost data (error='%d', got '%d' ticks, wanted '%d' ticks)", Error, Index, pInfo->m_NumTicks); - pGhost->Reset(); - return -1; - } - - if(NoTick) - { - int StartTick = 0; - for(int i = 1; i < pInfo->m_NumTicks; i++) // estimate start tick - if(pGhost->m_Path.Get(i)->m_AttackTick != pGhost->m_Path.Get(i - 1)->m_AttackTick) - StartTick = pGhost->m_Path.Get(i)->m_AttackTick - i; - for(int i = 0; i < pInfo->m_NumTicks; i++) - pGhost->m_Path.Get(i)->m_Tick = StartTick + i; - } - - if(pGhost->m_StartTick == -1) - pGhost->m_StartTick = pGhost->m_Path.Get(0)->m_Tick; - - if(!FoundSkin) - GetGhostSkin(&pGhost->m_Skin, "default", 0, 0, 0); - InitRenderInfos(pGhost); - - return Slot; -} - -void CGhost::Unload(int Slot) -{ - m_aActiveGhosts[Slot].Reset(); -} - -void CGhost::UnloadAll() -{ - for(int i = 0; i < MAX_ACTIVE_GHOSTS; i++) - Unload(i); -} - -void CGhost::SaveGhost(CMenus::CGhostItem *pItem) -{ - int Slot = pItem->m_Slot; - if(!pItem->Active() || pItem->HasFile() || m_aActiveGhosts[Slot].Empty() || GhostRecorder()->IsRecording()) - return; - - CGhostItem *pGhost = &m_aActiveGhosts[Slot]; - - int NumTicks = pGhost->m_Path.Size(); - GetPath(pItem->m_aFilename, sizeof(pItem->m_aFilename), pItem->m_aPlayer, pItem->m_Time); - GhostRecorder()->Start(pItem->m_aFilename, Client()->GetCurrentMap(), Client()->GetCurrentMapSha256(), pItem->m_aPlayer); - - GhostRecorder()->WriteData(GHOSTDATA_TYPE_START_TICK, &pGhost->m_StartTick, sizeof(int)); - GhostRecorder()->WriteData(GHOSTDATA_TYPE_SKIN, &pGhost->m_Skin, sizeof(CGhostSkin)); - for(int i = 0; i < NumTicks; i++) - GhostRecorder()->WriteData(GHOSTDATA_TYPE_CHARACTER, pGhost->m_Path.Get(i), sizeof(CGhostCharacter)); - - GhostRecorder()->Stop(NumTicks, pItem->m_Time); -} - -void CGhost::ConGPlay(IConsole::IResult *pResult, void *pUserData) -{ - CGhost *pGhost = (CGhost *)pUserData; - pGhost->StartRender(pGhost->Client()->PredGameTick(g_Config.m_ClDummy)); -} - -void CGhost::OnConsoleInit() -{ - m_pGhostLoader = Kernel()->RequestInterface(); - m_pGhostRecorder = Kernel()->RequestInterface(); - - Console()->Register("gplay", "", CFGFLAG_CLIENT, ConGPlay, this, "Start playback of ghosts"); -} - -void CGhost::OnMessage(int MsgType, void *pRawMsg) -{ - // check for messages from server - if(MsgType == NETMSGTYPE_SV_KILLMSG) - { - CNetMsg_Sv_KillMsg *pMsg = (CNetMsg_Sv_KillMsg *)pRawMsg; - if(pMsg->m_Victim == m_pClient->m_Snap.m_LocalClientId) - { - if(m_Recording) - StopRecord(); - StopRender(); - m_LastDeathTick = Client()->GameTick(g_Config.m_ClDummy); - } - } - else if(MsgType == NETMSGTYPE_SV_KILLMSGTEAM) - { - CNetMsg_Sv_KillMsgTeam *pMsg = (CNetMsg_Sv_KillMsgTeam *)pRawMsg; - for(int i = 0; i < MAX_CLIENTS; i++) - { - if(m_pClient->m_Teams.Team(i) == pMsg->m_Team && i == m_pClient->m_Snap.m_LocalClientId) - { - if(m_Recording) - StopRecord(); - StopRender(); - m_LastDeathTick = Client()->GameTick(g_Config.m_ClDummy); - } - } - } - else if(MsgType == NETMSGTYPE_SV_CHAT) - { - CNetMsg_Sv_Chat *pMsg = (CNetMsg_Sv_Chat *)pRawMsg; - if(pMsg->m_ClientId == -1 && m_Recording) - { - char aName[MAX_NAME_LENGTH]; - int Time = CRaceHelper::TimeFromFinishMessage(pMsg->m_pMessage, aName, sizeof(aName)); - if(Time > 0 && m_pClient->m_Snap.m_LocalClientId >= 0 && str_comp(aName, m_pClient->m_aClients[m_pClient->m_Snap.m_LocalClientId].m_aName) == 0) - { - StopRecord(Time); - StopRender(); - } - } - } -} - -void CGhost::OnReset() -{ - StopRecord(); - StopRender(); - m_LastDeathTick = -1; -} - -void CGhost::OnShutdown() -{ - OnReset(); -} - -void CGhost::OnMapLoad() -{ - OnReset(); - UnloadAll(); - m_pClient->m_Menus.GhostlistPopulate(); - m_AllowRestart = false; -} - -void CGhost::OnRefreshSkins() -{ - const auto &&RefindSkin = [&](auto &Ghost) { - if(Ghost.Empty()) - return; - char aSkinName[MAX_SKIN_LENGTH]; - IntsToStr(&Ghost.m_Skin.m_Skin0, 6, aSkinName, std::size(aSkinName)); - Ghost.m_RenderInfo.Apply(m_pClient->m_Skins.Find(aSkinName)); - }; - - for(auto &Ghost : m_aActiveGhosts) - { - RefindSkin(Ghost); - } - RefindSkin(m_CurGhost); -} diff --git a/src/game/client/components/ghost.h b/src/game/client/components/ghost.h deleted file mode 100644 index 7fd6ed354e..0000000000 --- a/src/game/client/components/ghost.h +++ /dev/null @@ -1,176 +0,0 @@ -/* (c) Rajh, Redix and Sushi. */ - -#ifndef GAME_CLIENT_COMPONENTS_GHOST_H -#define GAME_CLIENT_COMPONENTS_GHOST_H - -#include -#include -#include - -#include - -struct CNetObj_Character; - -enum -{ - GHOSTDATA_TYPE_SKIN = 0, - GHOSTDATA_TYPE_CHARACTER_NO_TICK, - GHOSTDATA_TYPE_CHARACTER, - GHOSTDATA_TYPE_START_TICK -}; - -struct CGhostSkin -{ - int m_Skin0; - int m_Skin1; - int m_Skin2; - int m_Skin3; - int m_Skin4; - int m_Skin5; - int m_UseCustomColor; - int m_ColorBody; - int m_ColorFeet; -}; - -struct CGhostCharacter_NoTick -{ - int m_X; - int m_Y; - int m_VelX; - int m_VelY; - int m_Angle; - int m_Direction; - int m_Weapon; - int m_HookState; - int m_HookX; - int m_HookY; - int m_AttackTick; -}; - -struct CGhostCharacter : public CGhostCharacter_NoTick -{ - int m_Tick; -}; - -class CGhost : public CComponent -{ -private: - enum - { - MAX_ACTIVE_GHOSTS = 256, - }; - - class CGhostPath - { - int m_ChunkSize; - int m_NumItems; - - std::vector m_vpChunks; - - public: - CGhostPath() { Reset(); } - ~CGhostPath() { Reset(); } - CGhostPath(const CGhostPath &Other) = delete; - CGhostPath &operator=(const CGhostPath &Other) = delete; - - CGhostPath(CGhostPath &&Other) noexcept; - CGhostPath &operator=(CGhostPath &&Other) noexcept; - - void Reset(int ChunkSize = 25 * 60); // one minute with default snap rate - void SetSize(int Items); - int Size() const { return m_NumItems; } - - void Add(const CGhostCharacter &Char); - CGhostCharacter *Get(int Index); - }; - - class CGhostItem - { - public: - CTeeRenderInfo m_RenderInfo; - CGhostSkin m_Skin; - CGhostPath m_Path; - int m_StartTick; - char m_aPlayer[MAX_NAME_LENGTH]; - int m_PlaybackPos; - - CGhostItem() { Reset(); } - - bool Empty() const { return m_Path.Size() == 0; } - void Reset() - { - m_Path.Reset(); - m_StartTick = -1; - m_PlaybackPos = -1; - } - }; - - static const char *ms_pGhostDir; - - class IGhostLoader *m_pGhostLoader; - class IGhostRecorder *m_pGhostRecorder; - - CGhostItem m_aActiveGhosts[MAX_ACTIVE_GHOSTS]; - CGhostItem m_CurGhost; - - char m_aTmpFilename[IO_MAX_PATH_LENGTH]; - - int m_NewRenderTick = -1; - int m_StartRenderTick = -1; - int m_LastDeathTick = -1; - bool m_Recording = false; - bool m_Rendering = false; - bool m_RenderingStartedByServer = false; - - static void GetGhostSkin(CGhostSkin *pSkin, const char *pSkinName, int UseCustomColor, int ColorBody, int ColorFeet); - static void GetGhostCharacter(CGhostCharacter *pGhostChar, const CNetObj_Character *pChar, const CNetObj_DDNetCharacter *pDDnetChar); - static void GetNetObjCharacter(CNetObj_Character *pChar, const CGhostCharacter *pGhostChar); - - void GetPath(char *pBuf, int Size, const char *pPlayerName, int Time = -1) const; - - void AddInfos(const CNetObj_Character *pChar, const CNetObj_DDNetCharacter *pDDnetChar); - int GetSlot() const; - - void CheckStart(); - void CheckStartLocal(bool Predicted); - void TryRenderStart(int Tick, bool ServerControl); - - void StartRecord(int Tick); - void StopRecord(int Time = -1); - void StartRender(int Tick); - void StopRender(); - - void InitRenderInfos(CGhostItem *pGhost); - - static void ConGPlay(IConsole::IResult *pResult, void *pUserData); - -public: - bool m_AllowRestart; - - virtual int Sizeof() const override { return sizeof(*this); } - - virtual void OnRender() override; - virtual void OnConsoleInit() override; - virtual void OnReset() override; - virtual void OnRefreshSkins() override; - virtual void OnMessage(int MsgType, void *pRawMsg) override; - virtual void OnMapLoad() override; - virtual void OnShutdown() override; - virtual void OnNewSnapshot() override; - - void OnNewPredictedSnapshot(); - - int FreeSlots() const; - int Load(const char *pFilename); - void Unload(int Slot); - void UnloadAll(); - - void SaveGhost(CMenus::CGhostItem *pItem); - - const char *GetGhostDir() const { return ms_pGhostDir; } - - class IGhostLoader *GhostLoader() const { return m_pGhostLoader; } - class IGhostRecorder *GhostRecorder() const { return m_pGhostRecorder; } -}; - -#endif diff --git a/src/game/client/components/hud.cpp b/src/game/client/components/hud.cpp deleted file mode 100644 index 411722b312..0000000000 --- a/src/game/client/components/hud.cpp +++ /dev/null @@ -1,1790 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include - -#include "binds.h" -#include "camera.h" -#include "controls.h" -#include "hud.h" -#include "voting.h" - -CHud::CHud() -{ - // won't work if zero - m_FrameTimeAvg = 0.0f; - m_FPSTextContainerIndex.Reset(); - m_DDRaceEffectsTextContainerIndex.Reset(); - m_PlayerAngleTextContainerIndex.Reset(); - - for(int i = 0; i < 2; i++) - { - m_aPlayerSpeedTextContainers[i].Reset(); - m_aPlayerPositionContainers[i].Reset(); - } -} - -void CHud::ResetHudContainers() -{ - for(auto &ScoreInfo : m_aScoreInfo) - { - TextRender()->DeleteTextContainer(ScoreInfo.m_OptionalNameTextContainerIndex); - TextRender()->DeleteTextContainer(ScoreInfo.m_TextRankContainerIndex); - TextRender()->DeleteTextContainer(ScoreInfo.m_TextScoreContainerIndex); - Graphics()->DeleteQuadContainer(ScoreInfo.m_RoundRectQuadContainerIndex); - - ScoreInfo.Reset(); - } - - TextRender()->DeleteTextContainer(m_FPSTextContainerIndex); - TextRender()->DeleteTextContainer(m_DDRaceEffectsTextContainerIndex); - TextRender()->DeleteTextContainer(m_PlayerAngleTextContainerIndex); - for(int i = 0; i < 2; i++) - { - TextRender()->DeleteTextContainer(m_aPlayerSpeedTextContainers[i]); - TextRender()->DeleteTextContainer(m_aPlayerPositionContainers[i]); - } -} - -void CHud::OnWindowResize() -{ - ResetHudContainers(); -} - -void CHud::OnReset() -{ - m_TimeCpDiff = 0.0f; - m_DDRaceTime = 0; - m_FinishTimeLastReceivedTick = 0; - m_TimeCpLastReceivedTick = 0; - m_ShowFinishTime = false; - m_ServerRecord = -1.0f; - m_aPlayerRecord[0] = -1.0f; - m_aPlayerRecord[1] = -1.0f; - m_aLastPlayerSpeedChange[0] = ESpeedChange::NONE; - m_aLastPlayerSpeedChange[1] = ESpeedChange::NONE; - - ResetHudContainers(); -} - -void CHud::OnInit() -{ - OnReset(); - - Graphics()->SetColor(1.0, 1.0, 1.0, 1.0); - - m_HudQuadContainerIndex = Graphics()->CreateQuadContainer(false); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - PrepareAmmoHealthAndArmorQuads(); - - // all cursors for the different weapons - for(int i = 0; i < NUM_WEAPONS; ++i) - { - float ScaleX, ScaleY; - RenderTools()->GetSpriteScale(g_pData->m_Weapons.m_aId[i].m_pSpriteCursor, ScaleX, ScaleY); - m_aCursorOffset[i] = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 64.f * ScaleX, 64.f * ScaleY); - } - - // the flags - m_FlagOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 8.f, 16.f); - - PreparePlayerStateQuads(); - - Graphics()->QuadContainerUpload(m_HudQuadContainerIndex); -} - -void CHud::RenderGameTimer() -{ - float Half = m_Width / 2.0f; - - if(!(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_SUDDENDEATH)) - { - char aBuf[32]; - int Time = 0; - if(m_pClient->m_Snap.m_pGameInfoObj->m_TimeLimit && (m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer <= 0)) - { - Time = m_pClient->m_Snap.m_pGameInfoObj->m_TimeLimit * 60 - ((Client()->GameTick(g_Config.m_ClDummy) - m_pClient->m_Snap.m_pGameInfoObj->m_RoundStartTick) / Client()->GameTickSpeed()); - - if(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_GAMEOVER) - Time = 0; - } - else if(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_RACETIME) - { - // The Warmup timer is negative in this case to make sure that incompatible clients will not see a warmup timer - Time = (Client()->GameTick(g_Config.m_ClDummy) + m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer) / Client()->GameTickSpeed(); - } - else - Time = (Client()->GameTick(g_Config.m_ClDummy) - m_pClient->m_Snap.m_pGameInfoObj->m_RoundStartTick) / Client()->GameTickSpeed(); - - str_time((int64_t)Time * 100, TIME_DAYS, aBuf, sizeof(aBuf)); - float FontSize = 10.0f; - static float s_TextWidthM = TextRender()->TextWidth(FontSize, "00:00", -1, -1.0f); - static float s_TextWidthH = TextRender()->TextWidth(FontSize, "00:00:00", -1, -1.0f); - static float s_TextWidth0D = TextRender()->TextWidth(FontSize, "0d 00:00:00", -1, -1.0f); - static float s_TextWidth00D = TextRender()->TextWidth(FontSize, "00d 00:00:00", -1, -1.0f); - static float s_TextWidth000D = TextRender()->TextWidth(FontSize, "000d 00:00:00", -1, -1.0f); - float w = Time >= 3600 * 24 * 100 ? s_TextWidth000D : Time >= 3600 * 24 * 10 ? s_TextWidth00D : Time >= 3600 * 24 ? s_TextWidth0D : Time >= 3600 ? s_TextWidthH : s_TextWidthM; - // last 60 sec red, last 10 sec blink - if(m_pClient->m_Snap.m_pGameInfoObj->m_TimeLimit && Time <= 60 && (m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer <= 0)) - { - float Alpha = Time <= 10 && (2 * time() / time_freq()) % 2 ? 0.5f : 1.0f; - TextRender()->TextColor(1.0f, 0.25f, 0.25f, Alpha); - } - TextRender()->Text(Half - w / 2, 2, FontSize, aBuf, -1.0f); - TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); - } -} - -void CHud::RenderPauseNotification() -{ - if(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_PAUSED && - !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_GAMEOVER)) - { - const char *pText = Localize("Game paused"); - float FontSize = 20.0f; - float w = TextRender()->TextWidth(FontSize, pText, -1, -1.0f); - TextRender()->Text(150.0f * Graphics()->ScreenAspect() + -w / 2.0f, 50.0f, FontSize, pText, -1.0f); - } -} - -void CHud::RenderSuddenDeath() -{ - if(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_SUDDENDEATH) - { - float Half = m_Width / 2.0f; - const char *pText = Localize("Sudden Death"); - float FontSize = 12.0f; - float w = TextRender()->TextWidth(FontSize, pText, -1, -1.0f); - TextRender()->Text(Half - w / 2, 2, FontSize, pText, -1.0f); - } -} - -void CHud::RenderScoreHud() -{ - // render small score hud - if(!(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_GAMEOVER)) - { - int GameFlags = m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags; - float StartY = 229.0f; // the height of this display is 56, so EndY is 285 - - const float ScoreSingleBoxHeight = 18.0f; - - bool ForceScoreInfoInit = !m_aScoreInfo[0].m_Initialized || !m_aScoreInfo[1].m_Initialized; - m_aScoreInfo[0].m_Initialized = m_aScoreInfo[1].m_Initialized = true; - - if(GameFlags & GAMEFLAG_TEAMS && m_pClient->m_Snap.m_pGameDataObj) - { - char aScoreTeam[2][16]; - str_format(aScoreTeam[TEAM_RED], sizeof(aScoreTeam[TEAM_RED]), "%d", m_pClient->m_Snap.m_pGameDataObj->m_TeamscoreRed); - str_format(aScoreTeam[TEAM_BLUE], sizeof(aScoreTeam[TEAM_BLUE]), "%d", m_pClient->m_Snap.m_pGameDataObj->m_TeamscoreBlue); - - bool aRecreateTeamScore[2] = {str_comp(aScoreTeam[0], m_aScoreInfo[0].m_aScoreText) != 0, str_comp(aScoreTeam[1], m_aScoreInfo[1].m_aScoreText) != 0}; - - const int aFlagCarrier[2] = { - m_pClient->m_Snap.m_pGameDataObj->m_FlagCarrierRed, - m_pClient->m_Snap.m_pGameDataObj->m_FlagCarrierBlue}; - - bool RecreateRect = ForceScoreInfoInit; - for(int t = 0; t < 2; t++) - { - if(aRecreateTeamScore[t]) - { - m_aScoreInfo[t].m_ScoreTextWidth = TextRender()->TextWidth(14.0f, aScoreTeam[t == 0 ? TEAM_RED : TEAM_BLUE], -1, -1.0f); - str_copy(m_aScoreInfo[t].m_aScoreText, aScoreTeam[t == 0 ? TEAM_RED : TEAM_BLUE]); - RecreateRect = true; - } - } - - static float s_TextWidth100 = TextRender()->TextWidth(14.0f, "100", -1, -1.0f); - float ScoreWidthMax = maximum(maximum(m_aScoreInfo[0].m_ScoreTextWidth, m_aScoreInfo[1].m_ScoreTextWidth), s_TextWidth100); - float Split = 3.0f; - float ImageSize = (GameFlags & GAMEFLAG_FLAGS) ? 16.0f : Split; - for(int t = 0; t < 2; t++) - { - // draw box - if(RecreateRect) - { - Graphics()->DeleteQuadContainer(m_aScoreInfo[t].m_RoundRectQuadContainerIndex); - - if(t == 0) - Graphics()->SetColor(0.975f, 0.17f, 0.17f, 0.3f); - else - Graphics()->SetColor(0.17f, 0.46f, 0.975f, 0.3f); - m_aScoreInfo[t].m_RoundRectQuadContainerIndex = Graphics()->CreateRectQuadContainer(m_Width - ScoreWidthMax - ImageSize - 2 * Split, StartY + t * 20, ScoreWidthMax + ImageSize + 2 * Split, ScoreSingleBoxHeight, 5.0f, IGraphics::CORNER_L); - } - Graphics()->TextureClear(); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - if(m_aScoreInfo[t].m_RoundRectQuadContainerIndex != -1) - Graphics()->RenderQuadContainer(m_aScoreInfo[t].m_RoundRectQuadContainerIndex, -1); - - // draw score - if(aRecreateTeamScore[t]) - { - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, m_Width - ScoreWidthMax + (ScoreWidthMax - m_aScoreInfo[t].m_ScoreTextWidth) / 2 - Split, StartY + t * 20 + (18.f - 14.f) / 2.f, 14.0f, TEXTFLAG_RENDER); - Cursor.m_LineWidth = -1; - TextRender()->RecreateTextContainer(m_aScoreInfo[t].m_TextScoreContainerIndex, &Cursor, aScoreTeam[t]); - } - if(m_aScoreInfo[t].m_TextScoreContainerIndex.Valid()) - { - ColorRGBA TColor(1.f, 1.f, 1.f, 1.f); - ColorRGBA TOutlineColor(0.f, 0.f, 0.f, 0.3f); - TextRender()->RenderTextContainer(m_aScoreInfo[t].m_TextScoreContainerIndex, TColor, TOutlineColor); - } - - if(GameFlags & GAMEFLAG_FLAGS) - { - int BlinkTimer = (m_pClient->m_aFlagDropTick[t] != 0 && - (Client()->GameTick(g_Config.m_ClDummy) - m_pClient->m_aFlagDropTick[t]) / Client()->GameTickSpeed() >= 25) ? - 10 : - 20; - if(aFlagCarrier[t] == FLAG_ATSTAND || (aFlagCarrier[t] == FLAG_TAKEN && ((Client()->GameTick(g_Config.m_ClDummy) / BlinkTimer) & 1))) - { - // draw flag - Graphics()->TextureSet(t == 0 ? m_pClient->m_GameSkin.m_SpriteFlagRed : m_pClient->m_GameSkin.m_SpriteFlagBlue); - Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_FlagOffset, m_Width - ScoreWidthMax - ImageSize, StartY + 1.0f + t * 20); - } - else if(aFlagCarrier[t] >= 0) - { - // draw name of the flag holder - int Id = aFlagCarrier[t] % MAX_CLIENTS; - const char *pName = m_pClient->m_aClients[Id].m_aName; - if(str_comp(pName, m_aScoreInfo[t].m_aPlayerNameText) != 0 || RecreateRect) - { - str_copy(m_aScoreInfo[t].m_aPlayerNameText, pName); - - float w = TextRender()->TextWidth(8.0f, pName, -1, -1.0f); - - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, minimum(m_Width - w - 1.0f, m_Width - ScoreWidthMax - ImageSize - 2 * Split), StartY + (t + 1) * 20.0f - 2.0f, 8.0f, TEXTFLAG_RENDER); - Cursor.m_LineWidth = -1; - TextRender()->RecreateTextContainer(m_aScoreInfo[t].m_OptionalNameTextContainerIndex, &Cursor, pName); - } - - if(m_aScoreInfo[t].m_OptionalNameTextContainerIndex.Valid()) - { - ColorRGBA TColor(1.f, 1.f, 1.f, 1.f); - ColorRGBA TOutlineColor(0.f, 0.f, 0.f, 0.3f); - TextRender()->RenderTextContainer(m_aScoreInfo[t].m_OptionalNameTextContainerIndex, TColor, TOutlineColor); - } - - // draw tee of the flag holder - CTeeRenderInfo TeeInfo = m_pClient->m_aClients[Id].m_RenderInfo; - TeeInfo.m_Size = ScoreSingleBoxHeight; - - const CAnimState *pIdleState = CAnimState::GetIdle(); - vec2 OffsetToMid; - CRenderTools::GetRenderTeeOffsetToRenderedTee(pIdleState, &TeeInfo, OffsetToMid); - vec2 TeeRenderPos(m_Width - ScoreWidthMax - TeeInfo.m_Size / 2 - Split, StartY + (t * 20) + ScoreSingleBoxHeight / 2.0f + OffsetToMid.y); - - RenderTools()->RenderTee(pIdleState, &TeeInfo, EMOTE_NORMAL, vec2(1.0f, 0.0f), TeeRenderPos); - } - } - StartY += 8.0f; - } - } - else - { - int Local = -1; - int aPos[2] = {1, 2}; - const CNetObj_PlayerInfo *apPlayerInfo[2] = {0, 0}; - int i = 0; - for(int t = 0; t < 2 && i < MAX_CLIENTS && m_pClient->m_Snap.m_apInfoByScore[i]; ++i) - { - if(m_pClient->m_Snap.m_apInfoByScore[i]->m_Team != TEAM_SPECTATORS) - { - apPlayerInfo[t] = m_pClient->m_Snap.m_apInfoByScore[i]; - if(apPlayerInfo[t]->m_ClientId == m_pClient->m_Snap.m_LocalClientId) - Local = t; - ++t; - } - } - // search local player info if not a spectator, nor within top2 scores - if(Local == -1 && m_pClient->m_Snap.m_pLocalInfo && m_pClient->m_Snap.m_pLocalInfo->m_Team != TEAM_SPECTATORS) - { - for(; i < MAX_CLIENTS && m_pClient->m_Snap.m_apInfoByScore[i]; ++i) - { - if(m_pClient->m_Snap.m_apInfoByScore[i]->m_Team != TEAM_SPECTATORS) - ++aPos[1]; - if(m_pClient->m_Snap.m_apInfoByScore[i]->m_ClientId == m_pClient->m_Snap.m_LocalClientId) - { - apPlayerInfo[1] = m_pClient->m_Snap.m_apInfoByScore[i]; - Local = 1; - break; - } - } - } - char aScore[2][16]; - for(int t = 0; t < 2; ++t) - { - if(apPlayerInfo[t]) - { - if(Client()->IsSixup() && m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & protocol7::GAMEFLAG_RACE) - str_time((int64_t)absolute(apPlayerInfo[t]->m_Score) / 10, TIME_MINS_CENTISECS, aScore[t], sizeof(aScore[t])); - else if(m_pClient->m_GameInfo.m_TimeScore) - { - if(apPlayerInfo[t]->m_Score != -9999) - str_time((int64_t)absolute(apPlayerInfo[t]->m_Score) * 100, TIME_HOURS, aScore[t], sizeof(aScore[t])); - else - aScore[t][0] = 0; - } - else - str_format(aScore[t], sizeof(aScore[t]), "%d", apPlayerInfo[t]->m_Score); - } - else - aScore[t][0] = 0; - } - - bool RecreateScores = str_comp(aScore[0], m_aScoreInfo[0].m_aScoreText) != 0 || str_comp(aScore[1], m_aScoreInfo[1].m_aScoreText) != 0 || m_LastLocalClientId != m_pClient->m_Snap.m_LocalClientId; - m_LastLocalClientId = m_pClient->m_Snap.m_LocalClientId; - - bool RecreateRect = ForceScoreInfoInit; - for(int t = 0; t < 2; t++) - { - if(RecreateScores) - { - m_aScoreInfo[t].m_ScoreTextWidth = TextRender()->TextWidth(14.0f, aScore[t], -1, -1.0f); - str_copy(m_aScoreInfo[t].m_aScoreText, aScore[t]); - RecreateRect = true; - } - - if(apPlayerInfo[t]) - { - int Id = apPlayerInfo[t]->m_ClientId; - if(Id >= 0 && Id < MAX_CLIENTS) - { - const char *pName = m_pClient->m_aClients[Id].m_aName; - if(str_comp(pName, m_aScoreInfo[t].m_aPlayerNameText) != 0) - RecreateRect = true; - } - } - else - { - if(m_aScoreInfo[t].m_aPlayerNameText[0] != 0) - RecreateRect = true; - } - - char aBuf[16]; - str_format(aBuf, sizeof(aBuf), "%d.", aPos[t]); - if(str_comp(aBuf, m_aScoreInfo[t].m_aRankText) != 0) - RecreateRect = true; - } - - static float s_TextWidth10 = TextRender()->TextWidth(14.0f, "10", -1, -1.0f); - float ScoreWidthMax = maximum(maximum(m_aScoreInfo[0].m_ScoreTextWidth, m_aScoreInfo[1].m_ScoreTextWidth), s_TextWidth10); - float Split = 3.0f, ImageSize = 16.0f, PosSize = 16.0f; - - for(int t = 0; t < 2; t++) - { - // draw box - if(RecreateRect) - { - Graphics()->DeleteQuadContainer(m_aScoreInfo[t].m_RoundRectQuadContainerIndex); - - if(t == Local) - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.25f); - else - Graphics()->SetColor(0.0f, 0.0f, 0.0f, 0.25f); - m_aScoreInfo[t].m_RoundRectQuadContainerIndex = Graphics()->CreateRectQuadContainer(m_Width - ScoreWidthMax - ImageSize - 2 * Split - PosSize, StartY + t * 20, ScoreWidthMax + ImageSize + 2 * Split + PosSize, ScoreSingleBoxHeight, 5.0f, IGraphics::CORNER_L); - } - Graphics()->TextureClear(); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - if(m_aScoreInfo[t].m_RoundRectQuadContainerIndex != -1) - Graphics()->RenderQuadContainer(m_aScoreInfo[t].m_RoundRectQuadContainerIndex, -1); - - if(RecreateScores) - { - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, m_Width - ScoreWidthMax + (ScoreWidthMax - m_aScoreInfo[t].m_ScoreTextWidth) - Split, StartY + t * 20 + (18.f - 14.f) / 2.f, 14.0f, TEXTFLAG_RENDER); - Cursor.m_LineWidth = -1; - TextRender()->RecreateTextContainer(m_aScoreInfo[t].m_TextScoreContainerIndex, &Cursor, aScore[t]); - } - // draw score - if(m_aScoreInfo[t].m_TextScoreContainerIndex.Valid()) - { - ColorRGBA TColor(1.f, 1.f, 1.f, 1.f); - ColorRGBA TOutlineColor(0.f, 0.f, 0.f, 0.3f); - TextRender()->RenderTextContainer(m_aScoreInfo[t].m_TextScoreContainerIndex, TColor, TOutlineColor); - } - - if(apPlayerInfo[t]) - { - // draw name - int Id = apPlayerInfo[t]->m_ClientId; - if(Id >= 0 && Id < MAX_CLIENTS) - { - const char *pName = m_pClient->m_aClients[Id].m_aName; - if(RecreateRect) - { - str_copy(m_aScoreInfo[t].m_aPlayerNameText, pName); - - CTextCursor Cursor; - float w = TextRender()->TextWidth(8.0f, pName, -1, -1.0f); - TextRender()->SetCursor(&Cursor, minimum(m_Width - w - 1.0f, m_Width - ScoreWidthMax - ImageSize - 2 * Split - PosSize), StartY + (t + 1) * 20.0f - 2.0f, 8.0f, TEXTFLAG_RENDER); - Cursor.m_LineWidth = -1; - TextRender()->RecreateTextContainer(m_aScoreInfo[t].m_OptionalNameTextContainerIndex, &Cursor, pName); - } - - if(m_aScoreInfo[t].m_OptionalNameTextContainerIndex.Valid()) - { - ColorRGBA TColor(1.f, 1.f, 1.f, 1.f); - ColorRGBA TOutlineColor(0.f, 0.f, 0.f, 0.3f); - TextRender()->RenderTextContainer(m_aScoreInfo[t].m_OptionalNameTextContainerIndex, TColor, TOutlineColor); - } - - // draw tee - CTeeRenderInfo TeeInfo = m_pClient->m_aClients[Id].m_RenderInfo; - TeeInfo.m_Size = ScoreSingleBoxHeight; - - const CAnimState *pIdleState = CAnimState::GetIdle(); - vec2 OffsetToMid; - CRenderTools::GetRenderTeeOffsetToRenderedTee(pIdleState, &TeeInfo, OffsetToMid); - vec2 TeeRenderPos(m_Width - ScoreWidthMax - TeeInfo.m_Size / 2 - Split, StartY + (t * 20) + ScoreSingleBoxHeight / 2.0f + OffsetToMid.y); - - RenderTools()->RenderTee(pIdleState, &TeeInfo, EMOTE_NORMAL, vec2(1.0f, 0.0f), TeeRenderPos); - } - } - else - { - m_aScoreInfo[t].m_aPlayerNameText[0] = 0; - } - - // draw position - char aBuf[16]; - str_format(aBuf, sizeof(aBuf), "%d.", aPos[t]); - if(RecreateRect) - { - str_copy(m_aScoreInfo[t].m_aRankText, aBuf); - - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, m_Width - ScoreWidthMax - ImageSize - Split - PosSize, StartY + t * 20 + (18.f - 10.f) / 2.f, 10.0f, TEXTFLAG_RENDER); - Cursor.m_LineWidth = -1; - TextRender()->RecreateTextContainer(m_aScoreInfo[t].m_TextRankContainerIndex, &Cursor, aBuf); - } - if(m_aScoreInfo[t].m_TextRankContainerIndex.Valid()) - { - ColorRGBA TColor(1.f, 1.f, 1.f, 1.f); - ColorRGBA TOutlineColor(0.f, 0.f, 0.f, 0.3f); - TextRender()->RenderTextContainer(m_aScoreInfo[t].m_TextRankContainerIndex, TColor, TOutlineColor); - } - - StartY += 8.0f; - } - } - } -} - -void CHud::RenderWarmupTimer() -{ - // render warmup timer - if(m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer > 0 && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_RACETIME)) - { - char aBuf[256]; - float FontSize = 20.0f; - float w = TextRender()->TextWidth(FontSize, Localize("Warmup"), -1, -1.0f); - TextRender()->Text(150 * Graphics()->ScreenAspect() + -w / 2, 50, FontSize, Localize("Warmup"), -1.0f); - - int Seconds = m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer / Client()->GameTickSpeed(); - if(Seconds < 5) - str_format(aBuf, sizeof(aBuf), "%d.%d", Seconds, (m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer * 10 / Client()->GameTickSpeed()) % 10); - else - str_format(aBuf, sizeof(aBuf), "%d", Seconds); - w = TextRender()->TextWidth(FontSize, aBuf, -1, -1.0f); - TextRender()->Text(150 * Graphics()->ScreenAspect() + -w / 2, 75, FontSize, aBuf, -1.0f); - } -} - -void CHud::RenderTextInfo() -{ - int Showfps = g_Config.m_ClShowfps; -#if defined(CONF_VIDEORECORDER) - if(IVideo::Current()) - Showfps = 0; -#endif - if(Showfps) - { - // calculate avg. fps - m_FrameTimeAvg = m_FrameTimeAvg * 0.9f + Client()->RenderFrameTime() * 0.1f; - char aBuf[64]; - int FrameTime = (int)(1.0f / m_FrameTimeAvg + 0.5f); - str_format(aBuf, sizeof(aBuf), "%d", FrameTime); - - static float s_TextWidth0 = TextRender()->TextWidth(12.f, "0", -1, -1.0f); - static float s_TextWidth00 = TextRender()->TextWidth(12.f, "00", -1, -1.0f); - static float s_TextWidth000 = TextRender()->TextWidth(12.f, "000", -1, -1.0f); - static float s_TextWidth0000 = TextRender()->TextWidth(12.f, "0000", -1, -1.0f); - static float s_TextWidth00000 = TextRender()->TextWidth(12.f, "00000", -1, -1.0f); - static const float s_aTextWidth[5] = {s_TextWidth0, s_TextWidth00, s_TextWidth000, s_TextWidth0000, s_TextWidth00000}; - - int DigitIndex = GetDigitsIndex(FrameTime, 4); - - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, m_Width - 10 - s_aTextWidth[DigitIndex], 5, 12, TEXTFLAG_RENDER); - Cursor.m_LineWidth = -1; - auto OldFlags = TextRender()->GetRenderFlags(); - TextRender()->SetRenderFlags(OldFlags | TEXT_RENDER_FLAG_ONE_TIME_USE); - if(m_FPSTextContainerIndex.Valid()) - TextRender()->RecreateTextContainerSoft(m_FPSTextContainerIndex, &Cursor, aBuf); - else - TextRender()->CreateTextContainer(m_FPSTextContainerIndex, &Cursor, "0"); - TextRender()->SetRenderFlags(OldFlags); - if(m_FPSTextContainerIndex.Valid()) - { - TextRender()->RenderTextContainer(m_FPSTextContainerIndex, TextRender()->DefaultTextColor(), TextRender()->DefaultTextOutlineColor()); - } - } - if(g_Config.m_ClShowpred && Client()->State() != IClient::STATE_DEMOPLAYBACK) - { - char aBuf[64]; - str_format(aBuf, sizeof(aBuf), "%d", Client()->GetPredictionTime()); - TextRender()->Text(m_Width - 10 - TextRender()->TextWidth(12, aBuf, -1, -1.0f), Showfps ? 20 : 5, 12, aBuf, -1.0f); - } -} - -void CHud::RenderConnectionWarning() -{ - if(Client()->ConnectionProblems()) - { - const char *pText = Localize("Connection Problems…"); - float w = TextRender()->TextWidth(24, pText, -1, -1.0f); - TextRender()->Text(150 * Graphics()->ScreenAspect() - w / 2, 50, 24, pText, -1.0f); - } -} - -void CHud::RenderTeambalanceWarning() -{ - // render prompt about team-balance - bool Flash = time() / (time_freq() / 2) % 2 == 0; - if(m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS) - { - int TeamDiff = m_pClient->m_Snap.m_aTeamSize[TEAM_RED] - m_pClient->m_Snap.m_aTeamSize[TEAM_BLUE]; - if(g_Config.m_ClWarningTeambalance && (TeamDiff >= 2 || TeamDiff <= -2)) - { - const char *pText = Localize("Please balance teams!"); - if(Flash) - TextRender()->TextColor(1, 1, 0.5f, 1); - else - TextRender()->TextColor(0.7f, 0.7f, 0.2f, 1.0f); - TextRender()->Text(5, 50, 6, pText, -1.0f); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - } - } -} - -void CHud::RenderCursor() -{ - if(Client()->State() != IClient::STATE_DEMOPLAYBACK && m_pClient->m_Snap.m_pLocalCharacter) - { - // render local cursor - int CurWeapon = maximum(0, m_pClient->m_Snap.m_pLocalCharacter->m_Weapon % NUM_WEAPONS); - vec2 TargetPos = m_pClient->m_Controls.m_aTargetPos[g_Config.m_ClDummy]; - - RenderTools()->MapScreenToInterface(m_pClient->m_Camera.m_Center.x, m_pClient->m_Camera.m_Center.y); - Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); - Graphics()->TextureSet(m_pClient->m_GameSkin.m_aSpriteWeaponCursors[CurWeapon]); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_aCursorOffset[CurWeapon], TargetPos.x, TargetPos.y); - return; - } - - if(!g_Config.m_ClSpecCursor || !m_pClient->m_CursorInfo.IsAvailable()) - return; - - bool RenderSpecCursor = (m_pClient->m_Snap.m_SpecInfo.m_Active && m_pClient->m_Snap.m_SpecInfo.m_SpectatorId != SPEC_FREEVIEW) || Client()->State() == IClient::STATE_DEMOPLAYBACK; - - if(!RenderSpecCursor) - return; - - int CurWeapon = maximum(0, m_pClient->m_CursorInfo.Weapon() % NUM_WEAPONS); - vec2 TargetPos = m_pClient->m_CursorInfo.WorldTarget(); - - float CenterX = m_pClient->m_Camera.m_Center.x; - float CenterY = m_pClient->m_Camera.m_Center.y; - float Zoom = m_pClient->m_Camera.m_Zoom; - - float aPoints[4]; - RenderTools()->MapScreenToWorld(CenterX, CenterY, 100.0f, 100.0f, 100.0f, 0, 0, Graphics()->ScreenAspect(), Zoom, aPoints); - Graphics()->MapScreen(aPoints[0], aPoints[1], aPoints[2], aPoints[3]); - - vec2 ScreenPos = TargetPos - m_pClient->m_Camera.m_Center; - - bool Clamped = false; - float HalfWidth = CenterX - aPoints[0]; - float HalfHeight = CenterY - aPoints[1]; - - // specialized lineseg-rect intersection - // https://gist.github.com/ChickenProp/3194723 - if(ScreenPos.x < -HalfWidth || ScreenPos.x > HalfWidth || ScreenPos.y < -HalfHeight || ScreenPos.y > HalfHeight) - { - float aDeltas[] = {ScreenPos.x, ScreenPos.y}; - float aBounds[] = {HalfWidth, HalfHeight}; - float ClampFactor = INFINITY; - - static_assert(std::size(aDeltas) == std::size(aBounds), "delta and bounds arrays must have the same size"); - for(std::size_t i = 0; i < std::size(aDeltas); i++) - { - float t = absolute(aBounds[i] / aDeltas[i]); - if(ClampFactor > t) - ClampFactor = t; - } - - Clamped = true; - TargetPos = ScreenPos * ClampFactor + m_pClient->m_Camera.m_Center; - } - - // render spec cursor - Graphics()->SetColor(1.f, 1.f, 1.f, Clamped ? .5f : 1.f); - Graphics()->TextureSet(m_pClient->m_GameSkin.m_aSpriteWeaponCursors[CurWeapon]); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_aCursorOffset[CurWeapon], TargetPos.x, TargetPos.y, Zoom, Zoom); -} - -void CHud::PrepareAmmoHealthAndArmorQuads() -{ - float x = 5; - float y = 5; - IGraphics::CQuadItem Array[10]; - - // ammo of the different weapons - for(int i = 0; i < NUM_WEAPONS; ++i) - { - // 0.6 - for(int n = 0; n < 10; n++) - Array[n] = IGraphics::CQuadItem(x + n * 12, y, 10, 10); - - m_aAmmoOffset[i] = Graphics()->QuadContainerAddQuads(m_HudQuadContainerIndex, Array, 10); - - // 0.7 - if(i == WEAPON_GRENADE) - { - // special case for 0.7 grenade - for(int n = 0; n < 10; n++) - Array[n] = IGraphics::CQuadItem(1 + x + n * 12, y, 10, 10); - } - else - { - for(int n = 0; n < 10; n++) - Array[n] = IGraphics::CQuadItem(x + n * 12, y, 12, 12); - } - - Graphics()->QuadContainerAddQuads(m_HudQuadContainerIndex, Array, 10); - } - - // health - for(int i = 0; i < 10; ++i) - Array[i] = IGraphics::CQuadItem(x + i * 12, y, 10, 10); - m_HealthOffset = Graphics()->QuadContainerAddQuads(m_HudQuadContainerIndex, Array, 10); - - // 0.7 - for(int i = 0; i < 10; ++i) - Array[i] = IGraphics::CQuadItem(x + i * 12, y, 12, 12); - Graphics()->QuadContainerAddQuads(m_HudQuadContainerIndex, Array, 10); - - // empty health - for(int i = 0; i < 10; ++i) - Array[i] = IGraphics::CQuadItem(x + i * 12, y, 10, 10); - m_EmptyHealthOffset = Graphics()->QuadContainerAddQuads(m_HudQuadContainerIndex, Array, 10); - - // 0.7 - for(int i = 0; i < 10; ++i) - Array[i] = IGraphics::CQuadItem(x + i * 12, y, 12, 12); - Graphics()->QuadContainerAddQuads(m_HudQuadContainerIndex, Array, 10); - - // armor meter - for(int i = 0; i < 10; ++i) - Array[i] = IGraphics::CQuadItem(x + i * 12, y + 12, 10, 10); - m_ArmorOffset = Graphics()->QuadContainerAddQuads(m_HudQuadContainerIndex, Array, 10); - - // 0.7 - for(int i = 0; i < 10; ++i) - Array[i] = IGraphics::CQuadItem(x + i * 12, y + 12, 12, 12); - Graphics()->QuadContainerAddQuads(m_HudQuadContainerIndex, Array, 10); - - // empty armor meter - for(int i = 0; i < 10; ++i) - Array[i] = IGraphics::CQuadItem(x + i * 12, y + 12, 10, 10); - m_EmptyArmorOffset = Graphics()->QuadContainerAddQuads(m_HudQuadContainerIndex, Array, 10); - - // 0.7 - for(int i = 0; i < 10; ++i) - Array[i] = IGraphics::CQuadItem(x + i * 12, y + 12, 12, 12); - Graphics()->QuadContainerAddQuads(m_HudQuadContainerIndex, Array, 10); -} - -void CHud::RenderAmmoHealthAndArmor(const CNetObj_Character *pCharacter) -{ - if(!pCharacter) - return; - - bool IsSixupGameSkin = m_pClient->m_GameSkin.IsSixup(); - int QuadOffsetSixup = (IsSixupGameSkin ? 10 : 0); - - if(GameClient()->m_GameInfo.m_HudAmmo) - { - // ammo display - float AmmoOffsetY = GameClient()->m_GameInfo.m_HudHealthArmor ? 24 : 0; - int CurWeapon = pCharacter->m_Weapon % NUM_WEAPONS; - if(CurWeapon >= 0 && m_pClient->m_GameSkin.m_aSpriteWeaponProjectiles[CurWeapon].IsValid()) - { - Graphics()->TextureSet(m_pClient->m_GameSkin.m_aSpriteWeaponProjectiles[CurWeapon]); - if(AmmoOffsetY > 0) - { - Graphics()->RenderQuadContainerEx(m_HudQuadContainerIndex, m_aAmmoOffset[CurWeapon] + QuadOffsetSixup, minimum(pCharacter->m_AmmoCount, 10), 0, AmmoOffsetY); - } - else - { - Graphics()->RenderQuadContainer(m_HudQuadContainerIndex, m_aAmmoOffset[CurWeapon] + QuadOffsetSixup, minimum(pCharacter->m_AmmoCount, 10)); - } - } - } - - if(GameClient()->m_GameInfo.m_HudHealthArmor) - { - // health display - Graphics()->TextureSet(m_pClient->m_GameSkin.m_SpriteHealthFull); - Graphics()->RenderQuadContainer(m_HudQuadContainerIndex, m_HealthOffset + QuadOffsetSixup, minimum(pCharacter->m_Health, 10)); - Graphics()->TextureSet(m_pClient->m_GameSkin.m_SpriteHealthEmpty); - Graphics()->RenderQuadContainer(m_HudQuadContainerIndex, m_EmptyHealthOffset + QuadOffsetSixup + minimum(pCharacter->m_Health, 10), 10 - minimum(pCharacter->m_Health, 10)); - - // armor display - Graphics()->TextureSet(m_pClient->m_GameSkin.m_SpriteArmorFull); - Graphics()->RenderQuadContainer(m_HudQuadContainerIndex, m_ArmorOffset + QuadOffsetSixup, minimum(pCharacter->m_Armor, 10)); - Graphics()->TextureSet(m_pClient->m_GameSkin.m_SpriteArmorEmpty); - Graphics()->RenderQuadContainer(m_HudQuadContainerIndex, m_ArmorOffset + QuadOffsetSixup + minimum(pCharacter->m_Armor, 10), 10 - minimum(pCharacter->m_Armor, 10)); - } -} - -void CHud::PreparePlayerStateQuads() -{ - float x = 5; - float y = 5 + 24; - IGraphics::CQuadItem Array[10]; - - // Quads for displaying the available and used jumps - for(int i = 0; i < 10; ++i) - Array[i] = IGraphics::CQuadItem(x + i * 12, y, 12, 12); - m_AirjumpOffset = Graphics()->QuadContainerAddQuads(m_HudQuadContainerIndex, Array, 10); - - for(int i = 0; i < 10; ++i) - Array[i] = IGraphics::CQuadItem(x + i * 12, y, 12, 12); - m_AirjumpEmptyOffset = Graphics()->QuadContainerAddQuads(m_HudQuadContainerIndex, Array, 10); - - // Quads for displaying weapons - for(int Weapon = 0; Weapon < NUM_WEAPONS; ++Weapon) - { - const CDataWeaponspec &WeaponSpec = g_pData->m_Weapons.m_aId[Weapon]; - float ScaleX, ScaleY; - RenderTools()->GetSpriteScale(WeaponSpec.m_pSpriteBody, ScaleX, ScaleY); - constexpr float HudWeaponScale = 0.25f; - float Width = WeaponSpec.m_VisualSize * ScaleX * HudWeaponScale; - float Height = WeaponSpec.m_VisualSize * ScaleY * HudWeaponScale; - m_aWeaponOffset[Weapon] = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, Width, Height); - } - - // Quads for displaying capabilities - m_EndlessJumpOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); - m_EndlessHookOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); - m_JetpackOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); - m_TeleportGrenadeOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); - m_TeleportGunOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); - m_TeleportLaserOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); - - // Quads for displaying prohibited capabilities - m_SoloOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); - m_CollisionDisabledOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); - m_HookHitDisabledOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); - m_HammerHitDisabledOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); - m_GunHitDisabledOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); - m_ShotgunHitDisabledOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); - m_GrenadeHitDisabledOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); - m_LaserHitDisabledOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); - - // Quads for displaying freeze status - m_DeepFrozenOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); - m_LiveFrozenOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); - - // Quads for displaying dummy actions - m_DummyHammerOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); - m_DummyCopyOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); - - // Quads for displaying team modes - m_PracticeModeOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); - m_LockModeOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); - m_Team0ModeOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); -} - -void CHud::RenderPlayerState(const int ClientId) -{ - Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); - - // pCharacter contains the predicted character for local players or the last snap for players who are spectated - CCharacterCore *pCharacter = &m_pClient->m_aClients[ClientId].m_Predicted; - CNetObj_Character *pPlayer = &m_pClient->m_aClients[ClientId].m_RenderCur; - int TotalJumpsToDisplay = 0; - if(g_Config.m_ClShowhudJumpsIndicator) - { - int AvailableJumpsToDisplay; - if(m_pClient->m_Snap.m_aCharacters[ClientId].m_HasExtendedDisplayInfo) - { - bool Grounded = false; - if(Collision()->CheckPoint(pPlayer->m_X + CCharacterCore::PhysicalSize() / 2, - pPlayer->m_Y + CCharacterCore::PhysicalSize() / 2 + 5)) - { - Grounded = true; - } - if(Collision()->CheckPoint(pPlayer->m_X - CCharacterCore::PhysicalSize() / 2, - pPlayer->m_Y + CCharacterCore::PhysicalSize() / 2 + 5)) - { - Grounded = true; - } - - int UsedJumps = pCharacter->m_JumpedTotal; - if(pCharacter->m_Jumps > 1) - { - UsedJumps += !Grounded; - } - else if(pCharacter->m_Jumps == 1) - { - // If the player has only one jump, each jump is the last one - UsedJumps = pPlayer->m_Jumped & 2; - } - else if(pCharacter->m_Jumps == -1) - { - // The player has only one ground jump - UsedJumps = !Grounded; - } - - if(pCharacter->m_EndlessJump && UsedJumps >= absolute(pCharacter->m_Jumps)) - { - UsedJumps = absolute(pCharacter->m_Jumps) - 1; - } - - int UnusedJumps = absolute(pCharacter->m_Jumps) - UsedJumps; - if(!(pPlayer->m_Jumped & 2) && UnusedJumps <= 0) - { - // In some edge cases when the player just got another number of jumps, UnusedJumps is not correct - UnusedJumps = 1; - } - TotalJumpsToDisplay = maximum(minimum(absolute(pCharacter->m_Jumps), 10), 0); - AvailableJumpsToDisplay = maximum(minimum(UnusedJumps, TotalJumpsToDisplay), 0); - } - else - { - TotalJumpsToDisplay = AvailableJumpsToDisplay = absolute(m_pClient->m_Snap.m_aCharacters[ClientId].m_ExtendedData.m_Jumps); - } - - // render available and used jumps - int JumpsOffsetY = ((GameClient()->m_GameInfo.m_HudHealthArmor && g_Config.m_ClShowhudHealthAmmo ? 24 : 0) + - (GameClient()->m_GameInfo.m_HudAmmo && g_Config.m_ClShowhudHealthAmmo ? 12 : 0)); - if(JumpsOffsetY > 0) - { - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudAirjump); - Graphics()->RenderQuadContainerEx(m_HudQuadContainerIndex, m_AirjumpOffset, AvailableJumpsToDisplay, 0, JumpsOffsetY); - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudAirjumpEmpty); - Graphics()->RenderQuadContainerEx(m_HudQuadContainerIndex, m_AirjumpEmptyOffset + AvailableJumpsToDisplay, TotalJumpsToDisplay - AvailableJumpsToDisplay, 0, JumpsOffsetY); - } - else - { - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudAirjump); - Graphics()->RenderQuadContainer(m_HudQuadContainerIndex, m_AirjumpOffset, AvailableJumpsToDisplay); - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudAirjumpEmpty); - Graphics()->RenderQuadContainer(m_HudQuadContainerIndex, m_AirjumpEmptyOffset + AvailableJumpsToDisplay, TotalJumpsToDisplay - AvailableJumpsToDisplay); - } - } - - float x = 5 + 12; - float y = (5 + 12 + (GameClient()->m_GameInfo.m_HudHealthArmor && g_Config.m_ClShowhudHealthAmmo ? 24 : 0) + - (GameClient()->m_GameInfo.m_HudAmmo && g_Config.m_ClShowhudHealthAmmo ? 12 : 0)); - - // render weapons - { - constexpr float aWeaponWidth[NUM_WEAPONS] = {16, 12, 12, 12, 12, 12}; - constexpr float aWeaponInitialOffset[NUM_WEAPONS] = {-3, -4, -1, -1, -2, -4}; - bool InitialOffsetAdded = false; - for(int Weapon = 0; Weapon < NUM_WEAPONS; ++Weapon) - { - if(!pCharacter->m_aWeapons[Weapon].m_Got) - continue; - if(!InitialOffsetAdded) - { - x += aWeaponInitialOffset[Weapon]; - InitialOffsetAdded = true; - } - if(pPlayer->m_Weapon != Weapon) - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.4f); - Graphics()->QuadsSetRotation(pi * 7 / 4); - Graphics()->TextureSet(m_pClient->m_GameSkin.m_aSpritePickupWeapons[Weapon]); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_aWeaponOffset[Weapon], x, y); - Graphics()->QuadsSetRotation(0); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - x += aWeaponWidth[Weapon]; - } - if(pCharacter->m_aWeapons[WEAPON_NINJA].m_Got) - { - const int Max = g_pData->m_Weapons.m_Ninja.m_Duration * Client()->GameTickSpeed() / 1000; - float NinjaProgress = clamp(pCharacter->m_Ninja.m_ActivationTick + g_pData->m_Weapons.m_Ninja.m_Duration * Client()->GameTickSpeed() / 1000 - Client()->GameTick(g_Config.m_ClDummy), 0, Max) / (float)Max; - if(NinjaProgress > 0.0f && m_pClient->m_Snap.m_aCharacters[ClientId].m_HasExtendedDisplayInfo) - { - RenderNinjaBarPos(x, y - 12, 6.f, 24.f, NinjaProgress); - } - } - } - - // render capabilities - x = 5; - y += 12; - if(TotalJumpsToDisplay > 0) - { - y += 12; - } - bool HasCapabilities = false; - if(pCharacter->m_EndlessJump) - { - HasCapabilities = true; - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudEndlessJump); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_EndlessJumpOffset, x, y); - x += 12; - } - if(pCharacter->m_EndlessHook) - { - HasCapabilities = true; - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudEndlessHook); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_EndlessHookOffset, x, y); - x += 12; - } - if(pCharacter->m_Jetpack) - { - HasCapabilities = true; - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudJetpack); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_JetpackOffset, x, y); - x += 12; - } - if(pCharacter->m_HasTelegunGun && pCharacter->m_aWeapons[WEAPON_GUN].m_Got) - { - HasCapabilities = true; - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudTeleportGun); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_TeleportGunOffset, x, y); - x += 12; - } - if(pCharacter->m_HasTelegunGrenade && pCharacter->m_aWeapons[WEAPON_GRENADE].m_Got) - { - HasCapabilities = true; - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudTeleportGrenade); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_TeleportGrenadeOffset, x, y); - x += 12; - } - if(pCharacter->m_HasTelegunLaser && pCharacter->m_aWeapons[WEAPON_LASER].m_Got) - { - HasCapabilities = true; - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudTeleportLaser); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_TeleportLaserOffset, x, y); - } - - // render prohibited capabilities - x = 5; - if(HasCapabilities) - { - y += 12; - } - bool HasProhibitedCapabilities = false; - if(pCharacter->m_Solo) - { - HasProhibitedCapabilities = true; - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudSolo); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_SoloOffset, x, y); - x += 12; - } - if(pCharacter->m_CollisionDisabled) - { - HasProhibitedCapabilities = true; - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudCollisionDisabled); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_CollisionDisabledOffset, x, y); - x += 12; - } - if(pCharacter->m_HookHitDisabled) - { - HasProhibitedCapabilities = true; - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudHookHitDisabled); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_HookHitDisabledOffset, x, y); - x += 12; - } - if(pCharacter->m_HammerHitDisabled) - { - HasProhibitedCapabilities = true; - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudHammerHitDisabled); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_HammerHitDisabledOffset, x, y); - x += 12; - } - if((pCharacter->m_GrenadeHitDisabled && pCharacter->m_HasTelegunGun && pCharacter->m_aWeapons[WEAPON_GUN].m_Got)) - { - HasProhibitedCapabilities = true; - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudGunHitDisabled); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_LaserHitDisabledOffset, x, y); - x += 12; - } - if((pCharacter->m_ShotgunHitDisabled && pCharacter->m_aWeapons[WEAPON_SHOTGUN].m_Got)) - { - HasProhibitedCapabilities = true; - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudShotgunHitDisabled); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_ShotgunHitDisabledOffset, x, y); - x += 12; - } - if((pCharacter->m_GrenadeHitDisabled && pCharacter->m_aWeapons[WEAPON_GRENADE].m_Got)) - { - HasProhibitedCapabilities = true; - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudGrenadeHitDisabled); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_GrenadeHitDisabledOffset, x, y); - x += 12; - } - if((pCharacter->m_LaserHitDisabled && pCharacter->m_aWeapons[WEAPON_LASER].m_Got)) - { - HasProhibitedCapabilities = true; - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudLaserHitDisabled); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_LaserHitDisabledOffset, x, y); - } - - // render dummy actions and freeze state - x = 5; - if(HasProhibitedCapabilities) - { - y += 12; - } - if(m_pClient->m_Snap.m_aCharacters[ClientId].m_HasExtendedDisplayInfo && m_pClient->m_Snap.m_aCharacters[ClientId].m_ExtendedData.m_Flags & CHARACTERFLAG_LOCK_MODE) - { - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudLockMode); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_LockModeOffset, x, y); - x += 12; - } - if(m_pClient->m_Snap.m_aCharacters[ClientId].m_HasExtendedDisplayInfo && m_pClient->m_Snap.m_aCharacters[ClientId].m_ExtendedData.m_Flags & CHARACTERFLAG_PRACTICE_MODE) - { - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudPracticeMode); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_PracticeModeOffset, x, y); - x += 12; - } - if(m_pClient->m_Snap.m_aCharacters[ClientId].m_HasExtendedDisplayInfo && m_pClient->m_Snap.m_aCharacters[ClientId].m_ExtendedData.m_Flags & CHARACTERFLAG_TEAM0_MODE) - { - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudTeam0Mode); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_Team0ModeOffset, x, y); - x += 12; - } - if(pCharacter->m_DeepFrozen) - { - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudDeepFrozen); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_DeepFrozenOffset, x, y); - x += 12; - } - if(pCharacter->m_LiveFrozen) - { - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudLiveFrozen); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_LiveFrozenOffset, x, y); - } -} - -void CHud::RenderNinjaBarPos(const float x, float y, const float Width, const float Height, float Progress, const float Alpha) -{ - Progress = clamp(Progress, 0.0f, 1.0f); - - // what percentage of the end pieces is used for the progress indicator and how much is the rest - // half of the ends are used for the progress display - const float RestPct = 0.5f; - const float ProgPct = 0.5f; - - const float EndHeight = Width; // to keep the correct scale - the width of the sprite is as long as the height - const float BarWidth = Width; - const float WholeBarHeight = Height; - const float MiddleBarHeight = WholeBarHeight - (EndHeight * 2.0f); - const float EndProgressHeight = EndHeight * ProgPct; - const float EndRestHeight = EndHeight * RestPct; - const float ProgressBarHeight = WholeBarHeight - (EndProgressHeight * 2.0f); - const float EndProgressProportion = EndProgressHeight / ProgressBarHeight; - const float MiddleProgressProportion = MiddleBarHeight / ProgressBarHeight; - - // beginning piece - float BeginningPieceProgress = 1; - if(Progress <= 1) - { - if(Progress <= (EndProgressProportion + MiddleProgressProportion)) - { - BeginningPieceProgress = 0; - } - else - { - BeginningPieceProgress = (Progress - EndProgressProportion - MiddleProgressProportion) / EndProgressProportion; - } - } - // empty - Graphics()->WrapClamp(); - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudNinjaBarEmptyRight); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.f, 1.f, 1.f, Alpha); - // Subset: btm_r, top_r, top_m, btm_m | it is mirrored on the horizontal axe and rotated 90 degrees counterclockwise - Graphics()->QuadsSetSubsetFree(1, 1, 1, 0, ProgPct - ProgPct * (1.0f - BeginningPieceProgress), 0, ProgPct - ProgPct * (1.0f - BeginningPieceProgress), 1); - IGraphics::CQuadItem QuadEmptyBeginning(x, y, BarWidth, EndRestHeight + EndProgressHeight * (1.0f - BeginningPieceProgress)); - Graphics()->QuadsDrawTL(&QuadEmptyBeginning, 1); - Graphics()->QuadsEnd(); - // full - if(BeginningPieceProgress > 0.0f) - { - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudNinjaBarFullLeft); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.f, 1.f, 1.f, Alpha); - // Subset: btm_m, top_m, top_r, btm_r | it is rotated 90 degrees clockwise - Graphics()->QuadsSetSubsetFree(RestPct + ProgPct * (1.0f - BeginningPieceProgress), 1, RestPct + ProgPct * (1.0f - BeginningPieceProgress), 0, 1, 0, 1, 1); - IGraphics::CQuadItem QuadFullBeginning(x, y + (EndRestHeight + EndProgressHeight * (1.0f - BeginningPieceProgress)), BarWidth, EndProgressHeight * BeginningPieceProgress); - Graphics()->QuadsDrawTL(&QuadFullBeginning, 1); - Graphics()->QuadsEnd(); - } - - // middle piece - y += EndHeight; - - float MiddlePieceProgress = 1; - if(Progress <= EndProgressProportion + MiddleProgressProportion) - { - if(Progress <= EndProgressProportion) - { - MiddlePieceProgress = 0; - } - else - { - MiddlePieceProgress = (Progress - EndProgressProportion) / MiddleProgressProportion; - } - } - - const float FullMiddleBarHeight = MiddleBarHeight * MiddlePieceProgress; - const float EmptyMiddleBarHeight = MiddleBarHeight - FullMiddleBarHeight; - - // empty ninja bar - if(EmptyMiddleBarHeight > 0.0f) - { - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudNinjaBarEmpty); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.f, 1.f, 1.f, Alpha); - // select the middle portion of the sprite so we don't get edge bleeding - if(EmptyMiddleBarHeight <= EndHeight) - { - // prevent pixel puree, select only a small slice - // Subset: btm_r, top_r, top_m, btm_m | it is mirrored on the horizontal axe and rotated 90 degrees counterclockwise - Graphics()->QuadsSetSubsetFree(1, 1, 1, 0, 1.0f - (EmptyMiddleBarHeight / EndHeight), 0, 1.0f - (EmptyMiddleBarHeight / EndHeight), 1); - } - else - { - // Subset: btm_r, top_r, top_l, btm_l | it is mirrored on the horizontal axe and rotated 90 degrees counterclockwise - Graphics()->QuadsSetSubsetFree(1, 1, 1, 0, 0, 0, 0, 1); - } - IGraphics::CQuadItem QuadEmpty(x, y, BarWidth, EmptyMiddleBarHeight); - Graphics()->QuadsDrawTL(&QuadEmpty, 1); - Graphics()->QuadsEnd(); - } - - // full ninja bar - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudNinjaBarFull); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.f, 1.f, 1.f, Alpha); - // select the middle portion of the sprite so we don't get edge bleeding - if(FullMiddleBarHeight <= EndHeight) - { - // prevent pixel puree, select only a small slice - // Subset: btm_m, top_m, top_r, btm_r | it is rotated 90 degrees clockwise - Graphics()->QuadsSetSubsetFree(1.0f - (FullMiddleBarHeight / EndHeight), 1, 1.0f - (FullMiddleBarHeight / EndHeight), 0, 1, 0, 1, 1); - } - else - { - // Subset: btm_l, top_l, top_r, btm_r | it is rotated 90 degrees clockwise - Graphics()->QuadsSetSubsetFree(0, 1, 0, 0, 1, 0, 1, 1); - } - IGraphics::CQuadItem QuadFull(x, y + EmptyMiddleBarHeight, BarWidth, FullMiddleBarHeight); - Graphics()->QuadsDrawTL(&QuadFull, 1); - Graphics()->QuadsEnd(); - - // ending piece - y += MiddleBarHeight; - float EndingPieceProgress = 1; - if(Progress <= EndProgressProportion) - { - EndingPieceProgress = Progress / EndProgressProportion; - } - // empty - if(EndingPieceProgress < 1.0f) - { - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudNinjaBarEmptyRight); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.f, 1.f, 1.f, Alpha); - // Subset: btm_l, top_l, top_m, btm_m | it is rotated 90 degrees clockwise - Graphics()->QuadsSetSubsetFree(0, 1, 0, 0, ProgPct - ProgPct * EndingPieceProgress, 0, ProgPct - ProgPct * EndingPieceProgress, 1); - IGraphics::CQuadItem QuadEmptyEnding(x, y, BarWidth, EndProgressHeight * (1.0f - EndingPieceProgress)); - Graphics()->QuadsDrawTL(&QuadEmptyEnding, 1); - Graphics()->QuadsEnd(); - } - // full - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudNinjaBarFullLeft); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.f, 1.f, 1.f, Alpha); - // Subset: btm_m, top_m, top_l, btm_l | it is mirrored on the horizontal axe and rotated 90 degrees counterclockwise - Graphics()->QuadsSetSubsetFree(RestPct + ProgPct * EndingPieceProgress, 1, RestPct + ProgPct * EndingPieceProgress, 0, 0, 0, 0, 1); - IGraphics::CQuadItem QuadFullEnding(x, y + (EndProgressHeight * (1.0f - EndingPieceProgress)), BarWidth, EndRestHeight + EndProgressHeight * EndingPieceProgress); - Graphics()->QuadsDrawTL(&QuadFullEnding, 1); - Graphics()->QuadsEnd(); - - Graphics()->QuadsSetSubset(0, 0, 1, 1); - Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); - Graphics()->WrapNormal(); -} - -void CHud::RenderDummyActions() -{ - if(!g_Config.m_ClShowhudDummyActions || (m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_GAMEOVER) || !Client()->DummyConnected()) - { - return; - } - // render small dummy actions hud - const float BoxHeight = 29.0f; - const float BoxWidth = 16.0f; - - float StartX = m_Width - BoxWidth; - float StartY = 285.0f - BoxHeight - 4; // 4 units distance to the next display; - if(g_Config.m_ClShowhudPlayerPosition || g_Config.m_ClShowhudPlayerSpeed || g_Config.m_ClShowhudPlayerAngle) - { - StartY -= 4; - } - StartY -= GetMovementInformationBoxHeight(); - - if(g_Config.m_ClShowhudScore) - { - StartY -= 56; - } - - Graphics()->DrawRect(StartX, StartY, BoxWidth, BoxHeight, ColorRGBA(0.0f, 0.0f, 0.0f, 0.4f), IGraphics::CORNER_L, 5.0f); - - float y = StartY + 2; - float x = StartX + 2; - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.4f); - if(g_Config.m_ClDummyHammer) - { - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - } - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudDummyHammer); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_DummyHammerOffset, x, y); - y += 13; - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.4f); - if(g_Config.m_ClDummyCopyMoves) - { - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - } - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudDummyCopy); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_DummyCopyOffset, x, y); -} - -inline int CHud::GetDigitsIndex(int Value, int Max) -{ - if(Value < 0) - { - Value *= -1; - } - int DigitsIndex = std::log10((Value ? Value : 1)); - if(DigitsIndex > Max) - { - DigitsIndex = Max; - } - if(DigitsIndex < 0) - { - DigitsIndex = 0; - } - return DigitsIndex; -} - -inline float CHud::GetMovementInformationBoxHeight() -{ - float BoxHeight = 3 * MOVEMENT_INFORMATION_LINE_HEIGHT * (g_Config.m_ClShowhudPlayerPosition + g_Config.m_ClShowhudPlayerSpeed) + 2 * MOVEMENT_INFORMATION_LINE_HEIGHT * g_Config.m_ClShowhudPlayerAngle; - if(g_Config.m_ClShowhudPlayerPosition || g_Config.m_ClShowhudPlayerSpeed || g_Config.m_ClShowhudPlayerAngle) - { - BoxHeight += 2; - } - return BoxHeight; -} - -void CHud::UpdateMovementInformationTextContainer(STextContainerIndex &TextContainer, float FontSize, float Value, char *pPrevValue, size_t Size) -{ - char aBuf[128]; - str_format(aBuf, sizeof(aBuf), "%.2f", Value); - - if(!TextContainer.Valid() || str_comp(pPrevValue, aBuf) != 0) - { - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, 0, 0, FontSize, TEXTFLAG_RENDER); - TextRender()->RecreateTextContainer(TextContainer, &Cursor, aBuf); - str_copy(pPrevValue, aBuf, Size); - } -} - -void CHud::RenderMovementInformationTextContainer(STextContainerIndex &TextContainer, const ColorRGBA &Color, float X, float Y) -{ - if(TextContainer.Valid()) - { - TextRender()->RenderTextContainer(TextContainer, Color, TextRender()->DefaultTextOutlineColor(), X - TextRender()->GetBoundingBoxTextContainer(TextContainer).m_W, Y); - } -} - -void CHud::RenderMovementInformation(const int ClientId) -{ - // Draw the infomations depending on settings: Position, speed and target angle - // This display is only to present the available information from the last snapshot, not to interpolate or predict - if(!g_Config.m_ClShowhudPlayerPosition && !g_Config.m_ClShowhudPlayerSpeed && !g_Config.m_ClShowhudPlayerAngle) - { - return; - } - const float LineSpacer = 1.0f; // above and below each entry - const float Fontsize = 6.0f; - - float BoxHeight = GetMovementInformationBoxHeight(); - const float BoxWidth = 62.0f; - - float StartX = m_Width - BoxWidth; - float StartY = 285.0f - BoxHeight - 4; // 4 units distance to the next display; - if(g_Config.m_ClShowhudScore) - { - StartY -= 56; - } - - Graphics()->DrawRect(StartX, StartY, BoxWidth, BoxHeight, ColorRGBA(0.0f, 0.0f, 0.0f, 0.4f), IGraphics::CORNER_L, 5.0f); - - const CNetObj_Character *pPrevChar = &m_pClient->m_Snap.m_aCharacters[ClientId].m_Prev; - const CNetObj_Character *pCurChar = &m_pClient->m_Snap.m_aCharacters[ClientId].m_Cur; - const float IntraTick = Client()->IntraGameTick(g_Config.m_ClDummy); - - // To make the player position relative to blocks we need to divide by the block size - const vec2 Pos = mix(vec2(pPrevChar->m_X, pPrevChar->m_Y), vec2(pCurChar->m_X, pCurChar->m_Y), IntraTick) / 32.0f; - - const vec2 Vel = mix(vec2(pPrevChar->m_VelX, pPrevChar->m_VelY), vec2(pCurChar->m_VelX, pCurChar->m_VelY), IntraTick); - - float VelspeedX = Vel.x / 256.0f * Client()->GameTickSpeed(); - if(Vel.x >= -1 && Vel.x <= 1) - { - VelspeedX = 0; - } - float VelspeedY = Vel.y / 256.0f * Client()->GameTickSpeed(); - if(Vel.y >= -128 && Vel.y <= 128) - { - VelspeedY = 0; - } - // We show the speed in Blocks per Second (Bps) and therefore have to divide by the block size - float DisplaySpeedX = VelspeedX / 32; - float VelspeedLength = length(vec2(Vel.x, Vel.y) / 256.0f) * Client()->GameTickSpeed(); - // Todo: Use Velramp tuning of each individual player - // Since these tuning parameters are almost never changed, the default values are sufficient in most cases - float Ramp = VelocityRamp(VelspeedLength, m_pClient->m_aTuning[g_Config.m_ClDummy].m_VelrampStart, m_pClient->m_aTuning[g_Config.m_ClDummy].m_VelrampRange, m_pClient->m_aTuning[g_Config.m_ClDummy].m_VelrampCurvature); - DisplaySpeedX *= Ramp; - float DisplaySpeedY = VelspeedY / 32; - - float Angle = m_pClient->m_Players.GetPlayerTargetAngle(pPrevChar, pCurChar, ClientId, IntraTick); - if(Angle < 0) - { - Angle += 2.0f * pi; - } - float DisplayAngle = Angle * 180.0f / pi; - - float y = StartY + LineSpacer * 2; - float xl = StartX + 2; - float xr = m_Width - 2; - - if(g_Config.m_ClShowhudPlayerPosition) - { - TextRender()->Text(xl, y, Fontsize, Localize("Position:"), -1.0f); - y += MOVEMENT_INFORMATION_LINE_HEIGHT; - - TextRender()->Text(xl, y, Fontsize, "X:", -1.0f); - UpdateMovementInformationTextContainer(m_aPlayerPositionContainers[0], Fontsize, Pos.x, m_aaPlayerPositionText[0], sizeof(m_aaPlayerPositionText[0])); - RenderMovementInformationTextContainer(m_aPlayerPositionContainers[0], TextRender()->DefaultTextColor(), xr, y); - y += MOVEMENT_INFORMATION_LINE_HEIGHT; - - TextRender()->Text(xl, y, Fontsize, "Y:", -1.0f); - UpdateMovementInformationTextContainer(m_aPlayerPositionContainers[1], Fontsize, Pos.y, m_aaPlayerPositionText[1], sizeof(m_aaPlayerPositionText[1])); - RenderMovementInformationTextContainer(m_aPlayerPositionContainers[1], TextRender()->DefaultTextColor(), xr, y); - y += MOVEMENT_INFORMATION_LINE_HEIGHT; - } - - if(g_Config.m_ClShowhudPlayerSpeed) - { - TextRender()->Text(xl, y, Fontsize, Localize("Speed:"), -1.0f); - y += MOVEMENT_INFORMATION_LINE_HEIGHT; - - const char aaCoordinates[][4] = {"X:", "Y:"}; - for(int i = 0; i < 2; i++) - { - ColorRGBA Color(1, 1, 1, 1); - if(m_aLastPlayerSpeedChange[i] == ESpeedChange::INCREASE) - Color = ColorRGBA(0, 1, 0, 1); - if(m_aLastPlayerSpeedChange[i] == ESpeedChange::DECREASE) - Color = ColorRGBA(1, 0.5f, 0.5f, 1); - TextRender()->Text(xl, y, Fontsize, aaCoordinates[i], -1.0f); - UpdateMovementInformationTextContainer(m_aPlayerSpeedTextContainers[i], Fontsize, i == 0 ? DisplaySpeedX : DisplaySpeedY, m_aaPlayerSpeedText[i], sizeof(m_aaPlayerSpeedText[i])); - RenderMovementInformationTextContainer(m_aPlayerSpeedTextContainers[i], Color, xr, y); - y += MOVEMENT_INFORMATION_LINE_HEIGHT; - } - - TextRender()->TextColor(1, 1, 1, 1); - } - - if(g_Config.m_ClShowhudPlayerAngle) - { - TextRender()->Text(xl, y, Fontsize, Localize("Angle:"), -1.0f); - y += MOVEMENT_INFORMATION_LINE_HEIGHT; - - UpdateMovementInformationTextContainer(m_PlayerAngleTextContainerIndex, Fontsize, DisplayAngle, m_aPlayerAngleText, sizeof(m_aPlayerAngleText)); - RenderMovementInformationTextContainer(m_PlayerAngleTextContainerIndex, TextRender()->DefaultTextColor(), xr, y); - } -} - -void CHud::RenderSpectatorHud() -{ - // draw the box - Graphics()->DrawRect(m_Width - 180.0f, m_Height - 15.0f, 180.0f, 15.0f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.4f), IGraphics::CORNER_TL, 5.0f); - - // draw the text - char aBuf[128]; - if(GameClient()->m_MultiViewActivated) - { - str_copy(aBuf, Localize("Multi-View")); - } - else if(m_pClient->m_Snap.m_SpecInfo.m_SpectatorId != SPEC_FREEVIEW) - { - str_format(aBuf, sizeof(aBuf), Localize("Following %s", "Spectating"), m_pClient->m_aClients[m_pClient->m_Snap.m_SpecInfo.m_SpectatorId].m_aName); - } - else - { - str_copy(aBuf, Localize("Free-View")); - } - TextRender()->Text(m_Width - 174.0f, m_Height - 15.0f + (15.f - 8.f) / 2.f, 8.0f, aBuf, -1.0f); - - // draw the camera info - if(m_pClient->m_Camera.SpectatingPlayer() && m_pClient->m_Camera.CanUseAutoSpecCamera()) - { - bool AutoSpecCameraEnabled = m_pClient->m_Camera.m_AutoSpecCamera; - const char *pLabelText = Localize("AUTO", "Spectating Camera Mode Icon"); - const float TextWidth = TextRender()->TextWidth(6.0f, pLabelText); - - constexpr float RightMargin = 4.0f; - constexpr float IconWidth = 6.0f; - constexpr float Padding = 3.0f; - const float TagWidth = IconWidth + TextWidth + Padding * 3.0f; - const float TagX = m_Width - RightMargin - TagWidth; - Graphics()->DrawRect(TagX, m_Height - 12.0f, TagWidth, 10.0f, ColorRGBA(0.84f, 0.53f, 0.17f, AutoSpecCameraEnabled ? 0.85f : 0.25f), IGraphics::CORNER_ALL, 2.5f); - TextRender()->TextColor(1, 1, 1, AutoSpecCameraEnabled ? 1.0f : 0.65f); - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->Text(TagX + Padding, m_Height - 10.0f, 6.0f, FontIcons::FONT_ICON_CAMERA, -1.0f); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - TextRender()->Text(TagX + Padding + IconWidth + Padding, m_Height - 10.0f, 6.0f, pLabelText, -1.0f); - TextRender()->TextColor(1, 1, 1, 1); - } -} - -void CHud::RenderLocalTime(float x) -{ - if(!g_Config.m_ClShowLocalTimeAlways && !m_pClient->m_Scoreboard.Active()) - return; - - // draw the box - Graphics()->DrawRect(x - 30.0f, 0.0f, 25.0f, 12.5f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.4f), IGraphics::CORNER_B, 3.75f); - - // draw the text - char aTimeStr[6]; - str_timestamp_format(aTimeStr, sizeof(aTimeStr), "%H:%M"); - TextRender()->Text(x - 25.0f, (12.5f - 5.f) / 2.f, 5.0f, aTimeStr, -1.0f); -} - -void CHud::OnNewSnapshot() -{ - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - if(!m_pClient->m_Snap.m_pGameInfoObj) - return; - - int ClientId = -1; - if(m_pClient->m_Snap.m_pLocalCharacter && !m_pClient->m_Snap.m_SpecInfo.m_Active && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_GAMEOVER)) - ClientId = m_pClient->m_Snap.m_LocalClientId; - else if(m_pClient->m_Snap.m_SpecInfo.m_Active) - ClientId = m_pClient->m_Snap.m_SpecInfo.m_SpectatorId; - - if(ClientId == -1) - return; - - const CNetObj_Character *pPrevChar = &m_pClient->m_Snap.m_aCharacters[ClientId].m_Prev; - const CNetObj_Character *pCurChar = &m_pClient->m_Snap.m_aCharacters[ClientId].m_Cur; - const float IntraTick = Client()->IntraGameTick(g_Config.m_ClDummy); - ivec2 Vel = mix(ivec2(pPrevChar->m_VelX, pPrevChar->m_VelY), ivec2(pCurChar->m_VelX, pCurChar->m_VelY), IntraTick); - - CCharacter *pChar = m_pClient->m_PredictedWorld.GetCharacterById(ClientId); - if(pChar && pChar->IsGrounded()) - Vel.y = 0; - - int aVels[2] = {Vel.x, Vel.y}; - - for(int i = 0; i < 2; i++) - { - int AbsVel = abs(aVels[i]); - if(AbsVel > m_aPlayerSpeed[i]) - { - m_aLastPlayerSpeedChange[i] = ESpeedChange::INCREASE; - } - if(AbsVel < m_aPlayerSpeed[i]) - { - m_aLastPlayerSpeedChange[i] = ESpeedChange::DECREASE; - } - if(AbsVel < 2) - { - m_aLastPlayerSpeedChange[i] = ESpeedChange::NONE; - } - m_aPlayerSpeed[i] = AbsVel; - } -} - -void CHud::OnRender() -{ - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - if(!m_pClient->m_Snap.m_pGameInfoObj) - return; - - m_Width = 300.0f * Graphics()->ScreenAspect(); - m_Height = 300.0f; - Graphics()->MapScreen(0.0f, 0.0f, m_Width, m_Height); - -#if defined(CONF_VIDEORECORDER) - if((IVideo::Current() && g_Config.m_ClVideoShowhud) || (!IVideo::Current() && g_Config.m_ClShowhud)) -#else - if(g_Config.m_ClShowhud) -#endif - { - if(m_pClient->m_Snap.m_pLocalCharacter && !m_pClient->m_Snap.m_SpecInfo.m_Active && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_GAMEOVER)) - { - if(g_Config.m_ClShowhudHealthAmmo) - { - RenderAmmoHealthAndArmor(m_pClient->m_Snap.m_pLocalCharacter); - } - if(m_pClient->m_Snap.m_aCharacters[m_pClient->m_Snap.m_LocalClientId].m_HasExtendedData && g_Config.m_ClShowhudDDRace && GameClient()->m_GameInfo.m_HudDDRace) - { - RenderPlayerState(m_pClient->m_Snap.m_LocalClientId); - } - RenderMovementInformation(m_pClient->m_Snap.m_LocalClientId); - RenderDDRaceEffects(); - } - else if(m_pClient->m_Snap.m_SpecInfo.m_Active) - { - int SpectatorId = m_pClient->m_Snap.m_SpecInfo.m_SpectatorId; - if(SpectatorId != SPEC_FREEVIEW && g_Config.m_ClShowhudHealthAmmo) - { - RenderAmmoHealthAndArmor(&m_pClient->m_Snap.m_aCharacters[SpectatorId].m_Cur); - } - if(SpectatorId != SPEC_FREEVIEW && - m_pClient->m_Snap.m_aCharacters[SpectatorId].m_HasExtendedData && - g_Config.m_ClShowhudDDRace && - (!GameClient()->m_MultiViewActivated || GameClient()->m_MultiViewShowHud) && - GameClient()->m_GameInfo.m_HudDDRace) - { - RenderPlayerState(SpectatorId); - } - if(SpectatorId != SPEC_FREEVIEW) - { - RenderMovementInformation(SpectatorId); - } - RenderSpectatorHud(); - } - - if(g_Config.m_ClShowhudTimer) - RenderGameTimer(); - RenderPauseNotification(); - RenderSuddenDeath(); - if(g_Config.m_ClShowhudScore) - RenderScoreHud(); - RenderDummyActions(); - RenderWarmupTimer(); - RenderTextInfo(); - RenderLocalTime((m_Width / 7) * 3); - if(Client()->State() != IClient::STATE_DEMOPLAYBACK) - RenderConnectionWarning(); - RenderTeambalanceWarning(); - m_pClient->m_Voting.Render(); - if(g_Config.m_ClShowRecord) - RenderRecord(); - } - RenderCursor(); -} - -void CHud::OnMessage(int MsgType, void *pRawMsg) -{ - if(MsgType == NETMSGTYPE_SV_DDRACETIME || MsgType == NETMSGTYPE_SV_DDRACETIMELEGACY) - { - CNetMsg_Sv_DDRaceTime *pMsg = (CNetMsg_Sv_DDRaceTime *)pRawMsg; - - m_DDRaceTime = pMsg->m_Time; - - m_ShowFinishTime = pMsg->m_Finish != 0; - - if(!m_ShowFinishTime) - { - m_TimeCpDiff = (float)pMsg->m_Check / 100; - m_TimeCpLastReceivedTick = Client()->GameTick(g_Config.m_ClDummy); - } - else - { - m_FinishTimeDiff = (float)pMsg->m_Check / 100; - m_FinishTimeLastReceivedTick = Client()->GameTick(g_Config.m_ClDummy); - } - } - else if(MsgType == NETMSGTYPE_SV_RECORD || MsgType == NETMSGTYPE_SV_RECORDLEGACY) - { - CNetMsg_Sv_Record *pMsg = (CNetMsg_Sv_Record *)pRawMsg; - - // NETMSGTYPE_SV_RACETIME on old race servers - if(MsgType == NETMSGTYPE_SV_RECORDLEGACY && m_pClient->m_GameInfo.m_DDRaceRecordMessage) - { - m_DDRaceTime = pMsg->m_ServerTimeBest; // First value: m_Time - - m_FinishTimeLastReceivedTick = Client()->GameTick(g_Config.m_ClDummy); - - if(pMsg->m_PlayerTimeBest) // Second value: m_Check - { - m_TimeCpDiff = (float)pMsg->m_PlayerTimeBest / 100; - m_TimeCpLastReceivedTick = Client()->GameTick(g_Config.m_ClDummy); - } - } - else if(MsgType == NETMSGTYPE_SV_RECORD || m_pClient->m_GameInfo.m_RaceRecordMessage) - { - m_ServerRecord = (float)pMsg->m_ServerTimeBest / 100; - m_aPlayerRecord[g_Config.m_ClDummy] = (float)pMsg->m_PlayerTimeBest / 100; - } - } -} - -void CHud::RenderDDRaceEffects() -{ - if(m_DDRaceTime) - { - char aBuf[64]; - char aTime[32]; - if(m_ShowFinishTime && m_FinishTimeLastReceivedTick + Client()->GameTickSpeed() * 6 > Client()->GameTick(g_Config.m_ClDummy)) - { - str_time(m_DDRaceTime, TIME_HOURS_CENTISECS, aTime, sizeof(aTime)); - str_format(aBuf, sizeof(aBuf), "Finish time: %s", aTime); - - // calculate alpha (4 sec 1 than get lower the next 2 sec) - float Alpha = 1.0f; - if(m_FinishTimeLastReceivedTick + Client()->GameTickSpeed() * 4 < Client()->GameTick(g_Config.m_ClDummy) && m_FinishTimeLastReceivedTick + Client()->GameTickSpeed() * 6 > Client()->GameTick(g_Config.m_ClDummy)) - { - // lower the alpha slowly to blend text out - Alpha = ((float)(m_FinishTimeLastReceivedTick + Client()->GameTickSpeed() * 6) - (float)Client()->GameTick(g_Config.m_ClDummy)) / (float)(Client()->GameTickSpeed() * 2); - } - - TextRender()->TextColor(1, 1, 1, Alpha); - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, 150 * Graphics()->ScreenAspect() - TextRender()->TextWidth(12, aBuf, -1, -1.0f) / 2, 20, 12, TEXTFLAG_RENDER); - Cursor.m_LineWidth = -1.0f; - TextRender()->RecreateTextContainer(m_DDRaceEffectsTextContainerIndex, &Cursor, aBuf); - if(m_FinishTimeDiff != 0.0f && m_DDRaceEffectsTextContainerIndex.Valid()) - { - if(m_FinishTimeDiff < 0) - { - str_time_float(-m_FinishTimeDiff, TIME_HOURS_CENTISECS, aTime, sizeof(aTime)); - str_format(aBuf, sizeof(aBuf), "-%s", aTime); - TextRender()->TextColor(0.5f, 1.0f, 0.5f, Alpha); // green - } - else - { - str_time_float(m_FinishTimeDiff, TIME_HOURS_CENTISECS, aTime, sizeof(aTime)); - str_format(aBuf, sizeof(aBuf), "+%s", aTime); - TextRender()->TextColor(1.0f, 0.5f, 0.5f, Alpha); // red - } - TextRender()->SetCursor(&Cursor, 150 * Graphics()->ScreenAspect() - TextRender()->TextWidth(10, aBuf, -1, -1.0f) / 2, 34, 10, TEXTFLAG_RENDER); - Cursor.m_LineWidth = -1.0f; - TextRender()->AppendTextContainer(m_DDRaceEffectsTextContainerIndex, &Cursor, aBuf); - } - if(m_DDRaceEffectsTextContainerIndex.Valid()) - { - auto OutlineColor = TextRender()->DefaultTextOutlineColor(); - OutlineColor.a *= Alpha; - TextRender()->RenderTextContainer(m_DDRaceEffectsTextContainerIndex, TextRender()->DefaultTextColor(), OutlineColor); - } - TextRender()->TextColor(TextRender()->DefaultTextColor()); - } - else if(g_Config.m_ClShowhudTimeCpDiff && !m_ShowFinishTime && m_TimeCpLastReceivedTick + Client()->GameTickSpeed() * 6 > Client()->GameTick(g_Config.m_ClDummy)) - { - if(m_TimeCpDiff < 0) - { - str_time_float(-m_TimeCpDiff, TIME_HOURS_CENTISECS, aTime, sizeof(aTime)); - str_format(aBuf, sizeof(aBuf), "-%s", aTime); - } - else - { - str_time_float(m_TimeCpDiff, TIME_HOURS_CENTISECS, aTime, sizeof(aTime)); - str_format(aBuf, sizeof(aBuf), "+%s", aTime); - } - - // calculate alpha (4 sec 1 than get lower the next 2 sec) - float Alpha = 1.0f; - if(m_TimeCpLastReceivedTick + Client()->GameTickSpeed() * 4 < Client()->GameTick(g_Config.m_ClDummy) && m_TimeCpLastReceivedTick + Client()->GameTickSpeed() * 6 > Client()->GameTick(g_Config.m_ClDummy)) - { - // lower the alpha slowly to blend text out - Alpha = ((float)(m_TimeCpLastReceivedTick + Client()->GameTickSpeed() * 6) - (float)Client()->GameTick(g_Config.m_ClDummy)) / (float)(Client()->GameTickSpeed() * 2); - } - - if(m_TimeCpDiff > 0) - TextRender()->TextColor(1.0f, 0.5f, 0.5f, Alpha); // red - else if(m_TimeCpDiff < 0) - TextRender()->TextColor(0.5f, 1.0f, 0.5f, Alpha); // green - else if(!m_TimeCpDiff) - TextRender()->TextColor(1, 1, 1, Alpha); // white - - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, 150 * Graphics()->ScreenAspect() - TextRender()->TextWidth(10, aBuf, -1, -1.0f) / 2, 20, 10, TEXTFLAG_RENDER); - Cursor.m_LineWidth = -1.0f; - TextRender()->RecreateTextContainer(m_DDRaceEffectsTextContainerIndex, &Cursor, aBuf); - - if(m_DDRaceEffectsTextContainerIndex.Valid()) - { - auto OutlineColor = TextRender()->DefaultTextOutlineColor(); - OutlineColor.a *= Alpha; - TextRender()->RenderTextContainer(m_DDRaceEffectsTextContainerIndex, TextRender()->DefaultTextColor(), OutlineColor); - } - TextRender()->TextColor(TextRender()->DefaultTextColor()); - } - } -} - -void CHud::RenderRecord() -{ - if(m_ServerRecord > 0.0f) - { - char aBuf[64]; - TextRender()->Text(5, 75, 6, Localize("Server best:"), -1.0f); - char aTime[32]; - str_time_float(m_ServerRecord, TIME_HOURS_CENTISECS, aTime, sizeof(aTime)); - str_format(aBuf, sizeof(aBuf), "%s%s", m_ServerRecord > 3600 ? "" : "   ", aTime); - TextRender()->Text(53, 75, 6, aBuf, -1.0f); - } - - const float PlayerRecord = m_aPlayerRecord[g_Config.m_ClDummy]; - if(PlayerRecord > 0.0f) - { - char aBuf[64]; - TextRender()->Text(5, 82, 6, Localize("Personal best:"), -1.0f); - char aTime[32]; - str_time_float(PlayerRecord, TIME_HOURS_CENTISECS, aTime, sizeof(aTime)); - str_format(aBuf, sizeof(aBuf), "%s%s", PlayerRecord > 3600 ? "" : "   ", aTime); - TextRender()->Text(53, 82, 6, aBuf, -1.0f); - } -} diff --git a/src/game/client/components/hud.h b/src/game/client/components/hud.h deleted file mode 100644 index 23463bc724..0000000000 --- a/src/game/client/components/hud.h +++ /dev/null @@ -1,163 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_HUD_H -#define GAME_CLIENT_COMPONENTS_HUD_H -#include -#include -#include -#include -#include - -struct SScoreInfo -{ - SScoreInfo() - { - Reset(); - } - - void Reset() - { - m_TextRankContainerIndex.Reset(); - m_TextScoreContainerIndex.Reset(); - m_RoundRectQuadContainerIndex = -1; - m_OptionalNameTextContainerIndex.Reset(); - m_aScoreText[0] = 0; - m_aRankText[0] = 0; - m_aPlayerNameText[0] = 0; - m_ScoreTextWidth = 0.f; - m_Initialized = false; - } - - STextContainerIndex m_TextRankContainerIndex; - STextContainerIndex m_TextScoreContainerIndex; - float m_ScoreTextWidth; - char m_aScoreText[16]; - char m_aRankText[16]; - char m_aPlayerNameText[MAX_NAME_LENGTH]; - int m_RoundRectQuadContainerIndex; - STextContainerIndex m_OptionalNameTextContainerIndex; - - bool m_Initialized; -}; - -class CHud : public CComponent -{ - float m_Width, m_Height; - float m_FrameTimeAvg; - - int m_HudQuadContainerIndex; - SScoreInfo m_aScoreInfo[2]; - STextContainerIndex m_FPSTextContainerIndex; - STextContainerIndex m_DDRaceEffectsTextContainerIndex; - STextContainerIndex m_PlayerAngleTextContainerIndex; - char m_aPlayerAngleText[128]; - STextContainerIndex m_aPlayerSpeedTextContainers[2]; - char m_aaPlayerSpeedText[2][128]; - int m_aPlayerSpeed[2]; - enum class ESpeedChange - { - NONE, - INCREASE, - DECREASE - }; - ESpeedChange m_aLastPlayerSpeedChange[2]; - STextContainerIndex m_aPlayerPositionContainers[2]; - char m_aaPlayerPositionText[2][128]; - - void RenderCursor(); - - void RenderTextInfo(); - void RenderConnectionWarning(); - void RenderTeambalanceWarning(); - void RenderVoting(); - - void PrepareAmmoHealthAndArmorQuads(); - void RenderAmmoHealthAndArmor(const CNetObj_Character *pCharacter); - - void PreparePlayerStateQuads(); - void RenderPlayerState(const int ClientId); - void RenderDummyActions(); - void RenderMovementInformation(const int ClientId); - - void UpdateMovementInformationTextContainer(STextContainerIndex &TextContainer, float FontSize, float Value, char *pPrevValue, size_t Size); - void RenderMovementInformationTextContainer(STextContainerIndex &TextContainer, const ColorRGBA &Color, float X, float Y); - - void RenderGameTimer(); - void RenderPauseNotification(); - void RenderSuddenDeath(); - - void RenderScoreHud(); - int m_LastLocalClientId = -1; - - void RenderSpectatorHud(); - void RenderWarmupTimer(); - void RenderLocalTime(float x); - - static constexpr float MOVEMENT_INFORMATION_LINE_HEIGHT = 8.0f; - -public: - CHud(); - virtual int Sizeof() const override { return sizeof(*this); } - - void ResetHudContainers(); - virtual void OnWindowResize() override; - virtual void OnReset() override; - virtual void OnRender() override; - virtual void OnInit() override; - virtual void OnNewSnapshot() override; - - // DDRace - - virtual void OnMessage(int MsgType, void *pRawMsg) override; - void RenderNinjaBarPos(float x, const float y, const float Width, const float Height, float Progress, float Alpha = 1.0f); - -private: - void RenderRecord(); - void RenderDDRaceEffects(); - float m_TimeCpDiff; - float m_ServerRecord; - float m_aPlayerRecord[NUM_DUMMIES]; - float m_FinishTimeDiff; - int m_DDRaceTime; - int m_FinishTimeLastReceivedTick; - int m_TimeCpLastReceivedTick; - bool m_ShowFinishTime; - - inline float GetMovementInformationBoxHeight(); - inline int GetDigitsIndex(int Value, int Max); - - // Quad Offsets - int m_aAmmoOffset[NUM_WEAPONS]; - int m_HealthOffset; - int m_EmptyHealthOffset; - int m_ArmorOffset; - int m_EmptyArmorOffset; - int m_aCursorOffset[NUM_WEAPONS]; - int m_FlagOffset; - int m_AirjumpOffset; - int m_AirjumpEmptyOffset; - int m_aWeaponOffset[NUM_WEAPONS]; - int m_EndlessJumpOffset; - int m_EndlessHookOffset; - int m_JetpackOffset; - int m_TeleportGrenadeOffset; - int m_TeleportGunOffset; - int m_TeleportLaserOffset; - int m_SoloOffset; - int m_CollisionDisabledOffset; - int m_HookHitDisabledOffset; - int m_HammerHitDisabledOffset; - int m_GunHitDisabledOffset; - int m_ShotgunHitDisabledOffset; - int m_GrenadeHitDisabledOffset; - int m_LaserHitDisabledOffset; - int m_DeepFrozenOffset; - int m_LiveFrozenOffset; - int m_DummyHammerOffset; - int m_DummyCopyOffset; - int m_PracticeModeOffset; - int m_Team0ModeOffset; - int m_LockModeOffset; -}; - -#endif diff --git a/src/game/client/components/infomessages.cpp b/src/game/client/components/infomessages.cpp deleted file mode 100644 index d5783d3bd3..0000000000 --- a/src/game/client/components/infomessages.cpp +++ /dev/null @@ -1,490 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include -#include -#include -#include -#include -#include - -#include "infomessages.h" -#include -#include -#include -#include - -static constexpr float ROW_HEIGHT = 46.0f; -static constexpr float FONT_SIZE = 36.0f; -static constexpr float RACE_FLAG_SIZE = 52.0f; - -void CInfoMessages::OnWindowResize() -{ - for(auto &InfoMsg : m_aInfoMsgs) - { - DeleteTextContainers(InfoMsg); - } -} - -void CInfoMessages::OnReset() -{ - m_InfoMsgCurrent = 0; - for(auto &InfoMsg : m_aInfoMsgs) - { - InfoMsg.m_Tick = -100000; - DeleteTextContainers(InfoMsg); - } -} - -void CInfoMessages::DeleteTextContainers(CInfoMsg &InfoMsg) -{ - TextRender()->DeleteTextContainer(InfoMsg.m_VictimTextContainerIndex); - TextRender()->DeleteTextContainer(InfoMsg.m_KillerTextContainerIndex); - TextRender()->DeleteTextContainer(InfoMsg.m_DiffTextContainerIndex); - TextRender()->DeleteTextContainer(InfoMsg.m_TimeTextContainerIndex); -} - -void CInfoMessages::OnInit() -{ - Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); - m_SpriteQuadContainerIndex = Graphics()->CreateQuadContainer(false); - - Graphics()->QuadsSetSubset(0, 0, 1, 1); - RenderTools()->QuadContainerAddSprite(m_SpriteQuadContainerIndex, 0.f, 0.f, 28.f, 56.f); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - RenderTools()->QuadContainerAddSprite(m_SpriteQuadContainerIndex, 0.f, 0.f, 28.f, 56.f); - - Graphics()->QuadsSetSubset(1, 0, 0, 1); - RenderTools()->QuadContainerAddSprite(m_SpriteQuadContainerIndex, 0.f, 0.f, 28.f, 56.f); - Graphics()->QuadsSetSubset(1, 0, 0, 1); - RenderTools()->QuadContainerAddSprite(m_SpriteQuadContainerIndex, 0.f, 0.f, 28.f, 56.f); - - for(int i = 0; i < NUM_WEAPONS; ++i) - { - float ScaleX, ScaleY; - Graphics()->QuadsSetSubset(0, 0, 1, 1); - RenderTools()->GetSpriteScale(g_pData->m_Weapons.m_aId[i].m_pSpriteBody, ScaleX, ScaleY); - RenderTools()->QuadContainerAddSprite(m_SpriteQuadContainerIndex, 96.f * ScaleX, 96.f * ScaleY); - } - - Graphics()->QuadsSetSubset(0, 0, 1, 1); - m_QuadOffsetRaceFlag = RenderTools()->QuadContainerAddSprite(m_SpriteQuadContainerIndex, 0.0f, 0.0f, RACE_FLAG_SIZE, RACE_FLAG_SIZE); - - Graphics()->QuadContainerUpload(m_SpriteQuadContainerIndex); -} - -CInfoMessages::CInfoMsg CInfoMessages::CreateInfoMsg(EType Type) -{ - CInfoMsg InfoMsg; - InfoMsg.m_Type = Type; - InfoMsg.m_Tick = Client()->GameTick(g_Config.m_ClDummy); - - for(int i = 0; i < MAX_KILLMSG_TEAM_MEMBERS; i++) - { - InfoMsg.m_aVictimIds[i] = -1; - InfoMsg.m_aVictimRenderInfo[i].Reset(); - } - InfoMsg.m_VictimDDTeam = 0; - InfoMsg.m_aVictimName[0] = '\0'; - InfoMsg.m_VictimTextContainerIndex.Reset(); - - InfoMsg.m_KillerId = -1; - InfoMsg.m_aKillerName[0] = '\0'; - InfoMsg.m_KillerTextContainerIndex.Reset(); - InfoMsg.m_KillerRenderInfo.Reset(); - - InfoMsg.m_Weapon = -1; - InfoMsg.m_ModeSpecial = 0; - InfoMsg.m_FlagCarrierBlue = -1; - InfoMsg.m_TeamSize = 0; - - InfoMsg.m_Diff = 0; - InfoMsg.m_aTimeText[0] = '\0'; - InfoMsg.m_aDiffText[0] = '\0'; - InfoMsg.m_TimeTextContainerIndex.Reset(); - InfoMsg.m_DiffTextContainerIndex.Reset(); - InfoMsg.m_RecordPersonal = false; - return InfoMsg; -} - -void CInfoMessages::AddInfoMsg(const CInfoMsg &InfoMsg) -{ - if(InfoMsg.m_KillerId >= 0 && !InfoMsg.m_KillerRenderInfo.Valid()) - return; - for(int i = 0; i < InfoMsg.m_TeamSize; i++) - { - if(InfoMsg.m_aVictimIds[i] < 0 || !InfoMsg.m_aVictimRenderInfo[i].Valid()) - return; - } - - const float Height = 1.5f * 400.0f * 3.0f; - const float Width = Height * Graphics()->ScreenAspect(); - - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - Graphics()->MapScreen(0, 0, Width, Height); - - m_InfoMsgCurrent = (m_InfoMsgCurrent + 1) % MAX_INFOMSGS; - DeleteTextContainers(m_aInfoMsgs[m_InfoMsgCurrent]); - m_aInfoMsgs[m_InfoMsgCurrent] = InfoMsg; - CreateTextContainersIfNotCreated(m_aInfoMsgs[m_InfoMsgCurrent]); - - Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); -} - -void CInfoMessages::CreateTextContainersIfNotCreated(CInfoMsg &InfoMsg) -{ - const auto &&NameColor = [&](int ClientId) -> ColorRGBA { - unsigned Color; - if(ClientId == m_pClient->m_Snap.m_LocalClientId) - { - Color = g_Config.m_ClKillMessageHighlightColor; - } - else - { - Color = g_Config.m_ClKillMessageNormalColor; - } - return color_cast(ColorHSLA(Color)); - }; - - if(!InfoMsg.m_VictimTextContainerIndex.Valid() && InfoMsg.m_aVictimName[0] != '\0') - { - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, 0, 0, FONT_SIZE, TEXTFLAG_RENDER); - TextRender()->TextColor(NameColor(InfoMsg.m_aVictimIds[0])); - TextRender()->CreateTextContainer(InfoMsg.m_VictimTextContainerIndex, &Cursor, InfoMsg.m_aVictimName); - } - - if(!InfoMsg.m_KillerTextContainerIndex.Valid() && InfoMsg.m_aKillerName[0] != '\0') - { - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, 0, 0, FONT_SIZE, TEXTFLAG_RENDER); - TextRender()->TextColor(NameColor(InfoMsg.m_KillerId)); - TextRender()->CreateTextContainer(InfoMsg.m_KillerTextContainerIndex, &Cursor, InfoMsg.m_aKillerName); - } - - if(!InfoMsg.m_DiffTextContainerIndex.Valid() && InfoMsg.m_aDiffText[0] != '\0') - { - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, 0, 0, FONT_SIZE, TEXTFLAG_RENDER); - - if(InfoMsg.m_Diff > 0) - TextRender()->TextColor(1.0f, 0.5f, 0.5f, 1.0f); // red - else if(InfoMsg.m_Diff < 0) - TextRender()->TextColor(0.5f, 1.0f, 0.5f, 1.0f); // green - else - TextRender()->TextColor(TextRender()->DefaultTextColor()); - - TextRender()->CreateTextContainer(InfoMsg.m_DiffTextContainerIndex, &Cursor, InfoMsg.m_aDiffText); - } - - if(!InfoMsg.m_TimeTextContainerIndex.Valid() && InfoMsg.m_aTimeText[0] != '\0') - { - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, 0, 0, FONT_SIZE, TEXTFLAG_RENDER); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - TextRender()->CreateTextContainer(InfoMsg.m_TimeTextContainerIndex, &Cursor, InfoMsg.m_aTimeText); - } - - TextRender()->TextColor(TextRender()->DefaultTextColor()); -} - -void CInfoMessages::OnMessage(int MsgType, void *pRawMsg) -{ - if(m_pClient->m_SuppressEvents) - return; - - switch(MsgType) - { - case NETMSGTYPE_SV_KILLMSGTEAM: - OnTeamKillMessage(static_cast(pRawMsg)); - break; - case NETMSGTYPE_SV_KILLMSG: - OnKillMessage(static_cast(pRawMsg)); - break; - case NETMSGTYPE_SV_RACEFINISH: - OnRaceFinishMessage(static_cast(pRawMsg)); - break; - } -} - -void CInfoMessages::OnTeamKillMessage(const CNetMsg_Sv_KillMsgTeam *pMsg) -{ - std::vector> vStrongWeakSorted; - for(int i = 0; i < MAX_CLIENTS; i++) - { - if(m_pClient->m_Teams.Team(i) == pMsg->m_Team) - { - CCharacter *pChr = m_pClient->m_GameWorld.GetCharacterById(i); - vStrongWeakSorted.emplace_back(i, pMsg->m_First == i ? MAX_CLIENTS : pChr ? pChr->GetStrongWeakId() : 0); - } - } - std::stable_sort(vStrongWeakSorted.begin(), vStrongWeakSorted.end(), [](auto &Left, auto &Right) { return Left.second > Right.second; }); - - CInfoMsg Kill = CreateInfoMsg(TYPE_KILL); - Kill.m_TeamSize = minimum(vStrongWeakSorted.size(), MAX_KILLMSG_TEAM_MEMBERS); - - Kill.m_VictimDDTeam = pMsg->m_Team; - for(int i = 0; i < Kill.m_TeamSize; i++) - { - if(m_pClient->m_aClients[vStrongWeakSorted[i].first].m_Active) - { - Kill.m_aVictimIds[i] = vStrongWeakSorted[i].first; - Kill.m_aVictimRenderInfo[i] = m_pClient->m_aClients[vStrongWeakSorted[i].first].m_RenderInfo; - } - } - str_format(Kill.m_aVictimName, sizeof(Kill.m_aVictimName), Localize("Team %d"), pMsg->m_Team); - - AddInfoMsg(Kill); -} - -void CInfoMessages::OnKillMessage(const CNetMsg_Sv_KillMsg *pMsg) -{ - CInfoMsg Kill = CreateInfoMsg(TYPE_KILL); - - Kill.m_TeamSize = 1; - Kill.m_aVictimIds[0] = pMsg->m_Victim; - Kill.m_VictimDDTeam = m_pClient->m_Teams.Team(Kill.m_aVictimIds[0]); - str_copy(Kill.m_aVictimName, m_pClient->m_aClients[Kill.m_aVictimIds[0]].m_aName); - Kill.m_aVictimRenderInfo[0] = m_pClient->m_aClients[Kill.m_aVictimIds[0]].m_RenderInfo; - - Kill.m_KillerId = pMsg->m_Killer; - str_copy(Kill.m_aKillerName, m_pClient->m_aClients[Kill.m_KillerId].m_aName); - Kill.m_KillerRenderInfo = m_pClient->m_aClients[Kill.m_KillerId].m_RenderInfo; - - Kill.m_Weapon = pMsg->m_Weapon; - Kill.m_ModeSpecial = pMsg->m_ModeSpecial; - Kill.m_FlagCarrierBlue = m_pClient->m_Snap.m_pGameDataObj ? m_pClient->m_Snap.m_pGameDataObj->m_FlagCarrierBlue : -1; - - AddInfoMsg(Kill); -} - -void CInfoMessages::OnRaceFinishMessage(const CNetMsg_Sv_RaceFinish *pMsg) -{ - CInfoMsg Finish = CreateInfoMsg(TYPE_FINISH); - - Finish.m_TeamSize = 1; - Finish.m_aVictimIds[0] = pMsg->m_ClientId; - Finish.m_VictimDDTeam = m_pClient->m_Teams.Team(Finish.m_aVictimIds[0]); - str_copy(Finish.m_aVictimName, m_pClient->m_aClients[Finish.m_aVictimIds[0]].m_aName); - Finish.m_aVictimRenderInfo[0] = m_pClient->m_aClients[pMsg->m_ClientId].m_RenderInfo; - - Finish.m_Diff = pMsg->m_Diff; - Finish.m_RecordPersonal = pMsg->m_RecordPersonal || pMsg->m_RecordServer; - if(Finish.m_Diff) - { - char aBuf[64]; - str_time_float(absolute(Finish.m_Diff) / 1000.0f, TIME_HOURS_CENTISECS, aBuf, sizeof(aBuf)); - str_format(Finish.m_aDiffText, sizeof(Finish.m_aDiffText), "(%c%s)", Finish.m_Diff < 0 ? '-' : '+', aBuf); - } - str_time_float(pMsg->m_Time / 1000.0f, TIME_HOURS_CENTISECS, Finish.m_aTimeText, sizeof(Finish.m_aTimeText)); - - AddInfoMsg(Finish); -} - -void CInfoMessages::RenderKillMsg(const CInfoMsg &InfoMsg, float x, float y) -{ - ColorRGBA TextColor; - if(InfoMsg.m_VictimDDTeam) - TextColor = m_pClient->GetDDTeamColor(InfoMsg.m_VictimDDTeam, 0.75f); - else - TextColor = TextRender()->DefaultTextColor(); - - // render victim name - if(InfoMsg.m_VictimTextContainerIndex.Valid()) - { - x -= TextRender()->GetBoundingBoxTextContainer(InfoMsg.m_VictimTextContainerIndex).m_W; - TextRender()->RenderTextContainer(InfoMsg.m_VictimTextContainerIndex, TextColor, TextRender()->DefaultTextOutlineColor(), x, y + (ROW_HEIGHT - FONT_SIZE) / 2.0f); - } - - // render victim flag - x -= 24.0f; - if(m_pClient->m_Snap.m_pGameInfoObj && (m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_FLAGS) && (InfoMsg.m_ModeSpecial & 1)) - { - int QuadOffset; - if(InfoMsg.m_aVictimIds[0] == InfoMsg.m_FlagCarrierBlue) - { - Graphics()->TextureSet(GameClient()->m_GameSkin.m_SpriteFlagBlue); - QuadOffset = 0; - } - else - { - Graphics()->TextureSet(GameClient()->m_GameSkin.m_SpriteFlagRed); - QuadOffset = 1; - } - Graphics()->RenderQuadContainerAsSprite(m_SpriteQuadContainerIndex, QuadOffset, x, y - 16); - } - - // render victim tees - for(int j = (InfoMsg.m_TeamSize - 1); j >= 0; j--) - { - if(InfoMsg.m_aVictimIds[j] < 0) - continue; - - vec2 OffsetToMid; - CRenderTools::GetRenderTeeOffsetToRenderedTee(CAnimState::GetIdle(), &InfoMsg.m_aVictimRenderInfo[j], OffsetToMid); - const vec2 TeeRenderPos = vec2(x, y + ROW_HEIGHT / 2.0f + OffsetToMid.y); - RenderTools()->RenderTee(CAnimState::GetIdle(), &InfoMsg.m_aVictimRenderInfo[j], EMOTE_PAIN, vec2(-1, 0), TeeRenderPos); - x -= 44.0f; - } - - // render weapon - x -= 32.0f; - if(InfoMsg.m_Weapon >= 0) - { - Graphics()->TextureSet(GameClient()->m_GameSkin.m_aSpriteWeapons[InfoMsg.m_Weapon]); - Graphics()->RenderQuadContainerAsSprite(m_SpriteQuadContainerIndex, 4 + InfoMsg.m_Weapon, x, y + 28); - } - x -= 52.0f; - - // render killer (only if different from victim) - if(InfoMsg.m_aVictimIds[0] != InfoMsg.m_KillerId) - { - // render killer flag - if(m_pClient->m_Snap.m_pGameInfoObj && (m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_FLAGS) && (InfoMsg.m_ModeSpecial & 2)) - { - int QuadOffset; - if(InfoMsg.m_KillerId == InfoMsg.m_FlagCarrierBlue) - { - Graphics()->TextureSet(GameClient()->m_GameSkin.m_SpriteFlagBlue); - QuadOffset = 2; - } - else - { - Graphics()->TextureSet(GameClient()->m_GameSkin.m_SpriteFlagRed); - QuadOffset = 3; - } - Graphics()->RenderQuadContainerAsSprite(m_SpriteQuadContainerIndex, QuadOffset, x - 56, y - 16); - } - - // render killer tee - x -= 24.0f; - if(InfoMsg.m_KillerId >= 0) - { - vec2 OffsetToMid; - CRenderTools::GetRenderTeeOffsetToRenderedTee(CAnimState::GetIdle(), &InfoMsg.m_KillerRenderInfo, OffsetToMid); - const vec2 TeeRenderPos = vec2(x, y + ROW_HEIGHT / 2.0f + OffsetToMid.y); - RenderTools()->RenderTee(CAnimState::GetIdle(), &InfoMsg.m_KillerRenderInfo, EMOTE_ANGRY, vec2(1, 0), TeeRenderPos); - } - x -= 32.0f; - - // render killer name - if(InfoMsg.m_KillerTextContainerIndex.Valid()) - { - x -= TextRender()->GetBoundingBoxTextContainer(InfoMsg.m_KillerTextContainerIndex).m_W; - TextRender()->RenderTextContainer(InfoMsg.m_KillerTextContainerIndex, TextColor, TextRender()->DefaultTextOutlineColor(), x, y + (ROW_HEIGHT - FONT_SIZE) / 2.0f); - } - } -} - -void CInfoMessages::RenderFinishMsg(const CInfoMsg &InfoMsg, float x, float y) -{ - // render time diff - if(InfoMsg.m_DiffTextContainerIndex.Valid()) - { - x -= TextRender()->GetBoundingBoxTextContainer(InfoMsg.m_DiffTextContainerIndex).m_W; - TextRender()->RenderTextContainer(InfoMsg.m_DiffTextContainerIndex, TextRender()->DefaultTextColor(), TextRender()->DefaultTextOutlineColor(), x, y + (ROW_HEIGHT - FONT_SIZE) / 2.0f); - } - - // render time - if(InfoMsg.m_TimeTextContainerIndex.Valid()) - { - x -= TextRender()->GetBoundingBoxTextContainer(InfoMsg.m_TimeTextContainerIndex).m_W; - TextRender()->RenderTextContainer(InfoMsg.m_TimeTextContainerIndex, TextRender()->DefaultTextColor(), TextRender()->DefaultTextOutlineColor(), x, y + (ROW_HEIGHT - FONT_SIZE) / 2.0f); - } - - // render flag - x -= RACE_FLAG_SIZE; - Graphics()->TextureSet(g_pData->m_aImages[IMAGE_RACEFLAG].m_Id); - Graphics()->RenderQuadContainerAsSprite(m_SpriteQuadContainerIndex, m_QuadOffsetRaceFlag, x, y); - - // render victim name - if(InfoMsg.m_VictimTextContainerIndex.Valid()) - { - x -= TextRender()->GetBoundingBoxTextContainer(InfoMsg.m_VictimTextContainerIndex).m_W; - ColorRGBA TextColor; - if(InfoMsg.m_VictimDDTeam) - TextColor = m_pClient->GetDDTeamColor(InfoMsg.m_VictimDDTeam, 0.75f); - else - TextColor = TextRender()->DefaultTextColor(); - TextRender()->RenderTextContainer(InfoMsg.m_VictimTextContainerIndex, TextColor, TextRender()->DefaultTextOutlineColor(), x, y + (ROW_HEIGHT - FONT_SIZE) / 2.0f); - } - - // render victim tee - x -= 24.0f; - vec2 OffsetToMid; - CRenderTools::GetRenderTeeOffsetToRenderedTee(CAnimState::GetIdle(), &InfoMsg.m_aVictimRenderInfo[0], OffsetToMid); - const vec2 TeeRenderPos = vec2(x, y + ROW_HEIGHT / 2.0f + OffsetToMid.y); - const int Emote = InfoMsg.m_RecordPersonal ? EMOTE_HAPPY : EMOTE_NORMAL; - RenderTools()->RenderTee(CAnimState::GetIdle(), &InfoMsg.m_aVictimRenderInfo[0], Emote, vec2(-1, 0), TeeRenderPos); -} - -void CInfoMessages::OnRender() -{ - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - const float Height = 1.5f * 400.0f * 3.0f; - const float Width = Height * Graphics()->ScreenAspect(); - - Graphics()->MapScreen(0, 0, Width, Height); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - - int Showfps = g_Config.m_ClShowfps; -#if defined(CONF_VIDEORECORDER) - if(IVideo::Current()) - Showfps = 0; -#endif - const float StartX = Width - 10.0f; - const float StartY = 30.0f + (Showfps ? 100.0f : 0.0f) + (g_Config.m_ClShowpred && Client()->State() != IClient::STATE_DEMOPLAYBACK ? 100.0f : 0.0f); - - float y = StartY; - for(int i = 1; i <= MAX_INFOMSGS; i++) - { - CInfoMsg &InfoMsg = m_aInfoMsgs[(m_InfoMsgCurrent + i) % MAX_INFOMSGS]; - if(Client()->GameTick(g_Config.m_ClDummy) > InfoMsg.m_Tick + Client()->GameTickSpeed() * 10) - continue; - - CreateTextContainersIfNotCreated(InfoMsg); - - if(InfoMsg.m_Type == EType::TYPE_KILL && g_Config.m_ClShowKillMessages) - { - RenderKillMsg(InfoMsg, StartX, y); - y += ROW_HEIGHT; - } - else if(InfoMsg.m_Type == EType::TYPE_FINISH && g_Config.m_ClShowFinishMessages) - { - RenderFinishMsg(InfoMsg, StartX, y); - y += ROW_HEIGHT; - } - } -} - -void CInfoMessages::OnRefreshSkins() -{ - for(auto &InfoMsg : m_aInfoMsgs) - { - InfoMsg.m_KillerRenderInfo.Reset(); - if(InfoMsg.m_KillerId >= 0) - { - const CGameClient::CClientData &Client = GameClient()->m_aClients[InfoMsg.m_KillerId]; - if(Client.m_Active && Client.m_aSkinName[0] != '\0') - InfoMsg.m_KillerRenderInfo = Client.m_RenderInfo; - else - InfoMsg.m_KillerId = -1; - } - - for(int i = 0; i < MAX_KILLMSG_TEAM_MEMBERS; i++) - { - InfoMsg.m_aVictimRenderInfo[i].Reset(); - if(InfoMsg.m_aVictimIds[i] >= 0) - { - const CGameClient::CClientData &Client = GameClient()->m_aClients[InfoMsg.m_aVictimIds[i]]; - if(Client.m_Active && Client.m_aSkinName[0] != '\0') - InfoMsg.m_aVictimRenderInfo[i] = Client.m_RenderInfo; - else - InfoMsg.m_aVictimIds[i] = -1; - } - } - } -} diff --git a/src/game/client/components/infomessages.h b/src/game/client/components/infomessages.h deleted file mode 100644 index 29540d00de..0000000000 --- a/src/game/client/components/infomessages.h +++ /dev/null @@ -1,81 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_INFOMESSAGES_H -#define GAME_CLIENT_COMPONENTS_INFOMESSAGES_H -#include -#include - -#include -class CInfoMessages : public CComponent -{ - int m_SpriteQuadContainerIndex = -1; - int m_QuadOffsetRaceFlag = -1; - - enum - { - MAX_INFOMSGS = 5, - MAX_KILLMSG_TEAM_MEMBERS = 4, - }; - - enum EType - { - TYPE_KILL, - TYPE_FINISH, - }; - - struct CInfoMsg - { - EType m_Type; - int m_Tick; - - int m_aVictimIds[MAX_KILLMSG_TEAM_MEMBERS]; - int m_VictimDDTeam; - char m_aVictimName[64]; - STextContainerIndex m_VictimTextContainerIndex; - CTeeRenderInfo m_aVictimRenderInfo[MAX_KILLMSG_TEAM_MEMBERS]; - int m_KillerId; - char m_aKillerName[64]; - STextContainerIndex m_KillerTextContainerIndex; - CTeeRenderInfo m_KillerRenderInfo; - - // kill msg - int m_Weapon; - int m_ModeSpecial; // for CTF, if the guy is carrying a flag for example - int m_FlagCarrierBlue; - int m_TeamSize; - - // finish msg - int m_Diff; - char m_aTimeText[32]; - char m_aDiffText[32]; - STextContainerIndex m_TimeTextContainerIndex; - STextContainerIndex m_DiffTextContainerIndex; - bool m_RecordPersonal; - }; - - CInfoMsg m_aInfoMsgs[MAX_INFOMSGS]; - int m_InfoMsgCurrent; - - CInfoMsg CreateInfoMsg(EType Type); - void AddInfoMsg(const CInfoMsg &InfoMsg); - void RenderKillMsg(const CInfoMsg &InfoMsg, float x, float y); - void RenderFinishMsg(const CInfoMsg &InfoMsg, float x, float y); - - void OnTeamKillMessage(const struct CNetMsg_Sv_KillMsgTeam *pMsg); - void OnKillMessage(const struct CNetMsg_Sv_KillMsg *pMsg); - void OnRaceFinishMessage(const struct CNetMsg_Sv_RaceFinish *pMsg); - - void CreateTextContainersIfNotCreated(CInfoMsg &InfoMsg); - void DeleteTextContainers(CInfoMsg &InfoMsg); - -public: - virtual int Sizeof() const override { return sizeof(*this); } - virtual void OnWindowResize() override; - virtual void OnRefreshSkins() override; - virtual void OnReset() override; - virtual void OnRender() override; - virtual void OnMessage(int MsgType, void *pRawMsg) override; - virtual void OnInit() override; -}; - -#endif diff --git a/src/game/client/components/items.cpp b/src/game/client/components/items.cpp deleted file mode 100644 index d58dea1827..0000000000 --- a/src/game/client/components/items.cpp +++ /dev/null @@ -1,661 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include -#include - -#include -#include - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -#include "items.h" - -void CItems::RenderProjectile(const CProjectileData *pCurrent, int ItemId) -{ - int CurWeapon = clamp(pCurrent->m_Type, 0, NUM_WEAPONS - 1); - - // get positions - float Curvature = 0; - float Speed = 0; - const CTuningParams *pTuning = GameClient()->GetTuning(pCurrent->m_TuneZone); - if(CurWeapon == WEAPON_GRENADE) - { - Curvature = pTuning->m_GrenadeCurvature; - Speed = pTuning->m_GrenadeSpeed; - } - else if(CurWeapon == WEAPON_SHOTGUN) - { - Curvature = pTuning->m_ShotgunCurvature; - Speed = pTuning->m_ShotgunSpeed; - } - else if(CurWeapon == WEAPON_GUN) - { - Curvature = pTuning->m_GunCurvature; - Speed = pTuning->m_GunSpeed; - } - - bool LocalPlayerInGame = false; - - if(m_pClient->m_Snap.m_pLocalInfo) - LocalPlayerInGame = m_pClient->m_aClients[m_pClient->m_Snap.m_pLocalInfo->m_ClientId].m_Team != TEAM_SPECTATORS; - - static float s_LastGameTickTime = Client()->GameTickTime(g_Config.m_ClDummy); - if(m_pClient->m_Snap.m_pGameInfoObj && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_PAUSED)) - s_LastGameTickTime = Client()->GameTickTime(g_Config.m_ClDummy); - - bool IsOtherTeam = (pCurrent->m_ExtraInfo && pCurrent->m_Owner >= 0 && m_pClient->IsOtherTeam(pCurrent->m_Owner)); - - float Ct; - if(m_pClient->Predict() && m_pClient->AntiPingGrenade() && LocalPlayerInGame && !IsOtherTeam) - Ct = ((float)(Client()->PredGameTick(g_Config.m_ClDummy) - 1 - pCurrent->m_StartTick) + Client()->PredIntraGameTick(g_Config.m_ClDummy)) / (float)Client()->GameTickSpeed(); - else - Ct = (Client()->PrevGameTick(g_Config.m_ClDummy) - pCurrent->m_StartTick) / (float)Client()->GameTickSpeed() + s_LastGameTickTime; - if(Ct < 0) - { - if(Ct > -s_LastGameTickTime / 2) - { - // Fixup the timing which might be screwed during demo playback because - // s_LastGameTickTime depends on the system timer, while the other part - // (Client()->PrevGameTick(g_Config.m_ClDummy) - pCurrent->m_StartTick) / (float)Client()->GameTickSpeed() - // is virtually constant (for projectiles fired on the current game tick): - // (x - (x+2)) / 50 = -0.04 - // - // We have a strict comparison for the passed time being more than the time between ticks - // if(CurtickStart > m_Info.m_CurrentTime) in CDemoPlayer::Update() - // so on the practice the typical value of s_LastGameTickTime varies from 0.02386 to 0.03999 - // which leads to Ct from -0.00001 to -0.01614. - // Round up those to 0.0 to fix missing rendering of the projectile. - Ct = 0; - } - else - { - return; // projectile haven't been shot yet - } - } - - vec2 Pos = CalcPos(pCurrent->m_StartPos, pCurrent->m_StartVel, Curvature, Speed, Ct); - vec2 PrevPos = CalcPos(pCurrent->m_StartPos, pCurrent->m_StartVel, Curvature, Speed, Ct - 0.001f); - - float Alpha = 1.f; - if(IsOtherTeam) - { - Alpha = g_Config.m_ClShowOthersAlpha / 100.0f; - } - - vec2 Vel = Pos - PrevPos; - - // add particle for this projectile - // don't check for validity of the projectile for the current weapon here, so particle effects are rendered for mod compatibility - if(CurWeapon == WEAPON_GRENADE) - { - m_pClient->m_Effects.SmokeTrail(Pos, Vel * -1, Alpha); - static float s_Time = 0.0f; - static float s_LastLocalTime = LocalTime(); - - if(Client()->State() == IClient::STATE_DEMOPLAYBACK) - { - const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); - if(!pInfo->m_Paused) - s_Time += (LocalTime() - s_LastLocalTime) * pInfo->m_Speed; - } - else - { - if(m_pClient->m_Snap.m_pGameInfoObj && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_PAUSED)) - s_Time += LocalTime() - s_LastLocalTime; - } - - Graphics()->QuadsSetRotation(s_Time * pi * 2 * 2 + ItemId); - s_LastLocalTime = LocalTime(); - } - else - { - m_pClient->m_Effects.BulletTrail(Pos, Alpha); - - if(length(Vel) > 0.00001f) - Graphics()->QuadsSetRotation(angle(Vel)); - else - Graphics()->QuadsSetRotation(0); - } - - if(GameClient()->m_GameSkin.m_aSpriteWeaponProjectiles[CurWeapon].IsValid()) - { - Graphics()->TextureSet(GameClient()->m_GameSkin.m_aSpriteWeaponProjectiles[CurWeapon]); - Graphics()->SetColor(1.f, 1.f, 1.f, Alpha); - Graphics()->RenderQuadContainerAsSprite(m_ItemsQuadContainerIndex, m_aProjectileOffset[CurWeapon], Pos.x, Pos.y); - } -} - -void CItems::RenderPickup(const CNetObj_Pickup *pPrev, const CNetObj_Pickup *pCurrent, bool IsPredicted) -{ - int CurWeapon = clamp(pCurrent->m_Subtype, 0, NUM_WEAPONS - 1); - int QuadOffset = 2; - float Angle = 0.0f; - float IntraTick = IsPredicted ? Client()->PredIntraGameTick(g_Config.m_ClDummy) : Client()->IntraGameTick(g_Config.m_ClDummy); - vec2 Pos = mix(vec2(pPrev->m_X, pPrev->m_Y), vec2(pCurrent->m_X, pCurrent->m_Y), IntraTick); - if(pCurrent->m_Type == POWERUP_HEALTH) - { - QuadOffset = m_PickupHealthOffset; - Graphics()->TextureSet(GameClient()->m_GameSkin.m_SpritePickupHealth); - } - else if(pCurrent->m_Type == POWERUP_ARMOR) - { - QuadOffset = m_PickupArmorOffset; - Graphics()->TextureSet(GameClient()->m_GameSkin.m_SpritePickupArmor); - } - else if(pCurrent->m_Type == POWERUP_WEAPON) - { - QuadOffset = m_aPickupWeaponOffset[CurWeapon]; - Graphics()->TextureSet(GameClient()->m_GameSkin.m_aSpritePickupWeapons[CurWeapon]); - } - else if(pCurrent->m_Type == POWERUP_NINJA) - { - QuadOffset = m_PickupNinjaOffset; - m_pClient->m_Effects.PowerupShine(Pos, vec2(96, 18), 1.0f); - Pos.x -= 10.0f; - Graphics()->TextureSet(GameClient()->m_GameSkin.m_SpritePickupNinja); - } - else if(pCurrent->m_Type >= POWERUP_ARMOR_SHOTGUN && pCurrent->m_Type <= POWERUP_ARMOR_LASER) - { - QuadOffset = m_aPickupWeaponArmorOffset[pCurrent->m_Type - POWERUP_ARMOR_SHOTGUN]; - Graphics()->TextureSet(GameClient()->m_GameSkin.m_aSpritePickupWeaponArmor[pCurrent->m_Type - POWERUP_ARMOR_SHOTGUN]); - } - Graphics()->QuadsSetRotation(0); - Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); - Graphics()->QuadsSetRotation(Angle); - - static float s_Time = 0.0f; - static float s_LastLocalTime = LocalTime(); - float Offset = Pos.y / 32.0f + Pos.x / 32.0f; - if(Client()->State() == IClient::STATE_DEMOPLAYBACK) - { - const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); - if(!pInfo->m_Paused) - s_Time += (LocalTime() - s_LastLocalTime) * pInfo->m_Speed; - } - else - { - if(m_pClient->m_Snap.m_pGameInfoObj && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_PAUSED)) - s_Time += LocalTime() - s_LastLocalTime; - } - Pos += direction(s_Time * 2.0f + Offset) * 2.5f; - s_LastLocalTime = LocalTime(); - - Graphics()->RenderQuadContainerAsSprite(m_ItemsQuadContainerIndex, QuadOffset, Pos.x, Pos.y); -} - -void CItems::RenderFlag(const CNetObj_Flag *pPrev, const CNetObj_Flag *pCurrent, const CNetObj_GameData *pPrevGameData, const CNetObj_GameData *pCurGameData) -{ - float Angle = 0.0f; - float Size = 42.0f; - - if(pCurrent->m_Team == TEAM_RED) - Graphics()->TextureSet(GameClient()->m_GameSkin.m_SpriteFlagRed); - else - Graphics()->TextureSet(GameClient()->m_GameSkin.m_SpriteFlagBlue); - Graphics()->QuadsSetRotation(0); - Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); - int QuadOffset; - if(pCurrent->m_Team == TEAM_RED) - { - QuadOffset = m_RedFlagOffset; - } - else - { - QuadOffset = m_BlueFlagOffset; - } - - Graphics()->QuadsSetRotation(Angle); - - vec2 Pos = mix(vec2(pPrev->m_X, pPrev->m_Y), vec2(pCurrent->m_X, pCurrent->m_Y), Client()->IntraGameTick(g_Config.m_ClDummy)); - - if(pCurGameData) - { - int FlagCarrier = (pCurrent->m_Team == TEAM_RED) ? pCurGameData->m_FlagCarrierRed : pCurGameData->m_FlagCarrierBlue; - // use the flagcarriers position if available - if(FlagCarrier >= 0 && m_pClient->m_Snap.m_aCharacters[FlagCarrier].m_Active) - Pos = m_pClient->m_aClients[FlagCarrier].m_RenderPos; - - // make sure that the flag isn't interpolated between capture and return - if(pPrevGameData && - ((pCurrent->m_Team == TEAM_RED && pPrevGameData->m_FlagCarrierRed != pCurGameData->m_FlagCarrierRed) || - (pCurrent->m_Team == TEAM_BLUE && pPrevGameData->m_FlagCarrierBlue != pCurGameData->m_FlagCarrierBlue))) - Pos = vec2(pCurrent->m_X, pCurrent->m_Y); - } - - Graphics()->RenderQuadContainerAsSprite(m_ItemsQuadContainerIndex, QuadOffset, Pos.x, Pos.y - Size * 0.75f); -} - -void CItems::RenderLaser(const CLaserData *pCurrent, bool IsPredicted) -{ - int Type = clamp(pCurrent->m_Type, -1, NUM_LASERTYPES - 1); - - ColorRGBA RGB; - vec2 Pos = pCurrent->m_To; - vec2 From = pCurrent->m_From; - float Len = distance(Pos, From); - - int ColorIn, ColorOut; - switch(Type) - { - case LASERTYPE_RIFLE: - ColorOut = g_Config.m_ClLaserRifleOutlineColor; - ColorIn = g_Config.m_ClLaserRifleInnerColor; - break; - case LASERTYPE_SHOTGUN: - ColorOut = g_Config.m_ClLaserShotgunOutlineColor; - ColorIn = g_Config.m_ClLaserShotgunInnerColor; - break; - case LASERTYPE_DRAGGER: - case LASERTYPE_DOOR: - ColorOut = g_Config.m_ClLaserDoorOutlineColor; - ColorIn = g_Config.m_ClLaserDoorInnerColor; - break; - case LASERTYPE_FREEZE: - ColorOut = g_Config.m_ClLaserFreezeOutlineColor; - ColorIn = g_Config.m_ClLaserFreezeInnerColor; - break; - case LASERTYPE_GUN: - case LASERTYPE_PLASMA: - if(pCurrent->m_Subtype == LASERGUNTYPE_FREEZE || pCurrent->m_Subtype == LASERGUNTYPE_EXPFREEZE) - { - ColorOut = g_Config.m_ClLaserFreezeOutlineColor; - ColorIn = g_Config.m_ClLaserFreezeInnerColor; - } - else - { - ColorOut = g_Config.m_ClLaserRifleOutlineColor; - ColorIn = g_Config.m_ClLaserRifleInnerColor; - } - break; - default: - ColorOut = g_Config.m_ClLaserRifleOutlineColor; - ColorIn = g_Config.m_ClLaserRifleInnerColor; - } - - RGB = color_cast(ColorHSLA(ColorOut)); - ColorRGBA OuterColor(RGB.r, RGB.g, RGB.b, 1.0f); - RGB = color_cast(ColorHSLA(ColorIn)); - ColorRGBA InnerColor(RGB.r, RGB.g, RGB.b, 1.0f); - - int TuneZone = GameClient()->m_GameWorld.m_WorldConfig.m_UseTuneZones ? Collision()->IsTune(Collision()->GetMapIndex(From)) : 0; - bool IsOtherTeam = (pCurrent->m_ExtraInfo && pCurrent->m_Owner >= 0 && m_pClient->IsOtherTeam(pCurrent->m_Owner)); - - float Alpha = 1.f; - if(IsOtherTeam) - { - Alpha = g_Config.m_ClShowOthersAlpha / 100.0f; - } - - vec2 Dir; - if(Len > 0) - { - Dir = normalize_pre_length(Pos - From, Len); - - float Ticks; - if(IsPredicted) - Ticks = (float)(Client()->PredGameTick(g_Config.m_ClDummy) - pCurrent->m_StartTick) + Client()->PredIntraGameTick(g_Config.m_ClDummy); - else - Ticks = (float)(Client()->GameTick(g_Config.m_ClDummy) - pCurrent->m_StartTick) + Client()->IntraGameTick(g_Config.m_ClDummy); - float Ms = (Ticks / Client()->GameTickSpeed()) * 1000.0f; - float a = Ms / m_pClient->GetTuning(TuneZone)->m_LaserBounceDelay; - a = clamp(a, 0.0f, 1.0f); - float Ia = 1 - a; - - vec2 Out; - - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - - // do outline - Graphics()->SetColor(OuterColor.r, OuterColor.g, OuterColor.b, Alpha); - Out = vec2(Dir.y, -Dir.x) * (7.0f * Ia); - - IGraphics::CFreeformItem Freeform( - From.x - Out.x, From.y - Out.y, - From.x + Out.x, From.y + Out.y, - Pos.x - Out.x, Pos.y - Out.y, - Pos.x + Out.x, Pos.y + Out.y); - Graphics()->QuadsDrawFreeform(&Freeform, 1); - - // do inner - Out = vec2(Dir.y, -Dir.x) * (5.0f * Ia); - Graphics()->SetColor(InnerColor.r, InnerColor.g, InnerColor.b, Alpha); // center - - Freeform = IGraphics::CFreeformItem( - From.x - Out.x, From.y - Out.y, - From.x + Out.x, From.y + Out.y, - Pos.x - Out.x, Pos.y - Out.y, - Pos.x + Out.x, Pos.y + Out.y); - Graphics()->QuadsDrawFreeform(&Freeform, 1); - - Graphics()->QuadsEnd(); - } - - // render head - { - int CurParticle = (Client()->GameTick(g_Config.m_ClDummy) % 3); - Graphics()->TextureSet(GameClient()->m_ParticlesSkin.m_aSpriteParticleSplat[CurParticle]); - Graphics()->QuadsSetRotation(Client()->GameTick(g_Config.m_ClDummy)); - Graphics()->SetColor(OuterColor.r, OuterColor.g, OuterColor.b, Alpha); - Graphics()->RenderQuadContainerAsSprite(m_ItemsQuadContainerIndex, m_aParticleSplatOffset[CurParticle], Pos.x, Pos.y); - Graphics()->SetColor(InnerColor.r, InnerColor.g, InnerColor.b, Alpha); - Graphics()->RenderQuadContainerAsSprite(m_ItemsQuadContainerIndex, m_aParticleSplatOffset[CurParticle], Pos.x, Pos.y, 20.f / 24.f, 20.f / 24.f); - } -} - -void CItems::OnRender() -{ - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - bool IsSuper = m_pClient->IsLocalCharSuper(); - int Ticks = Client()->GameTick(g_Config.m_ClDummy) % Client()->GameTickSpeed(); - bool BlinkingPickup = (Ticks % 22) < 4; - bool BlinkingGun = (Ticks % 22) < 4; - bool BlinkingDragger = (Ticks % 22) < 4; - bool BlinkingProj = (Ticks % 20) < 2; - bool BlinkingProjEx = (Ticks % 6) < 2; - bool BlinkingLight = (Ticks % 6) < 2; - int SwitcherTeam = m_pClient->SwitchStateTeam(); - int DraggerStartTick = maximum((Client()->GameTick(g_Config.m_ClDummy) / 7) * 7, Client()->GameTick(g_Config.m_ClDummy) - 4); - int GunStartTick = (Client()->GameTick(g_Config.m_ClDummy) / 7) * 7; - - bool UsePredicted = GameClient()->Predict() && GameClient()->AntiPingGunfire(); - auto &aSwitchers = GameClient()->Switchers(); - if(UsePredicted) - { - for(auto *pProj = (CProjectile *)GameClient()->m_PredictedWorld.FindFirst(CGameWorld::ENTTYPE_PROJECTILE); pProj; pProj = (CProjectile *)pProj->NextEntity()) - { - if(!IsSuper && pProj->m_Number > 0 && pProj->m_Number < (int)aSwitchers.size() && !aSwitchers[pProj->m_Number].m_aStatus[SwitcherTeam] && (pProj->m_Explosive ? BlinkingProjEx : BlinkingProj)) - continue; - - CProjectileData Data = pProj->GetData(); - RenderProjectile(&Data, pProj->GetId()); - } - for(CEntity *pEnt = GameClient()->m_PredictedWorld.FindFirst(CGameWorld::ENTTYPE_LASER); pEnt; pEnt = pEnt->NextEntity()) - { - auto *const pLaser = dynamic_cast(pEnt); - if(!pLaser || pLaser->GetOwner() < 0 || !GameClient()->m_aClients[pLaser->GetOwner()].m_IsPredictedLocal) - continue; - CLaserData Data = pLaser->GetData(); - RenderLaser(&Data, true); - } - for(auto *pPickup = (CPickup *)GameClient()->m_PredictedWorld.FindFirst(CGameWorld::ENTTYPE_PICKUP); pPickup; pPickup = (CPickup *)pPickup->NextEntity()) - { - if(!IsSuper && pPickup->m_Layer == LAYER_SWITCH && pPickup->m_Number > 0 && pPickup->m_Number < (int)aSwitchers.size() && !aSwitchers[pPickup->m_Number].m_aStatus[SwitcherTeam] && BlinkingPickup) - continue; - - if(pPickup->InDDNetTile()) - { - if(auto *pPrev = (CPickup *)GameClient()->m_PrevPredictedWorld.GetEntity(pPickup->GetId(), CGameWorld::ENTTYPE_PICKUP)) - { - CNetObj_Pickup Data, Prev; - pPickup->FillInfo(&Data); - pPrev->FillInfo(&Prev); - RenderPickup(&Prev, &Data, true); - } - } - } - } - - for(const CSnapEntities &Ent : m_pClient->SnapEntities()) - { - const IClient::CSnapItem Item = Ent.m_Item; - const void *pData = Item.m_pData; - const CNetObj_EntityEx *pEntEx = Ent.m_pDataEx; - - if(Item.m_Type == NETOBJTYPE_PROJECTILE || Item.m_Type == NETOBJTYPE_DDRACEPROJECTILE || Item.m_Type == NETOBJTYPE_DDNETPROJECTILE) - { - CProjectileData Data = ExtractProjectileInfo(Item.m_Type, pData, &GameClient()->m_GameWorld, pEntEx); - bool Inactive = !IsSuper && Data.m_SwitchNumber > 0 && Data.m_SwitchNumber < (int)aSwitchers.size() && !aSwitchers[Data.m_SwitchNumber].m_aStatus[SwitcherTeam]; - if(Inactive && (Data.m_Explosive ? BlinkingProjEx : BlinkingProj)) - continue; - if(UsePredicted) - - { - if(auto *pProj = (CProjectile *)GameClient()->m_GameWorld.FindMatch(Item.m_Id, Item.m_Type, pData)) - { - bool IsOtherTeam = m_pClient->IsOtherTeam(pProj->GetOwner()); - if(pProj->m_LastRenderTick <= 0 && (pProj->m_Type != WEAPON_SHOTGUN || (!pProj->m_Freeze && !pProj->m_Explosive)) // skip ddrace shotgun bullets - && (pProj->m_Type == WEAPON_SHOTGUN || absolute(length(pProj->m_Direction) - 1.f) < 0.02f) // workaround to skip grenades on ball mod - && (pProj->GetOwner() < 0 || !GameClient()->m_aClients[pProj->GetOwner()].m_IsPredictedLocal || IsOtherTeam) // skip locally predicted projectiles - && !Client()->SnapFindItem(IClient::SNAP_PREV, Item.m_Type, Item.m_Id)) - { - ReconstructSmokeTrail(&Data, pProj->m_DestroyTick); - } - pProj->m_LastRenderTick = Client()->GameTick(g_Config.m_ClDummy); - if(!IsOtherTeam) - continue; - } - } - RenderProjectile(&Data, Item.m_Id); - } - else if(Item.m_Type == NETOBJTYPE_PICKUP || Item.m_Type == NETOBJTYPE_DDNETPICKUP) - { - CPickupData Data = ExtractPickupInfo(Item.m_Type, pData, pEntEx); - bool Inactive = !IsSuper && Data.m_SwitchNumber > 0 && Data.m_SwitchNumber < (int)aSwitchers.size() && !aSwitchers[Data.m_SwitchNumber].m_aStatus[SwitcherTeam]; - - if(Inactive && BlinkingPickup) - continue; - if(UsePredicted) - { - auto *pPickup = (CPickup *)GameClient()->m_GameWorld.FindMatch(Item.m_Id, Item.m_Type, pData); - if(pPickup && pPickup->InDDNetTile()) - continue; - } - const void *pPrev = Client()->SnapFindItem(IClient::SNAP_PREV, Item.m_Type, Item.m_Id); - if(pPrev) - RenderPickup((const CNetObj_Pickup *)pPrev, (const CNetObj_Pickup *)pData); - } - else if(Item.m_Type == NETOBJTYPE_LASER || Item.m_Type == NETOBJTYPE_DDNETLASER) - { - if(UsePredicted) - { - auto *pLaser = dynamic_cast(GameClient()->m_GameWorld.FindMatch(Item.m_Id, Item.m_Type, pData)); - if(pLaser && pLaser->GetOwner() >= 0 && GameClient()->m_aClients[pLaser->GetOwner()].m_IsPredictedLocal) - continue; - } - - CLaserData Data = ExtractLaserInfo(Item.m_Type, pData, &GameClient()->m_GameWorld, pEntEx); - bool Inactive = !IsSuper && Data.m_SwitchNumber > 0 && Data.m_SwitchNumber < (int)aSwitchers.size() && !aSwitchers[Data.m_SwitchNumber].m_aStatus[SwitcherTeam]; - - bool IsEntBlink = false; - int EntStartTick = -1; - if(Data.m_Type == LASERTYPE_FREEZE) - { - IsEntBlink = BlinkingLight; - EntStartTick = DraggerStartTick; - } - else if(Data.m_Type == LASERTYPE_GUN) - { - IsEntBlink = BlinkingGun; - EntStartTick = GunStartTick; - } - else if(Data.m_Type == LASERTYPE_DRAGGER) - { - IsEntBlink = BlinkingDragger; - EntStartTick = DraggerStartTick; - } - else if(Data.m_Type == LASERTYPE_DOOR) - { - if(Data.m_Predict && (Inactive || IsSuper)) - { - Data.m_From.x = Data.m_To.x; - Data.m_From.y = Data.m_To.y; - } - EntStartTick = Client()->GameTick(g_Config.m_ClDummy); - } - else - { - IsEntBlink = BlinkingDragger; - EntStartTick = Client()->GameTick(g_Config.m_ClDummy); - } - - if(Data.m_Predict && Inactive && IsEntBlink) - { - continue; - } - - if(Data.m_StartTick <= 0 && EntStartTick != -1) - { - Data.m_StartTick = EntStartTick; - } - - RenderLaser(&Data); - } - } - - int Num = Client()->SnapNumItems(IClient::SNAP_CURRENT); - - // render flag - for(int i = 0; i < Num; i++) - { - const IClient::CSnapItem Item = Client()->SnapGetItem(IClient::SNAP_CURRENT, i); - - if(Item.m_Type == NETOBJTYPE_FLAG) - { - const void *pPrev = Client()->SnapFindItem(IClient::SNAP_PREV, Item.m_Type, Item.m_Id); - if(pPrev) - { - const void *pPrevGameData = Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_GAMEDATA, m_pClient->m_Snap.m_GameDataSnapId); - RenderFlag(static_cast(pPrev), static_cast(Item.m_pData), - static_cast(pPrevGameData), m_pClient->m_Snap.m_pGameDataObj); - } - } - } - - Graphics()->QuadsSetRotation(0); - Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); -} - -void CItems::OnInit() -{ - Graphics()->QuadsSetRotation(0); - Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); - - m_ItemsQuadContainerIndex = Graphics()->CreateQuadContainer(false); - - Graphics()->QuadsSetSubset(0, 0, 1, 1); - m_RedFlagOffset = RenderTools()->QuadContainerAddSprite(m_ItemsQuadContainerIndex, -21.f, -42.f, 42.f, 84.f); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - m_BlueFlagOffset = RenderTools()->QuadContainerAddSprite(m_ItemsQuadContainerIndex, -21.f, -42.f, 42.f, 84.f); - - float ScaleX, ScaleY; - RenderTools()->GetSpriteScale(SPRITE_PICKUP_HEALTH, ScaleX, ScaleY); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - m_PickupHealthOffset = RenderTools()->QuadContainerAddSprite(m_ItemsQuadContainerIndex, 64.f * ScaleX, 64.f * ScaleY); - RenderTools()->GetSpriteScale(SPRITE_PICKUP_ARMOR, ScaleX, ScaleY); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - m_PickupArmorOffset = RenderTools()->QuadContainerAddSprite(m_ItemsQuadContainerIndex, 64.f * ScaleX, 64.f * ScaleY); - - for(int i = 0; i < NUM_WEAPONS; ++i) - { - RenderTools()->GetSpriteScale(g_pData->m_Weapons.m_aId[i].m_pSpriteBody, ScaleX, ScaleY); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - m_aPickupWeaponOffset[i] = RenderTools()->QuadContainerAddSprite(m_ItemsQuadContainerIndex, g_pData->m_Weapons.m_aId[i].m_VisualSize * ScaleX, g_pData->m_Weapons.m_aId[i].m_VisualSize * ScaleY); - } - RenderTools()->GetSpriteScale(SPRITE_PICKUP_NINJA, ScaleX, ScaleY); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - m_PickupNinjaOffset = RenderTools()->QuadContainerAddSprite(m_ItemsQuadContainerIndex, 128.f * ScaleX, 128.f * ScaleY); - - for(int i = 0; i < 4; i++) - { - RenderTools()->GetSpriteScale(SPRITE_PICKUP_ARMOR_SHOTGUN + i, ScaleX, ScaleY); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - m_aPickupWeaponArmorOffset[i] = RenderTools()->QuadContainerAddSprite(m_ItemsQuadContainerIndex, 64.f * ScaleX, 64.f * ScaleY); - } - - for(int &ProjectileOffset : m_aProjectileOffset) - { - Graphics()->QuadsSetSubset(0, 0, 1, 1); - ProjectileOffset = RenderTools()->QuadContainerAddSprite(m_ItemsQuadContainerIndex, 32.f); - } - - for(int &ParticleSplatOffset : m_aParticleSplatOffset) - { - Graphics()->QuadsSetSubset(0, 0, 1, 1); - ParticleSplatOffset = RenderTools()->QuadContainerAddSprite(m_ItemsQuadContainerIndex, 24.f); - } - - Graphics()->QuadContainerUpload(m_ItemsQuadContainerIndex); -} - -void CItems::ReconstructSmokeTrail(const CProjectileData *pCurrent, int DestroyTick) -{ - bool LocalPlayerInGame = false; - - if(m_pClient->m_Snap.m_pLocalInfo) - LocalPlayerInGame = m_pClient->m_aClients[m_pClient->m_Snap.m_pLocalInfo->m_ClientId].m_Team != TEAM_SPECTATORS; - if(!m_pClient->AntiPingGunfire() || !LocalPlayerInGame) - return; - if(Client()->PredGameTick(g_Config.m_ClDummy) == pCurrent->m_StartTick) - return; - - // get positions - float Curvature = 0; - float Speed = 0; - const CTuningParams *pTuning = GameClient()->GetTuning(pCurrent->m_TuneZone); - - if(pCurrent->m_Type == WEAPON_GRENADE) - { - Curvature = pTuning->m_GrenadeCurvature; - Speed = pTuning->m_GrenadeSpeed; - } - else if(pCurrent->m_Type == WEAPON_SHOTGUN) - { - Curvature = pTuning->m_ShotgunCurvature; - Speed = pTuning->m_ShotgunSpeed; - } - else if(pCurrent->m_Type == WEAPON_GUN) - { - Curvature = pTuning->m_GunCurvature; - Speed = pTuning->m_GunSpeed; - } - - float Pt = ((float)(Client()->PredGameTick(g_Config.m_ClDummy) - pCurrent->m_StartTick) + Client()->PredIntraGameTick(g_Config.m_ClDummy)) / (float)Client()->GameTickSpeed(); - if(Pt < 0) - return; // projectile haven't been shot yet - - float Gt = (Client()->PrevGameTick(g_Config.m_ClDummy) - pCurrent->m_StartTick) / (float)Client()->GameTickSpeed() + Client()->GameTickTime(g_Config.m_ClDummy); - - float Alpha = 1.f; - if(pCurrent->m_ExtraInfo && pCurrent->m_Owner >= 0 && m_pClient->IsOtherTeam(pCurrent->m_Owner)) - { - Alpha = g_Config.m_ClShowOthersAlpha / 100.0f; - } - - float T = Pt; - if(DestroyTick >= 0) - T = minimum(Pt, ((float)(DestroyTick - 1 - pCurrent->m_StartTick) + Client()->PredIntraGameTick(g_Config.m_ClDummy)) / (float)Client()->GameTickSpeed()); - - float MinTrailSpan = 0.4f * ((pCurrent->m_Type == WEAPON_GRENADE) ? 0.5f : 0.25f); - float Step = maximum(Client()->FrameTimeAvg(), (pCurrent->m_Type == WEAPON_GRENADE) ? 0.02f : 0.01f); - for(int i = 1 + (int)(Gt / Step); i < (int)(T / Step); i++) - { - float t = Step * (float)i + 0.4f * Step * random_float(-0.5f, 0.5f); - vec2 Pos = CalcPos(pCurrent->m_StartPos, pCurrent->m_StartVel, Curvature, Speed, t); - vec2 PrevPos = CalcPos(pCurrent->m_StartPos, pCurrent->m_StartVel, Curvature, Speed, t - 0.001f); - vec2 Vel = Pos - PrevPos; - float TimePassed = Pt - t; - if(Pt - MinTrailSpan > 0.01f) - TimePassed = minimum(TimePassed, (TimePassed - MinTrailSpan) / (Pt - MinTrailSpan) * (MinTrailSpan * 0.5f) + MinTrailSpan); - // add particle for this projectile - if(pCurrent->m_Type == WEAPON_GRENADE) - m_pClient->m_Effects.SmokeTrail(Pos, Vel * -1, Alpha, TimePassed); - else - m_pClient->m_Effects.BulletTrail(Pos, Alpha, TimePassed); - } -} diff --git a/src/game/client/components/items.h b/src/game/client/components/items.h deleted file mode 100644 index b9d4a5664a..0000000000 --- a/src/game/client/components/items.h +++ /dev/null @@ -1,39 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_ITEMS_H -#define GAME_CLIENT_COMPONENTS_ITEMS_H -#include -#include - -class CProjectileData; -class CLaserData; - -class CItems : public CComponent -{ - void RenderProjectile(const CProjectileData *pCurrent, int ItemId); - void RenderPickup(const CNetObj_Pickup *pPrev, const CNetObj_Pickup *pCurrent, bool IsPredicted = false); - void RenderFlag(const CNetObj_Flag *pPrev, const CNetObj_Flag *pCurrent, const CNetObj_GameData *pPrevGameData, const CNetObj_GameData *pCurGameData); - void RenderLaser(const CLaserData *pCurrent, bool IsPredicted = false); - - int m_ItemsQuadContainerIndex; - -public: - virtual int Sizeof() const override { return sizeof(*this); } - virtual void OnRender() override; - virtual void OnInit() override; - - void ReconstructSmokeTrail(const CProjectileData *pCurrent, int DestroyTick); - -private: - int m_BlueFlagOffset; - int m_RedFlagOffset; - int m_PickupHealthOffset; - int m_PickupArmorOffset; - int m_aPickupWeaponOffset[NUM_WEAPONS]; - int m_PickupNinjaOffset; - int m_aPickupWeaponArmorOffset[4]; - int m_aProjectileOffset[NUM_WEAPONS]; - int m_aParticleSplatOffset[3]; -}; - -#endif diff --git a/src/game/client/components/mapimages.cpp b/src/game/client/components/mapimages.cpp deleted file mode 100644 index 51c143a0a8..0000000000 --- a/src/game/client/components/mapimages.cpp +++ /dev/null @@ -1,481 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include "mapimages.h" - -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -const char *const gs_apModEntitiesNames[] = { - "ddnet", - "ddrace", - "race", - "blockworlds", - "fng", - "vanilla", - "f-ddrace", -}; - -CMapImages::CMapImages() -{ - m_Count = 0; - mem_zero(m_aEntitiesIsLoaded, sizeof(m_aEntitiesIsLoaded)); - m_SpeedupArrowIsLoaded = false; - - str_copy(m_aEntitiesPath, "editor/entities_clear"); - - static_assert(std::size(gs_apModEntitiesNames) == MAP_IMAGE_MOD_TYPE_COUNT, "Mod name string count is not equal to mod type count"); -} - -void CMapImages::OnInit() -{ - m_TextureScale = g_Config.m_ClTextEntitiesSize; - InitOverlayTextures(); - - if(str_comp(g_Config.m_ClAssetsEntities, "default") == 0) - str_copy(m_aEntitiesPath, "editor/entities_clear"); - else - { - str_format(m_aEntitiesPath, sizeof(m_aEntitiesPath), "assets/entities/%s", g_Config.m_ClAssetsEntities); - } - - Console()->Chain("cl_text_entities_size", ConchainClTextEntitiesSize, this); -} - -void CMapImages::OnMapLoadImpl(class CLayers *pLayers, IMap *pMap) -{ - // unload all textures - for(int i = 0; i < m_Count; i++) - { - Graphics()->UnloadTexture(&m_aTextures[i]); - } - - int Start; - pMap->GetType(MAPITEMTYPE_IMAGE, &Start, &m_Count); - m_Count = clamp(m_Count, 0, MAX_MAPIMAGES); - - unsigned char aTextureUsedByTileOrQuadLayerFlag[MAX_MAPIMAGES] = {0}; // 0: nothing, 1(as flag): tile layer, 2(as flag): quad layer - for(int GroupIndex = 0; GroupIndex < pLayers->NumGroups(); GroupIndex++) - { - const CMapItemGroup *pGroup = pLayers->GetGroup(GroupIndex); - if(!pGroup) - { - continue; - } - - for(int LayerIndex = 0; LayerIndex < pGroup->m_NumLayers; LayerIndex++) - { - const CMapItemLayer *pLayer = pLayers->GetLayer(pGroup->m_StartLayer + LayerIndex); - if(!pLayer) - { - continue; - } - - if(pLayer->m_Type == LAYERTYPE_TILES) - { - const CMapItemLayerTilemap *pLayerTilemap = reinterpret_cast(pLayer); - if(pLayerTilemap->m_Image >= 0 && pLayerTilemap->m_Image < m_Count) - { - aTextureUsedByTileOrQuadLayerFlag[pLayerTilemap->m_Image] |= 1; - } - } - else if(pLayer->m_Type == LAYERTYPE_QUADS) - { - const CMapItemLayerQuads *pLayerQuads = reinterpret_cast(pLayer); - if(pLayerQuads->m_Image >= 0 && pLayerQuads->m_Image < m_Count) - { - aTextureUsedByTileOrQuadLayerFlag[pLayerQuads->m_Image] |= 2; - } - } - } - } - - const int TextureLoadFlag = Graphics()->Uses2DTextureArrays() ? IGraphics::TEXLOAD_TO_2D_ARRAY_TEXTURE : IGraphics::TEXLOAD_TO_3D_TEXTURE; - - // load new textures - bool ShowWarning = false; - for(int i = 0; i < m_Count; i++) - { - if(aTextureUsedByTileOrQuadLayerFlag[i] == 0) - { - // skip loading unused images - continue; - } - - const int LoadFlag = (((aTextureUsedByTileOrQuadLayerFlag[i] & 1) != 0) ? TextureLoadFlag : 0) | (((aTextureUsedByTileOrQuadLayerFlag[i] & 2) != 0) ? 0 : (Graphics()->HasTextureArraysSupport() ? IGraphics::TEXLOAD_NO_2D_TEXTURE : 0)); - const CMapItemImage_v2 *pImg = static_cast(pMap->GetItem(Start + i)); - - const char *pName = pMap->GetDataString(pImg->m_ImageName); - if(pName == nullptr || pName[0] == '\0') - { - if(pImg->m_External) - { - log_error("mapimages", "Failed to load map image %d: failed to load name.", i); - ShowWarning = true; - continue; - } - pName = "(error)"; - } - - if(pImg->m_Version > 1 && pImg->m_MustBe1 != 1) - { - log_error("mapimages", "Failed to load map image %d '%s': invalid map image type.", i, pName); - ShowWarning = true; - continue; - } - - if(pImg->m_External) - { - char aPath[IO_MAX_PATH_LENGTH]; - bool Translated = false; - if(Client()->IsSixup()) - { - Translated = - !str_comp(pName, "grass_doodads") || - !str_comp(pName, "grass_main") || - !str_comp(pName, "winter_main") || - !str_comp(pName, "generic_unhookable"); - } - str_format(aPath, sizeof(aPath), "mapres/%s%s.png", pName, Translated ? "_0.7" : ""); - m_aTextures[i] = Graphics()->LoadTexture(aPath, IStorage::TYPE_ALL, LoadFlag); - } - else - { - CImageInfo ImageInfo; - ImageInfo.m_Width = pImg->m_Width; - ImageInfo.m_Height = pImg->m_Height; - ImageInfo.m_Format = CImageInfo::FORMAT_RGBA; - ImageInfo.m_pData = static_cast(pMap->GetData(pImg->m_ImageData)); - if(ImageInfo.m_pData && (size_t)pMap->GetDataSize(pImg->m_ImageData) >= ImageInfo.DataSize()) - { - char aTexName[IO_MAX_PATH_LENGTH]; - str_format(aTexName, sizeof(aTexName), "embedded: %s", pName); - m_aTextures[i] = Graphics()->LoadTextureRaw(ImageInfo, LoadFlag, aTexName); - pMap->UnloadData(pImg->m_ImageData); - } - else - { - pMap->UnloadData(pImg->m_ImageData); - log_error("mapimages", "Failed to load map image %d: failed to load data.", i); - ShowWarning = true; - continue; - } - } - pMap->UnloadData(pImg->m_ImageName); - ShowWarning = ShowWarning || m_aTextures[i].IsNullTexture(); - } - if(ShowWarning) - { - Client()->AddWarning(SWarning(Localize("Some map images could not be loaded. Check the local console for details."))); - } -} - -void CMapImages::OnMapLoad() -{ - IMap *pMap = Kernel()->RequestInterface(); - CLayers *pLayers = m_pClient->Layers(); - OnMapLoadImpl(pLayers, pMap); -} - -void CMapImages::LoadBackground(class CLayers *pLayers, class IMap *pMap) -{ - OnMapLoadImpl(pLayers, pMap); -} - -static EMapImageModType GetEntitiesModType(const CGameInfo &GameInfo) -{ - if(GameInfo.m_EntitiesFDDrace) - return MAP_IMAGE_MOD_TYPE_FDDRACE; - else if(GameInfo.m_EntitiesDDNet) - return MAP_IMAGE_MOD_TYPE_DDNET; - else if(GameInfo.m_EntitiesDDRace) - return MAP_IMAGE_MOD_TYPE_DDRACE; - else if(GameInfo.m_EntitiesRace) - return MAP_IMAGE_MOD_TYPE_RACE; - else if(GameInfo.m_EntitiesBW) - return MAP_IMAGE_MOD_TYPE_BLOCKWORLDS; - else if(GameInfo.m_EntitiesFNG) - return MAP_IMAGE_MOD_TYPE_FNG; - else if(GameInfo.m_EntitiesVanilla) - return MAP_IMAGE_MOD_TYPE_VANILLA; - else - return MAP_IMAGE_MOD_TYPE_DDNET; -} - -static bool IsValidTile(int LayerType, bool EntitiesAreMasked, EMapImageModType EntitiesModType, int TileIndex) -{ - if(TileIndex == TILE_AIR) - return false; - if(!EntitiesAreMasked) - return true; - - if(EntitiesModType == MAP_IMAGE_MOD_TYPE_DDNET || EntitiesModType == MAP_IMAGE_MOD_TYPE_DDRACE) - { - if(EntitiesModType == MAP_IMAGE_MOD_TYPE_DDNET || TileIndex != TILE_BOOST) - { - if(LayerType == MAP_IMAGE_ENTITY_LAYER_TYPE_ALL_EXCEPT_SWITCH && - !IsValidGameTile(TileIndex) && - !IsValidFrontTile(TileIndex) && - !IsValidSpeedupTile(TileIndex) && - !IsValidTeleTile(TileIndex) && - !IsValidTuneTile(TileIndex)) - { - return false; - } - else if(LayerType == MAP_IMAGE_ENTITY_LAYER_TYPE_SWITCH && - !IsValidSwitchTile(TileIndex)) - { - return false; - } - } - } - else if(EntitiesModType == MAP_IMAGE_MOD_TYPE_RACE && IsCreditsTile(TileIndex)) - { - return false; - } - else if(EntitiesModType == MAP_IMAGE_MOD_TYPE_FNG && IsCreditsTile(TileIndex)) - { - return false; - } - else if(EntitiesModType == MAP_IMAGE_MOD_TYPE_VANILLA && IsCreditsTile(TileIndex)) - { - return false; - } - return true; -} - -IGraphics::CTextureHandle CMapImages::GetEntities(EMapImageEntityLayerType EntityLayerType) -{ - const bool EntitiesAreMasked = !GameClient()->m_GameInfo.m_DontMaskEntities; - const EMapImageModType EntitiesModType = GetEntitiesModType(GameClient()->m_GameInfo); - - if(!m_aEntitiesIsLoaded[(EntitiesModType * 2) + (int)EntitiesAreMasked]) - { - m_aEntitiesIsLoaded[(EntitiesModType * 2) + (int)EntitiesAreMasked] = true; - - int TextureLoadFlag = 0; - if(Graphics()->HasTextureArraysSupport()) - TextureLoadFlag = (Graphics()->Uses2DTextureArrays() ? IGraphics::TEXLOAD_TO_2D_ARRAY_TEXTURE : IGraphics::TEXLOAD_TO_3D_TEXTURE) | IGraphics::TEXLOAD_NO_2D_TEXTURE; - - CImageInfo ImgInfo; - char aPath[IO_MAX_PATH_LENGTH]; - str_format(aPath, sizeof(aPath), "%s/%s.png", m_aEntitiesPath, gs_apModEntitiesNames[EntitiesModType]); - Graphics()->LoadPng(ImgInfo, aPath, IStorage::TYPE_ALL); - - // try as single ddnet replacement - if(ImgInfo.m_pData == nullptr && EntitiesModType == MAP_IMAGE_MOD_TYPE_DDNET) - { - str_format(aPath, sizeof(aPath), "%s.png", m_aEntitiesPath); - Graphics()->LoadPng(ImgInfo, aPath, IStorage::TYPE_ALL); - } - - // try default - if(ImgInfo.m_pData == nullptr) - { - str_format(aPath, sizeof(aPath), "editor/entities_clear/%s.png", gs_apModEntitiesNames[EntitiesModType]); - Graphics()->LoadPng(ImgInfo, aPath, IStorage::TYPE_ALL); - } - - if(ImgInfo.m_pData != nullptr) - { - CImageInfo BuildImageInfo; - BuildImageInfo.m_Width = ImgInfo.m_Width; - BuildImageInfo.m_Height = ImgInfo.m_Height; - BuildImageInfo.m_Format = ImgInfo.m_Format; - BuildImageInfo.m_pData = static_cast(malloc(BuildImageInfo.DataSize())); - - // build game layer - for(int LayerType = 0; LayerType < MAP_IMAGE_ENTITY_LAYER_TYPE_COUNT; ++LayerType) - { - dbg_assert(!m_aaEntitiesTextures[(EntitiesModType * 2) + (int)EntitiesAreMasked][LayerType].IsValid(), "entities texture already loaded when it should not be"); - - // set everything transparent - mem_zero(BuildImageInfo.m_pData, BuildImageInfo.DataSize()); - - for(int i = 0; i < 256; ++i) - { - int TileIndex = i; - if(IsValidTile(LayerType, EntitiesAreMasked, EntitiesModType, TileIndex)) - { - if(LayerType == MAP_IMAGE_ENTITY_LAYER_TYPE_SWITCH && TileIndex == TILE_SWITCHTIMEDOPEN) - { - TileIndex = 8; - } - - const size_t CopyWidth = ImgInfo.m_Width / 16; - const size_t CopyHeight = ImgInfo.m_Height / 16; - const size_t OffsetX = (size_t)(TileIndex % 16) * CopyWidth; - const size_t OffsetY = (size_t)(TileIndex / 16) * CopyHeight; - BuildImageInfo.CopyRectFrom(ImgInfo, OffsetX, OffsetY, CopyWidth, CopyHeight, OffsetX, OffsetY); - } - } - - m_aaEntitiesTextures[(EntitiesModType * 2) + (int)EntitiesAreMasked][LayerType] = Graphics()->LoadTextureRaw(BuildImageInfo, TextureLoadFlag, aPath); - } - - BuildImageInfo.Free(); - ImgInfo.Free(); - } - } - - return m_aaEntitiesTextures[(EntitiesModType * 2) + (int)EntitiesAreMasked][EntityLayerType]; -} - -IGraphics::CTextureHandle CMapImages::GetSpeedupArrow() -{ - if(!m_SpeedupArrowIsLoaded) - { - int TextureLoadFlag = (Graphics()->Uses2DTextureArrays() ? IGraphics::TEXLOAD_TO_2D_ARRAY_TEXTURE : IGraphics::TEXLOAD_TO_3D_TEXTURE) | IGraphics::TEXLOAD_NO_2D_TEXTURE; - m_SpeedupArrowTexture = Graphics()->LoadTexture("editor/speed_arrow_array.png", IStorage::TYPE_ALL, TextureLoadFlag); - m_SpeedupArrowIsLoaded = true; - } - return m_SpeedupArrowTexture; -} - -IGraphics::CTextureHandle CMapImages::GetOverlayBottom() -{ - return m_OverlayBottomTexture; -} - -IGraphics::CTextureHandle CMapImages::GetOverlayTop() -{ - return m_OverlayTopTexture; -} - -IGraphics::CTextureHandle CMapImages::GetOverlayCenter() -{ - return m_OverlayCenterTexture; -} - -void CMapImages::ChangeEntitiesPath(const char *pPath) -{ - if(str_comp(pPath, "default") == 0) - str_copy(m_aEntitiesPath, "editor/entities_clear"); - else - { - str_format(m_aEntitiesPath, sizeof(m_aEntitiesPath), "assets/entities/%s", pPath); - } - - for(int ModType = 0; ModType < MAP_IMAGE_MOD_TYPE_COUNT * 2; ++ModType) - { - if(m_aEntitiesIsLoaded[ModType]) - { - for(int LayerType = 0; LayerType < MAP_IMAGE_ENTITY_LAYER_TYPE_COUNT; ++LayerType) - { - Graphics()->UnloadTexture(&m_aaEntitiesTextures[ModType][LayerType]); - } - m_aEntitiesIsLoaded[ModType] = false; - } - } -} - -void CMapImages::ConchainClTextEntitiesSize(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - pfnCallback(pResult, pCallbackUserData); - if(pResult->NumArguments()) - { - CMapImages *pThis = static_cast(pUserData); - pThis->SetTextureScale(g_Config.m_ClTextEntitiesSize); - } -} - -void CMapImages::SetTextureScale(int Scale) -{ - if(m_TextureScale == Scale) - return; - - m_TextureScale = Scale; - - if(Graphics() && m_OverlayCenterTexture.IsValid()) // check if component was initialized - { - // reinitialize component - Graphics()->UnloadTexture(&m_OverlayBottomTexture); - Graphics()->UnloadTexture(&m_OverlayTopTexture); - Graphics()->UnloadTexture(&m_OverlayCenterTexture); - - InitOverlayTextures(); - } -} - -int CMapImages::GetTextureScale() const -{ - return m_TextureScale; -} - -IGraphics::CTextureHandle CMapImages::UploadEntityLayerText(int TextureSize, int MaxWidth, int YOffset) -{ - CImageInfo TextImage; - TextImage.m_Width = 1024; - TextImage.m_Height = 1024; - TextImage.m_Format = CImageInfo::FORMAT_RGBA; - TextImage.m_pData = static_cast(calloc(TextImage.DataSize(), sizeof(uint8_t))); - - UpdateEntityLayerText(TextImage, TextureSize, MaxWidth, YOffset, 0); - UpdateEntityLayerText(TextImage, TextureSize, MaxWidth, YOffset, 1); - UpdateEntityLayerText(TextImage, TextureSize, MaxWidth, YOffset, 2, 255); - - const int TextureLoadFlag = (Graphics()->Uses2DTextureArrays() ? IGraphics::TEXLOAD_TO_2D_ARRAY_TEXTURE : IGraphics::TEXLOAD_TO_3D_TEXTURE) | IGraphics::TEXLOAD_NO_2D_TEXTURE; - return Graphics()->LoadTextureRawMove(TextImage, TextureLoadFlag); -} - -void CMapImages::UpdateEntityLayerText(CImageInfo &TextImage, int TextureSize, int MaxWidth, int YOffset, int NumbersPower, int MaxNumber) -{ - char aBuf[4]; - int DigitsCount = NumbersPower + 1; - - int CurrentNumber = std::pow(10, NumbersPower); - - if(MaxNumber == -1) - MaxNumber = CurrentNumber * 10 - 1; - - str_format(aBuf, sizeof(aBuf), "%d", CurrentNumber); - - int CurrentNumberSuitableFontSize = TextRender()->AdjustFontSize(aBuf, DigitsCount, TextureSize, MaxWidth); - int UniversalSuitableFontSize = CurrentNumberSuitableFontSize * 0.92f; // should be smoothed enough to fit any digits combination - - YOffset += ((TextureSize - UniversalSuitableFontSize) / 2); - - for(; CurrentNumber <= MaxNumber; ++CurrentNumber) - { - str_format(aBuf, sizeof(aBuf), "%d", CurrentNumber); - - float x = (CurrentNumber % 16) * 64; - float y = (CurrentNumber / 16) * 64; - - int ApproximateTextWidth = TextRender()->CalculateTextWidth(aBuf, DigitsCount, 0, UniversalSuitableFontSize); - int XOffSet = (MaxWidth - clamp(ApproximateTextWidth, 0, MaxWidth)) / 2; - - TextRender()->UploadEntityLayerText(TextImage, (TextImage.m_Width / 16) - XOffSet, (TextImage.m_Height / 16) - YOffset, aBuf, DigitsCount, x + XOffSet, y + YOffset, UniversalSuitableFontSize); - } -} - -void CMapImages::InitOverlayTextures() -{ - int TextureSize = 64 * m_TextureScale / 100; - TextureSize = clamp(TextureSize, 2, 64); - int TextureToVerticalCenterOffset = (64 - TextureSize) / 2; // should be used to move texture to the center of 64 pixels area - - if(!m_OverlayBottomTexture.IsValid()) - { - m_OverlayBottomTexture = UploadEntityLayerText(TextureSize / 2, 64, 32 + TextureToVerticalCenterOffset / 2); - } - - if(!m_OverlayTopTexture.IsValid()) - { - m_OverlayTopTexture = UploadEntityLayerText(TextureSize / 2, 64, TextureToVerticalCenterOffset / 2); - } - - if(!m_OverlayCenterTexture.IsValid()) - { - m_OverlayCenterTexture = UploadEntityLayerText(TextureSize, 64, TextureToVerticalCenterOffset); - } -} diff --git a/src/game/client/components/mapimages.h b/src/game/client/components/mapimages.h deleted file mode 100644 index a1641260cf..0000000000 --- a/src/game/client/components/mapimages.h +++ /dev/null @@ -1,86 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_MAPIMAGES_H -#define GAME_CLIENT_COMPONENTS_MAPIMAGES_H - -#include -#include - -#include -#include - -enum EMapImageEntityLayerType -{ - MAP_IMAGE_ENTITY_LAYER_TYPE_ALL_EXCEPT_SWITCH = 0, - MAP_IMAGE_ENTITY_LAYER_TYPE_SWITCH, - - MAP_IMAGE_ENTITY_LAYER_TYPE_COUNT, -}; - -enum EMapImageModType -{ - MAP_IMAGE_MOD_TYPE_DDNET = 0, - MAP_IMAGE_MOD_TYPE_DDRACE, - MAP_IMAGE_MOD_TYPE_RACE, - MAP_IMAGE_MOD_TYPE_BLOCKWORLDS, - MAP_IMAGE_MOD_TYPE_FNG, - MAP_IMAGE_MOD_TYPE_VANILLA, - MAP_IMAGE_MOD_TYPE_FDDRACE, - - MAP_IMAGE_MOD_TYPE_COUNT, -}; - -extern const char *const gs_apModEntitiesNames[]; - -class CMapImages : public CComponent -{ - friend class CBackground; - friend class CMenuBackground; - - IGraphics::CTextureHandle m_aTextures[MAX_MAPIMAGES]; - int m_Count; - - char m_aEntitiesPath[IO_MAX_PATH_LENGTH]; - -public: - CMapImages(); - virtual int Sizeof() const override { return sizeof(*this); } - - IGraphics::CTextureHandle Get(int Index) const { return m_aTextures[Index]; } - int Num() const { return m_Count; } - - void OnMapLoadImpl(class CLayers *pLayers, class IMap *pMap); - virtual void OnMapLoad() override; - virtual void OnInit() override; - void LoadBackground(class CLayers *pLayers, class IMap *pMap); - - // DDRace - IGraphics::CTextureHandle GetEntities(EMapImageEntityLayerType EntityLayerType); - IGraphics::CTextureHandle GetSpeedupArrow(); - - IGraphics::CTextureHandle GetOverlayBottom(); - IGraphics::CTextureHandle GetOverlayTop(); - IGraphics::CTextureHandle GetOverlayCenter(); - - void SetTextureScale(int Scale); - int GetTextureScale() const; - - void ChangeEntitiesPath(const char *pPath); - -private: - bool m_aEntitiesIsLoaded[MAP_IMAGE_MOD_TYPE_COUNT * 2]; - bool m_SpeedupArrowIsLoaded; - IGraphics::CTextureHandle m_aaEntitiesTextures[MAP_IMAGE_MOD_TYPE_COUNT * 2][MAP_IMAGE_ENTITY_LAYER_TYPE_COUNT]; - IGraphics::CTextureHandle m_SpeedupArrowTexture; - IGraphics::CTextureHandle m_OverlayBottomTexture; - IGraphics::CTextureHandle m_OverlayTopTexture; - IGraphics::CTextureHandle m_OverlayCenterTexture; - int m_TextureScale; - - static void ConchainClTextEntitiesSize(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - void InitOverlayTextures(); - IGraphics::CTextureHandle UploadEntityLayerText(int TextureSize, int MaxWidth, int YOffset); - void UpdateEntityLayerText(CImageInfo &TextImage, int TextureSize, int MaxWidth, int YOffset, int NumbersPower, int MaxNumber = -1); -}; - -#endif diff --git a/src/game/client/components/maplayers.cpp b/src/game/client/components/maplayers.cpp deleted file mode 100644 index e6a77a514c..0000000000 --- a/src/game/client/components/maplayers.cpp +++ /dev/null @@ -1,1809 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include "maplayers.h" - -#include - -using namespace std::chrono_literals; - -CMapLayers::CMapLayers(int Type, bool OnlineOnly) -{ - m_Type = Type; - m_OnlineOnly = OnlineOnly; -} - -void CMapLayers::OnInit() -{ - m_pLayers = Layers(); - m_pImages = &m_pClient->m_MapImages; -} - -CCamera *CMapLayers::GetCurCamera() -{ - return &m_pClient->m_Camera; -} - -const char *CMapLayers::LoadingTitle() const -{ - return GameClient()->DemoPlayer()->IsPlaying() ? Localize("Preparing demo playback") : Localize("Connected"); -} - -void CMapLayers::EnvelopeEval(int TimeOffsetMillis, int Env, ColorRGBA &Result, size_t Channels, void *pUser) -{ - CMapLayers *pThis = (CMapLayers *)pUser; - - int EnvStart, EnvNum; - pThis->m_pLayers->Map()->GetType(MAPITEMTYPE_ENVELOPE, &EnvStart, &EnvNum); - if(Env < 0 || Env >= EnvNum) - return; - - const CMapItemEnvelope *pItem = (CMapItemEnvelope *)pThis->m_pLayers->Map()->GetItem(EnvStart + Env); - if(pItem->m_Channels <= 0) - return; - Channels = minimum(Channels, pItem->m_Channels, CEnvPoint::MAX_CHANNELS); - - CMapBasedEnvelopePointAccess EnvelopePoints(pThis->m_pLayers->Map()); - EnvelopePoints.SetPointsRange(pItem->m_StartPoint, pItem->m_NumPoints); - if(EnvelopePoints.NumPoints() == 0) - return; - - static std::chrono::nanoseconds s_Time{0}; - static auto s_LastLocalTime = time_get_nanoseconds(); - if(pThis->m_OnlineOnly && (pItem->m_Version < 2 || pItem->m_Synchronized)) - { - if(pThis->m_pClient->m_Snap.m_pGameInfoObj) - { - // get the lerp of the current tick and prev - const auto TickToNanoSeconds = std::chrono::nanoseconds(1s) / (int64_t)pThis->Client()->GameTickSpeed(); - const int MinTick = pThis->Client()->PrevGameTick(g_Config.m_ClDummy) - pThis->m_pClient->m_Snap.m_pGameInfoObj->m_RoundStartTick; - const int CurTick = pThis->Client()->GameTick(g_Config.m_ClDummy) - pThis->m_pClient->m_Snap.m_pGameInfoObj->m_RoundStartTick; - s_Time = std::chrono::nanoseconds((int64_t)(mix( - 0, - (CurTick - MinTick), - (double)pThis->Client()->IntraGameTick(g_Config.m_ClDummy)) * - TickToNanoSeconds.count())) + - MinTick * TickToNanoSeconds; - } - } - else - { - const auto CurTime = time_get_nanoseconds(); - s_Time += CurTime - s_LastLocalTime; - s_LastLocalTime = CurTime; - } - CRenderTools::RenderEvalEnvelope(&EnvelopePoints, s_Time + std::chrono::nanoseconds(std::chrono::milliseconds(TimeOffsetMillis)), Result, Channels); -} - -static void FillTmpTile(SGraphicTile *pTmpTile, SGraphicTileTexureCoords *pTmpTex, unsigned char Flags, unsigned char Index, int x, int y, const ivec2 &Offset, int Scale) -{ - if(pTmpTex) - { - unsigned char x0 = 0; - unsigned char y0 = 0; - unsigned char x1 = x0 + 1; - unsigned char y1 = y0; - unsigned char x2 = x0 + 1; - unsigned char y2 = y0 + 1; - unsigned char x3 = x0; - unsigned char y3 = y0 + 1; - - if(Flags & TILEFLAG_XFLIP) - { - x0 = x2; - x1 = x3; - x2 = x3; - x3 = x0; - } - - if(Flags & TILEFLAG_YFLIP) - { - y0 = y3; - y2 = y1; - y3 = y1; - y1 = y0; - } - - if(Flags & TILEFLAG_ROTATE) - { - unsigned char Tmp = x0; - x0 = x3; - x3 = x2; - x2 = x1; - x1 = Tmp; - Tmp = y0; - y0 = y3; - y3 = y2; - y2 = y1; - y1 = Tmp; - } - - pTmpTex->m_TexCoordTopLeft.x = x0; - pTmpTex->m_TexCoordTopLeft.y = y0; - pTmpTex->m_TexCoordBottomLeft.x = x3; - pTmpTex->m_TexCoordBottomLeft.y = y3; - pTmpTex->m_TexCoordTopRight.x = x1; - pTmpTex->m_TexCoordTopRight.y = y1; - pTmpTex->m_TexCoordBottomRight.x = x2; - pTmpTex->m_TexCoordBottomRight.y = y2; - - pTmpTex->m_TexCoordTopLeft.z = Index; - pTmpTex->m_TexCoordBottomLeft.z = Index; - pTmpTex->m_TexCoordTopRight.z = Index; - pTmpTex->m_TexCoordBottomRight.z = Index; - - bool HasRotation = (Flags & TILEFLAG_ROTATE) != 0; - pTmpTex->m_TexCoordTopLeft.w = HasRotation; - pTmpTex->m_TexCoordBottomLeft.w = HasRotation; - pTmpTex->m_TexCoordTopRight.w = HasRotation; - pTmpTex->m_TexCoordBottomRight.w = HasRotation; - } - - pTmpTile->m_TopLeft.x = x * Scale + Offset.x; - pTmpTile->m_TopLeft.y = y * Scale + Offset.y; - pTmpTile->m_BottomLeft.x = x * Scale + Offset.x; - pTmpTile->m_BottomLeft.y = y * Scale + Scale + Offset.y; - pTmpTile->m_TopRight.x = x * Scale + Scale + Offset.x; - pTmpTile->m_TopRight.y = y * Scale + Offset.y; - pTmpTile->m_BottomRight.x = x * Scale + Scale + Offset.x; - pTmpTile->m_BottomRight.y = y * Scale + Scale + Offset.y; -} - -static void FillTmpTileSpeedup(SGraphicTile *pTmpTile, SGraphicTileTexureCoords *pTmpTex, unsigned char Flags, int x, int y, const ivec2 &Offset, int Scale, short AngleRotate) -{ - int Angle = AngleRotate % 360; - FillTmpTile(pTmpTile, pTmpTex, Angle >= 270 ? ROTATION_270 : (Angle >= 180 ? ROTATION_180 : (Angle >= 90 ? ROTATION_90 : 0)), AngleRotate % 90, x, y, Offset, Scale); -} - -bool CMapLayers::STileLayerVisuals::Init(unsigned int Width, unsigned int Height) -{ - m_Width = Width; - m_Height = Height; - if(Width == 0 || Height == 0) - return false; - if constexpr(sizeof(unsigned int) >= sizeof(ptrdiff_t)) - if(Width >= std::numeric_limits::max() || Height >= std::numeric_limits::max()) - return false; - - m_pTilesOfLayer = new CMapLayers::STileLayerVisuals::STileVisual[Height * Width]; - - m_vBorderTop.resize(Width); - m_vBorderBottom.resize(Width); - - m_vBorderLeft.resize(Height); - m_vBorderRight.resize(Height); - return true; -} - -CMapLayers::STileLayerVisuals::~STileLayerVisuals() -{ - delete[] m_pTilesOfLayer; - - m_pTilesOfLayer = NULL; -} - -static bool AddTile(std::vector &vTmpTiles, std::vector &vTmpTileTexCoords, unsigned char Index, unsigned char Flags, int x, int y, bool DoTextureCoords, bool FillSpeedup = false, int AngleRotate = -1, const ivec2 &Offset = ivec2{0, 0}, int Scale = 32) -{ - if(Index) - { - vTmpTiles.emplace_back(); - SGraphicTile &Tile = vTmpTiles.back(); - SGraphicTileTexureCoords *pTileTex = NULL; - if(DoTextureCoords) - { - vTmpTileTexCoords.emplace_back(); - SGraphicTileTexureCoords &TileTex = vTmpTileTexCoords.back(); - pTileTex = &TileTex; - } - if(FillSpeedup) - FillTmpTileSpeedup(&Tile, pTileTex, Flags, x, y, Offset, Scale, AngleRotate); - else - FillTmpTile(&Tile, pTileTex, Flags, Index, x, y, Offset, Scale); - - return true; - } - return false; -} - -struct STmpQuadVertexTextured -{ - float m_X, m_Y, m_CenterX, m_CenterY; - unsigned char m_R, m_G, m_B, m_A; - float m_U, m_V; -}; - -struct STmpQuadVertex -{ - float m_X, m_Y, m_CenterX, m_CenterY; - unsigned char m_R, m_G, m_B, m_A; -}; - -struct STmpQuad -{ - STmpQuadVertex m_aVertices[4]; -}; - -struct STmpQuadTextured -{ - STmpQuadVertexTextured m_aVertices[4]; -}; - -void mem_copy_special(void *pDest, void *pSource, size_t Size, size_t Count, size_t Steps) -{ - size_t CurStep = 0; - for(size_t i = 0; i < Count; ++i) - { - mem_copy(((char *)pDest) + CurStep + i * Size, ((char *)pSource) + i * Size, Size); - CurStep += Steps; - } -} - -CMapLayers::~CMapLayers() -{ - //clear everything and destroy all buffers - if(!m_vpTileLayerVisuals.empty()) - { - int s = m_vpTileLayerVisuals.size(); - for(int i = 0; i < s; ++i) - { - delete m_vpTileLayerVisuals[i]; - } - } - if(!m_vpQuadLayerVisuals.empty()) - { - int s = m_vpQuadLayerVisuals.size(); - for(int i = 0; i < s; ++i) - { - delete m_vpQuadLayerVisuals[i]; - } - } -} - -void CMapLayers::OnMapLoad() -{ - if(!Graphics()->IsTileBufferingEnabled() && !Graphics()->IsQuadBufferingEnabled()) - return; - - const char *pLoadingTitle = LoadingTitle(); - const char *pLoadingMessage = Localize("Uploading map data to GPU"); - auto &&RenderLoading = [&]() { - GameClient()->m_Menus.RenderLoading(pLoadingTitle, pLoadingMessage, 0); - }; - - //clear everything and destroy all buffers - if(!m_vpTileLayerVisuals.empty()) - { - int s = m_vpTileLayerVisuals.size(); - for(int i = 0; i < s; ++i) - { - Graphics()->DeleteBufferContainer(m_vpTileLayerVisuals[i]->m_BufferContainerIndex, true); - delete m_vpTileLayerVisuals[i]; - } - m_vpTileLayerVisuals.clear(); - } - if(!m_vpQuadLayerVisuals.empty()) - { - int s = m_vpQuadLayerVisuals.size(); - for(int i = 0; i < s; ++i) - { - Graphics()->DeleteBufferContainer(m_vpQuadLayerVisuals[i]->m_BufferContainerIndex, true); - delete m_vpQuadLayerVisuals[i]; - } - m_vpQuadLayerVisuals.clear(); - - RenderLoading(); - } - - bool PassedGameLayer = false; - //prepare all visuals for all tile layers - std::vector vtmpTiles; - std::vector vtmpTileTexCoords; - std::vector vtmpBorderTopTiles; - std::vector vtmpBorderTopTilesTexCoords; - std::vector vtmpBorderLeftTiles; - std::vector vtmpBorderLeftTilesTexCoords; - std::vector vtmpBorderRightTiles; - std::vector vtmpBorderRightTilesTexCoords; - std::vector vtmpBorderBottomTiles; - std::vector vtmpBorderBottomTilesTexCoords; - std::vector vtmpBorderCorners; - std::vector vtmpBorderCornersTexCoords; - - std::vector vtmpQuads; - std::vector vtmpQuadsTextured; - - for(int g = 0; g < m_pLayers->NumGroups(); g++) - { - CMapItemGroup *pGroup = m_pLayers->GetGroup(g); - if(!pGroup) - { - dbg_msg("maplayers", "error group was null, group number = %d, total groups = %d", g, m_pLayers->NumGroups()); - dbg_msg("maplayers", "this is here to prevent a crash but the source of this is unknown, please report this for it to get fixed"); - dbg_msg("maplayers", "we need mapname and crc and the map that caused this if possible, and anymore info you think is relevant"); - continue; - } - - for(int l = 0; l < pGroup->m_NumLayers; l++) - { - CMapItemLayer *pLayer = m_pLayers->GetLayer(pGroup->m_StartLayer + l); - bool IsFrontLayer = false; - bool IsSwitchLayer = false; - bool IsTeleLayer = false; - bool IsSpeedupLayer = false; - bool IsTuneLayer = false; - bool IsGameLayer = false; - bool IsEntityLayer = false; - - if(pLayer == (CMapItemLayer *)m_pLayers->GameLayer()) - { - IsGameLayer = true; - IsEntityLayer = true; - PassedGameLayer = true; - } - - if(pLayer == (CMapItemLayer *)m_pLayers->FrontLayer()) - IsEntityLayer = IsFrontLayer = true; - - if(pLayer == (CMapItemLayer *)m_pLayers->SwitchLayer()) - IsEntityLayer = IsSwitchLayer = true; - - if(pLayer == (CMapItemLayer *)m_pLayers->TeleLayer()) - IsEntityLayer = IsTeleLayer = true; - - if(pLayer == (CMapItemLayer *)m_pLayers->SpeedupLayer()) - IsEntityLayer = IsSpeedupLayer = true; - - if(pLayer == (CMapItemLayer *)m_pLayers->TuneLayer()) - IsEntityLayer = IsTuneLayer = true; - - if(m_Type <= TYPE_BACKGROUND_FORCE) - { - if(PassedGameLayer) - return; - } - else if(m_Type == TYPE_FOREGROUND) - { - if(!PassedGameLayer) - continue; - } - - if(pLayer->m_Type == LAYERTYPE_TILES && Graphics()->IsTileBufferingEnabled()) - { - CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; - const bool DoTextureCoords = IsEntityLayer || (pTMap->m_Image >= 0 && pTMap->m_Image < m_pImages->Num()); - - int DataIndex = 0; - unsigned int TileSize = 0; - int OverlayCount = 0; - if(IsFrontLayer) - { - DataIndex = pTMap->m_Front; - TileSize = sizeof(CTile); - } - else if(IsSwitchLayer) - { - DataIndex = pTMap->m_Switch; - TileSize = sizeof(CSwitchTile); - OverlayCount = 2; - } - else if(IsTeleLayer) - { - DataIndex = pTMap->m_Tele; - TileSize = sizeof(CTeleTile); - OverlayCount = 1; - } - else if(IsSpeedupLayer) - { - DataIndex = pTMap->m_Speedup; - TileSize = sizeof(CSpeedupTile); - OverlayCount = 2; - } - else if(IsTuneLayer) - { - DataIndex = pTMap->m_Tune; - TileSize = sizeof(CTuneTile); - } - else - { - DataIndex = pTMap->m_Data; - TileSize = sizeof(CTile); - } - unsigned int Size = m_pLayers->Map()->GetDataSize(DataIndex); - void *pTiles = m_pLayers->Map()->GetData(DataIndex); - - if(Size >= pTMap->m_Width * pTMap->m_Height * TileSize) - { - int CurOverlay = 0; - while(CurOverlay < OverlayCount + 1) - { - // We can later just count the tile layers to get the idx in the vector - m_vpTileLayerVisuals.push_back(new STileLayerVisuals()); - STileLayerVisuals &Visuals = *m_vpTileLayerVisuals.back(); - if(!Visuals.Init(pTMap->m_Width, pTMap->m_Height)) - { - ++CurOverlay; - continue; - } - Visuals.m_IsTextured = DoTextureCoords; - - vtmpTiles.clear(); - vtmpTileTexCoords.clear(); - - vtmpBorderTopTiles.clear(); - vtmpBorderLeftTiles.clear(); - vtmpBorderRightTiles.clear(); - vtmpBorderBottomTiles.clear(); - vtmpBorderCorners.clear(); - vtmpBorderTopTilesTexCoords.clear(); - vtmpBorderLeftTilesTexCoords.clear(); - vtmpBorderRightTilesTexCoords.clear(); - vtmpBorderBottomTilesTexCoords.clear(); - vtmpBorderCornersTexCoords.clear(); - - if(!DoTextureCoords) - { - vtmpTiles.reserve((size_t)pTMap->m_Width * pTMap->m_Height); - vtmpBorderTopTiles.reserve((size_t)pTMap->m_Width); - vtmpBorderBottomTiles.reserve((size_t)pTMap->m_Width); - vtmpBorderLeftTiles.reserve((size_t)pTMap->m_Height); - vtmpBorderRightTiles.reserve((size_t)pTMap->m_Height); - vtmpBorderCorners.reserve((size_t)4); - } - else - { - vtmpTileTexCoords.reserve((size_t)pTMap->m_Width * pTMap->m_Height); - vtmpBorderTopTilesTexCoords.reserve((size_t)pTMap->m_Width); - vtmpBorderBottomTilesTexCoords.reserve((size_t)pTMap->m_Width); - vtmpBorderLeftTilesTexCoords.reserve((size_t)pTMap->m_Height); - vtmpBorderRightTilesTexCoords.reserve((size_t)pTMap->m_Height); - vtmpBorderCornersTexCoords.reserve((size_t)4); - } - - int x = 0; - int y = 0; - for(y = 0; y < pTMap->m_Height; ++y) - { - for(x = 0; x < pTMap->m_Width; ++x) - { - unsigned char Index = 0; - unsigned char Flags = 0; - int AngleRotate = -1; - if(IsEntityLayer) - { - if(IsGameLayer) - { - Index = ((CTile *)pTiles)[y * pTMap->m_Width + x].m_Index; - Flags = ((CTile *)pTiles)[y * pTMap->m_Width + x].m_Flags; - } - if(IsFrontLayer) - { - Index = ((CTile *)pTiles)[y * pTMap->m_Width + x].m_Index; - Flags = ((CTile *)pTiles)[y * pTMap->m_Width + x].m_Flags; - } - if(IsSwitchLayer) - { - Flags = 0; - Index = ((CSwitchTile *)pTiles)[y * pTMap->m_Width + x].m_Type; - if(CurOverlay == 0) - { - Flags = ((CSwitchTile *)pTiles)[y * pTMap->m_Width + x].m_Flags; - if(Index == TILE_SWITCHTIMEDOPEN) - Index = 8; - } - else if(CurOverlay == 1) - Index = ((CSwitchTile *)pTiles)[y * pTMap->m_Width + x].m_Number; - else if(CurOverlay == 2) - Index = ((CSwitchTile *)pTiles)[y * pTMap->m_Width + x].m_Delay; - } - if(IsTeleLayer) - { - Index = ((CTeleTile *)pTiles)[y * pTMap->m_Width + x].m_Type; - Flags = 0; - if(CurOverlay == 1) - { - if(IsTeleTileNumberUsedAny(Index)) - Index = ((CTeleTile *)pTiles)[y * pTMap->m_Width + x].m_Number; - else - Index = 0; - } - } - if(IsSpeedupLayer) - { - Index = ((CSpeedupTile *)pTiles)[y * pTMap->m_Width + x].m_Type; - Flags = 0; - AngleRotate = ((CSpeedupTile *)pTiles)[y * pTMap->m_Width + x].m_Angle; - if(((CSpeedupTile *)pTiles)[y * pTMap->m_Width + x].m_Force == 0) - Index = 0; - else if(CurOverlay == 1) - Index = ((CSpeedupTile *)pTiles)[y * pTMap->m_Width + x].m_Force; - else if(CurOverlay == 2) - Index = ((CSpeedupTile *)pTiles)[y * pTMap->m_Width + x].m_MaxSpeed; - } - if(IsTuneLayer) - { - Index = ((CTuneTile *)pTiles)[y * pTMap->m_Width + x].m_Type; - Flags = 0; - } - } - else - { - Index = ((CTile *)pTiles)[y * pTMap->m_Width + x].m_Index; - Flags = ((CTile *)pTiles)[y * pTMap->m_Width + x].m_Flags; - } - - //the amount of tiles handled before this tile - int TilesHandledCount = vtmpTiles.size(); - Visuals.m_pTilesOfLayer[y * pTMap->m_Width + x].SetIndexBufferByteOffset((offset_ptr32)(TilesHandledCount)); - - bool AddAsSpeedup = false; - if(IsSpeedupLayer && CurOverlay == 0) - AddAsSpeedup = true; - - if(AddTile(vtmpTiles, vtmpTileTexCoords, Index, Flags, x, y, DoTextureCoords, AddAsSpeedup, AngleRotate)) - Visuals.m_pTilesOfLayer[y * pTMap->m_Width + x].Draw(true); - - //do the border tiles - if(x == 0) - { - if(y == 0) - { - Visuals.m_BorderTopLeft.SetIndexBufferByteOffset((offset_ptr32)(vtmpBorderCorners.size())); - if(AddTile(vtmpBorderCorners, vtmpBorderCornersTexCoords, Index, Flags, 0, 0, DoTextureCoords, AddAsSpeedup, AngleRotate, ivec2{-32, -32})) - Visuals.m_BorderTopLeft.Draw(true); - } - else if(y == pTMap->m_Height - 1) - { - Visuals.m_BorderBottomLeft.SetIndexBufferByteOffset((offset_ptr32)(vtmpBorderCorners.size())); - if(AddTile(vtmpBorderCorners, vtmpBorderCornersTexCoords, Index, Flags, 0, 0, DoTextureCoords, AddAsSpeedup, AngleRotate, ivec2{-32, 0})) - Visuals.m_BorderBottomLeft.Draw(true); - } - Visuals.m_vBorderLeft[y].SetIndexBufferByteOffset((offset_ptr32)(vtmpBorderLeftTiles.size())); - if(AddTile(vtmpBorderLeftTiles, vtmpBorderLeftTilesTexCoords, Index, Flags, 0, y, DoTextureCoords, AddAsSpeedup, AngleRotate, ivec2{-32, 0})) - Visuals.m_vBorderLeft[y].Draw(true); - } - else if(x == pTMap->m_Width - 1) - { - if(y == 0) - { - Visuals.m_BorderTopRight.SetIndexBufferByteOffset((offset_ptr32)(vtmpBorderCorners.size())); - if(AddTile(vtmpBorderCorners, vtmpBorderCornersTexCoords, Index, Flags, 0, 0, DoTextureCoords, AddAsSpeedup, AngleRotate, ivec2{0, -32})) - Visuals.m_BorderTopRight.Draw(true); - } - else if(y == pTMap->m_Height - 1) - { - Visuals.m_BorderBottomRight.SetIndexBufferByteOffset((offset_ptr32)(vtmpBorderCorners.size())); - if(AddTile(vtmpBorderCorners, vtmpBorderCornersTexCoords, Index, Flags, 0, 0, DoTextureCoords, AddAsSpeedup, AngleRotate, ivec2{0, 0})) - Visuals.m_BorderBottomRight.Draw(true); - } - Visuals.m_vBorderRight[y].SetIndexBufferByteOffset((offset_ptr32)(vtmpBorderRightTiles.size())); - if(AddTile(vtmpBorderRightTiles, vtmpBorderRightTilesTexCoords, Index, Flags, 0, y, DoTextureCoords, AddAsSpeedup, AngleRotate, ivec2{0, 0})) - Visuals.m_vBorderRight[y].Draw(true); - } - if(y == 0) - { - Visuals.m_vBorderTop[x].SetIndexBufferByteOffset((offset_ptr32)(vtmpBorderTopTiles.size())); - if(AddTile(vtmpBorderTopTiles, vtmpBorderTopTilesTexCoords, Index, Flags, x, 0, DoTextureCoords, AddAsSpeedup, AngleRotate, ivec2{0, -32})) - Visuals.m_vBorderTop[x].Draw(true); - } - else if(y == pTMap->m_Height - 1) - { - Visuals.m_vBorderBottom[x].SetIndexBufferByteOffset((offset_ptr32)(vtmpBorderBottomTiles.size())); - if(AddTile(vtmpBorderBottomTiles, vtmpBorderBottomTilesTexCoords, Index, Flags, x, 0, DoTextureCoords, AddAsSpeedup, AngleRotate, ivec2{0, 0})) - Visuals.m_vBorderBottom[x].Draw(true); - } - } - } - - //append one kill tile to the gamelayer - if(IsGameLayer) - { - Visuals.m_BorderKillTile.SetIndexBufferByteOffset((offset_ptr32)(vtmpTiles.size())); - if(AddTile(vtmpTiles, vtmpTileTexCoords, TILE_DEATH, 0, 0, 0, DoTextureCoords)) - Visuals.m_BorderKillTile.Draw(true); - } - - //add the border corners, then the borders and fix their byte offsets - int TilesHandledCount = vtmpTiles.size(); - Visuals.m_BorderTopLeft.AddIndexBufferByteOffset(TilesHandledCount); - Visuals.m_BorderTopRight.AddIndexBufferByteOffset(TilesHandledCount); - Visuals.m_BorderBottomLeft.AddIndexBufferByteOffset(TilesHandledCount); - Visuals.m_BorderBottomRight.AddIndexBufferByteOffset(TilesHandledCount); - //add the Corners to the tiles - vtmpTiles.insert(vtmpTiles.end(), vtmpBorderCorners.begin(), vtmpBorderCorners.end()); - vtmpTileTexCoords.insert(vtmpTileTexCoords.end(), vtmpBorderCornersTexCoords.begin(), vtmpBorderCornersTexCoords.end()); - - //now the borders - TilesHandledCount = vtmpTiles.size(); - if(pTMap->m_Width > 0) - { - for(int i = 0; i < pTMap->m_Width; ++i) - { - Visuals.m_vBorderTop[i].AddIndexBufferByteOffset(TilesHandledCount); - } - } - vtmpTiles.insert(vtmpTiles.end(), vtmpBorderTopTiles.begin(), vtmpBorderTopTiles.end()); - vtmpTileTexCoords.insert(vtmpTileTexCoords.end(), vtmpBorderTopTilesTexCoords.begin(), vtmpBorderTopTilesTexCoords.end()); - - TilesHandledCount = vtmpTiles.size(); - if(pTMap->m_Width > 0) - { - for(int i = 0; i < pTMap->m_Width; ++i) - { - Visuals.m_vBorderBottom[i].AddIndexBufferByteOffset(TilesHandledCount); - } - } - vtmpTiles.insert(vtmpTiles.end(), vtmpBorderBottomTiles.begin(), vtmpBorderBottomTiles.end()); - vtmpTileTexCoords.insert(vtmpTileTexCoords.end(), vtmpBorderBottomTilesTexCoords.begin(), vtmpBorderBottomTilesTexCoords.end()); - - TilesHandledCount = vtmpTiles.size(); - if(pTMap->m_Height > 0) - { - for(int i = 0; i < pTMap->m_Height; ++i) - { - Visuals.m_vBorderLeft[i].AddIndexBufferByteOffset(TilesHandledCount); - } - } - vtmpTiles.insert(vtmpTiles.end(), vtmpBorderLeftTiles.begin(), vtmpBorderLeftTiles.end()); - vtmpTileTexCoords.insert(vtmpTileTexCoords.end(), vtmpBorderLeftTilesTexCoords.begin(), vtmpBorderLeftTilesTexCoords.end()); - - TilesHandledCount = vtmpTiles.size(); - if(pTMap->m_Height > 0) - { - for(int i = 0; i < pTMap->m_Height; ++i) - { - Visuals.m_vBorderRight[i].AddIndexBufferByteOffset(TilesHandledCount); - } - } - vtmpTiles.insert(vtmpTiles.end(), vtmpBorderRightTiles.begin(), vtmpBorderRightTiles.end()); - vtmpTileTexCoords.insert(vtmpTileTexCoords.end(), vtmpBorderRightTilesTexCoords.begin(), vtmpBorderRightTilesTexCoords.end()); - - //setup params - float *pTmpTiles = vtmpTiles.empty() ? NULL : (float *)vtmpTiles.data(); - unsigned char *pTmpTileTexCoords = vtmpTileTexCoords.empty() ? NULL : (unsigned char *)vtmpTileTexCoords.data(); - - Visuals.m_BufferContainerIndex = -1; - size_t UploadDataSize = vtmpTileTexCoords.size() * sizeof(SGraphicTileTexureCoords) + vtmpTiles.size() * sizeof(SGraphicTile); - if(UploadDataSize > 0) - { - char *pUploadData = (char *)malloc(sizeof(char) * UploadDataSize); - - mem_copy_special(pUploadData, pTmpTiles, sizeof(vec2), vtmpTiles.size() * 4, (DoTextureCoords ? sizeof(ubvec4) : 0)); - if(DoTextureCoords) - { - mem_copy_special(pUploadData + sizeof(vec2), pTmpTileTexCoords, sizeof(ubvec4), vtmpTiles.size() * 4, sizeof(vec2)); - } - - // first create the buffer object - int BufferObjectIndex = Graphics()->CreateBufferObject(UploadDataSize, pUploadData, 0, true); - - // then create the buffer container - SBufferContainerInfo ContainerInfo; - ContainerInfo.m_Stride = (DoTextureCoords ? (sizeof(float) * 2 + sizeof(ubvec4)) : 0); - ContainerInfo.m_VertBufferBindingIndex = BufferObjectIndex; - ContainerInfo.m_vAttributes.emplace_back(); - SBufferContainerInfo::SAttribute *pAttr = &ContainerInfo.m_vAttributes.back(); - pAttr->m_DataTypeCount = 2; - pAttr->m_Type = GRAPHICS_TYPE_FLOAT; - pAttr->m_Normalized = false; - pAttr->m_pOffset = 0; - pAttr->m_FuncType = 0; - if(DoTextureCoords) - { - ContainerInfo.m_vAttributes.emplace_back(); - pAttr = &ContainerInfo.m_vAttributes.back(); - pAttr->m_DataTypeCount = 4; - pAttr->m_Type = GRAPHICS_TYPE_UNSIGNED_BYTE; - pAttr->m_Normalized = false; - pAttr->m_pOffset = (void *)(sizeof(vec2)); - pAttr->m_FuncType = 1; - } - - Visuals.m_BufferContainerIndex = Graphics()->CreateBufferContainer(&ContainerInfo); - // and finally inform the backend how many indices are required - Graphics()->IndicesNumRequiredNotify(vtmpTiles.size() * 6); - - RenderLoading(); - } - - ++CurOverlay; - } - } - } - else if(pLayer->m_Type == LAYERTYPE_QUADS && Graphics()->IsQuadBufferingEnabled()) - { - CMapItemLayerQuads *pQLayer = (CMapItemLayerQuads *)pLayer; - - m_vpQuadLayerVisuals.push_back(new SQuadLayerVisuals()); - SQuadLayerVisuals *pQLayerVisuals = m_vpQuadLayerVisuals.back(); - - const bool Textured = pQLayer->m_Image >= 0 && pQLayer->m_Image < m_pImages->Num(); - - vtmpQuads.clear(); - vtmpQuadsTextured.clear(); - - if(Textured) - vtmpQuadsTextured.resize(pQLayer->m_NumQuads); - else - vtmpQuads.resize(pQLayer->m_NumQuads); - - CQuad *pQuads = (CQuad *)m_pLayers->Map()->GetDataSwapped(pQLayer->m_Data); - for(int i = 0; i < pQLayer->m_NumQuads; ++i) - { - CQuad *pQuad = &pQuads[i]; - for(int j = 0; j < 4; ++j) - { - int QuadIdX = j; - if(j == 2) - QuadIdX = 3; - else if(j == 3) - QuadIdX = 2; - if(!Textured) - { - // ignore the conversion for the position coordinates - vtmpQuads[i].m_aVertices[j].m_X = (pQuad->m_aPoints[QuadIdX].x); - vtmpQuads[i].m_aVertices[j].m_Y = (pQuad->m_aPoints[QuadIdX].y); - vtmpQuads[i].m_aVertices[j].m_CenterX = (pQuad->m_aPoints[4].x); - vtmpQuads[i].m_aVertices[j].m_CenterY = (pQuad->m_aPoints[4].y); - vtmpQuads[i].m_aVertices[j].m_R = (unsigned char)pQuad->m_aColors[QuadIdX].r; - vtmpQuads[i].m_aVertices[j].m_G = (unsigned char)pQuad->m_aColors[QuadIdX].g; - vtmpQuads[i].m_aVertices[j].m_B = (unsigned char)pQuad->m_aColors[QuadIdX].b; - vtmpQuads[i].m_aVertices[j].m_A = (unsigned char)pQuad->m_aColors[QuadIdX].a; - } - else - { - // ignore the conversion for the position coordinates - vtmpQuadsTextured[i].m_aVertices[j].m_X = (pQuad->m_aPoints[QuadIdX].x); - vtmpQuadsTextured[i].m_aVertices[j].m_Y = (pQuad->m_aPoints[QuadIdX].y); - vtmpQuadsTextured[i].m_aVertices[j].m_CenterX = (pQuad->m_aPoints[4].x); - vtmpQuadsTextured[i].m_aVertices[j].m_CenterY = (pQuad->m_aPoints[4].y); - vtmpQuadsTextured[i].m_aVertices[j].m_U = fx2f(pQuad->m_aTexcoords[QuadIdX].x); - vtmpQuadsTextured[i].m_aVertices[j].m_V = fx2f(pQuad->m_aTexcoords[QuadIdX].y); - vtmpQuadsTextured[i].m_aVertices[j].m_R = (unsigned char)pQuad->m_aColors[QuadIdX].r; - vtmpQuadsTextured[i].m_aVertices[j].m_G = (unsigned char)pQuad->m_aColors[QuadIdX].g; - vtmpQuadsTextured[i].m_aVertices[j].m_B = (unsigned char)pQuad->m_aColors[QuadIdX].b; - vtmpQuadsTextured[i].m_aVertices[j].m_A = (unsigned char)pQuad->m_aColors[QuadIdX].a; - } - } - } - - size_t UploadDataSize = 0; - if(Textured) - UploadDataSize = vtmpQuadsTextured.size() * sizeof(STmpQuadTextured); - else - UploadDataSize = vtmpQuads.size() * sizeof(STmpQuad); - - if(UploadDataSize > 0) - { - void *pUploadData = NULL; - if(Textured) - pUploadData = vtmpQuadsTextured.data(); - else - pUploadData = vtmpQuads.data(); - // create the buffer object - int BufferObjectIndex = Graphics()->CreateBufferObject(UploadDataSize, pUploadData, 0); - // then create the buffer container - SBufferContainerInfo ContainerInfo; - ContainerInfo.m_Stride = (Textured ? (sizeof(STmpQuadTextured) / 4) : (sizeof(STmpQuad) / 4)); - ContainerInfo.m_VertBufferBindingIndex = BufferObjectIndex; - ContainerInfo.m_vAttributes.emplace_back(); - SBufferContainerInfo::SAttribute *pAttr = &ContainerInfo.m_vAttributes.back(); - pAttr->m_DataTypeCount = 4; - pAttr->m_Type = GRAPHICS_TYPE_FLOAT; - pAttr->m_Normalized = false; - pAttr->m_pOffset = 0; - pAttr->m_FuncType = 0; - ContainerInfo.m_vAttributes.emplace_back(); - pAttr = &ContainerInfo.m_vAttributes.back(); - pAttr->m_DataTypeCount = 4; - pAttr->m_Type = GRAPHICS_TYPE_UNSIGNED_BYTE; - pAttr->m_Normalized = true; - pAttr->m_pOffset = (void *)(sizeof(float) * 4); - pAttr->m_FuncType = 0; - if(Textured) - { - ContainerInfo.m_vAttributes.emplace_back(); - pAttr = &ContainerInfo.m_vAttributes.back(); - pAttr->m_DataTypeCount = 2; - pAttr->m_Type = GRAPHICS_TYPE_FLOAT; - pAttr->m_Normalized = false; - pAttr->m_pOffset = (void *)(sizeof(float) * 4 + sizeof(unsigned char) * 4); - pAttr->m_FuncType = 0; - } - - pQLayerVisuals->m_BufferContainerIndex = Graphics()->CreateBufferContainer(&ContainerInfo); - // and finally inform the backend how many indices are required - Graphics()->IndicesNumRequiredNotify(pQLayer->m_NumQuads * 6); - - RenderLoading(); - } - } - } - } -} - -void CMapLayers::RenderTileLayer(int LayerIndex, const ColorRGBA &Color) -{ - STileLayerVisuals &Visuals = *m_vpTileLayerVisuals[LayerIndex]; - if(Visuals.m_BufferContainerIndex == -1) - return; //no visuals were created - - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - - int BorderX0, BorderY0, BorderX1, BorderY1; - bool DrawBorder = false; - - int Y0 = BorderY0 = std::floor(ScreenY0 / 32); - int X0 = BorderX0 = std::floor(ScreenX0 / 32); - int Y1 = BorderY1 = std::ceil(ScreenY1 / 32); - int X1 = BorderX1 = std::ceil(ScreenX1 / 32); - - if(X0 < 0) - { - X0 = 0; - DrawBorder = true; - } - if(Y0 < 0) - { - Y0 = 0; - DrawBorder = true; - } - if(X1 > (int)Visuals.m_Width) - { - X1 = Visuals.m_Width; - DrawBorder = true; - } - if(Y1 > (int)Visuals.m_Height) - { - Y1 = Visuals.m_Height; - DrawBorder = true; - } - - bool DrawLayer = true; - if(X1 <= 0) - DrawLayer = false; - if(Y1 <= 0) - DrawLayer = false; - if(X0 >= (int)Visuals.m_Width) - DrawLayer = false; - if(Y0 >= (int)Visuals.m_Height) - DrawLayer = false; - - if(DrawLayer) - { - //create the indice buffers we want to draw -- reuse them - static std::vector s_vpIndexOffsets; - static std::vector s_vDrawCounts; - - s_vpIndexOffsets.clear(); - s_vDrawCounts.clear(); - - unsigned long long Reserve = absolute(Y1 - Y0) + 1; - s_vpIndexOffsets.reserve(Reserve); - s_vDrawCounts.reserve(Reserve); - - for(int y = Y0; y < Y1; ++y) - { - if(X0 > X1) - continue; - int XR = X1 - 1; - - dbg_assert(Visuals.m_pTilesOfLayer[y * Visuals.m_Width + XR].IndexBufferByteOffset() >= Visuals.m_pTilesOfLayer[y * Visuals.m_Width + X0].IndexBufferByteOffset(), "Tile count wrong."); - - unsigned int NumVertices = ((Visuals.m_pTilesOfLayer[y * Visuals.m_Width + XR].IndexBufferByteOffset() - Visuals.m_pTilesOfLayer[y * Visuals.m_Width + X0].IndexBufferByteOffset()) / sizeof(unsigned int)) + (Visuals.m_pTilesOfLayer[y * Visuals.m_Width + XR].DoDraw() ? 6lu : 0lu); - - if(NumVertices) - { - s_vpIndexOffsets.push_back((offset_ptr_size)Visuals.m_pTilesOfLayer[y * Visuals.m_Width + X0].IndexBufferByteOffset()); - s_vDrawCounts.push_back(NumVertices); - } - } - - int DrawCount = s_vpIndexOffsets.size(); - if(DrawCount != 0) - { - Graphics()->RenderTileLayer(Visuals.m_BufferContainerIndex, Color, s_vpIndexOffsets.data(), s_vDrawCounts.data(), DrawCount); - } - } - - if(DrawBorder) - RenderTileBorder(LayerIndex, Color, BorderX0, BorderY0, BorderX1, BorderY1); -} - -void CMapLayers::RenderTileBorder(int LayerIndex, const ColorRGBA &Color, int BorderX0, int BorderY0, int BorderX1, int BorderY1) -{ - STileLayerVisuals &Visuals = *m_vpTileLayerVisuals[LayerIndex]; - - int Y0 = BorderY0; - int X0 = BorderX0; - int Y1 = BorderY1; - int X1 = BorderX1; - - if(X0 < 0) - X0 = 0; - if(Y0 < 0) - Y0 = 0; - if(X1 > (int)Visuals.m_Width) - X1 = (int)Visuals.m_Width; - if(Y1 > (int)Visuals.m_Height) - Y1 = (int)Visuals.m_Height; - - // corners - if(BorderX0 < 0) - { - // Draw corners on left side - if(BorderY0 < 0) - { - if(Visuals.m_BorderTopLeft.DoDraw()) - { - vec2 Offset; - Offset.x = 0; - Offset.y = 0; - vec2 Scale; - Scale.x = absolute(BorderX0); - Scale.y = absolute(BorderY0); - - Graphics()->RenderBorderTiles(Visuals.m_BufferContainerIndex, Color, (offset_ptr_size)Visuals.m_BorderTopLeft.IndexBufferByteOffset(), Offset, Scale, 1); - } - } - if(BorderY1 > (int)Visuals.m_Height) - { - if(Visuals.m_BorderBottomLeft.DoDraw()) - { - vec2 Offset; - Offset.x = 0; - Offset.y = Visuals.m_Height * 32.0f; - vec2 Scale; - Scale.x = absolute(BorderX0); - Scale.y = BorderY1 - Visuals.m_Height; - - Graphics()->RenderBorderTiles(Visuals.m_BufferContainerIndex, Color, (offset_ptr_size)Visuals.m_BorderBottomLeft.IndexBufferByteOffset(), Offset, Scale, 1); - } - } - } - if(BorderX1 > (int)Visuals.m_Width) - { - // Draw corners on right side - if(BorderY0 < 0) - { - if(Visuals.m_BorderTopRight.DoDraw()) - { - vec2 Offset; - Offset.x = Visuals.m_Width * 32.0f; - Offset.y = 0; - vec2 Scale; - Scale.x = BorderX1 - Visuals.m_Width; - Scale.y = absolute(BorderY0); - - Graphics()->RenderBorderTiles(Visuals.m_BufferContainerIndex, Color, (offset_ptr_size)Visuals.m_BorderTopRight.IndexBufferByteOffset(), Offset, Scale, 1); - } - } - if(BorderY1 > (int)Visuals.m_Height) - { - if(Visuals.m_BorderBottomRight.DoDraw()) - { - vec2 Offset; - Offset.x = Visuals.m_Width * 32.0f; - Offset.y = Visuals.m_Height * 32.0f; - vec2 Scale; - Scale.x = BorderX1 - Visuals.m_Width; - Scale.y = BorderY1 - Visuals.m_Height; - - Graphics()->RenderBorderTiles(Visuals.m_BufferContainerIndex, Color, (offset_ptr_size)Visuals.m_BorderBottomRight.IndexBufferByteOffset(), Offset, Scale, 1); - } - } - } - - if(BorderX1 > (int)Visuals.m_Width) - { - // Draw right border - if(Y0 < (int)Visuals.m_Height && Y1 > 0) - { - int YB = Y1 - 1; - unsigned int DrawNum = ((Visuals.m_vBorderRight[YB].IndexBufferByteOffset() - Visuals.m_vBorderRight[Y0].IndexBufferByteOffset()) / (sizeof(unsigned int) * 6)) + (Visuals.m_vBorderRight[YB].DoDraw() ? 1lu : 0lu); - offset_ptr_size pOffset = (offset_ptr_size)Visuals.m_vBorderRight[Y0].IndexBufferByteOffset(); - vec2 Offset; - Offset.x = 32.f * Visuals.m_Width; - Offset.y = 0.f; - vec2 Scale; - Scale.x = BorderX1 - Visuals.m_Width; - Scale.y = 1.f; - Graphics()->RenderBorderTiles(Visuals.m_BufferContainerIndex, Color, pOffset, Offset, Scale, DrawNum); - } - } - if(BorderX0 < 0) - { - // Draw left border - if(Y0 < (int)Visuals.m_Height && Y1 > 0) - { - int YB = Y1 - 1; - unsigned int DrawNum = ((Visuals.m_vBorderLeft[YB].IndexBufferByteOffset() - Visuals.m_vBorderLeft[Y0].IndexBufferByteOffset()) / (sizeof(unsigned int) * 6)) + (Visuals.m_vBorderLeft[YB].DoDraw() ? 1lu : 0lu); - offset_ptr_size pOffset = (offset_ptr_size)Visuals.m_vBorderLeft[Y0].IndexBufferByteOffset(); - vec2 Offset; - Offset.x = 0; - Offset.y = 0; - vec2 Scale; - Scale.x = absolute(BorderX0); - Scale.y = 1; - Graphics()->RenderBorderTiles(Visuals.m_BufferContainerIndex, Color, pOffset, Offset, Scale, DrawNum); - } - } - if(BorderY0 < 0) - { - // Draw top border - if(X0 < (int)Visuals.m_Width && X1 > 0) - { - int XR = X1 - 1; - unsigned int DrawNum = ((Visuals.m_vBorderTop[XR].IndexBufferByteOffset() - Visuals.m_vBorderTop[X0].IndexBufferByteOffset()) / (sizeof(unsigned int) * 6)) + (Visuals.m_vBorderTop[XR].DoDraw() ? 1lu : 0lu); - offset_ptr_size pOffset = (offset_ptr_size)Visuals.m_vBorderTop[X0].IndexBufferByteOffset(); - vec2 Offset; - Offset.x = 0.f; - Offset.y = 0; - vec2 Scale; - Scale.x = 1; - Scale.y = absolute(BorderY0); - Graphics()->RenderBorderTiles(Visuals.m_BufferContainerIndex, Color, pOffset, Offset, Scale, DrawNum); - } - } - if(BorderY1 > (int)Visuals.m_Height) - { - // Draw bottom border - if(X0 < (int)Visuals.m_Width && X1 > 0) - { - int XR = X1 - 1; - unsigned int DrawNum = ((Visuals.m_vBorderBottom[XR].IndexBufferByteOffset() - Visuals.m_vBorderBottom[X0].IndexBufferByteOffset()) / (sizeof(unsigned int) * 6)) + (Visuals.m_vBorderBottom[XR].DoDraw() ? 1lu : 0lu); - offset_ptr_size pOffset = (offset_ptr_size)Visuals.m_vBorderBottom[X0].IndexBufferByteOffset(); - vec2 Offset; - Offset.x = 0.f; - Offset.y = 32.f * Visuals.m_Height; - vec2 Scale; - Scale.x = 1; - Scale.y = BorderY1 - Visuals.m_Height; - Graphics()->RenderBorderTiles(Visuals.m_BufferContainerIndex, Color, pOffset, Offset, Scale, DrawNum); - } - } -} - -void CMapLayers::RenderKillTileBorder(int LayerIndex, const ColorRGBA &Color) -{ - STileLayerVisuals &Visuals = *m_vpTileLayerVisuals[LayerIndex]; - if(Visuals.m_BufferContainerIndex == -1) - return; //no visuals were created - - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - - bool DrawBorder = false; - - int BorderY0 = std::floor(ScreenY0 / 32); - int BorderX0 = std::floor(ScreenX0 / 32); - int BorderY1 = std::ceil(ScreenY1 / 32); - int BorderX1 = std::ceil(ScreenX1 / 32); - - if(BorderX0 < -201) - DrawBorder = true; - if(BorderY0 < -201) - DrawBorder = true; - if(BorderX1 > (int)Visuals.m_Width + 201) - DrawBorder = true; - if(BorderY1 > (int)Visuals.m_Height + 201) - DrawBorder = true; - - if(!DrawBorder) - return; - if(!Visuals.m_BorderKillTile.DoDraw()) - return; - - if(BorderX0 < -300) - BorderX0 = -300; - if(BorderY0 < -300) - BorderY0 = -300; - if(BorderX1 >= (int)Visuals.m_Width + 300) - BorderX1 = (int)Visuals.m_Width + 299; - if(BorderY1 >= (int)Visuals.m_Height + 300) - BorderY1 = (int)Visuals.m_Height + 299; - - if(BorderX1 < -300) - BorderX1 = -300; - if(BorderY1 < -300) - BorderY1 = -300; - if(BorderX0 >= (int)Visuals.m_Width + 300) - BorderX0 = (int)Visuals.m_Width + 299; - if(BorderY0 >= (int)Visuals.m_Height + 300) - BorderY0 = (int)Visuals.m_Height + 299; - - // Draw left kill tile border - if(BorderX0 < -201) - { - unsigned int DrawNum = 1; - offset_ptr_size pOffset = (offset_ptr_size)Visuals.m_BorderKillTile.IndexBufferByteOffset(); - vec2 Offset; - Offset.x = 32.f * BorderX0; - Offset.y = 32.f * BorderY0; - vec2 Scale; - Scale.x = -201 - BorderX0; - Scale.y = BorderY1 - BorderY0; - Graphics()->RenderBorderTiles(Visuals.m_BufferContainerIndex, Color, pOffset, Offset, Scale, DrawNum); - } - // Draw top kill tile border - if(BorderY0 < -201) - { - unsigned int DrawNum = 1; - offset_ptr_size pOffset = (offset_ptr_size)Visuals.m_BorderKillTile.IndexBufferByteOffset(); - vec2 Offset; - Offset.x = maximum(BorderX0, -201) * 32.0f; - Offset.y = 32.f * BorderY0; - vec2 Scale; - Scale.x = minimum(BorderX1, (int)Visuals.m_Width + 201) - maximum(BorderX0, -201); - Scale.y = -201 - BorderY0; - Graphics()->RenderBorderTiles(Visuals.m_BufferContainerIndex, Color, pOffset, Offset, Scale, DrawNum); - } - // Draw right kill tile border - if(BorderX1 > (int)Visuals.m_Width + 201) - { - unsigned int DrawNum = 1; - offset_ptr_size pOffset = (offset_ptr_size)Visuals.m_BorderKillTile.IndexBufferByteOffset(); - vec2 Offset; - Offset.x = 32.0f * (Visuals.m_Width + 201); - Offset.y = 32.0f * BorderY0; - vec2 Scale; - Scale.x = BorderX1 - (Visuals.m_Width + 201); - Scale.y = BorderY1 - BorderY0; - Graphics()->RenderBorderTiles(Visuals.m_BufferContainerIndex, Color, pOffset, Offset, Scale, DrawNum); - } - // Draw bottom kill tile border - if(BorderY1 > (int)Visuals.m_Height + 201) - { - unsigned int DrawNum = 1; - offset_ptr_size pOffset = (offset_ptr_size)Visuals.m_BorderKillTile.IndexBufferByteOffset(); - vec2 Offset; - Offset.x = maximum(BorderX0, -201) * 32.0f; - Offset.y = 32.0f * (Visuals.m_Height + 201); - vec2 Scale; - Scale.x = minimum(BorderX1, (int)Visuals.m_Width + 201) - maximum(BorderX0, -201); - Scale.y = BorderY1 - (Visuals.m_Height + 201); - Graphics()->RenderBorderTiles(Visuals.m_BufferContainerIndex, Color, pOffset, Offset, Scale, DrawNum); - } -} - -void CMapLayers::RenderQuadLayer(int LayerIndex, CMapItemLayerQuads *pQuadLayer, bool Force) -{ - SQuadLayerVisuals &Visuals = *m_vpQuadLayerVisuals[LayerIndex]; - if(Visuals.m_BufferContainerIndex == -1) - return; //no visuals were created - - if(!Force && (!g_Config.m_ClShowQuads || g_Config.m_ClOverlayEntities == 100)) - return; - - CQuad *pQuads = (CQuad *)m_pLayers->Map()->GetDataSwapped(pQuadLayer->m_Data); - - static std::vector s_vQuadRenderInfo; - - s_vQuadRenderInfo.resize(pQuadLayer->m_NumQuads); - size_t QuadsRenderCount = 0; - size_t CurQuadOffset = 0; - for(int i = 0; i < pQuadLayer->m_NumQuads; ++i) - { - CQuad *pQuad = &pQuads[i]; - - ColorRGBA Color = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - EnvelopeEval(pQuad->m_ColorEnvOffset, pQuad->m_ColorEnv, Color, 4, this); - - const bool IsFullyTransparent = Color.a <= 0.0f; - const bool NeedsFlush = QuadsRenderCount == gs_GraphicsMaxQuadsRenderCount || IsFullyTransparent; - - if(NeedsFlush) - { - // render quads of the current offset directly(cancel batching) - Graphics()->RenderQuadLayer(Visuals.m_BufferContainerIndex, s_vQuadRenderInfo.data(), QuadsRenderCount, CurQuadOffset); - QuadsRenderCount = 0; - CurQuadOffset = i; - if(IsFullyTransparent) - { - // since this quad is ignored, the offset is the next quad - ++CurQuadOffset; - } - } - - if(!IsFullyTransparent) - { - ColorRGBA Position = ColorRGBA(0.0f, 0.0f, 0.0f, 0.0f); - EnvelopeEval(pQuad->m_PosEnvOffset, pQuad->m_PosEnv, Position, 3, this); - - SQuadRenderInfo &QInfo = s_vQuadRenderInfo[QuadsRenderCount++]; - QInfo.m_Color = Color; - QInfo.m_Offsets.x = Position.r; - QInfo.m_Offsets.y = Position.g; - QInfo.m_Rotation = Position.b / 180.0f * pi; - } - } - Graphics()->RenderQuadLayer(Visuals.m_BufferContainerIndex, s_vQuadRenderInfo.data(), QuadsRenderCount, CurQuadOffset); -} - -void CMapLayers::LayersOfGroupCount(CMapItemGroup *pGroup, int &TileLayerCount, int &QuadLayerCount, bool &PassedGameLayer) -{ - int TileLayerCounter = 0; - int QuadLayerCounter = 0; - for(int l = 0; l < pGroup->m_NumLayers; l++) - { - CMapItemLayer *pLayer = m_pLayers->GetLayer(pGroup->m_StartLayer + l); - bool IsFrontLayer = false; - bool IsSwitchLayer = false; - bool IsTeleLayer = false; - bool IsSpeedupLayer = false; - bool IsTuneLayer = false; - - if(pLayer == (CMapItemLayer *)m_pLayers->GameLayer()) - { - PassedGameLayer = true; - } - - if(pLayer == (CMapItemLayer *)m_pLayers->FrontLayer()) - IsFrontLayer = true; - - if(pLayer == (CMapItemLayer *)m_pLayers->SwitchLayer()) - IsSwitchLayer = true; - - if(pLayer == (CMapItemLayer *)m_pLayers->TeleLayer()) - IsTeleLayer = true; - - if(pLayer == (CMapItemLayer *)m_pLayers->SpeedupLayer()) - IsSpeedupLayer = true; - - if(pLayer == (CMapItemLayer *)m_pLayers->TuneLayer()) - IsTuneLayer = true; - - if(m_Type <= TYPE_BACKGROUND_FORCE) - { - if(PassedGameLayer) - break; - } - else if(m_Type == TYPE_FOREGROUND) - { - if(!PassedGameLayer) - continue; - } - - if(pLayer->m_Type == LAYERTYPE_TILES) - { - CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; - int DataIndex = 0; - unsigned int TileSize = 0; - int TileLayerAndOverlayCount = 0; - if(IsFrontLayer) - { - DataIndex = pTMap->m_Front; - TileSize = sizeof(CTile); - TileLayerAndOverlayCount = 1; - } - else if(IsSwitchLayer) - { - DataIndex = pTMap->m_Switch; - TileSize = sizeof(CSwitchTile); - TileLayerAndOverlayCount = 3; - } - else if(IsTeleLayer) - { - DataIndex = pTMap->m_Tele; - TileSize = sizeof(CTeleTile); - TileLayerAndOverlayCount = 2; - } - else if(IsSpeedupLayer) - { - DataIndex = pTMap->m_Speedup; - TileSize = sizeof(CSpeedupTile); - TileLayerAndOverlayCount = 3; - } - else if(IsTuneLayer) - { - DataIndex = pTMap->m_Tune; - TileSize = sizeof(CTuneTile); - TileLayerAndOverlayCount = 1; - } - else - { - DataIndex = pTMap->m_Data; - TileSize = sizeof(CTile); - TileLayerAndOverlayCount = 1; - } - - unsigned int Size = m_pLayers->Map()->GetDataSize(DataIndex); - if(Size >= pTMap->m_Width * pTMap->m_Height * TileSize) - { - TileLayerCounter += TileLayerAndOverlayCount; - } - } - else if(pLayer->m_Type == LAYERTYPE_QUADS) - { - ++QuadLayerCounter; - } - } - - TileLayerCount += TileLayerCounter; - QuadLayerCount += QuadLayerCounter; -} - -void CMapLayers::OnRender() -{ - if(m_OnlineOnly && Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - CUIRect Screen; - Graphics()->GetScreen(&Screen.x, &Screen.y, &Screen.w, &Screen.h); - - vec2 Center = GetCurCamera()->m_Center; - - bool PassedGameLayer = false; - int TileLayerCounter = 0; - int QuadLayerCounter = 0; - - for(int g = 0; g < m_pLayers->NumGroups(); g++) - { - CMapItemGroup *pGroup = m_pLayers->GetGroup(g); - - if(!pGroup) - { - dbg_msg("maplayers", "error group was null, group number = %d, total groups = %d", g, m_pLayers->NumGroups()); - dbg_msg("maplayers", "this is here to prevent a crash but the source of this is unknown, please report this for it to get fixed"); - dbg_msg("maplayers", "we need mapname and crc and the map that caused this if possible, and anymore info you think is relevant"); - continue; - } - - if((!g_Config.m_GfxNoclip || m_Type == TYPE_FULL_DESIGN) && pGroup->m_Version >= 2 && pGroup->m_UseClipping) - { - // set clipping - float aPoints[4]; - RenderTools()->MapScreenToGroup(Center.x, Center.y, m_pLayers->GameGroup(), GetCurCamera()->m_Zoom); - Graphics()->GetScreen(&aPoints[0], &aPoints[1], &aPoints[2], &aPoints[3]); - float x0 = (pGroup->m_ClipX - aPoints[0]) / (aPoints[2] - aPoints[0]); - float y0 = (pGroup->m_ClipY - aPoints[1]) / (aPoints[3] - aPoints[1]); - float x1 = ((pGroup->m_ClipX + pGroup->m_ClipW) - aPoints[0]) / (aPoints[2] - aPoints[0]); - float y1 = ((pGroup->m_ClipY + pGroup->m_ClipH) - aPoints[1]) / (aPoints[3] - aPoints[1]); - - if(x1 < 0.0f || x0 > 1.0f || y1 < 0.0f || y0 > 1.0f) - { - //check tile layer count of this group - LayersOfGroupCount(pGroup, TileLayerCounter, QuadLayerCounter, PassedGameLayer); - continue; - } - - Graphics()->ClipEnable((int)(x0 * Graphics()->ScreenWidth()), (int)(y0 * Graphics()->ScreenHeight()), - (int)((x1 - x0) * Graphics()->ScreenWidth()), (int)((y1 - y0) * Graphics()->ScreenHeight())); - } - - RenderTools()->MapScreenToGroup(Center.x, Center.y, pGroup, GetCurCamera()->m_Zoom); - - for(int l = 0; l < pGroup->m_NumLayers; l++) - { - CMapItemLayer *pLayer = m_pLayers->GetLayer(pGroup->m_StartLayer + l); - bool Render = false; - bool IsGameLayer = false; - bool IsFrontLayer = false; - bool IsSwitchLayer = false; - bool IsTeleLayer = false; - bool IsSpeedupLayer = false; - bool IsTuneLayer = false; - bool IsEntityLayer = false; - - if(pLayer == (CMapItemLayer *)m_pLayers->GameLayer()) - { - IsEntityLayer = IsGameLayer = true; - PassedGameLayer = true; - } - - if(pLayer == (CMapItemLayer *)m_pLayers->FrontLayer()) - IsEntityLayer = IsFrontLayer = true; - - if(pLayer == (CMapItemLayer *)m_pLayers->SwitchLayer()) - IsEntityLayer = IsSwitchLayer = true; - - if(pLayer == (CMapItemLayer *)m_pLayers->TeleLayer()) - IsEntityLayer = IsTeleLayer = true; - - if(pLayer == (CMapItemLayer *)m_pLayers->SpeedupLayer()) - IsEntityLayer = IsSpeedupLayer = true; - - if(pLayer == (CMapItemLayer *)m_pLayers->TuneLayer()) - IsEntityLayer = IsTuneLayer = true; - - if(m_Type == -1) - Render = true; - else if(m_Type <= TYPE_BACKGROUND_FORCE) - { - if(PassedGameLayer) - return; - Render = true; - - if(m_Type == TYPE_BACKGROUND_FORCE) - { - if(pLayer->m_Type == LAYERTYPE_TILES && !g_Config.m_ClBackgroundShowTilesLayers) - continue; - } - } - else if(m_Type == TYPE_FOREGROUND) - { - if(PassedGameLayer && !IsGameLayer) - Render = true; - } - else if(m_Type == TYPE_FULL_DESIGN) - { - if(!IsGameLayer) - Render = true; - } - - if(Render && pLayer->m_Type == LAYERTYPE_TILES && Input()->ModifierIsPressed() && Input()->ShiftIsPressed() && Input()->KeyPress(KEY_KP_0)) - { - CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; - CTile *pTiles = (CTile *)m_pLayers->Map()->GetData(pTMap->m_Data); - CServerInfo CurrentServerInfo; - Client()->GetServerInfo(&CurrentServerInfo); - char aFilename[IO_MAX_PATH_LENGTH]; - str_format(aFilename, sizeof(aFilename), "dumps/tilelayer_dump_%s-%d-%d-%dx%d.txt", CurrentServerInfo.m_aMap, g, l, pTMap->m_Width, pTMap->m_Height); - IOHANDLE File = Storage()->OpenFile(aFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE); - if(File) - { - for(int y = 0; y < pTMap->m_Height; y++) - { - for(int x = 0; x < pTMap->m_Width; x++) - io_write(File, &(pTiles[y * pTMap->m_Width + x].m_Index), sizeof(pTiles[y * pTMap->m_Width + x].m_Index)); - io_write_newline(File); - } - io_close(File); - } - } - - if((Render || IsGameLayer) && pLayer->m_Type == LAYERTYPE_TILES) - { - CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; - int DataIndex = 0; - unsigned int TileSize = 0; - int TileLayerAndOverlayCount = 0; - if(IsFrontLayer) - { - DataIndex = pTMap->m_Front; - TileSize = sizeof(CTile); - TileLayerAndOverlayCount = 1; - } - else if(IsSwitchLayer) - { - DataIndex = pTMap->m_Switch; - TileSize = sizeof(CSwitchTile); - TileLayerAndOverlayCount = 3; - } - else if(IsTeleLayer) - { - DataIndex = pTMap->m_Tele; - TileSize = sizeof(CTeleTile); - TileLayerAndOverlayCount = 2; - } - else if(IsSpeedupLayer) - { - DataIndex = pTMap->m_Speedup; - TileSize = sizeof(CSpeedupTile); - TileLayerAndOverlayCount = 3; - } - else if(IsTuneLayer) - { - DataIndex = pTMap->m_Tune; - TileSize = sizeof(CTuneTile); - TileLayerAndOverlayCount = 1; - } - else - { - DataIndex = pTMap->m_Data; - TileSize = sizeof(CTile); - TileLayerAndOverlayCount = 1; - } - - unsigned int Size = m_pLayers->Map()->GetDataSize(DataIndex); - if(Size >= pTMap->m_Width * pTMap->m_Height * TileSize) - { - TileLayerCounter += TileLayerAndOverlayCount; - } - } - else if(Render && pLayer->m_Type == LAYERTYPE_QUADS) - { - ++QuadLayerCounter; - } - - // skip rendering if detail layers if not wanted, or is entity layer and we are a background map - if((pLayer->m_Flags & LAYERFLAG_DETAIL && (!g_Config.m_GfxHighDetail && !(m_Type == TYPE_FULL_DESIGN)) && !IsGameLayer) || (m_Type == TYPE_BACKGROUND_FORCE && IsEntityLayer) || (m_Type == TYPE_FULL_DESIGN && IsEntityLayer)) - continue; - - int EntityOverlayVal = g_Config.m_ClOverlayEntities; - if(m_Type == TYPE_FULL_DESIGN) - EntityOverlayVal = 0; - - if((Render && EntityOverlayVal < 100 && !IsGameLayer && !IsFrontLayer && !IsSwitchLayer && !IsTeleLayer && !IsSpeedupLayer && !IsTuneLayer) || (EntityOverlayVal && IsGameLayer) || (m_Type == TYPE_BACKGROUND_FORCE)) - { - if(pLayer->m_Type == LAYERTYPE_TILES) - { - CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; - if(IsGameLayer) - { - Graphics()->TextureSet(m_pImages->GetEntities(MAP_IMAGE_ENTITY_LAYER_TYPE_ALL_EXCEPT_SWITCH)); - } - else if(pTMap->m_Image >= 0 && pTMap->m_Image < m_pImages->Num()) - { - Graphics()->TextureSet(m_pImages->Get(pTMap->m_Image)); - } - else - { - Graphics()->TextureClear(); - } - - CTile *pTiles = (CTile *)m_pLayers->Map()->GetData(pTMap->m_Data); - unsigned int Size = m_pLayers->Map()->GetDataSize(pTMap->m_Data); - - if(Size >= (size_t)pTMap->m_Width * pTMap->m_Height * sizeof(CTile)) - { - ColorRGBA Color = IsGameLayer ? ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f) : ColorRGBA(pTMap->m_Color.r / 255.0f, pTMap->m_Color.g / 255.0f, pTMap->m_Color.b / 255.0f, pTMap->m_Color.a / 255.0f); - if(IsGameLayer && EntityOverlayVal) - Color.a *= EntityOverlayVal / 100.0f; - else if(!IsGameLayer && EntityOverlayVal && m_Type != TYPE_BACKGROUND_FORCE) - Color.a *= (100 - EntityOverlayVal) / 100.0f; - - if(!IsGameLayer) - { - ColorRGBA ColorEnv = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - EnvelopeEval(pTMap->m_ColorEnvOffset, pTMap->m_ColorEnv, ColorEnv, 4, this); - Color = Color.Multiply(ColorEnv); - } - - if(!Graphics()->IsTileBufferingEnabled()) - { - Graphics()->BlendNone(); - RenderTools()->RenderTilemap(pTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND | LAYERRENDERFLAG_OPAQUE); - Graphics()->BlendNormal(); - - // draw kill tiles outside the entity clipping rectangle - if(IsGameLayer) - { - // slow blinking to hint that it's not a part of the map - double Seconds = time_get() / (double)time_freq(); - ColorRGBA ColorHint = ColorRGBA(1.0f, 1.0f, 1.0f, 0.3 + 0.7 * (1 + std::sin(2 * (double)pi * Seconds / 3)) / 2); - RenderTools()->RenderTileRectangle(-201, -201, pTMap->m_Width + 402, pTMap->m_Height + 402, - 0, TILE_DEATH, // display air inside, death outside - 32.0f, Color.Multiply(ColorHint), TILERENDERFLAG_EXTEND | LAYERRENDERFLAG_TRANSPARENT); - } - - RenderTools()->RenderTilemap(pTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND | LAYERRENDERFLAG_TRANSPARENT); - } - else - { - Graphics()->BlendNormal(); - // draw kill tiles outside the entity clipping rectangle - if(IsGameLayer) - { - // slow blinking to hint that it's not a part of the map - double Seconds = time_get() / (double)time_freq(); - ColorRGBA ColorHint = ColorRGBA(1.0f, 1.0f, 1.0f, 0.3 + 0.7 * (1.0 + std::sin(2 * (double)pi * Seconds / 3)) / 2); - RenderKillTileBorder(TileLayerCounter - 1, Color.Multiply(ColorHint)); - } - RenderTileLayer(TileLayerCounter - 1, Color); - } - } - } - else if(pLayer->m_Type == LAYERTYPE_QUADS) - { - CMapItemLayerQuads *pQLayer = (CMapItemLayerQuads *)pLayer; - if(pQLayer->m_Image >= 0 && pQLayer->m_Image < m_pImages->Num()) - { - Graphics()->TextureSet(m_pImages->Get(pQLayer->m_Image)); - } - else - { - Graphics()->TextureClear(); - } - - CQuad *pQuads = (CQuad *)m_pLayers->Map()->GetDataSwapped(pQLayer->m_Data); - if(m_Type == TYPE_BACKGROUND_FORCE || m_Type == TYPE_FULL_DESIGN) - { - if(g_Config.m_ClShowQuads || m_Type == TYPE_FULL_DESIGN) - { - if(!Graphics()->IsQuadBufferingEnabled()) - { - Graphics()->BlendNormal(); - RenderTools()->ForceRenderQuads(pQuads, pQLayer->m_NumQuads, LAYERRENDERFLAG_TRANSPARENT, EnvelopeEval, this, 1.f); - } - else - { - RenderQuadLayer(QuadLayerCounter - 1, pQLayer, true); - } - } - } - else - { - if(!Graphics()->IsQuadBufferingEnabled()) - { - Graphics()->BlendNormal(); - RenderTools()->RenderQuads(pQuads, pQLayer->m_NumQuads, LAYERRENDERFLAG_TRANSPARENT, EnvelopeEval, this); - } - else - { - RenderQuadLayer(QuadLayerCounter - 1, pQLayer, false); - } - } - } - } - else if(Render && EntityOverlayVal && IsFrontLayer) - { - CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; - Graphics()->TextureSet(m_pImages->GetEntities(MAP_IMAGE_ENTITY_LAYER_TYPE_ALL_EXCEPT_SWITCH)); - - CTile *pFrontTiles = (CTile *)m_pLayers->Map()->GetData(pTMap->m_Front); - unsigned int Size = m_pLayers->Map()->GetDataSize(pTMap->m_Front); - - if(Size >= (size_t)pTMap->m_Width * pTMap->m_Height * sizeof(CTile)) - { - const ColorRGBA Color = ColorRGBA(1.0f, 1.0f, 1.0f, EntityOverlayVal / 100.0f); - if(!Graphics()->IsTileBufferingEnabled()) - { - Graphics()->BlendNone(); - RenderTools()->RenderTilemap(pFrontTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND | LAYERRENDERFLAG_OPAQUE); - Graphics()->BlendNormal(); - RenderTools()->RenderTilemap(pFrontTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND | LAYERRENDERFLAG_TRANSPARENT); - } - else - { - Graphics()->BlendNormal(); - RenderTileLayer(TileLayerCounter - 1, Color); - } - } - } - else if(Render && EntityOverlayVal && IsSwitchLayer) - { - CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; - Graphics()->TextureSet(m_pImages->GetEntities(MAP_IMAGE_ENTITY_LAYER_TYPE_SWITCH)); - - CSwitchTile *pSwitchTiles = (CSwitchTile *)m_pLayers->Map()->GetData(pTMap->m_Switch); - unsigned int Size = m_pLayers->Map()->GetDataSize(pTMap->m_Switch); - - if(Size >= (size_t)pTMap->m_Width * pTMap->m_Height * sizeof(CSwitchTile)) - { - const ColorRGBA Color = ColorRGBA(1.0f, 1.0f, 1.0f, EntityOverlayVal / 100.0f); - if(!Graphics()->IsTileBufferingEnabled()) - { - Graphics()->BlendNone(); - RenderTools()->RenderSwitchmap(pSwitchTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND | LAYERRENDERFLAG_OPAQUE); - Graphics()->BlendNormal(); - RenderTools()->RenderSwitchmap(pSwitchTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND | LAYERRENDERFLAG_TRANSPARENT); - RenderTools()->RenderSwitchOverlay(pSwitchTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, EntityOverlayVal / 100.0f); - } - else - { - Graphics()->BlendNormal(); - RenderTileLayer(TileLayerCounter - 3, Color); - if(g_Config.m_ClTextEntities) - { - Graphics()->TextureSet(m_pImages->GetOverlayTop()); - RenderTileLayer(TileLayerCounter - 2, Color); - Graphics()->TextureSet(m_pImages->GetOverlayBottom()); - RenderTileLayer(TileLayerCounter - 1, Color); - } - } - } - } - else if(Render && EntityOverlayVal && IsTeleLayer) - { - CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; - Graphics()->TextureSet(m_pImages->GetEntities(MAP_IMAGE_ENTITY_LAYER_TYPE_ALL_EXCEPT_SWITCH)); - - CTeleTile *pTeleTiles = (CTeleTile *)m_pLayers->Map()->GetData(pTMap->m_Tele); - unsigned int Size = m_pLayers->Map()->GetDataSize(pTMap->m_Tele); - - if(Size >= (size_t)pTMap->m_Width * pTMap->m_Height * sizeof(CTeleTile)) - { - const ColorRGBA Color = ColorRGBA(1.0f, 1.0f, 1.0f, EntityOverlayVal / 100.0f); - if(!Graphics()->IsTileBufferingEnabled()) - { - Graphics()->BlendNone(); - RenderTools()->RenderTelemap(pTeleTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND | LAYERRENDERFLAG_OPAQUE); - Graphics()->BlendNormal(); - RenderTools()->RenderTelemap(pTeleTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND | LAYERRENDERFLAG_TRANSPARENT); - RenderTools()->RenderTeleOverlay(pTeleTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, EntityOverlayVal / 100.0f); - } - else - { - Graphics()->BlendNormal(); - RenderTileLayer(TileLayerCounter - 2, Color); - if(g_Config.m_ClTextEntities) - { - Graphics()->TextureSet(m_pImages->GetOverlayCenter()); - RenderTileLayer(TileLayerCounter - 1, Color); - } - } - } - } - else if(Render && EntityOverlayVal && IsSpeedupLayer) - { - CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; - Graphics()->TextureSet(m_pImages->GetEntities(MAP_IMAGE_ENTITY_LAYER_TYPE_ALL_EXCEPT_SWITCH)); - - CSpeedupTile *pSpeedupTiles = (CSpeedupTile *)m_pLayers->Map()->GetData(pTMap->m_Speedup); - unsigned int Size = m_pLayers->Map()->GetDataSize(pTMap->m_Speedup); - - if(Size >= (size_t)pTMap->m_Width * pTMap->m_Height * sizeof(CSpeedupTile)) - { - const ColorRGBA Color = ColorRGBA(1.0f, 1.0f, 1.0f, EntityOverlayVal / 100.0f); - if(!Graphics()->IsTileBufferingEnabled()) - { - Graphics()->BlendNone(); - RenderTools()->RenderSpeedupmap(pSpeedupTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND | LAYERRENDERFLAG_OPAQUE); - Graphics()->BlendNormal(); - RenderTools()->RenderSpeedupmap(pSpeedupTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND | LAYERRENDERFLAG_TRANSPARENT); - RenderTools()->RenderSpeedupOverlay(pSpeedupTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, EntityOverlayVal / 100.0f); - } - else - { - Graphics()->BlendNormal(); - - // draw arrow -- clamp to the edge of the arrow image - Graphics()->WrapClamp(); - Graphics()->TextureSet(m_pImages->GetSpeedupArrow()); - RenderTileLayer(TileLayerCounter - 3, Color); - Graphics()->WrapNormal(); - - if(g_Config.m_ClTextEntities) - { - Graphics()->TextureSet(m_pImages->GetOverlayBottom()); - RenderTileLayer(TileLayerCounter - 2, Color); - Graphics()->TextureSet(m_pImages->GetOverlayTop()); - RenderTileLayer(TileLayerCounter - 1, Color); - } - } - } - } - else if(Render && EntityOverlayVal && IsTuneLayer) - { - CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; - Graphics()->TextureSet(m_pImages->GetEntities(MAP_IMAGE_ENTITY_LAYER_TYPE_ALL_EXCEPT_SWITCH)); - - CTuneTile *pTuneTiles = (CTuneTile *)m_pLayers->Map()->GetData(pTMap->m_Tune); - unsigned int Size = m_pLayers->Map()->GetDataSize(pTMap->m_Tune); - - if(Size >= (size_t)pTMap->m_Width * pTMap->m_Height * sizeof(CTuneTile)) - { - const ColorRGBA Color = ColorRGBA(1.0f, 1.0f, 1.0f, EntityOverlayVal / 100.0f); - if(!Graphics()->IsTileBufferingEnabled()) - { - Graphics()->BlendNone(); - RenderTools()->RenderTunemap(pTuneTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND | LAYERRENDERFLAG_OPAQUE); - Graphics()->BlendNormal(); - RenderTools()->RenderTunemap(pTuneTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND | LAYERRENDERFLAG_TRANSPARENT); - } - else - { - Graphics()->BlendNormal(); - RenderTileLayer(TileLayerCounter - 1, Color); - } - } - } - } - if(!g_Config.m_GfxNoclip || m_Type == TYPE_FULL_DESIGN) - Graphics()->ClipDisable(); - } - - if(!g_Config.m_GfxNoclip || m_Type == TYPE_FULL_DESIGN) - Graphics()->ClipDisable(); - - // reset the screen like it was before - Graphics()->MapScreen(Screen.x, Screen.y, Screen.w, Screen.h); -} diff --git a/src/game/client/components/maplayers.h b/src/game/client/components/maplayers.h deleted file mode 100644 index 4377a0f550..0000000000 --- a/src/game/client/components/maplayers.h +++ /dev/null @@ -1,159 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_MAPLAYERS_H -#define GAME_CLIENT_COMPONENTS_MAPLAYERS_H -#include - -#include -#include - -#define INDEX_BUFFER_GROUP_WIDTH 12 -#define INDEX_BUFFER_GROUP_HEIGHT 9 -#define INDEX_BORDER_BUFFER_GROUP_SIZE 20 - -typedef char *offset_ptr_size; -typedef uintptr_t offset_ptr; -typedef unsigned int offset_ptr32; - -class CCamera; -class CLayers; -class CMapImages; -class ColorRGBA; -struct CMapItemGroup; -struct CMapItemLayerTilemap; -struct CMapItemLayerQuads; - -class CMapLayers : public CComponent -{ - friend class CBackground; - friend class CMenuBackground; - - CLayers *m_pLayers; - CMapImages *m_pImages; - - int m_Type; - bool m_OnlineOnly; - - struct STileLayerVisuals - { - STileLayerVisuals() : - m_pTilesOfLayer(nullptr) - { - m_Width = 0; - m_Height = 0; - m_BufferContainerIndex = -1; - m_IsTextured = false; - } - - bool Init(unsigned int Width, unsigned int Height); - - ~STileLayerVisuals(); - - struct STileVisual - { - STileVisual() : - m_IndexBufferByteOffset(0) {} - - private: - offset_ptr32 m_IndexBufferByteOffset; - - public: - bool DoDraw() - { - return (m_IndexBufferByteOffset & 0x10000000) != 0; - } - - void Draw(bool SetDraw) - { - m_IndexBufferByteOffset = (SetDraw ? 0x10000000 : (offset_ptr32)0) | (m_IndexBufferByteOffset & 0xEFFFFFFF); - } - - offset_ptr IndexBufferByteOffset() - { - return ((offset_ptr)(m_IndexBufferByteOffset & 0xEFFFFFFF) * 6 * sizeof(uint32_t)); - } - - void SetIndexBufferByteOffset(offset_ptr32 IndexBufferByteOff) - { - m_IndexBufferByteOffset = IndexBufferByteOff | (m_IndexBufferByteOffset & 0x10000000); - } - - void AddIndexBufferByteOffset(offset_ptr32 IndexBufferByteOff) - { - m_IndexBufferByteOffset = ((m_IndexBufferByteOffset & 0xEFFFFFFF) + IndexBufferByteOff) | (m_IndexBufferByteOffset & 0x10000000); - } - }; - STileVisual *m_pTilesOfLayer; - - STileVisual m_BorderTopLeft; - STileVisual m_BorderTopRight; - STileVisual m_BorderBottomRight; - STileVisual m_BorderBottomLeft; - - STileVisual m_BorderKillTile; //end of map kill tile -- game layer only - - std::vector m_vBorderTop; - std::vector m_vBorderLeft; - std::vector m_vBorderRight; - std::vector m_vBorderBottom; - - unsigned int m_Width; - unsigned int m_Height; - int m_BufferContainerIndex; - bool m_IsTextured; - }; - std::vector m_vpTileLayerVisuals; - - struct SQuadLayerVisuals - { - SQuadLayerVisuals() : - m_QuadNum(0), m_pQuadsOfLayer(nullptr), m_BufferContainerIndex(-1), m_IsTextured(false) {} - - struct SQuadVisual - { - SQuadVisual() : - m_IndexBufferByteOffset(0) {} - - offset_ptr m_IndexBufferByteOffset; - }; - - int m_QuadNum; - SQuadVisual *m_pQuadsOfLayer; - - int m_BufferContainerIndex; - bool m_IsTextured; - }; - std::vector m_vpQuadLayerVisuals; - - virtual CCamera *GetCurCamera(); - virtual const char *LoadingTitle() const; - - void LayersOfGroupCount(CMapItemGroup *pGroup, int &TileLayerCount, int &QuadLayerCount, bool &PassedGameLayer); - -public: - enum - { - TYPE_BACKGROUND = 0, - TYPE_BACKGROUND_FORCE, - TYPE_FOREGROUND, - TYPE_FULL_DESIGN, - TYPE_ALL = -1, - }; - - CMapLayers(int Type, bool OnlineOnly = true); - virtual ~CMapLayers(); - virtual int Sizeof() const override { return sizeof(*this); } - virtual void OnInit() override; - virtual void OnRender() override; - virtual void OnMapLoad() override; - - static void EnvelopeEval(int TimeOffsetMillis, int Env, ColorRGBA &Result, size_t Channels, void *pUser); - -private: - void RenderTileLayer(int LayerIndex, const ColorRGBA &Color); - void RenderTileBorder(int LayerIndex, const ColorRGBA &Color, int BorderX0, int BorderY0, int BorderX1, int BorderY1); - void RenderKillTileBorder(int LayerIndex, const ColorRGBA &Color); - void RenderQuadLayer(int LayerIndex, CMapItemLayerQuads *pQuadLayer, bool ForceRender = false); -}; - -#endif diff --git a/src/game/client/components/mapsounds.cpp b/src/game/client/components/mapsounds.cpp deleted file mode 100644 index cf8d0b491f..0000000000 --- a/src/game/client/components/mapsounds.cpp +++ /dev/null @@ -1,236 +0,0 @@ -#include "mapsounds.h" - -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -CMapSounds::CMapSounds() -{ - m_Count = 0; -} - -void CMapSounds::Play(int Channel, int SoundId) -{ - if(SoundId < 0 || SoundId >= m_Count) - return; - - m_pClient->m_Sounds.PlaySample(Channel, m_aSounds[SoundId], 0, 1.0f); -} - -void CMapSounds::PlayAt(int Channel, int SoundId, vec2 Position) -{ - if(SoundId < 0 || SoundId >= m_Count) - return; - - m_pClient->m_Sounds.PlaySampleAt(Channel, m_aSounds[SoundId], 0, 1.0f, Position); -} - -void CMapSounds::OnMapLoad() -{ - IMap *pMap = Kernel()->RequestInterface(); - - Clear(); - - if(!Sound()->IsSoundEnabled()) - return; - - // load samples - int Start; - pMap->GetType(MAPITEMTYPE_SOUND, &Start, &m_Count); - - m_Count = clamp(m_Count, 0, MAX_MAPSOUNDS); - - // load new samples - bool ShowWarning = false; - for(int i = 0; i < m_Count; i++) - { - CMapItemSound *pSound = (CMapItemSound *)pMap->GetItem(Start + i); - if(pSound->m_External) - { - const char *pName = pMap->GetDataString(pSound->m_SoundName); - if(pName == nullptr || pName[0] == '\0') - { - log_error("mapsounds", "Failed to load map sound %d: failed to load name.", i); - ShowWarning = true; - continue; - } - - char aBuf[IO_MAX_PATH_LENGTH]; - str_format(aBuf, sizeof(aBuf), "mapres/%s.opus", pName); - m_aSounds[i] = Sound()->LoadOpus(aBuf); - pMap->UnloadData(pSound->m_SoundName); - } - else - { - const void *pData = pMap->GetData(pSound->m_SoundData); - if(pData == nullptr) - { - log_error("mapsounds", "Failed to load map sound %d: failed to load data.", i); - ShowWarning = true; - continue; - } - const int SoundDataSize = pMap->GetDataSize(pSound->m_SoundData); - m_aSounds[i] = Sound()->LoadOpusFromMem(pData, SoundDataSize); - pMap->UnloadData(pSound->m_SoundData); - } - ShowWarning = ShowWarning || m_aSounds[i] == -1; - } - if(ShowWarning) - { - Client()->AddWarning(SWarning(Localize("Some map sounds could not be loaded. Check the local console for details."))); - } - - // enqueue sound sources - for(int GroupIndex = 0; GroupIndex < Layers()->NumGroups(); GroupIndex++) - { - const CMapItemGroup *pGroup = Layers()->GetGroup(GroupIndex); - if(!pGroup) - continue; - - for(int LayerIndex = 0; LayerIndex < pGroup->m_NumLayers; LayerIndex++) - { - const CMapItemLayer *pLayer = Layers()->GetLayer(pGroup->m_StartLayer + LayerIndex); - if(!pLayer) - continue; - if(pLayer->m_Type != LAYERTYPE_SOUNDS) - continue; - - const CMapItemLayerSounds *pSoundLayer = reinterpret_cast(pLayer); - if(pSoundLayer->m_Version < 1 || pSoundLayer->m_Version > CMapItemLayerSounds::CURRENT_VERSION) - continue; - if(pSoundLayer->m_Sound < 0 || pSoundLayer->m_Sound >= m_Count || m_aSounds[pSoundLayer->m_Sound] == -1) - continue; - - const CSoundSource *pSources = static_cast(Layers()->Map()->GetDataSwapped(pSoundLayer->m_Data)); - if(!pSources) - continue; - - const size_t NumSources = minimum(pSoundLayer->m_NumSources, Layers()->Map()->GetDataSize(pSoundLayer->m_Data) / sizeof(CSoundSource)); - for(size_t SourceIndex = 0; SourceIndex < NumSources; SourceIndex++) - { - CSourceQueueEntry Source; - Source.m_Sound = pSoundLayer->m_Sound; - Source.m_HighDetail = pLayer->m_Flags & LAYERFLAG_DETAIL; - Source.m_pGroup = pGroup; - Source.m_pSource = &pSources[SourceIndex]; - m_vSourceQueue.push_back(Source); - } - } - } -} - -void CMapSounds::OnRender() -{ - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - bool DemoPlayerPaused = Client()->State() == IClient::STATE_DEMOPLAYBACK && DemoPlayer()->BaseInfo()->m_Paused; - - // enqueue sounds - for(auto &Source : m_vSourceQueue) - { - static float s_Time = 0.0f; - if(m_pClient->m_Snap.m_pGameInfoObj) // && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED)) - { - s_Time = mix((Client()->PrevGameTick(g_Config.m_ClDummy) - m_pClient->m_Snap.m_pGameInfoObj->m_RoundStartTick) / (float)Client()->GameTickSpeed(), - (Client()->GameTick(g_Config.m_ClDummy) - m_pClient->m_Snap.m_pGameInfoObj->m_RoundStartTick) / (float)Client()->GameTickSpeed(), - Client()->IntraGameTick(g_Config.m_ClDummy)); - } - float Offset = s_Time - Source.m_pSource->m_TimeDelay; - if(!DemoPlayerPaused && Offset >= 0.0f && g_Config.m_SndEnable && (g_Config.m_GfxHighDetail || !Source.m_HighDetail)) - { - if(Source.m_Voice.IsValid()) - { - // currently playing, set offset - Sound()->SetVoiceTimeOffset(Source.m_Voice, Offset); - } - else - { - // need to enqueue - int Flags = 0; - if(Source.m_pSource->m_Loop) - Flags |= ISound::FLAG_LOOP; - if(!Source.m_pSource->m_Pan) - Flags |= ISound::FLAG_NO_PANNING; - - Source.m_Voice = m_pClient->m_Sounds.PlaySampleAt(CSounds::CHN_MAPSOUND, m_aSounds[Source.m_Sound], Flags, 1.0f, vec2(fx2f(Source.m_pSource->m_Position.x), fx2f(Source.m_pSource->m_Position.y))); - Sound()->SetVoiceTimeOffset(Source.m_Voice, Offset); - Sound()->SetVoiceFalloff(Source.m_Voice, Source.m_pSource->m_Falloff / 255.0f); - switch(Source.m_pSource->m_Shape.m_Type) - { - case CSoundShape::SHAPE_CIRCLE: - { - Sound()->SetVoiceCircle(Source.m_Voice, Source.m_pSource->m_Shape.m_Circle.m_Radius); - break; - } - - case CSoundShape::SHAPE_RECTANGLE: - { - Sound()->SetVoiceRectangle(Source.m_Voice, fx2f(Source.m_pSource->m_Shape.m_Rectangle.m_Width), fx2f(Source.m_pSource->m_Shape.m_Rectangle.m_Height)); - break; - } - }; - } - } - else - { - // stop voice - Sound()->StopVoice(Source.m_Voice); - Source.m_Voice = ISound::CVoiceHandle(); - } - } - - const vec2 Center = m_pClient->m_Camera.m_Center; - for(const auto &Source : m_vSourceQueue) - { - if(!Source.m_Voice.IsValid()) - continue; - - ColorRGBA Position = ColorRGBA(0.0f, 0.0f, 0.0f, 0.0f); - CMapLayers::EnvelopeEval(Source.m_pSource->m_PosEnvOffset, Source.m_pSource->m_PosEnv, Position, 2, &m_pClient->m_MapLayersBackground); - - float x = fx2f(Source.m_pSource->m_Position.x) + Position.r; - float y = fx2f(Source.m_pSource->m_Position.y) + Position.g; - - x += Center.x * (1.0f - Source.m_pGroup->m_ParallaxX / 100.0f); - y += Center.y * (1.0f - Source.m_pGroup->m_ParallaxY / 100.0f); - - x -= Source.m_pGroup->m_OffsetX; - y -= Source.m_pGroup->m_OffsetY; - - Sound()->SetVoicePosition(Source.m_Voice, vec2(x, y)); - - ColorRGBA Volume = ColorRGBA(1.0f, 0.0f, 0.0f, 0.0f); - CMapLayers::EnvelopeEval(Source.m_pSource->m_SoundEnvOffset, Source.m_pSource->m_SoundEnv, Volume, 1, &m_pClient->m_MapLayersBackground); - if(Volume.r < 1.0f) - { - Sound()->SetVoiceVolume(Source.m_Voice, Volume.r); - } - } -} - -void CMapSounds::Clear() -{ - // unload all samples - m_vSourceQueue.clear(); - for(int i = 0; i < m_Count; i++) - { - Sound()->UnloadSample(m_aSounds[i]); - m_aSounds[i] = -1; - } - m_Count = 0; -} - -void CMapSounds::OnStateChange(int NewState, int OldState) -{ - if(NewState < IClient::STATE_ONLINE) - Clear(); -} diff --git a/src/game/client/components/mapsounds.h b/src/game/client/components/mapsounds.h deleted file mode 100644 index d5e8b1fbb2..0000000000 --- a/src/game/client/components/mapsounds.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef GAME_CLIENT_COMPONENTS_MAPSOUNDS_H -#define GAME_CLIENT_COMPONENTS_MAPSOUNDS_H - -#include - -#include -#include - -#include - -class CMapSounds : public CComponent -{ - int m_aSounds[MAX_MAPSOUNDS]; - int m_Count; - - class CSourceQueueEntry - { - public: - int m_Sound; - bool m_HighDetail; - ISound::CVoiceHandle m_Voice; - const CMapItemGroup *m_pGroup; - const CSoundSource *m_pSource; - }; - std::vector m_vSourceQueue; - void Clear(); - -public: - CMapSounds(); - virtual int Sizeof() const override { return sizeof(*this); } - - void Play(int Channel, int SoundId); - void PlayAt(int Channel, int SoundId, vec2 Position); - - virtual void OnMapLoad() override; - virtual void OnRender() override; - virtual void OnStateChange(int NewState, int OldState) override; -}; - -#endif // GAME_CLIENT_COMPONENTS_MAPSOUNDS_H diff --git a/src/game/client/components/menu_background.cpp b/src/game/client/components/menu_background.cpp deleted file mode 100644 index a929625cf8..0000000000 --- a/src/game/client/components/menu_background.cpp +++ /dev/null @@ -1,410 +0,0 @@ -#include - -#include - -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -#include "menu_background.h" - -#include - -using namespace std::chrono_literals; - -std::array GenerateMenuBackgroundPositions() -{ - std::array Positions; - - Positions[CMenuBackground::POS_START] = vec2(500.0f, 500.0f); - Positions[CMenuBackground::POS_BROWSER_INTERNET] = vec2(1000.0f, 1000.0f); - Positions[CMenuBackground::POS_BROWSER_LAN] = vec2(1100.0f, 1000.0f); - Positions[CMenuBackground::POS_DEMOS] = vec2(900.0f, 100.0f); - Positions[CMenuBackground::POS_NEWS] = vec2(500.0f, 750.0f); - Positions[CMenuBackground::POS_BROWSER_FAVORITES] = vec2(1250.0f, 500.0f); - Positions[CMenuBackground::POS_SETTINGS_LANGUAGE] = vec2(500.0f, 1200.0f); - Positions[CMenuBackground::POS_SETTINGS_GENERAL] = vec2(500.0f, 1000.0f); - Positions[CMenuBackground::POS_SETTINGS_PLAYER] = vec2(600.0f, 1000.0f); - Positions[CMenuBackground::POS_SETTINGS_TEE] = vec2(700.0f, 1000.0f); - Positions[CMenuBackground::POS_SETTINGS_APPEARANCE] = vec2(200.0f, 1000.0f); - Positions[CMenuBackground::POS_SETTINGS_CONTROLS] = vec2(800.0f, 1000.0f); - Positions[CMenuBackground::POS_SETTINGS_GRAPHICS] = vec2(900.0f, 1000.0f); - Positions[CMenuBackground::POS_SETTINGS_SOUND] = vec2(1000.0f, 1000.0f); - Positions[CMenuBackground::POS_SETTINGS_DDNET] = vec2(1200.0f, 200.0f); - Positions[CMenuBackground::POS_SETTINGS_ASSETS] = vec2(500.0f, 500.0f); - for(int i = 0; i < CMenuBackground::POS_BROWSER_CUSTOM_NUM; ++i) - Positions[CMenuBackground::POS_BROWSER_CUSTOM0 + i] = vec2(500.0f + (75.0f * (float)i), 650.0f - (75.0f * (float)i)); - for(int i = 0; i < CMenuBackground::POS_SETTINGS_RESERVED_NUM; ++i) - Positions[CMenuBackground::POS_SETTINGS_RESERVED0 + i] = vec2(0, 0); - for(int i = 0; i < CMenuBackground::POS_RESERVED_NUM; ++i) - Positions[CMenuBackground::POS_RESERVED0 + i] = vec2(0, 0); - - return Positions; -} - -CMenuBackground::CMenuBackground() : - CBackground(CMapLayers::TYPE_FULL_DESIGN, false) -{ - m_RotationCenter = vec2(0.0f, 0.0f); - m_AnimationStartPos = vec2(0.0f, 0.0f); - m_Camera.m_Center = vec2(0.0f, 0.0f); - m_Camera.m_PrevCenter = vec2(0.0f, 0.0f); // unused in this class - m_ChangedPosition = false; - - ResetPositions(); - - m_CurrentPosition = -1; - m_MoveTime = 0.0f; - - m_IsInit = false; - m_Loading = false; -} - -CBackgroundEngineMap *CMenuBackground::CreateBGMap() -{ - return new CMenuMap; -} - -void CMenuBackground::OnInit() -{ - m_pBackgroundMap = CreateBGMap(); - m_pMap = m_pBackgroundMap; - - m_IsInit = true; - - m_pImages->m_pClient = GameClient(); - Kernel()->RegisterInterface((CMenuMap *)m_pBackgroundMap); - if(g_Config.m_ClMenuMap[0] != '\0') - LoadMenuBackground(); - - m_Camera.m_pClient = GameClient(); - m_Camera.m_ZoomSet = false; - m_Camera.m_ZoomSmoothingTarget = 0; -} - -void CMenuBackground::ResetPositions() -{ - m_aPositions = GenerateMenuBackgroundPositions(); -} - -void CMenuBackground::LoadThemeIcon(CTheme &Theme) -{ - char aIconPath[IO_MAX_PATH_LENGTH]; - str_format(aIconPath, sizeof(aIconPath), "themes/%s.png", Theme.m_Name.empty() ? "none" : Theme.m_Name.c_str()); - Theme.m_IconTexture = Graphics()->LoadTexture(aIconPath, IStorage::TYPE_ALL); - - char aBuf[32 + IO_MAX_PATH_LENGTH]; - if(Theme.m_IconTexture.IsNullTexture()) - str_format(aBuf, sizeof(aBuf), "failed to load theme icon '%s'", aIconPath); - else - str_format(aBuf, sizeof(aBuf), "loaded theme icon '%s'", aIconPath); - Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "menuthemes", aBuf); -} - -int CMenuBackground::ThemeScan(const char *pName, int IsDir, int DirType, void *pUser) -{ - CMenuBackground *pSelf = (CMenuBackground *)pUser; - const char *pSuffix = str_endswith(pName, ".map"); - if(IsDir || !pSuffix) - return 0; - char aFullName[128]; - char aThemeName[128]; - str_truncate(aFullName, sizeof(aFullName), pName, pSuffix - pName); - - bool IsDay = false; - bool IsNight = false; - if((pSuffix = str_endswith(aFullName, "_day"))) - { - str_truncate(aThemeName, sizeof(aThemeName), pName, pSuffix - aFullName); - IsDay = true; - } - else if((pSuffix = str_endswith(aFullName, "_night"))) - { - str_truncate(aThemeName, sizeof(aThemeName), pName, pSuffix - aFullName); - IsNight = true; - } - else - str_copy(aThemeName, aFullName); - - if(str_comp(aThemeName, "none") == 0 || str_comp(aThemeName, "auto") == 0 || str_comp(aThemeName, "rand") == 0) // "none", "auto" and "rand" reserved, disallowed for maps - return 0; - - // try to edit an existing theme - for(auto &Theme : pSelf->m_vThemes) - { - if(str_comp(Theme.m_Name.c_str(), aThemeName) == 0) - { - if(IsDay) - Theme.m_HasDay = true; - if(IsNight) - Theme.m_HasNight = true; - return 0; - } - } - - // make new theme - char aBuf[512]; - str_format(aBuf, sizeof(aBuf), "added theme '%s' from 'themes/%s'", aThemeName, pName); - pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "menuthemes", aBuf); - pSelf->m_vThemes.emplace_back(aThemeName, IsDay, IsNight); - pSelf->LoadThemeIcon(pSelf->m_vThemes.back()); - - if(time_get_nanoseconds() - pSelf->m_ThemeScanStartTime > 500ms) - { - pSelf->GameClient()->m_Menus.RenderLoading(Localize("Loading menu themes"), "", 0); - } - return 0; -} - -void CMenuBackground::LoadMenuBackground(bool HasDayHint, bool HasNightHint) -{ - if(!m_IsInit) - return; - - if(m_Loaded && m_pMap == m_pBackgroundMap) - m_pMap->Unload(); - - m_Loaded = false; - m_pMap = m_pBackgroundMap; - m_pLayers = m_pBackgroundLayers; - m_pImages = m_pBackgroundImages; - - ResetPositions(); - - str_copy(m_aMapName, g_Config.m_ClMenuMap); - - if(g_Config.m_ClMenuMap[0] != '\0') - { - m_Loading = true; - - const char *pMenuMap = g_Config.m_ClMenuMap; - if(str_comp(pMenuMap, "auto") == 0) - { - switch(time_season()) - { - case SEASON_SPRING: - case SEASON_EASTER: - pMenuMap = "heavens"; - break; - case SEASON_SUMMER: - pMenuMap = "jungle"; - break; - case SEASON_AUTUMN: - case SEASON_HALLOWEEN: - pMenuMap = "autumn"; - break; - case SEASON_WINTER: - case SEASON_XMAS: - pMenuMap = "winter"; - break; - case SEASON_NEWYEAR: - pMenuMap = "newyear"; - break; - } - } - else if(str_comp(pMenuMap, "rand") == 0) - { - // make sure to load themes - const std::vector &vThemesRef = GetThemes(); - if(vThemesRef.size() > PREDEFINED_THEMES_COUNT) - { - int RandomThemeIndex = rand() % (vThemesRef.size() - PREDEFINED_THEMES_COUNT); - if(RandomThemeIndex + PREDEFINED_THEMES_COUNT < (int)vThemesRef.size()) - pMenuMap = vThemesRef[RandomThemeIndex + PREDEFINED_THEMES_COUNT].m_Name.c_str(); - } - } - - char aBuf[128]; - - const int HourOfTheDay = time_houroftheday(); - const bool IsDaytime = HourOfTheDay >= 6 && HourOfTheDay < 18; - - if(!m_Loaded && ((HasDayHint && IsDaytime) || (HasNightHint && !IsDaytime))) - { - str_format(aBuf, sizeof(aBuf), "themes/%s_%s.map", pMenuMap, IsDaytime ? "day" : "night"); - if(m_pMap->Load(aBuf)) - { - m_Loaded = true; - } - } - - if(!m_Loaded) - { - str_format(aBuf, sizeof(aBuf), "themes/%s.map", pMenuMap); - if(m_pMap->Load(aBuf)) - { - m_Loaded = true; - } - } - - if(!m_Loaded && ((HasDayHint && !IsDaytime) || (HasNightHint && IsDaytime))) - { - str_format(aBuf, sizeof(aBuf), "themes/%s_%s.map", pMenuMap, IsDaytime ? "night" : "day"); - if(m_pMap->Load(aBuf)) - { - m_Loaded = true; - } - } - - if(m_Loaded) - { - m_pLayers->Init(m_pMap, true); - - m_pImages->LoadBackground(m_pLayers, m_pMap); - CMapLayers::OnMapLoad(); - - // look for custom positions - CMapItemLayerTilemap *pTLayer = m_pLayers->GameLayer(); - if(pTLayer) - { - int DataIndex = pTLayer->m_Data; - unsigned int Size = m_pLayers->Map()->GetDataSize(DataIndex); - void *pTiles = m_pLayers->Map()->GetData(DataIndex); - unsigned int TileSize = sizeof(CTile); - - if(Size >= pTLayer->m_Width * pTLayer->m_Height * TileSize) - { - for(int y = 0; y < pTLayer->m_Height; ++y) - { - for(int x = 0; x < pTLayer->m_Width; ++x) - { - unsigned char Index = ((CTile *)pTiles)[y * pTLayer->m_Width + x].m_Index; - if(Index >= TILE_TIME_CHECKPOINT_FIRST && Index <= TILE_TIME_CHECKPOINT_LAST) - { - int ArrayIndex = clamp((Index - TILE_TIME_CHECKPOINT_FIRST), 0, NUM_POS); - m_aPositions[ArrayIndex] = vec2(x * 32.0f + 16.0f, y * 32.0f + 16.0f); - } - - x += ((CTile *)pTiles)[y * pTLayer->m_Width + x].m_Skip; - } - } - } - } - } - m_Loading = false; - } -} - -void CMenuBackground::OnMapLoad() -{ -} - -void CMenuBackground::OnRender() -{ -} - -bool CMenuBackground::Render() -{ - if(!m_Loaded) - return false; - - if(Client()->State() == IClient::STATE_ONLINE || Client()->State() == IClient::STATE_DEMOPLAYBACK) - return false; - - m_Camera.m_Zoom = 0.7f; - - float DistToCenter = distance(m_Camera.m_Center, m_RotationCenter); - if(!m_ChangedPosition && absolute(DistToCenter - (float)g_Config.m_ClRotationRadius) <= 0.5f) - { - // do little rotation - float RotPerTick = 360.0f / (float)g_Config.m_ClRotationSpeed * clamp(Client()->RenderFrameTime(), 0.0f, 0.1f); - m_CurrentDirection = rotate(m_CurrentDirection, RotPerTick); - m_Camera.m_Center = m_RotationCenter + m_CurrentDirection * (float)g_Config.m_ClRotationRadius; - } - else - { - // positions for the animation - vec2 DirToCenter; - if(DistToCenter > 0.5f) - DirToCenter = normalize(m_AnimationStartPos - m_RotationCenter); - else - DirToCenter = vec2(1, 0); - vec2 TargetPos = m_RotationCenter + DirToCenter * (float)g_Config.m_ClRotationRadius; - float Distance = distance(m_AnimationStartPos, TargetPos); - if(Distance > 0.001f) - m_CurrentDirection = normalize(m_AnimationStartPos - TargetPos); - else - m_CurrentDirection = vec2(1.0f, 0.0f); - - // move time - m_MoveTime += clamp(Client()->RenderFrameTime(), 0.0f, 0.1f) * g_Config.m_ClCameraSpeed / 10.0f; - float XVal = 1 - m_MoveTime; - XVal = std::pow(XVal, 7.0f); - - m_Camera.m_Center = TargetPos + m_CurrentDirection * (XVal * Distance); - if(m_CurrentPosition < 0) - { - m_AnimationStartPos = m_Camera.m_Center; - m_MoveTime = 0.0f; - } - - m_ChangedPosition = false; - } - - CMapLayers::OnRender(); - - m_CurrentPosition = -1; - - return true; -} - -CCamera *CMenuBackground::GetCurCamera() -{ - return &m_Camera; -} - -const char *CMenuBackground::LoadingTitle() const -{ - return Localize("Loading background map"); -} - -void CMenuBackground::ChangePosition(int PositionNumber) -{ - if(PositionNumber != m_CurrentPosition) - { - if(PositionNumber >= POS_START && PositionNumber < NUM_POS) - { - m_CurrentPosition = PositionNumber; - } - else - { - m_CurrentPosition = POS_START; - } - - m_ChangedPosition = true; - } - m_AnimationStartPos = m_Camera.m_Center; - m_RotationCenter = m_aPositions[m_CurrentPosition]; - m_MoveTime = 0.0f; -} - -std::vector &CMenuBackground::GetThemes() -{ - if(m_vThemes.empty()) // not loaded yet - { - // when adding more here, make sure to change the value of PREDEFINED_THEMES_COUNT too - m_vThemes.emplace_back("", true, true); // no theme - LoadThemeIcon(m_vThemes.back()); - - m_vThemes.emplace_back("auto", true, true); // auto theme - LoadThemeIcon(m_vThemes.back()); - - m_vThemes.emplace_back("rand", true, true); // random theme - LoadThemeIcon(m_vThemes.back()); - - m_ThemeScanStartTime = time_get_nanoseconds(); - Storage()->ListDirectory(IStorage::TYPE_ALL, "themes", ThemeScan, this); - - std::sort(m_vThemes.begin() + PREDEFINED_THEMES_COUNT, m_vThemes.end()); - } - return m_vThemes; -} diff --git a/src/game/client/components/menu_background.h b/src/game/client/components/menu_background.h deleted file mode 100644 index a5ab02ebe4..0000000000 --- a/src/game/client/components/menu_background.h +++ /dev/null @@ -1,125 +0,0 @@ -#ifndef GAME_CLIENT_COMPONENTS_MENU_BACKGROUND_H -#define GAME_CLIENT_COMPONENTS_MENU_BACKGROUND_H - -#include -#include - -#include -#include -#include -#include - -class CMenuMap : public CBackgroundEngineMap -{ - MACRO_INTERFACE("menu_enginemap") -}; - -// themes -class CTheme -{ -public: - CTheme() {} - CTheme(const char *pName, bool HasDay, bool HasNight) : - m_Name(pName), m_HasDay(HasDay), m_HasNight(HasNight) {} - - std::string m_Name; - bool m_HasDay; - bool m_HasNight; - IGraphics::CTextureHandle m_IconTexture; - bool operator<(const CTheme &Other) const { return m_Name < Other.m_Name; } -}; - -class CMenuBackground : public CBackground -{ - std::chrono::nanoseconds m_ThemeScanStartTime{0}; - -public: - enum - { - POS_START = 0, - POS_DEMOS, - POS_NEWS, - POS_SETTINGS_LANGUAGE, - POS_SETTINGS_GENERAL, - POS_SETTINGS_PLAYER, - POS_SETTINGS_TEE, - POS_SETTINGS_APPEARANCE, - POS_SETTINGS_CONTROLS, - POS_SETTINGS_GRAPHICS, - POS_SETTINGS_SOUND, - POS_SETTINGS_DDNET, - POS_SETTINGS_ASSETS, - POS_SETTINGS_RESERVED0, - POS_SETTINGS_RESERVED1, - POS_BROWSER_INTERNET, - POS_BROWSER_LAN, - POS_BROWSER_FAVORITES, - POS_BROWSER_CUSTOM0, - POS_BROWSER_CUSTOM1, - POS_BROWSER_CUSTOM2, - POS_BROWSER_CUSTOM3, - POS_BROWSER_CUSTOM4, - POS_RESERVED0, - POS_RESERVED1, - POS_RESERVED2, - - NUM_POS, - - POS_BROWSER_CUSTOM_NUM = (POS_BROWSER_CUSTOM4 - POS_BROWSER_CUSTOM0) + 1, - POS_SETTINGS_RESERVED_NUM = (POS_SETTINGS_RESERVED1 - POS_SETTINGS_RESERVED0) + 1, - POS_RESERVED_NUM = (POS_RESERVED2 - POS_RESERVED0) + 1, - }; - - enum - { - PREDEFINED_THEMES_COUNT = 3, - }; - -private: - CCamera m_Camera; - - CBackgroundEngineMap *CreateBGMap() override; - - vec2 m_RotationCenter; - std::array m_aPositions; - int m_CurrentPosition; - vec2 m_CurrentDirection = vec2(1.0f, 0.0f); - vec2 m_AnimationStartPos; - bool m_ChangedPosition; - float m_MoveTime; - - bool m_IsInit; - bool m_Loading; - - void ResetPositions(); - - void LoadThemeIcon(CTheme &Theme); - static int ThemeScan(const char *pName, int IsDir, int DirType, void *pUser); - - std::vector m_vThemes; - -public: - CMenuBackground(); - ~CMenuBackground() override {} - virtual int Sizeof() const override { return sizeof(*this); } - - void OnInit() override; - void OnMapLoad() override; - void OnRender() override; - - void LoadMenuBackground(bool HasDayHint = true, bool HasNightHint = true); - - bool Render(); - bool IsLoading() const { return m_Loading; } - - class CCamera *GetCurCamera() override; - const char *LoadingTitle() const override; - - void ChangePosition(int PositionNumber); - - std::vector &GetThemes(); -}; - -std::array GenerateMenuBackgroundPositions(); - -#endif diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp deleted file mode 100644 index b4cbedf4b5..0000000000 --- a/src/game/client/components/menus.cpp +++ /dev/null @@ -1,2528 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "menus.h" - -using namespace FontIcons; -using namespace std::chrono_literals; - -ColorRGBA CMenus::ms_GuiColor; -ColorRGBA CMenus::ms_ColorTabbarInactiveOutgame; -ColorRGBA CMenus::ms_ColorTabbarActiveOutgame; -ColorRGBA CMenus::ms_ColorTabbarHoverOutgame; -ColorRGBA CMenus::ms_ColorTabbarInactive; -ColorRGBA CMenus::ms_ColorTabbarActive = ColorRGBA(0, 0, 0, 0.5f); -ColorRGBA CMenus::ms_ColorTabbarHover; -ColorRGBA CMenus::ms_ColorTabbarInactiveIngame; -ColorRGBA CMenus::ms_ColorTabbarActiveIngame; -ColorRGBA CMenus::ms_ColorTabbarHoverIngame; - -float CMenus::ms_ButtonHeight = 25.0f; -float CMenus::ms_ListheaderHeight = 17.0f; - -CMenus::CMenus() -{ - m_Popup = POPUP_NONE; - m_MenuPage = 0; - m_GamePage = PAGE_GAME; - - m_NeedRestartGraphics = false; - m_NeedRestartSound = false; - m_NeedSendinfo = false; - m_NeedSendDummyinfo = false; - m_MenuActive = true; - m_ShowStart = true; - - str_copy(m_aCurrentDemoFolder, "demos"); - m_DemolistStorageType = IStorage::TYPE_ALL; - - m_DemoPlayerState = DEMOPLAYER_NONE; - m_Dummy = false; - - for(SUIAnimator &animator : m_aAnimatorsSettingsTab) - { - animator.m_YOffset = -2.5f; - animator.m_HOffset = 5.0f; - animator.m_WOffset = 5.0f; - animator.m_RepositionLabel = true; - } - - for(SUIAnimator &animator : m_aAnimatorsBigPage) - { - animator.m_YOffset = -5.0f; - animator.m_HOffset = 5.0f; - } - - for(SUIAnimator &animator : m_aAnimatorsSmallPage) - { - animator.m_YOffset = -2.5f; - animator.m_HOffset = 2.5f; - } - - m_PasswordInput.SetBuffer(g_Config.m_Password, sizeof(g_Config.m_Password)); - m_PasswordInput.SetHidden(true); -} - -int CMenus::DoButton_Toggle(const void *pId, int Checked, const CUIRect *pRect, bool Active) -{ - Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GUIBUTTONS].m_Id); - Graphics()->QuadsBegin(); - if(!Active) - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.5f); - RenderTools()->SelectSprite(Checked ? SPRITE_GUIBUTTON_ON : SPRITE_GUIBUTTON_OFF); - IGraphics::CQuadItem QuadItem(pRect->x, pRect->y, pRect->w, pRect->h); - Graphics()->QuadsDrawTL(&QuadItem, 1); - if(Ui()->HotItem() == pId && Active) - { - RenderTools()->SelectSprite(SPRITE_GUIBUTTON_HOVER); - QuadItem = IGraphics::CQuadItem(pRect->x, pRect->y, pRect->w, pRect->h); - Graphics()->QuadsDrawTL(&QuadItem, 1); - } - Graphics()->QuadsEnd(); - - return Active ? Ui()->DoButtonLogic(pId, Checked, pRect) : 0; -} - -int CMenus::DoButton_Menu(CButtonContainer *pButtonContainer, const char *pText, int Checked, const CUIRect *pRect, const char *pImageName, int Corners, float Rounding, float FontFactor, ColorRGBA Color) -{ - CUIRect Text = *pRect; - - if(Checked) - Color = ColorRGBA(0.6f, 0.6f, 0.6f, 0.5f); - Color.a *= Ui()->ButtonColorMul(pButtonContainer); - - pRect->Draw(Color, Corners, Rounding); - - if(pImageName) - { - CUIRect Image; - pRect->VSplitRight(pRect->h * 4.0f, &Text, &Image); // always correct ratio for image - - // render image - const CMenuImage *pImage = FindMenuImage(pImageName); - if(pImage) - { - Graphics()->TextureSet(Ui()->HotItem() == pButtonContainer ? pImage->m_OrgTexture : pImage->m_GreyTexture); - Graphics()->WrapClamp(); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - IGraphics::CQuadItem QuadItem(Image.x, Image.y, Image.w, Image.h); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); - Graphics()->WrapNormal(); - } - } - - Text.HMargin(pRect->h >= 20.0f ? 2.0f : 1.0f, &Text); - Text.HMargin((Text.h * FontFactor) / 2.0f, &Text); - Ui()->DoLabel(&Text, pText, Text.h * CUi::ms_FontmodHeight, TEXTALIGN_MC); - - return Ui()->DoButtonLogic(pButtonContainer, Checked, pRect); -} - -int CMenus::DoButton_MenuTab(CButtonContainer *pButtonContainer, const char *pText, int Checked, const CUIRect *pRect, int Corners, SUIAnimator *pAnimator, const ColorRGBA *pDefaultColor, const ColorRGBA *pActiveColor, const ColorRGBA *pHoverColor, float EdgeRounding, const SCommunityIcon *pCommunityIcon) -{ - const bool MouseInside = Ui()->HotItem() == pButtonContainer; - CUIRect Rect = *pRect; - - if(pAnimator != NULL) - { - auto Time = time_get_nanoseconds(); - - if(pAnimator->m_Time + 100ms < Time) - { - pAnimator->m_Value = pAnimator->m_Active ? 1 : 0; - pAnimator->m_Time = Time; - } - - pAnimator->m_Active = Checked || MouseInside; - - if(pAnimator->m_Active) - pAnimator->m_Value = clamp(pAnimator->m_Value + (Time - pAnimator->m_Time).count() / (double)std::chrono::nanoseconds(100ms).count(), 0, 1); - else - pAnimator->m_Value = clamp(pAnimator->m_Value - (Time - pAnimator->m_Time).count() / (double)std::chrono::nanoseconds(100ms).count(), 0, 1); - - Rect.w += pAnimator->m_Value * pAnimator->m_WOffset; - Rect.h += pAnimator->m_Value * pAnimator->m_HOffset; - Rect.x += pAnimator->m_Value * pAnimator->m_XOffset; - Rect.y += pAnimator->m_Value * pAnimator->m_YOffset; - - pAnimator->m_Time = Time; - } - - if(Checked) - { - ColorRGBA ColorMenuTab = ms_ColorTabbarActive; - if(pActiveColor) - ColorMenuTab = *pActiveColor; - - Rect.Draw(ColorMenuTab, Corners, EdgeRounding); - } - else - { - if(MouseInside) - { - ColorRGBA HoverColorMenuTab = ms_ColorTabbarHover; - if(pHoverColor) - HoverColorMenuTab = *pHoverColor; - - Rect.Draw(HoverColorMenuTab, Corners, EdgeRounding); - } - else - { - ColorRGBA ColorMenuTab = ms_ColorTabbarInactive; - if(pDefaultColor) - ColorMenuTab = *pDefaultColor; - - Rect.Draw(ColorMenuTab, Corners, EdgeRounding); - } - } - - if(pAnimator != NULL) - { - if(pAnimator->m_RepositionLabel) - { - Rect.x += Rect.w - pRect->w + Rect.x - pRect->x; - Rect.y += Rect.h - pRect->h + Rect.y - pRect->y; - } - - if(!pAnimator->m_ScaleLabel) - { - Rect.w = pRect->w; - Rect.h = pRect->h; - } - } - - if(pCommunityIcon) - { - CUIRect CommunityIcon; - Rect.Margin(2.0f, &CommunityIcon); - RenderCommunityIcon(pCommunityIcon, CommunityIcon, true); - } - else - { - CUIRect Label; - Rect.HMargin(2.0f, &Label); - Ui()->DoLabel(&Label, pText, Label.h * CUi::ms_FontmodHeight, TEXTALIGN_MC); - } - - return Ui()->DoButtonLogic(pButtonContainer, Checked, pRect); -} - -int CMenus::DoButton_GridHeader(const void *pId, const char *pText, int Checked, const CUIRect *pRect) -{ - if(Checked == 2) - pRect->Draw(ColorRGBA(1, 0.98f, 0.5f, 0.55f), IGraphics::CORNER_T, 5.0f); - else if(Checked) - pRect->Draw(ColorRGBA(1, 1, 1, 0.5f), IGraphics::CORNER_T, 5.0f); - - CUIRect Temp; - pRect->VSplitLeft(5.0f, nullptr, &Temp); - Ui()->DoLabel(&Temp, pText, pRect->h * CUi::ms_FontmodHeight, TEXTALIGN_ML); - return Ui()->DoButtonLogic(pId, Checked, pRect); -} - -int CMenus::DoButton_Favorite(const void *pButtonId, const void *pParentId, bool Checked, const CUIRect *pRect) -{ - if(Checked || (pParentId != nullptr && Ui()->HotItem() == pParentId) || Ui()->HotItem() == pButtonId) - { - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - const float Alpha = Ui()->HotItem() == pButtonId ? 0.2f : 0.0f; - TextRender()->TextColor(Checked ? ColorRGBA(1.0f, 0.85f, 0.3f, 0.8f + Alpha) : ColorRGBA(0.5f, 0.5f, 0.5f, 0.8f + Alpha)); - SLabelProperties Props; - Props.m_MaxWidth = pRect->w; - Ui()->DoLabel(pRect, FONT_ICON_STAR, 12.0f, TEXTALIGN_MC, Props); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - } - return Ui()->DoButtonLogic(pButtonId, 0, pRect); -} - -int CMenus::DoButton_CheckBox_Common(const void *pId, const char *pText, const char *pBoxText, const CUIRect *pRect) -{ - CUIRect Box, Label; - pRect->VSplitLeft(pRect->h, &Box, &Label); - Label.VSplitLeft(5.0f, nullptr, &Label); - - Box.Margin(2.0f, &Box); - Box.Draw(ColorRGBA(1, 1, 1, 0.25f * Ui()->ButtonColorMul(pId)), IGraphics::CORNER_ALL, 3.0f); - - const bool Checkable = *pBoxText == 'X'; - if(Checkable) - { - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT); - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - Ui()->DoLabel(&Box, FONT_ICON_XMARK, Box.h * CUi::ms_FontmodHeight, TEXTALIGN_MC); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - } - else - Ui()->DoLabel(&Box, pBoxText, Box.h * CUi::ms_FontmodHeight, TEXTALIGN_MC); - - TextRender()->SetRenderFlags(0); - Ui()->DoLabel(&Label, pText, Box.h * CUi::ms_FontmodHeight, TEXTALIGN_ML); - - return Ui()->DoButtonLogic(pId, 0, pRect); -} - -void CMenus::DoLaserPreview(const CUIRect *pRect, const ColorHSLA LaserOutlineColor, const ColorHSLA LaserInnerColor, const int LaserType) -{ - ColorRGBA LaserRGB; - CUIRect Section = *pRect; - vec2 From = vec2(Section.x + 50.0f, Section.y + Section.h / 2.0f); - vec2 Pos = vec2(Section.x + Section.w - 10.0f, Section.y + Section.h / 2.0f); - - Graphics()->BlendNormal(); - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - - LaserRGB = color_cast(LaserOutlineColor); - ColorRGBA OuterColor(LaserRGB.r, LaserRGB.g, LaserRGB.b, 1.0f); - Graphics()->SetColor(LaserRGB.r, LaserRGB.g, LaserRGB.b, 1.0f); - vec2 Out = vec2(0.0f, -1.0f) * (3.15f); - - IGraphics::CFreeformItem Freeform(From.x - Out.x, From.y - Out.y, From.x + Out.x, From.y + Out.y, Pos.x - Out.x, Pos.y - Out.y, Pos.x + Out.x, Pos.y + Out.y); - Graphics()->QuadsDrawFreeform(&Freeform, 1); - - LaserRGB = color_cast(LaserInnerColor); - ColorRGBA InnerColor(LaserRGB.r, LaserRGB.g, LaserRGB.b, 1.0f); - Out = vec2(0.0f, -1.0f) * (2.25f); - Graphics()->SetColor(InnerColor.r, InnerColor.g, InnerColor.b, 1.0f); - - Freeform = IGraphics::CFreeformItem(From.x - Out.x, From.y - Out.y, From.x + Out.x, From.y + Out.y, Pos.x - Out.x, Pos.y - Out.y, Pos.x + Out.x, Pos.y + Out.y); - Graphics()->QuadsDrawFreeform(&Freeform, 1); - Graphics()->QuadsEnd(); - - Graphics()->BlendNormal(); - int SpriteIndex = time_get() % 3; - Graphics()->TextureSet(GameClient()->m_ParticlesSkin.m_aSpriteParticleSplat[SpriteIndex]); - Graphics()->QuadsBegin(); - Graphics()->QuadsSetRotation(time_get()); - Graphics()->SetColor(OuterColor.r, OuterColor.g, OuterColor.b, 1.0f); - IGraphics::CQuadItem QuadItem(Pos.x, Pos.y, 24, 24); - Graphics()->QuadsDraw(&QuadItem, 1); - Graphics()->SetColor(InnerColor.r, InnerColor.g, InnerColor.b, 1.0f); - QuadItem = IGraphics::CQuadItem(Pos.x, Pos.y, 20, 20); - Graphics()->QuadsDraw(&QuadItem, 1); - Graphics()->QuadsEnd(); - - switch(LaserType) - { - case LASERTYPE_RIFLE: - Graphics()->TextureSet(GameClient()->m_GameSkin.m_SpriteWeaponLaser); - RenderTools()->SelectSprite(SPRITE_WEAPON_LASER_BODY); - Graphics()->QuadsBegin(); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - RenderTools()->DrawSprite(Section.x + 30.0f, Section.y + Section.h / 2.0f, 60.0f); - Graphics()->QuadsEnd(); - break; - case LASERTYPE_SHOTGUN: - Graphics()->TextureSet(GameClient()->m_GameSkin.m_SpriteWeaponShotgun); - RenderTools()->SelectSprite(SPRITE_WEAPON_SHOTGUN_BODY); - Graphics()->QuadsBegin(); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - RenderTools()->DrawSprite(Section.x + 30.0f, Section.y + Section.h / 2.0f, 60.0f); - Graphics()->QuadsEnd(); - break; - default: - Graphics()->QuadsBegin(); - Graphics()->SetColor(OuterColor.r, OuterColor.g, OuterColor.b, 1.0f); - QuadItem = IGraphics::CQuadItem(From.x, From.y, 24, 24); - Graphics()->QuadsDraw(&QuadItem, 1); - Graphics()->SetColor(InnerColor.r, InnerColor.g, InnerColor.b, 1.0f); - QuadItem = IGraphics::CQuadItem(From.x, From.y, 20, 20); - Graphics()->QuadsDraw(&QuadItem, 1); - Graphics()->QuadsEnd(); - } -} - -ColorHSLA CMenus::DoLine_ColorPicker(CButtonContainer *pResetId, const float LineSize, const float LabelSize, const float BottomMargin, CUIRect *pMainRect, const char *pText, unsigned int *pColorValue, const ColorRGBA DefaultColor, bool CheckBoxSpacing, int *pCheckBoxValue, bool Alpha) -{ - CUIRect Section, ColorPickerButton, ResetButton, Label; - - pMainRect->HSplitTop(LineSize, &Section, pMainRect); - pMainRect->HSplitTop(BottomMargin, nullptr, pMainRect); - - Section.VSplitRight(60.0f, &Section, &ResetButton); - Section.VSplitRight(8.0f, &Section, nullptr); - Section.VSplitRight(Section.h, &Section, &ColorPickerButton); - Section.VSplitRight(8.0f, &Label, nullptr); - - if(pCheckBoxValue != nullptr) - { - Label.Margin(2.0f, &Label); - if(DoButton_CheckBox(pCheckBoxValue, pText, *pCheckBoxValue, &Label)) - *pCheckBoxValue ^= 1; - } - else if(CheckBoxSpacing) - { - Label.VSplitLeft(Label.h + 5.0f, nullptr, &Label); - } - if(pCheckBoxValue == nullptr) - { - Ui()->DoLabel(&Label, pText, LabelSize, TEXTALIGN_ML); - } - - const ColorHSLA PickedColor = DoButton_ColorPicker(&ColorPickerButton, pColorValue, Alpha); - - ResetButton.HMargin(2.0f, &ResetButton); - if(DoButton_Menu(pResetId, Localize("Reset"), 0, &ResetButton, nullptr, IGraphics::CORNER_ALL, 4.0f, 0.1f, ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f))) - { - *pColorValue = color_cast(DefaultColor).Pack(Alpha); - } - - return PickedColor; -} - -ColorHSLA CMenus::DoButton_ColorPicker(const CUIRect *pRect, unsigned int *pHslaColor, bool Alpha) -{ - ColorHSLA HslaColor = ColorHSLA(*pHslaColor, Alpha); - - ColorRGBA Outline = ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f); - Outline.a *= Ui()->ButtonColorMul(pHslaColor); - - CUIRect Rect; - pRect->Margin(3.0f, &Rect); - - pRect->Draw(Outline, IGraphics::CORNER_ALL, 4.0f); - Rect.Draw(color_cast(HslaColor), IGraphics::CORNER_ALL, 4.0f); - - static CUi::SColorPickerPopupContext s_ColorPickerPopupContext; - if(Ui()->DoButtonLogic(pHslaColor, 0, pRect)) - { - s_ColorPickerPopupContext.m_pHslaColor = pHslaColor; - s_ColorPickerPopupContext.m_HslaColor = HslaColor; - s_ColorPickerPopupContext.m_HsvaColor = color_cast(HslaColor); - s_ColorPickerPopupContext.m_RgbaColor = color_cast(s_ColorPickerPopupContext.m_HsvaColor); - s_ColorPickerPopupContext.m_Alpha = Alpha; - Ui()->ShowPopupColorPicker(Ui()->MouseX(), Ui()->MouseY(), &s_ColorPickerPopupContext); - } - else if(Ui()->IsPopupOpen(&s_ColorPickerPopupContext) && s_ColorPickerPopupContext.m_pHslaColor == pHslaColor) - { - HslaColor = color_cast(s_ColorPickerPopupContext.m_HsvaColor); - } - - return HslaColor; -} - -int CMenus::DoButton_CheckBoxAutoVMarginAndSet(const void *pId, const char *pText, int *pValue, CUIRect *pRect, float VMargin) -{ - CUIRect CheckBoxRect; - pRect->HSplitTop(VMargin, &CheckBoxRect, pRect); - - int Logic = DoButton_CheckBox_Common(pId, pText, *pValue ? "X" : "", &CheckBoxRect); - - if(Logic) - *pValue ^= 1; - - return Logic; -} - -int CMenus::DoButton_CheckBox(const void *pId, const char *pText, int Checked, const CUIRect *pRect) -{ - return DoButton_CheckBox_Common(pId, pText, Checked ? "X" : "", pRect); -} - -int CMenus::DoButton_CheckBox_Number(const void *pId, const char *pText, int Checked, const CUIRect *pRect) -{ - char aBuf[16]; - str_format(aBuf, sizeof(aBuf), "%d", Checked); - return DoButton_CheckBox_Common(pId, pText, aBuf, pRect); -} - -int CMenus::DoKeyReader(const void *pId, const CUIRect *pRect, int Key, int ModifierCombination, int *pNewModifierCombination) -{ - int NewKey = Key; - *pNewModifierCombination = ModifierCombination; - - const int ButtonResult = Ui()->DoButtonLogic(pId, 0, pRect); - if(ButtonResult == 1) - { - m_Binder.m_pKeyReaderId = pId; - m_Binder.m_TakeKey = true; - m_Binder.m_GotKey = false; - } - else if(ButtonResult == 2) - { - NewKey = 0; - *pNewModifierCombination = CBinds::MODIFIER_NONE; - } - - if(m_Binder.m_pKeyReaderId == pId && m_Binder.m_GotKey) - { - // abort with escape key - if(m_Binder.m_Key.m_Key != KEY_ESCAPE) - { - NewKey = m_Binder.m_Key.m_Key; - *pNewModifierCombination = m_Binder.m_ModifierCombination; - } - m_Binder.m_pKeyReaderId = nullptr; - m_Binder.m_GotKey = false; - Ui()->SetActiveItem(nullptr); - } - - char aBuf[64]; - if(m_Binder.m_pKeyReaderId == pId && m_Binder.m_TakeKey) - str_copy(aBuf, Localize("Press a key…")); - else if(NewKey == 0) - aBuf[0] = '\0'; - else - { - char aModifiers[128]; - CBinds::GetKeyBindModifiersName(*pNewModifierCombination, aModifiers, sizeof(aModifiers)); - str_format(aBuf, sizeof(aBuf), "%s%s", aModifiers, Input()->KeyName(NewKey)); - } - - const ColorRGBA Color = m_Binder.m_pKeyReaderId == pId && m_Binder.m_TakeKey ? ColorRGBA(0.0f, 1.0f, 0.0f, 0.4f) : ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f * Ui()->ButtonColorMul(pId)); - pRect->Draw(Color, IGraphics::CORNER_ALL, 5.0f); - CUIRect Temp; - pRect->HMargin(1.0f, &Temp); - Ui()->DoLabel(&Temp, aBuf, Temp.h * CUi::ms_FontmodHeight, TEXTALIGN_MC); - - return NewKey; -} - -void CMenus::RenderMenubar(CUIRect Box, IClient::EClientState ClientState) -{ - CUIRect Button; - - int NewPage = -1; - int ActivePage = -1; - if(ClientState == IClient::STATE_OFFLINE) - { - ActivePage = m_MenuPage; - } - else if(ClientState == IClient::STATE_ONLINE) - { - ActivePage = m_GamePage; - } - else - { - dbg_assert(false, "Client state invalid for RenderMenubar"); - } - - // First render buttons aligned from right side so remaining - // width is known when rendering buttons from left side. - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - - Box.VSplitRight(33.0f, &Box, &Button); - static CButtonContainer s_QuitButton; - ColorRGBA QuitColor(1, 0, 0, 0.5f); - if(DoButton_MenuTab(&s_QuitButton, FONT_ICON_POWER_OFF, 0, &Button, IGraphics::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_QUIT], nullptr, nullptr, &QuitColor, 10.0f)) - { - if(m_pClient->Editor()->HasUnsavedData() || (GameClient()->CurrentRaceTime() / 60 >= g_Config.m_ClConfirmQuitTime && g_Config.m_ClConfirmQuitTime >= 0)) - { - m_Popup = POPUP_QUIT; - } - else - { - Client()->Quit(); - } - } - GameClient()->m_Tooltips.DoToolTip(&s_QuitButton, &Button, Localize("Quit")); - - Box.VSplitRight(10.0f, &Box, nullptr); - Box.VSplitRight(33.0f, &Box, &Button); - static CButtonContainer s_SettingsButton; - if(DoButton_MenuTab(&s_SettingsButton, FONT_ICON_GEAR, ActivePage == PAGE_SETTINGS, &Button, IGraphics::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_SETTINGS])) - { - NewPage = PAGE_SETTINGS; - } - GameClient()->m_Tooltips.DoToolTip(&s_SettingsButton, &Button, Localize("Settings")); - - Box.VSplitRight(10.0f, &Box, nullptr); - Box.VSplitRight(33.0f, &Box, &Button); - static CButtonContainer s_EditorButton; - if(DoButton_MenuTab(&s_EditorButton, FONT_ICON_PEN_TO_SQUARE, 0, &Button, IGraphics::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_EDITOR])) - { - g_Config.m_ClEditor = 1; - } - GameClient()->m_Tooltips.DoToolTip(&s_EditorButton, &Button, Localize("Editor")); - - if(ClientState == IClient::STATE_OFFLINE) - { - Box.VSplitRight(10.0f, &Box, nullptr); - Box.VSplitRight(33.0f, &Box, &Button); - static CButtonContainer s_DemoButton; - if(DoButton_MenuTab(&s_DemoButton, FONT_ICON_CLAPPERBOARD, ActivePage == PAGE_DEMOS, &Button, IGraphics::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_DEMOBUTTON])) - { - NewPage = PAGE_DEMOS; - } - GameClient()->m_Tooltips.DoToolTip(&s_DemoButton, &Button, Localize("Demos")); - } - - Box.VSplitRight(10.0f, &Box, nullptr); - - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - - if(ClientState == IClient::STATE_OFFLINE) - { - Box.VSplitLeft(33.0f, &Button, &Box); - - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - - bool GotNewsOrUpdate = false; - -#if defined(CONF_AUTOUPDATE) - int State = Updater()->GetCurrentState(); - bool NeedUpdate = str_comp(Client()->LatestVersion(), "0"); - if(State == IUpdater::CLEAN && NeedUpdate) - { - GotNewsOrUpdate = true; - } -#endif - - GotNewsOrUpdate |= (bool)g_Config.m_UiUnreadNews; - - ColorRGBA HomeButtonColorAlert(0, 1, 0, 0.25f); - ColorRGBA HomeButtonColorAlertHover(0, 1, 0, 0.5f); - ColorRGBA *pHomeButtonColor = nullptr; - ColorRGBA *pHomeButtonColorHover = nullptr; - - const char *pHomeScreenButtonLabel = FONT_ICON_HOUSE; - if(GotNewsOrUpdate) - { - pHomeScreenButtonLabel = FONT_ICON_NEWSPAPER; - pHomeButtonColor = &HomeButtonColorAlert; - pHomeButtonColorHover = &HomeButtonColorAlertHover; - } - - static CButtonContainer s_StartButton; - if(DoButton_MenuTab(&s_StartButton, pHomeScreenButtonLabel, false, &Button, IGraphics::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_HOME], pHomeButtonColor, pHomeButtonColor, pHomeButtonColorHover, 10.0f)) - { - m_ShowStart = true; - } - GameClient()->m_Tooltips.DoToolTip(&s_StartButton, &Button, Localize("Main menu")); - - const float BrowserButtonWidth = 75.0f; - Box.VSplitLeft(10.0f, nullptr, &Box); - Box.VSplitLeft(BrowserButtonWidth, &Button, &Box); - static CButtonContainer s_InternetButton; - if(DoButton_MenuTab(&s_InternetButton, FONT_ICON_EARTH_AMERICAS, ActivePage == PAGE_INTERNET, &Button, IGraphics::CORNER_T, &m_aAnimatorsBigPage[BIG_TAB_INTERNET])) - { - NewPage = PAGE_INTERNET; - } - GameClient()->m_Tooltips.DoToolTip(&s_InternetButton, &Button, Localize("Internet")); - - Box.VSplitLeft(BrowserButtonWidth, &Button, &Box); - static CButtonContainer s_LanButton; - if(DoButton_MenuTab(&s_LanButton, FONT_ICON_NETWORK_WIRED, ActivePage == PAGE_LAN, &Button, IGraphics::CORNER_T, &m_aAnimatorsBigPage[BIG_TAB_LAN])) - { - NewPage = PAGE_LAN; - } - GameClient()->m_Tooltips.DoToolTip(&s_LanButton, &Button, Localize("LAN")); - - Box.VSplitLeft(BrowserButtonWidth, &Button, &Box); - static CButtonContainer s_FavoritesButton; - if(DoButton_MenuTab(&s_FavoritesButton, FONT_ICON_STAR, ActivePage == PAGE_FAVORITES, &Button, IGraphics::CORNER_T, &m_aAnimatorsBigPage[BIG_TAB_FAVORITES])) - { - NewPage = PAGE_FAVORITES; - } - GameClient()->m_Tooltips.DoToolTip(&s_FavoritesButton, &Button, Localize("Favorites")); - - int MaxPage = PAGE_FAVORITES + ServerBrowser()->FavoriteCommunities().size(); - if( - !Ui()->IsPopupOpen() && - CLineInput::GetActiveInput() == nullptr && - (g_Config.m_UiPage >= PAGE_INTERNET && g_Config.m_UiPage <= MaxPage) && - (m_MenuPage >= PAGE_INTERNET && m_MenuPage <= PAGE_FAVORITE_COMMUNITY_5)) - { - if(Input()->KeyPress(KEY_RIGHT)) - { - NewPage = g_Config.m_UiPage + 1; - if(NewPage > MaxPage) - NewPage = PAGE_INTERNET; - } - if(Input()->KeyPress(KEY_LEFT)) - { - NewPage = g_Config.m_UiPage - 1; - if(NewPage < PAGE_INTERNET) - NewPage = MaxPage; - } - } - - size_t FavoriteCommunityIndex = 0; - static CButtonContainer s_aFavoriteCommunityButtons[5]; - static_assert(std::size(s_aFavoriteCommunityButtons) == (size_t)PAGE_FAVORITE_COMMUNITY_5 - PAGE_FAVORITE_COMMUNITY_1 + 1); - static_assert(std::size(s_aFavoriteCommunityButtons) == (size_t)BIT_TAB_FAVORITE_COMMUNITY_5 - BIT_TAB_FAVORITE_COMMUNITY_1 + 1); - static_assert(std::size(s_aFavoriteCommunityButtons) == (size_t)IServerBrowser::TYPE_FAVORITE_COMMUNITY_5 - IServerBrowser::TYPE_FAVORITE_COMMUNITY_1 + 1); - for(const CCommunity *pCommunity : ServerBrowser()->FavoriteCommunities()) - { - if(Box.w < BrowserButtonWidth) - break; - Box.VSplitLeft(BrowserButtonWidth, &Button, &Box); - const int Page = PAGE_FAVORITE_COMMUNITY_1 + FavoriteCommunityIndex; - if(DoButton_MenuTab(&s_aFavoriteCommunityButtons[FavoriteCommunityIndex], FONT_ICON_ELLIPSIS, ActivePage == Page, &Button, IGraphics::CORNER_T, &m_aAnimatorsBigPage[BIT_TAB_FAVORITE_COMMUNITY_1 + FavoriteCommunityIndex], nullptr, nullptr, nullptr, 10.0f, FindCommunityIcon(pCommunity->Id()))) - { - NewPage = Page; - } - GameClient()->m_Tooltips.DoToolTip(&s_aFavoriteCommunityButtons[FavoriteCommunityIndex], &Button, pCommunity->Name()); - - ++FavoriteCommunityIndex; - if(FavoriteCommunityIndex >= std::size(s_aFavoriteCommunityButtons)) - break; - } - - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - } - else - { - // online menus - Box.VSplitLeft(90.0f, &Button, &Box); - static CButtonContainer s_GameButton; - if(DoButton_MenuTab(&s_GameButton, Localize("Game"), ActivePage == PAGE_GAME, &Button, IGraphics::CORNER_TL)) - NewPage = PAGE_GAME; - - Box.VSplitLeft(90.0f, &Button, &Box); - static CButtonContainer s_PlayersButton; - if(DoButton_MenuTab(&s_PlayersButton, Localize("Players"), ActivePage == PAGE_PLAYERS, &Button, IGraphics::CORNER_NONE)) - NewPage = PAGE_PLAYERS; - - Box.VSplitLeft(130.0f, &Button, &Box); - static CButtonContainer s_ServerInfoButton; - if(DoButton_MenuTab(&s_ServerInfoButton, Localize("Server info"), ActivePage == PAGE_SERVER_INFO, &Button, IGraphics::CORNER_NONE)) - NewPage = PAGE_SERVER_INFO; - - Box.VSplitLeft(90.0f, &Button, &Box); - static CButtonContainer s_NetworkButton; - if(DoButton_MenuTab(&s_NetworkButton, Localize("Browser"), ActivePage == PAGE_NETWORK, &Button, IGraphics::CORNER_NONE)) - NewPage = PAGE_NETWORK; - - if(GameClient()->m_GameInfo.m_Race) - { - Box.VSplitLeft(90.0f, &Button, &Box); - static CButtonContainer s_GhostButton; - if(DoButton_MenuTab(&s_GhostButton, Localize("Ghost"), ActivePage == PAGE_GHOST, &Button, IGraphics::CORNER_NONE)) - NewPage = PAGE_GHOST; - } - - Box.VSplitLeft(100.0f, &Button, &Box); - Box.VSplitLeft(4.0f, nullptr, &Box); - static CButtonContainer s_CallVoteButton; - if(DoButton_MenuTab(&s_CallVoteButton, Localize("Call vote"), ActivePage == PAGE_CALLVOTE, &Button, IGraphics::CORNER_TR)) - { - NewPage = PAGE_CALLVOTE; - m_ControlPageOpening = true; - } - } - - if(NewPage != -1) - { - if(ClientState == IClient::STATE_OFFLINE) - SetMenuPage(NewPage); - else - m_GamePage = NewPage; - } -} - -void CMenus::RenderLoading(const char *pCaption, const char *pContent, int IncreaseCounter) -{ - // TODO: not supported right now due to separate render thread - - const int CurLoadRenderCount = m_LoadingState.m_Current; - m_LoadingState.m_Current += IncreaseCounter; - dbg_assert(m_LoadingState.m_Current <= m_LoadingState.m_Total, "Invalid progress for RenderLoading"); - - // make sure that we don't render for each little thing we load - // because that will slow down loading if we have vsync - const std::chrono::nanoseconds Now = time_get_nanoseconds(); - if(Now - m_LoadingState.m_LastRender < std::chrono::nanoseconds(1s) / 60l) - return; - - // need up date this here to get correct - ms_GuiColor = color_cast(ColorHSLA(g_Config.m_UiColor, true)); - - Ui()->MapScreen(); - - if(GameClient()->m_MenuBackground.IsLoading()) - { - // Avoid rendering while loading the menu background as this would otherwise - // cause the regular menu background to be rendered for a few frames while - // the menu background is not loaded yet. - return; - } - if(!GameClient()->m_MenuBackground.Render()) - { - RenderBackground(); - } - - m_LoadingState.m_LastRender = Now; - - CUIRect Box; - Ui()->Screen()->Margin(160.0f, &Box); - - Graphics()->BlendNormal(); - Graphics()->TextureClear(); - Box.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f), IGraphics::CORNER_ALL, 15.0f); - Box.Margin(20.0f, &Box); - - CUIRect Label; - Box.HSplitTop(24.0f, &Label, &Box); - Ui()->DoLabel(&Label, pCaption, 24.0f, TEXTALIGN_MC); - - Box.HSplitTop(20.0f, nullptr, &Box); - Box.HSplitTop(24.0f, &Label, &Box); - Ui()->DoLabel(&Label, pContent, 20.0f, TEXTALIGN_MC); - - if(m_LoadingState.m_Total > 0) - { - CUIRect ProgressBar; - Box.HSplitBottom(30.0f, &Box, nullptr); - Box.HSplitBottom(25.0f, &Box, &ProgressBar); - ProgressBar.VMargin(20.0f, &ProgressBar); - Ui()->RenderProgressBar(ProgressBar, CurLoadRenderCount / (float)m_LoadingState.m_Total); - } - - Graphics()->SetColor(1.0, 1.0, 1.0, 1.0); - - Client()->UpdateAndSwap(); -} - -void CMenus::FinishLoading() -{ - m_LoadingState.m_Current = 0; - m_LoadingState.m_Total = 0; -} - -void CMenus::RenderNews(CUIRect MainView) -{ - GameClient()->m_MenuBackground.ChangePosition(CMenuBackground::POS_NEWS); - - g_Config.m_UiUnreadNews = false; - - MainView.Draw(ms_ColorTabbarActive, IGraphics::CORNER_B, 10.0f); - - MainView.HSplitTop(10.0f, nullptr, &MainView); - MainView.VSplitLeft(15.0f, nullptr, &MainView); - - CUIRect Label; - - const char *pStr = Client()->News(); - char aLine[256]; - while((pStr = str_next_token(pStr, "\n", aLine, sizeof(aLine)))) - { - const int Len = str_length(aLine); - if(Len > 0 && aLine[0] == '|' && aLine[Len - 1] == '|') - { - MainView.HSplitTop(30.0f, &Label, &MainView); - aLine[Len - 1] = '\0'; - Ui()->DoLabel(&Label, aLine + 1, 20.0f, TEXTALIGN_ML); - } - else - { - MainView.HSplitTop(20.0f, &Label, &MainView); - Ui()->DoLabel(&Label, aLine, 15.f, TEXTALIGN_ML); - } - } -} - -void CMenus::OnInit() -{ - if(g_Config.m_ClShowWelcome) - { - m_Popup = POPUP_LANGUAGE; - m_CreateDefaultFavoriteCommunities = true; - } - - if(g_Config.m_UiPage >= PAGE_FAVORITE_COMMUNITY_1 && g_Config.m_UiPage <= PAGE_FAVORITE_COMMUNITY_5 && - (size_t)(g_Config.m_UiPage - PAGE_FAVORITE_COMMUNITY_1) >= ServerBrowser()->FavoriteCommunities().size()) - { - // Reset page to internet when there is no favorite community for this page. - g_Config.m_UiPage = PAGE_INTERNET; - } - - if(g_Config.m_ClSkipStartMenu) - { - m_ShowStart = false; - } - - SetMenuPage(g_Config.m_UiPage); - - m_RefreshButton.Init(Ui(), -1); - m_ConnectButton.Init(Ui(), -1); - - Console()->Chain("add_favorite", ConchainFavoritesUpdate, this); - Console()->Chain("remove_favorite", ConchainFavoritesUpdate, this); - Console()->Chain("add_friend", ConchainFriendlistUpdate, this); - Console()->Chain("remove_friend", ConchainFriendlistUpdate, this); - - Console()->Chain("add_excluded_community", ConchainCommunitiesUpdate, this); - Console()->Chain("remove_excluded_community", ConchainCommunitiesUpdate, this); - Console()->Chain("add_excluded_country", ConchainCommunitiesUpdate, this); - Console()->Chain("remove_excluded_country", ConchainCommunitiesUpdate, this); - Console()->Chain("add_excluded_type", ConchainCommunitiesUpdate, this); - Console()->Chain("remove_excluded_type", ConchainCommunitiesUpdate, this); - - Console()->Chain("ui_page", ConchainUiPageUpdate, this); - - Console()->Chain("snd_enable", ConchainUpdateMusicState, this); - Console()->Chain("snd_enable_music", ConchainUpdateMusicState, this); - Console()->Chain("cl_background_entities", ConchainBackgroundEntities, this); - - Console()->Chain("cl_assets_entities", ConchainAssetsEntities, this); - Console()->Chain("cl_asset_game", ConchainAssetGame, this); - Console()->Chain("cl_asset_emoticons", ConchainAssetEmoticons, this); - Console()->Chain("cl_asset_particles", ConchainAssetParticles, this); - Console()->Chain("cl_asset_hud", ConchainAssetHud, this); - Console()->Chain("cl_asset_extras", ConchainAssetExtras, this); - - m_TextureBlob = Graphics()->LoadTexture("blob.png", IStorage::TYPE_ALL); - - // setup load amount - const int NumMenuImages = 5; - m_LoadingState.m_Current = 0; - m_LoadingState.m_Total = g_pData->m_NumImages + NumMenuImages + GameClient()->ComponentCount(); - if(!g_Config.m_ClThreadsoundloading) - m_LoadingState.m_Total += g_pData->m_NumSounds; - - m_IsInit = true; - - // load menu images - m_vMenuImages.clear(); - Storage()->ListDirectory(IStorage::TYPE_ALL, "menuimages", MenuImageScan, this); - - // load community icons - m_vCommunityIcons.clear(); - Storage()->ListDirectory(IStorage::TYPE_ALL, "communityicons", CommunityIconScan, this); - - // Quad for the direction arrows above the player - m_DirectionQuadContainerIndex = Graphics()->CreateQuadContainer(false); - RenderTools()->QuadContainerAddSprite(m_DirectionQuadContainerIndex, 0.f, 0.f, 22.f); - Graphics()->QuadContainerUpload(m_DirectionQuadContainerIndex); -} - -void CMenus::OnConsoleInit() -{ - ConfigManager()->RegisterCallback(CMenus::ConfigSaveCallback, this); - Console()->Register("add_favorite_skin", "s[skin_name]", CFGFLAG_CLIENT, Con_AddFavoriteSkin, this, "Add a skin as a favorite"); - Console()->Register("remove_favorite_skin", "s[skin_name]", CFGFLAG_CLIENT, Con_RemFavoriteSkin, this, "Remove a skin from the favorites"); -} - -void CMenus::ConchainBackgroundEntities(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - pfnCallback(pResult, pCallbackUserData); - if(pResult->NumArguments()) - { - CMenus *pSelf = (CMenus *)pUserData; - if(str_comp(g_Config.m_ClBackgroundEntities, pSelf->m_pClient->m_Background.MapName()) != 0) - pSelf->m_pClient->m_Background.LoadBackground(); - } -} - -void CMenus::ConchainUpdateMusicState(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - pfnCallback(pResult, pCallbackUserData); - auto *pSelf = (CMenus *)pUserData; - if(pResult->NumArguments()) - pSelf->UpdateMusicState(); -} - -void CMenus::UpdateMusicState() -{ - const bool ShouldPlay = Client()->State() == IClient::STATE_OFFLINE && g_Config.m_SndEnable && g_Config.m_SndMusic; - if(ShouldPlay && !m_pClient->m_Sounds.IsPlaying(SOUND_MENU)) - m_pClient->m_Sounds.Enqueue(CSounds::CHN_MUSIC, SOUND_MENU); - else if(!ShouldPlay && m_pClient->m_Sounds.IsPlaying(SOUND_MENU)) - m_pClient->m_Sounds.Stop(SOUND_MENU); -} - -void CMenus::PopupMessage(const char *pTitle, const char *pMessage, const char *pButtonLabel, int NextPopup, FPopupButtonCallback pfnButtonCallback) -{ - // reset active item - Ui()->SetActiveItem(nullptr); - - str_copy(m_aPopupTitle, pTitle); - str_copy(m_aPopupMessage, pMessage); - str_copy(m_aPopupButtons[BUTTON_CONFIRM].m_aLabel, pButtonLabel); - m_aPopupButtons[BUTTON_CONFIRM].m_NextPopup = NextPopup; - m_aPopupButtons[BUTTON_CONFIRM].m_pfnCallback = pfnButtonCallback; - m_Popup = POPUP_MESSAGE; -} - -void CMenus::PopupConfirm(const char *pTitle, const char *pMessage, const char *pConfirmButtonLabel, const char *pCancelButtonLabel, - FPopupButtonCallback pfnConfirmButtonCallback, int ConfirmNextPopup, FPopupButtonCallback pfnCancelButtonCallback, int CancelNextPopup) -{ - // reset active item - Ui()->SetActiveItem(nullptr); - - str_copy(m_aPopupTitle, pTitle); - str_copy(m_aPopupMessage, pMessage); - str_copy(m_aPopupButtons[BUTTON_CONFIRM].m_aLabel, pConfirmButtonLabel); - m_aPopupButtons[BUTTON_CONFIRM].m_NextPopup = ConfirmNextPopup; - m_aPopupButtons[BUTTON_CONFIRM].m_pfnCallback = pfnConfirmButtonCallback; - str_copy(m_aPopupButtons[BUTTON_CANCEL].m_aLabel, pCancelButtonLabel); - m_aPopupButtons[BUTTON_CANCEL].m_NextPopup = CancelNextPopup; - m_aPopupButtons[BUTTON_CANCEL].m_pfnCallback = pfnCancelButtonCallback; - m_Popup = POPUP_CONFIRM; -} - -void CMenus::PopupWarning(const char *pTopic, const char *pBody, const char *pButton, std::chrono::nanoseconds Duration) -{ - // no multiline support for console - std::string BodyStr = pBody; - while(BodyStr.find('\n') != std::string::npos) - { - BodyStr.replace(BodyStr.find('\n'), 1, " "); - } - log_warn("client", "%s: %s", pTopic, BodyStr.c_str()); - - Ui()->SetActiveItem(nullptr); - - str_copy(m_aMessageTopic, pTopic); - str_copy(m_aMessageBody, pBody); - str_copy(m_aMessageButton, pButton); - m_Popup = POPUP_WARNING; - SetActive(true); - - m_PopupWarningDuration = Duration; - m_PopupWarningLastTime = time_get_nanoseconds(); -} - -bool CMenus::CanDisplayWarning() const -{ - return m_Popup == POPUP_NONE; -} - -void CMenus::Render() -{ - Ui()->MapScreen(); - Ui()->ResetMouseSlow(); - - static int s_Frame = 0; - if(s_Frame == 0) - { - RefreshBrowserTab(true); - s_Frame++; - } - else if(s_Frame == 1) - { - UpdateMusicState(); - s_Frame++; - } - else - { - UpdateCommunityIcons(); - } - - if(ServerBrowser()->DDNetInfoAvailable()) - { - // Initially add DDNet as favorite community and select its tab. - // This must be delayed until the DDNet info is available. - if(m_CreateDefaultFavoriteCommunities) - { - m_CreateDefaultFavoriteCommunities = false; - if(ServerBrowser()->Community(IServerBrowser::COMMUNITY_DDNET) != nullptr) - { - ServerBrowser()->FavoriteCommunitiesFilter().Clear(); - ServerBrowser()->FavoriteCommunitiesFilter().Add(IServerBrowser::COMMUNITY_DDNET); - SetMenuPage(PAGE_FAVORITE_COMMUNITY_1); - ServerBrowser()->Refresh(IServerBrowser::TYPE_FAVORITE_COMMUNITY_1); - } - } - - if(m_JoinTutorial && m_Popup == POPUP_NONE && !ServerBrowser()->IsGettingServerlist()) - { - m_JoinTutorial = false; - // This is only reached on first launch, when the DDNet community tab has been created and - // activated by default, so the server info for the tutorial server should be available. - const char *pAddr = ServerBrowser()->GetTutorialServer(); - if(pAddr) - { - Client()->Connect(pAddr); - } - } - } - - // Determine the client state once before rendering because it can change - // while rendering which causes frames with broken user interface. - const IClient::EClientState ClientState = Client()->State(); - - if(ClientState == IClient::STATE_ONLINE || ClientState == IClient::STATE_DEMOPLAYBACK) - { - ms_ColorTabbarInactive = ms_ColorTabbarInactiveIngame; - ms_ColorTabbarActive = ms_ColorTabbarActiveIngame; - ms_ColorTabbarHover = ms_ColorTabbarHoverIngame; - } - else - { - if(!GameClient()->m_MenuBackground.Render()) - { - RenderBackground(); - } - ms_ColorTabbarInactive = ms_ColorTabbarInactiveOutgame; - ms_ColorTabbarActive = ms_ColorTabbarActiveOutgame; - ms_ColorTabbarHover = ms_ColorTabbarHoverOutgame; - } - - CUIRect Screen = *Ui()->Screen(); - if(Client()->State() != IClient::STATE_DEMOPLAYBACK || m_Popup != POPUP_NONE) - { - Screen.Margin(10.0f, &Screen); - } - - switch(ClientState) - { - case IClient::STATE_QUITTING: - case IClient::STATE_RESTARTING: - // Render nothing except menu background. This should not happen for more than one frame. - return; - - case IClient::STATE_CONNECTING: - RenderPopupConnecting(Screen); - break; - - case IClient::STATE_LOADING: - RenderPopupLoading(Screen); - break; - - case IClient::STATE_OFFLINE: - if(m_Popup != POPUP_NONE) - { - RenderPopupFullscreen(Screen); - } - else if(m_ShowStart) - { - RenderStartMenu(Screen); - } - else - { - CUIRect TabBar, MainView; - Screen.HSplitTop(24.0f, &TabBar, &MainView); - - if(m_MenuPage == PAGE_NEWS) - { - RenderNews(MainView); - } - else if(m_MenuPage >= PAGE_INTERNET && m_MenuPage <= PAGE_FAVORITE_COMMUNITY_5) - { - RenderServerbrowser(MainView); - } - else if(m_MenuPage == PAGE_DEMOS) - { - RenderDemoBrowser(MainView); - } - else if(m_MenuPage == PAGE_SETTINGS) - { - RenderSettings(MainView); - } - else - { - dbg_assert(false, "m_MenuPage invalid"); - } - - RenderMenubar(TabBar, ClientState); - } - break; - - case IClient::STATE_ONLINE: - if(m_Popup != POPUP_NONE) - { - RenderPopupFullscreen(Screen); - } - else - { - CUIRect TabBar, MainView; - Screen.HSplitTop(24.0f, &TabBar, &MainView); - - if(m_GamePage == PAGE_GAME) - { - RenderGame(MainView); - RenderIngameHint(); - } - else if(m_GamePage == PAGE_PLAYERS) - { - RenderPlayers(MainView); - } - else if(m_GamePage == PAGE_SERVER_INFO) - { - RenderServerInfo(MainView); - } - else if(m_GamePage == PAGE_NETWORK) - { - RenderInGameNetwork(MainView); - } - else if(m_GamePage == PAGE_GHOST) - { - RenderGhost(MainView); - } - else if(m_GamePage == PAGE_CALLVOTE) - { - RenderServerControl(MainView); - } - else if(m_GamePage == PAGE_SETTINGS) - { - RenderSettings(MainView); - } - else - { - dbg_assert(false, "m_GamePage invalid"); - } - - RenderMenubar(TabBar, ClientState); - } - break; - - case IClient::STATE_DEMOPLAYBACK: - if(m_Popup != POPUP_NONE) - { - RenderPopupFullscreen(Screen); - } - else - { - RenderDemoPlayer(Screen); - } - break; - } - - Ui()->RenderPopupMenus(); - - // Prevent UI elements from being hovered while a key reader is active - if(m_Binder.m_TakeKey) - { - Ui()->SetHotItem(nullptr); - } - - // Handle this escape hotkey after popup menus - if(!m_ShowStart && ClientState == IClient::STATE_OFFLINE && Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) - { - m_ShowStart = true; - } -} - -void CMenus::RenderPopupFullscreen(CUIRect Screen) -{ - char aBuf[1536]; - const char *pTitle = ""; - const char *pExtraText = ""; - const char *pButtonText = ""; - bool TopAlign = false; - - ColorRGBA BgColor = ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f); - if(m_Popup == POPUP_MESSAGE || m_Popup == POPUP_CONFIRM) - { - pTitle = m_aPopupTitle; - pExtraText = m_aPopupMessage; - TopAlign = true; - } - else if(m_Popup == POPUP_DISCONNECTED) - { - pTitle = Localize("Disconnected"); - pExtraText = Client()->ErrorString(); - pButtonText = Localize("Ok"); - if(Client()->ReconnectTime() > 0) - { - str_format(aBuf, sizeof(aBuf), Localize("Reconnect in %d sec"), (int)((Client()->ReconnectTime() - time_get()) / time_freq()) + 1); - pTitle = Client()->ErrorString(); - pExtraText = aBuf; - pButtonText = Localize("Abort"); - } - } - else if(m_Popup == POPUP_RENAME_DEMO) - { - dbg_assert(m_DemolistSelectedIndex >= 0, "m_DemolistSelectedIndex invalid for POPUP_RENAME_DEMO"); - pTitle = m_vpFilteredDemos[m_DemolistSelectedIndex]->m_IsDir ? Localize("Rename folder") : Localize("Rename demo"); - } -#if defined(CONF_VIDEORECORDER) - else if(m_Popup == POPUP_RENDER_DEMO) - { - pTitle = Localize("Render demo"); - } - else if(m_Popup == POPUP_RENDER_DONE) - { - pTitle = Localize("Render complete"); - } -#endif - else if(m_Popup == POPUP_PASSWORD) - { - pTitle = Localize("Password incorrect"); - pButtonText = Localize("Try again"); - } - else if(m_Popup == POPUP_RESTART) - { - pTitle = Localize("Restart"); - pExtraText = Localize("Are you sure that you want to restart?"); - } - else if(m_Popup == POPUP_QUIT) - { - pTitle = Localize("Quit"); - pExtraText = Localize("Are you sure that you want to quit?"); - } - else if(m_Popup == POPUP_FIRST_LAUNCH) - { - pTitle = Localize("Welcome to DDNet"); - str_format(aBuf, sizeof(aBuf), "%s\n\n%s\n\n%s\n\n%s", - Localize("DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you."), - Localize("Use k key to kill (restart), q to pause and watch other players. See settings for other key binds."), - Localize("It's recommended that you check the settings to adjust them to your liking before joining a server."), - Localize("Please enter your nickname below.")); - pExtraText = aBuf; - pButtonText = Localize("Ok"); - TopAlign = true; - } - else if(m_Popup == POPUP_POINTS) - { - pTitle = Localize("Existing Player"); - if(Client()->Points() > 50) - { - str_format(aBuf, sizeof(aBuf), Localize("Your nickname '%s' is already used (%d points). Do you still want to use it?"), Client()->PlayerName(), Client()->Points()); - pExtraText = aBuf; - TopAlign = true; - } - else if(Client()->Points() >= 0) - { - m_Popup = POPUP_NONE; - } - else - { - pExtraText = Localize("Checking for existing player with your name"); - } - } - else if(m_Popup == POPUP_WARNING) - { - BgColor = ColorRGBA(0.5f, 0.0f, 0.0f, 0.7f); - pTitle = m_aMessageTopic; - pExtraText = m_aMessageBody; - pButtonText = m_aMessageButton; - TopAlign = true; - } - else if(m_Popup == POPUP_SAVE_SKIN) - { - pTitle = Localize("Save skin"); - pExtraText = Localize("Are you sure you want to save your skin? If a skin with this name already exists, it will be replaced."); - } - - CUIRect Box, Part; - Box = Screen; - if(m_Popup != POPUP_FIRST_LAUNCH) - Box.Margin(150.0f, &Box); - - // render the box - Box.Draw(BgColor, IGraphics::CORNER_ALL, 15.0f); - - Box.HSplitTop(20.f, &Part, &Box); - Box.HSplitTop(24.f, &Part, &Box); - Part.VMargin(20.f, &Part); - SLabelProperties Props; - Props.m_MaxWidth = (int)Part.w; - - if(TextRender()->TextWidth(24.f, pTitle, -1, -1.0f) > Part.w) - Ui()->DoLabel(&Part, pTitle, 24.f, TEXTALIGN_ML, Props); - else - Ui()->DoLabel(&Part, pTitle, 24.f, TEXTALIGN_MC); - - Box.HSplitTop(20.f, &Part, &Box); - Box.HSplitTop(24.f, &Part, &Box); - Part.VMargin(20.f, &Part); - - float FontSize = m_Popup == POPUP_FIRST_LAUNCH ? 16.0f : 20.f; - - Props.m_MaxWidth = (int)Part.w; - if(TopAlign) - Ui()->DoLabel(&Part, pExtraText, FontSize, TEXTALIGN_TL, Props); - else if(TextRender()->TextWidth(FontSize, pExtraText, -1, -1.0f) > Part.w) - Ui()->DoLabel(&Part, pExtraText, FontSize, TEXTALIGN_ML, Props); - else - Ui()->DoLabel(&Part, pExtraText, FontSize, TEXTALIGN_MC); - - if(m_Popup == POPUP_MESSAGE || m_Popup == POPUP_CONFIRM) - { - CUIRect ButtonBar; - Box.HSplitBottom(20.0f, &Box, nullptr); - Box.HSplitBottom(24.0f, &Box, &ButtonBar); - ButtonBar.VMargin(100.0f, &ButtonBar); - - if(m_Popup == POPUP_MESSAGE) - { - static CButtonContainer s_ButtonConfirm; - if(DoButton_Menu(&s_ButtonConfirm, m_aPopupButtons[BUTTON_CONFIRM].m_aLabel, 0, &ButtonBar) || Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE) || Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER)) - { - m_Popup = m_aPopupButtons[BUTTON_CONFIRM].m_NextPopup; - (this->*m_aPopupButtons[BUTTON_CONFIRM].m_pfnCallback)(); - } - } - else if(m_Popup == POPUP_CONFIRM) - { - CUIRect CancelButton, ConfirmButton; - ButtonBar.VSplitMid(&CancelButton, &ConfirmButton, 40.0f); - - static CButtonContainer s_ButtonCancel; - if(DoButton_Menu(&s_ButtonCancel, m_aPopupButtons[BUTTON_CANCEL].m_aLabel, 0, &CancelButton) || Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) - { - m_Popup = m_aPopupButtons[BUTTON_CANCEL].m_NextPopup; - (this->*m_aPopupButtons[BUTTON_CANCEL].m_pfnCallback)(); - } - - static CButtonContainer s_ButtonConfirm; - if(DoButton_Menu(&s_ButtonConfirm, m_aPopupButtons[BUTTON_CONFIRM].m_aLabel, 0, &ConfirmButton) || Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER)) - { - m_Popup = m_aPopupButtons[BUTTON_CONFIRM].m_NextPopup; - (this->*m_aPopupButtons[BUTTON_CONFIRM].m_pfnCallback)(); - } - } - } - else if(m_Popup == POPUP_QUIT || m_Popup == POPUP_RESTART) - { - CUIRect Yes, No; - Box.HSplitBottom(20.f, &Box, &Part); - Box.HSplitBottom(24.f, &Box, &Part); - - // additional info - Box.VMargin(20.f, &Box); - if(m_pClient->Editor()->HasUnsavedData()) - { - str_format(aBuf, sizeof(aBuf), "%s\n\n%s", Localize("There's an unsaved map in the editor, you might want to save it."), Localize("Continue anyway?")); - Props.m_MaxWidth = Part.w - 20.0f; - Ui()->DoLabel(&Box, aBuf, 20.f, TEXTALIGN_ML, Props); - } - - // buttons - Part.VMargin(80.0f, &Part); - Part.VSplitMid(&No, &Yes); - Yes.VMargin(20.0f, &Yes); - No.VMargin(20.0f, &No); - - static CButtonContainer s_ButtonAbort; - if(DoButton_Menu(&s_ButtonAbort, Localize("No"), 0, &No) || Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) - m_Popup = POPUP_NONE; - - static CButtonContainer s_ButtonTryAgain; - if(DoButton_Menu(&s_ButtonTryAgain, Localize("Yes"), 0, &Yes) || Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER)) - { - if(m_Popup == POPUP_RESTART) - { - m_Popup = POPUP_NONE; - Client()->Restart(); - } - else - { - m_Popup = POPUP_NONE; - Client()->Quit(); - } - } - } - else if(m_Popup == POPUP_PASSWORD) - { - CUIRect AddressLabel, Address, Icon, Name, Label, TextBox, TryAgain, Abort; - - Box.HSplitBottom(20.f, &Box, &Part); - Box.HSplitBottom(24.f, &Box, &Part); - Part.VMargin(80.0f, &Part); - - Part.VSplitMid(&Abort, &TryAgain); - - TryAgain.VMargin(20.0f, &TryAgain); - Abort.VMargin(20.0f, &Abort); - - static CButtonContainer s_ButtonAbort; - if(DoButton_Menu(&s_ButtonAbort, Localize("Abort"), 0, &Abort) || Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) - m_Popup = POPUP_NONE; - - char aAddr[NETADDR_MAXSTRSIZE]; - net_addr_str(&Client()->ServerAddress(), aAddr, sizeof(aAddr), true); - - static CButtonContainer s_ButtonTryAgain; - if(DoButton_Menu(&s_ButtonTryAgain, Localize("Try again"), 0, &TryAgain) || Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER)) - Client()->Connect(aAddr, g_Config.m_Password); - - Box.HSplitBottom(32.f, &Box, &Part); - Box.HSplitBottom(24.f, &Box, &Part); - - Part.VSplitLeft(60.0f, 0, &Label); - Label.VSplitLeft(100.0f, 0, &TextBox); - TextBox.VSplitLeft(20.0f, 0, &TextBox); - TextBox.VSplitRight(60.0f, &TextBox, 0); - Ui()->DoLabel(&Label, Localize("Password"), 18.0f, TEXTALIGN_ML); - Ui()->DoClearableEditBox(&m_PasswordInput, &TextBox, 12.0f); - - Box.HSplitBottom(32.f, &Box, &Part); - Box.HSplitBottom(24.f, &Box, &Part); - - Part.VSplitLeft(60.0f, 0, &AddressLabel); - AddressLabel.VSplitLeft(100.0f, 0, &Address); - Address.VSplitLeft(20.0f, 0, &Address); - Ui()->DoLabel(&AddressLabel, Localize("Address"), 18.0f, TEXTALIGN_ML); - Ui()->DoLabel(&Address, aAddr, 18.0f, TEXTALIGN_ML); - - Box.HSplitBottom(32.f, &Box, &Part); - Box.HSplitBottom(24.f, &Box, &Part); - - const CServerBrowser::CServerEntry *pEntry = ServerBrowser()->Find(Client()->ServerAddress()); - if(pEntry != nullptr && pEntry->m_GotInfo) - { - Part.VSplitLeft(60.0f, 0, &Icon); - Icon.VSplitLeft(100.0f, 0, &Name); - Icon.VSplitLeft(80.0f, &Icon, 0); - Name.VSplitLeft(20.0f, 0, &Name); - - const SCommunityIcon *pIcon = FindCommunityIcon(pEntry->m_Info.m_aCommunityId); - if(pIcon != nullptr) - RenderCommunityIcon(pIcon, Icon, true); - else - Ui()->DoLabel(&Icon, Localize("Name"), 18.0f, TEXTALIGN_ML); - - Ui()->DoLabel(&Name, pEntry->m_Info.m_aName, 18.0f, TEXTALIGN_ML); - } - } - else if(m_Popup == POPUP_LANGUAGE) - { - CUIRect Button; - Screen.Margin(150.0f, &Box); - Box.HSplitTop(20.0f, nullptr, &Box); - Box.HSplitBottom(20.0f, &Box, nullptr); - Box.HSplitBottom(24.0f, &Box, &Button); - Box.HSplitBottom(20.0f, &Box, nullptr); - Box.VMargin(20.0f, &Box); - const bool Activated = RenderLanguageSelection(Box); - Button.VMargin(120.0f, &Button); - - static CButtonContainer s_Button; - if(DoButton_Menu(&s_Button, Localize("Ok"), 0, &Button) || Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE) || Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER) || Activated) - m_Popup = POPUP_FIRST_LAUNCH; - } - else if(m_Popup == POPUP_RENAME_DEMO) - { - CUIRect Label, TextBox, Ok, Abort; - - Box.HSplitBottom(20.f, &Box, &Part); - Box.HSplitBottom(24.f, &Box, &Part); - Part.VMargin(80.0f, &Part); - - Part.VSplitMid(&Abort, &Ok); - - Ok.VMargin(20.0f, &Ok); - Abort.VMargin(20.0f, &Abort); - - static CButtonContainer s_ButtonAbort; - if(DoButton_Menu(&s_ButtonAbort, Localize("Abort"), 0, &Abort) || Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) - m_Popup = POPUP_NONE; - - static CButtonContainer s_ButtonOk; - if(DoButton_Menu(&s_ButtonOk, Localize("Ok"), 0, &Ok) || Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER)) - { - m_Popup = POPUP_NONE; - // rename demo - char aBufOld[IO_MAX_PATH_LENGTH]; - str_format(aBufOld, sizeof(aBufOld), "%s/%s", m_aCurrentDemoFolder, m_vpFilteredDemos[m_DemolistSelectedIndex]->m_aFilename); - char aBufNew[IO_MAX_PATH_LENGTH]; - str_format(aBufNew, sizeof(aBufNew), "%s/%s", m_aCurrentDemoFolder, m_DemoRenameInput.GetString()); - if(!m_vpFilteredDemos[m_DemolistSelectedIndex]->m_IsDir && !str_endswith(aBufNew, ".demo")) - str_append(aBufNew, ".demo"); - - if(Storage()->FileExists(aBufNew, m_vpFilteredDemos[m_DemolistSelectedIndex]->m_StorageType)) - { - PopupMessage(Localize("Error"), Localize("A demo with this name already exists"), Localize("Ok"), POPUP_RENAME_DEMO); - } - else if(Storage()->FolderExists(aBufNew, m_vpFilteredDemos[m_DemolistSelectedIndex]->m_StorageType)) - { - PopupMessage(Localize("Error"), Localize("A folder with this name already exists"), Localize("Ok"), POPUP_RENAME_DEMO); - } - else if(Storage()->RenameFile(aBufOld, aBufNew, m_vpFilteredDemos[m_DemolistSelectedIndex]->m_StorageType)) - { - str_copy(m_aCurrentDemoSelectionName, m_DemoRenameInput.GetString()); - if(!m_vpFilteredDemos[m_DemolistSelectedIndex]->m_IsDir) - fs_split_file_extension(m_DemoRenameInput.GetString(), m_aCurrentDemoSelectionName, sizeof(m_aCurrentDemoSelectionName)); - DemolistPopulate(); - DemolistOnUpdate(false); - } - else - { - PopupMessage(Localize("Error"), m_vpFilteredDemos[m_DemolistSelectedIndex]->m_IsDir ? Localize("Unable to rename the folder") : Localize("Unable to rename the demo"), Localize("Ok"), POPUP_RENAME_DEMO); - } - } - - Box.HSplitBottom(60.f, &Box, &Part); - Box.HSplitBottom(24.f, &Box, &Part); - - Part.VSplitLeft(60.0f, 0, &Label); - Label.VSplitLeft(120.0f, 0, &TextBox); - TextBox.VSplitLeft(20.0f, 0, &TextBox); - TextBox.VSplitRight(60.0f, &TextBox, 0); - Ui()->DoLabel(&Label, Localize("New name:"), 18.0f, TEXTALIGN_ML); - Ui()->DoEditBox(&m_DemoRenameInput, &TextBox, 12.0f); - } -#if defined(CONF_VIDEORECORDER) - else if(m_Popup == POPUP_RENDER_DEMO) - { - CUIRect Row, Ok, Abort; - Box.VMargin(60.0f, &Box); - Box.HMargin(20.0f, &Box); - Box.HSplitBottom(24.0f, &Box, &Row); - Box.HSplitBottom(40.0f, &Box, nullptr); - Row.VMargin(40.0f, &Row); - Row.VSplitMid(&Abort, &Ok, 40.0f); - - static CButtonContainer s_ButtonAbort; - if(DoButton_Menu(&s_ButtonAbort, Localize("Abort"), 0, &Abort) || Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) - { - m_DemoRenderInput.Clear(); - m_Popup = POPUP_NONE; - } - - static CButtonContainer s_ButtonOk; - if(DoButton_Menu(&s_ButtonOk, Localize("Ok"), 0, &Ok) || Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER)) - { - m_Popup = POPUP_NONE; - // render video - char aVideoPath[IO_MAX_PATH_LENGTH]; - str_format(aVideoPath, sizeof(aVideoPath), "videos/%s", m_DemoRenderInput.GetString()); - if(!str_endswith(aVideoPath, ".mp4")) - str_append(aVideoPath, ".mp4"); - if(Storage()->FolderExists(aVideoPath, IStorage::TYPE_SAVE)) - { - PopupMessage(Localize("Error"), Localize("A folder with this name already exists"), Localize("Ok"), POPUP_RENDER_DEMO); - } - else if(Storage()->FileExists(aVideoPath, IStorage::TYPE_SAVE)) - { - char aMessage[128 + IO_MAX_PATH_LENGTH]; - str_format(aMessage, sizeof(aMessage), Localize("File '%s' already exists, do you want to overwrite it?"), m_DemoRenderInput.GetString()); - PopupConfirm(Localize("Replace video"), aMessage, Localize("Yes"), Localize("No"), &CMenus::PopupConfirmDemoReplaceVideo, POPUP_NONE, &CMenus::DefaultButtonCallback, POPUP_RENDER_DEMO); - } - else - { - PopupConfirmDemoReplaceVideo(); - } - } - - CUIRect ShowChatCheckbox, UseSoundsCheckbox; - Box.HSplitBottom(20.0f, &Box, &Row); - Box.HSplitBottom(10.0f, &Box, nullptr); - Row.VSplitMid(&ShowChatCheckbox, &UseSoundsCheckbox, 20.0f); - - if(DoButton_CheckBox(&g_Config.m_ClVideoShowChat, Localize("Show chat"), g_Config.m_ClVideoShowChat, &ShowChatCheckbox)) - g_Config.m_ClVideoShowChat ^= 1; - - if(DoButton_CheckBox(&g_Config.m_ClVideoSndEnable, Localize("Use sounds"), g_Config.m_ClVideoSndEnable, &UseSoundsCheckbox)) - g_Config.m_ClVideoSndEnable ^= 1; - - CUIRect ShowHudButton; - Box.HSplitBottom(20.0f, &Box, &Row); - Row.VSplitMid(&Row, &ShowHudButton, 20.0f); - - if(DoButton_CheckBox(&g_Config.m_ClVideoShowhud, Localize("Show ingame HUD"), g_Config.m_ClVideoShowhud, &ShowHudButton)) - g_Config.m_ClVideoShowhud ^= 1; - - // slowdown - CUIRect SlowDownButton; - Row.VSplitLeft(20.0f, &SlowDownButton, &Row); - Row.VSplitLeft(5.0f, nullptr, &Row); - static CButtonContainer s_SlowDownButton; - if(DoButton_FontIcon(&s_SlowDownButton, FONT_ICON_BACKWARD, 0, &SlowDownButton, IGraphics::CORNER_ALL)) - m_Speed = clamp(m_Speed - 1, 0, (int)(g_DemoSpeeds - 1)); - - // paused - CUIRect PausedButton; - Row.VSplitLeft(20.0f, &PausedButton, &Row); - Row.VSplitLeft(5.0f, nullptr, &Row); - static CButtonContainer s_PausedButton; - if(DoButton_FontIcon(&s_PausedButton, FONT_ICON_PAUSE, 0, &PausedButton, IGraphics::CORNER_ALL)) - m_StartPaused ^= 1; - - // fastforward - CUIRect FastForwardButton; - Row.VSplitLeft(20.0f, &FastForwardButton, &Row); - Row.VSplitLeft(8.0f, nullptr, &Row); - static CButtonContainer s_FastForwardButton; - if(DoButton_FontIcon(&s_FastForwardButton, FONT_ICON_FORWARD, 0, &FastForwardButton, IGraphics::CORNER_ALL)) - m_Speed = clamp(m_Speed + 1, 0, (int)(g_DemoSpeeds - 1)); - - // speed meter - char aBuffer[128]; - const char *pPaused = m_StartPaused ? Localize("(paused)") : ""; - str_format(aBuffer, sizeof(aBuffer), "%s: ×%g %s", Localize("Speed"), g_aSpeeds[m_Speed], pPaused); - Ui()->DoLabel(&Row, aBuffer, 12.8f, TEXTALIGN_ML); - Box.HSplitBottom(16.0f, &Box, nullptr); - Box.HSplitBottom(24.0f, &Box, &Row); - - CUIRect Label, TextBox; - Row.VSplitLeft(110.0f, &Label, &TextBox); - TextBox.VSplitLeft(10.0f, nullptr, &TextBox); - Ui()->DoLabel(&Label, Localize("Video name:"), 12.8f, TEXTALIGN_ML); - Ui()->DoEditBox(&m_DemoRenderInput, &TextBox, 12.8f); - } - else if(m_Popup == POPUP_RENDER_DONE) - { - CUIRect Ok, OpenFolder; - - char aFilePath[IO_MAX_PATH_LENGTH]; - char aSaveFolder[IO_MAX_PATH_LENGTH]; - Storage()->GetCompletePath(IStorage::TYPE_SAVE, "videos", aSaveFolder, sizeof(aSaveFolder)); - str_format(aFilePath, sizeof(aFilePath), "%s/%s.mp4", aSaveFolder, m_DemoRenderInput.GetString()); - - Box.HSplitBottom(20.f, &Box, &Part); - Box.HSplitBottom(24.f, &Box, &Part); - Part.VMargin(80.0f, &Part); - - Part.VSplitMid(&OpenFolder, &Ok); - - Ok.VMargin(20.0f, &Ok); - OpenFolder.VMargin(20.0f, &OpenFolder); - - static CButtonContainer s_ButtonOpenFolder; - if(DoButton_Menu(&s_ButtonOpenFolder, Localize("Videos directory"), 0, &OpenFolder)) - { - Client()->ViewFile(aSaveFolder); - } - - static CButtonContainer s_ButtonOk; - if(DoButton_Menu(&s_ButtonOk, Localize("Ok"), 0, &Ok) || Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER)) - { - m_Popup = POPUP_NONE; - m_DemoRenderInput.Clear(); - } - - Box.HSplitBottom(160.f, &Box, &Part); - Part.VMargin(20.0f, &Part); - - str_format(aBuf, sizeof(aBuf), Localize("Video was saved to '%s'"), aFilePath); - - SLabelProperties MessageProps; - MessageProps.m_MaxWidth = (int)Part.w; - Ui()->DoLabel(&Part, aBuf, 18.0f, TEXTALIGN_TL, MessageProps); - } -#endif - else if(m_Popup == POPUP_FIRST_LAUNCH) - { - CUIRect Label, TextBox, Skip, Join; - - Box.HSplitBottom(20.f, &Box, &Part); - Box.HSplitBottom(24.f, &Box, &Part); - Part.VMargin(80.0f, &Part); - Part.VSplitMid(&Skip, &Join); - Skip.VMargin(20.0f, &Skip); - Join.VMargin(20.0f, &Join); - - static CButtonContainer s_JoinTutorialButton; - if(DoButton_Menu(&s_JoinTutorialButton, Localize("Join Tutorial Server"), 0, &Join) || Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER)) - { - m_JoinTutorial = true; - Client()->RequestDDNetInfo(); - m_Popup = g_Config.m_BrIndicateFinished ? POPUP_POINTS : POPUP_NONE; - } - - static CButtonContainer s_SkipTutorialButton; - if(DoButton_Menu(&s_SkipTutorialButton, Localize("Skip Tutorial"), 0, &Skip) || Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) - { - m_JoinTutorial = false; - Client()->RequestDDNetInfo(); - m_Popup = g_Config.m_BrIndicateFinished ? POPUP_POINTS : POPUP_NONE; - } - - Box.HSplitBottom(20.f, &Box, &Part); - Box.HSplitBottom(24.f, &Box, &Part); - - Part.VSplitLeft(30.0f, 0, &Part); - str_format(aBuf, sizeof(aBuf), "%s\n(%s)", - Localize("Show DDNet map finishes in server browser"), - Localize("transmits your player name to info.ddnet.org")); - - if(DoButton_CheckBox(&g_Config.m_BrIndicateFinished, aBuf, g_Config.m_BrIndicateFinished, &Part)) - g_Config.m_BrIndicateFinished ^= 1; - - Box.HSplitBottom(20.f, &Box, &Part); - Box.HSplitBottom(24.f, &Box, &Part); - - Part.VSplitLeft(60.0f, 0, &Label); - Label.VSplitLeft(100.0f, 0, &TextBox); - TextBox.VSplitLeft(20.0f, 0, &TextBox); - TextBox.VSplitRight(60.0f, &TextBox, 0); - Ui()->DoLabel(&Label, Localize("Nickname"), 16.0f, TEXTALIGN_ML); - static CLineInput s_PlayerNameInput(g_Config.m_PlayerName, sizeof(g_Config.m_PlayerName)); - s_PlayerNameInput.SetEmptyText(Client()->PlayerName()); - Ui()->DoEditBox(&s_PlayerNameInput, &TextBox, 12.0f); - } - else if(m_Popup == POPUP_POINTS) - { - CUIRect Yes, No; - - Box.HSplitBottom(20.f, &Box, &Part); - Box.HSplitBottom(24.f, &Box, &Part); - Part.VMargin(80.0f, &Part); - - Part.VSplitMid(&No, &Yes); - - Yes.VMargin(20.0f, &Yes); - No.VMargin(20.0f, &No); - - static CButtonContainer s_ButtonNo; - if(DoButton_Menu(&s_ButtonNo, Localize("No"), 0, &No) || Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) - m_Popup = POPUP_FIRST_LAUNCH; - - static CButtonContainer s_ButtonYes; - if(DoButton_Menu(&s_ButtonYes, Localize("Yes"), 0, &Yes) || Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER)) - m_Popup = POPUP_NONE; - } - else if(m_Popup == POPUP_WARNING) - { - Box.HSplitBottom(20.f, &Box, &Part); - Box.HSplitBottom(24.f, &Box, &Part); - Part.VMargin(120.0f, &Part); - - static CButtonContainer s_Button; - if(DoButton_Menu(&s_Button, pButtonText, 0, &Part) || Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE) || Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER) || (m_PopupWarningDuration > 0s && time_get_nanoseconds() - m_PopupWarningLastTime >= m_PopupWarningDuration)) - { - m_Popup = POPUP_NONE; - SetActive(false); - } - } - else if(m_Popup == POPUP_SAVE_SKIN) - { - CUIRect Label, TextBox, Yes, No; - - Box.HSplitBottom(20.f, &Box, &Part); - Box.HSplitBottom(24.f, &Box, &Part); - Part.VMargin(80.0f, &Part); - - Part.VSplitMid(&No, &Yes); - - Yes.VMargin(20.0f, &Yes); - No.VMargin(20.0f, &No); - - static CButtonContainer s_ButtonNo; - if(DoButton_Menu(&s_ButtonNo, Localize("No"), 0, &No) || Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) - m_Popup = POPUP_NONE; - - static CButtonContainer s_ButtonYes; - if(DoButton_Menu(&s_ButtonYes, Localize("Yes"), m_SkinNameInput.IsEmpty() ? 1 : 0, &Yes) || Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER)) - { - if(m_SkinNameInput.GetLength()) - { - if(m_SkinNameInput.GetString()[0] != 'x' && m_SkinNameInput.GetString()[1] != '_') - { - if(m_pClient->m_Skins7.SaveSkinfile(m_SkinNameInput.GetString(), m_Dummy)) - { - m_Popup = POPUP_NONE; - m_SkinList7LastRefreshTime = std::nullopt; - } - else - PopupMessage(Localize("Error"), Localize("Unable to save the skin"), Localize("Ok"), POPUP_SAVE_SKIN); - } - else - PopupMessage(Localize("Error"), Localize("Unable to save the skin with a reserved name"), Localize("Ok"), POPUP_SAVE_SKIN); - } - } - - Box.HSplitBottom(60.f, &Box, &Part); - Box.HSplitBottom(24.f, &Box, &Part); - - Part.VMargin(60.0f, &Label); - Label.VSplitLeft(100.0f, &Label, &TextBox); - TextBox.VSplitLeft(20.0f, nullptr, &TextBox); - Ui()->DoLabel(&Label, Localize("Name"), 18.0f, TEXTALIGN_ML); - Ui()->DoClearableEditBox(&m_SkinNameInput, &TextBox, 12.0f); - } - else - { - Box.HSplitBottom(20.f, &Box, &Part); - Box.HSplitBottom(24.f, &Box, &Part); - Part.VMargin(120.0f, &Part); - - static CButtonContainer s_Button; - if(DoButton_Menu(&s_Button, pButtonText, 0, &Part) || Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE) || Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER)) - { - if(m_Popup == POPUP_DISCONNECTED && Client()->ReconnectTime() > 0) - Client()->SetReconnectTime(0); - m_Popup = POPUP_NONE; - } - } - - if(m_Popup == POPUP_NONE) - Ui()->SetActiveItem(nullptr); -} - -void CMenus::RenderPopupConnecting(CUIRect Screen) -{ - const float FontSize = 20.0f; - - CUIRect Box, Label; - Screen.Margin(150.0f, &Box); - Box.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f), IGraphics::CORNER_ALL, 15.0f); - Box.Margin(20.0f, &Box); - - Box.HSplitTop(24.0f, &Label, &Box); - Ui()->DoLabel(&Label, Localize("Connecting to"), 24.0f, TEXTALIGN_MC); - - Box.HSplitTop(20.0f, nullptr, &Box); - Box.HSplitTop(24.0f, &Label, &Box); - SLabelProperties Props; - Props.m_MaxWidth = Label.w; - Props.m_EllipsisAtEnd = true; - Ui()->DoLabel(&Label, Client()->ConnectAddressString(), FontSize, TEXTALIGN_MC, Props); - - if(time_get() - Client()->StateStartTime() > time_freq()) - { - const char *pConnectivityLabel = ""; - switch(Client()->UdpConnectivity(Client()->ConnectNetTypes())) - { - case IClient::CONNECTIVITY_UNKNOWN: - break; - case IClient::CONNECTIVITY_CHECKING: - pConnectivityLabel = Localize("Trying to determine UDP connectivity…"); - break; - case IClient::CONNECTIVITY_UNREACHABLE: - pConnectivityLabel = Localize("UDP seems to be filtered."); - break; - case IClient::CONNECTIVITY_DIFFERING_UDP_TCP_IP_ADDRESSES: - pConnectivityLabel = Localize("UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators."); - break; - case IClient::CONNECTIVITY_REACHABLE: - pConnectivityLabel = Localize("No answer from server yet."); - break; - } - if(pConnectivityLabel[0] != '\0') - { - Box.HSplitTop(20.0f, nullptr, &Box); - Box.HSplitTop(24.0f, &Label, &Box); - SLabelProperties ConnectivityLabelProps; - ConnectivityLabelProps.m_MaxWidth = Label.w; - if(TextRender()->TextWidth(FontSize, pConnectivityLabel) > Label.w) - Ui()->DoLabel(&Label, pConnectivityLabel, FontSize, TEXTALIGN_ML, ConnectivityLabelProps); - else - Ui()->DoLabel(&Label, pConnectivityLabel, FontSize, TEXTALIGN_MC); - } - } - - CUIRect Button; - Box.HSplitBottom(24.0f, &Box, &Button); - Button.VMargin(100.0f, &Button); - - static CButtonContainer s_Button; - if(DoButton_Menu(&s_Button, Localize("Abort"), 0, &Button) || Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) - { - Client()->Disconnect(); - Ui()->SetActiveItem(nullptr); - RefreshBrowserTab(true); - } -} - -void CMenus::RenderPopupLoading(CUIRect Screen) -{ - char aTitle[256]; - char aLabel1[128]; - char aLabel2[128]; - if(Client()->MapDownloadTotalsize() > 0) - { - const int64_t Now = time_get(); - if(Now - m_DownloadLastCheckTime >= time_freq()) - { - if(m_DownloadLastCheckSize > Client()->MapDownloadAmount()) - { - // map downloaded restarted - m_DownloadLastCheckSize = 0; - } - - // update download speed - const float Diff = (Client()->MapDownloadAmount() - m_DownloadLastCheckSize) / ((int)((Now - m_DownloadLastCheckTime) / time_freq())); - const float StartDiff = m_DownloadLastCheckSize - 0.0f; - if(StartDiff + Diff > 0.0f) - m_DownloadSpeed = (Diff / (StartDiff + Diff)) * (Diff / 1.0f) + (StartDiff / (Diff + StartDiff)) * m_DownloadSpeed; - else - m_DownloadSpeed = 0.0f; - m_DownloadLastCheckTime = Now; - m_DownloadLastCheckSize = Client()->MapDownloadAmount(); - } - - str_format(aTitle, sizeof(aTitle), "%s: %s", Localize("Downloading map"), Client()->MapDownloadName()); - - str_format(aLabel1, sizeof(aLabel1), Localize("%d/%d KiB (%.1f KiB/s)"), Client()->MapDownloadAmount() / 1024, Client()->MapDownloadTotalsize() / 1024, m_DownloadSpeed / 1024.0f); - - const int SecondsLeft = maximum(1, m_DownloadSpeed > 0.0f ? static_cast((Client()->MapDownloadTotalsize() - Client()->MapDownloadAmount()) / m_DownloadSpeed) : 1); - const int MinutesLeft = SecondsLeft / 60; - if(MinutesLeft > 0) - { - str_format(aLabel2, sizeof(aLabel2), MinutesLeft == 1 ? Localize("%i minute left") : Localize("%i minutes left"), MinutesLeft); - } - else - { - str_format(aLabel2, sizeof(aLabel2), SecondsLeft == 1 ? Localize("%i second left") : Localize("%i seconds left"), SecondsLeft); - } - } - else - { - str_copy(aTitle, Localize("Connected")); - switch(Client()->LoadingStateDetail()) - { - case IClient::LOADING_STATE_DETAIL_INITIAL: - str_copy(aLabel1, Localize("Getting game info")); - break; - case IClient::LOADING_STATE_DETAIL_LOADING_MAP: - str_copy(aLabel1, Localize("Loading map file from storage")); - break; - case IClient::LOADING_STATE_DETAIL_LOADING_DEMO: - str_copy(aLabel1, Localize("Loading demo file from storage")); - break; - case IClient::LOADING_STATE_DETAIL_SENDING_READY: - str_copy(aLabel1, Localize("Requesting to join the game")); - break; - case IClient::LOADING_STATE_DETAIL_GETTING_READY: - str_copy(aLabel1, Localize("Sending initial client info")); - break; - default: - dbg_assert(false, "Invalid loading state for RenderPopupLoading"); - break; - } - aLabel2[0] = '\0'; - } - - const float FontSize = 20.0f; - - CUIRect Box, Label; - Screen.Margin(150.0f, &Box); - Box.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f), IGraphics::CORNER_ALL, 15.0f); - Box.Margin(20.0f, &Box); - - Box.HSplitTop(24.0f, &Label, &Box); - Ui()->DoLabel(&Label, aTitle, 24.0f, TEXTALIGN_MC); - - Box.HSplitTop(20.0f, nullptr, &Box); - Box.HSplitTop(24.0f, &Label, &Box); - Ui()->DoLabel(&Label, aLabel1, FontSize, TEXTALIGN_MC); - - if(aLabel2[0] != '\0') - { - Box.HSplitTop(20.0f, nullptr, &Box); - Box.HSplitTop(24.0f, &Label, &Box); - SLabelProperties ExtraTextProps; - ExtraTextProps.m_MaxWidth = Label.w; - if(TextRender()->TextWidth(FontSize, aLabel2) > Label.w) - Ui()->DoLabel(&Label, aLabel2, FontSize, TEXTALIGN_ML, ExtraTextProps); - else - Ui()->DoLabel(&Label, aLabel2, FontSize, TEXTALIGN_MC); - } - - if(Client()->MapDownloadTotalsize() > 0) - { - CUIRect ProgressBar; - Box.HSplitTop(20.0f, nullptr, &Box); - Box.HSplitTop(24.0f, &ProgressBar, &Box); - ProgressBar.VMargin(20.0f, &ProgressBar); - Ui()->RenderProgressBar(ProgressBar, Client()->MapDownloadAmount() / (float)Client()->MapDownloadTotalsize()); - } - - CUIRect Button; - Box.HSplitBottom(24.0f, &Box, &Button); - Button.VMargin(100.0f, &Button); - - static CButtonContainer s_Button; - if(DoButton_Menu(&s_Button, Localize("Abort"), 0, &Button) || Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) - { - Client()->Disconnect(); - Ui()->SetActiveItem(nullptr); - RefreshBrowserTab(true); - } -} - -#if defined(CONF_VIDEORECORDER) -void CMenus::PopupConfirmDemoReplaceVideo() -{ - char aBuf[IO_MAX_PATH_LENGTH]; - str_format(aBuf, sizeof(aBuf), "%s/%s.demo", m_aCurrentDemoFolder, m_aCurrentDemoSelectionName); - char aVideoName[IO_MAX_PATH_LENGTH]; - str_copy(aVideoName, m_DemoRenderInput.GetString()); - const char *pError = Client()->DemoPlayer_Render(aBuf, m_DemolistStorageType, aVideoName, m_Speed, m_StartPaused); - m_Speed = 4; - m_StartPaused = false; - m_LastPauseChange = -1.0f; - m_LastSpeedChange = -1.0f; - if(pError) - { - m_DemoRenderInput.Clear(); - PopupMessage(Localize("Error loading demo"), pError, Localize("Ok")); - } -} -#endif - -void CMenus::RenderThemeSelection(CUIRect MainView) -{ - const std::vector &vThemes = GameClient()->m_MenuBackground.GetThemes(); - - int SelectedTheme = -1; - for(int i = 0; i < (int)vThemes.size(); i++) - { - if(str_comp(vThemes[i].m_Name.c_str(), g_Config.m_ClMenuMap) == 0) - { - SelectedTheme = i; - break; - } - } - const int OldSelected = SelectedTheme; - - static CListBox s_ListBox; - s_ListBox.DoHeader(&MainView, Localize("Theme"), 20.0f); - s_ListBox.DoStart(20.0f, vThemes.size(), 1, 3, SelectedTheme); - - for(int i = 0; i < (int)vThemes.size(); i++) - { - const CTheme &Theme = vThemes[i]; - const CListboxItem Item = s_ListBox.DoNextItem(&Theme.m_Name, i == SelectedTheme); - - if(!Item.m_Visible) - continue; - - CUIRect Icon, Label; - Item.m_Rect.VSplitLeft(Item.m_Rect.h * 2.0f, &Icon, &Label); - - // draw icon if it exists - if(Theme.m_IconTexture.IsValid()) - { - Icon.VMargin(6.0f, &Icon); - Icon.HMargin(3.0f, &Icon); - Graphics()->TextureSet(Theme.m_IconTexture); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - IGraphics::CQuadItem QuadItem(Icon.x, Icon.y, Icon.w, Icon.h); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); - } - - char aName[128]; - if(Theme.m_Name.empty()) - str_copy(aName, "(none)"); - else if(str_comp(Theme.m_Name.c_str(), "auto") == 0) - str_copy(aName, "(seasons)"); - else if(str_comp(Theme.m_Name.c_str(), "rand") == 0) - str_copy(aName, "(random)"); - else if(Theme.m_HasDay && Theme.m_HasNight) - str_copy(aName, Theme.m_Name.c_str()); - else if(Theme.m_HasDay && !Theme.m_HasNight) - str_format(aName, sizeof(aName), "%s (day)", Theme.m_Name.c_str()); - else if(!Theme.m_HasDay && Theme.m_HasNight) - str_format(aName, sizeof(aName), "%s (night)", Theme.m_Name.c_str()); - else // generic - str_copy(aName, Theme.m_Name.c_str()); - - Ui()->DoLabel(&Label, aName, 16.0f * CUi::ms_FontmodHeight, TEXTALIGN_ML); - } - - SelectedTheme = s_ListBox.DoEnd(); - - if(OldSelected != SelectedTheme) - { - const CTheme &Theme = vThemes[SelectedTheme]; - str_copy(g_Config.m_ClMenuMap, Theme.m_Name.c_str()); - GameClient()->m_MenuBackground.LoadMenuBackground(Theme.m_HasDay, Theme.m_HasNight); - } -} - -void CMenus::SetActive(bool Active) -{ - if(Active != m_MenuActive) - { - Ui()->SetHotItem(nullptr); - Ui()->SetActiveItem(nullptr); - } - m_MenuActive = Active; - if(!m_MenuActive) - { - if(m_NeedSendinfo) - { - m_pClient->SendInfo(false); - m_NeedSendinfo = false; - } - - if(m_NeedSendDummyinfo) - { - m_pClient->SendDummyInfo(false); - m_NeedSendDummyinfo = false; - } - - if(Client()->State() == IClient::STATE_ONLINE) - { - m_pClient->OnRelease(); - } - } - else if(Client()->State() == IClient::STATE_DEMOPLAYBACK) - { - m_pClient->OnRelease(); - } -} - -void CMenus::OnReset() -{ -} - -void CMenus::OnShutdown() -{ - KillServer(); - m_CommunityIconLoadJobs.clear(); - m_CommunityIconDownloadJobs.clear(); -} - -bool CMenus::OnCursorMove(float x, float y, IInput::ECursorType CursorType) -{ - if(!m_MenuActive) - return false; - - Ui()->ConvertMouseMove(&x, &y, CursorType); - Ui()->OnCursorMove(x, y); - - return true; -} - -bool CMenus::OnInput(const IInput::CEvent &Event) -{ - // Escape key is always handled to activate/deactivate menu - if((Event.m_Flags & IInput::FLAG_PRESS && Event.m_Key == KEY_ESCAPE) || IsActive()) - { - Ui()->OnInput(Event); - return true; - } - return false; -} - -void CMenus::OnStateChange(int NewState, int OldState) -{ - // reset active item - Ui()->SetActiveItem(nullptr); - - if(OldState == IClient::STATE_ONLINE || OldState == IClient::STATE_OFFLINE) - TextRender()->DeleteTextContainer(m_MotdTextContainerIndex); - - if(NewState == IClient::STATE_OFFLINE) - { - if(OldState >= IClient::STATE_ONLINE && NewState < IClient::STATE_QUITTING) - UpdateMusicState(); - m_Popup = POPUP_NONE; - if(Client()->ErrorString() && Client()->ErrorString()[0] != 0) - { - if(str_find(Client()->ErrorString(), "password")) - { - m_Popup = POPUP_PASSWORD; - m_PasswordInput.SelectAll(); - Ui()->SetActiveItem(&m_PasswordInput); - } - else - m_Popup = POPUP_DISCONNECTED; - } - } - else if(NewState == IClient::STATE_LOADING) - { - m_DownloadLastCheckTime = time_get(); - m_DownloadLastCheckSize = 0; - m_DownloadSpeed = 0.0f; - } - else if(NewState == IClient::STATE_ONLINE || NewState == IClient::STATE_DEMOPLAYBACK) - { - if(m_Popup != POPUP_WARNING) - { - m_Popup = POPUP_NONE; - SetActive(false); - } - } -} - -void CMenus::OnWindowResize() -{ - TextRender()->DeleteTextContainer(m_MotdTextContainerIndex); -} - -void CMenus::OnRender() -{ - Ui()->StartCheck(); - - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - SetActive(true); - - if(Client()->State() == IClient::STATE_ONLINE && m_pClient->m_ServerMode == CGameClient::SERVERMODE_PUREMOD) - { - Client()->Disconnect(); - SetActive(true); - PopupMessage(Localize("Disconnected"), Localize("The server is running a non-standard tuning on a pure game type."), Localize("Ok")); - } - - if(!IsActive()) - { - if(Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) - { - SetActive(true); - } - else if(Client()->State() != IClient::STATE_DEMOPLAYBACK) - { - Ui()->FinishCheck(); - Ui()->ClearHotkeys(); - return; - } - } - - UpdateColors(); - - Ui()->Update(); - - Render(); - - if(IsActive()) - { - RenderTools()->RenderCursor(Ui()->MousePos(), 24.0f); - } - - // render debug information - if(g_Config.m_Debug) - Ui()->DebugRender(2.0f, Ui()->Screen()->h - 12.0f); - - if(Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) - SetActive(false); - - Ui()->FinishCheck(); - Ui()->ClearHotkeys(); -} - -void CMenus::UpdateColors() -{ - ms_GuiColor = color_cast(ColorHSLA(g_Config.m_UiColor, true)); - - ms_ColorTabbarInactiveOutgame = ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f); - ms_ColorTabbarActiveOutgame = ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f); - ms_ColorTabbarHoverOutgame = ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f); - - const float ColorIngameScaleI = 0.5f; - const float ColorIngameAcaleA = 0.2f; - - ms_ColorTabbarInactiveIngame = ColorRGBA( - ms_GuiColor.r * ColorIngameScaleI, - ms_GuiColor.g * ColorIngameScaleI, - ms_GuiColor.b * ColorIngameScaleI, - ms_GuiColor.a * 0.8f); - - ms_ColorTabbarActiveIngame = ColorRGBA( - ms_GuiColor.r * ColorIngameAcaleA, - ms_GuiColor.g * ColorIngameAcaleA, - ms_GuiColor.b * ColorIngameAcaleA, - ms_GuiColor.a); - - ms_ColorTabbarHoverIngame = ColorRGBA(1.0f, 1.0f, 1.0f, 0.75f); -} - -void CMenus::RenderBackground() -{ - Graphics()->BlendNormal(); - - const float ScreenHeight = 300.0f; - const float ScreenWidth = ScreenHeight * Graphics()->ScreenAspect(); - Graphics()->MapScreen(0.0f, 0.0f, ScreenWidth, ScreenHeight); - - // render background color - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - Graphics()->SetColor(ms_GuiColor.WithAlpha(1.0f)); - const IGraphics::CQuadItem BackgroundQuadItem = IGraphics::CQuadItem(0, 0, ScreenWidth, ScreenHeight); - Graphics()->QuadsDrawTL(&BackgroundQuadItem, 1); - Graphics()->QuadsEnd(); - - // render the tiles - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - Graphics()->SetColor(0.0f, 0.0f, 0.0f, 0.045f); - const float Size = 15.0f; - const float OffsetTime = std::fmod(Client()->GlobalTime() * 0.15f, 2.0f); - IGraphics::CQuadItem aCheckerItems[64]; - size_t NumCheckerItems = 0; - const int NumItemsWidth = std::ceil(ScreenWidth / Size); - const int NumItemsHeight = std::ceil(ScreenHeight / Size); - for(int y = -2; y < NumItemsHeight; y++) - { - for(int x = 0; x < NumItemsWidth + 4; x += 2) - { - aCheckerItems[NumCheckerItems] = IGraphics::CQuadItem((x - 2 * OffsetTime + (y & 1)) * Size, (y + OffsetTime) * Size, Size, Size); - NumCheckerItems++; - if(NumCheckerItems == std::size(aCheckerItems)) - { - Graphics()->QuadsDrawTL(aCheckerItems, NumCheckerItems); - NumCheckerItems = 0; - } - } - } - if(NumCheckerItems != 0) - Graphics()->QuadsDrawTL(aCheckerItems, NumCheckerItems); - Graphics()->QuadsEnd(); - - // render border fade - Graphics()->TextureSet(m_TextureBlob); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - const IGraphics::CQuadItem BlobQuadItem = IGraphics::CQuadItem(-100, -100, ScreenWidth + 200, ScreenHeight + 200); - Graphics()->QuadsDrawTL(&BlobQuadItem, 1); - Graphics()->QuadsEnd(); - - // restore screen - Ui()->MapScreen(); -} - -bool CMenus::CheckHotKey(int Key) const -{ - return !Input()->ShiftIsPressed() && !Input()->ModifierIsPressed() && !Input()->AltIsPressed() && // no modifier - Input()->KeyPress(Key) && - m_pClient->m_GameConsole.IsClosed(); -} - -int CMenus::DoButton_CheckBox_Tristate(const void *pId, const char *pText, TRISTATE Checked, const CUIRect *pRect) -{ - switch(Checked) - { - case TRISTATE::NONE: - return DoButton_CheckBox_Common(pId, pText, "", pRect); - case TRISTATE::SOME: - return DoButton_CheckBox_Common(pId, pText, "O", pRect); - case TRISTATE::ALL: - return DoButton_CheckBox_Common(pId, pText, "X", pRect); - default: - dbg_assert(false, "invalid tristate"); - } - dbg_break(); -} - -int CMenus::MenuImageScan(const char *pName, int IsDir, int DirType, void *pUser) -{ - const char *pExtension = ".png"; - CMenuImage MenuImage; - CMenus *pSelf = static_cast(pUser); - if(IsDir || !str_endswith(pName, pExtension) || str_length(pName) - str_length(pExtension) >= (int)sizeof(MenuImage.m_aName)) - return 0; - - char aPath[IO_MAX_PATH_LENGTH]; - str_format(aPath, sizeof(aPath), "menuimages/%s", pName); - - CImageInfo Info; - if(!pSelf->Graphics()->LoadPng(Info, aPath, DirType)) - { - char aError[IO_MAX_PATH_LENGTH + 64]; - str_format(aError, sizeof(aError), "Failed to load menu image from '%s'", aPath); - pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "menus", aError); - return 0; - } - if(Info.m_Format != CImageInfo::FORMAT_RGBA) - { - Info.Free(); - char aError[IO_MAX_PATH_LENGTH + 64]; - str_format(aError, sizeof(aError), "Failed to load menu image from '%s': must be an RGBA image", aPath); - pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "menus", aError); - return 0; - } - - MenuImage.m_OrgTexture = pSelf->Graphics()->LoadTextureRaw(Info, 0, aPath); - - ConvertToGrayscale(Info); - MenuImage.m_GreyTexture = pSelf->Graphics()->LoadTextureRawMove(Info, 0, aPath); - - str_truncate(MenuImage.m_aName, sizeof(MenuImage.m_aName), pName, str_length(pName) - str_length(pExtension)); - pSelf->m_vMenuImages.push_back(MenuImage); - - pSelf->RenderLoading(Localize("Loading DDNet Client"), Localize("Loading menu images"), 1); - - return 0; -} - -const CMenus::CMenuImage *CMenus::FindMenuImage(const char *pName) -{ - for(auto &Image : m_vMenuImages) - if(str_comp(Image.m_aName, pName) == 0) - return &Image; - return nullptr; -} - -void CMenus::SetMenuPage(int NewPage) -{ - const int OldPage = m_MenuPage; - m_MenuPage = NewPage; - if(NewPage >= PAGE_INTERNET && NewPage <= PAGE_FAVORITE_COMMUNITY_5) - { - g_Config.m_UiPage = NewPage; - bool ForceRefresh = false; - if(m_ForceRefreshLanPage) - { - ForceRefresh = NewPage == PAGE_LAN; - m_ForceRefreshLanPage = false; - } - if(OldPage != NewPage || ForceRefresh) - { - RefreshBrowserTab(ForceRefresh); - } - } -} - -void CMenus::RefreshBrowserTab(bool Force) -{ - if(g_Config.m_UiPage == PAGE_INTERNET) - { - if(Force || ServerBrowser()->GetCurrentType() != IServerBrowser::TYPE_INTERNET) - { - if(Force || ServerBrowser()->GetCurrentType() == IServerBrowser::TYPE_LAN) - { - Client()->RequestDDNetInfo(); - } - ServerBrowser()->Refresh(IServerBrowser::TYPE_INTERNET); - UpdateCommunityCache(true); - } - } - else if(g_Config.m_UiPage == PAGE_LAN) - { - if(Force || ServerBrowser()->GetCurrentType() != IServerBrowser::TYPE_LAN) - { - ServerBrowser()->Refresh(IServerBrowser::TYPE_LAN); - UpdateCommunityCache(true); - } - } - else if(g_Config.m_UiPage == PAGE_FAVORITES) - { - if(Force || ServerBrowser()->GetCurrentType() != IServerBrowser::TYPE_FAVORITES) - { - if(Force || ServerBrowser()->GetCurrentType() == IServerBrowser::TYPE_LAN) - { - Client()->RequestDDNetInfo(); - } - ServerBrowser()->Refresh(IServerBrowser::TYPE_FAVORITES); - UpdateCommunityCache(true); - } - } - else if(g_Config.m_UiPage >= PAGE_FAVORITE_COMMUNITY_1 && g_Config.m_UiPage <= PAGE_FAVORITE_COMMUNITY_5) - { - const int BrowserType = g_Config.m_UiPage - PAGE_FAVORITE_COMMUNITY_1 + IServerBrowser::TYPE_FAVORITE_COMMUNITY_1; - if(Force || ServerBrowser()->GetCurrentType() != BrowserType) - { - if(Force || ServerBrowser()->GetCurrentType() == IServerBrowser::TYPE_LAN) - { - Client()->RequestDDNetInfo(); - } - ServerBrowser()->Refresh(BrowserType); - UpdateCommunityCache(true); - } - } -} diff --git a/src/game/client/components/menus.h b/src/game/client/components/menus.h deleted file mode 100644 index 2437f9e1f1..0000000000 --- a/src/game/client/components/menus.h +++ /dev/null @@ -1,850 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_MENUS_H -#define GAME_CLIENT_COMPONENTS_MENUS_H - -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -struct CServerProcess -{ -#if !defined(CONF_PLATFORM_ANDROID) - PROCESS m_Process = INVALID_PROCESS; -#endif -}; - -// component to fetch keypresses, override all other input -class CMenusKeyBinder : public CComponent -{ -public: - const void *m_pKeyReaderId; - bool m_TakeKey; - bool m_GotKey; - IInput::CEvent m_Key; - int m_ModifierCombination; - CMenusKeyBinder(); - virtual int Sizeof() const override { return sizeof(*this); } - virtual bool OnInput(const IInput::CEvent &Event) override; -}; - -struct SCommunityIcon -{ - char m_aCommunityId[CServerInfo::MAX_COMMUNITY_ID_LENGTH]; - SHA256_DIGEST m_Sha256; - IGraphics::CTextureHandle m_OrgTexture; - IGraphics::CTextureHandle m_GreyTexture; -}; - -class CMenus : public CComponent -{ - static ColorRGBA ms_GuiColor; - static ColorRGBA ms_ColorTabbarInactiveOutgame; - static ColorRGBA ms_ColorTabbarActiveOutgame; - static ColorRGBA ms_ColorTabbarHoverOutgame; - static ColorRGBA ms_ColorTabbarInactiveIngame; - static ColorRGBA ms_ColorTabbarActiveIngame; - static ColorRGBA ms_ColorTabbarHoverIngame; - static ColorRGBA ms_ColorTabbarInactive; - static ColorRGBA ms_ColorTabbarActive; - static ColorRGBA ms_ColorTabbarHover; - - int DoButton_FontIcon(CButtonContainer *pButtonContainer, const char *pText, int Checked, const CUIRect *pRect, int Corners = IGraphics::CORNER_ALL, bool Enabled = true); - int DoButton_Toggle(const void *pId, int Checked, const CUIRect *pRect, bool Active); - int DoButton_Menu(CButtonContainer *pButtonContainer, const char *pText, int Checked, const CUIRect *pRect, const char *pImageName = nullptr, int Corners = IGraphics::CORNER_ALL, float Rounding = 5.0f, float FontFactor = 0.0f, ColorRGBA Color = ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f)); - int DoButton_MenuTab(CButtonContainer *pButtonContainer, const char *pText, int Checked, const CUIRect *pRect, int Corners, SUIAnimator *pAnimator = nullptr, const ColorRGBA *pDefaultColor = nullptr, const ColorRGBA *pActiveColor = nullptr, const ColorRGBA *pHoverColor = nullptr, float EdgeRounding = 10.0f, const SCommunityIcon *pCommunityIcon = nullptr); - - int DoButton_CheckBox_Common(const void *pId, const char *pText, const char *pBoxText, const CUIRect *pRect); - int DoButton_CheckBox(const void *pId, const char *pText, int Checked, const CUIRect *pRect); - int DoButton_CheckBoxAutoVMarginAndSet(const void *pId, const char *pText, int *pValue, CUIRect *pRect, float VMargin); - int DoButton_CheckBox_Number(const void *pId, const char *pText, int Checked, const CUIRect *pRect); - - ColorHSLA DoLine_ColorPicker(CButtonContainer *pResetId, float LineSize, float LabelSize, float BottomMargin, CUIRect *pMainRect, const char *pText, unsigned int *pColorValue, ColorRGBA DefaultColor, bool CheckBoxSpacing = true, int *pCheckBoxValue = nullptr, bool Alpha = false); - ColorHSLA DoButton_ColorPicker(const CUIRect *pRect, unsigned int *pHslaColor, bool Alpha); - void DoLaserPreview(const CUIRect *pRect, ColorHSLA OutlineColor, ColorHSLA InnerColor, const int LaserType); - int DoButton_GridHeader(const void *pId, const char *pText, int Checked, const CUIRect *pRect); - int DoButton_Favorite(const void *pButtonId, const void *pParentId, bool Checked, const CUIRect *pRect); - - int DoKeyReader(const void *pId, const CUIRect *pRect, int Key, int ModifierCombination, int *pNewModifierCombination); - - void DoSettingsControlsButtons(int Start, int Stop, CUIRect View); - - float RenderSettingsControlsJoystick(CUIRect View); - void DoJoystickAxisPicker(CUIRect View); - void DoJoystickBar(const CUIRect *pRect, float Current, float Tolerance, bool Active); - - std::optional m_SkinListLastRefreshTime; - bool m_SkinListScrollToSelected = false; - std::optional m_SkinList7LastRefreshTime; - std::optional m_SkinPartsList7LastRefreshTime; - - int m_DirectionQuadContainerIndex; - - // menus_settings_assets.cpp -public: - struct SCustomItem - { - IGraphics::CTextureHandle m_RenderTexture; - - char m_aName[50]; - - bool operator<(const SCustomItem &Other) const { return str_comp(m_aName, Other.m_aName) < 0; } - }; - - struct SCustomEntities : public SCustomItem - { - struct SEntitiesImage - { - IGraphics::CTextureHandle m_Texture; - }; - SEntitiesImage m_aImages[MAP_IMAGE_MOD_TYPE_COUNT]; - }; - - struct SCustomGame : public SCustomItem - { - }; - - struct SCustomEmoticon : public SCustomItem - { - }; - - struct SCustomParticle : public SCustomItem - { - }; - - struct SCustomHud : public SCustomItem - { - }; - - struct SCustomExtras : public SCustomItem - { - }; - -protected: - std::vector m_vEntitiesList; - std::vector m_vGameList; - std::vector m_vEmoticonList; - std::vector m_vParticlesList; - std::vector m_vHudList; - std::vector m_vExtrasList; - - bool m_IsInit = false; - - static void LoadEntities(struct SCustomEntities *pEntitiesItem, void *pUser); - static int EntitiesScan(const char *pName, int IsDir, int DirType, void *pUser); - - static int GameScan(const char *pName, int IsDir, int DirType, void *pUser); - static int EmoticonsScan(const char *pName, int IsDir, int DirType, void *pUser); - static int ParticlesScan(const char *pName, int IsDir, int DirType, void *pUser); - static int HudScan(const char *pName, int IsDir, int DirType, void *pUser); - static int ExtrasScan(const char *pName, int IsDir, int DirType, void *pUser); - - static void ConchainAssetsEntities(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainAssetGame(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainAssetParticles(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainAssetEmoticons(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainAssetHud(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainAssetExtras(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - - void ClearCustomItems(int CurTab); - - int m_MenuPage; - int m_GamePage; - int m_Popup; - bool m_ShowStart; - bool m_MenuActive; - - bool m_JoinTutorial = false; - bool m_CreateDefaultFavoriteCommunities = false; - bool m_ForceRefreshLanPage = false; - - char m_aNextServer[256]; - - // images - struct CMenuImage - { - char m_aName[64]; - IGraphics::CTextureHandle m_OrgTexture; - IGraphics::CTextureHandle m_GreyTexture; - }; - std::vector m_vMenuImages; - static int MenuImageScan(const char *pName, int IsDir, int DirType, void *pUser); - const CMenuImage *FindMenuImage(const char *pName); - - // loading - class CLoadingState - { - public: - std::chrono::nanoseconds m_LastRender{0}; - int m_Current; - int m_Total; - }; - CLoadingState m_LoadingState; - - // - char m_aMessageTopic[512]; - char m_aMessageBody[512]; - char m_aMessageButton[512]; - - CUIElement m_RefreshButton; - CUIElement m_ConnectButton; - - // generic popups - typedef void (CMenus::*FPopupButtonCallback)(); - void DefaultButtonCallback() - { - // do nothing - } - enum - { - BUTTON_CONFIRM = 0, // confirm / yes / close / ok - BUTTON_CANCEL, // cancel / no - NUM_BUTTONS - }; - char m_aPopupTitle[128]; - char m_aPopupMessage[IO_MAX_PATH_LENGTH + 256]; - struct - { - char m_aLabel[64]; - int m_NextPopup; - FPopupButtonCallback m_pfnCallback; - } m_aPopupButtons[NUM_BUTTONS]; - - void PopupMessage(const char *pTitle, const char *pMessage, - const char *pButtonLabel, int NextPopup = POPUP_NONE, FPopupButtonCallback pfnButtonCallback = &CMenus::DefaultButtonCallback); - void PopupConfirm(const char *pTitle, const char *pMessage, - const char *pConfirmButtonLabel, const char *pCancelButtonLabel, - FPopupButtonCallback pfnConfirmButtonCallback = &CMenus::DefaultButtonCallback, int ConfirmNextPopup = POPUP_NONE, - FPopupButtonCallback pfnCancelButtonCallback = &CMenus::DefaultButtonCallback, int CancelNextPopup = POPUP_NONE); - - // some settings - static float ms_ButtonHeight; - static float ms_ListheaderHeight; - static float ms_ListitemAdditionalHeight; - - // for settings - bool m_NeedRestartGraphics; - bool m_NeedRestartSound; - bool m_NeedRestartUpdate; - bool m_NeedSendinfo; - bool m_NeedSendDummyinfo; - int m_SettingPlayerPage; - - // 0.7 skins - bool m_CustomSkinMenu = false; - int m_TeePartSelected = protocol7::SKINPART_BODY; - const CSkins7::CSkin *m_pSelectedSkin = nullptr; - CLineInputBuffered m_SkinNameInput; - bool m_SkinPartListNeedsUpdate = false; - void PopupConfirmDeleteSkin7(); - - // for map download popup - int64_t m_DownloadLastCheckTime; - int m_DownloadLastCheckSize; - float m_DownloadSpeed; - - // for password popup - CLineInput m_PasswordInput; - - // for call vote - int m_CallvoteSelectedOption; - int m_CallvoteSelectedPlayer; - CLineInputBuffered m_CallvoteReasonInput; - CLineInputBuffered<64> m_FilterInput; - bool m_ControlPageOpening; - - // demo - enum - { - SORT_DEMONAME = 0, - SORT_LENGTH, - SORT_DATE, - }; - - struct CDemoItem - { - char m_aFilename[IO_MAX_PATH_LENGTH]; - char m_aName[IO_MAX_PATH_LENGTH]; - bool m_IsDir; - bool m_IsLink; - int m_StorageType; - time_t m_Date; - - bool m_InfosLoaded; - bool m_Valid; - CDemoHeader m_Info; - CTimelineMarkers m_TimelineMarkers; - CMapInfo m_MapInfo; - - int NumMarkers() const - { - return clamp(bytes_be_to_uint(m_TimelineMarkers.m_aNumTimelineMarkers), 0, MAX_TIMELINE_MARKERS); - } - - int Length() const - { - return bytes_be_to_uint(m_Info.m_aLength); - } - - unsigned Size() const - { - return bytes_be_to_uint(m_Info.m_aMapSize); - } - - bool operator<(const CDemoItem &Other) const - { - if(!str_comp(m_aFilename, "..")) - return true; - if(!str_comp(Other.m_aFilename, "..")) - return false; - if(m_IsDir && !Other.m_IsDir) - return true; - if(!m_IsDir && Other.m_IsDir) - return false; - - const CDemoItem &Left = g_Config.m_BrDemoSortOrder ? Other : *this; - const CDemoItem &Right = g_Config.m_BrDemoSortOrder ? *this : Other; - - if(g_Config.m_BrDemoSort == SORT_DEMONAME) - return str_comp_filenames(Left.m_aFilename, Right.m_aFilename) < 0; - if(g_Config.m_BrDemoSort == SORT_DATE) - return Left.m_Date < Right.m_Date; - - if(!Other.m_InfosLoaded) - return m_InfosLoaded; - if(!m_InfosLoaded) - return !Other.m_InfosLoaded; - - if(g_Config.m_BrDemoSort == SORT_LENGTH) - return Left.Length() < Right.Length(); - - // Unknown sort - return true; - } - }; - - char m_aCurrentDemoFolder[IO_MAX_PATH_LENGTH]; - char m_aCurrentDemoSelectionName[IO_MAX_PATH_LENGTH]; - CLineInputBuffered m_DemoRenameInput; - CLineInputBuffered m_DemoSliceInput; - CLineInputBuffered m_DemoSearchInput; -#if defined(CONF_VIDEORECORDER) - CLineInputBuffered m_DemoRenderInput; -#endif - int m_DemolistSelectedIndex; - bool m_DemolistSelectedReveal = false; - int m_DemolistStorageType; - bool m_DemolistMultipleStorages = false; - int m_Speed = 4; - bool m_StartPaused = false; - - std::chrono::nanoseconds m_DemoPopulateStartTime{0}; - - void DemolistOnUpdate(bool Reset); - static int DemolistFetchCallback(const CFsFileInfo *pInfo, int IsDir, int StorageType, void *pUser); - - // friends - class CFriendItem - { - char m_aName[MAX_NAME_LENGTH]; - char m_aClan[MAX_CLAN_LENGTH]; - const CServerInfo *m_pServerInfo; - int m_FriendState; - bool m_IsPlayer; - bool m_IsAfk; - // skin - char m_aSkin[MAX_SKIN_LENGTH]; - bool m_CustomSkinColors; - int m_CustomSkinColorBody; - int m_CustomSkinColorFeet; - - public: - CFriendItem() {} - CFriendItem(const CFriendInfo *pFriendInfo) : - m_pServerInfo(nullptr), - m_IsPlayer(false), - m_IsAfk(false), - m_CustomSkinColors(false), - m_CustomSkinColorBody(0), - m_CustomSkinColorFeet(0) - { - str_copy(m_aName, pFriendInfo->m_aName); - str_copy(m_aClan, pFriendInfo->m_aClan); - m_FriendState = m_aName[0] == '\0' ? IFriends::FRIEND_CLAN : IFriends::FRIEND_PLAYER; - m_aSkin[0] = '\0'; - } - CFriendItem(const CServerInfo::CClient &CurrentClient, const CServerInfo *pServerInfo) : - m_pServerInfo(pServerInfo), - m_FriendState(CurrentClient.m_FriendState), - m_IsPlayer(CurrentClient.m_Player), - m_IsAfk(CurrentClient.m_Afk), - m_CustomSkinColors(CurrentClient.m_CustomSkinColors), - m_CustomSkinColorBody(CurrentClient.m_CustomSkinColorBody), - m_CustomSkinColorFeet(CurrentClient.m_CustomSkinColorFeet) - { - str_copy(m_aName, CurrentClient.m_aName); - str_copy(m_aClan, CurrentClient.m_aClan); - str_copy(m_aSkin, CurrentClient.m_aSkin); - } - - const char *Name() const { return m_aName; } - const char *Clan() const { return m_aClan; } - const CServerInfo *ServerInfo() const { return m_pServerInfo; } - int FriendState() const { return m_FriendState; } - bool IsPlayer() const { return m_IsPlayer; } - bool IsAfk() const { return m_IsAfk; } - const char *Skin() const { return m_aSkin; } - bool CustomSkinColors() const { return m_CustomSkinColors; } - int CustomSkinColorBody() const { return m_CustomSkinColorBody; } - int CustomSkinColorFeet() const { return m_CustomSkinColorFeet; } - - const void *ListItemId() const { return &m_aName; } - const void *RemoveButtonId() const { return &m_FriendState; } - const void *CommunityTooltipId() const { return &m_IsPlayer; } - const void *SkinTooltipId() const { return &m_aSkin; } - - bool operator<(const CFriendItem &Other) const - { - const int Result = str_comp_nocase(m_aName, Other.m_aName); - return Result < 0 || (Result == 0 && str_comp_nocase(m_aClan, Other.m_aClan) < 0); - } - }; - - enum - { - FRIEND_PLAYER_ON = 0, - FRIEND_CLAN_ON, - FRIEND_OFF, - NUM_FRIEND_TYPES - }; - std::vector m_avFriends[NUM_FRIEND_TYPES]; - const CFriendItem *m_pRemoveFriend = nullptr; - - // found in menus.cpp - void Render(); - void RenderPopupFullscreen(CUIRect Screen); - void RenderPopupConnecting(CUIRect Screen); - void RenderPopupLoading(CUIRect Screen); -#if defined(CONF_VIDEORECORDER) - void PopupConfirmDemoReplaceVideo(); -#endif - void RenderMenubar(CUIRect Box, IClient::EClientState ClientState); - void RenderNews(CUIRect MainView); - static void ConchainBackgroundEntities(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainUpdateMusicState(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - void UpdateMusicState(); - - // found in menus_demo.cpp - vec2 m_DemoControlsPositionOffset = vec2(0.0f, 0.0f); - float m_LastPauseChange = -1.0f; - float m_LastSpeedChange = -1.0f; - static bool DemoFilterChat(const void *pData, int Size, void *pUser); - bool FetchHeader(CDemoItem &Item); - void FetchAllHeaders(); - void HandleDemoSeeking(float PositionToSeek, float TimeToSeek); - void RenderDemoPlayer(CUIRect MainView); - void RenderDemoPlayerSliceSavePopup(CUIRect MainView); - bool m_DemoBrowserListInitialized = false; - void RenderDemoBrowser(CUIRect MainView); - void RenderDemoBrowserList(CUIRect ListView, bool &WasListboxItemActivated); - void RenderDemoBrowserDetails(CUIRect DetailsView); - void RenderDemoBrowserButtons(CUIRect ButtonsView, bool WasListboxItemActivated); - void PopupConfirmDeleteDemo(); - void PopupConfirmDeleteFolder(); - - // found in menus_start.cpp - void RenderStartMenu(CUIRect MainView); - - // found in menus_ingame.cpp - STextContainerIndex m_MotdTextContainerIndex; - void RenderGame(CUIRect MainView); - void RenderTouchControlsEditor(CUIRect MainView); - void PopupConfirmDisconnect(); - void PopupConfirmDisconnectDummy(); - void PopupConfirmDiscardTouchControlsChanges(); - void PopupConfirmResetTouchControls(); - void PopupConfirmImportTouchControlsClipboard(); - void RenderPlayers(CUIRect MainView); - void RenderServerInfo(CUIRect MainView); - void RenderServerInfoMotd(CUIRect Motd); - void RenderServerControl(CUIRect MainView); - bool RenderServerControlKick(CUIRect MainView, bool FilterSpectators); - bool RenderServerControlServer(CUIRect MainView); - void RenderIngameHint(); - - // found in menus_browser.cpp - int m_SelectedIndex; - bool m_ServerBrowserShouldRevealSelection; - std::vector m_avpServerBrowserUiElements[IServerBrowser::NUM_TYPES]; - void RenderServerbrowserServerList(CUIRect View, bool &WasListboxItemActivated); - void RenderServerbrowserStatusBox(CUIRect StatusBox, bool WasListboxItemActivated); - void Connect(const char *pAddress); - void PopupConfirmSwitchServer(); - void RenderServerbrowserFilters(CUIRect View); - void ResetServerbrowserFilters(); - void RenderServerbrowserDDNetFilter(CUIRect View, - IFilterList &Filter, - float ItemHeight, int MaxItems, int ItemsPerRow, - CScrollRegion &ScrollRegion, std::vector &vItemIds, - bool UpdateCommunityCacheOnChange, - const std::function &GetItemName, - const std::function &RenderItem); - void RenderServerbrowserCommunitiesFilter(CUIRect View); - void RenderServerbrowserCountriesFilter(CUIRect View); - void RenderServerbrowserTypesFilter(CUIRect View); - struct SPopupCountrySelectionContext - { - CMenus *m_pMenus; - int m_Selection; - bool m_New; - }; - static CUi::EPopupMenuFunctionResult PopupCountrySelection(void *pContext, CUIRect View, bool Active); - void RenderServerbrowserInfo(CUIRect View); - void RenderServerbrowserInfoScoreboard(CUIRect View, const CServerInfo *pSelectedServer); - void RenderServerbrowserFriends(CUIRect View); - void FriendlistOnUpdate(); - void PopupConfirmRemoveFriend(); - void RenderServerbrowserTabBar(CUIRect TabBar); - void RenderServerbrowserToolBox(CUIRect ToolBox); - void RenderServerbrowser(CUIRect MainView); - template - bool PrintHighlighted(const char *pName, F &&PrintFn); - CTeeRenderInfo GetTeeRenderInfo(vec2 Size, const char *pSkinName, bool CustomSkinColors, int CustomSkinColorBody, int CustomSkinColorFeet) const; - static void ConchainFriendlistUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainFavoritesUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainCommunitiesUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainUiPageUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - void UpdateCommunityCache(bool Force); - - // community icons - class CAbstractCommunityIconJob - { - protected: - CMenus *m_pMenus; - char m_aCommunityId[CServerInfo::MAX_COMMUNITY_ID_LENGTH]; - char m_aPath[IO_MAX_PATH_LENGTH]; - int m_StorageType; - bool m_Success = false; - SHA256_DIGEST m_Sha256; - - CAbstractCommunityIconJob(CMenus *pMenus, const char *pCommunityId, int StorageType); - virtual ~CAbstractCommunityIconJob(){}; - - public: - const char *CommunityId() const { return m_aCommunityId; } - bool Success() const { return m_Success; } - const SHA256_DIGEST &Sha256() const { return m_Sha256; } - }; - - class CCommunityIconLoadJob : public IJob, public CAbstractCommunityIconJob - { - CImageInfo m_ImageInfo; - - protected: - void Run() override; - - public: - CCommunityIconLoadJob(CMenus *pMenus, const char *pCommunityId, int StorageType); - ~CCommunityIconLoadJob(); - - CImageInfo &ImageInfo() { return m_ImageInfo; } - }; - - class CCommunityIconDownloadJob : public CHttpRequest, public CAbstractCommunityIconJob - { - public: - CCommunityIconDownloadJob(CMenus *pMenus, const char *pCommunityId, const char *pUrl, const SHA256_DIGEST &Sha256); - }; - - std::vector m_vCommunityIcons; - std::deque> m_CommunityIconLoadJobs; - std::deque> m_CommunityIconDownloadJobs; - SHA256_DIGEST m_CommunityIconsInfoSha256 = SHA256_ZEROED; - static int CommunityIconScan(const char *pName, int IsDir, int DirType, void *pUser); - const SCommunityIcon *FindCommunityIcon(const char *pCommunityId); - bool LoadCommunityIconFile(const char *pPath, int DirType, CImageInfo &Info, SHA256_DIGEST &Sha256); - void LoadCommunityIconFinish(const char *pCommunityId, CImageInfo &Info, const SHA256_DIGEST &Sha256); - void RenderCommunityIcon(const SCommunityIcon *pIcon, CUIRect Rect, bool Active); - void UpdateCommunityIcons(); - - // skin favorite list - std::unordered_set m_SkinFavorites; - static void Con_AddFavoriteSkin(IConsole::IResult *pResult, void *pUserData); - static void Con_RemFavoriteSkin(IConsole::IResult *pResult, void *pUserData); - static void ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData); - void OnConfigSave(IConfigManager *pConfigManager); - - // found in menus_settings.cpp - bool RenderLanguageSelection(CUIRect MainView); - void RenderThemeSelection(CUIRect MainView); - void RenderSettingsGeneral(CUIRect MainView); - void RenderSettingsPlayer(CUIRect MainView); - void RenderSettingsDummyPlayer(CUIRect MainView); - void RenderSettingsTee(CUIRect MainView); - void RenderSettingsTee7(CUIRect MainView); - void RenderSettingsTeeCustom7(CUIRect MainView); - void RenderSkinSelection7(CUIRect MainView); - void RenderSkinPartSelection7(CUIRect MainView); - void RenderSettingsControls(CUIRect MainView); - void ResetSettingsControls(); - void RenderSettingsGraphics(CUIRect MainView); - void RenderSettingsSound(CUIRect MainView); - void RenderSettings(CUIRect MainView); - void RenderSettingsCustom(CUIRect MainView); - - class CMapListItem - { - public: - char m_aFilename[IO_MAX_PATH_LENGTH]; - bool m_IsDirectory; - }; - class CPopupMapPickerContext - { - public: - std::vector m_vMaps; - char m_aCurrentMapFolder[IO_MAX_PATH_LENGTH] = ""; - static int MapListFetchCallback(const CFsFileInfo *pInfo, int IsDir, int StorageType, void *pUser); - void MapListPopulate(); - CMenus *m_pMenus; - int m_Selection; - }; - - static bool CompareFilenameAscending(const CMapListItem Lhs, const CMapListItem Rhs) - { - if(str_comp(Lhs.m_aFilename, "..") == 0) - return true; - if(str_comp(Rhs.m_aFilename, "..") == 0) - return false; - if(Lhs.m_IsDirectory != Rhs.m_IsDirectory) - return Lhs.m_IsDirectory; - return str_comp_filenames(Lhs.m_aFilename, Rhs.m_aFilename) < 0; - } - - static CUi::EPopupMenuFunctionResult PopupMapPicker(void *pContext, CUIRect View, bool Active); - - void SetNeedSendInfo(); - void UpdateColors(); - - IGraphics::CTextureHandle m_TextureBlob; - - bool CheckHotKey(int Key) const; - -public: - void RenderBackground(); - - static CMenusKeyBinder m_Binder; - - CMenus(); - virtual int Sizeof() const override { return sizeof(*this); } - - void RenderLoading(const char *pCaption, const char *pContent, int IncreaseCounter); - void FinishLoading(); - - bool IsInit() { return m_IsInit; } - - bool IsActive() const { return m_MenuActive; } - void SetActive(bool Active); - - void RunServer(); - void KillServer(); - bool IsServerRunning() const; - - virtual void OnInit() override; - void OnConsoleInit() override; - - virtual void OnStateChange(int NewState, int OldState) override; - virtual void OnWindowResize() override; - virtual void OnReset() override; - virtual void OnRender() override; - virtual bool OnInput(const IInput::CEvent &Event) override; - virtual bool OnCursorMove(float x, float y, IInput::ECursorType CursorType) override; - virtual void OnShutdown() override; - - enum - { - PAGE_NEWS = 1, - PAGE_GAME, - PAGE_PLAYERS, - PAGE_SERVER_INFO, - PAGE_CALLVOTE, - PAGE_INTERNET, - PAGE_LAN, - PAGE_FAVORITES, - PAGE_FAVORITE_COMMUNITY_1, - PAGE_FAVORITE_COMMUNITY_2, - PAGE_FAVORITE_COMMUNITY_3, - PAGE_FAVORITE_COMMUNITY_4, - PAGE_FAVORITE_COMMUNITY_5, - PAGE_DEMOS, - PAGE_SETTINGS, - PAGE_NETWORK, - PAGE_GHOST, - - PAGE_LENGTH, - - SETTINGS_LANGUAGE = 0, - SETTINGS_GENERAL, - SETTINGS_PLAYER, - SETTINGS_TEE, - SETTINGS_APPEARANCE, - SETTINGS_CONTROLS, - SETTINGS_GRAPHICS, - SETTINGS_SOUND, - SETTINGS_DDNET, - SETTINGS_ASSETS, - - SETTINGS_LENGTH, - - BIG_TAB_NEWS = 0, - BIG_TAB_INTERNET, - BIG_TAB_LAN, - BIG_TAB_FAVORITES, - BIT_TAB_FAVORITE_COMMUNITY_1, - BIT_TAB_FAVORITE_COMMUNITY_2, - BIT_TAB_FAVORITE_COMMUNITY_3, - BIT_TAB_FAVORITE_COMMUNITY_4, - BIT_TAB_FAVORITE_COMMUNITY_5, - BIG_TAB_DEMOS, - - BIG_TAB_LENGTH, - - SMALL_TAB_HOME = 0, - SMALL_TAB_QUIT, - SMALL_TAB_SETTINGS, - SMALL_TAB_EDITOR, - SMALL_TAB_DEMOBUTTON, - SMALL_TAB_SERVER, - SMALL_TAB_BROWSER_FILTER, - SMALL_TAB_BROWSER_INFO, - SMALL_TAB_BROWSER_FRIENDS, - - SMALL_TAB_LENGTH, - }; - - SUIAnimator m_aAnimatorsBigPage[BIG_TAB_LENGTH]; - SUIAnimator m_aAnimatorsSmallPage[SMALL_TAB_LENGTH]; - SUIAnimator m_aAnimatorsSettingsTab[SETTINGS_LENGTH]; - - // DDRace - int DoButton_CheckBox_Tristate(const void *pId, const char *pText, TRISTATE Checked, const CUIRect *pRect); - std::vector m_vDemos; - std::vector m_vpFilteredDemos; - void DemolistPopulate(); - void RefreshFilteredDemos(); - void DemoSeekTick(IDemoPlayer::ETickOffset TickOffset); - bool m_Dummy; - - const char *GetCurrentDemoFolder() const { return m_aCurrentDemoFolder; } - - // Ghost - struct CGhostItem - { - char m_aFilename[IO_MAX_PATH_LENGTH]; - char m_aPlayer[MAX_NAME_LENGTH]; - - bool m_Failed; - int m_Time; - int m_Slot; - bool m_Own; - time_t m_Date; - - CGhostItem() : - m_Slot(-1), m_Own(false) { m_aFilename[0] = 0; } - - bool operator<(const CGhostItem &Other) const { return m_Time < Other.m_Time; } - - bool Active() const { return m_Slot != -1; } - bool HasFile() const { return m_aFilename[0]; } - }; - - enum - { - GHOST_SORT_NONE = -1, - GHOST_SORT_NAME, - GHOST_SORT_TIME, - GHOST_SORT_DATE, - }; - - std::vector m_vGhosts; - - std::chrono::nanoseconds m_GhostPopulateStartTime{0}; - - void GhostlistPopulate(); - CGhostItem *GetOwnGhost(); - void UpdateOwnGhost(CGhostItem Item); - void DeleteGhostItem(int Index); - void SortGhostlist(); - - bool CanDisplayWarning() const; - - void PopupWarning(const char *pTopic, const char *pBody, const char *pButton, std::chrono::nanoseconds Duration); - - std::chrono::nanoseconds m_PopupWarningLastTime; - std::chrono::nanoseconds m_PopupWarningDuration; - - int m_DemoPlayerState; - - enum - { - POPUP_NONE = 0, - POPUP_MESSAGE, // generic message popup (one button) - POPUP_CONFIRM, // generic confirmation popup (two buttons) - POPUP_FIRST_LAUNCH, - POPUP_POINTS, - POPUP_DISCONNECTED, - POPUP_LANGUAGE, - POPUP_RENAME_DEMO, - POPUP_RENDER_DEMO, - POPUP_RENDER_DONE, - POPUP_PASSWORD, - POPUP_QUIT, - POPUP_RESTART, - POPUP_WARNING, - POPUP_SAVE_SKIN, - - // demo player states - DEMOPLAYER_NONE = 0, - DEMOPLAYER_SLICE_SAVE, - }; - -private: - static int GhostlistFetchCallback(const CFsFileInfo *pInfo, int IsDir, int StorageType, void *pUser); - void SetMenuPage(int NewPage); - void RefreshBrowserTab(bool Force); - - // found in menus_ingame.cpp - void RenderInGameNetwork(CUIRect MainView); - void RenderGhost(CUIRect MainView); - - // found in menus_settings.cpp - void RenderSettingsDDNet(CUIRect MainView); - void RenderSettingsAppearance(CUIRect MainView); - bool RenderHslaScrollbars(CUIRect *pRect, unsigned int *pColor, bool Alpha, float DarkestLight); - - CServerProcess m_ServerProcess; -}; -#endif diff --git a/src/game/client/components/menus_browser.cpp b/src/game/client/components/menus_browser.cpp deleted file mode 100644 index 7ddf846b5c..0000000000 --- a/src/game/client/components/menus_browser.cpp +++ /dev/null @@ -1,2121 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "menus.h" - -using namespace FontIcons; - -static const ColorRGBA gs_HighlightedTextColor = ColorRGBA(0.4f, 0.4f, 1.0f, 1.0f); - -static ColorRGBA PlayerBackgroundColor(bool Friend, bool Clan, bool Afk, bool Inside) -{ - static const ColorRGBA COLORS[] = {ColorRGBA(0.5f, 1.0f, 0.5f), ColorRGBA(0.4f, 0.4f, 1.0f), ColorRGBA(0.75f, 0.75f, 0.75f)}; - static const ColorRGBA COLORS_AFK[] = {ColorRGBA(1.0f, 1.0f, 0.5f), ColorRGBA(0.4f, 0.75f, 1.0f), ColorRGBA(0.6f, 0.6f, 0.6f)}; - int i; - if(Friend) - i = 0; - else if(Clan) - i = 1; - else - i = 2; - return (Afk ? COLORS_AFK[i] : COLORS[i]).WithAlpha(Inside ? 0.45f : 0.3f); -} - -template -static void FormatServerbrowserPing(char (&aBuffer)[N], const CServerInfo *pInfo) -{ - if(!pInfo->m_LatencyIsEstimated) - { - str_format(aBuffer, sizeof(aBuffer), "%d", pInfo->m_Latency); - return; - } - static const char *const LOCATION_NAMES[CServerInfo::NUM_LOCS] = { - "", // LOC_UNKNOWN - Localizable("AFR"), // LOC_AFRICA - Localizable("ASI"), // LOC_ASIA - Localizable("AUS"), // LOC_AUSTRALIA - Localizable("EUR"), // LOC_EUROPE - Localizable("NA"), // LOC_NORTH_AMERICA - Localizable("SA"), // LOC_SOUTH_AMERICA - Localizable("CHN"), // LOC_CHINA - }; - dbg_assert(0 <= pInfo->m_Location && pInfo->m_Location < CServerInfo::NUM_LOCS, "location out of range"); - str_copy(aBuffer, Localize(LOCATION_NAMES[pInfo->m_Location])); -} - -static ColorRGBA GetPingTextColor(int Latency) -{ - return color_cast(ColorHSLA((300.0f - clamp(Latency, 0, 300)) / 1000.0f, 1.0f, 0.5f)); -} - -static ColorRGBA GetGametypeTextColor(const char *pGametype) -{ - ColorHSLA HslaColor; - if(str_comp(pGametype, "DM") == 0 || str_comp(pGametype, "TDM") == 0 || str_comp(pGametype, "CTF") == 0 || str_comp(pGametype, "LMS") == 0 || str_comp(pGametype, "LTS") == 0) - HslaColor = ColorHSLA(0.33f, 1.0f, 0.75f); - else if(str_find_nocase(pGametype, "catch")) - HslaColor = ColorHSLA(0.17f, 1.0f, 0.75f); - else if(str_find_nocase(pGametype, "dm") || str_find_nocase(pGametype, "tdm") || str_find_nocase(pGametype, "ctf") || str_find_nocase(pGametype, "lms") || str_find_nocase(pGametype, "lts")) - { - if(pGametype[0] == 'i' || pGametype[0] == 'g') - HslaColor = ColorHSLA(0.0f, 1.0f, 0.75f); - else - HslaColor = ColorHSLA(0.40f, 1.0f, 0.75f); - } - else if(str_find_nocase(pGametype, "f-ddrace") || str_find_nocase(pGametype, "freeze")) - HslaColor = ColorHSLA(0.0f, 1.0f, 0.75f); - else if(str_find_nocase(pGametype, "fng")) - HslaColor = ColorHSLA(0.83f, 1.0f, 0.75f); - else if(str_find_nocase(pGametype, "gores")) - HslaColor = ColorHSLA(0.525f, 1.0f, 0.75f); - else if(str_find_nocase(pGametype, "BW")) - HslaColor = ColorHSLA(0.05f, 1.0f, 0.75f); - else if(str_find_nocase(pGametype, "ddracenet") || str_find_nocase(pGametype, "ddnet") || str_find_nocase(pGametype, "0xf")) - HslaColor = ColorHSLA(0.58f, 1.0f, 0.75f); - else if(str_find_nocase(pGametype, "ddrace") || str_find_nocase(pGametype, "mkrace")) - HslaColor = ColorHSLA(0.75f, 1.0f, 0.75f); - else if(str_find_nocase(pGametype, "race") || str_find_nocase(pGametype, "fastcap")) - HslaColor = ColorHSLA(0.46f, 1.0f, 0.75f); - else if(str_find_nocase(pGametype, "s-ddr")) - HslaColor = ColorHSLA(1.0f, 1.0f, 0.7f); - else - HslaColor = ColorHSLA(1.0f, 1.0f, 1.0f); - return color_cast(HslaColor); -} - -void CMenus::RenderServerbrowserServerList(CUIRect View, bool &WasListboxItemActivated) -{ - static CListBox s_ListBox; - - CUIRect Headers; - View.HSplitTop(ms_ListheaderHeight, &Headers, &View); - Headers.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_T, 5.0f); - Headers.VSplitRight(s_ListBox.ScrollbarWidthMax(), &Headers, nullptr); - View.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.15f), IGraphics::CORNER_NONE, 0.0f); - - struct SColumn - { - int m_Id; - int m_Sort; - const char *m_pCaption; - int m_Direction; - float m_Width; - CUIRect m_Rect; - }; - - enum - { - COL_FLAG_LOCK = 0, - COL_FLAG_FAV, - COL_COMMUNITY, - COL_NAME, - COL_GAMETYPE, - COL_MAP, - COL_FRIENDS, - COL_PLAYERS, - COL_PING, - - UI_ELEM_LOCK_ICON = 0, - UI_ELEM_FAVORITE_ICON, - UI_ELEM_NAME_1, - UI_ELEM_NAME_2, - UI_ELEM_NAME_3, - UI_ELEM_GAMETYPE, - UI_ELEM_MAP_1, - UI_ELEM_MAP_2, - UI_ELEM_MAP_3, - UI_ELEM_FINISH_ICON, - UI_ELEM_PLAYERS, - UI_ELEM_FRIEND_ICON, - UI_ELEM_PING, - NUM_UI_ELEMS, - }; - - static SColumn s_aCols[] = { - {-1, -1, "", -1, 2.0f, {0}}, - {COL_FLAG_LOCK, -1, "", -1, 14.0f, {0}}, - {COL_FLAG_FAV, -1, "", -1, 14.0f, {0}}, - {COL_COMMUNITY, -1, "", -1, 28.0f, {0}}, - {COL_NAME, IServerBrowser::SORT_NAME, Localizable("Name"), 0, 50.0f, {0}}, - {COL_GAMETYPE, IServerBrowser::SORT_GAMETYPE, Localizable("Type"), 1, 50.0f, {0}}, - {COL_MAP, IServerBrowser::SORT_MAP, Localizable("Map"), 1, 120.0f + (Headers.w - 480) / 8, {0}}, - {COL_FRIENDS, IServerBrowser::SORT_NUMFRIENDS, "", 1, 20.0f, {0}}, - {COL_PLAYERS, IServerBrowser::SORT_NUMPLAYERS, Localizable("Players"), 1, 60.0f, {0}}, - {-1, -1, "", 1, 4.0f, {0}}, - {COL_PING, IServerBrowser::SORT_PING, Localizable("Ping"), 1, 40.0f, {0}}, - }; - - const int NumCols = std::size(s_aCols); - - // do layout - for(int i = 0; i < NumCols; i++) - { - if(s_aCols[i].m_Direction == -1) - { - Headers.VSplitLeft(s_aCols[i].m_Width, &s_aCols[i].m_Rect, &Headers); - - if(i + 1 < NumCols) - { - Headers.VSplitLeft(2.0f, nullptr, &Headers); - } - } - } - - for(int i = NumCols - 1; i >= 0; i--) - { - if(s_aCols[i].m_Direction == 1) - { - Headers.VSplitRight(s_aCols[i].m_Width, &Headers, &s_aCols[i].m_Rect); - Headers.VSplitRight(2.0f, &Headers, nullptr); - } - } - - for(auto &Col : s_aCols) - { - if(Col.m_Direction == 0) - Col.m_Rect = Headers; - } - - const bool PlayersOrPing = (g_Config.m_BrSort == IServerBrowser::SORT_NUMPLAYERS || g_Config.m_BrSort == IServerBrowser::SORT_PING); - - // do headers - for(const auto &Col : s_aCols) - { - int Checked = g_Config.m_BrSort == Col.m_Sort; - if(PlayersOrPing && g_Config.m_BrSortOrder == 2 && (Col.m_Sort == IServerBrowser::SORT_NUMPLAYERS || Col.m_Sort == IServerBrowser::SORT_PING)) - Checked = 2; - - if(DoButton_GridHeader(&Col.m_Id, Localize(Col.m_pCaption), Checked, &Col.m_Rect)) - { - if(Col.m_Sort != -1) - { - if(g_Config.m_BrSort == Col.m_Sort) - g_Config.m_BrSortOrder = (g_Config.m_BrSortOrder + 1) % (PlayersOrPing ? 3 : 2); - else - g_Config.m_BrSortOrder = 0; - g_Config.m_BrSort = Col.m_Sort; - } - } - - if(Col.m_Id == COL_FRIENDS) - { - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - Ui()->DoLabel(&Col.m_Rect, FONT_ICON_HEART, 14.0f, TEXTALIGN_MC); - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - } - } - - const int NumServers = ServerBrowser()->NumSortedServers(); - - // display important messages in the middle of the screen so no - // users misses it - { - if(!ServerBrowser()->NumServers() && ServerBrowser()->IsGettingServerlist()) - { - Ui()->DoLabel(&View, Localize("Getting server list from master server"), 16.0f, TEXTALIGN_MC); - } - else if(!ServerBrowser()->NumServers()) - { - if(ServerBrowser()->GetCurrentType() == IServerBrowser::TYPE_LAN) - { - char aBuf[128]; - str_format(aBuf, sizeof(aBuf), Localize("No local servers found (ports %d-%d)"), IServerBrowser::LAN_PORT_BEGIN, IServerBrowser::LAN_PORT_END); - Ui()->DoLabel(&View, aBuf, 16.0f, TEXTALIGN_MC); - } - else - { - Ui()->DoLabel(&View, Localize("No servers found"), 16.0f, TEXTALIGN_MC); - } - } - else if(ServerBrowser()->NumServers() && !NumServers) - { - CUIRect Label, ResetButton; - View.HMargin((View.h - (16.0f + 18.0f + 8.0f)) / 2.0f, &Label); - Label.HSplitTop(16.0f, &Label, &ResetButton); - ResetButton.HSplitTop(8.0f, nullptr, &ResetButton); - ResetButton.VMargin((ResetButton.w - 200.0f) / 2.0f, &ResetButton); - Ui()->DoLabel(&Label, Localize("No servers match your filter criteria"), 16.0f, TEXTALIGN_MC); - static CButtonContainer s_ResetButton; - if(DoButton_Menu(&s_ResetButton, Localize("Reset filter"), 0, &ResetButton)) - { - ResetServerbrowserFilters(); - } - } - } - - s_ListBox.SetActive(!Ui()->IsPopupOpen()); - s_ListBox.DoStart(ms_ListheaderHeight, NumServers, 1, 3, -1, &View, false); - - if(m_ServerBrowserShouldRevealSelection) - { - s_ListBox.ScrollToSelected(); - m_ServerBrowserShouldRevealSelection = false; - } - m_SelectedIndex = -1; - - const auto &&RenderBrowserIcons = [this](CUIElement::SUIElementRect &UIRect, CUIRect *pRect, const ColorRGBA &TextColor, const ColorRGBA &TextOutlineColor, const char *pText, int TextAlign, bool SmallFont = false) { - const float FontSize = SmallFont ? 6.0f : 14.0f; - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - TextRender()->TextColor(TextColor); - TextRender()->TextOutlineColor(TextOutlineColor); - Ui()->DoLabelStreamed(UIRect, pRect, pText, FontSize, TextAlign); - TextRender()->TextOutlineColor(TextRender()->DefaultTextOutlineColor()); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - }; - - std::vector &vpServerBrowserUiElements = m_avpServerBrowserUiElements[ServerBrowser()->GetCurrentType()]; - if(vpServerBrowserUiElements.size() < (size_t)NumServers) - vpServerBrowserUiElements.resize(NumServers, nullptr); - - for(int i = 0; i < NumServers; i++) - { - const CServerInfo *pItem = ServerBrowser()->SortedGet(i); - const CCommunity *pCommunity = ServerBrowser()->Community(pItem->m_aCommunityId); - - if(vpServerBrowserUiElements[i] == nullptr) - { - vpServerBrowserUiElements[i] = Ui()->GetNewUIElement(NUM_UI_ELEMS); - } - CUIElement *pUiElement = vpServerBrowserUiElements[i]; - - const CListboxItem ListItem = s_ListBox.DoNextItem(pItem, str_comp(pItem->m_aAddress, g_Config.m_UiServerAddress) == 0); - if(ListItem.m_Selected) - m_SelectedIndex = i; - - if(!ListItem.m_Visible) - { - // reset active item, if not visible - if(Ui()->CheckActiveItem(pItem)) - Ui()->SetActiveItem(nullptr); - - // don't render invisible items - continue; - } - - const float FontSize = 12.0f; - char aTemp[64]; - for(const auto &Col : s_aCols) - { - CUIRect Button; - Button.x = Col.m_Rect.x; - Button.y = ListItem.m_Rect.y; - Button.h = ListItem.m_Rect.h; - Button.w = Col.m_Rect.w; - - const int Id = Col.m_Id; - if(Id == COL_FLAG_LOCK) - { - if(pItem->m_Flags & SERVER_FLAG_PASSWORD) - { - RenderBrowserIcons(*pUiElement->Rect(UI_ELEM_LOCK_ICON), &Button, ColorRGBA(0.75f, 0.75f, 0.75f, 1.0f), TextRender()->DefaultTextOutlineColor(), FONT_ICON_LOCK, TEXTALIGN_MC); - } - } - else if(Id == COL_FLAG_FAV) - { - if(pItem->m_Favorite != TRISTATE::NONE) - { - RenderBrowserIcons(*pUiElement->Rect(UI_ELEM_FAVORITE_ICON), &Button, ColorRGBA(1.0f, 0.85f, 0.3f, 1.0f), TextRender()->DefaultTextOutlineColor(), FONT_ICON_STAR, TEXTALIGN_MC); - } - } - else if(Id == COL_COMMUNITY) - { - if(pCommunity != nullptr) - { - const SCommunityIcon *pIcon = FindCommunityIcon(pCommunity->Id()); - if(pIcon != nullptr) - { - CUIRect CommunityIcon; - Button.Margin(2.0f, &CommunityIcon); - RenderCommunityIcon(pIcon, CommunityIcon, true); - Ui()->DoButtonLogic(&pItem->m_aCommunityId, 0, &CommunityIcon); - GameClient()->m_Tooltips.DoToolTip(&pItem->m_aCommunityId, &CommunityIcon, pCommunity->Name()); - } - } - } - else if(Id == COL_NAME) - { - SLabelProperties Props; - Props.m_MaxWidth = Button.w; - Props.m_StopAtEnd = true; - Props.m_EnableWidthCheck = false; - bool Printed = false; - if(g_Config.m_BrFilterString[0] && (pItem->m_QuickSearchHit & IServerBrowser::QUICK_SERVERNAME)) - Printed = PrintHighlighted(pItem->m_aName, [&](const char *pFilteredStr, const int FilterLen) { - Ui()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_NAME_1), &Button, pItem->m_aName, FontSize, TEXTALIGN_ML, Props, (int)(pFilteredStr - pItem->m_aName)); - TextRender()->TextColor(gs_HighlightedTextColor); - Ui()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_NAME_2), &Button, pFilteredStr, FontSize, TEXTALIGN_ML, Props, FilterLen, &pUiElement->Rect(UI_ELEM_NAME_1)->m_Cursor); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - Ui()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_NAME_3), &Button, pFilteredStr + FilterLen, FontSize, TEXTALIGN_ML, Props, -1, &pUiElement->Rect(UI_ELEM_NAME_2)->m_Cursor); - }); - if(!Printed) - Ui()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_NAME_1), &Button, pItem->m_aName, FontSize, TEXTALIGN_ML, Props); - } - else if(Id == COL_GAMETYPE) - { - SLabelProperties Props; - Props.m_MaxWidth = Button.w; - Props.m_StopAtEnd = true; - Props.m_EnableWidthCheck = false; - if(g_Config.m_UiColorizeGametype) - { - TextRender()->TextColor(GetGametypeTextColor(pItem->m_aGameType)); - } - Ui()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_GAMETYPE), &Button, pItem->m_aGameType, FontSize, TEXTALIGN_ML, Props); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - } - else if(Id == COL_MAP) - { - { - CUIRect Icon; - Button.VMargin(4.0f, &Button); - Button.VSplitLeft(Button.h, &Icon, &Button); - if(g_Config.m_BrIndicateFinished && pItem->m_HasRank == CServerInfo::RANK_RANKED) - { - Icon.Margin(2.0f, &Icon); - RenderBrowserIcons(*pUiElement->Rect(UI_ELEM_FINISH_ICON), &Icon, TextRender()->DefaultTextColor(), TextRender()->DefaultTextOutlineColor(), FONT_ICON_FLAG_CHECKERED, TEXTALIGN_MC); - } - } - - SLabelProperties Props; - Props.m_MaxWidth = Button.w; - Props.m_StopAtEnd = true; - Props.m_EnableWidthCheck = false; - bool Printed = false; - if(g_Config.m_BrFilterString[0] && (pItem->m_QuickSearchHit & IServerBrowser::QUICK_MAPNAME)) - Printed = PrintHighlighted(pItem->m_aMap, [&](const char *pFilteredStr, const int FilterLen) { - Ui()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_MAP_1), &Button, pItem->m_aMap, FontSize, TEXTALIGN_ML, Props, (int)(pFilteredStr - pItem->m_aMap)); - TextRender()->TextColor(gs_HighlightedTextColor); - Ui()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_MAP_2), &Button, pFilteredStr, FontSize, TEXTALIGN_ML, Props, FilterLen, &pUiElement->Rect(UI_ELEM_MAP_1)->m_Cursor); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - Ui()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_MAP_3), &Button, pFilteredStr + FilterLen, FontSize, TEXTALIGN_ML, Props, -1, &pUiElement->Rect(UI_ELEM_MAP_2)->m_Cursor); - }); - if(!Printed) - Ui()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_MAP_1), &Button, pItem->m_aMap, FontSize, TEXTALIGN_ML, Props); - } - else if(Id == COL_FRIENDS) - { - if(pItem->m_FriendState != IFriends::FRIEND_NO) - { - RenderBrowserIcons(*pUiElement->Rect(UI_ELEM_FRIEND_ICON), &Button, ColorRGBA(0.94f, 0.4f, 0.4f, 1.0f), TextRender()->DefaultTextOutlineColor(), FONT_ICON_HEART, TEXTALIGN_MC); - - if(pItem->m_FriendNum > 1) - { - str_format(aTemp, sizeof(aTemp), "%d", pItem->m_FriendNum); - TextRender()->TextColor(0.94f, 0.8f, 0.8f, 1.0f); - Ui()->DoLabel(&Button, aTemp, 9.0f, TEXTALIGN_MC); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - } - } - } - else if(Id == COL_PLAYERS) - { - str_format(aTemp, sizeof(aTemp), "%i/%i", pItem->m_NumFilteredPlayers, ServerBrowser()->Max(*pItem)); - if(g_Config.m_BrFilterString[0] && (pItem->m_QuickSearchHit & IServerBrowser::QUICK_PLAYER)) - { - TextRender()->TextColor(gs_HighlightedTextColor); - } - Ui()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_PLAYERS), &Button, aTemp, FontSize, TEXTALIGN_MR); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - } - else if(Id == COL_PING) - { - Button.VMargin(4.0f, &Button); - FormatServerbrowserPing(aTemp, pItem); - if(g_Config.m_UiColorizePing) - { - TextRender()->TextColor(GetPingTextColor(pItem->m_Latency)); - } - Ui()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_PING), &Button, aTemp, FontSize, TEXTALIGN_MR); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - } - } - } - - const int NewSelected = s_ListBox.DoEnd(); - if(NewSelected != m_SelectedIndex) - { - m_SelectedIndex = NewSelected; - if(m_SelectedIndex >= 0) - { - // select the new server - const CServerInfo *pItem = ServerBrowser()->SortedGet(NewSelected); - if(pItem) - { - str_copy(g_Config.m_UiServerAddress, pItem->m_aAddress); - m_ServerBrowserShouldRevealSelection = true; - } - } - } - - WasListboxItemActivated = s_ListBox.WasItemActivated(); -} - -void CMenus::RenderServerbrowserStatusBox(CUIRect StatusBox, bool WasListboxItemActivated) -{ - // Render bar that shows the loading progression. - // The bar is only shown while loading and fades out when it's done. - CUIRect RefreshBar; - StatusBox.HSplitTop(5.0f, &RefreshBar, &StatusBox); - static float s_LoadingProgressionFadeEnd = 0.0f; - if(ServerBrowser()->IsRefreshing() && ServerBrowser()->LoadingProgression() < 100) - { - s_LoadingProgressionFadeEnd = Client()->GlobalTime() + 2.0f; - } - const float LoadingProgressionTimeDiff = s_LoadingProgressionFadeEnd - Client()->GlobalTime(); - if(LoadingProgressionTimeDiff > 0.0f) - { - const float RefreshBarAlpha = minimum(LoadingProgressionTimeDiff, 0.8f); - RefreshBar.h = 2.0f; - RefreshBar.w *= ServerBrowser()->LoadingProgression() / 100.0f; - RefreshBar.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, RefreshBarAlpha), IGraphics::CORNER_NONE, 0.0f); - } - - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - const float SearchExcludeAddrStrMax = 130.0f; - const float SearchIconWidth = TextRender()->TextWidth(16.0f, FONT_ICON_MAGNIFYING_GLASS); - const float ExcludeIconWidth = TextRender()->TextWidth(16.0f, FONT_ICON_BAN); - const float ExcludeSearchIconMax = maximum(SearchIconWidth, ExcludeIconWidth); - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - - CUIRect SearchInfoAndAddr, ServersAndConnect, ServersPlayersOnline, SearchAndInfo, ServerAddr, ConnectButtons; - StatusBox.VSplitRight(135.0f, &SearchInfoAndAddr, &ServersAndConnect); - if(SearchInfoAndAddr.w > 350.0f) - SearchInfoAndAddr.VSplitLeft(350.0f, &SearchInfoAndAddr, nullptr); - SearchInfoAndAddr.HSplitTop(40.0f, &SearchAndInfo, &ServerAddr); - ServersAndConnect.HSplitTop(35.0f, &ServersPlayersOnline, &ConnectButtons); - ConnectButtons.HSplitTop(5.0f, nullptr, &ConnectButtons); - - CUIRect QuickSearch, QuickExclude; - SearchAndInfo.HSplitTop(20.0f, &QuickSearch, &QuickExclude); - QuickSearch.Margin(2.0f, &QuickSearch); - QuickExclude.Margin(2.0f, &QuickExclude); - - // render quick search - { - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - Ui()->DoLabel(&QuickSearch, FONT_ICON_MAGNIFYING_GLASS, 16.0f, TEXTALIGN_ML); - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - QuickSearch.VSplitLeft(ExcludeSearchIconMax, nullptr, &QuickSearch); - QuickSearch.VSplitLeft(5.0f, nullptr, &QuickSearch); - - char aBufSearch[64]; - str_format(aBufSearch, sizeof(aBufSearch), "%s:", Localize("Search")); - Ui()->DoLabel(&QuickSearch, aBufSearch, 14.0f, TEXTALIGN_ML); - QuickSearch.VSplitLeft(SearchExcludeAddrStrMax, nullptr, &QuickSearch); - QuickSearch.VSplitLeft(5.0f, nullptr, &QuickSearch); - - static CLineInput s_FilterInput(g_Config.m_BrFilterString, sizeof(g_Config.m_BrFilterString)); - static char s_aTooltipText[64]; - str_format(s_aTooltipText, sizeof(s_aTooltipText), "%s: \"solo; nameless tee; kobra 2\"", Localize("Example of usage")); - GameClient()->m_Tooltips.DoToolTip(&s_FilterInput, &QuickSearch, s_aTooltipText); - if(!Ui()->IsPopupOpen() && Input()->KeyPress(KEY_F) && Input()->ModifierIsPressed()) - { - Ui()->SetActiveItem(&s_FilterInput); - s_FilterInput.SelectAll(); - } - if(Ui()->DoClearableEditBox(&s_FilterInput, &QuickSearch, 12.0f)) - Client()->ServerBrowserUpdate(); - } - - // render quick exclude - { - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - Ui()->DoLabel(&QuickExclude, FONT_ICON_BAN, 16.0f, TEXTALIGN_ML); - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - QuickExclude.VSplitLeft(ExcludeSearchIconMax, nullptr, &QuickExclude); - QuickExclude.VSplitLeft(5.0f, nullptr, &QuickExclude); - - char aBufExclude[64]; - str_format(aBufExclude, sizeof(aBufExclude), "%s:", Localize("Exclude")); - Ui()->DoLabel(&QuickExclude, aBufExclude, 14.0f, TEXTALIGN_ML); - QuickExclude.VSplitLeft(SearchExcludeAddrStrMax, nullptr, &QuickExclude); - QuickExclude.VSplitLeft(5.0f, nullptr, &QuickExclude); - - static CLineInput s_ExcludeInput(g_Config.m_BrExcludeString, sizeof(g_Config.m_BrExcludeString)); - static char s_aTooltipText[64]; - str_format(s_aTooltipText, sizeof(s_aTooltipText), "%s: \"CHN; [A]\"", Localize("Example of usage")); - GameClient()->m_Tooltips.DoToolTip(&s_ExcludeInput, &QuickSearch, s_aTooltipText); - if(!Ui()->IsPopupOpen() && Input()->KeyPress(KEY_X) && Input()->ShiftIsPressed() && Input()->ModifierIsPressed()) - { - Ui()->SetActiveItem(&s_ExcludeInput); - s_ExcludeInput.SelectAll(); - } - if(Ui()->DoClearableEditBox(&s_ExcludeInput, &QuickExclude, 12.0f)) - Client()->ServerBrowserUpdate(); - } - - // render status - { - CUIRect ServersOnline, PlayersOnline; - ServersPlayersOnline.HSplitMid(&PlayersOnline, &ServersOnline); - - char aBuf[128]; - if(ServerBrowser()->NumServers() != 1) - str_format(aBuf, sizeof(aBuf), Localize("%d of %d servers"), ServerBrowser()->NumSortedServers(), ServerBrowser()->NumServers()); - else - str_format(aBuf, sizeof(aBuf), Localize("%d of %d server"), ServerBrowser()->NumSortedServers(), ServerBrowser()->NumServers()); - Ui()->DoLabel(&ServersOnline, aBuf, 12.0f, TEXTALIGN_MR); - - if(ServerBrowser()->NumSortedPlayers() != 1) - str_format(aBuf, sizeof(aBuf), Localize("%d players"), ServerBrowser()->NumSortedPlayers()); - else - str_format(aBuf, sizeof(aBuf), Localize("%d player"), ServerBrowser()->NumSortedPlayers()); - Ui()->DoLabel(&PlayersOnline, aBuf, 12.0f, TEXTALIGN_MR); - } - - // address info - { - CUIRect ServerAddrLabel, ServerAddrEditBox; - ServerAddr.Margin(2.0f, &ServerAddr); - ServerAddr.VSplitLeft(SearchExcludeAddrStrMax + 5.0f + ExcludeSearchIconMax + 5.0f, &ServerAddrLabel, &ServerAddrEditBox); - - Ui()->DoLabel(&ServerAddrLabel, Localize("Server address:"), 14.0f, TEXTALIGN_ML); - static CLineInput s_ServerAddressInput(g_Config.m_UiServerAddress, sizeof(g_Config.m_UiServerAddress)); - if(Ui()->DoClearableEditBox(&s_ServerAddressInput, &ServerAddrEditBox, 12.0f)) - m_ServerBrowserShouldRevealSelection = true; - } - - // buttons - { - CUIRect ButtonRefresh, ButtonConnect; - ConnectButtons.VSplitMid(&ButtonRefresh, &ButtonConnect, 5.0f); - - // refresh button - { - char aLabelBuf[32] = {0}; - const auto &&RefreshLabelFunc = [this, aLabelBuf]() mutable { - if(ServerBrowser()->IsRefreshing() || ServerBrowser()->IsGettingServerlist()) - str_format(aLabelBuf, sizeof(aLabelBuf), "%s%s", FONT_ICON_ARROW_ROTATE_RIGHT, FONT_ICON_ELLIPSIS); - else - str_copy(aLabelBuf, FONT_ICON_ARROW_ROTATE_RIGHT); - return aLabelBuf; - }; - - SMenuButtonProperties Props; - Props.m_HintRequiresStringCheck = true; - Props.m_UseIconFont = true; - - static CButtonContainer s_RefreshButton; - if(Ui()->DoButton_Menu(m_RefreshButton, &s_RefreshButton, RefreshLabelFunc, &ButtonRefresh, Props) || (!Ui()->IsPopupOpen() && (Input()->KeyPress(KEY_F5) || (Input()->KeyPress(KEY_R) && Input()->ModifierIsPressed())))) - { - RefreshBrowserTab(true); - } - } - - // connect button - { - const auto &&ConnectLabelFunc = []() { return FONT_ICON_RIGHT_TO_BRACKET; }; - - SMenuButtonProperties Props; - Props.m_UseIconFont = true; - Props.m_Color = ColorRGBA(0.5f, 1.0f, 0.5f, 0.5f); - - static CButtonContainer s_ConnectButton; - if(Ui()->DoButton_Menu(m_ConnectButton, &s_ConnectButton, ConnectLabelFunc, &ButtonConnect, Props) || WasListboxItemActivated || (!Ui()->IsPopupOpen() && Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER))) - { - Connect(g_Config.m_UiServerAddress); - } - } - } -} - -void CMenus::Connect(const char *pAddress) -{ - if(Client()->State() == IClient::STATE_ONLINE && GameClient()->CurrentRaceTime() / 60 >= g_Config.m_ClConfirmDisconnectTime && g_Config.m_ClConfirmDisconnectTime >= 0) - { - str_copy(m_aNextServer, pAddress); - PopupConfirm(Localize("Disconnect"), Localize("Are you sure that you want to disconnect and switch to a different server?"), Localize("Yes"), Localize("No"), &CMenus::PopupConfirmSwitchServer); - } - else - Client()->Connect(pAddress); -} - -void CMenus::PopupConfirmSwitchServer() -{ - Client()->Connect(m_aNextServer); -} - -void CMenus::RenderServerbrowserFilters(CUIRect View) -{ - const float RowHeight = 18.0f; - const float FontSize = (RowHeight - 4.0f) * CUi::ms_FontmodHeight; // based on DoButton_CheckBox - - View.Margin(5.0f, &View); - - CUIRect Button, ResetButton; - View.HSplitBottom(RowHeight, &View, &ResetButton); - View.HSplitBottom(3.0f, &View, nullptr); - - View.HSplitTop(RowHeight, &Button, &View); - if(DoButton_CheckBox(&g_Config.m_BrFilterEmpty, Localize("Has people playing"), g_Config.m_BrFilterEmpty, &Button)) - g_Config.m_BrFilterEmpty ^= 1; - - View.HSplitTop(RowHeight, &Button, &View); - if(DoButton_CheckBox(&g_Config.m_BrFilterSpectators, Localize("Count players only"), g_Config.m_BrFilterSpectators, &Button)) - g_Config.m_BrFilterSpectators ^= 1; - - View.HSplitTop(RowHeight, &Button, &View); - if(DoButton_CheckBox(&g_Config.m_BrFilterFull, Localize("Server not full"), g_Config.m_BrFilterFull, &Button)) - g_Config.m_BrFilterFull ^= 1; - - View.HSplitTop(RowHeight, &Button, &View); - if(DoButton_CheckBox(&g_Config.m_BrFilterFriends, Localize("Show friends only"), g_Config.m_BrFilterFriends, &Button)) - g_Config.m_BrFilterFriends ^= 1; - - View.HSplitTop(RowHeight, &Button, &View); - if(DoButton_CheckBox(&g_Config.m_BrFilterPw, Localize("No password"), g_Config.m_BrFilterPw, &Button)) - g_Config.m_BrFilterPw ^= 1; - - View.HSplitTop(RowHeight, &Button, &View); - if(DoButton_CheckBox(&g_Config.m_BrFilterLogin, Localize("No login required"), g_Config.m_BrFilterLogin, &Button)) - g_Config.m_BrFilterLogin ^= 1; - - View.HSplitTop(RowHeight, &Button, &View); - if(DoButton_CheckBox(&g_Config.m_BrFilterGametypeStrict, Localize("Strict gametype filter"), g_Config.m_BrFilterGametypeStrict, &Button)) - g_Config.m_BrFilterGametypeStrict ^= 1; - - View.HSplitTop(3.0f, nullptr, &View); - View.HSplitTop(RowHeight, &Button, &View); - Ui()->DoLabel(&Button, Localize("Game types:"), FontSize, TEXTALIGN_ML); - Button.VSplitRight(60.0f, nullptr, &Button); - static CLineInput s_GametypeInput(g_Config.m_BrFilterGametype, sizeof(g_Config.m_BrFilterGametype)); - if(Ui()->DoEditBox(&s_GametypeInput, &Button, FontSize)) - Client()->ServerBrowserUpdate(); - - // server address - View.HSplitTop(6.0f, nullptr, &View); - View.HSplitTop(RowHeight, &Button, &View); - View.HSplitTop(6.0f, nullptr, &View); - Ui()->DoLabel(&Button, Localize("Server address:"), FontSize, TEXTALIGN_ML); - Button.VSplitRight(60.0f, nullptr, &Button); - static CLineInput s_FilterServerAddressInput(g_Config.m_BrFilterServerAddress, sizeof(g_Config.m_BrFilterServerAddress)); - if(Ui()->DoEditBox(&s_FilterServerAddressInput, &Button, FontSize)) - Client()->ServerBrowserUpdate(); - - // player country - { - CUIRect Flag; - View.HSplitTop(RowHeight, &Button, &View); - Button.VSplitRight(60.0f, &Button, &Flag); - if(DoButton_CheckBox(&g_Config.m_BrFilterCountry, Localize("Player country:"), g_Config.m_BrFilterCountry, &Button)) - g_Config.m_BrFilterCountry ^= 1; - - const float OldWidth = Flag.w; - Flag.w = Flag.h * 2.0f; - Flag.x += (OldWidth - Flag.w) / 2.0f; - m_pClient->m_CountryFlags.Render(g_Config.m_BrFilterCountryIndex, ColorRGBA(1.0f, 1.0f, 1.0f, Ui()->HotItem() == &g_Config.m_BrFilterCountryIndex ? 1.0f : g_Config.m_BrFilterCountry ? 0.9f : 0.5f), Flag.x, Flag.y, Flag.w, Flag.h); - - if(Ui()->DoButtonLogic(&g_Config.m_BrFilterCountryIndex, 0, &Flag)) - { - static SPopupMenuId s_PopupCountryId; - static SPopupCountrySelectionContext s_PopupCountryContext; - s_PopupCountryContext.m_pMenus = this; - s_PopupCountryContext.m_Selection = g_Config.m_BrFilterCountryIndex; - s_PopupCountryContext.m_New = true; - Ui()->DoPopupMenu(&s_PopupCountryId, Flag.x, Flag.y + Flag.h, 490, 210, &s_PopupCountryContext, PopupCountrySelection); - } - } - - View.HSplitTop(RowHeight, &Button, &View); - if(DoButton_CheckBox(&g_Config.m_BrFilterConnectingPlayers, Localize("Filter connecting players"), g_Config.m_BrFilterConnectingPlayers, &Button)) - g_Config.m_BrFilterConnectingPlayers ^= 1; - - // map finish filters - if(ServerBrowser()->CommunityCache().AnyRanksAvailable()) - { - View.HSplitTop(RowHeight, &Button, &View); - if(DoButton_CheckBox(&g_Config.m_BrIndicateFinished, Localize("Indicate map finish"), g_Config.m_BrIndicateFinished, &Button)) - { - g_Config.m_BrIndicateFinished ^= 1; - if(g_Config.m_BrIndicateFinished) - ServerBrowser()->Refresh(ServerBrowser()->GetCurrentType()); - } - - if(g_Config.m_BrIndicateFinished) - { - View.HSplitTop(RowHeight, &Button, &View); - if(DoButton_CheckBox(&g_Config.m_BrFilterUnfinishedMap, Localize("Unfinished map"), g_Config.m_BrFilterUnfinishedMap, &Button)) - g_Config.m_BrFilterUnfinishedMap ^= 1; - } - else - { - g_Config.m_BrFilterUnfinishedMap = 0; - } - } - - // countries and types filters - if(ServerBrowser()->CommunityCache().CountriesTypesFilterAvailable()) - { - const ColorRGBA ColorActive = ColorRGBA(0.0f, 0.0f, 0.0f, 0.3f); - const ColorRGBA ColorInactive = ColorRGBA(0.0f, 0.0f, 0.0f, 0.15f); - - CUIRect TabContents, CountriesTab, TypesTab; - View.HSplitTop(6.0f, nullptr, &View); - View.HSplitTop(19.0f, &Button, &View); - View.HSplitTop(minimum(4.0f * 22.0f + CScrollRegion::HEIGHT_MAGIC_FIX, View.h), &TabContents, &View); - Button.VSplitMid(&CountriesTab, &TypesTab); - TabContents.Draw(ColorActive, IGraphics::CORNER_B, 4.0f); - - enum EFilterTab - { - FILTERTAB_COUNTRIES = 0, - FILTERTAB_TYPES, - }; - static EFilterTab s_ActiveTab = FILTERTAB_COUNTRIES; - - static CButtonContainer s_CountriesButton; - if(DoButton_MenuTab(&s_CountriesButton, Localize("Countries"), s_ActiveTab == FILTERTAB_COUNTRIES, &CountriesTab, IGraphics::CORNER_TL, nullptr, &ColorInactive, &ColorActive, nullptr, 4.0f)) - { - s_ActiveTab = FILTERTAB_COUNTRIES; - } - - static CButtonContainer s_TypesButton; - if(DoButton_MenuTab(&s_TypesButton, Localize("Types"), s_ActiveTab == FILTERTAB_TYPES, &TypesTab, IGraphics::CORNER_TR, nullptr, &ColorInactive, &ColorActive, nullptr, 4.0f)) - { - s_ActiveTab = FILTERTAB_TYPES; - } - - if(s_ActiveTab == FILTERTAB_COUNTRIES) - { - RenderServerbrowserCountriesFilter(TabContents); - } - else if(s_ActiveTab == FILTERTAB_TYPES) - { - RenderServerbrowserTypesFilter(TabContents); - } - } - - static CButtonContainer s_ResetButton; - if(DoButton_Menu(&s_ResetButton, Localize("Reset filter"), 0, &ResetButton)) - { - ResetServerbrowserFilters(); - } -} - -void CMenus::ResetServerbrowserFilters() -{ - g_Config.m_BrFilterString[0] = '\0'; - g_Config.m_BrExcludeString[0] = '\0'; - g_Config.m_BrFilterFull = 0; - g_Config.m_BrFilterEmpty = 0; - g_Config.m_BrFilterSpectators = 0; - g_Config.m_BrFilterFriends = 0; - g_Config.m_BrFilterCountry = 0; - g_Config.m_BrFilterCountryIndex = -1; - g_Config.m_BrFilterPw = 0; - g_Config.m_BrFilterGametype[0] = '\0'; - g_Config.m_BrFilterGametypeStrict = 0; - g_Config.m_BrFilterConnectingPlayers = 1; - g_Config.m_BrFilterServerAddress[0] = '\0'; - g_Config.m_BrFilterLogin = true; - - if(g_Config.m_UiPage != PAGE_LAN) - { - if(ServerBrowser()->CommunityCache().AnyRanksAvailable()) - { - g_Config.m_BrFilterUnfinishedMap = 0; - } - if(g_Config.m_UiPage == PAGE_INTERNET || g_Config.m_UiPage == PAGE_FAVORITES) - { - ServerBrowser()->CommunitiesFilter().Clear(); - } - ServerBrowser()->CountriesFilter().Clear(); - ServerBrowser()->TypesFilter().Clear(); - UpdateCommunityCache(true); - } - - Client()->ServerBrowserUpdate(); -} - -void CMenus::RenderServerbrowserDDNetFilter(CUIRect View, - IFilterList &Filter, - float ItemHeight, int MaxItems, int ItemsPerRow, - CScrollRegion &ScrollRegion, std::vector &vItemIds, - bool UpdateCommunityCacheOnChange, - const std::function &GetItemName, - const std::function &RenderItem) -{ - vItemIds.resize(MaxItems); - - vec2 ScrollOffset(0.0f, 0.0f); - CScrollRegionParams ScrollParams; - ScrollParams.m_ScrollbarWidth = 10.0f; - ScrollParams.m_ScrollbarMargin = 3.0f; - ScrollParams.m_ScrollUnit = 2.0f * ItemHeight; - ScrollRegion.Begin(&View, &ScrollOffset, &ScrollParams); - View.y += ScrollOffset.y; - - CUIRect Row; - int ColumnIndex = 0; - for(int ItemIndex = 0; ItemIndex < MaxItems; ++ItemIndex) - { - CUIRect Item; - if(ColumnIndex == 0) - View.HSplitTop(ItemHeight, &Row, &View); - Row.VSplitLeft(View.w / ItemsPerRow, &Item, &Row); - ColumnIndex = (ColumnIndex + 1) % ItemsPerRow; - if(!ScrollRegion.AddRect(Item)) - continue; - - const void *pItemId = &vItemIds[ItemIndex]; - const char *pName = GetItemName(ItemIndex); - const bool Active = !Filter.Filtered(pName); - - const int Click = Ui()->DoButtonLogic(pItemId, 0, &Item); - if(Click == 1 || Click == 2) - { - // left/right click to toggle filter - if(Filter.Empty()) - { - if(Click == 1) - { - // Left click: when all are active, only activate one and none - for(int j = 0; j < MaxItems; ++j) - { - if(const char *pItemName = GetItemName(j); - j != ItemIndex && - !((&Filter == &ServerBrowser()->CountriesFilter() && str_comp(pItemName, IServerBrowser::COMMUNITY_COUNTRY_NONE) == 0) || - (&Filter == &ServerBrowser()->TypesFilter() && str_comp(pItemName, IServerBrowser::COMMUNITY_TYPE_NONE) == 0))) - Filter.Add(pItemName); - } - } - else if(Click == 2) - { - // Right click: when all are active, only deactivate one - if(MaxItems >= 2) - { - Filter.Add(GetItemName(ItemIndex)); - } - } - } - else - { - bool AllFilteredExceptUs = true; - for(int j = 0; j < MaxItems; ++j) - { - if(const char *pItemName = GetItemName(j); - j != ItemIndex && !Filter.Filtered(pItemName) && - !((&Filter == &ServerBrowser()->CountriesFilter() && str_comp(pItemName, IServerBrowser::COMMUNITY_COUNTRY_NONE) == 0) || - (&Filter == &ServerBrowser()->TypesFilter() && str_comp(pItemName, IServerBrowser::COMMUNITY_TYPE_NONE) == 0))) - { - AllFilteredExceptUs = false; - break; - } - } - // When last one is removed, re-enable all currently selectable items. - // Don't use Clear, to avoid enabling also currently unselectable items. - if(AllFilteredExceptUs && Active) - { - for(int j = 0; j < MaxItems; ++j) - { - Filter.Remove(GetItemName(j)); - } - } - else if(Active) - { - Filter.Add(pName); - } - else - { - Filter.Remove(pName); - } - } - - Client()->ServerBrowserUpdate(); - if(UpdateCommunityCacheOnChange) - UpdateCommunityCache(true); - } - else if(Click == 3) - { - // middle click to reset (re-enable all currently selectable items) - for(int j = 0; j < MaxItems; ++j) - { - Filter.Remove(GetItemName(j)); - } - Client()->ServerBrowserUpdate(); - if(UpdateCommunityCacheOnChange) - UpdateCommunityCache(true); - } - - if(Ui()->HotItem() == pItemId && !ScrollRegion.Animating()) - Item.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.33f), IGraphics::CORNER_ALL, 2.0f); - RenderItem(ItemIndex, Item, pItemId, Active); - } - - ScrollRegion.End(); -} - -void CMenus::RenderServerbrowserCommunitiesFilter(CUIRect View) -{ - CUIRect Tab; - View.HSplitTop(19.0f, &Tab, &View); - Tab.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.3f), IGraphics::CORNER_T, 4.0f); - Ui()->DoLabel(&Tab, Localize("Communities"), 12.0f, TEXTALIGN_MC); - View.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.15f), IGraphics::CORNER_B, 4.0f); - - const int MaxEntries = ServerBrowser()->Communities().size(); - const int EntriesPerRow = 1; - - static CScrollRegion s_ScrollRegion; - static std::vector s_vItemIds; - static std::vector s_vFavoriteButtonIds; - - const float ItemHeight = 13.0f; - const float Spacing = 2.0f; - - const auto &&GetItemName = [&](int ItemIndex) { - return ServerBrowser()->Communities()[ItemIndex].Id(); - }; - const auto &&GetItemDisplayName = [&](int ItemIndex) { - return ServerBrowser()->Communities()[ItemIndex].Name(); - }; - const auto &&RenderItem = [&](int ItemIndex, CUIRect Item, const void *pItemId, bool Active) { - const float Alpha = (Active ? 0.9f : 0.2f) + (Ui()->HotItem() == pItemId ? 0.1f : 0.0f); - - CUIRect Icon, Label, FavoriteButton; - Item.VSplitRight(Item.h, &Item, &FavoriteButton); - Item.Margin(Spacing, &Item); - Item.VSplitLeft(Item.h * 2.0f, &Icon, &Label); - Label.VSplitLeft(Spacing, nullptr, &Label); - - const char *pItemName = GetItemName(ItemIndex); - const SCommunityIcon *pIcon = FindCommunityIcon(pItemName); - if(pIcon != nullptr) - { - RenderCommunityIcon(pIcon, Icon, Active); - } - - TextRender()->TextColor(1.0f, 1.0f, 1.0f, Alpha); - Ui()->DoLabel(&Label, GetItemDisplayName(ItemIndex), Label.h * CUi::ms_FontmodHeight, TEXTALIGN_ML); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - - const bool Favorite = ServerBrowser()->FavoriteCommunitiesFilter().Filtered(pItemName); - if(DoButton_Favorite(&s_vFavoriteButtonIds[ItemIndex], pItemId, Favorite, &FavoriteButton)) - { - if(Favorite) - { - ServerBrowser()->FavoriteCommunitiesFilter().Remove(pItemName); - } - else - { - ServerBrowser()->FavoriteCommunitiesFilter().Add(pItemName); - } - } - }; - - s_vFavoriteButtonIds.resize(MaxEntries); - RenderServerbrowserDDNetFilter(View, ServerBrowser()->CommunitiesFilter(), ItemHeight + 2.0f * Spacing, MaxEntries, EntriesPerRow, s_ScrollRegion, s_vItemIds, true, GetItemName, RenderItem); -} - -void CMenus::RenderServerbrowserCountriesFilter(CUIRect View) -{ - const int MaxEntries = ServerBrowser()->CommunityCache().SelectableCountries().size(); - const int EntriesPerRow = MaxEntries > 8 ? 5 : 4; - - static CScrollRegion s_ScrollRegion; - static std::vector s_vItemIds; - - const float ItemHeight = 18.0f; - const float Spacing = 2.0f; - - const auto &&GetItemName = [&](int ItemIndex) { - return ServerBrowser()->CommunityCache().SelectableCountries()[ItemIndex]->Name(); - }; - const auto &&RenderItem = [&](int ItemIndex, CUIRect Item, const void *pItemId, bool Active) { - Item.Margin(Spacing, &Item); - const float OldWidth = Item.w; - Item.w = Item.h * 2.0f; - Item.x += (OldWidth - Item.w) / 2.0f; - m_pClient->m_CountryFlags.Render(ServerBrowser()->CommunityCache().SelectableCountries()[ItemIndex]->FlagId(), ColorRGBA(1.0f, 1.0f, 1.0f, (Active ? 0.9f : 0.2f) + (Ui()->HotItem() == pItemId ? 0.1f : 0.0f)), Item.x, Item.y, Item.w, Item.h); - }; - - RenderServerbrowserDDNetFilter(View, ServerBrowser()->CountriesFilter(), ItemHeight + 2.0f * Spacing, MaxEntries, EntriesPerRow, s_ScrollRegion, s_vItemIds, false, GetItemName, RenderItem); -} - -void CMenus::RenderServerbrowserTypesFilter(CUIRect View) -{ - const int MaxEntries = ServerBrowser()->CommunityCache().SelectableTypes().size(); - const int EntriesPerRow = 3; - - static CScrollRegion s_ScrollRegion; - static std::vector s_vItemIds; - - const float ItemHeight = 13.0f; - const float Spacing = 2.0f; - - const auto &&GetItemName = [&](int ItemIndex) { - return ServerBrowser()->CommunityCache().SelectableTypes()[ItemIndex]->Name(); - }; - const auto &&RenderItem = [&](int ItemIndex, CUIRect Item, const void *pItemId, bool Active) { - Item.Margin(Spacing, &Item); - TextRender()->TextColor(1.0f, 1.0f, 1.0f, (Active ? 0.9f : 0.2f) + (Ui()->HotItem() == pItemId ? 0.1f : 0.0f)); - Ui()->DoLabel(&Item, GetItemName(ItemIndex), Item.h * CUi::ms_FontmodHeight, TEXTALIGN_MC); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - }; - - RenderServerbrowserDDNetFilter(View, ServerBrowser()->TypesFilter(), ItemHeight + 2.0f * Spacing, MaxEntries, EntriesPerRow, s_ScrollRegion, s_vItemIds, false, GetItemName, RenderItem); -} - -CUi::EPopupMenuFunctionResult CMenus::PopupCountrySelection(void *pContext, CUIRect View, bool Active) -{ - SPopupCountrySelectionContext *pPopupContext = static_cast(pContext); - CMenus *pMenus = pPopupContext->m_pMenus; - - static CListBox s_ListBox; - s_ListBox.SetActive(Active); - s_ListBox.DoStart(50.0f, pMenus->m_pClient->m_CountryFlags.Num(), 8, 1, -1, &View, false); - - if(pPopupContext->m_New) - { - pPopupContext->m_New = false; - s_ListBox.ScrollToSelected(); - } - - for(size_t i = 0; i < pMenus->m_pClient->m_CountryFlags.Num(); ++i) - { - const CCountryFlags::CCountryFlag *pEntry = pMenus->m_pClient->m_CountryFlags.GetByIndex(i); - - const CListboxItem Item = s_ListBox.DoNextItem(pEntry, pEntry->m_CountryCode == pPopupContext->m_Selection); - if(!Item.m_Visible) - continue; - - CUIRect FlagRect, Label; - Item.m_Rect.Margin(5.0f, &FlagRect); - FlagRect.HSplitBottom(12.0f, &FlagRect, &Label); - Label.HSplitTop(2.0f, nullptr, &Label); - const float OldWidth = FlagRect.w; - FlagRect.w = FlagRect.h * 2.0f; - FlagRect.x += (OldWidth - FlagRect.w) / 2.0f; - pMenus->m_pClient->m_CountryFlags.Render(pEntry->m_CountryCode, ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), FlagRect.x, FlagRect.y, FlagRect.w, FlagRect.h); - - pMenus->Ui()->DoLabel(&Label, pEntry->m_aCountryCodeString, 10.0f, TEXTALIGN_MC); - } - - const int NewSelected = s_ListBox.DoEnd(); - pPopupContext->m_Selection = NewSelected >= 0 ? pMenus->m_pClient->m_CountryFlags.GetByIndex(NewSelected)->m_CountryCode : -1; - if(s_ListBox.WasItemSelected() || s_ListBox.WasItemActivated()) - { - g_Config.m_BrFilterCountry = 1; - g_Config.m_BrFilterCountryIndex = pPopupContext->m_Selection; - pMenus->Client()->ServerBrowserUpdate(); - return CUi::POPUP_CLOSE_CURRENT; - } - - return CUi::POPUP_KEEP_OPEN; -} - -void CMenus::RenderServerbrowserInfo(CUIRect View) -{ - const CServerInfo *pSelectedServer = ServerBrowser()->SortedGet(m_SelectedIndex); - - const float RowHeight = 18.0f; - const float FontSize = (RowHeight - 4.0f) * CUi::ms_FontmodHeight; // based on DoButton_CheckBox - - CUIRect ServerDetails, Scoreboard; - View.HSplitTop(4.0f * 15.0f + RowHeight + 2.0f * 5.0f + 2.0f * 2.0f, &ServerDetails, &Scoreboard); - - if(pSelectedServer) - { - ServerDetails.Margin(5.0f, &ServerDetails); - - // copy info button - { - CUIRect Button; - ServerDetails.HSplitBottom(15.0f, &ServerDetails, &Button); - static CButtonContainer s_CopyButton; - if(DoButton_Menu(&s_CopyButton, Localize("Copy info"), 0, &Button)) - { - char aInfo[256]; - str_format( - aInfo, - sizeof(aInfo), - "%s\n" - "Address: ddnet://%s\n", - pSelectedServer->m_aName, - pSelectedServer->m_aAddress); - Input()->SetClipboardText(aInfo); - } - } - - // favorite checkbox - { - CUIRect ButtonAddFav, ButtonLeakIp; - ServerDetails.HSplitBottom(2.0f, &ServerDetails, nullptr); - ServerDetails.HSplitBottom(RowHeight, &ServerDetails, &ButtonAddFav); - ServerDetails.HSplitBottom(2.0f, &ServerDetails, nullptr); - ButtonAddFav.VSplitMid(&ButtonAddFav, &ButtonLeakIp); - static int s_AddFavButton = 0; - if(DoButton_CheckBox_Tristate(&s_AddFavButton, Localize("Favorite"), pSelectedServer->m_Favorite, &ButtonAddFav)) - { - if(pSelectedServer->m_Favorite != TRISTATE::NONE) - { - Favorites()->Remove(pSelectedServer->m_aAddresses, pSelectedServer->m_NumAddresses); - } - else - { - Favorites()->Add(pSelectedServer->m_aAddresses, pSelectedServer->m_NumAddresses); - if(g_Config.m_UiPage == PAGE_LAN) - { - Favorites()->AllowPing(pSelectedServer->m_aAddresses, pSelectedServer->m_NumAddresses, true); - } - } - Client()->ServerBrowserUpdate(); - } - if(pSelectedServer->m_Favorite != TRISTATE::NONE) - { - static int s_LeakIpButton = 0; - if(DoButton_CheckBox_Tristate(&s_LeakIpButton, Localize("Leak IP"), pSelectedServer->m_FavoriteAllowPing, &ButtonLeakIp)) - { - Favorites()->AllowPing(pSelectedServer->m_aAddresses, pSelectedServer->m_NumAddresses, pSelectedServer->m_FavoriteAllowPing == TRISTATE::NONE); - Client()->ServerBrowserUpdate(); - } - } - } - - CUIRect LeftColumn, RightColumn, Row; - ServerDetails.VSplitLeft(80.0f, &LeftColumn, &RightColumn); - - LeftColumn.HSplitTop(15.0f, &Row, &LeftColumn); - Ui()->DoLabel(&Row, Localize("Version"), FontSize, TEXTALIGN_ML); - - RightColumn.HSplitTop(15.0f, &Row, &RightColumn); - Ui()->DoLabel(&Row, pSelectedServer->m_aVersion, FontSize, TEXTALIGN_ML); - - LeftColumn.HSplitTop(15.0f, &Row, &LeftColumn); - Ui()->DoLabel(&Row, Localize("Game type"), FontSize, TEXTALIGN_ML); - - RightColumn.HSplitTop(15.0f, &Row, &RightColumn); - Ui()->DoLabel(&Row, pSelectedServer->m_aGameType, FontSize, TEXTALIGN_ML); - - LeftColumn.HSplitTop(15.0f, &Row, &LeftColumn); - Ui()->DoLabel(&Row, Localize("Ping"), FontSize, TEXTALIGN_ML); - - if(g_Config.m_UiColorizePing) - TextRender()->TextColor(GetPingTextColor(pSelectedServer->m_Latency)); - char aTemp[16]; - FormatServerbrowserPing(aTemp, pSelectedServer); - RightColumn.HSplitTop(15.0f, &Row, &RightColumn); - Ui()->DoLabel(&Row, aTemp, FontSize, TEXTALIGN_ML); - if(g_Config.m_UiColorizePing) - TextRender()->TextColor(TextRender()->DefaultTextColor()); - - RenderServerbrowserInfoScoreboard(Scoreboard, pSelectedServer); - } - else - { - Ui()->DoLabel(&ServerDetails, Localize("No server selected"), FontSize, TEXTALIGN_MC); - } -} - -void CMenus::RenderServerbrowserInfoScoreboard(CUIRect View, const CServerInfo *pSelectedServer) -{ - const float FontSize = 10.0f; - - static CListBox s_ListBox; - View.VSplitLeft(5.0f, nullptr, &View); - s_ListBox.DoAutoSpacing(2.0f); - s_ListBox.SetScrollbarWidth(16.0f); - s_ListBox.SetScrollbarMargin(5.0f); - s_ListBox.DoStart(25.0f, pSelectedServer->m_NumReceivedClients, 1, 3, -1, &View, false, IGraphics::CORNER_NONE, true); - - for(int i = 0; i < pSelectedServer->m_NumReceivedClients; i++) - { - const CServerInfo::CClient &CurrentClient = pSelectedServer->m_aClients[i]; - const CListboxItem Item = s_ListBox.DoNextItem(&CurrentClient); - if(!Item.m_Visible) - continue; - - CUIRect Skin, Name, Clan, Score, Flag; - Name = Item.m_Rect; - - const ColorRGBA Color = PlayerBackgroundColor(CurrentClient.m_FriendState == IFriends::FRIEND_PLAYER, CurrentClient.m_FriendState == IFriends::FRIEND_CLAN, CurrentClient.m_Afk, false); - Name.Draw(Color, IGraphics::CORNER_ALL, 4.0f); - Name.VSplitLeft(1.0f, nullptr, &Name); - Name.VSplitLeft(34.0f, &Score, &Name); - Name.VSplitLeft(18.0f, &Skin, &Name); - Name.VSplitRight(26.0f, &Name, &Flag); - Flag.HMargin(6.0f, &Flag); - Name.HSplitTop(12.0f, &Name, &Clan); - - // score - char aTemp[16]; - if(!CurrentClient.m_Player) - { - str_copy(aTemp, "SPEC"); - } - else if(pSelectedServer->m_ClientScoreKind == CServerInfo::CLIENT_SCORE_KIND_POINTS) - { - str_format(aTemp, sizeof(aTemp), "%d", CurrentClient.m_Score); - } - else - { - std::optional Time = {}; - - if(pSelectedServer->m_ClientScoreKind == CServerInfo::CLIENT_SCORE_KIND_TIME_BACKCOMPAT) - { - const int TempTime = absolute(CurrentClient.m_Score); - if(TempTime != 0 && TempTime != 9999) - Time = TempTime; - } - else - { - // CServerInfo::CLIENT_SCORE_KIND_POINTS - if(CurrentClient.m_Score >= 0) - Time = CurrentClient.m_Score; - } - - if(Time.has_value()) - { - str_time((int64_t)Time.value() * 100, TIME_HOURS, aTemp, sizeof(aTemp)); - } - else - { - aTemp[0] = '\0'; - } - } - - Ui()->DoLabel(&Score, aTemp, FontSize, TEXTALIGN_ML); - - // render tee if available - if(CurrentClient.m_aSkin[0] != '\0') - { - const CTeeRenderInfo TeeInfo = GetTeeRenderInfo(vec2(Skin.w, Skin.h), CurrentClient.m_aSkin, CurrentClient.m_CustomSkinColors, CurrentClient.m_CustomSkinColorBody, CurrentClient.m_CustomSkinColorFeet); - const CAnimState *pIdleState = CAnimState::GetIdle(); - vec2 OffsetToMid; - CRenderTools::GetRenderTeeOffsetToRenderedTee(pIdleState, &TeeInfo, OffsetToMid); - const vec2 TeeRenderPos = vec2(Skin.x + TeeInfo.m_Size / 2.0f, Skin.y + Skin.h / 2.0f + OffsetToMid.y); - RenderTools()->RenderTee(pIdleState, &TeeInfo, CurrentClient.m_Afk ? EMOTE_BLINK : EMOTE_NORMAL, vec2(1.0f, 0.0f), TeeRenderPos); - Ui()->DoButtonLogic(&CurrentClient.m_aSkin, 0, &Skin); - GameClient()->m_Tooltips.DoToolTip(&CurrentClient.m_aSkin, &Skin, CurrentClient.m_aSkin); - } - - // name - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, Name.x, Name.y + (Name.h - (FontSize - 1.0f)) / 2.0f, FontSize - 1.0f, TEXTFLAG_RENDER | TEXTFLAG_STOP_AT_END); - Cursor.m_LineWidth = Name.w; - const char *pName = CurrentClient.m_aName; - bool Printed = false; - if(g_Config.m_BrFilterString[0]) - Printed = PrintHighlighted(pName, [&](const char *pFilteredStr, const int FilterLen) { - TextRender()->TextEx(&Cursor, pName, (int)(pFilteredStr - pName)); - TextRender()->TextColor(gs_HighlightedTextColor); - TextRender()->TextEx(&Cursor, pFilteredStr, FilterLen); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - TextRender()->TextEx(&Cursor, pFilteredStr + FilterLen, -1); - }); - if(!Printed) - TextRender()->TextEx(&Cursor, pName, -1); - - // clan - TextRender()->SetCursor(&Cursor, Clan.x, Clan.y + (Clan.h - (FontSize - 2.0f)) / 2.0f, FontSize - 2.0f, TEXTFLAG_RENDER | TEXTFLAG_STOP_AT_END); - Cursor.m_LineWidth = Clan.w; - const char *pClan = CurrentClient.m_aClan; - Printed = false; - if(g_Config.m_BrFilterString[0]) - Printed = PrintHighlighted(pClan, [&](const char *pFilteredStr, const int FilterLen) { - TextRender()->TextEx(&Cursor, pClan, (int)(pFilteredStr - pClan)); - TextRender()->TextColor(0.4f, 0.4f, 1.0f, 1.0f); - TextRender()->TextEx(&Cursor, pFilteredStr, FilterLen); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - TextRender()->TextEx(&Cursor, pFilteredStr + FilterLen, -1); - }); - if(!Printed) - TextRender()->TextEx(&Cursor, pClan, -1); - - // flag - m_pClient->m_CountryFlags.Render(CurrentClient.m_Country, ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f), Flag.x, Flag.y, Flag.w, Flag.h); - } - - const int NewSelected = s_ListBox.DoEnd(); - if(s_ListBox.WasItemSelected()) - { - const CServerInfo::CClient &SelectedClient = pSelectedServer->m_aClients[NewSelected]; - if(SelectedClient.m_FriendState == IFriends::FRIEND_PLAYER) - m_pClient->Friends()->RemoveFriend(SelectedClient.m_aName, SelectedClient.m_aClan); - else - m_pClient->Friends()->AddFriend(SelectedClient.m_aName, SelectedClient.m_aClan); - FriendlistOnUpdate(); - Client()->ServerBrowserUpdate(); - } -} - -void CMenus::RenderServerbrowserFriends(CUIRect View) -{ - const float FontSize = 10.0f; - static bool s_aListExtended[NUM_FRIEND_TYPES] = {true, true, false}; - const float SpacingH = 2.0f; - - CUIRect List, ServerFriends; - View.HSplitBottom(70.0f, &List, &ServerFriends); - List.HSplitTop(5.0f, nullptr, &List); - List.VSplitLeft(5.0f, nullptr, &List); - - // calculate friends - // TODO: optimize this - m_pRemoveFriend = nullptr; - for(auto &vFriends : m_avFriends) - vFriends.clear(); - - for(int FriendIndex = 0; FriendIndex < m_pClient->Friends()->NumFriends(); ++FriendIndex) - { - m_avFriends[FRIEND_OFF].emplace_back(m_pClient->Friends()->GetFriend(FriendIndex)); - } - - for(int ServerIndex = 0; ServerIndex < ServerBrowser()->NumSortedServers(); ++ServerIndex) - { - const CServerInfo *pEntry = ServerBrowser()->SortedGet(ServerIndex); - if(pEntry->m_FriendState == IFriends::FRIEND_NO) - continue; - - for(int ClientIndex = 0; ClientIndex < pEntry->m_NumClients; ++ClientIndex) - { - const CServerInfo::CClient &CurrentClient = pEntry->m_aClients[ClientIndex]; - if(CurrentClient.m_FriendState == IFriends::FRIEND_NO) - continue; - - const int FriendIndex = CurrentClient.m_FriendState == IFriends::FRIEND_PLAYER ? FRIEND_PLAYER_ON : FRIEND_CLAN_ON; - m_avFriends[FriendIndex].emplace_back(CurrentClient, pEntry); - const auto &&RemovalPredicate = [CurrentClient](const CFriendItem &Friend) { - return (Friend.Name()[0] == '\0' || str_comp(Friend.Name(), CurrentClient.m_aName) == 0) && ((Friend.Name()[0] != '\0' && g_Config.m_ClFriendsIgnoreClan) || str_comp(Friend.Clan(), CurrentClient.m_aClan) == 0); - }; - m_avFriends[FRIEND_OFF].erase(std::remove_if(m_avFriends[FRIEND_OFF].begin(), m_avFriends[FRIEND_OFF].end(), RemovalPredicate), m_avFriends[FRIEND_OFF].end()); - } - } - for(auto &vFriends : m_avFriends) - std::sort(vFriends.begin(), vFriends.end()); - - // friends list - static CScrollRegion s_ScrollRegion; - vec2 ScrollOffset(0.0f, 0.0f); - CScrollRegionParams ScrollParams; - ScrollParams.m_ScrollbarWidth = 16.0f; - ScrollParams.m_ScrollbarMargin = 5.0f; - ScrollParams.m_ScrollUnit = 80.0f; - ScrollParams.m_Flags = CScrollRegionParams::FLAG_CONTENT_STATIC_WIDTH; - s_ScrollRegion.Begin(&List, &ScrollOffset, &ScrollParams); - List.y += ScrollOffset.y; - - char aBuf[256]; - for(size_t FriendType = 0; FriendType < NUM_FRIEND_TYPES; ++FriendType) - { - // header - CUIRect Header, GroupIcon, GroupLabel; - List.HSplitTop(ms_ListheaderHeight, &Header, &List); - s_ScrollRegion.AddRect(Header); - Header.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, Ui()->HotItem() == &s_aListExtended[FriendType] ? 0.4f : 0.25f), IGraphics::CORNER_ALL, 5.0f); - Header.VSplitLeft(Header.h, &GroupIcon, &GroupLabel); - GroupIcon.Margin(2.0f, &GroupIcon); - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->TextColor(Ui()->HotItem() == &s_aListExtended[FriendType] ? TextRender()->DefaultTextColor() : ColorRGBA(0.6f, 0.6f, 0.6f, 1.0f)); - Ui()->DoLabel(&GroupIcon, s_aListExtended[FriendType] ? FONT_ICON_SQUARE_MINUS : FONT_ICON_SQUARE_PLUS, GroupIcon.h * CUi::ms_FontmodHeight, TEXTALIGN_MC); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - switch(FriendType) - { - case FRIEND_PLAYER_ON: - str_format(aBuf, sizeof(aBuf), Localize("Online friends (%d)"), (int)m_avFriends[FriendType].size()); - break; - case FRIEND_CLAN_ON: - str_format(aBuf, sizeof(aBuf), Localize("Online clanmates (%d)"), (int)m_avFriends[FriendType].size()); - break; - case FRIEND_OFF: - str_format(aBuf, sizeof(aBuf), Localize("Offline (%d)", "friends (server browser)"), (int)m_avFriends[FriendType].size()); - break; - default: - dbg_assert(false, "FriendType invalid"); - break; - } - Ui()->DoLabel(&GroupLabel, aBuf, FontSize, TEXTALIGN_ML); - if(Ui()->DoButtonLogic(&s_aListExtended[FriendType], 0, &Header)) - { - s_aListExtended[FriendType] = !s_aListExtended[FriendType]; - } - - // entries - if(s_aListExtended[FriendType]) - { - for(size_t FriendIndex = 0; FriendIndex < m_avFriends[FriendType].size(); ++FriendIndex) - { - // space - { - CUIRect Space; - List.HSplitTop(SpacingH, &Space, &List); - s_ScrollRegion.AddRect(Space); - } - - CUIRect Rect; - const auto &Friend = m_avFriends[FriendType][FriendIndex]; - List.HSplitTop(11.0f + 10.0f + 2 * 2.0f + 1.0f + (Friend.ServerInfo() == nullptr ? 0.0f : 10.0f), &Rect, &List); - s_ScrollRegion.AddRect(Rect); - if(s_ScrollRegion.RectClipped(Rect)) - continue; - - const bool Inside = Ui()->HotItem() == Friend.ListItemId() || Ui()->HotItem() == Friend.RemoveButtonId() || Ui()->HotItem() == Friend.CommunityTooltipId() || Ui()->HotItem() == Friend.SkinTooltipId(); - int ButtonResult = Ui()->DoButtonLogic(Friend.ListItemId(), 0, &Rect); - - if(Friend.ServerInfo()) - { - GameClient()->m_Tooltips.DoToolTip(Friend.ListItemId(), &Rect, Localize("Click to select server. Double click to join your friend.")); - } - const ColorRGBA Color = PlayerBackgroundColor(FriendType == FRIEND_PLAYER_ON, FriendType == FRIEND_CLAN_ON, FriendType == FRIEND_OFF ? true : Friend.IsAfk(), Inside); - Rect.Draw(Color, IGraphics::CORNER_ALL, 5.0f); - Rect.Margin(2.0f, &Rect); - - CUIRect RemoveButton, NameLabel, ClanLabel, InfoLabel; - Rect.HSplitTop(16.0f, &RemoveButton, nullptr); - RemoveButton.VSplitRight(13.0f, nullptr, &RemoveButton); - RemoveButton.HMargin((RemoveButton.h - RemoveButton.w) / 2.0f, &RemoveButton); - Rect.VSplitLeft(2.0f, nullptr, &Rect); - - if(Friend.ServerInfo()) - Rect.HSplitBottom(10.0f, &Rect, &InfoLabel); - Rect.HSplitTop(11.0f + 10.0f, &Rect, nullptr); - - // tee - CUIRect Skin; - Rect.VSplitLeft(Rect.h, &Skin, &Rect); - Rect.VSplitLeft(2.0f, nullptr, &Rect); - if(Friend.Skin()[0] != '\0') - { - const CTeeRenderInfo TeeInfo = GetTeeRenderInfo(vec2(Skin.w, Skin.h), Friend.Skin(), Friend.CustomSkinColors(), Friend.CustomSkinColorBody(), Friend.CustomSkinColorFeet()); - const CAnimState *pIdleState = CAnimState::GetIdle(); - vec2 OffsetToMid; - CRenderTools::GetRenderTeeOffsetToRenderedTee(pIdleState, &TeeInfo, OffsetToMid); - const vec2 TeeRenderPos = vec2(Skin.x + Skin.w / 2.0f, Skin.y + Skin.h * 0.55f + OffsetToMid.y); - RenderTools()->RenderTee(pIdleState, &TeeInfo, Friend.IsAfk() ? EMOTE_BLINK : EMOTE_NORMAL, vec2(1.0f, 0.0f), TeeRenderPos); - Ui()->DoButtonLogic(Friend.SkinTooltipId(), 0, &Skin); - GameClient()->m_Tooltips.DoToolTip(Friend.SkinTooltipId(), &Skin, Friend.Skin()); - } - Rect.HSplitTop(11.0f, &NameLabel, &ClanLabel); - - // name - Ui()->DoLabel(&NameLabel, Friend.Name(), FontSize - 1.0f, TEXTALIGN_ML); - - // clan - Ui()->DoLabel(&ClanLabel, Friend.Clan(), FontSize - 2.0f, TEXTALIGN_ML); - - // server info - if(Friend.ServerInfo()) - { - // community icon - const CCommunity *pCommunity = ServerBrowser()->Community(Friend.ServerInfo()->m_aCommunityId); - if(pCommunity != nullptr) - { - const SCommunityIcon *pIcon = FindCommunityIcon(pCommunity->Id()); - if(pIcon != nullptr) - { - CUIRect CommunityIcon; - InfoLabel.VSplitLeft(21.0f, &CommunityIcon, &InfoLabel); - InfoLabel.VSplitLeft(2.0f, nullptr, &InfoLabel); - RenderCommunityIcon(pIcon, CommunityIcon, true); - Ui()->DoButtonLogic(Friend.CommunityTooltipId(), 0, &CommunityIcon); - GameClient()->m_Tooltips.DoToolTip(Friend.CommunityTooltipId(), &CommunityIcon, pCommunity->Name()); - } - } - - // server info text - char aLatency[16]; - FormatServerbrowserPing(aLatency, Friend.ServerInfo()); - if(aLatency[0] != '\0') - str_format(aBuf, sizeof(aBuf), "%s | %s | %s", Friend.ServerInfo()->m_aMap, Friend.ServerInfo()->m_aGameType, aLatency); - else - str_format(aBuf, sizeof(aBuf), "%s | %s", Friend.ServerInfo()->m_aMap, Friend.ServerInfo()->m_aGameType); - Ui()->DoLabel(&InfoLabel, aBuf, FontSize - 2.0f, TEXTALIGN_ML); - } - - // remove button - if(Inside) - { - TextRender()->TextColor(Ui()->HotItem() == Friend.RemoveButtonId() ? TextRender()->DefaultTextColor() : ColorRGBA(0.4f, 0.4f, 0.4f, 1.0f)); - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - Ui()->DoLabel(&RemoveButton, FONT_ICON_TRASH, RemoveButton.h * CUi::ms_FontmodHeight, TEXTALIGN_MC); - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - if(Ui()->DoButtonLogic(Friend.RemoveButtonId(), 0, &RemoveButton)) - { - m_pRemoveFriend = &Friend; - ButtonResult = 0; - } - GameClient()->m_Tooltips.DoToolTip(Friend.RemoveButtonId(), &RemoveButton, Friend.FriendState() == IFriends::FRIEND_PLAYER ? Localize("Click to remove this player from your friends list.") : Localize("Click to remove this clan from your friends list.")); - } - - // handle click and double click on item - if(ButtonResult && Friend.ServerInfo()) - { - str_copy(g_Config.m_UiServerAddress, Friend.ServerInfo()->m_aAddress); - m_ServerBrowserShouldRevealSelection = true; - if(ButtonResult == 1 && Ui()->DoDoubleClickLogic(Friend.ListItemId())) - { - Connect(g_Config.m_UiServerAddress); - } - } - } - - // Render empty description - if(m_avFriends[FriendType].empty()) - { - const char *pText; - switch(FriendType) - { - case FRIEND_PLAYER_ON: - pText = Localize("Add friends by entering their name below or by clicking their name in the player list."); - break; - case FRIEND_CLAN_ON: - pText = Localize("Add clanmates by entering their clan below and leaving the name blank."); - break; - case FRIEND_OFF: - pText = Localize("Offline friends and clanmates will appear here."); - break; - default: - dbg_assert(false, "Invalid friend state"); - dbg_break(); - } - const float DescriptionMargin = 2.0f; - const STextBoundingBox BoundingBox = TextRender()->TextBoundingBox(FontSize, pText, -1, List.w - 2 * DescriptionMargin); - CUIRect EmptyDescription; - List.HSplitTop(BoundingBox.m_H + 2 * DescriptionMargin, &EmptyDescription, &List); - s_ScrollRegion.AddRect(EmptyDescription); - EmptyDescription.Margin(DescriptionMargin, &EmptyDescription); - SLabelProperties DescriptionProps; - DescriptionProps.m_MaxWidth = EmptyDescription.w; - Ui()->DoLabel(&EmptyDescription, pText, FontSize, TEXTALIGN_ML, DescriptionProps); - } - } - - // space - { - CUIRect Space; - List.HSplitTop(SpacingH, &Space, &List); - s_ScrollRegion.AddRect(Space); - } - } - s_ScrollRegion.End(); - - if(m_pRemoveFriend != nullptr) - { - char aMessage[256]; - str_format(aMessage, sizeof(aMessage), - m_pRemoveFriend->FriendState() == IFriends::FRIEND_PLAYER ? Localize("Are you sure that you want to remove the player '%s' from your friends list?") : Localize("Are you sure that you want to remove the clan '%s' from your friends list?"), - m_pRemoveFriend->FriendState() == IFriends::FRIEND_PLAYER ? m_pRemoveFriend->Name() : m_pRemoveFriend->Clan()); - PopupConfirm(Localize("Remove friend"), aMessage, Localize("Yes"), Localize("No"), &CMenus::PopupConfirmRemoveFriend); - } - - // add friend - if(m_pClient->Friends()->NumFriends() < IFriends::MAX_FRIENDS) - { - CUIRect Button; - ServerFriends.Margin(5.0f, &ServerFriends); - - ServerFriends.HSplitTop(18.0f, &Button, &ServerFriends); - str_format(aBuf, sizeof(aBuf), "%s:", Localize("Name")); - Ui()->DoLabel(&Button, aBuf, FontSize + 2.0f, TEXTALIGN_ML); - Button.VSplitLeft(80.0f, nullptr, &Button); - static CLineInputBuffered s_NameInput; - Ui()->DoEditBox(&s_NameInput, &Button, FontSize + 2.0f); - - ServerFriends.HSplitTop(3.0f, nullptr, &ServerFriends); - ServerFriends.HSplitTop(18.0f, &Button, &ServerFriends); - str_format(aBuf, sizeof(aBuf), "%s:", Localize("Clan")); - Ui()->DoLabel(&Button, aBuf, FontSize + 2.0f, TEXTALIGN_ML); - Button.VSplitLeft(80.0f, nullptr, &Button); - static CLineInputBuffered s_ClanInput; - Ui()->DoEditBox(&s_ClanInput, &Button, FontSize + 2.0f); - - ServerFriends.HSplitTop(3.0f, nullptr, &ServerFriends); - ServerFriends.HSplitTop(18.0f, &Button, &ServerFriends); - static CButtonContainer s_AddButton; - if(DoButton_Menu(&s_AddButton, s_NameInput.IsEmpty() && !s_ClanInput.IsEmpty() ? Localize("Add Clan") : Localize("Add Friend"), 0, &Button)) - { - m_pClient->Friends()->AddFriend(s_NameInput.GetString(), s_ClanInput.GetString()); - s_NameInput.Clear(); - s_ClanInput.Clear(); - FriendlistOnUpdate(); - Client()->ServerBrowserUpdate(); - } - } -} - -void CMenus::FriendlistOnUpdate() -{ - // TODO: friends are currently updated every frame; optimize and only update friends when necessary -} - -void CMenus::PopupConfirmRemoveFriend() -{ - m_pClient->Friends()->RemoveFriend(m_pRemoveFriend->FriendState() == IFriends::FRIEND_PLAYER ? m_pRemoveFriend->Name() : "", m_pRemoveFriend->Clan()); - FriendlistOnUpdate(); - Client()->ServerBrowserUpdate(); - m_pRemoveFriend = nullptr; -} - -enum -{ - UI_TOOLBOX_PAGE_FILTERS = 0, - UI_TOOLBOX_PAGE_INFO, - UI_TOOLBOX_PAGE_FRIENDS, - NUM_UI_TOOLBOX_PAGES, -}; - -void CMenus::RenderServerbrowserTabBar(CUIRect TabBar) -{ - CUIRect FilterTabButton, InfoTabButton, FriendsTabButton; - TabBar.VSplitLeft(TabBar.w / 3.0f, &FilterTabButton, &TabBar); - TabBar.VSplitMid(&InfoTabButton, &FriendsTabButton); - - const ColorRGBA ColorActive = ColorRGBA(0.0f, 0.0f, 0.0f, 0.3f); - const ColorRGBA ColorInactive = ColorRGBA(0.0f, 0.0f, 0.0f, 0.15f); - - if(!Ui()->IsPopupOpen() && Ui()->ConsumeHotkey(CUi::HOTKEY_TAB)) - { - const int Direction = Input()->ShiftIsPressed() ? -1 : 1; - g_Config.m_UiToolboxPage = (g_Config.m_UiToolboxPage + NUM_UI_TOOLBOX_PAGES + Direction) % NUM_UI_TOOLBOX_PAGES; - } - - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - - static CButtonContainer s_FilterTabButton; - if(DoButton_MenuTab(&s_FilterTabButton, FONT_ICON_LIST_UL, g_Config.m_UiToolboxPage == UI_TOOLBOX_PAGE_FILTERS, &FilterTabButton, IGraphics::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_BROWSER_FILTER], &ColorInactive, &ColorActive)) - { - g_Config.m_UiToolboxPage = UI_TOOLBOX_PAGE_FILTERS; - } - GameClient()->m_Tooltips.DoToolTip(&s_FilterTabButton, &FilterTabButton, Localize("Server filter")); - - static CButtonContainer s_InfoTabButton; - if(DoButton_MenuTab(&s_InfoTabButton, FONT_ICON_INFO, g_Config.m_UiToolboxPage == UI_TOOLBOX_PAGE_INFO, &InfoTabButton, IGraphics::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_BROWSER_INFO], &ColorInactive, &ColorActive)) - { - g_Config.m_UiToolboxPage = UI_TOOLBOX_PAGE_INFO; - } - GameClient()->m_Tooltips.DoToolTip(&s_InfoTabButton, &InfoTabButton, Localize("Server info")); - - static CButtonContainer s_FriendsTabButton; - if(DoButton_MenuTab(&s_FriendsTabButton, FONT_ICON_HEART, g_Config.m_UiToolboxPage == UI_TOOLBOX_PAGE_FRIENDS, &FriendsTabButton, IGraphics::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_BROWSER_FRIENDS], &ColorInactive, &ColorActive)) - { - g_Config.m_UiToolboxPage = UI_TOOLBOX_PAGE_FRIENDS; - } - GameClient()->m_Tooltips.DoToolTip(&s_FriendsTabButton, &FriendsTabButton, Localize("Friends")); - - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); -} - -void CMenus::RenderServerbrowserToolBox(CUIRect ToolBox) -{ - ToolBox.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.3f), IGraphics::CORNER_B, 4.0f); - - switch(g_Config.m_UiToolboxPage) - { - case UI_TOOLBOX_PAGE_FILTERS: - RenderServerbrowserFilters(ToolBox); - return; - case UI_TOOLBOX_PAGE_INFO: - RenderServerbrowserInfo(ToolBox); - return; - case UI_TOOLBOX_PAGE_FRIENDS: - RenderServerbrowserFriends(ToolBox); - return; - default: - dbg_assert(false, "ui_toolbox_page invalid"); - return; - } -} - -void CMenus::RenderServerbrowser(CUIRect MainView) -{ - UpdateCommunityCache(false); - - switch(g_Config.m_UiPage) - { - case PAGE_INTERNET: - GameClient()->m_MenuBackground.ChangePosition(CMenuBackground::POS_BROWSER_INTERNET); - break; - case PAGE_LAN: - GameClient()->m_MenuBackground.ChangePosition(CMenuBackground::POS_BROWSER_LAN); - break; - case PAGE_FAVORITES: - GameClient()->m_MenuBackground.ChangePosition(CMenuBackground::POS_BROWSER_FAVORITES); - break; - case PAGE_FAVORITE_COMMUNITY_1: - case PAGE_FAVORITE_COMMUNITY_2: - case PAGE_FAVORITE_COMMUNITY_3: - case PAGE_FAVORITE_COMMUNITY_4: - case PAGE_FAVORITE_COMMUNITY_5: - GameClient()->m_MenuBackground.ChangePosition(g_Config.m_UiPage - PAGE_FAVORITE_COMMUNITY_1 + CMenuBackground::POS_BROWSER_CUSTOM0); - break; - default: - dbg_assert(false, "ui_page invalid for RenderServerbrowser"); - } - - /* - +---------------------------+ +---communities---+ - | | | | - | | +------tabs-------+ - | server list | | | - | | | tool | - | | | box | - +---------------------------+ | | - status box +-----------------+ - */ - - CUIRect ServerList, StatusBox, ToolBox, TabBar; - MainView.Draw(ms_ColorTabbarActive, IGraphics::CORNER_B, 10.0f); - MainView.Margin(10.0f, &MainView); - MainView.VSplitRight(205.0f, &ServerList, &ToolBox); - ServerList.VSplitRight(5.0f, &ServerList, nullptr); - - if((g_Config.m_UiPage == PAGE_INTERNET || g_Config.m_UiPage == PAGE_FAVORITES) && !ServerBrowser()->Communities().empty()) - { - CUIRect CommunityFilter; - ToolBox.HSplitTop(19.0f + 4.0f * 17.0f + CScrollRegion::HEIGHT_MAGIC_FIX, &CommunityFilter, &ToolBox); - ToolBox.HSplitTop(8.0f, nullptr, &ToolBox); - RenderServerbrowserCommunitiesFilter(CommunityFilter); - } - - ToolBox.HSplitTop(24.0f, &TabBar, &ToolBox); - ServerList.HSplitBottom(65.0f, &ServerList, &StatusBox); - - bool WasListboxItemActivated; - RenderServerbrowserServerList(ServerList, WasListboxItemActivated); - RenderServerbrowserStatusBox(StatusBox, WasListboxItemActivated); - - RenderServerbrowserTabBar(TabBar); - RenderServerbrowserToolBox(ToolBox); -} - -template -bool CMenus::PrintHighlighted(const char *pName, F &&PrintFn) -{ - const char *pStr = g_Config.m_BrFilterString; - char aFilterStr[sizeof(g_Config.m_BrFilterString)]; - char aFilterStrTrimmed[sizeof(g_Config.m_BrFilterString)]; - while((pStr = str_next_token(pStr, IServerBrowser::SEARCH_EXCLUDE_TOKEN, aFilterStr, sizeof(aFilterStr)))) - { - str_copy(aFilterStrTrimmed, str_utf8_skip_whitespaces(aFilterStr)); - str_utf8_trim_right(aFilterStrTrimmed); - // highlight the parts that matches - const char *pFilteredStr; - int FilterLen = str_length(aFilterStrTrimmed); - if(aFilterStrTrimmed[0] == '"' && aFilterStrTrimmed[FilterLen - 1] == '"') - { - aFilterStrTrimmed[FilterLen - 1] = '\0'; - pFilteredStr = str_comp(pName, &aFilterStrTrimmed[1]) == 0 ? pName : nullptr; - FilterLen -= 2; - } - else - { - const char *pFilteredStrEnd; - pFilteredStr = str_utf8_find_nocase(pName, aFilterStrTrimmed, &pFilteredStrEnd); - if(pFilteredStr != nullptr && pFilteredStrEnd != nullptr) - FilterLen = pFilteredStrEnd - pFilteredStr; - } - if(pFilteredStr) - { - PrintFn(pFilteredStr, FilterLen); - return true; - } - } - return false; -} - -CTeeRenderInfo CMenus::GetTeeRenderInfo(vec2 Size, const char *pSkinName, bool CustomSkinColors, int CustomSkinColorBody, int CustomSkinColorFeet) const -{ - CTeeRenderInfo TeeInfo; - TeeInfo.Apply(m_pClient->m_Skins.Find(pSkinName)); - TeeInfo.ApplyColors(CustomSkinColors, CustomSkinColorBody, CustomSkinColorFeet); - TeeInfo.m_Size = minimum(Size.x, Size.y); - return TeeInfo; -} - -void CMenus::ConchainFriendlistUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - pfnCallback(pResult, pCallbackUserData); - CMenus *pThis = ((CMenus *)pUserData); - if(pResult->NumArguments() >= 1 && (pThis->Client()->State() == IClient::STATE_OFFLINE || pThis->Client()->State() == IClient::STATE_ONLINE)) - { - pThis->FriendlistOnUpdate(); - pThis->Client()->ServerBrowserUpdate(); - } -} - -void CMenus::ConchainFavoritesUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - pfnCallback(pResult, pCallbackUserData); - if(pResult->NumArguments() >= 1 && g_Config.m_UiPage == PAGE_FAVORITES) - ((CMenus *)pUserData)->ServerBrowser()->Refresh(IServerBrowser::TYPE_FAVORITES); -} - -void CMenus::ConchainCommunitiesUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - pfnCallback(pResult, pCallbackUserData); - CMenus *pThis = static_cast(pUserData); - if(pResult->NumArguments() >= 1 && (g_Config.m_UiPage == PAGE_INTERNET || g_Config.m_UiPage == PAGE_FAVORITES || (g_Config.m_UiPage >= PAGE_FAVORITE_COMMUNITY_1 && g_Config.m_UiPage <= PAGE_FAVORITE_COMMUNITY_5))) - { - pThis->UpdateCommunityCache(true); - pThis->Client()->ServerBrowserUpdate(); - } -} - -void CMenus::ConchainUiPageUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - pfnCallback(pResult, pCallbackUserData); - CMenus *pThis = static_cast(pUserData); - if(pResult->NumArguments() >= 1) - { - if(g_Config.m_UiPage >= PAGE_FAVORITE_COMMUNITY_1 && g_Config.m_UiPage <= PAGE_FAVORITE_COMMUNITY_5 && - (size_t)(g_Config.m_UiPage - PAGE_FAVORITE_COMMUNITY_1) >= pThis->ServerBrowser()->FavoriteCommunities().size()) - { - // Reset page to internet when there is no favorite community for this page. - g_Config.m_UiPage = PAGE_INTERNET; - } - - pThis->SetMenuPage(g_Config.m_UiPage); - } -} - -void CMenus::UpdateCommunityCache(bool Force) -{ - if(g_Config.m_UiPage >= PAGE_FAVORITE_COMMUNITY_1 && g_Config.m_UiPage <= PAGE_FAVORITE_COMMUNITY_5 && - (size_t)(g_Config.m_UiPage - PAGE_FAVORITE_COMMUNITY_1) >= ServerBrowser()->FavoriteCommunities().size()) - { - // Reset page to internet when there is no favorite community for this page, - // i.e. when favorite community is removed via console while the page is open. - // This also updates the community cache because the page is changed. - SetMenuPage(PAGE_INTERNET); - } - else - { - ServerBrowser()->CommunityCache().Update(Force); - } -} - -CMenus::CAbstractCommunityIconJob::CAbstractCommunityIconJob(CMenus *pMenus, const char *pCommunityId, int StorageType) : - m_pMenus(pMenus), - m_StorageType(StorageType) -{ - str_copy(m_aCommunityId, pCommunityId); - str_format(m_aPath, sizeof(m_aPath), "communityicons/%s.png", pCommunityId); -} - -CMenus::CCommunityIconDownloadJob::CCommunityIconDownloadJob(CMenus *pMenus, const char *pCommunityId, const char *pUrl, const SHA256_DIGEST &Sha256) : - CHttpRequest(pUrl), - CAbstractCommunityIconJob(pMenus, pCommunityId, IStorage::TYPE_SAVE) -{ - WriteToFile(pMenus->Storage(), m_aPath, IStorage::TYPE_SAVE); - ExpectSha256(Sha256); - Timeout(CTimeout{0, 0, 0, 0}); - LogProgress(HTTPLOG::FAILURE); -} - -void CMenus::CCommunityIconLoadJob::Run() -{ - m_Success = m_pMenus->LoadCommunityIconFile(m_aPath, m_StorageType, m_ImageInfo, m_Sha256); -} - -CMenus::CCommunityIconLoadJob::CCommunityIconLoadJob(CMenus *pMenus, const char *pCommunityId, int StorageType) : - CAbstractCommunityIconJob(pMenus, pCommunityId, StorageType) -{ - Abortable(true); -} - -CMenus::CCommunityIconLoadJob::~CCommunityIconLoadJob() -{ - m_ImageInfo.Free(); -} - -int CMenus::CommunityIconScan(const char *pName, int IsDir, int DirType, void *pUser) -{ - const char *pExtension = ".png"; - CMenus *pSelf = static_cast(pUser); - if(IsDir || !str_endswith(pName, pExtension) || str_length(pName) - str_length(pExtension) >= (int)CServerInfo::MAX_COMMUNITY_ID_LENGTH) - return 0; - - char aCommunityId[CServerInfo::MAX_COMMUNITY_ID_LENGTH]; - str_truncate(aCommunityId, sizeof(aCommunityId), pName, str_length(pName) - str_length(pExtension)); - - std::shared_ptr pJob = std::make_shared(pSelf, aCommunityId, DirType); - pSelf->Engine()->AddJob(pJob); - pSelf->m_CommunityIconLoadJobs.push_back(pJob); - return 0; -} - -const SCommunityIcon *CMenus::FindCommunityIcon(const char *pCommunityId) -{ - auto Icon = std::find_if(m_vCommunityIcons.begin(), m_vCommunityIcons.end(), [pCommunityId](const SCommunityIcon &Element) { - return str_comp(Element.m_aCommunityId, pCommunityId) == 0; - }); - return Icon == m_vCommunityIcons.end() ? nullptr : &(*Icon); -} - -bool CMenus::LoadCommunityIconFile(const char *pPath, int DirType, CImageInfo &Info, SHA256_DIGEST &Sha256) -{ - char aError[IO_MAX_PATH_LENGTH + 128]; - if(!Graphics()->LoadPng(Info, pPath, DirType)) - { - str_format(aError, sizeof(aError), "Failed to load community icon from '%s'", pPath); - Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "menus/browser", aError); - return false; - } - if(Info.m_Format != CImageInfo::FORMAT_RGBA) - { - Info.Free(); - str_format(aError, sizeof(aError), "Failed to load community icon from '%s': must be an RGBA image", pPath); - Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "menus/browser", aError); - return false; - } - if(!Storage()->CalculateHashes(pPath, DirType, &Sha256)) - { - Info.Free(); - str_format(aError, sizeof(aError), "Failed to load community icon from '%s': could not calculate hash", pPath); - Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "menus/browser", aError); - return false; - } - return true; -} - -void CMenus::LoadCommunityIconFinish(const char *pCommunityId, CImageInfo &Info, const SHA256_DIGEST &Sha256) -{ - SCommunityIcon CommunityIcon; - str_copy(CommunityIcon.m_aCommunityId, pCommunityId); - CommunityIcon.m_Sha256 = Sha256; - CommunityIcon.m_OrgTexture = Graphics()->LoadTextureRaw(Info, 0, pCommunityId); - - ConvertToGrayscale(Info); - CommunityIcon.m_GreyTexture = Graphics()->LoadTextureRawMove(Info, 0, pCommunityId); - - auto ExistingIcon = std::find_if(m_vCommunityIcons.begin(), m_vCommunityIcons.end(), [pCommunityId](const SCommunityIcon &Element) { - return str_comp(Element.m_aCommunityId, pCommunityId) == 0; - }); - if(ExistingIcon == m_vCommunityIcons.end()) - { - m_vCommunityIcons.push_back(CommunityIcon); - } - else - { - Graphics()->UnloadTexture(&ExistingIcon->m_OrgTexture); - Graphics()->UnloadTexture(&ExistingIcon->m_GreyTexture); - *ExistingIcon = CommunityIcon; - } - - char aBuf[CServerInfo::MAX_COMMUNITY_ID_LENGTH + 32]; - str_format(aBuf, sizeof(aBuf), "Loaded community icon '%s'", pCommunityId); - Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "menus/browser", aBuf); -} - -void CMenus::RenderCommunityIcon(const SCommunityIcon *pIcon, CUIRect Rect, bool Active) -{ - Rect.VMargin(Rect.w / 2.0f - Rect.h, &Rect); - - Graphics()->TextureSet(Active ? pIcon->m_OrgTexture : pIcon->m_GreyTexture); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, Active ? 1.0f : 0.5f); - IGraphics::CQuadItem QuadItem(Rect.x, Rect.y, Rect.w, Rect.h); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); -} - -void CMenus::UpdateCommunityIcons() -{ - // Update load jobs (icon is loaded from existing file) - if(!m_CommunityIconLoadJobs.empty()) - { - std::shared_ptr pJob = m_CommunityIconLoadJobs.front(); - if(pJob->Done()) - { - if(pJob->Success()) - LoadCommunityIconFinish(pJob->CommunityId(), pJob->ImageInfo(), pJob->Sha256()); - m_CommunityIconLoadJobs.pop_front(); - } - - // Don't start download jobs until all load jobs are done - if(!m_CommunityIconLoadJobs.empty()) - return; - } - - // Update download jobs (icon is downloaded and loaded from new file) - if(!m_CommunityIconDownloadJobs.empty()) - { - std::shared_ptr pJob = m_CommunityIconDownloadJobs.front(); - if(pJob->Done()) - { - if(pJob->State() == EHttpState::DONE) - { - std::shared_ptr pLoadJob = std::make_shared(this, pJob->CommunityId(), IStorage::TYPE_SAVE); - Engine()->AddJob(pLoadJob); - m_CommunityIconLoadJobs.push_back(pLoadJob); - } - m_CommunityIconDownloadJobs.pop_front(); - } - } - - // Rescan for changed communities only when necessary - if(!ServerBrowser()->DDNetInfoAvailable() || (m_CommunityIconsInfoSha256 != SHA256_ZEROED && m_CommunityIconsInfoSha256 == ServerBrowser()->DDNetInfoSha256())) - return; - m_CommunityIconsInfoSha256 = ServerBrowser()->DDNetInfoSha256(); - - // Remove icons for removed communities - auto RemovalIterator = m_vCommunityIcons.begin(); - while(RemovalIterator != m_vCommunityIcons.end()) - { - if(ServerBrowser()->Community(RemovalIterator->m_aCommunityId) == nullptr) - { - Graphics()->UnloadTexture(&RemovalIterator->m_OrgTexture); - Graphics()->UnloadTexture(&RemovalIterator->m_GreyTexture); - RemovalIterator = m_vCommunityIcons.erase(RemovalIterator); - } - else - { - ++RemovalIterator; - } - } - - // Find added and updated community icons - for(const auto &Community : ServerBrowser()->Communities()) - { - if(str_comp(Community.Id(), IServerBrowser::COMMUNITY_NONE) == 0) - continue; - auto ExistingIcon = std::find_if(m_vCommunityIcons.begin(), m_vCommunityIcons.end(), [Community](const auto &Element) { - return str_comp(Element.m_aCommunityId, Community.Id()) == 0; - }); - auto pExistingDownload = std::find_if(m_CommunityIconDownloadJobs.begin(), m_CommunityIconDownloadJobs.end(), [Community](const auto &Element) { - return str_comp(Element->CommunityId(), Community.Id()) == 0; - }); - if(pExistingDownload == m_CommunityIconDownloadJobs.end() && (ExistingIcon == m_vCommunityIcons.end() || ExistingIcon->m_Sha256 != Community.IconSha256())) - { - std::shared_ptr pJob = std::make_shared(this, Community.Id(), Community.IconUrl(), Community.IconSha256()); - Http()->Run(pJob); - m_CommunityIconDownloadJobs.push_back(pJob); - } - } -} diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp deleted file mode 100644 index e5213460c8..0000000000 --- a/src/game/client/components/menus_demo.cpp +++ /dev/null @@ -1,1631 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "maplayers.h" -#include "menus.h" - -#include - -using namespace FontIcons; -using namespace std::chrono_literals; - -int CMenus::DoButton_FontIcon(CButtonContainer *pButtonContainer, const char *pText, int Checked, const CUIRect *pRect, int Corners, bool Enabled) -{ - pRect->Draw(ColorRGBA(1.0f, 1.0f, 1.0f, (Checked ? 0.10f : 0.5f) * Ui()->ButtonColorMul(pButtonContainer)), Corners, 5.0f); - - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING); - TextRender()->TextOutlineColor(TextRender()->DefaultTextOutlineColor()); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - CUIRect Temp; - pRect->HMargin(2.0f, &Temp); - Ui()->DoLabel(&Temp, pText, Temp.h * CUi::ms_FontmodHeight, TEXTALIGN_MC); - - if(!Enabled) - { - TextRender()->TextColor(ColorRGBA(1.0f, 0.0f, 0.0f, 1.0f)); - TextRender()->TextOutlineColor(ColorRGBA(0.0f, 0.0f, 0.0f, 0.0f)); - Ui()->DoLabel(&Temp, FONT_ICON_SLASH, Temp.h * CUi::ms_FontmodHeight, TEXTALIGN_MC); - TextRender()->TextOutlineColor(TextRender()->DefaultTextOutlineColor()); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - } - - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - - return Ui()->DoButtonLogic(pButtonContainer, Checked, pRect); -} - -bool CMenus::DemoFilterChat(const void *pData, int Size, void *pUser) -{ - bool DoFilterChat = *(bool *)pUser; - if(!DoFilterChat) - { - return false; - } - - CUnpacker Unpacker; - Unpacker.Reset(pData, Size); - - int Msg = Unpacker.GetInt(); - int Sys = Msg & 1; - Msg >>= 1; - - return !Unpacker.Error() && !Sys && Msg == NETMSGTYPE_SV_CHAT; -} - -void CMenus::HandleDemoSeeking(float PositionToSeek, float TimeToSeek) -{ - if((PositionToSeek >= 0.0f && PositionToSeek <= 1.0f) || TimeToSeek != 0.0f) - { - m_pClient->m_Chat.Reset(); - m_pClient->m_DamageInd.OnReset(); - m_pClient->m_InfoMessages.OnReset(); - m_pClient->m_Particles.OnReset(); - m_pClient->m_Sounds.OnReset(); - m_pClient->m_Scoreboard.OnReset(); - m_pClient->m_Statboard.OnReset(); - m_pClient->m_SuppressEvents = true; - if(TimeToSeek != 0.0f) - DemoPlayer()->SeekTime(TimeToSeek); - else - DemoPlayer()->SeekPercent(PositionToSeek); - m_pClient->m_SuppressEvents = false; - if(!DemoPlayer()->BaseInfo()->m_Paused && PositionToSeek == 1.0f) - DemoPlayer()->Pause(); - } -} - -void CMenus::DemoSeekTick(IDemoPlayer::ETickOffset TickOffset) -{ - m_pClient->m_SuppressEvents = true; - DemoPlayer()->SeekTick(TickOffset); - m_pClient->m_SuppressEvents = false; - DemoPlayer()->Pause(); -} - -void CMenus::RenderDemoPlayer(CUIRect MainView) -{ - const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); - const int CurrentTick = pInfo->m_CurrentTick - pInfo->m_FirstTick; - const int TotalTicks = pInfo->m_LastTick - pInfo->m_FirstTick; - - // When rendering a demo and starting paused, render the pause indicator permanently. -#if defined(CONF_VIDEORECORDER) - const bool VideoRendering = IVideo::Current() != nullptr; - bool InitialVideoPause = VideoRendering && m_LastPauseChange < 0.0f && pInfo->m_Paused; -#else - const bool VideoRendering = false; - bool InitialVideoPause = false; -#endif - - const auto &&UpdateLastPauseChange = [&]() { - // Immediately hide the pause indicator when unpausing the initial pause when rendering a demo. - m_LastPauseChange = InitialVideoPause ? 0.0f : Client()->GlobalTime(); - InitialVideoPause = false; - }; - const auto &&UpdateLastSpeedChange = [&]() { - m_LastSpeedChange = Client()->GlobalTime(); - }; - - // threshold value, accounts for slight inaccuracy when setting demo position - constexpr int Threshold = 10; - const auto &&FindPreviousMarkerPosition = [&]() { - for(int i = pInfo->m_NumTimelineMarkers - 1; i >= 0; i--) - { - if((pInfo->m_aTimelineMarkers[i] - pInfo->m_FirstTick) < CurrentTick && absolute(((pInfo->m_aTimelineMarkers[i] - pInfo->m_FirstTick) - CurrentTick)) > Threshold) - { - return (float)(pInfo->m_aTimelineMarkers[i] - pInfo->m_FirstTick) / TotalTicks; - } - } - return 0.0f; - }; - const auto &&FindNextMarkerPosition = [&]() { - for(int i = 0; i < pInfo->m_NumTimelineMarkers; i++) - { - if((pInfo->m_aTimelineMarkers[i] - pInfo->m_FirstTick) > CurrentTick && absolute(((pInfo->m_aTimelineMarkers[i] - pInfo->m_FirstTick) - CurrentTick)) > Threshold) - { - return (float)(pInfo->m_aTimelineMarkers[i] - pInfo->m_FirstTick) / TotalTicks; - } - } - return 1.0f; - }; - - static int s_SkipDurationIndex = 1; - static const int s_aSkipDurationsSeconds[] = {1, 5, 10, 30, 60, 5 * 60, 10 * 60}; - const int DemoLengthSeconds = TotalTicks / Client()->GameTickSpeed(); - int NumDurationLabels = 0; - for(size_t i = 0; i < std::size(s_aSkipDurationsSeconds); ++i) - { - if(s_aSkipDurationsSeconds[i] >= DemoLengthSeconds) - break; - NumDurationLabels = i + 1; - } - if(NumDurationLabels > 0 && s_SkipDurationIndex >= NumDurationLabels) - s_SkipDurationIndex = maximum(0, NumDurationLabels - 1); - - // handle keyboard shortcuts independent of active menu - float PositionToSeek = -1.0f; - float TimeToSeek = 0.0f; - if(m_pClient->m_GameConsole.IsClosed() && m_DemoPlayerState == DEMOPLAYER_NONE && g_Config.m_ClDemoKeyboardShortcuts && !Ui()->IsPopupOpen()) - { - // increase/decrease speed - if(!Input()->ModifierIsPressed() && !Input()->ShiftIsPressed() && !Input()->AltIsPressed()) - { - if(Input()->KeyPress(KEY_UP) || (m_MenuActive && Input()->KeyPress(KEY_MOUSE_WHEEL_UP))) - { - DemoPlayer()->AdjustSpeedIndex(+1); - UpdateLastSpeedChange(); - } - else if(Input()->KeyPress(KEY_DOWN) || (m_MenuActive && Input()->KeyPress(KEY_MOUSE_WHEEL_DOWN))) - { - DemoPlayer()->AdjustSpeedIndex(-1); - UpdateLastSpeedChange(); - } - } - - // pause/unpause - if(Input()->KeyPress(KEY_SPACE) || Input()->KeyPress(KEY_RETURN) || Input()->KeyPress(KEY_KP_ENTER) || Input()->KeyPress(KEY_K)) - { - if(pInfo->m_Paused) - { - DemoPlayer()->Unpause(); - } - else - { - DemoPlayer()->Pause(); - } - UpdateLastPauseChange(); - } - - // seek backward/forward configured time - if(Input()->KeyPress(KEY_LEFT) || Input()->KeyPress(KEY_J)) - { - if(Input()->ModifierIsPressed()) - PositionToSeek = FindPreviousMarkerPosition(); - else if(Input()->ShiftIsPressed()) - s_SkipDurationIndex = maximum(s_SkipDurationIndex - 1, 0); - else - TimeToSeek = -s_aSkipDurationsSeconds[s_SkipDurationIndex]; - } - else if(Input()->KeyPress(KEY_RIGHT) || Input()->KeyPress(KEY_L)) - { - if(Input()->ModifierIsPressed()) - PositionToSeek = FindNextMarkerPosition(); - else if(Input()->ShiftIsPressed()) - s_SkipDurationIndex = minimum(s_SkipDurationIndex + 1, NumDurationLabels - 1); - else - TimeToSeek = s_aSkipDurationsSeconds[s_SkipDurationIndex]; - } - - // seek to 0-90% - const int aSeekPercentKeys[] = {KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9}; - for(unsigned i = 0; i < std::size(aSeekPercentKeys); i++) - { - if(Input()->KeyPress(aSeekPercentKeys[i])) - { - PositionToSeek = i * 0.1f; - break; - } - } - - // seek to the beginning/end - if(Input()->KeyPress(KEY_HOME)) - { - PositionToSeek = 0.0f; - } - else if(Input()->KeyPress(KEY_END)) - { - PositionToSeek = 1.0f; - } - - // Advance single frame forward/backward with period/comma key - if(Input()->KeyPress(KEY_PERIOD)) - { - DemoSeekTick(IDemoPlayer::TICK_NEXT); - } - else if(Input()->KeyPress(KEY_COMMA)) - { - DemoSeekTick(IDemoPlayer::TICK_PREVIOUS); - } - } - - const float SeekBarHeight = 15.0f; - const float ButtonbarHeight = 20.0f; - const float NameBarHeight = 20.0f; - const float Margins = 5.0f; - const float TotalHeight = SeekBarHeight + ButtonbarHeight + NameBarHeight + Margins * 3; - - if(!m_MenuActive) - { - // Render pause indicator - if(g_Config.m_ClDemoShowPause && (InitialVideoPause || (!VideoRendering && Client()->GlobalTime() - m_LastPauseChange < 0.5f))) - { - const float Time = InitialVideoPause ? 0.5f : ((Client()->GlobalTime() - m_LastPauseChange) / 0.5f); - const float Alpha = (Time < 0.5f ? Time : (1.0f - Time)) * 2.0f; - if(Alpha > 0.0f) - { - TextRender()->TextColor(TextRender()->DefaultTextColor().WithMultipliedAlpha(Alpha)); - TextRender()->TextOutlineColor(TextRender()->DefaultTextOutlineColor().WithMultipliedAlpha(Alpha)); - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING); - Ui()->DoLabel(Ui()->Screen(), pInfo->m_Paused ? FONT_ICON_PAUSE : FONT_ICON_PLAY, 36.0f + Time * 12.0f, TEXTALIGN_MC); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - TextRender()->TextOutlineColor(TextRender()->DefaultTextOutlineColor()); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - TextRender()->SetRenderFlags(0); - } - } - - // Render speed info - if(g_Config.m_ClDemoShowSpeed && Client()->GlobalTime() - m_LastSpeedChange < 1.0f) - { - CUIRect Screen = *Ui()->Screen(); - - char aSpeedBuf[16]; - str_format(aSpeedBuf, sizeof(aSpeedBuf), "×%.2f", pInfo->m_Speed); - TextRender()->Text(120.0f, Screen.y + Screen.h - 120.0f - TotalHeight, 60.0f, aSpeedBuf, -1.0f); - } - } - else - { - if(m_LastPauseChange > 0.0f) - m_LastPauseChange = 0.0f; - if(m_LastSpeedChange > 0.0f) - m_LastSpeedChange = 0.0f; - } - - if(CurrentTick == TotalTicks) - { - DemoPlayer()->Pause(); - PositionToSeek = 0.0f; - UpdateLastPauseChange(); - } - - if(!m_MenuActive) - { - HandleDemoSeeking(PositionToSeek, TimeToSeek); - return; - } - - CUIRect DemoControls; - MainView.HSplitBottom(TotalHeight, nullptr, &DemoControls); - DemoControls.VSplitLeft(50.0f, nullptr, &DemoControls); - DemoControls.VSplitLeft(600.0f, &DemoControls, nullptr); - const CUIRect DemoControlsOriginal = DemoControls; - DemoControls.x += m_DemoControlsPositionOffset.x; - DemoControls.y += m_DemoControlsPositionOffset.y; - int Corners = IGraphics::CORNER_NONE; - if(DemoControls.x > 0.0f && DemoControls.y > 0.0f) - Corners |= IGraphics::CORNER_TL; - if(DemoControls.x < MainView.w - DemoControls.w && DemoControls.y > 0.0f) - Corners |= IGraphics::CORNER_TR; - if(DemoControls.x > 0.0f && DemoControls.y < MainView.h - DemoControls.h) - Corners |= IGraphics::CORNER_BL; - if(DemoControls.x < MainView.w - DemoControls.w && DemoControls.y < MainView.h - DemoControls.h) - Corners |= IGraphics::CORNER_BR; - DemoControls.Draw(ms_ColorTabbarActive, Corners, 10.0f); - const CUIRect DemoControlsDragRect = DemoControls; - - CUIRect SeekBar, ButtonBar, NameBar, SpeedBar; - DemoControls.Margin(5.0f, &DemoControls); - DemoControls.HSplitTop(SeekBarHeight, &SeekBar, &ButtonBar); - ButtonBar.HSplitTop(Margins, nullptr, &ButtonBar); - ButtonBar.HSplitBottom(NameBarHeight, &ButtonBar, &NameBar); - NameBar.HSplitTop(4.0f, nullptr, &NameBar); - - // handle draggable demo controls - { - enum EDragOperation - { - OP_NONE, - OP_DRAGGING, - OP_CLICKED - }; - static EDragOperation s_Operation = OP_NONE; - static vec2 s_InitialMouse = vec2(0.0f, 0.0f); - - bool Clicked; - bool Abrupted; - if(int Result = Ui()->DoDraggableButtonLogic(&s_Operation, 8, &DemoControlsDragRect, &Clicked, &Abrupted)) - { - if(s_Operation == OP_NONE && Result == 1) - { - s_InitialMouse = Ui()->MousePos(); - s_Operation = OP_CLICKED; - } - - if(Clicked || Abrupted) - s_Operation = OP_NONE; - - if(s_Operation == OP_CLICKED && length(Ui()->MousePos() - s_InitialMouse) > 5.0f) - { - s_Operation = OP_DRAGGING; - s_InitialMouse -= m_DemoControlsPositionOffset; - } - - if(s_Operation == OP_DRAGGING) - { - m_DemoControlsPositionOffset = Ui()->MousePos() - s_InitialMouse; - m_DemoControlsPositionOffset.x = clamp(m_DemoControlsPositionOffset.x, -DemoControlsOriginal.x, MainView.w - DemoControlsDragRect.w - DemoControlsOriginal.x); - m_DemoControlsPositionOffset.y = clamp(m_DemoControlsPositionOffset.y, -DemoControlsOriginal.y, MainView.h - DemoControlsDragRect.h - DemoControlsOriginal.y); - } - } - } - - // do seekbar - { - const float Rounding = 5.0f; - - static int s_SeekBarId = 0; - void *pId = &s_SeekBarId; - char aBuffer[128]; - - // draw seek bar - SeekBar.Draw(ColorRGBA(0, 0, 0, 0.5f), IGraphics::CORNER_ALL, Rounding); - - // draw filled bar - float Amount = CurrentTick / (float)TotalTicks; - CUIRect FilledBar = SeekBar; - FilledBar.w = 2 * Rounding + (FilledBar.w - 2 * Rounding) * Amount; - FilledBar.Draw(ColorRGBA(1, 1, 1, 0.5f), IGraphics::CORNER_ALL, Rounding); - - // draw highlighting - if(g_Config.m_ClDemoSliceBegin != -1 && g_Config.m_ClDemoSliceEnd != -1) - { - float RatioBegin = (g_Config.m_ClDemoSliceBegin - pInfo->m_FirstTick) / (float)TotalTicks; - float RatioEnd = (g_Config.m_ClDemoSliceEnd - pInfo->m_FirstTick) / (float)TotalTicks; - float Span = ((SeekBar.w - 2 * Rounding) * RatioEnd) - ((SeekBar.w - 2 * Rounding) * RatioBegin); - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.0f, 0.0f, 0.0f, 0.25f); - IGraphics::CQuadItem QuadItem(2 * Rounding + SeekBar.x + (SeekBar.w - 2 * Rounding) * RatioBegin, SeekBar.y, Span, SeekBar.h); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); - } - - // draw markers - for(int i = 0; i < pInfo->m_NumTimelineMarkers; i++) - { - float Ratio = (pInfo->m_aTimelineMarkers[i] - pInfo->m_FirstTick) / (float)TotalTicks; - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - IGraphics::CQuadItem QuadItem(2 * Rounding + SeekBar.x + (SeekBar.w - 2 * Rounding) * Ratio, SeekBar.y, Ui()->PixelSize(), SeekBar.h); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); - } - - // draw slice markers - // begin - if(g_Config.m_ClDemoSliceBegin != -1) - { - float Ratio = (g_Config.m_ClDemoSliceBegin - pInfo->m_FirstTick) / (float)TotalTicks; - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.0f, 0.0f, 0.0f, 1.0f); - IGraphics::CQuadItem QuadItem(2 * Rounding + SeekBar.x + (SeekBar.w - 2 * Rounding) * Ratio, SeekBar.y, Ui()->PixelSize(), SeekBar.h); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); - } - - // end - if(g_Config.m_ClDemoSliceEnd != -1) - { - float Ratio = (g_Config.m_ClDemoSliceEnd - pInfo->m_FirstTick) / (float)TotalTicks; - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.0f, 0.0f, 0.0f, 1.0f); - IGraphics::CQuadItem QuadItem(2 * Rounding + SeekBar.x + (SeekBar.w - 2 * Rounding) * Ratio, SeekBar.y, Ui()->PixelSize(), SeekBar.h); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); - } - - // draw time - char aCurrentTime[32]; - str_time((int64_t)CurrentTick / Client()->GameTickSpeed() * 100, TIME_HOURS, aCurrentTime, sizeof(aCurrentTime)); - char aTotalTime[32]; - str_time((int64_t)TotalTicks / Client()->GameTickSpeed() * 100, TIME_HOURS, aTotalTime, sizeof(aTotalTime)); - str_format(aBuffer, sizeof(aBuffer), "%s / %s", aCurrentTime, aTotalTime); - Ui()->DoLabel(&SeekBar, aBuffer, SeekBar.h * 0.70f, TEXTALIGN_MC); - - // do the logic - const bool Inside = Ui()->MouseInside(&SeekBar); - - if(Ui()->CheckActiveItem(pId)) - { - if(!Ui()->MouseButton(0)) - Ui()->SetActiveItem(nullptr); - else - { - static float s_PrevAmount = 0.0f; - float AmountSeek = clamp((Ui()->MouseX() - SeekBar.x - Rounding) / (SeekBar.w - 2 * Rounding), 0.0f, 1.0f); - - if(Input()->ShiftIsPressed()) - { - AmountSeek = s_PrevAmount + (AmountSeek - s_PrevAmount) * 0.05f; - if(AmountSeek >= 0.0f && AmountSeek <= 1.0f && absolute(s_PrevAmount - AmountSeek) >= 0.0001f) - { - PositionToSeek = AmountSeek; - } - } - else - { - if(AmountSeek >= 0.0f && AmountSeek <= 1.0f && absolute(s_PrevAmount - AmountSeek) >= 0.001f) - { - s_PrevAmount = AmountSeek; - PositionToSeek = AmountSeek; - } - } - } - } - else if(Ui()->HotItem() == pId) - { - if(Ui()->MouseButton(0)) - { - Ui()->SetActiveItem(pId); - } - } - - if(Inside && !Ui()->MouseButton(0)) - Ui()->SetHotItem(pId); - - if(Ui()->HotItem() == pId) - { - const int HoveredTick = (int)(clamp((Ui()->MouseX() - SeekBar.x - Rounding) / (SeekBar.w - 2 * Rounding), 0.0f, 1.0f) * TotalTicks); - static char s_aHoveredTime[32]; - str_time((int64_t)HoveredTick / Client()->GameTickSpeed() * 100, TIME_HOURS, s_aHoveredTime, sizeof(s_aHoveredTime)); - GameClient()->m_Tooltips.DoToolTip(pId, &SeekBar, s_aHoveredTime); - } - } - - bool IncreaseDemoSpeed = false, DecreaseDemoSpeed = false; - - // do buttons - CUIRect Button; - - // combined play and pause button - ButtonBar.VSplitLeft(ButtonbarHeight, &Button, &ButtonBar); - static CButtonContainer s_PlayPauseButton; - if(DoButton_FontIcon(&s_PlayPauseButton, pInfo->m_Paused ? FONT_ICON_PLAY : FONT_ICON_PAUSE, false, &Button, IGraphics::CORNER_ALL)) - { - if(pInfo->m_Paused) - { - DemoPlayer()->Unpause(); - } - else - { - DemoPlayer()->Pause(); - } - UpdateLastPauseChange(); - } - GameClient()->m_Tooltips.DoToolTip(&s_PlayPauseButton, &Button, pInfo->m_Paused ? Localize("Play the current demo") : Localize("Pause the current demo")); - - // stop button - ButtonBar.VSplitLeft(Margins, nullptr, &ButtonBar); - ButtonBar.VSplitLeft(ButtonbarHeight, &Button, &ButtonBar); - static CButtonContainer s_ResetButton; - if(DoButton_FontIcon(&s_ResetButton, FONT_ICON_STOP, false, &Button, IGraphics::CORNER_ALL)) - { - DemoPlayer()->Pause(); - PositionToSeek = 0.0f; - } - GameClient()->m_Tooltips.DoToolTip(&s_ResetButton, &Button, Localize("Stop the current demo")); - - // skip time back - ButtonBar.VSplitLeft(Margins + 10.0f, nullptr, &ButtonBar); - ButtonBar.VSplitLeft(ButtonbarHeight, &Button, &ButtonBar); - static CButtonContainer s_TimeBackButton; - if(DoButton_FontIcon(&s_TimeBackButton, FONT_ICON_BACKWARD, 0, &Button, IGraphics::CORNER_ALL)) - { - TimeToSeek = -s_aSkipDurationsSeconds[s_SkipDurationIndex]; - } - GameClient()->m_Tooltips.DoToolTip(&s_TimeBackButton, &Button, Localize("Go back the specified duration")); - - // skip time dropdown - if(NumDurationLabels >= 2) - { - ButtonBar.VSplitLeft(Margins, nullptr, &ButtonBar); - ButtonBar.VSplitLeft(4 * ButtonbarHeight, &Button, &ButtonBar); - - static std::vector s_vDurationNames; - static std::vector s_vpDurationNames; - s_vDurationNames.resize(NumDurationLabels); - s_vpDurationNames.resize(NumDurationLabels); - - for(int i = 0; i < NumDurationLabels; ++i) - { - char aBuf[256]; - if(s_aSkipDurationsSeconds[i] >= 60) - str_format(aBuf, sizeof(aBuf), Localize("%d min.", "Demo player duration"), s_aSkipDurationsSeconds[i] / 60); - else - str_format(aBuf, sizeof(aBuf), Localize("%d sec.", "Demo player duration"), s_aSkipDurationsSeconds[i]); - s_vDurationNames[i] = aBuf; - s_vpDurationNames[i] = s_vDurationNames[i].c_str(); - } - - static CUi::SDropDownState s_SkipDurationDropDownState; - static CScrollRegion s_SkipDurationDropDownScrollRegion; - s_SkipDurationDropDownState.m_SelectionPopupContext.m_pScrollRegion = &s_SkipDurationDropDownScrollRegion; - s_SkipDurationIndex = Ui()->DoDropDown(&Button, s_SkipDurationIndex, s_vpDurationNames.data(), NumDurationLabels, s_SkipDurationDropDownState); - GameClient()->m_Tooltips.DoToolTip(&s_SkipDurationDropDownState.m_ButtonContainer, &Button, Localize("Change the skip duration")); - } - - // skip time forward - ButtonBar.VSplitLeft(Margins, nullptr, &ButtonBar); - ButtonBar.VSplitLeft(ButtonbarHeight, &Button, &ButtonBar); - static CButtonContainer s_TimeForwardButton; - if(DoButton_FontIcon(&s_TimeForwardButton, FONT_ICON_FORWARD, 0, &Button, IGraphics::CORNER_ALL)) - { - TimeToSeek = s_aSkipDurationsSeconds[s_SkipDurationIndex]; - } - GameClient()->m_Tooltips.DoToolTip(&s_TimeForwardButton, &Button, Localize("Go forward the specified duration")); - - // one tick back - ButtonBar.VSplitLeft(Margins + 10.0f, nullptr, &ButtonBar); - ButtonBar.VSplitLeft(ButtonbarHeight, &Button, &ButtonBar); - static CButtonContainer s_OneTickBackButton; - if(DoButton_FontIcon(&s_OneTickBackButton, FONT_ICON_BACKWARD_STEP, 0, &Button, IGraphics::CORNER_ALL)) - { - DemoSeekTick(IDemoPlayer::TICK_PREVIOUS); - } - GameClient()->m_Tooltips.DoToolTip(&s_OneTickBackButton, &Button, Localize("Go back one tick")); - - // one tick forward - ButtonBar.VSplitLeft(Margins, nullptr, &ButtonBar); - ButtonBar.VSplitLeft(ButtonbarHeight, &Button, &ButtonBar); - static CButtonContainer s_OneTickForwardButton; - if(DoButton_FontIcon(&s_OneTickForwardButton, FONT_ICON_FORWARD_STEP, 0, &Button, IGraphics::CORNER_ALL)) - { - DemoSeekTick(IDemoPlayer::TICK_NEXT); - } - GameClient()->m_Tooltips.DoToolTip(&s_OneTickForwardButton, &Button, Localize("Go forward one tick")); - - // one marker back - ButtonBar.VSplitLeft(Margins + 10.0f, nullptr, &ButtonBar); - ButtonBar.VSplitLeft(ButtonbarHeight, &Button, &ButtonBar); - static CButtonContainer s_OneMarkerBackButton; - if(DoButton_FontIcon(&s_OneMarkerBackButton, FONT_ICON_BACKWARD_FAST, 0, &Button, IGraphics::CORNER_ALL)) - { - PositionToSeek = FindPreviousMarkerPosition(); - } - GameClient()->m_Tooltips.DoToolTip(&s_OneMarkerBackButton, &Button, Localize("Go back one marker")); - - // one marker forward - ButtonBar.VSplitLeft(Margins, nullptr, &ButtonBar); - ButtonBar.VSplitLeft(ButtonbarHeight, &Button, &ButtonBar); - static CButtonContainer s_OneMarkerForwardButton; - if(DoButton_FontIcon(&s_OneMarkerForwardButton, FONT_ICON_FORWARD_FAST, 0, &Button, IGraphics::CORNER_ALL)) - { - PositionToSeek = FindNextMarkerPosition(); - } - GameClient()->m_Tooltips.DoToolTip(&s_OneMarkerForwardButton, &Button, Localize("Go forward one marker")); - - // slowdown - ButtonBar.VSplitLeft(Margins + 10.0f, 0, &ButtonBar); - ButtonBar.VSplitLeft(ButtonbarHeight, &Button, &ButtonBar); - static CButtonContainer s_SlowDownButton; - if(DoButton_FontIcon(&s_SlowDownButton, FONT_ICON_CHEVRON_DOWN, 0, &Button, IGraphics::CORNER_ALL)) - DecreaseDemoSpeed = true; - GameClient()->m_Tooltips.DoToolTip(&s_SlowDownButton, &Button, Localize("Slow down the demo")); - - // fastforward - ButtonBar.VSplitLeft(Margins, 0, &ButtonBar); - ButtonBar.VSplitLeft(ButtonbarHeight, &Button, &ButtonBar); - static CButtonContainer s_SpeedUpButton; - if(DoButton_FontIcon(&s_SpeedUpButton, FONT_ICON_CHEVRON_UP, 0, &Button, IGraphics::CORNER_ALL)) - IncreaseDemoSpeed = true; - GameClient()->m_Tooltips.DoToolTip(&s_SpeedUpButton, &Button, Localize("Speed up the demo")); - - // speed meter - ButtonBar.VSplitLeft(Margins * 12, &SpeedBar, &ButtonBar); - char aBuffer[64]; - str_format(aBuffer, sizeof(aBuffer), "×%g", pInfo->m_Speed); - Ui()->DoLabel(&SpeedBar, aBuffer, Button.h * 0.7f, TEXTALIGN_MC); - - // slice begin button - ButtonBar.VSplitLeft(ButtonbarHeight, &Button, &ButtonBar); - static CButtonContainer s_SliceBeginButton; - const int SliceBeginButtonResult = DoButton_FontIcon(&s_SliceBeginButton, FONT_ICON_RIGHT_FROM_BRACKET, 0, &Button, IGraphics::CORNER_ALL); - if(SliceBeginButtonResult == 1) - { - Client()->DemoSliceBegin(); - if(CurrentTick > (g_Config.m_ClDemoSliceEnd - pInfo->m_FirstTick)) - g_Config.m_ClDemoSliceEnd = -1; - } - else if(SliceBeginButtonResult == 2) - { - g_Config.m_ClDemoSliceBegin = -1; - } - GameClient()->m_Tooltips.DoToolTip(&s_SliceBeginButton, &Button, Localize("Mark the beginning of a cut (right click to reset)")); - - // slice end button - ButtonBar.VSplitLeft(Margins, nullptr, &ButtonBar); - ButtonBar.VSplitLeft(ButtonbarHeight, &Button, &ButtonBar); - static CButtonContainer s_SliceEndButton; - const int SliceEndButtonResult = DoButton_FontIcon(&s_SliceEndButton, FONT_ICON_RIGHT_TO_BRACKET, 0, &Button, IGraphics::CORNER_ALL); - if(SliceEndButtonResult == 1) - { - Client()->DemoSliceEnd(); - if(CurrentTick < (g_Config.m_ClDemoSliceBegin - pInfo->m_FirstTick)) - g_Config.m_ClDemoSliceBegin = -1; - } - else if(SliceEndButtonResult == 2) - { - g_Config.m_ClDemoSliceEnd = -1; - } - GameClient()->m_Tooltips.DoToolTip(&s_SliceEndButton, &Button, Localize("Mark the end of a cut (right click to reset)")); - - // slice save button -#if defined(CONF_VIDEORECORDER) - const bool SliceEnabled = IVideo::Current() == nullptr; -#else - const bool SliceEnabled = true; -#endif - ButtonBar.VSplitLeft(Margins, nullptr, &ButtonBar); - ButtonBar.VSplitLeft(ButtonbarHeight, &Button, &ButtonBar); - static CButtonContainer s_SliceSaveButton; - if(DoButton_FontIcon(&s_SliceSaveButton, FONT_ICON_ARROW_UP_RIGHT_FROM_SQUARE, 0, &Button, IGraphics::CORNER_ALL, SliceEnabled) && SliceEnabled) - { - char aDemoName[IO_MAX_PATH_LENGTH]; - DemoPlayer()->GetDemoName(aDemoName, sizeof(aDemoName)); - m_DemoSliceInput.Set(aDemoName); - Ui()->SetActiveItem(&m_DemoSliceInput); - m_DemoPlayerState = DEMOPLAYER_SLICE_SAVE; - } - GameClient()->m_Tooltips.DoToolTip(&s_SliceSaveButton, &Button, Localize("Export cut as a separate demo")); - - // close button - ButtonBar.VSplitRight(ButtonbarHeight, &ButtonBar, &Button); - static CButtonContainer s_ExitButton; - if(DoButton_FontIcon(&s_ExitButton, FONT_ICON_XMARK, 0, &Button) || (Input()->KeyPress(KEY_C) && m_pClient->m_GameConsole.IsClosed() && m_DemoPlayerState == DEMOPLAYER_NONE)) - { - Client()->Disconnect(); - DemolistOnUpdate(false); - } - GameClient()->m_Tooltips.DoToolTip(&s_ExitButton, &Button, Localize("Close the demo player")); - - // toggle keyboard shortcuts button - ButtonBar.VSplitRight(Margins, &ButtonBar, nullptr); - ButtonBar.VSplitRight(ButtonbarHeight, &ButtonBar, &Button); - static CButtonContainer s_KeyboardShortcutsButton; - if(DoButton_FontIcon(&s_KeyboardShortcutsButton, FONT_ICON_KEYBOARD, 0, &Button, IGraphics::CORNER_ALL, g_Config.m_ClDemoKeyboardShortcuts != 0)) - { - g_Config.m_ClDemoKeyboardShortcuts ^= 1; - } - GameClient()->m_Tooltips.DoToolTip(&s_KeyboardShortcutsButton, &Button, Localize("Toggle keyboard shortcuts")); - - // auto camera button (only available when it is possible to use) - if(m_pClient->m_Camera.CanUseAutoSpecCamera()) - { - ButtonBar.VSplitRight(Margins, &ButtonBar, nullptr); - ButtonBar.VSplitRight(ButtonbarHeight, &ButtonBar, &Button); - static CButtonContainer s_AutoCameraButton; - if(DoButton_FontIcon(&s_AutoCameraButton, FONT_ICON_CAMERA, 0, &Button, IGraphics::CORNER_ALL, m_pClient->m_Camera.m_AutoSpecCamera)) - { - m_pClient->m_Camera.m_AutoSpecCamera = !m_pClient->m_Camera.m_AutoSpecCamera; - } - GameClient()->m_Tooltips.DoToolTip(&s_AutoCameraButton, &Button, Localize("Toggle auto camera")); - } - - // demo name - char aDemoName[IO_MAX_PATH_LENGTH]; - DemoPlayer()->GetDemoName(aDemoName, sizeof(aDemoName)); - char aBuf[IO_MAX_PATH_LENGTH + 128]; - str_format(aBuf, sizeof(aBuf), Localize("Demofile: %s"), aDemoName); - SLabelProperties Props; - Props.m_MaxWidth = NameBar.w; - Props.m_EllipsisAtEnd = true; - Props.m_EnableWidthCheck = false; - Ui()->DoLabel(&NameBar, aBuf, Button.h * 0.5f, TEXTALIGN_ML, Props); - - if(IncreaseDemoSpeed) - { - DemoPlayer()->AdjustSpeedIndex(+1); - UpdateLastSpeedChange(); - } - else if(DecreaseDemoSpeed) - { - DemoPlayer()->AdjustSpeedIndex(-1); - UpdateLastSpeedChange(); - } - - HandleDemoSeeking(PositionToSeek, TimeToSeek); - - // render popups - if(m_DemoPlayerState != DEMOPLAYER_NONE) - { - // prevent element under the active popup from being activated - Ui()->SetHotItem(nullptr); - } - if(m_DemoPlayerState == DEMOPLAYER_SLICE_SAVE) - { - RenderDemoPlayerSliceSavePopup(MainView); - } -} - -void CMenus::RenderDemoPlayerSliceSavePopup(CUIRect MainView) -{ - const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); - - CUIRect Box; - MainView.Margin(150.0f, &Box); - - // background - Box.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f), IGraphics::CORNER_ALL, 15.0f); - Box.Margin(24.0f, &Box); - - // title - CUIRect Title; - Box.HSplitTop(24.0f, &Title, &Box); - Box.HSplitTop(20.0f, nullptr, &Box); - Ui()->DoLabel(&Title, Localize("Export demo cut"), 24.0f, TEXTALIGN_MC); - - // slice times - CUIRect SliceTimesBar, SliceInterval, SliceLength; - Box.HSplitTop(24.0f, &SliceTimesBar, &Box); - SliceTimesBar.VSplitMid(&SliceInterval, &SliceLength, 40.0f); - Box.HSplitTop(20.0f, nullptr, &Box); - const int64_t RealSliceBegin = g_Config.m_ClDemoSliceBegin == -1 ? 0 : (g_Config.m_ClDemoSliceBegin - pInfo->m_FirstTick); - const int64_t RealSliceEnd = (g_Config.m_ClDemoSliceEnd == -1 ? pInfo->m_LastTick : g_Config.m_ClDemoSliceEnd) - pInfo->m_FirstTick; - char aSliceBegin[32]; - str_time(RealSliceBegin / Client()->GameTickSpeed() * 100, TIME_HOURS, aSliceBegin, sizeof(aSliceBegin)); - char aSliceEnd[32]; - str_time(RealSliceEnd / Client()->GameTickSpeed() * 100, TIME_HOURS, aSliceEnd, sizeof(aSliceEnd)); - char aSliceLength[32]; - str_time((RealSliceEnd - RealSliceBegin) / Client()->GameTickSpeed() * 100, TIME_HOURS, aSliceLength, sizeof(aSliceLength)); - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "%s: %s – %s", Localize("Cut interval"), aSliceBegin, aSliceEnd); - Ui()->DoLabel(&SliceInterval, aBuf, 18.0f, TEXTALIGN_ML); - str_format(aBuf, sizeof(aBuf), "%s: %s", Localize("Cut length"), aSliceLength); - Ui()->DoLabel(&SliceLength, aBuf, 18.0f, TEXTALIGN_ML); - - // file name - CUIRect NameLabel, NameBox; - Box.HSplitTop(24.0f, &NameLabel, &Box); - Box.HSplitTop(20.0f, nullptr, &Box); - NameLabel.VSplitLeft(150.0f, &NameLabel, &NameBox); - NameBox.VSplitLeft(20.0f, nullptr, &NameBox); - Ui()->DoLabel(&NameLabel, Localize("New name:"), 18.0f, TEXTALIGN_ML); - Ui()->DoEditBox(&m_DemoSliceInput, &NameBox, 12.0f); - - // remove chat checkbox - static int s_RemoveChat = 0; - - CUIRect CheckBoxBar, RemoveChatCheckBox, RenderCutCheckBox; - Box.HSplitTop(24.0f, &CheckBoxBar, &Box); - Box.HSplitTop(20.0f, nullptr, &Box); - CheckBoxBar.VSplitMid(&RemoveChatCheckBox, &RenderCutCheckBox, 40.0f); - if(DoButton_CheckBox(&s_RemoveChat, Localize("Remove chat"), s_RemoveChat, &RemoveChatCheckBox)) - { - s_RemoveChat ^= 1; - } -#if defined(CONF_VIDEORECORDER) - static int s_RenderCut = 0; - if(DoButton_CheckBox(&s_RenderCut, Localize("Render cut to video"), s_RenderCut, &RenderCutCheckBox)) - { - s_RenderCut ^= 1; - } -#endif - - // buttons - CUIRect ButtonBar, AbortButton, OkButton; - Box.HSplitBottom(24.0f, &Box, &ButtonBar); - ButtonBar.VSplitMid(&AbortButton, &OkButton, 40.0f); - - static CButtonContainer s_ButtonAbort; - if(DoButton_Menu(&s_ButtonAbort, Localize("Abort"), 0, &AbortButton) || (!Ui()->IsPopupOpen() && Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE))) - m_DemoPlayerState = DEMOPLAYER_NONE; - - static CUi::SConfirmPopupContext s_ConfirmPopupContext; - static CButtonContainer s_ButtonOk; - if(DoButton_Menu(&s_ButtonOk, Localize("Ok"), 0, &OkButton) || (!Ui()->IsPopupOpen() && Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER))) - { - if(str_endswith(m_DemoSliceInput.GetString(), ".demo")) - { - char aNameWithoutExt[IO_MAX_PATH_LENGTH]; - fs_split_file_extension(m_DemoSliceInput.GetString(), aNameWithoutExt, sizeof(aNameWithoutExt)); - m_DemoSliceInput.Set(aNameWithoutExt); - } - - char aDemoName[IO_MAX_PATH_LENGTH]; - DemoPlayer()->GetDemoName(aDemoName, sizeof(aDemoName)); - if(str_comp(aDemoName, m_DemoSliceInput.GetString()) == 0) - { - static CUi::SMessagePopupContext s_MessagePopupContext; - s_MessagePopupContext.ErrorColor(); - str_copy(s_MessagePopupContext.m_aMessage, Localize("Please use a different filename")); - Ui()->ShowPopupMessage(Ui()->MouseX(), OkButton.y + OkButton.h + 5.0f, &s_MessagePopupContext); - } - else - { - char aPath[IO_MAX_PATH_LENGTH]; - str_format(aPath, sizeof(aPath), "%s/%s.demo", m_aCurrentDemoFolder, m_DemoSliceInput.GetString()); - if(Storage()->FileExists(aPath, IStorage::TYPE_SAVE)) - { - s_ConfirmPopupContext.Reset(); - s_ConfirmPopupContext.YesNoButtons(); - str_copy(s_ConfirmPopupContext.m_aMessage, Localize("File already exists, do you want to overwrite it?")); - Ui()->ShowPopupConfirm(Ui()->MouseX(), OkButton.y + OkButton.h + 5.0f, &s_ConfirmPopupContext); - } - else - s_ConfirmPopupContext.m_Result = CUi::SConfirmPopupContext::CONFIRMED; - } - } - - if(s_ConfirmPopupContext.m_Result == CUi::SConfirmPopupContext::CONFIRMED) - { - char aPath[IO_MAX_PATH_LENGTH]; - str_format(aPath, sizeof(aPath), "%s/%s.demo", m_aCurrentDemoFolder, m_DemoSliceInput.GetString()); - str_copy(m_aCurrentDemoSelectionName, m_DemoSliceInput.GetString()); - if(str_endswith(m_aCurrentDemoSelectionName, ".demo")) - m_aCurrentDemoSelectionName[str_length(m_aCurrentDemoSelectionName) - str_length(".demo")] = '\0'; - - Client()->DemoSlice(aPath, CMenus::DemoFilterChat, &s_RemoveChat); - DemolistPopulate(); - DemolistOnUpdate(false); - m_DemoPlayerState = DEMOPLAYER_NONE; -#if defined(CONF_VIDEORECORDER) - if(s_RenderCut) - { - m_Popup = POPUP_RENDER_DEMO; - m_StartPaused = false; - m_DemoRenderInput.Set(m_aCurrentDemoSelectionName); - Ui()->SetActiveItem(&m_DemoRenderInput); - if(m_DemolistStorageType != IStorage::TYPE_ALL && m_DemolistStorageType != IStorage::TYPE_SAVE) - m_DemolistStorageType = IStorage::TYPE_ALL; // Select a storage type containing the sliced demo - } -#endif - } - if(s_ConfirmPopupContext.m_Result != CUi::SConfirmPopupContext::UNSET) - { - s_ConfirmPopupContext.Reset(); - } -} - -int CMenus::DemolistFetchCallback(const CFsFileInfo *pInfo, int IsDir, int StorageType, void *pUser) -{ - CMenus *pSelf = (CMenus *)pUser; - if(str_comp(pInfo->m_pName, ".") == 0 || - (str_comp(pInfo->m_pName, "..") == 0 && (pSelf->m_aCurrentDemoFolder[0] == '\0' || (!pSelf->m_DemolistMultipleStorages && str_comp(pSelf->m_aCurrentDemoFolder, "demos") == 0))) || - (!IsDir && !str_endswith(pInfo->m_pName, ".demo"))) - { - return 0; - } - - CDemoItem Item; - str_copy(Item.m_aFilename, pInfo->m_pName); - if(IsDir) - { - str_format(Item.m_aName, sizeof(Item.m_aName), "%s/", pInfo->m_pName); - Item.m_Date = 0; - } - else - { - str_truncate(Item.m_aName, sizeof(Item.m_aName), pInfo->m_pName, str_length(pInfo->m_pName) - str_length(".demo")); - Item.m_Date = pInfo->m_TimeModified; - } - Item.m_InfosLoaded = false; - Item.m_Valid = false; - Item.m_IsDir = IsDir != 0; - Item.m_IsLink = false; - Item.m_StorageType = StorageType; - pSelf->m_vDemos.push_back(Item); - - if(time_get_nanoseconds() - pSelf->m_DemoPopulateStartTime > 500ms) - { - pSelf->RenderLoading(Localize("Loading demo files"), "", 0); - } - - return 0; -} - -void CMenus::DemolistPopulate() -{ - m_vDemos.clear(); - - int NumStoragesWithDemos = 0; - for(int StorageType = IStorage::TYPE_SAVE; StorageType < Storage()->NumPaths(); ++StorageType) - { - if(Storage()->FolderExists("demos", StorageType)) - { - NumStoragesWithDemos++; - } - } - m_DemolistMultipleStorages = NumStoragesWithDemos > 1; - - if(m_aCurrentDemoFolder[0] == '\0') - { - { - CDemoItem Item; - str_copy(Item.m_aFilename, "demos"); - str_copy(Item.m_aName, Localize("All combined")); - Item.m_InfosLoaded = false; - Item.m_Valid = false; - Item.m_Date = 0; - Item.m_IsDir = true; - Item.m_IsLink = true; - Item.m_StorageType = IStorage::TYPE_ALL; - m_vDemos.push_back(Item); - } - - for(int StorageType = IStorage::TYPE_SAVE; StorageType < Storage()->NumPaths(); ++StorageType) - { - if(Storage()->FolderExists("demos", StorageType)) - { - CDemoItem Item; - str_copy(Item.m_aFilename, "demos"); - Storage()->GetCompletePath(StorageType, "demos", Item.m_aName, sizeof(Item.m_aName)); - str_append(Item.m_aName, "/", sizeof(Item.m_aName)); - Item.m_InfosLoaded = false; - Item.m_Valid = false; - Item.m_Date = 0; - Item.m_IsDir = true; - Item.m_IsLink = true; - Item.m_StorageType = StorageType; - m_vDemos.push_back(Item); - } - } - } - else - { - m_DemoPopulateStartTime = time_get_nanoseconds(); - Storage()->ListDirectoryInfo(m_DemolistStorageType, m_aCurrentDemoFolder, DemolistFetchCallback, this); - - if(g_Config.m_BrDemoFetchInfo) - FetchAllHeaders(); - - std::stable_sort(m_vDemos.begin(), m_vDemos.end()); - } - RefreshFilteredDemos(); -} - -void CMenus::RefreshFilteredDemos() -{ - m_vpFilteredDemos.clear(); - for(auto &Demo : m_vDemos) - { - if(str_find_nocase(Demo.m_aFilename, m_DemoSearchInput.GetString())) - { - m_vpFilteredDemos.push_back(&Demo); - } - } -} - -void CMenus::DemolistOnUpdate(bool Reset) -{ - if(Reset) - { - if(m_vpFilteredDemos.empty()) - { - m_DemolistSelectedIndex = -1; - m_aCurrentDemoSelectionName[0] = '\0'; - } - else - { - m_DemolistSelectedIndex = 0; - str_copy(m_aCurrentDemoSelectionName, m_vpFilteredDemos[m_DemolistSelectedIndex]->m_aName); - } - } - else - { - RefreshFilteredDemos(); - - // search for selected index - m_DemolistSelectedIndex = -1; - int SelectedIndex = -1; - for(const auto &pItem : m_vpFilteredDemos) - { - SelectedIndex++; - if(str_comp(m_aCurrentDemoSelectionName, pItem->m_aName) == 0) - { - m_DemolistSelectedIndex = SelectedIndex; - break; - } - } - } - - if(m_DemolistSelectedIndex >= 0) - m_DemolistSelectedReveal = true; -} - -bool CMenus::FetchHeader(CDemoItem &Item) -{ - if(!Item.m_InfosLoaded) - { - char aBuffer[IO_MAX_PATH_LENGTH]; - str_format(aBuffer, sizeof(aBuffer), "%s/%s", m_aCurrentDemoFolder, Item.m_aFilename); - Item.m_Valid = DemoPlayer()->GetDemoInfo(Storage(), nullptr, aBuffer, Item.m_StorageType, &Item.m_Info, &Item.m_TimelineMarkers, &Item.m_MapInfo); - Item.m_InfosLoaded = true; - } - return Item.m_Valid; -} - -void CMenus::FetchAllHeaders() -{ - for(auto &Item : m_vDemos) - { - FetchHeader(Item); - } - std::stable_sort(m_vDemos.begin(), m_vDemos.end()); -} - -void CMenus::RenderDemoBrowser(CUIRect MainView) -{ - GameClient()->m_MenuBackground.ChangePosition(CMenuBackground::POS_DEMOS); - - CUIRect ListView, DetailsView, ButtonsView; - MainView.Draw(ms_ColorTabbarActive, IGraphics::CORNER_B, 10.0f); - MainView.Margin(10.0f, &MainView); - MainView.HSplitBottom(22.0f * 2.0f + 5.0f, &ListView, &ButtonsView); - ListView.VSplitRight(205.0f, &ListView, &DetailsView); - ListView.VSplitRight(5.0f, &ListView, nullptr); - - bool WasListboxItemActivated; - RenderDemoBrowserList(ListView, WasListboxItemActivated); - RenderDemoBrowserDetails(DetailsView); - RenderDemoBrowserButtons(ButtonsView, WasListboxItemActivated); -} - -void CMenus::RenderDemoBrowserList(CUIRect ListView, bool &WasListboxItemActivated) -{ - if(!m_DemoBrowserListInitialized) - { - DemolistPopulate(); - DemolistOnUpdate(true); - m_DemoBrowserListInitialized = true; - } - -#if defined(CONF_VIDEORECORDER) - if(!m_DemoRenderInput.IsEmpty()) - { - if(DemoPlayer()->ErrorMessage()[0] == '\0') - { - m_Popup = POPUP_RENDER_DONE; - } - else - { - m_DemoRenderInput.Clear(); - } - } -#endif - - struct SColumn - { - int m_Id; - int m_Sort; - const char *m_pCaption; - int m_Direction; - float m_Width; - CUIRect m_Rect; - }; - - enum - { - COL_ICON = 0, - COL_DEMONAME, - COL_LENGTH, - COL_DATE, - }; - - static CListBox s_ListBox; - static SColumn s_aCols[] = { - {-1, -1, "", -1, 2.0f, {0}}, - {COL_ICON, -1, "", -1, ms_ListheaderHeight, {0}}, - {-1, -1, "", -1, 2.0f, {0}}, - {COL_DEMONAME, SORT_DEMONAME, Localizable("Demo"), 0, 0.0f, {0}}, - {-1, -1, "", 1, 2.0f, {0}}, - {COL_LENGTH, SORT_LENGTH, Localizable("Length"), 1, 75.0f, {0}}, - {-1, -1, "", 1, 2.0f, {0}}, - {COL_DATE, SORT_DATE, Localizable("Date"), 1, 150.0f, {0}}, - {-1, -1, "", 1, s_ListBox.ScrollbarWidthMax(), {0}}, - }; - - CUIRect Headers, ListBox; - ListView.HSplitTop(ms_ListheaderHeight, &Headers, &ListBox); - Headers.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_T, 5.0f); - ListBox.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.15f), IGraphics::CORNER_B, 5.0f); - - for(auto &Col : s_aCols) - { - if(Col.m_Direction == -1) - { - Headers.VSplitLeft(Col.m_Width, &Col.m_Rect, &Headers); - } - } - - for(int i = std::size(s_aCols) - 1; i >= 0; i--) - { - if(s_aCols[i].m_Direction == 1) - { - Headers.VSplitRight(s_aCols[i].m_Width, &Headers, &s_aCols[i].m_Rect); - } - } - - for(auto &Col : s_aCols) - { - if(Col.m_Direction == 0) - Col.m_Rect = Headers; - } - - for(auto &Col : s_aCols) - { - if(Col.m_pCaption[0] != '\0' && Col.m_Sort != -1) - { - if(DoButton_GridHeader(&Col.m_Id, Localize(Col.m_pCaption), g_Config.m_BrDemoSort == Col.m_Sort, &Col.m_Rect)) - { - if(g_Config.m_BrDemoSort == Col.m_Sort) - g_Config.m_BrDemoSortOrder ^= 1; - else - g_Config.m_BrDemoSortOrder = 0; - g_Config.m_BrDemoSort = Col.m_Sort; - // Don't rescan in order to keep fetched headers, just resort - std::stable_sort(m_vDemos.begin(), m_vDemos.end()); - DemolistOnUpdate(false); - } - } - } - - if(m_DemolistSelectedReveal) - { - s_ListBox.ScrollToSelected(); - m_DemolistSelectedReveal = false; - } - - s_ListBox.DoStart(ms_ListheaderHeight, m_vpFilteredDemos.size(), 1, 3, m_DemolistSelectedIndex, &ListBox, false, IGraphics::CORNER_ALL, true); - - char aBuf[64]; - int ItemIndex = -1; - for(auto &pItem : m_vpFilteredDemos) - { - ItemIndex++; - - const CListboxItem ListItem = s_ListBox.DoNextItem(pItem, ItemIndex == m_DemolistSelectedIndex); - if(!ListItem.m_Visible) - continue; - - for(const auto &Col : s_aCols) - { - CUIRect Button; - Button.x = Col.m_Rect.x; - Button.y = ListItem.m_Rect.y; - Button.h = ListItem.m_Rect.h; - Button.w = Col.m_Rect.w; - - if(Col.m_Id == COL_ICON) - { - Button.Margin(1.0f, &Button); - - const char *pIconType; - if(pItem->m_IsLink || str_comp(pItem->m_aFilename, "..") == 0) - pIconType = FONT_ICON_FOLDER_TREE; - else if(pItem->m_IsDir) - pIconType = FONT_ICON_FOLDER; - else - pIconType = FONT_ICON_FILM; - - ColorRGBA IconColor; - if(!pItem->m_IsDir && (!pItem->m_InfosLoaded || !pItem->m_Valid)) - IconColor = ColorRGBA(0.6f, 0.6f, 0.6f, 1.0f); // not loaded - else - IconColor = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->TextColor(IconColor); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING); - Ui()->DoLabel(&Button, pIconType, 12.0f, TEXTALIGN_ML); - TextRender()->SetRenderFlags(0); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - } - else if(Col.m_Id == COL_DEMONAME) - { - SLabelProperties Props; - Props.m_MaxWidth = Button.w; - Props.m_EllipsisAtEnd = true; - Props.m_EnableWidthCheck = false; - Ui()->DoLabel(&Button, pItem->m_aName, 12.0f, TEXTALIGN_ML, Props); - } - else if(Col.m_Id == COL_LENGTH && !pItem->m_IsDir && pItem->m_Valid) - { - str_time((int64_t)pItem->Length() * 100, TIME_HOURS, aBuf, sizeof(aBuf)); - Button.VMargin(4.0f, &Button); - Ui()->DoLabel(&Button, aBuf, 12.0f, TEXTALIGN_MR); - } - else if(Col.m_Id == COL_DATE && !pItem->m_IsDir) - { - str_timestamp_ex(pItem->m_Date, aBuf, sizeof(aBuf), FORMAT_SPACE); - Button.VMargin(4.0f, &Button); - Ui()->DoLabel(&Button, aBuf, 12.0f, TEXTALIGN_MR); - } - } - } - - const int NewSelected = s_ListBox.DoEnd(); - if(NewSelected != m_DemolistSelectedIndex) - { - m_DemolistSelectedIndex = NewSelected; - if(m_DemolistSelectedIndex >= 0) - str_copy(m_aCurrentDemoSelectionName, m_vpFilteredDemos[m_DemolistSelectedIndex]->m_aName); - DemolistOnUpdate(false); - } - - WasListboxItemActivated = s_ListBox.WasItemActivated(); -} - -void CMenus::RenderDemoBrowserDetails(CUIRect DetailsView) -{ - CUIRect Contents, Header; - DetailsView.HSplitTop(ms_ListheaderHeight, &Header, &Contents); - Contents.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.15f), IGraphics::CORNER_B, 5.0f); - Contents.Margin(5.0f, &Contents); - - const float FontSize = 12.0f; - CDemoItem *pItem = m_DemolistSelectedIndex >= 0 ? m_vpFilteredDemos[m_DemolistSelectedIndex] : nullptr; - - Header.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_T, 5.0f); - const char *pHeaderLabel; - if(pItem == nullptr) - pHeaderLabel = Localize("No demo selected"); - else if(str_comp(pItem->m_aFilename, "..") == 0) - pHeaderLabel = Localize("Parent Folder"); - else if(pItem->m_IsLink) - pHeaderLabel = Localize("Folder Link"); - else if(pItem->m_IsDir) - pHeaderLabel = Localize("Folder"); - else if(!FetchHeader(*pItem)) - pHeaderLabel = Localize("Invalid Demo"); - else - pHeaderLabel = Localize("Demo"); - Ui()->DoLabel(&Header, pHeaderLabel, FontSize + 2.0f, TEXTALIGN_MC); - - if(pItem == nullptr || pItem->m_IsDir) - return; - - char aBuf[256]; - CUIRect Left, Right; - - Contents.HSplitTop(18.0f, &Left, &Contents); - Ui()->DoLabel(&Left, Localize("Created"), FontSize, TEXTALIGN_ML); - str_timestamp_ex(pItem->m_Date, aBuf, sizeof(aBuf), FORMAT_SPACE); - Contents.HSplitTop(18.0f, &Left, &Contents); - Ui()->DoLabel(&Left, aBuf, FontSize - 1.0f, TEXTALIGN_ML); - Contents.HSplitTop(4.0f, nullptr, &Contents); - - if(!pItem->m_Valid) - return; - - Contents.HSplitTop(18.0f, &Left, &Contents); - Left.VSplitMid(&Left, &Right, 4.0f); - Ui()->DoLabel(&Left, Localize("Type"), FontSize, TEXTALIGN_ML); - Ui()->DoLabel(&Right, Localize("Version"), FontSize, TEXTALIGN_ML); - Contents.HSplitTop(18.0f, &Left, &Contents); - Left.VSplitMid(&Left, &Right, 4.0f); - Ui()->DoLabel(&Left, pItem->m_Info.m_aType, FontSize - 1.0f, TEXTALIGN_ML); - str_format(aBuf, sizeof(aBuf), "%d", pItem->m_Info.m_Version); - Ui()->DoLabel(&Right, aBuf, FontSize - 1.0f, TEXTALIGN_ML); - Contents.HSplitTop(4.0f, nullptr, &Contents); - - Contents.HSplitTop(18.0f, &Left, &Contents); - Left.VSplitMid(&Left, &Right, 4.0f); - Ui()->DoLabel(&Left, Localize("Length"), FontSize, TEXTALIGN_ML); - Ui()->DoLabel(&Right, Localize("Markers"), FontSize, TEXTALIGN_ML); - Contents.HSplitTop(18.0f, &Left, &Contents); - Left.VSplitMid(&Left, &Right, 4.0f); - str_time((int64_t)pItem->Length() * 100, TIME_HOURS, aBuf, sizeof(aBuf)); - Ui()->DoLabel(&Left, aBuf, FontSize - 1.0f, TEXTALIGN_ML); - str_format(aBuf, sizeof(aBuf), "%d", pItem->NumMarkers()); - Ui()->DoLabel(&Right, aBuf, FontSize - 1.0f, TEXTALIGN_ML); - Contents.HSplitTop(4.0f, nullptr, &Contents); - - Contents.HSplitTop(18.0f, &Left, &Contents); - Ui()->DoLabel(&Left, Localize("Netversion"), FontSize, TEXTALIGN_ML); - Contents.HSplitTop(18.0f, &Left, &Contents); - Ui()->DoLabel(&Left, pItem->m_Info.m_aNetversion, FontSize - 1.0f, TEXTALIGN_ML); - Contents.HSplitTop(16.0f, nullptr, &Contents); - - Contents.HSplitTop(18.0f, &Left, &Contents); - Ui()->DoLabel(&Left, Localize("Map"), FontSize, TEXTALIGN_ML); - Contents.HSplitTop(18.0f, &Left, &Contents); - Ui()->DoLabel(&Left, pItem->m_Info.m_aMapName, FontSize - 1.0f, TEXTALIGN_ML); - Contents.HSplitTop(4.0f, nullptr, &Contents); - - Contents.HSplitTop(18.0f, &Left, &Contents); - Ui()->DoLabel(&Left, Localize("Size"), FontSize, TEXTALIGN_ML); - Contents.HSplitTop(18.0f, &Left, &Contents); - const float Size = pItem->Size() / 1024.0f; - if(Size == 0.0f) - str_copy(aBuf, Localize("map not included", "Demo details")); - else if(Size > 1024) - str_format(aBuf, sizeof(aBuf), Localize("%.2f MiB"), Size / 1024.0f); - else - str_format(aBuf, sizeof(aBuf), Localize("%.2f KiB"), Size); - Ui()->DoLabel(&Left, aBuf, FontSize - 1.0f, TEXTALIGN_ML); - Contents.HSplitTop(4.0f, nullptr, &Contents); - - Contents.HSplitTop(18.0f, &Left, &Contents); - if(pItem->m_MapInfo.m_Sha256 != SHA256_ZEROED) - { - Ui()->DoLabel(&Left, "SHA256", FontSize, TEXTALIGN_ML); - Contents.HSplitTop(18.0f, &Left, &Contents); - char aSha[SHA256_MAXSTRSIZE]; - sha256_str(pItem->m_MapInfo.m_Sha256, aSha, sizeof(aSha)); - SLabelProperties Props; - Props.m_MaxWidth = Left.w; - Props.m_EllipsisAtEnd = true; - Props.m_EnableWidthCheck = false; - Ui()->DoLabel(&Left, aSha, FontSize - 1.0f, TEXTALIGN_ML, Props); - } - else - { - Ui()->DoLabel(&Left, "CRC32", FontSize, TEXTALIGN_ML); - Contents.HSplitTop(18.0f, &Left, &Contents); - str_format(aBuf, sizeof(aBuf), "%08x", pItem->m_MapInfo.m_Crc); - Ui()->DoLabel(&Left, aBuf, FontSize - 1.0f, TEXTALIGN_ML); - } - Contents.HSplitTop(4.0f, nullptr, &Contents); -} - -void CMenus::RenderDemoBrowserButtons(CUIRect ButtonsView, bool WasListboxItemActivated) -{ - const auto &&SetIconMode = [&](bool Enable) { - if(Enable) - { - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - } - else - { - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - } - }; - - CUIRect ButtonBarTop, ButtonBarBottom; - ButtonsView.HSplitTop(5.0f, nullptr, &ButtonsView); - ButtonsView.HSplitMid(&ButtonBarTop, &ButtonBarBottom, 5.0f); - - // quick search - { - CUIRect DemoSearch; - ButtonBarTop.VSplitLeft(ButtonBarBottom.h * 21.0f, &DemoSearch, &ButtonBarTop); - ButtonBarTop.VSplitLeft(ButtonBarTop.h / 2.0f, nullptr, &ButtonBarTop); - if(Ui()->DoEditBox_Search(&m_DemoSearchInput, &DemoSearch, 14.0f, !Ui()->IsPopupOpen() && m_pClient->m_GameConsole.IsClosed())) - { - RefreshFilteredDemos(); - DemolistOnUpdate(false); - } - } - - // refresh button - { - CUIRect RefreshButton; - ButtonBarBottom.VSplitLeft(ButtonBarBottom.h * 3.0f, &RefreshButton, &ButtonBarBottom); - ButtonBarBottom.VSplitLeft(ButtonBarBottom.h / 2.0f, nullptr, &ButtonBarBottom); - SetIconMode(true); - static CButtonContainer s_RefreshButton; - if(DoButton_Menu(&s_RefreshButton, FONT_ICON_ARROW_ROTATE_RIGHT, 0, &RefreshButton) || Input()->KeyPress(KEY_F5) || (Input()->KeyPress(KEY_R) && Input()->ModifierIsPressed())) - { - SetIconMode(false); - DemolistPopulate(); - DemolistOnUpdate(false); - } - SetIconMode(false); - } - - // fetch info checkbox - { - CUIRect FetchInfo; - ButtonBarBottom.VSplitLeft(ButtonBarBottom.h * 7.0f, &FetchInfo, &ButtonBarBottom); - ButtonBarBottom.VSplitLeft(ButtonBarBottom.h / 2.0f, nullptr, &ButtonBarBottom); - if(DoButton_CheckBox(&g_Config.m_BrDemoFetchInfo, Localize("Fetch Info"), g_Config.m_BrDemoFetchInfo, &FetchInfo)) - { - g_Config.m_BrDemoFetchInfo ^= 1; - if(g_Config.m_BrDemoFetchInfo) - FetchAllHeaders(); - } - } - - // demos directory button - if(m_DemolistSelectedIndex >= 0 && m_vpFilteredDemos[m_DemolistSelectedIndex]->m_StorageType != IStorage::TYPE_ALL) - { - CUIRect DemosDirectoryButton; - ButtonBarBottom.VSplitLeft(ButtonBarBottom.h * 10.0f, &DemosDirectoryButton, &ButtonBarBottom); - ButtonBarBottom.VSplitLeft(ButtonBarBottom.h / 2.0f, nullptr, &ButtonBarBottom); - static CButtonContainer s_DemosDirectoryButton; - if(DoButton_Menu(&s_DemosDirectoryButton, Localize("Demos directory"), 0, &DemosDirectoryButton)) - { - char aBuf[IO_MAX_PATH_LENGTH]; - Storage()->GetCompletePath(m_DemolistSelectedIndex >= 0 ? m_vpFilteredDemos[m_DemolistSelectedIndex]->m_StorageType : IStorage::TYPE_SAVE, m_aCurrentDemoFolder[0] == '\0' ? "demos" : m_aCurrentDemoFolder, aBuf, sizeof(aBuf)); - Client()->ViewFile(aBuf); - } - GameClient()->m_Tooltips.DoToolTip(&s_DemosDirectoryButton, &DemosDirectoryButton, Localize("Open the directory that contains the demo files")); - } - - // play/open button - if(m_DemolistSelectedIndex >= 0) - { - CUIRect PlayButton; - ButtonBarBottom.VSplitRight(ButtonBarBottom.h * 3.0f, &ButtonBarBottom, &PlayButton); - ButtonBarBottom.VSplitRight(ButtonBarBottom.h, &ButtonBarBottom, nullptr); - SetIconMode(true); - static CButtonContainer s_PlayButton; - if(DoButton_Menu(&s_PlayButton, (m_DemolistSelectedIndex >= 0 && m_vpFilteredDemos[m_DemolistSelectedIndex]->m_IsDir) ? FONT_ICON_FOLDER_OPEN : FONT_ICON_PLAY, 0, &PlayButton) || WasListboxItemActivated || Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER) || (Input()->KeyPress(KEY_P) && m_pClient->m_GameConsole.IsClosed() && !m_DemoSearchInput.IsActive())) - { - SetIconMode(false); - if(m_vpFilteredDemos[m_DemolistSelectedIndex]->m_IsDir) // folder - { - m_DemoSearchInput.Clear(); - const bool ParentFolder = str_comp(m_vpFilteredDemos[m_DemolistSelectedIndex]->m_aFilename, "..") == 0; - if(ParentFolder) // parent folder - { - str_copy(m_aCurrentDemoSelectionName, fs_filename(m_aCurrentDemoFolder)); - str_append(m_aCurrentDemoSelectionName, "/"); - if(fs_parent_dir(m_aCurrentDemoFolder)) - { - m_aCurrentDemoFolder[0] = '\0'; - if(m_DemolistStorageType == IStorage::TYPE_ALL) - { - m_aCurrentDemoSelectionName[0] = '\0'; // will select first list item - } - else - { - Storage()->GetCompletePath(m_DemolistStorageType, "demos", m_aCurrentDemoSelectionName, sizeof(m_aCurrentDemoSelectionName)); - str_append(m_aCurrentDemoSelectionName, "/"); - } - } - } - else // sub folder - { - if(m_aCurrentDemoFolder[0] != '\0') - str_append(m_aCurrentDemoFolder, "/"); - else - m_DemolistStorageType = m_vpFilteredDemos[m_DemolistSelectedIndex]->m_StorageType; - str_append(m_aCurrentDemoFolder, m_vpFilteredDemos[m_DemolistSelectedIndex]->m_aFilename); - } - DemolistPopulate(); - DemolistOnUpdate(!ParentFolder); - } - else // file - { - char aBuf[IO_MAX_PATH_LENGTH]; - str_format(aBuf, sizeof(aBuf), "%s/%s", m_aCurrentDemoFolder, m_vpFilteredDemos[m_DemolistSelectedIndex]->m_aFilename); - const char *pError = Client()->DemoPlayer_Play(aBuf, m_vpFilteredDemos[m_DemolistSelectedIndex]->m_StorageType); - m_LastPauseChange = -1.0f; - m_LastSpeedChange = -1.0f; - if(pError) - { - PopupMessage(Localize("Error loading demo"), pError, Localize("Ok")); - } - else - { - Ui()->SetActiveItem(nullptr); - return; - } - } - } - SetIconMode(false); - - if(m_aCurrentDemoFolder[0] != '\0') - { - if(str_comp(m_vpFilteredDemos[m_DemolistSelectedIndex]->m_aFilename, "..") != 0 && m_vpFilteredDemos[m_DemolistSelectedIndex]->m_StorageType == IStorage::TYPE_SAVE) - { - // rename button - CUIRect RenameButton; - ButtonBarBottom.VSplitRight(ButtonBarBottom.h * 3.0f, &ButtonBarBottom, &RenameButton); - ButtonBarBottom.VSplitRight(ButtonBarBottom.h / 2.0f, &ButtonBarBottom, nullptr); - SetIconMode(true); - static CButtonContainer s_RenameButton; - if(DoButton_Menu(&s_RenameButton, FONT_ICON_PENCIL, 0, &RenameButton)) - { - SetIconMode(false); - m_Popup = POPUP_RENAME_DEMO; - if(m_vpFilteredDemos[m_DemolistSelectedIndex]->m_IsDir) - { - m_DemoRenameInput.Set(m_vpFilteredDemos[m_DemolistSelectedIndex]->m_aFilename); - } - else - { - char aNameWithoutExt[IO_MAX_PATH_LENGTH]; - fs_split_file_extension(m_vpFilteredDemos[m_DemolistSelectedIndex]->m_aFilename, aNameWithoutExt, sizeof(aNameWithoutExt)); - m_DemoRenameInput.Set(aNameWithoutExt); - } - Ui()->SetActiveItem(&m_DemoRenameInput); - return; - } - - // delete button - static CButtonContainer s_DeleteButton; - CUIRect DeleteButton; - ButtonBarBottom.VSplitRight(ButtonBarBottom.h * 3.0f, &ButtonBarBottom, &DeleteButton); - ButtonBarBottom.VSplitRight(ButtonBarBottom.h / 2.0f, &ButtonBarBottom, nullptr); - if(DoButton_Menu(&s_DeleteButton, FONT_ICON_TRASH, 0, &DeleteButton) || Ui()->ConsumeHotkey(CUi::HOTKEY_DELETE) || (Input()->KeyPress(KEY_D) && m_pClient->m_GameConsole.IsClosed() && !m_DemoSearchInput.IsActive())) - { - SetIconMode(false); - char aBuf[128 + IO_MAX_PATH_LENGTH]; - str_format(aBuf, sizeof(aBuf), m_vpFilteredDemos[m_DemolistSelectedIndex]->m_IsDir ? Localize("Are you sure that you want to delete the folder '%s'?") : Localize("Are you sure that you want to delete the demo '%s'?"), m_vpFilteredDemos[m_DemolistSelectedIndex]->m_aFilename); - PopupConfirm(m_vpFilteredDemos[m_DemolistSelectedIndex]->m_IsDir ? Localize("Delete folder") : Localize("Delete demo"), aBuf, Localize("Yes"), Localize("No"), m_vpFilteredDemos[m_DemolistSelectedIndex]->m_IsDir ? &CMenus::PopupConfirmDeleteFolder : &CMenus::PopupConfirmDeleteDemo); - return; - } - SetIconMode(false); - } - -#if defined(CONF_VIDEORECORDER) - // render demo button - if(!m_vpFilteredDemos[m_DemolistSelectedIndex]->m_IsDir) - { - CUIRect RenderButton; - ButtonBarTop.VSplitRight(ButtonBarBottom.h * 3.0f, &ButtonBarTop, &RenderButton); - ButtonBarTop.VSplitRight(ButtonBarBottom.h, &ButtonBarTop, nullptr); - SetIconMode(true); - static CButtonContainer s_RenderButton; - if(DoButton_Menu(&s_RenderButton, FONT_ICON_VIDEO, 0, &RenderButton) || (Input()->KeyPress(KEY_R) && m_pClient->m_GameConsole.IsClosed() && !m_DemoSearchInput.IsActive())) - { - SetIconMode(false); - m_Popup = POPUP_RENDER_DEMO; - m_StartPaused = false; - char aNameWithoutExt[IO_MAX_PATH_LENGTH]; - fs_split_file_extension(m_vpFilteredDemos[m_DemolistSelectedIndex]->m_aFilename, aNameWithoutExt, sizeof(aNameWithoutExt)); - m_DemoRenderInput.Set(aNameWithoutExt); - Ui()->SetActiveItem(&m_DemoRenderInput); - return; - } - SetIconMode(false); - } -#endif - } - } -} - -void CMenus::PopupConfirmDeleteDemo() -{ - char aBuf[IO_MAX_PATH_LENGTH]; - str_format(aBuf, sizeof(aBuf), "%s/%s", m_aCurrentDemoFolder, m_vpFilteredDemos[m_DemolistSelectedIndex]->m_aFilename); - if(Storage()->RemoveFile(aBuf, m_vpFilteredDemos[m_DemolistSelectedIndex]->m_StorageType)) - { - DemolistPopulate(); - DemolistOnUpdate(false); - } - else - { - char aError[128 + IO_MAX_PATH_LENGTH]; - str_format(aError, sizeof(aError), Localize("Unable to delete the demo '%s'"), m_vpFilteredDemos[m_DemolistSelectedIndex]->m_aFilename); - PopupMessage(Localize("Error"), aError, Localize("Ok")); - } -} - -void CMenus::PopupConfirmDeleteFolder() -{ - char aBuf[IO_MAX_PATH_LENGTH]; - str_format(aBuf, sizeof(aBuf), "%s/%s", m_aCurrentDemoFolder, m_vpFilteredDemos[m_DemolistSelectedIndex]->m_aFilename); - if(Storage()->RemoveFolder(aBuf, m_vpFilteredDemos[m_DemolistSelectedIndex]->m_StorageType)) - { - DemolistPopulate(); - DemolistOnUpdate(false); - } - else - { - char aError[128 + IO_MAX_PATH_LENGTH]; - str_format(aError, sizeof(aError), Localize("Unable to delete the folder '%s'. Make sure it's empty first."), m_vpFilteredDemos[m_DemolistSelectedIndex]->m_aFilename); - PopupMessage(Localize("Error"), aError, Localize("Ok")); - } -} diff --git a/src/game/client/components/menus_ingame.cpp b/src/game/client/components/menus_ingame.cpp deleted file mode 100644 index a939df196c..0000000000 --- a/src/game/client/components/menus_ingame.cpp +++ /dev/null @@ -1,1519 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "menus.h" -#include "motd.h" -#include "voting.h" - -#include "ghost.h" -#include -#include - -#include - -using namespace FontIcons; -using namespace std::chrono_literals; - -void CMenus::RenderGame(CUIRect MainView) -{ - CUIRect Button, ButtonBars, ButtonBar, ButtonBar2; - bool ShowDDRaceButtons = MainView.w > 855.0f; - MainView.HSplitTop(45.0f + (g_Config.m_ClTouchControls ? 35.0f : 0.0f), &ButtonBars, &MainView); - ButtonBars.Draw(ms_ColorTabbarActive, IGraphics::CORNER_B, 10.0f); - ButtonBars.Margin(10.0f, &ButtonBars); - ButtonBars.HSplitTop(25.0f, &ButtonBar, &ButtonBars); - if(g_Config.m_ClTouchControls) - { - ButtonBars.HSplitTop(10.0f, nullptr, &ButtonBars); - ButtonBars.HSplitTop(25.0f, &ButtonBar2, &ButtonBars); - } - - ButtonBar.VSplitRight(120.0f, &ButtonBar, &Button); - static CButtonContainer s_DisconnectButton; - if(DoButton_Menu(&s_DisconnectButton, Localize("Disconnect"), 0, &Button)) - { - if(GameClient()->CurrentRaceTime() / 60 >= g_Config.m_ClConfirmDisconnectTime && g_Config.m_ClConfirmDisconnectTime >= 0) - { - PopupConfirm(Localize("Disconnect"), Localize("Are you sure that you want to disconnect?"), Localize("Yes"), Localize("No"), &CMenus::PopupConfirmDisconnect); - } - else - { - Client()->Disconnect(); - RefreshBrowserTab(true); - } - } - - ButtonBar.VSplitRight(5.0f, &ButtonBar, nullptr); - ButtonBar.VSplitRight(170.0f, &ButtonBar, &Button); - - static CButtonContainer s_DummyButton; - if(!Client()->DummyAllowed()) - { - DoButton_Menu(&s_DummyButton, Localize("Connect Dummy"), 1, &Button); - GameClient()->m_Tooltips.DoToolTip(&s_DummyButton, &Button, Localize("Dummy is not allowed on this server")); - } - else if(Client()->DummyConnectingDelayed()) - { - DoButton_Menu(&s_DummyButton, Localize("Connect Dummy"), 1, &Button); - GameClient()->m_Tooltips.DoToolTip(&s_DummyButton, &Button, Localize("Please wait…")); - } - else if(Client()->DummyConnecting()) - { - DoButton_Menu(&s_DummyButton, Localize("Connecting dummy"), 1, &Button); - } - else if(DoButton_Menu(&s_DummyButton, Client()->DummyConnected() ? Localize("Disconnect Dummy") : Localize("Connect Dummy"), 0, &Button)) - { - if(!Client()->DummyConnected()) - { - Client()->DummyConnect(); - } - else - { - if(GameClient()->CurrentRaceTime() / 60 >= g_Config.m_ClConfirmDisconnectTime && g_Config.m_ClConfirmDisconnectTime >= 0) - { - PopupConfirm(Localize("Disconnect Dummy"), Localize("Are you sure that you want to disconnect your dummy?"), Localize("Yes"), Localize("No"), &CMenus::PopupConfirmDisconnectDummy); - } - else - { - Client()->DummyDisconnect(0); - SetActive(false); - } - } - } - - ButtonBar.VSplitRight(5.0f, &ButtonBar, nullptr); - ButtonBar.VSplitRight(140.0f, &ButtonBar, &Button); - static CButtonContainer s_DemoButton; - const bool Recording = DemoRecorder(RECORDER_MANUAL)->IsRecording(); - if(DoButton_Menu(&s_DemoButton, Recording ? Localize("Stop record") : Localize("Record demo"), 0, &Button)) - { - if(!Recording) - Client()->DemoRecorder_Start(Client()->GetCurrentMap(), true, RECORDER_MANUAL); - else - Client()->DemoRecorder(RECORDER_MANUAL)->Stop(IDemoRecorder::EStopMode::KEEP_FILE); - } - - bool Paused = false; - bool Spec = false; - if(m_pClient->m_Snap.m_LocalClientId >= 0) - { - Paused = m_pClient->m_aClients[m_pClient->m_Snap.m_LocalClientId].m_Paused; - Spec = m_pClient->m_aClients[m_pClient->m_Snap.m_LocalClientId].m_Spec; - } - - if(m_pClient->m_Snap.m_pLocalInfo && m_pClient->m_Snap.m_pGameInfoObj && !Paused && !Spec) - { - if(m_pClient->m_Snap.m_pLocalInfo->m_Team != TEAM_SPECTATORS) - { - ButtonBar.VSplitLeft(120.0f, &Button, &ButtonBar); - ButtonBar.VSplitLeft(5.0f, nullptr, &ButtonBar); - static CButtonContainer s_SpectateButton; - if(!Client()->DummyConnecting() && DoButton_Menu(&s_SpectateButton, Localize("Spectate"), 0, &Button)) - { - if(g_Config.m_ClDummy == 0 || Client()->DummyConnected()) - { - m_pClient->SendSwitchTeam(TEAM_SPECTATORS); - SetActive(false); - } - } - } - - if(m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS) - { - if(m_pClient->m_Snap.m_pLocalInfo->m_Team != TEAM_RED) - { - ButtonBar.VSplitLeft(120.0f, &Button, &ButtonBar); - ButtonBar.VSplitLeft(5.0f, nullptr, &ButtonBar); - static CButtonContainer s_JoinRedButton; - if(!Client()->DummyConnecting() && DoButton_Menu(&s_JoinRedButton, Localize("Join red"), 0, &Button)) - { - m_pClient->SendSwitchTeam(TEAM_RED); - SetActive(false); - } - } - - if(m_pClient->m_Snap.m_pLocalInfo->m_Team != TEAM_BLUE) - { - ButtonBar.VSplitLeft(120.0f, &Button, &ButtonBar); - ButtonBar.VSplitLeft(5.0f, nullptr, &ButtonBar); - static CButtonContainer s_JoinBlueButton; - if(!Client()->DummyConnecting() && DoButton_Menu(&s_JoinBlueButton, Localize("Join blue"), 0, &Button)) - { - m_pClient->SendSwitchTeam(TEAM_BLUE); - SetActive(false); - } - } - } - else - { - if(m_pClient->m_Snap.m_pLocalInfo->m_Team != TEAM_RED) - { - ButtonBar.VSplitLeft(120.0f, &Button, &ButtonBar); - ButtonBar.VSplitLeft(5.0f, nullptr, &ButtonBar); - static CButtonContainer s_JoinGameButton; - if(!Client()->DummyConnecting() && DoButton_Menu(&s_JoinGameButton, Localize("Join game"), 0, &Button)) - { - m_pClient->SendSwitchTeam(TEAM_RED); - SetActive(false); - } - } - } - - if(m_pClient->m_Snap.m_pLocalInfo->m_Team != TEAM_SPECTATORS && (ShowDDRaceButtons || !(m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS))) - { - ButtonBar.VSplitLeft(65.0f, &Button, &ButtonBar); - ButtonBar.VSplitLeft(5.0f, nullptr, &ButtonBar); - - static CButtonContainer s_KillButton; - if(DoButton_Menu(&s_KillButton, Localize("Kill"), 0, &Button)) - { - m_pClient->SendKill(-1); - SetActive(false); - } - } - } - - if(m_pClient->m_ReceivedDDNetPlayer && m_pClient->m_Snap.m_pLocalInfo && m_pClient->m_Snap.m_pGameInfoObj && (ShowDDRaceButtons || !(m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS))) - { - if(m_pClient->m_Snap.m_pLocalInfo->m_Team != TEAM_SPECTATORS || Paused || Spec) - { - ButtonBar.VSplitLeft((!Paused && !Spec) ? 65.0f : 120.0f, &Button, &ButtonBar); - ButtonBar.VSplitLeft(5.0f, nullptr, &ButtonBar); - - static CButtonContainer s_PauseButton; - if(DoButton_Menu(&s_PauseButton, (!Paused && !Spec) ? Localize("Pause") : Localize("Join game"), 0, &Button)) - { - Console()->ExecuteLine("say /pause"); - SetActive(false); - } - } - } - - if(g_Config.m_ClTouchControls) - { - ButtonBar2.VSplitLeft(200.0f, &Button, &ButtonBar2); - static char s_TouchControlsEditCheckbox; - if(DoButton_CheckBox(&s_TouchControlsEditCheckbox, Localize("Edit touch controls"), GameClient()->m_TouchControls.IsEditingActive(), &Button)) - { - GameClient()->m_TouchControls.SetEditingActive(!GameClient()->m_TouchControls.IsEditingActive()); - } - - ButtonBar2.VSplitRight(80.0f, &ButtonBar2, &Button); - static CButtonContainer s_CloseButton; - if(DoButton_Menu(&s_CloseButton, Localize("Close"), 0, &Button)) - { - SetActive(false); - } - - ButtonBar2.VSplitRight(5.0f, &ButtonBar2, nullptr); - ButtonBar2.VSplitRight(160.0f, &ButtonBar2, &Button); - static CButtonContainer s_RemoveConsoleButton; - if(DoButton_Menu(&s_RemoveConsoleButton, Localize("Remote console"), 0, &Button)) - { - Console()->ExecuteLine("toggle_remote_console"); - } - - ButtonBar2.VSplitRight(5.0f, &ButtonBar2, nullptr); - ButtonBar2.VSplitRight(120.0f, &ButtonBar2, &Button); - static CButtonContainer s_LocalConsoleButton; - if(DoButton_Menu(&s_LocalConsoleButton, Localize("Console"), 0, &Button)) - { - Console()->ExecuteLine("toggle_local_console"); - } - - if(GameClient()->m_TouchControls.IsEditingActive()) - { - CUIRect TouchControlsEditor; - MainView.VMargin((MainView.w - 505.0f) / 2.0f, &TouchControlsEditor); - TouchControlsEditor.HMargin((TouchControlsEditor.h - 230.0f) / 2.0f, &TouchControlsEditor); - RenderTouchControlsEditor(TouchControlsEditor); - } - } -} - -void CMenus::RenderTouchControlsEditor(CUIRect MainView) -{ - CUIRect Label, Button, Row; - MainView.Draw(ms_ColorTabbarActive, IGraphics::CORNER_ALL, 10.0f); - MainView.Margin(10.0f, &MainView); - - MainView.HSplitTop(25.0f, &Row, &MainView); - MainView.HSplitTop(5.0f, nullptr, &MainView); - Row.VSplitLeft(Row.h, nullptr, &Row); - Row.VSplitRight(Row.h, &Row, &Button); - Row.VMargin(5.0f, &Label); - Ui()->DoLabel(&Label, Localize("Edit touch controls"), 20.0f, TEXTALIGN_MC); - - static CButtonContainer s_OpenHelpButton; - if(DoButton_FontIcon(&s_OpenHelpButton, FONT_ICON_QUESTION, 0, &Button)) - { - Client()->ViewLink(Localize("https://wiki.ddnet.org/wiki/Touch_controls")); - } - - MainView.HSplitTop(25.0f, &Row, &MainView); - MainView.HSplitTop(5.0f, nullptr, &MainView); - - Row.VSplitLeft(240.0f, &Button, &Row); - static CButtonContainer s_SaveConfigurationButton; - if(DoButton_Menu(&s_SaveConfigurationButton, Localize("Save changes"), GameClient()->m_TouchControls.HasEditingChanges() ? 0 : 1, &Button)) - { - if(GameClient()->m_TouchControls.SaveConfigurationToFile()) - { - GameClient()->m_TouchControls.SetEditingChanges(false); - } - else - { - SWarning Warning(Localize("Error saving touch controls"), Localize("Could not save touch controls to file. See local console for details.")); - Warning.m_AutoHide = false; - Client()->AddWarning(Warning); - } - } - - Row.VSplitLeft(5.0f, nullptr, &Row); - Row.VSplitLeft(240.0f, &Button, &Row); - if(GameClient()->m_TouchControls.HasEditingChanges()) - { - TextRender()->TextColor(ColorRGBA(1.0f, 0.0f, 0.0f, 1.0f)); - Ui()->DoLabel(&Button, Localize("Unsaved changes"), 14.0f, TEXTALIGN_MC); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - } - - MainView.HSplitTop(25.0f, &Row, &MainView); - MainView.HSplitTop(5.0f, nullptr, &MainView); - - Row.VSplitLeft(240.0f, &Button, &Row); - static CButtonContainer s_DiscardChangesButton; - if(DoButton_Menu(&s_DiscardChangesButton, Localize("Discard changes"), GameClient()->m_TouchControls.HasEditingChanges() ? 0 : 1, &Button)) - { - PopupConfirm(Localize("Discard changes"), - Localize("Are you sure that you want to discard the current changes to the touch controls?"), - Localize("Yes"), Localize("No"), - &CMenus::PopupConfirmDiscardTouchControlsChanges); - } - - Row.VSplitLeft(5.0f, nullptr, &Row); - Row.VSplitLeft(240.0f, &Button, &Row); - static CButtonContainer s_ResetButton; - if(DoButton_Menu(&s_ResetButton, Localize("Reset to defaults"), 0, &Button)) - { - PopupConfirm(Localize("Reset to defaults"), - Localize("Are you sure that you want to reset the touch controls to default?"), - Localize("Yes"), Localize("No"), - &CMenus::PopupConfirmResetTouchControls); - } - - MainView.HSplitTop(25.0f, &Row, &MainView); - MainView.HSplitTop(10.0f, nullptr, &MainView); - - Row.VSplitLeft(240.0f, &Button, &Row); - static CButtonContainer s_ClipboardImportButton; - if(DoButton_Menu(&s_ClipboardImportButton, Localize("Import from clipboard"), 0, &Button)) - { - PopupConfirm(Localize("Import from clipboard"), - Localize("Are you sure that you want to import the touch controls from the clipboard? This will overwrite your current touch controls."), - Localize("Yes"), Localize("No"), - &CMenus::PopupConfirmImportTouchControlsClipboard); - } - - Row.VSplitLeft(5.0f, nullptr, &Row); - Row.VSplitLeft(240.0f, &Button, &Row); - static CButtonContainer s_ClipboardExportButton; - if(DoButton_Menu(&s_ClipboardExportButton, Localize("Export to clipboard"), 0, &Button)) - { - GameClient()->m_TouchControls.SaveConfigurationToClipboard(); - } - - MainView.HSplitTop(25.0f, &Label, &MainView); - MainView.HSplitTop(5.0f, nullptr, &MainView); - Ui()->DoLabel(&Label, Localize("Settings"), 20.0f, TEXTALIGN_MC); - - MainView.HSplitTop(25.0f, &Row, &MainView); - MainView.HSplitTop(5.0f, nullptr, &MainView); - - Row.VSplitLeft(300.0f, &Label, &Row); - Ui()->DoLabel(&Label, Localize("Direct touch input while ingame"), 16.0f, TEXTALIGN_ML); - - Row.VSplitLeft(5.0f, nullptr, &Row); - Row.VSplitLeft(180.0f, &Button, &Row); - const char *apIngameTouchModes[(int)CTouchControls::EDirectTouchIngameMode::NUM_STATES] = {Localize("Disabled", "Direct touch input"), Localize("Active action", "Direct touch input"), Localize("Aim", "Direct touch input"), Localize("Fire", "Direct touch input"), Localize("Hook", "Direct touch input")}; - const CTouchControls::EDirectTouchIngameMode OldDirectTouchIngame = GameClient()->m_TouchControls.DirectTouchIngame(); - static CUi::SDropDownState s_DirectTouchIngameDropDownState; - static CScrollRegion s_DirectTouchIngameDropDownScrollRegion; - s_DirectTouchIngameDropDownState.m_SelectionPopupContext.m_pScrollRegion = &s_DirectTouchIngameDropDownScrollRegion; - const CTouchControls::EDirectTouchIngameMode NewDirectTouchIngame = (CTouchControls::EDirectTouchIngameMode)Ui()->DoDropDown(&Button, (int)OldDirectTouchIngame, apIngameTouchModes, std::size(apIngameTouchModes), s_DirectTouchIngameDropDownState); - if(OldDirectTouchIngame != NewDirectTouchIngame) - { - GameClient()->m_TouchControls.SetDirectTouchIngame(NewDirectTouchIngame); - } - - MainView.HSplitTop(25.0f, &Row, &MainView); - MainView.HSplitTop(5.0f, nullptr, &MainView); - - Row.VSplitLeft(300.0f, &Label, &Row); - Ui()->DoLabel(&Label, Localize("Direct touch input while spectating"), 16.0f, TEXTALIGN_ML); - - Row.VSplitLeft(5.0f, nullptr, &Row); - Row.VSplitLeft(180.0f, &Button, &Row); - const char *apSpectateTouchModes[(int)CTouchControls::EDirectTouchSpectateMode::NUM_STATES] = {Localize("Disabled", "Direct touch input"), Localize("Aim", "Direct touch input")}; - const CTouchControls::EDirectTouchSpectateMode OldDirectTouchSpectate = GameClient()->m_TouchControls.DirectTouchSpectate(); - static CUi::SDropDownState s_DirectTouchSpectateDropDownState; - static CScrollRegion s_DirectTouchSpectateDropDownScrollRegion; - s_DirectTouchSpectateDropDownState.m_SelectionPopupContext.m_pScrollRegion = &s_DirectTouchSpectateDropDownScrollRegion; - const CTouchControls::EDirectTouchSpectateMode NewDirectTouchSpectate = (CTouchControls::EDirectTouchSpectateMode)Ui()->DoDropDown(&Button, (int)OldDirectTouchSpectate, apSpectateTouchModes, std::size(apSpectateTouchModes), s_DirectTouchSpectateDropDownState); - if(OldDirectTouchSpectate != NewDirectTouchSpectate) - { - GameClient()->m_TouchControls.SetDirectTouchSpectate(NewDirectTouchSpectate); - } -} - -void CMenus::PopupConfirmDisconnect() -{ - Client()->Disconnect(); -} - -void CMenus::PopupConfirmDisconnectDummy() -{ - Client()->DummyDisconnect(0); - SetActive(false); -} - -void CMenus::PopupConfirmDiscardTouchControlsChanges() -{ - if(GameClient()->m_TouchControls.LoadConfigurationFromFile(IStorage::TYPE_ALL)) - { - GameClient()->m_TouchControls.SetEditingChanges(false); - } - else - { - SWarning Warning(Localize("Error loading touch controls"), Localize("Could not load touch controls from file. See local console for details.")); - Warning.m_AutoHide = false; - Client()->AddWarning(Warning); - } -} - -void CMenus::PopupConfirmResetTouchControls() -{ - bool Success = false; - for(int StorageType = IStorage::TYPE_SAVE + 1; StorageType < Storage()->NumPaths(); ++StorageType) - { - if(GameClient()->m_TouchControls.LoadConfigurationFromFile(StorageType)) - { - Success = true; - break; - } - } - if(Success) - { - GameClient()->m_TouchControls.SetEditingChanges(true); - } - else - { - SWarning Warning(Localize("Error loading touch controls"), Localize("Could not load default touch controls from file. See local console for details.")); - Warning.m_AutoHide = false; - Client()->AddWarning(Warning); - } -} - -void CMenus::PopupConfirmImportTouchControlsClipboard() -{ - if(GameClient()->m_TouchControls.LoadConfigurationFromClipboard()) - { - GameClient()->m_TouchControls.SetEditingChanges(true); - } - else - { - SWarning Warning(Localize("Error loading touch controls"), Localize("Could not load touch controls from clipboard. See local console for details.")); - Warning.m_AutoHide = false; - Client()->AddWarning(Warning); - } -} - -void CMenus::RenderPlayers(CUIRect MainView) -{ - CUIRect Button, Button2, ButtonBar, PlayerList, Player; - MainView.Draw(ms_ColorTabbarActive, IGraphics::CORNER_B, 10.0f); - - // list background color - MainView.Margin(10.0f, &PlayerList); - PlayerList.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_ALL, 10.0f); - PlayerList.Margin(10.0f, &PlayerList); - - // headline - PlayerList.HSplitTop(34.0f, &ButtonBar, &PlayerList); - ButtonBar.VSplitRight(231.0f, &Player, &ButtonBar); - Ui()->DoLabel(&Player, Localize("Player"), 24.0f, TEXTALIGN_ML); - - ButtonBar.HMargin(1.0f, &ButtonBar); - float Width = ButtonBar.h * 2.0f; - ButtonBar.VSplitLeft(Width, &Button, &ButtonBar); - RenderTools()->RenderIcon(IMAGE_GUIICONS, SPRITE_GUIICON_MUTE, &Button); - - ButtonBar.VSplitLeft(20.0f, nullptr, &ButtonBar); - ButtonBar.VSplitLeft(Width, &Button, &ButtonBar); - RenderTools()->RenderIcon(IMAGE_GUIICONS, SPRITE_GUIICON_EMOTICON_MUTE, &Button); - - ButtonBar.VSplitLeft(20.0f, nullptr, &ButtonBar); - ButtonBar.VSplitLeft(Width, &Button, &ButtonBar); - RenderTools()->RenderIcon(IMAGE_GUIICONS, SPRITE_GUIICON_FRIEND, &Button); - - int TotalPlayers = 0; - for(const auto &pInfoByName : m_pClient->m_Snap.m_apInfoByName) - { - if(!pInfoByName) - continue; - - int Index = pInfoByName->m_ClientId; - - if(Index == m_pClient->m_Snap.m_LocalClientId) - continue; - - TotalPlayers++; - } - - static CListBox s_ListBox; - s_ListBox.DoStart(24.0f, TotalPlayers, 1, 3, -1, &PlayerList); - - // options - static char s_aPlayerIds[MAX_CLIENTS][4] = {{0}}; - - for(int i = 0, Count = 0; i < MAX_CLIENTS; ++i) - { - if(!m_pClient->m_Snap.m_apInfoByName[i]) - continue; - - int Index = m_pClient->m_Snap.m_apInfoByName[i]->m_ClientId; - if(Index == m_pClient->m_Snap.m_LocalClientId) - continue; - - CGameClient::CClientData &CurrentClient = m_pClient->m_aClients[Index]; - const CListboxItem Item = s_ListBox.DoNextItem(&CurrentClient); - - Count++; - - if(!Item.m_Visible) - continue; - - CUIRect Row = Item.m_Rect; - if(Count % 2 == 1) - Row.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_ALL, 5.0f); - Row.VSplitRight(s_ListBox.ScrollbarWidthMax() - s_ListBox.ScrollbarWidth(), &Row, nullptr); - Row.VSplitRight(300.0f, &Player, &Row); - - // player info - Player.VSplitLeft(28.0f, &Button, &Player); - - CTeeRenderInfo TeeInfo = CurrentClient.m_RenderInfo; - TeeInfo.m_Size = Button.h; - - const CAnimState *pIdleState = CAnimState::GetIdle(); - vec2 OffsetToMid; - CRenderTools::GetRenderTeeOffsetToRenderedTee(pIdleState, &TeeInfo, OffsetToMid); - vec2 TeeRenderPos(Button.x + Button.h / 2, Button.y + Button.h / 2 + OffsetToMid.y); - RenderTools()->RenderTee(pIdleState, &TeeInfo, EMOTE_NORMAL, vec2(1.0f, 0.0f), TeeRenderPos); - Ui()->DoButtonLogic(&s_aPlayerIds[Index][3], 0, &Button); - GameClient()->m_Tooltips.DoToolTip(&s_aPlayerIds[Index][3], &Button, CurrentClient.m_aSkinName); - - Player.HSplitTop(1.5f, nullptr, &Player); - Player.VSplitMid(&Player, &Button); - Row.VSplitRight(210.0f, &Button2, &Row); - - Ui()->DoLabel(&Player, CurrentClient.m_aName, 14.0f, TEXTALIGN_ML); - Ui()->DoLabel(&Button, CurrentClient.m_aClan, 14.0f, TEXTALIGN_ML); - - m_pClient->m_CountryFlags.Render(CurrentClient.m_Country, ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f), - Button2.x, Button2.y + Button2.h / 2.0f - 0.75f * Button2.h / 2.0f, 1.5f * Button2.h, 0.75f * Button2.h); - - // ignore chat button - Row.HMargin(2.0f, &Row); - Row.VSplitLeft(Width, &Button, &Row); - Button.VSplitLeft((Width - Button.h) / 4.0f, nullptr, &Button); - Button.VSplitLeft(Button.h, &Button, nullptr); - if(g_Config.m_ClShowChatFriends && !CurrentClient.m_Friend) - DoButton_Toggle(&s_aPlayerIds[Index][0], 1, &Button, false); - else if(DoButton_Toggle(&s_aPlayerIds[Index][0], CurrentClient.m_ChatIgnore, &Button, true)) - CurrentClient.m_ChatIgnore ^= 1; - - // ignore emoticon button - Row.VSplitLeft(30.0f, nullptr, &Row); - Row.VSplitLeft(Width, &Button, &Row); - Button.VSplitLeft((Width - Button.h) / 4.0f, nullptr, &Button); - Button.VSplitLeft(Button.h, &Button, nullptr); - if(g_Config.m_ClShowChatFriends && !CurrentClient.m_Friend) - DoButton_Toggle(&s_aPlayerIds[Index][1], 1, &Button, false); - else if(DoButton_Toggle(&s_aPlayerIds[Index][1], CurrentClient.m_EmoticonIgnore, &Button, true)) - CurrentClient.m_EmoticonIgnore ^= 1; - - // friend button - Row.VSplitLeft(10.0f, nullptr, &Row); - Row.VSplitLeft(Width, &Button, &Row); - Button.VSplitLeft((Width - Button.h) / 4.0f, nullptr, &Button); - Button.VSplitLeft(Button.h, &Button, nullptr); - if(DoButton_Toggle(&s_aPlayerIds[Index][2], CurrentClient.m_Friend, &Button, true)) - { - if(CurrentClient.m_Friend) - m_pClient->Friends()->RemoveFriend(CurrentClient.m_aName, CurrentClient.m_aClan); - else - m_pClient->Friends()->AddFriend(CurrentClient.m_aName, CurrentClient.m_aClan); - - m_pClient->Client()->ServerBrowserUpdate(); - } - } - - s_ListBox.DoEnd(); -} - -void CMenus::RenderServerInfo(CUIRect MainView) -{ - if(!m_pClient->m_Snap.m_pLocalInfo) - return; - - // fetch server info - CServerInfo CurrentServerInfo; - Client()->GetServerInfo(&CurrentServerInfo); - - // render background - MainView.Draw(ms_ColorTabbarActive, IGraphics::CORNER_B, 10.0f); - - CUIRect View, ServerInfo, GameInfo, Motd; - - float x = 0.0f; - float y = 0.0f; - - char aBuf[1024]; - - // set view to use for all sub-modules - MainView.Margin(10.0f, &View); - - // serverinfo - View.HSplitTop(View.h / 2 - 5.0f, &ServerInfo, &Motd); - ServerInfo.VSplitLeft(View.w / 2 - 5.0f, &ServerInfo, &GameInfo); - ServerInfo.Draw(ColorRGBA(1, 1, 1, 0.25f), IGraphics::CORNER_ALL, 10.0f); - - ServerInfo.Margin(5.0f, &ServerInfo); - - x = 5.0f; - y = 0.0f; - - TextRender()->Text(ServerInfo.x + x, ServerInfo.y + y, 32, Localize("Server info"), -1.0f); - y += 32.0f + 5.0f; - - mem_zero(aBuf, sizeof(aBuf)); - str_format( - aBuf, - sizeof(aBuf), - "%s\n\n" - "%s: %s\n" - "%s: %d\n" - "%s: %s\n" - "%s: %s\n", - CurrentServerInfo.m_aName, - Localize("Address"), CurrentServerInfo.m_aAddress, - Localize("Ping"), m_pClient->m_Snap.m_pLocalInfo->m_Latency, - Localize("Version"), CurrentServerInfo.m_aVersion, - Localize("Password"), CurrentServerInfo.m_Flags & 1 ? Localize("Yes") : Localize("No")); - - TextRender()->Text(ServerInfo.x + x, ServerInfo.y + y, 20, aBuf, ServerInfo.w - 10.0f); - - // copy info button - { - CUIRect Button; - ServerInfo.HSplitBottom(20.0f, &ServerInfo, &Button); - Button.VSplitRight(200.0f, &ServerInfo, &Button); - static CButtonContainer s_CopyButton; - if(DoButton_Menu(&s_CopyButton, Localize("Copy info"), 0, &Button)) - { - char aInfo[256]; - str_format( - aInfo, - sizeof(aInfo), - "%s\n" - "Address: ddnet://%s\n" - "My IGN: %s\n", - CurrentServerInfo.m_aName, - CurrentServerInfo.m_aAddress, - Client()->PlayerName()); - Input()->SetClipboardText(aInfo); - } - } - - // favorite checkbox - { - CUIRect Button; - NETADDR ServerAddr = Client()->ServerAddress(); - TRISTATE IsFavorite = Favorites()->IsFavorite(&ServerAddr, 1); - ServerInfo.HSplitBottom(20.0f, &ServerInfo, &Button); - static int s_AddFavButton = 0; - if(DoButton_CheckBox(&s_AddFavButton, Localize("Favorite"), IsFavorite != TRISTATE::NONE, &Button)) - { - if(IsFavorite != TRISTATE::NONE) - Favorites()->Remove(&ServerAddr, 1); - else - Favorites()->Add(&ServerAddr, 1); - } - } - - // gameinfo - GameInfo.VSplitLeft(10.0f, 0x0, &GameInfo); - GameInfo.Draw(ColorRGBA(1, 1, 1, 0.25f), IGraphics::CORNER_ALL, 10.0f); - - GameInfo.Margin(5.0f, &GameInfo); - - x = 5.0f; - y = 0.0f; - - TextRender()->Text(GameInfo.x + x, GameInfo.y + y, 32, Localize("Game info"), -1.0f); - y += 32.0f + 5.0f; - - if(m_pClient->m_Snap.m_pGameInfoObj) - { - mem_zero(aBuf, sizeof(aBuf)); - str_format( - aBuf, - sizeof(aBuf), - "\n\n" - "%s: %s\n" - "%s: %s\n" - "%s: %d\n" - "%s: %d\n" - "\n" - "%s: %d/%d\n", - Localize("Game type"), CurrentServerInfo.m_aGameType, - Localize("Map"), CurrentServerInfo.m_aMap, - Localize("Score limit"), m_pClient->m_Snap.m_pGameInfoObj->m_ScoreLimit, - Localize("Time limit"), m_pClient->m_Snap.m_pGameInfoObj->m_TimeLimit, - Localize("Players"), m_pClient->m_Snap.m_NumPlayers, CurrentServerInfo.m_MaxClients); - TextRender()->Text(GameInfo.x + x, GameInfo.y + y, 20, aBuf, GameInfo.w - 10.0f); - } - - RenderServerInfoMotd(Motd); -} - -void CMenus::RenderServerInfoMotd(CUIRect Motd) -{ - const float MotdFontSize = 16.0f; - Motd.HSplitTop(10.0f, nullptr, &Motd); - Motd.Draw(ColorRGBA(1, 1, 1, 0.25f), IGraphics::CORNER_ALL, 10.0f); - Motd.HMargin(5.0f, &Motd); - Motd.VMargin(10.0f, &Motd); - - CUIRect MotdHeader; - Motd.HSplitTop(2.0f * MotdFontSize, &MotdHeader, &Motd); - Motd.HSplitTop(5.0f, nullptr, &Motd); - TextRender()->Text(MotdHeader.x, MotdHeader.y, 2.0f * MotdFontSize, Localize("MOTD"), -1.0f); - - if(!m_pClient->m_Motd.ServerMotd()[0]) - return; - - static CScrollRegion s_ScrollRegion; - vec2 ScrollOffset(0.0f, 0.0f); - CScrollRegionParams ScrollParams; - ScrollParams.m_ScrollUnit = 5 * MotdFontSize; - s_ScrollRegion.Begin(&Motd, &ScrollOffset, &ScrollParams); - Motd.y += ScrollOffset.y; - - static float s_MotdHeight = 0.0f; - static int64_t s_MotdLastUpdateTime = -1; - if(!m_MotdTextContainerIndex.Valid() || s_MotdLastUpdateTime == -1 || s_MotdLastUpdateTime != m_pClient->m_Motd.ServerMotdUpdateTime()) - { - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, 0.0f, 0.0f, MotdFontSize, TEXTFLAG_RENDER); - Cursor.m_LineWidth = Motd.w; - TextRender()->RecreateTextContainer(m_MotdTextContainerIndex, &Cursor, m_pClient->m_Motd.ServerMotd()); - s_MotdHeight = Cursor.Height(); - s_MotdLastUpdateTime = m_pClient->m_Motd.ServerMotdUpdateTime(); - } - - CUIRect MotdTextArea; - Motd.HSplitTop(s_MotdHeight, &MotdTextArea, &Motd); - s_ScrollRegion.AddRect(MotdTextArea); - - if(m_MotdTextContainerIndex.Valid()) - TextRender()->RenderTextContainer(m_MotdTextContainerIndex, TextRender()->DefaultTextColor(), TextRender()->DefaultTextOutlineColor(), MotdTextArea.x, MotdTextArea.y); - - s_ScrollRegion.End(); -} - -bool CMenus::RenderServerControlServer(CUIRect MainView) -{ - CUIRect List = MainView; - int Total = m_pClient->m_Voting.m_NumVoteOptions; - int NumVoteOptions = 0; - int aIndices[MAX_VOTE_OPTIONS]; - static int s_CurVoteOption = 0; - int TotalShown = 0; - - for(CVoteOptionClient *pOption = m_pClient->m_Voting.m_pFirst; pOption; pOption = pOption->m_pNext) - { - if(!m_FilterInput.IsEmpty() && !str_utf8_find_nocase(pOption->m_aDescription, m_FilterInput.GetString())) - continue; - TotalShown++; - } - - static CListBox s_ListBox; - s_ListBox.DoStart(19.0f, TotalShown, 1, 3, s_CurVoteOption, &List); - - int i = -1; - for(CVoteOptionClient *pOption = m_pClient->m_Voting.m_pFirst; pOption; pOption = pOption->m_pNext) - { - i++; - if(!m_FilterInput.IsEmpty() && !str_utf8_find_nocase(pOption->m_aDescription, m_FilterInput.GetString())) - continue; - - if(NumVoteOptions < Total) - aIndices[NumVoteOptions] = i; - NumVoteOptions++; - - const CListboxItem Item = s_ListBox.DoNextItem(pOption); - if(!Item.m_Visible) - continue; - - CUIRect Label; - Item.m_Rect.VMargin(2.0f, &Label); - Ui()->DoLabel(&Label, pOption->m_aDescription, 13.0f, TEXTALIGN_ML); - } - - s_CurVoteOption = s_ListBox.DoEnd(); - if(s_CurVoteOption < Total) - m_CallvoteSelectedOption = aIndices[s_CurVoteOption]; - return s_ListBox.WasItemActivated(); -} - -bool CMenus::RenderServerControlKick(CUIRect MainView, bool FilterSpectators) -{ - int NumOptions = 0; - int Selected = -1; - int aPlayerIds[MAX_CLIENTS]; - for(const auto &pInfoByName : m_pClient->m_Snap.m_apInfoByName) - { - if(!pInfoByName) - continue; - - int Index = pInfoByName->m_ClientId; - if(Index == m_pClient->m_Snap.m_LocalClientId || (FilterSpectators && pInfoByName->m_Team == TEAM_SPECTATORS)) - continue; - - if(!str_utf8_find_nocase(m_pClient->m_aClients[Index].m_aName, m_FilterInput.GetString())) - continue; - - if(m_CallvoteSelectedPlayer == Index) - Selected = NumOptions; - aPlayerIds[NumOptions] = Index; - NumOptions++; - } - - static CListBox s_ListBox; - s_ListBox.DoStart(24.0f, NumOptions, 1, 3, Selected, &MainView); - - for(int i = 0; i < NumOptions; i++) - { - const CListboxItem Item = s_ListBox.DoNextItem(&aPlayerIds[i]); - if(!Item.m_Visible) - continue; - - CUIRect TeeRect, Label; - Item.m_Rect.VSplitLeft(Item.m_Rect.h, &TeeRect, &Label); - - CTeeRenderInfo TeeInfo = m_pClient->m_aClients[aPlayerIds[i]].m_RenderInfo; - TeeInfo.m_Size = TeeRect.h; - - const CAnimState *pIdleState = CAnimState::GetIdle(); - vec2 OffsetToMid; - CRenderTools::GetRenderTeeOffsetToRenderedTee(pIdleState, &TeeInfo, OffsetToMid); - vec2 TeeRenderPos(TeeRect.x + TeeInfo.m_Size / 2, TeeRect.y + TeeInfo.m_Size / 2 + OffsetToMid.y); - - RenderTools()->RenderTee(pIdleState, &TeeInfo, EMOTE_NORMAL, vec2(1.0f, 0.0f), TeeRenderPos); - - Ui()->DoLabel(&Label, m_pClient->m_aClients[aPlayerIds[i]].m_aName, 16.0f, TEXTALIGN_ML); - } - - Selected = s_ListBox.DoEnd(); - m_CallvoteSelectedPlayer = Selected != -1 ? aPlayerIds[Selected] : -1; - return s_ListBox.WasItemActivated(); -} - -void CMenus::RenderServerControl(CUIRect MainView) -{ - enum class EServerControlTab - { - SETTINGS, - KICKVOTE, - SPECVOTE, - }; - static EServerControlTab s_ControlPage = EServerControlTab::SETTINGS; - - // render background - CUIRect Bottom, RconExtension, TabBar, Button; - MainView.HSplitTop(20.0f, &Bottom, &MainView); - Bottom.Draw(ms_ColorTabbarActive, IGraphics::CORNER_NONE, 0.0f); - MainView.HSplitTop(20.0f, &TabBar, &MainView); - MainView.Draw(ms_ColorTabbarActive, IGraphics::CORNER_B, 10.0f); - MainView.Margin(10.0f, &MainView); - - if(Client()->RconAuthed()) - MainView.HSplitBottom(90.0f, &MainView, &RconExtension); - - // tab bar - TabBar.VSplitLeft(TabBar.w / 3, &Button, &TabBar); - static CButtonContainer s_Button0; - if(DoButton_MenuTab(&s_Button0, Localize("Change settings"), s_ControlPage == EServerControlTab::SETTINGS, &Button, IGraphics::CORNER_NONE)) - s_ControlPage = EServerControlTab::SETTINGS; - - TabBar.VSplitMid(&Button, &TabBar); - static CButtonContainer s_Button1; - if(DoButton_MenuTab(&s_Button1, Localize("Kick player"), s_ControlPage == EServerControlTab::KICKVOTE, &Button, IGraphics::CORNER_NONE)) - s_ControlPage = EServerControlTab::KICKVOTE; - - static CButtonContainer s_Button2; - if(DoButton_MenuTab(&s_Button2, Localize("Move player to spectators"), s_ControlPage == EServerControlTab::SPECVOTE, &TabBar, IGraphics::CORNER_NONE)) - s_ControlPage = EServerControlTab::SPECVOTE; - - // render page - MainView.HSplitBottom(ms_ButtonHeight + 5 * 2, &MainView, &Bottom); - Bottom.HMargin(5.0f, &Bottom); - Bottom.HSplitTop(5.0f, nullptr, &Bottom); - - bool Call = false; - if(s_ControlPage == EServerControlTab::SETTINGS) - Call = RenderServerControlServer(MainView); - else if(s_ControlPage == EServerControlTab::KICKVOTE) - Call = RenderServerControlKick(MainView, false); - else if(s_ControlPage == EServerControlTab::SPECVOTE) - Call = RenderServerControlKick(MainView, true); - - // vote menu - - // render quick search - CUIRect QuickSearch; - Bottom.VSplitLeft(5.0f, nullptr, &Bottom); - Bottom.VSplitLeft(250.0f, &QuickSearch, &Bottom); - if(m_ControlPageOpening) - { - m_ControlPageOpening = false; - Ui()->SetActiveItem(&m_FilterInput); - m_FilterInput.SelectAll(); - } - Ui()->DoEditBox_Search(&m_FilterInput, &QuickSearch, 14.0f, !Ui()->IsPopupOpen() && m_pClient->m_GameConsole.IsClosed()); - - // call vote - Bottom.VSplitRight(10.0f, &Bottom, 0); - Bottom.VSplitRight(120.0f, &Bottom, &Button); - - static CButtonContainer s_CallVoteButton; - if(DoButton_Menu(&s_CallVoteButton, Localize("Call vote"), 0, &Button) || Call) - { - if(s_ControlPage == EServerControlTab::SETTINGS) - { - m_pClient->m_Voting.CallvoteOption(m_CallvoteSelectedOption, m_CallvoteReasonInput.GetString()); - if(g_Config.m_UiCloseWindowAfterChangingSetting) - SetActive(false); - } - else if(s_ControlPage == EServerControlTab::KICKVOTE) - { - if(m_CallvoteSelectedPlayer >= 0 && m_CallvoteSelectedPlayer < MAX_CLIENTS && - m_pClient->m_Snap.m_apPlayerInfos[m_CallvoteSelectedPlayer]) - { - m_pClient->m_Voting.CallvoteKick(m_CallvoteSelectedPlayer, m_CallvoteReasonInput.GetString()); - SetActive(false); - } - } - else if(s_ControlPage == EServerControlTab::SPECVOTE) - { - if(m_CallvoteSelectedPlayer >= 0 && m_CallvoteSelectedPlayer < MAX_CLIENTS && - m_pClient->m_Snap.m_apPlayerInfos[m_CallvoteSelectedPlayer]) - { - m_pClient->m_Voting.CallvoteSpectate(m_CallvoteSelectedPlayer, m_CallvoteReasonInput.GetString()); - SetActive(false); - } - } - m_CallvoteReasonInput.Clear(); - } - - // render kick reason - CUIRect Reason; - Bottom.VSplitRight(20.0f, &Bottom, 0); - Bottom.VSplitRight(200.0f, &Bottom, &Reason); - const char *pLabel = Localize("Reason:"); - Ui()->DoLabel(&Reason, pLabel, 14.0f, TEXTALIGN_ML); - float w = TextRender()->TextWidth(14.0f, pLabel, -1, -1.0f); - Reason.VSplitLeft(w + 10.0f, 0, &Reason); - if(Input()->KeyPress(KEY_R) && Input()->ModifierIsPressed()) - { - Ui()->SetActiveItem(&m_CallvoteReasonInput); - m_CallvoteReasonInput.SelectAll(); - } - Ui()->DoEditBox(&m_CallvoteReasonInput, &Reason, 14.0f); - - // vote option loading indicator - if(s_ControlPage == EServerControlTab::SETTINGS && m_pClient->m_Voting.IsReceivingOptions()) - { - CUIRect Spinner, LoadingLabel; - Bottom.VSplitLeft(20.0f, nullptr, &Bottom); - Bottom.VSplitLeft(16.0f, &Spinner, &Bottom); - Bottom.VSplitLeft(5.0f, nullptr, &Bottom); - Bottom.VSplitRight(10.0f, &LoadingLabel, nullptr); - Ui()->RenderProgressSpinner(Spinner.Center(), 8.0f); - Ui()->DoLabel(&LoadingLabel, Localize("Loading…"), 14.0f, TEXTALIGN_ML); - } - - // extended features (only available when authed in rcon) - if(Client()->RconAuthed()) - { - // background - RconExtension.HSplitTop(10.0f, 0, &RconExtension); - RconExtension.HSplitTop(20.0f, &Bottom, &RconExtension); - RconExtension.HSplitTop(5.0f, 0, &RconExtension); - - // force vote - Bottom.VSplitLeft(5.0f, 0, &Bottom); - Bottom.VSplitLeft(120.0f, &Button, &Bottom); - - static CButtonContainer s_ForceVoteButton; - if(DoButton_Menu(&s_ForceVoteButton, Localize("Force vote"), 0, &Button)) - { - if(s_ControlPage == EServerControlTab::SETTINGS) - { - m_pClient->m_Voting.CallvoteOption(m_CallvoteSelectedOption, m_CallvoteReasonInput.GetString(), true); - } - else if(s_ControlPage == EServerControlTab::KICKVOTE) - { - if(m_CallvoteSelectedPlayer >= 0 && m_CallvoteSelectedPlayer < MAX_CLIENTS && - m_pClient->m_Snap.m_apPlayerInfos[m_CallvoteSelectedPlayer]) - { - m_pClient->m_Voting.CallvoteKick(m_CallvoteSelectedPlayer, m_CallvoteReasonInput.GetString(), true); - SetActive(false); - } - } - else if(s_ControlPage == EServerControlTab::SPECVOTE) - { - if(m_CallvoteSelectedPlayer >= 0 && m_CallvoteSelectedPlayer < MAX_CLIENTS && - m_pClient->m_Snap.m_apPlayerInfos[m_CallvoteSelectedPlayer]) - { - m_pClient->m_Voting.CallvoteSpectate(m_CallvoteSelectedPlayer, m_CallvoteReasonInput.GetString(), true); - SetActive(false); - } - } - m_CallvoteReasonInput.Clear(); - } - - if(s_ControlPage == EServerControlTab::SETTINGS) - { - // remove vote - Bottom.VSplitRight(10.0f, &Bottom, 0); - Bottom.VSplitRight(120.0f, 0, &Button); - static CButtonContainer s_RemoveVoteButton; - if(DoButton_Menu(&s_RemoveVoteButton, Localize("Remove"), 0, &Button)) - m_pClient->m_Voting.RemovevoteOption(m_CallvoteSelectedOption); - - // add vote - RconExtension.HSplitTop(20.0f, &Bottom, &RconExtension); - Bottom.VSplitLeft(5.0f, 0, &Bottom); - Bottom.VSplitLeft(250.0f, &Button, &Bottom); - Ui()->DoLabel(&Button, Localize("Vote description:"), 14.0f, TEXTALIGN_ML); - - Bottom.VSplitLeft(20.0f, 0, &Button); - Ui()->DoLabel(&Button, Localize("Vote command:"), 14.0f, TEXTALIGN_ML); - - static CLineInputBuffered s_VoteDescriptionInput; - static CLineInputBuffered s_VoteCommandInput; - RconExtension.HSplitTop(20.0f, &Bottom, &RconExtension); - Bottom.VSplitRight(10.0f, &Bottom, 0); - Bottom.VSplitRight(120.0f, &Bottom, &Button); - static CButtonContainer s_AddVoteButton; - if(DoButton_Menu(&s_AddVoteButton, Localize("Add"), 0, &Button)) - if(!s_VoteDescriptionInput.IsEmpty() && !s_VoteCommandInput.IsEmpty()) - m_pClient->m_Voting.AddvoteOption(s_VoteDescriptionInput.GetString(), s_VoteCommandInput.GetString()); - - Bottom.VSplitLeft(5.0f, 0, &Bottom); - Bottom.VSplitLeft(250.0f, &Button, &Bottom); - Ui()->DoEditBox(&s_VoteDescriptionInput, &Button, 14.0f); - - Bottom.VMargin(20.0f, &Button); - Ui()->DoEditBox(&s_VoteCommandInput, &Button, 14.0f); - } - } -} - -void CMenus::RenderInGameNetwork(CUIRect MainView) -{ - MainView.Draw(ms_ColorTabbarActive, IGraphics::CORNER_B, 10.0f); - - CUIRect TabBar, Button; - MainView.HSplitTop(24.0f, &TabBar, &MainView); - - int NewPage = g_Config.m_UiPage; - - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - - TabBar.VSplitLeft(75.0f, &Button, &TabBar); - static CButtonContainer s_InternetButton; - if(DoButton_MenuTab(&s_InternetButton, FONT_ICON_EARTH_AMERICAS, g_Config.m_UiPage == PAGE_INTERNET, &Button, IGraphics::CORNER_NONE)) - { - NewPage = PAGE_INTERNET; - } - GameClient()->m_Tooltips.DoToolTip(&s_InternetButton, &Button, Localize("Internet")); - - TabBar.VSplitLeft(75.0f, &Button, &TabBar); - static CButtonContainer s_LanButton; - if(DoButton_MenuTab(&s_LanButton, FONT_ICON_NETWORK_WIRED, g_Config.m_UiPage == PAGE_LAN, &Button, IGraphics::CORNER_NONE)) - { - NewPage = PAGE_LAN; - } - GameClient()->m_Tooltips.DoToolTip(&s_LanButton, &Button, Localize("LAN")); - - TabBar.VSplitLeft(75.0f, &Button, &TabBar); - static CButtonContainer s_FavoritesButton; - if(DoButton_MenuTab(&s_FavoritesButton, FONT_ICON_STAR, g_Config.m_UiPage == PAGE_FAVORITES, &Button, IGraphics::CORNER_NONE)) - { - NewPage = PAGE_FAVORITES; - } - GameClient()->m_Tooltips.DoToolTip(&s_FavoritesButton, &Button, Localize("Favorites")); - - size_t FavoriteCommunityIndex = 0; - static CButtonContainer s_aFavoriteCommunityButtons[5]; - static_assert(std::size(s_aFavoriteCommunityButtons) == (size_t)PAGE_FAVORITE_COMMUNITY_5 - PAGE_FAVORITE_COMMUNITY_1 + 1); - for(const CCommunity *pCommunity : ServerBrowser()->FavoriteCommunities()) - { - TabBar.VSplitLeft(75.0f, &Button, &TabBar); - const int Page = PAGE_FAVORITE_COMMUNITY_1 + FavoriteCommunityIndex; - if(DoButton_MenuTab(&s_aFavoriteCommunityButtons[FavoriteCommunityIndex], FONT_ICON_ELLIPSIS, g_Config.m_UiPage == Page, &Button, IGraphics::CORNER_NONE, nullptr, nullptr, nullptr, nullptr, 10.0f, FindCommunityIcon(pCommunity->Id()))) - { - NewPage = Page; - } - GameClient()->m_Tooltips.DoToolTip(&s_aFavoriteCommunityButtons[FavoriteCommunityIndex], &Button, pCommunity->Name()); - - ++FavoriteCommunityIndex; - if(FavoriteCommunityIndex >= std::size(s_aFavoriteCommunityButtons)) - break; - } - - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - - if(NewPage != g_Config.m_UiPage) - { - SetMenuPage(NewPage); - } - - RenderServerbrowser(MainView); -} - -// ghost stuff -int CMenus::GhostlistFetchCallback(const CFsFileInfo *pInfo, int IsDir, int StorageType, void *pUser) -{ - CMenus *pSelf = (CMenus *)pUser; - const char *pMap = pSelf->Client()->GetCurrentMap(); - if(IsDir || !str_endswith(pInfo->m_pName, ".gho") || !str_startswith(pInfo->m_pName, pMap)) - return 0; - - char aFilename[IO_MAX_PATH_LENGTH]; - str_format(aFilename, sizeof(aFilename), "%s/%s", pSelf->m_pClient->m_Ghost.GetGhostDir(), pInfo->m_pName); - - CGhostInfo Info; - if(!pSelf->m_pClient->m_Ghost.GhostLoader()->GetGhostInfo(aFilename, &Info, pMap, pSelf->Client()->GetCurrentMapSha256(), pSelf->Client()->GetCurrentMapCrc())) - return 0; - - CGhostItem Item; - str_copy(Item.m_aFilename, aFilename); - str_copy(Item.m_aPlayer, Info.m_aOwner); - Item.m_Date = pInfo->m_TimeModified; - Item.m_Time = Info.m_Time; - if(Item.m_Time > 0) - pSelf->m_vGhosts.push_back(Item); - - if(time_get_nanoseconds() - pSelf->m_GhostPopulateStartTime > 500ms) - { - pSelf->RenderLoading(Localize("Loading ghost files"), "", 0); - } - - return 0; -} - -void CMenus::GhostlistPopulate() -{ - m_vGhosts.clear(); - m_GhostPopulateStartTime = time_get_nanoseconds(); - Storage()->ListDirectoryInfo(IStorage::TYPE_ALL, m_pClient->m_Ghost.GetGhostDir(), GhostlistFetchCallback, this); - SortGhostlist(); - - CGhostItem *pOwnGhost = 0; - for(auto &Ghost : m_vGhosts) - { - Ghost.m_Failed = false; - if(str_comp(Ghost.m_aPlayer, Client()->PlayerName()) == 0 && (!pOwnGhost || Ghost < *pOwnGhost)) - pOwnGhost = &Ghost; - } - - if(pOwnGhost) - { - pOwnGhost->m_Own = true; - pOwnGhost->m_Slot = m_pClient->m_Ghost.Load(pOwnGhost->m_aFilename); - } -} - -CMenus::CGhostItem *CMenus::GetOwnGhost() -{ - for(auto &Ghost : m_vGhosts) - if(Ghost.m_Own) - return &Ghost; - return nullptr; -} - -void CMenus::UpdateOwnGhost(CGhostItem Item) -{ - int Own = -1; - for(size_t i = 0; i < m_vGhosts.size(); i++) - if(m_vGhosts[i].m_Own) - Own = i; - - if(Own == -1) - { - Item.m_Own = true; - } - else if(g_Config.m_ClRaceGhostSaveBest && (Item.HasFile() || !m_vGhosts[Own].HasFile())) - { - Item.m_Own = true; - DeleteGhostItem(Own); - } - else if(m_vGhosts[Own].m_Time > Item.m_Time) - { - Item.m_Own = true; - m_vGhosts[Own].m_Own = false; - m_vGhosts[Own].m_Slot = -1; - } - else - { - Item.m_Own = false; - Item.m_Slot = -1; - } - - Item.m_Date = std::time(0); - Item.m_Failed = false; - m_vGhosts.insert(std::lower_bound(m_vGhosts.begin(), m_vGhosts.end(), Item), Item); - SortGhostlist(); -} - -void CMenus::DeleteGhostItem(int Index) -{ - if(m_vGhosts[Index].HasFile()) - Storage()->RemoveFile(m_vGhosts[Index].m_aFilename, IStorage::TYPE_SAVE); - m_vGhosts.erase(m_vGhosts.begin() + Index); -} - -void CMenus::SortGhostlist() -{ - if(g_Config.m_GhSort == GHOST_SORT_NAME) - std::stable_sort(m_vGhosts.begin(), m_vGhosts.end(), [](const CGhostItem &Left, const CGhostItem &Right) { - return g_Config.m_GhSortOrder ? (str_comp(Left.m_aPlayer, Right.m_aPlayer) > 0) : (str_comp(Left.m_aPlayer, Right.m_aPlayer) < 0); - }); - else if(g_Config.m_GhSort == GHOST_SORT_TIME) - std::stable_sort(m_vGhosts.begin(), m_vGhosts.end(), [](const CGhostItem &Left, const CGhostItem &Right) { - return g_Config.m_GhSortOrder ? (Left.m_Time > Right.m_Time) : (Left.m_Time < Right.m_Time); - }); - else if(g_Config.m_GhSort == GHOST_SORT_DATE) - std::stable_sort(m_vGhosts.begin(), m_vGhosts.end(), [](const CGhostItem &Left, const CGhostItem &Right) { - return g_Config.m_GhSortOrder ? (Left.m_Date > Right.m_Date) : (Left.m_Date < Right.m_Date); - }); -} - -void CMenus::RenderGhost(CUIRect MainView) -{ - // render background - MainView.Draw(ms_ColorTabbarActive, IGraphics::CORNER_B, 10.0f); - - MainView.HSplitTop(10.0f, 0, &MainView); - MainView.HSplitBottom(5.0f, &MainView, 0); - MainView.VSplitLeft(5.0f, 0, &MainView); - MainView.VSplitRight(5.0f, &MainView, 0); - - CUIRect Headers, Status; - CUIRect View = MainView; - - View.HSplitTop(17.0f, &Headers, &View); - View.HSplitBottom(28.0f, &View, &Status); - - // split of the scrollbar - Headers.Draw(ColorRGBA(1, 1, 1, 0.25f), IGraphics::CORNER_T, 5.0f); - Headers.VSplitRight(20.0f, &Headers, 0); - - class CColumn - { - public: - const char *m_pCaption; - int m_Id; - int m_Sort; - float m_Width; - CUIRect m_Rect; - }; - - enum - { - COL_ACTIVE = 0, - COL_NAME, - COL_TIME, - COL_DATE, - }; - - static CColumn s_aCols[] = { - {"", -1, GHOST_SORT_NONE, 2.0f, {0}}, - {"", COL_ACTIVE, GHOST_SORT_NONE, 30.0f, {0}}, - {Localizable("Name"), COL_NAME, GHOST_SORT_NAME, 200.0f, {0}}, - {Localizable("Time"), COL_TIME, GHOST_SORT_TIME, 90.0f, {0}}, - {Localizable("Date"), COL_DATE, GHOST_SORT_DATE, 150.0f, {0}}, - }; - - int NumCols = std::size(s_aCols); - - // do layout - for(int i = 0; i < NumCols; i++) - { - Headers.VSplitLeft(s_aCols[i].m_Width, &s_aCols[i].m_Rect, &Headers); - - if(i + 1 < NumCols) - Headers.VSplitLeft(2, nullptr, &Headers); - } - - // do headers - for(const auto &Col : s_aCols) - { - if(DoButton_GridHeader(&Col.m_Id, Localize(Col.m_pCaption), g_Config.m_GhSort == Col.m_Sort, &Col.m_Rect)) - { - if(Col.m_Sort != GHOST_SORT_NONE) - { - if(g_Config.m_GhSort == Col.m_Sort) - g_Config.m_GhSortOrder ^= 1; - else - g_Config.m_GhSortOrder = 0; - g_Config.m_GhSort = Col.m_Sort; - - SortGhostlist(); - } - } - } - - View.Draw(ColorRGBA(0, 0, 0, 0.15f), 0, 0); - - const int NumGhosts = m_vGhosts.size(); - int NumFailed = 0; - int NumActivated = 0; - static int s_SelectedIndex = 0; - static CListBox s_ListBox; - s_ListBox.DoStart(17.0f, NumGhosts, 1, 3, s_SelectedIndex, &View, false); - - for(int i = 0; i < NumGhosts; i++) - { - const CGhostItem *pGhost = &m_vGhosts[i]; - const CListboxItem Item = s_ListBox.DoNextItem(pGhost); - - if(pGhost->m_Failed) - NumFailed++; - if(pGhost->Active()) - NumActivated++; - - if(!Item.m_Visible) - continue; - - ColorRGBA rgb = ColorRGBA(1.0f, 1.0f, 1.0f); - if(pGhost->m_Own) - rgb = color_cast(ColorHSLA(0.33f, 1.0f, 0.75f)); - - if(pGhost->m_Failed) - rgb = ColorRGBA(0.6f, 0.6f, 0.6f, 1.0f); - - TextRender()->TextColor(rgb.WithAlpha(pGhost->HasFile() ? 1.0f : 0.5f)); - - for(int c = 0; c < NumCols; c++) - { - CUIRect Button; - Button.x = s_aCols[c].m_Rect.x; - Button.y = Item.m_Rect.y; - Button.h = Item.m_Rect.h; - Button.w = s_aCols[c].m_Rect.w; - - int Id = s_aCols[c].m_Id; - - if(Id == COL_ACTIVE) - { - if(pGhost->Active()) - { - Graphics()->WrapClamp(); - Graphics()->TextureSet(GameClient()->m_EmoticonsSkin.m_aSpriteEmoticons[(SPRITE_OOP + 7) - SPRITE_OOP]); - Graphics()->QuadsBegin(); - IGraphics::CQuadItem QuadItem(Button.x + Button.w / 2, Button.y + Button.h / 2, 20.0f, 20.0f); - Graphics()->QuadsDraw(&QuadItem, 1); - - Graphics()->QuadsEnd(); - Graphics()->WrapNormal(); - } - } - else if(Id == COL_NAME) - { - Ui()->DoLabel(&Button, pGhost->m_aPlayer, 12.0f, TEXTALIGN_ML); - } - else if(Id == COL_TIME) - { - char aBuf[64]; - str_time(pGhost->m_Time / 10, TIME_HOURS_CENTISECS, aBuf, sizeof(aBuf)); - Ui()->DoLabel(&Button, aBuf, 12.0f, TEXTALIGN_ML); - } - else if(Id == COL_DATE) - { - char aBuf[64]; - str_timestamp_ex(pGhost->m_Date, aBuf, sizeof(aBuf), FORMAT_SPACE); - Ui()->DoLabel(&Button, aBuf, 12.0f, TEXTALIGN_ML); - } - } - - TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); - } - - s_SelectedIndex = s_ListBox.DoEnd(); - - Status.Draw(ColorRGBA(1, 1, 1, 0.25f), IGraphics::CORNER_B, 5.0f); - Status.Margin(5.0f, &Status); - - CUIRect Button; - Status.VSplitLeft(25.0f, &Button, &Status); - - static CButtonContainer s_ReloadButton; - static CButtonContainer s_DirectoryButton; - static CButtonContainer s_ActivateAll; - - if(DoButton_FontIcon(&s_ReloadButton, FONT_ICON_ARROW_ROTATE_RIGHT, 0, &Button) || Input()->KeyPress(KEY_F5) || (Input()->KeyPress(KEY_R) && Input()->ModifierIsPressed())) - { - m_pClient->m_Ghost.UnloadAll(); - GhostlistPopulate(); - } - - Status.VSplitLeft(5.0f, &Button, &Status); - Status.VSplitLeft(175.0f, &Button, &Status); - if(DoButton_Menu(&s_DirectoryButton, Localize("Ghosts directory"), 0, &Button)) - { - char aBuf[IO_MAX_PATH_LENGTH]; - Storage()->GetCompletePath(IStorage::TYPE_SAVE, "ghosts", aBuf, sizeof(aBuf)); - Storage()->CreateFolder("ghosts", IStorage::TYPE_SAVE); - Client()->ViewFile(aBuf); - } - - Status.VSplitLeft(5.0f, &Button, &Status); - if(NumGhosts - NumFailed > 0) - { - Status.VSplitLeft(175.0f, &Button, &Status); - bool ActivateAll = ((NumGhosts - NumFailed) != NumActivated) && m_pClient->m_Ghost.FreeSlots(); - - const char *pActionText = ActivateAll ? Localize("Activate all") : Localize("Deactivate all"); - if(DoButton_Menu(&s_ActivateAll, pActionText, 0, &Button)) - { - for(int i = 0; i < NumGhosts; i++) - { - CGhostItem *pGhost = &m_vGhosts[i]; - if(pGhost->m_Failed || (ActivateAll && pGhost->m_Slot != -1)) - continue; - - if(ActivateAll) - { - if(!m_pClient->m_Ghost.FreeSlots()) - break; - - pGhost->m_Slot = m_pClient->m_Ghost.Load(pGhost->m_aFilename); - if(pGhost->m_Slot == -1) - pGhost->m_Failed = true; - } - else - { - m_pClient->m_Ghost.UnloadAll(); - pGhost->m_Slot = -1; - } - } - } - } - - if(s_SelectedIndex == -1 || s_SelectedIndex >= (int)m_vGhosts.size()) - return; - - CGhostItem *pGhost = &m_vGhosts[s_SelectedIndex]; - - CGhostItem *pOwnGhost = GetOwnGhost(); - int ReservedSlots = !pGhost->m_Own && !(pOwnGhost && pOwnGhost->Active()); - if(!pGhost->m_Failed && pGhost->HasFile() && (pGhost->Active() || m_pClient->m_Ghost.FreeSlots() > ReservedSlots)) - { - Status.VSplitRight(120.0f, &Status, &Button); - - static CButtonContainer s_GhostButton; - const char *pText = pGhost->Active() ? Localize("Deactivate") : Localize("Activate"); - if(DoButton_Menu(&s_GhostButton, pText, 0, &Button) || s_ListBox.WasItemActivated()) - { - if(pGhost->Active()) - { - m_pClient->m_Ghost.Unload(pGhost->m_Slot); - pGhost->m_Slot = -1; - } - else - { - pGhost->m_Slot = m_pClient->m_Ghost.Load(pGhost->m_aFilename); - if(pGhost->m_Slot == -1) - pGhost->m_Failed = true; - } - } - Status.VSplitRight(5.0f, &Status, 0); - } - - Status.VSplitRight(120.0f, &Status, &Button); - - static CButtonContainer s_DeleteButton; - if(DoButton_Menu(&s_DeleteButton, Localize("Delete"), 0, &Button)) - { - if(pGhost->Active()) - m_pClient->m_Ghost.Unload(pGhost->m_Slot); - DeleteGhostItem(s_SelectedIndex); - } - - Status.VSplitRight(5.0f, &Status, 0); - - bool Recording = m_pClient->m_Ghost.GhostRecorder()->IsRecording(); - if(!pGhost->HasFile() && !Recording && pGhost->Active()) - { - static CButtonContainer s_SaveButton; - Status.VSplitRight(120.0f, &Status, &Button); - if(DoButton_Menu(&s_SaveButton, Localize("Save"), 0, &Button)) - m_pClient->m_Ghost.SaveGhost(pGhost); - } -} - -void CMenus::RenderIngameHint() -{ - // With touch controls enabled there is a Close button in the menu and usually no Escape key available. - if(g_Config.m_ClTouchControls) - return; - - float Width = 300 * Graphics()->ScreenAspect(); - Graphics()->MapScreen(0, 0, Width, 300); - TextRender()->TextColor(1, 1, 1, 1); - TextRender()->Text(5, 280, 5, Localize("Menu opened. Press Esc key again to close menu."), -1.0f); - Ui()->MapScreen(); -} diff --git a/src/game/client/components/menus_settings.cpp b/src/game/client/components/menus_settings.cpp deleted file mode 100644 index 97cca1b8c2..0000000000 --- a/src/game/client/components/menus_settings.cpp +++ /dev/null @@ -1,3502 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "binds.h" -#include "countryflags.h" -#include "menus.h" -#include "skins.h" - -#include -#include -#include -#include -#include -#include - -using namespace FontIcons; -using namespace std::chrono_literals; - -CMenusKeyBinder CMenus::m_Binder; - -CMenusKeyBinder::CMenusKeyBinder() -{ - m_pKeyReaderId = nullptr; - m_TakeKey = false; - m_GotKey = false; - m_ModifierCombination = CBinds::MODIFIER_NONE; -} - -bool CMenusKeyBinder::OnInput(const IInput::CEvent &Event) -{ - if(m_TakeKey) - { - int TriggeringEvent = (Event.m_Key == KEY_MOUSE_1) ? IInput::FLAG_PRESS : IInput::FLAG_RELEASE; - if(Event.m_Flags & TriggeringEvent) - { - m_Key = Event; - m_GotKey = true; - m_TakeKey = false; - - m_ModifierCombination = CBinds::GetModifierMask(Input()); - if(m_ModifierCombination == CBinds::GetModifierMaskOfKey(Event.m_Key)) - { - m_ModifierCombination = CBinds::MODIFIER_NONE; - } - } - return true; - } - - return false; -} - -void CMenus::RenderSettingsGeneral(CUIRect MainView) -{ - char aBuf[128 + IO_MAX_PATH_LENGTH]; - CUIRect Label, Button, Left, Right, Game, ClientSettings; - MainView.HSplitTop(150.0f, &Game, &ClientSettings); - - // game - { - // headline - Game.HSplitTop(30.0f, &Label, &Game); - Ui()->DoLabel(&Label, Localize("Game"), 20.0f, TEXTALIGN_ML); - Game.HSplitTop(5.0f, nullptr, &Game); - Game.VSplitMid(&Left, nullptr, 20.0f); - - // dynamic camera - Left.HSplitTop(20.0f, &Button, &Left); - const bool IsDyncam = g_Config.m_ClDyncam || g_Config.m_ClMouseFollowfactor > 0; - if(DoButton_CheckBox(&g_Config.m_ClDyncam, Localize("Dynamic Camera"), IsDyncam, &Button)) - { - if(IsDyncam) - { - g_Config.m_ClDyncam = 0; - g_Config.m_ClMouseFollowfactor = 0; - } - else - { - g_Config.m_ClDyncam = 1; - } - } - - // smooth dynamic camera - Left.HSplitTop(5.0f, nullptr, &Left); - Left.HSplitTop(20.0f, &Button, &Left); - if(g_Config.m_ClDyncam) - { - if(DoButton_CheckBox(&g_Config.m_ClDyncamSmoothness, Localize("Smooth Dynamic Camera"), g_Config.m_ClDyncamSmoothness, &Button)) - { - if(g_Config.m_ClDyncamSmoothness) - { - g_Config.m_ClDyncamSmoothness = 0; - } - else - { - g_Config.m_ClDyncamSmoothness = 50; - g_Config.m_ClDyncamStabilizing = 50; - } - } - } - - // weapon pickup - Left.HSplitTop(5.0f, nullptr, &Left); - Left.HSplitTop(20.0f, &Button, &Left); - if(DoButton_CheckBox(&g_Config.m_ClAutoswitchWeapons, Localize("Switch weapon on pickup"), g_Config.m_ClAutoswitchWeapons, &Button)) - g_Config.m_ClAutoswitchWeapons ^= 1; - - // weapon out of ammo autoswitch - Left.HSplitTop(5.0f, nullptr, &Left); - Left.HSplitTop(20.0f, &Button, &Left); - if(DoButton_CheckBox(&g_Config.m_ClAutoswitchWeaponsOutOfAmmo, Localize("Switch weapon when out of ammo"), g_Config.m_ClAutoswitchWeaponsOutOfAmmo, &Button)) - g_Config.m_ClAutoswitchWeaponsOutOfAmmo ^= 1; - } - - // client - { - // headline - ClientSettings.HSplitTop(30.0f, &Label, &ClientSettings); - Ui()->DoLabel(&Label, Localize("Client"), 20.0f, TEXTALIGN_ML); - ClientSettings.HSplitTop(5.0f, nullptr, &ClientSettings); - ClientSettings.VSplitMid(&Left, &Right, 20.0f); - - // skip main menu - Left.HSplitTop(20.0f, &Button, &Left); - if(DoButton_CheckBox(&g_Config.m_ClSkipStartMenu, Localize("Skip the main menu"), g_Config.m_ClSkipStartMenu, &Button)) - g_Config.m_ClSkipStartMenu ^= 1; - - Left.HSplitTop(10.0f, nullptr, &Left); - Left.HSplitTop(20.0f, &Button, &Left); - str_copy(aBuf, " "); - str_append(aBuf, Localize("Hz", "Hertz")); - Ui()->DoScrollbarOption(&g_Config.m_ClRefreshRate, &g_Config.m_ClRefreshRate, &Button, Localize("Refresh Rate"), 10, 10000, &CUi::ms_LogarithmicScrollbarScale, CUi::SCROLLBAR_OPTION_INFINITE, aBuf); - Left.HSplitTop(5.0f, nullptr, &Left); - Left.HSplitTop(20.0f, &Button, &Left); - static int s_LowerRefreshRate; - if(DoButton_CheckBox(&s_LowerRefreshRate, Localize("Save power by lowering refresh rate (higher input latency)"), g_Config.m_ClRefreshRate <= 480 && g_Config.m_ClRefreshRate != 0, &Button)) - g_Config.m_ClRefreshRate = g_Config.m_ClRefreshRate > 480 || g_Config.m_ClRefreshRate == 0 ? 480 : 0; - - CUIRect SettingsButton; - Left.HSplitBottom(20.0f, &Left, &SettingsButton); - Left.HSplitBottom(5.0f, &Left, nullptr); - static CButtonContainer s_SettingsButtonId; - if(DoButton_Menu(&s_SettingsButtonId, Localize("Settings file"), 0, &SettingsButton)) - { - Storage()->GetCompletePath(IStorage::TYPE_SAVE, CONFIG_FILE, aBuf, sizeof(aBuf)); - Client()->ViewFile(aBuf); - } - GameClient()->m_Tooltips.DoToolTip(&s_SettingsButtonId, &SettingsButton, Localize("Open the settings file")); - - CUIRect ConfigButton; - Left.HSplitBottom(20.0f, &Left, &ConfigButton); - Left.HSplitBottom(5.0f, &Left, nullptr); - static CButtonContainer s_ConfigButtonId; - if(DoButton_Menu(&s_ConfigButtonId, Localize("Config directory"), 0, &ConfigButton)) - { - Storage()->GetCompletePath(IStorage::TYPE_SAVE, "", aBuf, sizeof(aBuf)); - Client()->ViewFile(aBuf); - } - GameClient()->m_Tooltips.DoToolTip(&s_ConfigButtonId, &ConfigButton, Localize("Open the directory that contains the configuration and user files")); - - CUIRect DirectoryButton; - Left.HSplitBottom(20.0f, &Left, &DirectoryButton); - Left.HSplitBottom(5.0f, &Left, nullptr); - static CButtonContainer s_ThemesButtonId; - if(DoButton_Menu(&s_ThemesButtonId, Localize("Themes directory"), 0, &DirectoryButton)) - { - Storage()->GetCompletePath(IStorage::TYPE_SAVE, "themes", aBuf, sizeof(aBuf)); - Storage()->CreateFolder("themes", IStorage::TYPE_SAVE); - Client()->ViewFile(aBuf); - } - GameClient()->m_Tooltips.DoToolTip(&s_ThemesButtonId, &DirectoryButton, Localize("Open the directory to add custom themes")); - - Left.HSplitTop(20.0f, nullptr, &Left); - RenderThemeSelection(Left); - - // auto demo settings - { - Right.HSplitTop(40.0f, nullptr, &Right); - Right.HSplitTop(20.0f, &Button, &Right); - if(DoButton_CheckBox(&g_Config.m_ClAutoDemoRecord, Localize("Automatically record demos"), g_Config.m_ClAutoDemoRecord, &Button)) - g_Config.m_ClAutoDemoRecord ^= 1; - - Right.HSplitTop(2 * 20.0f, &Button, &Right); - if(g_Config.m_ClAutoDemoRecord) - Ui()->DoScrollbarOption(&g_Config.m_ClAutoDemoMax, &g_Config.m_ClAutoDemoMax, &Button, Localize("Max demos"), 1, 1000, &CUi::ms_LinearScrollbarScale, CUi::SCROLLBAR_OPTION_INFINITE | CUi::SCROLLBAR_OPTION_MULTILINE); - - Right.HSplitTop(10.0f, nullptr, &Right); - Right.HSplitTop(20.0f, &Button, &Right); - if(DoButton_CheckBox(&g_Config.m_ClAutoScreenshot, Localize("Automatically take game over screenshot"), g_Config.m_ClAutoScreenshot, &Button)) - g_Config.m_ClAutoScreenshot ^= 1; - - Right.HSplitTop(2 * 20.0f, &Button, &Right); - if(g_Config.m_ClAutoScreenshot) - Ui()->DoScrollbarOption(&g_Config.m_ClAutoScreenshotMax, &g_Config.m_ClAutoScreenshotMax, &Button, Localize("Max Screenshots"), 1, 1000, &CUi::ms_LinearScrollbarScale, CUi::SCROLLBAR_OPTION_INFINITE | CUi::SCROLLBAR_OPTION_MULTILINE); - } - - // auto statboard screenshot - { - Right.HSplitTop(10.0f, nullptr, &Right); - Right.HSplitTop(20.0f, &Button, &Right); - if(DoButton_CheckBox(&g_Config.m_ClAutoStatboardScreenshot, Localize("Automatically take statboard screenshot"), g_Config.m_ClAutoStatboardScreenshot, &Button)) - { - g_Config.m_ClAutoStatboardScreenshot ^= 1; - } - - Right.HSplitTop(2 * 20.0f, &Button, &Right); - if(g_Config.m_ClAutoStatboardScreenshot) - Ui()->DoScrollbarOption(&g_Config.m_ClAutoStatboardScreenshotMax, &g_Config.m_ClAutoStatboardScreenshotMax, &Button, Localize("Max Screenshots"), 1, 1000, &CUi::ms_LinearScrollbarScale, CUi::SCROLLBAR_OPTION_INFINITE | CUi::SCROLLBAR_OPTION_MULTILINE); - } - - // auto statboard csv - { - Right.HSplitTop(10.0f, nullptr, &Right); - Right.HSplitTop(20.0f, &Button, &Right); - if(DoButton_CheckBox(&g_Config.m_ClAutoCSV, Localize("Automatically create statboard csv"), g_Config.m_ClAutoCSV, &Button)) - { - g_Config.m_ClAutoCSV ^= 1; - } - - Right.HSplitTop(2 * 20.0f, &Button, &Right); - if(g_Config.m_ClAutoCSV) - Ui()->DoScrollbarOption(&g_Config.m_ClAutoCSVMax, &g_Config.m_ClAutoCSVMax, &Button, Localize("Max CSVs"), 1, 1000, &CUi::ms_LinearScrollbarScale, CUi::SCROLLBAR_OPTION_INFINITE | CUi::SCROLLBAR_OPTION_MULTILINE); - } - } -} - -void CMenus::SetNeedSendInfo() -{ - if(m_Dummy) - m_NeedSendDummyinfo = true; - else - m_NeedSendinfo = true; -} - -void CMenus::RenderSettingsPlayer(CUIRect MainView) -{ - CUIRect TabBar, PlayerTab, DummyTab, ChangeInfo, QuickSearch; - MainView.HSplitTop(20.0f, &TabBar, &MainView); - TabBar.VSplitMid(&TabBar, &ChangeInfo, 20.f); - TabBar.VSplitMid(&PlayerTab, &DummyTab); - MainView.HSplitTop(10.0f, nullptr, &MainView); - - static CButtonContainer s_PlayerTabButton; - if(DoButton_MenuTab(&s_PlayerTabButton, Localize("Player"), !m_Dummy, &PlayerTab, IGraphics::CORNER_L, nullptr, nullptr, nullptr, nullptr, 4.0f)) - { - m_Dummy = false; - } - - static CButtonContainer s_DummyTabButton; - if(DoButton_MenuTab(&s_DummyTabButton, Localize("Dummy"), m_Dummy, &DummyTab, IGraphics::CORNER_R, nullptr, nullptr, nullptr, nullptr, 4.0f)) - { - m_Dummy = true; - } - - if(Client()->State() == IClient::STATE_ONLINE && m_pClient->m_NextChangeInfo && m_pClient->m_NextChangeInfo > Client()->GameTick(g_Config.m_ClDummy)) - { - char aChangeInfo[128], aTimeLeft[32]; - str_format(aTimeLeft, sizeof(aTimeLeft), Localize("%ds left"), (m_pClient->m_NextChangeInfo - Client()->GameTick(g_Config.m_ClDummy) + Client()->GameTickSpeed() - 1) / Client()->GameTickSpeed()); - str_format(aChangeInfo, sizeof(aChangeInfo), "%s: %s", Localize("Player info change cooldown"), aTimeLeft); - Ui()->DoLabel(&ChangeInfo, aChangeInfo, 10.f, TEXTALIGN_ML); - } - - static CLineInput s_NameInput; - static CLineInput s_ClanInput; - - int *pCountry; - if(!m_Dummy) - { - pCountry = &g_Config.m_PlayerCountry; - s_NameInput.SetBuffer(g_Config.m_PlayerName, sizeof(g_Config.m_PlayerName)); - s_NameInput.SetEmptyText(Client()->PlayerName()); - s_ClanInput.SetBuffer(g_Config.m_PlayerClan, sizeof(g_Config.m_PlayerClan)); - } - else - { - pCountry = &g_Config.m_ClDummyCountry; - s_NameInput.SetBuffer(g_Config.m_ClDummyName, sizeof(g_Config.m_ClDummyName)); - s_NameInput.SetEmptyText(Client()->DummyName()); - s_ClanInput.SetBuffer(g_Config.m_ClDummyClan, sizeof(g_Config.m_ClDummyClan)); - } - - // player name - CUIRect Button, Label; - MainView.HSplitTop(20.0f, &Button, &MainView); - Button.VSplitLeft(80.0f, &Label, &Button); - Button.VSplitLeft(150.0f, &Button, nullptr); - char aBuf[128]; - str_format(aBuf, sizeof(aBuf), "%s:", Localize("Name")); - Ui()->DoLabel(&Label, aBuf, 14.0f, TEXTALIGN_ML); - if(Ui()->DoEditBox(&s_NameInput, &Button, 14.0f)) - { - SetNeedSendInfo(); - } - - // player clan - MainView.HSplitTop(5.0f, nullptr, &MainView); - MainView.HSplitTop(20.0f, &Button, &MainView); - Button.VSplitLeft(80.0f, &Label, &Button); - Button.VSplitLeft(150.0f, &Button, nullptr); - str_format(aBuf, sizeof(aBuf), "%s:", Localize("Clan")); - Ui()->DoLabel(&Label, aBuf, 14.0f, TEXTALIGN_ML); - if(Ui()->DoEditBox(&s_ClanInput, &Button, 14.0f)) - { - SetNeedSendInfo(); - } - - // country flag selector - static CLineInputBuffered<25> s_FlagFilterInput; - - std::vector vpFilteredFlags; - for(size_t i = 0; i < m_pClient->m_CountryFlags.Num(); ++i) - { - const CCountryFlags::CCountryFlag *pEntry = m_pClient->m_CountryFlags.GetByIndex(i); - if(!str_find_nocase(pEntry->m_aCountryCodeString, s_FlagFilterInput.GetString())) - continue; - vpFilteredFlags.push_back(pEntry); - } - - MainView.HSplitTop(10.0f, nullptr, &MainView); - MainView.HSplitBottom(20.0f, &MainView, &QuickSearch); - MainView.HSplitBottom(5.0f, &MainView, nullptr); - QuickSearch.VSplitLeft(220.0f, &QuickSearch, nullptr); - - int OldSelected = -1; - static CListBox s_ListBox; - s_ListBox.DoStart(48.0f, vpFilteredFlags.size(), 10, 3, OldSelected, &MainView); - - for(size_t i = 0; i < vpFilteredFlags.size(); i++) - { - const CCountryFlags::CCountryFlag *pEntry = vpFilteredFlags[i]; - - if(pEntry->m_CountryCode == *pCountry) - OldSelected = i; - - const CListboxItem Item = s_ListBox.DoNextItem(&pEntry->m_CountryCode, OldSelected >= 0 && (size_t)OldSelected == i); - if(!Item.m_Visible) - continue; - - CUIRect FlagRect; - Item.m_Rect.Margin(5.0f, &FlagRect); - FlagRect.HSplitBottom(12.0f, &FlagRect, &Label); - Label.HSplitTop(2.0f, nullptr, &Label); - const float OldWidth = FlagRect.w; - FlagRect.w = FlagRect.h * 2; - FlagRect.x += (OldWidth - FlagRect.w) / 2.0f; - m_pClient->m_CountryFlags.Render(pEntry->m_CountryCode, ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), FlagRect.x, FlagRect.y, FlagRect.w, FlagRect.h); - - if(pEntry->m_Texture.IsValid()) - { - Ui()->DoLabel(&Label, pEntry->m_aCountryCodeString, 10.0f, TEXTALIGN_MC); - } - } - - const int NewSelected = s_ListBox.DoEnd(); - if(OldSelected != NewSelected) - { - *pCountry = vpFilteredFlags[NewSelected]->m_CountryCode; - SetNeedSendInfo(); - } - - Ui()->DoEditBox_Search(&s_FlagFilterInput, &QuickSearch, 14.0f, !Ui()->IsPopupOpen() && m_pClient->m_GameConsole.IsClosed()); -} - -struct CUISkin -{ - const CSkin *m_pSkin; - - CUISkin() : - m_pSkin(nullptr) {} - CUISkin(const CSkin *pSkin) : - m_pSkin(pSkin) {} - - bool operator<(const CUISkin &Other) const { return str_comp_nocase(m_pSkin->GetName(), Other.m_pSkin->GetName()) < 0; } - - bool operator<(const char *pOther) const { return str_comp_nocase(m_pSkin->GetName(), pOther) < 0; } - bool operator==(const char *pOther) const { return !str_comp_nocase(m_pSkin->GetName(), pOther); } -}; - -void CMenus::Con_AddFavoriteSkin(IConsole::IResult *pResult, void *pUserData) -{ - auto *pSelf = (CMenus *)pUserData; - const char *pStr = pResult->GetString(0); - if(!CSkin::IsValidName(pStr)) - { - log_error("menus/settings", "Favorite skin name '%s' is not valid", pStr); - log_error("menus/settings", "%s", CSkin::m_aSkinNameRestrictions); - return; - } - pSelf->m_SkinFavorites.emplace(pStr); - pSelf->m_SkinListLastRefreshTime = std::nullopt; -} - -void CMenus::Con_RemFavoriteSkin(IConsole::IResult *pResult, void *pUserData) -{ - auto *pSelf = (CMenus *)pUserData; - const auto it = pSelf->m_SkinFavorites.find(pResult->GetString(0)); - if(it != pSelf->m_SkinFavorites.end()) - { - pSelf->m_SkinFavorites.erase(it); - pSelf->m_SkinListLastRefreshTime = std::nullopt; - } -} - -void CMenus::ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData) -{ - auto *pSelf = (CMenus *)pUserData; - pSelf->OnConfigSave(pConfigManager); -} - -void CMenus::OnConfigSave(IConfigManager *pConfigManager) -{ - for(const auto &Entry : m_SkinFavorites) - { - char aBuffer[256]; - str_format(aBuffer, std::size(aBuffer), "add_favorite_skin \"%s\"", Entry.c_str()); - pConfigManager->WriteLine(aBuffer); - } -} - -void CMenus::RenderSettingsTee(CUIRect MainView) -{ - CUIRect TabBar, PlayerTab, DummyTab, ChangeInfo; - MainView.HSplitTop(20.0f, &TabBar, &MainView); - TabBar.VSplitMid(&TabBar, &ChangeInfo, 20.f); - TabBar.VSplitMid(&PlayerTab, &DummyTab); - MainView.HSplitTop(10.0f, nullptr, &MainView); - - static CButtonContainer s_PlayerTabButton; - if(DoButton_MenuTab(&s_PlayerTabButton, Localize("Player"), !m_Dummy, &PlayerTab, IGraphics::CORNER_L, nullptr, nullptr, nullptr, nullptr, 4.0f)) - { - m_Dummy = false; - m_SkinListScrollToSelected = true; - } - - static CButtonContainer s_DummyTabButton; - if(DoButton_MenuTab(&s_DummyTabButton, Localize("Dummy"), m_Dummy, &DummyTab, IGraphics::CORNER_R, nullptr, nullptr, nullptr, nullptr, 4.0f)) - { - m_Dummy = true; - m_SkinListScrollToSelected = true; - } - - if(Client()->State() == IClient::STATE_ONLINE && m_pClient->m_NextChangeInfo && m_pClient->m_NextChangeInfo > Client()->GameTick(g_Config.m_ClDummy)) - { - char aChangeInfo[128], aTimeLeft[32]; - str_format(aTimeLeft, sizeof(aTimeLeft), Localize("%ds left"), (m_pClient->m_NextChangeInfo - Client()->GameTick(g_Config.m_ClDummy) + Client()->GameTickSpeed() - 1) / Client()->GameTickSpeed()); - str_format(aChangeInfo, sizeof(aChangeInfo), "%s: %s", Localize("Player info change cooldown"), aTimeLeft); - Ui()->DoLabel(&ChangeInfo, aChangeInfo, 10.f, TEXTALIGN_ML); - } - - char *pSkinName; - size_t SkinNameSize; - int *pUseCustomColor; - unsigned *pColorBody; - unsigned *pColorFeet; - int *pEmote; - if(!m_Dummy) - { - pSkinName = g_Config.m_ClPlayerSkin; - SkinNameSize = sizeof(g_Config.m_ClPlayerSkin); - pUseCustomColor = &g_Config.m_ClPlayerUseCustomColor; - pColorBody = &g_Config.m_ClPlayerColorBody; - pColorFeet = &g_Config.m_ClPlayerColorFeet; - pEmote = &g_Config.m_ClPlayerDefaultEyes; - } - else - { - pSkinName = g_Config.m_ClDummySkin; - SkinNameSize = sizeof(g_Config.m_ClDummySkin); - pUseCustomColor = &g_Config.m_ClDummyUseCustomColor; - pColorBody = &g_Config.m_ClDummyColorBody; - pColorFeet = &g_Config.m_ClDummyColorFeet; - pEmote = &g_Config.m_ClDummyDefaultEyes; - } - - const float EyeButtonSize = 40.0f; - const bool RenderEyesBelow = MainView.w < 750.0f; - CUIRect YourSkin, Checkboxes, SkinPrefix, Eyes, Button, Label; - MainView.HSplitTop(90.0f, &YourSkin, &MainView); - if(RenderEyesBelow) - { - YourSkin.VSplitLeft(MainView.w * 0.45f, &YourSkin, &Checkboxes); - Checkboxes.VSplitLeft(MainView.w * 0.35f, &Checkboxes, &SkinPrefix); - MainView.HSplitTop(5.0f, nullptr, &MainView); - MainView.HSplitTop(EyeButtonSize, &Eyes, &MainView); - Eyes.VSplitRight(EyeButtonSize * NUM_EMOTES + 5.0f * (NUM_EMOTES - 1), nullptr, &Eyes); - } - else - { - YourSkin.VSplitRight(3 * EyeButtonSize + 2 * 5.0f, &YourSkin, &Eyes); - const float RemainderWidth = YourSkin.w; - YourSkin.VSplitLeft(RemainderWidth * 0.4f, &YourSkin, &Checkboxes); - Checkboxes.VSplitLeft(RemainderWidth * 0.35f, &Checkboxes, &SkinPrefix); - SkinPrefix.VSplitRight(20.0f, &SkinPrefix, nullptr); - } - YourSkin.VSplitRight(20.0f, &YourSkin, nullptr); - Checkboxes.VSplitRight(20.0f, &Checkboxes, nullptr); - - // Checkboxes - Checkboxes.HSplitTop(20.0f, &Button, &Checkboxes); - if(DoButton_CheckBox(&g_Config.m_ClDownloadSkins, Localize("Download skins"), g_Config.m_ClDownloadSkins, &Button)) - { - g_Config.m_ClDownloadSkins ^= 1; - m_pClient->RefreshSkins(); - } - - Checkboxes.HSplitTop(20.0f, &Button, &Checkboxes); - if(DoButton_CheckBox(&g_Config.m_ClDownloadCommunitySkins, Localize("Download community skins"), g_Config.m_ClDownloadCommunitySkins, &Button)) - { - g_Config.m_ClDownloadCommunitySkins ^= 1; - m_pClient->RefreshSkins(); - } - - Checkboxes.HSplitTop(20.0f, &Button, &Checkboxes); - if(DoButton_CheckBox(&g_Config.m_ClVanillaSkinsOnly, Localize("Vanilla skins only"), g_Config.m_ClVanillaSkinsOnly, &Button)) - { - g_Config.m_ClVanillaSkinsOnly ^= 1; - m_pClient->RefreshSkins(); - } - - Checkboxes.HSplitTop(20.0f, &Button, &Checkboxes); - if(DoButton_CheckBox(&g_Config.m_ClFatSkins, Localize("Fat skins (DDFat)"), g_Config.m_ClFatSkins, &Button)) - { - g_Config.m_ClFatSkins ^= 1; - } - - // Skin prefix - { - SkinPrefix.HSplitTop(20.0f, &Label, &SkinPrefix); - Ui()->DoLabel(&Label, Localize("Skin prefix"), 14.0f, TEXTALIGN_ML); - - SkinPrefix.HSplitTop(20.0f, &Button, &SkinPrefix); - static CLineInput s_SkinPrefixInput(g_Config.m_ClSkinPrefix, sizeof(g_Config.m_ClSkinPrefix)); - Ui()->DoClearableEditBox(&s_SkinPrefixInput, &Button, 14.0f); - - SkinPrefix.HSplitTop(2.0f, nullptr, &SkinPrefix); - - static const char *s_apSkinPrefixes[] = {"kitty", "santa"}; - static CButtonContainer s_aPrefixButtons[std::size(s_apSkinPrefixes)]; - for(size_t i = 0; i < std::size(s_apSkinPrefixes); i++) - { - SkinPrefix.HSplitTop(20.0f, &Button, &SkinPrefix); - Button.HMargin(2.0f, &Button); - if(DoButton_Menu(&s_aPrefixButtons[i], s_apSkinPrefixes[i], 0, &Button)) - { - str_copy(g_Config.m_ClSkinPrefix, s_apSkinPrefixes[i]); - } - } - } - - // Player skin area - CUIRect CustomColorsButton, RandomSkinButton; - YourSkin.HSplitTop(20.0f, &Label, &YourSkin); - YourSkin.HSplitBottom(20.0f, &YourSkin, &CustomColorsButton); - CustomColorsButton.VSplitRight(30.0f, &CustomColorsButton, &RandomSkinButton); - CustomColorsButton.VSplitRight(20.0f, &CustomColorsButton, nullptr); - YourSkin.VSplitLeft(65.0f, &YourSkin, &Button); - Button.VSplitLeft(5.0f, nullptr, &Button); - Button.HMargin((Button.h - 20.0f) / 2.0f, &Button); - - char aBuf[128 + IO_MAX_PATH_LENGTH]; - str_format(aBuf, sizeof(aBuf), "%s:", Localize("Your skin")); - Ui()->DoLabel(&Label, aBuf, 14.0f, TEXTALIGN_ML); - - // Note: get the skin info after the settings buttons, because they can trigger a refresh - // which invalidates the skin. - CTeeRenderInfo OwnSkinInfo; - OwnSkinInfo.Apply(m_pClient->m_Skins.Find(pSkinName)); - OwnSkinInfo.ApplyColors(*pUseCustomColor, *pColorBody, *pColorFeet); - OwnSkinInfo.m_Size = 50.0f; - - // Tee - { - vec2 OffsetToMid; - CRenderTools::GetRenderTeeOffsetToRenderedTee(CAnimState::GetIdle(), &OwnSkinInfo, OffsetToMid); - const vec2 TeeRenderPos = vec2(YourSkin.x + YourSkin.w / 2.0f, YourSkin.y + YourSkin.h / 2.0f + OffsetToMid.y); - RenderTools()->RenderTee(CAnimState::GetIdle(), &OwnSkinInfo, *pEmote, vec2(1.0f, 0.0f), TeeRenderPos); - } - - // Skin name - static CLineInput s_SkinInput; - s_SkinInput.SetBuffer(pSkinName, SkinNameSize); - s_SkinInput.SetEmptyText("default"); - if(Ui()->DoClearableEditBox(&s_SkinInput, &Button, 14.0f)) - { - SetNeedSendInfo(); - m_SkinListScrollToSelected = true; - } - - // Random skin button - static CButtonContainer s_RandomSkinButton; - static const char *s_apDice[] = {FONT_ICON_DICE_ONE, FONT_ICON_DICE_TWO, FONT_ICON_DICE_THREE, FONT_ICON_DICE_FOUR, FONT_ICON_DICE_FIVE, FONT_ICON_DICE_SIX}; - static int s_CurrentDie = rand() % std::size(s_apDice); - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - if(DoButton_Menu(&s_RandomSkinButton, s_apDice[s_CurrentDie], 0, &RandomSkinButton, nullptr, IGraphics::CORNER_ALL, 5.0f, -0.2f)) - { - GameClient()->m_Skins.RandomizeSkin(m_Dummy); - SetNeedSendInfo(); - m_SkinListScrollToSelected = true; - s_CurrentDie = rand() % std::size(s_apDice); - } - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - GameClient()->m_Tooltips.DoToolTip(&s_RandomSkinButton, &RandomSkinButton, Localize("Create a random skin")); - - // Custom colors button - if(DoButton_CheckBox(pUseCustomColor, Localize("Custom colors"), *pUseCustomColor, &CustomColorsButton)) - { - *pUseCustomColor = *pUseCustomColor ? 0 : 1; - SetNeedSendInfo(); - } - - // Default eyes - { - CTeeRenderInfo EyeSkinInfo = OwnSkinInfo; - EyeSkinInfo.m_Size = EyeButtonSize; - vec2 OffsetToMid; - CRenderTools::GetRenderTeeOffsetToRenderedTee(CAnimState::GetIdle(), &EyeSkinInfo, OffsetToMid); - - CUIRect EyesRow; - Eyes.HSplitTop(EyeButtonSize, &EyesRow, &Eyes); - static CButtonContainer s_aEyeButtons[NUM_EMOTES]; - for(int CurrentEyeEmote = 0; CurrentEyeEmote < NUM_EMOTES; CurrentEyeEmote++) - { - EyesRow.VSplitLeft(EyeButtonSize, &Button, &EyesRow); - EyesRow.VSplitLeft(5.0f, nullptr, &EyesRow); - if(!RenderEyesBelow && (CurrentEyeEmote + 1) % 3 == 0) - { - Eyes.HSplitTop(5.0f, nullptr, &Eyes); - Eyes.HSplitTop(EyeButtonSize, &EyesRow, &Eyes); - } - - const ColorRGBA EyeButtonColor = ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f + (*pEmote == CurrentEyeEmote ? 0.25f : 0.0f)); - if(DoButton_Menu(&s_aEyeButtons[CurrentEyeEmote], "", 0, &Button, nullptr, IGraphics::CORNER_ALL, 5.0f, 0.0f, EyeButtonColor)) - { - *pEmote = CurrentEyeEmote; - if((int)m_Dummy == g_Config.m_ClDummy) - GameClient()->m_Emoticon.EyeEmote(CurrentEyeEmote); - } - GameClient()->m_Tooltips.DoToolTip(&s_aEyeButtons[CurrentEyeEmote], &Button, Localize("Choose default eyes when joining a server")); - RenderTools()->RenderTee(CAnimState::GetIdle(), &EyeSkinInfo, CurrentEyeEmote, vec2(1.0f, 0.0f), vec2(Button.x + Button.w / 2.0f, Button.y + Button.h / 2.0f + OffsetToMid.y)); - } - } - - // Custom color pickers - MainView.HSplitTop(5.0f, nullptr, &MainView); - if(*pUseCustomColor) - { - CUIRect CustomColors; - MainView.HSplitTop(95.0f, &CustomColors, &MainView); - CUIRect aRects[2]; - CustomColors.VSplitMid(&aRects[0], &aRects[1], 20.0f); - - unsigned *apColors[] = {pColorBody, pColorFeet}; - const char *apParts[] = {Localize("Body"), Localize("Feet")}; - - for(int i = 0; i < 2; i++) - { - aRects[i].HSplitTop(20.0f, &Label, &aRects[i]); - Ui()->DoLabel(&Label, apParts[i], 14.0f, TEXTALIGN_ML); - if(RenderHslaScrollbars(&aRects[i], apColors[i], false, ColorHSLA::DARKEST_LGT)) - { - SetNeedSendInfo(); - } - } - } - MainView.HSplitTop(5.0f, nullptr, &MainView); - - // Layout bottom controls and use remainder for skin selector - CUIRect QuickSearch, DatabaseButton, DirectoryButton, RefreshButton; - MainView.HSplitBottom(20.0f, &MainView, &QuickSearch); - MainView.HSplitBottom(5.0f, &MainView, nullptr); - QuickSearch.VSplitLeft(220.0f, &QuickSearch, &DatabaseButton); - DatabaseButton.VSplitLeft(10.0f, nullptr, &DatabaseButton); - DatabaseButton.VSplitLeft(150.0f, &DatabaseButton, &DirectoryButton); - DirectoryButton.VSplitRight(175.0f, nullptr, &DirectoryButton); - DirectoryButton.VSplitRight(25.0f, &DirectoryButton, &RefreshButton); - DirectoryButton.VSplitRight(10.0f, &DirectoryButton, nullptr); - - // Skin selector - static std::vector s_vSkinList; - static std::vector s_vSkinListHelper; - static std::vector s_vFavoriteSkinListHelper; - static CListBox s_ListBox; - - // be nice to the CPU - if(!m_SkinListLastRefreshTime.has_value() || m_SkinListLastRefreshTime.value() != m_pClient->m_Skins.LastRefreshTime()) - { - m_SkinListLastRefreshTime = m_pClient->m_Skins.LastRefreshTime(); - s_vSkinList.clear(); - s_vSkinListHelper.clear(); - s_vFavoriteSkinListHelper.clear(); - - auto &&SkinNotFiltered = [&](const CSkin *pSkinToBeSelected) { - // filter quick search - if(g_Config.m_ClSkinFilterString[0] != '\0' && !str_utf8_find_nocase(pSkinToBeSelected->GetName(), g_Config.m_ClSkinFilterString)) - return false; - - // no special skins - if(CSkins::IsSpecialSkin(pSkinToBeSelected->GetName())) - return false; - - return true; - }; - - for(const auto &it : m_SkinFavorites) - { - const CSkin *pSkinToBeSelected = m_pClient->m_Skins.FindOrNullptr(it.c_str(), true); - - if(pSkinToBeSelected == nullptr || !SkinNotFiltered(pSkinToBeSelected)) - continue; - - s_vFavoriteSkinListHelper.emplace_back(pSkinToBeSelected); - } - for(const auto &SkinIt : m_pClient->m_Skins.GetSkinsUnsafe()) - { - const auto &pSkinToBeSelected = SkinIt.second; - if(!SkinNotFiltered(pSkinToBeSelected.get())) - continue; - - if(std::find(m_SkinFavorites.begin(), m_SkinFavorites.end(), pSkinToBeSelected->GetName()) == m_SkinFavorites.end()) - s_vSkinListHelper.emplace_back(pSkinToBeSelected.get()); - } - std::sort(s_vSkinListHelper.begin(), s_vSkinListHelper.end()); - std::sort(s_vFavoriteSkinListHelper.begin(), s_vFavoriteSkinListHelper.end()); - s_vSkinList = s_vFavoriteSkinListHelper; - s_vSkinList.insert(s_vSkinList.end(), s_vSkinListHelper.begin(), s_vSkinListHelper.end()); - } - - int OldSelected = -1; - s_ListBox.DoStart(50.0f, s_vSkinList.size(), 4, 1, OldSelected, &MainView); - for(size_t i = 0; i < s_vSkinList.size(); ++i) - { - const CSkin *pSkinToBeDraw = s_vSkinList[i].m_pSkin; - if(str_comp(pSkinToBeDraw->GetName(), pSkinName) == 0) - { - OldSelected = i; - if(m_SkinListScrollToSelected) - { - s_ListBox.ScrollToSelected(); - m_SkinListScrollToSelected = false; - } - } - - const CListboxItem Item = s_ListBox.DoNextItem(pSkinToBeDraw, OldSelected >= 0 && (size_t)OldSelected == i); - if(!Item.m_Visible) - continue; - - Item.m_Rect.VSplitLeft(60.0f, &Button, &Label); - - CTeeRenderInfo Info = OwnSkinInfo; - Info.Apply(pSkinToBeDraw); - - vec2 OffsetToMid; - CRenderTools::GetRenderTeeOffsetToRenderedTee(CAnimState::GetIdle(), &Info, OffsetToMid); - const vec2 TeeRenderPos = vec2(Button.x + Button.w / 2.0f, Button.y + Button.h / 2 + OffsetToMid.y); - RenderTools()->RenderTee(CAnimState::GetIdle(), &Info, *pEmote, vec2(1.0f, 0.0f), TeeRenderPos); - - SLabelProperties Props; - Props.m_MaxWidth = Label.w - 5.0f; - Ui()->DoLabel(&Label, pSkinToBeDraw->GetName(), 12.0f, TEXTALIGN_ML, Props); - - if(g_Config.m_Debug) - { - const ColorRGBA BloodColor = *pUseCustomColor ? color_cast(ColorHSLA(*pColorBody).UnclampLighting(ColorHSLA::DARKEST_LGT)) : pSkinToBeDraw->m_BloodColor; - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - Graphics()->SetColor(BloodColor.r, BloodColor.g, BloodColor.b, 1.0f); - IGraphics::CQuadItem QuadItem(Label.x, Label.y, 12.0f, 12.0f); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); - } - - // render skin favorite icon - { - const auto SkinItFav = m_SkinFavorites.find(pSkinToBeDraw->GetName()); - const bool IsFav = SkinItFav != m_SkinFavorites.end(); - CUIRect FavIcon; - Item.m_Rect.HSplitTop(20.0f, &FavIcon, nullptr); - FavIcon.VSplitRight(20.0f, nullptr, &FavIcon); - if(DoButton_Favorite(&pSkinToBeDraw->m_Metrics.m_Body, pSkinToBeDraw, IsFav, &FavIcon)) - { - if(IsFav) - { - m_SkinFavorites.erase(SkinItFav); - } - else - { - m_SkinFavorites.emplace(pSkinToBeDraw->GetName()); - } - m_SkinListLastRefreshTime = std::nullopt; - } - } - } - - const int NewSelected = s_ListBox.DoEnd(); - if(OldSelected != NewSelected) - { - str_copy(pSkinName, s_vSkinList[NewSelected].m_pSkin->GetName(), SkinNameSize); - SetNeedSendInfo(); - } - - static CLineInput s_SkinFilterInput(g_Config.m_ClSkinFilterString, sizeof(g_Config.m_ClSkinFilterString)); - if(Ui()->DoEditBox_Search(&s_SkinFilterInput, &QuickSearch, 14.0f, !Ui()->IsPopupOpen() && m_pClient->m_GameConsole.IsClosed())) - { - m_SkinListLastRefreshTime = std::nullopt; - } - - static CButtonContainer s_SkinDatabaseButton; - if(DoButton_Menu(&s_SkinDatabaseButton, Localize("Skin Database"), 0, &DatabaseButton)) - { - Client()->ViewLink("https://ddnet.org/skins/"); - } - - static CButtonContainer s_DirectoryButton; - if(DoButton_Menu(&s_DirectoryButton, Localize("Skins directory"), 0, &DirectoryButton)) - { - Storage()->GetCompletePath(IStorage::TYPE_SAVE, "skins", aBuf, sizeof(aBuf)); - Storage()->CreateFolder("skins", IStorage::TYPE_SAVE); - Client()->ViewFile(aBuf); - } - GameClient()->m_Tooltips.DoToolTip(&s_DirectoryButton, &DirectoryButton, Localize("Open the directory to add custom skins")); - - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - static CButtonContainer s_SkinRefreshButton; - if(DoButton_Menu(&s_SkinRefreshButton, FONT_ICON_ARROW_ROTATE_RIGHT, 0, &RefreshButton) || Input()->KeyPress(KEY_F5) || (Input()->KeyPress(KEY_R) && Input()->ModifierIsPressed())) - { - // reset render flags for possible loading screen - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - m_pClient->RefreshSkins(); - } - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); -} - -typedef struct -{ - const char *m_pName; - const char *m_pCommand; - int m_KeyId; - int m_ModifierCombination; -} CKeyInfo; - -static CKeyInfo gs_aKeys[] = - { - {Localizable("Move left"), "+left", 0, 0}, - {Localizable("Move right"), "+right", 0, 0}, - {Localizable("Jump"), "+jump", 0, 0}, - {Localizable("Fire"), "+fire", 0, 0}, - {Localizable("Hook"), "+hook", 0, 0}, - {Localizable("Hook collisions"), "+showhookcoll", 0, 0}, - {Localizable("Pause"), "say /pause", 0, 0}, - {Localizable("Kill"), "kill", 0, 0}, - {Localizable("Zoom in"), "zoom+", 0, 0}, - {Localizable("Zoom out"), "zoom-", 0, 0}, - {Localizable("Default zoom"), "zoom", 0, 0}, - {Localizable("Show others"), "say /showothers", 0, 0}, - {Localizable("Show all"), "say /showall", 0, 0}, - {Localizable("Toggle dyncam"), "toggle cl_dyncam 0 1", 0, 0}, - {Localizable("Toggle ghost"), "toggle cl_race_show_ghost 0 1", 0, 0}, - - {Localizable("Hammer"), "+weapon1", 0, 0}, - {Localizable("Pistol"), "+weapon2", 0, 0}, - {Localizable("Shotgun"), "+weapon3", 0, 0}, - {Localizable("Grenade"), "+weapon4", 0, 0}, - {Localizable("Laser"), "+weapon5", 0, 0}, - {Localizable("Next weapon"), "+nextweapon", 0, 0}, - {Localizable("Prev. weapon"), "+prevweapon", 0, 0}, - - {Localizable("Vote yes"), "vote yes", 0, 0}, - {Localizable("Vote no"), "vote no", 0, 0}, - - {Localizable("Chat"), "+show_chat; chat all", 0, 0}, - {Localizable("Team chat"), "+show_chat; chat team", 0, 0}, - {Localizable("Converse"), "+show_chat; chat all /c ", 0, 0}, - {Localizable("Chat command"), "+show_chat; chat all /", 0, 0}, - {Localizable("Show chat"), "+show_chat", 0, 0}, - - {Localizable("Toggle dummy"), "toggle cl_dummy 0 1", 0, 0}, - {Localizable("Dummy copy"), "toggle cl_dummy_copy_moves 0 1", 0, 0}, - {Localizable("Hammerfly dummy"), "toggle cl_dummy_hammer 0 1", 0, 0}, - - {Localizable("Emoticon"), "+emote", 0, 0}, - {Localizable("Spectator mode"), "+spectate", 0, 0}, - {Localizable("Spectate next"), "spectate_next", 0, 0}, - {Localizable("Spectate previous"), "spectate_previous", 0, 0}, - {Localizable("Console"), "toggle_local_console", 0, 0}, - {Localizable("Remote console"), "toggle_remote_console", 0, 0}, - {Localizable("Screenshot"), "screenshot", 0, 0}, - {Localizable("Scoreboard"), "+scoreboard", 0, 0}, - {Localizable("Statboard"), "+statboard", 0, 0}, - {Localizable("Lock team"), "say /lock", 0, 0}, - {Localizable("Show entities"), "toggle cl_overlay_entities 0 100", 0, 0}, - {Localizable("Show HUD"), "toggle cl_showhud 0 1", 0, 0}, -}; - -void CMenus::DoSettingsControlsButtons(int Start, int Stop, CUIRect View) -{ - for(int i = Start; i < Stop; i++) - { - const CKeyInfo &Key = gs_aKeys[i]; - - CUIRect Button, Label; - View.HSplitTop(20.0f, &Button, &View); - Button.VSplitLeft(135.0f, &Label, &Button); - - char aBuf[64]; - str_format(aBuf, sizeof(aBuf), "%s:", Localize(Key.m_pName)); - - Ui()->DoLabel(&Label, aBuf, 13.0f, TEXTALIGN_ML); - int OldId = Key.m_KeyId, OldModifierCombination = Key.m_ModifierCombination, NewModifierCombination; - int NewId = DoKeyReader(&Key.m_KeyId, &Button, OldId, OldModifierCombination, &NewModifierCombination); - if(NewId != OldId || NewModifierCombination != OldModifierCombination) - { - if(OldId != 0 || NewId == 0) - m_pClient->m_Binds.Bind(OldId, "", false, OldModifierCombination); - if(NewId != 0) - m_pClient->m_Binds.Bind(NewId, Key.m_pCommand, false, NewModifierCombination); - } - - View.HSplitTop(2.0f, 0, &View); - } -} - -float CMenus::RenderSettingsControlsJoystick(CUIRect View) -{ - bool JoystickEnabled = g_Config.m_InpControllerEnable; - int NumJoysticks = Input()->NumJoysticks(); - int NumOptions = 1; // expandable header - if(JoystickEnabled) - { - NumOptions++; // message or joystick name/selection - if(NumJoysticks > 0) - { - NumOptions += 3; // mode, ui sens, tolerance - if(!g_Config.m_InpControllerAbsolute) - NumOptions++; // ingame sens - NumOptions += Input()->GetActiveJoystick()->GetNumAxes() + 1; // axis selection + header - } - } - const float ButtonHeight = 20.0f; - const float Spacing = 2.0f; - const float BackgroundHeight = NumOptions * (ButtonHeight + Spacing) + (NumOptions == 1 ? 0.0f : Spacing); - if(View.h < BackgroundHeight) - return BackgroundHeight; - - View.HSplitTop(BackgroundHeight, &View, nullptr); - - CUIRect Button; - View.HSplitTop(Spacing, nullptr, &View); - View.HSplitTop(ButtonHeight, &Button, &View); - if(DoButton_CheckBox(&g_Config.m_InpControllerEnable, Localize("Enable controller"), g_Config.m_InpControllerEnable, &Button)) - { - g_Config.m_InpControllerEnable ^= 1; - } - if(JoystickEnabled) - { - if(NumJoysticks > 0) - { - // show joystick device selection if more than one available or just the joystick name if there is only one - { - CUIRect JoystickDropDown; - View.HSplitTop(Spacing, nullptr, &View); - View.HSplitTop(ButtonHeight, &JoystickDropDown, &View); - if(NumJoysticks > 1) - { - static std::vector s_vJoystickNames; - static std::vector s_vpJoystickNames; - s_vJoystickNames.resize(NumJoysticks); - s_vpJoystickNames.resize(NumJoysticks); - - for(int i = 0; i < NumJoysticks; ++i) - { - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "%s %d: %s", Localize("Controller"), i, Input()->GetJoystick(i)->GetName()); - s_vJoystickNames[i] = aBuf; - s_vpJoystickNames[i] = s_vJoystickNames[i].c_str(); - } - - static CUi::SDropDownState s_JoystickDropDownState; - static CScrollRegion s_JoystickDropDownScrollRegion; - s_JoystickDropDownState.m_SelectionPopupContext.m_pScrollRegion = &s_JoystickDropDownScrollRegion; - const int CurrentJoystick = Input()->GetActiveJoystick()->GetIndex(); - const int NewJoystick = Ui()->DoDropDown(&JoystickDropDown, CurrentJoystick, s_vpJoystickNames.data(), s_vpJoystickNames.size(), s_JoystickDropDownState); - if(NewJoystick != CurrentJoystick) - { - Input()->SetActiveJoystick(NewJoystick); - } - } - else - { - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "%s 0: %s", Localize("Controller"), Input()->GetJoystick(0)->GetName()); - Ui()->DoLabel(&JoystickDropDown, aBuf, 13.0f, TEXTALIGN_ML); - } - } - - { - View.HSplitTop(Spacing, nullptr, &View); - View.HSplitTop(ButtonHeight, &Button, &View); - CUIRect Label, ButtonRelative, ButtonAbsolute; - Button.VSplitMid(&Label, &Button, 10.0f); - Button.HMargin(2.0f, &Button); - Button.VSplitMid(&ButtonRelative, &ButtonAbsolute); - Ui()->DoLabel(&Label, Localize("Ingame controller mode"), 13.0f, TEXTALIGN_ML); - CButtonContainer s_RelativeButton; - if(DoButton_Menu(&s_RelativeButton, Localize("Relative", "Ingame controller mode"), g_Config.m_InpControllerAbsolute == 0, &ButtonRelative, nullptr, IGraphics::CORNER_L)) - { - g_Config.m_InpControllerAbsolute = 0; - } - CButtonContainer s_AbsoluteButton; - if(DoButton_Menu(&s_AbsoluteButton, Localize("Absolute", "Ingame controller mode"), g_Config.m_InpControllerAbsolute == 1, &ButtonAbsolute, nullptr, IGraphics::CORNER_R)) - { - g_Config.m_InpControllerAbsolute = 1; - } - } - - if(!g_Config.m_InpControllerAbsolute) - { - View.HSplitTop(Spacing, nullptr, &View); - View.HSplitTop(ButtonHeight, &Button, &View); - Ui()->DoScrollbarOption(&g_Config.m_InpControllerSens, &g_Config.m_InpControllerSens, &Button, Localize("Ingame controller sens."), 1, 500, &CUi::ms_LogarithmicScrollbarScale, CUi::SCROLLBAR_OPTION_NOCLAMPVALUE); - } - - View.HSplitTop(Spacing, nullptr, &View); - View.HSplitTop(ButtonHeight, &Button, &View); - Ui()->DoScrollbarOption(&g_Config.m_UiControllerSens, &g_Config.m_UiControllerSens, &Button, Localize("UI controller sens."), 1, 500, &CUi::ms_LogarithmicScrollbarScale, CUi::SCROLLBAR_OPTION_NOCLAMPVALUE); - - View.HSplitTop(Spacing, nullptr, &View); - View.HSplitTop(ButtonHeight, &Button, &View); - Ui()->DoScrollbarOption(&g_Config.m_InpControllerTolerance, &g_Config.m_InpControllerTolerance, &Button, Localize("Controller jitter tolerance"), 0, 50); - - View.HSplitTop(Spacing, nullptr, &View); - View.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.125f), IGraphics::CORNER_ALL, 5.0f); - DoJoystickAxisPicker(View); - } - else - { - View.HSplitTop(View.h - ButtonHeight, nullptr, &View); - View.HSplitTop(ButtonHeight, &Button, &View); - Ui()->DoLabel(&Button, Localize("No controller found. Plug in a controller."), 13.0f, TEXTALIGN_ML); - } - } - - return BackgroundHeight; -} - -void CMenus::DoJoystickAxisPicker(CUIRect View) -{ - const float FontSize = 13.0f; - const float RowHeight = 20.0f; - const float SpacingH = 2.0f; - const float AxisWidth = 0.2f * View.w; - const float StatusWidth = 0.4f * View.w; - const float AimBindWidth = 90.0f; - const float SpacingV = (View.w - AxisWidth - StatusWidth - AimBindWidth) / 2.0f; - - CUIRect Row, Axis, Status, AimBind; - View.HSplitTop(SpacingH, nullptr, &View); - View.HSplitTop(RowHeight, &Row, &View); - Row.VSplitLeft(AxisWidth, &Axis, &Row); - Row.VSplitLeft(SpacingV, nullptr, &Row); - Row.VSplitLeft(StatusWidth, &Status, &Row); - Row.VSplitLeft(SpacingV, nullptr, &Row); - Row.VSplitLeft(AimBindWidth, &AimBind, &Row); - - Ui()->DoLabel(&Axis, Localize("Axis"), FontSize, TEXTALIGN_MC); - Ui()->DoLabel(&Status, Localize("Status"), FontSize, TEXTALIGN_MC); - Ui()->DoLabel(&AimBind, Localize("Aim bind"), FontSize, TEXTALIGN_MC); - - IInput::IJoystick *pJoystick = Input()->GetActiveJoystick(); - static int s_aActive[NUM_JOYSTICK_AXES][2]; - for(int i = 0; i < minimum(pJoystick->GetNumAxes(), NUM_JOYSTICK_AXES); i++) - { - const bool Active = g_Config.m_InpControllerX == i || g_Config.m_InpControllerY == i; - - View.HSplitTop(SpacingH, nullptr, &View); - View.HSplitTop(RowHeight, &Row, &View); - Row.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.125f), IGraphics::CORNER_ALL, 5.0f); - Row.VSplitLeft(AxisWidth, &Axis, &Row); - Row.VSplitLeft(SpacingV, nullptr, &Row); - Row.VSplitLeft(StatusWidth, &Status, &Row); - Row.VSplitLeft(SpacingV, nullptr, &Row); - Row.VSplitLeft(AimBindWidth, &AimBind, &Row); - - // Axis label - char aBuf[16]; - str_format(aBuf, sizeof(aBuf), "%d", i + 1); - if(Active) - TextRender()->TextColor(TextRender()->DefaultTextColor()); - else - TextRender()->TextColor(0.7f, 0.7f, 0.7f, 1.0f); - Ui()->DoLabel(&Axis, aBuf, FontSize, TEXTALIGN_MC); - - // Axis status - Status.HMargin(7.0f, &Status); - DoJoystickBar(&Status, (pJoystick->GetAxisValue(i) + 1.0f) / 2.0f, g_Config.m_InpControllerTolerance / 50.0f, Active); - - // Bind to X/Y - CUIRect AimBindX, AimBindY; - AimBind.VSplitMid(&AimBindX, &AimBindY); - if(DoButton_CheckBox(&s_aActive[i][0], "X", g_Config.m_InpControllerX == i, &AimBindX)) - { - if(g_Config.m_InpControllerY == i) - g_Config.m_InpControllerY = g_Config.m_InpControllerX; - g_Config.m_InpControllerX = i; - } - if(DoButton_CheckBox(&s_aActive[i][1], "Y", g_Config.m_InpControllerY == i, &AimBindY)) - { - if(g_Config.m_InpControllerX == i) - g_Config.m_InpControllerX = g_Config.m_InpControllerY; - g_Config.m_InpControllerY = i; - } - } - TextRender()->TextColor(TextRender()->DefaultTextColor()); -} - -void CMenus::DoJoystickBar(const CUIRect *pRect, float Current, float Tolerance, bool Active) -{ - CUIRect Handle; - pRect->VSplitLeft(pRect->h, &Handle, nullptr); // Slider size - Handle.x += (pRect->w - Handle.w) * Current; - - pRect->Draw(ColorRGBA(1.0f, 1.0f, 1.0f, Active ? 0.25f : 0.125f), IGraphics::CORNER_ALL, pRect->h / 2.0f); - - CUIRect ToleranceArea = *pRect; - ToleranceArea.w *= Tolerance; - ToleranceArea.x += (pRect->w - ToleranceArea.w) / 2.0f; - const ColorRGBA ToleranceColor = Active ? ColorRGBA(0.8f, 0.35f, 0.35f, 1.0f) : ColorRGBA(0.7f, 0.5f, 0.5f, 1.0f); - ToleranceArea.Draw(ToleranceColor, IGraphics::CORNER_ALL, ToleranceArea.h / 2.0f); - - const ColorRGBA SliderColor = Active ? ColorRGBA(0.95f, 0.95f, 0.95f, 1.0f) : ColorRGBA(0.8f, 0.8f, 0.8f, 1.0f); - Handle.Draw(SliderColor, IGraphics::CORNER_ALL, Handle.h / 2.0f); -} - -void CMenus::RenderSettingsControls(CUIRect MainView) -{ - // this is kinda slow, but whatever - for(auto &Key : gs_aKeys) - Key.m_KeyId = Key.m_ModifierCombination = 0; - - for(int Mod = 0; Mod < CBinds::MODIFIER_COMBINATION_COUNT; Mod++) - { - for(int KeyId = 0; KeyId < KEY_LAST; KeyId++) - { - const char *pBind = m_pClient->m_Binds.Get(KeyId, Mod); - if(!pBind[0]) - continue; - - for(auto &Key : gs_aKeys) - if(str_comp(pBind, Key.m_pCommand) == 0) - { - Key.m_KeyId = KeyId; - Key.m_ModifierCombination = Mod; - break; - } - } - } - - // scrollable controls - static float s_JoystickSettingsHeight = 0.0f; // we calculate this later and don't render until enough space is available - static CScrollRegion s_ScrollRegion; - vec2 ScrollOffset(0.0f, 0.0f); - CScrollRegionParams ScrollParams; - ScrollParams.m_ScrollUnit = 120.0f; - s_ScrollRegion.Begin(&MainView, &ScrollOffset, &ScrollParams); - MainView.y += ScrollOffset.y; - - const float FontSize = 14.0f; - const float Margin = 10.0f; - const float HeaderHeight = FontSize + 5.0f + Margin; - - CUIRect MouseSettings, MovementSettings, WeaponSettings, VotingSettings, ChatSettings, DummySettings, MiscSettings, JoystickSettings, ResetButton, Button; - MainView.VSplitMid(&MouseSettings, &VotingSettings); - - // mouse settings - { - MouseSettings.VMargin(5.0f, &MouseSettings); - MouseSettings.HSplitTop(80.0f, &MouseSettings, &JoystickSettings); - if(s_ScrollRegion.AddRect(MouseSettings)) - { - MouseSettings.Draw(ColorRGBA(1, 1, 1, 0.25f), IGraphics::CORNER_ALL, 10.0f); - MouseSettings.VMargin(10.0f, &MouseSettings); - - MouseSettings.HSplitTop(HeaderHeight, &Button, &MouseSettings); - Ui()->DoLabel(&Button, Localize("Mouse"), FontSize, TEXTALIGN_ML); - - MouseSettings.HSplitTop(20.0f, &Button, &MouseSettings); - Ui()->DoScrollbarOption(&g_Config.m_InpMousesens, &g_Config.m_InpMousesens, &Button, Localize("Ingame mouse sens."), 1, 500, &CUi::ms_LogarithmicScrollbarScale, CUi::SCROLLBAR_OPTION_NOCLAMPVALUE); - - MouseSettings.HSplitTop(2.0f, nullptr, &MouseSettings); - - MouseSettings.HSplitTop(20.0f, &Button, &MouseSettings); - Ui()->DoScrollbarOption(&g_Config.m_UiMousesens, &g_Config.m_UiMousesens, &Button, Localize("UI mouse sens."), 1, 500, &CUi::ms_LogarithmicScrollbarScale, CUi::SCROLLBAR_OPTION_NOCLAMPVALUE); - } - } - - // joystick settings - { - JoystickSettings.HSplitTop(Margin, nullptr, &JoystickSettings); - JoystickSettings.HSplitTop(s_JoystickSettingsHeight + HeaderHeight + Margin, &JoystickSettings, &MovementSettings); - if(s_ScrollRegion.AddRect(JoystickSettings)) - { - JoystickSettings.Draw(ColorRGBA(1, 1, 1, 0.25f), IGraphics::CORNER_ALL, 10.0f); - JoystickSettings.VMargin(Margin, &JoystickSettings); - - JoystickSettings.HSplitTop(HeaderHeight, &Button, &JoystickSettings); - Ui()->DoLabel(&Button, Localize("Controller"), FontSize, TEXTALIGN_ML); - - s_JoystickSettingsHeight = RenderSettingsControlsJoystick(JoystickSettings); - } - } - - // movement settings - { - MovementSettings.HSplitTop(Margin, nullptr, &MovementSettings); - MovementSettings.HSplitTop(365.0f, &MovementSettings, &WeaponSettings); - if(s_ScrollRegion.AddRect(MovementSettings)) - { - MovementSettings.Draw(ColorRGBA(1, 1, 1, 0.25f), IGraphics::CORNER_ALL, 10.0f); - MovementSettings.VMargin(Margin, &MovementSettings); - - MovementSettings.HSplitTop(HeaderHeight, &Button, &MovementSettings); - Ui()->DoLabel(&Button, Localize("Movement"), FontSize, TEXTALIGN_ML); - - DoSettingsControlsButtons(0, 15, MovementSettings); - } - } - - // weapon settings - { - WeaponSettings.HSplitTop(Margin, nullptr, &WeaponSettings); - WeaponSettings.HSplitTop(190.0f, &WeaponSettings, &ResetButton); - if(s_ScrollRegion.AddRect(WeaponSettings)) - { - WeaponSettings.Draw(ColorRGBA(1, 1, 1, 0.25f), IGraphics::CORNER_ALL, 10.0f); - WeaponSettings.VMargin(Margin, &WeaponSettings); - - WeaponSettings.HSplitTop(HeaderHeight, &Button, &WeaponSettings); - Ui()->DoLabel(&Button, Localize("Weapon"), FontSize, TEXTALIGN_ML); - - DoSettingsControlsButtons(15, 22, WeaponSettings); - } - } - - // defaults - { - ResetButton.HSplitTop(Margin, nullptr, &ResetButton); - ResetButton.HSplitTop(40.0f, &ResetButton, nullptr); - if(s_ScrollRegion.AddRect(ResetButton)) - { - ResetButton.Draw(ColorRGBA(1, 1, 1, 0.25f), IGraphics::CORNER_ALL, 10.0f); - ResetButton.Margin(10.0f, &ResetButton); - static CButtonContainer s_DefaultButton; - if(DoButton_Menu(&s_DefaultButton, Localize("Reset to defaults"), 0, &ResetButton)) - { - PopupConfirm(Localize("Reset controls"), Localize("Are you sure that you want to reset the controls to their defaults?"), - Localize("Reset"), Localize("Cancel"), &CMenus::ResetSettingsControls); - } - } - } - - // voting settings - { - VotingSettings.VMargin(5.0f, &VotingSettings); - VotingSettings.HSplitTop(80.0f, &VotingSettings, &ChatSettings); - if(s_ScrollRegion.AddRect(VotingSettings)) - { - VotingSettings.Draw(ColorRGBA(1, 1, 1, 0.25f), IGraphics::CORNER_ALL, 10.0f); - VotingSettings.VMargin(Margin, &VotingSettings); - - VotingSettings.HSplitTop(HeaderHeight, &Button, &VotingSettings); - Ui()->DoLabel(&Button, Localize("Voting"), FontSize, TEXTALIGN_ML); - - DoSettingsControlsButtons(22, 24, VotingSettings); - } - } - - // chat settings - { - ChatSettings.HSplitTop(Margin, nullptr, &ChatSettings); - ChatSettings.HSplitTop(145.0f, &ChatSettings, &DummySettings); - if(s_ScrollRegion.AddRect(ChatSettings)) - { - ChatSettings.Draw(ColorRGBA(1, 1, 1, 0.25f), IGraphics::CORNER_ALL, 10.0f); - ChatSettings.VMargin(Margin, &ChatSettings); - - ChatSettings.HSplitTop(HeaderHeight, &Button, &ChatSettings); - Ui()->DoLabel(&Button, Localize("Chat"), FontSize, TEXTALIGN_ML); - - DoSettingsControlsButtons(24, 29, ChatSettings); - } - } - - // dummy settings - { - DummySettings.HSplitTop(Margin, nullptr, &DummySettings); - DummySettings.HSplitTop(100.0f, &DummySettings, &MiscSettings); - if(s_ScrollRegion.AddRect(DummySettings)) - { - DummySettings.Draw(ColorRGBA(1, 1, 1, 0.25f), IGraphics::CORNER_ALL, 10.0f); - DummySettings.VMargin(Margin, &DummySettings); - - DummySettings.HSplitTop(HeaderHeight, &Button, &DummySettings); - Ui()->DoLabel(&Button, Localize("Dummy"), FontSize, TEXTALIGN_ML); - - DoSettingsControlsButtons(29, 32, DummySettings); - } - } - - // misc settings - { - MiscSettings.HSplitTop(Margin, nullptr, &MiscSettings); - MiscSettings.HSplitTop(300.0f, &MiscSettings, 0); - if(s_ScrollRegion.AddRect(MiscSettings)) - { - MiscSettings.Draw(ColorRGBA(1, 1, 1, 0.25f), IGraphics::CORNER_ALL, 10.0f); - MiscSettings.VMargin(Margin, &MiscSettings); - - MiscSettings.HSplitTop(HeaderHeight, &Button, &MiscSettings); - Ui()->DoLabel(&Button, Localize("Miscellaneous"), FontSize, TEXTALIGN_ML); - - DoSettingsControlsButtons(32, 44, MiscSettings); - } - } - - s_ScrollRegion.End(); -} - -void CMenus::ResetSettingsControls() -{ - m_pClient->m_Binds.SetDefaults(); - - g_Config.m_InpMousesens = 200; - g_Config.m_UiMousesens = 200; - - g_Config.m_InpControllerEnable = 0; - g_Config.m_InpControllerGUID[0] = '\0'; - g_Config.m_InpControllerAbsolute = 0; - g_Config.m_InpControllerSens = 100; - g_Config.m_InpControllerX = 0; - g_Config.m_InpControllerY = 1; - g_Config.m_InpControllerTolerance = 5; - g_Config.m_UiControllerSens = 100; -} - -void CMenus::RenderSettingsGraphics(CUIRect MainView) -{ - CUIRect Button; - char aBuf[128]; - bool CheckSettings = false; - - static const int MAX_RESOLUTIONS = 256; - static CVideoMode s_aModes[MAX_RESOLUTIONS]; - static int s_NumNodes = Graphics()->GetVideoModes(s_aModes, MAX_RESOLUTIONS, g_Config.m_GfxScreen); - static int s_GfxFsaaSamples = g_Config.m_GfxFsaaSamples; - static bool s_GfxBackendChanged = false; - static bool s_GfxGpuChanged = false; - static int s_GfxHighdpi = g_Config.m_GfxHighdpi; - - static int s_InitDisplayAllVideoModes = g_Config.m_GfxDisplayAllVideoModes; - - static bool s_WasInit = false; - static bool s_ModesReload = false; - if(!s_WasInit) - { - s_WasInit = true; - - Graphics()->AddWindowPropChangeListener([]() { - s_ModesReload = true; - }); - } - - if(s_ModesReload || g_Config.m_GfxDisplayAllVideoModes != s_InitDisplayAllVideoModes) - { - s_NumNodes = Graphics()->GetVideoModes(s_aModes, MAX_RESOLUTIONS, g_Config.m_GfxScreen); - s_ModesReload = false; - s_InitDisplayAllVideoModes = g_Config.m_GfxDisplayAllVideoModes; - } - - CUIRect ModeList, ModeLabel; - MainView.VSplitLeft(350.0f, &MainView, &ModeList); - ModeList.HSplitTop(24.0f, &ModeLabel, &ModeList); - MainView.VSplitLeft(340.0f, &MainView, 0); - - // display mode list - static CListBox s_ListBox; - static const float sc_RowHeightResList = 22.0f; - static const float sc_FontSizeResListHeader = 12.0f; - static const float sc_FontSizeResList = 10.0f; - - { - int G = std::gcd(g_Config.m_GfxScreenWidth, g_Config.m_GfxScreenHeight); - str_format(aBuf, sizeof(aBuf), "%s: %dx%d @%dhz %d bit (%d:%d)", Localize("Current"), (int)(g_Config.m_GfxScreenWidth * Graphics()->ScreenHiDPIScale()), (int)(g_Config.m_GfxScreenHeight * Graphics()->ScreenHiDPIScale()), g_Config.m_GfxScreenRefreshRate, g_Config.m_GfxColorDepth, g_Config.m_GfxScreenWidth / G, g_Config.m_GfxScreenHeight / G); - Ui()->DoLabel(&ModeLabel, aBuf, sc_FontSizeResListHeader, TEXTALIGN_MC); - } - - int OldSelected = -1; - s_ListBox.SetActive(!Ui()->IsPopupOpen()); - s_ListBox.DoStart(sc_RowHeightResList, s_NumNodes, 1, 3, OldSelected, &ModeList); - - for(int i = 0; i < s_NumNodes; ++i) - { - const int Depth = s_aModes[i].m_Red + s_aModes[i].m_Green + s_aModes[i].m_Blue > 16 ? 24 : 16; - if(g_Config.m_GfxColorDepth == Depth && - g_Config.m_GfxScreenWidth == s_aModes[i].m_WindowWidth && - g_Config.m_GfxScreenHeight == s_aModes[i].m_WindowHeight && - g_Config.m_GfxScreenRefreshRate == s_aModes[i].m_RefreshRate) - { - OldSelected = i; - } - - const CListboxItem Item = s_ListBox.DoNextItem(&s_aModes[i], OldSelected == i); - if(!Item.m_Visible) - continue; - - int G = std::gcd(s_aModes[i].m_CanvasWidth, s_aModes[i].m_CanvasHeight); - str_format(aBuf, sizeof(aBuf), " %dx%d @%dhz %d bit (%d:%d)", s_aModes[i].m_CanvasWidth, s_aModes[i].m_CanvasHeight, s_aModes[i].m_RefreshRate, Depth, s_aModes[i].m_CanvasWidth / G, s_aModes[i].m_CanvasHeight / G); - Ui()->DoLabel(&Item.m_Rect, aBuf, sc_FontSizeResList, TEXTALIGN_ML); - } - - const int NewSelected = s_ListBox.DoEnd(); - if(OldSelected != NewSelected) - { - const int Depth = s_aModes[NewSelected].m_Red + s_aModes[NewSelected].m_Green + s_aModes[NewSelected].m_Blue > 16 ? 24 : 16; - g_Config.m_GfxColorDepth = Depth; - g_Config.m_GfxScreenWidth = s_aModes[NewSelected].m_WindowWidth; - g_Config.m_GfxScreenHeight = s_aModes[NewSelected].m_WindowHeight; - g_Config.m_GfxScreenRefreshRate = s_aModes[NewSelected].m_RefreshRate; - Graphics()->ResizeToScreen(); - } - - // switches - CUIRect WindowModeDropDown; - MainView.HSplitTop(20.0f, &WindowModeDropDown, &MainView); - - const char *apWindowModes[] = {Localize("Windowed"), Localize("Windowed borderless"), Localize("Windowed fullscreen"), Localize("Desktop fullscreen"), Localize("Fullscreen")}; - static const int s_NumWindowMode = std::size(apWindowModes); - - const int OldWindowMode = (g_Config.m_GfxFullscreen ? (g_Config.m_GfxFullscreen == 1 ? 4 : (g_Config.m_GfxFullscreen == 2 ? 3 : 2)) : (g_Config.m_GfxBorderless ? 1 : 0)); - - static CUi::SDropDownState s_WindowModeDropDownState; - static CScrollRegion s_WindowModeDropDownScrollRegion; - s_WindowModeDropDownState.m_SelectionPopupContext.m_pScrollRegion = &s_WindowModeDropDownScrollRegion; - const int NewWindowMode = Ui()->DoDropDown(&WindowModeDropDown, OldWindowMode, apWindowModes, s_NumWindowMode, s_WindowModeDropDownState); - if(OldWindowMode != NewWindowMode) - { - if(NewWindowMode == 0) - Client()->SetWindowParams(0, false); - else if(NewWindowMode == 1) - Client()->SetWindowParams(0, true); - else if(NewWindowMode == 2) - Client()->SetWindowParams(3, false); - else if(NewWindowMode == 3) - Client()->SetWindowParams(2, false); - else if(NewWindowMode == 4) - Client()->SetWindowParams(1, false); - } - - if(Graphics()->GetNumScreens() > 1) - { - CUIRect ScreenDropDown; - MainView.HSplitTop(2.0f, nullptr, &MainView); - MainView.HSplitTop(20.0f, &ScreenDropDown, &MainView); - - const int NumScreens = Graphics()->GetNumScreens(); - static std::vector s_vScreenNames; - static std::vector s_vpScreenNames; - s_vScreenNames.resize(NumScreens); - s_vpScreenNames.resize(NumScreens); - - for(int i = 0; i < NumScreens; ++i) - { - str_format(aBuf, sizeof(aBuf), "%s %d: %s", Localize("Screen"), i, Graphics()->GetScreenName(i)); - s_vScreenNames[i] = aBuf; - s_vpScreenNames[i] = s_vScreenNames[i].c_str(); - } - - static CUi::SDropDownState s_ScreenDropDownState; - static CScrollRegion s_ScreenDropDownScrollRegion; - s_ScreenDropDownState.m_SelectionPopupContext.m_pScrollRegion = &s_ScreenDropDownScrollRegion; - const int NewScreen = Ui()->DoDropDown(&ScreenDropDown, g_Config.m_GfxScreen, s_vpScreenNames.data(), s_vpScreenNames.size(), s_ScreenDropDownState); - if(NewScreen != g_Config.m_GfxScreen) - Client()->SwitchWindowScreen(NewScreen); - } - - MainView.HSplitTop(2.0f, nullptr, &MainView); - MainView.HSplitTop(20.0f, &Button, &MainView); - str_format(aBuf, sizeof(aBuf), "%s (%s)", Localize("V-Sync"), Localize("may cause delay")); - if(DoButton_CheckBox(&g_Config.m_GfxVsync, aBuf, g_Config.m_GfxVsync, &Button)) - { - Client()->ToggleWindowVSync(); - } - - bool MultiSamplingChanged = false; - MainView.HSplitTop(20.0f, &Button, &MainView); - str_format(aBuf, sizeof(aBuf), "%s (%s)", Localize("FSAA samples"), Localize("may cause delay")); - int GfxFsaaSamplesMouseButton = DoButton_CheckBox_Number(&g_Config.m_GfxFsaaSamples, aBuf, g_Config.m_GfxFsaaSamples, &Button); - int CurFSAA = g_Config.m_GfxFsaaSamples == 0 ? 1 : g_Config.m_GfxFsaaSamples; - if(GfxFsaaSamplesMouseButton == 1) // inc - { - g_Config.m_GfxFsaaSamples = std::pow(2, (int)std::log2(CurFSAA) + 1); - if(g_Config.m_GfxFsaaSamples > 64) - g_Config.m_GfxFsaaSamples = 0; - MultiSamplingChanged = true; - } - else if(GfxFsaaSamplesMouseButton == 2) // dec - { - if(CurFSAA == 1) - g_Config.m_GfxFsaaSamples = 64; - else if(CurFSAA == 2) - g_Config.m_GfxFsaaSamples = 0; - else - g_Config.m_GfxFsaaSamples = std::pow(2, (int)std::log2(CurFSAA) - 1); - MultiSamplingChanged = true; - } - - uint32_t MultiSamplingCountBackend = 0; - if(MultiSamplingChanged) - { - if(Graphics()->SetMultiSampling(g_Config.m_GfxFsaaSamples, MultiSamplingCountBackend)) - { - // try again with 0 if mouse click was increasing multi sampling - // else just accept the current value as is - if((uint32_t)g_Config.m_GfxFsaaSamples > MultiSamplingCountBackend && GfxFsaaSamplesMouseButton == 1) - Graphics()->SetMultiSampling(0, MultiSamplingCountBackend); - g_Config.m_GfxFsaaSamples = (int)MultiSamplingCountBackend; - } - else - { - CheckSettings = true; - } - } - - MainView.HSplitTop(20.0f, &Button, &MainView); - if(DoButton_CheckBox(&g_Config.m_GfxHighDetail, Localize("High Detail"), g_Config.m_GfxHighDetail, &Button)) - g_Config.m_GfxHighDetail ^= 1; - GameClient()->m_Tooltips.DoToolTip(&g_Config.m_GfxHighDetail, &Button, Localize("Allows maps to render with more detail")); - - MainView.HSplitTop(20.0f, &Button, &MainView); - if(DoButton_CheckBox(&g_Config.m_GfxHighdpi, Localize("Use high DPI"), g_Config.m_GfxHighdpi, &Button)) - { - CheckSettings = true; - g_Config.m_GfxHighdpi ^= 1; - } - - MainView.HSplitTop(20.0f, &Button, &MainView); - str_copy(aBuf, " "); - str_append(aBuf, Localize("Hz", "Hertz")); - Ui()->DoScrollbarOption(&g_Config.m_GfxRefreshRate, &g_Config.m_GfxRefreshRate, &Button, Localize("Refresh Rate"), 10, 1000, &CUi::ms_LinearScrollbarScale, CUi::SCROLLBAR_OPTION_INFINITE | CUi::SCROLLBAR_OPTION_NOCLAMPVALUE, aBuf); - - MainView.HSplitTop(2.0f, nullptr, &MainView); - static CButtonContainer s_UiColorResetId; - DoLine_ColorPicker(&s_UiColorResetId, 25.0f, 13.0f, 2.0f, &MainView, Localize("UI Color"), &g_Config.m_UiColor, color_cast(ColorHSLA(0xE4A046AFU, true)), false, nullptr, true); - - // Backend list - struct SMenuBackendInfo - { - int m_Major = 0; - int m_Minor = 0; - int m_Patch = 0; - const char *m_pBackendName = ""; - bool m_Found = false; - }; - std::array, EBackendType::BACKEND_TYPE_COUNT> aaSupportedBackends{}; - uint32_t FoundBackendCount = 0; - for(uint32_t i = 0; i < BACKEND_TYPE_COUNT; ++i) - { - if(EBackendType(i) == BACKEND_TYPE_AUTO) - continue; - for(uint32_t n = 0; n < GRAPHICS_DRIVER_AGE_TYPE_COUNT; ++n) - { - auto &Info = aaSupportedBackends[i][n]; - if(Graphics()->GetDriverVersion(EGraphicsDriverAgeType(n), Info.m_Major, Info.m_Minor, Info.m_Patch, Info.m_pBackendName, EBackendType(i))) - { - // don't count blocked opengl drivers - if(EBackendType(i) != BACKEND_TYPE_OPENGL || EGraphicsDriverAgeType(n) == GRAPHICS_DRIVER_AGE_TYPE_LEGACY || g_Config.m_GfxDriverIsBlocked == 0) - { - Info.m_Found = true; - ++FoundBackendCount; - } - } - } - } - - if(FoundBackendCount > 1) - { - CUIRect Text, BackendDropDown; - MainView.HSplitTop(10.0f, nullptr, &MainView); - MainView.HSplitTop(20.0f, &Text, &MainView); - MainView.HSplitTop(2.0f, nullptr, &MainView); - MainView.HSplitTop(20.0f, &BackendDropDown, &MainView); - Ui()->DoLabel(&Text, Localize("Renderer"), 16.0f, TEXTALIGN_MC); - - static std::vector s_vBackendIdNames; - static std::vector s_vpBackendIdNamesCStr; - static std::vector s_vBackendInfos; - - size_t BackendCount = FoundBackendCount + 1; - s_vBackendIdNames.resize(BackendCount); - s_vpBackendIdNamesCStr.resize(BackendCount); - s_vBackendInfos.resize(BackendCount); - - char aTmpBackendName[256]; - - auto IsInfoDefault = [](const SMenuBackendInfo &CheckInfo) { - return str_comp_nocase(CheckInfo.m_pBackendName, CConfig::ms_pGfxBackend) == 0 && CheckInfo.m_Major == CConfig::ms_GfxGLMajor && CheckInfo.m_Minor == CConfig::ms_GfxGLMinor && CheckInfo.m_Patch == CConfig::ms_GfxGLPatch; - }; - - int OldSelectedBackend = -1; - uint32_t CurCounter = 0; - for(uint32_t i = 0; i < BACKEND_TYPE_COUNT; ++i) - { - for(uint32_t n = 0; n < GRAPHICS_DRIVER_AGE_TYPE_COUNT; ++n) - { - auto &Info = aaSupportedBackends[i][n]; - if(Info.m_Found) - { - bool IsDefault = IsInfoDefault(Info); - str_format(aTmpBackendName, sizeof(aTmpBackendName), "%s (%d.%d.%d)%s%s", Info.m_pBackendName, Info.m_Major, Info.m_Minor, Info.m_Patch, IsDefault ? " - " : "", IsDefault ? Localize("default") : ""); - s_vBackendIdNames[CurCounter] = aTmpBackendName; - s_vpBackendIdNamesCStr[CurCounter] = s_vBackendIdNames[CurCounter].c_str(); - if(str_comp_nocase(Info.m_pBackendName, g_Config.m_GfxBackend) == 0 && g_Config.m_GfxGLMajor == Info.m_Major && g_Config.m_GfxGLMinor == Info.m_Minor && g_Config.m_GfxGLPatch == Info.m_Patch) - { - OldSelectedBackend = CurCounter; - } - - s_vBackendInfos[CurCounter] = Info; - ++CurCounter; - } - } - } - - if(OldSelectedBackend != -1) - { - // no custom selected - BackendCount -= 1; - } - else - { - // custom selected one - str_format(aTmpBackendName, sizeof(aTmpBackendName), "%s (%s %d.%d.%d)", Localize("custom"), g_Config.m_GfxBackend, g_Config.m_GfxGLMajor, g_Config.m_GfxGLMinor, g_Config.m_GfxGLPatch); - s_vBackendIdNames[CurCounter] = aTmpBackendName; - s_vpBackendIdNamesCStr[CurCounter] = s_vBackendIdNames[CurCounter].c_str(); - OldSelectedBackend = CurCounter; - - s_vBackendInfos[CurCounter].m_pBackendName = "custom"; - s_vBackendInfos[CurCounter].m_Major = g_Config.m_GfxGLMajor; - s_vBackendInfos[CurCounter].m_Minor = g_Config.m_GfxGLMinor; - s_vBackendInfos[CurCounter].m_Patch = g_Config.m_GfxGLPatch; - } - - static int s_OldSelectedBackend = -1; - if(s_OldSelectedBackend == -1) - s_OldSelectedBackend = OldSelectedBackend; - - static CUi::SDropDownState s_BackendDropDownState; - static CScrollRegion s_BackendDropDownScrollRegion; - s_BackendDropDownState.m_SelectionPopupContext.m_pScrollRegion = &s_BackendDropDownScrollRegion; - const int NewBackend = Ui()->DoDropDown(&BackendDropDown, OldSelectedBackend, s_vpBackendIdNamesCStr.data(), BackendCount, s_BackendDropDownState); - if(OldSelectedBackend != NewBackend) - { - str_copy(g_Config.m_GfxBackend, s_vBackendInfos[NewBackend].m_pBackendName); - g_Config.m_GfxGLMajor = s_vBackendInfos[NewBackend].m_Major; - g_Config.m_GfxGLMinor = s_vBackendInfos[NewBackend].m_Minor; - g_Config.m_GfxGLPatch = s_vBackendInfos[NewBackend].m_Patch; - - CheckSettings = true; - s_GfxBackendChanged = s_OldSelectedBackend != NewBackend; - } - } - - // GPU list - const auto &GpuList = Graphics()->GetGpus(); - if(GpuList.m_vGpus.size() > 1) - { - CUIRect Text, GpuDropDown; - MainView.HSplitTop(10.0f, nullptr, &MainView); - MainView.HSplitTop(20.0f, &Text, &MainView); - MainView.HSplitTop(2.0f, nullptr, &MainView); - MainView.HSplitTop(20.0f, &GpuDropDown, &MainView); - Ui()->DoLabel(&Text, Localize("Graphics card"), 16.0f, TEXTALIGN_MC); - - static std::vector s_vpGpuIdNames; - - size_t GpuCount = GpuList.m_vGpus.size() + 1; - s_vpGpuIdNames.resize(GpuCount); - - char aCurDeviceName[256 + 4]; - - int OldSelectedGpu = -1; - for(size_t i = 0; i < GpuCount; ++i) - { - if(i == 0) - { - str_format(aCurDeviceName, sizeof(aCurDeviceName), "%s (%s)", Localize("auto"), GpuList.m_AutoGpu.m_aName); - s_vpGpuIdNames[i] = aCurDeviceName; - if(str_comp("auto", g_Config.m_GfxGpuName) == 0) - { - OldSelectedGpu = 0; - } - } - else - { - s_vpGpuIdNames[i] = GpuList.m_vGpus[i - 1].m_aName; - if(str_comp(GpuList.m_vGpus[i - 1].m_aName, g_Config.m_GfxGpuName) == 0) - { - OldSelectedGpu = i; - } - } - } - - static int s_OldSelectedGpu = -1; - if(s_OldSelectedGpu == -1) - s_OldSelectedGpu = OldSelectedGpu; - - static CUi::SDropDownState s_GpuDropDownState; - static CScrollRegion s_GpuDropDownScrollRegion; - s_GpuDropDownState.m_SelectionPopupContext.m_pScrollRegion = &s_GpuDropDownScrollRegion; - const int NewGpu = Ui()->DoDropDown(&GpuDropDown, OldSelectedGpu, s_vpGpuIdNames.data(), GpuCount, s_GpuDropDownState); - if(OldSelectedGpu != NewGpu) - { - if(NewGpu == 0) - str_copy(g_Config.m_GfxGpuName, "auto"); - else - str_copy(g_Config.m_GfxGpuName, GpuList.m_vGpus[NewGpu - 1].m_aName); - CheckSettings = true; - s_GfxGpuChanged = NewGpu != s_OldSelectedGpu; - } - } - - // check if the new settings require a restart - if(CheckSettings) - { - m_NeedRestartGraphics = !(s_GfxFsaaSamples == g_Config.m_GfxFsaaSamples && - !s_GfxBackendChanged && - !s_GfxGpuChanged && - s_GfxHighdpi == g_Config.m_GfxHighdpi); - } -} - -void CMenus::RenderSettingsSound(CUIRect MainView) -{ - static int s_SndEnable = g_Config.m_SndEnable; - - CUIRect Button; - MainView.HSplitTop(20.0f, &Button, &MainView); - if(DoButton_CheckBox(&g_Config.m_SndEnable, Localize("Use sounds"), g_Config.m_SndEnable, &Button)) - { - g_Config.m_SndEnable ^= 1; - UpdateMusicState(); - m_NeedRestartSound = g_Config.m_SndEnable && !s_SndEnable; - } - - if(!g_Config.m_SndEnable) - return; - - MainView.HSplitTop(20.0f, &Button, &MainView); - if(DoButton_CheckBox(&g_Config.m_SndMusic, Localize("Play background music"), g_Config.m_SndMusic, &Button)) - { - g_Config.m_SndMusic ^= 1; - UpdateMusicState(); - } - - MainView.HSplitTop(20.0f, &Button, &MainView); - if(DoButton_CheckBox(&g_Config.m_SndNonactiveMute, Localize("Mute when not active"), g_Config.m_SndNonactiveMute, &Button)) - g_Config.m_SndNonactiveMute ^= 1; - - MainView.HSplitTop(20.0f, &Button, &MainView); - if(DoButton_CheckBox(&g_Config.m_SndGame, Localize("Enable game sounds"), g_Config.m_SndGame, &Button)) - g_Config.m_SndGame ^= 1; - - MainView.HSplitTop(20.0f, &Button, &MainView); - if(DoButton_CheckBox(&g_Config.m_SndGun, Localize("Enable gun sound"), g_Config.m_SndGun, &Button)) - g_Config.m_SndGun ^= 1; - - MainView.HSplitTop(20.0f, &Button, &MainView); - if(DoButton_CheckBox(&g_Config.m_SndLongPain, Localize("Enable long pain sound (used when shooting in freeze)"), g_Config.m_SndLongPain, &Button)) - g_Config.m_SndLongPain ^= 1; - - MainView.HSplitTop(20.0f, &Button, &MainView); - if(DoButton_CheckBox(&g_Config.m_SndServerMessage, Localize("Enable server message sound"), g_Config.m_SndServerMessage, &Button)) - g_Config.m_SndServerMessage ^= 1; - - MainView.HSplitTop(20.0f, &Button, &MainView); - if(DoButton_CheckBox(&g_Config.m_SndChat, Localize("Enable regular chat sound"), g_Config.m_SndChat, &Button)) - g_Config.m_SndChat ^= 1; - - MainView.HSplitTop(20.0f, &Button, &MainView); - if(DoButton_CheckBox(&g_Config.m_SndTeamChat, Localize("Enable team chat sound"), g_Config.m_SndTeamChat, &Button)) - g_Config.m_SndTeamChat ^= 1; - - MainView.HSplitTop(20.0f, &Button, &MainView); - if(DoButton_CheckBox(&g_Config.m_SndHighlight, Localize("Enable highlighted chat sound"), g_Config.m_SndHighlight, &Button)) - g_Config.m_SndHighlight ^= 1; - - // volume slider - { - MainView.HSplitTop(5.0f, nullptr, &MainView); - MainView.HSplitTop(20.0f, &Button, &MainView); - Ui()->DoScrollbarOption(&g_Config.m_SndVolume, &g_Config.m_SndVolume, &Button, Localize("Sound volume"), 0, 100, &CUi::ms_LogarithmicScrollbarScale, 0u, "%"); - } - - // volume slider game sounds - { - MainView.HSplitTop(5.0f, nullptr, &MainView); - MainView.HSplitTop(20.0f, &Button, &MainView); - Ui()->DoScrollbarOption(&g_Config.m_SndGameSoundVolume, &g_Config.m_SndGameSoundVolume, &Button, Localize("Game sound volume"), 0, 100, &CUi::ms_LogarithmicScrollbarScale, 0u, "%"); - } - - // volume slider gui sounds - { - MainView.HSplitTop(5.0f, nullptr, &MainView); - MainView.HSplitTop(20.0f, &Button, &MainView); - Ui()->DoScrollbarOption(&g_Config.m_SndChatSoundVolume, &g_Config.m_SndChatSoundVolume, &Button, Localize("Chat sound volume"), 0, 100, &CUi::ms_LogarithmicScrollbarScale, 0u, "%"); - } - - // volume slider map sounds - { - MainView.HSplitTop(5.0f, nullptr, &MainView); - MainView.HSplitTop(20.0f, &Button, &MainView); - Ui()->DoScrollbarOption(&g_Config.m_SndMapSoundVolume, &g_Config.m_SndMapSoundVolume, &Button, Localize("Map sound volume"), 0, 100, &CUi::ms_LogarithmicScrollbarScale, 0u, "%"); - } - - // volume slider background music - { - MainView.HSplitTop(5.0f, nullptr, &MainView); - MainView.HSplitTop(20.0f, &Button, &MainView); - Ui()->DoScrollbarOption(&g_Config.m_SndBackgroundMusicVolume, &g_Config.m_SndBackgroundMusicVolume, &Button, Localize("Background music volume"), 0, 100, &CUi::ms_LogarithmicScrollbarScale, 0u, "%"); - } -} - -bool CMenus::RenderLanguageSelection(CUIRect MainView) -{ - static int s_SelectedLanguage = -2; // -2 = unloaded, -1 = unset - static CListBox s_ListBox; - - if(s_SelectedLanguage == -2) - { - s_SelectedLanguage = -1; - for(size_t i = 0; i < g_Localization.Languages().size(); i++) - { - if(str_comp(g_Localization.Languages()[i].m_FileName.c_str(), g_Config.m_ClLanguagefile) == 0) - { - s_SelectedLanguage = i; - s_ListBox.ScrollToSelected(); - break; - } - } - } - - const int OldSelected = s_SelectedLanguage; - - s_ListBox.DoStart(24.0f, g_Localization.Languages().size(), 1, 3, s_SelectedLanguage, &MainView); - - for(const auto &Language : g_Localization.Languages()) - { - const CListboxItem Item = s_ListBox.DoNextItem(&Language.m_Name, s_SelectedLanguage != -1 && !str_comp(g_Localization.Languages()[s_SelectedLanguage].m_Name.c_str(), Language.m_Name.c_str())); - if(!Item.m_Visible) - continue; - - CUIRect FlagRect, Label; - Item.m_Rect.VSplitLeft(Item.m_Rect.h * 2.0f, &FlagRect, &Label); - FlagRect.VMargin(6.0f, &FlagRect); - FlagRect.HMargin(3.0f, &FlagRect); - m_pClient->m_CountryFlags.Render(Language.m_CountryCode, ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), FlagRect.x, FlagRect.y, FlagRect.w, FlagRect.h); - - Ui()->DoLabel(&Label, Language.m_Name.c_str(), 16.0f, TEXTALIGN_ML); - } - - s_SelectedLanguage = s_ListBox.DoEnd(); - - if(OldSelected != s_SelectedLanguage) - { - str_copy(g_Config.m_ClLanguagefile, g_Localization.Languages()[s_SelectedLanguage].m_FileName.c_str()); - GameClient()->OnLanguageChange(); - } - - return s_ListBox.WasItemActivated(); -} - -void CMenus::RenderSettings(CUIRect MainView) -{ - // render background - CUIRect Button, TabBar, RestartBar; - MainView.VSplitRight(120.0f, &MainView, &TabBar); - MainView.Draw(ms_ColorTabbarActive, IGraphics::CORNER_B, 10.0f); - MainView.Margin(20.0f, &MainView); - - const bool NeedRestart = m_NeedRestartGraphics || m_NeedRestartSound || m_NeedRestartUpdate; - if(NeedRestart) - { - MainView.HSplitBottom(20.0f, &MainView, &RestartBar); - MainView.HSplitBottom(10.0f, &MainView, nullptr); - } - - TabBar.HSplitTop(50.0f, &Button, &TabBar); - Button.Draw(ms_ColorTabbarActive, IGraphics::CORNER_BR, 10.0f); - - const char *apTabs[SETTINGS_LENGTH] = { - Localize("Language"), - Localize("General"), - Localize("Player"), - Client()->IsSixup() ? "Tee 0.7" : Localize("Tee"), - Localize("Appearance"), - Localize("Controls"), - Localize("Graphics"), - Localize("Sound"), - Localize("DDNet"), - Localize("Assets")}; - static CButtonContainer s_aTabButtons[SETTINGS_LENGTH]; - - for(int i = 0; i < SETTINGS_LENGTH; i++) - { - TabBar.HSplitTop(10.0f, nullptr, &TabBar); - TabBar.HSplitTop(26.0f, &Button, &TabBar); - if(DoButton_MenuTab(&s_aTabButtons[i], apTabs[i], g_Config.m_UiSettingsPage == i, &Button, IGraphics::CORNER_R, &m_aAnimatorsSettingsTab[i])) - g_Config.m_UiSettingsPage = i; - } - - if(g_Config.m_UiSettingsPage == SETTINGS_LANGUAGE) - { - GameClient()->m_MenuBackground.ChangePosition(CMenuBackground::POS_SETTINGS_LANGUAGE); - RenderLanguageSelection(MainView); - } - else if(g_Config.m_UiSettingsPage == SETTINGS_GENERAL) - { - GameClient()->m_MenuBackground.ChangePosition(CMenuBackground::POS_SETTINGS_GENERAL); - RenderSettingsGeneral(MainView); - } - else if(g_Config.m_UiSettingsPage == SETTINGS_PLAYER) - { - GameClient()->m_MenuBackground.ChangePosition(CMenuBackground::POS_SETTINGS_PLAYER); - RenderSettingsPlayer(MainView); - } - else if(g_Config.m_UiSettingsPage == SETTINGS_TEE) - { - GameClient()->m_MenuBackground.ChangePosition(CMenuBackground::POS_SETTINGS_TEE); - if(Client()->IsSixup()) - RenderSettingsTee7(MainView); - else - RenderSettingsTee(MainView); - } - else if(g_Config.m_UiSettingsPage == SETTINGS_APPEARANCE) - { - GameClient()->m_MenuBackground.ChangePosition(CMenuBackground::POS_SETTINGS_APPEARANCE); - RenderSettingsAppearance(MainView); - } - else if(g_Config.m_UiSettingsPage == SETTINGS_CONTROLS) - { - GameClient()->m_MenuBackground.ChangePosition(CMenuBackground::POS_SETTINGS_CONTROLS); - RenderSettingsControls(MainView); - } - else if(g_Config.m_UiSettingsPage == SETTINGS_GRAPHICS) - { - GameClient()->m_MenuBackground.ChangePosition(CMenuBackground::POS_SETTINGS_GRAPHICS); - RenderSettingsGraphics(MainView); - } - else if(g_Config.m_UiSettingsPage == SETTINGS_SOUND) - { - GameClient()->m_MenuBackground.ChangePosition(CMenuBackground::POS_SETTINGS_SOUND); - RenderSettingsSound(MainView); - } - else if(g_Config.m_UiSettingsPage == SETTINGS_DDNET) - { - GameClient()->m_MenuBackground.ChangePosition(CMenuBackground::POS_SETTINGS_DDNET); - RenderSettingsDDNet(MainView); - } - else if(g_Config.m_UiSettingsPage == SETTINGS_ASSETS) - { - GameClient()->m_MenuBackground.ChangePosition(CMenuBackground::POS_SETTINGS_ASSETS); - RenderSettingsCustom(MainView); - } - else - { - dbg_assert(false, "ui_settings_page invalid"); - } - - if(NeedRestart) - { - CUIRect RestartWarning, RestartButton; - RestartBar.VSplitRight(125.0f, &RestartWarning, &RestartButton); - RestartWarning.VSplitRight(10.0f, &RestartWarning, nullptr); - if(m_NeedRestartUpdate) - { - TextRender()->TextColor(1.0f, 0.4f, 0.4f, 1.0f); - Ui()->DoLabel(&RestartWarning, Localize("DDNet Client needs to be restarted to complete update!"), 14.0f, TEXTALIGN_ML); - TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); - } - else - { - Ui()->DoLabel(&RestartWarning, Localize("You must restart the game for all settings to take effect."), 14.0f, TEXTALIGN_ML); - } - - static CButtonContainer s_RestartButton; - if(DoButton_Menu(&s_RestartButton, Localize("Restart"), 0, &RestartButton)) - { - if(Client()->State() == IClient::STATE_ONLINE || m_pClient->Editor()->HasUnsavedData()) - { - m_Popup = POPUP_RESTART; - } - else - { - Client()->Restart(); - } - } - } -} - -bool CMenus::RenderHslaScrollbars(CUIRect *pRect, unsigned int *pColor, bool Alpha, float DarkestLight) -{ - const unsigned PrevPackedColor = *pColor; - ColorHSLA Color(*pColor, Alpha); - const ColorHSLA OriginalColor = Color; - const char *apLabels[] = {Localize("Hue"), Localize("Sat."), Localize("Lht."), Localize("Alpha")}; - const float SizePerEntry = 20.0f; - const float MarginPerEntry = 5.0f; - const float PreviewMargin = 2.5f; - const float PreviewHeight = 40.0f + 2 * PreviewMargin; - const float OffY = (SizePerEntry + MarginPerEntry) * (3 + (Alpha ? 1 : 0)) - PreviewHeight; - - CUIRect Preview; - pRect->VSplitLeft(PreviewHeight, &Preview, pRect); - Preview.HSplitTop(OffY / 2.0f, nullptr, &Preview); - Preview.HSplitTop(PreviewHeight, &Preview, nullptr); - - Preview.Draw(ColorRGBA(0.15f, 0.15f, 0.15f, 1.0f), IGraphics::CORNER_ALL, 4.0f + PreviewMargin); - Preview.Margin(PreviewMargin, &Preview); - Preview.Draw(color_cast(Color.UnclampLighting(DarkestLight)), IGraphics::CORNER_ALL, 4.0f + PreviewMargin); - - auto &&RenderHueRect = [&](CUIRect *pColorRect) { - float CurXOff = pColorRect->x; - const float SizeColor = pColorRect->w / 6; - - // red to yellow - { - IGraphics::CColorVertex aColorVertices[] = { - IGraphics::CColorVertex(0, 1, 0, 0, 1), - IGraphics::CColorVertex(1, 1, 1, 0, 1), - IGraphics::CColorVertex(2, 1, 0, 0, 1), - IGraphics::CColorVertex(3, 1, 1, 0, 1)}; - Graphics()->SetColorVertex(aColorVertices, std::size(aColorVertices)); - - IGraphics::CFreeformItem Freeform( - CurXOff, pColorRect->y, - CurXOff + SizeColor, pColorRect->y, - CurXOff, pColorRect->y + pColorRect->h, - CurXOff + SizeColor, pColorRect->y + pColorRect->h); - Graphics()->QuadsDrawFreeform(&Freeform, 1); - } - - // yellow to green - CurXOff += SizeColor; - { - IGraphics::CColorVertex aColorVertices[] = { - IGraphics::CColorVertex(0, 1, 1, 0, 1), - IGraphics::CColorVertex(1, 0, 1, 0, 1), - IGraphics::CColorVertex(2, 1, 1, 0, 1), - IGraphics::CColorVertex(3, 0, 1, 0, 1)}; - Graphics()->SetColorVertex(aColorVertices, std::size(aColorVertices)); - - IGraphics::CFreeformItem Freeform( - CurXOff, pColorRect->y, - CurXOff + SizeColor, pColorRect->y, - CurXOff, pColorRect->y + pColorRect->h, - CurXOff + SizeColor, pColorRect->y + pColorRect->h); - Graphics()->QuadsDrawFreeform(&Freeform, 1); - } - - CurXOff += SizeColor; - // green to turquoise - { - IGraphics::CColorVertex aColorVertices[] = { - IGraphics::CColorVertex(0, 0, 1, 0, 1), - IGraphics::CColorVertex(1, 0, 1, 1, 1), - IGraphics::CColorVertex(2, 0, 1, 0, 1), - IGraphics::CColorVertex(3, 0, 1, 1, 1)}; - Graphics()->SetColorVertex(aColorVertices, std::size(aColorVertices)); - - IGraphics::CFreeformItem Freeform( - CurXOff, pColorRect->y, - CurXOff + SizeColor, pColorRect->y, - CurXOff, pColorRect->y + pColorRect->h, - CurXOff + SizeColor, pColorRect->y + pColorRect->h); - Graphics()->QuadsDrawFreeform(&Freeform, 1); - } - - CurXOff += SizeColor; - // turquoise to blue - { - IGraphics::CColorVertex aColorVertices[] = { - IGraphics::CColorVertex(0, 0, 1, 1, 1), - IGraphics::CColorVertex(1, 0, 0, 1, 1), - IGraphics::CColorVertex(2, 0, 1, 1, 1), - IGraphics::CColorVertex(3, 0, 0, 1, 1)}; - Graphics()->SetColorVertex(aColorVertices, std::size(aColorVertices)); - - IGraphics::CFreeformItem Freeform( - CurXOff, pColorRect->y, - CurXOff + SizeColor, pColorRect->y, - CurXOff, pColorRect->y + pColorRect->h, - CurXOff + SizeColor, pColorRect->y + pColorRect->h); - Graphics()->QuadsDrawFreeform(&Freeform, 1); - } - - CurXOff += SizeColor; - // blue to purple - { - IGraphics::CColorVertex aColorVertices[] = { - IGraphics::CColorVertex(0, 0, 0, 1, 1), - IGraphics::CColorVertex(1, 1, 0, 1, 1), - IGraphics::CColorVertex(2, 0, 0, 1, 1), - IGraphics::CColorVertex(3, 1, 0, 1, 1)}; - Graphics()->SetColorVertex(aColorVertices, std::size(aColorVertices)); - - IGraphics::CFreeformItem Freeform( - CurXOff, pColorRect->y, - CurXOff + SizeColor, pColorRect->y, - CurXOff, pColorRect->y + pColorRect->h, - CurXOff + SizeColor, pColorRect->y + pColorRect->h); - Graphics()->QuadsDrawFreeform(&Freeform, 1); - } - - CurXOff += SizeColor; - // purple to red - { - IGraphics::CColorVertex aColorVertices[] = { - IGraphics::CColorVertex(0, 1, 0, 1, 1), - IGraphics::CColorVertex(1, 1, 0, 0, 1), - IGraphics::CColorVertex(2, 1, 0, 1, 1), - IGraphics::CColorVertex(3, 1, 0, 0, 1)}; - Graphics()->SetColorVertex(aColorVertices, std::size(aColorVertices)); - - IGraphics::CFreeformItem Freeform( - CurXOff, pColorRect->y, - CurXOff + SizeColor, pColorRect->y, - CurXOff, pColorRect->y + pColorRect->h, - CurXOff + SizeColor, pColorRect->y + pColorRect->h); - Graphics()->QuadsDrawFreeform(&Freeform, 1); - } - }; - - auto &&RenderSaturationRect = [&](CUIRect *pColorRect, const ColorRGBA &CurColor) { - ColorHSLA LeftColor = color_cast(CurColor); - ColorHSLA RightColor = color_cast(CurColor); - - LeftColor.s = 0.0f; - RightColor.s = 1.0f; - - const ColorRGBA LeftColorRGBA = color_cast(LeftColor); - const ColorRGBA RightColorRGBA = color_cast(RightColor); - - Graphics()->SetColor4(LeftColorRGBA, RightColorRGBA, RightColorRGBA, LeftColorRGBA); - - IGraphics::CFreeformItem Freeform( - pColorRect->x, pColorRect->y, - pColorRect->x + pColorRect->w, pColorRect->y, - pColorRect->x, pColorRect->y + pColorRect->h, - pColorRect->x + pColorRect->w, pColorRect->y + pColorRect->h); - Graphics()->QuadsDrawFreeform(&Freeform, 1); - }; - - auto &&RenderLightingRect = [&](CUIRect *pColorRect, const ColorRGBA &CurColor) { - ColorHSLA LeftColor = color_cast(CurColor); - ColorHSLA RightColor = color_cast(CurColor); - - LeftColor.l = DarkestLight; - RightColor.l = 1.0f; - - const ColorRGBA LeftColorRGBA = color_cast(LeftColor); - const ColorRGBA RightColorRGBA = color_cast(RightColor); - - Graphics()->SetColor4(LeftColorRGBA, RightColorRGBA, RightColorRGBA, LeftColorRGBA); - - IGraphics::CFreeformItem Freeform( - pColorRect->x, pColorRect->y, - pColorRect->x + pColorRect->w, pColorRect->y, - pColorRect->x, pColorRect->y + pColorRect->h, - pColorRect->x + pColorRect->w, pColorRect->y + pColorRect->h); - Graphics()->QuadsDrawFreeform(&Freeform, 1); - }; - - auto &&RenderAlphaRect = [&](CUIRect *pColorRect, const ColorRGBA &CurColorFull) { - const ColorRGBA LeftColorRGBA = color_cast(color_cast(CurColorFull).WithAlpha(0.0f)); - const ColorRGBA RightColorRGBA = color_cast(color_cast(CurColorFull).WithAlpha(1.0f)); - - Graphics()->SetColor4(LeftColorRGBA, RightColorRGBA, RightColorRGBA, LeftColorRGBA); - - IGraphics::CFreeformItem Freeform( - pColorRect->x, pColorRect->y, - pColorRect->x + pColorRect->w, pColorRect->y, - pColorRect->x, pColorRect->y + pColorRect->h, - pColorRect->x + pColorRect->w, pColorRect->y + pColorRect->h); - Graphics()->QuadsDrawFreeform(&Freeform, 1); - }; - - for(int i = 0; i < 3 + Alpha; i++) - { - CUIRect Button, Label; - pRect->HSplitTop(SizePerEntry, &Button, pRect); - pRect->HSplitTop(MarginPerEntry, nullptr, pRect); - Button.VSplitLeft(10.0f, nullptr, &Button); - Button.VSplitLeft(100.0f, &Label, &Button); - - Button.Draw(ColorRGBA(0.15f, 0.15f, 0.15f, 1.0f), IGraphics::CORNER_ALL, 1.0f); - - CUIRect Rail; - Button.Margin(2.0f, &Rail); - - char aBuf[32]; - str_format(aBuf, sizeof(aBuf), "%s: %03d", apLabels[i], round_to_int(Color[i] * 255.0f)); - Ui()->DoLabel(&Label, aBuf, 14.0f, TEXTALIGN_ML); - - ColorRGBA HandleColor; - Graphics()->TextureClear(); - Graphics()->TrianglesBegin(); - if(i == 0) - { - RenderHueRect(&Rail); - HandleColor = color_cast(ColorHSLA(Color.h, 1.0f, 0.5f, 1.0f)); - } - else if(i == 1) - { - RenderSaturationRect(&Rail, color_cast(ColorHSLA(Color.h, 1.0f, 0.5f, 1.0f))); - HandleColor = color_cast(ColorHSLA(Color.h, Color.s, 0.5f, 1.0f)); - } - else if(i == 2) - { - RenderLightingRect(&Rail, color_cast(ColorHSLA(Color.h, Color.s, 0.5f, 1.0f))); - HandleColor = color_cast(ColorHSLA(Color.h, Color.s, Color.l, 1.0f).UnclampLighting(DarkestLight)); - } - else if(i == 3) - { - RenderAlphaRect(&Rail, color_cast(ColorHSLA(Color.h, Color.s, Color.l, 1.0f).UnclampLighting(DarkestLight))); - HandleColor = color_cast(Color.UnclampLighting(DarkestLight)); - } - Graphics()->TrianglesEnd(); - - Color[i] = Ui()->DoScrollbarH(&((char *)pColor)[i], &Button, Color[i], &HandleColor); - } - - if(OriginalColor != Color) - { - *pColor = Color.Pack(Alpha); - } - return PrevPackedColor != *pColor; -} - -enum -{ - APPEARANCE_TAB_HUD = 0, - APPEARANCE_TAB_CHAT = 1, - APPEARANCE_TAB_NAME_PLATE = 2, - APPEARANCE_TAB_HOOK_COLLISION = 3, - APPEARANCE_TAB_INFO_MESSAGES = 4, - APPEARANCE_TAB_LASER = 5, - NUMBER_OF_APPEARANCE_TABS = 6, -}; - -void CMenus::RenderSettingsAppearance(CUIRect MainView) -{ - char aBuf[128]; - static int s_CurTab = 0; - - CUIRect TabBar, LeftView, RightView, Button, Label; - - MainView.HSplitTop(20.0f, &TabBar, &MainView); - const float TabWidth = TabBar.w / NUMBER_OF_APPEARANCE_TABS; - static CButtonContainer s_aPageTabs[NUMBER_OF_APPEARANCE_TABS] = {}; - const char *apTabNames[NUMBER_OF_APPEARANCE_TABS] = { - Localize("HUD"), - Localize("Chat"), - Localize("Name Plate"), - Localize("Hook Collisions"), - Localize("Info Messages"), - Localize("Laser")}; - - for(int Tab = APPEARANCE_TAB_HUD; Tab < NUMBER_OF_APPEARANCE_TABS; ++Tab) - { - TabBar.VSplitLeft(TabWidth, &Button, &TabBar); - const int Corners = Tab == APPEARANCE_TAB_HUD ? IGraphics::CORNER_L : Tab == NUMBER_OF_APPEARANCE_TABS - 1 ? IGraphics::CORNER_R : IGraphics::CORNER_NONE; - if(DoButton_MenuTab(&s_aPageTabs[Tab], apTabNames[Tab], s_CurTab == Tab, &Button, Corners, nullptr, nullptr, nullptr, nullptr, 4.0f)) - { - s_CurTab = Tab; - } - } - - MainView.HSplitTop(10.0f, nullptr, &MainView); - - const float LineSize = 20.0f; - const float ColorPickerLineSize = 25.0f; - const float HeadlineFontSize = 20.0f; - const float HeadlineHeight = 30.0f; - const float MarginSmall = 5.0f; - const float MarginBetweenViews = 20.0f; - - const float ColorPickerLabelSize = 13.0f; - const float ColorPickerLineSpacing = 5.0f; - - if(s_CurTab == APPEARANCE_TAB_HUD) - { - MainView.VSplitMid(&LeftView, &RightView, MarginBetweenViews); - - // ***** HUD ***** // - LeftView.HSplitTop(HeadlineHeight, &Label, &LeftView); - Ui()->DoLabel(&Label, Localize("HUD"), HeadlineFontSize, TEXTALIGN_ML); - LeftView.HSplitTop(MarginSmall, nullptr, &LeftView); - - // Switch of the entire HUD - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowhud, Localize("Show ingame HUD"), &g_Config.m_ClShowhud, &LeftView, LineSize); - - // Switches of the various normal HUD elements - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowhudHealthAmmo, Localize("Show health, shields and ammo"), &g_Config.m_ClShowhudHealthAmmo, &LeftView, LineSize); - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowhudScore, Localize("Show score"), &g_Config.m_ClShowhudScore, &LeftView, LineSize); - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowLocalTimeAlways, Localize("Show local time always"), &g_Config.m_ClShowLocalTimeAlways, &LeftView, LineSize); - - // Settings of the HUD element for votes - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowVotesAfterVoting, Localize("Show votes window after voting"), &g_Config.m_ClShowVotesAfterVoting, &LeftView, LineSize); - - // ***** Scoreboard ***** // - LeftView.HSplitTop(MarginBetweenViews, nullptr, &LeftView); - LeftView.HSplitTop(HeadlineHeight, &Label, &LeftView); - Ui()->DoLabel(&Label, Localize("Scoreboard"), HeadlineFontSize, TEXTALIGN_ML); - LeftView.HSplitTop(MarginSmall, nullptr, &LeftView); - - ColorRGBA GreenDefault(0.78f, 1.0f, 0.8f, 1.0f); - static CButtonContainer s_AuthedColor, s_SameClanColor; - DoLine_ColorPicker(&s_AuthedColor, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &LeftView, Localize("Authed name color in scoreboard"), &g_Config.m_ClAuthedPlayerColor, GreenDefault, false); - DoLine_ColorPicker(&s_SameClanColor, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &LeftView, Localize("Same clan color in scoreboard"), &g_Config.m_ClSameClanColor, GreenDefault, false); - - // ***** DDRace HUD ***** // - RightView.HSplitTop(HeadlineHeight, &Label, &RightView); - Ui()->DoLabel(&Label, Localize("DDRace HUD"), HeadlineFontSize, TEXTALIGN_ML); - RightView.HSplitTop(MarginSmall, nullptr, &RightView); - - // Switches of various DDRace HUD elements - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowIds, Localize("Show client IDs (scoreboard, chat, spectator)"), &g_Config.m_ClShowIds, &RightView, LineSize); - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowhudDDRace, Localize("Show DDRace HUD"), &g_Config.m_ClShowhudDDRace, &RightView, LineSize); - if(g_Config.m_ClShowhudDDRace) - { - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowhudJumpsIndicator, Localize("Show jumps indicator"), &g_Config.m_ClShowhudJumpsIndicator, &RightView, LineSize); - } - else - { - RightView.HSplitTop(LineSize, nullptr, &RightView); // Create empty space for hidden option - } - - // Switch for dummy actions display - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowhudDummyActions, Localize("Show dummy actions"), &g_Config.m_ClShowhudDummyActions, &RightView, LineSize); - - // Player movement information display settings - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowhudPlayerPosition, Localize("Show player position"), &g_Config.m_ClShowhudPlayerPosition, &RightView, LineSize); - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowhudPlayerSpeed, Localize("Show player speed"), &g_Config.m_ClShowhudPlayerSpeed, &RightView, LineSize); - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowhudPlayerAngle, Localize("Show player target angle"), &g_Config.m_ClShowhudPlayerAngle, &RightView, LineSize); - - // Freeze bar settings - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowFreezeBars, Localize("Show freeze bars"), &g_Config.m_ClShowFreezeBars, &RightView, LineSize); - RightView.HSplitTop(2 * LineSize, &Button, &RightView); - if(g_Config.m_ClShowFreezeBars) - { - Ui()->DoScrollbarOption(&g_Config.m_ClFreezeBarsAlphaInsideFreeze, &g_Config.m_ClFreezeBarsAlphaInsideFreeze, &Button, Localize("Opacity of freeze bars inside freeze"), 0, 100, &CUi::ms_LinearScrollbarScale, CUi::SCROLLBAR_OPTION_MULTILINE, "%"); - } - } - else if(s_CurTab == APPEARANCE_TAB_CHAT) - { - CChat &Chat = GameClient()->m_Chat; - CUIRect TopView, PreviewView; - MainView.HSplitBottom(220.0f, &TopView, &PreviewView); - TopView.HSplitBottom(MarginBetweenViews, &TopView, nullptr); - TopView.VSplitMid(&LeftView, &RightView, MarginBetweenViews); - - // ***** Chat ***** // - LeftView.HSplitTop(HeadlineHeight, &Label, &LeftView); - Ui()->DoLabel(&Label, Localize("Chat"), HeadlineFontSize, TEXTALIGN_ML); - LeftView.HSplitTop(MarginSmall, nullptr, &LeftView); - - // General chat settings - LeftView.HSplitTop(LineSize, &Button, &LeftView); - if(DoButton_CheckBox(&g_Config.m_ClShowChat, Localize("Show chat"), g_Config.m_ClShowChat, &Button)) - { - g_Config.m_ClShowChat = g_Config.m_ClShowChat ? 0 : 1; - } - LeftView.HSplitTop(LineSize, &Button, &LeftView); - if(g_Config.m_ClShowChat) - { - static int s_ShowChat = 0; - if(DoButton_CheckBox(&s_ShowChat, Localize("Always show chat"), g_Config.m_ClShowChat == 2, &Button)) - g_Config.m_ClShowChat = g_Config.m_ClShowChat != 2 ? 2 : 1; - } - - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClChatTeamColors, Localize("Show names in chat in team colors"), &g_Config.m_ClChatTeamColors, &LeftView, LineSize); - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowChatFriends, Localize("Show only chat messages from friends"), &g_Config.m_ClShowChatFriends, &LeftView, LineSize); - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowChatTeamMembersOnly, Localize("Show only chat messages from team members"), &g_Config.m_ClShowChatTeamMembersOnly, &LeftView, LineSize); - - if(DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClChatOld, Localize("Use old chat style"), &g_Config.m_ClChatOld, &LeftView, LineSize)) - GameClient()->m_Chat.RebuildChat(); - - LeftView.HSplitTop(2 * LineSize, &Button, &LeftView); - if(Ui()->DoScrollbarOption(&g_Config.m_ClChatFontSize, &g_Config.m_ClChatFontSize, &Button, Localize("Chat font size"), 10, 100, &CUi::ms_LinearScrollbarScale, CUi::SCROLLBAR_OPTION_MULTILINE)) - { - Chat.EnsureCoherentWidth(); - Chat.RebuildChat(); - } - - LeftView.HSplitTop(2 * LineSize, &Button, &LeftView); - if(Ui()->DoScrollbarOption(&g_Config.m_ClChatWidth, &g_Config.m_ClChatWidth, &Button, Localize("Chat width"), 120, 400, &CUi::ms_LinearScrollbarScale, CUi::SCROLLBAR_OPTION_MULTILINE)) - { - Chat.EnsureCoherentFontSize(); - Chat.RebuildChat(); - } - - // ***** Messages ***** // - RightView.HSplitTop(HeadlineHeight, &Label, &RightView); - Ui()->DoLabel(&Label, Localize("Messages"), HeadlineFontSize, TEXTALIGN_ML); - RightView.HSplitTop(MarginSmall, nullptr, &RightView); - - // Message Colors and extra settings - static CButtonContainer s_SystemMessageColor; - DoLine_ColorPicker(&s_SystemMessageColor, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &RightView, Localize("System message"), &g_Config.m_ClMessageSystemColor, ColorRGBA(1.0f, 1.0f, 0.5f), true, &g_Config.m_ClShowChatSystem); - static CButtonContainer s_HighlightedMessageColor; - DoLine_ColorPicker(&s_HighlightedMessageColor, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &RightView, Localize("Highlighted message"), &g_Config.m_ClMessageHighlightColor, ColorRGBA(1.0f, 0.5f, 0.5f)); - static CButtonContainer s_TeamMessageColor; - DoLine_ColorPicker(&s_TeamMessageColor, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &RightView, Localize("Team message"), &g_Config.m_ClMessageTeamColor, ColorRGBA(0.65f, 1.0f, 0.65f)); - static CButtonContainer s_FriendMessageColor; - DoLine_ColorPicker(&s_FriendMessageColor, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &RightView, Localize("Friend message"), &g_Config.m_ClMessageFriendColor, ColorRGBA(1.0f, 0.137f, 0.137f), true, &g_Config.m_ClMessageFriend); - static CButtonContainer s_NormalMessageColor; - DoLine_ColorPicker(&s_NormalMessageColor, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &RightView, Localize("Normal message"), &g_Config.m_ClMessageColor, ColorRGBA(1.0f, 1.0f, 1.0f)); - - str_format(aBuf, sizeof(aBuf), "%s (echo)", Localize("Client message")); - static CButtonContainer s_ClientMessageColor; - DoLine_ColorPicker(&s_ClientMessageColor, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &RightView, aBuf, &g_Config.m_ClMessageClientColor, ColorRGBA(0.5f, 0.78f, 1.0f)); - - // ***** Chat Preview ***** // - PreviewView.HSplitTop(HeadlineHeight, &Label, &PreviewView); - Ui()->DoLabel(&Label, Localize("Preview"), HeadlineFontSize, TEXTALIGN_ML); - PreviewView.HSplitTop(MarginSmall, nullptr, &PreviewView); - - // Use the rest of the view for preview - PreviewView.Draw(ColorRGBA(1, 1, 1, 0.1f), IGraphics::CORNER_ALL, 5.0f); - PreviewView.Margin(MarginSmall, &PreviewView); - - ColorRGBA SystemColor = color_cast(ColorHSLA(g_Config.m_ClMessageSystemColor)); - ColorRGBA HighlightedColor = color_cast(ColorHSLA(g_Config.m_ClMessageHighlightColor)); - ColorRGBA TeamColor = color_cast(ColorHSLA(g_Config.m_ClMessageTeamColor)); - ColorRGBA FriendColor = color_cast(ColorHSLA(g_Config.m_ClMessageFriendColor)); - ColorRGBA NormalColor = color_cast(ColorHSLA(g_Config.m_ClMessageColor)); - ColorRGBA ClientColor = color_cast(ColorHSLA(g_Config.m_ClMessageClientColor)); - ColorRGBA DefaultNameColor(0.8f, 0.8f, 0.8f, 1.0f); - - const float RealFontSize = Chat.FontSize() * 2; - const float RealMsgPaddingX = (!g_Config.m_ClChatOld ? Chat.MessagePaddingX() : 0) * 2; - const float RealMsgPaddingY = (!g_Config.m_ClChatOld ? Chat.MessagePaddingY() : 0) * 2; - const float RealMsgPaddingTee = (!g_Config.m_ClChatOld ? Chat.MessageTeeSize() + CChat::MESSAGE_TEE_PADDING_RIGHT : 0) * 2; - const float RealOffsetY = RealFontSize + RealMsgPaddingY; - - const float X = RealMsgPaddingX / 2.0f + PreviewView.x; - float Y = PreviewView.y; - float LineWidth = g_Config.m_ClChatWidth * 2 - (RealMsgPaddingX * 1.5f) - RealMsgPaddingTee; - - str_copy(aBuf, Client()->PlayerName()); - - const CAnimState *pIdleState = CAnimState::GetIdle(); - const float RealTeeSize = Chat.MessageTeeSize() * 2; - const float RealTeeSizeHalved = Chat.MessageTeeSize(); - constexpr float TWSkinUnreliableOffset = -0.25f; - const float OffsetTeeY = RealTeeSizeHalved; - const float FullHeightMinusTee = RealOffsetY - RealTeeSize; - - struct SPreviewLine - { - int m_ClientId; - bool m_Team; - char m_aName[64]; - char m_aText[256]; - bool m_Friend; - bool m_Player; - bool m_Client; - bool m_Highlighted; - int m_TimesRepeated; - - CTeeRenderInfo m_RenderInfo; - }; - - static std::vector s_vLines; - - enum ELineFlag - { - FLAG_TEAM = 1 << 0, - FLAG_FRIEND = 1 << 1, - FLAG_HIGHLIGHT = 1 << 2, - FLAG_CLIENT = 1 << 3 - }; - enum - { - PREVIEW_SYS, - PREVIEW_HIGHLIGHT, - PREVIEW_TEAM, - PREVIEW_FRIEND, - PREVIEW_SPAMMER, - PREVIEW_CLIENT - }; - auto &&SetPreviewLine = [](int Index, int ClientId, const char *pName, const char *pText, int Flag, int Repeats) { - SPreviewLine *pLine; - if((int)s_vLines.size() <= Index) - { - s_vLines.emplace_back(); - pLine = &s_vLines.back(); - } - else - { - pLine = &s_vLines[Index]; - } - pLine->m_ClientId = ClientId; - pLine->m_Team = Flag & FLAG_TEAM; - pLine->m_Friend = Flag & FLAG_FRIEND; - pLine->m_Player = ClientId >= 0; - pLine->m_Highlighted = Flag & FLAG_HIGHLIGHT; - pLine->m_Client = Flag & FLAG_CLIENT; - pLine->m_TimesRepeated = Repeats; - str_copy(pLine->m_aName, pName); - str_copy(pLine->m_aText, pText); - }; - auto &&SetLineSkin = [RealTeeSize](int Index, const CSkin *pSkin) { - if(Index >= (int)s_vLines.size()) - return; - s_vLines[Index].m_RenderInfo.m_Size = RealTeeSize; - s_vLines[Index].m_RenderInfo.Apply(pSkin); - }; - - auto &&RenderPreview = [&](int LineIndex, int x, int y, bool Render = true) { - if(LineIndex >= (int)s_vLines.size()) - return vec2(0, 0); - CTextCursor LocalCursor; - TextRender()->SetCursor(&LocalCursor, x, y, RealFontSize, Render ? TEXTFLAG_RENDER : 0); - LocalCursor.m_LineWidth = LineWidth; - const auto &Line = s_vLines[LineIndex]; - - char aClientId[16] = ""; - if(g_Config.m_ClShowIds && Line.m_ClientId >= 0 && Line.m_aName[0] != '\0') - { - GameClient()->FormatClientId(Line.m_ClientId, aClientId, EClientIdFormat::INDENT_FORCE); - } - - char aCount[12]; - if(Line.m_ClientId < 0) - str_format(aCount, sizeof(aCount), "[%d] ", Line.m_TimesRepeated + 1); - else - str_format(aCount, sizeof(aCount), " [%d]", Line.m_TimesRepeated + 1); - - if(Line.m_Player) - { - LocalCursor.m_X += RealMsgPaddingTee; - - if(Line.m_Friend && g_Config.m_ClMessageFriend) - { - if(Render) - TextRender()->TextColor(FriendColor); - TextRender()->TextEx(&LocalCursor, "♥ ", -1); - } - } - - ColorRGBA NameColor; - if(Line.m_Team) - NameColor = CalculateNameColor(color_cast(TeamColor)); - else if(Line.m_Player) - NameColor = DefaultNameColor; - else if(Line.m_Client) - NameColor = ClientColor; - else - NameColor = SystemColor; - - if(Render) - TextRender()->TextColor(NameColor); - - TextRender()->TextEx(&LocalCursor, aClientId); - TextRender()->TextEx(&LocalCursor, Line.m_aName); - - if(Line.m_TimesRepeated > 0) - { - if(Render) - TextRender()->TextColor(1.0f, 1.0f, 1.0f, 0.3f); - TextRender()->TextEx(&LocalCursor, aCount, -1); - } - - if(Line.m_ClientId >= 0 && Line.m_aName[0] != '\0') - { - if(Render) - TextRender()->TextColor(NameColor); - TextRender()->TextEx(&LocalCursor, ": ", -1); - } - - CTextCursor AppendCursor = LocalCursor; - AppendCursor.m_LongestLineWidth = 0.0f; - if(!g_Config.m_ClChatOld) - { - AppendCursor.m_StartX = LocalCursor.m_X; - AppendCursor.m_LineWidth -= LocalCursor.m_LongestLineWidth; - } - - if(Render) - { - if(Line.m_Highlighted) - TextRender()->TextColor(HighlightedColor); - else if(Line.m_Team) - TextRender()->TextColor(TeamColor); - else if(Line.m_Player) - TextRender()->TextColor(NormalColor); - } - - TextRender()->TextEx(&AppendCursor, Line.m_aText, -1); - if(Render) - TextRender()->TextColor(TextRender()->DefaultTextColor()); - - return vec2{LocalCursor.m_LongestLineWidth + AppendCursor.m_LongestLineWidth, AppendCursor.Height() + RealMsgPaddingY}; - }; - - // Set preview lines - { - char aLineBuilder[128]; - - str_format(aLineBuilder, sizeof(aLineBuilder), "'%s' entered and joined the game", aBuf); - SetPreviewLine(PREVIEW_SYS, -1, "*** ", aLineBuilder, 0, 0); - - str_format(aLineBuilder, sizeof(aLineBuilder), "Hey, how are you %s?", aBuf); - SetPreviewLine(PREVIEW_HIGHLIGHT, 7, "Random Tee", aLineBuilder, FLAG_HIGHLIGHT, 0); - - SetPreviewLine(PREVIEW_TEAM, 11, "Your Teammate", "Let's speedrun this!", FLAG_TEAM, 0); - SetPreviewLine(PREVIEW_FRIEND, 8, "Friend", "Hello there", FLAG_FRIEND, 0); - SetPreviewLine(PREVIEW_SPAMMER, 9, "Spammer", "Hey fools, I'm spamming here!", 0, 5); - SetPreviewLine(PREVIEW_CLIENT, -1, "— ", "Echo command executed", FLAG_CLIENT, 0); - } - - SetLineSkin(1, GameClient()->m_Skins.Find("pinky")); - SetLineSkin(2, GameClient()->m_Skins.Find("default")); - SetLineSkin(3, GameClient()->m_Skins.Find("cammostripes")); - SetLineSkin(4, GameClient()->m_Skins.Find("beast")); - - // Backgrounds first - if(!g_Config.m_ClChatOld) - { - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - Graphics()->SetColor(0, 0, 0, 0.12f); - - float TempY = Y; - const float RealBackgroundRounding = Chat.MessageRounding() * 2.0f; - - auto &&RenderMessageBackground = [&](int LineIndex) { - auto Size = RenderPreview(LineIndex, 0, 0, false); - Graphics()->DrawRectExt(X - RealMsgPaddingX / 2.0f, TempY - RealMsgPaddingY / 2.0f, Size.x + RealMsgPaddingX * 1.5f, Size.y, RealBackgroundRounding, IGraphics::CORNER_ALL); - return Size.y; - }; - - if(g_Config.m_ClShowChatSystem) - { - TempY += RenderMessageBackground(PREVIEW_SYS); - } - - if(!g_Config.m_ClShowChatFriends) - { - if(!g_Config.m_ClShowChatTeamMembersOnly) - TempY += RenderMessageBackground(PREVIEW_HIGHLIGHT); - TempY += RenderMessageBackground(PREVIEW_TEAM); - } - - if(!g_Config.m_ClShowChatTeamMembersOnly) - TempY += RenderMessageBackground(PREVIEW_FRIEND); - - if(!g_Config.m_ClShowChatFriends && !g_Config.m_ClShowChatTeamMembersOnly) - { - TempY += RenderMessageBackground(PREVIEW_SPAMMER); - } - - TempY += RenderMessageBackground(PREVIEW_CLIENT); - - Graphics()->QuadsEnd(); - } - - // System - if(g_Config.m_ClShowChatSystem) - { - Y += RenderPreview(PREVIEW_SYS, X, Y).y; - } - - if(!g_Config.m_ClShowChatFriends) - { - // Highlighted - if(!g_Config.m_ClChatOld && !g_Config.m_ClShowChatTeamMembersOnly) - RenderTools()->RenderTee(pIdleState, &s_vLines[PREVIEW_HIGHLIGHT].m_RenderInfo, EMOTE_NORMAL, vec2(1, 0.1f), vec2(X + RealTeeSizeHalved, Y + OffsetTeeY + FullHeightMinusTee / 2.0f + TWSkinUnreliableOffset)); - if(!g_Config.m_ClShowChatTeamMembersOnly) - Y += RenderPreview(PREVIEW_HIGHLIGHT, X, Y).y; - - // Team - if(!g_Config.m_ClChatOld) - RenderTools()->RenderTee(pIdleState, &s_vLines[PREVIEW_TEAM].m_RenderInfo, EMOTE_NORMAL, vec2(1, 0.1f), vec2(X + RealTeeSizeHalved, Y + OffsetTeeY + FullHeightMinusTee / 2.0f + TWSkinUnreliableOffset)); - Y += RenderPreview(PREVIEW_TEAM, X, Y).y; - } - - // Friend - if(!g_Config.m_ClChatOld && !g_Config.m_ClShowChatTeamMembersOnly) - RenderTools()->RenderTee(pIdleState, &s_vLines[PREVIEW_FRIEND].m_RenderInfo, EMOTE_NORMAL, vec2(1, 0.1f), vec2(X + RealTeeSizeHalved, Y + OffsetTeeY + FullHeightMinusTee / 2.0f + TWSkinUnreliableOffset)); - if(!g_Config.m_ClShowChatTeamMembersOnly) - Y += RenderPreview(PREVIEW_FRIEND, X, Y).y; - - // Normal - if(!g_Config.m_ClShowChatFriends && !g_Config.m_ClShowChatTeamMembersOnly) - { - if(!g_Config.m_ClChatOld) - RenderTools()->RenderTee(pIdleState, &s_vLines[PREVIEW_SPAMMER].m_RenderInfo, EMOTE_NORMAL, vec2(1, 0.1f), vec2(X + RealTeeSizeHalved, Y + OffsetTeeY + FullHeightMinusTee / 2.0f + TWSkinUnreliableOffset)); - Y += RenderPreview(PREVIEW_SPAMMER, X, Y).y; - } - // Client - RenderPreview(PREVIEW_CLIENT, X, Y); - - TextRender()->TextColor(TextRender()->DefaultTextColor()); - } - else if(s_CurTab == APPEARANCE_TAB_NAME_PLATE) - { - MainView.VSplitMid(&LeftView, &RightView, MarginBetweenViews); - - // ***** Name Plate ***** // - LeftView.HSplitTop(HeadlineHeight, &Label, &LeftView); - Ui()->DoLabel(&Label, Localize("Name Plate"), HeadlineFontSize, TEXTALIGN_ML); - LeftView.HSplitTop(MarginSmall, nullptr, &LeftView); - - // General name plate settings - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClNamePlates, Localize("Show name plates"), &g_Config.m_ClNamePlates, &LeftView, LineSize); - LeftView.HSplitTop(2 * LineSize, &Button, &LeftView); - Ui()->DoScrollbarOption(&g_Config.m_ClNamePlatesSize, &g_Config.m_ClNamePlatesSize, &Button, Localize("Name plates size"), -50, 100, &CUi::ms_LinearScrollbarScale, CUi::SCROLLBAR_OPTION_MULTILINE); - - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClNamePlatesClan, Localize("Show clan above name plates"), &g_Config.m_ClNamePlatesClan, &LeftView, LineSize); - LeftView.HSplitTop(2 * LineSize, &Button, &LeftView); - if(g_Config.m_ClNamePlatesClan) - { - Ui()->DoScrollbarOption(&g_Config.m_ClNamePlatesClanSize, &g_Config.m_ClNamePlatesClanSize, &Button, Localize("Clan plates size"), -50, 100, &CUi::ms_LinearScrollbarScale, CUi::SCROLLBAR_OPTION_MULTILINE); - } - - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClNamePlatesTeamcolors, Localize("Use team colors for name plates"), &g_Config.m_ClNamePlatesTeamcolors, &LeftView, LineSize); - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClNamePlatesFriendMark, Localize("Show friend mark (♥) in name plates"), &g_Config.m_ClNamePlatesFriendMark, &LeftView, LineSize); - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClNamePlatesIds, Localize("Show client IDs in name plates"), &g_Config.m_ClNamePlatesIds, &LeftView, LineSize); - - // ***** Hook Strength ***** // - LeftView.HSplitTop(MarginBetweenViews, nullptr, &LeftView); - LeftView.HSplitTop(HeadlineHeight, &Label, &LeftView); - Ui()->DoLabel(&Label, Localize("Hook Strength"), HeadlineFontSize, TEXTALIGN_ML); - LeftView.HSplitTop(MarginSmall, nullptr, &LeftView); - - LeftView.HSplitTop(LineSize, &Button, &LeftView); - if(DoButton_CheckBox(&g_Config.m_ClNamePlatesStrong, Localize("Show hook strength icon indicator"), g_Config.m_ClNamePlatesStrong, &Button)) - { - g_Config.m_ClNamePlatesStrong = g_Config.m_ClNamePlatesStrong ? 0 : 1; - } - LeftView.HSplitTop(LineSize, &Button, &LeftView); - if(g_Config.m_ClNamePlatesStrong) - { - static int s_NamePlatesStrong = 0; - if(DoButton_CheckBox(&s_NamePlatesStrong, Localize("Show hook strength number indicator"), g_Config.m_ClNamePlatesStrong == 2, &Button)) - g_Config.m_ClNamePlatesStrong = g_Config.m_ClNamePlatesStrong != 2 ? 2 : 1; - } - - LeftView.HSplitTop(2 * LineSize, &Button, &LeftView); - if(g_Config.m_ClNamePlatesStrong) - { - Ui()->DoScrollbarOption(&g_Config.m_ClNamePlatesStrongSize, &g_Config.m_ClNamePlatesStrongSize, &Button, Localize("Size of hook strength icon and number indicator"), -50, 100, &CUi::ms_LinearScrollbarScale, CUi::SCROLLBAR_OPTION_MULTILINE); - } - - // ***** Key Presses ***** // - LeftView.HSplitTop(MarginBetweenViews, nullptr, &LeftView); - LeftView.HSplitTop(HeadlineHeight, &Label, &LeftView); - Ui()->DoLabel(&Label, Localize("Key Presses"), HeadlineFontSize, TEXTALIGN_ML); - LeftView.HSplitTop(MarginSmall, nullptr, &LeftView); - - LeftView.HSplitTop(LineSize, &Button, &LeftView); - if(DoButton_CheckBox(&g_Config.m_ClShowDirection, Localize("Show other players' key presses"), g_Config.m_ClShowDirection >= 1 && g_Config.m_ClShowDirection != 3, &Button)) - { - g_Config.m_ClShowDirection = g_Config.m_ClShowDirection ^ 1; - } - - LeftView.HSplitTop(LineSize, &Button, &LeftView); - static int s_ShowLocalPlayer = 0; - if(DoButton_CheckBox(&s_ShowLocalPlayer, Localize("Show local player's key presses"), g_Config.m_ClShowDirection >= 2, &Button)) - { - g_Config.m_ClShowDirection = g_Config.m_ClShowDirection ^ 3; - } - - LeftView.HSplitTop(2 * LineSize, &Button, &LeftView); - if(g_Config.m_ClShowDirection > 0) - { - Ui()->DoScrollbarOption(&g_Config.m_ClDirectionSize, &g_Config.m_ClDirectionSize, &Button, Localize("Size of key press icons"), -50, 100, &CUi::ms_LinearScrollbarScale, CUi::SCROLLBAR_OPTION_MULTILINE); - } - - // ***** Name Plate Preview ***** // - RightView.HSplitTop(HeadlineHeight, &Label, &RightView); - Ui()->DoLabel(&Label, Localize("Preview"), HeadlineFontSize, TEXTALIGN_ML); - RightView.HSplitTop(2.0f * MarginSmall, nullptr, &RightView); - - CTeeRenderInfo TeeRenderInfo; - TeeRenderInfo.Apply(m_pClient->m_Skins.Find(g_Config.m_ClPlayerSkin)); - TeeRenderInfo.ApplyColors(g_Config.m_ClPlayerUseCustomColor, g_Config.m_ClPlayerColorBody, g_Config.m_ClPlayerColorFeet); - TeeRenderInfo.m_Size = 64.0f; - - const vec2 Position = RightView.Center(); - RenderTools()->RenderTee(CAnimState::GetIdle(), &TeeRenderInfo, 0, vec2(1.0f, 0.0f), Position); - - GameClient()->m_NamePlates.RenderNamePlatePreview(Position); - } - else if(s_CurTab == APPEARANCE_TAB_HOOK_COLLISION) - { - MainView.VSplitMid(&LeftView, &RightView, MarginBetweenViews); - - // ***** Hookline ***** // - LeftView.HSplitTop(HeadlineHeight, &Label, &LeftView); - Ui()->DoLabel(&Label, Localize("Hook collision line"), HeadlineFontSize, TEXTALIGN_ML); - LeftView.HSplitTop(MarginSmall, nullptr, &LeftView); - - // General hookline settings - LeftView.HSplitTop(LineSize, &Button, &LeftView); - if(DoButton_CheckBox(&g_Config.m_ClShowHookCollOwn, Localize("Show own player's hook collision line"), g_Config.m_ClShowHookCollOwn, &Button)) - { - g_Config.m_ClShowHookCollOwn = g_Config.m_ClShowHookCollOwn ? 0 : 1; - } - LeftView.HSplitTop(LineSize, &Button, &LeftView); - if(g_Config.m_ClShowHookCollOwn) - { - static int s_ShowHookCollOwn = 0; - if(DoButton_CheckBox(&s_ShowHookCollOwn, Localize("Always show own player's hook collision line"), g_Config.m_ClShowHookCollOwn == 2, &Button)) - g_Config.m_ClShowHookCollOwn = g_Config.m_ClShowHookCollOwn != 2 ? 2 : 1; - } - - LeftView.HSplitTop(LineSize, &Button, &LeftView); - if(DoButton_CheckBox(&g_Config.m_ClShowHookCollOther, Localize("Show other players' hook collision lines"), g_Config.m_ClShowHookCollOther, &Button)) - { - g_Config.m_ClShowHookCollOther = g_Config.m_ClShowHookCollOther >= 1 ? 0 : 1; - } - LeftView.HSplitTop(LineSize, &Button, &LeftView); - if(g_Config.m_ClShowHookCollOther) - { - static int s_ShowHookCollOther = 0; - if(DoButton_CheckBox(&s_ShowHookCollOther, Localize("Always show other players' hook collision lines"), g_Config.m_ClShowHookCollOther == 2, &Button)) - g_Config.m_ClShowHookCollOther = g_Config.m_ClShowHookCollOther != 2 ? 2 : 1; - } - - LeftView.HSplitTop(2 * LineSize, &Button, &LeftView); - Ui()->DoScrollbarOption(&g_Config.m_ClHookCollSize, &g_Config.m_ClHookCollSize, &Button, Localize("Width of your own hook collision line"), 0, 20, &CUi::ms_LinearScrollbarScale, CUi::SCROLLBAR_OPTION_MULTILINE); - - LeftView.HSplitTop(2 * LineSize, &Button, &LeftView); - Ui()->DoScrollbarOption(&g_Config.m_ClHookCollSizeOther, &g_Config.m_ClHookCollSizeOther, &Button, Localize("Width of others' hook collision line"), 0, 20, &CUi::ms_LinearScrollbarScale, CUi::SCROLLBAR_OPTION_MULTILINE); - - LeftView.HSplitTop(2 * LineSize, &Button, &LeftView); - Ui()->DoScrollbarOption(&g_Config.m_ClHookCollAlpha, &g_Config.m_ClHookCollAlpha, &Button, Localize("Hook collision line opacity"), 0, 100, &CUi::ms_LinearScrollbarScale, CUi::SCROLLBAR_OPTION_MULTILINE, "%"); - - static CButtonContainer s_HookCollNoCollResetId, s_HookCollHookableCollResetId, s_HookCollTeeCollResetId; - static int s_HookCollToolTip; - - LeftView.HSplitTop(LineSize, &Label, &LeftView); - LeftView.HSplitTop(MarginSmall, nullptr, &LeftView); - Ui()->DoLabel(&Label, Localize("Colors of the hook collision line, in case of a possible collision with:"), 13.0f, TEXTALIGN_ML); - Ui()->DoButtonLogic(&s_HookCollToolTip, 0, &Label); // Just for the tooltip, result ignored - GameClient()->m_Tooltips.DoToolTip(&s_HookCollToolTip, &Label, Localize("Your movements are not taken into account when calculating the line colors")); - DoLine_ColorPicker(&s_HookCollNoCollResetId, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &LeftView, Localize("Nothing hookable"), &g_Config.m_ClHookCollColorNoColl, ColorRGBA(1.0f, 0.0f, 0.0f, 1.0f), false); - DoLine_ColorPicker(&s_HookCollHookableCollResetId, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &LeftView, Localize("Something hookable"), &g_Config.m_ClHookCollColorHookableColl, ColorRGBA(130.0f / 255.0f, 232.0f / 255.0f, 160.0f / 255.0f, 1.0f), false); - DoLine_ColorPicker(&s_HookCollTeeCollResetId, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &LeftView, Localize("A Tee"), &g_Config.m_ClHookCollColorTeeColl, ColorRGBA(1.0f, 1.0f, 0.0f, 1.0f), false); - - // ***** Hook collisions preview ***** // - RightView.HSplitTop(HeadlineHeight, &Label, &RightView); - Ui()->DoLabel(&Label, Localize("Preview"), HeadlineFontSize, TEXTALIGN_ML); - RightView.HSplitTop(2 * MarginSmall, nullptr, &RightView); - - auto DoHookCollision = [this](const vec2 &Pos, const float &Length, const int &Size, const ColorRGBA &Color, const bool &Invert) { - ColorRGBA ColorModified = Color; - if(Invert) - ColorModified = color_invert(ColorModified); - ColorModified = ColorModified.WithAlpha((float)g_Config.m_ClHookCollAlpha / 100); - Graphics()->TextureClear(); - if(Size > 0) - { - Graphics()->QuadsBegin(); - Graphics()->SetColor(ColorModified); - float LineWidth = 0.5f + (float)(Size - 1) * 0.25f; - IGraphics::CQuadItem QuadItem(Pos.x, Pos.y - LineWidth, Length, LineWidth * 2.f); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); - } - else - { - Graphics()->LinesBegin(); - Graphics()->SetColor(ColorModified); - IGraphics::CLineItem LineItem(Pos.x, Pos.y, Pos.x + Length, Pos.y); - Graphics()->LinesDraw(&LineItem, 1); - Graphics()->LinesEnd(); - } - }; - - CTeeRenderInfo OwnSkinInfo; - OwnSkinInfo.Apply(m_pClient->m_Skins.Find(g_Config.m_ClPlayerSkin)); - OwnSkinInfo.ApplyColors(g_Config.m_ClPlayerUseCustomColor, g_Config.m_ClPlayerColorBody, g_Config.m_ClPlayerColorFeet); - OwnSkinInfo.m_Size = 50.0f; - - CTeeRenderInfo DummySkinInfo; - DummySkinInfo.Apply(m_pClient->m_Skins.Find(g_Config.m_ClDummySkin)); - DummySkinInfo.ApplyColors(g_Config.m_ClDummyUseCustomColor, g_Config.m_ClDummyColorBody, g_Config.m_ClDummyColorFeet); - DummySkinInfo.m_Size = 50.0f; - - vec2 TeeRenderPos, DummyRenderPos; - - const float LineLength = 150.f; - const float LeftMargin = 30.f; - - const int TileScale = 32.0f; - - // Toggled via checkbox later, inverts some previews - static bool s_HookCollPressed = false; - - CUIRect PreviewColl; - - // ***** Unhookable Tile Preview ***** - CUIRect PreviewNoColl; - RightView.HSplitTop(50.0f, &PreviewNoColl, &RightView); - RightView.HSplitTop(4 * MarginSmall, nullptr, &RightView); - TeeRenderPos = vec2(PreviewNoColl.x + LeftMargin, PreviewNoColl.y + PreviewNoColl.h / 2.0f); - DoHookCollision(TeeRenderPos, PreviewNoColl.w - LineLength, g_Config.m_ClHookCollSize, color_cast(ColorHSLA(g_Config.m_ClHookCollColorNoColl)), s_HookCollPressed); - RenderTools()->RenderTee(CAnimState::GetIdle(), &OwnSkinInfo, 0, vec2(1.0f, 0.0f), TeeRenderPos); - - CUIRect NoHookTileRect; - PreviewNoColl.VSplitRight(LineLength, &PreviewNoColl, &NoHookTileRect); - NoHookTileRect.VSplitLeft(50.0f, &NoHookTileRect, nullptr); - NoHookTileRect.Margin(10.0f, &NoHookTileRect); - - // Render unhookable tile - Graphics()->TextureClear(); - Graphics()->TextureSet(m_pClient->m_MapImages.GetEntities(MAP_IMAGE_ENTITY_LAYER_TYPE_ALL_EXCEPT_SWITCH)); - Graphics()->BlendNormal(); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - RenderTools()->RenderTile(NoHookTileRect.x, NoHookTileRect.y, TILE_NOHOOK, TileScale, ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f)); - - // ***** Hookable Tile Preview ***** - RightView.HSplitTop(50.0f, &PreviewColl, &RightView); - RightView.HSplitTop(4 * MarginSmall, nullptr, &RightView); - TeeRenderPos = vec2(PreviewColl.x + LeftMargin, PreviewColl.y + PreviewColl.h / 2.0f); - DoHookCollision(TeeRenderPos, PreviewColl.w - LineLength, g_Config.m_ClHookCollSize, color_cast(ColorHSLA(g_Config.m_ClHookCollColorHookableColl)), s_HookCollPressed); - RenderTools()->RenderTee(CAnimState::GetIdle(), &OwnSkinInfo, 0, vec2(1.0f, 0.0f), TeeRenderPos); - - CUIRect HookTileRect; - PreviewColl.VSplitRight(LineLength, &PreviewColl, &HookTileRect); - HookTileRect.VSplitLeft(50.0f, &HookTileRect, nullptr); - HookTileRect.Margin(10.0f, &HookTileRect); - - // Render hookable tile - Graphics()->TextureClear(); - Graphics()->TextureSet(m_pClient->m_MapImages.GetEntities(MAP_IMAGE_ENTITY_LAYER_TYPE_ALL_EXCEPT_SWITCH)); - Graphics()->BlendNormal(); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - RenderTools()->RenderTile(HookTileRect.x, HookTileRect.y, TILE_SOLID, TileScale, ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f)); - - // ***** Hook Dummy Preivew ***** - RightView.HSplitTop(50.0f, &PreviewColl, &RightView); - RightView.HSplitTop(4 * MarginSmall, nullptr, &RightView); - TeeRenderPos = vec2(PreviewColl.x + LeftMargin, PreviewColl.y + PreviewColl.h / 2.0f); - DummyRenderPos = vec2(PreviewColl.x + PreviewColl.w - LineLength - 5.f + LeftMargin, PreviewColl.y + PreviewColl.h / 2.0f); - DoHookCollision(TeeRenderPos, PreviewColl.w - LineLength - 15.f, g_Config.m_ClHookCollSize, color_cast(ColorHSLA(g_Config.m_ClHookCollColorTeeColl)), s_HookCollPressed); - RenderTools()->RenderTee(CAnimState::GetIdle(), &DummySkinInfo, 0, vec2(1.0f, 0.0f), DummyRenderPos); - RenderTools()->RenderTee(CAnimState::GetIdle(), &OwnSkinInfo, 0, vec2(1.0f, 0.0f), TeeRenderPos); - - // ***** Hook Dummy Reverse Preivew ***** - RightView.HSplitTop(50.0f, &PreviewColl, &RightView); - RightView.HSplitTop(4 * MarginSmall, nullptr, &RightView); - TeeRenderPos = vec2(PreviewColl.x + LeftMargin, PreviewColl.y + PreviewColl.h / 2.0f); - DummyRenderPos = vec2(PreviewColl.x + PreviewColl.w - LineLength - 5.f + LeftMargin, PreviewColl.y + PreviewColl.h / 2.0f); - DoHookCollision(TeeRenderPos, PreviewColl.w - LineLength - 15.f, g_Config.m_ClHookCollSizeOther, color_cast(ColorHSLA(g_Config.m_ClHookCollColorTeeColl)), false); - RenderTools()->RenderTee(CAnimState::GetIdle(), &OwnSkinInfo, 0, vec2(1.0f, 0.0f), DummyRenderPos); - RenderTools()->RenderTee(CAnimState::GetIdle(), &DummySkinInfo, 0, vec2(1.0f, 0.0f), TeeRenderPos); - - // ***** Preview +hookcoll pressed toggle ***** - RightView.HSplitTop(LineSize, &Button, &RightView); - if(DoButton_CheckBox(&s_HookCollPressed, Localize("Preview 'Hook collisions' being pressed"), s_HookCollPressed, &Button)) - s_HookCollPressed = !s_HookCollPressed; - } - else if(s_CurTab == APPEARANCE_TAB_INFO_MESSAGES) - { - MainView.VSplitMid(&LeftView, &RightView, MarginBetweenViews); - - // ***** Info Messages ***** // - LeftView.HSplitTop(HeadlineHeight, &Label, &LeftView); - Ui()->DoLabel(&Label, Localize("Info Messages"), HeadlineFontSize, TEXTALIGN_ML); - LeftView.HSplitTop(MarginSmall, nullptr, &LeftView); - - // General info messages settings - LeftView.HSplitTop(LineSize, &Button, &LeftView); - if(DoButton_CheckBox(&g_Config.m_ClShowKillMessages, Localize("Show kill messages"), g_Config.m_ClShowKillMessages, &Button)) - { - g_Config.m_ClShowKillMessages ^= 1; - } - - LeftView.HSplitTop(LineSize, &Button, &LeftView); - if(DoButton_CheckBox(&g_Config.m_ClShowFinishMessages, Localize("Show finish messages"), g_Config.m_ClShowFinishMessages, &Button)) - { - g_Config.m_ClShowFinishMessages ^= 1; - } - - static CButtonContainer s_KillMessageNormalColorId, s_KillMessageHighlightColorId; - DoLine_ColorPicker(&s_KillMessageNormalColorId, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &LeftView, Localize("Normal Color"), &g_Config.m_ClKillMessageNormalColor, ColorRGBA(1.0f, 1.0f, 1.0f), false); - DoLine_ColorPicker(&s_KillMessageHighlightColorId, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &LeftView, Localize("Highlight Color"), &g_Config.m_ClKillMessageHighlightColor, ColorRGBA(1.0f, 1.0f, 1.0f), false); - } - else if(s_CurTab == APPEARANCE_TAB_LASER) - { - MainView.VSplitMid(&LeftView, &RightView, MarginBetweenViews); - - // ***** Weapons ***** // - LeftView.HSplitTop(HeadlineHeight, &Label, &LeftView); - Ui()->DoLabel(&Label, Localize("Weapons"), HeadlineFontSize, TEXTALIGN_ML); - LeftView.HSplitTop(MarginSmall, nullptr, &LeftView); - - // General weapon laser settings - static CButtonContainer s_LaserRifleOutResetId, s_LaserRifleInResetId, s_LaserShotgunOutResetId, s_LaserShotgunInResetId; - - ColorHSLA LaserRifleOutlineColor = DoLine_ColorPicker(&s_LaserRifleOutResetId, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &LeftView, Localize("Rifle Laser Outline Color"), &g_Config.m_ClLaserRifleOutlineColor, ColorRGBA(0.074402f, 0.074402f, 0.247166f, 1.0f), false); - ColorHSLA LaserRifleInnerColor = DoLine_ColorPicker(&s_LaserRifleInResetId, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &LeftView, Localize("Rifle Laser Inner Color"), &g_Config.m_ClLaserRifleInnerColor, ColorRGBA(0.498039f, 0.498039f, 1.0f, 1.0f), false); - ColorHSLA LaserShotgunOutlineColor = DoLine_ColorPicker(&s_LaserShotgunOutResetId, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &LeftView, Localize("Shotgun Laser Outline Color"), &g_Config.m_ClLaserShotgunOutlineColor, ColorRGBA(0.125490f, 0.098039f, 0.043137f, 1.0f), false); - ColorHSLA LaserShotgunInnerColor = DoLine_ColorPicker(&s_LaserShotgunInResetId, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &LeftView, Localize("Shotgun Laser Inner Color"), &g_Config.m_ClLaserShotgunInnerColor, ColorRGBA(0.570588f, 0.417647f, 0.252941f, 1.0f), false); - - // ***** Entities ***** // - LeftView.HSplitTop(10.0f, nullptr, &LeftView); - LeftView.HSplitTop(HeadlineHeight, &Label, &LeftView); - Ui()->DoLabel(&Label, Localize("Entities"), HeadlineFontSize, TEXTALIGN_ML); - LeftView.HSplitTop(MarginSmall, nullptr, &LeftView); - - // General entity laser settings - static CButtonContainer s_LaserDoorOutResetId, s_LaserDoorInResetId, s_LaserFreezeOutResetId, s_LaserFreezeInResetId; - - ColorHSLA LaserDoorOutlineColor = DoLine_ColorPicker(&s_LaserDoorOutResetId, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &LeftView, Localize("Door Laser Outline Color"), &g_Config.m_ClLaserDoorOutlineColor, ColorRGBA(0.0f, 0.131372f, 0.096078f, 1.0f), false); - ColorHSLA LaserDoorInnerColor = DoLine_ColorPicker(&s_LaserDoorInResetId, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &LeftView, Localize("Door Laser Inner Color"), &g_Config.m_ClLaserDoorInnerColor, ColorRGBA(0.262745f, 0.760784f, 0.639215f, 1.0f), false); - ColorHSLA LaserFreezeOutlineColor = DoLine_ColorPicker(&s_LaserFreezeOutResetId, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &LeftView, Localize("Freeze Laser Outline Color"), &g_Config.m_ClLaserFreezeOutlineColor, ColorRGBA(0.131372f, 0.123529f, 0.182352f, 1.0f), false); - ColorHSLA LaserFreezeInnerColor = DoLine_ColorPicker(&s_LaserFreezeInResetId, ColorPickerLineSize, ColorPickerLabelSize, ColorPickerLineSpacing, &LeftView, Localize("Freeze Laser Inner Color"), &g_Config.m_ClLaserFreezeInnerColor, ColorRGBA(0.482352f, 0.443137f, 0.564705f, 1.0f), false); - - static CButtonContainer s_AllToRifleResetId, s_AllToDefaultResetId; - - LeftView.HSplitTop(4 * MarginSmall, nullptr, &LeftView); - LeftView.HSplitTop(LineSize, &Button, &LeftView); - if(DoButton_Menu(&s_AllToRifleResetId, Localize("Set all to Rifle"), 0, &Button)) - { - g_Config.m_ClLaserShotgunOutlineColor = g_Config.m_ClLaserRifleOutlineColor; - g_Config.m_ClLaserShotgunInnerColor = g_Config.m_ClLaserRifleInnerColor; - g_Config.m_ClLaserDoorOutlineColor = g_Config.m_ClLaserRifleOutlineColor; - g_Config.m_ClLaserDoorInnerColor = g_Config.m_ClLaserRifleInnerColor; - g_Config.m_ClLaserFreezeOutlineColor = g_Config.m_ClLaserRifleOutlineColor; - g_Config.m_ClLaserFreezeInnerColor = g_Config.m_ClLaserRifleInnerColor; - } - - // values taken from the CL commands - LeftView.HSplitTop(2 * MarginSmall, nullptr, &LeftView); - LeftView.HSplitTop(LineSize, &Button, &LeftView); - if(DoButton_Menu(&s_AllToDefaultResetId, Localize("Reset to defaults"), 0, &Button)) - { - g_Config.m_ClLaserRifleOutlineColor = 11176233; - g_Config.m_ClLaserRifleInnerColor = 11206591; - g_Config.m_ClLaserShotgunOutlineColor = 1866773; - g_Config.m_ClLaserShotgunInnerColor = 1467241; - g_Config.m_ClLaserDoorOutlineColor = 7667473; - g_Config.m_ClLaserDoorInnerColor = 7701379; - g_Config.m_ClLaserFreezeOutlineColor = 11613223; - g_Config.m_ClLaserFreezeInnerColor = 12001153; - } - - // ***** Laser Preview ***** // - RightView.HSplitTop(HeadlineHeight, &Label, &RightView); - Ui()->DoLabel(&Label, Localize("Preview"), HeadlineFontSize, TEXTALIGN_ML); - RightView.HSplitTop(MarginSmall, nullptr, &RightView); - - const float LaserPreviewHeight = 50.0f; - CUIRect LaserPreview; - RightView.HSplitTop(LaserPreviewHeight, &LaserPreview, &RightView); - RightView.HSplitTop(2 * MarginSmall, nullptr, &RightView); - DoLaserPreview(&LaserPreview, LaserRifleOutlineColor, LaserRifleInnerColor, LASERTYPE_RIFLE); - - RightView.HSplitTop(LaserPreviewHeight, &LaserPreview, &RightView); - RightView.HSplitTop(2 * MarginSmall, nullptr, &RightView); - DoLaserPreview(&LaserPreview, LaserShotgunOutlineColor, LaserShotgunInnerColor, LASERTYPE_SHOTGUN); - - RightView.HSplitTop(LaserPreviewHeight, &LaserPreview, &RightView); - RightView.HSplitTop(2 * MarginSmall, nullptr, &RightView); - DoLaserPreview(&LaserPreview, LaserDoorOutlineColor, LaserDoorInnerColor, LASERTYPE_DOOR); - - RightView.HSplitTop(LaserPreviewHeight, &LaserPreview, &RightView); - RightView.HSplitTop(2 * MarginSmall, nullptr, &RightView); - DoLaserPreview(&LaserPreview, LaserFreezeOutlineColor, LaserFreezeInnerColor, LASERTYPE_DOOR); - } -} - -void CMenus::RenderSettingsDDNet(CUIRect MainView) -{ - CUIRect Button, Left, Right, LeftLeft, Label; - -#if defined(CONF_AUTOUPDATE) - CUIRect UpdaterRect; - MainView.HSplitBottom(20.0f, &MainView, &UpdaterRect); - MainView.HSplitBottom(5.0f, &MainView, nullptr); -#endif - - // demo - CUIRect Demo; - MainView.HSplitTop(110.0f, &Demo, &MainView); - Demo.HSplitTop(30.0f, &Label, &Demo); - Ui()->DoLabel(&Label, Localize("Demo"), 20.0f, TEXTALIGN_ML); - Label.VSplitMid(nullptr, &Label, 20.0f); - Ui()->DoLabel(&Label, Localize("Ghost"), 20.0f, TEXTALIGN_ML); - - Demo.HSplitTop(5.0f, nullptr, &Demo); - Demo.VSplitMid(&Left, &Right, 20.0f); - - Left.HSplitTop(20.0f, &Button, &Left); - if(DoButton_CheckBox(&g_Config.m_ClAutoRaceRecord, Localize("Save the best demo of each race"), g_Config.m_ClAutoRaceRecord, &Button)) - { - g_Config.m_ClAutoRaceRecord ^= 1; - } - - Left.HSplitTop(20.0f, &Button, &Left); - if(DoButton_CheckBox(&g_Config.m_ClReplays, Localize("Enable replays"), g_Config.m_ClReplays, &Button)) - { - g_Config.m_ClReplays ^= 1; - Client()->DemoRecorder_UpdateReplayRecorder(); - } - - Left.HSplitTop(20.0f, &Button, &Left); - if(g_Config.m_ClReplays) - Ui()->DoScrollbarOption(&g_Config.m_ClReplayLength, &g_Config.m_ClReplayLength, &Button, Localize("Default length"), 10, 600, &CUi::ms_LinearScrollbarScale, CUi::SCROLLBAR_OPTION_NOCLAMPVALUE); - - Right.HSplitTop(20.0f, &Button, &Right); - if(DoButton_CheckBox(&g_Config.m_ClRaceGhost, Localize("Enable ghost"), g_Config.m_ClRaceGhost, &Button)) - { - g_Config.m_ClRaceGhost ^= 1; - } - GameClient()->m_Tooltips.DoToolTip(&g_Config.m_ClRaceGhost, &Button, Localize("When you cross the start line, show a ghost tee replicating the movements of your best time")); - - if(g_Config.m_ClRaceGhost) - { - Right.HSplitTop(20.0f, &Button, &Right); - Button.VSplitMid(&LeftLeft, &Button); - if(DoButton_CheckBox(&g_Config.m_ClRaceShowGhost, Localize("Show ghost"), g_Config.m_ClRaceShowGhost, &LeftLeft)) - { - g_Config.m_ClRaceShowGhost ^= 1; - } - Ui()->DoScrollbarOption(&g_Config.m_ClRaceGhostAlpha, &g_Config.m_ClRaceGhostAlpha, &Button, Localize("Opacity"), 0, 100, &CUi::ms_LinearScrollbarScale, 0u, "%"); - - Right.HSplitTop(20.0f, &Button, &Right); - if(DoButton_CheckBox(&g_Config.m_ClRaceSaveGhost, Localize("Save ghost"), g_Config.m_ClRaceSaveGhost, &Button)) - { - g_Config.m_ClRaceSaveGhost ^= 1; - } - - if(g_Config.m_ClRaceSaveGhost) - { - Right.HSplitTop(20.0f, &Button, &Right); - if(DoButton_CheckBox(&g_Config.m_ClRaceGhostSaveBest, Localize("Only save improvements"), g_Config.m_ClRaceGhostSaveBest, &Button)) - { - g_Config.m_ClRaceGhostSaveBest ^= 1; - } - } - } - - // gameplay - CUIRect Gameplay; - MainView.HSplitTop(150.0f, &Gameplay, &MainView); - Gameplay.HSplitTop(30.0f, &Label, &Gameplay); - Ui()->DoLabel(&Label, Localize("Gameplay"), 20.0f, TEXTALIGN_ML); - Gameplay.HSplitTop(5.0f, nullptr, &Gameplay); - Gameplay.VSplitMid(&Left, &Right, 20.0f); - - Left.HSplitTop(20.0f, &Button, &Left); - Ui()->DoScrollbarOption(&g_Config.m_ClOverlayEntities, &g_Config.m_ClOverlayEntities, &Button, Localize("Overlay entities"), 0, 100); - - Left.HSplitTop(20.0f, &Button, &Left); - Button.VSplitMid(&LeftLeft, &Button); - - if(DoButton_CheckBox(&g_Config.m_ClTextEntities, Localize("Show text entities"), g_Config.m_ClTextEntities, &LeftLeft)) - g_Config.m_ClTextEntities ^= 1; - - if(g_Config.m_ClTextEntities) - { - if(Ui()->DoScrollbarOption(&g_Config.m_ClTextEntitiesSize, &g_Config.m_ClTextEntitiesSize, &Button, Localize("Size"), 0, 100)) - m_pClient->m_MapImages.SetTextureScale(g_Config.m_ClTextEntitiesSize); - } - - Left.HSplitTop(20.0f, &Button, &Left); - Button.VSplitMid(&LeftLeft, &Button); - - if(DoButton_CheckBox(&g_Config.m_ClShowOthers, Localize("Show others"), g_Config.m_ClShowOthers == SHOW_OTHERS_ON, &LeftLeft)) - g_Config.m_ClShowOthers = g_Config.m_ClShowOthers != SHOW_OTHERS_ON ? SHOW_OTHERS_ON : SHOW_OTHERS_OFF; - - Ui()->DoScrollbarOption(&g_Config.m_ClShowOthersAlpha, &g_Config.m_ClShowOthersAlpha, &Button, Localize("Opacity"), 0, 100, &CUi::ms_LinearScrollbarScale, 0u, "%"); - - GameClient()->m_Tooltips.DoToolTip(&g_Config.m_ClShowOthersAlpha, &Button, Localize("Adjust the opacity of entities belonging to other teams, such as tees and name plates")); - - Left.HSplitTop(20.0f, &Button, &Left); - static int s_ShowOwnTeamId = 0; - if(DoButton_CheckBox(&s_ShowOwnTeamId, Localize("Show others (own team only)"), g_Config.m_ClShowOthers == SHOW_OTHERS_ONLY_TEAM, &Button)) - { - g_Config.m_ClShowOthers = g_Config.m_ClShowOthers != SHOW_OTHERS_ONLY_TEAM ? SHOW_OTHERS_ONLY_TEAM : SHOW_OTHERS_OFF; - } - - Left.HSplitTop(20.0f, &Button, &Left); - if(DoButton_CheckBox(&g_Config.m_ClShowQuads, Localize("Show quads"), g_Config.m_ClShowQuads, &Button)) - { - g_Config.m_ClShowQuads ^= 1; - } - GameClient()->m_Tooltips.DoToolTip(&g_Config.m_ClShowQuads, &Button, Localize("Quads are used for background decoration")); - - Right.HSplitTop(20.0f, &Button, &Right); - if(Ui()->DoScrollbarOption(&g_Config.m_ClDefaultZoom, &g_Config.m_ClDefaultZoom, &Button, Localize("Default zoom"), 0, 20)) - m_pClient->m_Camera.SetZoom(CCamera::ZoomStepsToValue(g_Config.m_ClDefaultZoom - 10), g_Config.m_ClSmoothZoomTime, true); - - Right.HSplitTop(20.0f, &Button, &Right); - if(DoButton_CheckBox(&g_Config.m_ClAntiPing, Localize("AntiPing"), g_Config.m_ClAntiPing, &Button)) - { - g_Config.m_ClAntiPing ^= 1; - } - GameClient()->m_Tooltips.DoToolTip(&g_Config.m_ClAntiPing, &Button, Localize("Tries to predict other entities to give a feel of low latency")); - - if(g_Config.m_ClAntiPing) - { - Right.HSplitTop(20.0f, &Button, &Right); - if(DoButton_CheckBox(&g_Config.m_ClAntiPingPlayers, Localize("AntiPing: predict other players"), g_Config.m_ClAntiPingPlayers, &Button)) - { - g_Config.m_ClAntiPingPlayers ^= 1; - } - - Right.HSplitTop(20.0f, &Button, &Right); - if(DoButton_CheckBox(&g_Config.m_ClAntiPingWeapons, Localize("AntiPing: predict weapons"), g_Config.m_ClAntiPingWeapons, &Button)) - { - g_Config.m_ClAntiPingWeapons ^= 1; - } - - Right.HSplitTop(20.0f, &Button, &Right); - if(DoButton_CheckBox(&g_Config.m_ClAntiPingGrenade, Localize("AntiPing: predict grenade paths"), g_Config.m_ClAntiPingGrenade, &Button)) - { - g_Config.m_ClAntiPingGrenade ^= 1; - } - } - - CUIRect Background, Miscellaneous; - MainView.VSplitMid(&Background, &Miscellaneous, 20.0f); - - // background - Background.HSplitTop(30.0f, &Label, &Background); - Background.HSplitTop(5.0f, nullptr, &Background); - Ui()->DoLabel(&Label, Localize("Background"), 20.0f, TEXTALIGN_ML); - - ColorRGBA GreyDefault(0.5f, 0.5f, 0.5f, 1); - - static CButtonContainer s_ResetId1; - DoLine_ColorPicker(&s_ResetId1, 25.0f, 13.0f, 5.0f, &Background, Localize("Regular background color"), &g_Config.m_ClBackgroundColor, GreyDefault, false); - - static CButtonContainer s_ResetId2; - DoLine_ColorPicker(&s_ResetId2, 25.0f, 13.0f, 5.0f, &Background, Localize("Entities background color"), &g_Config.m_ClBackgroundEntitiesColor, GreyDefault, false); - - CUIRect EditBox, ReloadButton; - Background.HSplitTop(20.0f, &Label, &Background); - Background.HSplitTop(2.0f, nullptr, &Background); - Label.VSplitLeft(100.0f, &Label, &EditBox); - EditBox.VSplitRight(60.0f, &EditBox, &Button); - Button.VSplitMid(&ReloadButton, &Button, 5.0f); - EditBox.VSplitRight(5.0f, &EditBox, nullptr); - - Ui()->DoLabel(&Label, Localize("Map"), 14.0f, TEXTALIGN_ML); - - static CLineInput s_BackgroundEntitiesInput(g_Config.m_ClBackgroundEntities, sizeof(g_Config.m_ClBackgroundEntities)); - Ui()->DoEditBox(&s_BackgroundEntitiesInput, &EditBox, 14.0f); - - static CButtonContainer s_BackgroundEntitiesMapPicker, s_BackgroundEntitiesReload; - - if(DoButton_FontIcon(&s_BackgroundEntitiesReload, FONT_ICON_ARROW_ROTATE_RIGHT, 0, &ReloadButton)) - { - m_pClient->m_Background.LoadBackground(); - } - - if(DoButton_FontIcon(&s_BackgroundEntitiesMapPicker, FONT_ICON_FOLDER, 0, &Button)) - { - static SPopupMenuId s_PopupMapPickerId; - static CPopupMapPickerContext s_PopupMapPickerContext; - s_PopupMapPickerContext.m_pMenus = this; - s_PopupMapPickerContext.MapListPopulate(); - Ui()->DoPopupMenu(&s_PopupMapPickerId, Ui()->MouseX(), Ui()->MouseY(), 300.0f, 250.0f, &s_PopupMapPickerContext, PopupMapPicker); - } - - Background.HSplitTop(20.0f, &Button, &Background); - const bool UseCurrentMap = str_comp(g_Config.m_ClBackgroundEntities, CURRENT_MAP) == 0; - static int s_UseCurrentMapId = 0; - if(DoButton_CheckBox(&s_UseCurrentMapId, Localize("Use current map as background"), UseCurrentMap, &Button)) - { - if(UseCurrentMap) - g_Config.m_ClBackgroundEntities[0] = '\0'; - else - str_copy(g_Config.m_ClBackgroundEntities, CURRENT_MAP); - m_pClient->m_Background.LoadBackground(); - } - - Background.HSplitTop(20.0f, &Button, &Background); - if(DoButton_CheckBox(&g_Config.m_ClBackgroundShowTilesLayers, Localize("Show tiles layers from BG map"), g_Config.m_ClBackgroundShowTilesLayers, &Button)) - g_Config.m_ClBackgroundShowTilesLayers ^= 1; - - // miscellaneous - Miscellaneous.HSplitTop(30.0f, &Label, &Miscellaneous); - Miscellaneous.HSplitTop(5.0f, nullptr, &Miscellaneous); - - Ui()->DoLabel(&Label, Localize("Miscellaneous"), 20.0f, TEXTALIGN_ML); - - static CButtonContainer s_ButtonTimeout; - Miscellaneous.HSplitTop(20.0f, &Button, &Miscellaneous); - if(DoButton_Menu(&s_ButtonTimeout, Localize("New random timeout code"), 0, &Button)) - { - Client()->GenerateTimeoutSeed(); - } - - Miscellaneous.HSplitTop(5.0f, nullptr, &Miscellaneous); - Miscellaneous.HSplitTop(20.0f, &Label, &Miscellaneous); - Miscellaneous.HSplitTop(2.0f, nullptr, &Miscellaneous); - Ui()->DoLabel(&Label, Localize("Run on join"), 14.0f, TEXTALIGN_ML); - Miscellaneous.HSplitTop(20.0f, &Button, &Miscellaneous); - static CLineInput s_RunOnJoinInput(g_Config.m_ClRunOnJoin, sizeof(g_Config.m_ClRunOnJoin)); - s_RunOnJoinInput.SetEmptyText(Localize("Chat command (e.g. showall 1)")); - Ui()->DoEditBox(&s_RunOnJoinInput, &Button, 14.0f); - -#if defined(CONF_FAMILY_WINDOWS) - static CButtonContainer s_ButtonUnregisterShell; - Miscellaneous.HSplitTop(10.0f, nullptr, &Miscellaneous); - Miscellaneous.HSplitTop(20.0f, &Button, &Miscellaneous); - if(DoButton_Menu(&s_ButtonUnregisterShell, Localize("Unregister protocol and file extensions"), 0, &Button)) - { - Client()->ShellUnregister(); - } -#endif - - // Updater -#if defined(CONF_AUTOUPDATE) - { - bool NeedUpdate = str_comp(Client()->LatestVersion(), "0"); - IUpdater::EUpdaterState State = Updater()->GetCurrentState(); - - // Update Button - char aBuf[256]; - if(NeedUpdate && State <= IUpdater::CLEAN) - { - str_format(aBuf, sizeof(aBuf), Localize("DDNet %s is available:"), Client()->LatestVersion()); - UpdaterRect.VSplitLeft(TextRender()->TextWidth(14.0f, aBuf, -1, -1.0f) + 10.0f, &UpdaterRect, &Button); - Button.VSplitLeft(100.0f, &Button, nullptr); - static CButtonContainer s_ButtonUpdate; - if(DoButton_Menu(&s_ButtonUpdate, Localize("Update now"), 0, &Button)) - { - Updater()->InitiateUpdate(); - } - } - else if(State >= IUpdater::GETTING_MANIFEST && State < IUpdater::NEED_RESTART) - str_copy(aBuf, Localize("Updating…")); - else if(State == IUpdater::NEED_RESTART) - { - str_copy(aBuf, Localize("DDNet Client updated!")); - m_NeedRestartUpdate = true; - } - else - { - str_copy(aBuf, Localize("No updates available")); - UpdaterRect.VSplitLeft(TextRender()->TextWidth(14.0f, aBuf, -1, -1.0f) + 10.0f, &UpdaterRect, &Button); - Button.VSplitLeft(100.0f, &Button, nullptr); - static CButtonContainer s_ButtonUpdate; - if(DoButton_Menu(&s_ButtonUpdate, Localize("Check now"), 0, &Button)) - { - Client()->RequestDDNetInfo(); - } - } - Ui()->DoLabel(&UpdaterRect, aBuf, 14.0f, TEXTALIGN_ML); - TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); - } -#endif -} - -CUi::EPopupMenuFunctionResult CMenus::PopupMapPicker(void *pContext, CUIRect View, bool Active) -{ - CPopupMapPickerContext *pPopupContext = static_cast(pContext); - CMenus *pMenus = pPopupContext->m_pMenus; - - static CListBox s_ListBox; - s_ListBox.SetActive(Active); - s_ListBox.DoStart(20.0f, pPopupContext->m_vMaps.size(), 1, 3, -1, &View, false); - - int MapIndex = 0; - for(auto &Map : pPopupContext->m_vMaps) - { - MapIndex++; - const CListboxItem Item = s_ListBox.DoNextItem(&Map, MapIndex == pPopupContext->m_Selection); - if(!Item.m_Visible) - continue; - - CUIRect Label, Icon; - Item.m_Rect.VSplitLeft(20.0f, &Icon, &Label); - - char aLabelText[IO_MAX_PATH_LENGTH]; - str_copy(aLabelText, Map.m_aFilename); - if(Map.m_IsDirectory) - str_append(aLabelText, "/", sizeof(aLabelText)); - - const char *pIconType; - if(!Map.m_IsDirectory) - { - pIconType = FONT_ICON_MAP; - } - else - { - if(!str_comp(Map.m_aFilename, "..")) - pIconType = FONT_ICON_FOLDER_TREE; - else - pIconType = FONT_ICON_FOLDER; - } - - pMenus->TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - pMenus->TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING); - pMenus->Ui()->DoLabel(&Icon, pIconType, 12.0f, TEXTALIGN_ML); - pMenus->TextRender()->SetRenderFlags(0); - pMenus->TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - - pMenus->Ui()->DoLabel(&Label, aLabelText, 10.0f, TEXTALIGN_ML); - } - - const int NewSelected = s_ListBox.DoEnd(); - pPopupContext->m_Selection = NewSelected >= 0 ? NewSelected : -1; - if(s_ListBox.WasItemSelected() || s_ListBox.WasItemActivated()) - { - const CMapListItem &SelectedItem = pPopupContext->m_vMaps[pPopupContext->m_Selection]; - - if(SelectedItem.m_IsDirectory) - { - if(!str_comp(SelectedItem.m_aFilename, "..")) - { - fs_parent_dir(pPopupContext->m_aCurrentMapFolder); - } - else - { - str_append(pPopupContext->m_aCurrentMapFolder, "/", sizeof(pPopupContext->m_aCurrentMapFolder)); - str_append(pPopupContext->m_aCurrentMapFolder, SelectedItem.m_aFilename, sizeof(pPopupContext->m_aCurrentMapFolder)); - } - pPopupContext->MapListPopulate(); - } - else - { - str_format(g_Config.m_ClBackgroundEntities, sizeof(g_Config.m_ClBackgroundEntities), "%s/%s", pPopupContext->m_aCurrentMapFolder, SelectedItem.m_aFilename); - pMenus->m_pClient->m_Background.LoadBackground(); - return CUi::POPUP_CLOSE_CURRENT; - } - } - - return CUi::POPUP_KEEP_OPEN; -} - -void CMenus::CPopupMapPickerContext::MapListPopulate() -{ - m_vMaps.clear(); - char aTemp[IO_MAX_PATH_LENGTH]; - str_format(aTemp, sizeof(aTemp), "maps/%s", m_aCurrentMapFolder); - m_pMenus->Storage()->ListDirectoryInfo(IStorage::TYPE_ALL, aTemp, MapListFetchCallback, this); - std::stable_sort(m_vMaps.begin(), m_vMaps.end(), CompareFilenameAscending); - m_Selection = -1; -} - -int CMenus::CPopupMapPickerContext::MapListFetchCallback(const CFsFileInfo *pInfo, int IsDir, int StorageType, void *pUser) -{ - CPopupMapPickerContext *pRealUser = (CPopupMapPickerContext *)pUser; - if((!IsDir && !str_endswith(pInfo->m_pName, ".map")) || !str_comp(pInfo->m_pName, ".") || (!str_comp(pInfo->m_pName, "..") && (!str_comp(pRealUser->m_aCurrentMapFolder, "")))) - return 0; - - CMapListItem Item; - str_copy(Item.m_aFilename, pInfo->m_pName); - Item.m_IsDirectory = IsDir; - - pRealUser->m_vMaps.emplace_back(Item); - - return 0; -} diff --git a/src/game/client/components/menus_settings7.cpp b/src/game/client/components/menus_settings7.cpp deleted file mode 100644 index 9c5cf8751c..0000000000 --- a/src/game/client/components/menus_settings7.cpp +++ /dev/null @@ -1,482 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "menus.h" -#include "skins7.h" - -#include - -using namespace FontIcons; - -void CMenus::RenderSettingsTee7(CUIRect MainView) -{ - CUIRect SkinPreview, NormalSkinPreview, RedTeamSkinPreview, BlueTeamSkinPreview, Buttons, QuickSearch, DirectoryButton, RefreshButton, SaveDeleteButton, TabBars, TabBar, LeftTab, RightTab; - MainView.HSplitBottom(20.0f, &MainView, &Buttons); - MainView.HSplitBottom(5.0f, &MainView, nullptr); - Buttons.VSplitRight(25.0f, &Buttons, &RefreshButton); - Buttons.VSplitRight(10.0f, &Buttons, nullptr); - Buttons.VSplitRight(140.0f, &Buttons, &DirectoryButton); - Buttons.VSplitLeft(220.0f, &QuickSearch, &Buttons); - Buttons.VSplitLeft(10.0f, nullptr, &Buttons); - Buttons.VSplitLeft(120.0f, &SaveDeleteButton, &Buttons); - MainView.HSplitTop(50.0f, &TabBars, &MainView); - MainView.HSplitTop(10.0f, nullptr, &MainView); - TabBars.VSplitMid(&TabBars, &SkinPreview, 20.0f); - - TabBars.HSplitTop(20.0f, &TabBar, &TabBars); - TabBar.VSplitMid(&LeftTab, &RightTab); - TabBars.HSplitTop(10.0f, nullptr, &TabBars); - - SkinPreview.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f), IGraphics::CORNER_ALL, 5.0f); - SkinPreview.VMargin(10.0f, &SkinPreview); - SkinPreview.VSplitRight(50.0f, &SkinPreview, &BlueTeamSkinPreview); - SkinPreview.VSplitRight(10.0f, &SkinPreview, nullptr); - SkinPreview.VSplitRight(50.0f, &SkinPreview, &RedTeamSkinPreview); - SkinPreview.VSplitRight(10.0f, &SkinPreview, nullptr); - SkinPreview.VSplitRight(50.0f, &SkinPreview, &NormalSkinPreview); - SkinPreview.VSplitRight(10.0f, &SkinPreview, nullptr); - - static CButtonContainer s_PlayerTabButton; - if(DoButton_MenuTab(&s_PlayerTabButton, Localize("Player"), !m_Dummy, &LeftTab, IGraphics::CORNER_L, nullptr, nullptr, nullptr, nullptr, 4.0f)) - { - m_Dummy = false; - } - - static CButtonContainer s_DummyTabButton; - if(DoButton_MenuTab(&s_DummyTabButton, Localize("Dummy"), m_Dummy, &RightTab, IGraphics::CORNER_R, nullptr, nullptr, nullptr, nullptr, 4.0f)) - { - m_Dummy = true; - } - - TabBars.HSplitTop(20.0f, &TabBar, &TabBars); - TabBar.VSplitMid(&LeftTab, &RightTab); - - static CButtonContainer s_BasicTabButton; - if(DoButton_MenuTab(&s_BasicTabButton, Localize("Basic"), !m_CustomSkinMenu, &LeftTab, IGraphics::CORNER_L, nullptr, nullptr, nullptr, nullptr, 4.0f)) - { - m_CustomSkinMenu = false; - } - - static CButtonContainer s_CustomTabButton; - if(DoButton_MenuTab(&s_CustomTabButton, Localize("Custom"), m_CustomSkinMenu, &RightTab, IGraphics::CORNER_R, nullptr, nullptr, nullptr, nullptr, 4.0f)) - { - m_CustomSkinMenu = true; - if(m_CustomSkinMenu && m_pSelectedSkin) - { - if(m_pSelectedSkin->m_Flags & CSkins7::SKINFLAG_STANDARD) - { - m_SkinNameInput.Set("copy_"); - m_SkinNameInput.Append(m_pSelectedSkin->m_aName); - } - else - m_SkinNameInput.Set(m_pSelectedSkin->m_aName); - } - } - - // validate skin parts for solo mode - char aSkinParts[protocol7::NUM_SKINPARTS][protocol7::MAX_SKIN_ARRAY_SIZE]; - char *apSkinPartsPtr[protocol7::NUM_SKINPARTS]; - int aUCCVars[protocol7::NUM_SKINPARTS]; - int aColorVars[protocol7::NUM_SKINPARTS]; - for(int Part = 0; Part < protocol7::NUM_SKINPARTS; Part++) - { - str_copy(aSkinParts[Part], CSkins7::ms_apSkinVariables[(int)m_Dummy][Part], protocol7::MAX_SKIN_ARRAY_SIZE); - apSkinPartsPtr[Part] = aSkinParts[Part]; - aUCCVars[Part] = *CSkins7::ms_apUCCVariables[(int)m_Dummy][Part]; - aColorVars[Part] = *CSkins7::ms_apColorVariables[(int)m_Dummy][Part]; - } - m_pClient->m_Skins7.ValidateSkinParts(apSkinPartsPtr, aUCCVars, aColorVars, 0); - - CTeeRenderInfo OwnSkinInfo; - OwnSkinInfo.m_Size = 50.0f; - for(int Part = 0; Part < protocol7::NUM_SKINPARTS; Part++) - { - const CSkins7::CSkinPart *pSkinPart = m_pClient->m_Skins7.FindSkinPart(Part, apSkinPartsPtr[Part], false); - if(aUCCVars[Part]) - { - OwnSkinInfo.m_aSixup[g_Config.m_ClDummy].m_aTextures[Part] = pSkinPart->m_ColorTexture; - OwnSkinInfo.m_aSixup[g_Config.m_ClDummy].m_aColors[Part] = m_pClient->m_Skins7.GetColor(aColorVars[Part], Part == protocol7::SKINPART_MARKING); - } - else - { - OwnSkinInfo.m_aSixup[g_Config.m_ClDummy].m_aTextures[Part] = pSkinPart->m_OrgTexture; - OwnSkinInfo.m_aSixup[g_Config.m_ClDummy].m_aColors[Part] = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - } - } - - char aBuf[128 + IO_MAX_PATH_LENGTH]; - str_format(aBuf, sizeof(aBuf), "%s:", Localize("Your skin")); - Ui()->DoLabel(&SkinPreview, aBuf, 14.0f, TEXTALIGN_ML); - - { - // interactive tee: tee looking towards cursor, and it is happy when you touch it - const vec2 TeePosition = NormalSkinPreview.Center() + vec2(0.0f, 6.0f); - const vec2 DeltaPosition = Ui()->MousePos() - TeePosition; - const float Distance = length(DeltaPosition); - const float InteractionDistance = 20.0f; - const vec2 TeeDirection = Distance < InteractionDistance ? normalize(vec2(DeltaPosition.x, maximum(DeltaPosition.y, 0.5f))) : normalize(DeltaPosition); - const int TeeEmote = Distance < InteractionDistance ? EMOTE_HAPPY : EMOTE_NORMAL; - RenderTools()->RenderTee(CAnimState::GetIdle(), &OwnSkinInfo, TeeEmote, TeeDirection, TeePosition); - static char s_InteractiveTeeButtonId; - if(Distance < InteractionDistance && Ui()->DoButtonLogic(&s_InteractiveTeeButtonId, 0, &NormalSkinPreview)) - { - m_pClient->m_Sounds.Play(CSounds::CHN_GUI, SOUND_PLAYER_SPAWN, 1.0f); - } - } - - // validate skin parts for team game mode - for(int Part = 0; Part < protocol7::NUM_SKINPARTS; Part++) - { - str_copy(aSkinParts[Part], CSkins7::ms_apSkinVariables[(int)m_Dummy][Part], protocol7::MAX_SKIN_ARRAY_SIZE); - apSkinPartsPtr[Part] = aSkinParts[Part]; - aUCCVars[Part] = *CSkins7::ms_apUCCVariables[(int)m_Dummy][Part]; - aColorVars[Part] = *CSkins7::ms_apColorVariables[(int)m_Dummy][Part]; - } - m_pClient->m_Skins7.ValidateSkinParts(apSkinPartsPtr, aUCCVars, aColorVars, GAMEFLAG_TEAMS); - - CTeeRenderInfo TeamSkinInfo; - TeamSkinInfo.m_Size = OwnSkinInfo.m_Size; - for(int Part = 0; Part < protocol7::NUM_SKINPARTS; Part++) - { - const CSkins7::CSkinPart *pSkinPart = m_pClient->m_Skins7.FindSkinPart(Part, apSkinPartsPtr[Part], false); - TeamSkinInfo.m_aSixup[g_Config.m_ClDummy].m_aTextures[Part] = aUCCVars[Part] ? pSkinPart->m_ColorTexture : pSkinPart->m_OrgTexture; - } - - for(int Part = 0; Part < protocol7::NUM_SKINPARTS; Part++) - { - TeamSkinInfo.m_aSixup[g_Config.m_ClDummy].m_aColors[Part] = m_pClient->m_Skins7.GetTeamColor(aUCCVars[Part], aColorVars[Part], TEAM_RED, Part); - } - RenderTools()->RenderTee(CAnimState::GetIdle(), &TeamSkinInfo, 0, vec2(1, 0), RedTeamSkinPreview.Center() + vec2(0.0f, 6.0f)); - - for(int Part = 0; Part < protocol7::NUM_SKINPARTS; Part++) - { - TeamSkinInfo.m_aSixup[g_Config.m_ClDummy].m_aColors[Part] = m_pClient->m_Skins7.GetTeamColor(aUCCVars[Part], aColorVars[Part], TEAM_BLUE, Part); - } - RenderTools()->RenderTee(CAnimState::GetIdle(), &TeamSkinInfo, 0, vec2(-1, 0), BlueTeamSkinPreview.Center() + vec2(0.0f, 6.0f)); - - if(m_CustomSkinMenu) - RenderSettingsTeeCustom7(MainView); - else - RenderSkinSelection7(MainView); - - if(m_CustomSkinMenu) - { - static CButtonContainer s_CustomSkinSaveButton; - if(DoButton_Menu(&s_CustomSkinSaveButton, Localize("Save"), 0, &SaveDeleteButton)) - { - m_Popup = POPUP_SAVE_SKIN; - m_SkinNameInput.SelectAll(); - Ui()->SetActiveItem(&m_SkinNameInput); - } - } - else if(m_pSelectedSkin && (m_pSelectedSkin->m_Flags & CSkins7::SKINFLAG_STANDARD) == 0) - { - static CButtonContainer s_CustomSkinDeleteButton; - if(DoButton_Menu(&s_CustomSkinDeleteButton, Localize("Delete"), 0, &SaveDeleteButton) || Ui()->ConsumeHotkey(CUi::HOTKEY_DELETE)) - { - str_format(aBuf, sizeof(aBuf), Localize("Are you sure that you want to delete '%s'?"), m_pSelectedSkin->m_aName); - PopupConfirm(Localize("Delete skin"), aBuf, Localize("Yes"), Localize("No"), &CMenus::PopupConfirmDeleteSkin7); - } - } - - static CLineInput s_SkinFilterInput(g_Config.m_ClSkinFilterString, sizeof(g_Config.m_ClSkinFilterString)); - if(Ui()->DoEditBox_Search(&s_SkinFilterInput, &QuickSearch, 14.0f, !Ui()->IsPopupOpen() && m_pClient->m_GameConsole.IsClosed())) - { - m_SkinList7LastRefreshTime = std::nullopt; - m_SkinPartsList7LastRefreshTime = std::nullopt; - } - - static CButtonContainer s_DirectoryButton; - if(DoButton_Menu(&s_DirectoryButton, Localize("Skins directory"), 0, &DirectoryButton)) - { - Storage()->GetCompletePath(IStorage::TYPE_SAVE, "skins7", aBuf, sizeof(aBuf)); - Storage()->CreateFolder("skins7", IStorage::TYPE_SAVE); - Client()->ViewFile(aBuf); - } - GameClient()->m_Tooltips.DoToolTip(&s_DirectoryButton, &DirectoryButton, Localize("Open the directory to add custom skins")); - - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - static CButtonContainer s_SkinRefreshButton; - if(DoButton_Menu(&s_SkinRefreshButton, FONT_ICON_ARROW_ROTATE_RIGHT, 0, &RefreshButton) || - (!Ui()->IsPopupOpen() && m_pClient->m_GameConsole.IsClosed() && (Input()->KeyPress(KEY_F5) || (Input()->ModifierIsPressed() && Input()->KeyPress(KEY_R))))) - { - // reset render flags for possible loading screen - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - // TODO: m_pClient->RefreshSkins(); - } - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); -} - -void CMenus::PopupConfirmDeleteSkin7() -{ - dbg_assert(m_pSelectedSkin, "no skin selected for deletion"); - - if(!m_pClient->m_Skins7.RemoveSkin(m_pSelectedSkin)) - { - PopupMessage(Localize("Error"), Localize("Unable to delete skin"), Localize("Ok")); - return; - } - m_pSelectedSkin = nullptr; -} - -void CMenus::RenderSettingsTeeCustom7(CUIRect MainView) -{ - CUIRect ButtonBar, SkinPartSelection, CustomColors; - - MainView.HSplitTop(20.0f, &ButtonBar, &MainView); - MainView.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f), IGraphics::CORNER_B, 5.0f); - MainView.VSplitMid(&SkinPartSelection, &CustomColors, 10.0f); - CustomColors.Margin(5.0f, &CustomColors); - CUIRect CustomColorsButton, RandomSkinButton; - CustomColors.HSplitTop(20.0f, &CustomColorsButton, &CustomColors); - CustomColorsButton.VSplitRight(30.0f, &CustomColorsButton, &RandomSkinButton); - CustomColorsButton.VSplitRight(20.0f, &CustomColorsButton, nullptr); - - const float ButtonWidth = ButtonBar.w / protocol7::NUM_SKINPARTS; - - static CButtonContainer s_aSkinPartButtons[protocol7::NUM_SKINPARTS]; - for(int i = 0; i < protocol7::NUM_SKINPARTS; i++) - { - CUIRect Button; - ButtonBar.VSplitLeft(ButtonWidth, &Button, &ButtonBar); - const int Corners = i == 0 ? IGraphics::CORNER_TL : (i == (protocol7::NUM_SKINPARTS - 1) ? IGraphics::CORNER_TR : IGraphics::CORNER_NONE); - if(DoButton_MenuTab(&s_aSkinPartButtons[i], Localize(CSkins7::ms_apSkinPartNamesLocalized[i], "skins"), m_TeePartSelected == i, &Button, Corners, nullptr, nullptr, nullptr, nullptr, 4.0f)) - { - m_TeePartSelected = i; - } - } - - RenderSkinPartSelection7(SkinPartSelection); - - int *pUseCustomColor = CSkins7::ms_apUCCVariables[(int)m_Dummy][m_TeePartSelected]; - if(DoButton_CheckBox(pUseCustomColor, Localize("Custom colors"), *pUseCustomColor, &CustomColorsButton)) - { - *pUseCustomColor = !*pUseCustomColor; - SetNeedSendInfo(); - } - - if(*pUseCustomColor) - { - CUIRect CustomColorScrollbars; - CustomColors.HSplitTop(5.0f, nullptr, &CustomColors); - CustomColors.HSplitTop(95.0f, &CustomColorScrollbars, &CustomColors); - - if(RenderHslaScrollbars(&CustomColorScrollbars, CSkins7::ms_apColorVariables[(int)m_Dummy][m_TeePartSelected], m_TeePartSelected == protocol7::SKINPART_MARKING, ColorHSLA::DARKEST_LGT7)) - { - SetNeedSendInfo(); - } - } - - // Random skin button - static CButtonContainer s_RandomSkinButton; - static const char *s_apDice[] = {FONT_ICON_DICE_ONE, FONT_ICON_DICE_TWO, FONT_ICON_DICE_THREE, FONT_ICON_DICE_FOUR, FONT_ICON_DICE_FIVE, FONT_ICON_DICE_SIX}; - static int s_CurrentDie = rand() % std::size(s_apDice); - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - if(DoButton_Menu(&s_RandomSkinButton, s_apDice[s_CurrentDie], 0, &RandomSkinButton, nullptr, IGraphics::CORNER_ALL, 5.0f, -0.2f)) - { - m_pClient->m_Skins7.RandomizeSkin(m_Dummy); - SetNeedSendInfo(); - s_CurrentDie = rand() % std::size(s_apDice); - } - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - GameClient()->m_Tooltips.DoToolTip(&s_RandomSkinButton, &RandomSkinButton, Localize("Create a random skin")); -} - -void CMenus::RenderSkinSelection7(CUIRect MainView) -{ - static float s_LastSelectionTime = -10.0f; - static std::vector s_vpSkinList; - static CListBox s_ListBox; - - if(!m_SkinList7LastRefreshTime.has_value() || m_SkinList7LastRefreshTime.value() != m_SkinList7LastRefreshTime) - { - s_vpSkinList.clear(); - for(const CSkins7::CSkin &Skin : GameClient()->m_Skins7.GetSkins()) - { - if((Skin.m_Flags & CSkins7::SKINFLAG_SPECIAL) != 0) - continue; - if(g_Config.m_ClSkinFilterString[0] != '\0' && !str_utf8_find_nocase(Skin.m_aName, g_Config.m_ClSkinFilterString)) - continue; - - s_vpSkinList.emplace_back(&Skin); - } - } - - m_pSelectedSkin = nullptr; - int s_OldSelected = -1; - s_ListBox.DoStart(50.0f, s_vpSkinList.size(), 4, 1, s_OldSelected, &MainView); - - for(int i = 0; i < (int)s_vpSkinList.size(); ++i) - { - const CSkins7::CSkin *pSkin = s_vpSkinList[i]; - if(pSkin == nullptr) - continue; - if(!str_comp(pSkin->m_aName, CSkins7::ms_apSkinNameVariables[m_Dummy])) - { - m_pSelectedSkin = pSkin; - s_OldSelected = i; - } - - const CListboxItem Item = s_ListBox.DoNextItem(&s_vpSkinList[i], s_OldSelected == i); - if(!Item.m_Visible) - continue; - - CUIRect TeePreview, Label; - Item.m_Rect.VSplitLeft(60.0f, &TeePreview, &Label); - - CTeeRenderInfo Info; - for(int Part = 0; Part < protocol7::NUM_SKINPARTS; Part++) - { - if(pSkin->m_aUseCustomColors[Part]) - { - Info.m_aSixup[g_Config.m_ClDummy].m_aTextures[Part] = pSkin->m_apParts[Part]->m_ColorTexture; - Info.m_aSixup[g_Config.m_ClDummy].m_aColors[Part] = m_pClient->m_Skins7.GetColor(pSkin->m_aPartColors[Part], Part == protocol7::SKINPART_MARKING); - } - else - { - Info.m_aSixup[g_Config.m_ClDummy].m_aTextures[Part] = pSkin->m_apParts[Part]->m_OrgTexture; - Info.m_aSixup[g_Config.m_ClDummy].m_aColors[Part] = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - } - } - Info.m_Size = 50.0f; - - { - // interactive tee: tee is happy to be selected - int TeeEmote = (Item.m_Selected && s_LastSelectionTime + 0.75f > Client()->GlobalTime()) ? EMOTE_HAPPY : EMOTE_NORMAL; - RenderTools()->RenderTee(CAnimState::GetIdle(), &Info, TeeEmote, vec2(1.0f, 0.0f), TeePreview.Center() + vec2(0.0f, 6.0f)); - } - - SLabelProperties Props; - Props.m_MaxWidth = Label.w - 5.0f; - Ui()->DoLabel(&Label, pSkin->m_aName, 12.0f, TEXTALIGN_ML, Props); - } - - const int NewSelected = s_ListBox.DoEnd(); - if(NewSelected != -1 && NewSelected != s_OldSelected) - { - s_LastSelectionTime = Client()->GlobalTime(); - m_pSelectedSkin = s_vpSkinList[NewSelected]; - str_copy(CSkins7::ms_apSkinNameVariables[m_Dummy], m_pSelectedSkin->m_aName, protocol7::MAX_SKIN_ARRAY_SIZE); - for(int Part = 0; Part < protocol7::NUM_SKINPARTS; Part++) - { - str_copy(CSkins7::ms_apSkinVariables[(int)m_Dummy][Part], m_pSelectedSkin->m_apParts[Part]->m_aName, protocol7::MAX_SKIN_ARRAY_SIZE); - *CSkins7::ms_apUCCVariables[(int)m_Dummy][Part] = m_pSelectedSkin->m_aUseCustomColors[Part]; - *CSkins7::ms_apColorVariables[(int)m_Dummy][Part] = m_pSelectedSkin->m_aPartColors[Part]; - } - SetNeedSendInfo(); - } -} - -void CMenus::RenderSkinPartSelection7(CUIRect MainView) -{ - static std::vector s_paList[protocol7::NUM_SKINPARTS]; - static CListBox s_ListBox; - for(int Part = 0; Part < protocol7::NUM_SKINPARTS; Part++) - { - if(!m_SkinList7LastRefreshTime.has_value() || m_SkinList7LastRefreshTime.value() != GameClient()->m_Skins7.LastRefreshTime()) - { - s_paList[Part].clear(); - for(const CSkins7::CSkinPart &SkinPart : GameClient()->m_Skins7.GetSkinParts(Part)) - { - if((SkinPart.m_Flags & CSkins7::SKINFLAG_SPECIAL) != 0) - continue; - - if(g_Config.m_ClSkinFilterString[0] != '\0' && !str_utf8_find_nocase(SkinPart.m_aName, g_Config.m_ClSkinFilterString)) - continue; - - s_paList[Part].emplace_back(&SkinPart); - } - } - } - - static int s_OldSelected = -1; - s_ListBox.DoBegin(&MainView); - s_ListBox.DoStart(72.0f, s_paList[m_TeePartSelected].size(), 4, 1, s_OldSelected, nullptr, false, IGraphics::CORNER_NONE, true); - - for(int i = 0; i < (int)s_paList[m_TeePartSelected].size(); ++i) - { - const CSkins7::CSkinPart *pPart = s_paList[m_TeePartSelected][i]; - if(pPart == nullptr) - continue; - if(!str_comp(pPart->m_aName, CSkins7::ms_apSkinVariables[(int)m_Dummy][m_TeePartSelected])) - s_OldSelected = i; - - CListboxItem Item = s_ListBox.DoNextItem(&s_paList[m_TeePartSelected][i], s_OldSelected == i); - if(!Item.m_Visible) - continue; - - CUIRect Label; - Item.m_Rect.Margin(5.0f, &Item.m_Rect); - Item.m_Rect.HSplitBottom(12.0f, &Item.m_Rect, &Label); - - CTeeRenderInfo Info; - for(int Part = 0; Part < protocol7::NUM_SKINPARTS; Part++) - { - const CSkins7::CSkinPart *pSkinPart = m_pClient->m_Skins7.FindSkinPart(Part, CSkins7::ms_apSkinVariables[(int)m_Dummy][Part], false); - if(*CSkins7::ms_apUCCVariables[(int)m_Dummy][Part]) - { - Info.m_aSixup[g_Config.m_ClDummy].m_aTextures[Part] = m_TeePartSelected == Part ? pPart->m_ColorTexture : pSkinPart->m_ColorTexture; - Info.m_aSixup[g_Config.m_ClDummy].m_aColors[Part] = m_pClient->m_Skins7.GetColor(*CSkins7::ms_apColorVariables[(int)m_Dummy][Part], Part == protocol7::SKINPART_MARKING); - } - else - { - Info.m_aSixup[g_Config.m_ClDummy].m_aTextures[Part] = m_TeePartSelected == Part ? pPart->m_OrgTexture : pSkinPart->m_OrgTexture; - Info.m_aSixup[g_Config.m_ClDummy].m_aColors[Part] = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - } - } - Info.m_Size = 50.0f; - - const vec2 TeePos = Item.m_Rect.Center() + vec2(0.0f, 6.0f); - if(m_TeePartSelected == protocol7::SKINPART_HANDS) - { - // RenderTools()->RenderTeeHand(&Info, TeePos, vec2(1.0f, 0.0f), -pi*0.5f, vec2(18, 0)); - } - int TeePartEmote = EMOTE_NORMAL; - if(m_TeePartSelected == protocol7::SKINPART_EYES) - { - TeePartEmote = (int)(Client()->GlobalTime() * 0.5f) % NUM_EMOTES; - } - RenderTools()->RenderTee(CAnimState::GetIdle(), &Info, TeePartEmote, vec2(1.0f, 0.0f), TeePos); - - Ui()->DoLabel(&Label, pPart->m_aName, 12.0f, TEXTALIGN_MC); - } - - const int NewSelected = s_ListBox.DoEnd(); - if(NewSelected != -1 && NewSelected != s_OldSelected) - { - str_copy(CSkins7::ms_apSkinVariables[(int)m_Dummy][m_TeePartSelected], s_paList[m_TeePartSelected][NewSelected]->m_aName, protocol7::MAX_SKIN_ARRAY_SIZE); - CSkins7::ms_apSkinNameVariables[m_Dummy][0] = '\0'; - SetNeedSendInfo(); - } - s_OldSelected = NewSelected; -} diff --git a/src/game/client/components/menus_settings_assets.cpp b/src/game/client/components/menus_settings_assets.cpp deleted file mode 100644 index c7412b889f..0000000000 --- a/src/game/client/components/menus_settings_assets.cpp +++ /dev/null @@ -1,734 +0,0 @@ -#include - -#include -#include -#include - -#include -#include -#include - -#include "menus.h" - -#include - -using namespace FontIcons; -using namespace std::chrono_literals; - -typedef std::function TMenuAssetScanLoadedFunc; - -struct SMenuAssetScanUser -{ - void *m_pUser; - TMenuAssetScanLoadedFunc m_LoadedFunc; -}; - -// IDs of the tabs in the Assets menu -enum -{ - ASSETS_TAB_ENTITIES = 0, - ASSETS_TAB_GAME = 1, - ASSETS_TAB_EMOTICONS = 2, - ASSETS_TAB_PARTICLES = 3, - ASSETS_TAB_HUD = 4, - ASSETS_TAB_EXTRAS = 5, - NUMBER_OF_ASSETS_TABS = 6, -}; - -void CMenus::LoadEntities(SCustomEntities *pEntitiesItem, void *pUser) -{ - auto *pRealUser = (SMenuAssetScanUser *)pUser; - auto *pThis = (CMenus *)pRealUser->m_pUser; - - char aPath[IO_MAX_PATH_LENGTH]; - if(str_comp(pEntitiesItem->m_aName, "default") == 0) - { - for(int i = 0; i < MAP_IMAGE_MOD_TYPE_COUNT; ++i) - { - str_format(aPath, sizeof(aPath), "editor/entities_clear/%s.png", gs_apModEntitiesNames[i]); - pEntitiesItem->m_aImages[i].m_Texture = pThis->Graphics()->LoadTexture(aPath, IStorage::TYPE_ALL); - if(!pEntitiesItem->m_RenderTexture.IsValid() || pEntitiesItem->m_RenderTexture.IsNullTexture()) - pEntitiesItem->m_RenderTexture = pEntitiesItem->m_aImages[i].m_Texture; - } - } - else - { - for(int i = 0; i < MAP_IMAGE_MOD_TYPE_COUNT; ++i) - { - str_format(aPath, sizeof(aPath), "assets/entities/%s/%s.png", pEntitiesItem->m_aName, gs_apModEntitiesNames[i]); - pEntitiesItem->m_aImages[i].m_Texture = pThis->Graphics()->LoadTexture(aPath, IStorage::TYPE_ALL); - if(pEntitiesItem->m_aImages[i].m_Texture.IsNullTexture()) - { - str_format(aPath, sizeof(aPath), "assets/entities/%s.png", pEntitiesItem->m_aName); - pEntitiesItem->m_aImages[i].m_Texture = pThis->Graphics()->LoadTexture(aPath, IStorage::TYPE_ALL); - } - if(!pEntitiesItem->m_RenderTexture.IsValid() || pEntitiesItem->m_RenderTexture.IsNullTexture()) - pEntitiesItem->m_RenderTexture = pEntitiesItem->m_aImages[i].m_Texture; - } - } -} - -int CMenus::EntitiesScan(const char *pName, int IsDir, int DirType, void *pUser) -{ - auto *pRealUser = (SMenuAssetScanUser *)pUser; - auto *pThis = (CMenus *)pRealUser->m_pUser; - if(IsDir) - { - if(pName[0] == '.') - return 0; - - // default is reserved - if(str_comp(pName, "default") == 0) - return 0; - - SCustomEntities EntitiesItem; - str_copy(EntitiesItem.m_aName, pName); - CMenus::LoadEntities(&EntitiesItem, pUser); - pThis->m_vEntitiesList.push_back(EntitiesItem); - } - else - { - if(str_endswith(pName, ".png")) - { - char aName[IO_MAX_PATH_LENGTH]; - str_truncate(aName, sizeof(aName), pName, str_length(pName) - 4); - // default is reserved - if(str_comp(aName, "default") == 0) - return 0; - - SCustomEntities EntitiesItem; - str_copy(EntitiesItem.m_aName, aName); - CMenus::LoadEntities(&EntitiesItem, pUser); - pThis->m_vEntitiesList.push_back(EntitiesItem); - } - } - - pRealUser->m_LoadedFunc(); - - return 0; -} - -template -static void LoadAsset(TName *pAssetItem, const char *pAssetName, IGraphics *pGraphics) -{ - char aPath[IO_MAX_PATH_LENGTH]; - if(str_comp(pAssetItem->m_aName, "default") == 0) - { - str_format(aPath, sizeof(aPath), "%s.png", pAssetName); - pAssetItem->m_RenderTexture = pGraphics->LoadTexture(aPath, IStorage::TYPE_ALL); - } - else - { - str_format(aPath, sizeof(aPath), "assets/%s/%s.png", pAssetName, pAssetItem->m_aName); - pAssetItem->m_RenderTexture = pGraphics->LoadTexture(aPath, IStorage::TYPE_ALL); - if(pAssetItem->m_RenderTexture.IsNullTexture()) - { - str_format(aPath, sizeof(aPath), "assets/%s/%s/%s.png", pAssetName, pAssetItem->m_aName, pAssetName); - pAssetItem->m_RenderTexture = pGraphics->LoadTexture(aPath, IStorage::TYPE_ALL); - } - } -} - -template -static int AssetScan(const char *pName, int IsDir, int DirType, std::vector &vAssetList, const char *pAssetName, IGraphics *pGraphics, void *pUser) -{ - auto *pRealUser = (SMenuAssetScanUser *)pUser; - if(IsDir) - { - if(pName[0] == '.') - return 0; - - // default is reserved - if(str_comp(pName, "default") == 0) - return 0; - - TName AssetItem; - str_copy(AssetItem.m_aName, pName); - LoadAsset(&AssetItem, pAssetName, pGraphics); - vAssetList.push_back(AssetItem); - } - else - { - if(str_endswith(pName, ".png")) - { - char aName[IO_MAX_PATH_LENGTH]; - str_truncate(aName, sizeof(aName), pName, str_length(pName) - 4); - // default is reserved - if(str_comp(aName, "default") == 0) - return 0; - - TName AssetItem; - str_copy(AssetItem.m_aName, aName); - LoadAsset(&AssetItem, pAssetName, pGraphics); - vAssetList.push_back(AssetItem); - } - } - - pRealUser->m_LoadedFunc(); - - return 0; -} - -int CMenus::GameScan(const char *pName, int IsDir, int DirType, void *pUser) -{ - auto *pRealUser = (SMenuAssetScanUser *)pUser; - auto *pThis = (CMenus *)pRealUser->m_pUser; - IGraphics *pGraphics = pThis->Graphics(); - return AssetScan(pName, IsDir, DirType, pThis->m_vGameList, "game", pGraphics, pUser); -} - -int CMenus::EmoticonsScan(const char *pName, int IsDir, int DirType, void *pUser) -{ - auto *pRealUser = (SMenuAssetScanUser *)pUser; - auto *pThis = (CMenus *)pRealUser->m_pUser; - IGraphics *pGraphics = pThis->Graphics(); - return AssetScan(pName, IsDir, DirType, pThis->m_vEmoticonList, "emoticons", pGraphics, pUser); -} - -int CMenus::ParticlesScan(const char *pName, int IsDir, int DirType, void *pUser) -{ - auto *pRealUser = (SMenuAssetScanUser *)pUser; - auto *pThis = (CMenus *)pRealUser->m_pUser; - IGraphics *pGraphics = pThis->Graphics(); - return AssetScan(pName, IsDir, DirType, pThis->m_vParticlesList, "particles", pGraphics, pUser); -} - -int CMenus::HudScan(const char *pName, int IsDir, int DirType, void *pUser) -{ - auto *pRealUser = (SMenuAssetScanUser *)pUser; - auto *pThis = (CMenus *)pRealUser->m_pUser; - IGraphics *pGraphics = pThis->Graphics(); - return AssetScan(pName, IsDir, DirType, pThis->m_vHudList, "hud", pGraphics, pUser); -} - -int CMenus::ExtrasScan(const char *pName, int IsDir, int DirType, void *pUser) -{ - auto *pRealUser = (SMenuAssetScanUser *)pUser; - auto *pThis = (CMenus *)pRealUser->m_pUser; - IGraphics *pGraphics = pThis->Graphics(); - return AssetScan(pName, IsDir, DirType, pThis->m_vExtrasList, "extras", pGraphics, pUser); -} - -static std::vector gs_vpSearchEntitiesList; -static std::vector gs_vpSearchGamesList; -static std::vector gs_vpSearchEmoticonsList; -static std::vector gs_vpSearchParticlesList; -static std::vector gs_vpSearchHudList; -static std::vector gs_vpSearchExtrasList; - -static bool gs_aInitCustomList[NUMBER_OF_ASSETS_TABS] = { - true, -}; - -static size_t gs_aCustomListSize[NUMBER_OF_ASSETS_TABS] = { - 0, -}; - -static CLineInputBuffered<64> s_aFilterInputs[NUMBER_OF_ASSETS_TABS]; - -static int s_CurCustomTab = ASSETS_TAB_ENTITIES; - -static const CMenus::SCustomItem *GetCustomItem(int CurTab, size_t Index) -{ - if(CurTab == ASSETS_TAB_ENTITIES) - return gs_vpSearchEntitiesList[Index]; - else if(CurTab == ASSETS_TAB_GAME) - return gs_vpSearchGamesList[Index]; - else if(CurTab == ASSETS_TAB_EMOTICONS) - return gs_vpSearchEmoticonsList[Index]; - else if(CurTab == ASSETS_TAB_PARTICLES) - return gs_vpSearchParticlesList[Index]; - else if(CurTab == ASSETS_TAB_HUD) - return gs_vpSearchHudList[Index]; - else if(CurTab == ASSETS_TAB_EXTRAS) - return gs_vpSearchExtrasList[Index]; - - return NULL; -} - -template -void ClearAssetList(std::vector &vList, IGraphics *pGraphics) -{ - for(TName &Asset : vList) - { - pGraphics->UnloadTexture(&Asset.m_RenderTexture); - } - vList.clear(); -} - -void CMenus::ClearCustomItems(int CurTab) -{ - if(CurTab == ASSETS_TAB_ENTITIES) - { - for(auto &Entity : m_vEntitiesList) - { - for(auto &Image : Entity.m_aImages) - { - Graphics()->UnloadTexture(&Image.m_Texture); - } - } - m_vEntitiesList.clear(); - - // reload current entities - m_pClient->m_MapImages.ChangeEntitiesPath(g_Config.m_ClAssetsEntities); - } - else if(CurTab == ASSETS_TAB_GAME) - { - ClearAssetList(m_vGameList, Graphics()); - - // reload current game skin - GameClient()->LoadGameSkin(g_Config.m_ClAssetGame); - } - else if(CurTab == ASSETS_TAB_EMOTICONS) - { - ClearAssetList(m_vEmoticonList, Graphics()); - - // reload current emoticons skin - GameClient()->LoadEmoticonsSkin(g_Config.m_ClAssetEmoticons); - } - else if(CurTab == ASSETS_TAB_PARTICLES) - { - ClearAssetList(m_vParticlesList, Graphics()); - - // reload current particles skin - GameClient()->LoadParticlesSkin(g_Config.m_ClAssetParticles); - } - else if(CurTab == ASSETS_TAB_HUD) - { - ClearAssetList(m_vHudList, Graphics()); - - // reload current hud skin - GameClient()->LoadHudSkin(g_Config.m_ClAssetHud); - } - else if(CurTab == ASSETS_TAB_EXTRAS) - { - ClearAssetList(m_vExtrasList, Graphics()); - - // reload current DDNet particles skin - GameClient()->LoadExtrasSkin(g_Config.m_ClAssetExtras); - } - gs_aInitCustomList[CurTab] = true; -} - -template -void InitAssetList(std::vector &vAssetList, const char *pAssetPath, const char *pAssetName, FS_LISTDIR_CALLBACK pfnCallback, IGraphics *pGraphics, IStorage *pStorage, TCaller Caller) -{ - if(vAssetList.empty()) - { - TName AssetItem; - str_copy(AssetItem.m_aName, "default"); - LoadAsset(&AssetItem, pAssetName, pGraphics); - vAssetList.push_back(AssetItem); - - // load assets - pStorage->ListDirectory(IStorage::TYPE_ALL, pAssetPath, pfnCallback, Caller); - std::sort(vAssetList.begin(), vAssetList.end()); - } - if(vAssetList.size() != gs_aCustomListSize[s_CurCustomTab]) - gs_aInitCustomList[s_CurCustomTab] = true; -} - -template -int InitSearchList(std::vector &vpSearchList, std::vector &vAssetList) -{ - vpSearchList.clear(); - int ListSize = vAssetList.size(); - for(int i = 0; i < ListSize; ++i) - { - const TName *pAsset = &vAssetList[i]; - - // filter quick search - if(!s_aFilterInputs[s_CurCustomTab].IsEmpty() && !str_utf8_find_nocase(pAsset->m_aName, s_aFilterInputs[s_CurCustomTab].GetString())) - continue; - - vpSearchList.push_back(pAsset); - } - return vAssetList.size(); -} - -void CMenus::RenderSettingsCustom(CUIRect MainView) -{ - CUIRect TabBar, CustomList, QuickSearch, DirectoryButton, ReloadButton; - - MainView.HSplitTop(20.0f, &TabBar, &MainView); - const float TabWidth = TabBar.w / NUMBER_OF_ASSETS_TABS; - static CButtonContainer s_aPageTabs[NUMBER_OF_ASSETS_TABS] = {}; - const char *apTabNames[NUMBER_OF_ASSETS_TABS] = { - Localize("Entities"), - Localize("Game"), - Localize("Emoticons"), - Localize("Particles"), - Localize("HUD"), - Localize("Extras")}; - - for(int Tab = ASSETS_TAB_ENTITIES; Tab < NUMBER_OF_ASSETS_TABS; ++Tab) - { - CUIRect Button; - TabBar.VSplitLeft(TabWidth, &Button, &TabBar); - const int Corners = Tab == ASSETS_TAB_ENTITIES ? IGraphics::CORNER_L : Tab == NUMBER_OF_ASSETS_TABS - 1 ? IGraphics::CORNER_R : IGraphics::CORNER_NONE; - if(DoButton_MenuTab(&s_aPageTabs[Tab], apTabNames[Tab], s_CurCustomTab == Tab, &Button, Corners, nullptr, nullptr, nullptr, nullptr, 4.0f)) - { - s_CurCustomTab = Tab; - } - } - - auto LoadStartTime = time_get_nanoseconds(); - SMenuAssetScanUser User; - User.m_pUser = this; - User.m_LoadedFunc = [&]() { - if(time_get_nanoseconds() - LoadStartTime > 500ms) - RenderLoading(Localize("Loading assets"), "", 0); - }; - if(s_CurCustomTab == ASSETS_TAB_ENTITIES) - { - if(m_vEntitiesList.empty()) - { - SCustomEntities EntitiesItem; - str_copy(EntitiesItem.m_aName, "default"); - LoadEntities(&EntitiesItem, &User); - m_vEntitiesList.push_back(EntitiesItem); - - // load entities - Storage()->ListDirectory(IStorage::TYPE_ALL, "assets/entities", EntitiesScan, &User); - std::sort(m_vEntitiesList.begin(), m_vEntitiesList.end()); - } - if(m_vEntitiesList.size() != gs_aCustomListSize[s_CurCustomTab]) - gs_aInitCustomList[s_CurCustomTab] = true; - } - else if(s_CurCustomTab == ASSETS_TAB_GAME) - { - InitAssetList(m_vGameList, "assets/game", "game", GameScan, Graphics(), Storage(), &User); - } - else if(s_CurCustomTab == ASSETS_TAB_EMOTICONS) - { - InitAssetList(m_vEmoticonList, "assets/emoticons", "emoticons", EmoticonsScan, Graphics(), Storage(), &User); - } - else if(s_CurCustomTab == ASSETS_TAB_PARTICLES) - { - InitAssetList(m_vParticlesList, "assets/particles", "particles", ParticlesScan, Graphics(), Storage(), &User); - } - else if(s_CurCustomTab == ASSETS_TAB_HUD) - { - InitAssetList(m_vHudList, "assets/hud", "hud", HudScan, Graphics(), Storage(), &User); - } - else if(s_CurCustomTab == ASSETS_TAB_EXTRAS) - { - InitAssetList(m_vExtrasList, "assets/extras", "extras", ExtrasScan, Graphics(), Storage(), &User); - } - - MainView.HSplitTop(10.0f, 0, &MainView); - - // skin selector - MainView.HSplitTop(MainView.h - 10.0f - ms_ButtonHeight, &CustomList, &MainView); - if(gs_aInitCustomList[s_CurCustomTab]) - { - int ListSize = 0; - if(s_CurCustomTab == ASSETS_TAB_ENTITIES) - { - gs_vpSearchEntitiesList.clear(); - ListSize = m_vEntitiesList.size(); - for(int i = 0; i < ListSize; ++i) - { - const SCustomEntities *pEntity = &m_vEntitiesList[i]; - - // filter quick search - if(!s_aFilterInputs[s_CurCustomTab].IsEmpty() && !str_utf8_find_nocase(pEntity->m_aName, s_aFilterInputs[s_CurCustomTab].GetString())) - continue; - - gs_vpSearchEntitiesList.push_back(pEntity); - } - } - else if(s_CurCustomTab == ASSETS_TAB_GAME) - { - ListSize = InitSearchList(gs_vpSearchGamesList, m_vGameList); - } - else if(s_CurCustomTab == ASSETS_TAB_EMOTICONS) - { - ListSize = InitSearchList(gs_vpSearchEmoticonsList, m_vEmoticonList); - } - else if(s_CurCustomTab == ASSETS_TAB_PARTICLES) - { - ListSize = InitSearchList(gs_vpSearchParticlesList, m_vParticlesList); - } - else if(s_CurCustomTab == ASSETS_TAB_HUD) - { - ListSize = InitSearchList(gs_vpSearchHudList, m_vHudList); - } - else if(s_CurCustomTab == ASSETS_TAB_EXTRAS) - { - ListSize = InitSearchList(gs_vpSearchExtrasList, m_vExtrasList); - } - gs_aInitCustomList[s_CurCustomTab] = false; - gs_aCustomListSize[s_CurCustomTab] = ListSize; - } - - int OldSelected = -1; - float Margin = 10; - float TextureWidth = 150; - float TextureHeight = 150; - - size_t SearchListSize = 0; - - if(s_CurCustomTab == ASSETS_TAB_ENTITIES) - { - SearchListSize = gs_vpSearchEntitiesList.size(); - } - else if(s_CurCustomTab == ASSETS_TAB_GAME) - { - SearchListSize = gs_vpSearchGamesList.size(); - TextureHeight = 75; - } - else if(s_CurCustomTab == ASSETS_TAB_EMOTICONS) - { - SearchListSize = gs_vpSearchEmoticonsList.size(); - } - else if(s_CurCustomTab == ASSETS_TAB_PARTICLES) - { - SearchListSize = gs_vpSearchParticlesList.size(); - } - else if(s_CurCustomTab == ASSETS_TAB_HUD) - { - SearchListSize = gs_vpSearchHudList.size(); - } - else if(s_CurCustomTab == ASSETS_TAB_EXTRAS) - { - SearchListSize = gs_vpSearchExtrasList.size(); - } - - static CListBox s_ListBox; - s_ListBox.DoStart(TextureHeight + 15.0f + 10.0f + Margin, SearchListSize, CustomList.w / (Margin + TextureWidth), 1, OldSelected, &CustomList, false); - for(size_t i = 0; i < SearchListSize; ++i) - { - const SCustomItem *pItem = GetCustomItem(s_CurCustomTab, i); - if(pItem == NULL) - continue; - - if(s_CurCustomTab == ASSETS_TAB_ENTITIES) - { - if(str_comp(pItem->m_aName, g_Config.m_ClAssetsEntities) == 0) - OldSelected = i; - } - else if(s_CurCustomTab == ASSETS_TAB_GAME) - { - if(str_comp(pItem->m_aName, g_Config.m_ClAssetGame) == 0) - OldSelected = i; - } - else if(s_CurCustomTab == ASSETS_TAB_EMOTICONS) - { - if(str_comp(pItem->m_aName, g_Config.m_ClAssetEmoticons) == 0) - OldSelected = i; - } - else if(s_CurCustomTab == ASSETS_TAB_PARTICLES) - { - if(str_comp(pItem->m_aName, g_Config.m_ClAssetParticles) == 0) - OldSelected = i; - } - else if(s_CurCustomTab == ASSETS_TAB_HUD) - { - if(str_comp(pItem->m_aName, g_Config.m_ClAssetHud) == 0) - OldSelected = i; - } - else if(s_CurCustomTab == ASSETS_TAB_EXTRAS) - { - if(str_comp(pItem->m_aName, g_Config.m_ClAssetExtras) == 0) - OldSelected = i; - } - - const CListboxItem Item = s_ListBox.DoNextItem(pItem, OldSelected >= 0 && (size_t)OldSelected == i); - CUIRect ItemRect = Item.m_Rect; - ItemRect.Margin(Margin / 2, &ItemRect); - if(!Item.m_Visible) - continue; - - CUIRect TextureRect; - ItemRect.HSplitTop(15, &ItemRect, &TextureRect); - TextureRect.HSplitTop(10, NULL, &TextureRect); - Ui()->DoLabel(&ItemRect, pItem->m_aName, ItemRect.h - 2, TEXTALIGN_MC); - if(pItem->m_RenderTexture.IsValid()) - { - Graphics()->WrapClamp(); - Graphics()->TextureSet(pItem->m_RenderTexture); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1, 1, 1, 1); - IGraphics::CQuadItem QuadItem(TextureRect.x + (TextureRect.w - TextureWidth) / 2, TextureRect.y + (TextureRect.h - TextureHeight) / 2, TextureWidth, TextureHeight); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); - Graphics()->WrapNormal(); - } - } - - const int NewSelected = s_ListBox.DoEnd(); - if(OldSelected != NewSelected) - { - if(GetCustomItem(s_CurCustomTab, NewSelected)->m_aName[0] != '\0') - { - if(s_CurCustomTab == ASSETS_TAB_ENTITIES) - { - str_copy(g_Config.m_ClAssetsEntities, GetCustomItem(s_CurCustomTab, NewSelected)->m_aName); - m_pClient->m_MapImages.ChangeEntitiesPath(GetCustomItem(s_CurCustomTab, NewSelected)->m_aName); - } - else if(s_CurCustomTab == ASSETS_TAB_GAME) - { - str_copy(g_Config.m_ClAssetGame, GetCustomItem(s_CurCustomTab, NewSelected)->m_aName); - GameClient()->LoadGameSkin(g_Config.m_ClAssetGame); - } - else if(s_CurCustomTab == ASSETS_TAB_EMOTICONS) - { - str_copy(g_Config.m_ClAssetEmoticons, GetCustomItem(s_CurCustomTab, NewSelected)->m_aName); - GameClient()->LoadEmoticonsSkin(g_Config.m_ClAssetEmoticons); - } - else if(s_CurCustomTab == ASSETS_TAB_PARTICLES) - { - str_copy(g_Config.m_ClAssetParticles, GetCustomItem(s_CurCustomTab, NewSelected)->m_aName); - GameClient()->LoadParticlesSkin(g_Config.m_ClAssetParticles); - } - else if(s_CurCustomTab == ASSETS_TAB_HUD) - { - str_copy(g_Config.m_ClAssetHud, GetCustomItem(s_CurCustomTab, NewSelected)->m_aName); - GameClient()->LoadHudSkin(g_Config.m_ClAssetHud); - } - else if(s_CurCustomTab == ASSETS_TAB_EXTRAS) - { - str_copy(g_Config.m_ClAssetExtras, GetCustomItem(s_CurCustomTab, NewSelected)->m_aName); - GameClient()->LoadExtrasSkin(g_Config.m_ClAssetExtras); - } - } - } - - // Quick search - MainView.HSplitBottom(ms_ButtonHeight, &MainView, &QuickSearch); - QuickSearch.VSplitLeft(220.0f, &QuickSearch, &DirectoryButton); - QuickSearch.HSplitTop(5.0f, nullptr, &QuickSearch); - if(Ui()->DoEditBox_Search(&s_aFilterInputs[s_CurCustomTab], &QuickSearch, 14.0f, !Ui()->IsPopupOpen() && m_pClient->m_GameConsole.IsClosed())) - { - gs_aInitCustomList[s_CurCustomTab] = true; - } - - DirectoryButton.HSplitTop(5.0f, 0, &DirectoryButton); - DirectoryButton.VSplitRight(175.0f, 0, &DirectoryButton); - DirectoryButton.VSplitRight(25.0f, &DirectoryButton, &ReloadButton); - DirectoryButton.VSplitRight(10.0f, &DirectoryButton, 0); - static CButtonContainer s_AssetsDirId; - if(DoButton_Menu(&s_AssetsDirId, Localize("Assets directory"), 0, &DirectoryButton)) - { - char aBuf[IO_MAX_PATH_LENGTH]; - char aBufFull[IO_MAX_PATH_LENGTH + 7]; - if(s_CurCustomTab == ASSETS_TAB_ENTITIES) - str_copy(aBufFull, "assets/entities"); - else if(s_CurCustomTab == ASSETS_TAB_GAME) - str_copy(aBufFull, "assets/game"); - else if(s_CurCustomTab == ASSETS_TAB_EMOTICONS) - str_copy(aBufFull, "assets/emoticons"); - else if(s_CurCustomTab == ASSETS_TAB_PARTICLES) - str_copy(aBufFull, "assets/particles"); - else if(s_CurCustomTab == ASSETS_TAB_HUD) - str_copy(aBufFull, "assets/hud"); - else if(s_CurCustomTab == ASSETS_TAB_EXTRAS) - str_copy(aBufFull, "assets/extras"); - Storage()->GetCompletePath(IStorage::TYPE_SAVE, aBufFull, aBuf, sizeof(aBuf)); - Storage()->CreateFolder("assets", IStorage::TYPE_SAVE); - Storage()->CreateFolder(aBufFull, IStorage::TYPE_SAVE); - Client()->ViewFile(aBuf); - } - GameClient()->m_Tooltips.DoToolTip(&s_AssetsDirId, &DirectoryButton, Localize("Open the directory to add custom assets")); - - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - static CButtonContainer s_AssetsReloadBtnId; - if(DoButton_Menu(&s_AssetsReloadBtnId, FONT_ICON_ARROW_ROTATE_RIGHT, 0, &ReloadButton) || Input()->KeyPress(KEY_F5) || (Input()->KeyPress(KEY_R) && Input()->ModifierIsPressed())) - { - ClearCustomItems(s_CurCustomTab); - } - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); -} - -void CMenus::ConchainAssetsEntities(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - CMenus *pThis = (CMenus *)pUserData; - if(pResult->NumArguments() == 1) - { - const char *pArg = pResult->GetString(0); - if(str_comp(pArg, g_Config.m_ClAssetsEntities) != 0) - { - pThis->m_pClient->m_MapImages.ChangeEntitiesPath(pArg); - } - } - - pfnCallback(pResult, pCallbackUserData); -} - -void CMenus::ConchainAssetGame(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - CMenus *pThis = (CMenus *)pUserData; - if(pResult->NumArguments() == 1) - { - const char *pArg = pResult->GetString(0); - if(str_comp(pArg, g_Config.m_ClAssetGame) != 0) - { - pThis->GameClient()->LoadGameSkin(pArg); - } - } - - pfnCallback(pResult, pCallbackUserData); -} - -void CMenus::ConchainAssetParticles(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - CMenus *pThis = (CMenus *)pUserData; - if(pResult->NumArguments() == 1) - { - const char *pArg = pResult->GetString(0); - if(str_comp(pArg, g_Config.m_ClAssetParticles) != 0) - { - pThis->GameClient()->LoadParticlesSkin(pArg); - } - } - - pfnCallback(pResult, pCallbackUserData); -} - -void CMenus::ConchainAssetEmoticons(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - CMenus *pThis = (CMenus *)pUserData; - if(pResult->NumArguments() == 1) - { - const char *pArg = pResult->GetString(0); - if(str_comp(pArg, g_Config.m_ClAssetEmoticons) != 0) - { - pThis->GameClient()->LoadEmoticonsSkin(pArg); - } - } - - pfnCallback(pResult, pCallbackUserData); -} - -void CMenus::ConchainAssetHud(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - CMenus *pThis = (CMenus *)pUserData; - if(pResult->NumArguments() == 1) - { - const char *pArg = pResult->GetString(0); - if(str_comp(pArg, g_Config.m_ClAssetHud) != 0) - { - pThis->GameClient()->LoadHudSkin(pArg); - } - } - - pfnCallback(pResult, pCallbackUserData); -} - -void CMenus::ConchainAssetExtras(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - CMenus *pThis = (CMenus *)pUserData; - if(pResult->NumArguments() == 1) - { - const char *pArg = pResult->GetString(0); - if(str_comp(pArg, g_Config.m_ClAssetExtras) != 0) - { - pThis->GameClient()->LoadExtrasSkin(pArg); - } - } - - pfnCallback(pResult, pCallbackUserData); -} diff --git a/src/game/client/components/menus_start.cpp b/src/game/client/components/menus_start.cpp deleted file mode 100644 index 3ba49b2c8f..0000000000 --- a/src/game/client/components/menus_start.cpp +++ /dev/null @@ -1,321 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include -#include -#include - -#include "menus.h" - -#if defined(CONF_PLATFORM_ANDROID) -#include -#endif - -using namespace FontIcons; - -void CMenus::RenderStartMenu(CUIRect MainView) -{ - GameClient()->m_MenuBackground.ChangePosition(CMenuBackground::POS_START); - - // render logo - Graphics()->TextureSet(g_pData->m_aImages[IMAGE_BANNER].m_Id); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1, 1, 1, 1); - IGraphics::CQuadItem QuadItem(MainView.w / 2 - 170, 60, 360, 103); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); - - const float Rounding = 10.0f; - const float VMargin = MainView.w / 2 - 190.0f; - - CUIRect Button; - int NewPage = -1; - - CUIRect ExtMenu; - MainView.VSplitLeft(30.0f, 0, &ExtMenu); - ExtMenu.VSplitLeft(100.0f, &ExtMenu, 0); - - ExtMenu.HSplitBottom(20.0f, &ExtMenu, &Button); - static CButtonContainer s_DiscordButton; - if(DoButton_Menu(&s_DiscordButton, Localize("Discord"), 0, &Button, 0, IGraphics::CORNER_ALL, 5.0f, 0.0f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f))) - { - Client()->ViewLink(Localize("https://ddnet.org/discord")); - } - - ExtMenu.HSplitBottom(5.0f, &ExtMenu, 0); // little space - ExtMenu.HSplitBottom(20.0f, &ExtMenu, &Button); - static CButtonContainer s_LearnButton; - if(DoButton_Menu(&s_LearnButton, Localize("Learn"), 0, &Button, 0, IGraphics::CORNER_ALL, 5.0f, 0.0f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f))) - { - Client()->ViewLink(Localize("https://wiki.ddnet.org/")); - } - - ExtMenu.HSplitBottom(5.0f, &ExtMenu, 0); // little space - ExtMenu.HSplitBottom(20.0f, &ExtMenu, &Button); - static CButtonContainer s_TutorialButton; - static float s_JoinTutorialTime = 0.0f; - if(DoButton_Menu(&s_TutorialButton, Localize("Tutorial"), 0, &Button, 0, IGraphics::CORNER_ALL, 5.0f, 0.0f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f)) || - (s_JoinTutorialTime != 0.0f && Client()->LocalTime() >= s_JoinTutorialTime)) - { - // Activate internet tab before joining tutorial to make sure the server info - // for the tutorial servers is available. - SetMenuPage(PAGE_INTERNET); - RefreshBrowserTab(true); - const char *pAddr = ServerBrowser()->GetTutorialServer(); - if(pAddr) - { - Client()->Connect(pAddr); - s_JoinTutorialTime = 0.0f; - } - else if(s_JoinTutorialTime == 0.0f) - { - dbg_msg("menus", "couldn't find tutorial server, retrying in 5 seconds"); - s_JoinTutorialTime = Client()->LocalTime() + 5.0f; - } - else - { - Client()->AddWarning(SWarning(Localize("Can't find a Tutorial server"))); - s_JoinTutorialTime = 0.0f; - } - } - - ExtMenu.HSplitBottom(5.0f, &ExtMenu, 0); // little space - ExtMenu.HSplitBottom(20.0f, &ExtMenu, &Button); - static CButtonContainer s_WebsiteButton; - if(DoButton_Menu(&s_WebsiteButton, Localize("Website"), 0, &Button, 0, IGraphics::CORNER_ALL, 5.0f, 0.0f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f))) - { - Client()->ViewLink("https://ddnet.org/"); - } - - ExtMenu.HSplitBottom(5.0f, &ExtMenu, 0); // little space - ExtMenu.HSplitBottom(20.0f, &ExtMenu, &Button); - static CButtonContainer s_NewsButton; - if(DoButton_Menu(&s_NewsButton, Localize("News"), 0, &Button, 0, IGraphics::CORNER_ALL, 5.0f, 0.0f, g_Config.m_UiUnreadNews ? ColorRGBA(0.0f, 1.0f, 0.0f, 0.25f) : ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f)) || CheckHotKey(KEY_N)) - NewPage = PAGE_NEWS; - - CUIRect Menu; - MainView.VMargin(VMargin, &Menu); - Menu.HSplitBottom(25.0f, &Menu, 0); - - Menu.HSplitBottom(40.0f, &Menu, &Button); - static CButtonContainer s_QuitButton; - bool UsedEscape = false; - if(DoButton_Menu(&s_QuitButton, Localize("Quit"), 0, &Button, 0, IGraphics::CORNER_ALL, Rounding, 0.5f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f)) || (UsedEscape = Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) || CheckHotKey(KEY_Q)) - { - if(UsedEscape || m_pClient->Editor()->HasUnsavedData() || (GameClient()->CurrentRaceTime() / 60 >= g_Config.m_ClConfirmQuitTime && g_Config.m_ClConfirmQuitTime >= 0)) - { - m_Popup = POPUP_QUIT; - } - else - { - Client()->Quit(); - } - } - - Menu.HSplitBottom(100.0f, &Menu, 0); - Menu.HSplitBottom(40.0f, &Menu, &Button); - static CButtonContainer s_SettingsButton; - if(DoButton_Menu(&s_SettingsButton, Localize("Settings"), 0, &Button, g_Config.m_ClShowStartMenuImages ? "settings" : 0, IGraphics::CORNER_ALL, Rounding, 0.5f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f)) || CheckHotKey(KEY_S)) - NewPage = PAGE_SETTINGS; - - Menu.HSplitBottom(5.0f, &Menu, 0); // little space - Menu.HSplitBottom(40.0f, &Menu, &Button); - static CButtonContainer s_LocalServerButton; - -#if !defined(CONF_PLATFORM_ANDROID) - if(!is_process_alive(m_ServerProcess.m_Process)) - KillServer(); -#endif - - if(DoButton_Menu(&s_LocalServerButton, IsServerRunning() ? Localize("Stop server") : Localize("Run server"), 0, &Button, g_Config.m_ClShowStartMenuImages ? "local_server" : 0, IGraphics::CORNER_ALL, Rounding, 0.5f, IsServerRunning() ? ColorRGBA(0.0f, 1.0f, 0.0f, 0.25f) : ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f)) || (CheckHotKey(KEY_R) && Input()->KeyPress(KEY_R))) - { - if(IsServerRunning()) - { - KillServer(); - } - else - { - RunServer(); - } - } - - Menu.HSplitBottom(5.0f, &Menu, 0); // little space - Menu.HSplitBottom(40.0f, &Menu, &Button); - static CButtonContainer s_MapEditorButton; - if(DoButton_Menu(&s_MapEditorButton, Localize("Editor"), 0, &Button, g_Config.m_ClShowStartMenuImages ? "editor" : 0, IGraphics::CORNER_ALL, Rounding, 0.5f, m_pClient->Editor()->HasUnsavedData() ? ColorRGBA(0.0f, 1.0f, 0.0f, 0.25f) : ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f)) || CheckHotKey(KEY_E)) - { - g_Config.m_ClEditor = 1; - Input()->MouseModeRelative(); - } - - Menu.HSplitBottom(5.0f, &Menu, 0); // little space - Menu.HSplitBottom(40.0f, &Menu, &Button); - static CButtonContainer s_DemoButton; - if(DoButton_Menu(&s_DemoButton, Localize("Demos"), 0, &Button, g_Config.m_ClShowStartMenuImages ? "demos" : 0, IGraphics::CORNER_ALL, Rounding, 0.5f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f)) || CheckHotKey(KEY_D)) - { - NewPage = PAGE_DEMOS; - } - - Menu.HSplitBottom(5.0f, &Menu, 0); // little space - Menu.HSplitBottom(40.0f, &Menu, &Button); - static CButtonContainer s_PlayButton; - if(DoButton_Menu(&s_PlayButton, Localize("Play", "Start menu"), 0, &Button, g_Config.m_ClShowStartMenuImages ? "play_game" : 0, IGraphics::CORNER_ALL, Rounding, 0.5f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f)) || Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER) || CheckHotKey(KEY_P)) - { - NewPage = g_Config.m_UiPage >= PAGE_INTERNET && g_Config.m_UiPage <= PAGE_FAVORITE_COMMUNITY_5 ? g_Config.m_UiPage : PAGE_INTERNET; - } - - // render version - CUIRect CurVersion, ConsoleButton; - MainView.HSplitBottom(45.0f, nullptr, &CurVersion); - CurVersion.VSplitRight(40.0f, &CurVersion, nullptr); - CurVersion.HSplitTop(20.0f, &ConsoleButton, &CurVersion); - CurVersion.HSplitTop(5.0f, nullptr, &CurVersion); - ConsoleButton.VSplitRight(40.0f, nullptr, &ConsoleButton); - Ui()->DoLabel(&CurVersion, GAME_RELEASE_VERSION, 14.0f, TEXTALIGN_MR); - - static CButtonContainer s_ConsoleButton; - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - if(DoButton_Menu(&s_ConsoleButton, FONT_ICON_TERMINAL, 0, &ConsoleButton, nullptr, IGraphics::CORNER_ALL, 5.0f, 0.0f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.1f))) - { - GameClient()->m_GameConsole.Toggle(CGameConsole::CONSOLETYPE_LOCAL); - } - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - - CUIRect VersionUpdate; - MainView.HSplitBottom(20.0f, nullptr, &VersionUpdate); - VersionUpdate.VMargin(VMargin, &VersionUpdate); -#if defined(CONF_AUTOUPDATE) - CUIRect UpdateButton; - VersionUpdate.VSplitRight(100.0f, &VersionUpdate, &UpdateButton); - VersionUpdate.VSplitRight(10.0f, &VersionUpdate, nullptr); - - char aBuf[128]; - const IUpdater::EUpdaterState State = Updater()->GetCurrentState(); - const bool NeedUpdate = str_comp(Client()->LatestVersion(), "0"); - - if(State == IUpdater::CLEAN && NeedUpdate) - { - static CButtonContainer s_VersionUpdate; - if(DoButton_Menu(&s_VersionUpdate, Localize("Update now"), 0, &UpdateButton, 0, IGraphics::CORNER_ALL, 5.0f, 0.0f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f))) - { - Updater()->InitiateUpdate(); - } - } - else if(State == IUpdater::NEED_RESTART) - { - static CButtonContainer s_VersionUpdate; - if(DoButton_Menu(&s_VersionUpdate, Localize("Restart"), 0, &UpdateButton, 0, IGraphics::CORNER_ALL, 5.0f, 0.0f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f))) - { - Client()->Restart(); - } - } - else if(State >= IUpdater::GETTING_MANIFEST && State < IUpdater::NEED_RESTART) - { - Ui()->RenderProgressBar(UpdateButton, Updater()->GetCurrentPercent() / 100.0f); - } - - if(State == IUpdater::CLEAN && NeedUpdate) - { - str_format(aBuf, sizeof(aBuf), Localize("DDNet %s is out!"), Client()->LatestVersion()); - TextRender()->TextColor(1.0f, 0.4f, 0.4f, 1.0f); - } - else if(State == IUpdater::CLEAN) - { - aBuf[0] = '\0'; - } - else if(State >= IUpdater::GETTING_MANIFEST && State < IUpdater::NEED_RESTART) - { - char aCurrentFile[64]; - Updater()->GetCurrentFile(aCurrentFile, sizeof(aCurrentFile)); - str_format(aBuf, sizeof(aBuf), Localize("Downloading %s:"), aCurrentFile); - } - else if(State == IUpdater::FAIL) - { - str_copy(aBuf, Localize("Update failed! Check log…")); - TextRender()->TextColor(1.0f, 0.4f, 0.4f, 1.0f); - } - else if(State == IUpdater::NEED_RESTART) - { - str_copy(aBuf, Localize("DDNet Client updated!")); - TextRender()->TextColor(1.0f, 0.4f, 0.4f, 1.0f); - } - Ui()->DoLabel(&VersionUpdate, aBuf, 14.0f, TEXTALIGN_ML); - TextRender()->TextColor(TextRender()->DefaultTextColor()); -#elif defined(CONF_INFORM_UPDATE) - if(str_comp(Client()->LatestVersion(), "0") != 0) - { - char aBuf[64]; - str_format(aBuf, sizeof(aBuf), Localize("DDNet %s is out!"), Client()->LatestVersion()); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - Ui()->DoLabel(&VersionUpdate, aBuf, 14.0f, TEXTALIGN_MC); - } -#endif - - if(NewPage != -1) - { - m_ShowStart = false; - SetMenuPage(NewPage); - } -} - -void CMenus::RunServer() -{ -#if defined(CONF_PLATFORM_ANDROID) - if(StartAndroidServer()) - { - m_ForceRefreshLanPage = true; - } - else - { - Client()->AddWarning(SWarning(Localize("Server could not be started. Make sure to grant the notification permission in the app settings so the server can run in the background."))); - } -#else - char aBuf[IO_MAX_PATH_LENGTH]; - Storage()->GetBinaryPath(PLAT_SERVER_EXEC, aBuf, sizeof(aBuf)); - // No / in binary path means to search in $PATH, so it is expected that the file can't be opened. Just try executing anyway. - if(str_find(aBuf, "/") == 0 || fs_is_file(aBuf)) - { - m_ServerProcess.m_Process = shell_execute(aBuf, EShellExecuteWindowState::BACKGROUND); - m_ForceRefreshLanPage = true; - } - else - { - Client()->AddWarning(SWarning(Localize("Server executable not found, can't run server"))); - } -#endif -} - -void CMenus::KillServer() -{ -#if defined(CONF_PLATFORM_ANDROID) - ExecuteAndroidServerCommand("shutdown"); - m_ForceRefreshLanPage = true; -#else - if(m_ServerProcess.m_Process && kill_process(m_ServerProcess.m_Process)) - { - m_ServerProcess.m_Process = INVALID_PROCESS; - m_ForceRefreshLanPage = true; - } -#endif -} - -bool CMenus::IsServerRunning() const -{ -#if defined(CONF_PLATFORM_ANDROID) - return IsAndroidServerRunning(); -#else - return m_ServerProcess.m_Process != INVALID_PROCESS; -#endif -} diff --git a/src/game/client/components/motd.cpp b/src/game/client/components/motd.cpp deleted file mode 100644 index 2d90e33f7b..0000000000 --- a/src/game/client/components/motd.cpp +++ /dev/null @@ -1,145 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include -#include -#include - -#include -#include - -#include "motd.h" - -CMotd::CMotd() -{ - m_aServerMotd[0] = '\0'; - m_ServerMotdTime = 0; - m_ServerMotdUpdateTime = 0; -} - -void CMotd::Clear() -{ - m_ServerMotdTime = 0; - Graphics()->DeleteQuadContainer(m_RectQuadContainer); - TextRender()->DeleteTextContainer(m_TextContainerIndex); -} - -bool CMotd::IsActive() const -{ - return time() < m_ServerMotdTime; -} - -void CMotd::OnStateChange(int NewState, int OldState) -{ - if(OldState == IClient::STATE_ONLINE || OldState == IClient::STATE_OFFLINE) - Clear(); -} - -void CMotd::OnWindowResize() -{ - Graphics()->DeleteQuadContainer(m_RectQuadContainer); - TextRender()->DeleteTextContainer(m_TextContainerIndex); -} - -void CMotd::OnRender() -{ - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - if(!IsActive()) - return; - - const float FontSize = 32.0f; // also the size of the margin and rect rounding - const float ScreenHeight = 40.0f * FontSize; // multiple of the font size to get perfect alignment - const float ScreenWidth = ScreenHeight * Graphics()->ScreenAspect(); - Graphics()->MapScreen(0.0f, 0.0f, ScreenWidth, ScreenHeight); - - const float RectHeight = 26.0f * FontSize; - const float RectWidth = 630.0f + 2.0f * FontSize; - const float RectX = ScreenWidth / 2.0f - RectWidth / 2.0f; - const float RectY = 160.0f; - - if(m_RectQuadContainer == -1) - { - Graphics()->SetColor(0.0f, 0.0f, 0.0f, 0.5f); - m_RectQuadContainer = Graphics()->CreateRectQuadContainer(RectX, RectY, RectWidth, RectHeight, FontSize, IGraphics::CORNER_ALL); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - } - - if(m_RectQuadContainer != -1) - { - Graphics()->TextureClear(); - Graphics()->RenderQuadContainer(m_RectQuadContainer, -1); - } - - const float TextWidth = RectWidth - 2.0f * FontSize; - const float TextX = RectX + FontSize; - const float TextY = RectY + FontSize; - - if(!m_TextContainerIndex.Valid()) - { - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, TextX, TextY, FontSize, TEXTFLAG_RENDER); - Cursor.m_LineWidth = TextWidth; - TextRender()->CreateTextContainer(m_TextContainerIndex, &Cursor, ServerMotd()); - } - - if(m_TextContainerIndex.Valid()) - TextRender()->RenderTextContainer(m_TextContainerIndex, TextRender()->DefaultTextColor(), TextRender()->DefaultTextOutlineColor()); -} - -void CMotd::OnMessage(int MsgType, void *pRawMsg) -{ - if(Client()->State() == IClient::STATE_DEMOPLAYBACK) - return; - - if(MsgType == NETMSGTYPE_SV_MOTD) - { - const CNetMsg_Sv_Motd *pMsg = static_cast(pRawMsg); - - // copy it manually to process all \n - const char *pMsgStr = pMsg->m_pMessage; - const size_t MotdLen = str_length(pMsgStr) + 1; - const char *pLast = m_aServerMotd; // for console printing - for(size_t i = 0, k = 0; i < MotdLen && k < sizeof(m_aServerMotd); i++, k++) - { - // handle incoming "\\n" - if(pMsgStr[i] == '\\' && pMsgStr[i + 1] == 'n') - { - m_aServerMotd[k] = '\n'; - i++; // skip the 'n' - } - else - m_aServerMotd[k] = pMsgStr[i]; - - // print the line to the console when receiving the newline character - if(g_Config.m_ClPrintMotd && m_aServerMotd[k] == '\n') - { - m_aServerMotd[k] = '\0'; - m_pClient->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "motd", pLast, color_cast(ColorHSLA(g_Config.m_ClMessageHighlightColor))); - m_aServerMotd[k] = '\n'; - pLast = m_aServerMotd + k + 1; - } - } - m_aServerMotd[sizeof(m_aServerMotd) - 1] = '\0'; - if(g_Config.m_ClPrintMotd && *pLast != '\0') - m_pClient->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "motd", pLast, color_cast(ColorHSLA(g_Config.m_ClMessageHighlightColor))); - - m_ServerMotdUpdateTime = time(); - if(m_aServerMotd[0] && g_Config.m_ClMotdTime) - m_ServerMotdTime = m_ServerMotdUpdateTime + time_freq() * g_Config.m_ClMotdTime; - else - m_ServerMotdTime = 0; - TextRender()->DeleteTextContainer(m_TextContainerIndex); - } -} - -bool CMotd::OnInput(const IInput::CEvent &Event) -{ - if(IsActive() && Event.m_Flags & IInput::FLAG_PRESS && Event.m_Key == KEY_ESCAPE) - { - Clear(); - return true; - } - return false; -} diff --git a/src/game/client/components/motd.h b/src/game/client/components/motd.h deleted file mode 100644 index cd110b2dcf..0000000000 --- a/src/game/client/components/motd.h +++ /dev/null @@ -1,35 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_MOTD_H -#define GAME_CLIENT_COMPONENTS_MOTD_H - -#include -#include - -#include - -class CMotd : public CComponent -{ - char m_aServerMotd[std::size(g_Config.m_SvMotd)]; - int64_t m_ServerMotdTime; - int64_t m_ServerMotdUpdateTime; - int m_RectQuadContainer = -1; - STextContainerIndex m_TextContainerIndex; - -public: - CMotd(); - virtual int Sizeof() const override { return sizeof(*this); } - - const char *ServerMotd() const { return m_aServerMotd; } - int64_t ServerMotdUpdateTime() const { return m_ServerMotdUpdateTime; } - void Clear(); - bool IsActive() const; - - virtual void OnRender() override; - virtual void OnStateChange(int NewState, int OldState) override; - virtual void OnWindowResize() override; - virtual void OnMessage(int MsgType, void *pRawMsg) override; - virtual bool OnInput(const IInput::CEvent &Event) override; -}; - -#endif diff --git a/src/game/client/components/nameplates.cpp b/src/game/client/components/nameplates.cpp deleted file mode 100644 index f6d8cf710c..0000000000 --- a/src/game/client/components/nameplates.cpp +++ /dev/null @@ -1,454 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include -#include - -#include -#include - -#include -#include - -#include "camera.h" -#include "controls.h" -#include "nameplates.h" - -void CNamePlate::CNamePlateName::Update(CNamePlates &This, int Id, const char *pName, bool FriendMark, float FontSize) -{ - if(Id == m_Id && - str_comp(m_aName, pName) == 0 && - m_FriendMark == FriendMark && m_FontSize == FontSize) - return; - m_Id = Id; - str_copy(m_aName, pName); - m_FriendMark = FriendMark; - m_FontSize = FontSize; - - // create namePlates at standard zoom - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - This.Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - This.RenderTools()->MapScreenToInterface(This.m_pClient->m_Camera.m_Center.x, This.m_pClient->m_Camera.m_Center.y); - - CTextCursor Cursor; - This.TextRender()->SetCursor(&Cursor, 0.0f, 0.0f, FontSize, TEXTFLAG_RENDER); - This.TextRender()->DeleteTextContainer(m_TextContainerIndex); - if(m_FriendMark) - { - This.TextRender()->TextColor(ColorRGBA(1.0f, 0.0f, 0.0f, 1.0f)); - This.TextRender()->CreateOrAppendTextContainer(m_TextContainerIndex, &Cursor, "♥"); - } - This.TextRender()->TextColor(ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f)); - char aBuf[16] = ""; - if(Id >= 0 && pName[0] != '\0' && FriendMark) - str_format(aBuf, sizeof(aBuf), " %d: ", Id); - else if(Id >= 0 && pName[0] != '\0') - str_format(aBuf, sizeof(aBuf), "%d: ", Id); - else if(Id >= 0 && FriendMark) - str_format(aBuf, sizeof(aBuf), " %d", Id); - else if(FriendMark && pName[0] != '\0') - str_copy(aBuf, " ", sizeof(aBuf)); - if(aBuf[0] != '\0') - This.TextRender()->CreateOrAppendTextContainer(m_TextContainerIndex, &Cursor, aBuf); - if(pName[0] != '\0') - This.TextRender()->CreateOrAppendTextContainer(m_TextContainerIndex, &Cursor, pName); - - This.Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); -} - -void CNamePlate::CNamePlateClan::Update(CNamePlates &This, const char *pClan, float FontSize) -{ - if(str_comp(m_aClan, pClan) == 0 && - m_FontSize == FontSize) - return; - str_copy(m_aClan, pClan); - m_FontSize = FontSize; - - // create namePlates at standard zoom - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - This.Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - This.RenderTools()->MapScreenToInterface(This.m_pClient->m_Camera.m_Center.x, This.m_pClient->m_Camera.m_Center.y); - - CTextCursor Cursor; - This.TextRender()->SetCursor(&Cursor, 0.0f, 0.0f, FontSize, TEXTFLAG_RENDER); - This.TextRender()->RecreateTextContainer(m_TextContainerIndex, &Cursor, m_aClan); - - This.Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); -} - -void CNamePlate::CNamePlateHookWeakStrongId::Update(CNamePlates &This, int Id, float FontSize) -{ - if(Id == m_Id && m_FontSize == FontSize) - return; - m_Id = Id; - m_FontSize = FontSize; - - // create namePlates at standard zoom - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - This.Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - This.RenderTools()->MapScreenToInterface(This.m_pClient->m_Camera.m_Center.x, This.m_pClient->m_Camera.m_Center.y); - - char aBuf[8]; - str_format(aBuf, sizeof(aBuf), "%d", m_Id); - - CTextCursor Cursor; - This.TextRender()->SetCursor(&Cursor, 0.0f, 0.0f, FontSize, TEXTFLAG_RENDER); - This.TextRender()->RecreateTextContainer(m_TextContainerIndex, &Cursor, aBuf); - - This.Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); -} - -void CNamePlates::RenderNamePlate(CNamePlate &NamePlate, const CRenderNamePlateData &Data) -{ - ColorRGBA OutlineColor = Data.m_OutlineColor.WithAlpha(Data.m_Alpha / 2.0f); - ColorRGBA Color = Data.m_Color.WithAlpha(Data.m_Alpha); - - float YOffset = Data.m_Position.y - 38.0f; - - // Render directions - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_NO_FIRST_CHARACTER_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_LAST_CHARACTER_ADVANCE); - if(Data.m_ShowDirection) - { - Graphics()->SetColor(1.0f, 1.0f, 1.0f, Data.m_Alpha); - YOffset -= Data.m_FontSizeDirection; - const vec2 ShowDirectionPos = vec2(Data.m_Position.x - Data.m_FontSizeDirection / 2.0f, YOffset + Data.m_FontSizeDirection / 2.0f); - if(Data.m_DirLeft) - { - Graphics()->TextureSet(g_pData->m_aImages[IMAGE_ARROW].m_Id); - Graphics()->QuadsSetRotation(pi); - Graphics()->RenderQuadContainerAsSprite(m_DirectionQuadContainerIndex, 0, ShowDirectionPos.x - Data.m_FontSizeDirection, ShowDirectionPos.y, Data.m_FontSizeDirection, Data.m_FontSizeDirection); - } - if(Data.m_DirJump) - { - Graphics()->TextureSet(g_pData->m_aImages[IMAGE_ARROW].m_Id); - Graphics()->QuadsSetRotation(pi * 1.5f); - Graphics()->RenderQuadContainerAsSprite(m_DirectionQuadContainerIndex, 0, ShowDirectionPos.x, ShowDirectionPos.y - Data.m_FontSizeDirection / 2.0f, Data.m_FontSizeDirection, Data.m_FontSizeDirection); - } - if(Data.m_DirRight) - { - Graphics()->TextureSet(g_pData->m_aImages[IMAGE_ARROW].m_Id); - Graphics()->QuadsSetRotation(0.0f); - Graphics()->RenderQuadContainerAsSprite(m_DirectionQuadContainerIndex, 0, ShowDirectionPos.x + Data.m_FontSizeDirection, ShowDirectionPos.y, Data.m_FontSizeDirection, Data.m_FontSizeDirection); - } - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - Graphics()->QuadsSetRotation(0.0f); - } - - if((Data.m_pName && Data.m_pName[0] != '\0') || Data.m_ClientId >= 0 || Data.m_ShowFriendMark) - { - YOffset -= Data.m_FontSize; - NamePlate.m_Name.Update(*this, Data.m_ClientId, Data.m_pName, Data.m_ShowFriendMark, Data.m_FontSize); - if(NamePlate.m_Name.m_TextContainerIndex.Valid()) - TextRender()->RenderTextContainer(NamePlate.m_Name.m_TextContainerIndex, Color, OutlineColor, Data.m_Position.x - TextRender()->GetBoundingBoxTextContainer(NamePlate.m_Name.m_TextContainerIndex).m_W / 2.0f, YOffset); - } - if(Data.m_pClan && Data.m_pClan[0] != '\0') - { - YOffset -= Data.m_FontSizeClan; - NamePlate.m_Clan.Update(*this, Data.m_pClan, Data.m_FontSizeClan); - if(NamePlate.m_Clan.m_TextContainerIndex.Valid()) - TextRender()->RenderTextContainer(NamePlate.m_Clan.m_TextContainerIndex, Color, OutlineColor, Data.m_Position.x - TextRender()->GetBoundingBoxTextContainer(NamePlate.m_Clan.m_TextContainerIndex).m_W / 2.0f, YOffset); - } - - if(Data.m_ShowHookWeakStrongId || (Data.m_ShowHookWeakStrong && Data.m_HookWeakStrong != TRISTATE::SOME)) // Don't show hook icon if there's no ID or hook strength to show - { - ColorRGBA HookWeakStrongColor; - int StrongWeakSpriteId; - switch(Data.m_HookWeakStrong) - { - case TRISTATE::ALL: - HookWeakStrongColor = color_cast(ColorHSLA(6401973)); - StrongWeakSpriteId = SPRITE_HOOK_STRONG; - break; - case TRISTATE::SOME: - HookWeakStrongColor = ColorRGBA(1.0f, 1.0f, 1.0f); - StrongWeakSpriteId = SPRITE_HOOK_ICON; - break; - case TRISTATE::NONE: - HookWeakStrongColor = color_cast(ColorHSLA(41131)); - StrongWeakSpriteId = SPRITE_HOOK_WEAK; - break; - default: - dbg_assert(false, "Invalid hook weak/strong state"); - dbg_break(); - } - HookWeakStrongColor.a = Data.m_Alpha; - - YOffset -= Data.m_FontSizeHookWeakStrong; - float ShowHookWeakStrongIdSize = 0.0f; - if(Data.m_ShowHookWeakStrongId) - { - NamePlate.m_WeakStrongId.Update(*this, Data.m_HookWeakStrongId, Data.m_FontSizeHookWeakStrong); - if(NamePlate.m_WeakStrongId.m_TextContainerIndex.Valid()) - { - ShowHookWeakStrongIdSize = TextRender()->GetBoundingBoxTextContainer(NamePlate.m_WeakStrongId.m_TextContainerIndex).m_W; - float X = Data.m_Position.x - ShowHookWeakStrongIdSize / 2.0f; - if(Data.m_ShowHookWeakStrong) - X += Data.m_FontSizeHookWeakStrong * 0.75f; - TextRender()->TextColor(HookWeakStrongColor); - TextRender()->RenderTextContainer(NamePlate.m_WeakStrongId.m_TextContainerIndex, HookWeakStrongColor, OutlineColor, X, YOffset); - } - } - if(Data.m_ShowHookWeakStrong) - { - Graphics()->TextureSet(g_pData->m_aImages[IMAGE_STRONGWEAK].m_Id); - Graphics()->QuadsBegin(); - - Graphics()->SetColor(HookWeakStrongColor); - RenderTools()->SelectSprite(StrongWeakSpriteId); - - const float StrongWeakImgSize = Data.m_FontSizeHookWeakStrong * 1.5f; - float X = Data.m_Position.x; - if(Data.m_ShowHookWeakStrongId) - X -= ShowHookWeakStrongIdSize / 2.0f; - RenderTools()->DrawSprite(X, YOffset + StrongWeakImgSize / 2.7f, StrongWeakImgSize); - Graphics()->QuadsEnd(); - } - } - - TextRender()->TextColor(TextRender()->DefaultTextColor()); - TextRender()->TextOutlineColor(TextRender()->DefaultTextOutlineColor()); - - TextRender()->SetRenderFlags(0); -} - -void CNamePlates::RenderNamePlateGame(vec2 Position, const CNetObj_PlayerInfo *pPlayerInfo, float Alpha, bool ForceAlpha) -{ - CRenderNamePlateData Data; - - const auto &ClientData = m_pClient->m_aClients[pPlayerInfo->m_ClientId]; - const bool OtherTeam = m_pClient->IsOtherTeam(pPlayerInfo->m_ClientId); - - bool ShowNamePlate = pPlayerInfo->m_Local ? g_Config.m_ClNamePlatesOwn : g_Config.m_ClNamePlates; - - Data.m_Position = Position; - Data.m_ClientId = ShowNamePlate && g_Config.m_ClNamePlatesIds ? pPlayerInfo->m_ClientId : -1; - Data.m_pName = ShowNamePlate ? m_pClient->m_aClients[pPlayerInfo->m_ClientId].m_aName : nullptr; - Data.m_ShowFriendMark = ShowNamePlate && g_Config.m_ClNamePlatesFriendMark && m_pClient->m_aClients[pPlayerInfo->m_ClientId].m_Friend; - Data.m_FontSize = 18.0f + 20.0f * g_Config.m_ClNamePlatesSize / 100.0f; - - Data.m_pClan = ShowNamePlate && g_Config.m_ClNamePlatesClan ? m_pClient->m_aClients[pPlayerInfo->m_ClientId].m_aClan : nullptr; - Data.m_FontSizeClan = 18.0f + 20.0f * g_Config.m_ClNamePlatesClanSize / 100.0f; - - Data.m_FontSizeHookWeakStrong = 18.0f + 20.0f * g_Config.m_ClNamePlatesStrongSize / 100.0f; - Data.m_FontSizeDirection = 18.0f + 20.0f * g_Config.m_ClDirectionSize / 100.0f; - - Data.m_Alpha = Alpha; - if(!ForceAlpha) - { - if(g_Config.m_ClNamePlatesAlways == 0) - Data.m_Alpha *= clamp(1.0f - std::pow(distance(m_pClient->m_Controls.m_aTargetPos[g_Config.m_ClDummy], Position) / 200.0f, 16.0f), 0.0f, 1.0f); - if(OtherTeam) - Data.m_Alpha *= (float)g_Config.m_ClShowOthersAlpha / 100.0f; - } - - Data.m_Color = ColorRGBA(1.0f, 1.0f, 1.0f); - Data.m_OutlineColor = ColorRGBA(0.0f, 0.0f, 0.0f); - - if(g_Config.m_ClNamePlatesTeamcolors) - { - if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS) - { - if(ClientData.m_Team == TEAM_RED) - Data.m_Color = ColorRGBA(1.0f, 0.5f, 0.5f); - else if(ClientData.m_Team == TEAM_BLUE) - Data.m_Color = ColorRGBA(0.7f, 0.7f, 1.0f); - } - else - { - const int Team = m_pClient->m_Teams.Team(pPlayerInfo->m_ClientId); - if(Team) - Data.m_Color = m_pClient->GetDDTeamColor(Team, 0.75f); - } - } - - int ShowDirectionConfig = g_Config.m_ClShowDirection; -#if defined(CONF_VIDEORECORDER) - if(IVideo::Current()) - ShowDirectionConfig = g_Config.m_ClVideoShowDirection; -#endif - Data.m_DirLeft = Data.m_DirJump = Data.m_DirRight = false; - switch(ShowDirectionConfig) - { - case 0: // off - Data.m_ShowDirection = false; - break; - case 1: // others - Data.m_ShowDirection = !pPlayerInfo->m_Local; - break; - case 2: // everyone - Data.m_ShowDirection = true; - break; - case 3: // only self - Data.m_ShowDirection = pPlayerInfo->m_Local; - break; - default: - dbg_assert(false, "ShowDirectionConfig invalid"); - dbg_break(); - } - if(Data.m_ShowDirection) - { - if(Client()->State() != IClient::STATE_DEMOPLAYBACK && - Client()->DummyConnected() && pPlayerInfo->m_ClientId == m_pClient->m_aLocalIds[!g_Config.m_ClDummy]) - { - const auto &InputData = m_pClient->m_Controls.m_aInputData[!g_Config.m_ClDummy]; - Data.m_DirLeft = InputData.m_Direction == -1; - Data.m_DirJump = InputData.m_Jump == 1; - Data.m_DirRight = InputData.m_Direction == 1; - } - else if(Client()->State() != IClient::STATE_DEMOPLAYBACK && pPlayerInfo->m_Local) // always render local input when not in demo playback - { - const auto &InputData = m_pClient->m_Controls.m_aInputData[g_Config.m_ClDummy]; - Data.m_DirLeft = InputData.m_Direction == -1; - Data.m_DirJump = InputData.m_Jump == 1; - Data.m_DirRight = InputData.m_Direction == 1; - } - else - { - const auto &Character = m_pClient->m_Snap.m_aCharacters[pPlayerInfo->m_ClientId]; - Data.m_DirLeft = Character.m_Cur.m_Direction == -1; - Data.m_DirJump = Character.m_Cur.m_Jumped & 1; - Data.m_DirRight = Character.m_Cur.m_Direction == 1; - } - } - - Data.m_ShowHookWeakStrong = g_Config.m_Debug || g_Config.m_ClNamePlatesStrong > 0; - Data.m_HookWeakStrong = TRISTATE::SOME; - Data.m_ShowHookWeakStrongId = false; - Data.m_HookWeakStrongId = false; - if(Data.m_ShowHookWeakStrong) - { - const bool Following = (m_pClient->m_Snap.m_SpecInfo.m_Active && !GameClient()->m_MultiViewActivated && m_pClient->m_Snap.m_SpecInfo.m_SpectatorId != SPEC_FREEVIEW); - if(m_pClient->m_Snap.m_LocalClientId != -1 || Following) - { - const int SelectedId = Following ? m_pClient->m_Snap.m_SpecInfo.m_SpectatorId : m_pClient->m_Snap.m_LocalClientId; - const CGameClient::CSnapState::CCharacterInfo &Selected = m_pClient->m_Snap.m_aCharacters[SelectedId]; - const CGameClient::CSnapState::CCharacterInfo &Other = m_pClient->m_Snap.m_aCharacters[pPlayerInfo->m_ClientId]; - if(Selected.m_HasExtendedData && Other.m_HasExtendedData) - { - if(SelectedId != pPlayerInfo->m_ClientId) - Data.m_HookWeakStrong = Selected.m_ExtendedData.m_StrongWeakId > Other.m_ExtendedData.m_StrongWeakId ? TRISTATE::ALL : TRISTATE::NONE; - Data.m_ShowHookWeakStrongId = g_Config.m_Debug || g_Config.m_ClNamePlatesStrong == 2; - if(Data.m_ShowHookWeakStrongId) - Data.m_HookWeakStrongId = Other.m_ExtendedData.m_StrongWeakId; - } - } - } - - GameClient()->m_NamePlates.RenderNamePlate(m_aNamePlates[pPlayerInfo->m_ClientId], Data); -} - -void CNamePlates::RenderNamePlatePreview(vec2 Position) -{ - const float FontSize = 18.0f + 20.0f * g_Config.m_ClNamePlatesSize / 100.0f; - const float FontSizeClan = 18.0f + 20.0f * g_Config.m_ClNamePlatesClanSize / 100.0f; - - const float FontSizeDirection = 18.0f + 20.0f * g_Config.m_ClDirectionSize / 100.0f; - const float FontSizeHookWeakStrong = 18.0f + 20.0f * g_Config.m_ClNamePlatesStrongSize / 100.0f; - - CRenderNamePlateData Data; - - Data.m_Position = Position; - Data.m_Color = g_Config.m_ClNamePlatesTeamcolors ? m_pClient->GetDDTeamColor(13, 0.75f) : TextRender()->DefaultTextColor(); - Data.m_OutlineColor = TextRender()->DefaultTextOutlineColor(); - Data.m_Alpha = 1.0f; - Data.m_pName = g_Config.m_ClNamePlates ? g_Config.m_PlayerName : nullptr; - Data.m_ShowFriendMark = g_Config.m_ClNamePlates && g_Config.m_ClNamePlatesFriendMark; - Data.m_ClientId = g_Config.m_ClNamePlates && g_Config.m_ClNamePlatesIds ? 1 : -1; - Data.m_FontSize = FontSize; - Data.m_pClan = g_Config.m_ClNamePlates && g_Config.m_ClNamePlatesClan ? g_Config.m_PlayerClan : nullptr; - Data.m_FontSizeClan = FontSizeClan; - - Data.m_ShowDirection = g_Config.m_ClShowDirection != 0 ? true : false; - Data.m_DirLeft = Data.m_DirJump = Data.m_DirRight = true; - Data.m_FontSizeDirection = FontSizeDirection; - - Data.m_ShowHookWeakStrong = g_Config.m_ClNamePlatesStrong >= 1; - Data.m_HookWeakStrong = TRISTATE::ALL; - Data.m_ShowHookWeakStrongId = g_Config.m_ClNamePlatesStrong >= 2; - Data.m_HookWeakStrongId = 1; - Data.m_FontSizeHookWeakStrong = FontSizeHookWeakStrong; - - CNamePlate NamePlate; - GameClient()->m_NamePlates.RenderNamePlate(NamePlate, Data); - NamePlate.DeleteTextContainers(*TextRender()); -} - -void CNamePlates::OnRender() -{ - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - int ShowDirection = g_Config.m_ClShowDirection; -#if defined(CONF_VIDEORECORDER) - if(IVideo::Current()) - ShowDirection = g_Config.m_ClVideoShowDirection; -#endif - if(!g_Config.m_ClNamePlates && ShowDirection == 0) - return; - - // get screen edges to avoid rendering offscreen - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - // expand the edges to prevent popping in/out onscreen - // - // it is assumed that the namePlate and all its components fit into a 800x800 box placed directly above the tee - // this may need to be changed or calculated differently in the future - ScreenX0 -= 400; - ScreenX1 += 400; - // ScreenY0 -= 0; - ScreenY1 += 800; - - for(int i = 0; i < MAX_CLIENTS; i++) - { - const CNetObj_PlayerInfo *pInfo = m_pClient->m_Snap.m_apPlayerInfos[i]; - if(!pInfo) - { - continue; - } - - if(m_pClient->m_aClients[i].m_SpecCharPresent) - { - // Each player can also have a spec char whose namePlate is displayed independently - const vec2 RenderPos = m_pClient->m_aClients[i].m_SpecChar; - // don't render offscreen - if(in_range(RenderPos.x, ScreenX0, ScreenX1) && in_range(RenderPos.y, ScreenY0, ScreenY1)) - { - RenderNamePlateGame(RenderPos, pInfo, 0.4f, true); - } - } - if(m_pClient->m_Snap.m_aCharacters[i].m_Active) - { - // Only render namePlates for active characters - const vec2 RenderPos = m_pClient->m_aClients[i].m_RenderPos; - // don't render offscreen - if(in_range(RenderPos.x, ScreenX0, ScreenX1) && in_range(RenderPos.y, ScreenY0, ScreenY1)) - { - RenderNamePlateGame(RenderPos, pInfo, 1.0f, false); - } - } - } -} - -void CNamePlates::ResetNamePlates() -{ - for(auto &NamePlate : m_aNamePlates) - { - NamePlate.DeleteTextContainers(*TextRender()); - NamePlate.Reset(); - } -} - -void CNamePlates::OnWindowResize() -{ - ResetNamePlates(); -} - -void CNamePlates::OnInit() -{ - ResetNamePlates(); - - // Quad for the direction arrows above the player - m_DirectionQuadContainerIndex = Graphics()->CreateQuadContainer(false); - RenderTools()->QuadContainerAddSprite(m_DirectionQuadContainerIndex, 0.0f, 0.0f, 1.0f); - Graphics()->QuadContainerUpload(m_DirectionQuadContainerIndex); -} diff --git a/src/game/client/components/nameplates.h b/src/game/client/components/nameplates.h deleted file mode 100644 index 5c20f2473d..0000000000 --- a/src/game/client/components/nameplates.h +++ /dev/null @@ -1,145 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_NAMEPLATES_H -#define GAME_CLIENT_COMPONENTS_NAMEPLATES_H -#include - -#include -#include - -#include - -struct CNetObj_Character; -struct CNetObj_PlayerInfo; - -class CNamePlates; - -class CNamePlate -{ -public: - class CNamePlateName - { - public: - CNamePlateName() - { - Reset(); - } - void Reset() - { - m_TextContainerIndex.Reset(); - m_Id = -1; - m_aName[0] = '\0'; - m_FriendMark = false; - m_FontSize = -INFINITY; - } - void Update(CNamePlates &This, int Id, const char *pName, bool FriendMark, float FontSize); - STextContainerIndex m_TextContainerIndex; - char m_aName[MAX_NAME_LENGTH]; - int m_Id; - bool m_FriendMark; - float m_FontSize; - }; - class CNamePlateClan - { - public: - CNamePlateClan() - { - Reset(); - } - void Reset() - { - m_TextContainerIndex.Reset(); - m_aClan[0] = '\0'; - m_FontSize = -INFINITY; - } - void Update(CNamePlates &This, const char *pClan, float FontSize); - STextContainerIndex m_TextContainerIndex; - char m_aClan[MAX_CLAN_LENGTH]; - float m_FontSize; - }; - class CNamePlateHookWeakStrongId - { - public: - CNamePlateHookWeakStrongId() - { - Reset(); - } - void Reset() - { - m_TextContainerIndex.Reset(); - m_Id = -1; - m_FontSize = -INFINITY; - } - void Update(CNamePlates &This, int Id, float FontSize); - STextContainerIndex m_TextContainerIndex; - int m_Id; - float m_FontSize; - }; - CNamePlate() - { - Reset(); - } - void Reset() - { - m_Name.Reset(); - m_Clan.Reset(); - m_WeakStrongId.Reset(); - } - void DeleteTextContainers(ITextRender &TextRender) - { - TextRender.DeleteTextContainer(m_Name.m_TextContainerIndex); - TextRender.DeleteTextContainer(m_Clan.m_TextContainerIndex); - TextRender.DeleteTextContainer(m_WeakStrongId.m_TextContainerIndex); - } - CNamePlateName m_Name; - CNamePlateClan m_Clan; - CNamePlateHookWeakStrongId m_WeakStrongId; -}; - -class CNamePlates : public CComponent -{ - friend class CNamePlate::CNamePlateName; - friend class CNamePlate::CNamePlateClan; - friend class CNamePlate::CNamePlateHookWeakStrongId; - - CNamePlate m_aNamePlates[MAX_CLIENTS]; - - void ResetNamePlates(); - - int m_DirectionQuadContainerIndex; - class CRenderNamePlateData - { - public: - vec2 m_Position; - ColorRGBA m_Color; - ColorRGBA m_OutlineColor; - float m_Alpha; - const char *m_pName; - bool m_ShowFriendMark; - int m_ClientId; - float m_FontSize; - const char *m_pClan; - float m_FontSizeClan; - bool m_ShowDirection; - bool m_DirLeft; - bool m_DirJump; - bool m_DirRight; - float m_FontSizeDirection; - bool m_ShowHookWeakStrong; - TRISTATE m_HookWeakStrong; - bool m_ShowHookWeakStrongId; - int m_HookWeakStrongId; - float m_FontSizeHookWeakStrong; - }; - void RenderNamePlate(CNamePlate &NamePlate, const CRenderNamePlateData &Data); - -public: - void RenderNamePlateGame(vec2 Position, const CNetObj_PlayerInfo *pPlayerInfo, float Alpha, bool ForceAlpha); - void RenderNamePlatePreview(vec2 Position); - virtual int Sizeof() const override { return sizeof(*this); } - virtual void OnWindowResize() override; - virtual void OnInit() override; - virtual void OnRender() override; -}; - -#endif diff --git a/src/game/client/components/particles.cpp b/src/game/client/components/particles.cpp deleted file mode 100644 index 21ef0ce357..0000000000 --- a/src/game/client/components/particles.cpp +++ /dev/null @@ -1,346 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include -#include - -#include "particles.h" -#include -#include - -#include - -CParticles::CParticles() -{ - OnReset(); - m_RenderTrail.m_pParts = this; - m_RenderTrailExtra.m_pParts = this; - m_RenderExplosions.m_pParts = this; - m_RenderExtra.m_pParts = this; - m_RenderGeneral.m_pParts = this; -} - -void CParticles::OnReset() -{ - // reset particles - for(int i = 0; i < MAX_PARTICLES; i++) - { - m_aParticles[i].m_PrevPart = i - 1; - m_aParticles[i].m_NextPart = i + 1; - } - - m_aParticles[0].m_PrevPart = 0; - m_aParticles[MAX_PARTICLES - 1].m_NextPart = -1; - m_FirstFree = 0; - - for(int &FirstPart : m_aFirstPart) - FirstPart = -1; -} - -void CParticles::Add(int Group, CParticle *pPart, float TimePassed) -{ - if(Client()->State() == IClient::STATE_DEMOPLAYBACK) - { - const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); - if(pInfo->m_Paused) - return; - } - else - { - if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_PAUSED) - return; - } - - if(m_FirstFree == -1) - return; - - // remove from the free list - int Id = m_FirstFree; - m_FirstFree = m_aParticles[Id].m_NextPart; - if(m_FirstFree != -1) - m_aParticles[m_FirstFree].m_PrevPart = -1; - - // copy data - m_aParticles[Id] = *pPart; - - // insert to the group list - m_aParticles[Id].m_PrevPart = -1; - m_aParticles[Id].m_NextPart = m_aFirstPart[Group]; - if(m_aFirstPart[Group] != -1) - m_aParticles[m_aFirstPart[Group]].m_PrevPart = Id; - m_aFirstPart[Group] = Id; - - // set some parameters - m_aParticles[Id].m_Life = TimePassed; -} - -void CParticles::Update(float TimePassed) -{ - if(TimePassed <= 0.0f) - return; - - m_FrictionFraction += TimePassed; - - if(m_FrictionFraction > 2.0f) // safety measure - m_FrictionFraction = 0; - - int FrictionCount = 0; - while(m_FrictionFraction > 0.05f) - { - FrictionCount++; - m_FrictionFraction -= 0.05f; - } - - for(int &FirstPart : m_aFirstPart) - { - int i = FirstPart; - while(i != -1) - { - int Next = m_aParticles[i].m_NextPart; - //m_aParticles[i].vel += flow_get(m_aParticles[i].pos)*time_passed * m_aParticles[i].flow_affected; - m_aParticles[i].m_Vel.y += m_aParticles[i].m_Gravity * TimePassed; - - for(int f = 0; f < FrictionCount; f++) // apply friction - m_aParticles[i].m_Vel *= m_aParticles[i].m_Friction; - - // move the point - vec2 Vel = m_aParticles[i].m_Vel * TimePassed; - if(m_aParticles[i].m_Collides) - { - Collision()->MovePoint(&m_aParticles[i].m_Pos, &Vel, random_float(0.1f, 1.0f), NULL); - } - else - { - m_aParticles[i].m_Pos += Vel; - } - m_aParticles[i].m_Vel = Vel * (1.0f / TimePassed); - - m_aParticles[i].m_Life += TimePassed; - m_aParticles[i].m_Rot += TimePassed * m_aParticles[i].m_Rotspeed; - - // check particle death - if(m_aParticles[i].m_Life > m_aParticles[i].m_LifeSpan) - { - // remove it from the group list - if(m_aParticles[i].m_PrevPart != -1) - m_aParticles[m_aParticles[i].m_PrevPart].m_NextPart = m_aParticles[i].m_NextPart; - else - FirstPart = m_aParticles[i].m_NextPart; - - if(m_aParticles[i].m_NextPart != -1) - m_aParticles[m_aParticles[i].m_NextPart].m_PrevPart = m_aParticles[i].m_PrevPart; - - // insert to the free list - if(m_FirstFree != -1) - m_aParticles[m_FirstFree].m_PrevPart = i; - m_aParticles[i].m_PrevPart = -1; - m_aParticles[i].m_NextPart = m_FirstFree; - m_FirstFree = i; - } - - i = Next; - } - } -} - -void CParticles::OnRender() -{ - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - set_new_tick(); - int64_t t = time(); - - if(Client()->State() == IClient::STATE_DEMOPLAYBACK) - { - const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); - if(!pInfo->m_Paused) - Update((float)((t - m_LastRenderTime) / (double)time_freq()) * pInfo->m_Speed); - } - else - { - if(m_pClient->m_Snap.m_pGameInfoObj && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_PAUSED)) - Update((float)((t - m_LastRenderTime) / (double)time_freq())); - } - - m_LastRenderTime = t; -} - -void CParticles::OnInit() -{ - Graphics()->QuadsSetRotation(0); - Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); - - m_ParticleQuadContainerIndex = Graphics()->CreateQuadContainer(false); - - for(int i = 0; i <= (SPRITE_PART9 - SPRITE_PART_SLICE); ++i) - { - Graphics()->QuadsSetSubset(0, 0, 1, 1); - RenderTools()->QuadContainerAddSprite(m_ParticleQuadContainerIndex, 1.f); - } - Graphics()->QuadContainerUpload(m_ParticleQuadContainerIndex); - - m_ExtraParticleQuadContainerIndex = Graphics()->CreateQuadContainer(false); - - for(int i = 0; i <= (SPRITE_PART_SPARKLE - SPRITE_PART_SNOWFLAKE); ++i) - { - Graphics()->QuadsSetSubset(0, 0, 1, 1); - RenderTools()->QuadContainerAddSprite(m_ExtraParticleQuadContainerIndex, 1.f); - } - - Graphics()->QuadContainerUpload(m_ExtraParticleQuadContainerIndex); -} - -bool CParticles::ParticleIsVisibleOnScreen(const vec2 &CurPos, float CurSize) -{ - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - - // for simplicity assume the worst case rotation, that increases the bounding box around the particle by its diagonal - const float SqrtOf2 = std::sqrt(2); - CurSize = SqrtOf2 * CurSize; - - // always uses the mid of the particle - float SizeHalf = CurSize / 2; - - return CurPos.x + SizeHalf >= ScreenX0 && CurPos.x - SizeHalf <= ScreenX1 && CurPos.y + SizeHalf >= ScreenY0 && CurPos.y - SizeHalf <= ScreenY1; -} - -void CParticles::RenderGroup(int Group) -{ - IGraphics::CTextureHandle *aParticles = GameClient()->m_ParticlesSkin.m_aSpriteParticles; - int FirstParticleOffset = SPRITE_PART_SLICE; - int ParticleQuadContainerIndex = m_ParticleQuadContainerIndex; - if(Group == GROUP_EXTRA || Group == GROUP_TRAIL_EXTRA) - { - aParticles = GameClient()->m_ExtrasSkin.m_aSpriteParticles; - FirstParticleOffset = SPRITE_PART_SNOWFLAKE; - ParticleQuadContainerIndex = m_ExtraParticleQuadContainerIndex; - } - - // don't use the buffer methods here, else the old renderer gets many draw calls - if(Graphics()->IsQuadContainerBufferingEnabled()) - { - int i = m_aFirstPart[Group]; - - static IGraphics::SRenderSpriteInfo s_aParticleRenderInfo[MAX_PARTICLES]; - - int CurParticleRenderCount = 0; - - // batching makes sense for stuff like ninja particles - ColorRGBA LastColor; - int LastQuadOffset = 0; - - if(i != -1) - { - float Alpha = m_aParticles[i].m_Color.a; - if(m_aParticles[i].m_UseAlphaFading) - { - float a = m_aParticles[i].m_Life / m_aParticles[i].m_LifeSpan; - Alpha = mix(m_aParticles[i].m_StartAlpha, m_aParticles[i].m_EndAlpha, a); - } - LastColor.r = m_aParticles[i].m_Color.r; - LastColor.g = m_aParticles[i].m_Color.g; - LastColor.b = m_aParticles[i].m_Color.b; - LastColor.a = Alpha; - - Graphics()->SetColor( - m_aParticles[i].m_Color.r, - m_aParticles[i].m_Color.g, - m_aParticles[i].m_Color.b, - Alpha); - - LastQuadOffset = m_aParticles[i].m_Spr; - } - - while(i != -1) - { - int QuadOffset = m_aParticles[i].m_Spr; - float a = m_aParticles[i].m_Life / m_aParticles[i].m_LifeSpan; - vec2 p = m_aParticles[i].m_Pos; - float Size = mix(m_aParticles[i].m_StartSize, m_aParticles[i].m_EndSize, a); - float Alpha = m_aParticles[i].m_Color.a; - if(m_aParticles[i].m_UseAlphaFading) - { - Alpha = mix(m_aParticles[i].m_StartAlpha, m_aParticles[i].m_EndAlpha, a); - } - - // the current position, respecting the size, is inside the viewport, render it, else ignore - if(ParticleIsVisibleOnScreen(p, Size)) - { - if((size_t)CurParticleRenderCount == gs_GraphicsMaxParticlesRenderCount || LastColor.r != m_aParticles[i].m_Color.r || LastColor.g != m_aParticles[i].m_Color.g || LastColor.b != m_aParticles[i].m_Color.b || LastColor.a != Alpha || LastQuadOffset != QuadOffset) - { - Graphics()->TextureSet(aParticles[LastQuadOffset - FirstParticleOffset]); - Graphics()->RenderQuadContainerAsSpriteMultiple(ParticleQuadContainerIndex, LastQuadOffset - FirstParticleOffset, CurParticleRenderCount, s_aParticleRenderInfo); - CurParticleRenderCount = 0; - LastQuadOffset = QuadOffset; - - Graphics()->SetColor( - m_aParticles[i].m_Color.r, - m_aParticles[i].m_Color.g, - m_aParticles[i].m_Color.b, - Alpha); - - LastColor.r = m_aParticles[i].m_Color.r; - LastColor.g = m_aParticles[i].m_Color.g; - LastColor.b = m_aParticles[i].m_Color.b; - LastColor.a = Alpha; - } - - s_aParticleRenderInfo[CurParticleRenderCount].m_Pos[0] = p.x; - s_aParticleRenderInfo[CurParticleRenderCount].m_Pos[1] = p.y; - s_aParticleRenderInfo[CurParticleRenderCount].m_Scale = Size; - s_aParticleRenderInfo[CurParticleRenderCount].m_Rotation = m_aParticles[i].m_Rot; - - ++CurParticleRenderCount; - } - - i = m_aParticles[i].m_NextPart; - } - - Graphics()->TextureSet(aParticles[LastQuadOffset - FirstParticleOffset]); - Graphics()->RenderQuadContainerAsSpriteMultiple(ParticleQuadContainerIndex, LastQuadOffset - FirstParticleOffset, CurParticleRenderCount, s_aParticleRenderInfo); - } - else - { - int i = m_aFirstPart[Group]; - - Graphics()->BlendNormal(); - Graphics()->WrapClamp(); - - while(i != -1) - { - float a = m_aParticles[i].m_Life / m_aParticles[i].m_LifeSpan; - vec2 p = m_aParticles[i].m_Pos; - float Size = mix(m_aParticles[i].m_StartSize, m_aParticles[i].m_EndSize, a); - float Alpha = m_aParticles[i].m_Color.a; - if(m_aParticles[i].m_UseAlphaFading) - { - Alpha = mix(m_aParticles[i].m_StartAlpha, m_aParticles[i].m_EndAlpha, a); - } - - // the current position, respecting the size, is inside the viewport, render it, else ignore - if(ParticleIsVisibleOnScreen(p, Size)) - { - Graphics()->TextureSet(aParticles[m_aParticles[i].m_Spr - FirstParticleOffset]); - Graphics()->QuadsBegin(); - - Graphics()->QuadsSetRotation(m_aParticles[i].m_Rot); - - Graphics()->SetColor( - m_aParticles[i].m_Color.r, - m_aParticles[i].m_Color.g, - m_aParticles[i].m_Color.b, - Alpha); - - IGraphics::CQuadItem QuadItem(p.x, p.y, Size, Size); - Graphics()->QuadsDraw(&QuadItem, 1); - Graphics()->QuadsEnd(); - } - - i = m_aParticles[i].m_NextPart; - } - Graphics()->WrapNormal(); - Graphics()->BlendNormal(); - } -} diff --git a/src/game/client/components/particles.h b/src/game/client/components/particles.h deleted file mode 100644 index 16c06b5d9d..0000000000 --- a/src/game/client/components/particles.h +++ /dev/null @@ -1,125 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_PARTICLES_H -#define GAME_CLIENT_COMPONENTS_PARTICLES_H -#include -#include -#include - -// particles -struct CParticle -{ - void SetDefault() - { - m_Pos = vec2(0, 0); - m_Vel = vec2(0, 0); - m_LifeSpan = 0; - m_StartSize = 32; - m_EndSize = 32; - m_UseAlphaFading = false; - m_StartAlpha = 1; - m_EndAlpha = 1; - m_Rot = 0; - m_Rotspeed = 0; - m_Gravity = 0; - m_Friction = 0; - m_FlowAffected = 1.0f; - m_Color = ColorRGBA(1, 1, 1, 1); - m_Collides = true; - } - - vec2 m_Pos; - vec2 m_Vel; - - int m_Spr; - - float m_FlowAffected; - - float m_LifeSpan; - - float m_StartSize; - float m_EndSize; - - bool m_UseAlphaFading; - float m_StartAlpha; - float m_EndAlpha; - - float m_Rot; - float m_Rotspeed; - - float m_Gravity; - float m_Friction; - - ColorRGBA m_Color; - - bool m_Collides; - - // set by the particle system - float m_Life; - int m_PrevPart; - int m_NextPart; -}; - -class CParticles : public CComponent -{ - friend class CGameClient; - -public: - enum - { - GROUP_PROJECTILE_TRAIL = 0, - GROUP_TRAIL_EXTRA, - GROUP_EXPLOSIONS, - GROUP_EXTRA, - GROUP_GENERAL, - NUM_GROUPS - }; - - CParticles(); - virtual int Sizeof() const override { return sizeof(*this); } - - void Add(int Group, CParticle *pPart, float TimePassed = 0.f); - - virtual void OnReset() override; - virtual void OnRender() override; - virtual void OnInit() override; - -private: - int m_ParticleQuadContainerIndex; - int m_ExtraParticleQuadContainerIndex; - - enum - { - MAX_PARTICLES = 1024 * 8, - }; - - CParticle m_aParticles[MAX_PARTICLES]; - int m_FirstFree; - int m_aFirstPart[NUM_GROUPS]; - - float m_FrictionFraction = 0.0f; - int64_t m_LastRenderTime = 0; - - void RenderGroup(int Group); - void Update(float TimePassed); - - template - class CRenderGroup : public CComponent - { - public: - CParticles *m_pParts; - virtual int Sizeof() const override { return sizeof(*this); } - virtual void OnRender() override { m_pParts->RenderGroup(TGROUP); } - }; - - // behind players - CRenderGroup m_RenderTrail; - CRenderGroup m_RenderTrailExtra; - // in front of players - CRenderGroup m_RenderExplosions; - CRenderGroup m_RenderExtra; - CRenderGroup m_RenderGeneral; - - bool ParticleIsVisibleOnScreen(const vec2 &CurPos, float CurSize); -}; -#endif diff --git a/src/game/client/components/players.cpp b/src/game/client/components/players.cpp deleted file mode 100644 index 34a684a957..0000000000 --- a/src/game/client/components/players.cpp +++ /dev/null @@ -1,1005 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "players.h" - -#include -#include - -void CPlayers::RenderHand(const CTeeRenderInfo *pInfo, vec2 CenterPos, vec2 Dir, float AngleOffset, vec2 PostRotOffset, float Alpha) -{ - if(pInfo->m_aSixup[g_Config.m_ClDummy].m_aTextures[protocol7::SKINPART_BODY].IsValid()) - RenderHand7(pInfo, CenterPos, Dir, AngleOffset, PostRotOffset, Alpha); - else - RenderHand6(pInfo, CenterPos, Dir, AngleOffset, PostRotOffset, Alpha); -} - -void CPlayers::RenderHand7(const CTeeRenderInfo *pInfo, vec2 CenterPos, vec2 Dir, float AngleOffset, vec2 PostRotOffset, float Alpha) -{ - // in-game hand size is 15 when tee size is 64 - float BaseSize = 15.0f * (pInfo->m_Size / 64.0f); - - vec2 HandPos = CenterPos + Dir; - float Angle = angle(Dir); - if(Dir.x < 0) - Angle -= AngleOffset; - else - Angle += AngleOffset; - - vec2 DirX = Dir; - vec2 DirY(-Dir.y, Dir.x); - - if(Dir.x < 0) - DirY = -DirY; - - HandPos += DirX * PostRotOffset.x; - HandPos += DirY * PostRotOffset.y; - - ColorRGBA Color = pInfo->m_aSixup[g_Config.m_ClDummy].m_aColors[protocol7::SKINPART_HANDS]; - Color.a = Alpha; - IGraphics::CQuadItem QuadOutline(HandPos.x, HandPos.y, 2 * BaseSize, 2 * BaseSize); - IGraphics::CQuadItem QuadHand = QuadOutline; - - Graphics()->TextureSet(pInfo->m_aSixup[g_Config.m_ClDummy].m_aTextures[protocol7::SKINPART_HANDS]); - Graphics()->QuadsBegin(); - Graphics()->SetColor(Color); - Graphics()->QuadsSetRotation(Angle); - - RenderTools()->SelectSprite7(client_data7::SPRITE_TEE_HAND_OUTLINE); - Graphics()->QuadsDraw(&QuadOutline, 1); - RenderTools()->SelectSprite7(client_data7::SPRITE_TEE_HAND); - Graphics()->QuadsDraw(&QuadHand, 1); - - Graphics()->QuadsSetRotation(0); - Graphics()->QuadsEnd(); -} - -void CPlayers::RenderHand6(const CTeeRenderInfo *pInfo, vec2 CenterPos, vec2 Dir, float AngleOffset, vec2 PostRotOffset, float Alpha) -{ - vec2 HandPos = CenterPos + Dir; - float Angle = angle(Dir); - if(Dir.x < 0) - Angle -= AngleOffset; - else - Angle += AngleOffset; - - vec2 DirX = Dir; - vec2 DirY(-Dir.y, Dir.x); - - if(Dir.x < 0) - DirY = -DirY; - - HandPos += DirX * PostRotOffset.x; - HandPos += DirY * PostRotOffset.y; - - const CSkin::SSkinTextures *pSkinTextures = pInfo->m_CustomColoredSkin ? &pInfo->m_ColorableRenderSkin : &pInfo->m_OriginalRenderSkin; - - Graphics()->SetColor(pInfo->m_ColorBody.r, pInfo->m_ColorBody.g, pInfo->m_ColorBody.b, Alpha); - - // two passes - for(int i = 0; i < 2; i++) - { - int QuadOffset = NUM_WEAPONS * 2 + i; - Graphics()->QuadsSetRotation(Angle); - Graphics()->TextureSet(i == 0 ? pSkinTextures->m_HandsOutline : pSkinTextures->m_Hands); - Graphics()->RenderQuadContainerAsSprite(m_WeaponEmoteQuadContainerIndex, QuadOffset, HandPos.x, HandPos.y); - } -} - -inline float AngularMixDirection(float Src, float Dst) { return std::sin(Dst - Src) > 0 ? 1 : -1; } - -inline float AngularApproach(float Src, float Dst, float Amount) -{ - float d = AngularMixDirection(Src, Dst); - float n = Src + Amount * d; - if(AngularMixDirection(n, Dst) != d) - return Dst; - return n; -} - -float CPlayers::GetPlayerTargetAngle( - const CNetObj_Character *pPrevChar, - const CNetObj_Character *pPlayerChar, - int ClientId, - float Intra) -{ - float AngleIntraTick = Intra; - // using unpredicted angle when rendering other players in-game - if(ClientId >= 0) - AngleIntraTick = Client()->IntraGameTick(g_Config.m_ClDummy); - if(ClientId >= 0 && m_pClient->m_Snap.m_aCharacters[ClientId].m_HasExtendedDisplayInfo) - { - CNetObj_DDNetCharacter *pExtendedData = &m_pClient->m_Snap.m_aCharacters[ClientId].m_ExtendedData; - if(m_pClient->m_Snap.m_aCharacters[ClientId].m_PrevExtendedData) - { - const CNetObj_DDNetCharacter *PrevExtendedData = m_pClient->m_Snap.m_aCharacters[ClientId].m_PrevExtendedData; - - float MixX = mix((float)PrevExtendedData->m_TargetX, (float)pExtendedData->m_TargetX, AngleIntraTick); - float MixY = mix((float)PrevExtendedData->m_TargetY, (float)pExtendedData->m_TargetY, AngleIntraTick); - - return angle(vec2(MixX, MixY)); - } - else - { - return angle(vec2(pExtendedData->m_TargetX, pExtendedData->m_TargetY)); - } - } - else - { - // If the player moves their weapon through top, then change - // the end angle by 2*Pi, so that the mix function will use the - // short path and not the long one. - if(pPlayerChar->m_Angle > (256.0f * pi) && pPrevChar->m_Angle < 0) - { - return mix((float)pPrevChar->m_Angle, (float)(pPlayerChar->m_Angle - 256.0f * 2 * pi), AngleIntraTick) / 256.0f; - } - else if(pPlayerChar->m_Angle < 0 && pPrevChar->m_Angle > (256.0f * pi)) - { - return mix((float)pPrevChar->m_Angle, (float)(pPlayerChar->m_Angle + 256.0f * 2 * pi), AngleIntraTick) / 256.0f; - } - else - { - return mix((float)pPrevChar->m_Angle, (float)pPlayerChar->m_Angle, AngleIntraTick) / 256.0f; - } - } -} - -void CPlayers::RenderHookCollLine( - const CNetObj_Character *pPrevChar, - const CNetObj_Character *pPlayerChar, - int ClientId, - float Intra) -{ - CNetObj_Character Prev; - CNetObj_Character Player; - Prev = *pPrevChar; - Player = *pPlayerChar; - - bool Local = m_pClient->m_Snap.m_LocalClientId == ClientId; - bool OtherTeam = m_pClient->IsOtherTeam(ClientId); - float Alpha = (OtherTeam || ClientId < 0) ? g_Config.m_ClShowOthersAlpha / 100.0f : 1.0f; - Alpha *= (float)g_Config.m_ClHookCollAlpha / 100; - - float IntraTick = Intra; - if(ClientId >= 0) - IntraTick = m_pClient->m_aClients[ClientId].m_IsPredicted ? Client()->PredIntraGameTick(g_Config.m_ClDummy) : Client()->IntraGameTick(g_Config.m_ClDummy); - - float Angle; - if(Local && !m_pClient->m_Snap.m_SpecInfo.m_Active && Client()->State() != IClient::STATE_DEMOPLAYBACK) - { - // just use the direct input if it's the local player we are rendering - Angle = angle(m_pClient->m_Controls.m_aMousePos[g_Config.m_ClDummy]); - } - else - { - Angle = GetPlayerTargetAngle(&Prev, &Player, ClientId, IntraTick); - } - - vec2 Direction = direction(Angle); - vec2 Position; - if(in_range(ClientId, MAX_CLIENTS - 1)) - Position = m_pClient->m_aClients[ClientId].m_RenderPos; - else - Position = mix(vec2(Prev.m_X, Prev.m_Y), vec2(Player.m_X, Player.m_Y), IntraTick); - // draw hook collision line - { - bool Aim = (Player.m_PlayerFlags & PLAYERFLAG_AIM); - if(!Client()->ServerCapAnyPlayerFlag()) - { - for(int i = 0; i < NUM_DUMMIES; i++) - { - if(ClientId == m_pClient->m_aLocalIds[i]) - { - Aim = GameClient()->m_Controls.m_aShowHookColl[i]; - break; - } - } - } - - bool AlwaysRenderHookColl = GameClient()->m_GameInfo.m_AllowHookColl && (Local ? g_Config.m_ClShowHookCollOwn : g_Config.m_ClShowHookCollOther) == 2; - bool RenderHookCollPlayer = ClientId >= 0 && Aim && (Local ? g_Config.m_ClShowHookCollOwn : g_Config.m_ClShowHookCollOther) > 0; - if(Local && GameClient()->m_GameInfo.m_AllowHookColl && Client()->State() != IClient::STATE_DEMOPLAYBACK) - RenderHookCollPlayer = GameClient()->m_Controls.m_aShowHookColl[g_Config.m_ClDummy] && g_Config.m_ClShowHookCollOwn > 0; - - bool RenderHookCollVideo = true; -#if defined(CONF_VIDEORECORDER) - RenderHookCollVideo = !IVideo::Current() || g_Config.m_ClVideoShowHookCollOther || Local; -#endif - if((AlwaysRenderHookColl || RenderHookCollPlayer) && RenderHookCollVideo) - { - vec2 ExDirection = Direction; - - if(Local && !m_pClient->m_Snap.m_SpecInfo.m_Active && Client()->State() != IClient::STATE_DEMOPLAYBACK) - { - ExDirection = normalize(vec2((int)m_pClient->m_Controls.m_aMousePos[g_Config.m_ClDummy].x, (int)m_pClient->m_Controls.m_aMousePos[g_Config.m_ClDummy].y)); - - // fix direction if mouse is exactly in the center - if(!(int)m_pClient->m_Controls.m_aMousePos[g_Config.m_ClDummy].x && !(int)m_pClient->m_Controls.m_aMousePos[g_Config.m_ClDummy].y) - ExDirection = vec2(1, 0); - } - Graphics()->TextureClear(); - vec2 InitPos = Position; - vec2 FinishPos = InitPos + ExDirection * (m_pClient->m_aTuning[g_Config.m_ClDummy].m_HookLength - 42.0f); - - const int HookCollSize = Local ? g_Config.m_ClHookCollSize : g_Config.m_ClHookCollSizeOther; - if(HookCollSize > 0) - Graphics()->QuadsBegin(); - else - Graphics()->LinesBegin(); - - ColorRGBA HookCollColor = color_cast(ColorHSLA(g_Config.m_ClHookCollColorNoColl)); - - vec2 OldPos = InitPos + ExDirection * CCharacterCore::PhysicalSize() * 1.5f; - vec2 NewPos = OldPos; - - bool DoBreak = false; - - do - { - OldPos = NewPos; - NewPos = OldPos + ExDirection * m_pClient->m_aTuning[g_Config.m_ClDummy].m_HookFireSpeed; - - if(distance(InitPos, NewPos) > m_pClient->m_aTuning[g_Config.m_ClDummy].m_HookLength) - { - NewPos = InitPos + normalize(NewPos - InitPos) * m_pClient->m_aTuning[g_Config.m_ClDummy].m_HookLength; - DoBreak = true; - } - - int Hit = Collision()->IntersectLineTeleHook(OldPos, NewPos, &FinishPos, 0x0); - - if(!DoBreak && Hit) - { - if(Hit != TILE_NOHOOK) - { - HookCollColor = color_cast(ColorHSLA(g_Config.m_ClHookCollColorHookableColl)); - } - } - - if(ClientId >= 0 && m_pClient->IntersectCharacter(OldPos, FinishPos, FinishPos, ClientId) != -1) - { - HookCollColor = color_cast(ColorHSLA(g_Config.m_ClHookCollColorTeeColl)); - break; - } - - if(Hit) - break; - - NewPos.x = round_to_int(NewPos.x); - NewPos.y = round_to_int(NewPos.y); - - if(OldPos == NewPos) - break; - - ExDirection.x = round_to_int(ExDirection.x * 256.0f) / 256.0f; - ExDirection.y = round_to_int(ExDirection.y * 256.0f) / 256.0f; - } while(!DoBreak); - - if(AlwaysRenderHookColl && RenderHookCollPlayer) - { - // invert the hook coll colors when using cl_show_hook_coll_always and +showhookcoll is pressed - HookCollColor = color_invert(HookCollColor); - } - Graphics()->SetColor(HookCollColor.WithAlpha(Alpha)); - if(HookCollSize > 0) - { - float LineWidth = 0.5f + (float)(HookCollSize - 1) * 0.25f; - vec2 PerpToAngle = normalize(vec2(ExDirection.y, -ExDirection.x)) * GameClient()->m_Camera.m_Zoom; - vec2 Pos0 = FinishPos + PerpToAngle * -LineWidth; - vec2 Pos1 = FinishPos + PerpToAngle * LineWidth; - vec2 Pos2 = InitPos + PerpToAngle * -LineWidth; - vec2 Pos3 = InitPos + PerpToAngle * LineWidth; - IGraphics::CFreeformItem FreeformItem(Pos0.x, Pos0.y, Pos1.x, Pos1.y, Pos2.x, Pos2.y, Pos3.x, Pos3.y); - Graphics()->QuadsDrawFreeform(&FreeformItem, 1); - Graphics()->QuadsEnd(); - } - else - { - IGraphics::CLineItem LineItem(InitPos.x, InitPos.y, FinishPos.x, FinishPos.y); - Graphics()->LinesDraw(&LineItem, 1); - Graphics()->LinesEnd(); - } - } - } -} -void CPlayers::RenderHook( - const CNetObj_Character *pPrevChar, - const CNetObj_Character *pPlayerChar, - const CTeeRenderInfo *pRenderInfo, - int ClientId, - float Intra) -{ - CNetObj_Character Prev; - CNetObj_Character Player; - Prev = *pPrevChar; - Player = *pPlayerChar; - - CTeeRenderInfo RenderInfo = *pRenderInfo; - - // don't render hooks to not active character cores - if(pPlayerChar->m_HookedPlayer != -1 && !m_pClient->m_Snap.m_aCharacters[pPlayerChar->m_HookedPlayer].m_Active) - return; - - float IntraTick = Intra; - if(ClientId >= 0) - IntraTick = (m_pClient->m_aClients[ClientId].m_IsPredicted) ? Client()->PredIntraGameTick(g_Config.m_ClDummy) : Client()->IntraGameTick(g_Config.m_ClDummy); - - bool OtherTeam = m_pClient->IsOtherTeam(ClientId); - float Alpha = (OtherTeam || ClientId < 0) ? g_Config.m_ClShowOthersAlpha / 100.0f : 1.0f; - if(ClientId == -2) // ghost - Alpha = g_Config.m_ClRaceGhostAlpha / 100.0f; - - RenderInfo.m_Size = 64.0f; - - vec2 Position; - if(in_range(ClientId, MAX_CLIENTS - 1)) - Position = m_pClient->m_aClients[ClientId].m_RenderPos; - else - Position = mix(vec2(Prev.m_X, Prev.m_Y), vec2(Player.m_X, Player.m_Y), IntraTick); - - // draw hook - if(Prev.m_HookState > 0 && Player.m_HookState > 0) - { - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - if(ClientId < 0) - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.5f); - - vec2 Pos = Position; - vec2 HookPos; - - if(in_range(pPlayerChar->m_HookedPlayer, MAX_CLIENTS - 1)) - HookPos = m_pClient->m_aClients[pPlayerChar->m_HookedPlayer].m_RenderPos; - else - HookPos = mix(vec2(Prev.m_HookX, Prev.m_HookY), vec2(Player.m_HookX, Player.m_HookY), IntraTick); - - float d = distance(Pos, HookPos); - vec2 Dir = normalize(Pos - HookPos); - - Graphics()->TextureSet(GameClient()->m_GameSkin.m_SpriteHookHead); - Graphics()->QuadsSetRotation(angle(Dir) + pi); - // render head - int QuadOffset = NUM_WEAPONS * 2 + 2; - Graphics()->SetColor(1.0f, 1.0f, 1.0f, Alpha); - Graphics()->RenderQuadContainerAsSprite(m_WeaponEmoteQuadContainerIndex, QuadOffset, HookPos.x, HookPos.y); - - // render chain - ++QuadOffset; - static IGraphics::SRenderSpriteInfo s_aHookChainRenderInfo[1024]; - int HookChainCount = 0; - for(float f = 24; f < d && HookChainCount < 1024; f += 24, ++HookChainCount) - { - vec2 p = HookPos + Dir * f; - s_aHookChainRenderInfo[HookChainCount].m_Pos[0] = p.x; - s_aHookChainRenderInfo[HookChainCount].m_Pos[1] = p.y; - s_aHookChainRenderInfo[HookChainCount].m_Scale = 1; - s_aHookChainRenderInfo[HookChainCount].m_Rotation = angle(Dir) + pi; - } - Graphics()->TextureSet(GameClient()->m_GameSkin.m_SpriteHookChain); - Graphics()->RenderQuadContainerAsSpriteMultiple(m_WeaponEmoteQuadContainerIndex, QuadOffset, HookChainCount, s_aHookChainRenderInfo); - - Graphics()->QuadsSetRotation(0); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - - RenderHand(&RenderInfo, Position, normalize(HookPos - Pos), -pi / 2, vec2(20, 0), Alpha); - } -} - -void CPlayers::RenderPlayer( - const CNetObj_Character *pPrevChar, - const CNetObj_Character *pPlayerChar, - const CTeeRenderInfo *pRenderInfo, - int ClientId, - float Intra) -{ - CNetObj_Character Prev; - CNetObj_Character Player; - Prev = *pPrevChar; - Player = *pPlayerChar; - - CTeeRenderInfo RenderInfo = *pRenderInfo; - - bool Local = m_pClient->m_Snap.m_LocalClientId == ClientId; - bool OtherTeam = m_pClient->IsOtherTeam(ClientId); - float Alpha = (OtherTeam || ClientId < 0) ? g_Config.m_ClShowOthersAlpha / 100.0f : 1.0f; - if(ClientId == -2) // ghost - Alpha = g_Config.m_ClRaceGhostAlpha / 100.0f; - - // set size - RenderInfo.m_Size = 64.0f; - - float IntraTick = Intra; - if(ClientId >= 0) - IntraTick = m_pClient->m_aClients[ClientId].m_IsPredicted ? Client()->PredIntraGameTick(g_Config.m_ClDummy) : Client()->IntraGameTick(g_Config.m_ClDummy); - - static float s_LastGameTickTime = Client()->GameTickTime(g_Config.m_ClDummy); - static float s_LastPredIntraTick = Client()->PredIntraGameTick(g_Config.m_ClDummy); - if(m_pClient->m_Snap.m_pGameInfoObj && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_PAUSED)) - { - s_LastGameTickTime = Client()->GameTickTime(g_Config.m_ClDummy); - s_LastPredIntraTick = Client()->PredIntraGameTick(g_Config.m_ClDummy); - } - - bool PredictLocalWeapons = false; - float AttackTime = (Client()->PrevGameTick(g_Config.m_ClDummy) - Player.m_AttackTick) / (float)Client()->GameTickSpeed() + Client()->GameTickTime(g_Config.m_ClDummy); - float LastAttackTime = (Client()->PrevGameTick(g_Config.m_ClDummy) - Player.m_AttackTick) / (float)Client()->GameTickSpeed() + s_LastGameTickTime; - if(ClientId >= 0 && m_pClient->m_aClients[ClientId].m_IsPredictedLocal && m_pClient->AntiPingGunfire()) - { - PredictLocalWeapons = true; - AttackTime = (Client()->PredIntraGameTick(g_Config.m_ClDummy) + (Client()->PredGameTick(g_Config.m_ClDummy) - 1 - Player.m_AttackTick)) / (float)Client()->GameTickSpeed(); - LastAttackTime = (s_LastPredIntraTick + (Client()->PredGameTick(g_Config.m_ClDummy) - 1 - Player.m_AttackTick)) / (float)Client()->GameTickSpeed(); - } - float AttackTicksPassed = AttackTime * (float)Client()->GameTickSpeed(); - - float Angle; - if(Local && !m_pClient->m_Snap.m_SpecInfo.m_Active && Client()->State() != IClient::STATE_DEMOPLAYBACK) - { - // just use the direct input if it's the local player we are rendering - Angle = angle(m_pClient->m_Controls.m_aMousePos[g_Config.m_ClDummy]); - } - else - { - Angle = GetPlayerTargetAngle(&Prev, &Player, ClientId, IntraTick); - } - - vec2 Direction = direction(Angle); - vec2 Position; - if(in_range(ClientId, MAX_CLIENTS - 1)) - Position = m_pClient->m_aClients[ClientId].m_RenderPos; - else - Position = mix(vec2(Prev.m_X, Prev.m_Y), vec2(Player.m_X, Player.m_Y), IntraTick); - vec2 Vel = mix(vec2(Prev.m_VelX / 256.0f, Prev.m_VelY / 256.0f), vec2(Player.m_VelX / 256.0f, Player.m_VelY / 256.0f), IntraTick); - - m_pClient->m_Flow.Add(Position, Vel * 100.0f, 10.0f); - - RenderInfo.m_GotAirJump = Player.m_Jumped & 2 ? false : true; - - RenderInfo.m_FeetFlipped = false; - - bool Stationary = Player.m_VelX <= 1 && Player.m_VelX >= -1; - bool InAir = !Collision()->CheckPoint(Player.m_X, Player.m_Y + 16); - bool Running = Player.m_VelX >= 5000 || Player.m_VelX <= -5000; - bool WantOtherDir = (Player.m_Direction == -1 && Vel.x > 0) || (Player.m_Direction == 1 && Vel.x < 0); - bool Inactive = ClientId >= 0 && (m_pClient->m_aClients[ClientId].m_Afk || m_pClient->m_aClients[ClientId].m_Paused); - - // evaluate animation - float WalkTime = std::fmod(Position.x, 100.0f) / 100.0f; - float RunTime = std::fmod(Position.x, 200.0f) / 200.0f; - - // Don't do a moon walk outside the left border - if(WalkTime < 0) - WalkTime += 1; - if(RunTime < 0) - RunTime += 1; - - CAnimState State; - State.Set(&g_pData->m_aAnimations[ANIM_BASE], 0); - - if(InAir) - State.Add(&g_pData->m_aAnimations[ANIM_INAIR], 0, 1.0f); // TODO: some sort of time here - else if(Stationary) - { - if(Inactive) - { - State.Add(Direction.x < 0 ? &g_pData->m_aAnimations[ANIM_SIT_LEFT] : &g_pData->m_aAnimations[ANIM_SIT_RIGHT], 0, 1.0f); // TODO: some sort of time here - RenderInfo.m_FeetFlipped = true; - } - else - State.Add(&g_pData->m_aAnimations[ANIM_IDLE], 0, 1.0f); // TODO: some sort of time here - } - else if(!WantOtherDir) - { - if(Running) - State.Add(Player.m_VelX < 0 ? &g_pData->m_aAnimations[ANIM_RUN_LEFT] : &g_pData->m_aAnimations[ANIM_RUN_RIGHT], RunTime, 1.0f); - else - State.Add(&g_pData->m_aAnimations[ANIM_WALK], WalkTime, 1.0f); - } - - if(Player.m_Weapon == WEAPON_HAMMER) - State.Add(&g_pData->m_aAnimations[ANIM_HAMMER_SWING], clamp(LastAttackTime * 5.0f, 0.0f, 1.0f), 1.0f); - if(Player.m_Weapon == WEAPON_NINJA) - State.Add(&g_pData->m_aAnimations[ANIM_NINJA_SWING], clamp(LastAttackTime * 2.0f, 0.0f, 1.0f), 1.0f); - - // do skidding - if(!InAir && WantOtherDir && length(Vel * 50) > 500.0f) - { - if(time() - m_SkidSoundTime > time_freq() / 10) - { - if(g_Config.m_SndGame) - m_pClient->m_Sounds.PlayAt(CSounds::CHN_WORLD, SOUND_PLAYER_SKID, 1.0f, Position); - m_SkidSoundTime = time(); - } - - m_pClient->m_Effects.SkidTrail( - Position + vec2(-Player.m_Direction * 6, 12), - vec2(-Player.m_Direction * 100 * length(Vel), -50), - Alpha); - } - - // draw gun - if(Player.m_Weapon >= 0) - { - if(!(RenderInfo.m_TeeRenderFlags & TEE_NO_WEAPON)) - { - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - Graphics()->QuadsSetRotation(State.GetAttach()->m_Angle * pi * 2 + Angle); - - if(ClientId < 0) - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.5f); - - // normal weapons - int CurrentWeapon = clamp(Player.m_Weapon, 0, NUM_WEAPONS - 1); - Graphics()->TextureSet(GameClient()->m_GameSkin.m_aSpriteWeapons[CurrentWeapon]); - int QuadOffset = CurrentWeapon * 2 + (Direction.x < 0 ? 1 : 0); - - Graphics()->SetColor(1.0f, 1.0f, 1.0f, Alpha); - - vec2 Dir = Direction; - float Recoil = 0.0f; - vec2 WeaponPosition; - bool IsSit = Inactive && !InAir && Stationary; - - if(Player.m_Weapon == WEAPON_HAMMER) - { - // static position for hammer - WeaponPosition = Position + vec2(State.GetAttach()->m_X, State.GetAttach()->m_Y); - WeaponPosition.y += g_pData->m_Weapons.m_aId[CurrentWeapon].m_Offsety; - if(Direction.x < 0) - WeaponPosition.x -= g_pData->m_Weapons.m_aId[CurrentWeapon].m_Offsetx; - if(IsSit) - WeaponPosition.y += 3.0f; - - // if active and attack is under way, bash stuffs - if(!Inactive || LastAttackTime < m_pClient->m_aTuning[g_Config.m_ClDummy].GetWeaponFireDelay(Player.m_Weapon)) - { - if(Direction.x < 0) - Graphics()->QuadsSetRotation(-pi / 2 - State.GetAttach()->m_Angle * pi * 2); - else - Graphics()->QuadsSetRotation(-pi / 2 + State.GetAttach()->m_Angle * pi * 2); - } - else - Graphics()->QuadsSetRotation(Direction.x < 0 ? 100.0f : 500.0f); - - Graphics()->RenderQuadContainerAsSprite(m_WeaponEmoteQuadContainerIndex, QuadOffset, WeaponPosition.x, WeaponPosition.y); - } - else if(Player.m_Weapon == WEAPON_NINJA) - { - WeaponPosition = Position; - WeaponPosition.y += g_pData->m_Weapons.m_aId[CurrentWeapon].m_Offsety; - if(IsSit) - WeaponPosition.y += 3.0f; - - if(Direction.x < 0) - { - Graphics()->QuadsSetRotation(-pi / 2 - State.GetAttach()->m_Angle * pi * 2); - WeaponPosition.x -= g_pData->m_Weapons.m_aId[CurrentWeapon].m_Offsetx; - m_pClient->m_Effects.PowerupShine(WeaponPosition + vec2(32, 0), vec2(32, 12), Alpha); - } - else - { - Graphics()->QuadsSetRotation(-pi / 2 + State.GetAttach()->m_Angle * pi * 2); - m_pClient->m_Effects.PowerupShine(WeaponPosition - vec2(32, 0), vec2(32, 12), Alpha); - } - Graphics()->RenderQuadContainerAsSprite(m_WeaponEmoteQuadContainerIndex, QuadOffset, WeaponPosition.x, WeaponPosition.y); - - // HADOKEN - if(AttackTime <= 1 / 6.f && g_pData->m_Weapons.m_aId[CurrentWeapon].m_NumSpriteMuzzles) - { - int IteX = rand() % g_pData->m_Weapons.m_aId[CurrentWeapon].m_NumSpriteMuzzles; - static int s_LastIteX = IteX; - if(Client()->State() == IClient::STATE_DEMOPLAYBACK) - { - const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); - if(pInfo->m_Paused) - IteX = s_LastIteX; - else - s_LastIteX = IteX; - } - else - { - if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_PAUSED) - IteX = s_LastIteX; - else - s_LastIteX = IteX; - } - if(g_pData->m_Weapons.m_aId[CurrentWeapon].m_aSpriteMuzzles[IteX]) - { - if(PredictLocalWeapons || ClientId < 0) - Dir = vec2(pPlayerChar->m_X, pPlayerChar->m_Y) - vec2(pPrevChar->m_X, pPrevChar->m_Y); - else - Dir = vec2(m_pClient->m_Snap.m_aCharacters[ClientId].m_Cur.m_X, m_pClient->m_Snap.m_aCharacters[ClientId].m_Cur.m_Y) - vec2(m_pClient->m_Snap.m_aCharacters[ClientId].m_Prev.m_X, m_pClient->m_Snap.m_aCharacters[ClientId].m_Prev.m_Y); - float HadOkenAngle = 0; - if(absolute(Dir.x) > 0.0001f || absolute(Dir.y) > 0.0001f) - { - Dir = normalize(Dir); - HadOkenAngle = angle(Dir); - } - else - { - Dir = vec2(1, 0); - } - Graphics()->QuadsSetRotation(HadOkenAngle); - QuadOffset = IteX * 2; - vec2 DirY(-Dir.y, Dir.x); - WeaponPosition = Position; - float OffsetX = g_pData->m_Weapons.m_aId[CurrentWeapon].m_Muzzleoffsetx; - WeaponPosition -= Dir * OffsetX; - Graphics()->TextureSet(GameClient()->m_GameSkin.m_aaSpriteWeaponsMuzzles[CurrentWeapon][IteX]); - Graphics()->RenderQuadContainerAsSprite(m_aWeaponSpriteMuzzleQuadContainerIndex[CurrentWeapon], QuadOffset, WeaponPosition.x, WeaponPosition.y); - } - } - } - else - { - // TODO: should be an animation - Recoil = 0; - float a = AttackTicksPassed / 5.0f; - if(a < 1) - Recoil = std::sin(a * pi); - WeaponPosition = Position + Dir * g_pData->m_Weapons.m_aId[CurrentWeapon].m_Offsetx - Dir * Recoil * 10.0f; - WeaponPosition.y += g_pData->m_Weapons.m_aId[CurrentWeapon].m_Offsety; - if(IsSit) - WeaponPosition.y += 3.0f; - if(Player.m_Weapon == WEAPON_GUN && g_Config.m_ClOldGunPosition) - WeaponPosition.y -= 8; - Graphics()->RenderQuadContainerAsSprite(m_WeaponEmoteQuadContainerIndex, QuadOffset, WeaponPosition.x, WeaponPosition.y); - } - - if(Player.m_Weapon == WEAPON_GUN || Player.m_Weapon == WEAPON_SHOTGUN) - { - // check if we're firing stuff - if(g_pData->m_Weapons.m_aId[CurrentWeapon].m_NumSpriteMuzzles) // prev.attackticks) - { - float AlphaMuzzle = 0.0f; - if(AttackTicksPassed < g_pData->m_Weapons.m_aId[CurrentWeapon].m_Muzzleduration + 3) - { - float t = AttackTicksPassed / g_pData->m_Weapons.m_aId[CurrentWeapon].m_Muzzleduration; - AlphaMuzzle = mix(2.0f, 0.0f, minimum(1.0f, maximum(0.0f, t))); - } - - int IteX = rand() % g_pData->m_Weapons.m_aId[CurrentWeapon].m_NumSpriteMuzzles; - static int s_LastIteX = IteX; - if(Client()->State() == IClient::STATE_DEMOPLAYBACK) - { - const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); - if(pInfo->m_Paused) - IteX = s_LastIteX; - else - s_LastIteX = IteX; - } - else - { - if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_PAUSED) - IteX = s_LastIteX; - else - s_LastIteX = IteX; - } - if(AlphaMuzzle > 0.0f && g_pData->m_Weapons.m_aId[CurrentWeapon].m_aSpriteMuzzles[IteX]) - { - float OffsetY = -g_pData->m_Weapons.m_aId[CurrentWeapon].m_Muzzleoffsety; - QuadOffset = IteX * 2 + (Direction.x < 0 ? 1 : 0); - if(Direction.x < 0) - OffsetY = -OffsetY; - - vec2 DirY(-Dir.y, Dir.x); - vec2 MuzzlePos = WeaponPosition + Dir * g_pData->m_Weapons.m_aId[CurrentWeapon].m_Muzzleoffsetx + DirY * OffsetY; - Graphics()->TextureSet(GameClient()->m_GameSkin.m_aaSpriteWeaponsMuzzles[CurrentWeapon][IteX]); - Graphics()->RenderQuadContainerAsSprite(m_aWeaponSpriteMuzzleQuadContainerIndex[CurrentWeapon], QuadOffset, MuzzlePos.x, MuzzlePos.y); - } - } - } - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - Graphics()->QuadsSetRotation(0); - - switch(Player.m_Weapon) - { - case WEAPON_GUN: RenderHand(&RenderInfo, WeaponPosition, Direction, -3 * pi / 4, vec2(-15, 4), Alpha); break; - case WEAPON_SHOTGUN: RenderHand(&RenderInfo, WeaponPosition, Direction, -pi / 2, vec2(-5, 4), Alpha); break; - case WEAPON_GRENADE: RenderHand(&RenderInfo, WeaponPosition, Direction, -pi / 2, vec2(-4, 7), Alpha); break; - } - } - } - - // render the "shadow" tee - if(Local && ((g_Config.m_Debug && g_Config.m_ClUnpredictedShadow >= 0) || g_Config.m_ClUnpredictedShadow == 1)) - { - vec2 ShadowPosition = Position; - if(ClientId >= 0) - ShadowPosition = mix( - vec2(m_pClient->m_Snap.m_aCharacters[ClientId].m_Prev.m_X, m_pClient->m_Snap.m_aCharacters[ClientId].m_Prev.m_Y), - vec2(m_pClient->m_Snap.m_aCharacters[ClientId].m_Cur.m_X, m_pClient->m_Snap.m_aCharacters[ClientId].m_Cur.m_Y), - Client()->IntraGameTick(g_Config.m_ClDummy)); - - CTeeRenderInfo Shadow = RenderInfo; - RenderTools()->RenderTee(&State, &Shadow, Player.m_Emote, Direction, ShadowPosition, 0.5f); // render ghost - } - - RenderTools()->RenderTee(&State, &RenderInfo, Player.m_Emote, Direction, Position, Alpha); - - float TeeAnimScale, TeeBaseSize; - CRenderTools::GetRenderTeeAnimScaleAndBaseSize(&RenderInfo, TeeAnimScale, TeeBaseSize); - vec2 BodyPos = Position + vec2(State.GetBody()->m_X, State.GetBody()->m_Y) * TeeAnimScale; - if(RenderInfo.m_TeeRenderFlags & TEE_EFFECT_FROZEN) - { - GameClient()->m_Effects.FreezingFlakes(BodyPos, vec2(32, 32), Alpha); - } - if(RenderInfo.m_TeeRenderFlags & TEE_EFFECT_SPARKLE) - { - GameClient()->m_Effects.SparkleTrail(BodyPos, Alpha); - } - - if(ClientId < 0) - return; - - int QuadOffsetToEmoticon = NUM_WEAPONS * 2 + 2 + 2; - if((Player.m_PlayerFlags & PLAYERFLAG_CHATTING) && !m_pClient->m_aClients[ClientId].m_Afk) - { - int CurEmoticon = (SPRITE_DOTDOT - SPRITE_OOP); - Graphics()->TextureSet(GameClient()->m_EmoticonsSkin.m_aSpriteEmoticons[CurEmoticon]); - int QuadOffset = QuadOffsetToEmoticon + CurEmoticon; - Graphics()->SetColor(1.0f, 1.0f, 1.0f, Alpha); - Graphics()->RenderQuadContainerAsSprite(m_WeaponEmoteQuadContainerIndex, QuadOffset, Position.x + 24.f, Position.y - 40.f); - - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - Graphics()->QuadsSetRotation(0); - } - - if(g_Config.m_ClAfkEmote && m_pClient->m_aClients[ClientId].m_Afk && !(Client()->DummyConnected() && ClientId == m_pClient->m_aLocalIds[!g_Config.m_ClDummy])) - { - int CurEmoticon = (SPRITE_ZZZ - SPRITE_OOP); - Graphics()->TextureSet(GameClient()->m_EmoticonsSkin.m_aSpriteEmoticons[CurEmoticon]); - int QuadOffset = QuadOffsetToEmoticon + CurEmoticon; - Graphics()->SetColor(1.0f, 1.0f, 1.0f, Alpha); - Graphics()->RenderQuadContainerAsSprite(m_WeaponEmoteQuadContainerIndex, QuadOffset, Position.x + 24.f, Position.y - 40.f); - - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - Graphics()->QuadsSetRotation(0); - } - - if(g_Config.m_ClShowEmotes && !m_pClient->m_aClients[ClientId].m_EmoticonIgnore && m_pClient->m_aClients[ClientId].m_EmoticonStartTick != -1) - { - float SinceStart = (Client()->GameTick(g_Config.m_ClDummy) - m_pClient->m_aClients[ClientId].m_EmoticonStartTick) + (Client()->IntraGameTickSincePrev(g_Config.m_ClDummy) - m_pClient->m_aClients[ClientId].m_EmoticonStartFraction); - float FromEnd = (2 * Client()->GameTickSpeed()) - SinceStart; - - if(0 <= SinceStart && FromEnd > 0) - { - float a = 1; - - if(FromEnd < Client()->GameTickSpeed() / 5) - a = FromEnd / (Client()->GameTickSpeed() / 5.0f); - - float h = 1; - if(SinceStart < Client()->GameTickSpeed() / 10) - h = SinceStart / (Client()->GameTickSpeed() / 10.0f); - - float Wiggle = 0; - if(SinceStart < Client()->GameTickSpeed() / 5) - Wiggle = SinceStart / (Client()->GameTickSpeed() / 5.0f); - - float WiggleAngle = std::sin(5 * Wiggle); - - Graphics()->QuadsSetRotation(pi / 6 * WiggleAngle); - - Graphics()->SetColor(1.0f, 1.0f, 1.0f, a * Alpha); - // client_datas::emoticon is an offset from the first emoticon - int QuadOffset = QuadOffsetToEmoticon + m_pClient->m_aClients[ClientId].m_Emoticon; - Graphics()->TextureSet(GameClient()->m_EmoticonsSkin.m_aSpriteEmoticons[m_pClient->m_aClients[ClientId].m_Emoticon]); - Graphics()->RenderQuadContainerAsSprite(m_WeaponEmoteQuadContainerIndex, QuadOffset, Position.x, Position.y - 23.f - 32.f * h, 1.f, (64.f * h) / 64.f); - - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - Graphics()->QuadsSetRotation(0); - } - } -} - -inline bool CPlayers::IsPlayerInfoAvailable(int ClientId) const -{ - const void *pPrevInfo = Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_PLAYERINFO, ClientId); - const void *pInfo = Client()->SnapFindItem(IClient::SNAP_CURRENT, NETOBJTYPE_PLAYERINFO, ClientId); - return pPrevInfo && pInfo; -} - -void CPlayers::OnRender() -{ - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - CTeeRenderInfo aRenderInfo[MAX_CLIENTS]; - - // update RenderInfo for ninja - bool IsTeamplay = false; - if(m_pClient->m_Snap.m_pGameInfoObj) - IsTeamplay = (m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS) != 0; - for(int i = 0; i < MAX_CLIENTS; ++i) - { - aRenderInfo[i] = m_pClient->m_aClients[i].m_RenderInfo; - aRenderInfo[i].m_TeeRenderFlags = 0; - if(m_pClient->m_aClients[i].m_FreezeEnd != 0) - aRenderInfo[i].m_TeeRenderFlags |= TEE_EFFECT_FROZEN | TEE_NO_WEAPON; - if(m_pClient->m_aClients[i].m_LiveFrozen) - aRenderInfo[i].m_TeeRenderFlags |= TEE_EFFECT_FROZEN; - if(m_pClient->m_aClients[i].m_Invincible) - aRenderInfo[i].m_TeeRenderFlags |= TEE_EFFECT_SPARKLE; - - const CGameClient::CSnapState::CCharacterInfo &CharacterInfo = m_pClient->m_Snap.m_aCharacters[i]; - const bool Frozen = CharacterInfo.m_HasExtendedData && CharacterInfo.m_ExtendedData.m_FreezeEnd != 0; - if((CharacterInfo.m_Cur.m_Weapon == WEAPON_NINJA || (Frozen && !m_pClient->m_GameInfo.m_NoSkinChangeForFrozen)) && g_Config.m_ClShowNinja) - { - // change the skin for the player to the ninja - const auto *pSkin = m_pClient->m_Skins.FindOrNullptr("x_ninja"); - if(pSkin != nullptr) - { - aRenderInfo[i].m_aSixup[g_Config.m_ClDummy].Reset(); - - aRenderInfo[i].Apply(pSkin); - aRenderInfo[i].m_CustomColoredSkin = IsTeamplay; - if(!IsTeamplay) - { - aRenderInfo[i].m_ColorBody = ColorRGBA(1, 1, 1); - aRenderInfo[i].m_ColorFeet = ColorRGBA(1, 1, 1); - } - } - } - } - CTeeRenderInfo RenderInfoSpec; - RenderInfoSpec.Apply(m_pClient->m_Skins.Find("x_spec")); - RenderInfoSpec.m_Size = 64.0f; - const int LocalClientId = m_pClient->m_Snap.m_LocalClientId; - - // get screen edges to avoid rendering offscreen - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - // expand the edges to prevent popping in/out onscreen - // - // it is assumed that the tee, all its weapons, and emotes fit into a 200x200 box centered on the tee - // this may need to be changed or calculated differently in the future - float BorderBuffer = 100; - ScreenX0 -= BorderBuffer; - ScreenX1 += BorderBuffer; - ScreenY0 -= BorderBuffer; - ScreenY1 += BorderBuffer; - - // render everyone else's hook, then our own - for(int ClientId = 0; ClientId < MAX_CLIENTS; ClientId++) - { - if(ClientId == LocalClientId || !m_pClient->m_Snap.m_aCharacters[ClientId].m_Active || !IsPlayerInfoAvailable(ClientId)) - { - continue; - } - RenderHook(&m_pClient->m_aClients[ClientId].m_RenderPrev, &m_pClient->m_aClients[ClientId].m_RenderCur, &aRenderInfo[ClientId], ClientId); - } - if(LocalClientId != -1 && m_pClient->m_Snap.m_aCharacters[LocalClientId].m_Active && IsPlayerInfoAvailable(LocalClientId)) - { - const CGameClient::CClientData *pLocalClientData = &m_pClient->m_aClients[LocalClientId]; - RenderHook(&pLocalClientData->m_RenderPrev, &pLocalClientData->m_RenderCur, &aRenderInfo[LocalClientId], LocalClientId); - } - - // render spectating players - for(auto &Client : m_pClient->m_aClients) - { - if(!Client.m_SpecCharPresent) - { - continue; - } - RenderTools()->RenderTee(CAnimState::GetIdle(), &RenderInfoSpec, EMOTE_BLINK, vec2(1, 0), Client.m_SpecChar); - } - - // render everyone else's tee, then either our own or the tee we are spectating. - const int RenderLastId = (m_pClient->m_Snap.m_SpecInfo.m_SpectatorId != SPEC_FREEVIEW && m_pClient->m_Snap.m_SpecInfo.m_Active) ? m_pClient->m_Snap.m_SpecInfo.m_SpectatorId : LocalClientId; - - for(int ClientId = 0; ClientId < MAX_CLIENTS; ClientId++) - { - if(ClientId == RenderLastId || !m_pClient->m_Snap.m_aCharacters[ClientId].m_Active || !IsPlayerInfoAvailable(ClientId)) - { - continue; - } - - RenderHookCollLine(&m_pClient->m_aClients[ClientId].m_RenderPrev, &m_pClient->m_aClients[ClientId].m_RenderCur, ClientId); - - // don't render offscreen - vec2 *pRenderPos = &m_pClient->m_aClients[ClientId].m_RenderPos; - if(pRenderPos->x < ScreenX0 || pRenderPos->x > ScreenX1 || pRenderPos->y < ScreenY0 || pRenderPos->y > ScreenY1) - { - continue; - } - RenderPlayer(&m_pClient->m_aClients[ClientId].m_RenderPrev, &m_pClient->m_aClients[ClientId].m_RenderCur, &aRenderInfo[ClientId], ClientId); - } - if(RenderLastId != -1 && m_pClient->m_Snap.m_aCharacters[RenderLastId].m_Active && IsPlayerInfoAvailable(RenderLastId)) - { - const CGameClient::CClientData *pClientData = &m_pClient->m_aClients[RenderLastId]; - RenderHookCollLine(&pClientData->m_RenderPrev, &pClientData->m_RenderCur, RenderLastId); - RenderPlayer(&pClientData->m_RenderPrev, &pClientData->m_RenderCur, &aRenderInfo[RenderLastId], RenderLastId); - } -} - -void CPlayers::OnInit() -{ - m_WeaponEmoteQuadContainerIndex = Graphics()->CreateQuadContainer(false); - - Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); - - for(int i = 0; i < NUM_WEAPONS; ++i) - { - float ScaleX, ScaleY; - RenderTools()->GetSpriteScale(g_pData->m_Weapons.m_aId[i].m_pSpriteBody, ScaleX, ScaleY); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - RenderTools()->QuadContainerAddSprite(m_WeaponEmoteQuadContainerIndex, g_pData->m_Weapons.m_aId[i].m_VisualSize * ScaleX, g_pData->m_Weapons.m_aId[i].m_VisualSize * ScaleY); - Graphics()->QuadsSetSubset(0, 1, 1, 0); - RenderTools()->QuadContainerAddSprite(m_WeaponEmoteQuadContainerIndex, g_pData->m_Weapons.m_aId[i].m_VisualSize * ScaleX, g_pData->m_Weapons.m_aId[i].m_VisualSize * ScaleY); - } - float ScaleX, ScaleY; - - // at the end the hand - Graphics()->QuadsSetSubset(0, 0, 1, 1); - RenderTools()->QuadContainerAddSprite(m_WeaponEmoteQuadContainerIndex, 20.f); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - RenderTools()->QuadContainerAddSprite(m_WeaponEmoteQuadContainerIndex, 20.f); - - Graphics()->QuadsSetSubset(0, 0, 1, 1); - RenderTools()->QuadContainerAddSprite(m_WeaponEmoteQuadContainerIndex, -12.f, -8.f, 24.f, 16.f); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - RenderTools()->QuadContainerAddSprite(m_WeaponEmoteQuadContainerIndex, -12.f, -8.f, 24.f, 16.f); - - for(int i = 0; i < NUM_EMOTICONS; ++i) - { - Graphics()->QuadsSetSubset(0, 0, 1, 1); - RenderTools()->QuadContainerAddSprite(m_WeaponEmoteQuadContainerIndex, 64.f); - } - Graphics()->QuadContainerUpload(m_WeaponEmoteQuadContainerIndex); - - for(int i = 0; i < NUM_WEAPONS; ++i) - { - m_aWeaponSpriteMuzzleQuadContainerIndex[i] = Graphics()->CreateQuadContainer(false); - for(int n = 0; n < g_pData->m_Weapons.m_aId[i].m_NumSpriteMuzzles; ++n) - { - if(g_pData->m_Weapons.m_aId[i].m_aSpriteMuzzles[n]) - { - if(i == WEAPON_GUN || i == WEAPON_SHOTGUN) - { - // TODO: hardcoded for now to get the same particle size as before - RenderTools()->GetSpriteScaleImpl(96, 64, ScaleX, ScaleY); - } - else - RenderTools()->GetSpriteScale(g_pData->m_Weapons.m_aId[i].m_aSpriteMuzzles[n], ScaleX, ScaleY); - } - - float SWidth = (g_pData->m_Weapons.m_aId[i].m_VisualSize * ScaleX) * (4.0f / 3.0f); - float SHeight = g_pData->m_Weapons.m_aId[i].m_VisualSize * ScaleY; - - Graphics()->QuadsSetSubset(0, 0, 1, 1); - if(WEAPON_NINJA == i) - RenderTools()->QuadContainerAddSprite(m_aWeaponSpriteMuzzleQuadContainerIndex[i], 160.f * ScaleX, 160.f * ScaleY); - else - RenderTools()->QuadContainerAddSprite(m_aWeaponSpriteMuzzleQuadContainerIndex[i], SWidth, SHeight); - - Graphics()->QuadsSetSubset(0, 1, 1, 0); - if(WEAPON_NINJA == i) - RenderTools()->QuadContainerAddSprite(m_aWeaponSpriteMuzzleQuadContainerIndex[i], 160.f * ScaleX, 160.f * ScaleY); - else - RenderTools()->QuadContainerAddSprite(m_aWeaponSpriteMuzzleQuadContainerIndex[i], SWidth, SHeight); - } - Graphics()->QuadContainerUpload(m_aWeaponSpriteMuzzleQuadContainerIndex[i]); - } - - Graphics()->QuadsSetSubset(0.f, 0.f, 1.f, 1.f); - Graphics()->QuadsSetRotation(0.f); -} diff --git a/src/game/client/components/players.h b/src/game/client/components/players.h deleted file mode 100644 index b20df35185..0000000000 --- a/src/game/client/components/players.h +++ /dev/null @@ -1,54 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_PLAYERS_H -#define GAME_CLIENT_COMPONENTS_PLAYERS_H -#include - -#include -#include - -class CPlayers : public CComponent -{ - friend class CGhost; - - void RenderHand6(const CTeeRenderInfo *pInfo, vec2 CenterPos, vec2 Dir, float AngleOffset, vec2 PostRotOffset, float Alpha = 1.0f); - void RenderHand7(const CTeeRenderInfo *pInfo, vec2 CenterPos, vec2 Dir, float AngleOffset, vec2 PostRotOffset, float Alpha = 1.0f); - - void RenderHand(const CTeeRenderInfo *pInfo, vec2 CenterPos, vec2 Dir, float AngleOffset, vec2 PostRotOffset, float Alpha = 1.0f); - void RenderPlayer( - const CNetObj_Character *pPrevChar, - const CNetObj_Character *pPlayerChar, - const CTeeRenderInfo *pRenderInfo, - int ClientId, - float Intra = 0.f); - void RenderHook( - const CNetObj_Character *pPrevChar, - const CNetObj_Character *pPlayerChar, - const CTeeRenderInfo *pRenderInfo, - int ClientId, - float Intra = 0.f); - void RenderHookCollLine( - const CNetObj_Character *pPrevChar, - const CNetObj_Character *pPlayerChar, - int ClientId, - float Intra = 0.f); - bool IsPlayerInfoAvailable(int ClientId) const; - - int m_WeaponEmoteQuadContainerIndex; - int m_aWeaponSpriteMuzzleQuadContainerIndex[NUM_WEAPONS]; - - int64_t m_SkidSoundTime = 0; - -public: - float GetPlayerTargetAngle( - const CNetObj_Character *pPrevChar, - const CNetObj_Character *pPlayerChar, - int ClientId, - float Intra = 0.f); - - virtual int Sizeof() const override { return sizeof(*this); } - virtual void OnInit() override; - virtual void OnRender() override; -}; - -#endif diff --git a/src/game/client/components/race_demo.cpp b/src/game/client/components/race_demo.cpp deleted file mode 100644 index 43c99019d6..0000000000 --- a/src/game/client/components/race_demo.cpp +++ /dev/null @@ -1,265 +0,0 @@ -/* (c) Redix and Sushi */ - -#include - -#include -#include -#include - -#include -#include - -#include "race_demo.h" - -#include - -#include - -using namespace std::chrono_literals; - -const char *CRaceDemo::ms_pRaceDemoDir = "demos/auto/race"; - -struct CDemoItem -{ - char m_aName[128]; - int m_Time; -}; - -struct CDemoListParam -{ - const CRaceDemo *m_pThis; - std::vector *m_pvDemos; - const char *m_pMap; -}; - -CRaceDemo::CRaceDemo() : - m_RaceState(RACE_NONE), m_RaceStartTick(-1), m_RecordStopTick(-1), m_Time(0) {} - -void CRaceDemo::GetPath(char *pBuf, int Size, int Time) const -{ - const char *pMap = Client()->GetCurrentMap(); - - char aPlayerName[MAX_NAME_LENGTH]; - str_copy(aPlayerName, Client()->PlayerName()); - str_sanitize_filename(aPlayerName); - - if(Time < 0) - str_format(pBuf, Size, "%s/%s_tmp_%d.demo", ms_pRaceDemoDir, pMap, pid()); - else if(g_Config.m_ClDemoName) - str_format(pBuf, Size, "%s/%s_%d.%03d_%s.demo", ms_pRaceDemoDir, pMap, Time / 1000, Time % 1000, aPlayerName); - else - str_format(pBuf, Size, "%s/%s_%d.%03d.demo", ms_pRaceDemoDir, pMap, Time / 1000, Time % 1000); -} - -void CRaceDemo::OnStateChange(int NewState, int OldState) -{ - if(OldState == IClient::STATE_ONLINE) - StopRecord(); -} - -void CRaceDemo::OnNewSnapshot() -{ - if(!GameClient()->m_GameInfo.m_Race || !g_Config.m_ClAutoRaceRecord || Client()->State() != IClient::STATE_ONLINE) - return; - - if(!m_pClient->m_Snap.m_pGameInfoObj || m_pClient->m_Snap.m_SpecInfo.m_Active || !m_pClient->m_Snap.m_pLocalCharacter || !m_pClient->m_Snap.m_pLocalPrevCharacter) - return; - - static int s_LastRaceTick = -1; - - bool RaceFlag = m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_RACETIME; - bool ServerControl = RaceFlag && g_Config.m_ClRaceRecordServerControl; - int RaceTick = -m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer; - - // start the demo - bool ForceStart = ServerControl && s_LastRaceTick != RaceTick && Client()->GameTick(g_Config.m_ClDummy) - RaceTick < Client()->GameTickSpeed(); - bool AllowRestart = (m_AllowRestart || ForceStart) && m_RaceStartTick + 10 * Client()->GameTickSpeed() < Client()->GameTick(g_Config.m_ClDummy); - if(m_RaceState == RACE_IDLE || m_RaceState == RACE_PREPARE || (m_RaceState == RACE_STARTED && AllowRestart)) - { - vec2 PrevPos = vec2(m_pClient->m_Snap.m_pLocalPrevCharacter->m_X, m_pClient->m_Snap.m_pLocalPrevCharacter->m_Y); - vec2 Pos = vec2(m_pClient->m_Snap.m_pLocalCharacter->m_X, m_pClient->m_Snap.m_pLocalCharacter->m_Y); - - if(ForceStart || (!ServerControl && GameClient()->RaceHelper()->IsStart(PrevPos, Pos))) - { - if(m_RaceState == RACE_STARTED) - Client()->RaceRecord_Stop(); - if(m_RaceState != RACE_PREPARE) // start recording again - { - GetPath(m_aTmpFilename, sizeof(m_aTmpFilename)); - Client()->RaceRecord_Start(m_aTmpFilename); - } - m_RaceStartTick = Client()->GameTick(g_Config.m_ClDummy); - m_RaceState = RACE_STARTED; - } - } - - // start recording before the player passes the start line, so we can see some preparation steps - if(m_RaceState == RACE_NONE) - { - GetPath(m_aTmpFilename, sizeof(m_aTmpFilename)); - Client()->RaceRecord_Start(m_aTmpFilename); - m_RaceStartTick = Client()->GameTick(g_Config.m_ClDummy); - m_RaceState = RACE_PREPARE; - } - - // stop recording if the player did not pass the start line after 20 seconds - if(m_RaceState == RACE_PREPARE && Client()->GameTick(g_Config.m_ClDummy) - m_RaceStartTick >= Client()->GameTickSpeed() * 20) - { - StopRecord(); - m_RaceState = RACE_IDLE; - } - - // stop the demo - if(m_RaceState == RACE_FINISHED && m_RecordStopTick <= Client()->GameTick(g_Config.m_ClDummy)) - StopRecord(m_Time); - - s_LastRaceTick = RaceFlag ? RaceTick : -1; -} - -void CRaceDemo::OnReset() -{ - StopRecord(); -} - -void CRaceDemo::OnShutdown() -{ - StopRecord(); -} - -void CRaceDemo::OnMessage(int MsgType, void *pRawMsg) -{ - // check for messages from server - if(MsgType == NETMSGTYPE_SV_KILLMSG) - { - CNetMsg_Sv_KillMsg *pMsg = (CNetMsg_Sv_KillMsg *)pRawMsg; - if(pMsg->m_Victim == m_pClient->m_Snap.m_LocalClientId && Client()->RaceRecord_IsRecording()) - StopRecord(m_Time); - } - else if(MsgType == NETMSGTYPE_SV_KILLMSGTEAM) - { - CNetMsg_Sv_KillMsgTeam *pMsg = (CNetMsg_Sv_KillMsgTeam *)pRawMsg; - for(int i = 0; i < MAX_CLIENTS; i++) - { - if(m_pClient->m_Teams.Team(i) == pMsg->m_Team && i == m_pClient->m_Snap.m_LocalClientId && Client()->RaceRecord_IsRecording()) - StopRecord(m_Time); - } - } - else if(MsgType == NETMSGTYPE_SV_CHAT) - { - CNetMsg_Sv_Chat *pMsg = (CNetMsg_Sv_Chat *)pRawMsg; - if(pMsg->m_ClientId == -1 && m_RaceState == RACE_STARTED) - { - char aName[MAX_NAME_LENGTH]; - int Time = CRaceHelper::TimeFromFinishMessage(pMsg->m_pMessage, aName, sizeof(aName)); - if(Time > 0 && m_pClient->m_Snap.m_LocalClientId >= 0 && str_comp(aName, m_pClient->m_aClients[m_pClient->m_Snap.m_LocalClientId].m_aName) == 0) - { - m_RaceState = RACE_FINISHED; - m_RecordStopTick = Client()->GameTick(g_Config.m_ClDummy) + Client()->GameTickSpeed(); - m_Time = Time; - } - } - } -} - -void CRaceDemo::OnMapLoad() -{ - m_AllowRestart = false; -} - -void CRaceDemo::StopRecord(int Time) -{ - if(Client()->RaceRecord_IsRecording()) - Client()->RaceRecord_Stop(); - - if(m_aTmpFilename[0] != '\0') - { - if(Time > 0 && CheckDemo(Time)) - { - // save file - char aNewFilename[512]; - GetPath(aNewFilename, sizeof(aNewFilename), m_Time); - - Storage()->RenameFile(m_aTmpFilename, aNewFilename, IStorage::TYPE_SAVE); - } - else // no new record - Storage()->RemoveFile(m_aTmpFilename, IStorage::TYPE_SAVE); - - m_aTmpFilename[0] = '\0'; - } - - m_Time = 0; - m_RaceState = RACE_NONE; - m_RaceStartTick = -1; - m_RecordStopTick = -1; -} - -struct SRaceDemoFetchUser -{ - CRaceDemo *m_pThis; - CDemoListParam *m_pParam; -}; - -int CRaceDemo::RaceDemolistFetchCallback(const CFsFileInfo *pInfo, int IsDir, int StorageType, void *pUser) -{ - auto *pRealUser = (SRaceDemoFetchUser *)pUser; - auto *pParam = pRealUser->m_pParam; - int MapLen = str_length(pParam->m_pMap); - if(IsDir || !str_endswith(pInfo->m_pName, ".demo") || !str_startswith(pInfo->m_pName, pParam->m_pMap) || pInfo->m_pName[MapLen] != '_') - return 0; - - CDemoItem Item; - str_truncate(Item.m_aName, sizeof(Item.m_aName), pInfo->m_pName, str_length(pInfo->m_pName) - 5); - - const char *pTime = Item.m_aName + MapLen + 1; - const char *pTEnd = pTime; - while(isdigit(*pTEnd) || *pTEnd == ' ' || *pTEnd == '.' || *pTEnd == ',') - pTEnd++; - - if(g_Config.m_ClDemoName) - { - char aPlayerName[MAX_NAME_LENGTH]; - str_copy(aPlayerName, pParam->m_pThis->Client()->PlayerName()); - str_sanitize_filename(aPlayerName); - - if(pTEnd[0] != '_' || str_comp(pTEnd + 1, aPlayerName) != 0) - return 0; - } - else if(pTEnd[0]) - return 0; - - Item.m_Time = CRaceHelper::TimeFromSecondsStr(pTime); - if(Item.m_Time > 0) - pParam->m_pvDemos->push_back(Item); - - if(time_get_nanoseconds() - pRealUser->m_pThis->m_RaceDemosLoadStartTime > 500ms) - { - pRealUser->m_pThis->GameClient()->m_Menus.RenderLoading(Localize("Loading race demo files"), "", 0); - } - - return 0; -} - -bool CRaceDemo::CheckDemo(int Time) -{ - std::vector vDemos; - CDemoListParam Param = {this, &vDemos, Client()->GetCurrentMap()}; - m_RaceDemosLoadStartTime = time_get_nanoseconds(); - SRaceDemoFetchUser User; - User.m_pParam = &Param; - User.m_pThis = this; - Storage()->ListDirectoryInfo(IStorage::TYPE_SAVE, ms_pRaceDemoDir, RaceDemolistFetchCallback, &User); - - // loop through demo files - for(auto &Demo : vDemos) - { - if(Time >= Demo.m_Time) // found a better demo - return false; - - // delete old demo - char aFilename[IO_MAX_PATH_LENGTH]; - str_format(aFilename, sizeof(aFilename), "%s/%s.demo", ms_pRaceDemoDir, Demo.m_aName); - Storage()->RemoveFile(aFilename, IStorage::TYPE_SAVE); - } - - return true; -} diff --git a/src/game/client/components/race_demo.h b/src/game/client/components/race_demo.h deleted file mode 100644 index 018c5ca8a9..0000000000 --- a/src/game/client/components/race_demo.h +++ /dev/null @@ -1,51 +0,0 @@ -/* (c) Redix and Sushi */ - -#ifndef GAME_CLIENT_COMPONENTS_RACE_DEMO_H -#define GAME_CLIENT_COMPONENTS_RACE_DEMO_H - -#include -#include - -class CRaceDemo : public CComponent -{ - enum - { - RACE_NONE = 0, - RACE_IDLE, - RACE_PREPARE, - RACE_STARTED, - RACE_FINISHED, - }; - - static const char *ms_pRaceDemoDir; - - char m_aTmpFilename[128]; - - int m_RaceState; - int m_RaceStartTick; - int m_RecordStopTick; - int m_Time; - - std::chrono::nanoseconds m_RaceDemosLoadStartTime{0}; - - static int RaceDemolistFetchCallback(const CFsFileInfo *pInfo, int IsDir, int StorageType, void *pUser); - - void GetPath(char *pBuf, int Size, int Time = -1) const; - - void StopRecord(int Time = -1); - bool CheckDemo(int Time); - -public: - bool m_AllowRestart; - - CRaceDemo(); - virtual int Sizeof() const override { return sizeof(*this); } - - virtual void OnReset() override; - virtual void OnStateChange(int NewState, int OldState) override; - virtual void OnMessage(int MsgType, void *pRawMsg) override; - virtual void OnMapLoad() override; - virtual void OnShutdown() override; - virtual void OnNewSnapshot() override; -}; -#endif diff --git a/src/game/client/components/scoreboard.cpp b/src/game/client/components/scoreboard.cpp deleted file mode 100644 index 789668793d..0000000000 --- a/src/game/client/components/scoreboard.cpp +++ /dev/null @@ -1,850 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include "scoreboard.h" - -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -CScoreboard::CScoreboard() -{ - OnReset(); -} - -void CScoreboard::ConKeyScoreboard(IConsole::IResult *pResult, void *pUserData) -{ - CScoreboard *pSelf = static_cast(pUserData); - pSelf->m_Active = pResult->GetInteger(0) != 0; -} - -void CScoreboard::OnConsoleInit() -{ - Console()->Register("+scoreboard", "", CFGFLAG_CLIENT, ConKeyScoreboard, this, "Show scoreboard"); -} - -void CScoreboard::OnInit() -{ - m_DeadTeeTexture = Graphics()->LoadTexture("deadtee.png", IStorage::TYPE_ALL); -} - -void CScoreboard::OnReset() -{ - m_Active = false; - m_ServerRecord = -1.0f; -} - -void CScoreboard::OnRelease() -{ - m_Active = false; -} - -void CScoreboard::OnMessage(int MsgType, void *pRawMsg) -{ - if(MsgType == NETMSGTYPE_SV_RECORD) - { - CNetMsg_Sv_Record *pMsg = static_cast(pRawMsg); - m_ServerRecord = pMsg->m_ServerTimeBest / 100.0f; - } - else if(MsgType == NETMSGTYPE_SV_RECORDLEGACY) - { - CNetMsg_Sv_RecordLegacy *pMsg = static_cast(pRawMsg); - m_ServerRecord = pMsg->m_ServerTimeBest / 100.0f; - } -} - -void CScoreboard::RenderTitle(CUIRect TitleBar, int Team, const char *pTitle) -{ - dbg_assert(Team == TEAM_RED || Team == TEAM_BLUE, "Team invalid"); - - const CNetObj_GameInfo *pGameInfoObj = GameClient()->m_Snap.m_pGameInfoObj; - - char aScore[128] = ""; - if(GameClient()->m_GameInfo.m_TimeScore) - { - if(m_ServerRecord > 0) - { - str_time_float(m_ServerRecord, TIME_HOURS, aScore, sizeof(aScore)); - } - } - else if(pGameInfoObj && (pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS)) - { - const CNetObj_GameData *pGameDataObj = GameClient()->m_Snap.m_pGameDataObj; - if(pGameDataObj) - { - str_format(aScore, sizeof(aScore), "%d", Team == TEAM_RED ? pGameDataObj->m_TeamscoreRed : pGameDataObj->m_TeamscoreBlue); - } - } - else - { - if(GameClient()->m_Snap.m_SpecInfo.m_Active && - GameClient()->m_Snap.m_SpecInfo.m_SpectatorId != SPEC_FREEVIEW && - GameClient()->m_Snap.m_apPlayerInfos[GameClient()->m_Snap.m_SpecInfo.m_SpectatorId]) - { - str_format(aScore, sizeof(aScore), "%d", GameClient()->m_Snap.m_apPlayerInfos[GameClient()->m_Snap.m_SpecInfo.m_SpectatorId]->m_Score); - } - else if(GameClient()->m_Snap.m_pLocalInfo) - { - str_format(aScore, sizeof(aScore), "%d", GameClient()->m_Snap.m_pLocalInfo->m_Score); - } - } - - const float TitleFontSize = 40.0f; - const float ScoreTextWidth = TextRender()->TextWidth(TitleFontSize, aScore); - - TitleBar.VMargin(20.0f, &TitleBar); - CUIRect TitleLabel, ScoreLabel; - if(Team == TEAM_RED) - { - TitleBar.VSplitRight(ScoreTextWidth, &TitleLabel, &ScoreLabel); - TitleLabel.VSplitRight(10.0f, &TitleLabel, nullptr); - } - else - { - TitleBar.VSplitLeft(ScoreTextWidth, &ScoreLabel, &TitleLabel); - TitleLabel.VSplitLeft(10.0f, nullptr, &TitleLabel); - } - - { - SLabelProperties Props; - Props.m_MaxWidth = TitleLabel.w; - Props.m_EllipsisAtEnd = true; - Ui()->DoLabel(&TitleLabel, pTitle, TitleFontSize, Team == TEAM_RED ? TEXTALIGN_ML : TEXTALIGN_MR, Props); - } - - if(aScore[0] != '\0') - { - Ui()->DoLabel(&ScoreLabel, aScore, TitleFontSize, Team == TEAM_RED ? TEXTALIGN_MR : TEXTALIGN_ML); - } -} - -void CScoreboard::RenderGoals(CUIRect Goals) -{ - Goals.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f), IGraphics::CORNER_ALL, 15.0f); - Goals.VMargin(10.0f, &Goals); - - const float FontSize = 20.0f; - const CNetObj_GameInfo *pGameInfoObj = GameClient()->m_Snap.m_pGameInfoObj; - char aBuf[64]; - - if(pGameInfoObj->m_ScoreLimit) - { - str_format(aBuf, sizeof(aBuf), "%s: %d", Localize("Score limit"), pGameInfoObj->m_ScoreLimit); - Ui()->DoLabel(&Goals, aBuf, FontSize, TEXTALIGN_ML); - } - - if(pGameInfoObj->m_TimeLimit) - { - str_format(aBuf, sizeof(aBuf), Localize("Time limit: %d min"), pGameInfoObj->m_TimeLimit); - Ui()->DoLabel(&Goals, aBuf, FontSize, TEXTALIGN_MC); - } - - if(pGameInfoObj->m_RoundNum && pGameInfoObj->m_RoundCurrent) - { - str_format(aBuf, sizeof(aBuf), Localize("Round %d/%d"), pGameInfoObj->m_RoundCurrent, pGameInfoObj->m_RoundNum); - Ui()->DoLabel(&Goals, aBuf, FontSize, TEXTALIGN_MR); - } -} - -void CScoreboard::RenderSpectators(CUIRect Spectators) -{ - Spectators.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f), IGraphics::CORNER_ALL, 15.0f); - Spectators.Margin(10.0f, &Spectators); - - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, Spectators.x, Spectators.y, 22.0f, TEXTFLAG_RENDER); - Cursor.m_LineWidth = Spectators.w; - Cursor.m_MaxLines = round_truncate(Spectators.h / Cursor.m_FontSize); - - int RemainingSpectators = 0; - for(const CNetObj_PlayerInfo *pInfo : GameClient()->m_Snap.m_apInfoByName) - { - if(!pInfo || pInfo->m_Team != TEAM_SPECTATORS) - continue; - ++RemainingSpectators; - } - - TextRender()->TextEx(&Cursor, Localize("Spectators")); - - if(RemainingSpectators > 0) - { - TextRender()->TextEx(&Cursor, ": "); - } - - bool CommaNeeded = false; - for(const CNetObj_PlayerInfo *pInfo : GameClient()->m_Snap.m_apInfoByName) - { - if(!pInfo || pInfo->m_Team != TEAM_SPECTATORS) - continue; - - if(CommaNeeded) - { - TextRender()->TextEx(&Cursor, ", "); - } - - if(Cursor.m_LineCount == Cursor.m_MaxLines && RemainingSpectators >= 2) - { - // This is less expensive than checking with a separate invisible - // text cursor though we waste some space at the end of the line. - char aRemaining[64]; - str_format(aRemaining, sizeof(aRemaining), Localize("%d others…", "Spectators"), RemainingSpectators); - TextRender()->TextEx(&Cursor, aRemaining); - break; - } - - if(g_Config.m_ClShowIds) - { - char aClientId[16]; - GameClient()->FormatClientId(pInfo->m_ClientId, aClientId, EClientIdFormat::NO_INDENT); - TextRender()->TextEx(&Cursor, aClientId); - } - - { - const char *pClanName = GameClient()->m_aClients[pInfo->m_ClientId].m_aClan; - - if(pClanName[0] != '\0') - { - if(str_comp(pClanName, GameClient()->m_aClients[GameClient()->m_aLocalIds[g_Config.m_ClDummy]].m_aClan) == 0) - { - TextRender()->TextColor(color_cast(ColorHSLA(g_Config.m_ClSameClanColor))); - } - else - { - TextRender()->TextColor(ColorRGBA(0.7f, 0.7f, 0.7f)); - } - - TextRender()->TextEx(&Cursor, pClanName); - TextRender()->TextEx(&Cursor, " "); - - TextRender()->TextColor(TextRender()->DefaultTextColor()); - } - } - - if(GameClient()->m_aClients[pInfo->m_ClientId].m_AuthLevel) - { - TextRender()->TextColor(color_cast(ColorHSLA(g_Config.m_ClAuthedPlayerColor))); - } - - TextRender()->TextEx(&Cursor, GameClient()->m_aClients[pInfo->m_ClientId].m_aName); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - - CommaNeeded = true; - --RemainingSpectators; - } -} - -void CScoreboard::RenderScoreboard(CUIRect Scoreboard, int Team, int CountStart, int CountEnd, CScoreboardRenderState &State) -{ - dbg_assert(Team == TEAM_RED || Team == TEAM_BLUE, "Team invalid"); - - const CNetObj_GameInfo *pGameInfoObj = GameClient()->m_Snap.m_pGameInfoObj; - const CNetObj_GameData *pGameDataObj = GameClient()->m_Snap.m_pGameDataObj; - const bool TimeScore = GameClient()->m_GameInfo.m_TimeScore; - const int NumPlayers = CountEnd - CountStart; - const bool LowScoreboardWidth = Scoreboard.w < 700.0f; - - bool Race7 = Client()->IsSixup() && pGameInfoObj && pGameInfoObj->m_GameFlags & protocol7::GAMEFLAG_RACE; - - // calculate measurements - float LineHeight; - float TeeSizeMod; - float Spacing; - float RoundRadius; - float FontSize; - if(NumPlayers <= 8) - { - LineHeight = 60.0f; - TeeSizeMod = 1.0f; - Spacing = 16.0f; - RoundRadius = 10.0f; - FontSize = 24.0f; - } - else if(NumPlayers <= 12) - { - LineHeight = 50.0f; - TeeSizeMod = 0.9f; - Spacing = 5.0f; - RoundRadius = 10.0f; - FontSize = 24.0f; - } - else if(NumPlayers <= 16) - { - LineHeight = 40.0f; - TeeSizeMod = 0.8f; - Spacing = 0.0f; - RoundRadius = 5.0f; - FontSize = 24.0f; - } - else if(NumPlayers <= 24) - { - LineHeight = 27.0f; - TeeSizeMod = 0.6f; - Spacing = 0.0f; - RoundRadius = 5.0f; - FontSize = 20.0f; - } - else if(NumPlayers <= 32) - { - LineHeight = 20.0f; - TeeSizeMod = 0.4f; - Spacing = 0.0f; - RoundRadius = 5.0f; - FontSize = 16.0f; - } - else if(LowScoreboardWidth) - { - LineHeight = 15.0f; - TeeSizeMod = 0.25f; - Spacing = 0.0f; - RoundRadius = 2.0f; - FontSize = 14.0f; - } - else - { - LineHeight = 10.0f; - TeeSizeMod = 0.2f; - Spacing = 0.0f; - RoundRadius = 2.0f; - FontSize = 10.0f; - } - - const float ScoreOffset = Scoreboard.x + 40.0f; - const float ScoreLength = TextRender()->TextWidth(FontSize, TimeScore ? "00:00:00" : "99999"); - const float TeeOffset = ScoreOffset + ScoreLength + 20.0f; - const float TeeLength = 60.0f * TeeSizeMod; - const float NameOffset = TeeOffset + TeeLength; - const float NameLength = (LowScoreboardWidth ? 180.0f : 300.0f) - TeeLength; - const float CountryLength = (LineHeight - Spacing - TeeSizeMod * 5.0f) * 2.0f; - const float PingLength = 55.0f; - const float PingOffset = Scoreboard.x + Scoreboard.w - PingLength - 20.0f; - const float CountryOffset = PingOffset - CountryLength; - const float ClanOffset = NameOffset + NameLength + 5.0f; - const float ClanLength = CountryOffset - ClanOffset - 5.0f; - - // render headlines - const float HeadlineFontsize = 22.0f; - CUIRect Headline; - Scoreboard.HSplitTop(HeadlineFontsize * 2.0f, &Headline, &Scoreboard); - const float HeadlineY = Headline.y + Headline.h / 2.0f - HeadlineFontsize / 2.0f; - const char *pScore = TimeScore ? Localize("Time") : Localize("Score"); - TextRender()->Text(ScoreOffset + ScoreLength - TextRender()->TextWidth(HeadlineFontsize, pScore), HeadlineY, HeadlineFontsize, pScore); - TextRender()->Text(NameOffset, HeadlineY, HeadlineFontsize, Localize("Name")); - const char *pClanLabel = Localize("Clan"); - TextRender()->Text(ClanOffset + (ClanLength - TextRender()->TextWidth(HeadlineFontsize, pClanLabel)) / 2.0f, HeadlineY, HeadlineFontsize, pClanLabel); - const char *pPingLabel = Localize("Ping"); - TextRender()->Text(PingOffset + PingLength - TextRender()->TextWidth(HeadlineFontsize, pPingLabel), HeadlineY, HeadlineFontsize, pPingLabel); - - // render player entries - int CountRendered = 0; - int PrevDDTeam = -1; - int &CurrentDDTeamSize = State.m_CurrentDDTeamSize; - - char aBuf[64]; - int MaxTeamSize = m_pClient->Config()->m_SvMaxTeamSize; - - for(int RenderDead = 0; RenderDead < 2; RenderDead++) - { - for(int i = 0; i < MAX_CLIENTS; i++) - { - // make sure that we render the correct team - const CNetObj_PlayerInfo *pInfo = GameClient()->m_Snap.m_apInfoByDDTeamScore[i]; - if(!pInfo || pInfo->m_Team != Team) - continue; - - if(CountRendered++ < CountStart) - continue; - - int DDTeam = GameClient()->m_Teams.Team(pInfo->m_ClientId); - int NextDDTeam = 0; - bool IsDead = Client()->m_TranslationContext.m_aClients[pInfo->m_ClientId].m_PlayerFlags7 & protocol7::PLAYERFLAG_DEAD; - if(!RenderDead && IsDead) - continue; - if(RenderDead && !IsDead) - continue; - - ColorRGBA TextColor = TextRender()->DefaultTextColor(); - TextColor.a = RenderDead ? 0.5f : 1.0f; - TextRender()->TextColor(TextColor); - - for(int j = i + 1; j < MAX_CLIENTS; j++) - { - const CNetObj_PlayerInfo *pInfoNext = GameClient()->m_Snap.m_apInfoByDDTeamScore[j]; - if(!pInfoNext || pInfoNext->m_Team != Team) - continue; - - NextDDTeam = GameClient()->m_Teams.Team(pInfoNext->m_ClientId); - break; - } - - if(PrevDDTeam == -1) - { - for(int j = i - 1; j >= 0; j--) - { - const CNetObj_PlayerInfo *pInfoPrev = GameClient()->m_Snap.m_apInfoByDDTeamScore[j]; - if(!pInfoPrev || pInfoPrev->m_Team != Team) - continue; - - PrevDDTeam = GameClient()->m_Teams.Team(pInfoPrev->m_ClientId); - break; - } - } - - CUIRect RowAndSpacing, Row; - Scoreboard.HSplitTop(LineHeight + Spacing, &RowAndSpacing, &Scoreboard); - RowAndSpacing.HSplitTop(LineHeight, &Row, nullptr); - - // team background - if(DDTeam != TEAM_FLOCK) - { - const ColorRGBA Color = GameClient()->GetDDTeamColor(DDTeam).WithAlpha(0.5f); - int TeamRectCorners = 0; - if(PrevDDTeam != DDTeam) - { - TeamRectCorners |= IGraphics::CORNER_T; - State.m_TeamStartX = Row.x; - State.m_TeamStartY = Row.y; - } - if(NextDDTeam != DDTeam) - TeamRectCorners |= IGraphics::CORNER_B; - RowAndSpacing.Draw(Color, TeamRectCorners, RoundRadius); - - CurrentDDTeamSize++; - - if(NextDDTeam != DDTeam) - { - const float TeamFontSize = FontSize / 1.5f; - - if(NumPlayers > 8) - { - if(DDTeam == TEAM_SUPER) - str_copy(aBuf, Localize("Super")); - else if(CurrentDDTeamSize <= 1) - str_format(aBuf, sizeof(aBuf), "%d", DDTeam); - else - str_format(aBuf, sizeof(aBuf), Localize("%d\n(%d/%d)", "Team and size"), DDTeam, CurrentDDTeamSize, MaxTeamSize); - TextRender()->Text(State.m_TeamStartX, maximum(State.m_TeamStartY + Row.h / 2.0f - TeamFontSize, State.m_TeamStartY + 3.0f /* padding top */), TeamFontSize, aBuf); - } - else - { - if(DDTeam == TEAM_SUPER) - str_copy(aBuf, Localize("Super")); - else if(CurrentDDTeamSize > 1) - str_format(aBuf, sizeof(aBuf), Localize("Team %d (%d/%d)"), DDTeam, CurrentDDTeamSize, MaxTeamSize); - else - str_format(aBuf, sizeof(aBuf), Localize("Team %d"), DDTeam); - TextRender()->Text(Row.x + Row.w / 2.0f - TextRender()->TextWidth(TeamFontSize, aBuf) / 2.0f + 10.0f, Row.y + Row.h, TeamFontSize, aBuf); - } - - CurrentDDTeamSize = 0; - } - } - PrevDDTeam = DDTeam; - - // background so it's easy to find the local player or the followed one in spectator mode - if((!GameClient()->m_Snap.m_SpecInfo.m_Active && pInfo->m_Local) || - (GameClient()->m_Snap.m_SpecInfo.m_SpectatorId == SPEC_FREEVIEW && pInfo->m_Local) || - (GameClient()->m_Snap.m_SpecInfo.m_Active && pInfo->m_ClientId == GameClient()->m_Snap.m_SpecInfo.m_SpectatorId)) - { - Row.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_ALL, RoundRadius); - } - - // score - if(Race7) - { - if(pInfo->m_Score == -1) - { - aBuf[0] = '\0'; - } - else - { - // 0.7 uses milliseconds and ddnets str_time wants centiseconds - // 0.7 servers can also send the amount of precision the client should use - // we ignore that and always show 3 digit precision - str_time((int64_t)absolute(pInfo->m_Score / 10), TIME_MINS_CENTISECS, aBuf, sizeof(aBuf)); - } - } - else if(TimeScore) - { - if(pInfo->m_Score == -9999) - { - aBuf[0] = '\0'; - } - else - { - str_time((int64_t)absolute(pInfo->m_Score) * 100, TIME_HOURS, aBuf, sizeof(aBuf)); - } - } - else - { - str_format(aBuf, sizeof(aBuf), "%d", clamp(pInfo->m_Score, -999, 99999)); - } - TextRender()->Text(ScoreOffset + ScoreLength - TextRender()->TextWidth(FontSize, aBuf), Row.y + (Row.h - FontSize) / 2.0f, FontSize, aBuf); - - // CTF flag - if(pGameInfoObj && (pGameInfoObj->m_GameFlags & GAMEFLAG_FLAGS) && - pGameDataObj && (pGameDataObj->m_FlagCarrierRed == pInfo->m_ClientId || pGameDataObj->m_FlagCarrierBlue == pInfo->m_ClientId)) - { - Graphics()->BlendNormal(); - Graphics()->TextureSet(pGameDataObj->m_FlagCarrierBlue == pInfo->m_ClientId ? GameClient()->m_GameSkin.m_SpriteFlagBlue : GameClient()->m_GameSkin.m_SpriteFlagRed); - Graphics()->QuadsBegin(); - Graphics()->QuadsSetSubset(1.0f, 0.0f, 0.0f, 1.0f); - IGraphics::CQuadItem QuadItem(TeeOffset, Row.y - 5.0f - Spacing / 2.0f, Row.h / 2.0f, Row.h); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); - } - - const CGameClient::CClientData &ClientData = GameClient()->m_aClients[pInfo->m_ClientId]; - - // skin - if(RenderDead) - { - Graphics()->BlendNormal(); - Graphics()->TextureSet(m_DeadTeeTexture); - Graphics()->QuadsBegin(); - if(m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS) - { - ColorRGBA Color = m_pClient->m_Skins7.GetTeamColor(true, 0, m_pClient->m_aClients[pInfo->m_ClientId].m_Team, protocol7::SKINPART_BODY); - Graphics()->SetColor(Color.r, Color.g, Color.b, Color.a); - } - CTeeRenderInfo TeeInfo = m_pClient->m_aClients[pInfo->m_ClientId].m_RenderInfo; - TeeInfo.m_Size *= TeeSizeMod; - IGraphics::CQuadItem QuadItem(TeeOffset, Row.y, TeeInfo.m_Size, TeeInfo.m_Size); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); - } - else - { - CTeeRenderInfo TeeInfo = ClientData.m_RenderInfo; - TeeInfo.m_Size *= TeeSizeMod; - vec2 OffsetToMid; - CRenderTools::GetRenderTeeOffsetToRenderedTee(CAnimState::GetIdle(), &TeeInfo, OffsetToMid); - const vec2 TeeRenderPos = vec2(TeeOffset + TeeLength / 2, Row.y + Row.h / 2.0f + OffsetToMid.y); - RenderTools()->RenderTee(CAnimState::GetIdle(), &TeeInfo, EMOTE_NORMAL, vec2(1.0f, 0.0f), TeeRenderPos); - } - - // name - { - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, NameOffset, Row.y + (Row.h - FontSize) / 2.0f, FontSize, TEXTFLAG_RENDER | TEXTFLAG_ELLIPSIS_AT_END); - Cursor.m_LineWidth = NameLength; - if(ClientData.m_AuthLevel) - { - TextRender()->TextColor(color_cast(ColorHSLA(g_Config.m_ClAuthedPlayerColor))); - } - if(g_Config.m_ClShowIds) - { - char aClientId[16]; - GameClient()->FormatClientId(pInfo->m_ClientId, aClientId, EClientIdFormat::INDENT_AUTO); - TextRender()->TextEx(&Cursor, aClientId); - } - TextRender()->TextEx(&Cursor, ClientData.m_aName); - - // ready / watching - if(Client()->IsSixup() && Client()->m_TranslationContext.m_aClients[pInfo->m_ClientId].m_PlayerFlags7 & protocol7::PLAYERFLAG_READY) - { - TextRender()->TextColor(0.1f, 1.0f, 0.1f, TextColor.a); - TextRender()->TextEx(&Cursor, "✓"); - } - } - - // clan - { - if(str_comp(ClientData.m_aClan, GameClient()->m_aClients[GameClient()->m_aLocalIds[g_Config.m_ClDummy]].m_aClan) == 0) - { - TextRender()->TextColor(color_cast(ColorHSLA(g_Config.m_ClSameClanColor))); - } - else - { - TextRender()->TextColor(TextColor); - } - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, ClanOffset + (ClanLength - minimum(TextRender()->TextWidth(FontSize, ClientData.m_aClan), ClanLength)) / 2.0f, Row.y + (Row.h - FontSize) / 2.0f, FontSize, TEXTFLAG_RENDER | TEXTFLAG_ELLIPSIS_AT_END); - Cursor.m_LineWidth = ClanLength; - TextRender()->TextEx(&Cursor, ClientData.m_aClan); - } - - // country flag - GameClient()->m_CountryFlags.Render(ClientData.m_Country, ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f), - CountryOffset, Row.y + (Spacing + TeeSizeMod * 5.0f) / 2.0f, CountryLength, Row.h - Spacing - TeeSizeMod * 5.0f); - - // ping - if(g_Config.m_ClEnablePingColor) - { - TextRender()->TextColor(color_cast(ColorHSLA((300.0f - clamp(pInfo->m_Latency, 0, 300)) / 1000.0f, 1.0f, 0.5f))); - } - else - { - TextRender()->TextColor(TextRender()->DefaultTextColor()); - } - str_format(aBuf, sizeof(aBuf), "%d", clamp(pInfo->m_Latency, 0, 999)); - TextRender()->Text(PingOffset + PingLength - TextRender()->TextWidth(FontSize, aBuf), Row.y + (Row.h - FontSize) / 2.0f, FontSize, aBuf); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - - if(CountRendered == CountEnd) - break; - } - } -} - -void CScoreboard::RenderRecordingNotification(float x) -{ - char aBuf[512] = ""; - - const auto &&AppendRecorderInfo = [&](int Recorder, const char *pName) { - if(GameClient()->DemoRecorder(Recorder)->IsRecording()) - { - char aTime[32]; - str_time((int64_t)GameClient()->DemoRecorder(Recorder)->Length() * 100, TIME_HOURS, aTime, sizeof(aTime)); - str_append(aBuf, pName); - str_append(aBuf, " "); - str_append(aBuf, aTime); - str_append(aBuf, " "); - } - }; - - AppendRecorderInfo(RECORDER_MANUAL, Localize("Manual")); - AppendRecorderInfo(RECORDER_RACE, Localize("Race")); - AppendRecorderInfo(RECORDER_AUTO, Localize("Auto")); - AppendRecorderInfo(RECORDER_REPLAYS, Localize("Replay")); - - if(aBuf[0] == '\0') - return; - - const float FontSize = 20.0f; - - CUIRect Rect = {x, 0.0f, TextRender()->TextWidth(FontSize, aBuf) + 60.0f, 50.0f}; - Rect.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.4f), IGraphics::CORNER_B, 15.0f); - Rect.VSplitLeft(20.0f, nullptr, &Rect); - Rect.VSplitRight(10.0f, &Rect, nullptr); - - CUIRect Circle; - Rect.VSplitLeft(20.0f, &Circle, &Rect); - Circle.HMargin((Circle.h - Circle.w) / 2.0f, &Circle); - Circle.Draw(ColorRGBA(1.0f, 0.0f, 0.0f, 1.0f), IGraphics::CORNER_ALL, Circle.h / 2.0f); - - Rect.VSplitLeft(10.0f, nullptr, &Rect); - Ui()->DoLabel(&Rect, aBuf, FontSize, TEXTALIGN_ML); -} - -void CScoreboard::OnRender() -{ - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - if(!Active()) - return; - - // if the score board is active, then we should clear the motd message as well - if(GameClient()->m_Motd.IsActive()) - GameClient()->m_Motd.Clear(); - - const float Height = 400.0f * 3.0f; - const float Width = Height * Graphics()->ScreenAspect(); - Graphics()->MapScreen(0, 0, Width, Height); - - const CNetObj_GameInfo *pGameInfoObj = GameClient()->m_Snap.m_pGameInfoObj; - const bool Teams = pGameInfoObj && (pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS); - const auto &aTeamSize = GameClient()->m_Snap.m_aTeamSize; - const int NumPlayers = Teams ? maximum(aTeamSize[TEAM_RED], aTeamSize[TEAM_BLUE]) : aTeamSize[TEAM_RED]; - - const float ScoreboardSmallWidth = 750.0f + 20.0f; - const float ScoreboardWidth = !Teams && NumPlayers <= 16 ? ScoreboardSmallWidth : 1500.0f; - const float TitleHeight = 60.0f; - - CUIRect Scoreboard = {(Width - ScoreboardWidth) / 2.0f, 150.0f, ScoreboardWidth, 710.0f + TitleHeight}; - CScoreboardRenderState RenderState{}; - - if(Teams) - { - const char *pRedTeamName = GetTeamName(TEAM_RED); - const char *pBlueTeamName = GetTeamName(TEAM_BLUE); - - // Game over title - const CNetObj_GameData *pGameDataObj = GameClient()->m_Snap.m_pGameDataObj; - if((pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_GAMEOVER) && pGameDataObj) - { - char aTitle[256]; - if(pGameDataObj->m_TeamscoreRed > pGameDataObj->m_TeamscoreBlue) - { - TextRender()->TextColor(ColorRGBA(0.975f, 0.17f, 0.17f, 1.0f)); - if(pRedTeamName == nullptr) - { - str_copy(aTitle, Localize("Red team wins!")); - } - else - { - str_format(aTitle, sizeof(aTitle), Localize("%s wins!"), pRedTeamName); - } - } - else if(pGameDataObj->m_TeamscoreBlue > pGameDataObj->m_TeamscoreRed) - { - TextRender()->TextColor(ColorRGBA(0.17f, 0.46f, 0.975f, 1.0f)); - if(pBlueTeamName == nullptr) - { - str_copy(aTitle, Localize("Blue team wins!")); - } - else - { - str_format(aTitle, sizeof(aTitle), Localize("%s wins!"), pBlueTeamName); - } - } - else - { - TextRender()->TextColor(ColorRGBA(0.91f, 0.78f, 0.33f, 1.0f)); - str_copy(aTitle, Localize("Draw!")); - } - - const float TitleFontSize = 72.0f; - CUIRect GameOverTitle = {Scoreboard.x, Scoreboard.y - TitleFontSize - 12.0f, Scoreboard.w, TitleFontSize}; - Ui()->DoLabel(&GameOverTitle, aTitle, TitleFontSize, TEXTALIGN_MC); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - } - - CUIRect RedScoreboard, BlueScoreboard, RedTitle, BlueTitle; - Scoreboard.VSplitMid(&RedScoreboard, &BlueScoreboard, 15.0f); - RedScoreboard.HSplitTop(TitleHeight, &RedTitle, &RedScoreboard); - BlueScoreboard.HSplitTop(TitleHeight, &BlueTitle, &BlueScoreboard); - - RedTitle.Draw(ColorRGBA(0.975f, 0.17f, 0.17f, 0.5f), IGraphics::CORNER_T, 15.0f); - BlueTitle.Draw(ColorRGBA(0.17f, 0.46f, 0.975f, 0.5f), IGraphics::CORNER_T, 15.0f); - RedScoreboard.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f), IGraphics::CORNER_B, 15.0f); - BlueScoreboard.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f), IGraphics::CORNER_B, 15.0f); - - RenderTitle(RedTitle, TEAM_RED, pRedTeamName == nullptr ? Localize("Red team") : pRedTeamName); - RenderTitle(BlueTitle, TEAM_BLUE, pBlueTeamName == nullptr ? Localize("Blue team") : pBlueTeamName); - RenderScoreboard(RedScoreboard, TEAM_RED, 0, NumPlayers, RenderState); - RenderScoreboard(BlueScoreboard, TEAM_BLUE, 0, NumPlayers, RenderState); - } - else - { - Scoreboard.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f), IGraphics::CORNER_ALL, 15.0f); - - const char *pTitle; - if(pGameInfoObj && (pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_GAMEOVER)) - { - pTitle = Localize("Game over"); - } - else - { - pTitle = Client()->GetCurrentMap(); - } - - CUIRect Title; - Scoreboard.HSplitTop(TitleHeight, &Title, &Scoreboard); - RenderTitle(Title, TEAM_RED, pTitle); - - if(NumPlayers <= 16) - { - RenderScoreboard(Scoreboard, TEAM_RED, 0, NumPlayers, RenderState); - } - else if(NumPlayers <= 64) - { - int PlayersPerSide; - if(NumPlayers <= 24) - PlayersPerSide = 12; - else if(NumPlayers <= 32) - PlayersPerSide = 16; - else if(NumPlayers <= 48) - PlayersPerSide = 24; - else - PlayersPerSide = 32; - - CUIRect LeftScoreboard, RightScoreboard; - Scoreboard.VSplitMid(&LeftScoreboard, &RightScoreboard); - RenderScoreboard(LeftScoreboard, TEAM_RED, 0, PlayersPerSide, RenderState); - RenderScoreboard(RightScoreboard, TEAM_RED, PlayersPerSide, 2 * PlayersPerSide, RenderState); - } - else - { - const int NumColumns = 3; - const int PlayersPerColumn = std::ceil(128.0f / NumColumns); - CUIRect RemainingScoreboard = Scoreboard; - for(int i = 0; i < NumColumns; ++i) - { - CUIRect Column; - RemainingScoreboard.VSplitLeft(Scoreboard.w / NumColumns, &Column, &RemainingScoreboard); - RenderScoreboard(Column, TEAM_RED, i * PlayersPerColumn, (i + 1) * PlayersPerColumn, RenderState); - } - } - } - - CUIRect Spectators = {(Width - ScoreboardSmallWidth) / 2.0f, Scoreboard.y + Scoreboard.h + 10.0f, ScoreboardSmallWidth, 200.0f}; - if(pGameInfoObj && (pGameInfoObj->m_ScoreLimit || pGameInfoObj->m_TimeLimit || (pGameInfoObj->m_RoundNum && pGameInfoObj->m_RoundCurrent))) - { - CUIRect Goals; - Spectators.HSplitTop(50.0f, &Goals, &Spectators); - Spectators.HSplitTop(10.0f, nullptr, &Spectators); - RenderGoals(Goals); - } - RenderSpectators(Spectators); - - RenderRecordingNotification((Width / 7) * 4 + 20); -} - -bool CScoreboard::Active() const -{ - // if statboard is active don't show scoreboard - if(GameClient()->m_Statboard.IsActive()) - return false; - - if(m_Active) - return true; - - const CNetObj_GameInfo *pGameInfoObj = GameClient()->m_Snap.m_pGameInfoObj; - if(GameClient()->m_Snap.m_pLocalInfo && !GameClient()->m_Snap.m_SpecInfo.m_Active) - { - // we are not a spectator, check if we are dead and the game isn't paused - if(!GameClient()->m_Snap.m_pLocalCharacter && g_Config.m_ClScoreboardOnDeath && - !(pGameInfoObj && pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_PAUSED)) - return true; - } - - // if the game is over - if(pGameInfoObj && pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_GAMEOVER) - return true; - - return false; -} - -const char *CScoreboard::GetTeamName(int Team) const -{ - dbg_assert(Team == TEAM_RED || Team == TEAM_BLUE, "Team invalid"); - - int ClanPlayers = 0; - const char *pClanName = nullptr; - for(const CNetObj_PlayerInfo *pInfo : GameClient()->m_Snap.m_apInfoByScore) - { - if(!pInfo || pInfo->m_Team != Team) - continue; - - if(!pClanName) - { - pClanName = GameClient()->m_aClients[pInfo->m_ClientId].m_aClan; - ClanPlayers++; - } - else - { - if(str_comp(GameClient()->m_aClients[pInfo->m_ClientId].m_aClan, pClanName) == 0) - ClanPlayers++; - else - return nullptr; - } - } - - if(ClanPlayers > 1 && pClanName[0] != '\0') - return pClanName; - else - return nullptr; -} diff --git a/src/game/client/components/scoreboard.h b/src/game/client/components/scoreboard.h deleted file mode 100644 index 81ddf02e50..0000000000 --- a/src/game/client/components/scoreboard.h +++ /dev/null @@ -1,51 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_SCOREBOARD_H -#define GAME_CLIENT_COMPONENTS_SCOREBOARD_H - -#include -#include - -#include -#include - -class CScoreboard : public CComponent -{ - struct CScoreboardRenderState - { - float m_TeamStartX; - float m_TeamStartY; - int m_CurrentDDTeamSize; - - CScoreboardRenderState() : - m_TeamStartX(0), m_TeamStartY(0), m_CurrentDDTeamSize(0) {} - }; - - void RenderTitle(CUIRect TitleBar, int Team, const char *pTitle); - void RenderGoals(CUIRect Goals); - void RenderSpectators(CUIRect Spectators); - void RenderScoreboard(CUIRect Scoreboard, int Team, int CountStart, int CountEnd, CScoreboardRenderState &State); - void RenderRecordingNotification(float x); - - static void ConKeyScoreboard(IConsole::IResult *pResult, void *pUserData); - const char *GetTeamName(int Team) const; - - bool m_Active; - float m_ServerRecord; - - IGraphics::CTextureHandle m_DeadTeeTexture; - -public: - CScoreboard(); - virtual int Sizeof() const override { return sizeof(*this); } - virtual void OnConsoleInit() override; - virtual void OnInit() override; - virtual void OnReset() override; - virtual void OnRender() override; - virtual void OnRelease() override; - virtual void OnMessage(int MsgType, void *pRawMsg) override; - - bool Active() const; -}; - -#endif diff --git a/src/game/client/components/skins.cpp b/src/game/client/components/skins.cpp deleted file mode 100644 index e26002da73..0000000000 --- a/src/game/client/components/skins.cpp +++ /dev/null @@ -1,626 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include "skins.h" - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -CSkins::CSkins() : - m_PlaceholderSkin("dummy") -{ - m_PlaceholderSkin.m_OriginalSkin.Reset(); - m_PlaceholderSkin.m_ColorableSkin.Reset(); - m_PlaceholderSkin.m_BloodColor = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - m_PlaceholderSkin.m_Metrics.m_Body.m_Width = 64; - m_PlaceholderSkin.m_Metrics.m_Body.m_Height = 64; - m_PlaceholderSkin.m_Metrics.m_Body.m_OffsetX = 16; - m_PlaceholderSkin.m_Metrics.m_Body.m_OffsetY = 16; - m_PlaceholderSkin.m_Metrics.m_Body.m_MaxWidth = 96; - m_PlaceholderSkin.m_Metrics.m_Body.m_MaxHeight = 96; - m_PlaceholderSkin.m_Metrics.m_Feet.m_Width = 32; - m_PlaceholderSkin.m_Metrics.m_Feet.m_Height = 16; - m_PlaceholderSkin.m_Metrics.m_Feet.m_OffsetX = 16; - m_PlaceholderSkin.m_Metrics.m_Feet.m_OffsetY = 8; - m_PlaceholderSkin.m_Metrics.m_Feet.m_MaxWidth = 64; - m_PlaceholderSkin.m_Metrics.m_Feet.m_MaxHeight = 32; -} - -bool CSkins::IsVanillaSkin(const char *pName) -{ - return std::any_of(std::begin(VANILLA_SKINS), std::end(VANILLA_SKINS), [pName](const char *pVanillaSkin) { return str_comp(pName, pVanillaSkin) == 0; }); -} - -bool CSkins::IsSpecialSkin(const char *pName) -{ - return str_startswith(pName, "x_") != nullptr; -} - -class CSkinScanUser -{ -public: - CSkins *m_pThis; - CSkins::TSkinLoadedCallback m_SkinLoadedCallback; -}; - -int CSkins::SkinScan(const char *pName, int IsDir, int DirType, void *pUser) -{ - auto *pUserReal = static_cast(pUser); - CSkins *pSelf = pUserReal->m_pThis; - - if(IsDir) - return 0; - - const char *pSuffix = str_endswith(pName, ".png"); - if(pSuffix == nullptr) - return 0; - - char aSkinName[IO_MAX_PATH_LENGTH]; - str_truncate(aSkinName, sizeof(aSkinName), pName, pSuffix - pName); - if(!CSkin::IsValidName(aSkinName)) - { - log_error("skins", "Skin name is not valid: %s", aSkinName); - log_error("skins", "%s", CSkin::m_aSkinNameRestrictions); - return 0; - } - - if(g_Config.m_ClVanillaSkinsOnly && !IsVanillaSkin(aSkinName)) - return 0; - - char aPath[IO_MAX_PATH_LENGTH]; - str_format(aPath, sizeof(aPath), "skins/%s", pName); - pSelf->LoadSkin(aSkinName, aPath, DirType); - pUserReal->m_SkinLoadedCallback(); - return 0; -} - -static void CheckMetrics(CSkin::SSkinMetricVariable &Metrics, const uint8_t *pImg, int ImgWidth, int ImgX, int ImgY, int CheckWidth, int CheckHeight) -{ - int MaxY = -1; - int MinY = CheckHeight + 1; - int MaxX = -1; - int MinX = CheckWidth + 1; - - for(int y = 0; y < CheckHeight; y++) - { - for(int x = 0; x < CheckWidth; x++) - { - int OffsetAlpha = (y + ImgY) * ImgWidth + (x + ImgX) * 4 + 3; - uint8_t AlphaValue = pImg[OffsetAlpha]; - if(AlphaValue > 0) - { - if(MaxY < y) - MaxY = y; - if(MinY > y) - MinY = y; - if(MaxX < x) - MaxX = x; - if(MinX > x) - MinX = x; - } - } - } - - Metrics.m_Width = clamp((MaxX - MinX) + 1, 1, CheckWidth); - Metrics.m_Height = clamp((MaxY - MinY) + 1, 1, CheckHeight); - Metrics.m_OffsetX = clamp(MinX, 0, CheckWidth - 1); - Metrics.m_OffsetY = clamp(MinY, 0, CheckHeight - 1); - Metrics.m_MaxWidth = CheckWidth; - Metrics.m_MaxHeight = CheckHeight; -} - -const CSkin *CSkins::LoadSkin(const char *pName, const char *pPath, int DirType) -{ - CImageInfo Info; - if(!Graphics()->LoadPng(Info, pPath, DirType)) - { - log_error("skins", "Failed to load skin PNG: %s", pName); - return nullptr; - } - return LoadSkin(pName, Info); -} - -const CSkin *CSkins::LoadSkin(const char *pName, CImageInfo &Info) -{ - if(!Graphics()->CheckImageDivisibility(pName, Info, g_pData->m_aSprites[SPRITE_TEE_BODY].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_TEE_BODY].m_pSet->m_Gridy, true)) - { - log_error("skins", "Skin failed image divisibility: %s", pName); - return nullptr; - } - if(!Graphics()->IsImageFormatRgba(pName, Info)) - { - log_error("skins", "Skin format is not RGBA: %s", pName); - return nullptr; - } - - CSkin Skin{pName}; - Skin.m_OriginalSkin.m_Body = Graphics()->LoadSpriteTexture(Info, &g_pData->m_aSprites[SPRITE_TEE_BODY]); - Skin.m_OriginalSkin.m_BodyOutline = Graphics()->LoadSpriteTexture(Info, &g_pData->m_aSprites[SPRITE_TEE_BODY_OUTLINE]); - Skin.m_OriginalSkin.m_Feet = Graphics()->LoadSpriteTexture(Info, &g_pData->m_aSprites[SPRITE_TEE_FOOT]); - Skin.m_OriginalSkin.m_FeetOutline = Graphics()->LoadSpriteTexture(Info, &g_pData->m_aSprites[SPRITE_TEE_FOOT_OUTLINE]); - Skin.m_OriginalSkin.m_Hands = Graphics()->LoadSpriteTexture(Info, &g_pData->m_aSprites[SPRITE_TEE_HAND]); - Skin.m_OriginalSkin.m_HandsOutline = Graphics()->LoadSpriteTexture(Info, &g_pData->m_aSprites[SPRITE_TEE_HAND_OUTLINE]); - - for(int i = 0; i < 6; ++i) - Skin.m_OriginalSkin.m_aEyes[i] = Graphics()->LoadSpriteTexture(Info, &g_pData->m_aSprites[SPRITE_TEE_EYE_NORMAL + i]); - - int FeetGridPixelsWidth = (Info.m_Width / g_pData->m_aSprites[SPRITE_TEE_FOOT].m_pSet->m_Gridx); - int FeetGridPixelsHeight = (Info.m_Height / g_pData->m_aSprites[SPRITE_TEE_FOOT].m_pSet->m_Gridy); - int FeetWidth = g_pData->m_aSprites[SPRITE_TEE_FOOT].m_W * FeetGridPixelsWidth; - int FeetHeight = g_pData->m_aSprites[SPRITE_TEE_FOOT].m_H * FeetGridPixelsHeight; - - int FeetOffsetX = g_pData->m_aSprites[SPRITE_TEE_FOOT].m_X * FeetGridPixelsWidth; - int FeetOffsetY = g_pData->m_aSprites[SPRITE_TEE_FOOT].m_Y * FeetGridPixelsHeight; - - int FeetOutlineGridPixelsWidth = (Info.m_Width / g_pData->m_aSprites[SPRITE_TEE_FOOT_OUTLINE].m_pSet->m_Gridx); - int FeetOutlineGridPixelsHeight = (Info.m_Height / g_pData->m_aSprites[SPRITE_TEE_FOOT_OUTLINE].m_pSet->m_Gridy); - int FeetOutlineWidth = g_pData->m_aSprites[SPRITE_TEE_FOOT_OUTLINE].m_W * FeetOutlineGridPixelsWidth; - int FeetOutlineHeight = g_pData->m_aSprites[SPRITE_TEE_FOOT_OUTLINE].m_H * FeetOutlineGridPixelsHeight; - - int FeetOutlineOffsetX = g_pData->m_aSprites[SPRITE_TEE_FOOT_OUTLINE].m_X * FeetOutlineGridPixelsWidth; - int FeetOutlineOffsetY = g_pData->m_aSprites[SPRITE_TEE_FOOT_OUTLINE].m_Y * FeetOutlineGridPixelsHeight; - - int BodyOutlineGridPixelsWidth = (Info.m_Width / g_pData->m_aSprites[SPRITE_TEE_BODY_OUTLINE].m_pSet->m_Gridx); - int BodyOutlineGridPixelsHeight = (Info.m_Height / g_pData->m_aSprites[SPRITE_TEE_BODY_OUTLINE].m_pSet->m_Gridy); - int BodyOutlineWidth = g_pData->m_aSprites[SPRITE_TEE_BODY_OUTLINE].m_W * BodyOutlineGridPixelsWidth; - int BodyOutlineHeight = g_pData->m_aSprites[SPRITE_TEE_BODY_OUTLINE].m_H * BodyOutlineGridPixelsHeight; - - int BodyOutlineOffsetX = g_pData->m_aSprites[SPRITE_TEE_BODY_OUTLINE].m_X * BodyOutlineGridPixelsWidth; - int BodyOutlineOffsetY = g_pData->m_aSprites[SPRITE_TEE_BODY_OUTLINE].m_Y * BodyOutlineGridPixelsHeight; - - size_t BodyWidth = g_pData->m_aSprites[SPRITE_TEE_BODY].m_W * (Info.m_Width / g_pData->m_aSprites[SPRITE_TEE_BODY].m_pSet->m_Gridx); // body width - size_t BodyHeight = g_pData->m_aSprites[SPRITE_TEE_BODY].m_H * (Info.m_Height / g_pData->m_aSprites[SPRITE_TEE_BODY].m_pSet->m_Gridy); // body height - if(BodyWidth > Info.m_Width || BodyHeight > Info.m_Height) - return nullptr; - uint8_t *pData = Info.m_pData; - const int PixelStep = 4; - int Pitch = Info.m_Width * PixelStep; - - // dig out blood color - { - int64_t aColors[3] = {0}; - for(size_t y = 0; y < BodyHeight; y++) - { - for(size_t x = 0; x < BodyWidth; x++) - { - uint8_t AlphaValue = pData[y * Pitch + x * PixelStep + 3]; - if(AlphaValue > 128) - { - aColors[0] += pData[y * Pitch + x * PixelStep + 0]; - aColors[1] += pData[y * Pitch + x * PixelStep + 1]; - aColors[2] += pData[y * Pitch + x * PixelStep + 2]; - } - } - } - - Skin.m_BloodColor = ColorRGBA(normalize(vec3(aColors[0], aColors[1], aColors[2]))); - } - - CheckMetrics(Skin.m_Metrics.m_Body, pData, Pitch, 0, 0, BodyWidth, BodyHeight); - - // body outline metrics - CheckMetrics(Skin.m_Metrics.m_Body, pData, Pitch, BodyOutlineOffsetX, BodyOutlineOffsetY, BodyOutlineWidth, BodyOutlineHeight); - - // get feet size - CheckMetrics(Skin.m_Metrics.m_Feet, pData, Pitch, FeetOffsetX, FeetOffsetY, FeetWidth, FeetHeight); - - // get feet outline size - CheckMetrics(Skin.m_Metrics.m_Feet, pData, Pitch, FeetOutlineOffsetX, FeetOutlineOffsetY, FeetOutlineWidth, FeetOutlineHeight); - - ConvertToGrayscale(Info); - - int aFreq[256] = {0}; - int OrgWeight = 0; - int NewWeight = 192; - - // find most common frequency - for(size_t y = 0; y < BodyHeight; y++) - for(size_t x = 0; x < BodyWidth; x++) - { - if(pData[y * Pitch + x * PixelStep + 3] > 128) - aFreq[pData[y * Pitch + x * PixelStep]]++; - } - - for(int i = 1; i < 256; i++) - { - if(aFreq[OrgWeight] < aFreq[i]) - OrgWeight = i; - } - - // reorder - int InvOrgWeight = 255 - OrgWeight; - int InvNewWeight = 255 - NewWeight; - for(size_t y = 0; y < BodyHeight; y++) - for(size_t x = 0; x < BodyWidth; x++) - { - int v = pData[y * Pitch + x * PixelStep]; - if(v <= OrgWeight && OrgWeight == 0) - v = 0; - else if(v <= OrgWeight) - v = (int)(((v / (float)OrgWeight) * NewWeight)); - else if(InvOrgWeight == 0) - v = NewWeight; - else - v = (int)(((v - OrgWeight) / (float)InvOrgWeight) * InvNewWeight + NewWeight); - pData[y * Pitch + x * PixelStep] = v; - pData[y * Pitch + x * PixelStep + 1] = v; - pData[y * Pitch + x * PixelStep + 2] = v; - } - - Skin.m_ColorableSkin.m_Body = Graphics()->LoadSpriteTexture(Info, &g_pData->m_aSprites[SPRITE_TEE_BODY]); - Skin.m_ColorableSkin.m_BodyOutline = Graphics()->LoadSpriteTexture(Info, &g_pData->m_aSprites[SPRITE_TEE_BODY_OUTLINE]); - Skin.m_ColorableSkin.m_Feet = Graphics()->LoadSpriteTexture(Info, &g_pData->m_aSprites[SPRITE_TEE_FOOT]); - Skin.m_ColorableSkin.m_FeetOutline = Graphics()->LoadSpriteTexture(Info, &g_pData->m_aSprites[SPRITE_TEE_FOOT_OUTLINE]); - Skin.m_ColorableSkin.m_Hands = Graphics()->LoadSpriteTexture(Info, &g_pData->m_aSprites[SPRITE_TEE_HAND]); - Skin.m_ColorableSkin.m_HandsOutline = Graphics()->LoadSpriteTexture(Info, &g_pData->m_aSprites[SPRITE_TEE_HAND_OUTLINE]); - - for(int i = 0; i < 6; ++i) - Skin.m_ColorableSkin.m_aEyes[i] = Graphics()->LoadSpriteTexture(Info, &g_pData->m_aSprites[SPRITE_TEE_EYE_NORMAL + i]); - - Info.Free(); - - if(g_Config.m_Debug) - { - log_trace("skins", "Loaded skin '%s'", Skin.GetName()); - } - - auto &&pSkin = std::make_unique(std::move(Skin)); - const auto SkinInsertIt = m_Skins.insert({pSkin->GetName(), std::move(pSkin)}); - - m_LastRefreshTime = time_get_nanoseconds(); - - return SkinInsertIt.first->second.get(); -} - -void CSkins::OnInit() -{ - m_aEventSkinPrefix[0] = '\0'; - - if(g_Config.m_Events) - { - if(time_season() == SEASON_XMAS) - { - str_copy(m_aEventSkinPrefix, "santa"); - } - } - - // load skins - Refresh([this]() { - GameClient()->m_Menus.RenderLoading(Localize("Loading DDNet Client"), Localize("Loading skin files"), 0); - }); -} - -void CSkins::OnShutdown() -{ - m_LoadingSkins.clear(); -} - -void CSkins::Refresh(TSkinLoadedCallback &&SkinLoadedCallback) -{ - m_LoadingSkins.clear(); - - for(const auto &[_, pSkin] : m_Skins) - { - pSkin->m_OriginalSkin.Unload(Graphics()); - pSkin->m_ColorableSkin.Unload(Graphics()); - } - m_Skins.clear(); - - CSkinScanUser SkinScanUser; - SkinScanUser.m_pThis = this; - SkinScanUser.m_SkinLoadedCallback = SkinLoadedCallback; - Storage()->ListDirectory(IStorage::TYPE_ALL, "skins", SkinScan, &SkinScanUser); - - m_LastRefreshTime = time_get_nanoseconds(); -} - -const CSkin *CSkins::Find(const char *pName) -{ - const auto *pSkin = FindOrNullptr(pName); - if(pSkin == nullptr) - { - pSkin = FindOrNullptr("default"); - } - if(pSkin == nullptr) - { - pSkin = &m_PlaceholderSkin; - } - return pSkin; -} - -const CSkin *CSkins::FindOrNullptr(const char *pName, bool IgnorePrefix) -{ - if(g_Config.m_ClVanillaSkinsOnly && !IsVanillaSkin(pName)) - { - return nullptr; - } - - const char *pSkinPrefix = m_aEventSkinPrefix[0] != '\0' ? m_aEventSkinPrefix : g_Config.m_ClSkinPrefix; - if(!IgnorePrefix && pSkinPrefix[0] != '\0') - { - char aNameWithPrefix[2 * MAX_SKIN_LENGTH + 2]; // Larger than skin name length to allow IsValidName to check if it's too long - str_format(aNameWithPrefix, sizeof(aNameWithPrefix), "%s_%s", pSkinPrefix, pName); - // If we find something, use it, otherwise fall back to normal skins. - const auto *pResult = FindImpl(aNameWithPrefix); - if(pResult != nullptr) - { - return pResult; - } - } - - return FindImpl(pName); -} - -const CSkin *CSkins::FindImpl(const char *pName) -{ - auto SkinIt = m_Skins.find(pName); - if(SkinIt != m_Skins.end()) - return SkinIt->second.get(); - - if(str_comp(pName, "default") == 0) - return nullptr; - - if(!g_Config.m_ClDownloadSkins) - return nullptr; - - if(!CSkin::IsValidName(pName)) - return nullptr; - - auto ExistingLoadingSkin = m_LoadingSkins.find(pName); - if(ExistingLoadingSkin != m_LoadingSkins.end()) - { - std::unique_ptr &pLoadingSkin = ExistingLoadingSkin->second; - if(!pLoadingSkin->m_pDownloadJob || !pLoadingSkin->m_pDownloadJob->Done()) - return nullptr; - - if(pLoadingSkin->m_pDownloadJob->State() == IJob::STATE_DONE && pLoadingSkin->m_pDownloadJob->ImageInfo().m_pData) - { - LoadSkin(pLoadingSkin->Name(), pLoadingSkin->m_pDownloadJob->ImageInfo()); - } - pLoadingSkin->m_pDownloadJob = nullptr; - return nullptr; - } - - CLoadingSkin LoadingSkin(pName); - LoadingSkin.m_pDownloadJob = std::make_shared(this, pName); - Engine()->AddJob(LoadingSkin.m_pDownloadJob); - auto &&pLoadingSkin = std::make_unique(std::move(LoadingSkin)); - m_LoadingSkins.insert({pLoadingSkin->Name(), std::move(pLoadingSkin)}); - return nullptr; -} - -void CSkins::RandomizeSkin(int Dummy) -{ - static const float s_aSchemes[] = {1.0f / 2.0f, 1.0f / 3.0f, 1.0f / -3.0f, 1.0f / 12.0f, 1.0f / -12.0f}; // complementary, triadic, analogous - const bool UseCustomColor = Dummy ? g_Config.m_ClDummyUseCustomColor : g_Config.m_ClPlayerUseCustomColor; - if(UseCustomColor) - { - float GoalSat = random_float(0.3f, 1.0f); - float MaxBodyLht = 1.0f - GoalSat * GoalSat; // max allowed lightness before we start losing saturation - - ColorHSLA Body; - Body.h = random_float(); - Body.l = random_float(0.0f, MaxBodyLht); - Body.s = clamp(GoalSat * GoalSat / (1.0f - Body.l), 0.0f, 1.0f); - - ColorHSLA Feet; - Feet.h = std::fmod(Body.h + s_aSchemes[rand() % std::size(s_aSchemes)], 1.0f); - Feet.l = random_float(); - Feet.s = clamp(GoalSat * GoalSat / (1.0f - Feet.l), 0.0f, 1.0f); - - unsigned *pColorBody = Dummy ? &g_Config.m_ClDummyColorBody : &g_Config.m_ClPlayerColorBody; - unsigned *pColorFeet = Dummy ? &g_Config.m_ClDummyColorFeet : &g_Config.m_ClPlayerColorFeet; - - *pColorBody = Body.Pack(false); - *pColorFeet = Feet.Pack(false); - } - - std::vector vpConsideredSkins; - for(const auto &[_, pSkin] : m_Skins) - { - if(IsSpecialSkin(pSkin->GetName())) - continue; - vpConsideredSkins.push_back(pSkin.get()); - } - const CSkin *pRandomSkin; - if(vpConsideredSkins.empty()) - { - pRandomSkin = Find("default"); - } - else - { - pRandomSkin = vpConsideredSkins[rand() % vpConsideredSkins.size()]; - } - - char *pSkinName = Dummy ? g_Config.m_ClDummySkin : g_Config.m_ClPlayerSkin; - const size_t SkinNameSize = Dummy ? sizeof(g_Config.m_ClDummySkin) : sizeof(g_Config.m_ClPlayerSkin); - str_copy(pSkinName, pRandomSkin->GetName(), SkinNameSize); -} - -CSkins::CSkinDownloadJob::CSkinDownloadJob(CSkins *pSkins, const char *pName) : - m_pSkins(pSkins) -{ - str_copy(m_aName, pName); - Abortable(true); -} - -CSkins::CSkinDownloadJob::~CSkinDownloadJob() -{ - m_ImageInfo.Free(); -} - -bool CSkins::CSkinDownloadJob::Abort() -{ - if(!IJob::Abort()) - { - return false; - } - - const CLockScope LockScope(m_Lock); - if(m_pGetRequest) - { - m_pGetRequest->Abort(); - m_pGetRequest = nullptr; - } - return true; -} - -void CSkins::CSkinDownloadJob::Run() -{ - const char *pBaseUrl = g_Config.m_ClDownloadCommunitySkins != 0 ? g_Config.m_ClSkinCommunityDownloadUrl : g_Config.m_ClSkinDownloadUrl; - - char aEscapedName[256]; - EscapeUrl(aEscapedName, m_aName); - - char aUrl[IO_MAX_PATH_LENGTH]; - str_format(aUrl, sizeof(aUrl), "%s%s.png", pBaseUrl, aEscapedName); - - char aPathReal[IO_MAX_PATH_LENGTH]; - str_format(aPathReal, sizeof(aPathReal), "downloadedskins/%s.png", m_aName); - - const CTimeout Timeout{10000, 0, 8192, 10}; - const size_t MaxResponseSize = 10 * 1024 * 1024; // 10 MiB - - // We assume the file does not exist if we could not get the times - time_t FileCreatedTime, FileModifiedTime; - const bool GotFileTimes = m_pSkins->Storage()->RetrieveTimes(aPathReal, IStorage::TYPE_SAVE, &FileCreatedTime, &FileModifiedTime); - - std::shared_ptr pGet = HttpGet(aUrl); - pGet->Timeout(Timeout); - pGet->MaxResponseSize(MaxResponseSize); - if(GotFileTimes) - { - pGet->IfModifiedSince(FileModifiedTime); - pGet->FailOnErrorStatus(false); - } - pGet->LogProgress(HTTPLOG::NONE); - { - const CLockScope LockScope(m_Lock); - m_pGetRequest = pGet; - } - m_pSkins->Http()->Run(pGet); - - // Load existing file while waiting for the HTTP request - if(GotFileTimes) - { - m_pSkins->Graphics()->LoadPng(m_ImageInfo, aPathReal, IStorage::TYPE_SAVE); - } - - pGet->Wait(); - { - const CLockScope LockScope(m_Lock); - m_pGetRequest = nullptr; - } - if(pGet->State() != EHttpState::DONE || State() == IJob::STATE_ABORTED || pGet->StatusCode() >= 400) - { - return; - } - if(pGet->StatusCode() == 304) // 304 Not Modified - { - if(m_ImageInfo.m_pData != nullptr) - { - return; // Local skin is up-to-date and was loaded successfully - } - - log_error("skins", "Failed to load PNG of existing downloaded skin '%s' from '%s', downloading it again", m_aName, aPathReal); - pGet = HttpGet(aUrl); - pGet->Timeout(Timeout); - pGet->MaxResponseSize(MaxResponseSize); - pGet->LogProgress(HTTPLOG::NONE); - { - const CLockScope LockScope(m_Lock); - m_pGetRequest = pGet; - } - m_pSkins->Http()->Run(pGet); - pGet->Wait(); - { - const CLockScope LockScope(m_Lock); - m_pGetRequest = nullptr; - } - if(pGet->State() != EHttpState::DONE || State() == IJob::STATE_ABORTED) - { - return; - } - } - - unsigned char *pResult; - size_t ResultSize; - pGet->Result(&pResult, &ResultSize); - - if(!m_pSkins->Graphics()->LoadPng(m_ImageInfo, pResult, ResultSize, aUrl)) - { - log_error("skins", "Failed to load PNG of skin '%s' downloaded from '%s'", m_aName, aUrl); - return; - } - - if(State() == IJob::STATE_ABORTED) - { - return; - } - - char aBuf[IO_MAX_PATH_LENGTH]; - char aPathTemp[IO_MAX_PATH_LENGTH]; - str_format(aPathTemp, sizeof(aPathTemp), "downloadedskins/%s", IStorage::FormatTmpPath(aBuf, sizeof(aBuf), m_aName)); - - IOHANDLE TempFile = m_pSkins->Storage()->OpenFile(aPathTemp, IOFLAG_WRITE, IStorage::TYPE_SAVE); - if(!TempFile) - { - log_error("skins", "Failed to open temporary skin file '%s' for writing", aPathTemp); - return; - } - if(io_write(TempFile, pResult, ResultSize) != ResultSize) - { - log_error("skins", "Failed to write downloaded skin data to '%s'", aPathTemp); - io_close(TempFile); - m_pSkins->Storage()->RemoveFile(aPathTemp, IStorage::TYPE_SAVE); - return; - } - io_close(TempFile); - - if(!m_pSkins->Storage()->RenameFile(aPathTemp, aPathReal, IStorage::TYPE_SAVE)) - { - log_error("skins", "Failed to rename temporary skin file '%s' to '%s'", aPathTemp, aPathReal); - m_pSkins->Storage()->RemoveFile(aPathTemp, IStorage::TYPE_SAVE); - return; - } -} - -CSkins::CLoadingSkin::CLoadingSkin(const char *pName) -{ - str_copy(m_aName, pName); -} - -CSkins::CLoadingSkin::~CLoadingSkin() -{ - if(m_pDownloadJob) - { - m_pDownloadJob->Abort(); - } -} - -bool CSkins::CLoadingSkin::operator<(const CLoadingSkin &Other) const -{ - return str_comp(m_aName, Other.m_aName) < 0; -} - -bool CSkins::CLoadingSkin::operator<(const char *pOther) const -{ - return str_comp(m_aName, pOther) < 0; -} - -bool CSkins::CLoadingSkin::operator==(const char *pOther) const -{ - return !str_comp(m_aName, pOther); -} diff --git a/src/game/client/components/skins.h b/src/game/client/components/skins.h deleted file mode 100644 index 2db84a804b..0000000000 --- a/src/game/client/components/skins.h +++ /dev/null @@ -1,103 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_SKINS_H -#define GAME_CLIENT_COMPONENTS_SKINS_H - -#include - -#include - -#include -#include - -#include -#include -#include - -class CHttpRequest; - -class CSkins : public CComponent -{ -public: - CSkins(); - - typedef std::function TSkinLoadedCallback; - - int Sizeof() const override { return sizeof(*this); } - void OnInit() override; - void OnShutdown() override; - - void Refresh(TSkinLoadedCallback &&SkinLoadedCallback); - std::chrono::nanoseconds LastRefreshTime() const { return m_LastRefreshTime; } - - const std::unordered_map> &GetSkinsUnsafe() const { return m_Skins; } - const CSkin *FindOrNullptr(const char *pName, bool IgnorePrefix = false); - const CSkin *Find(const char *pName); - - void RandomizeSkin(int Dummy); - - static bool IsVanillaSkin(const char *pName); - static bool IsSpecialSkin(const char *pName); - - constexpr static const char *VANILLA_SKINS[] = {"bluekitty", "bluestripe", "brownbear", - "cammo", "cammostripes", "coala", "default", "limekitty", - "pinky", "redbopp", "redstripe", "saddo", "toptri", - "twinbop", "twintri", "warpaint", "x_ninja", "x_spec"}; - -private: - class CSkinDownloadJob : public IJob - { - public: - CSkinDownloadJob(CSkins *pSkins, const char *pName); - ~CSkinDownloadJob(); - - bool Abort() override REQUIRES(!m_Lock); - - CImageInfo &ImageInfo() { return m_ImageInfo; } - - protected: - void Run() override REQUIRES(!m_Lock); - - private: - CSkins *m_pSkins; - char m_aName[MAX_SKIN_LENGTH]; - CLock m_Lock; - std::shared_ptr m_pGetRequest; - CImageInfo m_ImageInfo; - }; - - class CLoadingSkin - { - private: - char m_aName[MAX_SKIN_LENGTH]; - - public: - std::shared_ptr m_pDownloadJob = nullptr; - - CLoadingSkin(CLoadingSkin &&Other) = default; - CLoadingSkin(const char *pName); - ~CLoadingSkin(); - - bool operator<(const CLoadingSkin &Other) const; - bool operator<(const char *pOther) const; - bool operator==(const char *pOther) const; - - CLoadingSkin &operator=(CLoadingSkin &&Other) = default; - - const char *Name() const { return m_aName; } - }; - - std::unordered_map> m_Skins; - - std::unordered_map> m_LoadingSkins; - std::chrono::nanoseconds m_LastRefreshTime; - - CSkin m_PlaceholderSkin; - char m_aEventSkinPrefix[MAX_SKIN_LENGTH]; - - const CSkin *LoadSkin(const char *pName, const char *pPath, int DirType); - const CSkin *LoadSkin(const char *pName, CImageInfo &Info); - const CSkin *FindImpl(const char *pName); - static int SkinScan(const char *pName, int IsDir, int DirType, void *pUser); -}; -#endif diff --git a/src/game/client/components/skins7.cpp b/src/game/client/components/skins7.cpp deleted file mode 100644 index 7d4ebcb391..0000000000 --- a/src/game/client/components/skins7.cpp +++ /dev/null @@ -1,594 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "menus.h" -#include "skins7.h" - -const char *const CSkins7::ms_apSkinPartNames[protocol7::NUM_SKINPARTS] = {"body", "marking", "decoration", "hands", "feet", "eyes"}; -const char *const CSkins7::ms_apSkinPartNamesLocalized[protocol7::NUM_SKINPARTS] = {Localizable("Body", "skins"), Localizable("Marking", "skins"), Localizable("Decoration", "skins"), Localizable("Hands", "skins"), Localizable("Feet", "skins"), Localizable("Eyes", "skins")}; -const char *const CSkins7::ms_apColorComponents[NUM_COLOR_COMPONENTS] = {"hue", "sat", "lgt", "alp"}; - -char *CSkins7::ms_apSkinNameVariables[NUM_DUMMIES] = {0}; -char *CSkins7::ms_apSkinVariables[NUM_DUMMIES][protocol7::NUM_SKINPARTS] = {{0}}; -int *CSkins7::ms_apUCCVariables[NUM_DUMMIES][protocol7::NUM_SKINPARTS] = {{0}}; -int unsigned *CSkins7::ms_apColorVariables[NUM_DUMMIES][protocol7::NUM_SKINPARTS] = {{0}}; - -#define SKINS_DIR "skins7" - -// TODO: uncomment -// const float MIN_EYE_BODY_COLOR_DIST = 80.f; // between body and eyes (LAB color space) - -int CSkins7::SkinPartScan(const char *pName, int IsDir, int DirType, void *pUser) -{ - CSkins7 *pSelf = (CSkins7 *)pUser; - if(IsDir || !str_endswith(pName, ".png")) - return 0; - - size_t PartNameSize, PartNameCount; - str_utf8_stats(pName, str_length(pName) - str_length(".png") + 1, IO_MAX_PATH_LENGTH, &PartNameSize, &PartNameCount); - if(PartNameSize >= protocol7::MAX_SKIN_ARRAY_SIZE || PartNameCount > protocol7::MAX_SKIN_LENGTH) - { - log_error("skins7", "Failed to load skin part '%s': name too long", pName); - return 0; - } - - char aFilename[IO_MAX_PATH_LENGTH]; - str_format(aFilename, sizeof(aFilename), SKINS_DIR "/%s/%s", CSkins7::ms_apSkinPartNames[pSelf->m_ScanningPart], pName); - CImageInfo Info; - if(!pSelf->Graphics()->LoadPng(Info, aFilename, DirType)) - { - log_error("skins7", "Failed to load skin part '%s'", pName); - return 0; - } - if(!pSelf->Graphics()->IsImageFormatRgba(aFilename, Info)) - { - log_error("skins7", "Failed to load skin part '%s': must be RGBA format", pName); - Info.Free(); - return 0; - } - - CSkinPart Part; - str_copy(Part.m_aName, pName, minimum(PartNameSize + 1, sizeof(Part.m_aName))); - Part.m_OrgTexture = pSelf->Graphics()->LoadTextureRaw(Info, 0, aFilename); - Part.m_BloodColor = ColorRGBA(1.0f, 1.0f, 1.0f); - - const int Step = 4; - unsigned char *pData = (unsigned char *)Info.m_pData; - - // dig out blood color - if(pSelf->m_ScanningPart == protocol7::SKINPART_BODY) - { - int Pitch = Info.m_Width * Step; - int PartX = Info.m_Width / 2; - int PartY = 0; - int PartWidth = Info.m_Width / 2; - int PartHeight = Info.m_Height / 2; - - int64_t aColors[3] = {0}; - for(int y = PartY; y < PartY + PartHeight; y++) - for(int x = PartX; x < PartX + PartWidth; x++) - if(pData[y * Pitch + x * Step + 3] > 128) - for(int c = 0; c < 3; c++) - aColors[c] += pData[y * Pitch + x * Step + c]; - - Part.m_BloodColor = ColorRGBA(normalize(vec3(aColors[0], aColors[1], aColors[2]))); - } - - ConvertToGrayscale(Info); - - Part.m_ColorTexture = pSelf->Graphics()->LoadTextureRawMove(Info, 0, aFilename); - - // set skin part data - Part.m_Flags = 0; - if(pName[0] == 'x' && pName[1] == '_') - Part.m_Flags |= SKINFLAG_SPECIAL; - if(DirType != IStorage::TYPE_SAVE) - Part.m_Flags |= SKINFLAG_STANDARD; - - if(pSelf->Config()->m_Debug) - { - log_trace("skins7", "Loaded skin part '%s'", Part.m_aName); - } - pSelf->m_avSkinParts[pSelf->m_ScanningPart].emplace_back(Part); - - return 0; -} - -int CSkins7::SkinScan(const char *pName, int IsDir, int DirType, void *pUser) -{ - if(IsDir || !str_endswith(pName, ".json")) - return 0; - - CSkins7 *pSelf = (CSkins7 *)pUser; - - // read file data into buffer - char aFilename[IO_MAX_PATH_LENGTH]; - str_format(aFilename, sizeof(aFilename), SKINS_DIR "/%s", pName); - void *pFileData; - unsigned JsonFileSize; - if(!pSelf->Storage()->ReadFile(aFilename, IStorage::TYPE_ALL, &pFileData, &JsonFileSize)) - { - return 0; - } - - // init - CSkin Skin; - str_copy(Skin.m_aName, pName, 1 + str_length(pName) - str_length(".json")); - const bool SpecialSkin = pName[0] == 'x' && pName[1] == '_'; - Skin.m_Flags = SpecialSkin ? SKINFLAG_SPECIAL : 0; - if(DirType != IStorage::TYPE_SAVE) - Skin.m_Flags |= SKINFLAG_STANDARD; - - // parse json data - json_settings JsonSettings{}; - char aError[256]; - json_value *pJsonData = json_parse_ex(&JsonSettings, static_cast(pFileData), JsonFileSize, aError); - free(pFileData); - - if(pJsonData == nullptr) - { - log_error("skins7", "Failed to parse skin json file '%s': %s", aFilename, aError); - return 0; - } - - // extract data - const json_value &Start = (*pJsonData)["skin"]; - if(Start.type != json_object) - { - log_error("skins7", "Failed to parse skin json file '%s': root must be an object", aFilename); - json_value_free(pJsonData); - return 0; - } - - for(int PartIndex = 0; PartIndex < protocol7::NUM_SKINPARTS; ++PartIndex) - { - Skin.m_aUseCustomColors[PartIndex] = 0; - Skin.m_aPartColors[PartIndex] = (PartIndex == protocol7::SKINPART_MARKING ? 0xFF000000u : 0u) + 0x00FF80u; - - const json_value &Part = Start[(const char *)ms_apSkinPartNames[PartIndex]]; - if(Part.type == json_none) - { - Skin.m_apParts[PartIndex] = pSelf->FindDefaultSkinPart(PartIndex); - continue; - } - if(Part.type != json_object) - { - log_error("skins7", "Failed to parse skin json file '%s': attribute '%s' must specify an object", aFilename, ms_apSkinPartNames[PartIndex]); - json_value_free(pJsonData); - return 0; - } - - // filename - const json_value &Filename = Part["filename"]; - if(Filename.type == json_string) - { - Skin.m_apParts[PartIndex] = pSelf->FindSkinPart(PartIndex, (const char *)Filename, SpecialSkin); - } - else - { - log_error("skins7", "Failed to parse skin json file '%s': part '%s' attribute 'filename' must specify a string", aFilename, ms_apSkinPartNames[PartIndex]); - json_value_free(pJsonData); - return 0; - } - - // use custom colors - bool UseCustomColors = false; - const json_value &Color = Part["custom_colors"]; - if(Color.type == json_string) - UseCustomColors = str_comp((const char *)Color, "true") == 0; - else if(Color.type == json_boolean) - UseCustomColors = Color.u.boolean; - Skin.m_aUseCustomColors[PartIndex] = UseCustomColors; - - // color components - if(!UseCustomColors) - continue; - - for(int i = 0; i < NUM_COLOR_COMPONENTS; i++) - { - if(PartIndex != protocol7::SKINPART_MARKING && i == 3) - continue; - - const json_value &Component = Part[(const char *)ms_apColorComponents[i]]; - if(Component.type == json_integer) - { - switch(i) - { - case 0: Skin.m_aPartColors[PartIndex] = (Skin.m_aPartColors[PartIndex] & 0xFF00FFFFu) | (Component.u.integer << 16); break; - case 1: Skin.m_aPartColors[PartIndex] = (Skin.m_aPartColors[PartIndex] & 0xFFFF00FFu) | (Component.u.integer << 8); break; - case 2: Skin.m_aPartColors[PartIndex] = (Skin.m_aPartColors[PartIndex] & 0xFFFFFF00u) | Component.u.integer; break; - case 3: Skin.m_aPartColors[PartIndex] = (Skin.m_aPartColors[PartIndex] & 0x00FFFFFFu) | (Component.u.integer << 24); break; - } - } - } - } - - json_value_free(pJsonData); - - if(pSelf->Config()->m_Debug) - { - log_trace("skins7", "Loaded skin '%s'", Skin.m_aName); - } - pSelf->m_vSkins.insert(std::lower_bound(pSelf->m_vSkins.begin(), pSelf->m_vSkins.end(), Skin), Skin); - - return 0; -} - -void CSkins7::OnInit() -{ - int Dummy = 0; - ms_apSkinNameVariables[Dummy] = Config()->m_ClPlayer7Skin; - ms_apSkinVariables[Dummy][protocol7::SKINPART_BODY] = Config()->m_ClPlayer7SkinBody; - ms_apSkinVariables[Dummy][protocol7::SKINPART_MARKING] = Config()->m_ClPlayer7SkinMarking; - ms_apSkinVariables[Dummy][protocol7::SKINPART_DECORATION] = Config()->m_ClPlayer7SkinDecoration; - ms_apSkinVariables[Dummy][protocol7::SKINPART_HANDS] = Config()->m_ClPlayer7SkinHands; - ms_apSkinVariables[Dummy][protocol7::SKINPART_FEET] = Config()->m_ClPlayer7SkinFeet; - ms_apSkinVariables[Dummy][protocol7::SKINPART_EYES] = Config()->m_ClPlayer7SkinEyes; - ms_apUCCVariables[Dummy][protocol7::SKINPART_BODY] = &Config()->m_ClPlayer7UseCustomColorBody; - ms_apUCCVariables[Dummy][protocol7::SKINPART_MARKING] = &Config()->m_ClPlayer7UseCustomColorMarking; - ms_apUCCVariables[Dummy][protocol7::SKINPART_DECORATION] = &Config()->m_ClPlayer7UseCustomColorDecoration; - ms_apUCCVariables[Dummy][protocol7::SKINPART_HANDS] = &Config()->m_ClPlayer7UseCustomColorHands; - ms_apUCCVariables[Dummy][protocol7::SKINPART_FEET] = &Config()->m_ClPlayer7UseCustomColorFeet; - ms_apUCCVariables[Dummy][protocol7::SKINPART_EYES] = &Config()->m_ClPlayer7UseCustomColorEyes; - ms_apColorVariables[Dummy][protocol7::SKINPART_BODY] = &Config()->m_ClPlayer7ColorBody; - ms_apColorVariables[Dummy][protocol7::SKINPART_MARKING] = &Config()->m_ClPlayer7ColorMarking; - ms_apColorVariables[Dummy][protocol7::SKINPART_DECORATION] = &Config()->m_ClPlayer7ColorDecoration; - ms_apColorVariables[Dummy][protocol7::SKINPART_HANDS] = &Config()->m_ClPlayer7ColorHands; - ms_apColorVariables[Dummy][protocol7::SKINPART_FEET] = &Config()->m_ClPlayer7ColorFeet; - ms_apColorVariables[Dummy][protocol7::SKINPART_EYES] = &Config()->m_ClPlayer7ColorEyes; - - Dummy = 1; - ms_apSkinNameVariables[Dummy] = Config()->m_ClDummy7Skin; - ms_apSkinVariables[Dummy][protocol7::SKINPART_BODY] = Config()->m_ClDummy7SkinBody; - ms_apSkinVariables[Dummy][protocol7::SKINPART_MARKING] = Config()->m_ClDummy7SkinMarking; - ms_apSkinVariables[Dummy][protocol7::SKINPART_DECORATION] = Config()->m_ClDummy7SkinDecoration; - ms_apSkinVariables[Dummy][protocol7::SKINPART_HANDS] = Config()->m_ClDummy7SkinHands; - ms_apSkinVariables[Dummy][protocol7::SKINPART_FEET] = Config()->m_ClDummy7SkinFeet; - ms_apSkinVariables[Dummy][protocol7::SKINPART_EYES] = Config()->m_ClDummy7SkinEyes; - ms_apUCCVariables[Dummy][protocol7::SKINPART_BODY] = &Config()->m_ClDummy7UseCustomColorBody; - ms_apUCCVariables[Dummy][protocol7::SKINPART_MARKING] = &Config()->m_ClDummy7UseCustomColorMarking; - ms_apUCCVariables[Dummy][protocol7::SKINPART_DECORATION] = &Config()->m_ClDummy7UseCustomColorDecoration; - ms_apUCCVariables[Dummy][protocol7::SKINPART_HANDS] = &Config()->m_ClDummy7UseCustomColorHands; - ms_apUCCVariables[Dummy][protocol7::SKINPART_FEET] = &Config()->m_ClDummy7UseCustomColorFeet; - ms_apUCCVariables[Dummy][protocol7::SKINPART_EYES] = &Config()->m_ClDummy7UseCustomColorEyes; - ms_apColorVariables[Dummy][protocol7::SKINPART_BODY] = &Config()->m_ClDummy7ColorBody; - ms_apColorVariables[Dummy][protocol7::SKINPART_MARKING] = &Config()->m_ClDummy7ColorMarking; - ms_apColorVariables[Dummy][protocol7::SKINPART_DECORATION] = &Config()->m_ClDummy7ColorDecoration; - ms_apColorVariables[Dummy][protocol7::SKINPART_HANDS] = &Config()->m_ClDummy7ColorHands; - ms_apColorVariables[Dummy][protocol7::SKINPART_FEET] = &Config()->m_ClDummy7ColorFeet; - ms_apColorVariables[Dummy][protocol7::SKINPART_EYES] = &Config()->m_ClDummy7ColorEyes; - - InitPlaceholderSkinParts(); - - for(int Part = 0; Part < protocol7::NUM_SKINPARTS; Part++) - { - m_avSkinParts[Part].clear(); - - // add none part - if(Part == protocol7::SKINPART_MARKING || Part == protocol7::SKINPART_DECORATION) - { - CSkinPart NoneSkinPart; - NoneSkinPart.m_Flags = SKINFLAG_STANDARD; - NoneSkinPart.m_aName[0] = '\0'; - NoneSkinPart.m_BloodColor = vec3(1.0f, 1.0f, 1.0f); - m_avSkinParts[Part].emplace_back(NoneSkinPart); - } - - // load skin parts - char aBuf[IO_MAX_PATH_LENGTH]; - str_format(aBuf, sizeof(aBuf), SKINS_DIR "/%s", ms_apSkinPartNames[Part]); - m_ScanningPart = Part; - Storage()->ListDirectory(IStorage::TYPE_ALL, aBuf, SkinPartScan, this); - - GameClient()->m_Menus.RenderLoading(Localize("Loading DDNet Client"), Localize("Loading skin files"), 0); - } - - // load skins - m_vSkins.clear(); - Storage()->ListDirectory(IStorage::TYPE_ALL, SKINS_DIR, SkinScan, this); - GameClient()->m_Menus.RenderLoading(Localize("Loading DDNet Client"), Localize("Loading skin files"), 0); - - LoadXmasHat(); - LoadBotDecoration(); - GameClient()->m_Menus.RenderLoading(Localize("Loading DDNet Client"), Localize("Loading skin files"), 0); - - m_LastRefreshTime = time_get_nanoseconds(); -} - -void CSkins7::InitPlaceholderSkinParts() -{ - for(CSkinPart &SkinPart : m_aPlaceholderSkinParts) - { - SkinPart.m_Flags = SKINFLAG_STANDARD; - str_copy(SkinPart.m_aName, "dummy"); - SkinPart.m_OrgTexture.Invalidate(); - SkinPart.m_ColorTexture.Invalidate(); - SkinPart.m_BloodColor = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - } -} - -void CSkins7::LoadXmasHat() -{ - const char *pFilename = SKINS_DIR "/xmas_hat.png"; - CImageInfo Info; - if(!Graphics()->LoadPng(Info, pFilename, IStorage::TYPE_ALL) || - !Graphics()->IsImageFormatRgba(pFilename, Info) || - !Graphics()->CheckImageDivisibility(pFilename, Info, 1, 4, false)) - { - log_error("skins7", "Failed to xmas hat '%s'", pFilename); - Info.Free(); - } - else - { - if(Config()->m_Debug) - { - log_trace("skins7", "Loaded xmas hat '%s'", pFilename); - } - m_XmasHatTexture = Graphics()->LoadTextureRawMove(Info, 0, pFilename); - } -} - -void CSkins7::LoadBotDecoration() -{ - const char *pFilename = SKINS_DIR "/bot.png"; - CImageInfo Info; - if(!Graphics()->LoadPng(Info, pFilename, IStorage::TYPE_ALL) || - !Graphics()->IsImageFormatRgba(pFilename, Info) || - !Graphics()->CheckImageDivisibility(pFilename, Info, 12, 5, false)) - { - log_error("skins7", "Failed to load bot '%s'", pFilename); - Info.Free(); - } - else - { - if(Config()->m_Debug) - { - log_trace("skins7", "Loaded bot '%s'", pFilename); - } - m_BotTexture = Graphics()->LoadTextureRawMove(Info, 0, pFilename); - } -} - -void CSkins7::AddSkinFromConfigVariables(const char *pName, int Dummy) -{ - auto OldSkin = std::find_if(m_vSkins.begin(), m_vSkins.end(), [pName](const CSkin &Skin) { - return str_comp(Skin.m_aName, pName) == 0; - }); - if(OldSkin != m_vSkins.end()) - { - m_vSkins.erase(OldSkin); - } - - CSkin NewSkin; - NewSkin.m_Flags = 0; - str_copy(NewSkin.m_aName, pName); - for(int PartIndex = 0; PartIndex < protocol7::NUM_SKINPARTS; ++PartIndex) - { - NewSkin.m_apParts[PartIndex] = FindSkinPart(PartIndex, ms_apSkinVariables[Dummy][PartIndex], false); - NewSkin.m_aUseCustomColors[PartIndex] = *ms_apUCCVariables[Dummy][PartIndex]; - NewSkin.m_aPartColors[PartIndex] = *ms_apColorVariables[Dummy][PartIndex]; - } - m_vSkins.insert(std::lower_bound(m_vSkins.begin(), m_vSkins.end(), NewSkin), NewSkin); -} - -bool CSkins7::RemoveSkin(const CSkin *pSkin) -{ - char aBuf[IO_MAX_PATH_LENGTH]; - str_format(aBuf, sizeof(aBuf), SKINS_DIR "/%s.json", pSkin->m_aName); - if(!Storage()->RemoveFile(aBuf, IStorage::TYPE_SAVE)) - { - return false; - } - - auto FoundSkin = std::find(m_vSkins.begin(), m_vSkins.end(), *pSkin); - dbg_assert(FoundSkin != m_vSkins.end(), "Skin not found"); - m_vSkins.erase(FoundSkin); - return true; -} - -const std::vector &CSkins7::GetSkins() const -{ - return m_vSkins; -} - -const std::vector &CSkins7::GetSkinParts(int Part) const -{ - return m_avSkinParts[Part]; -} - -const CSkins7::CSkinPart *CSkins7::FindSkinPartOrNullptr(int Part, const char *pName, bool AllowSpecialPart) const -{ - auto FoundPart = std::find_if(m_avSkinParts[Part].begin(), m_avSkinParts[Part].end(), [pName](const CSkinPart &SkinPart) { - return str_comp(SkinPart.m_aName, pName) == 0; - }); - if(FoundPart == m_avSkinParts[Part].end()) - { - return nullptr; - } - if((FoundPart->m_Flags & SKINFLAG_SPECIAL) != 0 && !AllowSpecialPart) - { - return nullptr; - } - return &*FoundPart; -} - -const CSkins7::CSkinPart *CSkins7::FindDefaultSkinPart(int Part) const -{ - const char *pDefaultPartName = Part == protocol7::SKINPART_MARKING || Part == protocol7::SKINPART_DECORATION ? "" : "default"; - const CSkinPart *pDefault = FindSkinPartOrNullptr(Part, pDefaultPartName, false); - if(pDefault != nullptr) - { - return pDefault; - } - return &m_aPlaceholderSkinParts[Part]; -} - -const CSkins7::CSkinPart *CSkins7::FindSkinPart(int Part, const char *pName, bool AllowSpecialPart) const -{ - const CSkinPart *pSkinPart = FindSkinPartOrNullptr(Part, pName, AllowSpecialPart); - if(pSkinPart != nullptr) - { - return pSkinPart; - } - return FindDefaultSkinPart(Part); -} - -void CSkins7::RandomizeSkin(int Dummy) const -{ - for(int Part = 0; Part < protocol7::NUM_SKINPARTS; Part++) - { - int Hue = rand() % 255; - int Sat = rand() % 255; - int Lgt = rand() % 255; - int Alp = 0; - if(Part == protocol7::SKINPART_MARKING) - Alp = rand() % 255; - int ColorVariable = (Alp << 24) | (Hue << 16) | (Sat << 8) | Lgt; - *ms_apUCCVariables[Dummy][Part] = true; - *ms_apColorVariables[Dummy][Part] = ColorVariable; - } - - for(int Part = 0; Part < protocol7::NUM_SKINPARTS; Part++) - { - std::vector vpConsideredSkinParts; - for(const CSkinPart &SkinPart : GetSkinParts(Part)) - { - if((SkinPart.m_Flags & CSkins7::SKINFLAG_SPECIAL) != 0) - continue; - vpConsideredSkinParts.push_back(&SkinPart); - } - const CSkins7::CSkinPart *pRandomPart; - if(vpConsideredSkinParts.empty()) - { - pRandomPart = FindDefaultSkinPart(Part); - } - else - { - pRandomPart = vpConsideredSkinParts[rand() % vpConsideredSkinParts.size()]; - } - str_copy(CSkins7::ms_apSkinVariables[Dummy][Part], pRandomPart->m_aName, protocol7::MAX_SKIN_ARRAY_SIZE); - } - - ms_apSkinNameVariables[Dummy][0] = '\0'; -} - -ColorRGBA CSkins7::GetColor(int Value, bool UseAlpha) const -{ - return color_cast(ColorHSLA(Value, UseAlpha).UnclampLighting(ColorHSLA::DARKEST_LGT7)); -} - -ColorRGBA CSkins7::GetTeamColor(int UseCustomColors, int PartColor, int Team, int Part) const -{ - static const int s_aTeamColors[3] = {0xC4C34E, 0x00FF6B, 0x9BFF6B}; - - int TeamHue = (s_aTeamColors[Team + 1] >> 16) & 0xff; - int TeamSat = (s_aTeamColors[Team + 1] >> 8) & 0xff; - int TeamLgt = s_aTeamColors[Team + 1] & 0xff; - int PartSat = (PartColor >> 8) & 0xff; - int PartLgt = PartColor & 0xff; - - if(!UseCustomColors) - { - PartSat = 255; - PartLgt = 255; - } - - int MinSat = 160; - int MaxSat = 255; - - int h = TeamHue; - int s = clamp(mix(TeamSat, PartSat, 0.2), MinSat, MaxSat); - int l = clamp(mix(TeamLgt, PartLgt, 0.2), (int)ColorHSLA::DARKEST_LGT7, 200); - - int ColorVal = (h << 16) + (s << 8) + l; - - return GetColor(ColorVal, Part == protocol7::SKINPART_MARKING); -} - -bool CSkins7::ValidateSkinParts(char *apPartNames[protocol7::NUM_SKINPARTS], int *pUseCustomColors, int *pPartColors, int GameFlags) const -{ - // force standard (black) eyes on team skins - if(GameFlags & GAMEFLAG_TEAMS) - { - // TODO: adjust eye color here as well? - if(str_comp(apPartNames[protocol7::SKINPART_EYES], "colorable") == 0 || str_comp(apPartNames[protocol7::SKINPART_EYES], "negative") == 0) - { - str_copy(apPartNames[protocol7::SKINPART_EYES], "standard", protocol7::MAX_SKIN_ARRAY_SIZE); - return false; - } - } - return true; -} - -bool CSkins7::SaveSkinfile(const char *pName, int Dummy) -{ - const bool SpecialSkin = pName[0] == 'x' && pName[1] == '_'; - dbg_assert(!SpecialSkin, "Cannot save special skins"); - - char aBuf[IO_MAX_PATH_LENGTH]; - str_format(aBuf, sizeof(aBuf), SKINS_DIR "/%s.json", pName); - IOHANDLE File = Storage()->OpenFile(aBuf, IOFLAG_WRITE, IStorage::TYPE_SAVE); - if(!File) - return false; - - CJsonFileWriter Writer(File); - - Writer.BeginObject(); - Writer.WriteAttribute("skin"); - Writer.BeginObject(); - for(int PartIndex = 0; PartIndex < protocol7::NUM_SKINPARTS; PartIndex++) - { - if(!ms_apSkinVariables[Dummy][PartIndex][0]) - continue; - - // part start - Writer.WriteAttribute(ms_apSkinPartNames[PartIndex]); - Writer.BeginObject(); - { - Writer.WriteAttribute("filename"); - Writer.WriteStrValue(ms_apSkinVariables[Dummy][PartIndex]); - - const bool CustomColors = *ms_apUCCVariables[Dummy][PartIndex]; - Writer.WriteAttribute("custom_colors"); - Writer.WriteBoolValue(CustomColors); - - if(CustomColors) - { - for(int ColorComponent = 0; ColorComponent < NUM_COLOR_COMPONENTS - 1; ColorComponent++) - { - int Val = (*ms_apColorVariables[Dummy][PartIndex] >> (2 - ColorComponent) * 8) & 0xff; - Writer.WriteAttribute(ms_apColorComponents[ColorComponent]); - Writer.WriteIntValue(Val); - } - if(PartIndex == protocol7::SKINPART_MARKING) - { - int Val = (*ms_apColorVariables[Dummy][PartIndex] >> 24) & 0xff; - Writer.WriteAttribute(ms_apColorComponents[3]); - Writer.WriteIntValue(Val); - } - } - } - Writer.EndObject(); - } - Writer.EndObject(); - Writer.EndObject(); - - AddSkinFromConfigVariables(pName, Dummy); - return true; -} diff --git a/src/game/client/components/skins7.h b/src/game/client/components/skins7.h deleted file mode 100644 index 54e3b3dcdd..0000000000 --- a/src/game/client/components/skins7.h +++ /dev/null @@ -1,112 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_SKINS7_H -#define GAME_CLIENT_COMPONENTS_SKINS7_H - -#include -#include - -#include -#include - -#include -#include -#include - -#include -#include - -class CSkins7 : public CComponent -{ -public: - enum - { - SKINFLAG_SPECIAL = 1 << 0, - SKINFLAG_STANDARD = 1 << 1, - - NUM_COLOR_COMPONENTS = 4, - - HAT_NUM = 2, - HAT_OFFSET_SIDE = 2, - }; - - class CSkinPart - { - public: - int m_Flags; - char m_aName[24]; - IGraphics::CTextureHandle m_OrgTexture; - IGraphics::CTextureHandle m_ColorTexture; - ColorRGBA m_BloodColor; - - bool operator<(const CSkinPart &Other) { return str_comp_nocase(m_aName, Other.m_aName) < 0; } - }; - - class CSkin - { - public: - int m_Flags; - char m_aName[24]; - const CSkinPart *m_apParts[protocol7::NUM_SKINPARTS]; - int m_aUseCustomColors[protocol7::NUM_SKINPARTS]; - unsigned m_aPartColors[protocol7::NUM_SKINPARTS]; - - bool operator<(const CSkin &Other) const { return str_comp_nocase(m_aName, Other.m_aName) < 0; } - bool operator==(const CSkin &Other) const { return !str_comp(m_aName, Other.m_aName); } - }; - - static const char *const ms_apSkinPartNames[protocol7::NUM_SKINPARTS]; - static const char *const ms_apSkinPartNamesLocalized[protocol7::NUM_SKINPARTS]; - static const char *const ms_apColorComponents[NUM_COLOR_COMPONENTS]; - - static char *ms_apSkinNameVariables[NUM_DUMMIES]; - static char *ms_apSkinVariables[NUM_DUMMIES][protocol7::NUM_SKINPARTS]; - static int *ms_apUCCVariables[NUM_DUMMIES][protocol7::NUM_SKINPARTS]; // use custom color - static unsigned *ms_apColorVariables[NUM_DUMMIES][protocol7::NUM_SKINPARTS]; - - int Sizeof() const override { return sizeof(*this); } - void OnInit() override; - - std::chrono::nanoseconds LastRefreshTime() const { return m_LastRefreshTime; } - - const std::vector &GetSkins() const; - const std::vector &GetSkinParts(int Part) const; - const CSkinPart *FindSkinPartOrNullptr(int Part, const char *pName, bool AllowSpecialPart) const; - const CSkinPart *FindDefaultSkinPart(int Part) const; - const CSkinPart *FindSkinPart(int Part, const char *pName, bool AllowSpecialPart) const; - void RandomizeSkin(int Dummy) const; - - ColorRGBA GetColor(int Value, bool UseAlpha) const; - ColorRGBA GetTeamColor(int UseCustomColors, int PartColor, int Team, int Part) const; - - // returns true if everything was valid and nothing changed - bool ValidateSkinParts(char *apPartNames[protocol7::NUM_SKINPARTS], int *pUseCustomColors, int *pPartColors, int GameFlags) const; - - bool SaveSkinfile(const char *pName, int Dummy); - bool RemoveSkin(const CSkin *pSkin); - - IGraphics::CTextureHandle XmasHatTexture() const { return m_XmasHatTexture; } - IGraphics::CTextureHandle BotDecorationTexture() const { return m_BotTexture; } - -private: - int m_ScanningPart; - std::chrono::nanoseconds m_LastRefreshTime; - - std::vector m_avSkinParts[protocol7::NUM_SKINPARTS]; - CSkinPart m_aPlaceholderSkinParts[protocol7::NUM_SKINPARTS]; - std::vector m_vSkins; - - IGraphics::CTextureHandle m_XmasHatTexture; - IGraphics::CTextureHandle m_BotTexture; - - static int SkinPartScan(const char *pName, int IsDir, int DirType, void *pUser); - static int SkinScan(const char *pName, int IsDir, int DirType, void *pUser); - - void InitPlaceholderSkinParts(); - void LoadXmasHat(); - void LoadBotDecoration(); - - void AddSkinFromConfigVariables(const char *pName, int Dummy); -}; - -#endif diff --git a/src/game/client/components/sounds.cpp b/src/game/client/components/sounds.cpp deleted file mode 100644 index d04a20fdf6..0000000000 --- a/src/game/client/components/sounds.cpp +++ /dev/null @@ -1,248 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include "sounds.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -CSoundLoading::CSoundLoading(CGameClient *pGameClient, bool Render) : - m_pGameClient(pGameClient), - m_Render(Render) -{ - Abortable(true); -} - -void CSoundLoading::Run() -{ - for(int s = 0; s < g_pData->m_NumSounds; s++) - { - const char *pLoadingCaption = Localize("Loading DDNet Client"); - const char *pLoadingContent = Localize("Loading sound files"); - - for(int i = 0; i < g_pData->m_aSounds[s].m_NumSounds; i++) - { - if(State() == IJob::STATE_ABORTED) - return; - - int Id = m_pGameClient->Sound()->LoadWV(g_pData->m_aSounds[s].m_aSounds[i].m_pFilename); - g_pData->m_aSounds[s].m_aSounds[i].m_Id = Id; - // try to render a frame - if(m_Render) - m_pGameClient->m_Menus.RenderLoading(pLoadingCaption, pLoadingContent, 0); - } - - if(m_Render) - m_pGameClient->m_Menus.RenderLoading(pLoadingCaption, pLoadingContent, 1); - } -} - -void CSounds::UpdateChannels() -{ - const float NewGuiSoundVolume = g_Config.m_SndChatSoundVolume / 100.0f; - if(NewGuiSoundVolume != m_GuiSoundVolume) - { - m_GuiSoundVolume = NewGuiSoundVolume; - Sound()->SetChannel(CSounds::CHN_GUI, m_GuiSoundVolume, 0.0f); - } - - const float NewGameSoundVolume = g_Config.m_SndGameSoundVolume / 100.0f; - if(NewGameSoundVolume != m_GameSoundVolume) - { - m_GameSoundVolume = NewGameSoundVolume; - Sound()->SetChannel(CSounds::CHN_WORLD, 0.9f * m_GameSoundVolume, 1.0f); - Sound()->SetChannel(CSounds::CHN_GLOBAL, m_GameSoundVolume, 0.0f); - } - - const float NewMapSoundVolume = g_Config.m_SndMapSoundVolume / 100.0f; - if(NewMapSoundVolume != m_MapSoundVolume) - { - m_MapSoundVolume = NewMapSoundVolume; - Sound()->SetChannel(CSounds::CHN_MAPSOUND, m_MapSoundVolume, 1.0f); - } - - const float NewBackgroundMusicVolume = g_Config.m_SndBackgroundMusicVolume / 100.0f; - if(NewBackgroundMusicVolume != m_BackgroundMusicVolume) - { - m_BackgroundMusicVolume = NewBackgroundMusicVolume; - Sound()->SetChannel(CSounds::CHN_MUSIC, m_BackgroundMusicVolume, 1.0f); - } -} - -int CSounds::GetSampleId(int SetId) -{ - if(!g_Config.m_SndEnable || !Sound()->IsSoundEnabled() || m_WaitForSoundJob || SetId < 0 || SetId >= g_pData->m_NumSounds) - return -1; - - CDataSoundset *pSet = &g_pData->m_aSounds[SetId]; - if(!pSet->m_NumSounds) - return -1; - - if(pSet->m_NumSounds == 1) - return pSet->m_aSounds[0].m_Id; - - // return random one - int Id; - do - { - Id = rand() % pSet->m_NumSounds; - } while(Id == pSet->m_Last); - pSet->m_Last = Id; - return pSet->m_aSounds[Id].m_Id; -} - -void CSounds::OnInit() -{ - UpdateChannels(); - ClearQueue(); - - // load sounds - if(g_Config.m_ClThreadsoundloading) - { - m_pSoundJob = std::make_shared(m_pClient, false); - m_pClient->Engine()->AddJob(m_pSoundJob); - m_WaitForSoundJob = true; - m_pClient->m_Menus.RenderLoading(Localize("Loading DDNet Client"), Localize("Loading sound files"), 0); - } - else - { - CSoundLoading(m_pClient, true).Run(); - m_WaitForSoundJob = false; - } -} - -void CSounds::OnReset() -{ - if(Client()->State() >= IClient::STATE_ONLINE) - { - Sound()->StopAll(); - ClearQueue(); - } -} - -void CSounds::OnStateChange(int NewState, int OldState) -{ - if(NewState == IClient::STATE_ONLINE || NewState == IClient::STATE_DEMOPLAYBACK) - OnReset(); -} - -void CSounds::OnRender() -{ - // check for sound initialisation - if(m_WaitForSoundJob) - { - if(m_pSoundJob->State() == IJob::STATE_DONE) - m_WaitForSoundJob = false; - else - return; - } - - Sound()->SetListenerPosition(m_pClient->m_Camera.m_Center); - UpdateChannels(); - - // play sound from queue - if(m_QueuePos > 0) - { - int64_t Now = time(); - if(m_QueueWaitTime <= Now) - { - Play(m_aQueue[0].m_Channel, m_aQueue[0].m_SetId, 1.0f); - m_QueueWaitTime = Now + time_freq() * 3 / 10; // wait 300ms before playing the next one - if(--m_QueuePos > 0) - mem_move(m_aQueue, m_aQueue + 1, m_QueuePos * sizeof(QueueEntry)); - } - } -} - -void CSounds::ClearQueue() -{ - mem_zero(m_aQueue, sizeof(m_aQueue)); - m_QueuePos = 0; - m_QueueWaitTime = time(); -} - -void CSounds::Enqueue(int Channel, int SetId) -{ - if(m_pClient->m_SuppressEvents) - return; - if(m_QueuePos >= QUEUE_SIZE) - return; - if(Channel != CHN_MUSIC && g_Config.m_ClEditor) - return; - - m_aQueue[m_QueuePos].m_Channel = Channel; - m_aQueue[m_QueuePos++].m_SetId = SetId; -} - -void CSounds::PlayAndRecord(int Channel, int SetId, float Volume, vec2 Position) -{ - // TODO: Volume and position are currently not recorded for sounds played with this function - // TODO: This also causes desync sounds during demo playback of demos recorded on high ping servers: - // https://github.com/ddnet/ddnet/issues/1282 - CNetMsg_Sv_SoundGlobal Msg; - Msg.m_SoundId = SetId; - Client()->SendPackMsgActive(&Msg, MSGFLAG_NOSEND | MSGFLAG_RECORD); - - PlayAt(Channel, SetId, Volume, Position); -} - -void CSounds::Play(int Channel, int SetId, float Volume) -{ - PlaySample(Channel, GetSampleId(SetId), 0, Volume); -} - -void CSounds::PlayAt(int Channel, int SetId, float Volume, vec2 Position) -{ - PlaySampleAt(Channel, GetSampleId(SetId), 0, Volume, Position); -} - -void CSounds::Stop(int SetId) -{ - if(m_WaitForSoundJob || SetId < 0 || SetId >= g_pData->m_NumSounds) - return; - - const CDataSoundset *pSet = &g_pData->m_aSounds[SetId]; - for(int i = 0; i < pSet->m_NumSounds; i++) - if(pSet->m_aSounds[i].m_Id != -1) - Sound()->Stop(pSet->m_aSounds[i].m_Id); -} - -bool CSounds::IsPlaying(int SetId) -{ - if(m_WaitForSoundJob || SetId < 0 || SetId >= g_pData->m_NumSounds) - return false; - - const CDataSoundset *pSet = &g_pData->m_aSounds[SetId]; - for(int i = 0; i < pSet->m_NumSounds; i++) - if(pSet->m_aSounds[i].m_Id != -1 && Sound()->IsPlaying(pSet->m_aSounds[i].m_Id)) - return true; - return false; -} - -ISound::CVoiceHandle CSounds::PlaySample(int Channel, int SampleId, int Flags, float Volume) -{ - if(m_pClient->m_SuppressEvents || (Channel == CHN_MUSIC && !g_Config.m_SndMusic) || SampleId == -1) - return ISound::CVoiceHandle(); - - if(Channel == CHN_MUSIC) - Flags |= ISound::FLAG_LOOP; - - return Sound()->Play(Channel, SampleId, Flags, Volume); -} - -ISound::CVoiceHandle CSounds::PlaySampleAt(int Channel, int SampleId, int Flags, float Volume, vec2 Position) -{ - if(m_pClient->m_SuppressEvents || (Channel == CHN_MUSIC && !g_Config.m_SndMusic) || SampleId == -1) - return ISound::CVoiceHandle(); - - if(Channel == CHN_MUSIC) - Flags |= ISound::FLAG_LOOP; - - return Sound()->PlayAt(Channel, SampleId, Flags, Volume, Position); -} diff --git a/src/game/client/components/sounds.h b/src/game/client/components/sounds.h deleted file mode 100644 index 8671f3bf82..0000000000 --- a/src/game/client/components/sounds.h +++ /dev/null @@ -1,74 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_SOUNDS_H -#define GAME_CLIENT_COMPONENTS_SOUNDS_H - -#include -#include -#include -#include - -class CSoundLoading : public IJob -{ - CGameClient *m_pGameClient; - bool m_Render; - -public: - CSoundLoading(CGameClient *pGameClient, bool Render); - void Run() override; -}; - -class CSounds : public CComponent -{ - enum - { - QUEUE_SIZE = 32, - }; - struct QueueEntry - { - int m_Channel; - int m_SetId; - } m_aQueue[QUEUE_SIZE]; - int m_QueuePos; - int64_t m_QueueWaitTime; - std::shared_ptr m_pSoundJob; - bool m_WaitForSoundJob; - - void UpdateChannels(); - int GetSampleId(int SetId); - - float m_GuiSoundVolume = -1.0f; - float m_GameSoundVolume = -1.0f; - float m_MapSoundVolume = -1.0f; - float m_BackgroundMusicVolume = -1.0f; - -public: - // sound channels - enum - { - CHN_GUI = 0, - CHN_MUSIC, - CHN_WORLD, - CHN_GLOBAL, - CHN_MAPSOUND, - }; - - virtual int Sizeof() const override { return sizeof(*this); } - virtual void OnInit() override; - virtual void OnReset() override; - virtual void OnStateChange(int NewState, int OldState) override; - virtual void OnRender() override; - - void ClearQueue(); - void Enqueue(int Channel, int SetId); - void Play(int Channel, int SetId, float Volume); - void PlayAt(int Channel, int SetId, float Volume, vec2 Position); - void PlayAndRecord(int Channel, int SetId, float Volume, vec2 Position); - void Stop(int SetId); - bool IsPlaying(int SetId); - - ISound::CVoiceHandle PlaySample(int Channel, int SampleId, int Flags, float Volume); - ISound::CVoiceHandle PlaySampleAt(int Channel, int SampleId, int Flags, float Volume, vec2 Position); -}; - -#endif diff --git a/src/game/client/components/spectator.cpp b/src/game/client/components/spectator.cpp deleted file mode 100644 index 73deb3d249..0000000000 --- a/src/game/client/components/spectator.cpp +++ /dev/null @@ -1,667 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include - -#include -#include -#include - -#include - -#include -#include -#include - -#include "camera.h" -#include "spectator.h" - -#include - -bool CSpectator::CanChangeSpectatorId() -{ - // don't change SpectatorId when not spectating - if(!m_pClient->m_Snap.m_SpecInfo.m_Active) - return false; - - // stop follow mode from changing SpectatorId - if(Client()->State() == IClient::STATE_DEMOPLAYBACK && m_pClient->m_DemoSpecId == SPEC_FOLLOW) - return false; - - return true; -} - -void CSpectator::SpectateNext(bool Reverse) -{ - int CurIndex = -1; - const CNetObj_PlayerInfo **paPlayerInfos = m_pClient->m_Snap.m_apInfoByDDTeamName; - - // m_SpectatorId may be uninitialized if m_Active is false - if(m_pClient->m_Snap.m_SpecInfo.m_Active) - { - for(int i = 0; i < MAX_CLIENTS; i++) - { - if(paPlayerInfos[i] && paPlayerInfos[i]->m_ClientId == m_pClient->m_Snap.m_SpecInfo.m_SpectatorId) - { - CurIndex = i; - break; - } - } - } - - int Start; - if(CurIndex != -1) - { - if(Reverse) - Start = CurIndex - 1; - else - Start = CurIndex + 1; - } - else - { - if(Reverse) - Start = -1; - else - Start = 0; - } - - int Increment = Reverse ? -1 : 1; - - for(int i = 0; i < MAX_CLIENTS; i++) - { - int PlayerIndex = (Start + i * Increment) % MAX_CLIENTS; - // % in C++ takes the sign of the dividend, not divisor - if(PlayerIndex < 0) - PlayerIndex += MAX_CLIENTS; - - const CNetObj_PlayerInfo *pPlayerInfo = paPlayerInfos[PlayerIndex]; - if(pPlayerInfo && pPlayerInfo->m_Team != TEAM_SPECTATORS) - { - Spectate(pPlayerInfo->m_ClientId); - break; - } - } -} - -void CSpectator::ConKeySpectator(IConsole::IResult *pResult, void *pUserData) -{ - CSpectator *pSelf = (CSpectator *)pUserData; - - if(pSelf->m_pClient->m_Snap.m_SpecInfo.m_Active || pSelf->Client()->State() == IClient::STATE_DEMOPLAYBACK) - pSelf->m_Active = pResult->GetInteger(0) != 0; - else - pSelf->m_Active = false; -} - -void CSpectator::ConSpectate(IConsole::IResult *pResult, void *pUserData) -{ - CSpectator *pSelf = (CSpectator *)pUserData; - if(!pSelf->CanChangeSpectatorId()) - return; - - pSelf->Spectate(pResult->GetInteger(0)); -} - -void CSpectator::ConSpectateNext(IConsole::IResult *pResult, void *pUserData) -{ - CSpectator *pSelf = (CSpectator *)pUserData; - if(!pSelf->CanChangeSpectatorId()) - return; - - pSelf->SpectateNext(false); -} - -void CSpectator::ConSpectatePrevious(IConsole::IResult *pResult, void *pUserData) -{ - CSpectator *pSelf = (CSpectator *)pUserData; - if(!pSelf->CanChangeSpectatorId()) - return; - - pSelf->SpectateNext(true); -} - -void CSpectator::ConSpectateClosest(IConsole::IResult *pResult, void *pUserData) -{ - CSpectator *pSelf = (CSpectator *)pUserData; - pSelf->SpectateClosest(); -} - -void CSpectator::ConMultiView(IConsole::IResult *pResult, void *pUserData) -{ - CSpectator *pSelf = (CSpectator *)pUserData; - int Input = pResult->GetInteger(0); - - if(Input == -1) - std::fill(std::begin(pSelf->GameClient()->m_aMultiViewId), std::end(pSelf->GameClient()->m_aMultiViewId), false); // remove everyone from multiview - else if(Input < MAX_CLIENTS && Input >= 0) - pSelf->GameClient()->m_aMultiViewId[Input] = !pSelf->GameClient()->m_aMultiViewId[Input]; // activate or deactivate one player from multiview -} - -CSpectator::CSpectator() -{ - m_SelectorMouse = vec2(0.0f, 0.0f); - OnReset(); -} - -void CSpectator::OnConsoleInit() -{ - Console()->Register("+spectate", "", CFGFLAG_CLIENT, ConKeySpectator, this, "Open spectator mode selector"); - Console()->Register("spectate", "i[spectator-id]", CFGFLAG_CLIENT, ConSpectate, this, "Switch spectator mode"); - Console()->Register("spectate_next", "", CFGFLAG_CLIENT, ConSpectateNext, this, "Spectate the next player"); - Console()->Register("spectate_previous", "", CFGFLAG_CLIENT, ConSpectatePrevious, this, "Spectate the previous player"); - Console()->Register("spectate_closest", "", CFGFLAG_CLIENT, ConSpectateClosest, this, "Spectate the closest player"); - Console()->Register("spectate_multiview", "i[id]", CFGFLAG_CLIENT, ConMultiView, this, "Add/remove Client-IDs to spectate them exclusively (-1 to reset)"); -} - -bool CSpectator::OnCursorMove(float x, float y, IInput::ECursorType CursorType) -{ - if(!m_Active) - return false; - - Ui()->ConvertMouseMove(&x, &y, CursorType); - m_SelectorMouse += vec2(x, y); - return true; -} - -bool CSpectator::OnInput(const IInput::CEvent &Event) -{ - if(IsActive() && Event.m_Flags & IInput::FLAG_PRESS && Event.m_Key == KEY_ESCAPE) - { - OnRelease(); - return true; - } - - if(g_Config.m_ClSpectatorMouseclicks) - { - if(m_pClient->m_Snap.m_SpecInfo.m_Active && !IsActive() && !GameClient()->m_MultiViewActivated && - !Ui()->IsPopupOpen() && m_pClient->m_GameConsole.IsClosed() && !m_pClient->m_Menus.IsActive()) - { - if(Event.m_Flags & IInput::FLAG_PRESS && Event.m_Key == KEY_MOUSE_1) - { - if(m_pClient->m_Snap.m_SpecInfo.m_SpectatorId != SPEC_FREEVIEW) - Spectate(SPEC_FREEVIEW); - else - SpectateClosest(); - return true; - } - } - } - - if(m_pClient->m_Camera.SpectatingPlayer() && m_pClient->m_Camera.CanUseAutoSpecCamera()) - { - if(Event.m_Flags & IInput::FLAG_PRESS && Event.m_Key == KEY_MOUSE_2) - { - m_pClient->m_Camera.ResetAutoSpecCamera(); - return true; - } - } - - return false; -} - -void CSpectator::OnRelease() -{ - OnReset(); -} - -void CSpectator::OnRender() -{ - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - if(!GameClient()->m_MultiViewActivated && m_MultiViewActivateDelay != 0.0f) - { - if(m_MultiViewActivateDelay <= Client()->LocalTime()) - { - m_MultiViewActivateDelay = 0.0f; - GameClient()->m_MultiViewActivated = true; - } - } - - if(!m_Active) - { - // closing the spectator menu - if(m_WasActive) - { - if(m_SelectedSpectatorId != NO_SELECTION) - { - if(m_SelectedSpectatorId == MULTI_VIEW) - GameClient()->m_MultiViewActivated = true; - else if(m_SelectedSpectatorId == SPEC_FREEVIEW || m_SelectedSpectatorId == SPEC_FOLLOW) - GameClient()->m_MultiViewActivated = false; - - if(!GameClient()->m_MultiViewActivated) - Spectate(m_SelectedSpectatorId); - - if(GameClient()->m_MultiViewActivated && m_SelectedSpectatorId != MULTI_VIEW && m_pClient->m_Teams.Team(m_SelectedSpectatorId) != GameClient()->m_MultiViewTeam) - { - GameClient()->ResetMultiView(); - Spectate(m_SelectedSpectatorId); - m_MultiViewActivateDelay = Client()->LocalTime() + 0.3f; - } - } - m_WasActive = false; - } - return; - } - - if(!m_pClient->m_Snap.m_SpecInfo.m_Active && Client()->State() != IClient::STATE_DEMOPLAYBACK) - { - m_Active = false; - m_WasActive = false; - return; - } - - m_WasActive = true; - m_SelectedSpectatorId = NO_SELECTION; - - // draw background - float Width = 400 * 3.0f * Graphics()->ScreenAspect(); - float Height = 400 * 3.0f; - float ObjWidth = 300.0f; - float FontSize = 20.0f; - float BigFontSize = 20.0f; - float StartY = -190.0f; - float LineHeight = 60.0f; - float TeeSizeMod = 1.0f; - float RoundRadius = 30.0f; - bool MultiViewSelected = false; - int TotalPlayers = 0; - int PerLine = 8; - float BoxMove = -10.0f; - float BoxOffset = 0.0f; - - for(const auto &pInfo : m_pClient->m_Snap.m_apInfoByDDTeamName) - { - if(!pInfo || pInfo->m_Team == TEAM_SPECTATORS) - continue; - - ++TotalPlayers; - } - - if(TotalPlayers > 64) - { - FontSize = 12.0f; - LineHeight = 15.0f; - TeeSizeMod = 0.3f; - PerLine = 32; - RoundRadius = 5.0f; - BoxMove = 3.0f; - BoxOffset = 6.0f; - } - else if(TotalPlayers > 32) - { - FontSize = 18.0f; - LineHeight = 30.0f; - TeeSizeMod = 0.7f; - PerLine = 16; - RoundRadius = 10.0f; - BoxMove = 3.0f; - BoxOffset = 6.0f; - } - if(TotalPlayers > 16) - { - ObjWidth = 600.0f; - } - - const vec2 ScreenSize = vec2(Width, Height); - const vec2 ScreenCenter = ScreenSize / 2.0f; - CUIRect SpectatorRect = {Width / 2.0f - ObjWidth, Height / 2.0f - 300.0f, ObjWidth * 2.0f, 600.0f}; - CUIRect SpectatorMouseRect; - SpectatorRect.Margin(20.0f, &SpectatorMouseRect); - - const bool WasTouchPressed = m_TouchState.m_AnyPressed; - Ui()->UpdateTouchState(m_TouchState); - if(m_TouchState.m_AnyPressed) - { - const vec2 TouchPos = (m_TouchState.m_PrimaryPosition - vec2(0.5f, 0.5f)) * ScreenSize; - if(SpectatorMouseRect.Inside(ScreenCenter + TouchPos)) - { - m_SelectorMouse = TouchPos; - } - } - else if(WasTouchPressed) - { - const vec2 TouchPos = (m_TouchState.m_PrimaryPosition - vec2(0.5f, 0.5f)) * ScreenSize; - if(!SpectatorRect.Inside(ScreenCenter + TouchPos)) - { - OnRelease(); - return; - } - } - - Graphics()->MapScreen(0, 0, Width, Height); - - SpectatorRect.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.3f), IGraphics::CORNER_ALL, 20.0f); - - // clamp mouse position to selector area - m_SelectorMouse.x = clamp(m_SelectorMouse.x, -(ObjWidth - 20.0f), ObjWidth - 20.0f); - m_SelectorMouse.y = clamp(m_SelectorMouse.y, -280.0f, 280.0f); - - const bool MousePressed = Input()->KeyPress(KEY_MOUSE_1) || m_TouchState.m_PrimaryPressed; - - // draw selections - if((Client()->State() == IClient::STATE_DEMOPLAYBACK && m_pClient->m_DemoSpecId == SPEC_FREEVIEW) || - (Client()->State() != IClient::STATE_DEMOPLAYBACK && m_pClient->m_Snap.m_SpecInfo.m_SpectatorId == SPEC_FREEVIEW)) - { - Graphics()->DrawRect(Width / 2.0f - (ObjWidth - 20.0f), Height / 2.0f - 280.0f, ((ObjWidth * 2.0f) / 3.0f) - 40.0f, 60.0f, ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_ALL, 20.0f); - } - - if(GameClient()->m_MultiViewActivated) - { - Graphics()->DrawRect(Width / 2.0f - (ObjWidth - 20.0f) + (ObjWidth * 2.0f / 3.0f), Height / 2.0f - 280.0f, ((ObjWidth * 2.0f) / 3.0f) - 40.0f, 60.0f, ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_ALL, 20.0f); - } - - if(Client()->State() == IClient::STATE_DEMOPLAYBACK && m_pClient->m_Snap.m_LocalClientId >= 0 && m_pClient->m_DemoSpecId == SPEC_FOLLOW) - { - Graphics()->DrawRect(Width / 2.0f - (ObjWidth - 20.0f) + (ObjWidth * 2.0f * 2.0f / 3.0f), Height / 2.0f - 280.0f, ((ObjWidth * 2.0f) / 3.0f) - 40.0f, 60.0f, ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_ALL, 20.0f); - } - - bool FreeViewSelected = false; - if(m_SelectorMouse.x >= -(ObjWidth - 20.0f) && m_SelectorMouse.x <= -(ObjWidth - 20.0f) + ((ObjWidth * 2.0f) / 3.0f) - 40.0f && - m_SelectorMouse.y >= -280.0f && m_SelectorMouse.y <= -220.0f) - { - m_SelectedSpectatorId = SPEC_FREEVIEW; - FreeViewSelected = true; - if(MousePressed) - { - GameClient()->m_MultiViewActivated = false; - Spectate(m_SelectedSpectatorId); - } - } - TextRender()->TextColor(1.0f, 1.0f, 1.0f, FreeViewSelected ? 1.0f : 0.5f); - TextRender()->Text(Width / 2.0f - (ObjWidth - 40.0f), Height / 2.0f - 280.f + (60.f - BigFontSize) / 2.f, BigFontSize, Localize("Free-View"), -1.0f); - - if(m_SelectorMouse.x >= -(ObjWidth - 20.0f) + (ObjWidth * 2.0f / 3.0f) && m_SelectorMouse.x <= -(ObjWidth - 20.0f) + (ObjWidth * 2.0f / 3.0f) + ((ObjWidth * 2.0f) / 3.0f) - 40.0f && - m_SelectorMouse.y >= -280.0f && m_SelectorMouse.y <= -220.0f) - { - m_SelectedSpectatorId = MULTI_VIEW; - MultiViewSelected = true; - if(MousePressed) - { - GameClient()->m_MultiViewActivated = true; - } - } - TextRender()->TextColor(1.0f, 1.0f, 1.0f, MultiViewSelected ? 1.0f : 0.5f); - TextRender()->Text(Width / 2.0f - (ObjWidth - 40.0f) + (ObjWidth * 2.0f / 3.0f), Height / 2.0f - 280.f + (60.f - BigFontSize) / 2.f, BigFontSize, Localize("Multi-View"), -1.0f); - - if(Client()->State() == IClient::STATE_DEMOPLAYBACK && m_pClient->m_Snap.m_LocalClientId >= 0) - { - bool FollowSelected = false; - if(m_SelectorMouse.x >= -(ObjWidth - 20.0f) + (ObjWidth * 2.0f * 2.0f / 3.0f) && m_SelectorMouse.x <= -(ObjWidth - 20.0f) + (ObjWidth * 2.0f * 2.0f / 3.0f) + ((ObjWidth * 2.0f) / 3.0f) - 40.0f && - m_SelectorMouse.y >= -280.0f && m_SelectorMouse.y <= -220.0f) - { - m_SelectedSpectatorId = SPEC_FOLLOW; - FollowSelected = true; - if(MousePressed) - { - GameClient()->m_MultiViewActivated = false; - Spectate(m_SelectedSpectatorId); - } - } - TextRender()->TextColor(1.0f, 1.0f, 1.0f, FollowSelected ? 1.0f : 0.5f); - TextRender()->Text(Width / 2.0f - (ObjWidth - 40.0f) + (ObjWidth * 2.0f * 2.0f / 3.0f), Height / 2.0f - 280.0f + (60.f - BigFontSize) / 2.f, BigFontSize, Localize("Follow"), -1.0f); - } - - float x = -(ObjWidth - 35.0f), y = StartY; - - int OldDDTeam = -1; - - for(int i = 0, Count = 0; i < MAX_CLIENTS; ++i) - { - if(!m_pClient->m_Snap.m_apInfoByDDTeamName[i] || m_pClient->m_Snap.m_apInfoByDDTeamName[i]->m_Team == TEAM_SPECTATORS) - continue; - - ++Count; - - if(Count == PerLine + 1 || (Count > PerLine + 1 && (Count - 1) % PerLine == 0)) - { - x += 290.0f; - y = StartY; - } - - const CNetObj_PlayerInfo *pInfo = m_pClient->m_Snap.m_apInfoByDDTeamName[i]; - int DDTeam = m_pClient->m_Teams.Team(pInfo->m_ClientId); - int NextDDTeam = 0; - - for(int j = i + 1; j < MAX_CLIENTS; j++) - { - const CNetObj_PlayerInfo *pInfo2 = m_pClient->m_Snap.m_apInfoByDDTeamName[j]; - - if(!pInfo2 || pInfo2->m_Team == TEAM_SPECTATORS) - continue; - - NextDDTeam = m_pClient->m_Teams.Team(pInfo2->m_ClientId); - break; - } - - if(OldDDTeam == -1) - { - for(int j = i - 1; j >= 0; j--) - { - const CNetObj_PlayerInfo *pInfo2 = m_pClient->m_Snap.m_apInfoByDDTeamName[j]; - - if(!pInfo2 || pInfo2->m_Team == TEAM_SPECTATORS) - continue; - - OldDDTeam = m_pClient->m_Teams.Team(pInfo2->m_ClientId); - break; - } - } - - if(DDTeam != TEAM_FLOCK) - { - const ColorRGBA Color = m_pClient->GetDDTeamColor(DDTeam).WithAlpha(0.5f); - int Corners = 0; - if(OldDDTeam != DDTeam) - Corners |= IGraphics::CORNER_TL | IGraphics::CORNER_TR; - if(NextDDTeam != DDTeam) - Corners |= IGraphics::CORNER_BL | IGraphics::CORNER_BR; - Graphics()->DrawRect(Width / 2.0f + x - 10.0f + BoxOffset, Height / 2.0f + y + BoxMove, 270.0f - BoxOffset, LineHeight, Color, Corners, RoundRadius); - } - - OldDDTeam = DDTeam; - - if((Client()->State() == IClient::STATE_DEMOPLAYBACK && m_pClient->m_DemoSpecId == m_pClient->m_Snap.m_apInfoByDDTeamName[i]->m_ClientId) || (Client()->State() != IClient::STATE_DEMOPLAYBACK && m_pClient->m_Snap.m_SpecInfo.m_SpectatorId == m_pClient->m_Snap.m_apInfoByDDTeamName[i]->m_ClientId)) - { - Graphics()->DrawRect(Width / 2.0f + x - 10.0f + BoxOffset, Height / 2.0f + y + BoxMove, 270.0f - BoxOffset, LineHeight, ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_ALL, RoundRadius); - } - - bool PlayerSelected = false; - if(m_SelectorMouse.x >= x - 10.0f && m_SelectorMouse.x < x + 260.0f && - m_SelectorMouse.y >= y - (LineHeight / 6.0f) && m_SelectorMouse.y < y + (LineHeight * 5.0f / 6.0f)) - { - m_SelectedSpectatorId = m_pClient->m_Snap.m_apInfoByDDTeamName[i]->m_ClientId; - PlayerSelected = true; - if(MousePressed) - { - if(GameClient()->m_MultiViewActivated) - { - if(GameClient()->m_MultiViewTeam == DDTeam) - { - GameClient()->m_aMultiViewId[m_SelectedSpectatorId] = !GameClient()->m_aMultiViewId[m_SelectedSpectatorId]; - if(!GameClient()->m_aMultiViewId[m_pClient->m_Snap.m_SpecInfo.m_SpectatorId]) - { - int NewClientId = GameClient()->FindFirstMultiViewId(); - if(NewClientId < MAX_CLIENTS && NewClientId >= 0) - { - GameClient()->CleanMultiViewId(NewClientId); - GameClient()->m_aMultiViewId[NewClientId] = true; - Spectate(NewClientId); - } - } - } - else - { - GameClient()->ResetMultiView(); - Spectate(m_SelectedSpectatorId); - m_MultiViewActivateDelay = Client()->LocalTime() + 0.3f; - } - } - else - { - Spectate(m_SelectedSpectatorId); - } - } - } - float TeeAlpha; - if(Client()->State() == IClient::STATE_DEMOPLAYBACK && - !m_pClient->m_Snap.m_aCharacters[m_pClient->m_Snap.m_apInfoByDDTeamName[i]->m_ClientId].m_Active) - { - TextRender()->TextColor(1.0f, 1.0f, 1.0f, 0.25f); - TeeAlpha = 0.5f; - } - else - { - TextRender()->TextColor(1.0f, 1.0f, 1.0f, PlayerSelected ? 1.0f : 0.5f); - TeeAlpha = 1.0f; - } - CTextCursor NameCursor; - TextRender()->SetCursor(&NameCursor, Width / 2.0f + x + 50.0f, Height / 2.0f + y + BoxMove + (LineHeight - FontSize) / 2.f, FontSize, TEXTFLAG_RENDER | TEXTFLAG_ELLIPSIS_AT_END); - NameCursor.m_LineWidth = 180.0f; - if(g_Config.m_ClShowIds) - { - char aClientId[16]; - GameClient()->FormatClientId(m_pClient->m_Snap.m_apInfoByDDTeamName[i]->m_ClientId, aClientId, EClientIdFormat::INDENT_AUTO); - TextRender()->TextEx(&NameCursor, aClientId); - } - TextRender()->TextEx(&NameCursor, m_pClient->m_aClients[m_pClient->m_Snap.m_apInfoByDDTeamName[i]->m_ClientId].m_aName); - - if(GameClient()->m_MultiViewActivated) - { - if(GameClient()->m_aMultiViewId[m_pClient->m_Snap.m_apInfoByDDTeamName[i]->m_ClientId]) - { - TextRender()->TextColor(0.1f, 1.0f, 0.1f, PlayerSelected ? 1.0f : 0.5f); - TextRender()->Text(Width / 2.0f + x + 50.0f + 180.0f, Height / 2.0f + y + BoxMove + (LineHeight - FontSize) / 2.f, FontSize - 3, "⬤", 220.0f); - } - else if(GameClient()->m_MultiViewTeam == DDTeam) - { - TextRender()->TextColor(1.0f, 0.1f, 0.1f, PlayerSelected ? 1.0f : 0.5f); - TextRender()->Text(Width / 2.0f + x + 50.0f + 180.0f, Height / 2.0f + y + BoxMove + (LineHeight - FontSize) / 2.f, FontSize - 3, "◯", 220.0f); - } - } - - // flag - if(m_pClient->m_Snap.m_pGameInfoObj && (m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_FLAGS) && - m_pClient->m_Snap.m_pGameDataObj && (m_pClient->m_Snap.m_pGameDataObj->m_FlagCarrierRed == m_pClient->m_Snap.m_apInfoByDDTeamName[i]->m_ClientId || m_pClient->m_Snap.m_pGameDataObj->m_FlagCarrierBlue == m_pClient->m_Snap.m_apInfoByDDTeamName[i]->m_ClientId)) - { - Graphics()->BlendNormal(); - if(m_pClient->m_Snap.m_pGameDataObj->m_FlagCarrierBlue == m_pClient->m_Snap.m_apInfoByDDTeamName[i]->m_ClientId) - Graphics()->TextureSet(GameClient()->m_GameSkin.m_SpriteFlagBlue); - else - Graphics()->TextureSet(GameClient()->m_GameSkin.m_SpriteFlagRed); - - Graphics()->QuadsBegin(); - Graphics()->QuadsSetSubset(1, 0, 0, 1); - - float Size = LineHeight; - IGraphics::CQuadItem QuadItem(Width / 2.0f + x - LineHeight / 5.0f, Height / 2.0f + y - LineHeight / 3.0f, Size / 2.0f, Size); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); - } - - CTeeRenderInfo TeeInfo = m_pClient->m_aClients[m_pClient->m_Snap.m_apInfoByDDTeamName[i]->m_ClientId].m_RenderInfo; - TeeInfo.m_Size *= TeeSizeMod; - - const CAnimState *pIdleState = CAnimState::GetIdle(); - vec2 OffsetToMid; - CRenderTools::GetRenderTeeOffsetToRenderedTee(pIdleState, &TeeInfo, OffsetToMid); - vec2 TeeRenderPos(Width / 2.0f + x + 20.0f, Height / 2.0f + y + BoxMove + LineHeight / 2.0f + OffsetToMid.y); - - RenderTools()->RenderTee(pIdleState, &TeeInfo, EMOTE_NORMAL, vec2(1.0f, 0.0f), TeeRenderPos, TeeAlpha); - - if(m_pClient->m_aClients[m_pClient->m_Snap.m_apInfoByDDTeamName[i]->m_ClientId].m_Friend) - { - ColorRGBA rgb = color_cast(ColorHSLA(g_Config.m_ClMessageFriendColor)); - TextRender()->TextColor(rgb.WithAlpha(1.f)); - TextRender()->Text(Width / 2.0f + x - TeeInfo.m_Size / 2.0f, Height / 2.0f + y + BoxMove + (LineHeight - FontSize) / 2.f, FontSize, "♥", 220.0f); - TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); - } - - y += LineHeight; - } - TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); - - RenderTools()->RenderCursor(ScreenCenter + m_SelectorMouse, 48.0f); -} - -void CSpectator::OnReset() -{ - m_WasActive = false; - m_Active = false; - m_SelectedSpectatorId = NO_SELECTION; -} - -void CSpectator::Spectate(int SpectatorId) -{ - if(Client()->State() == IClient::STATE_DEMOPLAYBACK) - { - m_pClient->m_DemoSpecId = clamp(SpectatorId, (int)SPEC_FOLLOW, MAX_CLIENTS - 1); - // The tick must be rendered for the spectator mode to be updated, so we do it manually when demo playback is paused - if(DemoPlayer()->BaseInfo()->m_Paused) - GameClient()->m_Menus.DemoSeekTick(IDemoPlayer::TICK_CURRENT); - return; - } - - if(m_pClient->m_Snap.m_SpecInfo.m_SpectatorId == SpectatorId) - return; - - if(Client()->IsSixup()) - { - protocol7::CNetMsg_Cl_SetSpectatorMode Msg; - if(SpectatorId == SPEC_FREEVIEW) - { - Msg.m_SpecMode = protocol7::SPEC_FREEVIEW; - Msg.m_SpectatorId = -1; - } - else - { - Msg.m_SpecMode = protocol7::SPEC_PLAYER; - Msg.m_SpectatorId = SpectatorId; - } - Client()->SendPackMsgActive(&Msg, MSGFLAG_VITAL, true); - return; - } - CNetMsg_Cl_SetSpectatorMode Msg; - Msg.m_SpectatorId = SpectatorId; - Client()->SendPackMsgActive(&Msg, MSGFLAG_VITAL); -} - -void CSpectator::SpectateClosest() -{ - if(!CanChangeSpectatorId()) - return; - - const CGameClient::CSnapState &Snap = m_pClient->m_Snap; - int SpectatorId = Snap.m_SpecInfo.m_SpectatorId; - - int NewSpectatorId = -1; - - vec2 CurPosition(m_pClient->m_Camera.m_Center); - if(SpectatorId != SPEC_FREEVIEW) - { - const CNetObj_Character &CurCharacter = Snap.m_aCharacters[SpectatorId].m_Cur; - CurPosition.x = CurCharacter.m_X; - CurPosition.y = CurCharacter.m_Y; - } - - int ClosestDistance = std::numeric_limits::max(); - for(int i = 0; i < MAX_CLIENTS; i++) - { - if(i == SpectatorId || !Snap.m_aCharacters[i].m_Active || !Snap.m_apPlayerInfos[i] || Snap.m_apPlayerInfos[i]->m_Team == TEAM_SPECTATORS) - continue; - - if(Client()->State() != IClient::STATE_DEMOPLAYBACK && i == Snap.m_LocalClientId) - continue; - - const CNetObj_Character &MaybeClosestCharacter = Snap.m_aCharacters[i].m_Cur; - int Distance = distance(CurPosition, vec2(MaybeClosestCharacter.m_X, MaybeClosestCharacter.m_Y)); - if(NewSpectatorId == -1 || Distance < ClosestDistance) - { - NewSpectatorId = i; - ClosestDistance = Distance; - } - } - if(NewSpectatorId > -1) - Spectate(NewSpectatorId); -} diff --git a/src/game/client/components/spectator.h b/src/game/client/components/spectator.h deleted file mode 100644 index c454c0cf5d..0000000000 --- a/src/game/client/components/spectator.h +++ /dev/null @@ -1,56 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_SPECTATOR_H -#define GAME_CLIENT_COMPONENTS_SPECTATOR_H -#include -#include - -#include -#include - -class CSpectator : public CComponent -{ - enum - { - MULTI_VIEW = -4, - NO_SELECTION = -3, - }; - - bool m_Active; - bool m_WasActive; - - int m_SelectedSpectatorId; - vec2 m_SelectorMouse; - - CUi::CTouchState m_TouchState; - - float m_MultiViewActivateDelay; - - bool CanChangeSpectatorId(); - void SpectateNext(bool Reverse); - - static void ConKeySpectator(IConsole::IResult *pResult, void *pUserData); - static void ConSpectate(IConsole::IResult *pResult, void *pUserData); - static void ConSpectateNext(IConsole::IResult *pResult, void *pUserData); - static void ConSpectatePrevious(IConsole::IResult *pResult, void *pUserData); - static void ConSpectateClosest(IConsole::IResult *pResult, void *pUserData); - static void ConMultiView(IConsole::IResult *pResult, void *pUserData); - -public: - CSpectator(); - virtual int Sizeof() const override { return sizeof(*this); } - - virtual void OnConsoleInit() override; - virtual bool OnCursorMove(float x, float y, IInput::ECursorType CursorType) override; - virtual bool OnInput(const IInput::CEvent &Event) override; - virtual void OnRender() override; - virtual void OnRelease() override; - virtual void OnReset() override; - - void Spectate(int SpectatorId); - void SpectateClosest(); - - bool IsActive() const { return m_Active; } -}; - -#endif diff --git a/src/game/client/components/statboard.cpp b/src/game/client/components/statboard.cpp deleted file mode 100644 index 2cfe85b0b9..0000000000 --- a/src/game/client/components/statboard.cpp +++ /dev/null @@ -1,542 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -CStatboard::CStatboard() -{ - m_Active = false; - m_ScreenshotTaken = false; - m_ScreenshotTime = -1; -} - -void CStatboard::OnReset() -{ - for(auto &Stat : m_pClient->m_aStats) - Stat.Reset(); - m_Active = false; - m_ScreenshotTaken = false; - m_ScreenshotTime = -1; -} - -void CStatboard::OnRelease() -{ - m_Active = false; -} - -void CStatboard::ConKeyStats(IConsole::IResult *pResult, void *pUserData) -{ - ((CStatboard *)pUserData)->m_Active = pResult->GetInteger(0) != 0; -} - -void CStatboard::OnConsoleInit() -{ - Console()->Register("+statboard", "", CFGFLAG_CLIENT, ConKeyStats, this, "Show stats"); -} - -bool CStatboard::IsActive() const -{ - return m_Active; -} - -void CStatboard::OnMessage(int MsgType, void *pRawMsg) -{ - if(m_pClient->m_SuppressEvents) - return; - - if(MsgType == NETMSGTYPE_SV_KILLMSG) - { - CNetMsg_Sv_KillMsg *pMsg = (CNetMsg_Sv_KillMsg *)pRawMsg; - CGameClient::CClientStats *pStats = m_pClient->m_aStats; - - pStats[pMsg->m_Victim].m_Deaths++; - pStats[pMsg->m_Victim].m_CurrentSpree = 0; - if(pMsg->m_Weapon >= 0) - pStats[pMsg->m_Victim].m_aDeathsFrom[pMsg->m_Weapon]++; - if(pMsg->m_Victim != pMsg->m_Killer) - { - pStats[pMsg->m_Killer].m_Frags++; - pStats[pMsg->m_Killer].m_CurrentSpree++; - - if(pStats[pMsg->m_Killer].m_CurrentSpree > pStats[pMsg->m_Killer].m_BestSpree) - pStats[pMsg->m_Killer].m_BestSpree = pStats[pMsg->m_Killer].m_CurrentSpree; - if(pMsg->m_Weapon >= 0) - pStats[pMsg->m_Killer].m_aFragsWith[pMsg->m_Weapon]++; - } - else - pStats[pMsg->m_Victim].m_Suicides++; - } - else if(MsgType == NETMSGTYPE_SV_KILLMSGTEAM) - { - CNetMsg_Sv_KillMsgTeam *pMsg = (CNetMsg_Sv_KillMsgTeam *)pRawMsg; - CGameClient::CClientStats *pStats = m_pClient->m_aStats; - - for(int i = 0; i < MAX_CLIENTS; i++) - { - if(m_pClient->m_Teams.Team(i) == pMsg->m_Team) - { - pStats[i].m_Deaths++; - pStats[i].m_Suicides++; - } - } - } - else if(MsgType == NETMSGTYPE_SV_CHAT) - { - CNetMsg_Sv_Chat *pMsg = (CNetMsg_Sv_Chat *)pRawMsg; - if(pMsg->m_ClientId < 0) - { - const char *p, *t; - const char *pLookFor = "flag was captured by '"; - if((p = str_find(pMsg->m_pMessage, pLookFor))) - { - char aName[MAX_NAME_LENGTH]; - p += str_length(pLookFor); - t = str_rchr(p, '\''); - - if(t <= p) - return; - str_truncate(aName, sizeof(aName), p, t - p); - - for(int i = 0; i < MAX_CLIENTS; i++) - { - if(!m_pClient->m_aStats[i].IsActive()) - continue; - - if(str_comp(m_pClient->m_aClients[i].m_aName, aName) == 0) - { - m_pClient->m_aStats[i].m_FlagCaptures++; - break; - } - } - } - } - } -} - -void CStatboard::OnRender() -{ - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - - if((g_Config.m_ClAutoStatboardScreenshot || g_Config.m_ClAutoCSV) && Client()->State() != IClient::STATE_DEMOPLAYBACK) - { - if(m_ScreenshotTime < 0 && m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_GAMEOVER) - m_ScreenshotTime = time_get() + time_freq() * 3; - if(m_ScreenshotTime > -1 && m_ScreenshotTime < time_get()) - m_Active = true; - if(!m_ScreenshotTaken && m_ScreenshotTime > -1 && m_ScreenshotTime + time_freq() / 5 < time_get()) - { - if(g_Config.m_ClAutoStatboardScreenshot) - AutoStatScreenshot(); - if(g_Config.m_ClAutoCSV) - AutoStatCSV(); - m_ScreenshotTaken = true; - } - } - - if(IsActive()) - RenderGlobalStats(); -} - -void CStatboard::RenderGlobalStats() -{ - const float StatboardWidth = 400 * 3.0f * Graphics()->ScreenAspect(); - const float StatboardHeight = 400 * 3.0f; - float StatboardContentWidth = 260.0f; - float StatboardContentHeight = 750.0f; - - const CNetObj_PlayerInfo *apPlayers[MAX_CLIENTS] = {0}; - int NumPlayers = 0; - - // sort red or dm players by score - for(const auto *pInfo : m_pClient->m_Snap.m_apInfoByScore) - { - if(!pInfo || !m_pClient->m_aStats[pInfo->m_ClientId].IsActive() || m_pClient->m_aClients[pInfo->m_ClientId].m_Team != TEAM_RED) - continue; - apPlayers[NumPlayers] = pInfo; - NumPlayers++; - } - - // sort blue players by score after - if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS) - { - for(const auto *pInfo : m_pClient->m_Snap.m_apInfoByScore) - { - if(!pInfo || !m_pClient->m_aStats[pInfo->m_ClientId].IsActive() || m_pClient->m_aClients[pInfo->m_ClientId].m_Team != TEAM_BLUE) - continue; - apPlayers[NumPlayers] = pInfo; - NumPlayers++; - } - } - - // Dirty hack. Do not show scoreboard if there are more than 32 players - // remove as soon as support of more than 32 players is required - if(NumPlayers > 32) - return; - - //clear motd if it is active - if(m_pClient->m_Motd.IsActive()) - m_pClient->m_Motd.Clear(); - - bool GameWithFlags = m_pClient->m_Snap.m_pGameInfoObj && - m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_FLAGS; - - StatboardContentWidth += 7 * 85 + 95; // Suicides 95; other labels 85 - - if(GameWithFlags) - StatboardContentWidth += 150; // Grabs & Flags - - bool aDisplayWeapon[NUM_WEAPONS] = {false}; - for(int i = 0; i < NumPlayers; i++) - { - const CGameClient::CClientStats *pStats = &m_pClient->m_aStats[apPlayers[i]->m_ClientId]; - for(int j = 0; j < NUM_WEAPONS; j++) - aDisplayWeapon[j] = aDisplayWeapon[j] || pStats->m_aFragsWith[j] || pStats->m_aDeathsFrom[j]; - } - for(bool DisplayWeapon : aDisplayWeapon) - if(DisplayWeapon) - StatboardContentWidth += 80; - - float x = StatboardWidth / 2 - StatboardContentWidth / 2; - float y = 200.0f; - - Graphics()->MapScreen(0, 0, StatboardWidth, StatboardHeight); - - Graphics()->DrawRect(x - 10.f, y - 10.f, StatboardContentWidth, StatboardContentHeight, ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f), IGraphics::CORNER_ALL, 17.0f); - - float tw; - int px = 325; - - TextRender()->Text(x + 10, y - 5, 22.0f, Localize("Name"), -1.0f); - const char *apHeaders[] = { - Localize("Frags"), Localize("Deaths"), Localize("Suicides"), - Localize("Ratio"), Localize("Net"), Localize("FPM"), - Localize("Spree"), Localize("Best"), Localize("Grabs")}; - for(int i = 0; i < 9; i++) - { - if(i == 2) - px += 10.0f; // Suicides - if(i == 8 && !GameWithFlags) // Don't draw "Grabs" in game with no flag - continue; - tw = TextRender()->TextWidth(22.0f, apHeaders[i], -1, -1.0f); - TextRender()->Text(x + px - tw, y - 5, 22.0f, apHeaders[i], -1.0f); - px += 85; - } - - px -= 40; - for(int i = 0; i < NUM_WEAPONS; i++) - { - if(!aDisplayWeapon[i]) - continue; - float ScaleX, ScaleY; - RenderTools()->GetSpriteScale(g_pData->m_Weapons.m_aId[i].m_pSpriteBody, ScaleX, ScaleY); - Graphics()->TextureSet(GameClient()->m_GameSkin.m_aSpriteWeapons[i]); - Graphics()->QuadsBegin(); - if(i == 0) - RenderTools()->DrawSprite(x + px, y + 10, g_pData->m_Weapons.m_aId[i].m_VisualSize * 0.8f * ScaleX, g_pData->m_Weapons.m_aId[i].m_VisualSize * 0.8f * ScaleY); - else - RenderTools()->DrawSprite(x + px, y + 10, g_pData->m_Weapons.m_aId[i].m_VisualSize * ScaleX, g_pData->m_Weapons.m_aId[i].m_VisualSize * ScaleY); - px += 80; - Graphics()->QuadsEnd(); - } - - if(GameWithFlags) - { - Graphics()->TextureSet(GameClient()->m_GameSkin.m_SpriteFlagRed); - float ScaleX, ScaleY; - RenderTools()->GetSpriteScale(SPRITE_FLAG_RED, ScaleX, ScaleY); - Graphics()->QuadsBegin(); - Graphics()->QuadsSetRotation(0.78f); - RenderTools()->DrawSprite(x + px, y + 15, 48 * ScaleX, 48 * ScaleY); - Graphics()->QuadsEnd(); - } - - y += 29.0f; - - float FontSize = 24.0f; - float LineHeight = 50.0f; - float TeeSizemod = 0.8f; - float ContentLineOffset = LineHeight * 0.05f; - - if(NumPlayers > 16) - { - FontSize = 20.0f; - LineHeight = 22.0f; - TeeSizemod = 0.34f; - ContentLineOffset = 0; - } - else if(NumPlayers > 14) - { - FontSize = 24.0f; - LineHeight = 40.0f; - TeeSizemod = 0.7f; - } - - for(int j = 0; j < NumPlayers; j++) - { - const CNetObj_PlayerInfo *pInfo = apPlayers[j]; - const CGameClient::CClientStats *pStats = &m_pClient->m_aStats[pInfo->m_ClientId]; - - if(m_pClient->m_Snap.m_LocalClientId == pInfo->m_ClientId || (m_pClient->m_Snap.m_SpecInfo.m_Active && pInfo->m_ClientId == m_pClient->m_Snap.m_SpecInfo.m_SpectatorId)) - { - // background so it's easy to find the local player - Graphics()->DrawRect(x - 10, y + ContentLineOffset / 2, StatboardContentWidth, LineHeight - ContentLineOffset, ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_NONE, 0.0f); - } - - CTeeRenderInfo Teeinfo = m_pClient->m_aClients[pInfo->m_ClientId].m_RenderInfo; - Teeinfo.m_Size *= TeeSizemod; - - const CAnimState *pIdleState = CAnimState::GetIdle(); - vec2 OffsetToMid; - CRenderTools::GetRenderTeeOffsetToRenderedTee(pIdleState, &Teeinfo, OffsetToMid); - vec2 TeeRenderPos(x + Teeinfo.m_Size / 2, y + LineHeight / 2.0f + OffsetToMid.y); - - RenderTools()->RenderTee(pIdleState, &Teeinfo, EMOTE_NORMAL, vec2(1, 0), TeeRenderPos); - - char aBuf[128]; - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, x + 64, y + (LineHeight * 0.95f - FontSize) / 2.f, FontSize, TEXTFLAG_RENDER | TEXTFLAG_STOP_AT_END); - Cursor.m_LineWidth = 220; - TextRender()->TextEx(&Cursor, m_pClient->m_aClients[pInfo->m_ClientId].m_aName, -1); - - px = 325; - - // FRAGS - { - str_format(aBuf, sizeof(aBuf), "%d", pStats->m_Frags); - tw = TextRender()->TextWidth(FontSize, aBuf, -1, -1.0f); - TextRender()->Text(x - tw + px, y + (LineHeight * 0.95f - FontSize) / 2.f, FontSize, aBuf, -1.0f); - px += 85; - } - // DEATHS - { - str_format(aBuf, sizeof(aBuf), "%d", pStats->m_Deaths); - tw = TextRender()->TextWidth(FontSize, aBuf, -1, -1.0f); - TextRender()->Text(x - tw + px, y + (LineHeight * 0.95f - FontSize) / 2.f, FontSize, aBuf, -1.0f); - px += 85; - } - // SUICIDES - { - px += 10; - str_format(aBuf, sizeof(aBuf), "%d", pStats->m_Suicides); - tw = TextRender()->TextWidth(FontSize, aBuf, -1, -1.0f); - TextRender()->Text(x - tw + px, y + (LineHeight * 0.95f - FontSize) / 2.f, FontSize, aBuf, -1.0f); - px += 85; - } - // RATIO - { - if(pStats->m_Deaths == 0) - str_copy(aBuf, "--"); - else - str_format(aBuf, sizeof(aBuf), "%.2f", (float)(pStats->m_Frags) / pStats->m_Deaths); - tw = TextRender()->TextWidth(FontSize, aBuf, -1, -1.0f); - TextRender()->Text(x - tw + px, y + (LineHeight * 0.95f - FontSize) / 2.f, FontSize, aBuf, -1.0f); - px += 85; - } - // NET - { - str_format(aBuf, sizeof(aBuf), "%+d", pStats->m_Frags - pStats->m_Deaths); - tw = TextRender()->TextWidth(FontSize, aBuf, -1, -1.0f); - TextRender()->Text(x - tw + px, y + (LineHeight * 0.95f - FontSize) / 2.f, FontSize, aBuf, -1.0f); - px += 85; - } - // FPM - { - float Fpm = pStats->GetFPM(Client()->GameTick(g_Config.m_ClDummy), Client()->GameTickSpeed()); - str_format(aBuf, sizeof(aBuf), "%.1f", Fpm); - tw = TextRender()->TextWidth(FontSize, aBuf, -1, -1.0f); - TextRender()->Text(x - tw + px, y + (LineHeight * 0.95f - FontSize) / 2.f, FontSize, aBuf, -1.0f); - px += 85; - } - // SPREE - { - str_format(aBuf, sizeof(aBuf), "%d", pStats->m_CurrentSpree); - tw = TextRender()->TextWidth(FontSize, aBuf, -1, -1.0f); - TextRender()->Text(x - tw + px, y + (LineHeight * 0.95f - FontSize) / 2.f, FontSize, aBuf, -1.0f); - px += 85; - } - // BEST SPREE - { - str_format(aBuf, sizeof(aBuf), "%d", pStats->m_BestSpree); - tw = TextRender()->TextWidth(FontSize, aBuf, -1, -1.0f); - TextRender()->Text(x - tw + px, y + (LineHeight * 0.95f - FontSize) / 2.f, FontSize, aBuf, -1.0f); - px += 85; - } - // GRABS - if(GameWithFlags) - { - str_format(aBuf, sizeof(aBuf), "%d", pStats->m_FlagGrabs); - tw = TextRender()->TextWidth(FontSize, aBuf, -1, -1.0f); - TextRender()->Text(x - tw + px, y + (LineHeight * 0.95f - FontSize) / 2.f, FontSize, aBuf, -1.0f); - px += 85; - } - // WEAPONS - px -= 40; - for(int i = 0; i < NUM_WEAPONS; i++) - { - if(!aDisplayWeapon[i]) - continue; - - str_format(aBuf, sizeof(aBuf), "%d/%d", pStats->m_aFragsWith[i], pStats->m_aDeathsFrom[i]); - tw = TextRender()->TextWidth(FontSize, aBuf, -1, -1.0f); - TextRender()->Text(x + px - tw / 2, y + (LineHeight * 0.95f - FontSize) / 2.f, FontSize, aBuf, -1.0f); - px += 80; - } - // FLAGS - if(GameWithFlags) - { - str_format(aBuf, sizeof(aBuf), "%d", pStats->m_FlagCaptures); - tw = TextRender()->TextWidth(FontSize, aBuf, -1, -1.0f); - TextRender()->Text(x - tw + px, y + (LineHeight * 0.95f - FontSize) / 2.f, FontSize, aBuf, -1.0f); - } - y += LineHeight; - } -} - -void CStatboard::AutoStatScreenshot() -{ - if(Client()->State() != IClient::STATE_DEMOPLAYBACK) - Client()->AutoStatScreenshot_Start(); -} - -void CStatboard::AutoStatCSV() -{ - if(Client()->State() != IClient::STATE_DEMOPLAYBACK) - { - char aDate[20], aFilename[IO_MAX_PATH_LENGTH]; - str_timestamp(aDate, sizeof(aDate)); - str_format(aFilename, sizeof(aFilename), "screenshots/auto/stats_%s.csv", aDate); - IOHANDLE File = Storage()->OpenFile(aFilename, IOFLAG_WRITE, IStorage::TYPE_ALL); - - if(File) - { - char aStats[1024 * (VANILLA_MAX_CLIENTS + 1)]; - FormatStats(aStats, sizeof(aStats)); - io_write(File, aStats, str_length(aStats)); - io_close(File); - } - - Client()->AutoCSV_Start(); - } -} - -std::string CStatboard::ReplaceCommata(char *pStr) -{ - if(!str_find(pStr, ",")) - return pStr; - - char aOutbuf[256]; - mem_zero(aOutbuf, sizeof(aOutbuf)); - - for(int i = 0, skip = 0; i < 64; i++) - { - if(pStr[i] == ',') - { - aOutbuf[i + skip++] = '%'; - aOutbuf[i + skip++] = '2'; - aOutbuf[i + skip] = 'C'; - } - else - aOutbuf[i + skip] = pStr[i]; - } - - return aOutbuf; -} - -void CStatboard::FormatStats(char *pDest, size_t DestSize) -{ - // server stats - CServerInfo CurrentServerInfo; - Client()->GetServerInfo(&CurrentServerInfo); - char aServerStats[1024]; - str_format(aServerStats, sizeof(aServerStats), "Servername,Game-type,Map\n%s,%s,%s", ReplaceCommata(CurrentServerInfo.m_aName).c_str(), ReplaceCommata(CurrentServerInfo.m_aGameType).c_str(), ReplaceCommata(CurrentServerInfo.m_aMap).c_str()); - - // player stats - - // sort players - const CNetObj_PlayerInfo *apPlayers[MAX_CLIENTS] = {0}; - int NumPlayers = 0; - - // sort red or dm players by score - for(const auto *pInfo : m_pClient->m_Snap.m_apInfoByScore) - { - if(!pInfo || !m_pClient->m_aStats[pInfo->m_ClientId].IsActive() || m_pClient->m_aClients[pInfo->m_ClientId].m_Team != TEAM_RED) - continue; - apPlayers[NumPlayers] = pInfo; - NumPlayers++; - } - - // sort blue players by score after - if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS) - { - for(const auto *pInfo : m_pClient->m_Snap.m_apInfoByScore) - { - if(!pInfo || !m_pClient->m_aStats[pInfo->m_ClientId].IsActive() || m_pClient->m_aClients[pInfo->m_ClientId].m_Team != TEAM_BLUE) - continue; - apPlayers[NumPlayers] = pInfo; - NumPlayers++; - } - } - - char aPlayerStats[1024 * VANILLA_MAX_CLIENTS]; - str_copy(aPlayerStats, "Local-player,Team,Name,Clan,Score,Frags,Deaths,Suicides,F/D-ratio,Net,FPM,Spree,Best,Hammer-F/D,Gun-F/D,Shotgun-F/D,Grenade-F/D,Laser-F/D,Ninja-F/D,GameWithFlags,Flag-grabs,Flag-captures\n"); - for(int i = 0; i < NumPlayers; i++) - { - const CNetObj_PlayerInfo *pInfo = apPlayers[i]; - const CGameClient::CClientStats *pStats = &m_pClient->m_aStats[pInfo->m_ClientId]; - - // Pre-formatting - - // Weapons frags/deaths - char aWeaponFD[64 * NUM_WEAPONS]; - for(int j = 0; j < NUM_WEAPONS; j++) - { - if(j == 0) - str_format(aWeaponFD, sizeof(aWeaponFD), "%d/%d", pStats->m_aFragsWith[j], pStats->m_aDeathsFrom[j]); - else - str_format(aWeaponFD, sizeof(aWeaponFD), "%s,%d/%d", aWeaponFD, pStats->m_aFragsWith[j], pStats->m_aDeathsFrom[j]); - } - - // Frag/Death ratio - float fdratio = 0.0f; - if(pStats->m_Deaths != 0) - fdratio = (float)(pStats->m_Frags) / pStats->m_Deaths; - - // Local player - bool localPlayer = (m_pClient->m_Snap.m_LocalClientId == pInfo->m_ClientId || (m_pClient->m_Snap.m_SpecInfo.m_Active && pInfo->m_ClientId == m_pClient->m_Snap.m_SpecInfo.m_SpectatorId)); - - // Game with flags - bool GameWithFlags = (m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_FLAGS); - - char aBuf[1024]; - str_format(aBuf, sizeof(aBuf), "%d,%d,%s,%s,%d,%d,%d,%d,%.2f,%i,%.1f,%d,%d,%s,%d,%d,%d\n", - localPlayer ? 1 : 0, // Local player - m_pClient->m_aClients[pInfo->m_ClientId].m_Team, // Team - ReplaceCommata(m_pClient->m_aClients[pInfo->m_ClientId].m_aName).c_str(), // Name - ReplaceCommata(m_pClient->m_aClients[pInfo->m_ClientId].m_aClan).c_str(), // Clan - clamp(pInfo->m_Score, -999, 999), // Score - pStats->m_Frags, // Frags - pStats->m_Deaths, // Deaths - pStats->m_Suicides, // Suicides - fdratio, // fdratio - pStats->m_Frags - pStats->m_Deaths, // Net - pStats->GetFPM(Client()->GameTick(g_Config.m_ClDummy), Client()->GameTickSpeed()), // FPM - pStats->m_CurrentSpree, // CurSpree - pStats->m_BestSpree, // BestSpree - aWeaponFD, // WeaponFD - GameWithFlags ? 1 : 0, // GameWithFlags - pStats->m_FlagGrabs, // Flag grabs - pStats->m_FlagCaptures); // Flag captures - - str_append(aPlayerStats, aBuf); - } - - str_format(pDest, DestSize, "%s\n\n%s", aServerStats, aPlayerStats); -} diff --git a/src/game/client/components/statboard.h b/src/game/client/components/statboard.h deleted file mode 100644 index e5d2a88067..0000000000 --- a/src/game/client/components/statboard.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef GAME_CLIENT_COMPONENTS_STATBOARD_H -#define GAME_CLIENT_COMPONENTS_STATBOARD_H - -#include - -#include -#include - -class CStatboard : public CComponent -{ -private: - bool m_Active; - bool m_ScreenshotTaken; - int64_t m_ScreenshotTime; - static void ConKeyStats(IConsole::IResult *pResult, void *pUserData); - void RenderGlobalStats(); - void AutoStatScreenshot(); - void AutoStatCSV(); - - std::string ReplaceCommata(char *pStr); - void FormatStats(char *pDest, size_t DestSize); - -public: - CStatboard(); - virtual int Sizeof() const override { return sizeof(*this); } - virtual void OnReset() override; - virtual void OnConsoleInit() override; - virtual void OnRender() override; - virtual void OnRelease() override; - virtual void OnMessage(int MsgType, void *pRawMsg) override; - bool IsActive() const; -}; - -#endif // GAME_CLIENT_COMPONENTS_STATBOARD_H diff --git a/src/game/client/components/tooltips.cpp b/src/game/client/components/tooltips.cpp deleted file mode 100644 index ed1cbba9f7..0000000000 --- a/src/game/client/components/tooltips.cpp +++ /dev/null @@ -1,149 +0,0 @@ -#include "tooltips.h" - -#include -#include - -CTooltips::CTooltips() -{ - OnReset(); -} - -void CTooltips::OnReset() -{ - m_HoverTime = -1; - m_Tooltips.clear(); - ClearActiveTooltip(); -} - -void CTooltips::SetActiveTooltip(CTooltip &Tooltip) -{ - m_ActiveTooltip.emplace(Tooltip); -} - -inline void CTooltips::ClearActiveTooltip() -{ - m_ActiveTooltip.reset(); - m_PreviousTooltip.reset(); -} - -void CTooltips::DoToolTip(const void *pId, const CUIRect *pNearRect, const char *pText, float WidthHint) -{ - uintptr_t Id = reinterpret_cast(pId); - const auto result = m_Tooltips.emplace(Id, CTooltip{ - pId, - *pNearRect, - pText, - WidthHint, - false}); - CTooltip &Tooltip = result.first->second; - - if(!result.second) - { - Tooltip.m_Rect = *pNearRect; // update in case of window resize - Tooltip.m_pText = pText; // update in case of language change - } - - Tooltip.m_OnScreen = true; - - if(Ui()->HotItem() == Tooltip.m_pId) - { - SetActiveTooltip(Tooltip); - } -} - -void CTooltips::OnRender() -{ - if(m_ActiveTooltip.has_value()) - { - CTooltip &Tooltip = m_ActiveTooltip.value(); - - if(Ui()->HotItem() != Tooltip.m_pId) - { - Tooltip.m_OnScreen = false; - ClearActiveTooltip(); - return; - } - - if(!Tooltip.m_OnScreen) - return; - - // Reset hover time if a different tooltip is active. - // Only reset hover time when rendering, because multiple tooltips can be - // activated in the same frame, but only the last one should be rendered. - if(!m_PreviousTooltip.has_value() || m_PreviousTooltip.value().get().m_pText != Tooltip.m_pText) - m_HoverTime = time_get(); - m_PreviousTooltip.emplace(Tooltip); - - // Delay tooltip until 1 second passed. Start fade-in in the last 0.25 seconds. - constexpr float SecondsBeforeFadeIn = 0.75f; - const float SecondsSinceActivation = (time_get() - m_HoverTime) / (float)time_freq(); - if(SecondsSinceActivation < SecondsBeforeFadeIn) - return; - constexpr float SecondsFadeIn = 0.25f; - const float AlphaFactor = SecondsSinceActivation < SecondsBeforeFadeIn + SecondsFadeIn ? (SecondsSinceActivation - SecondsBeforeFadeIn) / SecondsFadeIn : 1.0f; - - constexpr float FontSize = 14.0f; - constexpr float Margin = 5.0f; - constexpr float Padding = 5.0f; - - const STextBoundingBox BoundingBox = TextRender()->TextBoundingBox(FontSize, Tooltip.m_pText, -1, Tooltip.m_WidthHint); - CUIRect Rect; - Rect.w = BoundingBox.m_W + 2 * Padding; - Rect.h = BoundingBox.m_H + 2 * Padding; - - const CUIRect *pScreen = Ui()->Screen(); - Rect.w = minimum(Rect.w, pScreen->w - 2 * Margin); - Rect.h = minimum(Rect.h, pScreen->h - 2 * Margin); - - // Try the top side. - if(Tooltip.m_Rect.y - Rect.h - Margin > pScreen->y) - { - Rect.x = clamp(Ui()->MouseX() - Rect.w / 2.0f, Margin, pScreen->w - Rect.w - Margin); - Rect.y = Tooltip.m_Rect.y - Rect.h - Margin; - } - // Try the bottom side. - else if(Tooltip.m_Rect.y + Tooltip.m_Rect.h + Margin < pScreen->h) - { - Rect.x = clamp(Ui()->MouseX() - Rect.w / 2.0f, Margin, pScreen->w - Rect.w - Margin); - Rect.y = Tooltip.m_Rect.y + Tooltip.m_Rect.h + Margin; - } - // Try the right side. - else if(Tooltip.m_Rect.x + Tooltip.m_Rect.w + Margin + Rect.w < pScreen->w) - { - Rect.x = Tooltip.m_Rect.x + Tooltip.m_Rect.w + Margin; - Rect.y = clamp(Ui()->MouseY() - Rect.h / 2.0f, Margin, pScreen->h - Rect.h - Margin); - } - // Try the left side. - else if(Tooltip.m_Rect.x - Rect.w - Margin > pScreen->x) - { - Rect.x = Tooltip.m_Rect.x - Rect.w - Margin; - Rect.y = clamp(Ui()->MouseY() - Rect.h / 2.0f, Margin, pScreen->h - Rect.h - Margin); - } - - Rect.Draw(ColorRGBA(0.2f, 0.2f, 0.2f, 0.8f * AlphaFactor), IGraphics::CORNER_ALL, Padding); - Rect.Margin(Padding, &Rect); - - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, Rect.x, Rect.y, FontSize, TEXTFLAG_RENDER); - Cursor.m_LineWidth = Tooltip.m_WidthHint; - - STextContainerIndex TextContainerIndex; - const unsigned OldRenderFlags = TextRender()->GetRenderFlags(); - TextRender()->SetRenderFlags(OldRenderFlags | TEXT_RENDER_FLAG_ONE_TIME_USE); - TextRender()->CreateTextContainer(TextContainerIndex, &Cursor, Tooltip.m_pText); - TextRender()->SetRenderFlags(OldRenderFlags); - - if(TextContainerIndex.Valid()) - { - ColorRGBA TextColor = TextRender()->DefaultTextColor(); - TextColor.a *= AlphaFactor; - ColorRGBA OutlineColor = TextRender()->DefaultTextOutlineColor(); - OutlineColor.a *= AlphaFactor; - TextRender()->RenderTextContainer(TextContainerIndex, TextColor, OutlineColor); - } - - TextRender()->DeleteTextContainer(TextContainerIndex); - - Tooltip.m_OnScreen = false; - } -} diff --git a/src/game/client/components/tooltips.h b/src/game/client/components/tooltips.h deleted file mode 100644 index b2b98b363b..0000000000 --- a/src/game/client/components/tooltips.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef GAME_CLIENT_COMPONENTS_TOOLTIPS_H -#define GAME_CLIENT_COMPONENTS_TOOLTIPS_H - -#include -#include - -#include -#include -#include -#include - -struct CTooltip -{ - const void *m_pId; - CUIRect m_Rect; - const char *m_pText; - float m_WidthHint; - bool m_OnScreen; // used to know if the tooltip should be rendered. -}; - -/** - * A component that manages and renders UI tooltips. - * - * Should be among the last components to render. - */ -class CTooltips : public CComponent -{ - std::unordered_map m_Tooltips; - std::optional> m_ActiveTooltip; - std::optional> m_PreviousTooltip; - int64_t m_HoverTime; - - /** - * @param Tooltip A reference to the tooltip that should be active. - */ - void SetActiveTooltip(CTooltip &Tooltip); - - inline void ClearActiveTooltip(); - -public: - CTooltips(); - virtual int Sizeof() const override { return sizeof(*this); } - - /** - * Adds the tooltip to a cache and renders it when active. - * - * On the first call to this function, the data passed is cached, afterwards the calls are used to detect if the tooltip should be activated. - * If multiple tooltips cover the same rect or the rects intersect, then the tooltip that is added later has priority. - * - * @param pId The ID of the tooltip. Usually a reference to some g_Config value. - * @param pNearRect Place the tooltip near this rect. - * @param pText The text to display in the tooltip. - * @param WidthHint The maximum width of the tooltip, or -1.0f for unlimited. - */ - void DoToolTip(const void *pId, const CUIRect *pNearRect, const char *pText, float WidthHint = -1.0f); - - virtual void OnReset() override; - virtual void OnRender() override; -}; - -#endif diff --git a/src/game/client/components/touch_controls.cpp b/src/game/client/components/touch_controls.cpp deleted file mode 100644 index 0794259165..0000000000 --- a/src/game/client/components/touch_controls.cpp +++ /dev/null @@ -1,1568 +0,0 @@ -#include "touch_controls.h" - -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std::chrono_literals; - -// TODO: Add user interface to adjust button layout -// TODO: Add "color" property for touch buttons? -// TODO: Add combined weapon picker button that shows all currently available weapons -// TODO: Add "joystick-aim-relative", a virtual joystick that moves the mouse pointer relatively. And add "aim-relative" ingame direct touch input. -// TODO: Add "choice" predefined behavior which shows a selection popup for 2 or more other behaviors? -// TODO: Support changing labels of menu buttons (or support overriding label for all predefined button behaviors)? - -static constexpr const char *const ACTION_NAMES[] = {Localizable("Aim"), Localizable("Fire"), Localizable("Hook")}; -static constexpr const char *const ACTION_SWAP_NAMES[] = {/* unused */ "", Localizable("Active: Fire"), Localizable("Active: Hook")}; -static constexpr const char *const ACTION_COMMANDS[] = {/* unused */ "", "+fire", "+hook"}; - -static constexpr std::chrono::milliseconds LONG_TOUCH_DURATION = 500ms; -static constexpr std::chrono::milliseconds BIND_REPEAT_INITIAL_DELAY = 250ms; -static constexpr std::chrono::nanoseconds BIND_REPEAT_RATE = std::chrono::nanoseconds(1s) / 15; - -static constexpr const char *const CONFIGURATION_FILENAME = "touch_controls.json"; -static constexpr int BUTTON_SIZE_SCALE = 1000000; -static constexpr int BUTTON_SIZE_MINIMUM = 50000; -static constexpr int BUTTON_SIZE_MAXIMUM = 500000; - -/* This is required for the localization script to find the labels of the default bind buttons specified in the configuration file: -Localizable("Move left") Localizable("Move right") Localizable("Jump") Localizable("Prev. weapon") Localizable("Next weapon") -Localizable("Zoom out") Localizable("Default zoom") Localizable("Zoom in") Localizable("Scoreboard") Localizable("Chat") Localizable("Team chat") -Localizable("Vote yes") Localizable("Vote no") Localizable("Toggle dummy") -*/ - -CTouchControls::CTouchButton::CTouchButton(CTouchControls *pTouchControls) : - m_pTouchControls(pTouchControls), - m_VisibilityCached(false) -{ -} - -CTouchControls::CTouchButton::CTouchButton(CTouchButton &&Other) noexcept : - m_pTouchControls(Other.m_pTouchControls), - m_UnitRect(Other.m_UnitRect), - m_Shape(Other.m_Shape), - m_vVisibilities(Other.m_vVisibilities), - m_pBehavior(std::move(Other.m_pBehavior)), - m_VisibilityCached(false) -{ - Other.m_pTouchControls = nullptr; -} - -CTouchControls::CTouchButton &CTouchControls::CTouchButton::operator=(CTouchButton &&Other) noexcept -{ - m_pTouchControls = Other.m_pTouchControls; - Other.m_pTouchControls = nullptr; - m_UnitRect = Other.m_UnitRect; - m_Shape = Other.m_Shape; - m_vVisibilities = Other.m_vVisibilities; - m_pBehavior = std::move(Other.m_pBehavior); - m_VisibilityCached = false; - return *this; -} - -void CTouchControls::CTouchButton::UpdatePointers() -{ - m_pBehavior->Init(this); -} - -void CTouchControls::CTouchButton::UpdateScreenFromUnitRect() -{ - const vec2 ScreenSize = m_pTouchControls->CalculateScreenSize(); - m_ScreenRect.x = m_UnitRect.m_X * ScreenSize.x / BUTTON_SIZE_SCALE; - m_ScreenRect.y = m_UnitRect.m_Y * ScreenSize.y / BUTTON_SIZE_SCALE; - m_ScreenRect.w = m_UnitRect.m_W * ScreenSize.x / BUTTON_SIZE_SCALE; - m_ScreenRect.h = m_UnitRect.m_H * ScreenSize.y / BUTTON_SIZE_SCALE; - - // Enforce circle shape so the screen rect can be used for mapping the touch input position - if(m_Shape == EButtonShape::CIRCLE) - { - if(m_ScreenRect.h > m_ScreenRect.w) - { - m_ScreenRect.y += (m_ScreenRect.h - m_ScreenRect.w) / 2.0f; - m_ScreenRect.h = m_ScreenRect.w; - } - else if(m_ScreenRect.w > m_ScreenRect.h) - { - m_ScreenRect.x += (m_ScreenRect.w - m_ScreenRect.h) / 2.0f; - m_ScreenRect.w = m_ScreenRect.h; - } - } -} - -void CTouchControls::CTouchButton::UpdateBackgroundCorners() -{ - if(m_Shape != EButtonShape::RECT) - { - m_BackgroundCorners = IGraphics::CORNER_NONE; - return; - } - - // Determine rounded corners based on button layout - m_BackgroundCorners = IGraphics::CORNER_ALL; - - if(m_UnitRect.m_X == 0) - { - m_BackgroundCorners &= ~IGraphics::CORNER_L; - } - if(m_UnitRect.m_X + m_UnitRect.m_W == BUTTON_SIZE_SCALE) - { - m_BackgroundCorners &= ~IGraphics::CORNER_R; - } - if(m_UnitRect.m_Y == 0) - { - m_BackgroundCorners &= ~IGraphics::CORNER_T; - } - if(m_UnitRect.m_Y + m_UnitRect.m_H == BUTTON_SIZE_SCALE) - { - m_BackgroundCorners &= ~IGraphics::CORNER_B; - } - - const auto &&PointInOrOnRect = [](ivec2 Point, CUnitRect Rect) { - return Point.x >= Rect.m_X && Point.x <= Rect.m_X + Rect.m_W && Point.y >= Rect.m_Y && Point.y <= Rect.m_Y + Rect.m_H; - }; - for(const CTouchButton &OtherButton : m_pTouchControls->m_vTouchButtons) - { - if(&OtherButton == this || OtherButton.m_Shape != EButtonShape::RECT) - continue; - // TODO: This does not consider that button visibilities can change independently, also update corners when any visibility changed - const bool ExcludingVisibilities = std::any_of(OtherButton.m_vVisibilities.begin(), OtherButton.m_vVisibilities.end(), [&](const CButtonVisibility &OtherVisibility) { - return std::any_of(m_vVisibilities.begin(), m_vVisibilities.end(), [&](const CButtonVisibility &OurVisibility) { - return OtherVisibility.m_Type == OurVisibility.m_Type && OtherVisibility.m_Parity != OurVisibility.m_Parity; - }); - }); - if(ExcludingVisibilities) - continue; - - if((m_BackgroundCorners & IGraphics::CORNER_TL) && PointInOrOnRect(ivec2(m_UnitRect.m_X, m_UnitRect.m_Y), OtherButton.m_UnitRect)) - { - m_BackgroundCorners &= ~IGraphics::CORNER_TL; - } - if((m_BackgroundCorners & IGraphics::CORNER_TR) && PointInOrOnRect(ivec2(m_UnitRect.m_X + m_UnitRect.m_W, m_UnitRect.m_Y), OtherButton.m_UnitRect)) - { - m_BackgroundCorners &= ~IGraphics::CORNER_TR; - } - if((m_BackgroundCorners & IGraphics::CORNER_BL) && PointInOrOnRect(ivec2(m_UnitRect.m_X, m_UnitRect.m_Y + m_UnitRect.m_H), OtherButton.m_UnitRect)) - { - m_BackgroundCorners &= ~IGraphics::CORNER_BL; - } - if((m_BackgroundCorners & IGraphics::CORNER_BR) && PointInOrOnRect(ivec2(m_UnitRect.m_X + m_UnitRect.m_W, m_UnitRect.m_Y + m_UnitRect.m_H), OtherButton.m_UnitRect)) - { - m_BackgroundCorners &= ~IGraphics::CORNER_BR; - } - if(m_BackgroundCorners == IGraphics::CORNER_NONE) - { - break; - } - } -} - -vec2 CTouchControls::CTouchButton::ClampTouchPosition(vec2 TouchPosition) const -{ - switch(m_Shape) - { - case EButtonShape::RECT: - { - TouchPosition.x = clamp(TouchPosition.x, m_ScreenRect.x, m_ScreenRect.x + m_ScreenRect.w); - TouchPosition.y = clamp(TouchPosition.y, m_ScreenRect.y, m_ScreenRect.y + m_ScreenRect.h); - break; - } - case EButtonShape::CIRCLE: - { - const vec2 Center = m_ScreenRect.Center(); - const float MaxLength = minimum(m_ScreenRect.w, m_ScreenRect.h) / 2.0f; - const vec2 TouchDirection = TouchPosition - Center; - const float Length = length(TouchDirection); - if(Length > MaxLength) - { - TouchPosition = normalize_pre_length(TouchDirection, Length) * MaxLength + Center; - } - break; - } - default: - dbg_assert(false, "Unhandled shape"); - break; - } - return TouchPosition; -} - -bool CTouchControls::CTouchButton::IsInside(vec2 TouchPosition) const -{ - switch(m_Shape) - { - case EButtonShape::RECT: - return m_ScreenRect.Inside(TouchPosition); - case EButtonShape::CIRCLE: - return distance(TouchPosition, m_ScreenRect.Center()) <= minimum(m_ScreenRect.w, m_ScreenRect.h) / 2.0f; - default: - dbg_assert(false, "Unhandled shape"); - return false; - } -} - -void CTouchControls::CTouchButton::UpdateVisibility() -{ - const bool PrevVisibility = m_VisibilityCached; - m_VisibilityCached = m_pTouchControls->m_EditingActive || std::all_of(m_vVisibilities.begin(), m_vVisibilities.end(), [&](CButtonVisibility Visibility) { - return m_pTouchControls->m_aVisibilityFunctions[(int)Visibility.m_Type].m_Function() == Visibility.m_Parity; - }); - if(m_VisibilityCached && !PrevVisibility) - { - m_VisibilityStartTime = time_get_nanoseconds(); - } -} - -bool CTouchControls::CTouchButton::IsVisible() const -{ - return m_VisibilityCached; -} - -// TODO: Optimization: Use text and quad containers for rendering -void CTouchControls::CTouchButton::Render() const -{ - const ColorRGBA ButtonColor = m_pBehavior->IsActive() ? ColorRGBA(0.2f, 0.2f, 0.2f, 0.25f) : ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f); - - switch(m_Shape) - { - case EButtonShape::RECT: - { - m_ScreenRect.Draw(ButtonColor, m_BackgroundCorners, 10.0f); - break; - } - case EButtonShape::CIRCLE: - { - const vec2 Center = m_ScreenRect.Center(); - const float Radius = minimum(m_ScreenRect.w, m_ScreenRect.h) / 2.0f; - m_pTouchControls->Graphics()->TextureClear(); - m_pTouchControls->Graphics()->QuadsBegin(); - m_pTouchControls->Graphics()->SetColor(ButtonColor); - m_pTouchControls->Graphics()->DrawCircle(Center.x, Center.y, Radius, maximum(round_truncate(Radius / 4.0f) & ~1, 32)); - m_pTouchControls->Graphics()->QuadsEnd(); - break; - } - default: - dbg_assert(false, "Unhandled shape"); - break; - } - - const float FontSize = 22.0f; - CButtonLabel LabelData = m_pBehavior->GetLabel(); - CUIRect LabelRect; - m_ScreenRect.Margin(10.0f, &LabelRect); - SLabelProperties LabelProps; - LabelProps.m_MaxWidth = LabelRect.w; - if(LabelData.m_Type == CButtonLabel::EType::ICON) - { - m_pTouchControls->TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - m_pTouchControls->TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING); - m_pTouchControls->Ui()->DoLabel(&LabelRect, LabelData.m_pLabel, FontSize, TEXTALIGN_MC, LabelProps); - m_pTouchControls->TextRender()->SetRenderFlags(0); - m_pTouchControls->TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - } - else - { - const char *pLabel = LabelData.m_Type == CButtonLabel::EType::LOCALIZED ? Localize(LabelData.m_pLabel) : LabelData.m_pLabel; - m_pTouchControls->Ui()->DoLabel(&LabelRect, pLabel, FontSize, TEXTALIGN_MC, LabelProps); - } -} - -void CTouchControls::CTouchButton::WriteToConfiguration(CJsonWriter *pWriter) -{ - char aBuf[256]; - - pWriter->BeginObject(); - - pWriter->WriteAttribute("x"); - pWriter->WriteIntValue(m_UnitRect.m_X); - pWriter->WriteAttribute("y"); - pWriter->WriteIntValue(m_UnitRect.m_Y); - pWriter->WriteAttribute("w"); - pWriter->WriteIntValue(m_UnitRect.m_W); - pWriter->WriteAttribute("h"); - pWriter->WriteIntValue(m_UnitRect.m_H); - - pWriter->WriteAttribute("shape"); - pWriter->WriteStrValue(SHAPE_NAMES[(int)m_Shape]); - - pWriter->WriteAttribute("visibilities"); - pWriter->BeginArray(); - for(CButtonVisibility Visibility : m_vVisibilities) - { - str_format(aBuf, sizeof(aBuf), "%s%s", Visibility.m_Parity ? "" : "-", m_pTouchControls->m_aVisibilityFunctions[(int)Visibility.m_Type].m_pId); - pWriter->WriteStrValue(aBuf); - } - pWriter->EndArray(); - - pWriter->WriteAttribute("behavior"); - pWriter->BeginObject(); - m_pBehavior->WriteToConfiguration(pWriter); - pWriter->EndObject(); - - pWriter->EndObject(); -} - -void CTouchControls::CTouchButtonBehavior::Init(CTouchButton *pTouchButton) -{ - m_pTouchButton = pTouchButton; - m_pTouchControls = pTouchButton->m_pTouchControls; -} - -void CTouchControls::CTouchButtonBehavior::Reset() -{ - m_Active = false; -} - -void CTouchControls::CTouchButtonBehavior::SetActive(const IInput::CTouchFingerState &FingerState) -{ - const vec2 ScreenSize = m_pTouchControls->CalculateScreenSize(); - const CUIRect ButtonScreenRect = m_pTouchButton->m_ScreenRect; - const vec2 Position = (m_pTouchButton->ClampTouchPosition(FingerState.m_Position * ScreenSize) - ButtonScreenRect.TopLeft()) / ButtonScreenRect.Size(); - const vec2 Delta = FingerState.m_Delta * ScreenSize / ButtonScreenRect.Size(); - if(!m_Active) - { - m_Active = true; - m_ActivePosition = Position; - m_AccumulatedDelta = Delta; - m_ActivationStartTime = time_get_nanoseconds(); - m_Finger = FingerState.m_Finger; - OnActivate(); - } - else if(m_Finger == FingerState.m_Finger) - { - m_ActivePosition = Position; - m_AccumulatedDelta += Delta; - OnUpdate(); - } - else - { - dbg_assert(false, "Touch button must be inactive or use same finger"); - } -} - -void CTouchControls::CTouchButtonBehavior::SetInactive() -{ - if(m_Active) - { - m_Active = false; - OnDeactivate(); - } -} - -bool CTouchControls::CTouchButtonBehavior::IsActive() const -{ - return m_Active; -} - -bool CTouchControls::CTouchButtonBehavior::IsActive(const IInput::CTouchFinger &Finger) const -{ - return m_Active && m_Finger == Finger; -} - -void CTouchControls::CPredefinedTouchButtonBehavior::WriteToConfiguration(CJsonWriter *pWriter) -{ - pWriter->WriteAttribute("type"); - pWriter->WriteStrValue(BEHAVIOR_TYPE); - - pWriter->WriteAttribute("id"); - pWriter->WriteStrValue(m_pId); -} - -// Ingame menu button: always opens ingame menu. -CTouchControls::CButtonLabel CTouchControls::CIngameMenuTouchButtonBehavior::GetLabel() const -{ - return {CButtonLabel::EType::ICON, "\xEF\x85\x8E"}; -} - -void CTouchControls::CIngameMenuTouchButtonBehavior::OnDeactivate() -{ - m_pTouchControls->GameClient()->m_Menus.SetActive(true); -} - -// Extra menu button: -// - Short press: show/hide additional buttons (toggle extra-menu visibilities) -// - Long press: open ingame menu -CTouchControls::CExtraMenuTouchButtonBehavior::CExtraMenuTouchButtonBehavior(int Number) : - CPredefinedTouchButtonBehavior(BEHAVIOR_ID), - m_Number(Number) -{ - if(m_Number == 0) - { - str_copy(m_aLabel, "\xEF\x83\x89"); - } - else - { - str_format(m_aLabel, sizeof(m_aLabel), "\xEF\x83\x89%d", m_Number + 1); - } -} - -CTouchControls::CButtonLabel CTouchControls::CExtraMenuTouchButtonBehavior::GetLabel() const -{ - if(m_Active && time_get_nanoseconds() - m_ActivationStartTime >= LONG_TOUCH_DURATION) - { - return {CButtonLabel::EType::ICON, "\xEF\x95\x90"}; - } - else - { - return {CButtonLabel::EType::ICON, m_aLabel}; - } -} - -void CTouchControls::CExtraMenuTouchButtonBehavior::OnDeactivate() -{ - if(time_get_nanoseconds() - m_ActivationStartTime >= LONG_TOUCH_DURATION) - { - m_pTouchControls->GameClient()->m_Menus.SetActive(true); - } - else - { - m_pTouchControls->m_aExtraMenuActive[m_Number] = !m_pTouchControls->m_aExtraMenuActive[m_Number]; - } -} - -void CTouchControls::CExtraMenuTouchButtonBehavior::WriteToConfiguration(CJsonWriter *pWriter) -{ - CPredefinedTouchButtonBehavior::WriteToConfiguration(pWriter); - - pWriter->WriteAttribute("number"); - pWriter->WriteIntValue(m_Number + 1); -} - -// Emoticon button: keeps the emoticon HUD open, next touch in emoticon HUD will close it again. -CTouchControls::CButtonLabel CTouchControls::CEmoticonTouchButtonBehavior::GetLabel() const -{ - return {CButtonLabel::EType::LOCALIZED, Localizable("Emoticon")}; -} - -void CTouchControls::CEmoticonTouchButtonBehavior::OnDeactivate() -{ - m_pTouchControls->Console()->ExecuteLineStroked(1, "+emote"); -} - -// Spectate button: keeps the spectate menu open, next touch in spectate menu will close it again. -CTouchControls::CButtonLabel CTouchControls::CSpectateTouchButtonBehavior::GetLabel() const -{ - return {CButtonLabel::EType::LOCALIZED, Localizable("Spectator mode")}; -} - -void CTouchControls::CSpectateTouchButtonBehavior::OnDeactivate() -{ - m_pTouchControls->Console()->ExecuteLineStroked(1, "+spectate"); -} - -// Swap action button: -// - If joystick is currently active with one action: activate the other action. -// - Else: swap active action. -CTouchControls::CButtonLabel CTouchControls::CSwapActionTouchButtonBehavior::GetLabel() const -{ - if(m_ActiveAction != NUM_ACTIONS) - { - return {CButtonLabel::EType::LOCALIZED, ACTION_NAMES[m_ActiveAction]}; - } - else if(m_pTouchControls->m_pPrimaryJoystickTouchButtonBehavior != nullptr && - m_pTouchControls->m_pPrimaryJoystickTouchButtonBehavior->ActiveAction() != NUM_ACTIONS) - { - return {CButtonLabel::EType::LOCALIZED, ACTION_NAMES[m_pTouchControls->NextActiveAction(m_pTouchControls->m_pPrimaryJoystickTouchButtonBehavior->ActiveAction())]}; - } - return {CButtonLabel::EType::LOCALIZED, ACTION_SWAP_NAMES[m_pTouchControls->m_ActionSelected]}; -} - -void CTouchControls::CSwapActionTouchButtonBehavior::OnActivate() -{ - if(m_pTouchControls->m_pPrimaryJoystickTouchButtonBehavior != nullptr && - m_pTouchControls->m_pPrimaryJoystickTouchButtonBehavior->ActiveAction() != NUM_ACTIONS) - { - m_ActiveAction = m_pTouchControls->NextActiveAction(m_pTouchControls->m_pPrimaryJoystickTouchButtonBehavior->ActiveAction()); - m_pTouchControls->Console()->ExecuteLineStroked(1, ACTION_COMMANDS[m_ActiveAction]); - } - else - { - m_pTouchControls->m_ActionSelected = m_pTouchControls->NextActiveAction(m_pTouchControls->m_ActionSelected); - } -} - -void CTouchControls::CSwapActionTouchButtonBehavior::OnDeactivate() -{ - if(m_ActiveAction != NUM_ACTIONS) - { - m_pTouchControls->Console()->ExecuteLineStroked(0, ACTION_COMMANDS[m_ActiveAction]); - m_ActiveAction = NUM_ACTIONS; - } -} - -// Use action button: always uses the active action. -CTouchControls::CButtonLabel CTouchControls::CUseActionTouchButtonBehavior::GetLabel() const -{ - if(m_ActiveAction != NUM_ACTIONS) - { - return {CButtonLabel::EType::LOCALIZED, ACTION_NAMES[m_ActiveAction]}; - } - return {CButtonLabel::EType::LOCALIZED, ACTION_NAMES[m_pTouchControls->m_ActionSelected]}; -} - -void CTouchControls::CUseActionTouchButtonBehavior::OnActivate() -{ - m_ActiveAction = m_pTouchControls->m_ActionSelected; - m_pTouchControls->Console()->ExecuteLineStroked(1, ACTION_COMMANDS[m_ActiveAction]); -} - -void CTouchControls::CUseActionTouchButtonBehavior::OnDeactivate() -{ - m_pTouchControls->Console()->ExecuteLineStroked(0, ACTION_COMMANDS[m_ActiveAction]); - m_ActiveAction = NUM_ACTIONS; -} - -// Generic joystick button behavior: aim with virtual joystick and use action (defined by subclass). -CTouchControls::CButtonLabel CTouchControls::CJoystickTouchButtonBehavior::GetLabel() const -{ - if(m_ActiveAction != NUM_ACTIONS) - { - return {CButtonLabel::EType::LOCALIZED, ACTION_NAMES[m_ActiveAction]}; - } - return {CButtonLabel::EType::LOCALIZED, ACTION_NAMES[SelectedAction()]}; -} - -void CTouchControls::CJoystickTouchButtonBehavior::OnActivate() -{ - m_ActiveAction = SelectedAction(); - OnUpdate(); - if(m_ActiveAction != ACTION_AIM) - { - m_pTouchControls->Console()->ExecuteLineStroked(1, ACTION_COMMANDS[m_ActiveAction]); - } -} - -void CTouchControls::CJoystickTouchButtonBehavior::OnDeactivate() -{ - if(m_ActiveAction != ACTION_AIM) - { - m_pTouchControls->Console()->ExecuteLineStroked(0, ACTION_COMMANDS[m_ActiveAction]); - } - m_ActiveAction = NUM_ACTIONS; -} - -void CTouchControls::CJoystickTouchButtonBehavior::OnUpdate() -{ - CControls &Controls = m_pTouchControls->GameClient()->m_Controls; - if(m_pTouchControls->GameClient()->m_Snap.m_SpecInfo.m_Active) - { - vec2 WorldScreenSize; - m_pTouchControls->RenderTools()->CalcScreenParams(m_pTouchControls->Graphics()->ScreenAspect(), m_pTouchControls->GameClient()->m_Camera.m_Zoom, &WorldScreenSize.x, &WorldScreenSize.y); - Controls.m_aMousePos[g_Config.m_ClDummy] += -m_AccumulatedDelta * WorldScreenSize; - Controls.m_aMousePos[g_Config.m_ClDummy].x = clamp(Controls.m_aMousePos[g_Config.m_ClDummy].x, -201.0f * 32, (m_pTouchControls->Collision()->GetWidth() + 201.0f) * 32.0f); - Controls.m_aMousePos[g_Config.m_ClDummy].y = clamp(Controls.m_aMousePos[g_Config.m_ClDummy].y, -201.0f * 32, (m_pTouchControls->Collision()->GetHeight() + 201.0f) * 32.0f); - m_AccumulatedDelta = vec2(0.0f, 0.0f); - } - else - { - const vec2 AbsolutePosition = (m_ActivePosition - vec2(0.5f, 0.5f)) * 2.0f; - Controls.m_aMousePos[g_Config.m_ClDummy] = AbsolutePosition * (Controls.GetMaxMouseDistance() - Controls.GetMinMouseDistance()) + normalize(AbsolutePosition) * Controls.GetMinMouseDistance(); - if(length(Controls.m_aMousePos[g_Config.m_ClDummy]) < 0.001f) - { - Controls.m_aMousePos[g_Config.m_ClDummy].x = 0.001f; - Controls.m_aMousePos[g_Config.m_ClDummy].y = 0.0f; - } - } -} - -// Joystick that uses the active action. Registers itself as the primary joystick. -void CTouchControls::CJoystickActionTouchButtonBehavior::Init(CTouchButton *pTouchButton) -{ - CPredefinedTouchButtonBehavior::Init(pTouchButton); - m_pTouchControls->m_pPrimaryJoystickTouchButtonBehavior = this; -} - -int CTouchControls::CJoystickActionTouchButtonBehavior::SelectedAction() const -{ - return m_pTouchControls->m_ActionSelected; -} - -// Joystick that only aims. -int CTouchControls::CJoystickAimTouchButtonBehavior::SelectedAction() const -{ - return ACTION_AIM; -} - -// Joystick that always uses fire. -int CTouchControls::CJoystickFireTouchButtonBehavior::SelectedAction() const -{ - return ACTION_FIRE; -} - -// Joystick that always uses hook. -int CTouchControls::CJoystickHookTouchButtonBehavior::SelectedAction() const -{ - return ACTION_HOOK; -} - -// Bind button behavior that executes a command like a bind. -CTouchControls::CButtonLabel CTouchControls::CBindTouchButtonBehavior::GetLabel() const -{ - return {m_LabelType, m_Label.c_str()}; -} - -void CTouchControls::CBindTouchButtonBehavior::OnActivate() -{ - m_pTouchControls->Console()->ExecuteLineStroked(1, m_Command.c_str()); - m_Repeating = false; -} - -void CTouchControls::CBindTouchButtonBehavior::OnDeactivate() -{ - m_pTouchControls->Console()->ExecuteLineStroked(0, m_Command.c_str()); -} - -void CTouchControls::CBindTouchButtonBehavior::OnUpdate() -{ - const auto Now = time_get_nanoseconds(); - if(m_Repeating) - { - m_AccumulatedRepeatingTime += Now - m_LastUpdateTime; - m_LastUpdateTime = Now; - if(m_AccumulatedRepeatingTime >= BIND_REPEAT_RATE) - { - m_AccumulatedRepeatingTime -= BIND_REPEAT_RATE; - m_pTouchControls->Console()->ExecuteLineStroked(1, m_Command.c_str()); - } - } - else if(Now - m_ActivationStartTime >= BIND_REPEAT_INITIAL_DELAY) - { - m_Repeating = true; - m_LastUpdateTime = Now; - m_AccumulatedRepeatingTime = 0ns; - } -} - -void CTouchControls::CBindTouchButtonBehavior::WriteToConfiguration(CJsonWriter *pWriter) -{ - pWriter->WriteAttribute("type"); - pWriter->WriteStrValue(BEHAVIOR_TYPE); - - pWriter->WriteAttribute("label"); - pWriter->WriteStrValue(m_Label.c_str()); - - pWriter->WriteAttribute("label-type"); - pWriter->WriteStrValue(LABEL_TYPE_NAMES[(int)m_LabelType]); - - pWriter->WriteAttribute("command"); - pWriter->WriteStrValue(m_Command.c_str()); -} - -// Bind button behavior that switches between executing one of two or more console commands. -CTouchControls::CButtonLabel CTouchControls::CBindToggleTouchButtonBehavior::GetLabel() const -{ - const auto &ActiveCommand = m_vCommands[m_ActiveCommandIndex]; - return {ActiveCommand.m_LabelType, ActiveCommand.m_Label.c_str()}; -} - -void CTouchControls::CBindToggleTouchButtonBehavior::OnActivate() -{ - m_pTouchControls->Console()->ExecuteLine(m_vCommands[m_ActiveCommandIndex].m_Command.c_str()); - m_ActiveCommandIndex = (m_ActiveCommandIndex + 1) % m_vCommands.size(); -} - -void CTouchControls::CBindToggleTouchButtonBehavior::WriteToConfiguration(CJsonWriter *pWriter) -{ - pWriter->WriteAttribute("type"); - pWriter->WriteStrValue(BEHAVIOR_TYPE); - - pWriter->WriteAttribute("commands"); - pWriter->BeginArray(); - - for(const auto &Command : m_vCommands) - { - pWriter->BeginObject(); - - pWriter->WriteAttribute("label"); - pWriter->WriteStrValue(Command.m_Label.c_str()); - - pWriter->WriteAttribute("label-type"); - pWriter->WriteStrValue(LABEL_TYPE_NAMES[(int)Command.m_LabelType]); - - pWriter->WriteAttribute("command"); - pWriter->WriteStrValue(Command.m_Command.c_str()); - - pWriter->EndObject(); - } - - pWriter->EndArray(); -} - -void CTouchControls::OnInit() -{ - InitVisibilityFunctions(); - if(!LoadConfigurationFromFile(IStorage::TYPE_ALL)) - { - Client()->AddWarning(SWarning(Localize("Error loading touch controls"), Localize("Could not load touch controls from file. See local console for details."))); - } -} - -void CTouchControls::OnReset() -{ - ResetButtons(); - m_EditingActive = false; -} - -void CTouchControls::OnWindowResize() -{ - ResetButtons(); - for(CTouchButton &TouchButton : m_vTouchButtons) - { - TouchButton.UpdateScreenFromUnitRect(); - } -} - -bool CTouchControls::OnTouchState(const std::vector &vTouchFingerStates) -{ - if(!g_Config.m_ClTouchControls) - return false; - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return false; - if(GameClient()->m_Chat.IsActive() || - !GameClient()->m_GameConsole.IsClosed() || - GameClient()->m_Menus.IsActive() || - GameClient()->m_Emoticon.IsActive() || - GameClient()->m_Spectator.IsActive()) - { - ResetButtons(); - return false; - } - - UpdateButtons(vTouchFingerStates); - return true; -} - -void CTouchControls::OnRender() -{ - if(!g_Config.m_ClTouchControls) - return; - if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) - return; - if(GameClient()->m_Chat.IsActive() || - GameClient()->m_Emoticon.IsActive() || - GameClient()->m_Spectator.IsActive()) - { - return; - } - - const vec2 ScreenSize = CalculateScreenSize(); - Graphics()->MapScreen(0.0f, 0.0f, ScreenSize.x, ScreenSize.y); - - RenderButtons(); -} - -bool CTouchControls::LoadConfigurationFromFile(int StorageType) -{ - void *pFileData; - unsigned FileLength; - if(!Storage()->ReadFile(CONFIGURATION_FILENAME, StorageType, &pFileData, &FileLength)) - { - log_error("touch_controls", "Failed to read configuration from '%s'", CONFIGURATION_FILENAME); - return false; - } - - const bool Result = ParseConfiguration(pFileData, FileLength); - free(pFileData); - return Result; -} - -bool CTouchControls::LoadConfigurationFromClipboard() -{ - std::string Clipboard = Input()->GetClipboardText(); - return ParseConfiguration(Clipboard.c_str(), Clipboard.size()); -} - -bool CTouchControls::SaveConfigurationToFile() -{ - IOHANDLE File = Storage()->OpenFile(CONFIGURATION_FILENAME, IOFLAG_WRITE, IStorage::TYPE_SAVE); - if(!File) - { - log_error("touch_controls", "Failed to open '%s' for writing configuration", CONFIGURATION_FILENAME); - return false; - } - - CJsonFileWriter Writer(File); - WriteConfiguration(&Writer); - return true; -} - -void CTouchControls::SaveConfigurationToClipboard() -{ - CJsonStringWriter Writer; - WriteConfiguration(&Writer); - std::string ConfigurationString = Writer.GetOutputString(); - Input()->SetClipboardText(ConfigurationString.c_str()); -} - -void CTouchControls::InitVisibilityFunctions() -{ - m_aVisibilityFunctions[(int)EButtonVisibility::INGAME].m_pId = "ingame"; - m_aVisibilityFunctions[(int)EButtonVisibility::INGAME].m_Function = [&]() { - return !GameClient()->m_Snap.m_SpecInfo.m_Active; - }; - m_aVisibilityFunctions[(int)EButtonVisibility::ZOOM_ALLOWED].m_pId = "zoom-allowed"; - m_aVisibilityFunctions[(int)EButtonVisibility::ZOOM_ALLOWED].m_Function = [&]() { - return GameClient()->m_Camera.ZoomAllowed(); - }; - m_aVisibilityFunctions[(int)EButtonVisibility::VOTE_ACTIVE].m_pId = "vote-active"; - m_aVisibilityFunctions[(int)EButtonVisibility::VOTE_ACTIVE].m_Function = [&]() { - return GameClient()->m_Voting.IsVoting(); - }; - m_aVisibilityFunctions[(int)EButtonVisibility::DUMMY_ALLOWED].m_pId = "dummy-allowed"; - m_aVisibilityFunctions[(int)EButtonVisibility::DUMMY_ALLOWED].m_Function = [&]() { - return Client()->DummyAllowed(); - }; - m_aVisibilityFunctions[(int)EButtonVisibility::DUMMY_CONNECTED].m_pId = "dummy-connected"; - m_aVisibilityFunctions[(int)EButtonVisibility::DUMMY_CONNECTED].m_Function = [&]() { - return Client()->DummyConnected(); - }; - m_aVisibilityFunctions[(int)EButtonVisibility::RCON_AUTHED].m_pId = "rcon-authed"; - m_aVisibilityFunctions[(int)EButtonVisibility::RCON_AUTHED].m_Function = [&]() { - return Client()->RconAuthed(); - }; - m_aVisibilityFunctions[(int)EButtonVisibility::DEMO_PLAYER].m_pId = "demo-player"; - m_aVisibilityFunctions[(int)EButtonVisibility::DEMO_PLAYER].m_Function = [&]() { - return Client()->State() == IClient::STATE_DEMOPLAYBACK; - }; - m_aVisibilityFunctions[(int)EButtonVisibility::EXTRA_MENU_1].m_pId = "extra-menu"; - m_aVisibilityFunctions[(int)EButtonVisibility::EXTRA_MENU_1].m_Function = [&]() { - return m_aExtraMenuActive[0]; - }; - m_aVisibilityFunctions[(int)EButtonVisibility::EXTRA_MENU_2].m_pId = "extra-menu-2"; - m_aVisibilityFunctions[(int)EButtonVisibility::EXTRA_MENU_2].m_Function = [&]() { - return m_aExtraMenuActive[1]; - }; - m_aVisibilityFunctions[(int)EButtonVisibility::EXTRA_MENU_3].m_pId = "extra-menu-3"; - m_aVisibilityFunctions[(int)EButtonVisibility::EXTRA_MENU_3].m_Function = [&]() { - return m_aExtraMenuActive[2]; - }; - m_aVisibilityFunctions[(int)EButtonVisibility::EXTRA_MENU_4].m_pId = "extra-menu-4"; - m_aVisibilityFunctions[(int)EButtonVisibility::EXTRA_MENU_4].m_Function = [&]() { - return m_aExtraMenuActive[3]; - }; - m_aVisibilityFunctions[(int)EButtonVisibility::EXTRA_MENU_5].m_pId = "extra-menu-5"; - m_aVisibilityFunctions[(int)EButtonVisibility::EXTRA_MENU_5].m_Function = [&]() { - return m_aExtraMenuActive[4]; - }; -} - -int CTouchControls::NextActiveAction(int Action) const -{ - switch(Action) - { - case ACTION_FIRE: - return ACTION_HOOK; - case ACTION_HOOK: - return ACTION_FIRE; - default: - dbg_assert(false, "Action invalid for NextActiveAction"); - return NUM_ACTIONS; - } -} - -int CTouchControls::NextDirectTouchAction() const -{ - if(m_pClient->m_Snap.m_SpecInfo.m_Active) - { - switch(m_DirectTouchSpectate) - { - case EDirectTouchSpectateMode::DISABLED: - return NUM_ACTIONS; - case EDirectTouchSpectateMode::AIM: - return ACTION_AIM; - default: - dbg_assert(false, "m_DirectTouchSpectate invalid"); - return NUM_ACTIONS; - } - } - else - { - switch(m_DirectTouchIngame) - { - case EDirectTouchIngameMode::DISABLED: - return NUM_ACTIONS; - case EDirectTouchIngameMode::ACTION: - return m_ActionSelected; - case EDirectTouchIngameMode::AIM: - return ACTION_AIM; - case EDirectTouchIngameMode::FIRE: - return ACTION_FIRE; - case EDirectTouchIngameMode::HOOK: - return ACTION_HOOK; - default: - dbg_assert(false, "m_DirectTouchIngame invalid"); - return NUM_ACTIONS; - } - } -} - -void CTouchControls::UpdateButtons(const std::vector &vTouchFingerStates) -{ - // Update cached button visibilities and store time that buttons become visible. - for(CTouchButton &TouchButton : m_vTouchButtons) - { - TouchButton.UpdateVisibility(); - } - - const int DirectTouchAction = NextDirectTouchAction(); - const vec2 ScreenSize = CalculateScreenSize(); - - std::vector vRemainingTouchFingerStates = vTouchFingerStates; - - // Remove remaining finger states for fingers which are responsible for active actions - // and release action when the finger responsible for it is not pressed down anymore. - bool GotDirectFingerState = false; // Whether DirectFingerState is valid - IInput::CTouchFingerState DirectFingerState{}; // The finger that will be used to update the mouse position - for(int Action = ACTION_AIM; Action < NUM_ACTIONS; ++Action) - { - if(!m_aDirectTouchActionStates[Action].m_Active) - { - continue; - } - - const auto ActiveFinger = std::find_if(vRemainingTouchFingerStates.begin(), vRemainingTouchFingerStates.end(), [&](const IInput::CTouchFingerState &TouchFingerState) { - return TouchFingerState.m_Finger == m_aDirectTouchActionStates[Action].m_Finger; - }); - if(ActiveFinger == vRemainingTouchFingerStates.end() || DirectTouchAction == NUM_ACTIONS) - { - m_aDirectTouchActionStates[Action].m_Active = false; - if(Action != ACTION_AIM) - { - Console()->ExecuteLineStroked(0, ACTION_COMMANDS[Action]); - } - } - else - { - if(Action == m_DirectTouchLastAction) - { - GotDirectFingerState = true; - DirectFingerState = *ActiveFinger; - } - vRemainingTouchFingerStates.erase(ActiveFinger); - } - } - - // Update touch button states after the active action fingers were removed from the vector - // so that current cursor movement can cross over touch buttons without activating them. - - // Activate visible, inactive buttons with hovered finger. Deactivate previous button being - // activated by the same finger. Touch buttons are only activated if they became visible - // before the respective touch finger was pressed down, to prevent repeatedly activating - // overlapping buttons of excluding visibilities. - for(CTouchButton &TouchButton : m_vTouchButtons) - { - if(!TouchButton.IsVisible() || TouchButton.m_pBehavior->IsActive()) - { - continue; - } - const auto FingerInsideButton = std::find_if(vRemainingTouchFingerStates.begin(), vRemainingTouchFingerStates.end(), [&](const IInput::CTouchFingerState &TouchFingerState) { - return TouchButton.m_VisibilityStartTime < TouchFingerState.m_PressTime && - TouchButton.IsInside(TouchFingerState.m_Position * ScreenSize); - }); - if(FingerInsideButton == vRemainingTouchFingerStates.end()) - { - continue; - } - const auto OtherHoveredTouchButton = std::find_if(m_vTouchButtons.begin(), m_vTouchButtons.end(), [&](const CTouchButton &Button) { - return &Button != &TouchButton && Button.IsVisible() && Button.IsInside(FingerInsideButton->m_Position * ScreenSize); - }); - if(OtherHoveredTouchButton != m_vTouchButtons.end()) - { - // Do not activate any button if multiple overlapping buttons are hovered. - // TODO: Prevent overlapping buttons entirely when parsing the button configuration? - vRemainingTouchFingerStates.erase(FingerInsideButton); - continue; - } - auto PrevActiveTouchButton = std::find_if(m_vTouchButtons.begin(), m_vTouchButtons.end(), [&](const CTouchButton &Button) { - return Button.m_pBehavior->IsActive(FingerInsideButton->m_Finger); - }); - if(PrevActiveTouchButton != m_vTouchButtons.end()) - { - PrevActiveTouchButton->m_pBehavior->SetInactive(); - } - TouchButton.m_pBehavior->SetActive(*FingerInsideButton); - } - - // Deactivate touch buttons only when the respective finger is released, so touch buttons - // are kept active also if the finger is moved outside the button. - for(CTouchButton &TouchButton : m_vTouchButtons) - { - if(!TouchButton.IsVisible()) - { - TouchButton.m_pBehavior->SetInactive(); - continue; - } - if(!TouchButton.m_pBehavior->IsActive()) - { - continue; - } - const auto ActiveFinger = std::find_if(vRemainingTouchFingerStates.begin(), vRemainingTouchFingerStates.end(), [&](const IInput::CTouchFingerState &TouchFingerState) { - return TouchFingerState.m_Finger == TouchButton.m_pBehavior->m_Finger; - }); - if(ActiveFinger == vRemainingTouchFingerStates.end()) - { - TouchButton.m_pBehavior->SetInactive(); - } - else - { - // Update the already active touch button with the current finger state - TouchButton.m_pBehavior->SetActive(*ActiveFinger); - } - } - - // Remove remaining fingers for active buttons after updating the buttons. - for(CTouchButton &TouchButton : m_vTouchButtons) - { - if(!TouchButton.m_pBehavior->IsActive()) - { - continue; - } - const auto ActiveFinger = std::find_if(vRemainingTouchFingerStates.begin(), vRemainingTouchFingerStates.end(), [&](const IInput::CTouchFingerState &TouchFingerState) { - return TouchFingerState.m_Finger == TouchButton.m_pBehavior->m_Finger; - }); - dbg_assert(ActiveFinger != vRemainingTouchFingerStates.end(), "Active button finger not found"); - vRemainingTouchFingerStates.erase(ActiveFinger); - } - - // TODO: Support standard gesture to zoom (enabled separately for ingame and spectator) - - // Activate action if there is an unhandled pressed down finger. - int ActivateAction = NUM_ACTIONS; - if(DirectTouchAction != NUM_ACTIONS && !vRemainingTouchFingerStates.empty() && !m_aDirectTouchActionStates[DirectTouchAction].m_Active) - { - GotDirectFingerState = true; - DirectFingerState = vRemainingTouchFingerStates[0]; - vRemainingTouchFingerStates.erase(vRemainingTouchFingerStates.begin()); - m_aDirectTouchActionStates[DirectTouchAction].m_Active = true; - m_aDirectTouchActionStates[DirectTouchAction].m_Finger = DirectFingerState.m_Finger; - m_DirectTouchLastAction = DirectTouchAction; - ActivateAction = DirectTouchAction; - } - - // Update mouse position based on the finger responsible for the last active action. - if(GotDirectFingerState) - { - const float Zoom = m_pClient->m_Snap.m_SpecInfo.m_Active ? m_pClient->m_Camera.m_Zoom : 1.0f; - vec2 WorldScreenSize; - RenderTools()->CalcScreenParams(Graphics()->ScreenAspect(), Zoom, &WorldScreenSize.x, &WorldScreenSize.y); - CControls &Controls = GameClient()->m_Controls; - if(m_pClient->m_Snap.m_SpecInfo.m_Active) - { - Controls.m_aMousePos[g_Config.m_ClDummy] += -DirectFingerState.m_Delta * WorldScreenSize; - Controls.m_aMousePos[g_Config.m_ClDummy].x = clamp(Controls.m_aMousePos[g_Config.m_ClDummy].x, -201.0f * 32, (Collision()->GetWidth() + 201.0f) * 32.0f); - Controls.m_aMousePos[g_Config.m_ClDummy].y = clamp(Controls.m_aMousePos[g_Config.m_ClDummy].y, -201.0f * 32, (Collision()->GetHeight() + 201.0f) * 32.0f); - } - else - { - Controls.m_aMousePos[g_Config.m_ClDummy] = (DirectFingerState.m_Position - vec2(0.5f, 0.5f)) * WorldScreenSize; - } - } - - // Activate action after the mouse position is set. - if(ActivateAction != ACTION_AIM && ActivateAction != NUM_ACTIONS) - { - Console()->ExecuteLineStroked(1, ACTION_COMMANDS[ActivateAction]); - } -} - -void CTouchControls::ResetButtons() -{ - for(CTouchButton &TouchButton : m_vTouchButtons) - { - TouchButton.m_pBehavior->Reset(); - } - for(CActionState &ActionState : m_aDirectTouchActionStates) - { - ActionState.m_Active = false; - } -} - -void CTouchControls::RenderButtons() -{ - for(CTouchButton &TouchButton : m_vTouchButtons) - { - TouchButton.UpdateVisibility(); - if(!TouchButton.IsVisible()) - { - continue; - } - TouchButton.Render(); - } -} - -vec2 CTouchControls::CalculateScreenSize() const -{ - const float ScreenHeight = 400.0f * 3.0f; - const float ScreenWidth = ScreenHeight * Graphics()->ScreenAspect(); - return vec2(ScreenWidth, ScreenHeight); -} - -bool CTouchControls::ParseConfiguration(const void *pFileData, unsigned FileLength) -{ - json_settings JsonSettings{}; - char aError[256]; - json_value *pConfiguration = json_parse_ex(&JsonSettings, static_cast(pFileData), FileLength, aError); - - if(pConfiguration == nullptr) - { - log_error("touch_controls", "Failed to parse configuration (invalid json): '%s'", aError); - return false; - } - if(pConfiguration->type != json_object) - { - log_error("touch_controls", "Failed to parse configuration: root must be an object"); - json_value_free(pConfiguration); - return false; - } - - std::optional ParsedDirectTouchIngame = ParseDirectTouchIngameMode(&(*pConfiguration)["direct-touch-ingame"]); - if(!ParsedDirectTouchIngame.has_value()) - { - json_value_free(pConfiguration); - return false; - } - - std::optional ParsedDirectTouchSpectate = ParseDirectTouchSpectateMode(&(*pConfiguration)["direct-touch-spectate"]); - if(!ParsedDirectTouchSpectate.has_value()) - { - json_value_free(pConfiguration); - return false; - } - - const json_value &TouchButtons = (*pConfiguration)["touch-buttons"]; - if(TouchButtons.type != json_array) - { - log_error("touch_controls", "Failed to parse configuration: attribute 'touch-buttons' must specify an array"); - json_value_free(pConfiguration); - return false; - } - - std::vector vParsedTouchButtons; - vParsedTouchButtons.reserve(TouchButtons.u.array.length); - for(unsigned ButtonIndex = 0; ButtonIndex < TouchButtons.u.array.length; ++ButtonIndex) - { - std::optional ParsedButton = ParseButton(&TouchButtons[ButtonIndex]); - if(!ParsedButton.has_value()) - { - log_error("touch_controls", "Failed to parse configuration: could not parse button at index '%d'", ButtonIndex); - json_value_free(pConfiguration); - return false; - } - - vParsedTouchButtons.push_back(std::move(ParsedButton.value())); - } - - // Parsing successful. Apply parsed configuration. - m_DirectTouchIngame = ParsedDirectTouchIngame.value(); - m_DirectTouchSpectate = ParsedDirectTouchSpectate.value(); - - m_pPrimaryJoystickTouchButtonBehavior = nullptr; - m_vTouchButtons = std::move(vParsedTouchButtons); - for(CTouchButton &TouchButton : m_vTouchButtons) - { - TouchButton.UpdatePointers(); - TouchButton.UpdateScreenFromUnitRect(); - TouchButton.UpdateBackgroundCorners(); - } - - json_value_free(pConfiguration); - - return true; -} - -std::optional CTouchControls::ParseDirectTouchIngameMode(const json_value *pModeValue) -{ - // TODO: Remove json_boolean backwards compatibility - const json_value &DirectTouchIngame = *pModeValue; - if(DirectTouchIngame.type != json_boolean && DirectTouchIngame.type != json_string) - { - log_error("touch_controls", "Failed to parse configuration: attribute 'direct-touch-ingame' must specify a string"); - return {}; - } - if(DirectTouchIngame.type == json_boolean) - { - return DirectTouchIngame.u.boolean ? EDirectTouchIngameMode::ACTION : EDirectTouchIngameMode::DISABLED; - } - EDirectTouchIngameMode ParsedDirectTouchIngame = EDirectTouchIngameMode::NUM_STATES; - for(int CurrentMode = (int)EDirectTouchIngameMode::DISABLED; CurrentMode < (int)EDirectTouchIngameMode::NUM_STATES; ++CurrentMode) - { - if(str_comp(DirectTouchIngame.u.string.ptr, DIRECT_TOUCH_INGAME_MODE_NAMES[CurrentMode]) == 0) - { - ParsedDirectTouchIngame = (EDirectTouchIngameMode)CurrentMode; - break; - } - } - if(ParsedDirectTouchIngame == EDirectTouchIngameMode::NUM_STATES) - { - log_error("touch_controls", "Failed to parse configuration: attribute 'direct-touch-ingame' specifies unknown value '%s'", DirectTouchIngame.u.string.ptr); - return {}; - } - return ParsedDirectTouchIngame; -} - -std::optional CTouchControls::ParseDirectTouchSpectateMode(const json_value *pModeValue) -{ - // TODO: Remove json_boolean backwards compatibility - const json_value &DirectTouchSpectate = *pModeValue; - if(DirectTouchSpectate.type != json_boolean && DirectTouchSpectate.type != json_string) - { - log_error("touch_controls", "Failed to parse configuration: attribute 'direct-touch-spectate' must specify a string"); - return {}; - } - if(DirectTouchSpectate.type == json_boolean) - { - return DirectTouchSpectate.u.boolean ? EDirectTouchSpectateMode::AIM : EDirectTouchSpectateMode::DISABLED; - } - EDirectTouchSpectateMode ParsedDirectTouchSpectate = EDirectTouchSpectateMode::NUM_STATES; - for(int CurrentMode = (int)EDirectTouchSpectateMode::DISABLED; CurrentMode < (int)EDirectTouchSpectateMode::NUM_STATES; ++CurrentMode) - { - if(str_comp(DirectTouchSpectate.u.string.ptr, DIRECT_TOUCH_SPECTATE_MODE_NAMES[CurrentMode]) == 0) - { - ParsedDirectTouchSpectate = (EDirectTouchSpectateMode)CurrentMode; - break; - } - } - if(ParsedDirectTouchSpectate == EDirectTouchSpectateMode::NUM_STATES) - { - log_error("touch_controls", "Failed to parse configuration: attribute 'direct-touch-spectate' specifies unknown value '%s'", DirectTouchSpectate.u.string.ptr); - return {}; - } - return ParsedDirectTouchSpectate; -} - -std::optional CTouchControls::ParseButton(const json_value *pButtonObject) -{ - const json_value &ButtonObject = *pButtonObject; - if(ButtonObject.type != json_object) - { - log_error("touch_controls", "Failed to parse touch button: must be an object"); - return {}; - } - - const auto &&ParsePositionSize = [&](const char *pAttribute, int &ParsedValue, int Min, int Max) { - const json_value &AttributeValue = ButtonObject[pAttribute]; - if(AttributeValue.type != json_integer || !in_range(AttributeValue.u.integer, Min, Max)) - { - log_error("touch_controls", "Failed to parse touch button: attribute '%s' must specify an integer between '%d' and '%d'", pAttribute, Min, Max); - return false; - } - ParsedValue = AttributeValue.u.integer; - return true; - }; - CUnitRect ParsedUnitRect; - if(!ParsePositionSize("w", ParsedUnitRect.m_W, BUTTON_SIZE_MINIMUM, BUTTON_SIZE_MAXIMUM) || - !ParsePositionSize("h", ParsedUnitRect.m_H, BUTTON_SIZE_MINIMUM, BUTTON_SIZE_MAXIMUM)) - { - return {}; - } - if(!ParsePositionSize("x", ParsedUnitRect.m_X, 0, BUTTON_SIZE_SCALE - ParsedUnitRect.m_W) || - !ParsePositionSize("y", ParsedUnitRect.m_Y, 0, BUTTON_SIZE_SCALE - ParsedUnitRect.m_H)) - { - return {}; - } - - const json_value &Shape = ButtonObject["shape"]; - if(Shape.type != json_string) - { - log_error("touch_controls", "Failed to parse touch button: attribute 'shape' must specify a string"); - return {}; - } - EButtonShape ParsedShape = EButtonShape::NUM_SHAPES; - for(int CurrentShape = (int)EButtonShape::RECT; CurrentShape < (int)EButtonShape::NUM_SHAPES; ++CurrentShape) - { - if(str_comp(Shape.u.string.ptr, SHAPE_NAMES[CurrentShape]) == 0) - { - ParsedShape = (EButtonShape)CurrentShape; - break; - } - } - if(ParsedShape == EButtonShape::NUM_SHAPES) - { - log_error("touch_controls", "Failed to parse touch button: attribute 'shape' specifies unknown value '%s'", Shape.u.string.ptr); - return {}; - } - - const json_value &Visibilities = ButtonObject["visibilities"]; - if(Visibilities.type != json_array) - { - log_error("touch_controls", "Failed to parse touch button: attribute 'visibilities' must specify an array"); - return {}; - } - std::vector vParsedVisibilities; - for(unsigned VisibilityIndex = 0; VisibilityIndex < Visibilities.u.array.length; ++VisibilityIndex) - { - const json_value &Visibility = Visibilities[VisibilityIndex]; - if(Visibility.type != json_string) - { - log_error("touch_controls", "Failed to parse touch button: attribute 'visibilities' does not specify string at index '%d'", VisibilityIndex); - return {}; - } - EButtonVisibility ParsedVisibility = EButtonVisibility::NUM_VISIBILITIES; - const bool ParsedParity = Visibility.u.string.ptr[0] != '-'; - const char *pVisibilityString = ParsedParity ? Visibility.u.string.ptr : &Visibility.u.string.ptr[1]; - for(int CurrentVisibility = (int)EButtonVisibility::INGAME; CurrentVisibility < (int)EButtonVisibility::NUM_VISIBILITIES; ++CurrentVisibility) - { - if(str_comp(pVisibilityString, m_aVisibilityFunctions[CurrentVisibility].m_pId) == 0) - { - ParsedVisibility = (EButtonVisibility)CurrentVisibility; - break; - } - } - if(ParsedVisibility == EButtonVisibility::NUM_VISIBILITIES) - { - log_error("touch_controls", "Failed to parse touch button: attribute 'visibilities' specifies unknown value '%s' at index '%d'", pVisibilityString, VisibilityIndex); - return {}; - } - const bool VisibilityAlreadyUsed = std::any_of(vParsedVisibilities.begin(), vParsedVisibilities.end(), [&](CButtonVisibility OtherParsedVisibility) { - return OtherParsedVisibility.m_Type == ParsedVisibility; - }); - if(VisibilityAlreadyUsed) - { - log_error("touch_controls", "Failed to parse touch button: attribute 'visibilities' specifies duplicate value '%s' at '%d'", pVisibilityString, VisibilityIndex); - return {}; - } - vParsedVisibilities.emplace_back(ParsedVisibility, ParsedParity); - } - - std::unique_ptr pParsedBehavior = ParseBehavior(&ButtonObject["behavior"]); - if(pParsedBehavior == nullptr) - { - log_error("touch_controls", "Failed to parse touch button: failed to parse attribute 'behavior' (see details above)"); - return {}; - } - - CTouchButton Button(this); - Button.m_UnitRect = ParsedUnitRect; - Button.m_Shape = ParsedShape; - Button.m_vVisibilities = std::move(vParsedVisibilities); - Button.m_pBehavior = std::move(pParsedBehavior); - return Button; -} - -std::unique_ptr CTouchControls::ParseBehavior(const json_value *pBehaviorObject) -{ - const json_value &BehaviorObject = *pBehaviorObject; - if(BehaviorObject.type != json_object) - { - log_error("touch_controls", "Failed to parse touch button behavior: must be an object"); - return nullptr; - } - - const json_value &BehaviorType = BehaviorObject["type"]; - if(BehaviorType.type != json_string) - { - log_error("touch_controls", "Failed to parse touch button behavior: attribute 'type' must specify a string"); - return nullptr; - } - - if(str_comp(BehaviorType.u.string.ptr, CPredefinedTouchButtonBehavior::BEHAVIOR_TYPE) == 0) - { - return ParsePredefinedBehavior(&BehaviorObject); - } - else if(str_comp(BehaviorType.u.string.ptr, CBindTouchButtonBehavior::BEHAVIOR_TYPE) == 0) - { - return ParseBindBehavior(&BehaviorObject); - } - else if(str_comp(BehaviorType.u.string.ptr, CBindToggleTouchButtonBehavior::BEHAVIOR_TYPE) == 0) - { - return ParseBindToggleBehavior(&BehaviorObject); - } - else - { - log_error("touch_controls", "Failed to parse touch button behavior: attribute 'type' specifies unknown value '%s'", BehaviorType.u.string.ptr); - return nullptr; - } -} - -std::unique_ptr CTouchControls::ParsePredefinedBehavior(const json_value *pBehaviorObject) -{ - const json_value &BehaviorObject = *pBehaviorObject; - const json_value &PredefinedId = BehaviorObject["id"]; - if(PredefinedId.type != json_string) - { - log_error("touch_controls", "Failed to parse touch button behavior of type '%s': attribute 'id' must specify a string", CPredefinedTouchButtonBehavior::BEHAVIOR_TYPE); - return nullptr; - } - - class CBehaviorFactory - { - public: - const char *m_pId; - std::function(const json_value *pBehaviorObject)> m_Factory; - }; - static const CBehaviorFactory BEHAVIOR_FACTORIES[] = { - {CIngameMenuTouchButtonBehavior::BEHAVIOR_ID, [](const json_value *pBehavior) { return std::make_unique(); }}, - {CExtraMenuTouchButtonBehavior::BEHAVIOR_ID, [&](const json_value *pBehavior) { return ParseExtraMenuBehavior(pBehavior); }}, - {CEmoticonTouchButtonBehavior::BEHAVIOR_ID, [](const json_value *pBehavior) { return std::make_unique(); }}, - {CSpectateTouchButtonBehavior::BEHAVIOR_ID, [](const json_value *pBehavior) { return std::make_unique(); }}, - {CSwapActionTouchButtonBehavior::BEHAVIOR_ID, [](const json_value *pBehavior) { return std::make_unique(); }}, - {CUseActionTouchButtonBehavior::BEHAVIOR_ID, [](const json_value *pBehavior) { return std::make_unique(); }}, - {CJoystickActionTouchButtonBehavior::BEHAVIOR_ID, [](const json_value *pBehavior) { return std::make_unique(); }}, - {CJoystickAimTouchButtonBehavior::BEHAVIOR_ID, [](const json_value *pBehavior) { return std::make_unique(); }}, - {CJoystickFireTouchButtonBehavior::BEHAVIOR_ID, [](const json_value *pBehavior) { return std::make_unique(); }}, - {CJoystickHookTouchButtonBehavior::BEHAVIOR_ID, [](const json_value *pBehavior) { return std::make_unique(); }}}; - for(const CBehaviorFactory &BehaviorFactory : BEHAVIOR_FACTORIES) - { - if(str_comp(PredefinedId.u.string.ptr, BehaviorFactory.m_pId) == 0) - { - return BehaviorFactory.m_Factory(&BehaviorObject); - } - } - - log_error("touch_controls", "Failed to parse touch button behavior of type '%s': attribute 'id' specifies unknown value '%s'", CPredefinedTouchButtonBehavior::BEHAVIOR_TYPE, PredefinedId.u.string.ptr); - return nullptr; -} - -std::unique_ptr CTouchControls::ParseExtraMenuBehavior(const json_value *pBehaviorObject) -{ - const json_value &BehaviorObject = *pBehaviorObject; - const json_value &MenuNumber = BehaviorObject["number"]; - // TODO: Remove json_none backwards compatibility - const int MaxNumber = (int)EButtonVisibility::EXTRA_MENU_5 - (int)EButtonVisibility::EXTRA_MENU_1 + 1; - if(MenuNumber.type != json_none && (MenuNumber.type != json_integer || !in_range(MenuNumber.u.integer, 1, MaxNumber))) - { - log_error("touch_controls", "Failed to parse touch button behavior of type '%s' and ID '%s': attribute 'number' must specify an integer between '%d' and '%d'", - CPredefinedTouchButtonBehavior::BEHAVIOR_TYPE, CExtraMenuTouchButtonBehavior::BEHAVIOR_ID, 1, MaxNumber); - return nullptr; - } - int ParsedMenuNumber = MenuNumber.type == json_none ? 0 : (MenuNumber.u.integer - 1); - - return std::make_unique(ParsedMenuNumber); -} - -std::unique_ptr CTouchControls::ParseBindBehavior(const json_value *pBehaviorObject) -{ - const json_value &BehaviorObject = *pBehaviorObject; - const json_value &Label = BehaviorObject["label"]; - if(Label.type != json_string) - { - log_error("touch_controls", "Failed to parse touch button behavior of type '%s': attribute 'label' must specify a string", CBindTouchButtonBehavior::BEHAVIOR_TYPE); - return nullptr; - } - - const json_value &LabelType = BehaviorObject["label-type"]; - if(LabelType.type != json_string) - { - log_error("touch_controls", "Failed to parse touch button behavior of type '%s': attribute 'label-type' must specify a string", CBindTouchButtonBehavior::BEHAVIOR_TYPE); - return {}; - } - CButtonLabel::EType ParsedLabelType = CButtonLabel::EType::NUM_TYPES; - for(int CurrentType = (int)CButtonLabel::EType::PLAIN; CurrentType < (int)CButtonLabel::EType::NUM_TYPES; ++CurrentType) - { - if(str_comp(LabelType.u.string.ptr, LABEL_TYPE_NAMES[CurrentType]) == 0) - { - ParsedLabelType = (CButtonLabel::EType)CurrentType; - break; - } - } - if(ParsedLabelType == CButtonLabel::EType::NUM_TYPES) - { - log_error("touch_controls", "Failed to parse touch button behavior of type '%s': attribute 'label-type' specifies unknown value '%s'", CBindTouchButtonBehavior::BEHAVIOR_TYPE, LabelType.u.string.ptr); - return {}; - } - - const json_value &Command = BehaviorObject["command"]; - if(Command.type != json_string) - { - log_error("touch_controls", "Failed to parse touch button behavior of type '%s': attribute 'command' must specify a string", CBindTouchButtonBehavior::BEHAVIOR_TYPE); - return nullptr; - } - - return std::make_unique(Label.u.string.ptr, ParsedLabelType, Command.u.string.ptr); -} - -std::unique_ptr CTouchControls::ParseBindToggleBehavior(const json_value *pBehaviorObject) -{ - const json_value &CommandsObject = (*pBehaviorObject)["commands"]; - if(CommandsObject.type != json_array || CommandsObject.u.array.length < 2) - { - log_error("touch_controls", "Failed to parse touch button behavior of type '%s': attribute 'commands' must specify an array with at least 2 entries", CBindToggleTouchButtonBehavior::BEHAVIOR_TYPE); - return {}; - } - - std::vector vCommands; - vCommands.reserve(CommandsObject.u.array.length); - for(unsigned CommandIndex = 0; CommandIndex < CommandsObject.u.array.length; ++CommandIndex) - { - const json_value &CommandObject = CommandsObject[CommandIndex]; - if(CommandObject.type != json_object) - { - log_error("touch_controls", "Failed to parse touch button behavior of type '%s': failed to parse command at index '%d': attribute 'commands' must specify an array of objects", CBindToggleTouchButtonBehavior::BEHAVIOR_TYPE, CommandIndex); - return nullptr; - } - - const json_value &Label = CommandObject["label"]; - if(Label.type != json_string) - { - log_error("touch_controls", "Failed to parse touch button behavior of type '%s': failed to parse command at index '%d': attribute 'label' must specify a string", CBindToggleTouchButtonBehavior::BEHAVIOR_TYPE, CommandIndex); - return nullptr; - } - - const json_value &LabelType = CommandObject["label-type"]; - if(LabelType.type != json_string) - { - log_error("touch_controls", "Failed to parse touch button behavior of type '%s': failed to parse command at index '%d': attribute 'label-type' must specify a string", CBindToggleTouchButtonBehavior::BEHAVIOR_TYPE, CommandIndex); - return {}; - } - CButtonLabel::EType ParsedLabelType = CButtonLabel::EType::NUM_TYPES; - for(int CurrentType = (int)CButtonLabel::EType::PLAIN; CurrentType < (int)CButtonLabel::EType::NUM_TYPES; ++CurrentType) - { - if(str_comp(LabelType.u.string.ptr, LABEL_TYPE_NAMES[CurrentType]) == 0) - { - ParsedLabelType = (CButtonLabel::EType)CurrentType; - break; - } - } - if(ParsedLabelType == CButtonLabel::EType::NUM_TYPES) - { - log_error("touch_controls", "Failed to parse touch button behavior of type '%s': failed to parse command at index '%d': attribute 'label-type' specifies unknown value '%s'", CBindToggleTouchButtonBehavior::BEHAVIOR_TYPE, CommandIndex, LabelType.u.string.ptr); - return {}; - } - - const json_value &Command = CommandObject["command"]; - if(Command.type != json_string) - { - log_error("touch_controls", "Failed to parse touch button behavior of type '%s': failed to parse command at index '%d': attribute 'command' must specify a string", CBindToggleTouchButtonBehavior::BEHAVIOR_TYPE, CommandIndex); - return nullptr; - } - vCommands.emplace_back(Label.u.string.ptr, ParsedLabelType, Command.u.string.ptr); - } - return std::make_unique(std::move(vCommands)); -} - -void CTouchControls::WriteConfiguration(CJsonWriter *pWriter) -{ - pWriter->BeginObject(); - - pWriter->WriteAttribute("direct-touch-ingame"); - pWriter->WriteStrValue(DIRECT_TOUCH_INGAME_MODE_NAMES[(int)m_DirectTouchIngame]); - - pWriter->WriteAttribute("direct-touch-spectate"); - pWriter->WriteStrValue(DIRECT_TOUCH_SPECTATE_MODE_NAMES[(int)m_DirectTouchSpectate]); - - pWriter->WriteAttribute("touch-buttons"); - pWriter->BeginArray(); - for(CTouchButton &TouchButton : m_vTouchButtons) - { - TouchButton.WriteToConfiguration(pWriter); - } - pWriter->EndArray(); - - pWriter->EndObject(); -} diff --git a/src/game/client/components/touch_controls.h b/src/game/client/components/touch_controls.h deleted file mode 100644 index e13c4a35b8..0000000000 --- a/src/game/client/components/touch_controls.h +++ /dev/null @@ -1,548 +0,0 @@ -#ifndef GAME_CLIENT_COMPONENTS_TOUCH_CONTROLS_H -#define GAME_CLIENT_COMPONENTS_TOUCH_CONTROLS_H - -#include - -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -class CJsonWriter; -typedef struct _json_value json_value; - -class CTouchControls : public CComponent -{ -public: - enum class EDirectTouchIngameMode - { - DISABLED, - ACTION, - AIM, - FIRE, - HOOK, - NUM_STATES - }; - enum class EDirectTouchSpectateMode - { - DISABLED, - AIM, - NUM_STATES - }; - - int Sizeof() const override { return sizeof(*this); } - void OnInit() override; - void OnReset() override; - void OnWindowResize() override; - bool OnTouchState(const std::vector &vTouchFingerStates) override; - void OnRender() override; - - bool LoadConfigurationFromFile(int StorageType); - bool LoadConfigurationFromClipboard(); - bool SaveConfigurationToFile(); - void SaveConfigurationToClipboard(); - - EDirectTouchIngameMode DirectTouchIngame() const { return m_DirectTouchIngame; } - void SetDirectTouchIngame(EDirectTouchIngameMode DirectTouchIngame) - { - m_DirectTouchIngame = DirectTouchIngame; - m_EditingChanges = true; - } - EDirectTouchSpectateMode DirectTouchSpectate() const { return m_DirectTouchSpectate; } - void SetDirectTouchSpectate(EDirectTouchSpectateMode DirectTouchSpectate) - { - m_DirectTouchSpectate = DirectTouchSpectate; - m_EditingChanges = true; - } - bool IsEditingActive() const { return m_EditingActive; } - void SetEditingActive(bool EditingActive) { m_EditingActive = EditingActive; } - bool HasEditingChanges() const { return m_EditingChanges; } - void SetEditingChanges(bool EditingChanges) { m_EditingChanges = EditingChanges; } - -private: - static constexpr const char *const DIRECT_TOUCH_INGAME_MODE_NAMES[(int)EDirectTouchIngameMode::NUM_STATES] = {"disabled", "action", "aim", "fire", "hook"}; - static constexpr const char *const DIRECT_TOUCH_SPECTATE_MODE_NAMES[(int)EDirectTouchSpectateMode::NUM_STATES] = {"disabled", "aim"}; - - enum class EButtonShape - { - RECT, - CIRCLE, - NUM_SHAPES - }; - - static constexpr const char *const SHAPE_NAMES[(int)EButtonShape::NUM_SHAPES] = {"rect", "circle"}; - - enum class EButtonVisibility - { - INGAME, - ZOOM_ALLOWED, - VOTE_ACTIVE, - DUMMY_ALLOWED, - DUMMY_CONNECTED, - RCON_AUTHED, - DEMO_PLAYER, - EXTRA_MENU_1, - EXTRA_MENU_2, - EXTRA_MENU_3, - EXTRA_MENU_4, - EXTRA_MENU_5, - NUM_VISIBILITIES - }; - - class CButtonVisibility - { - public: - EButtonVisibility m_Type; - bool m_Parity; - - CButtonVisibility(EButtonVisibility Type, bool Parity) : - m_Type(Type), m_Parity(Parity) {} - }; - - class CButtonVisibilityData - { - public: - const char *m_pId; - std::function m_Function; - }; - - CButtonVisibilityData m_aVisibilityFunctions[(int)EButtonVisibility::NUM_VISIBILITIES]; - - enum - { - ACTION_AIM, - ACTION_FIRE, - ACTION_HOOK, - NUM_ACTIONS - }; - - class CButtonLabel - { - public: - enum class EType - { - /** - * Label is used as is. - */ - PLAIN, - /** - * Label is localized. Only usable for default button labels for which there must be - * corresponding `Localizable`-calls in code and string in the translation files. - */ - LOCALIZED, - /** - * Icon font is used for the label. - */ - ICON, - /** - * Number of label types. - */ - NUM_TYPES - }; - - EType m_Type; - const char *m_pLabel; - }; - - static constexpr const char *const LABEL_TYPE_NAMES[(int)CButtonLabel::EType::NUM_TYPES] = {"plain", "localized", "icon"}; - - class CUnitRect - { - public: - int m_X; - int m_Y; - int m_W; - int m_H; - }; - - class CTouchButtonBehavior; - - class CTouchButton - { - public: - CTouchButton(CTouchControls *pTouchControls); - CTouchButton(CTouchButton &&Other) noexcept; - CTouchButton(const CTouchButton &Other) = delete; - - CTouchButton &operator=(const CTouchButton &Other) = delete; - CTouchButton &operator=(CTouchButton &&Other) noexcept; - - CTouchControls *m_pTouchControls; - - CUnitRect m_UnitRect; - CUIRect m_ScreenRect; - - EButtonShape m_Shape; - int m_BackgroundCorners; // only used with EButtonShape::RECT - - std::vector m_vVisibilities; - std::unique_ptr m_pBehavior; - - bool m_VisibilityCached; - std::chrono::nanoseconds m_VisibilityStartTime; - - void UpdatePointers(); - void UpdateScreenFromUnitRect(); - void UpdateBackgroundCorners(); - - vec2 ClampTouchPosition(vec2 TouchPosition) const; - bool IsInside(vec2 TouchPosition) const; - void UpdateVisibility(); - bool IsVisible() const; - void Render() const; - void WriteToConfiguration(CJsonWriter *pWriter); - }; - - class CTouchButtonBehavior - { - public: - CTouchButton *m_pTouchButton; - CTouchControls *m_pTouchControls; - - bool m_Active; // variables below must only be used when active - IInput::CTouchFinger m_Finger; - vec2 m_ActivePosition; - vec2 m_AccumulatedDelta; - std::chrono::nanoseconds m_ActivationStartTime; - - virtual ~CTouchButtonBehavior() = default; - virtual void Init(CTouchButton *pTouchButton); - - void Reset(); - void SetActive(const IInput::CTouchFingerState &FingerState); - void SetInactive(); - bool IsActive() const; - bool IsActive(const IInput::CTouchFinger &Finger) const; - - virtual CButtonLabel GetLabel() const = 0; - virtual void OnActivate() {} - virtual void OnDeactivate() {} - virtual void OnUpdate() {} - virtual void WriteToConfiguration(CJsonWriter *pWriter) = 0; - }; - - /** - * Abstract class for predefined behaviors. - * - * Subclasses must implemented the concrete behavior and provide the label. - */ - class CPredefinedTouchButtonBehavior : public CTouchButtonBehavior - { - public: - static constexpr const char *const BEHAVIOR_TYPE = "predefined"; - - CPredefinedTouchButtonBehavior(const char *pId) : - m_pId(pId) {} - - /** - * Implements the serialization for predefined behaviors. Subclasses - * may override this, but they should call the parent function first. - */ - void WriteToConfiguration(CJsonWriter *pWriter) override; - - private: - const char *m_pId; - }; - - class CIngameMenuTouchButtonBehavior : public CPredefinedTouchButtonBehavior - { - public: - static constexpr const char *const BEHAVIOR_ID = "ingame-menu"; - - CIngameMenuTouchButtonBehavior() : - CPredefinedTouchButtonBehavior(BEHAVIOR_ID) {} - - CButtonLabel GetLabel() const override; - void OnDeactivate() override; - }; - - class CExtraMenuTouchButtonBehavior : public CPredefinedTouchButtonBehavior - { - public: - static constexpr const char *const BEHAVIOR_ID = "extra-menu"; - - CExtraMenuTouchButtonBehavior(int Number); - - CButtonLabel GetLabel() const override; - void OnDeactivate() override; - void WriteToConfiguration(CJsonWriter *pWriter) override; - - private: - int m_Number; - char m_aLabel[16]; - }; - - class CEmoticonTouchButtonBehavior : public CPredefinedTouchButtonBehavior - { - public: - static constexpr const char *const BEHAVIOR_ID = "emoticon"; - - CEmoticonTouchButtonBehavior() : - CPredefinedTouchButtonBehavior(BEHAVIOR_ID) {} - - CButtonLabel GetLabel() const override; - void OnDeactivate() override; - }; - - class CSpectateTouchButtonBehavior : public CPredefinedTouchButtonBehavior - { - public: - static constexpr const char *const BEHAVIOR_ID = "spectate"; - - CSpectateTouchButtonBehavior() : - CPredefinedTouchButtonBehavior(BEHAVIOR_ID) {} - - CButtonLabel GetLabel() const override; - void OnDeactivate() override; - }; - - class CSwapActionTouchButtonBehavior : public CPredefinedTouchButtonBehavior - { - public: - static constexpr const char *const BEHAVIOR_ID = "swap-action"; - - CSwapActionTouchButtonBehavior() : - CPredefinedTouchButtonBehavior(BEHAVIOR_ID) {} - - CButtonLabel GetLabel() const override; - void OnActivate() override; - void OnDeactivate() override; - - private: - int m_ActiveAction = NUM_ACTIONS; - }; - - class CUseActionTouchButtonBehavior : public CPredefinedTouchButtonBehavior - { - public: - static constexpr const char *const BEHAVIOR_ID = "use-action"; - - CUseActionTouchButtonBehavior() : - CPredefinedTouchButtonBehavior(BEHAVIOR_ID) {} - - CButtonLabel GetLabel() const override; - void OnActivate() override; - void OnDeactivate() override; - - private: - int m_ActiveAction = NUM_ACTIONS; - }; - - class CJoystickTouchButtonBehavior : public CPredefinedTouchButtonBehavior - { - public: - CJoystickTouchButtonBehavior(const char *pId) : - CPredefinedTouchButtonBehavior(pId) {} - - CButtonLabel GetLabel() const override; - void OnActivate() override; - void OnDeactivate() override; - void OnUpdate() override; - int ActiveAction() const { return m_ActiveAction; } - virtual int SelectedAction() const = 0; - - private: - int m_ActiveAction = NUM_ACTIONS; - }; - - class CJoystickActionTouchButtonBehavior : public CJoystickTouchButtonBehavior - { - public: - static constexpr const char *const BEHAVIOR_ID = "joystick-action"; - - CJoystickActionTouchButtonBehavior() : - CJoystickTouchButtonBehavior(BEHAVIOR_ID) {} - - void Init(CTouchButton *pTouchButton) override; - int SelectedAction() const override; - }; - - class CJoystickAimTouchButtonBehavior : public CJoystickTouchButtonBehavior - { - public: - static constexpr const char *const BEHAVIOR_ID = "joystick-aim"; - - CJoystickAimTouchButtonBehavior() : - CJoystickTouchButtonBehavior(BEHAVIOR_ID) {} - - int SelectedAction() const override; - }; - - class CJoystickFireTouchButtonBehavior : public CJoystickTouchButtonBehavior - { - public: - static constexpr const char *const BEHAVIOR_ID = "joystick-fire"; - - CJoystickFireTouchButtonBehavior() : - CJoystickTouchButtonBehavior(BEHAVIOR_ID) {} - - int SelectedAction() const override; - }; - - class CJoystickHookTouchButtonBehavior : public CJoystickTouchButtonBehavior - { - public: - static constexpr const char *const BEHAVIOR_ID = "joystick-hook"; - - CJoystickHookTouchButtonBehavior() : - CJoystickTouchButtonBehavior(BEHAVIOR_ID) {} - - int SelectedAction() const override; - }; - - /** - * Generic behavior implementation that executes a console command like a bind. - */ - class CBindTouchButtonBehavior : public CTouchButtonBehavior - { - public: - static constexpr const char *const BEHAVIOR_TYPE = "bind"; - - CBindTouchButtonBehavior(const char *pLabel, CButtonLabel::EType LabelType, const char *pCommand) : - m_Label(pLabel), - m_LabelType(LabelType), - m_Command(pCommand) {} - - CButtonLabel GetLabel() const override; - void OnActivate() override; - void OnDeactivate() override; - void OnUpdate() override; - void WriteToConfiguration(CJsonWriter *pWriter) override; - - private: - std::string m_Label; - CButtonLabel::EType m_LabelType; - std::string m_Command; - - bool m_Repeating = false; - std::chrono::nanoseconds m_LastUpdateTime; - std::chrono::nanoseconds m_AccumulatedRepeatingTime; - }; - - /** - * Generic behavior implementation that switches between executing one of two or more console commands. - */ - class CBindToggleTouchButtonBehavior : public CTouchButtonBehavior - { - public: - static constexpr const char *const BEHAVIOR_TYPE = "bind-toggle"; - - class CCommand - { - public: - std::string m_Label; - CButtonLabel::EType m_LabelType; - std::string m_Command; - - CCommand(const char *pLabel, CButtonLabel::EType LabelType, const char *pCommand) : - m_Label(pLabel), - m_LabelType(LabelType), - m_Command(pCommand) {} - }; - - CBindToggleTouchButtonBehavior(std::vector &&vCommands) : - m_vCommands(std::move(vCommands)) {} - - CButtonLabel GetLabel() const override; - void OnActivate() override; - void WriteToConfiguration(CJsonWriter *pWriter) override; - - private: - std::vector m_vCommands; - size_t m_ActiveCommandIndex = 0; - }; - - /** - * Mode of direct touch input while ingame. - * - * Saved to the touch controls configuration. - */ - EDirectTouchIngameMode m_DirectTouchIngame = EDirectTouchIngameMode::ACTION; - - /** - * Mode of direct touch input while spectating. - * - * Saved to the touch controls configuration. - */ - EDirectTouchSpectateMode m_DirectTouchSpectate = EDirectTouchSpectateMode::AIM; - - /** - * All touch buttons. - * - * Saved to the touch controls configuration. - */ - std::vector m_vTouchButtons; - - /** - * The activation states of the different extra menus which are toggle by the extra menu button behavior. - */ - bool m_aExtraMenuActive[(int)EButtonVisibility::EXTRA_MENU_5 - (int)EButtonVisibility::EXTRA_MENU_1 + 1] = {false}; - - /** - * The currently selected action which is used for direct touch and is changed and used by some button behaviors. - */ - int m_ActionSelected = ACTION_FIRE; - - /** - * The action that was last activated with direct touch input, which will determine the finger that will - * be used to update the mouse position from direct touch input. - */ - int m_DirectTouchLastAction = ACTION_FIRE; - - class CActionState - { - public: - bool m_Active = false; - IInput::CTouchFinger m_Finger; - }; - - /** - * The states of the different actions for direct touch input. - */ - CActionState m_aDirectTouchActionStates[NUM_ACTIONS]; - - /** - * A pointer to the action joystick, if any exists in the current configuration, or `nullptr` if none. - * This is set by @link CJoystickActionTouchButtonBehavior @endlink when it is initialized and always - * cleared before loading a new touch button configuration. - */ - CJoystickActionTouchButtonBehavior *m_pPrimaryJoystickTouchButtonBehavior; - - /** - * Whether editing mode is currently active. - */ - bool m_EditingActive = false; - - /** - * Whether there are changes to the current configuration in editing mode. - */ - bool m_EditingChanges = false; - - void InitVisibilityFunctions(); - int NextActiveAction(int Action) const; - int NextDirectTouchAction() const; - void UpdateButtons(const std::vector &vTouchFingerStates); - void ResetButtons(); - void RenderButtons(); - vec2 CalculateScreenSize() const; - - bool ParseConfiguration(const void *pFileData, unsigned FileLength); - std::optional ParseDirectTouchIngameMode(const json_value *pModeValue); - std::optional ParseDirectTouchSpectateMode(const json_value *pModeValue); - std::optional ParseButton(const json_value *pButtonObject); - std::unique_ptr ParseBehavior(const json_value *pBehaviorObject); - std::unique_ptr ParsePredefinedBehavior(const json_value *pBehaviorObject); - std::unique_ptr ParseExtraMenuBehavior(const json_value *pBehaviorObject); - std::unique_ptr ParseBindBehavior(const json_value *pBehaviorObject); - std::unique_ptr ParseBindToggleBehavior(const json_value *pBehaviorObject); - void WriteConfiguration(CJsonWriter *pWriter); -}; - -#endif diff --git a/src/game/client/components/voting.cpp b/src/game/client/components/voting.cpp deleted file mode 100644 index 462a14e8da..0000000000 --- a/src/game/client/components/voting.cpp +++ /dev/null @@ -1,428 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include "voting.h" - -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -void CVoting::ConCallvote(IConsole::IResult *pResult, void *pUserData) -{ - CVoting *pSelf = (CVoting *)pUserData; - pSelf->Callvote(pResult->GetString(0), pResult->GetString(1), pResult->NumArguments() > 2 ? pResult->GetString(2) : ""); -} - -void CVoting::ConVote(IConsole::IResult *pResult, void *pUserData) -{ - CVoting *pSelf = (CVoting *)pUserData; - if(str_comp_nocase(pResult->GetString(0), "yes") == 0) - pSelf->Vote(1); - else if(str_comp_nocase(pResult->GetString(0), "no") == 0) - pSelf->Vote(-1); -} - -void CVoting::Callvote(const char *pType, const char *pValue, const char *pReason) -{ - if(Client()->IsSixup()) - { - protocol7::CNetMsg_Cl_CallVote Msg; - Msg.m_pType = pType; - Msg.m_pValue = pValue; - Msg.m_pReason = pReason; - Msg.m_Force = false; - Client()->SendPackMsgActive(&Msg, MSGFLAG_VITAL, true); - return; - } - CNetMsg_Cl_CallVote Msg = {0}; - Msg.m_pType = pType; - Msg.m_pValue = pValue; - Msg.m_pReason = pReason; - Client()->SendPackMsgActive(&Msg, MSGFLAG_VITAL); -} - -void CVoting::CallvoteSpectate(int ClientId, const char *pReason, bool ForceVote) -{ - if(ForceVote) - { - char aBuf[128]; - str_format(aBuf, sizeof(aBuf), "set_team %d -1", ClientId); - Client()->Rcon(aBuf); - } - else - { - char aBuf[32]; - str_format(aBuf, sizeof(aBuf), "%d", ClientId); - Callvote("spectate", aBuf, pReason); - } -} - -void CVoting::CallvoteKick(int ClientId, const char *pReason, bool ForceVote) -{ - if(ForceVote) - { - char aBuf[128]; - str_format(aBuf, sizeof(aBuf), "force_vote kick %d %s", ClientId, pReason); - Client()->Rcon(aBuf); - } - else - { - char aBuf[32]; - str_format(aBuf, sizeof(aBuf), "%d", ClientId); - Callvote("kick", aBuf, pReason); - } -} - -void CVoting::CallvoteOption(int OptionId, const char *pReason, bool ForceVote) -{ - CVoteOptionClient *pOption = m_pFirst; - while(pOption && OptionId >= 0) - { - if(OptionId == 0) - { - if(ForceVote) - { - char aBuf[128]; - str_copy(aBuf, "force_vote option \""); - char *pDst = aBuf + str_length(aBuf); - str_escape(&pDst, pOption->m_aDescription, aBuf + sizeof(aBuf)); - str_append(aBuf, "\" \""); - pDst = aBuf + str_length(aBuf); - str_escape(&pDst, pReason, aBuf + sizeof(aBuf)); - str_append(aBuf, "\""); - Client()->Rcon(aBuf); - } - else - Callvote("option", pOption->m_aDescription, pReason); - break; - } - - OptionId--; - pOption = pOption->m_pNext; - } -} - -void CVoting::RemovevoteOption(int OptionId) -{ - CVoteOptionClient *pOption = m_pFirst; - while(pOption && OptionId >= 0) - { - if(OptionId == 0) - { - char aBuf[128]; - str_copy(aBuf, "remove_vote \""); - char *pDst = aBuf + str_length(aBuf); - str_escape(&pDst, pOption->m_aDescription, aBuf + sizeof(aBuf)); - str_append(aBuf, "\""); - Client()->Rcon(aBuf); - break; - } - - OptionId--; - pOption = pOption->m_pNext; - } -} - -void CVoting::AddvoteOption(const char *pDescription, const char *pCommand) -{ - char aBuf[128]; - str_copy(aBuf, "add_vote \""); - char *pDst = aBuf + str_length(aBuf); - str_escape(&pDst, pDescription, aBuf + sizeof(aBuf)); - str_append(aBuf, "\" \""); - pDst = aBuf + str_length(aBuf); - str_escape(&pDst, pCommand, aBuf + sizeof(aBuf)); - str_append(aBuf, "\""); - Client()->Rcon(aBuf); -} - -void CVoting::Vote(int v) -{ - if(m_Voted == 0) - m_Voted = v; - CNetMsg_Cl_Vote Msg = {v}; - Client()->SendPackMsgActive(&Msg, MSGFLAG_VITAL); -} - -int CVoting::SecondsLeft() const -{ - return (m_Closetime - time()) / time_freq(); -} - -CVoting::CVoting() -{ - ClearOptions(); - OnReset(); -} - -void CVoting::AddOption(const char *pDescription) -{ - if(m_NumVoteOptions == MAX_VOTE_OPTIONS) - return; - - CVoteOptionClient *pOption; - if(m_pRecycleFirst) - { - pOption = m_pRecycleFirst; - m_pRecycleFirst = m_pRecycleFirst->m_pNext; - if(m_pRecycleFirst) - m_pRecycleFirst->m_pPrev = 0; - else - m_pRecycleLast = 0; - } - else - pOption = m_Heap.Allocate(); - - pOption->m_pNext = 0; - pOption->m_pPrev = m_pLast; - if(pOption->m_pPrev) - pOption->m_pPrev->m_pNext = pOption; - m_pLast = pOption; - if(!m_pFirst) - m_pFirst = pOption; - - str_copy(pOption->m_aDescription, pDescription); - ++m_NumVoteOptions; -} - -void CVoting::RemoveOption(const char *pDescription) -{ - for(CVoteOptionClient *pOption = m_pFirst; pOption; pOption = pOption->m_pNext) - { - if(str_comp(pOption->m_aDescription, pDescription) == 0) - { - // remove it from the list - if(m_pFirst == pOption) - m_pFirst = m_pFirst->m_pNext; - if(m_pLast == pOption) - m_pLast = m_pLast->m_pPrev; - if(pOption->m_pPrev) - pOption->m_pPrev->m_pNext = pOption->m_pNext; - if(pOption->m_pNext) - pOption->m_pNext->m_pPrev = pOption->m_pPrev; - --m_NumVoteOptions; - - // add it to recycle list - pOption->m_pNext = 0; - pOption->m_pPrev = m_pRecycleLast; - if(pOption->m_pPrev) - pOption->m_pPrev->m_pNext = pOption; - m_pRecycleLast = pOption; - if(!m_pRecycleFirst) - m_pRecycleLast = pOption; - - break; - } - } -} - -void CVoting::ClearOptions() -{ - m_Heap.Reset(); - - m_NumVoteOptions = 0; - m_pFirst = 0; - m_pLast = 0; - - m_pRecycleFirst = 0; - m_pRecycleLast = 0; -} - -void CVoting::OnReset() -{ - m_Opentime = m_Closetime = 0; - m_aDescription[0] = 0; - m_aReason[0] = 0; - m_Yes = m_No = m_Pass = m_Total = 0; - m_Voted = 0; - m_ReceivingOptions = false; -} - -void CVoting::OnConsoleInit() -{ - Console()->Register("callvote", "s['kick'|'spectate'|'option'] s[id|option text] ?r[reason]", CFGFLAG_CLIENT, ConCallvote, this, "Call vote"); - Console()->Register("vote", "r['yes'|'no']", CFGFLAG_CLIENT, ConVote, this, "Vote yes/no"); -} - -void CVoting::OnMessage(int MsgType, void *pRawMsg) -{ - if(MsgType == NETMSGTYPE_SV_VOTESET) - { - CNetMsg_Sv_VoteSet *pMsg = (CNetMsg_Sv_VoteSet *)pRawMsg; - OnReset(); - if(pMsg->m_Timeout) - { - str_copy(m_aDescription, pMsg->m_pDescription); - str_copy(m_aReason, pMsg->m_pReason); - m_Opentime = time(); - m_Closetime = time() + time_freq() * pMsg->m_Timeout; - - if(Client()->RconAuthed()) - { - char aBuf[512]; - str_format(aBuf, sizeof(aBuf), "%s (%s)", m_aDescription, m_aReason); - Client()->Notify("DDNet Vote", aBuf); - m_pClient->m_Sounds.Play(CSounds::CHN_GUI, SOUND_CHAT_HIGHLIGHT, 1.0f); - } - } - } - else if(MsgType == NETMSGTYPE_SV_VOTESTATUS) - { - CNetMsg_Sv_VoteStatus *pMsg = (CNetMsg_Sv_VoteStatus *)pRawMsg; - m_Yes = pMsg->m_Yes; - m_No = pMsg->m_No; - m_Pass = pMsg->m_Pass; - m_Total = pMsg->m_Total; - } - else if(MsgType == NETMSGTYPE_SV_VOTECLEAROPTIONS) - { - ClearOptions(); - } - else if(MsgType == NETMSGTYPE_SV_VOTEOPTIONLISTADD) - { - CNetMsg_Sv_VoteOptionListAdd *pMsg = (CNetMsg_Sv_VoteOptionListAdd *)pRawMsg; - int NumOptions = pMsg->m_NumOptions; - for(int i = 0; i < NumOptions; ++i) - { - switch(i) - { - case 0: AddOption(pMsg->m_pDescription0); break; - case 1: AddOption(pMsg->m_pDescription1); break; - case 2: AddOption(pMsg->m_pDescription2); break; - case 3: AddOption(pMsg->m_pDescription3); break; - case 4: AddOption(pMsg->m_pDescription4); break; - case 5: AddOption(pMsg->m_pDescription5); break; - case 6: AddOption(pMsg->m_pDescription6); break; - case 7: AddOption(pMsg->m_pDescription7); break; - case 8: AddOption(pMsg->m_pDescription8); break; - case 9: AddOption(pMsg->m_pDescription9); break; - case 10: AddOption(pMsg->m_pDescription10); break; - case 11: AddOption(pMsg->m_pDescription11); break; - case 12: AddOption(pMsg->m_pDescription12); break; - case 13: AddOption(pMsg->m_pDescription13); break; - case 14: AddOption(pMsg->m_pDescription14); - } - } - } - else if(MsgType == NETMSGTYPE_SV_VOTEOPTIONADD) - { - CNetMsg_Sv_VoteOptionAdd *pMsg = (CNetMsg_Sv_VoteOptionAdd *)pRawMsg; - AddOption(pMsg->m_pDescription); - } - else if(MsgType == NETMSGTYPE_SV_VOTEOPTIONREMOVE) - { - CNetMsg_Sv_VoteOptionRemove *pMsg = (CNetMsg_Sv_VoteOptionRemove *)pRawMsg; - RemoveOption(pMsg->m_pDescription); - } - else if(MsgType == NETMSGTYPE_SV_YOURVOTE) - { - CNetMsg_Sv_YourVote *pMsg = (CNetMsg_Sv_YourVote *)pRawMsg; - m_Voted = pMsg->m_Voted; - } - else if(MsgType == NETMSGTYPE_SV_VOTEOPTIONGROUPSTART) - { - m_ReceivingOptions = true; - } - else if(MsgType == NETMSGTYPE_SV_VOTEOPTIONGROUPEND) - { - m_ReceivingOptions = false; - } -} - -void CVoting::Render() -{ - if((!g_Config.m_ClShowVotesAfterVoting && !m_pClient->m_Scoreboard.Active() && TakenChoice()) || !IsVoting() || Client()->State() == IClient::STATE_DEMOPLAYBACK) - return; - const int Seconds = SecondsLeft(); - if(Seconds < 0) - { - OnReset(); - return; - } - - CUIRect View = {0.0f, 60.0f, 120.0f, 38.0f}; - View.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.4f), IGraphics::CORNER_R, 3.0f); - View.Margin(3.0f, &View); - - SLabelProperties Props; - Props.m_EllipsisAtEnd = true; - - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), Localize("%ds left"), Seconds); - - CUIRect Row, LeftColumn, RightColumn, ProgressSpinner; - View.HSplitTop(6.0f, &Row, &View); - Row.VSplitRight(TextRender()->TextWidth(6.0f, aBuf), &LeftColumn, &RightColumn); - LeftColumn.VSplitRight(2.0f, &LeftColumn, nullptr); - LeftColumn.VSplitRight(6.0f, &LeftColumn, &ProgressSpinner); - LeftColumn.VSplitRight(2.0f, &LeftColumn, nullptr); - - SProgressSpinnerProperties ProgressProps; - ProgressProps.m_Progress = clamp((time() - m_Opentime) / (float)(m_Closetime - m_Opentime), 0.0f, 1.0f); - Ui()->RenderProgressSpinner(ProgressSpinner.Center(), ProgressSpinner.h / 2.0f, ProgressProps); - - Ui()->DoLabel(&RightColumn, aBuf, 6.0f, TEXTALIGN_MR); - - Props.m_MaxWidth = LeftColumn.w; - Ui()->DoLabel(&LeftColumn, VoteDescription(), 6.0f, TEXTALIGN_ML, Props); - - View.HSplitTop(3.0f, nullptr, &View); - View.HSplitTop(6.0f, &Row, &View); - str_format(aBuf, sizeof(aBuf), "%s %s", Localize("Reason:"), VoteReason()); - Props.m_MaxWidth = Row.w; - Ui()->DoLabel(&Row, aBuf, 6.0f, TEXTALIGN_ML, Props); - - View.HSplitTop(3.0f, nullptr, &View); - View.HSplitTop(4.0f, &Row, &View); - RenderBars(Row); - - View.HSplitTop(3.0f, nullptr, &View); - View.HSplitTop(6.0f, &Row, &View); - Row.VSplitMid(&LeftColumn, &RightColumn, 4.0f); - - char aKey[64]; - m_pClient->m_Binds.GetKey("vote yes", aKey, sizeof(aKey)); - str_format(aBuf, sizeof(aBuf), "%s - %s", aKey, Localize("Vote yes")); - TextRender()->TextColor(TakenChoice() == 1 ? ColorRGBA(0.2f, 0.9f, 0.2f, 0.85f) : TextRender()->DefaultTextColor()); - Ui()->DoLabel(&LeftColumn, aBuf, 6.0f, TEXTALIGN_ML); - - m_pClient->m_Binds.GetKey("vote no", aKey, sizeof(aKey)); - str_format(aBuf, sizeof(aBuf), "%s - %s", Localize("Vote no"), aKey); - TextRender()->TextColor(TakenChoice() == -1 ? ColorRGBA(0.95f, 0.25f, 0.25f, 0.85f) : TextRender()->DefaultTextColor()); - Ui()->DoLabel(&RightColumn, aBuf, 6.0f, TEXTALIGN_MR); - - TextRender()->TextColor(TextRender()->DefaultTextColor()); -} - -void CVoting::RenderBars(CUIRect Bars) const -{ - Bars.Draw(ColorRGBA(0.8f, 0.8f, 0.8f, 0.5f), IGraphics::CORNER_ALL, Bars.h / 2.0f); - - CUIRect Splitter; - Bars.VMargin((Bars.w - 2.0f) / 2.0f, &Splitter); - Splitter.Draw(ColorRGBA(0.4f, 0.4f, 0.4f, 0.5f), IGraphics::CORNER_NONE, 0.0f); - - if(m_Total) - { - if(m_Yes) - { - CUIRect YesArea; - Bars.VSplitLeft(Bars.w * m_Yes / m_Total, &YesArea, nullptr); - YesArea.Draw(ColorRGBA(0.2f, 0.9f, 0.2f, 0.85f), IGraphics::CORNER_ALL, YesArea.h / 2.0f); - } - - if(m_No) - { - CUIRect NoArea; - Bars.VSplitRight(Bars.w * m_No / m_Total, nullptr, &NoArea); - NoArea.Draw(ColorRGBA(0.9f, 0.2f, 0.2f, 0.85f), IGraphics::CORNER_ALL, NoArea.h / 2.0f); - } - } -} diff --git a/src/game/client/components/voting.h b/src/game/client/components/voting.h deleted file mode 100644 index 87abcb1ebb..0000000000 --- a/src/game/client/components/voting.h +++ /dev/null @@ -1,68 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_COMPONENTS_VOTING_H -#define GAME_CLIENT_COMPONENTS_VOTING_H - -#include -#include - -#include -#include - -class CUIRect; - -class CVoting : public CComponent -{ - CHeap m_Heap; - - static void ConCallvote(IConsole::IResult *pResult, void *pUserData); - static void ConVote(IConsole::IResult *pResult, void *pUserData); - - int64_t m_Opentime; - int64_t m_Closetime; - char m_aDescription[VOTE_DESC_LENGTH]; - char m_aReason[VOTE_REASON_LENGTH]; - int m_Voted; - int m_Yes, m_No, m_Pass, m_Total; - bool m_ReceivingOptions; - - void RemoveOption(const char *pDescription); - void ClearOptions(); - void Callvote(const char *pType, const char *pValue, const char *pReason); - - void RenderBars(CUIRect Bars) const; - -public: - int m_NumVoteOptions; - CVoteOptionClient *m_pFirst; - CVoteOptionClient *m_pLast; - - CVoteOptionClient *m_pRecycleFirst; - CVoteOptionClient *m_pRecycleLast; - - CVoting(); - virtual int Sizeof() const override { return sizeof(*this); } - virtual void OnReset() override; - virtual void OnConsoleInit() override; - virtual void OnMessage(int Msgtype, void *pRawMsg) override; - - void Render(); - - void CallvoteSpectate(int ClientId, const char *pReason, bool ForceVote = false); - void CallvoteKick(int ClientId, const char *pReason, bool ForceVote = false); - void CallvoteOption(int OptionId, const char *pReason, bool ForceVote = false); - void RemovevoteOption(int OptionId); - void AddvoteOption(const char *pDescription, const char *pCommand); - void AddOption(const char *pDescription); - - void Vote(int v); // -1 = no, 1 = yes - - int SecondsLeft() const; - bool IsVoting() const { return m_Closetime != 0; } - int TakenChoice() const { return m_Voted; } - const char *VoteDescription() const { return m_aDescription; } - const char *VoteReason() const { return m_aReason; } - bool IsReceivingOptions() const { return m_ReceivingOptions; } -}; - -#endif diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp deleted file mode 100644 index 842ed7a931..0000000000 --- a/src/game/client/gameclient.cpp +++ /dev/null @@ -1,4485 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -#include "gameclient.h" -#include "lineinput.h" -#include "race.h" -#include "render.h" - -#include -#include -#include - -#include -#include - -#include "components/background.h" -#include "components/binds.h" -#include "components/broadcast.h" -#include "components/camera.h" -#include "components/chat.h" -#include "components/console.h" -#include "components/controls.h" -#include "components/countryflags.h" -#include "components/damageind.h" -#include "components/debughud.h" -#include "components/effects.h" -#include "components/emoticon.h" -#include "components/freezebars.h" -#include "components/ghost.h" -#include "components/hud.h" -#include "components/infomessages.h" -#include "components/items.h" -#include "components/mapimages.h" -#include "components/maplayers.h" -#include "components/mapsounds.h" -#include "components/menu_background.h" -#include "components/menus.h" -#include "components/motd.h" -#include "components/nameplates.h" -#include "components/particles.h" -#include "components/players.h" -#include "components/race_demo.h" -#include "components/scoreboard.h" -#include "components/skins.h" -#include "components/skins7.h" -#include "components/sounds.h" -#include "components/spectator.h" -#include "components/statboard.h" -#include "components/voting.h" -#include "prediction/entities/character.h" -#include "prediction/entities/projectile.h" - -using namespace std::chrono_literals; - -const char *CGameClient::Version() const { return GAME_VERSION; } -const char *CGameClient::NetVersion() const { return GAME_NETVERSION; } -const char *CGameClient::NetVersion7() const { return GAME_NETVERSION7; } -int CGameClient::DDNetVersion() const { return DDNET_VERSION_NUMBER; } -const char *CGameClient::DDNetVersionStr() const { return m_aDDNetVersionStr; } -int CGameClient::ClientVersion7() const { return CLIENT_VERSION7; } -const char *CGameClient::GetItemName(int Type) const { return m_NetObjHandler.GetObjName(Type); } - -void CGameClient::OnConsoleInit() -{ - m_pEngine = Kernel()->RequestInterface(); - m_pClient = Kernel()->RequestInterface(); - m_pTextRender = Kernel()->RequestInterface(); - m_pSound = Kernel()->RequestInterface(); - m_pConfigManager = Kernel()->RequestInterface(); - m_pConfig = m_pConfigManager->Values(); - m_pInput = Kernel()->RequestInterface(); - m_pConsole = Kernel()->RequestInterface(); - m_pStorage = Kernel()->RequestInterface(); - m_pDemoPlayer = Kernel()->RequestInterface(); - m_pServerBrowser = Kernel()->RequestInterface(); - m_pEditor = Kernel()->RequestInterface(); - m_pFavorites = Kernel()->RequestInterface(); - m_pFriends = Kernel()->RequestInterface(); - m_pFoes = Client()->Foes(); -#if defined(CONF_AUTOUPDATE) - m_pUpdater = Kernel()->RequestInterface(); -#endif - m_pHttp = Kernel()->RequestInterface(); - - // make a list of all the systems, make sure to add them in the correct render order - m_vpAll.insert(m_vpAll.end(), {&m_Skins, - &m_Skins7, - &m_CountryFlags, - &m_MapImages, - &m_Effects, // doesn't render anything, just updates effects - &m_Binds, - &m_Binds.m_SpecialBinds, - &m_Controls, - &m_Camera, - &m_Sounds, - &m_Voting, - &m_Particles, // doesn't render anything, just updates all the particles - &m_RaceDemo, - &m_MapSounds, - &m_Background, // render instead of m_MapLayersBackground when g_Config.m_ClOverlayEntities == 100 - &m_MapLayersBackground, // first to render - &m_Particles.m_RenderTrail, - &m_Particles.m_RenderTrailExtra, - &m_Items, - &m_Ghost, - &m_Players, - &m_MapLayersForeground, - &m_Particles.m_RenderExplosions, - &m_NamePlates, - &m_Particles.m_RenderExtra, - &m_Particles.m_RenderGeneral, - &m_FreezeBars, - &m_DamageInd, - &m_Hud, - &m_Spectator, - &m_Emoticon, - &m_InfoMessages, - &m_Chat, - &m_Broadcast, - &m_DebugHud, - &m_TouchControls, - &m_Scoreboard, - &m_Statboard, - &m_Motd, - &m_Menus, - &m_Tooltips, - &CMenus::m_Binder, - &m_GameConsole, - &m_MenuBackground}); - - // build the input stack - m_vpInput.insert(m_vpInput.end(), {&CMenus::m_Binder, // this will take over all input when we want to bind a key - &m_Binds.m_SpecialBinds, - &m_GameConsole, - &m_Chat, // chat has higher prio, due to that you can quit it by pressing esc - &m_Motd, // for pressing esc to remove it - &m_Spectator, - &m_Emoticon, - &m_Menus, - &m_Controls, - &m_TouchControls, - &m_Binds}); - - // add basic console commands - Console()->Register("team", "i[team-id]", CFGFLAG_CLIENT, ConTeam, this, "Switch team"); - Console()->Register("kill", "", CFGFLAG_CLIENT, ConKill, this, "Kill yourself to restart"); - Console()->Register("ready_change", "", CFGFLAG_CLIENT, ConReadyChange7, this, "Change ready state (0.7 only)"); - - // register tune zone command to allow the client prediction to load tunezones from the map - Console()->Register("tune_zone", "i[zone] s[tuning] f[value]", CFGFLAG_GAME, ConTuneZone, this, "Tune in zone a variable to value"); - - for(auto &pComponent : m_vpAll) - pComponent->m_pClient = this; - - // let all the other components register their console commands - for(auto &pComponent : m_vpAll) - pComponent->OnConsoleInit(); - - Console()->Chain("cl_languagefile", ConchainLanguageUpdate, this); - - Console()->Chain("player_name", ConchainSpecialInfoupdate, this); - Console()->Chain("player_clan", ConchainSpecialInfoupdate, this); - Console()->Chain("player_country", ConchainSpecialInfoupdate, this); - Console()->Chain("player_use_custom_color", ConchainSpecialInfoupdate, this); - Console()->Chain("player_color_body", ConchainSpecialInfoupdate, this); - Console()->Chain("player_color_feet", ConchainSpecialInfoupdate, this); - Console()->Chain("player_skin", ConchainSpecialInfoupdate, this); - - Console()->Chain("player7_skin", ConchainSpecialInfoupdate, this); - Console()->Chain("player7_skin_body", ConchainSpecialInfoupdate, this); - Console()->Chain("player7_skin_marking", ConchainSpecialInfoupdate, this); - Console()->Chain("player7_skin_decoration", ConchainSpecialInfoupdate, this); - Console()->Chain("player7_skin_hands", ConchainSpecialInfoupdate, this); - Console()->Chain("player7_skin_feet", ConchainSpecialInfoupdate, this); - Console()->Chain("player7_skin_eyes", ConchainSpecialInfoupdate, this); - Console()->Chain("player7_color_body", ConchainSpecialInfoupdate, this); - Console()->Chain("player7_color_marking", ConchainSpecialInfoupdate, this); - Console()->Chain("player7_color_decoration", ConchainSpecialInfoupdate, this); - Console()->Chain("player7_color_hands", ConchainSpecialInfoupdate, this); - Console()->Chain("player7_color_feet", ConchainSpecialInfoupdate, this); - Console()->Chain("player7_color_eyes", ConchainSpecialInfoupdate, this); - Console()->Chain("player7_use_custom_color_body", ConchainSpecialInfoupdate, this); - Console()->Chain("player7_use_custom_color_marking", ConchainSpecialInfoupdate, this); - Console()->Chain("player7_use_custom_color_decoration", ConchainSpecialInfoupdate, this); - Console()->Chain("player7_use_custom_color_hands", ConchainSpecialInfoupdate, this); - Console()->Chain("player7_use_custom_color_feet", ConchainSpecialInfoupdate, this); - Console()->Chain("player7_use_custom_color_eyes", ConchainSpecialInfoupdate, this); - - Console()->Chain("dummy_name", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy_clan", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy_country", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy_use_custom_color", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy_color_body", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy_color_feet", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy_skin", ConchainSpecialDummyInfoupdate, this); - - Console()->Chain("dummy7_skin", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy7_skin_body", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy7_skin_marking", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy7_skin_decoration", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy7_skin_hands", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy7_skin_feet", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy7_skin_eyes", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy7_color_body", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy7_color_marking", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy7_color_decoration", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy7_color_hands", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy7_color_feet", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy7_color_eyes", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy7_use_custom_color_body", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy7_use_custom_color_marking", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy7_use_custom_color_decoration", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy7_use_custom_color_hands", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy7_use_custom_color_feet", ConchainSpecialDummyInfoupdate, this); - Console()->Chain("dummy7_use_custom_color_eyes", ConchainSpecialDummyInfoupdate, this); - - Console()->Chain("cl_skin_download_url", ConchainRefreshSkins, this); - Console()->Chain("cl_skin_community_download_url", ConchainRefreshSkins, this); - Console()->Chain("cl_download_skins", ConchainRefreshSkins, this); - Console()->Chain("cl_download_community_skins", ConchainRefreshSkins, this); - Console()->Chain("cl_vanilla_skins_only", ConchainRefreshSkins, this); - - Console()->Chain("cl_dummy", ConchainSpecialDummy, this); - - Console()->Chain("cl_menu_map", ConchainMenuMap, this); -} - -static void GenerateTimeoutCode(char *pTimeoutCode) -{ - if(pTimeoutCode[0] == '\0' || str_comp(pTimeoutCode, "hGuEYnfxicsXGwFq") == 0) - { - for(unsigned int i = 0; i < 16; i++) - { - if(rand() % 2) - pTimeoutCode[i] = (char)((rand() % ('z' - 'a' + 1)) + 'a'); - else - pTimeoutCode[i] = (char)((rand() % ('Z' - 'A' + 1)) + 'A'); - } - } -} - -void CGameClient::InitializeLanguage() -{ - // set the language - g_Localization.LoadIndexfile(Storage(), Console()); - if(g_Config.m_ClShowWelcome) - g_Localization.SelectDefaultLanguage(Console(), g_Config.m_ClLanguagefile, sizeof(g_Config.m_ClLanguagefile)); - g_Localization.Load(g_Config.m_ClLanguagefile, Storage(), Console()); -} - -void CGameClient::OnInit() -{ - const int64_t OnInitStart = time_get(); - - Client()->SetLoadingCallback([this](IClient::ELoadingCallbackDetail Detail) { - const char *pTitle; - if(Detail == IClient::LOADING_CALLBACK_DETAIL_DEMO || DemoPlayer()->IsPlaying()) - { - pTitle = Localize("Preparing demo playback"); - } - else - { - pTitle = Localize("Connected"); - } - - const char *pMessage; - switch(Detail) - { - case IClient::LOADING_CALLBACK_DETAIL_MAP: - pMessage = Localize("Loading map file from storage"); - break; - case IClient::LOADING_CALLBACK_DETAIL_DEMO: - pMessage = Localize("Loading demo file from storage"); - break; - default: - dbg_assert(false, "Invalid callback loading detail"); - dbg_break(); - } - m_Menus.RenderLoading(pTitle, pMessage, 0); - }); - - m_pGraphics = Kernel()->RequestInterface(); - - // propagate pointers - m_UI.Init(Kernel()); - m_RenderTools.Init(Graphics(), TextRender()); - - if(GIT_SHORTREV_HASH) - { - str_format(m_aDDNetVersionStr, sizeof(m_aDDNetVersionStr), "%s %s (%s)", GAME_NAME, GAME_RELEASE_VERSION, GIT_SHORTREV_HASH); - } - else - { - str_format(m_aDDNetVersionStr, sizeof(m_aDDNetVersionStr), "%s %s", GAME_NAME, GAME_RELEASE_VERSION); - } - - // TODO: this should be different - // setup item sizes - for(int i = 0; i < NUM_NETOBJTYPES; i++) - Client()->SnapSetStaticsize(i, m_NetObjHandler.GetObjSize(i)); - // HACK: only set static size for items, which were available in the first 0.7 release - // so new items don't break the snapshot delta - static const int OLD_NUM_NETOBJTYPES = 23; - for(int i = 0; i < OLD_NUM_NETOBJTYPES; i++) - Client()->SnapSetStaticsize7(i, m_NetObjHandler7.GetObjSize(i)); - - if(!TextRender()->LoadFonts()) - { - Client()->AddWarning(SWarning(Localize("Some fonts could not be loaded. Check the local console for details."))); - } - TextRender()->SetFontLanguageVariant(g_Config.m_ClLanguagefile); - - // update and swap after font loading, they are quite huge - Client()->UpdateAndSwap(); - - const char *pLoadingDDNetCaption = Localize("Loading DDNet Client"); - const char *pLoadingMessageComponents = Localize("Initializing components"); - const char *pLoadingMessageComponentsSpecial = Localize("Why are you slowmo replaying to read this?"); - char aLoadingMessage[256]; - - // init all components - int SkippedComps = 1; - int CompCounter = 1; - const int NumComponents = ComponentCount(); - for(int i = NumComponents - 1; i >= 0; --i) - { - m_vpAll[i]->OnInit(); - // try to render a frame after each component, also flushes GPU uploads - if(m_Menus.IsInit()) - { - str_format(aLoadingMessage, std::size(aLoadingMessage), "%s [%d/%d]", CompCounter == NumComponents ? pLoadingMessageComponentsSpecial : pLoadingMessageComponents, CompCounter, NumComponents); - m_Menus.RenderLoading(pLoadingDDNetCaption, aLoadingMessage, SkippedComps); - SkippedComps = 1; - } - else - { - ++SkippedComps; - } - ++CompCounter; - } - - m_GameSkinLoaded = false; - m_ParticlesSkinLoaded = false; - m_EmoticonsSkinLoaded = false; - m_HudSkinLoaded = false; - - // setup load amount, load textures - const char *pLoadingMessageAssets = Localize("Initializing assets"); - for(int i = 0; i < g_pData->m_NumImages; i++) - { - if(i == IMAGE_GAME) - LoadGameSkin(g_Config.m_ClAssetGame); - else if(i == IMAGE_EMOTICONS) - LoadEmoticonsSkin(g_Config.m_ClAssetEmoticons); - else if(i == IMAGE_PARTICLES) - LoadParticlesSkin(g_Config.m_ClAssetParticles); - else if(i == IMAGE_HUD) - LoadHudSkin(g_Config.m_ClAssetHud); - else if(i == IMAGE_EXTRAS) - LoadExtrasSkin(g_Config.m_ClAssetExtras); - else if(g_pData->m_aImages[i].m_pFilename[0] == '\0') // handle special null image without filename - g_pData->m_aImages[i].m_Id = IGraphics::CTextureHandle(); - else - g_pData->m_aImages[i].m_Id = Graphics()->LoadTexture(g_pData->m_aImages[i].m_pFilename, IStorage::TYPE_ALL); - m_Menus.RenderLoading(pLoadingDDNetCaption, pLoadingMessageAssets, 1); - } - - m_GameWorld.m_pCollision = Collision(); - m_GameWorld.m_pTuningList = m_aTuningList; - OnReset(); - - // Set free binds to DDRace binds if it's active - m_Binds.SetDDRaceBinds(true); - - GenerateTimeoutCode(g_Config.m_ClTimeoutCode); - GenerateTimeoutCode(g_Config.m_ClDummyTimeoutCode); - - // Aggressively try to grab window again since some Windows users report - // window not being focused after starting client. - Graphics()->SetWindowGrab(true); - - CChecksumData *pChecksum = Client()->ChecksumData(); - pChecksum->m_SizeofGameClient = sizeof(*this); - pChecksum->m_NumComponents = m_vpAll.size(); - for(size_t i = 0; i < m_vpAll.size(); i++) - { - if(i >= std::size(pChecksum->m_aComponentsChecksum)) - { - break; - } - int Size = m_vpAll[i]->Sizeof(); - pChecksum->m_aComponentsChecksum[i] = Size; - } - - m_Menus.FinishLoading(); - log_trace("gameclient", "initialization finished after %.2fms", (time_get() - OnInitStart) * 1000.0f / (float)time_freq()); -} - -void CGameClient::OnUpdate() -{ - HandleLanguageChanged(); - - CUIElementBase::Init(Ui()); // update static pointer because game and editor use separate UI - - // handle mouse movement - float x = 0.0f, y = 0.0f; - IInput::ECursorType CursorType = Input()->CursorRelative(&x, &y); - if(CursorType != IInput::CURSOR_NONE) - { - for(auto &pComponent : m_vpInput) - { - if(pComponent->OnCursorMove(x, y, CursorType)) - break; - } - } - - // handle touch events - const std::vector &vTouchFingerStates = Input()->TouchFingerStates(); - bool TouchHandled = false; - for(auto &pComponent : m_vpInput) - { - if(TouchHandled) - { - // Also update inactive components so they can handle touch fingers being released. - pComponent->OnTouchState({}); - } - else if(pComponent->OnTouchState(vTouchFingerStates)) - { - Input()->ClearTouchDeltas(); - TouchHandled = true; - } - } - - // handle key presses - Input()->ConsumeEvents([&](const IInput::CEvent &Event) { - for(auto &pComponent : m_vpInput) - { - // Events with flag `FLAG_RELEASE` must always be forwarded to all components so keys being - // released can be handled in all components also after some components have been disabled. - if(pComponent->OnInput(Event) && (Event.m_Flags & ~IInput::FLAG_RELEASE) != 0) - break; - } - }); - - if(g_Config.m_ClSubTickAiming && m_Binds.m_MouseOnAction) - { - m_Controls.m_aMousePosOnAction[g_Config.m_ClDummy] = m_Controls.m_aMousePos[g_Config.m_ClDummy]; - m_Binds.m_MouseOnAction = false; - } -} - -void CGameClient::OnDummySwap() -{ - if(g_Config.m_ClDummyResetOnSwitch) - { - int PlayerOrDummy = (g_Config.m_ClDummyResetOnSwitch == 2) ? g_Config.m_ClDummy : (!g_Config.m_ClDummy); - m_Controls.ResetInput(PlayerOrDummy); - m_Controls.m_aInputData[PlayerOrDummy].m_Hook = 0; - } - int tmp = m_DummyInput.m_Fire; - m_DummyInput = m_Controls.m_aInputData[!g_Config.m_ClDummy]; - m_Controls.m_aInputData[g_Config.m_ClDummy].m_Fire = tmp; - m_IsDummySwapping = 1; -} - -int CGameClient::OnSnapInput(int *pData, bool Dummy, bool Force) -{ - if(!Dummy) - { - return m_Controls.SnapInput(pData); - } - - if(!g_Config.m_ClDummyHammer) - { - if(m_DummyFire != 0) - { - m_DummyInput.m_Fire = (m_HammerInput.m_Fire + 1) & ~1; - m_DummyFire = 0; - } - - if(!Force && (!m_DummyInput.m_Direction && !m_DummyInput.m_Jump && !m_DummyInput.m_Hook)) - { - return 0; - } - - mem_copy(pData, &m_DummyInput, sizeof(m_DummyInput)); - return sizeof(m_DummyInput); - } - else - { - if(m_DummyFire % 25 != 0) - { - m_DummyFire++; - return 0; - } - m_DummyFire++; - - m_HammerInput.m_Fire = (m_HammerInput.m_Fire + 1) | 1; - m_HammerInput.m_WantedWeapon = WEAPON_HAMMER + 1; - if(!g_Config.m_ClDummyRestoreWeapon) - { - m_DummyInput.m_WantedWeapon = WEAPON_HAMMER + 1; - } - - vec2 MainPos = m_LocalCharacterPos; - vec2 DummyPos = m_aClients[m_aLocalIds[!g_Config.m_ClDummy]].m_Predicted.m_Pos; - vec2 Dir = MainPos - DummyPos; - m_HammerInput.m_TargetX = (int)(Dir.x); - m_HammerInput.m_TargetY = (int)(Dir.y); - - mem_copy(pData, &m_HammerInput, sizeof(m_HammerInput)); - return sizeof(m_HammerInput); - } -} - -void CGameClient::OnConnected() -{ - const char *pConnectCaption = DemoPlayer()->IsPlaying() ? Localize("Preparing demo playback") : Localize("Connected"); - const char *pLoadMapContent = Localize("Initializing map logic"); - // render loading before skip is calculated - m_Menus.RenderLoading(pConnectCaption, pLoadMapContent, 0); - m_Layers.Init(Kernel()->RequestInterface(), false); - m_Collision.Init(Layers()); - m_GameWorld.m_Core.InitSwitchers(m_Collision.m_HighestSwitchNumber); - m_RaceHelper.Init(this); - - // render loading before going through all components - m_Menus.RenderLoading(pConnectCaption, pLoadMapContent, 0); - for(auto &pComponent : m_vpAll) - { - pComponent->OnMapLoad(); - pComponent->OnReset(); - } - - Client()->SetLoadingStateDetail(IClient::LOADING_STATE_DETAIL_GETTING_READY); - m_Menus.RenderLoading(pConnectCaption, Localize("Sending initial client info"), 0); - - // send the initial info - SendInfo(true); - // we should keep this in for now, because otherwise you can't spectate - // people at start as the other info 64 packet is only sent after the first - // snap - Client()->Rcon("crashmeplx"); - - ConfigManager()->ResetGameSettings(); - LoadMapSettings(); - - if(Client()->State() != IClient::STATE_DEMOPLAYBACK && g_Config.m_ClAutoDemoOnConnect) - Client()->DemoRecorder_HandleAutoStart(); -} - -void CGameClient::OnReset() -{ - InvalidateSnapshot(); - - m_EditorMovementDelay = 5; - - m_PredictedTick = -1; - std::fill(std::begin(m_aLastNewPredictedTick), std::end(m_aLastNewPredictedTick), -1); - - m_LastRoundStartTick = -1; - m_LastRaceTick = -1; - m_LastFlagCarrierRed = -4; - m_LastFlagCarrierBlue = -4; - - std::fill(std::begin(m_aCheckInfo), std::end(m_aCheckInfo), -1); - - // m_aDDNetVersionStr is initialized once in OnInit - - std::fill(std::begin(m_aLastPos), std::end(m_aLastPos), vec2(0.0f, 0.0f)); - std::fill(std::begin(m_aLastActive), std::end(m_aLastActive), false); - - m_GameOver = false; - m_GamePaused = false; - m_PrevLocalId = -1; - - m_SuppressEvents = false; - m_NewTick = false; - m_NewPredictedTick = false; - - m_aFlagDropTick[TEAM_RED] = 0; - m_aFlagDropTick[TEAM_BLUE] = 0; - - m_ServerMode = SERVERMODE_PURE; - mem_zero(&m_GameInfo, sizeof(m_GameInfo)); - - m_DemoSpecId = SPEC_FOLLOW; - m_LocalCharacterPos = vec2(0.0f, 0.0f); - - m_PredictedPrevChar.Reset(); - m_PredictedChar.Reset(); - - // m_Snap was cleared in InvalidateSnapshot - - std::fill(std::begin(m_aLocalTuneZone), std::end(m_aLocalTuneZone), -1); - std::fill(std::begin(m_aReceivedTuning), std::end(m_aReceivedTuning), false); - std::fill(std::begin(m_aExpectingTuningForZone), std::end(m_aExpectingTuningForZone), -1); - std::fill(std::begin(m_aExpectingTuningSince), std::end(m_aExpectingTuningSince), 0); - std::fill(std::begin(m_aTuning), std::end(m_aTuning), CTuningParams()); - - for(auto &Client : m_aClients) - Client.Reset(); - - for(auto &Stats : m_aStats) - Stats.Reset(); - - m_NextChangeInfo = 0; - std::fill(std::begin(m_aLocalIds), std::end(m_aLocalIds), -1); - m_DummyInput = {}; - m_HammerInput = {}; - m_DummyFire = 0; - m_ReceivedDDNetPlayer = false; - - m_Teams.Reset(); - m_GameWorld.Clear(); - m_GameWorld.m_WorldConfig.m_InfiniteAmmo = true; - m_PredictedWorld.CopyWorld(&m_GameWorld); - m_PrevPredictedWorld.CopyWorld(&m_PredictedWorld); - - m_vSnapEntities.clear(); - - std::fill(std::begin(m_aDDRaceMsgSent), std::end(m_aDDRaceMsgSent), false); - std::fill(std::begin(m_aShowOthers), std::end(m_aShowOthers), SHOW_OTHERS_NOT_SET); - std::fill(std::begin(m_aLastUpdateTick), std::end(m_aLastUpdateTick), 0); - - m_PredictedDummyId = -1; - m_IsDummySwapping = false; - m_CharOrder.Reset(); - std::fill(std::begin(m_aSwitchStateTeam), std::end(m_aSwitchStateTeam), -1); - - // m_aTuningList is reset in LoadMapSettings - - m_LastShowDistanceZoom = 0.0f; - m_LastZoom = 0.0f; - m_LastScreenAspect = 0.0f; - m_LastDeadzone = 0.0f; - m_LastFollowFactor = 0.0f; - m_LastDummyConnected = false; - - m_MultiViewPersonalZoom = 0.0f; - m_MultiViewActivated = false; - m_MultiView.m_IsInit = false; - - m_CursorInfo.m_CursorOwnerId = -1; - m_CursorInfo.m_NumSamples = 0; - - for(auto &pComponent : m_vpAll) - pComponent->OnReset(); - - Editor()->ResetMentions(); - Editor()->ResetIngameMoved(); - - Collision()->Unload(); - Layers()->Unload(); -} - -void CGameClient::UpdatePositions() -{ - // local character position - if(g_Config.m_ClPredict && Client()->State() != IClient::STATE_DEMOPLAYBACK) - { - if(!AntiPingPlayers()) - { - if(!m_Snap.m_pLocalCharacter || (m_Snap.m_pGameInfoObj && m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_GAMEOVER)) - { - // don't use predicted - } - else - m_LocalCharacterPos = mix(m_PredictedPrevChar.m_Pos, m_PredictedChar.m_Pos, Client()->PredIntraGameTick(g_Config.m_ClDummy)); - } - else - { - if(!(m_Snap.m_pGameInfoObj && m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_GAMEOVER)) - { - if(m_Snap.m_pLocalCharacter) - m_LocalCharacterPos = mix(m_PredictedPrevChar.m_Pos, m_PredictedChar.m_Pos, Client()->PredIntraGameTick(g_Config.m_ClDummy)); - } - // else - // m_LocalCharacterPos = mix(m_PredictedPrevChar.m_Pos, m_PredictedChar.m_Pos, Client()->PredIntraGameTick(g_Config.m_ClDummy)); - } - } - else if(m_Snap.m_pLocalCharacter && m_Snap.m_pLocalPrevCharacter) - { - m_LocalCharacterPos = mix( - vec2(m_Snap.m_pLocalPrevCharacter->m_X, m_Snap.m_pLocalPrevCharacter->m_Y), - vec2(m_Snap.m_pLocalCharacter->m_X, m_Snap.m_pLocalCharacter->m_Y), Client()->IntraGameTick(g_Config.m_ClDummy)); - } - - // spectator position - if(m_Snap.m_SpecInfo.m_Active) - { - if(m_MultiViewActivated) - { - HandleMultiView(); - } - else if(Client()->State() == IClient::STATE_DEMOPLAYBACK && m_DemoSpecId != SPEC_FOLLOW && m_Snap.m_SpecInfo.m_SpectatorId != SPEC_FREEVIEW) - { - m_Snap.m_SpecInfo.m_Position = mix( - vec2(m_Snap.m_aCharacters[m_Snap.m_SpecInfo.m_SpectatorId].m_Prev.m_X, m_Snap.m_aCharacters[m_Snap.m_SpecInfo.m_SpectatorId].m_Prev.m_Y), - vec2(m_Snap.m_aCharacters[m_Snap.m_SpecInfo.m_SpectatorId].m_Cur.m_X, m_Snap.m_aCharacters[m_Snap.m_SpecInfo.m_SpectatorId].m_Cur.m_Y), - Client()->IntraGameTick(g_Config.m_ClDummy)); - m_Snap.m_SpecInfo.m_UsePosition = true; - } - else if(m_Snap.m_pSpectatorInfo && ((Client()->State() == IClient::STATE_DEMOPLAYBACK && m_DemoSpecId == SPEC_FOLLOW) || (Client()->State() != IClient::STATE_DEMOPLAYBACK && m_Snap.m_SpecInfo.m_SpectatorId != SPEC_FREEVIEW))) - { - if(m_Snap.m_pPrevSpectatorInfo && m_Snap.m_pPrevSpectatorInfo->m_SpectatorId == m_Snap.m_pSpectatorInfo->m_SpectatorId) - m_Snap.m_SpecInfo.m_Position = mix(vec2(m_Snap.m_pPrevSpectatorInfo->m_X, m_Snap.m_pPrevSpectatorInfo->m_Y), - vec2(m_Snap.m_pSpectatorInfo->m_X, m_Snap.m_pSpectatorInfo->m_Y), Client()->IntraGameTick(g_Config.m_ClDummy)); - else - m_Snap.m_SpecInfo.m_Position = vec2(m_Snap.m_pSpectatorInfo->m_X, m_Snap.m_pSpectatorInfo->m_Y); - m_Snap.m_SpecInfo.m_UsePosition = true; - } - } - - if(!m_MultiViewActivated && m_MultiView.m_IsInit) - ResetMultiView(); - - UpdateRenderedCharacters(); -} - -void CGameClient::OnRender() -{ - // check if multi view got activated - if(!m_MultiView.m_IsInit && m_MultiViewActivated) - { - int TeamId = 0; - if(m_Snap.m_SpecInfo.m_SpectatorId >= 0) - TeamId = m_Teams.Team(m_Snap.m_SpecInfo.m_SpectatorId); - - if(TeamId > MAX_CLIENTS || TeamId < 0) - TeamId = 0; - - if(!InitMultiView(TeamId)) - { - dbg_msg("MultiView", "No players found to spectate"); - ResetMultiView(); - } - } - - // update the local character and spectate position - UpdatePositions(); - - // display warnings - if(m_Menus.CanDisplayWarning()) - { - std::optional Warning = Graphics()->CurrentWarning(); - if(!Warning.has_value()) - { - Warning = Client()->CurrentWarning(); - } - if(Warning.has_value()) - { - const SWarning TheWarning = Warning.value(); - m_Menus.PopupWarning(TheWarning.m_aWarningTitle[0] == '\0' ? Localize("Warning") : TheWarning.m_aWarningTitle, TheWarning.m_aWarningMsg, Localize("Ok"), TheWarning.m_AutoHide ? 10s : 0s); - } - } - - // update camera data prior to CControls::OnRender to allow CControls::m_aTargetPos to compensate using camera data - m_Camera.UpdateCamera(); - - UpdateSpectatorCursor(); - - // render all systems - for(auto &pComponent : m_vpAll) - pComponent->OnRender(); - - // clear all events/input for this frame - Input()->Clear(); - - CLineInput::RenderCandidates(); - - const bool WasNewTick = m_NewTick; - - // clear new tick flags - m_NewTick = false; - m_NewPredictedTick = false; - - if(g_Config.m_ClDummy && !Client()->DummyConnected()) - g_Config.m_ClDummy = 0; - - // resend player and dummy info if it was filtered by server - if(Client()->State() == IClient::STATE_ONLINE && !m_Menus.IsActive() && WasNewTick) - { - if(m_aCheckInfo[0] == 0) - { - if(m_pClient->IsSixup()) - { - if(!GotWantedSkin7(false)) - SendSkinChange7(false); - else - m_aCheckInfo[0] = -1; - } - else - { - if( - str_comp(m_aClients[m_aLocalIds[0]].m_aName, Client()->PlayerName()) || - str_comp(m_aClients[m_aLocalIds[0]].m_aClan, g_Config.m_PlayerClan) || - m_aClients[m_aLocalIds[0]].m_Country != g_Config.m_PlayerCountry || - str_comp(m_aClients[m_aLocalIds[0]].m_aSkinName, g_Config.m_ClPlayerSkin) || - m_aClients[m_aLocalIds[0]].m_UseCustomColor != g_Config.m_ClPlayerUseCustomColor || - m_aClients[m_aLocalIds[0]].m_ColorBody != (int)g_Config.m_ClPlayerColorBody || - m_aClients[m_aLocalIds[0]].m_ColorFeet != (int)g_Config.m_ClPlayerColorFeet) - SendInfo(false); - else - m_aCheckInfo[0] = -1; - } - } - - if(m_aCheckInfo[0] > 0) - { - m_aCheckInfo[0] -= minimum(Client()->GameTick(0) - Client()->PrevGameTick(0), m_aCheckInfo[0]); - } - - if(Client()->DummyConnected()) - { - if(m_aCheckInfo[1] == 0) - { - if(m_pClient->IsSixup()) - { - if(!GotWantedSkin7(true)) - SendSkinChange7(true); - else - m_aCheckInfo[1] = -1; - } - else - { - if( - str_comp(m_aClients[m_aLocalIds[1]].m_aName, Client()->DummyName()) || - str_comp(m_aClients[m_aLocalIds[1]].m_aClan, g_Config.m_ClDummyClan) || - m_aClients[m_aLocalIds[1]].m_Country != g_Config.m_ClDummyCountry || - str_comp(m_aClients[m_aLocalIds[1]].m_aSkinName, g_Config.m_ClDummySkin) || - m_aClients[m_aLocalIds[1]].m_UseCustomColor != g_Config.m_ClDummyUseCustomColor || - m_aClients[m_aLocalIds[1]].m_ColorBody != (int)g_Config.m_ClDummyColorBody || - m_aClients[m_aLocalIds[1]].m_ColorFeet != (int)g_Config.m_ClDummyColorFeet) - SendDummyInfo(false); - else - m_aCheckInfo[1] = -1; - } - } - - if(m_aCheckInfo[1] > 0) - { - m_aCheckInfo[1] -= minimum(Client()->GameTick(1) - Client()->PrevGameTick(1), m_aCheckInfo[1]); - } - } - } -} - -void CGameClient::OnDummyDisconnect() -{ - m_aDDRaceMsgSent[1] = false; - m_aShowOthers[1] = SHOW_OTHERS_NOT_SET; - m_aLastNewPredictedTick[1] = -1; - m_PredictedDummyId = -1; -} - -int CGameClient::LastRaceTick() const -{ - return m_LastRaceTick; -} - -int CGameClient::CurrentRaceTime() const -{ - if(m_LastRaceTick < 0) - { - return 0; - } - return (Client()->GameTick(g_Config.m_ClDummy) - m_LastRaceTick) / Client()->GameTickSpeed(); -} - -bool CGameClient::Predict() const -{ - if(!g_Config.m_ClPredict) - return false; - - if(m_Snap.m_pGameInfoObj) - { - if(m_Snap.m_pGameInfoObj->m_GameStateFlags & (GAMESTATEFLAG_GAMEOVER | GAMESTATEFLAG_PAUSED)) - { - return false; - } - } - - if(Client()->State() == IClient::STATE_DEMOPLAYBACK) - return false; - - return !m_Snap.m_SpecInfo.m_Active && m_Snap.m_pLocalCharacter; -} - -ColorRGBA CGameClient::GetDDTeamColor(int DDTeam, float Lightness) const -{ - // Use golden angle to generate unique colors with distinct adjacent colors. - // The first DDTeam (team 1) gets angle 0°, i.e. red hue. - const float Hue = std::fmod((DDTeam - 1) * (137.50776f / 360.0f), 1.0f); - return color_cast(ColorHSLA(Hue, 1.0f, Lightness)); -} - -void CGameClient::FormatClientId(int ClientId, char (&aClientId)[16], EClientIdFormat Format) const -{ - if(Format == EClientIdFormat::NO_INDENT) - { - str_format(aClientId, sizeof(aClientId), "%d", ClientId); - } - else - { - const int HighestClientId = Format == EClientIdFormat::INDENT_AUTO ? m_Snap.m_HighestClientId : 64; - const char *pFigureSpace = " "; - char aNumber[8]; - str_format(aNumber, sizeof(aNumber), "%d", ClientId); - aClientId[0] = '\0'; - if(ClientId < 100 && HighestClientId >= 100) - { - str_append(aClientId, pFigureSpace); - } - if(ClientId < 10 && HighestClientId >= 10) - { - str_append(aClientId, pFigureSpace); - } - str_append(aClientId, aNumber); - } - str_append(aClientId, ": "); -} - -void CGameClient::OnRelease() -{ - // release all systems - for(auto &pComponent : m_vpAll) - pComponent->OnRelease(); -} - -void CGameClient::OnMessage(int MsgId, CUnpacker *pUnpacker, int Conn, bool Dummy) -{ - // special messages - static_assert((int)NETMSGTYPE_SV_TUNEPARAMS == (int)protocol7::NETMSGTYPE_SV_TUNEPARAMS, "0.6 and 0.7 tune message id do not match"); - if(MsgId == NETMSGTYPE_SV_TUNEPARAMS) - { - // unpack the new tuning - CTuningParams NewTuning; - int *pParams = (int *)&NewTuning; - for(unsigned i = 0; i < sizeof(CTuningParams) / sizeof(int); i++) - { - // 31 is the magic number index of laser_damage - // which was removed in 0.7 - // also in 0.6 it is unsed so we just set it to 0 - int value = (Client()->IsSixup() && i == 30) ? 0 : pUnpacker->GetInt(); - - // check for unpacking errors - if(pUnpacker->Error()) - break; - - pParams[i] = value; - } - - m_ServerMode = SERVERMODE_PURE; - - m_aReceivedTuning[Conn] = true; - // apply new tuning - m_aTuning[Conn] = NewTuning; - return; - } - - void *pRawMsg = TranslateGameMsg(&MsgId, pUnpacker, Conn); - - if(!pRawMsg) - { - // the 0.7 version of this error message is printed on translation - // in sixup/translate_game.cpp - if(!Client()->IsSixup()) - { - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "dropped weird message '%s' (%d), failed on '%s'", m_NetObjHandler.GetMsgName(MsgId), MsgId, m_NetObjHandler.FailedMsgOn()); - Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client", aBuf); - } - return; - } - - if(Dummy) - { - if(MsgId == NETMSGTYPE_SV_CHAT && m_aLocalIds[0] >= 0 && m_aLocalIds[1] >= 0) - { - CNetMsg_Sv_Chat *pMsg = (CNetMsg_Sv_Chat *)pRawMsg; - - if((pMsg->m_Team == 1 && (m_aClients[m_aLocalIds[0]].m_Team != m_aClients[m_aLocalIds[1]].m_Team || m_Teams.Team(m_aLocalIds[0]) != m_Teams.Team(m_aLocalIds[1]))) || pMsg->m_Team > 1) - { - m_Chat.OnMessage(MsgId, pRawMsg); - } - } - return; // no need of all that stuff for the dummy - } - - // TODO: this should be done smarter - for(auto &pComponent : m_vpAll) - pComponent->OnMessage(MsgId, pRawMsg); - - if(MsgId == NETMSGTYPE_SV_READYTOENTER) - { - Client()->EnterGame(Conn); - } - else if(MsgId == NETMSGTYPE_SV_EMOTICON) - { - CNetMsg_Sv_Emoticon *pMsg = (CNetMsg_Sv_Emoticon *)pRawMsg; - - // apply - m_aClients[pMsg->m_ClientId].m_Emoticon = pMsg->m_Emoticon; - m_aClients[pMsg->m_ClientId].m_EmoticonStartTick = Client()->GameTick(Conn); - m_aClients[pMsg->m_ClientId].m_EmoticonStartFraction = Client()->IntraGameTickSincePrev(Conn); - } - else if(MsgId == NETMSGTYPE_SV_SOUNDGLOBAL) - { - if(m_SuppressEvents) - return; - - // don't enqueue pseudo-global sounds from demos (created by PlayAndRecord) - CNetMsg_Sv_SoundGlobal *pMsg = (CNetMsg_Sv_SoundGlobal *)pRawMsg; - if(pMsg->m_SoundId == SOUND_CTF_DROP || pMsg->m_SoundId == SOUND_CTF_RETURN || - pMsg->m_SoundId == SOUND_CTF_CAPTURE || pMsg->m_SoundId == SOUND_CTF_GRAB_EN || - pMsg->m_SoundId == SOUND_CTF_GRAB_PL) - { - if(g_Config.m_SndGame) - m_Sounds.Enqueue(CSounds::CHN_GLOBAL, pMsg->m_SoundId); - } - else - { - if(g_Config.m_SndGame) - m_Sounds.Play(CSounds::CHN_GLOBAL, pMsg->m_SoundId, 1.0f); - } - } - else if(MsgId == NETMSGTYPE_SV_TEAMSSTATE || MsgId == NETMSGTYPE_SV_TEAMSSTATELEGACY) - { - unsigned int i; - - for(i = 0; i < MAX_CLIENTS; i++) - { - const int Team = pUnpacker->GetInt(); - if(!pUnpacker->Error() && Team >= TEAM_FLOCK && Team <= TEAM_SUPER) - m_Teams.Team(i, Team); - else - { - m_Teams.Team(i, 0); - break; - } - } - - if(i <= 16) - m_Teams.m_IsDDRace16 = true; - - m_Ghost.m_AllowRestart = true; - m_RaceDemo.m_AllowRestart = true; - } - else if(MsgId == NETMSGTYPE_SV_KILLMSG) - { - CNetMsg_Sv_KillMsg *pMsg = (CNetMsg_Sv_KillMsg *)pRawMsg; - // reset character prediction - if(!(m_GameWorld.m_WorldConfig.m_IsFNG && pMsg->m_Weapon == WEAPON_LASER)) - { - m_CharOrder.GiveWeak(pMsg->m_Victim); - if(CCharacter *pChar = m_GameWorld.GetCharacterById(pMsg->m_Victim)) - pChar->ResetPrediction(); - m_GameWorld.ReleaseHooked(pMsg->m_Victim); - } - - // if we are spectating a static id set (team 0) and somebody killed, and its not a guy in solo, we remove him from the list - // never remove players from the list if it is a pvp server - if(IsMultiViewIdSet() && m_MultiViewTeam == 0 && m_aMultiViewId[pMsg->m_Victim] && !m_aClients[pMsg->m_Victim].m_Spec && !m_MultiView.m_Solo && !m_GameInfo.m_Pvp) - { - m_aMultiViewId[pMsg->m_Victim] = false; - - // if everyone of a team killed, we have no ids to spectate anymore, so we disable multi view - if(!IsMultiViewIdSet()) - ResetMultiView(); - else - { - // the "main" tee killed, search a new one - if(m_Snap.m_SpecInfo.m_SpectatorId == pMsg->m_Victim) - { - int NewClientId = FindFirstMultiViewId(); - if(NewClientId < MAX_CLIENTS && NewClientId >= 0) - { - CleanMultiViewId(NewClientId); - m_aMultiViewId[NewClientId] = true; - m_Spectator.Spectate(NewClientId); - } - } - } - } - } - else if(MsgId == NETMSGTYPE_SV_KILLMSGTEAM) - { - CNetMsg_Sv_KillMsgTeam *pMsg = (CNetMsg_Sv_KillMsgTeam *)pRawMsg; - - // reset prediction - std::vector> vStrongWeakSorted; - for(int i = 0; i < MAX_CLIENTS; i++) - { - if(m_Teams.Team(i) == pMsg->m_Team) - { - if(CCharacter *pChar = m_GameWorld.GetCharacterById(i)) - { - pChar->ResetPrediction(); - vStrongWeakSorted.emplace_back(i, pMsg->m_First == i ? MAX_CLIENTS : pChar ? pChar->GetStrongWeakId() : 0); - } - m_GameWorld.ReleaseHooked(i); - } - } - std::stable_sort(vStrongWeakSorted.begin(), vStrongWeakSorted.end(), [](auto &Left, auto &Right) { return Left.second > Right.second; }); - for(auto Id : vStrongWeakSorted) - { - m_CharOrder.GiveWeak(Id.first); - } - } - else if(MsgId == NETMSGTYPE_SV_CHANGEINFOCOOLDOWN) - { - CNetMsg_Sv_ChangeInfoCooldown *pMsg = (CNetMsg_Sv_ChangeInfoCooldown *)pRawMsg; - m_NextChangeInfo = pMsg->m_WaitUntil; - } - else if(MsgId == NETMSGTYPE_SV_MAPSOUNDGLOBAL) - { - if(m_SuppressEvents) - return; - - if(!g_Config.m_SndGame) - return; - - CNetMsg_Sv_MapSoundGlobal *pMsg = (CNetMsg_Sv_MapSoundGlobal *)pRawMsg; - m_MapSounds.Play(CSounds::CHN_GLOBAL, pMsg->m_SoundId); - } -} - -void CGameClient::OnStateChange(int NewState, int OldState) -{ - // reset everything when not already connected (to keep gathered stuff) - if(NewState < IClient::STATE_ONLINE) - OnReset(); - - // then change the state - for(auto &pComponent : m_vpAll) - pComponent->OnStateChange(NewState, OldState); -} - -void CGameClient::OnShutdown() -{ - for(auto &pComponent : m_vpAll) - pComponent->OnShutdown(); -} - -void CGameClient::OnEnterGame() -{ -} - -void CGameClient::OnGameOver() -{ - if(Client()->State() != IClient::STATE_DEMOPLAYBACK && g_Config.m_ClEditor == 0) - Client()->AutoScreenshot_Start(); -} - -void CGameClient::OnStartGame() -{ - if(Client()->State() != IClient::STATE_DEMOPLAYBACK && !g_Config.m_ClAutoDemoOnConnect) - Client()->DemoRecorder_HandleAutoStart(); - m_Statboard.OnReset(); -} - -void CGameClient::OnStartRound() -{ - // In GamePaused or GameOver state RoundStartTick is updated on each tick - // hence no need to reset stats until player leaves GameOver - // and it would be a mistake to reset stats after or during the pause - m_Statboard.OnReset(); - - // Restart automatic race demo recording - m_RaceDemo.OnReset(); -} - -void CGameClient::OnFlagGrab(int TeamId) -{ - if(TeamId == TEAM_RED) - m_aStats[m_Snap.m_pGameDataObj->m_FlagCarrierRed].m_FlagGrabs++; - else - m_aStats[m_Snap.m_pGameDataObj->m_FlagCarrierBlue].m_FlagGrabs++; -} - -void CGameClient::OnWindowResize() -{ - for(auto &pComponent : m_vpAll) - pComponent->OnWindowResize(); - - Ui()->OnWindowResize(); -} - -void CGameClient::OnLanguageChange() -{ - // The actual language change is delayed because it - // might require clearing the text render font atlas, - // which would invalidate text that is currently drawn. - m_LanguageChanged = true; -} - -void CGameClient::HandleLanguageChanged() -{ - if(!m_LanguageChanged) - return; - m_LanguageChanged = false; - - g_Localization.Load(g_Config.m_ClLanguagefile, Storage(), Console()); - TextRender()->SetFontLanguageVariant(g_Config.m_ClLanguagefile); - - // Clear all text containers - Client()->OnWindowResize(); -} - -void CGameClient::RenderShutdownMessage() -{ - const char *pMessage = nullptr; - if(Client()->State() == IClient::STATE_QUITTING) - pMessage = Localize("Quitting. Please wait…"); - else if(Client()->State() == IClient::STATE_RESTARTING) - pMessage = Localize("Restarting. Please wait…"); - else - dbg_assert(false, "Invalid client state for quitting message"); - - // This function only gets called after the render loop has already terminated, so we have to call Swap manually. - Graphics()->Clear(0.0f, 0.0f, 0.0f); - Ui()->MapScreen(); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - Ui()->DoLabel(Ui()->Screen(), pMessage, 16.0f, TEXTALIGN_MC); - Graphics()->Swap(); - Graphics()->Clear(0.0f, 0.0f, 0.0f); -} - -void CGameClient::OnRconType(bool UsernameReq) -{ - m_GameConsole.RequireUsername(UsernameReq); -} - -void CGameClient::OnRconLine(const char *pLine) -{ - m_GameConsole.PrintLine(CGameConsole::CONSOLETYPE_REMOTE, pLine); -} - -void CGameClient::ProcessEvents() -{ - if(m_SuppressEvents) - return; - - int SnapType = IClient::SNAP_CURRENT; - int Num = Client()->SnapNumItems(SnapType); - for(int Index = 0; Index < Num; Index++) - { - const IClient::CSnapItem Item = Client()->SnapGetItem(SnapType, Index); - - // We don't have enough info about us, others, to know a correct alpha value. - float Alpha = 1.0f; - - if(Item.m_Type == NETEVENTTYPE_DAMAGEIND) - { - const CNetEvent_DamageInd *pEvent = (const CNetEvent_DamageInd *)Item.m_pData; - m_Effects.DamageIndicator(vec2(pEvent->m_X, pEvent->m_Y), direction(pEvent->m_Angle / 256.0f), Alpha); - } - else if(Item.m_Type == NETEVENTTYPE_EXPLOSION) - { - const CNetEvent_Explosion *pEvent = (const CNetEvent_Explosion *)Item.m_pData; - m_Effects.Explosion(vec2(pEvent->m_X, pEvent->m_Y), Alpha); - } - else if(Item.m_Type == NETEVENTTYPE_HAMMERHIT) - { - const CNetEvent_HammerHit *pEvent = (const CNetEvent_HammerHit *)Item.m_pData; - m_Effects.HammerHit(vec2(pEvent->m_X, pEvent->m_Y), Alpha); - } - else if(Item.m_Type == NETEVENTTYPE_BIRTHDAY) - { - const CNetEvent_Birthday *pEvent = (const CNetEvent_Birthday *)Item.m_pData; - m_Effects.Confetti(vec2(pEvent->m_X, pEvent->m_Y), Alpha); - } - else if(Item.m_Type == NETEVENTTYPE_FINISH) - { - const CNetEvent_Finish *pEvent = (const CNetEvent_Finish *)Item.m_pData; - m_Effects.Confetti(vec2(pEvent->m_X, pEvent->m_Y), Alpha); - } - else if(Item.m_Type == NETEVENTTYPE_SPAWN) - { - const CNetEvent_Spawn *pEvent = (const CNetEvent_Spawn *)Item.m_pData; - m_Effects.PlayerSpawn(vec2(pEvent->m_X, pEvent->m_Y), Alpha); - } - else if(Item.m_Type == NETEVENTTYPE_DEATH) - { - const CNetEvent_Death *pEvent = (const CNetEvent_Death *)Item.m_pData; - m_Effects.PlayerDeath(vec2(pEvent->m_X, pEvent->m_Y), pEvent->m_ClientId, Alpha); - } - else if(Item.m_Type == NETEVENTTYPE_SOUNDWORLD) - { - const CNetEvent_SoundWorld *pEvent = (const CNetEvent_SoundWorld *)Item.m_pData; - if(!Config()->m_SndGame) - continue; - - if(m_GameInfo.m_RaceSounds && ((pEvent->m_SoundId == SOUND_GUN_FIRE && !g_Config.m_SndGun) || (pEvent->m_SoundId == SOUND_PLAYER_PAIN_LONG && !g_Config.m_SndLongPain))) - continue; - - m_Sounds.PlayAt(CSounds::CHN_WORLD, pEvent->m_SoundId, 1.0f, vec2(pEvent->m_X, pEvent->m_Y)); - } - else if(Item.m_Type == NETEVENTTYPE_MAPSOUNDWORLD) - { - CNetEvent_MapSoundWorld *pEvent = (CNetEvent_MapSoundWorld *)Item.m_pData; - if(!Config()->m_SndGame) - continue; - - m_MapSounds.PlayAt(CSounds::CHN_WORLD, pEvent->m_SoundId, vec2(pEvent->m_X, pEvent->m_Y)); - } - } -} - -static CGameInfo GetGameInfo(const CNetObj_GameInfoEx *pInfoEx, int InfoExSize, const CServerInfo *pFallbackServerInfo) -{ - int Version = -1; - if(InfoExSize >= 12) - { - Version = pInfoEx->m_Version; - } - else if(InfoExSize >= 8) - { - Version = minimum(pInfoEx->m_Version, 4); - } - else if(InfoExSize >= 4) - { - Version = 0; - } - int Flags = 0; - if(Version >= 0) - { - Flags = pInfoEx->m_Flags; - } - int Flags2 = 0; - if(Version >= 5) - { - Flags2 = pInfoEx->m_Flags2; - } - bool Race; - bool FastCap; - bool FNG; - bool DDRace; - bool DDNet; - bool BlockWorlds; - bool City; - bool Vanilla; - bool Plus; - bool FDDrace; - if(Version < 1) - { - const char *pGameType = pFallbackServerInfo->m_aGameType; - Race = str_find_nocase(pGameType, "race") || str_find_nocase(pGameType, "fastcap"); - FastCap = str_find_nocase(pGameType, "fastcap"); - FNG = str_find_nocase(pGameType, "fng"); - DDRace = str_find_nocase(pGameType, "ddrace") || str_find_nocase(pGameType, "mkrace"); - DDNet = str_find_nocase(pGameType, "ddracenet") || str_find_nocase(pGameType, "ddnet"); - BlockWorlds = str_startswith(pGameType, "bw ") || str_comp_nocase(pGameType, "bw") == 0; - City = str_find_nocase(pGameType, "city"); - Vanilla = str_comp(pGameType, "DM") == 0 || str_comp(pGameType, "TDM") == 0 || str_comp(pGameType, "CTF") == 0; - Plus = str_find(pGameType, "+"); - FDDrace = false; - } - else - { - Race = Flags & GAMEINFOFLAG_GAMETYPE_RACE; - FastCap = Flags & GAMEINFOFLAG_GAMETYPE_FASTCAP; - FNG = Flags & GAMEINFOFLAG_GAMETYPE_FNG; - DDRace = Flags & GAMEINFOFLAG_GAMETYPE_DDRACE; - DDNet = Flags & GAMEINFOFLAG_GAMETYPE_DDNET; - BlockWorlds = Flags & GAMEINFOFLAG_GAMETYPE_BLOCK_WORLDS; - Vanilla = Flags & GAMEINFOFLAG_GAMETYPE_VANILLA; - Plus = Flags & GAMEINFOFLAG_GAMETYPE_PLUS; - City = Version >= 5 && Flags2 & GAMEINFOFLAG2_GAMETYPE_CITY; - FDDrace = Version >= 6 && Flags2 & GAMEINFOFLAG2_GAMETYPE_FDDRACE; - - // Ensure invariants upheld by the server info parsing business. - DDRace = DDRace || DDNet || FDDrace; - Race = Race || FastCap || DDRace; - } - - CGameInfo Info; - Info.m_FlagStartsRace = FastCap; - Info.m_TimeScore = Race; - Info.m_UnlimitedAmmo = Race; - Info.m_DDRaceRecordMessage = DDRace && !DDNet; - Info.m_RaceRecordMessage = DDNet || (Race && !DDRace); - Info.m_RaceSounds = DDRace || FNG || BlockWorlds; - Info.m_AllowEyeWheel = DDRace || BlockWorlds || City || Plus; - Info.m_AllowHookColl = DDRace; - Info.m_AllowZoom = Race || BlockWorlds || City; - Info.m_BugDDRaceGhost = DDRace; - Info.m_BugDDRaceInput = DDRace; - Info.m_BugFNGLaserRange = FNG; - Info.m_BugVanillaBounce = Vanilla; - Info.m_PredictFNG = FNG; - Info.m_PredictDDRace = DDRace; - Info.m_PredictDDRaceTiles = DDRace && !BlockWorlds; - Info.m_PredictVanilla = Vanilla || FastCap; - Info.m_EntitiesDDNet = DDNet; - Info.m_EntitiesDDRace = DDRace; - Info.m_EntitiesRace = Race; - Info.m_EntitiesFNG = FNG; - Info.m_EntitiesVanilla = Vanilla; - Info.m_EntitiesBW = BlockWorlds; - Info.m_Race = Race; - Info.m_Pvp = !Race; - Info.m_DontMaskEntities = !DDNet; - Info.m_AllowXSkins = false; - Info.m_EntitiesFDDrace = FDDrace; - Info.m_HudHealthArmor = true; - Info.m_HudAmmo = true; - Info.m_HudDDRace = false; - Info.m_NoWeakHookAndBounce = false; - Info.m_NoSkinChangeForFrozen = false; - - if(Version >= 0) - { - Info.m_TimeScore = Flags & GAMEINFOFLAG_TIMESCORE; - } - if(Version >= 2) - { - Info.m_FlagStartsRace = Flags & GAMEINFOFLAG_FLAG_STARTS_RACE; - Info.m_UnlimitedAmmo = Flags & GAMEINFOFLAG_UNLIMITED_AMMO; - Info.m_DDRaceRecordMessage = Flags & GAMEINFOFLAG_DDRACE_RECORD_MESSAGE; - Info.m_RaceRecordMessage = Flags & GAMEINFOFLAG_RACE_RECORD_MESSAGE; - Info.m_AllowEyeWheel = Flags & GAMEINFOFLAG_ALLOW_EYE_WHEEL; - Info.m_AllowHookColl = Flags & GAMEINFOFLAG_ALLOW_HOOK_COLL; - Info.m_AllowZoom = Flags & GAMEINFOFLAG_ALLOW_ZOOM; - Info.m_BugDDRaceGhost = Flags & GAMEINFOFLAG_BUG_DDRACE_GHOST; - Info.m_BugDDRaceInput = Flags & GAMEINFOFLAG_BUG_DDRACE_INPUT; - Info.m_BugFNGLaserRange = Flags & GAMEINFOFLAG_BUG_FNG_LASER_RANGE; - Info.m_BugVanillaBounce = Flags & GAMEINFOFLAG_BUG_VANILLA_BOUNCE; - Info.m_PredictFNG = Flags & GAMEINFOFLAG_PREDICT_FNG; - Info.m_PredictDDRace = Flags & GAMEINFOFLAG_PREDICT_DDRACE; - Info.m_PredictDDRaceTiles = Flags & GAMEINFOFLAG_PREDICT_DDRACE_TILES; - Info.m_PredictVanilla = Flags & GAMEINFOFLAG_PREDICT_VANILLA; - Info.m_EntitiesDDNet = Flags & GAMEINFOFLAG_ENTITIES_DDNET; - Info.m_EntitiesDDRace = Flags & GAMEINFOFLAG_ENTITIES_DDRACE; - Info.m_EntitiesRace = Flags & GAMEINFOFLAG_ENTITIES_RACE; - Info.m_EntitiesFNG = Flags & GAMEINFOFLAG_ENTITIES_FNG; - Info.m_EntitiesVanilla = Flags & GAMEINFOFLAG_ENTITIES_VANILLA; - } - if(Version >= 3) - { - Info.m_Race = Flags & GAMEINFOFLAG_RACE; - Info.m_DontMaskEntities = Flags & GAMEINFOFLAG_DONT_MASK_ENTITIES; - } - if(Version >= 4) - { - Info.m_EntitiesBW = Flags & GAMEINFOFLAG_ENTITIES_BW; - } - if(Version >= 5) - { - Info.m_AllowXSkins = Flags2 & GAMEINFOFLAG2_ALLOW_X_SKINS; - } - if(Version >= 6) - { - Info.m_EntitiesFDDrace = Flags2 & GAMEINFOFLAG2_ENTITIES_FDDRACE; - } - if(Version >= 7) - { - Info.m_HudHealthArmor = Flags2 & GAMEINFOFLAG2_HUD_HEALTH_ARMOR; - Info.m_HudAmmo = Flags2 & GAMEINFOFLAG2_HUD_AMMO; - Info.m_HudDDRace = Flags2 & GAMEINFOFLAG2_HUD_DDRACE; - } - if(Version >= 8) - { - Info.m_NoWeakHookAndBounce = Flags2 & GAMEINFOFLAG2_NO_WEAK_HOOK; - } - if(Version >= 9) - { - Info.m_NoSkinChangeForFrozen = Flags2 & GAMEINFOFLAG2_NO_SKIN_CHANGE_FOR_FROZEN; - } - - return Info; -} - -void CGameClient::InvalidateSnapshot() -{ - // clear all pointers - mem_zero(&m_Snap, sizeof(m_Snap)); - m_Snap.m_SpecInfo.m_Zoom = 1.0f; - m_Snap.m_LocalClientId = -1; - SnapCollectEntities(); -} - -void CGameClient::OnNewSnapshot() -{ - auto &&Evolve = [this](CNetObj_Character *pCharacter, int Tick) { - CWorldCore TempWorld; - CCharacterCore TempCore = CCharacterCore(); - CTeamsCore TempTeams = CTeamsCore(); - TempCore.Init(&TempWorld, Collision(), &TempTeams); - TempCore.Read(pCharacter); - TempCore.m_ActiveWeapon = pCharacter->m_Weapon; - - while(pCharacter->m_Tick < Tick) - { - pCharacter->m_Tick++; - TempCore.Tick(false); - TempCore.Move(); - TempCore.Quantize(); - } - - TempCore.Write(pCharacter); - }; - - InvalidateSnapshot(); - - m_NewTick = true; - - ProcessEvents(); - -#ifdef CONF_DEBUG - if(g_Config.m_DbgStress) - { - if((Client()->GameTick(g_Config.m_ClDummy) % 100) == 0) - { - char aMessage[64]; - int MsgLen = rand() % (sizeof(aMessage) - 1); - for(int i = 0; i < MsgLen; i++) - aMessage[i] = (char)('a' + (rand() % ('z' - 'a'))); - aMessage[MsgLen] = 0; - - m_Chat.SendChat(rand() & 1, aMessage); - } - } -#endif - - CServerInfo ServerInfo; - Client()->GetServerInfo(&ServerInfo); - - bool FoundGameInfoEx = false; - bool GotSwitchStateTeam = false; - m_aSwitchStateTeam[g_Config.m_ClDummy] = -1; - - for(auto &Client : m_aClients) - { - Client.m_SpecCharPresent = false; - } - - // go through all the items in the snapshot and gather the info we want - { - m_Snap.m_aTeamSize[TEAM_RED] = m_Snap.m_aTeamSize[TEAM_BLUE] = 0; - - int Num = Client()->SnapNumItems(IClient::SNAP_CURRENT); - for(int i = 0; i < Num; i++) - { - const IClient::CSnapItem Item = Client()->SnapGetItem(IClient::SNAP_CURRENT, i); - - if(Item.m_Type == NETOBJTYPE_CLIENTINFO) - { - const CNetObj_ClientInfo *pInfo = (const CNetObj_ClientInfo *)Item.m_pData; - int ClientId = Item.m_Id; - if(ClientId < MAX_CLIENTS) - { - CClientData *pClient = &m_aClients[ClientId]; - - if(!IntsToStr(&pInfo->m_Name0, 4, pClient->m_aName, std::size(pClient->m_aName))) - { - str_copy(pClient->m_aName, "nameless tee"); - } - IntsToStr(&pInfo->m_Clan0, 3, pClient->m_aClan, std::size(pClient->m_aClan)); - pClient->m_Country = pInfo->m_Country; - - IntsToStr(&pInfo->m_Skin0, 6, pClient->m_aSkinName, std::size(pClient->m_aSkinName)); - if(pClient->m_aSkinName[0] == '\0' || - (!m_GameInfo.m_AllowXSkins && CSkins::IsSpecialSkin(pClient->m_aSkinName))) - { - str_copy(pClient->m_aSkinName, "default"); - } - - pClient->m_UseCustomColor = pInfo->m_UseCustomColor; - pClient->m_ColorBody = pInfo->m_ColorBody; - pClient->m_ColorFeet = pInfo->m_ColorFeet; - - pClient->m_SkinInfo.m_Size = 64; - pClient->m_SkinInfo.Apply(m_Skins.Find(pClient->m_aSkinName)); - pClient->m_SkinInfo.ApplyColors(pClient->m_UseCustomColor, pClient->m_ColorBody, pClient->m_ColorFeet); - pClient->UpdateRenderInfo(IsTeamPlay()); - } - } - else if(Item.m_Type == NETOBJTYPE_PLAYERINFO) - { - const CNetObj_PlayerInfo *pInfo = (const CNetObj_PlayerInfo *)Item.m_pData; - - if(pInfo->m_ClientId < MAX_CLIENTS && pInfo->m_ClientId == Item.m_Id) - { - m_aClients[pInfo->m_ClientId].m_Team = pInfo->m_Team; - m_aClients[pInfo->m_ClientId].m_Active = true; - m_Snap.m_apPlayerInfos[pInfo->m_ClientId] = pInfo; - m_Snap.m_NumPlayers++; - - if(pInfo->m_Local) - { - m_Snap.m_LocalClientId = pInfo->m_ClientId; - m_Snap.m_pLocalInfo = pInfo; - - if(pInfo->m_Team == TEAM_SPECTATORS) - { - m_Snap.m_SpecInfo.m_Active = true; - } - } - - m_Snap.m_HighestClientId = maximum(m_Snap.m_HighestClientId, pInfo->m_ClientId); - - // calculate team-balance - if(pInfo->m_Team != TEAM_SPECTATORS) - { - m_Snap.m_aTeamSize[pInfo->m_Team]++; - if(!m_aStats[pInfo->m_ClientId].IsActive()) - m_aStats[pInfo->m_ClientId].JoinGame(Client()->GameTick(g_Config.m_ClDummy)); - } - else if(m_aStats[pInfo->m_ClientId].IsActive()) - m_aStats[pInfo->m_ClientId].JoinSpec(Client()->GameTick(g_Config.m_ClDummy)); - } - } - else if(Item.m_Type == NETOBJTYPE_DDNETPLAYER) - { - m_ReceivedDDNetPlayer = true; - const CNetObj_DDNetPlayer *pInfo = (const CNetObj_DDNetPlayer *)Item.m_pData; - if(Item.m_Id < MAX_CLIENTS) - { - m_aClients[Item.m_Id].m_AuthLevel = pInfo->m_AuthLevel; - m_aClients[Item.m_Id].m_Afk = pInfo->m_Flags & EXPLAYERFLAG_AFK; - m_aClients[Item.m_Id].m_Paused = pInfo->m_Flags & EXPLAYERFLAG_PAUSED; - m_aClients[Item.m_Id].m_Spec = pInfo->m_Flags & EXPLAYERFLAG_SPEC; - - if(Item.m_Id == m_Snap.m_LocalClientId && (m_aClients[Item.m_Id].m_Paused || m_aClients[Item.m_Id].m_Spec)) - { - m_Snap.m_SpecInfo.m_Active = true; - } - } - } - else if(Item.m_Type == NETOBJTYPE_CHARACTER) - { - if(Item.m_Id < MAX_CLIENTS) - { - const void *pOld = Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_CHARACTER, Item.m_Id); - m_Snap.m_aCharacters[Item.m_Id].m_Cur = *((const CNetObj_Character *)Item.m_pData); - if(pOld) - { - m_Snap.m_aCharacters[Item.m_Id].m_Active = true; - m_Snap.m_aCharacters[Item.m_Id].m_Prev = *((const CNetObj_Character *)pOld); - - // limit evolving to 3 seconds - bool EvolvePrev = Client()->PrevGameTick(g_Config.m_ClDummy) - m_Snap.m_aCharacters[Item.m_Id].m_Prev.m_Tick <= 3 * Client()->GameTickSpeed(); - bool EvolveCur = Client()->GameTick(g_Config.m_ClDummy) - m_Snap.m_aCharacters[Item.m_Id].m_Cur.m_Tick <= 3 * Client()->GameTickSpeed(); - - // reuse the result from the previous evolve if the snapped character didn't change since the previous snapshot - if(EvolveCur && m_aClients[Item.m_Id].m_Evolved.m_Tick == Client()->PrevGameTick(g_Config.m_ClDummy)) - { - if(mem_comp(&m_Snap.m_aCharacters[Item.m_Id].m_Prev, &m_aClients[Item.m_Id].m_Snapped, sizeof(CNetObj_Character)) == 0) - m_Snap.m_aCharacters[Item.m_Id].m_Prev = m_aClients[Item.m_Id].m_Evolved; - if(mem_comp(&m_Snap.m_aCharacters[Item.m_Id].m_Cur, &m_aClients[Item.m_Id].m_Snapped, sizeof(CNetObj_Character)) == 0) - m_Snap.m_aCharacters[Item.m_Id].m_Cur = m_aClients[Item.m_Id].m_Evolved; - } - - if(EvolvePrev && m_Snap.m_aCharacters[Item.m_Id].m_Prev.m_Tick) - Evolve(&m_Snap.m_aCharacters[Item.m_Id].m_Prev, Client()->PrevGameTick(g_Config.m_ClDummy)); - if(EvolveCur && m_Snap.m_aCharacters[Item.m_Id].m_Cur.m_Tick) - Evolve(&m_Snap.m_aCharacters[Item.m_Id].m_Cur, Client()->GameTick(g_Config.m_ClDummy)); - - m_aClients[Item.m_Id].m_Snapped = *((const CNetObj_Character *)Item.m_pData); - m_aClients[Item.m_Id].m_Evolved = m_Snap.m_aCharacters[Item.m_Id].m_Cur; - } - else - { - m_aClients[Item.m_Id].m_Evolved.m_Tick = -1; - } - } - } - else if(Item.m_Type == NETOBJTYPE_DDNETCHARACTER) - { - const CNetObj_DDNetCharacter *pCharacterData = (const CNetObj_DDNetCharacter *)Item.m_pData; - - if(Item.m_Id < MAX_CLIENTS) - { - m_Snap.m_aCharacters[Item.m_Id].m_ExtendedData = *pCharacterData; - m_Snap.m_aCharacters[Item.m_Id].m_PrevExtendedData = (const CNetObj_DDNetCharacter *)Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_DDNETCHARACTER, Item.m_Id); - m_Snap.m_aCharacters[Item.m_Id].m_HasExtendedData = true; - m_Snap.m_aCharacters[Item.m_Id].m_HasExtendedDisplayInfo = false; - if(pCharacterData->m_JumpedTotal != -1) - { - m_Snap.m_aCharacters[Item.m_Id].m_HasExtendedDisplayInfo = true; - } - CClientData *pClient = &m_aClients[Item.m_Id]; - // Collision - pClient->m_Solo = pCharacterData->m_Flags & CHARACTERFLAG_SOLO; - pClient->m_Jetpack = pCharacterData->m_Flags & CHARACTERFLAG_JETPACK; - pClient->m_CollisionDisabled = pCharacterData->m_Flags & CHARACTERFLAG_COLLISION_DISABLED; - pClient->m_HammerHitDisabled = pCharacterData->m_Flags & CHARACTERFLAG_HAMMER_HIT_DISABLED; - pClient->m_GrenadeHitDisabled = pCharacterData->m_Flags & CHARACTERFLAG_GRENADE_HIT_DISABLED; - pClient->m_LaserHitDisabled = pCharacterData->m_Flags & CHARACTERFLAG_LASER_HIT_DISABLED; - pClient->m_ShotgunHitDisabled = pCharacterData->m_Flags & CHARACTERFLAG_SHOTGUN_HIT_DISABLED; - pClient->m_HookHitDisabled = pCharacterData->m_Flags & CHARACTERFLAG_HOOK_HIT_DISABLED; - pClient->m_Super = pCharacterData->m_Flags & CHARACTERFLAG_SUPER; - pClient->m_Invincible = pCharacterData->m_Flags & CHARACTERFLAG_INVINCIBLE; - - // Endless - pClient->m_EndlessHook = pCharacterData->m_Flags & CHARACTERFLAG_ENDLESS_HOOK; - pClient->m_EndlessJump = pCharacterData->m_Flags & CHARACTERFLAG_ENDLESS_JUMP; - - // Freeze - pClient->m_FreezeEnd = pCharacterData->m_FreezeEnd; - pClient->m_DeepFrozen = pCharacterData->m_FreezeEnd == -1; - pClient->m_LiveFrozen = (pCharacterData->m_Flags & CHARACTERFLAG_MOVEMENTS_DISABLED) != 0; - - // Telegun - pClient->m_HasTelegunGrenade = pCharacterData->m_Flags & CHARACTERFLAG_TELEGUN_GRENADE; - pClient->m_HasTelegunGun = pCharacterData->m_Flags & CHARACTERFLAG_TELEGUN_GUN; - pClient->m_HasTelegunLaser = pCharacterData->m_Flags & CHARACTERFLAG_TELEGUN_LASER; - - pClient->m_Predicted.ReadDDNet(pCharacterData); - - m_Teams.SetSolo(Item.m_Id, pClient->m_Solo); - } - } - else if(Item.m_Type == NETOBJTYPE_SPECCHAR) - { - const CNetObj_SpecChar *pSpecCharData = (const CNetObj_SpecChar *)Item.m_pData; - - if(Item.m_Id < MAX_CLIENTS) - { - CClientData *pClient = &m_aClients[Item.m_Id]; - pClient->m_SpecCharPresent = true; - pClient->m_SpecChar.x = pSpecCharData->m_X; - pClient->m_SpecChar.y = pSpecCharData->m_Y; - } - } - else if(Item.m_Type == NETOBJTYPE_SPECTATORINFO) - { - m_Snap.m_pSpectatorInfo = (const CNetObj_SpectatorInfo *)Item.m_pData; - m_Snap.m_pPrevSpectatorInfo = (const CNetObj_SpectatorInfo *)Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_SPECTATORINFO, Item.m_Id); - - // needed for 0.7 survival - // to auto spec players when dead - if(Client()->IsSixup()) - m_Snap.m_SpecInfo.m_Active = true; - m_Snap.m_SpecInfo.m_SpectatorId = m_Snap.m_pSpectatorInfo->m_SpectatorId; - } - else if(Item.m_Type == NETOBJTYPE_DDNETSPECTATORINFO) - { - const CNetObj_DDNetSpectatorInfo *pDDNetSpecInfo = (const CNetObj_DDNetSpectatorInfo *)Item.m_pData; - m_Snap.m_SpecInfo.m_HasCameraInfo = pDDNetSpecInfo->m_HasCameraInfo; - m_Snap.m_SpecInfo.m_Zoom = pDDNetSpecInfo->m_Zoom / 1000.0f; - m_Snap.m_SpecInfo.m_Deadzone = pDDNetSpecInfo->m_Deadzone; - m_Snap.m_SpecInfo.m_FollowFactor = pDDNetSpecInfo->m_FollowFactor; - } - else if(Item.m_Type == NETOBJTYPE_GAMEINFO) - { - m_Snap.m_pGameInfoObj = (const CNetObj_GameInfo *)Item.m_pData; - bool CurrentTickGameOver = (bool)(m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_GAMEOVER); - if(!m_GameOver && CurrentTickGameOver) - OnGameOver(); - else if(m_GameOver && !CurrentTickGameOver) - OnStartGame(); - // Handle case that a new round is started (RoundStartTick changed) - // New round is usually started after `restart` on server - if(m_Snap.m_pGameInfoObj->m_RoundStartTick != m_LastRoundStartTick && !(CurrentTickGameOver || m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_PAUSED || m_GamePaused)) - OnStartRound(); - m_LastRoundStartTick = m_Snap.m_pGameInfoObj->m_RoundStartTick; - m_GameOver = CurrentTickGameOver; - m_GamePaused = (bool)(m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_PAUSED); - } - else if(Item.m_Type == NETOBJTYPE_GAMEINFOEX) - { - if(FoundGameInfoEx) - { - continue; - } - FoundGameInfoEx = true; - m_GameInfo = GetGameInfo((const CNetObj_GameInfoEx *)Item.m_pData, Item.m_DataSize, &ServerInfo); - } - else if(Item.m_Type == NETOBJTYPE_GAMEDATA) - { - m_Snap.m_pGameDataObj = (const CNetObj_GameData *)Item.m_pData; - m_Snap.m_GameDataSnapId = Item.m_Id; - if(m_Snap.m_pGameDataObj->m_FlagCarrierRed == FLAG_TAKEN) - { - if(m_aFlagDropTick[TEAM_RED] == 0) - m_aFlagDropTick[TEAM_RED] = Client()->GameTick(g_Config.m_ClDummy); - } - else - m_aFlagDropTick[TEAM_RED] = 0; - if(m_Snap.m_pGameDataObj->m_FlagCarrierBlue == FLAG_TAKEN) - { - if(m_aFlagDropTick[TEAM_BLUE] == 0) - m_aFlagDropTick[TEAM_BLUE] = Client()->GameTick(g_Config.m_ClDummy); - } - else - m_aFlagDropTick[TEAM_BLUE] = 0; - if(m_LastFlagCarrierRed == FLAG_ATSTAND && m_Snap.m_pGameDataObj->m_FlagCarrierRed >= 0) - OnFlagGrab(TEAM_RED); - else if(m_LastFlagCarrierBlue == FLAG_ATSTAND && m_Snap.m_pGameDataObj->m_FlagCarrierBlue >= 0) - OnFlagGrab(TEAM_BLUE); - - m_LastFlagCarrierRed = m_Snap.m_pGameDataObj->m_FlagCarrierRed; - m_LastFlagCarrierBlue = m_Snap.m_pGameDataObj->m_FlagCarrierBlue; - } - else if(Item.m_Type == NETOBJTYPE_FLAG) - m_Snap.m_apFlags[Item.m_Id % 2] = (const CNetObj_Flag *)Item.m_pData; - else if(Item.m_Type == NETOBJTYPE_SWITCHSTATE) - { - if(Item.m_DataSize < 36) - { - continue; - } - const CNetObj_SwitchState *pSwitchStateData = (const CNetObj_SwitchState *)Item.m_pData; - int Team = clamp(Item.m_Id, (int)TEAM_FLOCK, (int)TEAM_SUPER - 1); - - int HighestSwitchNumber = clamp(pSwitchStateData->m_HighestSwitchNumber, 0, 255); - if(HighestSwitchNumber != maximum(0, (int)Switchers().size() - 1)) - { - m_GameWorld.m_Core.InitSwitchers(HighestSwitchNumber); - Collision()->m_HighestSwitchNumber = HighestSwitchNumber; - } - - for(int j = 0; j < (int)Switchers().size(); j++) - { - Switchers()[j].m_aStatus[Team] = (pSwitchStateData->m_aStatus[j / 32] >> (j % 32)) & 1; - } - - if(Item.m_DataSize >= 68) - { - // update the endtick of up to four timed switchers - for(int j = 0; j < (int)std::size(pSwitchStateData->m_aEndTicks); j++) - { - int SwitchNumber = pSwitchStateData->m_aSwitchNumbers[j]; - int EndTick = pSwitchStateData->m_aEndTicks[j]; - if(EndTick > 0 && in_range(SwitchNumber, 0, (int)Switchers().size())) - { - Switchers()[SwitchNumber].m_aEndTick[Team] = EndTick; - } - } - } - - // update switch types - for(auto &Switcher : Switchers()) - { - if(Switcher.m_aStatus[Team]) - Switcher.m_aType[Team] = Switcher.m_aEndTick[Team] ? TILE_SWITCHTIMEDOPEN : TILE_SWITCHOPEN; - else - Switcher.m_aType[Team] = Switcher.m_aEndTick[Team] ? TILE_SWITCHTIMEDCLOSE : TILE_SWITCHCLOSE; - } - - if(!GotSwitchStateTeam) - m_aSwitchStateTeam[g_Config.m_ClDummy] = Team; - else - m_aSwitchStateTeam[g_Config.m_ClDummy] = -1; - GotSwitchStateTeam = true; - } - } - } - - if(!FoundGameInfoEx) - { - m_GameInfo = GetGameInfo(0, 0, &ServerInfo); - } - - // setup local pointers - if(m_Snap.m_LocalClientId >= 0) - { - m_aLocalIds[g_Config.m_ClDummy] = m_Snap.m_LocalClientId; - - CSnapState::CCharacterInfo *pChr = &m_Snap.m_aCharacters[m_Snap.m_LocalClientId]; - if(pChr->m_Active) - { - if(!m_Snap.m_SpecInfo.m_Active) - { - m_Snap.m_pLocalCharacter = &pChr->m_Cur; - m_Snap.m_pLocalPrevCharacter = &pChr->m_Prev; - m_LocalCharacterPos = vec2(m_Snap.m_pLocalCharacter->m_X, m_Snap.m_pLocalCharacter->m_Y); - } - } - else if(Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_CHARACTER, m_Snap.m_LocalClientId)) - { - // player died - m_Controls.OnPlayerDeath(); - } - } - if(Client()->State() == IClient::STATE_DEMOPLAYBACK) - { - if(m_Snap.m_LocalClientId == -1 && m_DemoSpecId == SPEC_FOLLOW) - { - // TODO: can this be done in the translation layer? - if(!Client()->IsSixup()) - m_DemoSpecId = SPEC_FREEVIEW; - } - if(m_DemoSpecId != SPEC_FOLLOW) - { - m_Snap.m_SpecInfo.m_Active = true; - if(m_DemoSpecId > SPEC_FREEVIEW && m_Snap.m_aCharacters[m_DemoSpecId].m_Active) - m_Snap.m_SpecInfo.m_SpectatorId = m_DemoSpecId; - else - m_Snap.m_SpecInfo.m_SpectatorId = SPEC_FREEVIEW; - } - } - - // clear out unneeded client data - for(int i = 0; i < MAX_CLIENTS; ++i) - { - if(!m_Snap.m_apPlayerInfos[i] && m_aClients[i].m_Active) - { - m_aClients[i].Reset(); - m_aStats[i].Reset(); - } - } - - for(int i = 0; i < MAX_CLIENTS; ++i) - { - // update friend state - m_aClients[i].m_Friend = !(i == m_Snap.m_LocalClientId || !m_Snap.m_apPlayerInfos[i] || !Friends()->IsFriend(m_aClients[i].m_aName, m_aClients[i].m_aClan, true)); - - // update foe state - m_aClients[i].m_Foe = !(i == m_Snap.m_LocalClientId || !m_Snap.m_apPlayerInfos[i] || !Foes()->IsFriend(m_aClients[i].m_aName, m_aClients[i].m_aClan, true)); - } - - // sort player infos by name - mem_copy(m_Snap.m_apInfoByName, m_Snap.m_apPlayerInfos, sizeof(m_Snap.m_apInfoByName)); - std::stable_sort(m_Snap.m_apInfoByName, m_Snap.m_apInfoByName + MAX_CLIENTS, - [this](const CNetObj_PlayerInfo *p1, const CNetObj_PlayerInfo *p2) -> bool { - if(!p2) - return static_cast(p1); - if(!p1) - return false; - return str_comp_nocase(m_aClients[p1->m_ClientId].m_aName, m_aClients[p2->m_ClientId].m_aName) < 0; - }); - - bool TimeScore = m_GameInfo.m_TimeScore; - bool Race7 = Client()->IsSixup() && m_Snap.m_pGameInfoObj && m_Snap.m_pGameInfoObj->m_GameFlags & protocol7::GAMEFLAG_RACE; - - // sort player infos by score - mem_copy(m_Snap.m_apInfoByScore, m_Snap.m_apInfoByName, sizeof(m_Snap.m_apInfoByScore)); - if(Race7) - std::stable_sort(m_Snap.m_apInfoByScore, m_Snap.m_apInfoByScore + MAX_CLIENTS, - [](const CNetObj_PlayerInfo *p1, const CNetObj_PlayerInfo *p2) -> bool { - if(!p2) - return static_cast(p1); - if(!p1) - return false; - return (((p1->m_Score == -1) ? std::numeric_limits::max() : p1->m_Score) < - ((p2->m_Score == -1) ? std::numeric_limits::max() : p2->m_Score)); - }); - else - std::stable_sort(m_Snap.m_apInfoByScore, m_Snap.m_apInfoByScore + MAX_CLIENTS, - [TimeScore](const CNetObj_PlayerInfo *p1, const CNetObj_PlayerInfo *p2) -> bool { - if(!p2) - return static_cast(p1); - if(!p1) - return false; - return (((TimeScore && p1->m_Score == -9999) ? std::numeric_limits::min() : p1->m_Score) > - ((TimeScore && p2->m_Score == -9999) ? std::numeric_limits::min() : p2->m_Score)); - }); - - // sort player infos by DDRace Team (and score between) - int Index = 0; - for(int Team = TEAM_FLOCK; Team <= TEAM_SUPER; ++Team) - { - for(int i = 0; i < MAX_CLIENTS && Index < MAX_CLIENTS; ++i) - { - if(m_Snap.m_apInfoByScore[i] && m_Teams.Team(m_Snap.m_apInfoByScore[i]->m_ClientId) == Team) - m_Snap.m_apInfoByDDTeamScore[Index++] = m_Snap.m_apInfoByScore[i]; - } - } - - // sort player infos by DDRace Team (and name between) - Index = 0; - for(int Team = TEAM_FLOCK; Team <= TEAM_SUPER; ++Team) - { - for(int i = 0; i < MAX_CLIENTS && Index < MAX_CLIENTS; ++i) - { - if(m_Snap.m_apInfoByName[i] && m_Teams.Team(m_Snap.m_apInfoByName[i]->m_ClientId) == Team) - m_Snap.m_apInfoByDDTeamName[Index++] = m_Snap.m_apInfoByName[i]; - } - } - - CTuningParams StandardTuning; - if(ServerInfo.m_aGameType[0] != '0') - { - if(str_comp(ServerInfo.m_aGameType, "DM") != 0 && str_comp(ServerInfo.m_aGameType, "TDM") != 0 && str_comp(ServerInfo.m_aGameType, "CTF") != 0) - m_ServerMode = SERVERMODE_MOD; - else if(mem_comp(&StandardTuning, &m_aTuning[g_Config.m_ClDummy], 33) == 0) - m_ServerMode = SERVERMODE_PURE; - else - m_ServerMode = SERVERMODE_PUREMOD; - } - - // add tuning to demo - bool AnyRecording = false; - for(int i = 0; i < RECORDER_MAX; i++) - if(DemoRecorder(i)->IsRecording()) - { - AnyRecording = true; - break; - } - if(AnyRecording && mem_comp(&StandardTuning, &m_aTuning[g_Config.m_ClDummy], sizeof(CTuningParams)) != 0) - { - CMsgPacker Msg(NETMSGTYPE_SV_TUNEPARAMS); - int *pParams = (int *)&m_aTuning[g_Config.m_ClDummy]; - for(unsigned i = 0; i < sizeof(m_aTuning[0]) / sizeof(int); i++) - Msg.AddInt(pParams[i]); - Client()->SendMsgActive(&Msg, MSGFLAG_RECORD | MSGFLAG_NOSEND); - } - - for(int i = 0; i < 2; i++) - { - if(m_aDDRaceMsgSent[i] || !m_Snap.m_pLocalInfo) - { - continue; - } - if(i == IClient::CONN_DUMMY && !Client()->DummyConnected()) - { - continue; - } - CMsgPacker Msg(NETMSGTYPE_CL_ISDDNETLEGACY, false); - Msg.AddInt(DDNetVersion()); - Client()->SendMsg(i, &Msg, MSGFLAG_VITAL); - m_aDDRaceMsgSent[i] = true; - } - - if(m_Snap.m_SpecInfo.m_Active && m_MultiViewActivated) - { - // dont show other teams while spectating in multi view - CNetMsg_Cl_ShowOthers Msg; - Msg.m_Show = SHOW_OTHERS_ONLY_TEAM; - Client()->SendPackMsgActive(&Msg, MSGFLAG_VITAL); - - // update state - m_aShowOthers[g_Config.m_ClDummy] = SHOW_OTHERS_ONLY_TEAM; - } - else if(m_aShowOthers[g_Config.m_ClDummy] == SHOW_OTHERS_NOT_SET || m_aShowOthers[g_Config.m_ClDummy] != g_Config.m_ClShowOthers) - { - { - CNetMsg_Cl_ShowOthers Msg; - Msg.m_Show = g_Config.m_ClShowOthers; - Client()->SendPackMsgActive(&Msg, MSGFLAG_VITAL); - } - - // update state - m_aShowOthers[g_Config.m_ClDummy] = g_Config.m_ClShowOthers; - } - - float ShowDistanceZoom = m_Camera.m_Zoom; - float Zoom = m_Camera.m_Zoom; - if(m_Camera.m_Zooming) - { - if(m_Camera.m_ZoomSmoothingTarget > m_Camera.m_Zoom) // Zooming out - ShowDistanceZoom = m_Camera.m_ZoomSmoothingTarget; - else if(m_Camera.m_ZoomSmoothingTarget < m_Camera.m_Zoom && m_LastShowDistanceZoom > 0) // Zooming in - ShowDistanceZoom = m_LastShowDistanceZoom; - - Zoom = m_Camera.m_ZoomSmoothingTarget; - } - - float Deadzone = m_Camera.Deadzone(); - float FollowFactor = m_Camera.FollowFactor(); - - if(m_Snap.m_SpecInfo.m_Active) - { - // don't send camera infomation when spectating - Zoom = m_LastZoom; - Deadzone = m_LastDeadzone; - FollowFactor = m_LastFollowFactor; - } - - // initialize dummy vital when first connected - if(Client()->DummyConnected() && !m_LastDummyConnected) - { - { - CNetMsg_Cl_ShowDistance Msg; - float x, y; - RenderTools()->CalcScreenParams(Graphics()->ScreenAspect(), ShowDistanceZoom, &x, &y); - Msg.m_X = x; - Msg.m_Y = y; - CMsgPacker Packer(&Msg); - Msg.Pack(&Packer); - Client()->SendMsg(IClient::CONN_DUMMY, &Packer, MSGFLAG_VITAL); - } - { - CNetMsg_Cl_CameraInfo Msg; - Msg.m_Zoom = round_truncate(Zoom * 1000.f); - Msg.m_Deadzone = Deadzone; - Msg.m_FollowFactor = FollowFactor; - CMsgPacker Packer(&Msg); - Msg.Pack(&Packer); - Client()->SendMsg(IClient::CONN_DUMMY, &Packer, MSGFLAG_VITAL); - } - } - - // send show distance - if(ShowDistanceZoom != m_LastShowDistanceZoom || Graphics()->ScreenAspect() != m_LastScreenAspect) - { - CNetMsg_Cl_ShowDistance Msg; - float x, y; - RenderTools()->CalcScreenParams(Graphics()->ScreenAspect(), ShowDistanceZoom, &x, &y); - Msg.m_X = x; - Msg.m_Y = y; - Client()->ChecksumData()->m_Zoom = ShowDistanceZoom; - CMsgPacker Packer(&Msg); - Msg.Pack(&Packer); - - Client()->SendMsg(IClient::CONN_MAIN, &Packer, MSGFLAG_VITAL); - if(Client()->DummyConnected() && m_LastDummyConnected) - Client()->SendMsg(IClient::CONN_DUMMY, &Packer, MSGFLAG_VITAL); - } - - // send camera info - if(Zoom != m_LastZoom || Deadzone != m_LastDeadzone || FollowFactor != m_LastFollowFactor) - { - CNetMsg_Cl_CameraInfo Msg; - Msg.m_Zoom = round_truncate(Zoom * 1000.f); - Msg.m_Deadzone = Deadzone; - Msg.m_FollowFactor = FollowFactor; - CMsgPacker Packer(&Msg); - Msg.Pack(&Packer); - - Client()->SendMsg(IClient::CONN_MAIN, &Packer, MSGFLAG_VITAL); - if(Client()->DummyConnected() && m_LastDummyConnected) - Client()->SendMsg(IClient::CONN_DUMMY, &Packer, MSGFLAG_VITAL); - } - - m_LastShowDistanceZoom = ShowDistanceZoom; - m_LastZoom = Zoom; - m_LastScreenAspect = Graphics()->ScreenAspect(); - m_LastDeadzone = Deadzone; - m_LastFollowFactor = FollowFactor; - m_LastDummyConnected = Client()->DummyConnected(); - - for(auto &pComponent : m_vpAll) - pComponent->OnNewSnapshot(); - - // notify editor when local character moved - UpdateEditorIngameMoved(); - - // detect air jump for other players - for(int i = 0; i < MAX_CLIENTS; i++) - if(m_Snap.m_aCharacters[i].m_Active && (m_Snap.m_aCharacters[i].m_Cur.m_Jumped & 2) && !(m_Snap.m_aCharacters[i].m_Prev.m_Jumped & 2)) - if(!Predict() || (i != m_Snap.m_LocalClientId && (!AntiPingPlayers() || i != m_PredictedDummyId))) - { - vec2 Pos = mix(vec2(m_Snap.m_aCharacters[i].m_Prev.m_X, m_Snap.m_aCharacters[i].m_Prev.m_Y), - vec2(m_Snap.m_aCharacters[i].m_Cur.m_X, m_Snap.m_aCharacters[i].m_Cur.m_Y), - Client()->IntraGameTick(g_Config.m_ClDummy)); - float Alpha = 1.0f; - if(IsOtherTeam(i)) - Alpha = g_Config.m_ClShowOthersAlpha / 100.0f; - m_Effects.AirJump(Pos, Alpha); - } - - if(g_Config.m_ClFreezeStars && !m_SuppressEvents) - { - for(auto &Character : m_Snap.m_aCharacters) - { - if(Character.m_Active && Character.m_HasExtendedData && Character.m_PrevExtendedData) - { - int FreezeTimeNow = Character.m_ExtendedData.m_FreezeEnd - Client()->GameTick(g_Config.m_ClDummy); - int FreezeTimePrev = Character.m_PrevExtendedData->m_FreezeEnd - Client()->PrevGameTick(g_Config.m_ClDummy); - vec2 Pos = vec2(Character.m_Cur.m_X, Character.m_Cur.m_Y); - int StarsNow = (FreezeTimeNow + 1) / Client()->GameTickSpeed(); - int StarsPrev = (FreezeTimePrev + 1) / Client()->GameTickSpeed(); - if(StarsNow < StarsPrev || (StarsPrev == 0 && StarsNow > 0)) - { - int Amount = StarsNow + 1; - float Mid = 3 * pi / 2; - float Min = Mid - pi / 3; - float Max = Mid + pi / 3; - for(int j = 0; j < Amount; j++) - { - float Angle = mix(Min, Max, (j + 1) / (float)(Amount + 2)); - m_Effects.DamageIndicator(Pos, direction(Angle)); - } - } - } - } - } - - // Record m_LastRaceTick for g_Config.m_ClConfirmDisconnect/QuitTime - if(m_GameInfo.m_Race && - Client()->State() == IClient::STATE_ONLINE && - m_Snap.m_pGameInfoObj && - !m_Snap.m_SpecInfo.m_Active && - m_Snap.m_pLocalCharacter && - m_Snap.m_pLocalPrevCharacter) - { - const bool RaceFlag = m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_RACETIME; - m_LastRaceTick = RaceFlag ? -m_Snap.m_pGameInfoObj->m_WarmupTimer : -1; - } - - if(m_Snap.m_LocalClientId != m_PrevLocalId) - m_PredictedDummyId = m_PrevLocalId; - m_PrevLocalId = m_Snap.m_LocalClientId; - m_IsDummySwapping = 0; - - SnapCollectEntities(); // creates a collection that associates EntityEx snap items with the entities they belong to - - // update prediction data - if(Client()->State() != IClient::STATE_DEMOPLAYBACK) - UpdatePrediction(); -} - -void CGameClient::UpdateEditorIngameMoved() -{ - const bool LocalCharacterMoved = m_Snap.m_pLocalCharacter && m_Snap.m_pLocalPrevCharacter && (m_Snap.m_pLocalCharacter->m_X != m_Snap.m_pLocalPrevCharacter->m_X || m_Snap.m_pLocalCharacter->m_Y != m_Snap.m_pLocalPrevCharacter->m_Y); - if(!g_Config.m_ClEditor) - { - m_EditorMovementDelay = 5; - } - else if(m_EditorMovementDelay > 0 && !LocalCharacterMoved) - { - --m_EditorMovementDelay; - } - if(m_EditorMovementDelay == 0 && LocalCharacterMoved) - { - Editor()->OnIngameMoved(); - } -} - -void CGameClient::OnPredict() -{ - // store the previous values so we can detect prediction errors - CCharacterCore BeforePrevChar = m_PredictedPrevChar; - CCharacterCore BeforeChar = m_PredictedChar; - - // we can't predict without our own id or own character - if(m_Snap.m_LocalClientId == -1 || !m_Snap.m_aCharacters[m_Snap.m_LocalClientId].m_Active) - return; - - // don't predict anything if we are paused - if(m_Snap.m_pGameInfoObj && m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_PAUSED) - { - if(m_Snap.m_pLocalCharacter) - { - m_PredictedChar.Read(m_Snap.m_pLocalCharacter); - m_PredictedChar.m_ActiveWeapon = m_Snap.m_pLocalCharacter->m_Weapon; - } - if(m_Snap.m_pLocalPrevCharacter) - { - m_PredictedPrevChar.Read(m_Snap.m_pLocalPrevCharacter); - m_PredictedPrevChar.m_ActiveWeapon = m_Snap.m_pLocalPrevCharacter->m_Weapon; - } - return; - } - - vec2 aBeforeRender[MAX_CLIENTS]; - for(int i = 0; i < MAX_CLIENTS; i++) - aBeforeRender[i] = GetSmoothPos(i); - - // init - bool Dummy = g_Config.m_ClDummy ^ m_IsDummySwapping; - m_PredictedWorld.CopyWorld(&m_GameWorld); - - // don't predict inactive players, or entities from other teams - for(int i = 0; i < MAX_CLIENTS; i++) - if(CCharacter *pChar = m_PredictedWorld.GetCharacterById(i)) - if((!m_Snap.m_aCharacters[i].m_Active && pChar->m_SnapTicks > 10) || IsOtherTeam(i)) - pChar->Destroy(); - - CProjectile *pProjNext = 0; - for(CProjectile *pProj = (CProjectile *)m_PredictedWorld.FindFirst(CGameWorld::ENTTYPE_PROJECTILE); pProj; pProj = pProjNext) - { - pProjNext = (CProjectile *)pProj->TypeNext(); - if(IsOtherTeam(pProj->GetOwner())) - { - pProj->Destroy(); - } - } - - CCharacter *pLocalChar = m_PredictedWorld.GetCharacterById(m_Snap.m_LocalClientId); - if(!pLocalChar) - return; - CCharacter *pDummyChar = 0; - if(PredictDummy()) - pDummyChar = m_PredictedWorld.GetCharacterById(m_PredictedDummyId); - - // predict - for(int Tick = Client()->GameTick(g_Config.m_ClDummy) + 1; Tick <= Client()->PredGameTick(g_Config.m_ClDummy); Tick++) - { - // fetch the previous characters - if(Tick == Client()->PredGameTick(g_Config.m_ClDummy)) - { - m_PrevPredictedWorld.CopyWorld(&m_PredictedWorld); - m_PredictedPrevChar = pLocalChar->GetCore(); - for(int i = 0; i < MAX_CLIENTS; i++) - if(CCharacter *pChar = m_PredictedWorld.GetCharacterById(i)) - m_aClients[i].m_PrevPredicted = pChar->GetCore(); - } - - // optionally allow some movement in freeze by not predicting freeze the last one to two ticks - if(g_Config.m_ClPredictFreeze == 2 && Client()->PredGameTick(g_Config.m_ClDummy) - 1 - Client()->PredGameTick(g_Config.m_ClDummy) % 2 <= Tick) - pLocalChar->m_CanMoveInFreeze = true; - - // apply inputs and tick - CNetObj_PlayerInput *pInputData = (CNetObj_PlayerInput *)Client()->GetInput(Tick, m_IsDummySwapping); - CNetObj_PlayerInput *pDummyInputData = !pDummyChar ? 0 : (CNetObj_PlayerInput *)Client()->GetInput(Tick, m_IsDummySwapping ^ 1); - bool DummyFirst = pInputData && pDummyInputData && pDummyChar->GetCid() < pLocalChar->GetCid(); - - if(DummyFirst) - pDummyChar->OnDirectInput(pDummyInputData); - if(pInputData) - pLocalChar->OnDirectInput(pInputData); - if(pDummyInputData && !DummyFirst) - pDummyChar->OnDirectInput(pDummyInputData); - m_PredictedWorld.m_GameTick = Tick; - if(pInputData) - pLocalChar->OnPredictedInput(pInputData); - if(pDummyInputData) - pDummyChar->OnPredictedInput(pDummyInputData); - m_PredictedWorld.Tick(); - - // fetch the current characters - if(Tick == Client()->PredGameTick(g_Config.m_ClDummy)) - { - m_PredictedChar = pLocalChar->GetCore(); - for(int i = 0; i < MAX_CLIENTS; i++) - if(CCharacter *pChar = m_PredictedWorld.GetCharacterById(i)) - m_aClients[i].m_Predicted = pChar->GetCore(); - } - - for(int i = 0; i < MAX_CLIENTS; i++) - if(CCharacter *pChar = m_PredictedWorld.GetCharacterById(i)) - { - m_aClients[i].m_aPredPos[Tick % 200] = pChar->Core()->m_Pos; - m_aClients[i].m_aPredTick[Tick % 200] = Tick; - } - - // check if we want to trigger effects - if(Tick > m_aLastNewPredictedTick[Dummy]) - { - m_aLastNewPredictedTick[Dummy] = Tick; - m_NewPredictedTick = true; - vec2 Pos = pLocalChar->Core()->m_Pos; - int Events = pLocalChar->Core()->m_TriggeredEvents; - if(g_Config.m_ClPredict && !m_SuppressEvents) - if(Events & COREEVENT_AIR_JUMP) - m_Effects.AirJump(Pos, 1.0f); - if(g_Config.m_SndGame && !m_SuppressEvents) - { - if(Events & COREEVENT_GROUND_JUMP) - m_Sounds.PlayAndRecord(CSounds::CHN_WORLD, SOUND_PLAYER_JUMP, 1.0f, Pos); - if(Events & COREEVENT_HOOK_ATTACH_GROUND) - m_Sounds.PlayAndRecord(CSounds::CHN_WORLD, SOUND_HOOK_ATTACH_GROUND, 1.0f, Pos); - if(Events & COREEVENT_HOOK_HIT_NOHOOK) - m_Sounds.PlayAndRecord(CSounds::CHN_WORLD, SOUND_HOOK_NOATTACH, 1.0f, Pos); - } - } - - // check if we want to trigger predicted airjump for dummy - if(AntiPingPlayers() && pDummyChar && Tick > m_aLastNewPredictedTick[!Dummy]) - { - m_aLastNewPredictedTick[!Dummy] = Tick; - vec2 Pos = pDummyChar->Core()->m_Pos; - int Events = pDummyChar->Core()->m_TriggeredEvents; - if(g_Config.m_ClPredict && !m_SuppressEvents) - if(Events & COREEVENT_AIR_JUMP) - m_Effects.AirJump(Pos, 1.0f); - } - } - - // detect mispredictions of other players and make corrections smoother when possible - if(g_Config.m_ClAntiPingSmooth && Predict() && AntiPingPlayers() && m_NewTick && m_PredictedTick >= MIN_TICK && absolute(m_PredictedTick - Client()->PredGameTick(g_Config.m_ClDummy)) <= 1 && absolute(Client()->GameTick(g_Config.m_ClDummy) - Client()->PrevGameTick(g_Config.m_ClDummy)) <= 2) - { - int PredTime = clamp(Client()->GetPredictionTime(), 0, 800); - float SmoothPace = 4 - 1.5f * PredTime / 800.f; // smoothing pace (a lower value will make the smoothing quicker) - int64_t Len = 1000 * PredTime * SmoothPace; - - for(int i = 0; i < MAX_CLIENTS; i++) - { - if(!m_Snap.m_aCharacters[i].m_Active || i == m_Snap.m_LocalClientId || !m_aLastActive[i]) - continue; - vec2 NewPos = (m_PredictedTick == Client()->PredGameTick(g_Config.m_ClDummy)) ? m_aClients[i].m_Predicted.m_Pos : m_aClients[i].m_PrevPredicted.m_Pos; - vec2 PredErr = (m_aLastPos[i] - NewPos) / (float)minimum(Client()->GetPredictionTime(), 200); - if(in_range(length(PredErr), 0.05f, 5.f)) - { - vec2 PredPos = mix(m_aClients[i].m_PrevPredicted.m_Pos, m_aClients[i].m_Predicted.m_Pos, Client()->PredIntraGameTick(g_Config.m_ClDummy)); - vec2 CurPos = mix( - vec2(m_Snap.m_aCharacters[i].m_Prev.m_X, m_Snap.m_aCharacters[i].m_Prev.m_Y), - vec2(m_Snap.m_aCharacters[i].m_Cur.m_X, m_Snap.m_aCharacters[i].m_Cur.m_Y), - Client()->IntraGameTick(g_Config.m_ClDummy)); - vec2 RenderDiff = PredPos - aBeforeRender[i]; - vec2 PredDiff = PredPos - CurPos; - - float aMixAmount[2]; - for(int j = 0; j < 2; j++) - { - aMixAmount[j] = 1.0f; - if(absolute(PredErr[j]) > 0.05f) - { - aMixAmount[j] = 0.0f; - if(absolute(RenderDiff[j]) > 0.01f) - { - aMixAmount[j] = 1.f - clamp(RenderDiff[j] / PredDiff[j], 0.f, 1.f); - aMixAmount[j] = 1.f - std::pow(1.f - aMixAmount[j], 1 / 1.2f); - } - } - int64_t TimePassed = time_get() - m_aClients[i].m_aSmoothStart[j]; - if(in_range(TimePassed, (int64_t)0, Len - 1)) - aMixAmount[j] = minimum(aMixAmount[j], (float)(TimePassed / (double)Len)); - } - for(int j = 0; j < 2; j++) - if(absolute(RenderDiff[j]) < 0.01f && absolute(PredDiff[j]) < 0.01f && absolute(m_aClients[i].m_PrevPredicted.m_Pos[j] - m_aClients[i].m_Predicted.m_Pos[j]) < 0.01f && aMixAmount[j] > aMixAmount[j ^ 1]) - aMixAmount[j] = aMixAmount[j ^ 1]; - for(int j = 0; j < 2; j++) - { - int64_t Remaining = minimum((1.f - aMixAmount[j]) * Len, minimum(time_freq() * 0.700f, (1.f - aMixAmount[j ^ 1]) * Len + time_freq() * 0.300f)); // don't smooth for longer than 700ms, or more than 300ms longer along one axis than the other axis - int64_t Start = time_get() - (Len - Remaining); - if(!in_range(Start + Len, m_aClients[i].m_aSmoothStart[j], m_aClients[i].m_aSmoothStart[j] + Len)) - { - m_aClients[i].m_aSmoothStart[j] = Start; - m_aClients[i].m_aSmoothLen[j] = Len; - } - } - } - } - } - - for(int i = 0; i < MAX_CLIENTS; i++) - { - if(m_Snap.m_aCharacters[i].m_Active) - { - m_aLastPos[i] = m_aClients[i].m_Predicted.m_Pos; - m_aLastActive[i] = true; - } - else - m_aLastActive[i] = false; - } - - if(g_Config.m_Debug && g_Config.m_ClPredict && m_PredictedTick == Client()->PredGameTick(g_Config.m_ClDummy)) - { - CNetObj_CharacterCore Before = {0}, Now = {0}, BeforePrev = {0}, NowPrev = {0}; - BeforeChar.Write(&Before); - BeforePrevChar.Write(&BeforePrev); - m_PredictedChar.Write(&Now); - m_PredictedPrevChar.Write(&NowPrev); - - if(mem_comp(&Before, &Now, sizeof(CNetObj_CharacterCore)) != 0) - { - Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client", "prediction error"); - for(unsigned i = 0; i < sizeof(CNetObj_CharacterCore) / sizeof(int); i++) - if(((int *)&Before)[i] != ((int *)&Now)[i]) - { - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), " %d %d %d (%d %d)", i, ((int *)&Before)[i], ((int *)&Now)[i], ((int *)&BeforePrev)[i], ((int *)&NowPrev)[i]); - Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client", aBuf); - } - } - } - - m_PredictedTick = Client()->PredGameTick(g_Config.m_ClDummy); - - if(m_NewPredictedTick) - m_Ghost.OnNewPredictedSnapshot(); -} - -void CGameClient::OnActivateEditor() -{ - OnRelease(); -} - -CGameClient::CClientStats::CClientStats() -{ - Reset(); -} - -void CGameClient::CClientStats::Reset() -{ - m_JoinTick = 0; - m_IngameTicks = 0; - m_Active = false; - - std::fill(std::begin(m_aFragsWith), std::end(m_aFragsWith), 0); - std::fill(std::begin(m_aDeathsFrom), std::end(m_aDeathsFrom), 0); - m_Frags = 0; - m_Deaths = 0; - m_Suicides = 0; - m_BestSpree = 0; - m_CurrentSpree = 0; - - m_FlagGrabs = 0; - m_FlagCaptures = 0; -} - -void CGameClient::CClientData::UpdateRenderInfo(bool IsTeamPlay) -{ - m_RenderInfo = m_SkinInfo; - - // force team colors - if(IsTeamPlay) - { - m_RenderInfo.m_CustomColoredSkin = true; - const int aTeamColors[2] = {65461, 10223541}; - if(m_Team >= TEAM_RED && m_Team <= TEAM_BLUE) - { - m_RenderInfo.m_ColorBody = color_cast(ColorHSLA(aTeamColors[m_Team])); - m_RenderInfo.m_ColorFeet = color_cast(ColorHSLA(aTeamColors[m_Team])); - - // 0.7 - for(auto &Sixup : m_RenderInfo.m_aSixup) - { - const ColorRGBA aTeamColorsSixup[2] = { - ColorRGBA(0.753f, 0.318f, 0.318f, 1.0f), - ColorRGBA(0.318f, 0.471f, 0.753f, 1.0f)}; - const ColorRGBA aMarkingColorsSixup[2] = { - ColorRGBA(0.824f, 0.345f, 0.345f, 1.0f), - ColorRGBA(0.345f, 0.514f, 0.824f, 1.0f)}; - float MarkingAlpha = Sixup.m_aColors[protocol7::SKINPART_MARKING].a; - for(auto &Color : Sixup.m_aColors) - Color = aTeamColorsSixup[m_Team]; - if(MarkingAlpha > 0.1f) - Sixup.m_aColors[protocol7::SKINPART_MARKING] = aMarkingColorsSixup[m_Team]; - } - } - else - { - m_RenderInfo.m_ColorBody = color_cast(ColorHSLA(12829350)); - m_RenderInfo.m_ColorFeet = color_cast(ColorHSLA(12829350)); - for(auto &Sixup : m_RenderInfo.m_aSixup) - for(auto &Color : Sixup.m_aColors) - Color = color_cast(ColorHSLA(12829350)); - } - } -} - -void CGameClient::CClientData::Reset() -{ - m_UseCustomColor = 0; - m_ColorBody = 0; - m_ColorFeet = 0; - - m_aName[0] = '\0'; - m_aClan[0] = '\0'; - m_Country = -1; - m_aSkinName[0] = '\0'; - m_SkinColor = 0; - - m_Team = 0; - m_Emoticon = 0; - m_EmoticonStartFraction = 0; - m_EmoticonStartTick = -1; - - m_Solo = false; - m_Jetpack = false; - m_CollisionDisabled = false; - m_EndlessHook = false; - m_EndlessJump = false; - m_HammerHitDisabled = false; - m_GrenadeHitDisabled = false; - m_LaserHitDisabled = false; - m_ShotgunHitDisabled = false; - m_HookHitDisabled = false; - m_Super = false; - m_Invincible = false; - m_HasTelegunGun = false; - m_HasTelegunGrenade = false; - m_HasTelegunLaser = false; - m_FreezeEnd = 0; - m_DeepFrozen = false; - m_LiveFrozen = false; - - m_Predicted.Reset(); - m_PrevPredicted.Reset(); - - m_SkinInfo.Reset(); - m_RenderInfo.Reset(); - - m_Angle = 0.0f; - m_Active = false; - m_ChatIgnore = false; - m_EmoticonIgnore = false; - m_Friend = false; - m_Foe = false; - - m_AuthLevel = AUTHED_NO; - m_Afk = false; - m_Paused = false; - m_Spec = false; - - std::fill(std::begin(m_aSwitchStates), std::end(m_aSwitchStates), 0); - - m_Snapped.m_Tick = -1; - m_Evolved.m_Tick = -1; - - m_RenderCur.m_Tick = -1; - m_RenderPrev.m_Tick = -1; - m_RenderPos = vec2(0.0f, 0.0f); - m_IsPredicted = false; - m_IsPredictedLocal = false; - std::fill(std::begin(m_aSmoothStart), std::end(m_aSmoothStart), 0); - std::fill(std::begin(m_aSmoothLen), std::end(m_aSmoothLen), 0); - std::fill(std::begin(m_aPredPos), std::end(m_aPredPos), vec2(0.0f, 0.0f)); - std::fill(std::begin(m_aPredTick), std::end(m_aPredTick), 0); - m_SpecCharPresent = false; - m_SpecChar = vec2(0.0f, 0.0f); - - for(auto &Info : m_aSixup) - Info.Reset(); -} - -void CGameClient::CClientData::CSixup::Reset() -{ - for(int i = 0; i < protocol7::NUM_SKINPARTS; ++i) - { - m_aaSkinPartNames[i][0] = '\0'; - m_aUseCustomColors[i] = 0; - m_aSkinPartColors[i] = 0; - } -} - -void CGameClient::SendSwitchTeam(int Team) const -{ - CNetMsg_Cl_SetTeam Msg; - Msg.m_Team = Team; - Client()->SendPackMsgActive(&Msg, MSGFLAG_VITAL); -} - -void CGameClient::SendStartInfo7(bool Dummy) -{ - protocol7::CNetMsg_Cl_StartInfo Msg; - Msg.m_pName = Dummy ? Client()->DummyName() : Client()->PlayerName(); - Msg.m_pClan = Dummy ? Config()->m_ClDummyClan : Config()->m_PlayerClan; - Msg.m_Country = Dummy ? Config()->m_ClDummyCountry : Config()->m_PlayerCountry; - for(int p = 0; p < protocol7::NUM_SKINPARTS; p++) - { - Msg.m_apSkinPartNames[p] = CSkins7::ms_apSkinVariables[(int)Dummy][p]; - Msg.m_aUseCustomColors[p] = *CSkins7::ms_apUCCVariables[(int)Dummy][p]; - Msg.m_aSkinPartColors[p] = *CSkins7::ms_apColorVariables[(int)Dummy][p]; - } - CMsgPacker Packer(&Msg, false, true); - if(Msg.Pack(&Packer)) - return; - Client()->SendMsg((int)Dummy, &Packer, MSGFLAG_VITAL | MSGFLAG_FLUSH); - m_aCheckInfo[(int)Dummy] = -1; -} - -void CGameClient::SendSkinChange7(bool Dummy) -{ - protocol7::CNetMsg_Cl_SkinChange Msg; - for(int p = 0; p < protocol7::NUM_SKINPARTS; p++) - { - Msg.m_apSkinPartNames[p] = CSkins7::ms_apSkinVariables[(int)Dummy][p]; - Msg.m_aUseCustomColors[p] = *CSkins7::ms_apUCCVariables[(int)Dummy][p]; - Msg.m_aSkinPartColors[p] = *CSkins7::ms_apColorVariables[(int)Dummy][p]; - } - CMsgPacker Packer(&Msg, false, true); - if(Msg.Pack(&Packer)) - return; - Client()->SendMsg((int)Dummy, &Packer, MSGFLAG_VITAL | MSGFLAG_FLUSH); - m_aCheckInfo[(int)Dummy] = Client()->GameTickSpeed(); -} - -bool CGameClient::GotWantedSkin7(bool Dummy) -{ - // validate the wanted skinparts before comparison - // because the skin parts we compare against are also validated - // otherwise it tries to resend the skin info when the eyes are set to "negative" - // in team based modes - char aSkinParts[protocol7::NUM_SKINPARTS][protocol7::MAX_SKIN_ARRAY_SIZE]; - char *apSkinPartsPtr[protocol7::NUM_SKINPARTS]; - int aUCCVars[protocol7::NUM_SKINPARTS]; - int aColorVars[protocol7::NUM_SKINPARTS]; - for(int SkinPart = 0; SkinPart < protocol7::NUM_SKINPARTS; SkinPart++) - { - str_copy(aSkinParts[SkinPart], CSkins7::ms_apSkinVariables[(int)Dummy][SkinPart], protocol7::MAX_SKIN_ARRAY_SIZE); - apSkinPartsPtr[SkinPart] = aSkinParts[SkinPart]; - aUCCVars[SkinPart] = *CSkins7::ms_apUCCVariables[(int)Dummy][SkinPart]; - aColorVars[SkinPart] = *CSkins7::ms_apColorVariables[(int)Dummy][SkinPart]; - } - m_Skins7.ValidateSkinParts(apSkinPartsPtr, aUCCVars, aColorVars, m_pClient->m_TranslationContext.m_GameFlags); - - for(int SkinPart = 0; SkinPart < protocol7::NUM_SKINPARTS; SkinPart++) - { - if(str_comp(m_aClients[m_aLocalIds[(int)Dummy]].m_aSixup[g_Config.m_ClDummy].m_aaSkinPartNames[SkinPart], apSkinPartsPtr[SkinPart])) - return false; - if(m_aClients[m_aLocalIds[(int)Dummy]].m_aSixup[g_Config.m_ClDummy].m_aUseCustomColors[SkinPart] != aUCCVars[SkinPart]) - return false; - if(m_aClients[m_aLocalIds[(int)Dummy]].m_aSixup[g_Config.m_ClDummy].m_aSkinPartColors[SkinPart] != aColorVars[SkinPart]) - return false; - } - - // TODO: add name change ddnet extension to 0.7 protocol - // if(str_comp(m_aClients[m_aLocalIds[(int)Dummy]].m_aName, Dummy ? Client()->DummyName() : Client()->PlayerName())) - // return false; - // if(str_comp(m_aClients[m_aLocalIds[(int)Dummy]].m_aClan, Dummy ? g_Config.m_ClDummyClan : g_Config.m_PlayerClan)) - // return false; - // if(m_aClients[m_aLocalIds[(int)Dummy]].m_Country != (Dummy ? g_Config.m_ClDummyCountry : g_Config.m_PlayerCountry)) - // return false; - - return true; -} - -void CGameClient::SendInfo(bool Start) -{ - if(m_pClient->IsSixup()) - { - if(Start) - SendStartInfo7(false); - else - SendSkinChange7(false); - return; - } - if(Start) - { - CNetMsg_Cl_StartInfo Msg; - Msg.m_pName = Client()->PlayerName(); - Msg.m_pClan = g_Config.m_PlayerClan; - Msg.m_Country = g_Config.m_PlayerCountry; - Msg.m_pSkin = g_Config.m_ClPlayerSkin; - Msg.m_UseCustomColor = g_Config.m_ClPlayerUseCustomColor; - Msg.m_ColorBody = g_Config.m_ClPlayerColorBody; - Msg.m_ColorFeet = g_Config.m_ClPlayerColorFeet; - CMsgPacker Packer(&Msg); - Msg.Pack(&Packer); - Client()->SendMsg(IClient::CONN_MAIN, &Packer, MSGFLAG_VITAL | MSGFLAG_FLUSH); - m_aCheckInfo[0] = -1; - } - else - { - CNetMsg_Cl_ChangeInfo Msg; - Msg.m_pName = Client()->PlayerName(); - Msg.m_pClan = g_Config.m_PlayerClan; - Msg.m_Country = g_Config.m_PlayerCountry; - Msg.m_pSkin = g_Config.m_ClPlayerSkin; - Msg.m_UseCustomColor = g_Config.m_ClPlayerUseCustomColor; - Msg.m_ColorBody = g_Config.m_ClPlayerColorBody; - Msg.m_ColorFeet = g_Config.m_ClPlayerColorFeet; - CMsgPacker Packer(&Msg); - Msg.Pack(&Packer); - Client()->SendMsg(IClient::CONN_MAIN, &Packer, MSGFLAG_VITAL); - m_aCheckInfo[0] = Client()->GameTickSpeed(); - } -} - -void CGameClient::SendDummyInfo(bool Start) -{ - if(m_pClient->IsSixup()) - { - if(Start) - SendStartInfo7(true); - else - SendSkinChange7(true); - return; - } - if(Start) - { - CNetMsg_Cl_StartInfo Msg; - Msg.m_pName = Client()->DummyName(); - Msg.m_pClan = g_Config.m_ClDummyClan; - Msg.m_Country = g_Config.m_ClDummyCountry; - Msg.m_pSkin = g_Config.m_ClDummySkin; - Msg.m_UseCustomColor = g_Config.m_ClDummyUseCustomColor; - Msg.m_ColorBody = g_Config.m_ClDummyColorBody; - Msg.m_ColorFeet = g_Config.m_ClDummyColorFeet; - CMsgPacker Packer(&Msg); - Msg.Pack(&Packer); - Client()->SendMsg(IClient::CONN_DUMMY, &Packer, MSGFLAG_VITAL); - m_aCheckInfo[1] = -1; - } - else - { - CNetMsg_Cl_ChangeInfo Msg; - Msg.m_pName = Client()->DummyName(); - Msg.m_pClan = g_Config.m_ClDummyClan; - Msg.m_Country = g_Config.m_ClDummyCountry; - Msg.m_pSkin = g_Config.m_ClDummySkin; - Msg.m_UseCustomColor = g_Config.m_ClDummyUseCustomColor; - Msg.m_ColorBody = g_Config.m_ClDummyColorBody; - Msg.m_ColorFeet = g_Config.m_ClDummyColorFeet; - CMsgPacker Packer(&Msg); - Msg.Pack(&Packer); - Client()->SendMsg(IClient::CONN_DUMMY, &Packer, MSGFLAG_VITAL); - m_aCheckInfo[1] = Client()->GameTickSpeed(); - } -} - -void CGameClient::SendKill(int ClientId) const -{ - CNetMsg_Cl_Kill Msg; - Client()->SendPackMsgActive(&Msg, MSGFLAG_VITAL); - - if(g_Config.m_ClDummyCopyMoves) - { - CMsgPacker MsgP(NETMSGTYPE_CL_KILL, false); - Client()->SendMsg(!g_Config.m_ClDummy, &MsgP, MSGFLAG_VITAL); - } -} - -void CGameClient::SendReadyChange7() -{ - if(!Client()->IsSixup()) - { - Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", "Error you have to be connected to a 0.7 server to use ready_change"); - return; - } - protocol7::CNetMsg_Cl_ReadyChange Msg; - Client()->SendPackMsgActive(&Msg, MSGFLAG_VITAL, true); -} - -void CGameClient::ConTeam(IConsole::IResult *pResult, void *pUserData) -{ - ((CGameClient *)pUserData)->SendSwitchTeam(pResult->GetInteger(0)); -} - -void CGameClient::ConKill(IConsole::IResult *pResult, void *pUserData) -{ - ((CGameClient *)pUserData)->SendKill(-1); -} - -void CGameClient::ConReadyChange7(IConsole::IResult *pResult, void *pUserData) -{ - CGameClient *pClient = static_cast(pUserData); - if(pClient->Client()->State() == IClient::STATE_ONLINE) - pClient->SendReadyChange7(); -} - -void CGameClient::ConchainLanguageUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - CGameClient *pThis = static_cast(pUserData); - const bool Changed = pThis->Client()->GlobalTime() && pResult->NumArguments() && str_comp(pResult->GetString(0), g_Config.m_ClLanguagefile) != 0; - pfnCallback(pResult, pCallbackUserData); - if(Changed) - { - pThis->OnLanguageChange(); - } -} - -void CGameClient::ConchainSpecialInfoupdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - pfnCallback(pResult, pCallbackUserData); - if(pResult->NumArguments()) - ((CGameClient *)pUserData)->SendInfo(false); -} - -void CGameClient::ConchainSpecialDummyInfoupdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - pfnCallback(pResult, pCallbackUserData); - if(pResult->NumArguments()) - ((CGameClient *)pUserData)->SendDummyInfo(false); -} - -void CGameClient::ConchainSpecialDummy(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - pfnCallback(pResult, pCallbackUserData); - if(pResult->NumArguments()) - { - if(g_Config.m_ClDummy && !((CGameClient *)pUserData)->Client()->DummyConnected()) - g_Config.m_ClDummy = 0; - } -} - -IGameClient *CreateGameClient() -{ - return new CGameClient(); -} - -int CGameClient::IntersectCharacter(vec2 HookPos, vec2 NewPos, vec2 &NewPos2, int OwnId) -{ - float Distance = 0.0f; - int ClosestId = -1; - - const CClientData &OwnClientData = m_aClients[OwnId]; - - for(int i = 0; i < MAX_CLIENTS; i++) - { - if(i == OwnId) - continue; - - const CClientData &Data = m_aClients[i]; - - if(!Data.m_Active) - continue; - - CNetObj_Character Prev = m_Snap.m_aCharacters[i].m_Prev; - CNetObj_Character Player = m_Snap.m_aCharacters[i].m_Cur; - - vec2 Position = mix(vec2(Prev.m_X, Prev.m_Y), vec2(Player.m_X, Player.m_Y), Client()->IntraGameTick(g_Config.m_ClDummy)); - - bool IsOneSuper = Data.m_Super || OwnClientData.m_Super; - bool IsOneSolo = Data.m_Solo || OwnClientData.m_Solo; - - if(!IsOneSuper && (!m_Teams.SameTeam(i, OwnId) || IsOneSolo || OwnClientData.m_HookHitDisabled)) - continue; - - vec2 ClosestPoint; - if(closest_point_on_line(HookPos, NewPos, Position, ClosestPoint)) - { - if(distance(Position, ClosestPoint) < CCharacterCore::PhysicalSize() + 2.0f) - { - if(ClosestId == -1 || distance(HookPos, Position) < Distance) - { - NewPos2 = ClosestPoint; - ClosestId = i; - Distance = distance(HookPos, Position); - } - } - } - } - - return ClosestId; -} - -ColorRGBA CalculateNameColor(ColorHSLA TextColorHSL) -{ - return color_cast(ColorHSLA(TextColorHSL.h, TextColorHSL.s * 0.68f, TextColorHSL.l * 0.81f)); -} - -void CGameClient::UpdatePrediction() -{ - m_GameWorld.m_WorldConfig.m_IsVanilla = m_GameInfo.m_PredictVanilla; - m_GameWorld.m_WorldConfig.m_IsDDRace = m_GameInfo.m_PredictDDRace; - m_GameWorld.m_WorldConfig.m_IsFNG = m_GameInfo.m_PredictFNG; - m_GameWorld.m_WorldConfig.m_PredictDDRace = m_GameInfo.m_PredictDDRace; - m_GameWorld.m_WorldConfig.m_PredictTiles = m_GameInfo.m_PredictDDRace && m_GameInfo.m_PredictDDRaceTiles; - m_GameWorld.m_WorldConfig.m_UseTuneZones = m_GameInfo.m_PredictDDRaceTiles; - m_GameWorld.m_WorldConfig.m_PredictFreeze = g_Config.m_ClPredictFreeze; - m_GameWorld.m_WorldConfig.m_PredictWeapons = AntiPingWeapons(); - m_GameWorld.m_WorldConfig.m_BugDDRaceInput = m_GameInfo.m_BugDDRaceInput; - m_GameWorld.m_WorldConfig.m_NoWeakHookAndBounce = m_GameInfo.m_NoWeakHookAndBounce; - - // always update default tune zone, even without character - if(!m_GameWorld.m_WorldConfig.m_UseTuneZones) - m_GameWorld.TuningList()[0] = m_aTuning[g_Config.m_ClDummy]; - - if(!m_Snap.m_pLocalCharacter) - { - if(CCharacter *pLocalChar = m_GameWorld.GetCharacterById(m_Snap.m_LocalClientId)) - pLocalChar->Destroy(); - return; - } - - if(m_Snap.m_pLocalCharacter->m_AmmoCount > 0 && m_Snap.m_pLocalCharacter->m_Weapon != WEAPON_NINJA) - m_GameWorld.m_WorldConfig.m_InfiniteAmmo = false; - m_GameWorld.m_WorldConfig.m_IsSolo = !m_Snap.m_aCharacters[m_Snap.m_LocalClientId].m_HasExtendedData && !m_aTuning[g_Config.m_ClDummy].m_PlayerCollision && !m_aTuning[g_Config.m_ClDummy].m_PlayerHooking; - - // update the tuning/tunezone at the local character position with the latest tunings received before the new snapshot - vec2 LocalCharPos = vec2(m_Snap.m_pLocalCharacter->m_X, m_Snap.m_pLocalCharacter->m_Y); - m_GameWorld.m_Core.m_aTuning[g_Config.m_ClDummy] = m_aTuning[g_Config.m_ClDummy]; - - if(m_GameWorld.m_WorldConfig.m_UseTuneZones) - { - int TuneZone = Collision()->IsTune(Collision()->GetMapIndex(LocalCharPos)); - - if(TuneZone != m_aLocalTuneZone[g_Config.m_ClDummy]) - { - // our tunezone changed, expecting tuning message - m_aLocalTuneZone[g_Config.m_ClDummy] = m_aExpectingTuningForZone[g_Config.m_ClDummy] = TuneZone; - m_aExpectingTuningSince[g_Config.m_ClDummy] = 0; - } - - if(m_aExpectingTuningForZone[g_Config.m_ClDummy] >= 0) - { - if(m_aReceivedTuning[g_Config.m_ClDummy]) - { - TuningList()[m_aExpectingTuningForZone[g_Config.m_ClDummy]] = m_aTuning[g_Config.m_ClDummy]; - m_GameWorld.TuningList()[m_aExpectingTuningForZone[g_Config.m_ClDummy]] = m_aTuning[g_Config.m_ClDummy]; - m_aReceivedTuning[g_Config.m_ClDummy] = false; - m_aExpectingTuningForZone[g_Config.m_ClDummy] = -1; - } - else if(m_aExpectingTuningSince[g_Config.m_ClDummy] >= 5) - { - // if we are expecting tuning for more than 10 snaps (less than a quarter of a second) - // it is probably dropped or it was received out of order - // or applied to another tunezone. - // we need to fallback to current tuning to fix ourselves. - m_aExpectingTuningForZone[g_Config.m_ClDummy] = -1; - m_aExpectingTuningSince[g_Config.m_ClDummy] = 0; - m_aReceivedTuning[g_Config.m_ClDummy] = false; - dbg_msg("tunezone", "the tuning was missed"); - } - else - { - // if we are expecting tuning and have not received one yet. - // do not update any tuning, so we don't apply it to the wrong tunezone. - dbg_msg("tunezone", "waiting for tuning for zone %d", m_aExpectingTuningForZone[g_Config.m_ClDummy]); - m_aExpectingTuningSince[g_Config.m_ClDummy]++; - } - } - else - { - // if we have processed what we need, and the tuning is still wrong due to out of order messege - // fix our tuning by using the current one - m_GameWorld.TuningList()[TuneZone] = m_aTuning[g_Config.m_ClDummy]; - m_aExpectingTuningSince[g_Config.m_ClDummy] = 0; - m_aReceivedTuning[g_Config.m_ClDummy] = false; - } - } - - // if ddnetcharacter is available, ignore server-wide tunings for hook and collision - if(m_Snap.m_aCharacters[m_Snap.m_LocalClientId].m_HasExtendedData) - { - m_GameWorld.m_Core.m_aTuning[g_Config.m_ClDummy].m_PlayerCollision = 1; - m_GameWorld.m_Core.m_aTuning[g_Config.m_ClDummy].m_PlayerHooking = 1; - } - - CCharacter *pLocalChar = m_GameWorld.GetCharacterById(m_Snap.m_LocalClientId); - CCharacter *pDummyChar = 0; - if(PredictDummy()) - pDummyChar = m_GameWorld.GetCharacterById(m_PredictedDummyId); - - // update strong and weak hook - if(pLocalChar && !m_Snap.m_SpecInfo.m_Active && Client()->State() != IClient::STATE_DEMOPLAYBACK && (m_aTuning[g_Config.m_ClDummy].m_PlayerCollision || m_aTuning[g_Config.m_ClDummy].m_PlayerHooking)) - { - if(m_Snap.m_aCharacters[m_Snap.m_LocalClientId].m_HasExtendedData) - { - int aIds[MAX_CLIENTS]; - for(int &Id : aIds) - Id = -1; - for(int i = 0; i < MAX_CLIENTS; i++) - if(CCharacter *pChar = m_GameWorld.GetCharacterById(i)) - aIds[pChar->GetStrongWeakId()] = i; - for(int Id : aIds) - if(Id >= 0) - m_CharOrder.GiveStrong(Id); - } - else - { - // manual detection - DetectStrongHook(); - } - for(int i : m_CharOrder.m_Ids) - { - if(CCharacter *pChar = m_GameWorld.GetCharacterById(i)) - { - m_GameWorld.RemoveEntity(pChar); - m_GameWorld.InsertEntity(pChar); - } - } - } - - // advance the gameworld to the current gametick - if(pLocalChar && absolute(m_GameWorld.GameTick() - Client()->GameTick(g_Config.m_ClDummy)) < Client()->GameTickSpeed()) - { - for(int Tick = m_GameWorld.GameTick() + 1; Tick <= Client()->GameTick(g_Config.m_ClDummy); Tick++) - { - CNetObj_PlayerInput *pInput = (CNetObj_PlayerInput *)Client()->GetInput(Tick); - CNetObj_PlayerInput *pDummyInput = 0; - if(pDummyChar) - pDummyInput = (CNetObj_PlayerInput *)Client()->GetInput(Tick, 1); - if(pInput) - pLocalChar->OnDirectInput(pInput); - if(pDummyInput) - pDummyChar->OnDirectInput(pDummyInput); - m_GameWorld.m_GameTick = Tick; - if(pInput) - pLocalChar->OnPredictedInput(pInput); - if(pDummyInput) - pDummyChar->OnPredictedInput(pDummyInput); - m_GameWorld.Tick(); - - for(int i = 0; i < MAX_CLIENTS; i++) - if(CCharacter *pChar = m_GameWorld.GetCharacterById(i)) - { - m_aClients[i].m_aPredPos[Tick % 200] = pChar->Core()->m_Pos; - m_aClients[i].m_aPredTick[Tick % 200] = Tick; - } - } - } - else - { - // skip to current gametick - m_GameWorld.m_GameTick = Client()->GameTick(g_Config.m_ClDummy); - if(pLocalChar) - if(CNetObj_PlayerInput *pInput = (CNetObj_PlayerInput *)Client()->GetInput(Client()->GameTick(g_Config.m_ClDummy))) - pLocalChar->SetInput(pInput); - if(pDummyChar) - if(CNetObj_PlayerInput *pInput = (CNetObj_PlayerInput *)Client()->GetInput(Client()->GameTick(g_Config.m_ClDummy), 1)) - pDummyChar->SetInput(pInput); - } - - for(int i = 0; i < MAX_CLIENTS; i++) - if(CCharacter *pChar = m_GameWorld.GetCharacterById(i)) - { - m_aClients[i].m_aPredPos[Client()->GameTick(g_Config.m_ClDummy) % 200] = pChar->Core()->m_Pos; - m_aClients[i].m_aPredTick[Client()->GameTick(g_Config.m_ClDummy) % 200] = Client()->GameTick(g_Config.m_ClDummy); - } - - // update the local gameworld with the new snapshot - m_GameWorld.NetObjBegin(m_Teams, m_Snap.m_LocalClientId); - - for(int i = 0; i < MAX_CLIENTS; i++) - if(m_Snap.m_aCharacters[i].m_Active) - { - bool IsLocal = (i == m_Snap.m_LocalClientId || (PredictDummy() && i == m_PredictedDummyId)); - int GameTeam = (m_Snap.m_pGameInfoObj && (m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS)) ? m_aClients[i].m_Team : i; - m_GameWorld.NetCharAdd(i, &m_Snap.m_aCharacters[i].m_Cur, - m_Snap.m_aCharacters[i].m_HasExtendedData ? &m_Snap.m_aCharacters[i].m_ExtendedData : 0, - GameTeam, IsLocal); - } - - for(const CSnapEntities &EntData : SnapEntities()) - m_GameWorld.NetObjAdd(EntData.m_Item.m_Id, EntData.m_Item.m_Type, EntData.m_Item.m_pData, EntData.m_pDataEx); - - m_GameWorld.NetObjEnd(); -} - -void CGameClient::UpdateSpectatorCursor() -{ - int CursorOwnerId = m_Snap.m_LocalClientId; - if(m_Snap.m_SpecInfo.m_Active || Client()->State() == IClient::STATE_DEMOPLAYBACK) - { - CursorOwnerId = m_Snap.m_SpecInfo.m_SpectatorId; - } - - if(CursorOwnerId != m_CursorInfo.m_CursorOwnerId) - { - // reset cursor sample count upon changing spectating character - m_CursorInfo.m_NumSamples = 0; - m_CursorInfo.m_CursorOwnerId = CursorOwnerId; - } - - if(m_MultiViewActivated || CursorOwnerId < 0 || CursorOwnerId >= MAX_CLIENTS) - { - // do not show spec cursor in multi-view - m_CursorInfo.m_Available = false; - m_CursorInfo.m_NumSamples = 0; - return; - } - - const CSnapState::CCharacterInfo CharInfo = m_Snap.m_aCharacters[CursorOwnerId]; - if(!CharInfo.m_HasExtendedData || !m_aClients[CursorOwnerId].m_Active || (!g_Config.m_Debug && m_aClients[CursorOwnerId].m_Paused)) - { - // hide cursor when the spectating player is paused - m_CursorInfo.m_Available = false; - m_CursorInfo.m_NumSamples = 0; - return; - } - - m_CursorInfo.m_Available = true; - m_CursorInfo.m_Position = CharInfo.m_Position; - m_CursorInfo.m_Weapon = CharInfo.m_Cur.m_Weapon; - - const vec2 Target = vec2(CharInfo.m_ExtendedData.m_TargetX, CharInfo.m_ExtendedData.m_TargetY); - - // interpolate cursor positions when not in debug mode - const double Tick = Client()->GameTick(g_Config.m_ClDummy); - - const bool HasSample = m_CursorInfo.m_NumSamples > 0; - const vec2 LastInput = HasSample ? m_CursorInfo.m_aTargetSamplesData[m_CursorInfo.m_NumSamples - 1] : vec2(0.0f, 0.0f); - const double LastTime = HasSample ? m_CursorInfo.m_aTargetSamplesTime[m_CursorInfo.m_NumSamples - 1] : 0.0; - bool NewSample = LastInput != Target || LastTime + CCursorInfo::REST_THRESHOLD < Tick; - - if(LastTime > Tick) - { - // clear samples when time flows backwards - m_CursorInfo.m_NumSamples = 0; - NewSample = true; - } - - if(m_CursorInfo.m_NumSamples == 0) - { - m_CursorInfo.m_aTargetSamplesTime[0] = Tick - CCursorInfo::INTERP_DELAY; - m_CursorInfo.m_aTargetSamplesData[0] = Target; - } - - if(NewSample) - { - if(m_CursorInfo.m_NumSamples == CCursorInfo::CURSOR_SAMPLES) - { - m_CursorInfo.m_NumSamples--; - mem_move(m_CursorInfo.m_aTargetSamplesTime, m_CursorInfo.m_aTargetSamplesTime + 1, m_CursorInfo.m_NumSamples * sizeof(double)); - mem_move(m_CursorInfo.m_aTargetSamplesData, m_CursorInfo.m_aTargetSamplesData + 1, m_CursorInfo.m_NumSamples * sizeof(vec2)); - } - m_CursorInfo.m_aTargetSamplesTime[m_CursorInfo.m_NumSamples] = Tick; - m_CursorInfo.m_aTargetSamplesData[m_CursorInfo.m_NumSamples] = Target; - m_CursorInfo.m_NumSamples++; - } - - // using double to avoid precision loss when converting int tick to decimal type - const double DisplayTime = Tick - CCursorInfo::INTERP_DELAY + double(Client()->IntraGameTickSincePrev(g_Config.m_ClDummy)); - double aTime[CCursorInfo::SAMPLE_FRAME_WINDOW]; - vec2 aData[CCursorInfo::SAMPLE_FRAME_WINDOW]; - - // find the available sample timing - int Index = m_CursorInfo.m_NumSamples; - for(int i = 0; i < m_CursorInfo.m_NumSamples; i++) - { - if(m_CursorInfo.m_aTargetSamplesTime[i] > DisplayTime) - { - Index = i; - break; - } - } - - for(int i = 0; i < CCursorInfo::SAMPLE_FRAME_WINDOW; i++) - { - const int Offset = i - CCursorInfo::SAMPLE_FRAME_OFFSET; - const int SampleIndex = Index + Offset; - if(SampleIndex < 0) - { - aTime[i] = m_CursorInfo.m_aTargetSamplesTime[0] + CCursorInfo::REST_THRESHOLD * Offset; - aData[i] = m_CursorInfo.m_aTargetSamplesData[0]; - } - else if(SampleIndex >= m_CursorInfo.m_NumSamples) - { - aTime[i] = m_CursorInfo.m_aTargetSamplesTime[m_CursorInfo.m_NumSamples - 1] + CCursorInfo::REST_THRESHOLD * (Offset + 1); - aData[i] = m_CursorInfo.m_aTargetSamplesData[m_CursorInfo.m_NumSamples - 1]; - } - else - { - aTime[i] = m_CursorInfo.m_aTargetSamplesTime[SampleIndex]; - aData[i] = m_CursorInfo.m_aTargetSamplesData[SampleIndex]; - } - } - - m_CursorInfo.m_Target = mix_polynomial(aTime, aData, CCursorInfo::SAMPLE_FRAME_WINDOW, DisplayTime, vec2(0.0f, 0.0f)); - - vec2 TargetCameraOffset(0, 0); - float l = length(m_CursorInfo.m_Target); - - if(l > 0.0001f) // make sure that this isn't 0 - { - float OffsetAmount = maximum(l - m_Snap.m_SpecInfo.m_Deadzone, 0.0f) * (m_Snap.m_SpecInfo.m_FollowFactor / 100.0f); - TargetCameraOffset = normalize(m_CursorInfo.m_Target) * OffsetAmount; - } - - // if we are in auto spec mode, use camera zoom to smooth out cursor transitions - const float Zoom = (m_Camera.m_Zooming && m_Camera.m_AutoSpecCameraZooming) ? m_Camera.m_Zoom : m_Snap.m_SpecInfo.m_Zoom; - m_CursorInfo.m_WorldTarget = m_CursorInfo.m_Position + (m_CursorInfo.m_Target - TargetCameraOffset) * Zoom + TargetCameraOffset; -} - -void CGameClient::UpdateRenderedCharacters() -{ - for(int i = 0; i < MAX_CLIENTS; i++) - { - if(!m_Snap.m_aCharacters[i].m_Active) - continue; - m_aClients[i].m_RenderCur = m_Snap.m_aCharacters[i].m_Cur; - m_aClients[i].m_RenderPrev = m_Snap.m_aCharacters[i].m_Prev; - m_aClients[i].m_IsPredicted = false; - m_aClients[i].m_IsPredictedLocal = false; - vec2 UnpredPos = mix( - vec2(m_Snap.m_aCharacters[i].m_Prev.m_X, m_Snap.m_aCharacters[i].m_Prev.m_Y), - vec2(m_Snap.m_aCharacters[i].m_Cur.m_X, m_Snap.m_aCharacters[i].m_Cur.m_Y), - Client()->IntraGameTick(g_Config.m_ClDummy)); - vec2 Pos = UnpredPos; - - CCharacter *pChar = m_PredictedWorld.GetCharacterById(i); - if(Predict() && (i == m_Snap.m_LocalClientId || (AntiPingPlayers() && !IsOtherTeam(i))) && pChar) - { - m_aClients[i].m_Predicted.Write(&m_aClients[i].m_RenderCur); - m_aClients[i].m_PrevPredicted.Write(&m_aClients[i].m_RenderPrev); - - m_aClients[i].m_IsPredicted = true; - - Pos = mix( - vec2(m_aClients[i].m_RenderPrev.m_X, m_aClients[i].m_RenderPrev.m_Y), - vec2(m_aClients[i].m_RenderCur.m_X, m_aClients[i].m_RenderCur.m_Y), - m_aClients[i].m_IsPredicted ? Client()->PredIntraGameTick(g_Config.m_ClDummy) : Client()->IntraGameTick(g_Config.m_ClDummy)); - - if(i == m_Snap.m_LocalClientId) - { - m_aClients[i].m_IsPredictedLocal = true; - if(AntiPingGunfire() && ((pChar->m_NinjaJetpack && pChar->m_FreezeTime == 0) || m_Snap.m_aCharacters[i].m_Cur.m_Weapon != WEAPON_NINJA || m_Snap.m_aCharacters[i].m_Cur.m_Weapon == m_aClients[i].m_Predicted.m_ActiveWeapon)) - { - m_aClients[i].m_RenderCur.m_AttackTick = pChar->GetAttackTick(); - if(m_Snap.m_aCharacters[i].m_Cur.m_Weapon != WEAPON_NINJA && !(pChar->m_NinjaJetpack && pChar->Core()->m_ActiveWeapon == WEAPON_GUN)) - m_aClients[i].m_RenderCur.m_Weapon = m_aClients[i].m_Predicted.m_ActiveWeapon; - } - } - else - { - // use unpredicted values for other players - m_aClients[i].m_RenderPrev.m_Angle = m_Snap.m_aCharacters[i].m_Prev.m_Angle; - m_aClients[i].m_RenderCur.m_Angle = m_Snap.m_aCharacters[i].m_Cur.m_Angle; - - if(g_Config.m_ClAntiPingSmooth) - Pos = GetSmoothPos(i); - } - } - m_Snap.m_aCharacters[i].m_Position = Pos; - m_aClients[i].m_RenderPos = Pos; - if(Predict() && i == m_Snap.m_LocalClientId) - m_LocalCharacterPos = Pos; - } -} - -void CGameClient::DetectStrongHook() -{ - // attempt to detect strong/weak between players - for(int FromPlayer = 0; FromPlayer < MAX_CLIENTS; FromPlayer++) - { - if(!m_Snap.m_aCharacters[FromPlayer].m_Active) - continue; - int ToPlayer = m_Snap.m_aCharacters[FromPlayer].m_Prev.m_HookedPlayer; - if(ToPlayer < 0 || ToPlayer >= MAX_CLIENTS || !m_Snap.m_aCharacters[ToPlayer].m_Active || ToPlayer != m_Snap.m_aCharacters[FromPlayer].m_Cur.m_HookedPlayer) - continue; - if(absolute(minimum(m_aLastUpdateTick[ToPlayer], m_aLastUpdateTick[FromPlayer]) - Client()->GameTick(g_Config.m_ClDummy)) < Client()->GameTickSpeed() / 4) - continue; - if(m_Snap.m_aCharacters[FromPlayer].m_Prev.m_Direction != m_Snap.m_aCharacters[FromPlayer].m_Cur.m_Direction || m_Snap.m_aCharacters[ToPlayer].m_Prev.m_Direction != m_Snap.m_aCharacters[ToPlayer].m_Cur.m_Direction) - continue; - - CCharacter *pFromCharWorld = m_GameWorld.GetCharacterById(FromPlayer); - CCharacter *pToCharWorld = m_GameWorld.GetCharacterById(ToPlayer); - if(!pFromCharWorld || !pToCharWorld) - continue; - - m_aLastUpdateTick[ToPlayer] = m_aLastUpdateTick[FromPlayer] = Client()->GameTick(g_Config.m_ClDummy); - - float aPredictErr[2]; - CCharacterCore ToCharCur; - ToCharCur.Read(&m_Snap.m_aCharacters[ToPlayer].m_Cur); - - CWorldCore World; - World.m_aTuning[g_Config.m_ClDummy] = m_aTuning[g_Config.m_ClDummy]; - - for(int dir = 0; dir < 2; dir++) - { - CCharacterCore ToChar = pFromCharWorld->GetCore(); - ToChar.Init(&World, Collision(), &m_Teams); - World.m_apCharacters[ToPlayer] = &ToChar; - ToChar.Read(&m_Snap.m_aCharacters[ToPlayer].m_Prev); - - CCharacterCore FromChar = pFromCharWorld->GetCore(); - FromChar.Init(&World, Collision(), &m_Teams); - World.m_apCharacters[FromPlayer] = &FromChar; - FromChar.Read(&m_Snap.m_aCharacters[FromPlayer].m_Prev); - - for(int Tick = Client()->PrevGameTick(g_Config.m_ClDummy); Tick < Client()->GameTick(g_Config.m_ClDummy); Tick++) - { - if(dir == 0) - { - FromChar.Tick(false); - ToChar.Tick(false); - } - else - { - ToChar.Tick(false); - FromChar.Tick(false); - } - FromChar.Move(); - FromChar.Quantize(); - ToChar.Move(); - ToChar.Quantize(); - } - aPredictErr[dir] = distance(ToChar.m_Vel, ToCharCur.m_Vel); - } - const float LOW = 0.0001f; - const float HIGH = 0.07f; - if(aPredictErr[1] < LOW && aPredictErr[0] > HIGH) - { - if(m_CharOrder.HasStrongAgainst(ToPlayer, FromPlayer)) - { - if(ToPlayer != m_Snap.m_LocalClientId) - m_CharOrder.GiveWeak(ToPlayer); - else - m_CharOrder.GiveStrong(FromPlayer); - } - } - else if(aPredictErr[0] < LOW && aPredictErr[1] > HIGH) - { - if(m_CharOrder.HasStrongAgainst(FromPlayer, ToPlayer)) - { - if(ToPlayer != m_Snap.m_LocalClientId) - m_CharOrder.GiveStrong(ToPlayer); - else - m_CharOrder.GiveWeak(FromPlayer); - } - } - } -} - -vec2 CGameClient::GetSmoothPos(int ClientId) -{ - vec2 Pos = mix(m_aClients[ClientId].m_PrevPredicted.m_Pos, m_aClients[ClientId].m_Predicted.m_Pos, Client()->PredIntraGameTick(g_Config.m_ClDummy)); - int64_t Now = time_get(); - for(int i = 0; i < 2; i++) - { - int64_t Len = clamp(m_aClients[ClientId].m_aSmoothLen[i], (int64_t)1, time_freq()); - int64_t TimePassed = Now - m_aClients[ClientId].m_aSmoothStart[i]; - if(in_range(TimePassed, (int64_t)0, Len - 1)) - { - float MixAmount = 1.f - std::pow(1.f - TimePassed / (float)Len, 1.2f); - int SmoothTick; - float SmoothIntra; - Client()->GetSmoothTick(&SmoothTick, &SmoothIntra, MixAmount); - if(SmoothTick > 0 && m_aClients[ClientId].m_aPredTick[(SmoothTick - 1) % 200] >= Client()->PrevGameTick(g_Config.m_ClDummy) && m_aClients[ClientId].m_aPredTick[SmoothTick % 200] <= Client()->PredGameTick(g_Config.m_ClDummy)) - Pos[i] = mix(m_aClients[ClientId].m_aPredPos[(SmoothTick - 1) % 200][i], m_aClients[ClientId].m_aPredPos[SmoothTick % 200][i], SmoothIntra); - } - } - return Pos; -} - -void CGameClient::Echo(const char *pString) -{ - m_Chat.Echo(pString); -} - -bool CGameClient::IsOtherTeam(int ClientId) const -{ - bool Local = m_Snap.m_LocalClientId == ClientId; - - if(m_Snap.m_LocalClientId < 0) - return false; - else if((m_Snap.m_SpecInfo.m_Active && m_Snap.m_SpecInfo.m_SpectatorId == SPEC_FREEVIEW) || ClientId < 0) - return false; - else if(m_Snap.m_SpecInfo.m_Active && m_Snap.m_SpecInfo.m_SpectatorId != SPEC_FREEVIEW) - { - if(m_Teams.Team(ClientId) == TEAM_SUPER || m_Teams.Team(m_Snap.m_SpecInfo.m_SpectatorId) == TEAM_SUPER) - return false; - return m_Teams.Team(ClientId) != m_Teams.Team(m_Snap.m_SpecInfo.m_SpectatorId); - } - else if((m_aClients[m_Snap.m_LocalClientId].m_Solo || m_aClients[ClientId].m_Solo) && !Local) - return true; - - if(m_Teams.Team(ClientId) == TEAM_SUPER || m_Teams.Team(m_Snap.m_LocalClientId) == TEAM_SUPER) - return false; - - return m_Teams.Team(ClientId) != m_Teams.Team(m_Snap.m_LocalClientId); -} - -int CGameClient::SwitchStateTeam() const -{ - if(m_aSwitchStateTeam[g_Config.m_ClDummy] >= 0) - return m_aSwitchStateTeam[g_Config.m_ClDummy]; - else if(m_Snap.m_LocalClientId < 0) - return 0; - else if(m_Snap.m_SpecInfo.m_Active && m_Snap.m_SpecInfo.m_SpectatorId != SPEC_FREEVIEW) - return m_Teams.Team(m_Snap.m_SpecInfo.m_SpectatorId); - return m_Teams.Team(m_Snap.m_LocalClientId); -} - -bool CGameClient::IsLocalCharSuper() const -{ - if(m_Snap.m_LocalClientId < 0) - return false; - return m_aClients[m_Snap.m_LocalClientId].m_Super; -} - -void CGameClient::LoadGameSkin(const char *pPath, bool AsDir) -{ - if(m_GameSkinLoaded) - { - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteHealthFull); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteHealthEmpty); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteArmorFull); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteArmorEmpty); - - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteWeaponHammerCursor); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteWeaponGunCursor); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteWeaponShotgunCursor); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteWeaponGrenadeCursor); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteWeaponNinjaCursor); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteWeaponLaserCursor); - - for(auto &SpriteWeaponCursor : m_GameSkin.m_aSpriteWeaponCursors) - { - SpriteWeaponCursor = IGraphics::CTextureHandle(); - } - - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteHookChain); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteHookHead); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteWeaponHammer); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteWeaponGun); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteWeaponShotgun); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteWeaponGrenade); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteWeaponNinja); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteWeaponLaser); - - for(auto &SpriteWeapon : m_GameSkin.m_aSpriteWeapons) - { - SpriteWeapon = IGraphics::CTextureHandle(); - } - - for(auto &SpriteParticle : m_GameSkin.m_aSpriteParticles) - { - Graphics()->UnloadTexture(&SpriteParticle); - } - - for(auto &SpriteStar : m_GameSkin.m_aSpriteStars) - { - Graphics()->UnloadTexture(&SpriteStar); - } - - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteWeaponGunProjectile); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteWeaponShotgunProjectile); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteWeaponGrenadeProjectile); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteWeaponHammerProjectile); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteWeaponNinjaProjectile); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteWeaponLaserProjectile); - - for(auto &SpriteWeaponProjectile : m_GameSkin.m_aSpriteWeaponProjectiles) - { - SpriteWeaponProjectile = IGraphics::CTextureHandle(); - } - - for(int i = 0; i < 3; ++i) - { - Graphics()->UnloadTexture(&m_GameSkin.m_aSpriteWeaponGunMuzzles[i]); - Graphics()->UnloadTexture(&m_GameSkin.m_aSpriteWeaponShotgunMuzzles[i]); - Graphics()->UnloadTexture(&m_GameSkin.m_aaSpriteWeaponNinjaMuzzles[i]); - - for(auto &SpriteWeaponsMuzzle : m_GameSkin.m_aaSpriteWeaponsMuzzles) - { - SpriteWeaponsMuzzle[i] = IGraphics::CTextureHandle(); - } - } - - Graphics()->UnloadTexture(&m_GameSkin.m_SpritePickupHealth); - Graphics()->UnloadTexture(&m_GameSkin.m_SpritePickupArmor); - Graphics()->UnloadTexture(&m_GameSkin.m_SpritePickupArmorShotgun); - Graphics()->UnloadTexture(&m_GameSkin.m_SpritePickupArmorGrenade); - Graphics()->UnloadTexture(&m_GameSkin.m_SpritePickupArmorLaser); - Graphics()->UnloadTexture(&m_GameSkin.m_SpritePickupArmorNinja); - Graphics()->UnloadTexture(&m_GameSkin.m_SpritePickupGrenade); - Graphics()->UnloadTexture(&m_GameSkin.m_SpritePickupShotgun); - Graphics()->UnloadTexture(&m_GameSkin.m_SpritePickupLaser); - Graphics()->UnloadTexture(&m_GameSkin.m_SpritePickupNinja); - Graphics()->UnloadTexture(&m_GameSkin.m_SpritePickupGun); - Graphics()->UnloadTexture(&m_GameSkin.m_SpritePickupHammer); - - for(auto &SpritePickupWeapon : m_GameSkin.m_aSpritePickupWeapons) - { - SpritePickupWeapon = IGraphics::CTextureHandle(); - } - - for(auto &SpritePickupWeaponArmor : m_GameSkin.m_aSpritePickupWeaponArmor) - { - SpritePickupWeaponArmor = IGraphics::CTextureHandle(); - } - - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteFlagBlue); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteFlagRed); - - if(m_GameSkin.IsSixup()) - { - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteNinjaBarFullLeft); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteNinjaBarFull); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteNinjaBarEmpty); - Graphics()->UnloadTexture(&m_GameSkin.m_SpriteNinjaBarEmptyRight); - } - - m_GameSkinLoaded = false; - } - - char aPath[IO_MAX_PATH_LENGTH]; - bool IsDefault = false; - if(str_comp(pPath, "default") == 0) - { - str_copy(aPath, g_pData->m_aImages[IMAGE_GAME].m_pFilename); - IsDefault = true; - } - else - { - if(AsDir) - str_format(aPath, sizeof(aPath), "assets/game/%s/%s", pPath, g_pData->m_aImages[IMAGE_GAME].m_pFilename); - else - str_format(aPath, sizeof(aPath), "assets/game/%s.png", pPath); - } - - CImageInfo ImgInfo; - bool PngLoaded = Graphics()->LoadPng(ImgInfo, aPath, IStorage::TYPE_ALL); - if(!PngLoaded && !IsDefault) - { - if(AsDir) - LoadGameSkin("default"); - else - LoadGameSkin(pPath, true); - } - else if(PngLoaded && Graphics()->CheckImageDivisibility(aPath, ImgInfo, g_pData->m_aSprites[SPRITE_HEALTH_FULL].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_HEALTH_FULL].m_pSet->m_Gridy, true) && Graphics()->IsImageFormatRgba(aPath, ImgInfo)) - { - m_GameSkin.m_SpriteHealthFull = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HEALTH_FULL]); - m_GameSkin.m_SpriteHealthEmpty = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HEALTH_EMPTY]); - m_GameSkin.m_SpriteArmorFull = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_ARMOR_FULL]); - m_GameSkin.m_SpriteArmorEmpty = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_ARMOR_EMPTY]); - - m_GameSkin.m_SpriteWeaponHammerCursor = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_WEAPON_HAMMER_CURSOR]); - m_GameSkin.m_SpriteWeaponGunCursor = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_WEAPON_GUN_CURSOR]); - m_GameSkin.m_SpriteWeaponShotgunCursor = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_WEAPON_SHOTGUN_CURSOR]); - m_GameSkin.m_SpriteWeaponGrenadeCursor = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_WEAPON_GRENADE_CURSOR]); - m_GameSkin.m_SpriteWeaponNinjaCursor = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_WEAPON_NINJA_CURSOR]); - m_GameSkin.m_SpriteWeaponLaserCursor = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_WEAPON_LASER_CURSOR]); - - m_GameSkin.m_aSpriteWeaponCursors[0] = m_GameSkin.m_SpriteWeaponHammerCursor; - m_GameSkin.m_aSpriteWeaponCursors[1] = m_GameSkin.m_SpriteWeaponGunCursor; - m_GameSkin.m_aSpriteWeaponCursors[2] = m_GameSkin.m_SpriteWeaponShotgunCursor; - m_GameSkin.m_aSpriteWeaponCursors[3] = m_GameSkin.m_SpriteWeaponGrenadeCursor; - m_GameSkin.m_aSpriteWeaponCursors[4] = m_GameSkin.m_SpriteWeaponLaserCursor; - m_GameSkin.m_aSpriteWeaponCursors[5] = m_GameSkin.m_SpriteWeaponNinjaCursor; - - // weapons and hook - m_GameSkin.m_SpriteHookChain = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HOOK_CHAIN]); - m_GameSkin.m_SpriteHookHead = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HOOK_HEAD]); - m_GameSkin.m_SpriteWeaponHammer = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_WEAPON_HAMMER_BODY]); - m_GameSkin.m_SpriteWeaponGun = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_WEAPON_GUN_BODY]); - m_GameSkin.m_SpriteWeaponShotgun = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_WEAPON_SHOTGUN_BODY]); - m_GameSkin.m_SpriteWeaponGrenade = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_WEAPON_GRENADE_BODY]); - m_GameSkin.m_SpriteWeaponNinja = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_WEAPON_NINJA_BODY]); - m_GameSkin.m_SpriteWeaponLaser = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_WEAPON_LASER_BODY]); - - m_GameSkin.m_aSpriteWeapons[0] = m_GameSkin.m_SpriteWeaponHammer; - m_GameSkin.m_aSpriteWeapons[1] = m_GameSkin.m_SpriteWeaponGun; - m_GameSkin.m_aSpriteWeapons[2] = m_GameSkin.m_SpriteWeaponShotgun; - m_GameSkin.m_aSpriteWeapons[3] = m_GameSkin.m_SpriteWeaponGrenade; - m_GameSkin.m_aSpriteWeapons[4] = m_GameSkin.m_SpriteWeaponLaser; - m_GameSkin.m_aSpriteWeapons[5] = m_GameSkin.m_SpriteWeaponNinja; - - // particles - for(int i = 0; i < 9; ++i) - { - m_GameSkin.m_aSpriteParticles[i] = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PART1 + i]); - } - - // stars - for(int i = 0; i < 3; ++i) - { - m_GameSkin.m_aSpriteStars[i] = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_STAR1 + i]); - } - - // projectiles - m_GameSkin.m_SpriteWeaponGunProjectile = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_WEAPON_GUN_PROJ]); - m_GameSkin.m_SpriteWeaponShotgunProjectile = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_WEAPON_SHOTGUN_PROJ]); - m_GameSkin.m_SpriteWeaponGrenadeProjectile = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_WEAPON_GRENADE_PROJ]); - - // these weapons have no projectiles - m_GameSkin.m_SpriteWeaponHammerProjectile = IGraphics::CTextureHandle(); - m_GameSkin.m_SpriteWeaponNinjaProjectile = IGraphics::CTextureHandle(); - - m_GameSkin.m_SpriteWeaponLaserProjectile = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_WEAPON_LASER_PROJ]); - - m_GameSkin.m_aSpriteWeaponProjectiles[0] = m_GameSkin.m_SpriteWeaponHammerProjectile; - m_GameSkin.m_aSpriteWeaponProjectiles[1] = m_GameSkin.m_SpriteWeaponGunProjectile; - m_GameSkin.m_aSpriteWeaponProjectiles[2] = m_GameSkin.m_SpriteWeaponShotgunProjectile; - m_GameSkin.m_aSpriteWeaponProjectiles[3] = m_GameSkin.m_SpriteWeaponGrenadeProjectile; - m_GameSkin.m_aSpriteWeaponProjectiles[4] = m_GameSkin.m_SpriteWeaponLaserProjectile; - m_GameSkin.m_aSpriteWeaponProjectiles[5] = m_GameSkin.m_SpriteWeaponNinjaProjectile; - - // muzzles - for(int i = 0; i < 3; ++i) - { - m_GameSkin.m_aSpriteWeaponGunMuzzles[i] = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_WEAPON_GUN_MUZZLE1 + i]); - m_GameSkin.m_aSpriteWeaponShotgunMuzzles[i] = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_WEAPON_SHOTGUN_MUZZLE1 + i]); - m_GameSkin.m_aaSpriteWeaponNinjaMuzzles[i] = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_WEAPON_NINJA_MUZZLE1 + i]); - - m_GameSkin.m_aaSpriteWeaponsMuzzles[1][i] = m_GameSkin.m_aSpriteWeaponGunMuzzles[i]; - m_GameSkin.m_aaSpriteWeaponsMuzzles[2][i] = m_GameSkin.m_aSpriteWeaponShotgunMuzzles[i]; - m_GameSkin.m_aaSpriteWeaponsMuzzles[5][i] = m_GameSkin.m_aaSpriteWeaponNinjaMuzzles[i]; - } - - // pickups - m_GameSkin.m_SpritePickupHealth = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PICKUP_HEALTH]); - m_GameSkin.m_SpritePickupArmor = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PICKUP_ARMOR]); - m_GameSkin.m_SpritePickupHammer = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PICKUP_HAMMER]); - m_GameSkin.m_SpritePickupGun = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PICKUP_GUN]); - m_GameSkin.m_SpritePickupShotgun = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PICKUP_SHOTGUN]); - m_GameSkin.m_SpritePickupGrenade = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PICKUP_GRENADE]); - m_GameSkin.m_SpritePickupLaser = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PICKUP_LASER]); - m_GameSkin.m_SpritePickupNinja = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PICKUP_NINJA]); - m_GameSkin.m_SpritePickupArmorShotgun = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PICKUP_ARMOR_SHOTGUN]); - m_GameSkin.m_SpritePickupArmorGrenade = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PICKUP_ARMOR_GRENADE]); - m_GameSkin.m_SpritePickupArmorNinja = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PICKUP_ARMOR_NINJA]); - m_GameSkin.m_SpritePickupArmorLaser = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PICKUP_ARMOR_LASER]); - - m_GameSkin.m_aSpritePickupWeapons[0] = m_GameSkin.m_SpritePickupHammer; - m_GameSkin.m_aSpritePickupWeapons[1] = m_GameSkin.m_SpritePickupGun; - m_GameSkin.m_aSpritePickupWeapons[2] = m_GameSkin.m_SpritePickupShotgun; - m_GameSkin.m_aSpritePickupWeapons[3] = m_GameSkin.m_SpritePickupGrenade; - m_GameSkin.m_aSpritePickupWeapons[4] = m_GameSkin.m_SpritePickupLaser; - m_GameSkin.m_aSpritePickupWeapons[5] = m_GameSkin.m_SpritePickupNinja; - - m_GameSkin.m_aSpritePickupWeaponArmor[0] = m_GameSkin.m_SpritePickupArmorShotgun; - m_GameSkin.m_aSpritePickupWeaponArmor[1] = m_GameSkin.m_SpritePickupArmorGrenade; - m_GameSkin.m_aSpritePickupWeaponArmor[2] = m_GameSkin.m_SpritePickupArmorNinja; - m_GameSkin.m_aSpritePickupWeaponArmor[3] = m_GameSkin.m_SpritePickupArmorLaser; - - // flags - m_GameSkin.m_SpriteFlagBlue = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_FLAG_BLUE]); - m_GameSkin.m_SpriteFlagRed = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_FLAG_RED]); - - // ninja bar (0.7) - if(!Graphics()->IsSpriteTextureFullyTransparent(ImgInfo, &client_data7::g_pData->m_aSprites[client_data7::SPRITE_NINJA_BAR_FULL_LEFT]) || - !Graphics()->IsSpriteTextureFullyTransparent(ImgInfo, &client_data7::g_pData->m_aSprites[client_data7::SPRITE_NINJA_BAR_FULL]) || - !Graphics()->IsSpriteTextureFullyTransparent(ImgInfo, &client_data7::g_pData->m_aSprites[client_data7::SPRITE_NINJA_BAR_EMPTY]) || - !Graphics()->IsSpriteTextureFullyTransparent(ImgInfo, &client_data7::g_pData->m_aSprites[client_data7::SPRITE_NINJA_BAR_EMPTY_RIGHT])) - { - m_GameSkin.m_SpriteNinjaBarFullLeft = Graphics()->LoadSpriteTexture(ImgInfo, &client_data7::g_pData->m_aSprites[client_data7::SPRITE_NINJA_BAR_FULL_LEFT]); - m_GameSkin.m_SpriteNinjaBarFull = Graphics()->LoadSpriteTexture(ImgInfo, &client_data7::g_pData->m_aSprites[client_data7::SPRITE_NINJA_BAR_FULL]); - m_GameSkin.m_SpriteNinjaBarEmpty = Graphics()->LoadSpriteTexture(ImgInfo, &client_data7::g_pData->m_aSprites[client_data7::SPRITE_NINJA_BAR_EMPTY]); - m_GameSkin.m_SpriteNinjaBarEmptyRight = Graphics()->LoadSpriteTexture(ImgInfo, &client_data7::g_pData->m_aSprites[client_data7::SPRITE_NINJA_BAR_EMPTY_RIGHT]); - } - - m_GameSkinLoaded = true; - } - ImgInfo.Free(); -} - -void CGameClient::LoadEmoticonsSkin(const char *pPath, bool AsDir) -{ - if(m_EmoticonsSkinLoaded) - { - for(auto &SpriteEmoticon : m_EmoticonsSkin.m_aSpriteEmoticons) - Graphics()->UnloadTexture(&SpriteEmoticon); - - m_EmoticonsSkinLoaded = false; - } - - char aPath[IO_MAX_PATH_LENGTH]; - bool IsDefault = false; - if(str_comp(pPath, "default") == 0) - { - str_copy(aPath, g_pData->m_aImages[IMAGE_EMOTICONS].m_pFilename); - IsDefault = true; - } - else - { - if(AsDir) - str_format(aPath, sizeof(aPath), "assets/emoticons/%s/%s", pPath, g_pData->m_aImages[IMAGE_EMOTICONS].m_pFilename); - else - str_format(aPath, sizeof(aPath), "assets/emoticons/%s.png", pPath); - } - - CImageInfo ImgInfo; - bool PngLoaded = Graphics()->LoadPng(ImgInfo, aPath, IStorage::TYPE_ALL); - if(!PngLoaded && !IsDefault) - { - if(AsDir) - LoadEmoticonsSkin("default"); - else - LoadEmoticonsSkin(pPath, true); - } - else if(PngLoaded && Graphics()->CheckImageDivisibility(aPath, ImgInfo, g_pData->m_aSprites[SPRITE_OOP].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_OOP].m_pSet->m_Gridy, true) && Graphics()->IsImageFormatRgba(aPath, ImgInfo)) - { - for(int i = 0; i < 16; ++i) - m_EmoticonsSkin.m_aSpriteEmoticons[i] = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_OOP + i]); - - m_EmoticonsSkinLoaded = true; - } - ImgInfo.Free(); -} - -void CGameClient::LoadParticlesSkin(const char *pPath, bool AsDir) -{ - if(m_ParticlesSkinLoaded) - { - Graphics()->UnloadTexture(&m_ParticlesSkin.m_SpriteParticleSlice); - Graphics()->UnloadTexture(&m_ParticlesSkin.m_SpriteParticleBall); - for(auto &SpriteParticleSplat : m_ParticlesSkin.m_aSpriteParticleSplat) - Graphics()->UnloadTexture(&SpriteParticleSplat); - Graphics()->UnloadTexture(&m_ParticlesSkin.m_SpriteParticleSmoke); - Graphics()->UnloadTexture(&m_ParticlesSkin.m_SpriteParticleShell); - Graphics()->UnloadTexture(&m_ParticlesSkin.m_SpriteParticleExpl); - Graphics()->UnloadTexture(&m_ParticlesSkin.m_SpriteParticleAirJump); - Graphics()->UnloadTexture(&m_ParticlesSkin.m_SpriteParticleHit); - - for(auto &SpriteParticle : m_ParticlesSkin.m_aSpriteParticles) - SpriteParticle = IGraphics::CTextureHandle(); - - m_ParticlesSkinLoaded = false; - } - - char aPath[IO_MAX_PATH_LENGTH]; - bool IsDefault = false; - if(str_comp(pPath, "default") == 0) - { - str_copy(aPath, g_pData->m_aImages[IMAGE_PARTICLES].m_pFilename); - IsDefault = true; - } - else - { - if(AsDir) - str_format(aPath, sizeof(aPath), "assets/particles/%s/%s", pPath, g_pData->m_aImages[IMAGE_PARTICLES].m_pFilename); - else - str_format(aPath, sizeof(aPath), "assets/particles/%s.png", pPath); - } - - CImageInfo ImgInfo; - bool PngLoaded = Graphics()->LoadPng(ImgInfo, aPath, IStorage::TYPE_ALL); - if(!PngLoaded && !IsDefault) - { - if(AsDir) - LoadParticlesSkin("default"); - else - LoadParticlesSkin(pPath, true); - } - else if(PngLoaded && Graphics()->CheckImageDivisibility(aPath, ImgInfo, g_pData->m_aSprites[SPRITE_PART_SLICE].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_PART_SLICE].m_pSet->m_Gridy, true) && Graphics()->IsImageFormatRgba(aPath, ImgInfo)) - { - m_ParticlesSkin.m_SpriteParticleSlice = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PART_SLICE]); - m_ParticlesSkin.m_SpriteParticleBall = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PART_BALL]); - for(int i = 0; i < 3; ++i) - m_ParticlesSkin.m_aSpriteParticleSplat[i] = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PART_SPLAT01 + i]); - m_ParticlesSkin.m_SpriteParticleSmoke = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PART_SMOKE]); - m_ParticlesSkin.m_SpriteParticleShell = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PART_SHELL]); - m_ParticlesSkin.m_SpriteParticleExpl = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PART_EXPL01]); - m_ParticlesSkin.m_SpriteParticleAirJump = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PART_AIRJUMP]); - m_ParticlesSkin.m_SpriteParticleHit = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PART_HIT01]); - - m_ParticlesSkin.m_aSpriteParticles[0] = m_ParticlesSkin.m_SpriteParticleSlice; - m_ParticlesSkin.m_aSpriteParticles[1] = m_ParticlesSkin.m_SpriteParticleBall; - for(int i = 0; i < 3; ++i) - m_ParticlesSkin.m_aSpriteParticles[2 + i] = m_ParticlesSkin.m_aSpriteParticleSplat[i]; - m_ParticlesSkin.m_aSpriteParticles[5] = m_ParticlesSkin.m_SpriteParticleSmoke; - m_ParticlesSkin.m_aSpriteParticles[6] = m_ParticlesSkin.m_SpriteParticleShell; - m_ParticlesSkin.m_aSpriteParticles[7] = m_ParticlesSkin.m_SpriteParticleExpl; - m_ParticlesSkin.m_aSpriteParticles[8] = m_ParticlesSkin.m_SpriteParticleAirJump; - m_ParticlesSkin.m_aSpriteParticles[9] = m_ParticlesSkin.m_SpriteParticleHit; - - m_ParticlesSkinLoaded = true; - } - ImgInfo.Free(); -} - -void CGameClient::LoadHudSkin(const char *pPath, bool AsDir) -{ - if(m_HudSkinLoaded) - { - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudAirjump); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudAirjumpEmpty); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudSolo); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudCollisionDisabled); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudEndlessJump); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudEndlessHook); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudJetpack); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudFreezeBarFullLeft); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudFreezeBarFull); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudFreezeBarEmpty); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudFreezeBarEmptyRight); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudNinjaBarFullLeft); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudNinjaBarFull); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudNinjaBarEmpty); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudNinjaBarEmptyRight); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudHookHitDisabled); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudHammerHitDisabled); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudShotgunHitDisabled); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudGrenadeHitDisabled); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudLaserHitDisabled); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudGunHitDisabled); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudDeepFrozen); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudLiveFrozen); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudTeleportGrenade); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudTeleportGun); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudTeleportLaser); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudPracticeMode); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudLockMode); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudTeam0Mode); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudDummyHammer); - Graphics()->UnloadTexture(&m_HudSkin.m_SpriteHudDummyCopy); - m_HudSkinLoaded = false; - } - - char aPath[IO_MAX_PATH_LENGTH]; - bool IsDefault = false; - if(str_comp(pPath, "default") == 0) - { - str_copy(aPath, g_pData->m_aImages[IMAGE_HUD].m_pFilename); - IsDefault = true; - } - else - { - if(AsDir) - str_format(aPath, sizeof(aPath), "assets/hud/%s/%s", pPath, g_pData->m_aImages[IMAGE_HUD].m_pFilename); - else - str_format(aPath, sizeof(aPath), "assets/hud/%s.png", pPath); - } - - CImageInfo ImgInfo; - bool PngLoaded = Graphics()->LoadPng(ImgInfo, aPath, IStorage::TYPE_ALL); - if(!PngLoaded && !IsDefault) - { - if(AsDir) - LoadHudSkin("default"); - else - LoadHudSkin(pPath, true); - } - else if(PngLoaded && Graphics()->CheckImageDivisibility(aPath, ImgInfo, g_pData->m_aSprites[SPRITE_HUD_AIRJUMP].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_HUD_AIRJUMP].m_pSet->m_Gridy, true) && Graphics()->IsImageFormatRgba(aPath, ImgInfo)) - { - m_HudSkin.m_SpriteHudAirjump = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_AIRJUMP]); - m_HudSkin.m_SpriteHudAirjumpEmpty = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_AIRJUMP_EMPTY]); - m_HudSkin.m_SpriteHudSolo = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_SOLO]); - m_HudSkin.m_SpriteHudCollisionDisabled = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_COLLISION_DISABLED]); - m_HudSkin.m_SpriteHudEndlessJump = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_ENDLESS_JUMP]); - m_HudSkin.m_SpriteHudEndlessHook = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_ENDLESS_HOOK]); - m_HudSkin.m_SpriteHudJetpack = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_JETPACK]); - m_HudSkin.m_SpriteHudFreezeBarFullLeft = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_FREEZE_BAR_FULL_LEFT]); - m_HudSkin.m_SpriteHudFreezeBarFull = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_FREEZE_BAR_FULL]); - m_HudSkin.m_SpriteHudFreezeBarEmpty = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_FREEZE_BAR_EMPTY]); - m_HudSkin.m_SpriteHudFreezeBarEmptyRight = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_FREEZE_BAR_EMPTY_RIGHT]); - m_HudSkin.m_SpriteHudNinjaBarFullLeft = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_NINJA_BAR_FULL_LEFT]); - m_HudSkin.m_SpriteHudNinjaBarFull = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_NINJA_BAR_FULL]); - m_HudSkin.m_SpriteHudNinjaBarEmpty = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_NINJA_BAR_EMPTY]); - m_HudSkin.m_SpriteHudNinjaBarEmptyRight = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_NINJA_BAR_EMPTY_RIGHT]); - m_HudSkin.m_SpriteHudHookHitDisabled = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_HOOK_HIT_DISABLED]); - m_HudSkin.m_SpriteHudHammerHitDisabled = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_HAMMER_HIT_DISABLED]); - m_HudSkin.m_SpriteHudShotgunHitDisabled = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_SHOTGUN_HIT_DISABLED]); - m_HudSkin.m_SpriteHudGrenadeHitDisabled = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_GRENADE_HIT_DISABLED]); - m_HudSkin.m_SpriteHudLaserHitDisabled = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_LASER_HIT_DISABLED]); - m_HudSkin.m_SpriteHudGunHitDisabled = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_GUN_HIT_DISABLED]); - m_HudSkin.m_SpriteHudDeepFrozen = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_DEEP_FROZEN]); - m_HudSkin.m_SpriteHudLiveFrozen = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_LIVE_FROZEN]); - m_HudSkin.m_SpriteHudTeleportGrenade = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_TELEPORT_GRENADE]); - m_HudSkin.m_SpriteHudTeleportGun = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_TELEPORT_GUN]); - m_HudSkin.m_SpriteHudTeleportLaser = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_TELEPORT_LASER]); - m_HudSkin.m_SpriteHudPracticeMode = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_PRACTICE_MODE]); - m_HudSkin.m_SpriteHudLockMode = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_LOCK_MODE]); - m_HudSkin.m_SpriteHudTeam0Mode = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_TEAM0_MODE]); - m_HudSkin.m_SpriteHudDummyHammer = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_DUMMY_HAMMER]); - m_HudSkin.m_SpriteHudDummyCopy = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_DUMMY_COPY]); - - m_HudSkinLoaded = true; - } - ImgInfo.Free(); -} - -void CGameClient::LoadExtrasSkin(const char *pPath, bool AsDir) -{ - if(m_ExtrasSkinLoaded) - { - Graphics()->UnloadTexture(&m_ExtrasSkin.m_SpriteParticleSnowflake); - Graphics()->UnloadTexture(&m_ExtrasSkin.m_SpriteParticleSparkle); - - for(auto &SpriteParticle : m_ExtrasSkin.m_aSpriteParticles) - SpriteParticle = IGraphics::CTextureHandle(); - - m_ExtrasSkinLoaded = false; - } - - char aPath[IO_MAX_PATH_LENGTH]; - bool IsDefault = false; - if(str_comp(pPath, "default") == 0) - { - str_copy(aPath, g_pData->m_aImages[IMAGE_EXTRAS].m_pFilename); - IsDefault = true; - } - else - { - if(AsDir) - str_format(aPath, sizeof(aPath), "assets/extras/%s/%s", pPath, g_pData->m_aImages[IMAGE_EXTRAS].m_pFilename); - else - str_format(aPath, sizeof(aPath), "assets/extras/%s.png", pPath); - } - - CImageInfo ImgInfo; - bool PngLoaded = Graphics()->LoadPng(ImgInfo, aPath, IStorage::TYPE_ALL); - if(!PngLoaded && !IsDefault) - { - if(AsDir) - LoadExtrasSkin("default"); - else - LoadExtrasSkin(pPath, true); - } - else if(PngLoaded && Graphics()->CheckImageDivisibility(aPath, ImgInfo, g_pData->m_aSprites[SPRITE_PART_SNOWFLAKE].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_PART_SNOWFLAKE].m_pSet->m_Gridy, true) && Graphics()->IsImageFormatRgba(aPath, ImgInfo)) - { - m_ExtrasSkin.m_SpriteParticleSnowflake = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PART_SNOWFLAKE]); - m_ExtrasSkin.m_SpriteParticleSparkle = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PART_SPARKLE]); - - m_ExtrasSkin.m_aSpriteParticles[0] = m_ExtrasSkin.m_SpriteParticleSnowflake; - m_ExtrasSkin.m_aSpriteParticles[1] = m_ExtrasSkin.m_SpriteParticleSparkle; - - m_ExtrasSkinLoaded = true; - } - ImgInfo.Free(); -} - -void CGameClient::RefreshSkins() -{ - const auto SkinStartLoadTime = time_get_nanoseconds(); - m_Skins.Refresh([&]() { - // if skin refreshing takes to long, swap to a loading screen - if(time_get_nanoseconds() - SkinStartLoadTime > 500ms) - { - m_Menus.RenderLoading(Localize("Loading skin files"), "", 0); - } - }); - - for(auto &Client : m_aClients) - { - Client.m_SkinInfo.Apply(m_Skins.Find(Client.m_aSkinName)); - Client.UpdateRenderInfo(IsTeamPlay()); - } - - for(auto &pComponent : m_vpAll) - pComponent->OnRefreshSkins(); -} - -void CGameClient::ConchainRefreshSkins(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - CGameClient *pThis = static_cast(pUserData); - pfnCallback(pResult, pCallbackUserData); - if(pResult->NumArguments() && pThis->m_Menus.IsInit()) - { - pThis->RefreshSkins(); - } -} - -static bool UnknownMapSettingCallback(const char *pCommand, void *pUser) -{ - return true; -} - -void CGameClient::LoadMapSettings() -{ - // Reset Tunezones - CTuningParams TuningParams; - for(int i = 0; i < NUM_TUNEZONES; i++) - { - TuningList()[i] = TuningParams; - - // only hardcode ddrace tuning for the tune zones - // and not the base tuning - // that one will be sent by the server if needed - if(!i) - continue; - - TuningList()[i].Set("gun_curvature", 0); - TuningList()[i].Set("gun_speed", 1400); - TuningList()[i].Set("shotgun_curvature", 0); - TuningList()[i].Set("shotgun_speed", 500); - TuningList()[i].Set("shotgun_speeddiff", 0); - } - - // Load map tunings - IMap *pMap = Kernel()->RequestInterface(); - int Start, Num; - pMap->GetType(MAPITEMTYPE_INFO, &Start, &Num); - for(int i = Start; i < Start + Num; i++) - { - int ItemId; - CMapItemInfoSettings *pItem = (CMapItemInfoSettings *)pMap->GetItem(i, nullptr, &ItemId); - int ItemSize = pMap->GetItemSize(i); - if(!pItem || ItemId != 0) - continue; - - if(ItemSize < (int)sizeof(CMapItemInfoSettings)) - break; - if(!(pItem->m_Settings > -1)) - break; - - int Size = pMap->GetDataSize(pItem->m_Settings); - char *pSettings = (char *)pMap->GetData(pItem->m_Settings); - char *pNext = pSettings; - Console()->SetUnknownCommandCallback(UnknownMapSettingCallback, nullptr); - while(pNext < pSettings + Size) - { - int StrSize = str_length(pNext) + 1; - Console()->ExecuteLine(pNext, IConsole::CLIENT_ID_GAME); - pNext += StrSize; - } - Console()->SetUnknownCommandCallback(IConsole::EmptyUnknownCommandCallback, nullptr); - pMap->UnloadData(pItem->m_Settings); - break; - } -} - -void CGameClient::ConTuneZone(IConsole::IResult *pResult, void *pUserData) -{ - CGameClient *pSelf = (CGameClient *)pUserData; - int List = pResult->GetInteger(0); - const char *pParamName = pResult->GetString(1); - float NewValue = pResult->GetFloat(2); - - if(List >= 0 && List < NUM_TUNEZONES) - pSelf->TuningList()[List].Set(pParamName, NewValue); -} - -void CGameClient::ConchainMenuMap(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) -{ - CGameClient *pSelf = (CGameClient *)pUserData; - if(pResult->NumArguments()) - { - if(str_comp(g_Config.m_ClMenuMap, pResult->GetString(0)) != 0) - { - str_copy(g_Config.m_ClMenuMap, pResult->GetString(0)); - pSelf->m_MenuBackground.LoadMenuBackground(); - } - } - else - pfnCallback(pResult, pCallbackUserData); -} - -void CGameClient::DummyResetInput() -{ - if(!Client()->DummyConnected()) - return; - - if((m_DummyInput.m_Fire & 1) != 0) - m_DummyInput.m_Fire++; - - m_Controls.ResetInput(!g_Config.m_ClDummy); - m_Controls.m_aInputData[!g_Config.m_ClDummy].m_Hook = 0; - m_Controls.m_aInputData[!g_Config.m_ClDummy].m_Fire = m_DummyInput.m_Fire; - - m_DummyInput = m_Controls.m_aInputData[!g_Config.m_ClDummy]; -} - -bool CGameClient::CanDisplayWarning() const -{ - return m_Menus.CanDisplayWarning(); -} - -CNetObjHandler *CGameClient::GetNetObjHandler() -{ - return &m_NetObjHandler; -} - -protocol7::CNetObjHandler *CGameClient::GetNetObjHandler7() -{ - return &m_NetObjHandler7; -} - -void CGameClient::SnapCollectEntities() -{ - int NumSnapItems = Client()->SnapNumItems(IClient::SNAP_CURRENT); - - std::vector vItemData; - std::vector vItemEx; - - for(int Index = 0; Index < NumSnapItems; Index++) - { - const IClient::CSnapItem Item = Client()->SnapGetItem(IClient::SNAP_CURRENT, Index); - if(Item.m_Type == NETOBJTYPE_ENTITYEX) - vItemEx.push_back({Item, nullptr}); - else if(Item.m_Type == NETOBJTYPE_PICKUP || Item.m_Type == NETOBJTYPE_DDNETPICKUP || Item.m_Type == NETOBJTYPE_LASER || Item.m_Type == NETOBJTYPE_DDNETLASER || Item.m_Type == NETOBJTYPE_PROJECTILE || Item.m_Type == NETOBJTYPE_DDRACEPROJECTILE || Item.m_Type == NETOBJTYPE_DDNETPROJECTILE) - vItemData.push_back({Item, nullptr}); - } - - // sort by id - class CEntComparer - { - public: - bool operator()(const CSnapEntities &Lhs, const CSnapEntities &Rhs) const - { - return Lhs.m_Item.m_Id < Rhs.m_Item.m_Id; - } - }; - - std::sort(vItemData.begin(), vItemData.end(), CEntComparer()); - std::sort(vItemEx.begin(), vItemEx.end(), CEntComparer()); - - // merge extended items with items they belong to - m_vSnapEntities.clear(); - - size_t IndexEx = 0; - for(const CSnapEntities &Ent : vItemData) - { - while(IndexEx < vItemEx.size() && vItemEx[IndexEx].m_Item.m_Id < Ent.m_Item.m_Id) - IndexEx++; - - const CNetObj_EntityEx *pDataEx = nullptr; - if(IndexEx < vItemEx.size() && vItemEx[IndexEx].m_Item.m_Id == Ent.m_Item.m_Id) - pDataEx = (const CNetObj_EntityEx *)vItemEx[IndexEx].m_Item.m_pData; - - m_vSnapEntities.push_back({Ent.m_Item, pDataEx}); - } -} - -void CGameClient::HandleMultiView() -{ - bool IsTeamZero = IsMultiViewIdSet(); - bool Init = false; - int AmountPlayers = 0; - vec2 Minpos, Maxpos; - float TmpVel = 0.0f; - - for(int i = 0; i < MAX_CLIENTS; i++) - { - // look at players who are vanished - if(m_MultiView.m_aVanish[i]) - { - // not in freeze anymore and the delay is over - if(m_MultiView.m_aLastFreeze[i] + 6.0f <= Client()->LocalTime() && m_aClients[i].m_FreezeEnd == 0) - { - m_MultiView.m_aVanish[i] = false; - m_MultiView.m_aLastFreeze[i] = 0.0f; - } - } - - // we look at team 0 and the player is not in the spec list - if(IsTeamZero && !m_aMultiViewId[i]) - continue; - - // player is vanished - if(m_MultiView.m_aVanish[i]) - continue; - - // the player is not in the team we are spectating - if(m_Teams.Team(i) != m_MultiViewTeam) - continue; - - vec2 PlayerPos; - if(m_Snap.m_aCharacters[i].m_Active) - PlayerPos = vec2(m_aClients[i].m_RenderPos.x, m_aClients[i].m_RenderPos.y); - else if(m_aClients[i].m_Spec) // tee is in spec - PlayerPos = m_aClients[i].m_SpecChar; - else - continue; - - // player is far away and frozen - if(distance(m_MultiView.m_OldPos, PlayerPos) > 1100 && m_aClients[i].m_FreezeEnd != 0) - { - // check if the player is frozen for more than 3 seconds, if so vanish him - if(m_MultiView.m_aLastFreeze[i] == 0.0f) - m_MultiView.m_aLastFreeze[i] = Client()->LocalTime(); - else if(m_MultiView.m_aLastFreeze[i] + 3.0f <= Client()->LocalTime()) - { - m_MultiView.m_aVanish[i] = true; - // player we want to be vanished is our "main" tee, so lets switch the tee - if(i == m_Snap.m_SpecInfo.m_SpectatorId) - m_Spectator.Spectate(FindFirstMultiViewId()); - } - } - else if(m_MultiView.m_aLastFreeze[i] != 0) - m_MultiView.m_aLastFreeze[i] = 0; - - // set the minimum and maximum position - if(!Init) - { - Minpos = PlayerPos; - Maxpos = PlayerPos; - Init = true; - } - else - { - Minpos.x = std::min(Minpos.x, PlayerPos.x); - Maxpos.x = std::max(Maxpos.x, PlayerPos.x); - Minpos.y = std::min(Minpos.y, PlayerPos.y); - Maxpos.y = std::max(Maxpos.y, PlayerPos.y); - } - - // sum up the velocity of all players we are spectating - const CNetObj_Character &CurrentCharacter = m_Snap.m_aCharacters[i].m_Cur; - TmpVel += (length(vec2(CurrentCharacter.m_VelX / 256.0f, CurrentCharacter.m_VelY / 256.0f)) * 50) / 32.0f; - AmountPlayers++; - } - - // if we have found no players, we disable multi view - if(AmountPlayers == 0) - { - if(m_MultiView.m_SecondChance == 0.0f) - m_MultiView.m_SecondChance = Client()->LocalTime() + 0.3f; - else if(m_MultiView.m_SecondChance < Client()->LocalTime()) - { - ResetMultiView(); - return; - } - return; - } - else if(m_MultiView.m_SecondChance != 0.0f) - m_MultiView.m_SecondChance = 0.0f; - - // if we only have one tee that's in the list, we activate solo-mode - m_MultiView.m_Solo = std::count(std::begin(m_aMultiViewId), std::end(m_aMultiViewId), true) == 1; - - vec2 TargetPos = vec2((Minpos.x + Maxpos.x) / 2.0f, (Minpos.y + Maxpos.y) / 2.0f); - // dont hide the position hud if its only one player - m_MultiViewShowHud = AmountPlayers == 1; - // get the average velocity - float AvgVel = clamp(TmpVel / AmountPlayers ? TmpVel / (float)AmountPlayers : 0.0f, 0.0f, 1000.0f); - - if(m_MultiView.m_OldPersonalZoom == m_MultiViewPersonalZoom) - m_Camera.SetZoom(CalculateMultiViewZoom(Minpos, Maxpos, AvgVel), g_Config.m_ClMultiViewZoomSmoothness, false); - else - m_Camera.SetZoom(CalculateMultiViewZoom(Minpos, Maxpos, AvgVel), 50, false); - - m_Snap.m_SpecInfo.m_Position = m_MultiView.m_OldPos + ((TargetPos - m_MultiView.m_OldPos) * CalculateMultiViewMultiplier(TargetPos)); - m_MultiView.m_OldPos = m_Snap.m_SpecInfo.m_Position; - m_Snap.m_SpecInfo.m_UsePosition = true; -} - -bool CGameClient::InitMultiView(int Team) -{ - float Width, Height; - CleanMultiViewIds(); - m_MultiView.m_IsInit = true; - - // get the current view coordinates - RenderTools()->CalcScreenParams(Graphics()->ScreenAspect(), m_Camera.m_Zoom, &Width, &Height); - vec2 AxisX = vec2(m_Camera.m_Center.x - (Width / 2), m_Camera.m_Center.x + (Width / 2)); - vec2 AxisY = vec2(m_Camera.m_Center.y - (Height / 2), m_Camera.m_Center.y + (Height / 2)); - - if(Team > 0) - { - m_MultiViewTeam = Team; - for(int i = 0; i < MAX_CLIENTS; i++) - m_aMultiViewId[i] = m_Teams.Team(i) == Team; - } - else - { - // we want to allow spectating players in teams directly if there is no other team on screen - // to do that, -1 is used temporarily for "we don't know which team to spectate yet" - m_MultiViewTeam = -1; - - int Count = 0; - for(int i = 0; i < MAX_CLIENTS; i++) - { - vec2 PlayerPos; - - // get the position of the player - if(m_Snap.m_aCharacters[i].m_Active) - PlayerPos = vec2(m_Snap.m_aCharacters[i].m_Cur.m_X, m_Snap.m_aCharacters[i].m_Cur.m_Y); - else if(m_aClients[i].m_Spec) - PlayerPos = m_aClients[i].m_SpecChar; - else - continue; - - if(PlayerPos.x == 0 || PlayerPos.y == 0) - continue; - - // skip players that aren't in view - if(PlayerPos.x <= AxisX.x || PlayerPos.x >= AxisX.y || PlayerPos.y <= AxisY.x || PlayerPos.y >= AxisY.y) - continue; - - if(m_MultiViewTeam == -1) - { - // use the current player's team for now, but it might switch to team 0 if any other team is found - m_MultiViewTeam = m_Teams.Team(i); - } - else if(m_MultiViewTeam != 0 && m_Teams.Team(i) != m_MultiViewTeam) - { - // mismatched teams; remove all previously added players again and switch to team 0 instead - std::fill_n(m_aMultiViewId, i, false); - m_MultiViewTeam = 0; - } - - m_aMultiViewId[i] = true; - Count++; - } - - // might still be -1 if not a single player was in view; fallback to team 0 in that case - if(m_MultiViewTeam == -1) - m_MultiViewTeam = 0; - - // we are spectating only one player - m_MultiView.m_Solo = Count == 1; - } - - if(IsMultiViewIdSet()) - { - int SpectatorId = m_Snap.m_SpecInfo.m_SpectatorId; - int NewSpectatorId = -1; - - vec2 CurPosition(m_Camera.m_Center); - if(SpectatorId != SPEC_FREEVIEW) - { - const CNetObj_Character &CurCharacter = m_Snap.m_aCharacters[SpectatorId].m_Cur; - CurPosition.x = CurCharacter.m_X; - CurPosition.y = CurCharacter.m_Y; - } - - int ClosestDistance = std::numeric_limits::max(); - for(int i = 0; i < MAX_CLIENTS; i++) - { - if(!m_Snap.m_apPlayerInfos[i] || m_Snap.m_apPlayerInfos[i]->m_Team == TEAM_SPECTATORS || m_Teams.Team(i) != m_MultiViewTeam) - continue; - - vec2 PlayerPos; - if(m_Snap.m_aCharacters[i].m_Active) - PlayerPos = vec2(m_aClients[i].m_RenderPos.x, m_aClients[i].m_RenderPos.y); - else if(m_aClients[i].m_Spec) // tee is in spec - PlayerPos = m_aClients[i].m_SpecChar; - else - continue; - - int Distance = distance(CurPosition, PlayerPos); - if(NewSpectatorId == -1 || Distance < ClosestDistance) - { - NewSpectatorId = i; - ClosestDistance = Distance; - } - } - - if(NewSpectatorId > -1) - m_Spectator.Spectate(NewSpectatorId); - } - - return IsMultiViewIdSet(); -} - -float CGameClient::CalculateMultiViewMultiplier(vec2 TargetPos) -{ - float MaxCameraDist = 200.0f; - float MinCameraDist = 20.0f; - float MaxVel = g_Config.m_ClMultiViewSensitivity / 150.0f; - float MinVel = 0.007f; - float CurrentCameraDistance = distance(m_MultiView.m_OldPos, TargetPos); - float UpperLimit = 1.0f; - - if(m_MultiView.m_Teleported && CurrentCameraDistance <= 100) - m_MultiView.m_Teleported = false; - - // somebody got teleported very likely - if((m_MultiView.m_Teleported || CurrentCameraDistance - m_MultiView.m_OldCameraDistance > 100) && m_MultiView.m_OldCameraDistance != 0.0f) - { - UpperLimit = 0.1f; // dont try to compensate it by flickering - m_MultiView.m_Teleported = true; - } - m_MultiView.m_OldCameraDistance = CurrentCameraDistance; - - return clamp(MapValue(MaxCameraDist, MinCameraDist, MaxVel, MinVel, CurrentCameraDistance), MinVel, UpperLimit); -} - -float CGameClient::CalculateMultiViewZoom(vec2 MinPos, vec2 MaxPos, float Vel) -{ - float Ratio = Graphics()->ScreenAspect(); - float ZoomX = 0.0f, ZoomY; - - // only calc two axis if the aspect ratio is not 1:1 - if(Ratio != 1.0f) - ZoomX = (0.001309f - 0.000328 * Ratio) * (MaxPos.x - MinPos.x) + (0.741413f - 0.032959 * Ratio); - - // calculate the according zoom with linear function - ZoomY = 0.001309f * (MaxPos.y - MinPos.y) + 0.741413f; - // choose the highest zoom - float Zoom = std::max(ZoomX, ZoomY); - // zoom out to maximum 10 percent of the current zoom for 70 velocity - float Diff = clamp(MapValue(70.0f, 15.0f, Zoom * 0.10f, 0.0f, Vel), 0.0f, Zoom * 0.10f); - // zoom should stay between 1.1 and 20.0 - Zoom = clamp(Zoom + Diff, 1.1f, 20.0f); - // dont go below default zoom - Zoom = std::max(CCamera::ZoomStepsToValue(g_Config.m_ClDefaultZoom - 10), Zoom); - // add the user preference - Zoom -= (Zoom * 0.1f) * m_MultiViewPersonalZoom; - m_MultiView.m_OldPersonalZoom = m_MultiViewPersonalZoom; - - return Zoom; -} - -float CGameClient::MapValue(float MaxValue, float MinValue, float MaxRange, float MinRange, float Value) -{ - return (MaxRange - MinRange) / (MaxValue - MinValue) * (Value - MinValue) + MinRange; -} - -void CGameClient::ResetMultiView() -{ - m_Camera.SetZoom(CCamera::ZoomStepsToValue(g_Config.m_ClDefaultZoom - 10), g_Config.m_ClSmoothZoomTime, true); - m_MultiViewPersonalZoom = 0.0f; - m_MultiViewActivated = false; - m_MultiView.m_Solo = false; - m_MultiView.m_IsInit = false; - m_MultiView.m_Teleported = false; - m_MultiView.m_OldCameraDistance = 0.0f; -} - -void CGameClient::CleanMultiViewIds() -{ - std::fill(std::begin(m_aMultiViewId), std::end(m_aMultiViewId), false); - std::fill(std::begin(m_MultiView.m_aLastFreeze), std::end(m_MultiView.m_aLastFreeze), 0.0f); - std::fill(std::begin(m_MultiView.m_aVanish), std::end(m_MultiView.m_aVanish), false); -} - -void CGameClient::CleanMultiViewId(int ClientId) -{ - if(ClientId >= MAX_CLIENTS || ClientId < 0) - return; - - m_aMultiViewId[ClientId] = false; - m_MultiView.m_aLastFreeze[ClientId] = 0.0f; - m_MultiView.m_aVanish[ClientId] = false; -} - -bool CGameClient::IsMultiViewIdSet() -{ - return std::any_of(std::begin(m_aMultiViewId), std::end(m_aMultiViewId), [](bool IsSet) { return IsSet; }); -} - -int CGameClient::FindFirstMultiViewId() -{ - int ClientId = -1; - for(int i = 0; i < MAX_CLIENTS; i++) - { - if(m_aMultiViewId[i] && !m_MultiView.m_aVanish[i]) - return i; - } - return ClientId; -} diff --git a/src/game/client/gameclient.h b/src/game/client/gameclient.h deleted file mode 100644 index 10288126a0..0000000000 --- a/src/game/client/gameclient.h +++ /dev/null @@ -1,892 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_GAMECLIENT_H -#define GAME_CLIENT_GAMECLIENT_H - -#include "render.h" -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include -#include - -// components -#include "components/background.h" -#include "components/binds.h" -#include "components/broadcast.h" -#include "components/camera.h" -#include "components/chat.h" -#include "components/console.h" -#include "components/controls.h" -#include "components/countryflags.h" -#include "components/damageind.h" -#include "components/debughud.h" -#include "components/effects.h" -#include "components/emoticon.h" -#include "components/flow.h" -#include "components/freezebars.h" -#include "components/ghost.h" -#include "components/hud.h" -#include "components/infomessages.h" -#include "components/items.h" -#include "components/mapimages.h" -#include "components/maplayers.h" -#include "components/mapsounds.h" -#include "components/menu_background.h" -#include "components/menus.h" -#include "components/motd.h" -#include "components/nameplates.h" -#include "components/particles.h" -#include "components/players.h" -#include "components/race_demo.h" -#include "components/scoreboard.h" -#include "components/skins.h" -#include "components/skins7.h" -#include "components/sounds.h" -#include "components/spectator.h" -#include "components/statboard.h" -#include "components/tooltips.h" -#include "components/touch_controls.h" -#include "components/voting.h" - -class CGameInfo -{ -public: - bool m_FlagStartsRace; - bool m_TimeScore; - bool m_UnlimitedAmmo; - bool m_DDRaceRecordMessage; - bool m_RaceRecordMessage; - bool m_RaceSounds; - - bool m_AllowEyeWheel; - bool m_AllowHookColl; - bool m_AllowZoom; - - bool m_BugDDRaceGhost; - bool m_BugDDRaceInput; - bool m_BugFNGLaserRange; - bool m_BugVanillaBounce; - - bool m_PredictFNG; - bool m_PredictDDRace; - bool m_PredictDDRaceTiles; - bool m_PredictVanilla; - - bool m_EntitiesDDNet; - bool m_EntitiesDDRace; - bool m_EntitiesRace; - bool m_EntitiesFNG; - bool m_EntitiesVanilla; - bool m_EntitiesBW; - bool m_EntitiesFDDrace; - - bool m_Race; - bool m_Pvp; - - bool m_DontMaskEntities; - bool m_AllowXSkins; - - bool m_HudHealthArmor; - bool m_HudAmmo; - bool m_HudDDRace; - - bool m_NoWeakHookAndBounce; - bool m_NoSkinChangeForFrozen; -}; - -class CSnapEntities -{ -public: - IClient::CSnapItem m_Item; - const CNetObj_EntityEx *m_pDataEx; -}; - -enum class EClientIdFormat -{ - NO_INDENT, - INDENT_AUTO, - INDENT_FORCE, // for rendering settings preview -}; - -class CGameClient : public IGameClient -{ -public: - // all components - CInfoMessages m_InfoMessages; - CCamera m_Camera; - CChat m_Chat; - CMotd m_Motd; - CBroadcast m_Broadcast; - CGameConsole m_GameConsole; - CBinds m_Binds; - CParticles m_Particles; - CMenus m_Menus; - CSkins m_Skins; - CSkins7 m_Skins7; - CCountryFlags m_CountryFlags; - CFlow m_Flow; - CHud m_Hud; - CDebugHud m_DebugHud; - CControls m_Controls; - CEffects m_Effects; - CScoreboard m_Scoreboard; - CStatboard m_Statboard; - CSounds m_Sounds; - CEmoticon m_Emoticon; - CDamageInd m_DamageInd; - CTouchControls m_TouchControls; - CVoting m_Voting; - CSpectator m_Spectator; - - CPlayers m_Players; - CNamePlates m_NamePlates; - CFreezeBars m_FreezeBars; - CItems m_Items; - CMapImages m_MapImages; - - CMapLayers m_MapLayersBackground = CMapLayers{CMapLayers::TYPE_BACKGROUND}; - CMapLayers m_MapLayersForeground = CMapLayers{CMapLayers::TYPE_FOREGROUND}; - CBackground m_Background; - CMenuBackground m_MenuBackground; - - CMapSounds m_MapSounds; - - CRaceDemo m_RaceDemo; - CGhost m_Ghost; - - CTooltips m_Tooltips; - -private: - std::vector m_vpAll; - std::vector m_vpInput; - CNetObjHandler m_NetObjHandler; - protocol7::CNetObjHandler m_NetObjHandler7; - - class IEngine *m_pEngine; - class IInput *m_pInput; - class IGraphics *m_pGraphics; - class ITextRender *m_pTextRender; - class IClient *m_pClient; - class ISound *m_pSound; - class IConfigManager *m_pConfigManager; - class CConfig *m_pConfig; - class IConsole *m_pConsole; - class IStorage *m_pStorage; - class IDemoPlayer *m_pDemoPlayer; - class IFavorites *m_pFavorites; - class IServerBrowser *m_pServerBrowser; - class IEditor *m_pEditor; - class IFriends *m_pFriends; - class IFriends *m_pFoes; -#if defined(CONF_AUTOUPDATE) - class IUpdater *m_pUpdater; -#endif - class IHttp *m_pHttp; - - CLayers m_Layers; - CCollision m_Collision; - CUi m_UI; - CRaceHelper m_RaceHelper; - - void ProcessEvents(); - void UpdatePositions(); - - int m_EditorMovementDelay = 5; - void UpdateEditorIngameMoved(); - - int m_PredictedTick; - int m_aLastNewPredictedTick[NUM_DUMMIES]; - - int m_LastRoundStartTick; - int m_LastRaceTick; - - int m_LastFlagCarrierRed; - int m_LastFlagCarrierBlue; - - int m_aCheckInfo[NUM_DUMMIES]; - - char m_aDDNetVersionStr[64]; - - static void ConTeam(IConsole::IResult *pResult, void *pUserData); - static void ConKill(IConsole::IResult *pResult, void *pUserData); - static void ConReadyChange7(IConsole::IResult *pResult, void *pUserData); - - static void ConchainLanguageUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainSpecialInfoupdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainSpecialDummyInfoupdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainRefreshSkins(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - static void ConchainSpecialDummy(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - - static void ConTuneZone(IConsole::IResult *pResult, void *pUserData); - - static void ConchainMenuMap(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); - - // only used in OnPredict - vec2 m_aLastPos[MAX_CLIENTS]; - bool m_aLastActive[MAX_CLIENTS]; - - // only used in OnNewSnapshot - bool m_GameOver = false; - bool m_GamePaused = false; - int m_PrevLocalId = -1; - -public: - IKernel *Kernel() { return IInterface::Kernel(); } - IEngine *Engine() const { return m_pEngine; } - class IGraphics *Graphics() const { return m_pGraphics; } - class IClient *Client() const { return m_pClient; } - class CUi *Ui() { return &m_UI; } - class ISound *Sound() const { return m_pSound; } - class IInput *Input() const { return m_pInput; } - class IStorage *Storage() const { return m_pStorage; } - class IConfigManager *ConfigManager() const { return m_pConfigManager; } - class CConfig *Config() const { return m_pConfig; } - class IConsole *Console() { return m_pConsole; } - class ITextRender *TextRender() const { return m_pTextRender; } - class IDemoPlayer *DemoPlayer() const { return m_pDemoPlayer; } - class IDemoRecorder *DemoRecorder(int Recorder) const { return Client()->DemoRecorder(Recorder); } - class IFavorites *Favorites() const { return m_pFavorites; } - class IServerBrowser *ServerBrowser() const { return m_pServerBrowser; } - class CRenderTools *RenderTools() { return &m_RenderTools; } - class CLayers *Layers() { return &m_Layers; } - CCollision *Collision() { return &m_Collision; } - const CCollision *Collision() const { return &m_Collision; } - const CRaceHelper *RaceHelper() const { return &m_RaceHelper; } - class IEditor *Editor() { return m_pEditor; } - class IFriends *Friends() { return m_pFriends; } - class IFriends *Foes() { return m_pFoes; } -#if defined(CONF_AUTOUPDATE) - class IUpdater *Updater() - { - return m_pUpdater; - } -#endif - class IHttp *Http() - { - return m_pHttp; - } - - int NetobjNumCorrections() - { - return m_NetObjHandler.NumObjCorrections(); - } - const char *NetobjCorrectedOn() { return m_NetObjHandler.CorrectedObjOn(); } - - bool m_SuppressEvents; - bool m_NewTick; - bool m_NewPredictedTick; - int m_aFlagDropTick[2]; - - enum - { - SERVERMODE_PURE = 0, - SERVERMODE_MOD, - SERVERMODE_PUREMOD, - }; - int m_ServerMode; - CGameInfo m_GameInfo; - - int m_DemoSpecId; - - vec2 m_LocalCharacterPos; - - // predicted players - CCharacterCore m_PredictedPrevChar; - CCharacterCore m_PredictedChar; - - // snap pointers - struct CSnapState - { - const CNetObj_Character *m_pLocalCharacter; - const CNetObj_Character *m_pLocalPrevCharacter; - const CNetObj_PlayerInfo *m_pLocalInfo; - const CNetObj_SpectatorInfo *m_pSpectatorInfo; - const CNetObj_SpectatorInfo *m_pPrevSpectatorInfo; - const CNetObj_Flag *m_apFlags[2]; - const CNetObj_GameInfo *m_pGameInfoObj; - const CNetObj_GameData *m_pGameDataObj; - int m_GameDataSnapId; - - const CNetObj_PlayerInfo *m_apPlayerInfos[MAX_CLIENTS]; - const CNetObj_PlayerInfo *m_apInfoByScore[MAX_CLIENTS]; - const CNetObj_PlayerInfo *m_apInfoByName[MAX_CLIENTS]; - const CNetObj_PlayerInfo *m_apInfoByDDTeamScore[MAX_CLIENTS]; - const CNetObj_PlayerInfo *m_apInfoByDDTeamName[MAX_CLIENTS]; - - int m_LocalClientId; - int m_NumPlayers; - int m_aTeamSize[2]; - int m_HighestClientId; - - // spectate data - class CSpectateInfo - { - public: - bool m_Active; - int m_SpectatorId; - bool m_UsePosition; - vec2 m_Position; - - bool m_HasCameraInfo; - float m_Zoom; - int m_Deadzone; - int m_FollowFactor; - } m_SpecInfo; - - // - struct CCharacterInfo - { - bool m_Active; - - // snapshots - CNetObj_Character m_Prev; - CNetObj_Character m_Cur; - - CNetObj_DDNetCharacter m_ExtendedData; - const CNetObj_DDNetCharacter *m_PrevExtendedData; - bool m_HasExtendedData; - bool m_HasExtendedDisplayInfo; - - // interpolated position - vec2 m_Position; - }; - - CCharacterInfo m_aCharacters[MAX_CLIENTS]; - }; - - CSnapState m_Snap; - int m_aLocalTuneZone[NUM_DUMMIES]; - bool m_aReceivedTuning[NUM_DUMMIES]; - int m_aExpectingTuningForZone[NUM_DUMMIES]; - int m_aExpectingTuningSince[NUM_DUMMIES]; - CTuningParams m_aTuning[NUM_DUMMIES]; - - // spectate cursor data - class CCursorInfo - { - friend class CGameClient; - static constexpr int CURSOR_SAMPLES = 8; // how many samples to keep - static constexpr int SAMPLE_FRAME_WINDOW = 3; // how many samples should be used for polynomial interpolation - static constexpr int SAMPLE_FRAME_OFFSET = 2; // how many samples in the past should be included - static constexpr double INTERP_DELAY = 4.25; // how many ticks in the past to show, enables extrapolation with smaller value (<= SAMPLE_FRAME_WINDOW - SAMPLE_FRAME_OFFSET + 3) - static constexpr double REST_THRESHOLD = 3.0; // how many ticks of the same samples are considered to be resting - - int m_CursorOwnerId; - double m_aTargetSamplesTime[CURSOR_SAMPLES]; - vec2 m_aTargetSamplesData[CURSOR_SAMPLES]; - int m_NumSamples; - - bool m_Available; - int m_Weapon; - vec2 m_Target; - vec2 m_WorldTarget; - vec2 m_Position; - - public: - bool IsAvailable() const { return m_Available; } - int Weapon() const { return m_Weapon; } - vec2 Target() const { return m_Target; } - vec2 WorldTarget() const { return m_WorldTarget; } - vec2 Position() const { return m_Position; } - } m_CursorInfo; - - // client data - struct CClientData - { - int m_UseCustomColor; - int m_ColorBody; - int m_ColorFeet; - - char m_aName[MAX_NAME_LENGTH]; - char m_aClan[MAX_CLAN_LENGTH]; - int m_Country; - char m_aSkinName[MAX_SKIN_LENGTH]; - int m_SkinColor; - int m_Team; - int m_Emoticon; - float m_EmoticonStartFraction; - int m_EmoticonStartTick; - - bool m_Solo; - bool m_Jetpack; - bool m_CollisionDisabled; - bool m_EndlessHook; - bool m_EndlessJump; - bool m_HammerHitDisabled; - bool m_GrenadeHitDisabled; - bool m_LaserHitDisabled; - bool m_ShotgunHitDisabled; - bool m_HookHitDisabled; - bool m_Super; - bool m_Invincible; - bool m_HasTelegunGun; - bool m_HasTelegunGrenade; - bool m_HasTelegunLaser; - int m_FreezeEnd; - bool m_DeepFrozen; - bool m_LiveFrozen; - - CCharacterCore m_Predicted; - CCharacterCore m_PrevPredicted; - - CTeeRenderInfo m_SkinInfo; // this is what the server reports - CTeeRenderInfo m_RenderInfo; // this is what we use - - float m_Angle; - bool m_Active; - bool m_ChatIgnore; - bool m_EmoticonIgnore; - bool m_Friend; - bool m_Foe; - - int m_AuthLevel; - bool m_Afk; - bool m_Paused; - bool m_Spec; - - // Editor allows 256 switches for now. - bool m_aSwitchStates[256]; - - CNetObj_Character m_Snapped; - CNetObj_Character m_Evolved; - - // rendered characters - CNetObj_Character m_RenderCur; - CNetObj_Character m_RenderPrev; - vec2 m_RenderPos; - bool m_IsPredicted; - bool m_IsPredictedLocal; - int64_t m_aSmoothStart[2]; - int64_t m_aSmoothLen[2]; - vec2 m_aPredPos[200]; - int m_aPredTick[200]; - bool m_SpecCharPresent; - vec2 m_SpecChar; - - void UpdateRenderInfo(bool IsTeamPlay); - void Reset(); - - class CSixup - { - public: - void Reset(); - - char m_aaSkinPartNames[protocol7::NUM_SKINPARTS][protocol7::MAX_SKIN_LENGTH]; - int m_aUseCustomColors[protocol7::NUM_SKINPARTS]; - int m_aSkinPartColors[protocol7::NUM_SKINPARTS]; - }; - - // 0.7 Skin - CSixup m_aSixup[NUM_DUMMIES]; - }; - - CClientData m_aClients[MAX_CLIENTS]; - - class CClientStats - { - int m_IngameTicks; - int m_JoinTick; - bool m_Active; - - public: - CClientStats(); - - int m_aFragsWith[NUM_WEAPONS]; - int m_aDeathsFrom[NUM_WEAPONS]; - int m_Frags; - int m_Deaths; - int m_Suicides; - int m_BestSpree; - int m_CurrentSpree; - - int m_FlagGrabs; - int m_FlagCaptures; - - void Reset(); - - bool IsActive() const { return m_Active; } - void JoinGame(int Tick) - { - m_Active = true; - m_JoinTick = Tick; - }; - void JoinSpec(int Tick) - { - m_Active = false; - m_IngameTicks += Tick - m_JoinTick; - }; - int GetIngameTicks(int Tick) const { return m_IngameTicks + Tick - m_JoinTick; } - float GetFPM(int Tick, int TickSpeed) const { return (float)(m_Frags * TickSpeed * 60) / GetIngameTicks(Tick); } - }; - - CClientStats m_aStats[MAX_CLIENTS]; - - CRenderTools m_RenderTools; - - void OnReset(); - - size_t ComponentCount() { return m_vpAll.size(); } - - // hooks - void OnConnected() override; - void OnRender() override; - void OnUpdate() override; - void OnDummyDisconnect() override; - virtual void OnRelease(); - void OnInit() override; - void OnConsoleInit() override; - void OnStateChange(int NewState, int OldState) override; - template - void ApplySkin7InfoFromGameMsg(const T *pMsg, int ClientId, int Conn); - void ApplySkin7InfoFromSnapObj(const protocol7::CNetObj_De_ClientInfo *pObj, int ClientId) override; - int OnDemoRecSnap7(class CSnapshot *pFrom, class CSnapshot *pTo, int Conn) override; - void *TranslateGameMsg(int *pMsgId, CUnpacker *pUnpacker, int Conn); - int TranslateSnap(CSnapshot *pSnapDstSix, CSnapshot *pSnapSrcSeven, int Conn, bool Dummy) override; - void OnMessage(int MsgId, CUnpacker *pUnpacker, int Conn, bool Dummy) override; - void InvalidateSnapshot() override; - void OnNewSnapshot() override; - void OnPredict() override; - void OnActivateEditor() override; - void OnDummySwap() override; - int OnSnapInput(int *pData, bool Dummy, bool Force) override; - void OnShutdown() override; - void OnEnterGame() override; - void OnRconType(bool UsernameReq) override; - void OnRconLine(const char *pLine) override; - virtual void OnGameOver(); - virtual void OnStartGame(); - virtual void OnStartRound(); - virtual void OnFlagGrab(int TeamId); - void OnWindowResize() override; - - void InitializeLanguage() override; - bool m_LanguageChanged = false; - void OnLanguageChange(); - void HandleLanguageChanged(); - - void RefreshSkins(); - - void RenderShutdownMessage() override; - - const char *GetItemName(int Type) const override; - const char *Version() const override; - const char *NetVersion() const override; - const char *NetVersion7() const override; - int DDNetVersion() const override; - const char *DDNetVersionStr() const override; - virtual int ClientVersion7() const override; - - void DoTeamChangeMessage7(const char *pName, int ClientId, int Team, const char *pPrefix = ""); - - // actions - // TODO: move these - void SendSwitchTeam(int Team) const; - void SendStartInfo7(bool Dummy); - void SendSkinChange7(bool Dummy); - // Returns true if the requested skin change got applied by the server - bool GotWantedSkin7(bool Dummy); - void SendInfo(bool Start); - void SendDummyInfo(bool Start) override; - void SendKill(int ClientId) const; - void SendReadyChange7(); - - int m_NextChangeInfo; - - // DDRace - - int m_aLocalIds[NUM_DUMMIES]; - CNetObj_PlayerInput m_DummyInput; - CNetObj_PlayerInput m_HammerInput; - unsigned int m_DummyFire; - bool m_ReceivedDDNetPlayer; - - class CTeamsCore m_Teams; - - int IntersectCharacter(vec2 HookPos, vec2 NewPos, vec2 &NewPos2, int OwnId); - - int LastRaceTick() const; - int CurrentRaceTime() const; - - bool IsTeamPlay() { return m_Snap.m_pGameInfoObj && m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS; } - - bool AntiPingPlayers() { return g_Config.m_ClAntiPing && g_Config.m_ClAntiPingPlayers && !m_Snap.m_SpecInfo.m_Active && Client()->State() != IClient::STATE_DEMOPLAYBACK && (m_aTuning[g_Config.m_ClDummy].m_PlayerCollision || m_aTuning[g_Config.m_ClDummy].m_PlayerHooking); } - bool AntiPingGrenade() { return g_Config.m_ClAntiPing && g_Config.m_ClAntiPingGrenade && !m_Snap.m_SpecInfo.m_Active && Client()->State() != IClient::STATE_DEMOPLAYBACK; } - bool AntiPingWeapons() { return g_Config.m_ClAntiPing && g_Config.m_ClAntiPingWeapons && !m_Snap.m_SpecInfo.m_Active && Client()->State() != IClient::STATE_DEMOPLAYBACK; } - bool AntiPingGunfire() { return AntiPingGrenade() && AntiPingWeapons() && g_Config.m_ClAntiPingGunfire; } - bool Predict() const; - bool PredictDummy() { return g_Config.m_ClPredictDummy && Client()->DummyConnected() && m_Snap.m_LocalClientId >= 0 && m_PredictedDummyId >= 0 && !m_aClients[m_PredictedDummyId].m_Paused; } - const CTuningParams *GetTuning(int i) { return &m_aTuningList[i]; } - ColorRGBA GetDDTeamColor(int DDTeam, float Lightness = 0.5f) const; - void FormatClientId(int ClientId, char (&aClientId)[16], EClientIdFormat Format) const; - - CGameWorld m_GameWorld; - CGameWorld m_PredictedWorld; - CGameWorld m_PrevPredictedWorld; - - std::vector &Switchers() { return m_GameWorld.m_Core.m_vSwitchers; } - std::vector &PredSwitchers() { return m_PredictedWorld.m_Core.m_vSwitchers; } - - void DummyResetInput() override; - void Echo(const char *pString) override; - bool IsOtherTeam(int ClientId) const; - int SwitchStateTeam() const; - bool IsLocalCharSuper() const; - bool CanDisplayWarning() const override; - CNetObjHandler *GetNetObjHandler() override; - protocol7::CNetObjHandler *GetNetObjHandler7() override; - - void LoadGameSkin(const char *pPath, bool AsDir = false); - void LoadEmoticonsSkin(const char *pPath, bool AsDir = false); - void LoadParticlesSkin(const char *pPath, bool AsDir = false); - void LoadHudSkin(const char *pPath, bool AsDir = false); - void LoadExtrasSkin(const char *pPath, bool AsDir = false); - - struct SClientGameSkin - { - // health armor hud - IGraphics::CTextureHandle m_SpriteHealthFull; - IGraphics::CTextureHandle m_SpriteHealthEmpty; - IGraphics::CTextureHandle m_SpriteArmorFull; - IGraphics::CTextureHandle m_SpriteArmorEmpty; - - // cursors - IGraphics::CTextureHandle m_SpriteWeaponHammerCursor; - IGraphics::CTextureHandle m_SpriteWeaponGunCursor; - IGraphics::CTextureHandle m_SpriteWeaponShotgunCursor; - IGraphics::CTextureHandle m_SpriteWeaponGrenadeCursor; - IGraphics::CTextureHandle m_SpriteWeaponNinjaCursor; - IGraphics::CTextureHandle m_SpriteWeaponLaserCursor; - - IGraphics::CTextureHandle m_aSpriteWeaponCursors[6]; - - // weapons and hook - IGraphics::CTextureHandle m_SpriteHookChain; - IGraphics::CTextureHandle m_SpriteHookHead; - IGraphics::CTextureHandle m_SpriteWeaponHammer; - IGraphics::CTextureHandle m_SpriteWeaponGun; - IGraphics::CTextureHandle m_SpriteWeaponShotgun; - IGraphics::CTextureHandle m_SpriteWeaponGrenade; - IGraphics::CTextureHandle m_SpriteWeaponNinja; - IGraphics::CTextureHandle m_SpriteWeaponLaser; - - IGraphics::CTextureHandle m_aSpriteWeapons[6]; - - // particles - IGraphics::CTextureHandle m_aSpriteParticles[9]; - - // stars - IGraphics::CTextureHandle m_aSpriteStars[3]; - - // projectiles - IGraphics::CTextureHandle m_SpriteWeaponGunProjectile; - IGraphics::CTextureHandle m_SpriteWeaponShotgunProjectile; - IGraphics::CTextureHandle m_SpriteWeaponGrenadeProjectile; - IGraphics::CTextureHandle m_SpriteWeaponHammerProjectile; - IGraphics::CTextureHandle m_SpriteWeaponNinjaProjectile; - IGraphics::CTextureHandle m_SpriteWeaponLaserProjectile; - - IGraphics::CTextureHandle m_aSpriteWeaponProjectiles[6]; - - // muzzles - IGraphics::CTextureHandle m_aSpriteWeaponGunMuzzles[3]; - IGraphics::CTextureHandle m_aSpriteWeaponShotgunMuzzles[3]; - IGraphics::CTextureHandle m_aaSpriteWeaponNinjaMuzzles[3]; - - IGraphics::CTextureHandle m_aaSpriteWeaponsMuzzles[6][3]; - - // pickups - IGraphics::CTextureHandle m_SpritePickupHealth; - IGraphics::CTextureHandle m_SpritePickupArmor; - IGraphics::CTextureHandle m_SpritePickupArmorShotgun; - IGraphics::CTextureHandle m_SpritePickupArmorGrenade; - IGraphics::CTextureHandle m_SpritePickupArmorNinja; - IGraphics::CTextureHandle m_SpritePickupArmorLaser; - IGraphics::CTextureHandle m_SpritePickupGrenade; - IGraphics::CTextureHandle m_SpritePickupShotgun; - IGraphics::CTextureHandle m_SpritePickupLaser; - IGraphics::CTextureHandle m_SpritePickupNinja; - IGraphics::CTextureHandle m_SpritePickupGun; - IGraphics::CTextureHandle m_SpritePickupHammer; - - IGraphics::CTextureHandle m_aSpritePickupWeapons[6]; - IGraphics::CTextureHandle m_aSpritePickupWeaponArmor[4]; - - // flags - IGraphics::CTextureHandle m_SpriteFlagBlue; - IGraphics::CTextureHandle m_SpriteFlagRed; - - // ninja bar (0.7) - IGraphics::CTextureHandle m_SpriteNinjaBarFullLeft; - IGraphics::CTextureHandle m_SpriteNinjaBarFull; - IGraphics::CTextureHandle m_SpriteNinjaBarEmpty; - IGraphics::CTextureHandle m_SpriteNinjaBarEmptyRight; - - bool IsSixup() - { - return m_SpriteNinjaBarFullLeft.IsValid(); - } - }; - - SClientGameSkin m_GameSkin; - bool m_GameSkinLoaded = false; - - struct SClientParticlesSkin - { - IGraphics::CTextureHandle m_SpriteParticleSlice; - IGraphics::CTextureHandle m_SpriteParticleBall; - IGraphics::CTextureHandle m_aSpriteParticleSplat[3]; - IGraphics::CTextureHandle m_SpriteParticleSmoke; - IGraphics::CTextureHandle m_SpriteParticleShell; - IGraphics::CTextureHandle m_SpriteParticleExpl; - IGraphics::CTextureHandle m_SpriteParticleAirJump; - IGraphics::CTextureHandle m_SpriteParticleHit; - IGraphics::CTextureHandle m_aSpriteParticles[10]; - }; - - SClientParticlesSkin m_ParticlesSkin; - bool m_ParticlesSkinLoaded = false; - - struct SClientEmoticonsSkin - { - IGraphics::CTextureHandle m_aSpriteEmoticons[16]; - }; - - SClientEmoticonsSkin m_EmoticonsSkin; - bool m_EmoticonsSkinLoaded = false; - - struct SClientHudSkin - { - IGraphics::CTextureHandle m_SpriteHudAirjump; - IGraphics::CTextureHandle m_SpriteHudAirjumpEmpty; - IGraphics::CTextureHandle m_SpriteHudSolo; - IGraphics::CTextureHandle m_SpriteHudCollisionDisabled; - IGraphics::CTextureHandle m_SpriteHudEndlessJump; - IGraphics::CTextureHandle m_SpriteHudEndlessHook; - IGraphics::CTextureHandle m_SpriteHudJetpack; - IGraphics::CTextureHandle m_SpriteHudFreezeBarFullLeft; - IGraphics::CTextureHandle m_SpriteHudFreezeBarFull; - IGraphics::CTextureHandle m_SpriteHudFreezeBarEmpty; - IGraphics::CTextureHandle m_SpriteHudFreezeBarEmptyRight; - IGraphics::CTextureHandle m_SpriteHudNinjaBarFullLeft; - IGraphics::CTextureHandle m_SpriteHudNinjaBarFull; - IGraphics::CTextureHandle m_SpriteHudNinjaBarEmpty; - IGraphics::CTextureHandle m_SpriteHudNinjaBarEmptyRight; - IGraphics::CTextureHandle m_SpriteHudHookHitDisabled; - IGraphics::CTextureHandle m_SpriteHudHammerHitDisabled; - IGraphics::CTextureHandle m_SpriteHudShotgunHitDisabled; - IGraphics::CTextureHandle m_SpriteHudGrenadeHitDisabled; - IGraphics::CTextureHandle m_SpriteHudLaserHitDisabled; - IGraphics::CTextureHandle m_SpriteHudGunHitDisabled; - IGraphics::CTextureHandle m_SpriteHudDeepFrozen; - IGraphics::CTextureHandle m_SpriteHudLiveFrozen; - IGraphics::CTextureHandle m_SpriteHudTeleportGrenade; - IGraphics::CTextureHandle m_SpriteHudTeleportGun; - IGraphics::CTextureHandle m_SpriteHudTeleportLaser; - IGraphics::CTextureHandle m_SpriteHudPracticeMode; - IGraphics::CTextureHandle m_SpriteHudLockMode; - IGraphics::CTextureHandle m_SpriteHudTeam0Mode; - IGraphics::CTextureHandle m_SpriteHudDummyHammer; - IGraphics::CTextureHandle m_SpriteHudDummyCopy; - }; - - SClientHudSkin m_HudSkin; - bool m_HudSkinLoaded = false; - - struct SClientExtrasSkin - { - IGraphics::CTextureHandle m_SpriteParticleSnowflake; - IGraphics::CTextureHandle m_SpriteParticleSparkle; - IGraphics::CTextureHandle m_aSpriteParticles[2]; - }; - - SClientExtrasSkin m_ExtrasSkin; - bool m_ExtrasSkinLoaded = false; - - const std::vector &SnapEntities() { return m_vSnapEntities; } - - int m_MultiViewTeam; - float m_MultiViewPersonalZoom; - bool m_MultiViewShowHud; - bool m_MultiViewActivated; - bool m_aMultiViewId[MAX_CLIENTS]; - - void ResetMultiView(); - int FindFirstMultiViewId(); - void CleanMultiViewId(int ClientId); - -private: - std::vector m_vSnapEntities; - void SnapCollectEntities(); - - bool m_aDDRaceMsgSent[NUM_DUMMIES]; - int m_aShowOthers[NUM_DUMMIES]; - - void UpdatePrediction(); - void UpdateSpectatorCursor(); - void UpdateRenderedCharacters(); - - int m_aLastUpdateTick[MAX_CLIENTS] = {0}; - void DetectStrongHook(); - - vec2 GetSmoothPos(int ClientId); - - int m_PredictedDummyId; - int m_IsDummySwapping; - CCharOrder m_CharOrder; - int m_aSwitchStateTeam[NUM_DUMMIES]; - - enum - { - NUM_TUNEZONES = 256 - }; - void LoadMapSettings(); - CTuningParams m_aTuningList[NUM_TUNEZONES]; - CTuningParams *TuningList() { return m_aTuningList; } - - float m_LastShowDistanceZoom; - float m_LastZoom; - float m_LastScreenAspect; - float m_LastDeadzone; - float m_LastFollowFactor; - bool m_LastDummyConnected; - - void HandleMultiView(); - bool IsMultiViewIdSet(); - void CleanMultiViewIds(); - bool InitMultiView(int Team); - float CalculateMultiViewMultiplier(vec2 TargetPos); - float CalculateMultiViewZoom(vec2 MinPos, vec2 MaxPos, float Vel); - float MapValue(float MaxValue, float MinValue, float MaxRange, float MinRange, float Value); - - struct SMultiView - { - bool m_Solo; - bool m_IsInit; - bool m_Teleported; - bool m_aVanish[MAX_CLIENTS]; - vec2 m_OldPos; - int m_OldPersonalZoom; - float m_SecondChance; - float m_OldCameraDistance; - float m_aLastFreeze[MAX_CLIENTS]; - }; - - SMultiView m_MultiView; -}; - -ColorRGBA CalculateNameColor(ColorHSLA TextColorHSL); - -#endif diff --git a/src/game/client/laser_data.cpp b/src/game/client/laser_data.cpp deleted file mode 100644 index 62245593c3..0000000000 --- a/src/game/client/laser_data.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include "laser_data.h" - -#include -#include -#include - -#include - -CLaserData ExtractLaserInfo(int NetObjType, const void *pData, CGameWorld *pGameWorld, const CNetObj_EntityEx *pEntEx) -{ - CLaserData Result = {vec2(0, 0)}; - - if(NetObjType == NETOBJTYPE_DDNETLASER) - { - Result = ExtractLaserInfoDDNet((const CNetObj_DDNetLaser *)pData, pGameWorld); - } - else - { - CNetObj_Laser *pLaser = (CNetObj_Laser *)pData; - - Result.m_From.x = pLaser->m_FromX; - Result.m_From.y = pLaser->m_FromY; - Result.m_To.x = pLaser->m_X; - Result.m_To.y = pLaser->m_Y; - Result.m_StartTick = pLaser->m_StartTick; - Result.m_ExtraInfo = false; - Result.m_Owner = -1; - Result.m_Type = -1; - Result.m_SwitchNumber = 0; - Result.m_Subtype = -1; - Result.m_TuneZone = pGameWorld && pGameWorld->m_WorldConfig.m_UseTuneZones ? pGameWorld->Collision()->IsTune(pGameWorld->Collision()->GetMapIndex(Result.m_From)) : 0; - Result.m_Predict = true; - } - - if(pEntEx && !(NetObjType == NETOBJTYPE_DDNETLASER && Result.m_SwitchNumber >= 0)) - { - Result.m_SwitchNumber = pEntEx->m_SwitchNumber; - if(pEntEx->m_EntityClass == ENTITYCLASS_LIGHT) - { - Result.m_Type = LASERTYPE_FREEZE; - } - else if(pEntEx->m_EntityClass >= ENTITYCLASS_GUN_NORMAL && pEntEx->m_EntityClass <= ENTITYCLASS_GUN_UNFREEZE) - { - Result.m_Type = LASERTYPE_GUN; - } - else if(pEntEx->m_EntityClass >= ENTITYCLASS_DRAGGER_WEAK && pEntEx->m_EntityClass <= ENTITYCLASS_DRAGGER_STRONG) - { - Result.m_Type = LASERTYPE_DRAGGER; - } - else if(pEntEx->m_EntityClass == ENTITYCLASS_DOOR) - { - Result.m_Type = LASERTYPE_DOOR; - } - } - - return Result; -} - -CLaserData ExtractLaserInfoDDNet(const CNetObj_DDNetLaser *pLaser, CGameWorld *pGameWorld) -{ - CLaserData Result = {vec2(0, 0)}; - Result.m_From.x = pLaser->m_FromX; - Result.m_From.y = pLaser->m_FromY; - Result.m_To.x = pLaser->m_ToX; - Result.m_To.y = pLaser->m_ToY; - Result.m_StartTick = pLaser->m_StartTick; - Result.m_ExtraInfo = true; - Result.m_Owner = pLaser->m_Owner; - Result.m_Type = pLaser->m_Type; - Result.m_SwitchNumber = pLaser->m_SwitchNumber; - Result.m_Subtype = pLaser->m_Subtype; - Result.m_TuneZone = pGameWorld && pGameWorld->m_WorldConfig.m_UseTuneZones ? pGameWorld->Collision()->IsTune(pGameWorld->Collision()->GetMapIndex(Result.m_From)) : 0; - Result.m_Predict = !(pLaser->m_Flags & LASERFLAG_NO_PREDICT); - return Result; -} diff --git a/src/game/client/laser_data.h b/src/game/client/laser_data.h deleted file mode 100644 index 1e42fdaf84..0000000000 --- a/src/game/client/laser_data.h +++ /dev/null @@ -1,32 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_LASER_DATA_H -#define GAME_CLIENT_LASER_DATA_H - -#include - -struct CNetObj_Laser; -struct CNetObj_DDNetLaser; -struct CNetObj_EntityEx; - -class CLaserData -{ -public: - vec2 m_From; - vec2 m_To; - int m_StartTick; - bool m_ExtraInfo; - // The rest is only set if m_ExtraInfo is true. - int m_Owner; - int m_Type; - int m_SwitchNumber; - int m_Subtype; - bool m_Predict; - // TuneZone is introduced locally - int m_TuneZone; -}; - -CLaserData ExtractLaserInfo(int NetObjType, const void *pData, class CGameWorld *pGameWorld, const CNetObj_EntityEx *pEntEx); -CLaserData ExtractLaserInfoDDNet(const CNetObj_DDNetLaser *pLaser, class CGameWorld *pGameWorld); - -#endif // GAME_CLIENT_LASER_DATA_H diff --git a/src/game/client/lineinput.cpp b/src/game/client/lineinput.cpp deleted file mode 100644 index f2f113f624..0000000000 --- a/src/game/client/lineinput.cpp +++ /dev/null @@ -1,729 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include - -#include "lineinput.h" -#include "ui.h" - -IInput *CLineInput::ms_pInput = nullptr; -ITextRender *CLineInput::ms_pTextRender = nullptr; -IGraphics *CLineInput::ms_pGraphics = nullptr; -IClient *CLineInput::ms_pClient = nullptr; - -CLineInput *CLineInput::ms_pActiveInput = nullptr; -EInputPriority CLineInput::ms_ActiveInputPriority = EInputPriority::NONE; - -vec2 CLineInput::ms_CompositionWindowPosition = vec2(0.0f, 0.0f); -float CLineInput::ms_CompositionLineHeight = 0.0f; - -char CLineInput::ms_aStars[128] = {'\0'}; - -void CLineInput::SetBuffer(char *pStr, size_t MaxSize, size_t MaxChars) -{ - if(m_pStr && m_pStr == pStr) - return; - const char *pLastStr = m_pStr; - m_pStr = pStr; - m_MaxSize = MaxSize; - m_MaxChars = MaxChars; - m_WasChanged = m_pStr && pLastStr && m_WasChanged; - if(!pLastStr) - { - m_CursorPos = m_SelectionStart = m_SelectionEnd = m_LastCompositionCursorPos = 0; - m_ScrollOffset = m_ScrollOffsetChange = 0.0f; - m_CaretPosition = vec2(0.0f, 0.0f); - m_MouseSelection.m_Selecting = false; - m_Hidden = false; - m_pEmptyText = nullptr; - m_WasRendered = false; - } - if(m_pStr && m_pStr != pLastStr) - UpdateStrData(); -} - -void CLineInput::Clear() -{ - mem_zero(m_pStr, m_MaxSize); - UpdateStrData(); -} - -void CLineInput::Set(const char *pString) -{ - str_copy(m_pStr, pString, m_MaxSize); - UpdateStrData(); - SetCursorOffset(m_Len); -} - -void CLineInput::SetRange(const char *pString, size_t Begin, size_t End) -{ - if(Begin > End) - std::swap(Begin, End); - Begin = clamp(Begin, 0, m_Len); - End = clamp(End, 0, m_Len); - - size_t RemovedCharSize, RemovedCharCount; - str_utf8_stats(m_pStr + Begin, End - Begin + 1, m_MaxChars, &RemovedCharSize, &RemovedCharCount); - - size_t AddedCharSize, AddedCharCount; - str_utf8_stats(pString, m_MaxSize - m_Len + RemovedCharSize, m_MaxChars - m_NumChars + RemovedCharCount, &AddedCharSize, &AddedCharCount); - - if(RemovedCharSize || AddedCharSize) - { - if(AddedCharSize < RemovedCharSize) - { - if(AddedCharSize) - mem_copy(m_pStr + Begin, pString, AddedCharSize); - mem_move(m_pStr + Begin + AddedCharSize, m_pStr + Begin + RemovedCharSize, m_Len - Begin - AddedCharSize); - } - else if(AddedCharSize > RemovedCharSize) - mem_move(m_pStr + End + AddedCharSize - RemovedCharSize, m_pStr + End, m_Len - End); - - if(AddedCharSize >= RemovedCharSize) - mem_copy(m_pStr + Begin, pString, AddedCharSize); - - m_CursorPos = End - RemovedCharSize + AddedCharSize; - m_Len += AddedCharSize - RemovedCharSize; - m_NumChars += AddedCharCount - RemovedCharCount; - m_WasChanged = true; - m_WasCursorChanged = true; - m_pStr[m_Len] = '\0'; - m_SelectionStart = m_SelectionEnd = m_CursorPos; - } -} - -void CLineInput::Insert(const char *pString, size_t Begin) -{ - SetRange(pString, Begin, Begin); -} - -void CLineInput::Append(const char *pString) -{ - Insert(pString, m_Len); -} - -void CLineInput::UpdateStrData() -{ - str_utf8_stats(m_pStr, m_MaxSize, m_MaxChars, &m_Len, &m_NumChars); - if(!in_range(m_CursorPos, 0, m_Len)) - SetCursorOffset(m_CursorPos); - if(!in_range(m_SelectionStart, 0, m_Len) || !in_range(m_SelectionEnd, 0, m_Len)) - SetSelection(m_SelectionStart, m_SelectionEnd); -} - -const char *CLineInput::GetDisplayedString() -{ - if(m_pfnDisplayTextCallback) - return m_pfnDisplayTextCallback(m_pStr, GetNumChars()); - - if(!IsHidden()) - return m_pStr; - - const size_t NumStars = minimum(GetNumChars(), sizeof(ms_aStars) - 1); - for(size_t i = 0; i < NumStars; ++i) - ms_aStars[i] = '*'; - ms_aStars[NumStars] = '\0'; - return ms_aStars; -} - -void CLineInput::MoveCursor(EMoveDirection Direction, bool MoveWord, const char *pStr, size_t MaxSize, size_t *pCursorPos) -{ - // Check whether cursor position is initially on space or non-space character. - // When forwarding, check character to the right of the cursor position. - // When rewinding, check character to the left of the cursor position (rewind first). - size_t PeekCursorPos = Direction == FORWARD ? *pCursorPos : str_utf8_rewind(pStr, *pCursorPos); - const char *pTemp = pStr + PeekCursorPos; - bool AnySpace = str_utf8_isspace(str_utf8_decode(&pTemp)); - bool AnyWord = !AnySpace; - while(true) - { - if(Direction == FORWARD) - *pCursorPos = str_utf8_forward(pStr, *pCursorPos); - else - *pCursorPos = str_utf8_rewind(pStr, *pCursorPos); - if(!MoveWord || *pCursorPos <= 0 || *pCursorPos >= MaxSize) - break; - PeekCursorPos = Direction == FORWARD ? *pCursorPos : str_utf8_rewind(pStr, *pCursorPos); - pTemp = pStr + PeekCursorPos; - const bool CurrentSpace = str_utf8_isspace(str_utf8_decode(&pTemp)); - const bool CurrentWord = !CurrentSpace; - if(Direction == FORWARD && AnySpace && !CurrentSpace) - break; // Forward: Stop when next (right) character is non-space after seeing at least one space character. - else if(Direction == REWIND && AnyWord && !CurrentWord) - break; // Rewind: Stop when next (left) character is space after seeing at least one non-space character. - AnySpace |= CurrentSpace; - AnyWord |= CurrentWord; - } -} - -void CLineInput::SetCursorOffset(size_t Offset) -{ - m_SelectionStart = m_SelectionEnd = m_LastCompositionCursorPos = m_CursorPos = clamp(Offset, 0, m_Len); - m_WasCursorChanged = true; -} - -void CLineInput::SetSelection(size_t Start, size_t End) -{ - dbg_assert(m_CursorPos == Start || m_CursorPos == End, "Selection and cursor offset got desynchronized"); - if(Start > End) - std::swap(Start, End); - m_SelectionStart = clamp(Start, 0, m_Len); - m_SelectionEnd = clamp(End, 0, m_Len); - m_WasCursorChanged = true; -} - -size_t CLineInput::OffsetFromActualToDisplay(size_t ActualOffset) -{ - if(IsHidden() || (m_pfnCalculateOffsetCallback && m_pfnCalculateOffsetCallback())) - return str_utf8_offset_bytes_to_chars(m_pStr, ActualOffset); - return ActualOffset; -} - -size_t CLineInput::OffsetFromDisplayToActual(size_t DisplayOffset) -{ - if(IsHidden() || (m_pfnCalculateOffsetCallback && m_pfnCalculateOffsetCallback())) - return str_utf8_offset_bytes_to_chars(m_pStr, DisplayOffset); - return DisplayOffset; -} - -bool CLineInput::ProcessInput(const IInput::CEvent &Event) -{ - // update derived attributes to handle external changes to the buffer - UpdateStrData(); - - const size_t OldCursorPos = m_CursorPos; - const bool Selecting = Input()->ShiftIsPressed(); - const size_t SelectionLength = GetSelectionLength(); - bool KeyHandled = false; - - if(Event.m_Flags & IInput::FLAG_TEXT) - { - SetRange(Event.m_aText, m_SelectionStart, m_SelectionEnd); - KeyHandled = true; - } - - if(Event.m_Flags & IInput::FLAG_PRESS) - { - const bool ModPressed = Input()->ModifierIsPressed(); - const bool AltPressed = Input()->AltIsPressed(); - -#ifdef CONF_PLATFORM_MACOSX - const bool MoveWord = AltPressed && !ModPressed; -#else - const bool MoveWord = ModPressed && !AltPressed; -#endif - - if(Event.m_Key == KEY_BACKSPACE) - { - if(SelectionLength) - { - SetRange("", m_SelectionStart, m_SelectionEnd); - } - else - { - // If in MoveWord-mode, backspace will delete the word before the selection - if(SelectionLength) - m_SelectionEnd = m_CursorPos = m_SelectionStart; - if(m_CursorPos > 0) - { - size_t NewCursorPos = m_CursorPos; - MoveCursor(REWIND, MoveWord, m_pStr, m_Len, &NewCursorPos); - SetRange("", NewCursorPos, m_CursorPos); - } - m_SelectionStart = m_SelectionEnd = m_CursorPos; - } - KeyHandled = true; - } - else if(Event.m_Key == KEY_DELETE) - { - if(SelectionLength) - { - SetRange("", m_SelectionStart, m_SelectionEnd); - } - else - { - // If in MoveWord-mode, delete will delete the word after the selection - if(SelectionLength) - m_SelectionStart = m_CursorPos = m_SelectionEnd; - if(m_CursorPos < m_Len) - { - size_t EndCursorPos = m_CursorPos; - MoveCursor(FORWARD, MoveWord, m_pStr, m_Len, &EndCursorPos); - SetRange("", m_CursorPos, EndCursorPos); - } - m_SelectionStart = m_SelectionEnd = m_CursorPos; - } - KeyHandled = true; - } - else if(Event.m_Key == KEY_LEFT) - { - if(SelectionLength && !Selecting) - { - m_CursorPos = m_SelectionStart; - } - else if(m_CursorPos > 0) - { - MoveCursor(REWIND, MoveWord, m_pStr, m_Len, &m_CursorPos); - if(Selecting) - { - if(m_SelectionStart == OldCursorPos) // expand start first - m_SelectionStart = m_CursorPos; - else if(m_SelectionEnd == OldCursorPos) - m_SelectionEnd = m_CursorPos; - } - } - - if(!Selecting) - { - m_SelectionStart = m_SelectionEnd = m_CursorPos; - } - KeyHandled = true; - } - else if(Event.m_Key == KEY_RIGHT) - { - if(SelectionLength && !Selecting) - { - m_CursorPos = m_SelectionEnd; - } - else if(m_CursorPos < m_Len) - { - MoveCursor(FORWARD, MoveWord, m_pStr, m_Len, &m_CursorPos); - if(Selecting) - { - if(m_SelectionEnd == OldCursorPos) // expand end first - m_SelectionEnd = m_CursorPos; - else if(m_SelectionStart == OldCursorPos) - m_SelectionStart = m_CursorPos; - } - } - - if(!Selecting) - { - m_SelectionStart = m_SelectionEnd = m_CursorPos; - } - KeyHandled = true; - } - else if(Event.m_Key == KEY_HOME) - { - if(Selecting) - { - if(SelectionLength && m_CursorPos == m_SelectionEnd) - m_SelectionEnd = m_SelectionStart; - } - else - m_SelectionEnd = 0; - m_CursorPos = 0; - m_SelectionStart = 0; - KeyHandled = true; - } - else if(Event.m_Key == KEY_END) - { - if(Selecting) - { - if(SelectionLength && m_CursorPos == m_SelectionStart) - m_SelectionStart = m_SelectionEnd; - } - else - m_SelectionStart = m_Len; - m_CursorPos = m_Len; - m_SelectionEnd = m_Len; - KeyHandled = true; - } - else if(ModPressed && !AltPressed && Event.m_Key == KEY_V) - { - std::string ClipboardText = Input()->GetClipboardText(); - if(!ClipboardText.empty()) - { - if(m_pfnClipboardLineCallback) - { - // Split clipboard text into multiple lines. Send all complete lines to callback. - // The lineinput is set to the last clipboard line. - bool FirstLine = true; - size_t i, Begin = 0; - for(i = 0; i < ClipboardText.length(); i++) - { - if(ClipboardText[i] == '\n') - { - if(i == Begin) - { - Begin++; - continue; - } - std::string Line = ClipboardText.substr(Begin, i - Begin + 1); - if(FirstLine) - { - str_sanitize_cc(Line.data()); - SetRange(Line.c_str(), m_SelectionStart, m_SelectionEnd); - FirstLine = false; - Line = GetString(); - } - Begin = i + 1; - str_sanitize_cc(Line.data()); - m_pfnClipboardLineCallback(Line.c_str()); - } - } - std::string Line = ClipboardText.substr(Begin, i - Begin + 1); - str_sanitize_cc(Line.data()); - if(FirstLine) - SetRange(Line.c_str(), m_SelectionStart, m_SelectionEnd); - else - Set(Line.c_str()); - } - else - { - str_sanitize_cc(ClipboardText.data()); - SetRange(ClipboardText.c_str(), m_SelectionStart, m_SelectionEnd); - } - } - KeyHandled = true; - } - else if(ModPressed && !AltPressed && (Event.m_Key == KEY_C || Event.m_Key == KEY_X) && SelectionLength) - { - char *pSelection = m_pStr + m_SelectionStart; - const char TempChar = pSelection[SelectionLength]; - pSelection[SelectionLength] = '\0'; - Input()->SetClipboardText(pSelection); - pSelection[SelectionLength] = TempChar; - if(Event.m_Key == KEY_X) - SetRange("", m_SelectionStart, m_SelectionEnd); - KeyHandled = true; - } - else if(ModPressed && !AltPressed && Event.m_Key == KEY_A) - { - m_SelectionStart = 0; - m_SelectionEnd = m_CursorPos = m_Len; - KeyHandled = true; - } - } - - m_WasCursorChanged |= OldCursorPos != m_CursorPos; - m_WasCursorChanged |= SelectionLength != GetSelectionLength(); - return KeyHandled; -} - -STextBoundingBox CLineInput::Render(const CUIRect *pRect, float FontSize, int Align, bool Changed, float LineWidth, float LineSpacing, const std::vector &vColorSplits) -{ - // update derived attributes to handle external changes to the buffer - UpdateStrData(); - - m_WasRendered = true; - - const char *pDisplayStr = GetDisplayedString(); - const bool HasComposition = Input()->HasComposition(); - - if(pDisplayStr[0] == '\0' && !HasComposition && m_pEmptyText != nullptr) - { - pDisplayStr = m_pEmptyText; - m_MouseSelection.m_Selecting = false; - TextRender()->TextColor(1.0f, 1.0f, 1.0f, 0.75f); - } - - CTextCursor Cursor; - if(IsActive()) - { - const size_t CursorOffset = GetCursorOffset(); - const size_t DisplayCursorOffset = OffsetFromActualToDisplay(CursorOffset); - const size_t CompositionStart = CursorOffset + Input()->GetCompositionCursor(); - const size_t DisplayCompositionStart = OffsetFromActualToDisplay(CompositionStart); - const size_t CaretOffset = HasComposition ? DisplayCompositionStart : DisplayCursorOffset; - - std::string DisplayStrBuffer; - if(HasComposition) - { - const std::string DisplayStr = std::string(pDisplayStr); - DisplayStrBuffer = DisplayStr.substr(0, DisplayCursorOffset) + Input()->GetComposition() + DisplayStr.substr(DisplayCursorOffset); - pDisplayStr = DisplayStrBuffer.c_str(); - } - - const STextBoundingBox BoundingBox = TextRender()->TextBoundingBox(FontSize, pDisplayStr, -1, LineWidth, LineSpacing); - const vec2 CursorPos = CUi::CalcAlignedCursorPos(pRect, BoundingBox.Size(), Align); - - TextRender()->SetCursor(&Cursor, CursorPos.x, CursorPos.y, FontSize, TEXTFLAG_RENDER); - Cursor.m_LineWidth = LineWidth; - Cursor.m_ForceCursorRendering = Changed; - Cursor.m_LineSpacing = LineSpacing; - Cursor.m_PressMouse.x = m_MouseSelection.m_PressMouse.x; - Cursor.m_ReleaseMouse.x = m_MouseSelection.m_ReleaseMouse.x; - Cursor.m_vColorSplits = vColorSplits; - if(LineWidth < 0.0f) - { - // Using a Y position that's always inside the line input makes it so the selection does not reset when - // the mouse is moved outside the line input while selecting, which would otherwise be very inconvenient. - // This is a single line cursor, so we don't need the Y position to support selection over multiple lines. - Cursor.m_PressMouse.y = CursorPos.y + BoundingBox.m_H / 2.0f; - Cursor.m_ReleaseMouse.y = CursorPos.y + BoundingBox.m_H / 2.0f; - } - else - { - Cursor.m_PressMouse.y = m_MouseSelection.m_PressMouse.y; - Cursor.m_ReleaseMouse.y = m_MouseSelection.m_ReleaseMouse.y; - } - - if(HasComposition) - { - // We need to track the last composition cursor position separately, because the composition - // cursor movement does not cause an input event that would set the Changed variable. - Cursor.m_ForceCursorRendering |= m_LastCompositionCursorPos != CaretOffset; - m_LastCompositionCursorPos = CaretOffset; - const size_t DisplayCompositionEnd = DisplayCursorOffset + Input()->GetCompositionLength(); - Cursor.m_CursorMode = TEXT_CURSOR_CURSOR_MODE_SET; - Cursor.m_CursorCharacter = str_utf8_offset_bytes_to_chars(pDisplayStr, CaretOffset); - Cursor.m_CalculateSelectionMode = TEXT_CURSOR_SELECTION_MODE_SET; - Cursor.m_SelectionHeightFactor = 0.1f; - Cursor.m_SelectionStart = str_utf8_offset_bytes_to_chars(pDisplayStr, DisplayCursorOffset); - Cursor.m_SelectionEnd = str_utf8_offset_bytes_to_chars(pDisplayStr, DisplayCompositionEnd); - TextRender()->TextSelectionColor(1.0f, 1.0f, 1.0f, 0.8f); - TextRender()->TextEx(&Cursor, pDisplayStr); - TextRender()->TextSelectionColor(TextRender()->DefaultTextSelectionColor()); - } - else if(GetSelectionLength()) - { - const size_t Start = OffsetFromActualToDisplay(GetSelectionStart()); - const size_t End = OffsetFromActualToDisplay(GetSelectionEnd()); - Cursor.m_CursorMode = m_MouseSelection.m_Selecting ? TEXT_CURSOR_CURSOR_MODE_CALCULATE : TEXT_CURSOR_CURSOR_MODE_SET; - Cursor.m_CursorCharacter = str_utf8_offset_bytes_to_chars(pDisplayStr, CaretOffset); - Cursor.m_CalculateSelectionMode = m_MouseSelection.m_Selecting ? TEXT_CURSOR_SELECTION_MODE_CALCULATE : TEXT_CURSOR_SELECTION_MODE_SET; - Cursor.m_SelectionStart = str_utf8_offset_bytes_to_chars(pDisplayStr, Start); - Cursor.m_SelectionEnd = str_utf8_offset_bytes_to_chars(pDisplayStr, End); - TextRender()->TextEx(&Cursor, pDisplayStr); - } - else - { - Cursor.m_CursorMode = m_MouseSelection.m_Selecting ? TEXT_CURSOR_CURSOR_MODE_CALCULATE : TEXT_CURSOR_CURSOR_MODE_SET; - Cursor.m_CursorCharacter = str_utf8_offset_bytes_to_chars(pDisplayStr, CaretOffset); - Cursor.m_CalculateSelectionMode = m_MouseSelection.m_Selecting ? TEXT_CURSOR_SELECTION_MODE_CALCULATE : TEXT_CURSOR_SELECTION_MODE_NONE; - TextRender()->TextEx(&Cursor, pDisplayStr); - } - - if(Cursor.m_CursorMode == TEXT_CURSOR_CURSOR_MODE_CALCULATE && Cursor.m_CursorCharacter >= 0) - { - const size_t NewCursorOffset = str_utf8_offset_chars_to_bytes(pDisplayStr, Cursor.m_CursorCharacter); - SetCursorOffset(OffsetFromDisplayToActual(NewCursorOffset)); - } - if(Cursor.m_CalculateSelectionMode == TEXT_CURSOR_SELECTION_MODE_CALCULATE && Cursor.m_SelectionStart >= 0 && Cursor.m_SelectionEnd >= 0) - { - const size_t NewSelectionStart = str_utf8_offset_chars_to_bytes(pDisplayStr, Cursor.m_SelectionStart); - const size_t NewSelectionEnd = str_utf8_offset_chars_to_bytes(pDisplayStr, Cursor.m_SelectionEnd); - SetSelection(OffsetFromDisplayToActual(NewSelectionStart), OffsetFromDisplayToActual(NewSelectionEnd)); - } - - m_CaretPosition = Cursor.m_CursorRenderedPosition; - - CTextCursor CaretCursor; - TextRender()->SetCursor(&CaretCursor, CursorPos.x, CursorPos.y, FontSize, 0); - CaretCursor.m_LineWidth = LineWidth; - CaretCursor.m_LineSpacing = LineSpacing; - CaretCursor.m_CursorMode = TEXT_CURSOR_CURSOR_MODE_SET; - CaretCursor.m_CursorCharacter = str_utf8_offset_bytes_to_chars(pDisplayStr, DisplayCursorOffset); - TextRender()->TextEx(&CaretCursor, pDisplayStr); - SetCompositionWindowPosition(CaretCursor.m_CursorRenderedPosition + vec2(0.0f, CaretCursor.m_AlignedFontSize / 2.0f), CaretCursor.m_AlignedFontSize); - } - else - { - const STextBoundingBox BoundingBox = TextRender()->TextBoundingBox(FontSize, pDisplayStr, -1, LineWidth, LineSpacing); - const vec2 CursorPos = CUi::CalcAlignedCursorPos(pRect, BoundingBox.Size(), Align); - TextRender()->SetCursor(&Cursor, CursorPos.x, CursorPos.y, FontSize, TEXTFLAG_RENDER); - Cursor.m_LineWidth = LineWidth; - Cursor.m_LineSpacing = LineSpacing; - Cursor.m_vColorSplits = vColorSplits; - TextRender()->TextEx(&Cursor, pDisplayStr); - } - - TextRender()->TextColor(TextRender()->DefaultTextColor()); - - return Cursor.BoundingBox(); -} - -void CLineInput::RenderCandidates() -{ - // Check if the active line input was not rendered and deactivate it in that case. - // This can happen e.g. when an input in the ingame menu is active and the menu is - // closed or when switching between menu and editor with an active input. - CLineInput *pActiveInput = GetActiveInput(); - if(pActiveInput != nullptr) - { - if(pActiveInput->m_WasRendered) - { - pActiveInput->m_WasRendered = false; - } - else - { - pActiveInput->Deactivate(); - return; - } - } - - if(!Input()->HasComposition() || !Input()->GetCandidateCount()) - return; - - const float FontSize = 7.0f; - const float Padding = 1.0f; - const float Margin = 4.0f; - const float Height = 300.0f; - const float Width = Height * Graphics()->ScreenAspect(); - const int ScreenWidth = Graphics()->ScreenWidth(); - const int ScreenHeight = Graphics()->ScreenHeight(); - - Graphics()->MapScreen(0.0f, 0.0f, Width, Height); - - // Determine longest candidate width - float LongestCandidateWidth = 0.0f; - for(int i = 0; i < Input()->GetCandidateCount(); ++i) - LongestCandidateWidth = maximum(LongestCandidateWidth, TextRender()->TextWidth(FontSize, Input()->GetCandidate(i))); - - const float NumOffset = 8.0f; - const float RectWidth = LongestCandidateWidth + Margin + NumOffset + 2.0f * Padding; - const float RectHeight = Input()->GetCandidateCount() * (FontSize + 2.0f * Padding) + Margin; - - vec2 Position = ms_CompositionWindowPosition / vec2(ScreenWidth, ScreenHeight) * vec2(Width, Height); - Position.y += Margin; - - // Move candidate window left if needed - if(Position.x + RectWidth + Margin > Width) - Position.x -= Position.x + RectWidth + Margin - Width; - - // Move candidate window up if needed - if(Position.y + RectHeight + Margin > Height) - Position.y -= RectHeight + ms_CompositionLineHeight / ScreenHeight * Height + 2.0f * Margin; - - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - Graphics()->BlendNormal(); - - // Draw window shadow - Graphics()->SetColor(0.0f, 0.0f, 0.0f, 0.8f); - IGraphics::CQuadItem Quad = IGraphics::CQuadItem(Position.x + 0.75f, Position.y + 0.75f, RectWidth, RectHeight); - Graphics()->QuadsDrawTL(&Quad, 1); - - // Draw window background - Graphics()->SetColor(0.15f, 0.15f, 0.15f, 1.0f); - Quad = IGraphics::CQuadItem(Position.x, Position.y, RectWidth, RectHeight); - Graphics()->QuadsDrawTL(&Quad, 1); - - // Draw selected entry highlight - Graphics()->SetColor(0.1f, 0.4f, 0.8f, 1.0f); - Quad = IGraphics::CQuadItem(Position.x + Margin / 4.0f, Position.y + Margin / 2.0f + Input()->GetCandidateSelectedIndex() * (FontSize + 2.0f * Padding), RectWidth - Margin / 2.0f, FontSize + 2.0f * Padding); - Graphics()->QuadsDrawTL(&Quad, 1); - Graphics()->QuadsEnd(); - - // Draw candidates - for(int i = 0; i < Input()->GetCandidateCount(); ++i) - { - char aBuf[3]; - str_format(aBuf, sizeof(aBuf), "%d.", (i + 1) % 10); - - const float PosX = Position.x + Margin / 2.0f + Padding; - const float PosY = Position.y + Margin / 2.0f + i * (FontSize + 2.0f * Padding) + Padding; - TextRender()->TextColor(0.6f, 0.6f, 0.6f, 1.0f); - TextRender()->Text(PosX, PosY, FontSize, aBuf); - TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); - TextRender()->Text(PosX + NumOffset, PosY, FontSize, Input()->GetCandidate(i)); - } -} - -void CLineInput::SetCompositionWindowPosition(vec2 Anchor, float LineHeight) -{ - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - const int ScreenWidth = Graphics()->ScreenWidth(); - const int ScreenHeight = Graphics()->ScreenHeight(); - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - - const vec2 ScreenScale = vec2(ScreenWidth / (ScreenX1 - ScreenX0), ScreenHeight / (ScreenY1 - ScreenY0)); - ms_CompositionWindowPosition = Anchor * ScreenScale; - ms_CompositionLineHeight = LineHeight * ScreenScale.y; - Input()->SetCompositionWindowPosition(ms_CompositionWindowPosition.x, ms_CompositionWindowPosition.y, ms_CompositionLineHeight); -} - -void CLineInput::Activate(EInputPriority Priority) -{ - if(IsActive()) - return; - if(ms_ActiveInputPriority != EInputPriority::NONE && Priority < ms_ActiveInputPriority) - return; // do not replace a higher priority input - if(ms_pActiveInput) - ms_pActiveInput->OnDeactivate(); - ms_pActiveInput = this; - ms_pActiveInput->OnActivate(); - ms_ActiveInputPriority = Priority; -} - -void CLineInput::Deactivate() const -{ - if(!IsActive()) - return; - ms_pActiveInput->OnDeactivate(); - ms_pActiveInput = nullptr; - ms_ActiveInputPriority = EInputPriority::NONE; -} - -void CLineInput::OnActivate() -{ - Input()->StartTextInput(); -} - -void CLineInput::OnDeactivate() -{ - Input()->StopTextInput(); - m_MouseSelection.m_Selecting = false; -} - -void CLineInputNumber::SetInteger(int Number, int Base, int HexPrefix) -{ - char aBuf[32]; - switch(Base) - { - case 10: - str_format(aBuf, sizeof(aBuf), "%d", Number); - break; - case 16: - str_format(aBuf, sizeof(aBuf), "%0*X", HexPrefix, Number); - break; - default: - dbg_assert(false, "Base unsupported"); - return; - } - if(str_comp(aBuf, GetString()) != 0) - Set(aBuf); -} - -int CLineInputNumber::GetInteger(int Base) const -{ - return str_toint_base(GetString(), Base); -} - -void CLineInputNumber::SetInteger64(int64_t Number, int Base, int HexPrefix) -{ - char aBuf[64]; - switch(Base) - { - case 10: - str_format(aBuf, sizeof(aBuf), "%" PRId64, Number); - break; - case 16: - str_format(aBuf, sizeof(aBuf), "%0*" PRIX64, HexPrefix, Number); - break; - default: - dbg_assert(false, "Base unsupported"); - return; - } - if(str_comp(aBuf, GetString()) != 0) - Set(aBuf); -} - -int64_t CLineInputNumber::GetInteger64(int Base) const -{ - return str_toint64_base(GetString(), Base); -} - -void CLineInputNumber::SetFloat(float Number) -{ - char aBuf[32]; - str_format(aBuf, sizeof(aBuf), "%.3f", Number); - if(str_comp(aBuf, GetString()) != 0) - Set(aBuf); -} - -float CLineInputNumber::GetFloat() const -{ - return str_tofloat(GetString()); -} diff --git a/src/game/client/lineinput.h b/src/game/client/lineinput.h deleted file mode 100644 index cbf4e42e92..0000000000 --- a/src/game/client/lineinput.h +++ /dev/null @@ -1,244 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_LINEINPUT_H -#define GAME_CLIENT_LINEINPUT_H - -#include - -#include -#include -#include -#include - -#include - -enum class EInputPriority -{ - NONE = 0, - UI, - CHAT, - CONSOLE, -}; - -// line input helper -class CLineInput -{ -public: - struct SMouseSelection - { - bool m_Selecting = false; - vec2 m_PressMouse = vec2(0.0f, 0.0f); - vec2 m_ReleaseMouse = vec2(0.0f, 0.0f); - vec2 m_Offset = vec2(0.0f, 0.0f); - }; - - typedef std::function FClipboardLineCallback; - typedef std::function FDisplayTextCallback; - typedef std::function FCalculateOffsetCallback; - -private: - static IClient *ms_pClient; - static IGraphics *ms_pGraphics; - static IInput *ms_pInput; - static ITextRender *ms_pTextRender; - - static IClient *Client() { return ms_pClient; } - static IGraphics *Graphics() { return ms_pGraphics; } - static IInput *Input() { return ms_pInput; } - static ITextRender *TextRender() { return ms_pTextRender; } - - static CLineInput *ms_pActiveInput; - static EInputPriority ms_ActiveInputPriority; - - static vec2 ms_CompositionWindowPosition; - static float ms_CompositionLineHeight; - - static char ms_aStars[128]; - - char *m_pStr = nullptr; // explicitly set to nullptr outside of constructor, so SetBuffer works in this case - size_t m_MaxSize; - size_t m_MaxChars; - size_t m_Len; - size_t m_NumChars; - - size_t m_CursorPos; - size_t m_SelectionStart; - size_t m_SelectionEnd; - - float m_ScrollOffset; - float m_ScrollOffsetChange; - vec2 m_CaretPosition; - SMouseSelection m_MouseSelection; - size_t m_LastCompositionCursorPos; - - bool m_Hidden; - const char *m_pEmptyText; - FClipboardLineCallback m_pfnClipboardLineCallback; - FDisplayTextCallback m_pfnDisplayTextCallback; - FCalculateOffsetCallback m_pfnCalculateOffsetCallback; - bool m_WasChanged; - bool m_WasCursorChanged; - bool m_WasRendered; - - char m_ClearButtonId; - - void UpdateStrData(); - enum EMoveDirection - { - FORWARD, - REWIND - }; - static void MoveCursor(EMoveDirection Direction, bool MoveWord, const char *pStr, size_t MaxSize, size_t *pCursorPos); - static void SetCompositionWindowPosition(vec2 Anchor, float LineHeight); - - void OnActivate(); - void OnDeactivate(); - -public: - static void Init(IClient *pClient, IGraphics *pGraphics, IInput *pInput, ITextRender *pTextRender) - { - ms_pClient = pClient; - ms_pGraphics = pGraphics; - ms_pInput = pInput; - ms_pTextRender = pTextRender; - } - static void RenderCandidates(); - - static CLineInput *GetActiveInput() { return ms_pActiveInput; } - - CLineInput() - { - SetBuffer(nullptr, 0, 0); - } - - CLineInput(char *pStr, size_t MaxSize) - { - SetBuffer(pStr, MaxSize); - } - - CLineInput(char *pStr, size_t MaxSize, size_t MaxChars) - { - SetBuffer(pStr, MaxSize, MaxChars); - } - - void SetBuffer(char *pStr, size_t MaxSize) { SetBuffer(pStr, MaxSize, MaxSize); } - void SetBuffer(char *pStr, size_t MaxSize, size_t MaxChars); - - void Clear(); - void Set(const char *pString); - void SetRange(const char *pString, size_t Begin, size_t End); - void Insert(const char *pString, size_t Begin); - void Append(const char *pString); - - const char *GetString() const { return m_pStr; } - const char *GetDisplayedString(); - size_t GetMaxSize() const { return m_MaxSize; } - size_t GetMaxChars() const { return m_MaxChars; } - size_t GetLength() const { return m_Len; } - size_t GetNumChars() const { return m_NumChars; } - bool IsEmpty() const { return GetLength() == 0; } - - size_t GetCursorOffset() const { return m_CursorPos; } - void SetCursorOffset(size_t Offset); - size_t GetSelectionStart() const { return m_SelectionStart; } - size_t GetSelectionEnd() const { return m_SelectionEnd; } - size_t GetSelectionLength() const { return m_SelectionEnd - m_SelectionStart; } - bool HasSelection() const { return GetSelectionLength() > 0; } - void SetSelection(size_t Start, size_t End); - void SelectNothing() { SetSelection(GetCursorOffset(), GetCursorOffset()); } - void SelectAll() - { - SetCursorOffset(GetLength()); - SetSelection(0, GetLength()); - } - - size_t OffsetFromActualToDisplay(size_t ActualOffset); - size_t OffsetFromDisplayToActual(size_t DisplayOffset); - - // used either for vertical or horizontal scrolling - float GetScrollOffset() const { return m_ScrollOffset; } - void SetScrollOffset(float ScrollOffset) { m_ScrollOffset = ScrollOffset; } - float GetScrollOffsetChange() const { return m_ScrollOffsetChange; } - void SetScrollOffsetChange(float ScrollOffsetChange) { m_ScrollOffsetChange = ScrollOffsetChange; } - - vec2 GetCaretPosition() const { return m_CaretPosition; } // only updated while the input is active - - bool IsHidden() const { return m_Hidden; } - void SetHidden(bool Hidden) { m_Hidden = Hidden; } - - const char *GetEmptyText() const { return m_pEmptyText; } - void SetEmptyText(const char *pText) { m_pEmptyText = pText; } - - void SetClipboardLineCallback(FClipboardLineCallback pfnClipboardLineCallback) { m_pfnClipboardLineCallback = pfnClipboardLineCallback; } - void SetDisplayTextCallback(FDisplayTextCallback pfnDisplayTextCallback) { m_pfnDisplayTextCallback = pfnDisplayTextCallback; } - void SetCalculateOffsetCallback(FCalculateOffsetCallback pfnCalculateOffsetCallback) { m_pfnCalculateOffsetCallback = pfnCalculateOffsetCallback; } - - bool ProcessInput(const IInput::CEvent &Event); - bool WasChanged() - { - const bool Changed = m_WasChanged; - m_WasChanged = false; - return Changed; - } - bool WasCursorChanged() - { - const bool Changed = m_WasCursorChanged; - m_WasCursorChanged = false; - return Changed; - } - - STextBoundingBox Render(const CUIRect *pRect, float FontSize, int Align, bool Changed, float LineWidth, float LineSpacing, const std::vector &vColorSplits = {}); - SMouseSelection *GetMouseSelection() { return &m_MouseSelection; } - - const void *GetClearButtonId() const { return &m_ClearButtonId; } - - bool IsActive() const { return GetActiveInput() == this; } - void Activate(EInputPriority Priority); - void Deactivate() const; -}; - -template -class CLineInputBuffered : public CLineInput -{ - char m_aBuffer[MaxSize]; - -public: - CLineInputBuffered() : - CLineInput() - { - m_aBuffer[0] = '\0'; - SetBuffer(m_aBuffer, MaxSize, MaxChars); - } -}; - -class CLineInputNumber : public CLineInputBuffered<32> -{ -public: - CLineInputNumber() : - CLineInputBuffered() - { - } - - CLineInputNumber(int Number) : - CLineInputBuffered() - { - SetInteger(Number); - } - - CLineInputNumber(float Number) : - CLineInputBuffered() - { - SetFloat(Number); - } - - void SetInteger(int Number, int Base = 10, int HexPrefix = 6); - int GetInteger(int Base = 10) const; - - void SetInteger64(int64_t Number, int Base = 10, int HexPrefix = 6); - int64_t GetInteger64(int Base = 10) const; - - void SetFloat(float Number); - float GetFloat() const; -}; - -#endif diff --git a/src/game/client/pickup_data.cpp b/src/game/client/pickup_data.cpp deleted file mode 100644 index 8e60c96375..0000000000 --- a/src/game/client/pickup_data.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include "pickup_data.h" - -#include -#include -#include - -CPickupData ExtractPickupInfo(int NetObjType, const void *pData, const CNetObj_EntityEx *pEntEx) -{ - if(NetObjType == NETOBJTYPE_DDNETPICKUP) - { - return ExtractPickupInfoDDNet((CNetObj_DDNetPickup *)pData); - } - - CNetObj_Pickup *pPickup = (CNetObj_Pickup *)pData; - - CPickupData Result = {vec2(0, 0)}; - - Result.m_Pos.x = pPickup->m_X; - Result.m_Pos.y = pPickup->m_Y; - Result.m_Type = pPickup->m_Type; - Result.m_Subtype = pPickup->m_Subtype; - Result.m_SwitchNumber = pEntEx ? pEntEx->m_SwitchNumber : 0; - - return Result; -} - -CPickupData ExtractPickupInfoDDNet(const CNetObj_DDNetPickup *pPickup) -{ - CPickupData Result = {vec2(0, 0)}; - - Result.m_Pos.x = pPickup->m_X; - Result.m_Pos.y = pPickup->m_Y; - Result.m_Type = pPickup->m_Type; - Result.m_Subtype = pPickup->m_Subtype; - Result.m_SwitchNumber = pPickup->m_SwitchNumber; - - return Result; -} diff --git a/src/game/client/pickup_data.h b/src/game/client/pickup_data.h deleted file mode 100644 index 2e8f94c40b..0000000000 --- a/src/game/client/pickup_data.h +++ /dev/null @@ -1,24 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_PICKUP_DATA_H -#define GAME_CLIENT_PICKUP_DATA_H - -#include - -struct CNetObj_Pickup; -struct CNetObj_DDNetPickup; -struct CNetObj_EntityEx; - -class CPickupData -{ -public: - vec2 m_Pos; - int m_Type; - int m_Subtype; - int m_SwitchNumber; -}; - -CPickupData ExtractPickupInfo(int NetObjType, const void *pData, const CNetObj_EntityEx *pEntEx); -CPickupData ExtractPickupInfoDDNet(const CNetObj_DDNetPickup *pPickup); - -#endif // GAME_CLIENT_PICKUP_DATA_H diff --git a/src/game/client/prediction/entities/character.cpp b/src/game/client/prediction/entities/character.cpp deleted file mode 100644 index b65924ccba..0000000000 --- a/src/game/client/prediction/entities/character.cpp +++ /dev/null @@ -1,1432 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include -#include -#include - -#include "character.h" -#include "laser.h" -#include "projectile.h" - -// Character, "physical" player's part - -void CCharacter::SetWeapon(int W) -{ - if(W == m_Core.m_ActiveWeapon) - return; - - m_LastWeapon = m_Core.m_ActiveWeapon; - m_QueuedWeapon = -1; - SetActiveWeapon(W); - - if(m_Core.m_ActiveWeapon < 0 || m_Core.m_ActiveWeapon >= NUM_WEAPONS) - SetActiveWeapon(0); -} - -void CCharacter::SetSolo(bool Solo) -{ - m_Core.m_Solo = Solo; - TeamsCore()->SetSolo(GetCid(), Solo); -} - -void CCharacter::SetSuper(bool Super) -{ - m_Core.m_Super = Super; - if(m_Core.m_Super) - TeamsCore()->Team(GetCid(), TeamsCore()->m_IsDDRace16 ? VANILLA_TEAM_SUPER : TEAM_SUPER); -} - -bool CCharacter::IsGrounded() -{ - if(Collision()->CheckPoint(m_Pos.x + GetProximityRadius() / 2, m_Pos.y + GetProximityRadius() / 2 + 5)) - return true; - if(Collision()->CheckPoint(m_Pos.x - GetProximityRadius() / 2, m_Pos.y + GetProximityRadius() / 2 + 5)) - return true; - - int MoveRestrictionsBelow = Collision()->GetMoveRestrictions(m_Pos + vec2(0, GetProximityRadius() / 2 + 4), 0.0f); - return (MoveRestrictionsBelow & CANTMOVE_DOWN) != 0; -} - -void CCharacter::HandleJetpack() -{ - if(m_NumInputs < 2) - return; - - vec2 Direction = normalize(vec2(m_LatestInput.m_TargetX, m_LatestInput.m_TargetY)); - - bool FullAuto = false; - if(m_Core.m_ActiveWeapon == WEAPON_GRENADE || m_Core.m_ActiveWeapon == WEAPON_SHOTGUN || m_Core.m_ActiveWeapon == WEAPON_LASER) - FullAuto = true; - if(m_Core.m_Jetpack && m_Core.m_ActiveWeapon == WEAPON_GUN) - FullAuto = true; - - // check if we gonna fire - bool WillFire = false; - if(CountInput(m_LatestPrevInput.m_Fire, m_LatestInput.m_Fire).m_Presses) - WillFire = true; - - if(FullAuto && (m_LatestInput.m_Fire & 1) && m_Core.m_aWeapons[m_Core.m_ActiveWeapon].m_Ammo) - WillFire = true; - - if(!WillFire) - return; - - // check for ammo - if(!m_Core.m_aWeapons[m_Core.m_ActiveWeapon].m_Ammo || m_FreezeTime) - { - return; - } - - switch(m_Core.m_ActiveWeapon) - { - case WEAPON_GUN: - { - if(m_Core.m_Jetpack) - { - float Strength = GetTuning(m_TuneZone)->m_JetpackStrength; - if(!m_TuneZone) - Strength = m_LastJetpackStrength; - TakeDamage(Direction * -1.0f * (Strength / 100.0f / 6.11f), 0, GetCid(), m_Core.m_ActiveWeapon); - } - } - } -} - -void CCharacter::RemoveNinja() -{ - m_Core.m_Ninja.m_CurrentMoveTime = 0; - m_Core.m_aWeapons[WEAPON_NINJA].m_Got = false; - m_Core.m_ActiveWeapon = m_LastWeapon; - - SetWeapon(m_Core.m_ActiveWeapon); -} - -void CCharacter::HandleNinja() -{ - if(m_Core.m_ActiveWeapon != WEAPON_NINJA) - return; - - if((GameWorld()->GameTick() - m_Core.m_Ninja.m_ActivationTick) > (g_pData->m_Weapons.m_Ninja.m_Duration * GameWorld()->GameTickSpeed() / 1000)) - { - // time's up, return - RemoveNinja(); - return; - } - - // force ninja Weapon - SetWeapon(WEAPON_NINJA); - - m_Core.m_Ninja.m_CurrentMoveTime--; - - if(m_Core.m_Ninja.m_CurrentMoveTime == 0) - { - // reset velocity - m_Core.m_Vel = m_Core.m_Ninja.m_ActivationDir * m_Core.m_Ninja.m_OldVelAmount; - } - - if(m_Core.m_Ninja.m_CurrentMoveTime > 0) - { - // Set velocity - m_Core.m_Vel = m_Core.m_Ninja.m_ActivationDir * g_pData->m_Weapons.m_Ninja.m_Velocity; - vec2 OldPos = m_Pos; - Collision()->MoveBox(&m_Core.m_Pos, &m_Core.m_Vel, vec2(m_ProximityRadius, m_ProximityRadius), vec2(GetTuning(m_TuneZone)->m_GroundElasticityX, GetTuning(m_TuneZone)->m_GroundElasticityY)); - - // reset velocity so the client doesn't predict stuff - m_Core.m_Vel = vec2(0.f, 0.f); - - // check if we Hit anything along the way - { - CEntity *apEnts[MAX_CLIENTS]; - float Radius = m_ProximityRadius * 2.0f; - int Num = GameWorld()->FindEntities(OldPos, Radius, apEnts, MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER); - - // check that we're not in solo part - if(TeamsCore()->GetSolo(GetCid())) - return; - - for(int i = 0; i < Num; ++i) - { - auto *pChr = static_cast(apEnts[i]); - if(pChr == this) - continue; - - // Don't hit players in other teams - if(Team() != pChr->Team()) - continue; - - // Don't hit players in solo parts - if(TeamsCore()->GetSolo(pChr->GetCid())) - return; - - // make sure we haven't Hit this object before - bool AlreadyHit = false; - for(int j = 0; j < m_NumObjectsHit; j++) - { - if(m_aHitObjects[j] == pChr->GetCid()) - AlreadyHit = true; - } - if(AlreadyHit) - continue; - - // check so we are sufficiently close - if(distance(pChr->m_Pos, m_Pos) > (m_ProximityRadius * 2.0f)) - continue; - - // Hit a player, give them damage and stuffs... - // set his velocity to fast upward (for now) - if(m_NumObjectsHit < 10) - m_aHitObjects[m_NumObjectsHit++] = pChr->GetCid(); - - CCharacter *pChar = GameWorld()->GetCharacterById(pChr->GetCid()); - if(pChar) - pChar->TakeDamage(vec2(0, -10.0f), g_pData->m_Weapons.m_Ninja.m_pBase->m_Damage, GetCid(), WEAPON_NINJA); - } - } - - return; - } -} - -void CCharacter::DoWeaponSwitch() -{ - // make sure we can switch - if(m_ReloadTimer != 0 || m_QueuedWeapon == -1 || m_Core.m_aWeapons[WEAPON_NINJA].m_Got || !m_Core.m_aWeapons[m_QueuedWeapon].m_Got) - return; - - // switch Weapon - SetWeapon(m_QueuedWeapon); -} - -void CCharacter::HandleWeaponSwitch() -{ - if(m_NumInputs < 2) - return; - - int WantedWeapon = m_Core.m_ActiveWeapon; - if(m_QueuedWeapon != -1) - WantedWeapon = m_QueuedWeapon; - - bool Anything = false; - for(int i = 0; i < NUM_WEAPONS - 1; ++i) - if(m_Core.m_aWeapons[i].m_Got) - Anything = true; - if(!Anything) - return; - // select Weapon - int Next = CountInput(m_LatestPrevInput.m_NextWeapon, m_LatestInput.m_NextWeapon).m_Presses; - int Prev = CountInput(m_LatestPrevInput.m_PrevWeapon, m_LatestInput.m_PrevWeapon).m_Presses; - - if(Next < 128) // make sure we only try sane stuff - { - while(Next) // Next Weapon selection - { - WantedWeapon = (WantedWeapon + 1) % NUM_WEAPONS; - if(m_Core.m_aWeapons[WantedWeapon].m_Got) - Next--; - } - } - - if(Prev < 128) // make sure we only try sane stuff - { - while(Prev) // Prev Weapon selection - { - WantedWeapon = (WantedWeapon - 1) < 0 ? NUM_WEAPONS - 1 : WantedWeapon - 1; - if(m_Core.m_aWeapons[WantedWeapon].m_Got) - Prev--; - } - } - - // Direct Weapon selection - if(m_LatestInput.m_WantedWeapon) - WantedWeapon = m_Input.m_WantedWeapon - 1; - - // check for insane values - if(WantedWeapon >= 0 && WantedWeapon < NUM_WEAPONS && WantedWeapon != m_Core.m_ActiveWeapon && m_Core.m_aWeapons[WantedWeapon].m_Got) - m_QueuedWeapon = WantedWeapon; - - DoWeaponSwitch(); -} - -void CCharacter::FireWeapon() -{ - if(m_NumInputs < 2) - return; - - if(!GameWorld()->m_WorldConfig.m_PredictWeapons) - return; - - if(m_ReloadTimer != 0) - return; - - DoWeaponSwitch(); - vec2 Direction = normalize(vec2(m_LatestInput.m_TargetX, m_LatestInput.m_TargetY)); - - bool FullAuto = false; - if(m_Core.m_ActiveWeapon == WEAPON_GRENADE || m_Core.m_ActiveWeapon == WEAPON_SHOTGUN || m_Core.m_ActiveWeapon == WEAPON_LASER) - FullAuto = true; - if(m_Core.m_Jetpack && m_Core.m_ActiveWeapon == WEAPON_GUN) - FullAuto = true; - if(m_FrozenLastTick) - FullAuto = true; - - // don't fire hammer when player is deep and sv_deepfly is disabled - if(!g_Config.m_SvDeepfly && m_Core.m_ActiveWeapon == WEAPON_HAMMER && m_Core.m_DeepFrozen) - return; - - // check if we gonna fire - bool WillFire = false; - if(CountInput(m_LatestPrevInput.m_Fire, m_LatestInput.m_Fire).m_Presses) - WillFire = true; - - if(FullAuto && (m_LatestInput.m_Fire & 1) && m_Core.m_aWeapons[m_Core.m_ActiveWeapon].m_Ammo) - WillFire = true; - - if(!WillFire) - return; - - // check for ammo - if(!m_Core.m_aWeapons[m_Core.m_ActiveWeapon].m_Ammo || m_FreezeTime) - { - return; - } - - vec2 ProjStartPos = m_Pos + Direction * m_ProximityRadius * 0.75f; - - switch(m_Core.m_ActiveWeapon) - { - case WEAPON_HAMMER: - { - // reset objects Hit - m_NumObjectsHit = 0; - - if(m_Core.m_HammerHitDisabled) - break; - - CEntity *apEnts[MAX_CLIENTS]; - int Hits = 0; - int Num = GameWorld()->FindEntities(ProjStartPos, m_ProximityRadius * 0.5f, apEnts, - MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER); - - for(int i = 0; i < Num; ++i) - { - auto *pTarget = static_cast(apEnts[i]); - - if((pTarget == this || !CanCollide(pTarget->GetCid()))) - continue; - - // set his velocity to fast upward (for now) - - vec2 Dir; - if(length(pTarget->m_Pos - m_Pos) > 0.0f) - Dir = normalize(pTarget->m_Pos - m_Pos); - else - Dir = vec2(0.f, -1.f); - - float Strength = GetTuning(m_TuneZone)->m_HammerStrength; - - vec2 Temp = pTarget->m_Core.m_Vel + normalize(Dir + vec2(0.f, -1.1f)) * 10.0f; - Temp = ClampVel(pTarget->m_MoveRestrictions, Temp); - Temp -= pTarget->m_Core.m_Vel; - - vec2 Force = vec2(0.f, -1.0f) + Temp; - - if(GameWorld()->m_WorldConfig.m_IsFNG) - { - if(m_GameTeam == pTarget->m_GameTeam && pTarget->m_LastSnapWeapon == WEAPON_NINJA) // melt hammer - { - Force.x *= 50 * 0.01f; - Force.y *= 50 * 0.01f; - } - else - { - Force.x *= 320 * 0.01f; - Force.y *= 120 * 0.01f; - } - } - else - Force *= Strength; - - pTarget->TakeDamage(Force, g_pData->m_Weapons.m_Hammer.m_pBase->m_Damage, - GetCid(), m_Core.m_ActiveWeapon); - pTarget->UnFreeze(); - - Hits++; - } - - // if we Hit anything, we have to wait for the reload - if(Hits) - { - float FireDelay = GetTuning(m_TuneZone)->m_HammerHitFireDelay; - m_ReloadTimer = FireDelay * GameWorld()->GameTickSpeed() / 1000; - } - } - break; - - case WEAPON_GUN: - { - if(!m_Core.m_Jetpack) - { - int Lifetime = (int)(GameWorld()->GameTickSpeed() * GetTuning(m_TuneZone)->m_GunLifetime); - - new CProjectile( - GameWorld(), - WEAPON_GUN, //Type - GetCid(), //Owner - ProjStartPos, //Pos - Direction, //Dir - Lifetime, //Span - false, //Freeze - false, //Explosive - 0, //Force - -1 //SoundImpact - ); - } - } - break; - - case WEAPON_SHOTGUN: - { - if(GameWorld()->m_WorldConfig.m_IsVanilla) - { - int ShotSpread = 2; - for(int i = -ShotSpread; i <= ShotSpread; ++i) - { - const float aSpreading[] = {-0.185f, -0.070f, 0, 0.070f, 0.185f}; - float a = angle(Direction); - a += aSpreading[i + 2]; - float v = 1 - (absolute(i) / (float)ShotSpread); - float Speed = mix((float)Tuning()->m_ShotgunSpeeddiff, 1.0f, v); - new CProjectile( - GameWorld(), - WEAPON_SHOTGUN, //Type - GetCid(), //Owner - ProjStartPos, //Pos - direction(a) * Speed, //Dir - (int)(GameWorld()->GameTickSpeed() * Tuning()->m_ShotgunLifetime), //Span - false, //Freeze - false, //Explosive - -1 //SoundImpact - ); - } - } - else if(GameWorld()->m_WorldConfig.m_IsDDRace) - { - float LaserReach = GetTuning(m_TuneZone)->m_LaserReach; - - new CLaser(GameWorld(), m_Pos, Direction, LaserReach, GetCid(), WEAPON_SHOTGUN); - } - } - break; - - case WEAPON_GRENADE: - { - int Lifetime = (int)(GameWorld()->GameTickSpeed() * GetTuning(m_TuneZone)->m_GrenadeLifetime); - - new CProjectile( - GameWorld(), - WEAPON_GRENADE, //Type - GetCid(), //Owner - ProjStartPos, //Pos - Direction, //Dir - Lifetime, //Span - false, //Freeze - true, //Explosive - SOUND_GRENADE_EXPLODE //SoundImpact - ); //SoundImpact - } - break; - - case WEAPON_LASER: - { - float LaserReach = GetTuning(m_TuneZone)->m_LaserReach; - - new CLaser(GameWorld(), m_Pos, Direction, LaserReach, GetCid(), WEAPON_LASER); - } - break; - - case WEAPON_NINJA: - { - // reset Hit objects - m_NumObjectsHit = 0; - - m_Core.m_Ninja.m_ActivationDir = Direction; - m_Core.m_Ninja.m_CurrentMoveTime = g_pData->m_Weapons.m_Ninja.m_Movetime * GameWorld()->GameTickSpeed() / 1000; - m_Core.m_Ninja.m_OldVelAmount = length(m_Core.m_Vel); - } - break; - } - - m_AttackTick = GameWorld()->GameTick(); // NOLINT(clang-analyzer-unix.Malloc) - - if(!m_ReloadTimer) - { - float FireDelay; - GetTuning(m_TuneZone)->Get(38 + m_Core.m_ActiveWeapon, &FireDelay); - - m_ReloadTimer = FireDelay * GameWorld()->GameTickSpeed() / 1000; - } -} - -void CCharacter::HandleWeapons() -{ - //ninja - HandleNinja(); - HandleJetpack(); - - // check reload timer - if(m_ReloadTimer) - { - m_ReloadTimer--; - return; - } - - // fire Weapon, if wanted - FireWeapon(); -} - -void CCharacter::GiveNinja() -{ - m_Core.m_Ninja.m_ActivationTick = GameWorld()->GameTick(); - m_Core.m_aWeapons[WEAPON_NINJA].m_Got = true; - if(m_FreezeTime == 0) - m_Core.m_aWeapons[WEAPON_NINJA].m_Ammo = -1; - if(m_Core.m_ActiveWeapon != WEAPON_NINJA) - m_LastWeapon = m_Core.m_ActiveWeapon; - SetActiveWeapon(WEAPON_NINJA); -} - -void CCharacter::OnPredictedInput(CNetObj_PlayerInput *pNewInput) -{ - // skip the input if chat is active - if(!GameWorld()->m_WorldConfig.m_BugDDRaceInput && pNewInput->m_PlayerFlags & PLAYERFLAG_CHATTING) - { - // save the reset input - mem_copy(&m_SavedInput, &m_Input, sizeof(m_SavedInput)); - return; - } - - // copy new input - mem_copy(&m_Input, pNewInput, sizeof(m_Input)); - //m_NumInputs++; - - // it is not allowed to aim in the center - if(m_Input.m_TargetX == 0 && m_Input.m_TargetY == 0) - m_Input.m_TargetY = -1; - - mem_copy(&m_SavedInput, &m_Input, sizeof(m_SavedInput)); -} - -void CCharacter::OnDirectInput(CNetObj_PlayerInput *pNewInput) -{ - // skip the input if chat is active - if(!GameWorld()->m_WorldConfig.m_BugDDRaceInput && pNewInput->m_PlayerFlags & PLAYERFLAG_CHATTING) - { - // reset input - ResetInput(); - // mods that do not allow inputs to be held while chatting also do not allow to hold hook - m_Input.m_Hook = 0; - return; - } - - m_NumInputs++; - mem_copy(&m_LatestPrevInput, &m_LatestInput, sizeof(m_LatestInput)); - mem_copy(&m_LatestInput, pNewInput, sizeof(m_LatestInput)); - - // it is not allowed to aim in the center - if(m_LatestInput.m_TargetX == 0 && m_LatestInput.m_TargetY == 0) - m_LatestInput.m_TargetY = -1; - - if(m_NumInputs > 1 && Team() != TEAM_SPECTATORS) - { - HandleWeaponSwitch(); - FireWeapon(); - } - - mem_copy(&m_LatestPrevInput, &m_LatestInput, sizeof(m_LatestInput)); -} - -void CCharacter::ReleaseHook() -{ - m_Core.SetHookedPlayer(-1); - m_Core.m_HookState = HOOK_RETRACTED; - m_Core.m_TriggeredEvents |= COREEVENT_HOOK_RETRACT; -} - -void CCharacter::ResetHook() -{ - ReleaseHook(); - m_Core.m_HookPos = m_Core.m_Pos; -} - -void CCharacter::ResetInput() -{ - m_Input.m_Direction = 0; - // m_Input.m_Hook = 0; - // simulate releasing the fire button - if((m_Input.m_Fire & 1) != 0) - m_Input.m_Fire++; - m_Input.m_Fire &= INPUT_STATE_MASK; - m_Input.m_Jump = 0; - m_LatestPrevInput = m_LatestInput = m_Input; -} - -void CCharacter::PreTick() -{ - DDRaceTick(); - - m_Core.m_Input = m_Input; - m_Core.Tick(true, !m_pGameWorld->m_WorldConfig.m_NoWeakHookAndBounce); -} - -void CCharacter::Tick() -{ - if(m_pGameWorld->m_WorldConfig.m_NoWeakHookAndBounce) - { - m_Core.TickDeferred(); - } - else - { - PreTick(); - } - - // handle Weapons - HandleWeapons(); - - DDRacePostCoreTick(); - - // Previnput - m_PrevInput = m_Input; - - m_PrevPrevPos = m_PrevPos; - m_PrevPos = m_Core.m_Pos; -} - -void CCharacter::TickDeferred() -{ - m_Core.Move(); - m_Core.Quantize(); - m_Pos = m_Core.m_Pos; -} - -bool CCharacter::TakeDamage(vec2 Force, int Dmg, int From, int Weapon) -{ - vec2 Temp = m_Core.m_Vel + Force; - m_Core.m_Vel = ClampVel(m_MoveRestrictions, Temp); - return true; -} - -// DDRace - -bool CCharacter::CanCollide(int ClientId) -{ - return TeamsCore()->CanCollide(GetCid(), ClientId); -} - -bool CCharacter::SameTeam(int ClientId) -{ - return TeamsCore()->SameTeam(GetCid(), ClientId); -} - -int CCharacter::Team() -{ - return TeamsCore()->Team(GetCid()); -} - -void CCharacter::HandleSkippableTiles(int Index) -{ - if(Index < 0) - return; - - // handle speedup tiles - if(Collision()->IsSpeedup(Index)) - { - vec2 Direction, TempVel = m_Core.m_Vel; - int Force, MaxSpeed = 0; - float TeeAngle, SpeederAngle, DiffAngle, SpeedLeft, TeeSpeed; - Collision()->GetSpeedup(Index, &Direction, &Force, &MaxSpeed); - if(Force == 255 && MaxSpeed) - { - m_Core.m_Vel = Direction * (MaxSpeed / 5); - } - else - { - if(MaxSpeed > 0 && MaxSpeed < 5) - MaxSpeed = 5; - if(MaxSpeed > 0) - { - if(Direction.x > 0.0000001f) - SpeederAngle = -std::atan(Direction.y / Direction.x); - else if(Direction.x < 0.0000001f) - SpeederAngle = std::atan(Direction.y / Direction.x) + 2.0f * std::asin(1.0f); - else if(Direction.y > 0.0000001f) - SpeederAngle = std::asin(1.0f); - else - SpeederAngle = std::asin(-1.0f); - - if(SpeederAngle < 0) - SpeederAngle = 4.0f * std::asin(1.0f) + SpeederAngle; - - if(TempVel.x > 0.0000001f) - TeeAngle = -std::atan(TempVel.y / TempVel.x); - else if(TempVel.x < 0.0000001f) - TeeAngle = std::atan(TempVel.y / TempVel.x) + 2.0f * std::asin(1.0f); - else if(TempVel.y > 0.0000001f) - TeeAngle = std::asin(1.0f); - else - TeeAngle = std::asin(-1.0f); - - if(TeeAngle < 0) - TeeAngle = 4.0f * std::asin(1.0f) + TeeAngle; - - TeeSpeed = std::sqrt(std::pow(TempVel.x, 2) + std::pow(TempVel.y, 2)); - - DiffAngle = SpeederAngle - TeeAngle; - SpeedLeft = MaxSpeed / 5.0f - std::cos(DiffAngle) * TeeSpeed; - if(absolute((int)SpeedLeft) > Force && SpeedLeft > 0.0000001f) - TempVel += Direction * Force; - else if(absolute((int)SpeedLeft) > Force) - TempVel += Direction * -Force; - else - TempVel += Direction * SpeedLeft; - } - else - TempVel += Direction * Force; - m_Core.m_Vel = ClampVel(m_MoveRestrictions, TempVel); - } - } -} - -bool CCharacter::IsSwitchActiveCb(int Number, void *pUser) -{ - CCharacter *pThis = (CCharacter *)pUser; - auto &aSwitchers = pThis->Switchers(); - return !aSwitchers.empty() && pThis->Team() != TEAM_SUPER && aSwitchers[Number].m_aStatus[pThis->Team()]; -} - -void CCharacter::HandleTiles(int Index) -{ - int MapIndex = Index; - m_TileIndex = Collision()->GetTileIndex(MapIndex); - m_TileFIndex = Collision()->GetFrontTileIndex(MapIndex); - m_MoveRestrictions = Collision()->GetMoveRestrictions(IsSwitchActiveCb, this, m_Pos); - - // stopper - if(m_Core.m_Vel.y > 0 && (m_MoveRestrictions & CANTMOVE_DOWN)) - { - m_Core.m_Jumped = 0; - m_Core.m_JumpedTotal = 0; - } - m_Core.m_Vel = ClampVel(m_MoveRestrictions, m_Core.m_Vel); - - if(!GameWorld()->m_WorldConfig.m_PredictTiles) - return; - - if(Index < 0) - { - m_LastRefillJumps = false; - return; - } - - // handle switch tiles - if(Collision()->GetSwitchType(MapIndex) == TILE_SWITCHOPEN && Team() != TEAM_SUPER && Collision()->GetSwitchNumber(MapIndex) > 0) - { - Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aStatus[Team()] = true; - Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aEndTick[Team()] = 0; - Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aType[Team()] = TILE_SWITCHOPEN; - Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aLastUpdateTick[Team()] = GameWorld()->GameTick(); - } - else if(Collision()->GetSwitchType(MapIndex) == TILE_SWITCHTIMEDOPEN && Team() != TEAM_SUPER && Collision()->GetSwitchNumber(MapIndex) > 0) - { - Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aStatus[Team()] = true; - Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aEndTick[Team()] = GameWorld()->GameTick() + 1 + Collision()->GetSwitchDelay(MapIndex) * GameWorld()->GameTickSpeed(); - Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aType[Team()] = TILE_SWITCHTIMEDOPEN; - Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aLastUpdateTick[Team()] = GameWorld()->GameTick(); - } - else if(Collision()->GetSwitchType(MapIndex) == TILE_SWITCHTIMEDCLOSE && Team() != TEAM_SUPER && Collision()->GetSwitchNumber(MapIndex) > 0) - { - Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aStatus[Team()] = false; - Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aEndTick[Team()] = GameWorld()->GameTick() + 1 + Collision()->GetSwitchDelay(MapIndex) * GameWorld()->GameTickSpeed(); - Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aType[Team()] = TILE_SWITCHTIMEDCLOSE; - Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aLastUpdateTick[Team()] = GameWorld()->GameTick(); - } - else if(Collision()->GetSwitchType(MapIndex) == TILE_SWITCHCLOSE && Team() != TEAM_SUPER && Collision()->GetSwitchNumber(MapIndex) > 0) - { - Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aStatus[Team()] = false; - Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aEndTick[Team()] = 0; - Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aType[Team()] = TILE_SWITCHCLOSE; - Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aLastUpdateTick[Team()] = GameWorld()->GameTick(); - } - else if(Collision()->GetSwitchType(MapIndex) == TILE_FREEZE && Team() != TEAM_SUPER && !m_Core.m_Invincible) - { - if(Collision()->GetSwitchNumber(MapIndex) == 0 || Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aStatus[Team()]) - { - Freeze(Collision()->GetSwitchDelay(MapIndex)); - } - } - else if(Collision()->GetSwitchType(MapIndex) == TILE_DFREEZE && Team() != TEAM_SUPER && !m_Core.m_Invincible) - { - if(Collision()->GetSwitchNumber(MapIndex) == 0 || Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aStatus[Team()]) - m_Core.m_DeepFrozen = true; - } - else if(Collision()->GetSwitchType(MapIndex) == TILE_DUNFREEZE && Team() != TEAM_SUPER && !m_Core.m_Invincible) - { - if(Collision()->GetSwitchNumber(MapIndex) == 0 || Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aStatus[Team()]) - m_Core.m_DeepFrozen = false; - } - else if(Collision()->GetSwitchType(MapIndex) == TILE_HIT_ENABLE && m_Core.m_HammerHitDisabled && Collision()->GetSwitchDelay(MapIndex) == WEAPON_HAMMER) - { - m_Core.m_HammerHitDisabled = false; - } - else if(Collision()->GetSwitchType(MapIndex) == TILE_HIT_DISABLE && !m_Core.m_HammerHitDisabled && Collision()->GetSwitchDelay(MapIndex) == WEAPON_HAMMER) - { - m_Core.m_HammerHitDisabled = true; - } - else if(Collision()->GetSwitchType(MapIndex) == TILE_HIT_ENABLE && m_Core.m_ShotgunHitDisabled && Collision()->GetSwitchDelay(MapIndex) == WEAPON_SHOTGUN) - { - m_Core.m_ShotgunHitDisabled = false; - } - else if(Collision()->GetSwitchType(MapIndex) == TILE_HIT_DISABLE && !m_Core.m_ShotgunHitDisabled && Collision()->GetSwitchDelay(MapIndex) == WEAPON_SHOTGUN) - { - m_Core.m_ShotgunHitDisabled = true; - } - else if(Collision()->GetSwitchType(MapIndex) == TILE_HIT_ENABLE && m_Core.m_GrenadeHitDisabled && Collision()->GetSwitchDelay(MapIndex) == WEAPON_GRENADE) - { - m_Core.m_GrenadeHitDisabled = false; - } - else if(Collision()->GetSwitchType(MapIndex) == TILE_HIT_DISABLE && !m_Core.m_GrenadeHitDisabled && Collision()->GetSwitchDelay(MapIndex) == WEAPON_GRENADE) - { - m_Core.m_GrenadeHitDisabled = true; - } - else if(Collision()->GetSwitchType(MapIndex) == TILE_HIT_ENABLE && m_Core.m_LaserHitDisabled && Collision()->GetSwitchDelay(MapIndex) == WEAPON_LASER) - { - m_Core.m_LaserHitDisabled = false; - } - else if(Collision()->GetSwitchType(MapIndex) == TILE_HIT_DISABLE && !m_Core.m_LaserHitDisabled && Collision()->GetSwitchDelay(MapIndex) == WEAPON_LASER) - { - m_Core.m_LaserHitDisabled = true; - } - else if(Collision()->GetSwitchType(MapIndex) == TILE_JUMP) - { - int NewJumps = Collision()->GetSwitchDelay(MapIndex); - if(NewJumps == 255) - { - NewJumps = -1; - } - - if(NewJumps != m_Core.m_Jumps) - m_Core.m_Jumps = NewJumps; - } - else if(Collision()->GetSwitchType(MapIndex) == TILE_LFREEZE && Team() != TEAM_SUPER && !m_Core.m_Invincible) - { - if(Collision()->GetSwitchNumber(MapIndex) == 0 || Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aStatus[Team()]) - { - m_Core.m_LiveFrozen = true; - } - } - else if(Collision()->GetSwitchType(MapIndex) == TILE_LUNFREEZE && Team() != TEAM_SUPER && !m_Core.m_Invincible) - { - if(Collision()->GetSwitchNumber(MapIndex) == 0 || Switchers()[Collision()->GetSwitchNumber(MapIndex)].m_aStatus[Team()]) - { - m_Core.m_LiveFrozen = false; - } - } - - // freeze - if(((m_TileIndex == TILE_FREEZE) || (m_TileFIndex == TILE_FREEZE)) && !m_Core.m_Super && !m_Core.m_Invincible && !m_Core.m_DeepFrozen) - { - Freeze(); - } - else if(((m_TileIndex == TILE_UNFREEZE) || (m_TileFIndex == TILE_UNFREEZE)) && !m_Core.m_DeepFrozen) - { - UnFreeze(); - } - - // deep freeze - if(((m_TileIndex == TILE_DFREEZE) || (m_TileFIndex == TILE_DFREEZE)) && !m_Core.m_Super && !m_Core.m_Invincible && !m_Core.m_DeepFrozen) - { - m_Core.m_DeepFrozen = true; - } - else if(((m_TileIndex == TILE_DUNFREEZE) || (m_TileFIndex == TILE_DUNFREEZE)) && !m_Core.m_Super && !m_Core.m_Invincible && m_Core.m_DeepFrozen) - { - m_Core.m_DeepFrozen = false; - } - - // live freeze - if(((m_TileIndex == TILE_LFREEZE) || (m_TileFIndex == TILE_LFREEZE)) && !m_Core.m_Super && !m_Core.m_Invincible) - { - m_Core.m_LiveFrozen = true; - } - else if(((m_TileIndex == TILE_LUNFREEZE) || (m_TileFIndex == TILE_LUNFREEZE)) && !m_Core.m_Super && !m_Core.m_Invincible) - { - m_Core.m_LiveFrozen = false; - } - - // endless hook - if(((m_TileIndex == TILE_EHOOK_ENABLE) || (m_TileFIndex == TILE_EHOOK_ENABLE)) && !m_Core.m_EndlessHook) - { - m_Core.m_EndlessHook = true; - } - else if(((m_TileIndex == TILE_EHOOK_DISABLE) || (m_TileFIndex == TILE_EHOOK_DISABLE)) && m_Core.m_EndlessHook) - { - m_Core.m_EndlessHook = false; - } - - // collide with others - if(((m_TileIndex == TILE_NPC_DISABLE) || (m_TileFIndex == TILE_NPC_DISABLE)) && !m_Core.m_CollisionDisabled) - { - m_Core.m_CollisionDisabled = true; - } - else if(((m_TileIndex == TILE_NPC_ENABLE) || (m_TileFIndex == TILE_NPC_ENABLE)) && m_Core.m_CollisionDisabled) - { - m_Core.m_CollisionDisabled = false; - } - - // hook others - if(((m_TileIndex == TILE_NPH_DISABLE) || (m_TileFIndex == TILE_NPH_DISABLE)) && !m_Core.m_HookHitDisabled) - { - m_Core.m_HookHitDisabled = true; - } - else if(((m_TileIndex == TILE_NPH_ENABLE) || (m_TileFIndex == TILE_NPH_ENABLE)) && m_Core.m_HookHitDisabled) - { - m_Core.m_HookHitDisabled = false; - } - - // unlimited air jumps - if(((m_TileIndex == TILE_UNLIMITED_JUMPS_ENABLE) || (m_TileFIndex == TILE_UNLIMITED_JUMPS_ENABLE)) && !m_Core.m_EndlessJump) - { - m_Core.m_EndlessJump = true; - } - else if(((m_TileIndex == TILE_UNLIMITED_JUMPS_DISABLE) || (m_TileFIndex == TILE_UNLIMITED_JUMPS_DISABLE)) && m_Core.m_EndlessJump) - { - m_Core.m_EndlessJump = false; - } - - // walljump - if((m_TileIndex == TILE_WALLJUMP) || (m_TileFIndex == TILE_WALLJUMP)) - { - if(m_Core.m_Vel.y > 0 && m_Core.m_Colliding && m_Core.m_LeftWall) - { - m_Core.m_LeftWall = false; - m_Core.m_JumpedTotal = m_Core.m_Jumps >= 2 ? m_Core.m_Jumps - 2 : 0; - m_Core.m_Jumped = 1; - } - } - - // jetpack gun - if(((m_TileIndex == TILE_JETPACK_ENABLE) || (m_TileFIndex == TILE_JETPACK_ENABLE)) && !m_Core.m_Jetpack) - { - m_Core.m_Jetpack = true; - } - else if(((m_TileIndex == TILE_JETPACK_DISABLE) || (m_TileFIndex == TILE_JETPACK_DISABLE)) && m_Core.m_Jetpack) - { - m_Core.m_Jetpack = false; - } - - // solo part - if(((m_TileIndex == TILE_SOLO_ENABLE) || (m_TileFIndex == TILE_SOLO_ENABLE)) && !TeamsCore()->GetSolo(GetCid())) - { - SetSolo(true); - } - else if(((m_TileIndex == TILE_SOLO_DISABLE) || (m_TileFIndex == TILE_SOLO_DISABLE)) && TeamsCore()->GetSolo(GetCid())) - { - SetSolo(false); - } - - // refill jumps - if(((m_TileIndex == TILE_REFILL_JUMPS) || (m_TileFIndex == TILE_REFILL_JUMPS)) && !m_LastRefillJumps) - { - m_Core.m_JumpedTotal = 0; - m_Core.m_Jumped = 0; - m_LastRefillJumps = true; - } - if((m_TileIndex != TILE_REFILL_JUMPS) && (m_TileFIndex != TILE_REFILL_JUMPS)) - { - m_LastRefillJumps = false; - } -} - -void CCharacter::HandleTuneLayer() -{ - int CurrentIndex = Collision()->GetMapIndex(m_Pos); - SetTuneZone(GameWorld()->m_WorldConfig.m_UseTuneZones ? Collision()->IsTune(CurrentIndex) : 0); - - if(m_IsLocal) - GameWorld()->m_Core.m_aTuning[g_Config.m_ClDummy] = *GetTuning(m_TuneZone); // throw tunings (from specific zone if in a tunezone) into gamecore if the character is local - m_Core.m_Tuning = *GetTuning(m_TuneZone); -} - -void CCharacter::DDRaceTick() -{ - mem_copy(&m_Input, &m_SavedInput, sizeof(m_Input)); - if(m_Core.m_LiveFrozen && !m_CanMoveInFreeze && !m_Core.m_Super && !m_Core.m_Invincible) - { - m_Input.m_Direction = 0; - m_Input.m_Jump = 0; - //Hook and weapons are possible in live freeze - } - if(m_FreezeTime > 0) - { - m_FreezeTime--; - if(!m_CanMoveInFreeze) - { - m_Input.m_Direction = 0; - m_Input.m_Jump = 0; - m_Input.m_Hook = 0; - } - if(m_FreezeTime == 1) - UnFreeze(); - } - - HandleTuneLayer(); - - // check if the tee is in any type of freeze - int Index = Collision()->GetPureMapIndex(m_Pos); - const int aTiles[] = { - Collision()->GetTileIndex(Index), - Collision()->GetFrontTileIndex(Index), - Collision()->GetSwitchType(Index)}; - m_Core.m_IsInFreeze = false; - for(const int Tile : aTiles) - { - if(Tile == TILE_FREEZE || Tile == TILE_DFREEZE || Tile == TILE_LFREEZE || Tile == TILE_DEATH) - { - m_Core.m_IsInFreeze = true; - break; - } - } - m_Core.m_IsInFreeze |= (Collision()->GetCollisionAt(m_Pos.x + GetProximityRadius() / 3.f, m_Pos.y - GetProximityRadius() / 3.f) == TILE_DEATH || - Collision()->GetCollisionAt(m_Pos.x + GetProximityRadius() / 3.f, m_Pos.y + GetProximityRadius() / 3.f) == TILE_DEATH || - Collision()->GetCollisionAt(m_Pos.x - GetProximityRadius() / 3.f, m_Pos.y - GetProximityRadius() / 3.f) == TILE_DEATH || - Collision()->GetCollisionAt(m_Pos.x - GetProximityRadius() / 3.f, m_Pos.y + GetProximityRadius() / 3.f) == TILE_DEATH || - Collision()->GetFrontCollisionAt(m_Pos.x + GetProximityRadius() / 3.f, m_Pos.y - GetProximityRadius() / 3.f) == TILE_DEATH || - Collision()->GetFrontCollisionAt(m_Pos.x + GetProximityRadius() / 3.f, m_Pos.y + GetProximityRadius() / 3.f) == TILE_DEATH || - Collision()->GetFrontCollisionAt(m_Pos.x - GetProximityRadius() / 3.f, m_Pos.y - GetProximityRadius() / 3.f) == TILE_DEATH || - Collision()->GetFrontCollisionAt(m_Pos.x - GetProximityRadius() / 3.f, m_Pos.y + GetProximityRadius() / 3.f) == TILE_DEATH); -} - -void CCharacter::DDRacePostCoreTick() -{ - if(!GameWorld()->m_WorldConfig.m_PredictDDRace) - return; - - if(m_Core.m_EndlessHook) - m_Core.m_HookTick = 0; - - m_FrozenLastTick = false; - - if(m_Core.m_DeepFrozen && !m_Core.m_Super && !m_Core.m_Invincible) - Freeze(); - - // following jump rules can be overridden by tiles, like Refill Jumps, Stopper and Wall Jump - if(m_Core.m_Jumps == -1) - { - // The player has only one ground jump, so his feet are always dark - m_Core.m_Jumped |= 2; - } - else if(m_Core.m_Jumps == 0) - { - // The player has no jumps at all, so his feet are always dark - m_Core.m_Jumped |= 2; - } - else if(m_Core.m_Jumps == 1 && m_Core.m_Jumped > 0) - { - // If the player has only one jump, each jump is the last one - m_Core.m_Jumped |= 2; - } - else if(m_Core.m_JumpedTotal < m_Core.m_Jumps - 1 && m_Core.m_Jumped > 1) - { - // The player has not yet used up all his jumps, so his feet remain light - m_Core.m_Jumped = 1; - } - - if((m_Core.m_Super || m_Core.m_Invincible || m_Core.m_EndlessJump) && m_Core.m_Jumped > 1) - { - // Super players, invincible players and players with infinite jumps always have light feet - m_Core.m_Jumped = 1; - } - - int CurrentIndex = Collision()->GetMapIndex(m_Pos); - HandleSkippableTiles(CurrentIndex); - - // handle Anti-Skip tiles - std::vector vIndices = Collision()->GetMapIndices(m_PrevPos, m_Pos); - if(!vIndices.empty()) - for(int Index : vIndices) - HandleTiles(Index); - else - { - HandleTiles(CurrentIndex); - } -} - -bool CCharacter::Freeze(int Seconds) -{ - if(!GameWorld()->m_WorldConfig.m_PredictFreeze) - return false; - if(Seconds <= 0 || m_Core.m_Super || m_Core.m_Invincible || m_FreezeTime > Seconds * GameWorld()->GameTickSpeed()) - return false; - if(m_Core.m_FreezeStart < GameWorld()->GameTick() - GameWorld()->GameTickSpeed()) - { - m_FreezeTime = Seconds * GameWorld()->GameTickSpeed(); - m_Core.m_FreezeStart = GameWorld()->GameTick(); - return true; - } - return false; -} - -bool CCharacter::Freeze() -{ - return Freeze(g_Config.m_SvFreezeDelay); -} - -bool CCharacter::UnFreeze() -{ - if(m_FreezeTime > 0) - { - if(!m_Core.m_aWeapons[m_Core.m_ActiveWeapon].m_Got) - m_Core.m_ActiveWeapon = WEAPON_GUN; - m_FreezeTime = 0; - m_Core.m_FreezeStart = 0; - m_FrozenLastTick = true; - return true; - } - return false; -} - -void CCharacter::GiveWeapon(int Weapon, bool Remove) -{ - if(Weapon == WEAPON_NINJA) - { - if(Remove) - RemoveNinja(); - else - GiveNinja(); - return; - } - - if(Remove) - { - if(GetActiveWeapon() == Weapon) - SetActiveWeapon(WEAPON_GUN); - } - else - { - m_Core.m_aWeapons[Weapon].m_Ammo = -1; - } - - m_Core.m_aWeapons[Weapon].m_Got = !Remove; -} - -void CCharacter::GiveAllWeapons() -{ - for(int i = WEAPON_GUN; i < NUM_WEAPONS - 1; i++) - { - GiveWeapon(i); - } -} - -void CCharacter::ResetVelocity() -{ - m_Core.m_Vel = vec2(0, 0); -} - -// The method is needed only to reproduce 'shotgun bug' ddnet#5258 -// Use SetVelocity() instead. -void CCharacter::SetVelocity(const vec2 NewVelocity) -{ - m_Core.m_Vel = ClampVel(m_MoveRestrictions, NewVelocity); -} - -void CCharacter::SetRawVelocity(const vec2 NewVelocity) -{ - m_Core.m_Vel = NewVelocity; -} - -void CCharacter::AddVelocity(const vec2 Addition) -{ - SetVelocity(m_Core.m_Vel + Addition); -} - -void CCharacter::ApplyMoveRestrictions() -{ - m_Core.m_Vel = ClampVel(m_MoveRestrictions, m_Core.m_Vel); -} - -CTeamsCore *CCharacter::TeamsCore() -{ - return GameWorld()->Teams(); -} - -CCharacter::CCharacter(CGameWorld *pGameWorld, int Id, CNetObj_Character *pChar, CNetObj_DDNetCharacter *pExtended) : - CEntity(pGameWorld, CGameWorld::ENTTYPE_CHARACTER, vec2(0, 0), CCharacterCore::PhysicalSize()) -{ - m_Id = Id; - m_IsLocal = false; - - m_LastWeapon = WEAPON_HAMMER; - m_QueuedWeapon = -1; - m_LastRefillJumps = false; - m_PrevPrevPos = m_PrevPos = m_Pos = vec2(pChar->m_X, pChar->m_Y); - m_Core.Reset(); - m_Core.Init(&GameWorld()->m_Core, GameWorld()->Collision(), GameWorld()->Teams()); - m_Core.m_Id = Id; - mem_zero(&m_Core.m_Ninja, sizeof(m_Core.m_Ninja)); - m_Core.m_LeftWall = true; - m_ReloadTimer = 0; - m_NumObjectsHit = 0; - m_LastRefillJumps = false; - m_LastJetpackStrength = 400.0f; - m_CanMoveInFreeze = false; - m_TeleCheckpoint = 0; - m_StrongWeakId = 0; - - mem_zero(&m_Input, sizeof(m_Input)); - // never initialize both to zero - m_Input.m_TargetX = 0; - m_Input.m_TargetY = -1; - - m_LatestPrevInput = m_LatestInput = m_PrevInput = m_SavedInput = m_Input; - - ResetPrediction(); - Read(pChar, pExtended, false); -} - -void CCharacter::ResetPrediction() -{ - SetSolo(false); - SetSuper(false); - m_Core.m_EndlessHook = false; - m_Core.m_HammerHitDisabled = false; - m_Core.m_ShotgunHitDisabled = false; - m_Core.m_GrenadeHitDisabled = false; - m_Core.m_LaserHitDisabled = false; - m_Core.m_EndlessJump = false; - m_Core.m_Jetpack = false; - m_NinjaJetpack = false; - m_Core.m_Jumps = 2; - m_Core.m_HookHitDisabled = false; - m_Core.m_CollisionDisabled = false; - m_NumInputs = 0; - m_FreezeTime = 0; - m_Core.m_FreezeStart = 0; - m_Core.m_IsInFreeze = false; - m_Core.m_DeepFrozen = false; - m_Core.m_LiveFrozen = false; - m_FrozenLastTick = false; - for(int w = 0; w < NUM_WEAPONS; w++) - { - SetWeaponGot(w, false); - SetWeaponAmmo(w, -1); - } - if(m_Core.HookedPlayer() >= 0) - { - m_Core.SetHookedPlayer(-1); - m_Core.m_HookState = HOOK_IDLE; - } - m_LastWeaponSwitchTick = 0; - m_LastTuneZoneTick = 0; -} - -void CCharacter::Read(CNetObj_Character *pChar, CNetObj_DDNetCharacter *pExtended, bool IsLocal) -{ - m_Core.Read((const CNetObj_CharacterCore *)pChar); - m_IsLocal = IsLocal; - - if(pExtended) - { - SetSolo(pExtended->m_Flags & CHARACTERFLAG_SOLO); - SetSuper(pExtended->m_Flags & CHARACTERFLAG_SUPER); - - m_TeleCheckpoint = pExtended->m_TeleCheckpoint; - m_StrongWeakId = pExtended->m_StrongWeakId; - - const bool Ninja = (pExtended->m_Flags & CHARACTERFLAG_WEAPON_NINJA) != 0; - if(Ninja && m_Core.m_ActiveWeapon != WEAPON_NINJA) - GiveNinja(); - else if(!Ninja && m_Core.m_ActiveWeapon == WEAPON_NINJA) - RemoveNinja(); - - if(GameWorld()->m_WorldConfig.m_PredictFreeze && pExtended->m_FreezeEnd != 0) - { - if(pExtended->m_FreezeEnd > 0) - { - if(m_FreezeTime == 0) - Freeze(); - m_FreezeTime = maximum(1, pExtended->m_FreezeEnd - GameWorld()->GameTick()); - } - else if(pExtended->m_FreezeEnd == -1) - m_Core.m_DeepFrozen = true; - } - else - UnFreeze(); - - m_Core.ReadDDNet(pExtended); - - if(!GameWorld()->m_WorldConfig.m_PredictFreeze) - { - UnFreeze(); - } - } - else - { - // ddnetcharacter is not available, try to get some info from the tunings and the character netobject instead. - - // remove weapons that are unavailable. if the current weapon is ninja just set ammo to zero in case the player is frozen - if(pChar->m_Weapon != m_Core.m_ActiveWeapon) - { - if(pChar->m_Weapon == WEAPON_NINJA) - m_Core.m_aWeapons[m_Core.m_ActiveWeapon].m_Ammo = 0; - else - { - if(m_Core.m_ActiveWeapon == WEAPON_NINJA) - { - SetNinjaActivationDir(vec2(0, 0)); - SetNinjaActivationTick(-500); - SetNinjaCurrentMoveTime(0); - } - if(pChar->m_Weapon == m_LastSnapWeapon) - m_Core.m_aWeapons[m_Core.m_ActiveWeapon].m_Got = false; - } - } - // add weapon - if(pChar->m_Weapon != WEAPON_NINJA) - m_Core.m_aWeapons[pChar->m_Weapon].m_Got = true; - - // jetpack - if(GameWorld()->m_WorldConfig.m_PredictWeapons && Tuning()->m_JetpackStrength > 0) - { - m_LastJetpackStrength = Tuning()->m_JetpackStrength; - m_Core.m_Jetpack = true; - m_Core.m_aWeapons[WEAPON_GUN].m_Got = true; - m_Core.m_aWeapons[WEAPON_GUN].m_Ammo = -1; - m_NinjaJetpack = pChar->m_Weapon == WEAPON_NINJA; - } - else if(pChar->m_Weapon != WEAPON_NINJA) - { - m_Core.m_Jetpack = false; - } - - // number of jumps - if(GameWorld()->m_WorldConfig.m_PredictTiles) - { - if(pChar->m_Jumped & 2) - { - m_Core.m_EndlessJump = false; - if(m_Core.m_Jumps > m_Core.m_JumpedTotal && m_Core.m_JumpedTotal > 0 && m_Core.m_Jumps > 2) - m_Core.m_Jumps = m_Core.m_JumpedTotal + 1; - } - else if(m_Core.m_Jumps < 2) - m_Core.m_Jumps = m_Core.m_JumpedTotal + 2; - if(Tuning()->m_AirJumpImpulse == 0) - { - m_Core.m_Jumps = 0; - m_Core.m_Jumped = 3; - } - } - - // set player collision - SetSolo(!Tuning()->m_PlayerCollision && !Tuning()->m_PlayerHooking); - m_Core.m_CollisionDisabled = !Tuning()->m_PlayerCollision; - m_Core.m_HookHitDisabled = !Tuning()->m_PlayerHooking; - - if(m_Core.m_HookTick != 0) - m_Core.m_EndlessHook = false; - - // detect unfreeze (in case the player was frozen in the tile prediction and not correctly unfrozen) - if(pChar->m_Emote != EMOTE_PAIN && pChar->m_Emote != EMOTE_NORMAL) - m_Core.m_DeepFrozen = false; - if(pChar->m_Weapon != WEAPON_NINJA || pChar->m_AttackTick > m_Core.m_FreezeStart || absolute(pChar->m_VelX) == 256 * 10 || !GameWorld()->m_WorldConfig.m_PredictFreeze) - { - m_Core.m_DeepFrozen = false; - UnFreeze(); - } - } - - vec2 PosBefore = m_Pos; - m_Pos = m_Core.m_Pos; - - if(distance(PosBefore, m_Pos) > 2.f) // misprediction, don't use prevpos - m_PrevPos = m_Pos; - - if(distance(m_PrevPos, m_Pos) > 10.f * 32.f) // reset prevpos if the distance is high - m_PrevPos = m_Pos; - - if(pChar->m_Jumped & 2) - m_Core.m_JumpedTotal = m_Core.m_Jumps; - m_AttackTick = pChar->m_AttackTick; - m_LastSnapWeapon = pChar->m_Weapon; - - SetTuneZone(GameWorld()->m_WorldConfig.m_UseTuneZones ? Collision()->IsTune(Collision()->GetMapIndex(m_Pos)) : 0); - - // set the current weapon - if(pChar->m_Weapon != WEAPON_NINJA) - { - m_Core.m_aWeapons[pChar->m_Weapon].m_Ammo = (GameWorld()->m_WorldConfig.m_InfiniteAmmo || GameWorld()->m_WorldConfig.m_IsDDRace || pChar->m_Weapon == WEAPON_HAMMER) ? -1 : pChar->m_AmmoCount; - if(pChar->m_Weapon != m_Core.m_ActiveWeapon) - SetActiveWeapon(pChar->m_Weapon); - } - - // reset all input except direction and hook for non-local players (as in vanilla prediction) - if(!IsLocal) - { - mem_zero(&m_Input, sizeof(m_Input)); - mem_zero(&m_SavedInput, sizeof(m_SavedInput)); - m_Input.m_Direction = m_SavedInput.m_Direction = m_Core.m_Direction; - m_Input.m_Hook = m_SavedInput.m_Hook = (m_Core.m_HookState != HOOK_IDLE); - - if(pExtended && pExtended->m_TargetX != 0 && pExtended->m_TargetY != 0) - { - m_Input.m_TargetX = m_SavedInput.m_TargetX = pExtended->m_TargetX; - m_Input.m_TargetY = m_SavedInput.m_TargetY = pExtended->m_TargetY; - } - else - { - m_Input.m_TargetX = m_SavedInput.m_TargetX = std::cos(pChar->m_Angle / 256.0f) * 256.0f; - m_Input.m_TargetY = m_SavedInput.m_TargetY = std::sin(pChar->m_Angle / 256.0f) * 256.0f; - } - } - - // in most cases the reload timer can be determined from the last attack tick - // (this is only needed for autofire weapons to prevent the predicted reload timer from desyncing) - if(IsLocal && m_Core.m_ActiveWeapon != WEAPON_HAMMER && !m_Core.m_aWeapons[WEAPON_NINJA].m_Got) - { - if(maximum(m_LastTuneZoneTick, m_LastWeaponSwitchTick) + GameWorld()->GameTickSpeed() < GameWorld()->GameTick()) - { - float FireDelay; - GetTuning(m_TuneZone)->Get(38 + m_Core.m_ActiveWeapon, &FireDelay); - const int FireDelayTicks = FireDelay * GameWorld()->GameTickSpeed() / 1000; - m_ReloadTimer = maximum(0, m_AttackTick + FireDelayTicks - GameWorld()->GameTick()); - } - } -} - -void CCharacter::SetCoreWorld(CGameWorld *pGameWorld) -{ - m_Core.SetCoreWorld(&pGameWorld->m_Core, pGameWorld->Collision(), pGameWorld->Teams()); -} - -bool CCharacter::Match(CCharacter *pChar) const -{ - return distance(pChar->m_Core.m_Pos, m_Core.m_Pos) <= 32.f; -} - -void CCharacter::SetActiveWeapon(int ActiveWeap) -{ - m_Core.m_ActiveWeapon = ActiveWeap; - m_LastWeaponSwitchTick = GameWorld()->GameTick(); -} - -void CCharacter::SetTuneZone(int Zone) -{ - if(Zone == m_TuneZone) - return; - m_TuneZone = Zone; - m_LastTuneZoneTick = GameWorld()->GameTick(); -} - -CCharacter::~CCharacter() -{ - if(GameWorld()) - GameWorld()->RemoveCharacter(this); -} diff --git a/src/game/client/prediction/entities/character.h b/src/game/client/prediction/entities/character.h deleted file mode 100644 index cbdaed919b..0000000000 --- a/src/game/client/prediction/entities/character.h +++ /dev/null @@ -1,196 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_PREDICTION_ENTITIES_CHARACTER_H -#define GAME_CLIENT_PREDICTION_ENTITIES_CHARACTER_H - -#include - -#include - -enum -{ - WEAPON_GAME = -3, // team switching etc - WEAPON_SELF = -2, // console kill command - WEAPON_WORLD = -1, // death tiles etc -}; - -enum -{ - FAKETUNE_FREEZE = 1, - FAKETUNE_SOLO = 2, - FAKETUNE_NOJUMP = 4, - FAKETUNE_NOCOLL = 8, - FAKETUNE_NOHOOK = 16, - FAKETUNE_JETPACK = 32, - FAKETUNE_NOHAMMER = 64, - -}; - -class CCharacter : public CEntity -{ - friend class CGameWorld; - -public: - ~CCharacter(); - - void PreTick() override; - void Tick() override; - void TickDeferred() override; - - bool IsGrounded(); - - void SetWeapon(int W); - void SetSolo(bool Solo); - void SetSuper(bool Super); - void HandleWeaponSwitch(); - void DoWeaponSwitch(); - - void HandleWeapons(); - void HandleNinja(); - void HandleJetpack(); - - void OnPredictedInput(CNetObj_PlayerInput *pNewInput); - void OnDirectInput(CNetObj_PlayerInput *pNewInput); - void ReleaseHook(); - void ResetHook(); - void ResetInput(); - void FireWeapon(); - - bool TakeDamage(vec2 Force, int Dmg, int From, int Weapon); - - void GiveWeapon(int Weapon, bool Remove = false); - void GiveNinja(); - void RemoveNinja(); - - void ResetVelocity(); - void SetVelocity(vec2 NewVelocity); - void SetRawVelocity(vec2 NewVelocity); - void AddVelocity(vec2 Addition); - void ApplyMoveRestrictions(); - - bool m_IsLocal; - - CTeamsCore *TeamsCore(); - bool Freeze(int Seconds); - bool Freeze(); - bool UnFreeze(); - void GiveAllWeapons(); - int Team(); - bool CanCollide(int ClientId); - bool SameTeam(int ClientId); - bool m_NinjaJetpack; - int m_FreezeTime; - bool m_FrozenLastTick; - int m_TuneZone; - vec2 m_PrevPos; - vec2 m_PrevPrevPos; - int m_TeleCheckpoint; - - int m_TileIndex; - int m_TileFIndex; - - bool m_LastRefillJumps; - - // Setters/Getters because i don't want to modify vanilla vars access modifiers - int GetLastWeapon() { return m_LastWeapon; } - void SetLastWeapon(int LastWeap) { m_LastWeapon = LastWeap; } - int GetActiveWeapon() { return m_Core.m_ActiveWeapon; } - void SetActiveWeapon(int ActiveWeap); - CCharacterCore GetCore() { return m_Core; } - void SetCore(CCharacterCore Core) { m_Core = Core; } - const CCharacterCore *Core() const { return &m_Core; } - bool GetWeaponGot(int Type) { return m_Core.m_aWeapons[Type].m_Got; } - void SetWeaponGot(int Type, bool Value) { m_Core.m_aWeapons[Type].m_Got = Value; } - int GetWeaponAmmo(int Type) { return m_Core.m_aWeapons[Type].m_Ammo; } - void SetWeaponAmmo(int Type, int Value) { m_Core.m_aWeapons[Type].m_Ammo = Value; } - void SetNinjaActivationDir(vec2 ActivationDir) { m_Core.m_Ninja.m_ActivationDir = ActivationDir; } - void SetNinjaActivationTick(int ActivationTick) { m_Core.m_Ninja.m_ActivationTick = ActivationTick; } - void SetNinjaCurrentMoveTime(int CurrentMoveTime) { m_Core.m_Ninja.m_CurrentMoveTime = CurrentMoveTime; } - int GetCid() { return m_Id; } - void SetInput(const CNetObj_PlayerInput *pNewInput) - { - m_LatestInput = m_Input = *pNewInput; - // it is not allowed to aim in the center - if(m_Input.m_TargetX == 0 && m_Input.m_TargetY == 0) - { - m_Input.m_TargetY = m_LatestInput.m_TargetY = -1; - } - }; - int GetJumped() { return m_Core.m_Jumped; } - int GetAttackTick() { return m_AttackTick; } - int GetStrongWeakId() { return m_StrongWeakId; } - - CCharacter(CGameWorld *pGameWorld, int Id, CNetObj_Character *pChar, CNetObj_DDNetCharacter *pExtended = 0); - void Read(CNetObj_Character *pChar, CNetObj_DDNetCharacter *pExtended, bool IsLocal); - void SetCoreWorld(CGameWorld *pGameWorld); - - int m_LastSnapWeapon; - int m_LastJetpackStrength; - bool m_KeepHooked; - int m_GameTeam; - bool m_CanMoveInFreeze; - - bool Match(CCharacter *pChar) const; - void ResetPrediction(); - void SetTuneZone(int Zone); - - bool HammerHitDisabled() { return m_Core.m_HammerHitDisabled; } - bool ShotgunHitDisabled() { return m_Core.m_ShotgunHitDisabled; } - bool LaserHitDisabled() { return m_Core.m_LaserHitDisabled; } - bool GrenadeHitDisabled() { return m_Core.m_GrenadeHitDisabled; } - - bool IsSuper() { return m_Core.m_Super; } - -private: - // weapon info - int m_aHitObjects[10]; - int m_NumObjectsHit; - - int m_LastWeapon; - int m_QueuedWeapon; - - int m_ReloadTimer; - int m_AttackTick; - - int m_MoveRestrictions; - - // these are non-heldback inputs - CNetObj_PlayerInput m_LatestPrevInput; - CNetObj_PlayerInput m_LatestInput; - - // input - CNetObj_PlayerInput m_PrevInput; - CNetObj_PlayerInput m_Input; - CNetObj_PlayerInput m_SavedInput; - - int m_NumInputs; - - // the player core for the physics - CCharacterCore m_Core; - - // DDRace - - static bool IsSwitchActiveCb(int Number, void *pUser); - void HandleTiles(int Index); - void HandleSkippableTiles(int Index); - void DDRaceTick(); - void DDRacePostCoreTick(); - void HandleTuneLayer(); - - CTuningParams *CharacterTuning(); - - int m_StrongWeakId; - - int m_LastWeaponSwitchTick; - int m_LastTuneZoneTick; -}; - -enum -{ - DDRACE_NONE = 0, - DDRACE_STARTED, - DDRACE_CHEAT, // no time and won't start again unless ordered by a mod or death - DDRACE_FINISHED -}; - -#endif diff --git a/src/game/client/prediction/entities/dragger.cpp b/src/game/client/prediction/entities/dragger.cpp deleted file mode 100644 index f268d9e6b4..0000000000 --- a/src/game/client/prediction/entities/dragger.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/* (c) Shereef Marzouk. See "licence DDRace.txt" and the readme.txt in the root of the distribution for more information. */ -#include "dragger.h" -#include "character.h" - -#include - -#include -#include -#include -#include - -void CDragger::Tick() -{ - if(GameWorld()->GameTick() % (int)(GameWorld()->GameTickSpeed() * 0.15f) == 0) - { - Collision()->MoverSpeed(m_Pos.x, m_Pos.y, &m_Core); - m_Pos += m_Core; - - LookForPlayersToDrag(); - } - - DraggerBeamTick(); -} - -void CDragger::LookForPlayersToDrag() -{ - // Create a list of players who are in the range of the dragger - CEntity *apPlayersInRange[MAX_CLIENTS]; - mem_zero(apPlayersInRange, sizeof(apPlayersInRange)); - - int NumPlayersInRange = GameWorld()->FindEntities(m_Pos, - g_Config.m_SvDraggerRange - CCharacterCore::PhysicalSize(), - apPlayersInRange, MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER); - - // The closest player (within range) in a team is selected as the target - int ClosestTargetId = -1; - bool CanStillBeTeamTarget = false; - int MinDistInTeam = 0; - - for(int i = 0; i < NumPlayersInRange; i++) - { - CCharacter *pTarget = static_cast(apPlayersInRange[i]); - const int &TargetTeam = pTarget->Team(); - - // Do not create a dragger beam for super player - if(TargetTeam == TEAM_SUPER) - { - continue; - } - // If the dragger is disabled for the target's team, no dragger beam will be generated - if(m_Layer == LAYER_SWITCH && m_Number > 0 && - !Switchers()[m_Number].m_aStatus[TargetTeam]) - { - continue; - } - - // Dragger beams can be created only for reachable, alive players - int IsReachable = - m_IgnoreWalls ? - !Collision()->IntersectNoLaserNoWalls(m_Pos, pTarget->m_Pos, 0, 0) : - !Collision()->IntersectNoLaser(m_Pos, pTarget->m_Pos, 0, 0); - if(IsReachable) - { - const int &TargetClientId = pTarget->GetCid(); - int Distance = distance(pTarget->m_Pos, m_Pos); - if(MinDistInTeam == 0 || MinDistInTeam > Distance) - { - MinDistInTeam = Distance; - ClosestTargetId = TargetClientId; - } - if(TargetClientId == m_TargetId) - { - CanStillBeTeamTarget = true; - } - } - } - - // Set the closest player for each team as a target if the team does not have a target player yet - if((m_TargetId != -1 && !CanStillBeTeamTarget) || m_TargetId == -1) - { - m_TargetId = ClosestTargetId; - } -} - -void CDragger::DraggerBeamReset() -{ - m_TargetId = -1; -} - -void CDragger::DraggerBeamTick() -{ - CCharacter *pTarget = GameWorld()->GetCharacterById(m_TargetId); - if(!pTarget) - { - DraggerBeamReset(); - return; - } - - if(GameWorld()->GameTick() % (int)(GameWorld()->GameTickSpeed() * 0.15f) == 0) - { - if(m_Layer == LAYER_SWITCH && m_Number > 0 && - !Switchers()[m_Number].m_aStatus[pTarget->Team()]) - { - DraggerBeamReset(); - return; - } - } - - // When the dragger can no longer reach the target player, the dragger beam dissolves - int IsReachable = - m_IgnoreWalls ? - !Collision()->IntersectNoLaserNoWalls(m_Pos, pTarget->m_Pos, 0, 0) : - !Collision()->IntersectNoLaser(m_Pos, pTarget->m_Pos, 0, 0); - if(!IsReachable || distance(pTarget->m_Pos, m_Pos) >= g_Config.m_SvDraggerRange) - { - DraggerBeamReset(); - return; - } - // In the center of the dragger a tee does not experience speed-up - else if(distance(pTarget->m_Pos, m_Pos) > 28) - { - pTarget->AddVelocity(normalize(m_Pos - pTarget->m_Pos) * m_Strength); - } -} - -CDragger::CDragger(CGameWorld *pGameWorld, int Id, const CLaserData *pData) : - CEntity(pGameWorld, CGameWorld::ENTTYPE_DRAGGER) -{ - m_Core = vec2(0.f, 0.f); - m_Id = Id; - m_TargetId = -1; - - m_Strength = 0; - m_IgnoreWalls = false; - if(0 <= pData->m_Subtype && pData->m_Subtype < NUM_LASERDRAGGERTYPES) - { - m_IgnoreWalls = (pData->m_Subtype & 1); - m_Strength = (pData->m_Subtype >> 1) + 1; - } - m_Number = pData->m_SwitchNumber; - m_Layer = m_Number > 0 ? LAYER_SWITCH : LAYER_GAME; - - Read(pData); -} - -void CDragger::Read(const CLaserData *pData) -{ - m_Pos = pData->m_From; - m_TargetId = pData->m_Owner; -} - -bool CDragger::Match(CDragger *pDragger) -{ - return pDragger->m_Strength == m_Strength && pDragger->m_Number == m_Number && pDragger->m_IgnoreWalls == m_IgnoreWalls; -} diff --git a/src/game/client/prediction/entities/dragger.h b/src/game/client/prediction/entities/dragger.h deleted file mode 100644 index d2751fb30f..0000000000 --- a/src/game/client/prediction/entities/dragger.h +++ /dev/null @@ -1,29 +0,0 @@ -/* (c) Shereef Marzouk. See "licence DDRace.txt" and the readme.txt in the root of the distribution for more information. */ -#ifndef GAME_CLIENT_PREDICTION_ENTITIES_DRAGGER_H -#define GAME_CLIENT_PREDICTION_ENTITIES_DRAGGER_H - -#include - -class CLaserData; - -class CDragger : public CEntity -{ - vec2 m_Core; - float m_Strength; - bool m_IgnoreWalls; - int m_TargetId; - - void LookForPlayersToDrag(); - void DraggerBeamTick(); - void DraggerBeamReset(); - -public: - CDragger(CGameWorld *pGameWorld, int Id, const CLaserData *pData); - bool Match(CDragger *pDragger); - void Read(const CLaserData *pData); - float GetStrength() { return m_Strength; } - - void Tick() override; -}; - -#endif // GAME_CLIENT_PREDICTION_ENTITIES_DRAGGER_H diff --git a/src/game/client/prediction/entities/laser.cpp b/src/game/client/prediction/entities/laser.cpp deleted file mode 100644 index fdbd569fb5..0000000000 --- a/src/game/client/prediction/entities/laser.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include "laser.h" -#include "character.h" -#include -#include -#include -#include - -#include - -CLaser::CLaser(CGameWorld *pGameWorld, vec2 Pos, vec2 Direction, float StartEnergy, int Owner, int Type) : - CEntity(pGameWorld, CGameWorld::ENTTYPE_LASER) -{ - m_Pos = Pos; - m_Owner = Owner; - m_Energy = StartEnergy; - if(pGameWorld->m_WorldConfig.m_IsFNG && m_Energy < 10.f) - m_Energy = 800.0f; - m_Dir = Direction; - m_Bounces = 0; - m_EvalTick = 0; - m_Type = Type; - m_ZeroEnergyBounceInLastTick = false; - m_TuneZone = GameWorld()->m_WorldConfig.m_UseTuneZones ? Collision()->IsTune(Collision()->GetMapIndex(m_Pos)) : 0; - GameWorld()->InsertEntity(this); - DoBounce(); -} - -bool CLaser::HitCharacter(vec2 From, vec2 To) -{ - static const vec2 StackedLaserShotgunBugSpeed = vec2(-2147483648.0f, -2147483648.0f); - vec2 At; - CCharacter *pOwnerChar = GameWorld()->GetCharacterById(m_Owner); - CCharacter *pHit; - bool DontHitSelf = (g_Config.m_SvOldLaser || !GameWorld()->m_WorldConfig.m_IsDDRace) || (m_Bounces == 0); - - if(pOwnerChar ? (!pOwnerChar->LaserHitDisabled() && m_Type == WEAPON_LASER) || (!pOwnerChar->ShotgunHitDisabled() && m_Type == WEAPON_SHOTGUN) : g_Config.m_SvHit) - pHit = GameWorld()->IntersectCharacter(m_Pos, To, 0.f, At, DontHitSelf ? pOwnerChar : 0, m_Owner); - else - pHit = GameWorld()->IntersectCharacter(m_Pos, To, 0.f, At, DontHitSelf ? pOwnerChar : 0, m_Owner, pOwnerChar); - - if(!pHit || (pHit == pOwnerChar && g_Config.m_SvOldLaser) || (pHit != pOwnerChar && pOwnerChar ? (pOwnerChar->LaserHitDisabled() && m_Type == WEAPON_LASER) || (pOwnerChar->ShotgunHitDisabled() && m_Type == WEAPON_SHOTGUN) : !g_Config.m_SvHit)) - return false; - m_From = From; - m_Pos = At; - m_Energy = -1; - if(m_Type == WEAPON_SHOTGUN) - { - float Strength; - if(!m_TuneZone) - Strength = Tuning()->m_ShotgunStrength; - else - Strength = TuningList()[m_TuneZone].m_ShotgunStrength; - - const vec2 &HitPos = pHit->Core()->m_Pos; - if(!g_Config.m_SvOldLaser) - { - if(m_PrevPos != HitPos) - { - pHit->AddVelocity(normalize(m_PrevPos - HitPos) * Strength); - } - else - { - pHit->SetRawVelocity(StackedLaserShotgunBugSpeed); - } - } - else if(g_Config.m_SvOldLaser && pOwnerChar) - { - if(pOwnerChar->Core()->m_Pos != HitPos) - { - pHit->AddVelocity(normalize(pOwnerChar->Core()->m_Pos - HitPos) * Strength); - } - else - { - pHit->SetRawVelocity(StackedLaserShotgunBugSpeed); - } - } - else - { - // Re-apply move restrictions as a part of 'shotgun bug' reproduction - pHit->ApplyMoveRestrictions(); - } - } - else if(m_Type == WEAPON_LASER) - { - pHit->UnFreeze(); - } - return true; -} - -void CLaser::DoBounce() -{ - m_EvalTick = GameWorld()->GameTick(); - - if(m_Energy < 0) - { - m_MarkedForDestroy = true; - return; - } - m_PrevPos = m_Pos; - vec2 Coltile; - - int Res; - vec2 To = m_Pos + m_Dir * m_Energy; - - Res = Collision()->IntersectLineTeleWeapon(m_Pos, To, &Coltile, &To); - - if(Res) - { - if(!HitCharacter(m_Pos, To)) - { - // intersected - m_From = m_Pos; - m_Pos = To; - - vec2 TempPos = m_Pos; - vec2 TempDir = m_Dir * 4.0f; - - int f = 0; - if(Res == -1) - { - f = Collision()->GetTile(round_to_int(Coltile.x), round_to_int(Coltile.y)); - Collision()->SetCollisionAt(round_to_int(Coltile.x), round_to_int(Coltile.y), TILE_SOLID); - } - Collision()->MovePoint(&TempPos, &TempDir, 1.0f, 0); - if(Res == -1) - { - Collision()->SetCollisionAt(round_to_int(Coltile.x), round_to_int(Coltile.y), f); - } - m_Pos = TempPos; - m_Dir = normalize(TempDir); - - const float Distance = distance(m_From, m_Pos); - // Prevent infinite bounces - if(Distance == 0.0f && m_ZeroEnergyBounceInLastTick) - { - m_Energy = -1; - } - else - { - m_Energy -= Distance + GetTuning(m_TuneZone)->m_LaserBounceCost; - } - m_ZeroEnergyBounceInLastTick = Distance == 0.0f; - - m_Bounces++; - - int BounceNum = GetTuning(m_TuneZone)->m_LaserBounceNum; - - if(m_Bounces > BounceNum) - m_Energy = -1; - } - } - else - { - if(!HitCharacter(m_Pos, To)) - { - m_From = m_Pos; - m_Pos = To; - m_Energy = -1; - } - } -} - -void CLaser::Tick() -{ - float Delay = GetTuning(m_TuneZone)->m_LaserBounceDelay; - - if(GameWorld()->m_WorldConfig.m_IsVanilla) // predict old physics on vanilla 0.6 servers - { - if(GameWorld()->GameTick() > m_EvalTick + (GameWorld()->GameTickSpeed() * Delay / 1000.0f)) - DoBounce(); - } - else - { - if((GameWorld()->GameTick() - m_EvalTick) > (GameWorld()->GameTickSpeed() * Delay / 1000.0f)) - DoBounce(); - } -} - -CLaser::CLaser(CGameWorld *pGameWorld, int Id, CLaserData *pLaser) : - CEntity(pGameWorld, CGameWorld::ENTTYPE_LASER) -{ - m_Pos = pLaser->m_To; - m_From = pLaser->m_From; - m_EvalTick = pLaser->m_StartTick; - m_TuneZone = GameWorld()->m_WorldConfig.m_UseTuneZones ? Collision()->IsTune(Collision()->GetMapIndex(m_Pos)) : 0; - m_Owner = -2; - m_Energy = GetTuning(m_TuneZone)->m_LaserReach; - if(pGameWorld->m_WorldConfig.m_IsFNG && m_Energy < 10.f) - m_Energy = 800.0f; - - m_Dir = m_Pos - m_From; - if(length(m_Pos - m_From) > 0.001f) - m_Dir = normalize(m_Dir); - else - m_Energy = 0; - m_Type = pLaser->m_Type == LASERTYPE_SHOTGUN ? WEAPON_SHOTGUN : WEAPON_LASER; - m_PrevPos = m_From; - m_Id = Id; -} - -bool CLaser::Match(CLaser *pLaser) -{ - if(pLaser->m_EvalTick != m_EvalTick) - return false; - if(distance(pLaser->m_From, m_From) > 2.f) - return false; - const vec2 ThisDiff = m_Pos - m_From; - const vec2 OtherDiff = pLaser->m_Pos - pLaser->m_From; - const float DirError = distance(normalize(OtherDiff) * length(ThisDiff), ThisDiff); - return DirError <= 2.f; -} - -CLaserData CLaser::GetData() const -{ - CLaserData Result; - Result.m_From.x = m_From.x; - Result.m_From.y = m_From.y; - Result.m_To.x = m_Pos.x; - Result.m_To.y = m_Pos.y; - Result.m_StartTick = m_EvalTick; - Result.m_ExtraInfo = true; - Result.m_Owner = m_Owner; - Result.m_Type = m_Type == WEAPON_SHOTGUN ? LASERTYPE_SHOTGUN : LASERTYPE_RIFLE; - Result.m_Subtype = -1; - Result.m_TuneZone = m_TuneZone; - Result.m_SwitchNumber = m_Number; - return Result; -} diff --git a/src/game/client/prediction/entities/laser.h b/src/game/client/prediction/entities/laser.h deleted file mode 100644 index d8d2f2101d..0000000000 --- a/src/game/client/prediction/entities/laser.h +++ /dev/null @@ -1,46 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_PREDICTION_ENTITIES_LASER_H -#define GAME_CLIENT_PREDICTION_ENTITIES_LASER_H - -#include - -class CLaserData; - -class CLaser : public CEntity -{ - friend class CGameWorld; - -public: - CLaser(CGameWorld *pGameWorld, vec2 Pos, vec2 Direction, float StartEnergy, int Owner, int Type); - - void Tick() override; - - const vec2 &GetFrom() { return m_From; } - const int &GetOwner() { return m_Owner; } - const int &GetEvalTick() { return m_EvalTick; } - CLaser(CGameWorld *pGameWorld, int Id, CLaserData *pLaser); - bool Match(CLaser *pLaser); - CLaserData GetData() const; - -protected: - bool HitCharacter(vec2 From, vec2 To); - void DoBounce(); - -private: - vec2 m_From; - vec2 m_Dir; - float m_Energy; - int m_Bounces; - int m_EvalTick; - int m_Owner; - bool m_ZeroEnergyBounceInLastTick; - - // DDRace - - vec2 m_PrevPos; - int m_Type; - int m_TuneZone; -}; - -#endif diff --git a/src/game/client/prediction/entities/pickup.cpp b/src/game/client/prediction/entities/pickup.cpp deleted file mode 100644 index f856be6318..0000000000 --- a/src/game/client/prediction/entities/pickup.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include "pickup.h" -#include "character.h" -#include -#include -#include -#include - -static constexpr int gs_PickupPhysSize = 14; - -void CPickup::Tick() -{ - Move(); - // Check if a player intersected us - CEntity *apEnts[MAX_CLIENTS]; - int Num = GameWorld()->FindEntities(m_Pos, GetProximityRadius() + ms_CollisionExtraSize, apEnts, MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER); - for(int i = 0; i < Num; ++i) - { - auto *pChr = static_cast(apEnts[i]); - if(pChr) - { - if(GameWorld()->m_WorldConfig.m_IsVanilla && distance(m_Pos, pChr->m_Pos) >= (GetProximityRadius() + ms_CollisionExtraSize) * 2) // pickup distance is shorter on vanilla due to using ClosestEntity - continue; - if(m_Layer == LAYER_SWITCH && m_Number > 0 && m_Number < (int)Switchers().size() && !Switchers()[m_Number].m_aStatus[pChr->Team()]) - continue; - bool sound = false; - // player picked us up, is someone was hooking us, let them go - switch(m_Type) - { - case POWERUP_HEALTH: - //pChr->Freeze(); - break; - - case POWERUP_ARMOR: - if(!GameWorld()->m_WorldConfig.m_IsDDRace || !GameWorld()->m_WorldConfig.m_PredictDDRace) - continue; - if(pChr->IsSuper()) - continue; - for(int j = WEAPON_SHOTGUN; j < NUM_WEAPONS; j++) - { - if(pChr->GetWeaponGot(j)) - { - pChr->SetWeaponGot(j, false); - pChr->SetWeaponAmmo(j, 0); - sound = true; - } - } - pChr->SetNinjaActivationDir(vec2(0, 0)); - pChr->SetNinjaActivationTick(-500); - pChr->SetNinjaCurrentMoveTime(0); - if(sound) - pChr->SetLastWeapon(WEAPON_GUN); - if(pChr->GetActiveWeapon() >= WEAPON_SHOTGUN) - pChr->SetActiveWeapon(WEAPON_HAMMER); - break; - - case POWERUP_ARMOR_SHOTGUN: - if(!GameWorld()->m_WorldConfig.m_IsDDRace || !GameWorld()->m_WorldConfig.m_PredictDDRace) - continue; - if(pChr->Team() == TEAM_SUPER) - continue; - if(pChr->GetWeaponGot(WEAPON_SHOTGUN)) - { - pChr->SetWeaponGot(WEAPON_SHOTGUN, false); - pChr->SetWeaponAmmo(WEAPON_SHOTGUN, 0); - pChr->SetLastWeapon(WEAPON_GUN); - } - if(pChr->GetActiveWeapon() == WEAPON_SHOTGUN) - pChr->SetActiveWeapon(WEAPON_HAMMER); - break; - - case POWERUP_ARMOR_GRENADE: - if(!GameWorld()->m_WorldConfig.m_IsDDRace || !GameWorld()->m_WorldConfig.m_PredictDDRace) - continue; - if(pChr->Team() == TEAM_SUPER) - continue; - if(pChr->GetWeaponGot(WEAPON_GRENADE)) - { - pChr->SetWeaponGot(WEAPON_GRENADE, false); - pChr->SetWeaponAmmo(WEAPON_GRENADE, 0); - pChr->SetLastWeapon(WEAPON_GUN); - } - if(pChr->GetActiveWeapon() == WEAPON_GRENADE) - pChr->SetActiveWeapon(WEAPON_HAMMER); - break; - - case POWERUP_ARMOR_NINJA: - if(!GameWorld()->m_WorldConfig.m_IsDDRace || !GameWorld()->m_WorldConfig.m_PredictDDRace) - continue; - if(pChr->Team() == TEAM_SUPER) - continue; - pChr->SetNinjaActivationDir(vec2(0, 0)); - pChr->SetNinjaActivationTick(-500); - pChr->SetNinjaCurrentMoveTime(0); - break; - - case POWERUP_ARMOR_LASER: - if(!GameWorld()->m_WorldConfig.m_IsDDRace || !GameWorld()->m_WorldConfig.m_PredictDDRace) - continue; - if(pChr->Team() == TEAM_SUPER) - continue; - if(pChr->GetWeaponGot(WEAPON_LASER)) - { - pChr->SetWeaponGot(WEAPON_LASER, false); - pChr->SetWeaponAmmo(WEAPON_LASER, 0); - pChr->SetLastWeapon(WEAPON_GUN); - } - if(pChr->GetActiveWeapon() == WEAPON_LASER) - pChr->SetActiveWeapon(WEAPON_HAMMER); - break; - - case POWERUP_WEAPON: - if(m_Subtype >= 0 && m_Subtype < NUM_WEAPONS && (!pChr->GetWeaponGot(m_Subtype) || pChr->GetWeaponAmmo(m_Subtype) != -1)) - pChr->GiveWeapon(m_Subtype); - break; - - case POWERUP_NINJA: - { - // activate ninja on target player - pChr->GiveNinja(); - break; - } - - default: - break; - }; - } - } -} - -void CPickup::Move() -{ - if(GameWorld()->GameTick() % (int)(GameWorld()->GameTickSpeed() * 0.15f) == 0) - { - if(Collision()->MoverSpeed(m_Pos.x, m_Pos.y, &m_Core)) - { - m_IsCoreActive = true; - } - m_Pos += m_Core; - } -} - -CPickup::CPickup(CGameWorld *pGameWorld, int Id, const CPickupData *pPickup) : - CEntity(pGameWorld, CGameWorld::ENTTYPE_PICKUP, vec2(0, 0), gs_PickupPhysSize) -{ - m_Pos = pPickup->m_Pos; - m_Type = pPickup->m_Type; - m_Subtype = pPickup->m_Subtype; - m_Core = vec2(0.f, 0.f); - m_IsCoreActive = false; - m_Id = Id; - m_Number = pPickup->m_SwitchNumber; - m_Layer = m_Number > 0 ? LAYER_SWITCH : LAYER_GAME; -} - -void CPickup::FillInfo(CNetObj_Pickup *pPickup) -{ - pPickup->m_X = (int)m_Pos.x; - pPickup->m_Y = (int)m_Pos.y; - pPickup->m_Type = m_Type; - pPickup->m_Subtype = m_Subtype; -} - -bool CPickup::Match(CPickup *pPickup) -{ - if(pPickup->m_Type != m_Type || pPickup->m_Subtype != m_Subtype) - return false; - if(distance(pPickup->m_Pos, m_Pos) > 2.0f) - return false; - return true; -} diff --git a/src/game/client/prediction/entities/pickup.h b/src/game/client/prediction/entities/pickup.h deleted file mode 100644 index f73fcf689d..0000000000 --- a/src/game/client/prediction/entities/pickup.h +++ /dev/null @@ -1,36 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_PREDICTION_ENTITIES_PICKUP_H -#define GAME_CLIENT_PREDICTION_ENTITIES_PICKUP_H - -#include - -class CPickupData; - -class CPickup : public CEntity -{ -public: - static const int ms_CollisionExtraSize = 6; - - void Tick() override; - - CPickup(CGameWorld *pGameWorld, int Id, const CPickupData *pPickup); - void FillInfo(CNetObj_Pickup *pPickup); - bool Match(CPickup *pPickup); - bool InDDNetTile() { return m_IsCoreActive; } - - int Type() const { return m_Type; } - int Subtype() const { return m_Subtype; } - -private: - int m_Type; - int m_Subtype; - - // DDRace - - void Move(); - vec2 m_Core; - bool m_IsCoreActive; -}; - -#endif diff --git a/src/game/client/prediction/entities/projectile.cpp b/src/game/client/prediction/entities/projectile.cpp deleted file mode 100644 index 700da69372..0000000000 --- a/src/game/client/prediction/entities/projectile.cpp +++ /dev/null @@ -1,226 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include - -#include -#include -#include -#include - -#include "character.h" -#include "projectile.h" - -CProjectile::CProjectile( - CGameWorld *pGameWorld, - int Type, - int Owner, - vec2 Pos, - vec2 Dir, - int Span, - bool Freeze, - bool Explosive, - int SoundImpact, - int Layer, - int Number) : - CEntity(pGameWorld, CGameWorld::ENTTYPE_PROJECTILE) -{ - m_Type = Type; - m_Pos = Pos; - m_Direction = Dir; - m_LifeSpan = Span; - m_Owner = Owner; - m_SoundImpact = SoundImpact; - m_StartTick = GameWorld()->GameTick(); - m_Explosive = Explosive; - - m_Layer = Layer; - m_Number = Number; - m_Freeze = Freeze; - - m_TuneZone = GameWorld()->m_WorldConfig.m_UseTuneZones ? Collision()->IsTune(Collision()->GetMapIndex(m_Pos)) : 0; - - GameWorld()->InsertEntity(this); -} - -vec2 CProjectile::GetPos(float Time) -{ - float Curvature = 0; - float Speed = 0; - CTuningParams *pTuning = GetTuning(m_TuneZone); - - switch(m_Type) - { - case WEAPON_GRENADE: - Curvature = pTuning->m_GrenadeCurvature; - Speed = pTuning->m_GrenadeSpeed; - break; - - case WEAPON_SHOTGUN: - Curvature = pTuning->m_ShotgunCurvature; - Speed = pTuning->m_ShotgunSpeed; - break; - - case WEAPON_GUN: - Curvature = pTuning->m_GunCurvature; - Speed = pTuning->m_GunSpeed; - break; - } - - return CalcPos(m_Pos, m_Direction, Curvature, Speed, Time); -} - -void CProjectile::Tick() -{ - float Pt = (GameWorld()->GameTick() - m_StartTick - 1) / (float)GameWorld()->GameTickSpeed(); - float Ct = (GameWorld()->GameTick() - m_StartTick) / (float)GameWorld()->GameTickSpeed(); - vec2 PrevPos = GetPos(Pt); - vec2 CurPos = GetPos(Ct); - vec2 ColPos; - vec2 NewPos; - int Collide = Collision()->IntersectLine(PrevPos, CurPos, &ColPos, &NewPos); - CCharacter *pOwnerChar = GameWorld()->GetCharacterById(m_Owner); - - CCharacter *pTargetChr = GameWorld()->IntersectCharacter(PrevPos, ColPos, m_Freeze ? 1.0f : 6.0f, ColPos, pOwnerChar, m_Owner); - - if(GameWorld()->m_WorldConfig.m_IsSolo && !(m_Type == WEAPON_SHOTGUN && GameWorld()->m_WorldConfig.m_IsDDRace)) - pTargetChr = 0; - - if(m_LifeSpan > -1) - m_LifeSpan--; - - bool isWeaponCollide = false; - if( - pOwnerChar && - pTargetChr && - !pTargetChr->CanCollide(m_Owner)) - { - isWeaponCollide = true; - } - - if(((pTargetChr && (pOwnerChar ? !pOwnerChar->GrenadeHitDisabled() : g_Config.m_SvHit || m_Owner == -1 || pTargetChr == pOwnerChar)) || Collide || GameLayerClipped(CurPos)) && !isWeaponCollide) - { - if(m_Explosive && (!pTargetChr || (!m_Freeze || (m_Type == WEAPON_SHOTGUN && Collide)))) - { - GameWorld()->CreateExplosion(ColPos, m_Owner, m_Type, m_Owner == -1, (!pTargetChr ? -1 : pTargetChr->Team()), CClientMask().set()); - } - else if(m_Freeze) - { - CEntity *apEnts[MAX_CLIENTS]; - int Num = GameWorld()->FindEntities(CurPos, 1.0f, apEnts, MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER); - for(int i = 0; i < Num; ++i) - { - auto *pChr = static_cast(apEnts[i]); - if(pChr && (m_Layer != LAYER_SWITCH || (m_Layer == LAYER_SWITCH && m_Number > 0 && m_Number < (int)Switchers().size() && Switchers()[m_Number].m_aStatus[pChr->Team()]))) - pChr->Freeze(); - } - } - if(Collide && m_Bouncing != 0) - { - m_StartTick = GameWorld()->GameTick(); - m_Pos = NewPos + (-(m_Direction * 4)); - if(m_Bouncing == 1) - m_Direction.x = -m_Direction.x; - else if(m_Bouncing == 2) - m_Direction.y = -m_Direction.y; - if(absolute(m_Direction.x) < 1e-6f) - m_Direction.x = 0; - if(absolute(m_Direction.y) < 1e-6f) - m_Direction.y = 0; - m_Pos += m_Direction; - } - else if(m_Type == WEAPON_GUN) - { - m_MarkedForDestroy = true; - } - else if(!m_Freeze) - m_MarkedForDestroy = true; - } - if(m_LifeSpan == -1) - { - if(m_Explosive) - { - if(m_Owner >= 0) - pOwnerChar = GameWorld()->GetCharacterById(m_Owner); - - GameWorld()->CreateExplosion(ColPos, m_Owner, m_Type, m_Owner == -1, (!pOwnerChar ? -1 : pOwnerChar->Team()), CClientMask().set()); - } - m_MarkedForDestroy = true; - } -} - -// DDRace - -void CProjectile::SetBouncing(int Value) -{ - m_Bouncing = Value; -} - -CProjectile::CProjectile(CGameWorld *pGameWorld, int Id, const CProjectileData *pProj) : - CEntity(pGameWorld, CGameWorld::ENTTYPE_PROJECTILE) -{ - m_Pos = pProj->m_StartPos; - m_Direction = pProj->m_StartVel; - if(pProj->m_ExtraInfo) - { - m_Owner = pProj->m_Owner; - m_Explosive = pProj->m_Explosive; - m_Bouncing = pProj->m_Bouncing; - m_Freeze = pProj->m_Freeze; - } - else - { - m_Owner = -1; - m_Bouncing = 0; - m_Freeze = false; - m_Explosive = (pProj->m_Type == WEAPON_GRENADE) && (absolute(1.0f - length(m_Direction)) < 0.015f); - } - m_Type = pProj->m_Type; - m_StartTick = pProj->m_StartTick; - m_TuneZone = pProj->m_TuneZone; - - int Lifetime = 20 * GameWorld()->GameTickSpeed(); - m_SoundImpact = -1; - if(m_Type == WEAPON_GRENADE) - { - Lifetime = GetTuning(m_TuneZone)->m_GrenadeLifetime * GameWorld()->GameTickSpeed(); - m_SoundImpact = SOUND_GRENADE_EXPLODE; - } - else if(m_Type == WEAPON_GUN) - Lifetime = GetTuning(m_TuneZone)->m_GunLifetime * GameWorld()->GameTickSpeed(); - else if(m_Type == WEAPON_SHOTGUN && !GameWorld()->m_WorldConfig.m_IsDDRace) - Lifetime = GetTuning(m_TuneZone)->m_ShotgunLifetime * GameWorld()->GameTickSpeed(); - m_LifeSpan = Lifetime - (pGameWorld->GameTick() - m_StartTick); - m_Id = Id; - m_Number = pProj->m_SwitchNumber; - m_Layer = m_Number > 0 ? LAYER_SWITCH : LAYER_GAME; -} - -CProjectileData CProjectile::GetData() const -{ - CProjectileData Result; - Result.m_StartPos = m_Pos; - Result.m_StartVel = m_Direction; - Result.m_Type = m_Type; - Result.m_StartTick = m_StartTick; - Result.m_ExtraInfo = true; - Result.m_Owner = m_Owner; - Result.m_Explosive = m_Explosive; - Result.m_Bouncing = m_Bouncing; - Result.m_Freeze = m_Freeze; - Result.m_TuneZone = m_TuneZone; - Result.m_SwitchNumber = m_Number; - return Result; -} - -bool CProjectile::Match(CProjectile *pProj) -{ - if(pProj->m_Type != m_Type) - return false; - if(pProj->m_StartTick != m_StartTick) - return false; - if(distance(pProj->m_Pos, m_Pos) > 2.f) - return false; - if(distance(pProj->m_Direction, m_Direction) > 2.f) - return false; - return true; -} diff --git a/src/game/client/prediction/entities/projectile.h b/src/game/client/prediction/entities/projectile.h deleted file mode 100644 index 950a96faf2..0000000000 --- a/src/game/client/prediction/entities/projectile.h +++ /dev/null @@ -1,59 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_PREDICTION_ENTITIES_PROJECTILE_H -#define GAME_CLIENT_PREDICTION_ENTITIES_PROJECTILE_H - -#include - -class CProjectileData; - -class CProjectile : public CEntity -{ - friend class CGameWorld; - friend class CItems; - -public: - CProjectile( - CGameWorld *pGameWorld, - int Type, - int Owner, - vec2 Pos, - vec2 Dir, - int Span, - bool Freeze, - bool Explosive, - int SoundImpact, - int Layer = 0, - int Number = 0); - - vec2 GetPos(float Time); - CProjectileData GetData() const; - - void Tick() override; - - bool Match(CProjectile *pProj); - void SetBouncing(int Value); - - const vec2 &GetDirection() { return m_Direction; } - const int &GetOwner() { return m_Owner; } - const int &GetStartTick() { return m_StartTick; } - CProjectile(CGameWorld *pGameWorld, int Id, const CProjectileData *pProj); - -private: - vec2 m_Direction; - int m_LifeSpan; - int m_Owner; - int m_Type; - int m_SoundImpact; - float m_Force; - int m_StartTick; - bool m_Explosive; - - // DDRace - - int m_Bouncing; - bool m_Freeze; - int m_TuneZone; -}; - -#endif diff --git a/src/game/client/prediction/entity.cpp b/src/game/client/prediction/entity.cpp deleted file mode 100644 index 3b3b14b065..0000000000 --- a/src/game/client/prediction/entity.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include "entity.h" - -#include - -////////////////////////////////////////////////// -// Entity -////////////////////////////////////////////////// -CEntity::CEntity(CGameWorld *pGameWorld, int ObjType, vec2 Pos, int ProximityRadius) -{ - m_pGameWorld = pGameWorld; - - m_ObjType = ObjType; - m_Pos = Pos; - m_ProximityRadius = ProximityRadius; - - m_MarkedForDestroy = false; - m_Id = -1; - - m_pPrevTypeEntity = 0; - m_pNextTypeEntity = 0; - m_SnapTicks = -1; - - // DDRace - m_pParent = nullptr; - m_pChild = nullptr; - m_DestroyTick = -1; - m_LastRenderTick = -1; -} - -CEntity::~CEntity() -{ - if(GameWorld()) - GameWorld()->RemoveEntity(this); -} - -bool CEntity::GameLayerClipped(vec2 CheckPos) -{ - return round_to_int(CheckPos.x) / 32 < -200 || round_to_int(CheckPos.x) / 32 > Collision()->GetWidth() + 200 || - round_to_int(CheckPos.y) / 32 < -200 || round_to_int(CheckPos.y) / 32 > Collision()->GetHeight() + 200; -} diff --git a/src/game/client/prediction/entity.h b/src/game/client/prediction/entity.h deleted file mode 100644 index 940d724a57..0000000000 --- a/src/game/client/prediction/entity.h +++ /dev/null @@ -1,74 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_PREDICTION_ENTITY_H -#define GAME_CLIENT_PREDICTION_ENTITY_H - -#include - -#include - -#include "gameworld.h" - -class CEntity -{ - MACRO_ALLOC_HEAP() - -private: - friend CGameWorld; // entity list handling - CEntity *m_pPrevTypeEntity; - CEntity *m_pNextTypeEntity; - -protected: - CGameWorld *m_pGameWorld; - bool m_MarkedForDestroy; - int m_Id; - int m_ObjType; - -public: - int GetId() const { return m_Id; } - - CEntity(CGameWorld *pGameWorld, int Objtype, vec2 Pos = vec2(0, 0), int ProximityRadius = 0); - virtual ~CEntity(); - - std::vector &Switchers() { return m_pGameWorld->Switchers(); } - CGameWorld *GameWorld() { return m_pGameWorld; } - CTuningParams *Tuning() { return GameWorld()->Tuning(); } - CTuningParams *TuningList() { return GameWorld()->TuningList(); } - CTuningParams *GetTuning(int i) { return GameWorld()->GetTuning(i); } - class CCollision *Collision() { return GameWorld()->Collision(); } - CEntity *TypeNext() { return m_pNextTypeEntity; } - CEntity *TypePrev() { return m_pPrevTypeEntity; } - const vec2 &GetPos() const { return m_Pos; } - float GetProximityRadius() const { return m_ProximityRadius; } - - void Destroy() { delete this; } - virtual void PreTick() {} - virtual void Tick() {} - virtual void TickDeferred() {} - - bool GameLayerClipped(vec2 CheckPos); - float m_ProximityRadius; - vec2 m_Pos; - int m_Number; - int m_Layer; - - int m_SnapTicks; - int m_DestroyTick; - int m_LastRenderTick; - CEntity *m_pParent; - CEntity *m_pChild; - CEntity *NextEntity() { return m_pNextTypeEntity; } - void Keep() - { - m_SnapTicks = 0; - m_MarkedForDestroy = false; - } - - CEntity() - { - m_Id = -1; - m_pGameWorld = 0; - } -}; - -#endif diff --git a/src/game/client/prediction/gameworld.cpp b/src/game/client/prediction/gameworld.cpp deleted file mode 100644 index cecffb9b8f..0000000000 --- a/src/game/client/prediction/gameworld.cpp +++ /dev/null @@ -1,710 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include "gameworld.h" -#include "entities/character.h" -#include "entities/dragger.h" -#include "entities/laser.h" -#include "entities/pickup.h" -#include "entities/projectile.h" -#include "entity.h" -#include -#include -#include -#include -#include -#include -#include - -////////////////////////////////////////////////// -// game world -////////////////////////////////////////////////// -CGameWorld::CGameWorld() -{ - for(auto &pFirstEntityType : m_apFirstEntityTypes) - pFirstEntityType = 0; - for(auto &pCharacter : m_apCharacters) - pCharacter = 0; - m_pCollision = 0; - m_GameTick = 0; - m_pParent = 0; - m_pChild = 0; -} - -CGameWorld::~CGameWorld() -{ - Clear(); - if(m_pChild && m_pChild->m_pParent == this) - { - OnModified(); - m_pChild->m_pParent = 0; - } - if(m_pParent && m_pParent->m_pChild == this) - m_pParent->m_pChild = 0; -} - -CEntity *CGameWorld::FindFirst(int Type) -{ - return Type < 0 || Type >= NUM_ENTTYPES ? 0 : m_apFirstEntityTypes[Type]; -} - -CEntity *CGameWorld::FindLast(int Type) -{ - CEntity *pLast = FindFirst(Type); - if(pLast) - while(pLast->TypeNext()) - pLast = pLast->TypeNext(); - return pLast; -} - -int CGameWorld::FindEntities(vec2 Pos, float Radius, CEntity **ppEnts, int Max, int Type) -{ - if(Type < 0 || Type >= NUM_ENTTYPES) - return 0; - - int Num = 0; - for(CEntity *pEnt = m_apFirstEntityTypes[Type]; pEnt; pEnt = pEnt->m_pNextTypeEntity) - { - if(distance(pEnt->m_Pos, Pos) < Radius + pEnt->m_ProximityRadius) - { - if(ppEnts) - ppEnts[Num] = pEnt; - Num++; - if(Num == Max) - break; - } - } - - return Num; -} - -void CGameWorld::InsertEntity(CEntity *pEnt, bool Last) -{ - pEnt->m_pGameWorld = this; - pEnt->m_pNextTypeEntity = 0x0; - pEnt->m_pPrevTypeEntity = 0x0; - - // insert it - if(!Last) - { - if(m_apFirstEntityTypes[pEnt->m_ObjType]) - m_apFirstEntityTypes[pEnt->m_ObjType]->m_pPrevTypeEntity = pEnt; - pEnt->m_pNextTypeEntity = m_apFirstEntityTypes[pEnt->m_ObjType]; - pEnt->m_pPrevTypeEntity = 0x0; - m_apFirstEntityTypes[pEnt->m_ObjType] = pEnt; - } - else - { - // insert it at the end of the list - CEntity *pLast = m_apFirstEntityTypes[pEnt->m_ObjType]; - if(pLast) - { - while(pLast->m_pNextTypeEntity) - pLast = pLast->m_pNextTypeEntity; - pLast->m_pNextTypeEntity = pEnt; - } - else - m_apFirstEntityTypes[pEnt->m_ObjType] = pEnt; - pEnt->m_pPrevTypeEntity = pLast; - pEnt->m_pNextTypeEntity = 0x0; - } - - if(pEnt->m_ObjType == ENTTYPE_CHARACTER) - { - auto *pChar = (CCharacter *)pEnt; - int Id = pChar->GetCid(); - if(Id >= 0 && Id < MAX_CLIENTS) - { - m_apCharacters[Id] = pChar; - m_Core.m_apCharacters[Id] = &pChar->m_Core; - } - pChar->SetCoreWorld(this); - } -} - -void CGameWorld::RemoveEntity(CEntity *pEnt) -{ - // not in the list - if(!pEnt->m_pNextTypeEntity && !pEnt->m_pPrevTypeEntity && m_apFirstEntityTypes[pEnt->m_ObjType] != pEnt) - return; - - // remove - if(pEnt->m_pPrevTypeEntity) - pEnt->m_pPrevTypeEntity->m_pNextTypeEntity = pEnt->m_pNextTypeEntity; - else - m_apFirstEntityTypes[pEnt->m_ObjType] = pEnt->m_pNextTypeEntity; - if(pEnt->m_pNextTypeEntity) - pEnt->m_pNextTypeEntity->m_pPrevTypeEntity = pEnt->m_pPrevTypeEntity; - - // keep list traversing valid - if(m_pNextTraverseEntity == pEnt) - m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; - - pEnt->m_pNextTypeEntity = 0; - pEnt->m_pPrevTypeEntity = 0; - - if(pEnt->m_pParent) - { - if(m_IsValidCopy && m_pParent && m_pParent->m_pChild == this) - pEnt->m_pParent->m_DestroyTick = GameTick(); - pEnt->m_pParent->m_pChild = nullptr; - pEnt->m_pParent = nullptr; - } - if(pEnt->m_pChild) - { - pEnt->m_pChild->m_pParent = nullptr; - pEnt->m_pChild = nullptr; - } -} - -void CGameWorld::RemoveCharacter(CCharacter *pChar) -{ - int Id = pChar->GetCid(); - if(Id >= 0 && Id < MAX_CLIENTS) - { - m_apCharacters[Id] = 0; - m_Core.m_apCharacters[Id] = 0; - } -} - -void CGameWorld::RemoveEntities() -{ - // destroy objects marked for destruction - for(auto *pEnt : m_apFirstEntityTypes) - for(; pEnt;) - { - m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; - if(pEnt->m_MarkedForDestroy) - { - pEnt->Destroy(); - } - pEnt = m_pNextTraverseEntity; - } -} - -void CGameWorld::Tick() -{ - // update all objects - for(int i = 0; i < NUM_ENTTYPES; i++) - { - // It's important to call PreTick() and Tick() after each other. - // If we call PreTick() before, and Tick() after other entities have been processed, it causes physics changes such as a stronger shotgun or grenade. - if(m_WorldConfig.m_NoWeakHookAndBounce && i == ENTTYPE_CHARACTER) - { - auto *pEnt = m_apFirstEntityTypes[i]; - for(; pEnt;) - { - m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; - ((CCharacter *)pEnt)->PreTick(); - pEnt = m_pNextTraverseEntity; - } - } - - auto *pEnt = m_apFirstEntityTypes[i]; - for(; pEnt;) - { - m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; - pEnt->Tick(); - pEnt = m_pNextTraverseEntity; - } - } - - for(auto *pEnt : m_apFirstEntityTypes) - for(; pEnt;) - { - m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; - pEnt->TickDeferred(); - pEnt->m_SnapTicks++; - pEnt = m_pNextTraverseEntity; - } - - RemoveEntities(); - - // update switch state - for(auto &Switcher : Switchers()) - { - for(int j = 0; j < MAX_CLIENTS; ++j) - { - if(Switcher.m_aEndTick[j] <= GameTick() && Switcher.m_aType[j] == TILE_SWITCHTIMEDOPEN) - { - Switcher.m_aStatus[j] = false; - Switcher.m_aEndTick[j] = 0; - Switcher.m_aType[j] = TILE_SWITCHCLOSE; - } - else if(Switcher.m_aEndTick[j] <= GameTick() && Switcher.m_aType[j] == TILE_SWITCHTIMEDCLOSE) - { - Switcher.m_aStatus[j] = true; - Switcher.m_aEndTick[j] = 0; - Switcher.m_aType[j] = TILE_SWITCHOPEN; - } - } - } - - OnModified(); -} - -// TODO: should be more general -CCharacter *CGameWorld::IntersectCharacter(vec2 Pos0, vec2 Pos1, float Radius, vec2 &NewPos, const CCharacter *pNotThis, int CollideWith, const CCharacter *pThisOnly) -{ - // Find other players - float ClosestLen = distance(Pos0, Pos1) * 100.0f; - CCharacter *pClosest = 0; - - CCharacter *p = (CCharacter *)FindFirst(ENTTYPE_CHARACTER); - for(; p; p = (CCharacter *)p->TypeNext()) - { - if(p == pNotThis) - continue; - - if(pThisOnly && p != pThisOnly) - continue; - - if(CollideWith != -1 && !p->CanCollide(CollideWith)) - continue; - - vec2 IntersectPos; - if(closest_point_on_line(Pos0, Pos1, p->m_Pos, IntersectPos)) - { - float Len = distance(p->m_Pos, IntersectPos); - if(Len < p->m_ProximityRadius + Radius) - { - Len = distance(Pos0, IntersectPos); - if(Len < ClosestLen) - { - NewPos = IntersectPos; - ClosestLen = Len; - pClosest = p; - } - } - } - } - - return pClosest; -} - -std::vector CGameWorld::IntersectedCharacters(vec2 Pos0, vec2 Pos1, float Radius, const CEntity *pNotThis) -{ - std::vector vpCharacters; - CCharacter *pChr = (CCharacter *)FindFirst(CGameWorld::ENTTYPE_CHARACTER); - for(; pChr; pChr = (CCharacter *)pChr->TypeNext()) - { - if(pChr == pNotThis) - continue; - - vec2 IntersectPos; - if(closest_point_on_line(Pos0, Pos1, pChr->m_Pos, IntersectPos)) - { - float Len = distance(pChr->m_Pos, IntersectPos); - if(Len < pChr->m_ProximityRadius + Radius) - { - vpCharacters.push_back(pChr); - } - } - } - return vpCharacters; -} - -void CGameWorld::ReleaseHooked(int ClientId) -{ - CCharacter *pChr = (CCharacter *)CGameWorld::FindFirst(CGameWorld::ENTTYPE_CHARACTER); - for(; pChr; pChr = (CCharacter *)pChr->TypeNext()) - { - if(pChr->Core()->HookedPlayer() == ClientId && !pChr->IsSuper()) - { - pChr->ReleaseHook(); - } - } -} - -CTuningParams *CGameWorld::Tuning() -{ - return &m_Core.m_aTuning[g_Config.m_ClDummy]; -} - -CEntity *CGameWorld::GetEntity(int Id, int EntityType) -{ - for(CEntity *pEnt = m_apFirstEntityTypes[EntityType]; pEnt; pEnt = pEnt->m_pNextTypeEntity) - if(pEnt->m_Id == Id) - return pEnt; - return 0; -} - -void CGameWorld::CreateExplosion(vec2 Pos, int Owner, int Weapon, bool NoDamage, int ActivatedTeam, CClientMask Mask) -{ - if(Owner < 0 && m_WorldConfig.m_IsSolo && !(Weapon == WEAPON_SHOTGUN && m_WorldConfig.m_IsDDRace)) - return; - - // deal damage - CEntity *apEnts[MAX_CLIENTS]; - float Radius = 135.0f; - float InnerRadius = 48.0f; - int Num = FindEntities(Pos, Radius, apEnts, MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER); - for(int i = 0; i < Num; i++) - { - auto *pChar = static_cast(apEnts[i]); - vec2 Diff = pChar->m_Pos - Pos; - vec2 ForceDir(0, 1); - float l = length(Diff); - if(l) - ForceDir = normalize(Diff); - l = 1 - clamp((l - InnerRadius) / (Radius - InnerRadius), 0.0f, 1.0f); - float Strength; - if(Owner == -1 || !GetCharacterById(Owner)) - Strength = Tuning()->m_ExplosionStrength; - else - Strength = GetCharacterById(Owner)->Tuning()->m_ExplosionStrength; - - float Dmg = Strength * l; - if((int)Dmg) - if((GetCharacterById(Owner) ? !GetCharacterById(Owner)->GrenadeHitDisabled() : g_Config.m_SvHit || NoDamage) || Owner == pChar->GetCid()) - { - if(Owner != -1 && !pChar->CanCollide(Owner)) - continue; - if(Owner == -1 && ActivatedTeam != -1 && pChar->Team() != ActivatedTeam) - continue; - pChar->TakeDamage(ForceDir * Dmg * 2, (int)Dmg, Owner, Weapon); - if(GetCharacterById(Owner) ? GetCharacterById(Owner)->GrenadeHitDisabled() : !g_Config.m_SvHit || NoDamage) - break; - } - } -} - -bool CGameWorld::IsLocalTeam(int OwnerId) const -{ - return OwnerId < 0 || m_Teams.CanCollide(m_LocalClientId, OwnerId); -} - -void CGameWorld::NetObjBegin(CTeamsCore Teams, int LocalClientId) -{ - m_Teams = Teams; - m_LocalClientId = LocalClientId; - - for(int i = 0; i < NUM_ENTTYPES; i++) - for(CEntity *pEnt = FindFirst(i); pEnt; pEnt = pEnt->TypeNext()) - { - pEnt->m_MarkedForDestroy = true; - if(i == ENTTYPE_CHARACTER) - ((CCharacter *)pEnt)->m_KeepHooked = false; - } - OnModified(); -} - -void CGameWorld::NetCharAdd(int ObjId, CNetObj_Character *pCharObj, CNetObj_DDNetCharacter *pExtended, int GameTeam, bool IsLocal) -{ - if(IsLocalTeam(ObjId)) - { - CCharacter *pChar; - if((pChar = (CCharacter *)GetEntity(ObjId, ENTTYPE_CHARACTER))) - { - pChar->Read(pCharObj, pExtended, IsLocal); - pChar->Keep(); - } - else - { - pChar = new CCharacter(this, ObjId, pCharObj, pExtended); - InsertEntity(pChar); - } - - if(pChar) - pChar->m_GameTeam = GameTeam; - } -} - -void CGameWorld::NetObjAdd(int ObjId, int ObjType, const void *pObjData, const CNetObj_EntityEx *pDataEx) -{ - if((ObjType == NETOBJTYPE_PROJECTILE || ObjType == NETOBJTYPE_DDRACEPROJECTILE || ObjType == NETOBJTYPE_DDNETPROJECTILE) && m_WorldConfig.m_PredictWeapons) - { - CProjectileData Data = ExtractProjectileInfo(ObjType, pObjData, this, pDataEx); - if(!IsLocalTeam(Data.m_Owner)) - return; - - CProjectile NetProj = CProjectile(this, ObjId, &Data); - - if(NetProj.m_Type != WEAPON_SHOTGUN && absolute(length(NetProj.m_Direction) - 1.f) > 0.02f) // workaround to skip grenades on ball mod - return; - - if(CProjectile *pProj = (CProjectile *)GetEntity(ObjId, ENTTYPE_PROJECTILE)) - { - if(NetProj.Match(pProj)) - { - pProj->Keep(); - if(pProj->m_Type == WEAPON_SHOTGUN && m_WorldConfig.m_IsDDRace) - pProj->m_LifeSpan = 20 * GameTickSpeed() - (GameTick() - pProj->m_StartTick); - return; - } - } - if(!Data.m_ExtraInfo) - { - // try to match the newly received (unrecognized) projectile with a locally fired one - for(CProjectile *pProj = (CProjectile *)FindFirst(CGameWorld::ENTTYPE_PROJECTILE); pProj; pProj = (CProjectile *)pProj->TypeNext()) - { - if(pProj->m_Id == -1 && NetProj.Match(pProj)) - { - pProj->m_Id = ObjId; - pProj->Keep(); - return; - } - } - // otherwise try to determine its owner by checking if there is only one player nearby - if(NetProj.m_StartTick >= GameTick() - 4) - { - const vec2 NetPos = NetProj.m_Pos - normalize(NetProj.m_Direction) * CCharacterCore::PhysicalSize() * 0.75; - const bool Prev = (GameTick() - NetProj.m_StartTick) > 1; - float First = 200.0f, Second = 200.0f; - CCharacter *pClosest = 0; - for(CCharacter *pChar = (CCharacter *)FindFirst(ENTTYPE_CHARACTER); pChar; pChar = (CCharacter *)pChar->TypeNext()) - { - float Dist = distance(Prev ? pChar->m_PrevPrevPos : pChar->m_PrevPos, NetPos); - if(Dist < First) - { - pClosest = pChar; - First = Dist; - } - else if(Dist < Second) - Second = Dist; - } - if(pClosest && maximum(First, 2.f) * 1.2f < Second) - NetProj.m_Owner = pClosest->m_Id; - } - } - CProjectile *pProj = new CProjectile(NetProj); - InsertEntity(pProj); - } - else if((ObjType == NETOBJTYPE_PICKUP || ObjType == NETOBJTYPE_DDNETPICKUP) && m_WorldConfig.m_PredictWeapons) - { - CPickupData Data = ExtractPickupInfo(ObjType, pObjData, pDataEx); - CPickup NetPickup = CPickup(this, ObjId, &Data); - if(CPickup *pPickup = (CPickup *)GetEntity(ObjId, ENTTYPE_PICKUP)) - { - if(NetPickup.Match(pPickup)) - { - pPickup->m_Pos = NetPickup.m_Pos; - pPickup->Keep(); - return; - } - } - CEntity *pEnt = new CPickup(NetPickup); - InsertEntity(pEnt, true); - } - else if((ObjType == NETOBJTYPE_LASER || ObjType == NETOBJTYPE_DDNETLASER) && m_WorldConfig.m_PredictWeapons) - { - CLaserData Data = ExtractLaserInfo(ObjType, pObjData, this, pDataEx); - if(!IsLocalTeam(Data.m_Owner) || !Data.m_Predict) - { - return; - } - - if(Data.m_Type == LASERTYPE_RIFLE || Data.m_Type == LASERTYPE_SHOTGUN || Data.m_Type < 0) - { - CLaser NetLaser = CLaser(this, ObjId, &Data); - CLaser *pMatching = 0; - if(CLaser *pLaser = dynamic_cast(GetEntity(ObjId, ENTTYPE_LASER))) - if(NetLaser.Match(pLaser)) - pMatching = pLaser; - if(!pMatching) - { - for(CEntity *pEnt = FindFirst(CGameWorld::ENTTYPE_LASER); pEnt; pEnt = pEnt->TypeNext()) - { - auto *const pLaser = dynamic_cast(pEnt); - if(pLaser && pLaser->m_Id == -1 && NetLaser.Match(pLaser)) - { - pMatching = pLaser; - pMatching->m_Id = ObjId; - break; - } - } - } - if(pMatching) - { - pMatching->Keep(); - if(distance(NetLaser.m_From, NetLaser.m_Pos) < distance(pMatching->m_From, pMatching->m_Pos) - 2.f) - { - // if the laser stopped earlier than predicted, set the energy to 0 - pMatching->m_Energy = 0.f; - pMatching->m_Pos = NetLaser.m_Pos; - } - } - } - else if(Data.m_Type == LASERTYPE_DRAGGER) - { - CDragger NetDragger = CDragger(this, ObjId, &Data); - if(NetDragger.GetStrength() > 0) - { - auto *pDragger = dynamic_cast(GetEntity(ObjId, ENTTYPE_DRAGGER)); - if(pDragger && NetDragger.Match(pDragger)) - { - pDragger->Keep(); - pDragger->Read(&Data); - return; - } - CEntity *pEnt = new CDragger(NetDragger); - InsertEntity(pEnt); - } - } - } -} - -void CGameWorld::NetObjEnd() -{ - // keep predicting hooked characters, based on hook position - for(int i = 0; i < MAX_CLIENTS; i++) - if(CCharacter *pChar = GetCharacterById(i)) - if(!pChar->m_MarkedForDestroy) - if(CCharacter *pHookedChar = GetCharacterById(pChar->m_Core.HookedPlayer())) - if(pHookedChar->m_MarkedForDestroy) - { - pHookedChar->m_Pos = pHookedChar->m_Core.m_Pos = pChar->m_Core.m_HookPos; - pHookedChar->ResetVelocity(); - mem_zero(&pHookedChar->m_SavedInput, sizeof(pHookedChar->m_SavedInput)); - pHookedChar->m_SavedInput.m_TargetY = -1; - pHookedChar->m_KeepHooked = true; - pHookedChar->m_MarkedForDestroy = false; - } - RemoveEntities(); - - // Update character IDs and pointers - for(int i = 0; i < MAX_CLIENTS; i++) - { - m_apCharacters[i] = 0; - m_Core.m_apCharacters[i] = 0; - } - for(CCharacter *pChar = (CCharacter *)FindFirst(ENTTYPE_CHARACTER); pChar; pChar = (CCharacter *)pChar->TypeNext()) - { - int Id = pChar->GetCid(); - if(Id >= 0 && Id < MAX_CLIENTS) - { - m_apCharacters[Id] = pChar; - m_Core.m_apCharacters[Id] = &pChar->m_Core; - } - } -} - -void CGameWorld::CopyWorld(CGameWorld *pFrom) -{ - if(pFrom == this || !pFrom) - return; - m_IsValidCopy = false; - m_pParent = pFrom; - if(m_pParent->m_pChild && m_pParent->m_pChild != this) - m_pParent->m_pChild->m_IsValidCopy = false; - pFrom->m_pChild = this; - - m_GameTick = pFrom->m_GameTick; - m_pCollision = pFrom->m_pCollision; - m_WorldConfig = pFrom->m_WorldConfig; - for(int i = 0; i < 2; i++) - { - m_Core.m_aTuning[i] = pFrom->m_Core.m_aTuning[i]; - } - m_pTuningList = pFrom->m_pTuningList; - m_Teams = pFrom->m_Teams; - m_Core.m_vSwitchers = pFrom->m_Core.m_vSwitchers; - // delete the previous entities - Clear(); - for(int i = 0; i < MAX_CLIENTS; i++) - { - m_apCharacters[i] = 0; - m_Core.m_apCharacters[i] = 0; - } - // copy and add the new entities - for(int Type = 0; Type < NUM_ENTTYPES; Type++) - { - for(CEntity *pEnt = pFrom->FindLast(Type); pEnt; pEnt = pEnt->TypePrev()) - { - CEntity *pCopy = 0; - if(Type == ENTTYPE_PROJECTILE) - pCopy = new CProjectile(*((CProjectile *)pEnt)); - else if(Type == ENTTYPE_LASER) - pCopy = new CLaser(*((CLaser *)pEnt)); - else if(Type == ENTTYPE_DRAGGER) - pCopy = new CDragger(*((CDragger *)pEnt)); - else if(Type == ENTTYPE_CHARACTER) - pCopy = new CCharacter(*((CCharacter *)pEnt)); - else if(Type == ENTTYPE_PICKUP) - pCopy = new CPickup(*((CPickup *)pEnt)); - if(pCopy) - { - pCopy->m_pParent = pEnt; - pEnt->m_pChild = pCopy; - this->InsertEntity(pCopy); - } - } - } - m_IsValidCopy = true; -} - -CEntity *CGameWorld::FindMatch(int ObjId, int ObjType, const void *pObjData) -{ - switch(ObjType) - { - case NETOBJTYPE_CHARACTER: - { - CCharacter *pEnt = (CCharacter *)GetEntity(ObjId, ENTTYPE_CHARACTER); - if(pEnt && CCharacter(this, ObjId, (CNetObj_Character *)pObjData).Match(pEnt)) - { - return pEnt; - } - return 0; - } - case NETOBJTYPE_PROJECTILE: - case NETOBJTYPE_DDRACEPROJECTILE: - case NETOBJTYPE_DDNETPROJECTILE: - { - CProjectileData Data = ExtractProjectileInfo(ObjType, pObjData, this, nullptr); - CProjectile *pEnt = (CProjectile *)GetEntity(ObjId, ENTTYPE_PROJECTILE); - if(pEnt && CProjectile(this, ObjId, &Data).Match(pEnt)) - { - return pEnt; - } - return 0; - } - case NETOBJTYPE_LASER: - case NETOBJTYPE_DDNETLASER: - { - CLaserData Data = ExtractLaserInfo(ObjType, pObjData, this, nullptr); - if(Data.m_Type == LASERTYPE_RIFLE || Data.m_Type == LASERTYPE_SHOTGUN) - { - CLaser *pEnt = (CLaser *)GetEntity(ObjId, ENTTYPE_LASER); - if(pEnt && CLaser(this, ObjId, &Data).Match(pEnt)) - { - return pEnt; - } - } - else if(Data.m_Type == LASERTYPE_DRAGGER) - { - CDragger *pEnt = (CDragger *)GetEntity(ObjId, ENTTYPE_DRAGGER); - if(pEnt && CDragger(this, ObjId, &Data).Match(pEnt)) - { - return pEnt; - } - } - return 0; - } - case NETOBJTYPE_PICKUP: - case NETOBJTYPE_DDNETPICKUP: - { - CPickupData Data = ExtractPickupInfo(ObjType, pObjData, nullptr); - CPickup *pEnt = (CPickup *)GetEntity(ObjId, ENTTYPE_PICKUP); - if(pEnt && CPickup(this, ObjId, &Data).Match(pEnt)) - { - return pEnt; - } - return 0; - } - } - return 0; -} - -void CGameWorld::OnModified() const -{ - if(m_pChild) - m_pChild->m_IsValidCopy = false; -} - -void CGameWorld::Clear() -{ - // delete all entities - for(auto &pFirstEntityType : m_apFirstEntityTypes) - while(pFirstEntityType) - delete pFirstEntityType; // NOLINT(clang-analyzer-cplusplus.NewDelete) -} diff --git a/src/game/client/prediction/gameworld.h b/src/game/client/prediction/gameworld.h deleted file mode 100644 index 78d6403084..0000000000 --- a/src/game/client/prediction/gameworld.h +++ /dev/null @@ -1,158 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_PREDICTION_GAMEWORLD_H -#define GAME_CLIENT_PREDICTION_GAMEWORLD_H - -#include -#include - -#include -#include - -class CCollision; -class CCharacter; -class CEntity; - -class CGameWorld -{ -public: - enum - { - ENTTYPE_PROJECTILE = 0, - ENTTYPE_LASER, - ENTTYPE_DOOR, - ENTTYPE_DRAGGER, - ENTTYPE_LIGHT, - ENTTYPE_GUN, - ENTTYPE_PLASMA, - ENTTYPE_PICKUP, - ENTTYPE_FLAG, - ENTTYPE_CHARACTER, - NUM_ENTTYPES - }; - - CWorldCore m_Core; - CTeamsCore m_Teams; - - CGameWorld(); - ~CGameWorld(); - - CEntity *FindFirst(int Type); - CEntity *FindLast(int Type); - int FindEntities(vec2 Pos, float Radius, CEntity **ppEnts, int Max, int Type); - CCharacter *IntersectCharacter(vec2 Pos0, vec2 Pos1, float Radius, vec2 &NewPos, const CCharacter *pNotThis = nullptr, int CollideWith = -1, const CCharacter *pThisOnly = nullptr); - void InsertEntity(CEntity *pEntity, bool Last = false); - void RemoveEntity(CEntity *pEntity); - void RemoveCharacter(CCharacter *pChar); - void Tick(); - - // DDRace - void ReleaseHooked(int ClientId); - std::vector IntersectedCharacters(vec2 Pos0, vec2 Pos1, float Radius, const CEntity *pNotThis = nullptr); - - int m_GameTick; - CCollision *m_pCollision; - - // getter for server variables - int GameTick() { return m_GameTick; } - int GameTickSpeed() { return SERVER_TICK_SPEED; } - CCollision *Collision() { return m_pCollision; } - CTeamsCore *Teams() { return &m_Teams; } - std::vector &Switchers() { return m_Core.m_vSwitchers; } - CTuningParams *Tuning(); - CEntity *GetEntity(int Id, int EntityType); - CCharacter *GetCharacterById(int Id) { return (Id >= 0 && Id < MAX_CLIENTS) ? m_apCharacters[Id] : nullptr; } - - // from gamecontext - void CreateExplosion(vec2 Pos, int Owner, int Weapon, bool NoDamage, int ActivatedTeam, CClientMask Mask); - - // for client side prediction - struct - { - bool m_IsDDRace; - bool m_IsVanilla; - bool m_IsFNG; - bool m_InfiniteAmmo; - bool m_PredictTiles; - int m_PredictFreeze; - bool m_PredictWeapons; - bool m_PredictDDRace; - bool m_IsSolo; - bool m_UseTuneZones; - bool m_BugDDRaceInput; - bool m_NoWeakHookAndBounce; - } m_WorldConfig; - - bool m_IsValidCopy; - CGameWorld *m_pParent; - CGameWorld *m_pChild; - - int m_LocalClientId; - - bool IsLocalTeam(int OwnerId) const; - void OnModified() const; - void NetObjBegin(CTeamsCore Teams, int LocalClientId); - void NetCharAdd(int ObjId, CNetObj_Character *pChar, CNetObj_DDNetCharacter *pExtended, int GameTeam, bool IsLocal); - void NetObjAdd(int ObjId, int ObjType, const void *pObjData, const CNetObj_EntityEx *pDataEx); - void NetObjEnd(); - void CopyWorld(CGameWorld *pFrom); - CEntity *FindMatch(int ObjId, int ObjType, const void *pObjData); - void Clear(); - - CTuningParams *m_pTuningList; - CTuningParams *TuningList() { return m_pTuningList; } - CTuningParams *GetTuning(int i) { return &TuningList()[i]; } - -private: - void RemoveEntities(); - - CEntity *m_pNextTraverseEntity = nullptr; - CEntity *m_apFirstEntityTypes[NUM_ENTTYPES]; - - CCharacter *m_apCharacters[MAX_CLIENTS]; -}; - -class CCharOrder -{ -public: - std::list m_Ids; // reverse of the order in the gameworld, since entities will be inserted in reverse - CCharOrder() - { - Reset(); - } - void Reset() - { - m_Ids.clear(); - for(int i = 0; i < MAX_CLIENTS; i++) - m_Ids.push_back(i); - } - void GiveStrong(int c) - { - if(0 <= c && c < MAX_CLIENTS) - { - m_Ids.remove(c); - m_Ids.push_front(c); - } - } - void GiveWeak(int c) - { - if(0 <= c && c < MAX_CLIENTS) - { - m_Ids.remove(c); - m_Ids.push_back(c); - } - } - bool HasStrongAgainst(int From, int To) - { - for(int i : m_Ids) - { - if(i == To) - return false; - else if(i == From) - return true; - } - return false; - } -}; - -#endif diff --git a/src/game/client/projectile_data.cpp b/src/game/client/projectile_data.cpp deleted file mode 100644 index 9bf7cdf8bf..0000000000 --- a/src/game/client/projectile_data.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include "projectile_data.h" - -#include -#include -#include - -#include - -bool UseProjectileExtraInfo(const CNetObj_Projectile *pProj) -{ - return pProj->m_VelY >= 0 && (pProj->m_VelY & LEGACYPROJECTILEFLAG_IS_DDNET) != 0; -} - -CProjectileData ExtractProjectileInfo(int NetObjType, const void *pData, CGameWorld *pGameWorld, const CNetObj_EntityEx *pEntEx) -{ - CNetObj_Projectile *pProj = (CNetObj_Projectile *)pData; - - if(NetObjType == NETOBJTYPE_DDNETPROJECTILE) - { - return ExtractProjectileInfoDDNet((CNetObj_DDNetProjectile *)pData); - } - else if(NetObjType == NETOBJTYPE_DDRACEPROJECTILE || (NetObjType == NETOBJTYPE_PROJECTILE && UseProjectileExtraInfo(pProj))) - { - return ExtractProjectileInfoDDRace((CNetObj_DDRaceProjectile *)pData, pGameWorld, pEntEx); - } - - CProjectileData Result = {vec2(0, 0)}; - Result.m_StartPos.x = pProj->m_X; - Result.m_StartPos.y = pProj->m_Y; - Result.m_StartVel.x = pProj->m_VelX / 100.0f; - Result.m_StartVel.y = pProj->m_VelY / 100.0f; - Result.m_Type = pProj->m_Type; - Result.m_StartTick = pProj->m_StartTick; - Result.m_ExtraInfo = false; - Result.m_Owner = -1; - Result.m_TuneZone = pGameWorld && pGameWorld->m_WorldConfig.m_UseTuneZones ? pGameWorld->Collision()->IsTune(pGameWorld->Collision()->GetMapIndex(Result.m_StartPos)) : 0; - Result.m_SwitchNumber = pEntEx ? pEntEx->m_SwitchNumber : 0; - return Result; -} - -CProjectileData ExtractProjectileInfoDDRace(const CNetObj_DDRaceProjectile *pProj, CGameWorld *pGameWorld, const CNetObj_EntityEx *pEntEx) -{ - CProjectileData Result = {vec2(0, 0)}; - - Result.m_StartPos.x = pProj->m_X / 100.0f; - Result.m_StartPos.y = pProj->m_Y / 100.0f; - float Angle = pProj->m_Angle / 1000000.0f; - Result.m_StartVel.x = std::sin(-Angle); - Result.m_StartVel.y = std::cos(-Angle); - Result.m_Type = pProj->m_Type; - Result.m_StartTick = pProj->m_StartTick; - - Result.m_ExtraInfo = true; - Result.m_Owner = pProj->m_Data & 255; - if(pProj->m_Data & LEGACYPROJECTILEFLAG_NO_OWNER || Result.m_Owner < 0 || Result.m_Owner >= MAX_CLIENTS) - { - Result.m_Owner = -1; - } - // LEGACYPROJECTILEFLAG_BOUNCE_HORIZONTAL, LEGACYPROJECTILEFLAG_BOUNCE_VERTICAL - Result.m_Bouncing = (pProj->m_Data >> 10) & 3; - Result.m_Explosive = pProj->m_Data & LEGACYPROJECTILEFLAG_EXPLOSIVE; - Result.m_Freeze = pProj->m_Data & LEGACYPROJECTILEFLAG_FREEZE; - Result.m_TuneZone = pGameWorld && pGameWorld->m_WorldConfig.m_UseTuneZones ? pGameWorld->Collision()->IsTune(pGameWorld->Collision()->GetMapIndex(Result.m_StartPos)) : 0; - Result.m_SwitchNumber = pEntEx ? pEntEx->m_SwitchNumber : 0; - return Result; -} - -CProjectileData ExtractProjectileInfoDDNet(const CNetObj_DDNetProjectile *pProj) -{ - CProjectileData Result = {vec2(0, 0)}; - - Result.m_StartPos = vec2(pProj->m_X / 100.0f, pProj->m_Y / 100.0f); - Result.m_StartVel = vec2(pProj->m_VelX / 1e6f, pProj->m_VelY / 1e6f); - - if(pProj->m_Flags & PROJECTILEFLAG_NORMALIZE_VEL) - { - Result.m_StartVel = normalize(Result.m_StartVel); - } - - Result.m_Type = pProj->m_Type; - Result.m_StartTick = pProj->m_StartTick; - - Result.m_ExtraInfo = true; - Result.m_Owner = pProj->m_Owner; - Result.m_SwitchNumber = pProj->m_SwitchNumber; - Result.m_TuneZone = pProj->m_TuneZone; - - Result.m_Bouncing = 0; - if(pProj->m_Flags & PROJECTILEFLAG_BOUNCE_HORIZONTAL) - { - Result.m_Bouncing |= 1; - } - if(pProj->m_Flags & PROJECTILEFLAG_BOUNCE_VERTICAL) - { - Result.m_Bouncing |= 2; - } - - Result.m_Explosive = pProj->m_Flags & PROJECTILEFLAG_EXPLOSIVE; - Result.m_Freeze = pProj->m_Flags & PROJECTILEFLAG_FREEZE; - - return Result; -} - -void SnapshotRemoveExtraProjectileInfo(CSnapshot *pSnap) -{ - for(int Index = 0; Index < pSnap->NumItems(); Index++) - { - const CSnapshotItem *pItem = pSnap->GetItem(Index); - if(pItem->Type() == NETOBJTYPE_PROJECTILE) - { - CNetObj_Projectile *pProj = (CNetObj_Projectile *)((void *)pItem->Data()); - if(UseProjectileExtraInfo(pProj)) - { - CProjectileData Data = ExtractProjectileInfo(NETOBJTYPE_PROJECTILE, pProj, nullptr, nullptr); - pProj->m_X = Data.m_StartPos.x; - pProj->m_Y = Data.m_StartPos.y; - pProj->m_VelX = (int)(Data.m_StartVel.x * 100.0f); - pProj->m_VelY = (int)(Data.m_StartVel.y * 100.0f); - } - } - } -} diff --git a/src/game/client/projectile_data.h b/src/game/client/projectile_data.h deleted file mode 100644 index f66878dc52..0000000000 --- a/src/game/client/projectile_data.h +++ /dev/null @@ -1,35 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_PROJECTILE_DATA_H -#define GAME_CLIENT_PROJECTILE_DATA_H - -#include - -struct CNetObj_Projectile; -struct CNetObj_DDRaceProjectile; -struct CNetObj_DDNetProjectile; -struct CNetObj_EntityEx; - -class CProjectileData -{ -public: - vec2 m_StartPos; - vec2 m_StartVel; - int m_Type; - int m_StartTick; - bool m_ExtraInfo; - // The rest is only set if m_ExtraInfo is true. - int m_Owner; - bool m_Explosive; - int m_Bouncing; - bool m_Freeze; - int m_SwitchNumber; - // TuneZone is introduced locally - int m_TuneZone; -}; - -CProjectileData ExtractProjectileInfo(int NetObjType, const void *pData, class CGameWorld *pGameWorld, const CNetObj_EntityEx *pEntEx); -CProjectileData ExtractProjectileInfoDDRace(const CNetObj_DDRaceProjectile *pProj, class CGameWorld *pGameWorld, const CNetObj_EntityEx *pEntEx); -CProjectileData ExtractProjectileInfoDDNet(const CNetObj_DDNetProjectile *pProj); - -#endif // GAME_CLIENT_PROJECTILE_DATA_H diff --git a/src/game/client/race.cpp b/src/game/client/race.cpp deleted file mode 100644 index 1d86da27c1..0000000000 --- a/src/game/client/race.cpp +++ /dev/null @@ -1,126 +0,0 @@ -#include -#include - -#include -#include -#include - -#include "race.h" - -void CRaceHelper::Init(const CGameClient *pGameClient) -{ - m_pGameClient = pGameClient; - - m_aFlagIndex[TEAM_RED] = -1; - m_aFlagIndex[TEAM_BLUE] = -1; - - const CTile *pGameTiles = m_pGameClient->Collision()->GameLayer(); - const int MapSize = m_pGameClient->Collision()->GetWidth() * m_pGameClient->Collision()->GetHeight(); - for(int Index = 0; Index < MapSize; Index++) - { - const int EntityIndex = pGameTiles[Index].m_Index - ENTITY_OFFSET; - if(EntityIndex == ENTITY_FLAGSTAND_RED) - { - m_aFlagIndex[TEAM_RED] = Index; - if(m_aFlagIndex[TEAM_BLUE] != -1) - break; // Found both flags - } - else if(EntityIndex == ENTITY_FLAGSTAND_BLUE) - { - m_aFlagIndex[TEAM_BLUE] = Index; - if(m_aFlagIndex[TEAM_RED] != -1) - break; // Found both flags - } - Index += pGameTiles[Index].m_Skip; - } -} - -int CRaceHelper::TimeFromSecondsStr(const char *pStr) -{ - while(*pStr == ' ') // skip leading spaces - pStr++; - if(!isdigit(*pStr)) - return -1; - int Time = str_toint(pStr) * 1000; - while(isdigit(*pStr)) - pStr++; - if(*pStr == '.' || *pStr == ',') - { - pStr++; - static const int s_aMult[3] = {100, 10, 1}; - for(size_t i = 0; i < std::size(s_aMult) && isdigit(pStr[i]); i++) - Time += (pStr[i] - '0') * s_aMult[i]; - } - return Time; -} - -int CRaceHelper::TimeFromStr(const char *pStr) -{ - static const char *const s_pMinutesStr = " minute(s) "; - static const char *const s_pSecondsStr = " second(s)"; - - const char *pSeconds = str_find(pStr, s_pSecondsStr); - if(!pSeconds) - return -1; - - const char *pMinutes = str_find(pStr, s_pMinutesStr); - if(pMinutes) - { - while(*pStr == ' ') // skip leading spaces - pStr++; - int SecondsTime = TimeFromSecondsStr(pMinutes + str_length(s_pMinutesStr)); - if(SecondsTime == -1 || !isdigit(*pStr)) - return -1; - return str_toint(pStr) * 60 * 1000 + SecondsTime; - } - else - return TimeFromSecondsStr(pStr); -} - -int CRaceHelper::TimeFromFinishMessage(const char *pStr, char *pNameBuf, int NameBufSize) -{ - static const char *const s_pFinishedStr = " finished in: "; - const char *pFinished = str_find(pStr, s_pFinishedStr); - if(!pFinished) - return -1; - - int FinishedPos = pFinished - pStr; - if(FinishedPos == 0 || FinishedPos >= NameBufSize) - return -1; - - str_copy(pNameBuf, pStr, FinishedPos + 1); - - return TimeFromStr(pFinished + str_length(s_pFinishedStr)); -} - -bool CRaceHelper::IsStart(vec2 Prev, vec2 Pos) const -{ - if(m_pGameClient->m_GameInfo.m_FlagStartsRace) - { - int EnemyTeam = m_pGameClient->m_aClients[m_pGameClient->m_Snap.m_LocalClientId].m_Team ^ 1; - return m_aFlagIndex[EnemyTeam] != -1 && distance(Pos, m_pGameClient->Collision()->GetPos(m_aFlagIndex[EnemyTeam])) < 32; - } - else - { - std::vector vIndices = m_pGameClient->Collision()->GetMapIndices(Prev, Pos); - if(!vIndices.empty()) - { - for(const int Index : vIndices) - { - if(m_pGameClient->Collision()->GetTileIndex(Index) == TILE_START) - return true; - if(m_pGameClient->Collision()->GetFrontTileIndex(Index) == TILE_START) - return true; - } - } - else - { - const int Index = m_pGameClient->Collision()->GetPureMapIndex(Pos); - if(m_pGameClient->Collision()->GetTileIndex(Index) == TILE_START) - return true; - if(m_pGameClient->Collision()->GetFrontTileIndex(Index) == TILE_START) - return true; - } - } - return false; -} diff --git a/src/game/client/race.h b/src/game/client/race.h deleted file mode 100644 index b9b67ec647..0000000000 --- a/src/game/client/race.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef GAME_CLIENT_RACE_H -#define GAME_CLIENT_RACE_H - -#include - -class CGameClient; - -class CRaceHelper -{ - const CGameClient *m_pGameClient; - - int m_aFlagIndex[2] = {-1, -1}; - -public: - void Init(const CGameClient *pGameClient); - - // these functions return the time in milliseconds, time -1 is invalid - static int TimeFromSecondsStr(const char *pStr); // x.xxx - static int TimeFromStr(const char *pStr); // x minute(s) x.xxx second(s) - static int TimeFromFinishMessage(const char *pStr, char *pNameBuf, int NameBufSize); // xxx finished in: x minute(s) x.xxx second(s) - - bool IsStart(vec2 Prev, vec2 Pos) const; -}; - -#endif // GAME_CLIENT_RACE_H diff --git a/src/game/client/render.cpp b/src/game/client/render.cpp deleted file mode 100644 index b9f9018ddb..0000000000 --- a/src/game/client/render.cpp +++ /dev/null @@ -1,672 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include - -#include - -#include "animstate.h" -#include "render.h" - -#include -#include - -#include -#include -#include -#include - -#include - -static float gs_SpriteWScale; -static float gs_SpriteHScale; - -void CRenderTools::Init(IGraphics *pGraphics, ITextRender *pTextRender) -{ - m_pGraphics = pGraphics; - m_pTextRender = pTextRender; - m_TeeQuadContainerIndex = Graphics()->CreateQuadContainer(false); - Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); - - Graphics()->QuadsSetSubset(0, 0, 1, 1); - QuadContainerAddSprite(m_TeeQuadContainerIndex, 64.f); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - QuadContainerAddSprite(m_TeeQuadContainerIndex, 64.f); - - Graphics()->QuadsSetSubset(0, 0, 1, 1); - QuadContainerAddSprite(m_TeeQuadContainerIndex, 64.f * 0.4f); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - QuadContainerAddSprite(m_TeeQuadContainerIndex, 64.f * 0.4f); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - QuadContainerAddSprite(m_TeeQuadContainerIndex, 64.f * 0.4f); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - QuadContainerAddSprite(m_TeeQuadContainerIndex, 64.f * 0.4f); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - QuadContainerAddSprite(m_TeeQuadContainerIndex, 64.f * 0.4f); - - // Feet - Graphics()->QuadsSetSubset(0, 0, 1, 1); - QuadContainerAddSprite(m_TeeQuadContainerIndex, -32.f, -16.f, 64.f, 32.f); - Graphics()->QuadsSetSubset(0, 0, 1, 1); - QuadContainerAddSprite(m_TeeQuadContainerIndex, -32.f, -16.f, 64.f, 32.f); - - // Mirrored Feet - Graphics()->QuadsSetSubsetFree(1, 0, 0, 0, 0, 1, 1, 1); - QuadContainerAddSprite(m_TeeQuadContainerIndex, -32.f, -16.f, 64.f, 32.f); - Graphics()->QuadsSetSubsetFree(1, 0, 0, 0, 0, 1, 1, 1); - QuadContainerAddSprite(m_TeeQuadContainerIndex, -32.f, -16.f, 64.f, 32.f); - - Graphics()->QuadContainerUpload(m_TeeQuadContainerIndex); -} - -void CRenderTools::SelectSprite(const CDataSprite *pSprite, int Flags) const -{ - int x = pSprite->m_X; - int y = pSprite->m_Y; - int w = pSprite->m_W; - int h = pSprite->m_H; - int cx = pSprite->m_pSet->m_Gridx; - int cy = pSprite->m_pSet->m_Gridy; - - GetSpriteScaleImpl(w, h, gs_SpriteWScale, gs_SpriteHScale); - - float x1 = x / (float)cx + 0.5f / (float)(cx * 32); - float x2 = (x + w) / (float)cx - 0.5f / (float)(cx * 32); - float y1 = y / (float)cy + 0.5f / (float)(cy * 32); - float y2 = (y + h) / (float)cy - 0.5f / (float)(cy * 32); - - if(Flags & SPRITE_FLAG_FLIP_Y) - std::swap(y1, y2); - - if(Flags & SPRITE_FLAG_FLIP_X) - std::swap(x1, x2); - - Graphics()->QuadsSetSubset(x1, y1, x2, y2); -} - -void CRenderTools::SelectSprite(int Id, int Flags) const -{ - dbg_assert(Id >= 0 && Id < g_pData->m_NumSprites, "Id invalid"); - SelectSprite(&g_pData->m_aSprites[Id], Flags); -} - -void CRenderTools::SelectSprite7(int Id, int Flags) const -{ - dbg_assert(Id >= 0 && Id < client_data7::g_pData->m_NumSprites, "Id invalid"); - SelectSprite(&client_data7::g_pData->m_aSprites[Id], Flags); -} - -void CRenderTools::GetSpriteScale(const CDataSprite *pSprite, float &ScaleX, float &ScaleY) const -{ - int w = pSprite->m_W; - int h = pSprite->m_H; - GetSpriteScaleImpl(w, h, ScaleX, ScaleY); -} - -void CRenderTools::GetSpriteScale(int Id, float &ScaleX, float &ScaleY) const -{ - GetSpriteScale(&g_pData->m_aSprites[Id], ScaleX, ScaleY); -} - -void CRenderTools::GetSpriteScaleImpl(int Width, int Height, float &ScaleX, float &ScaleY) const -{ - const float f = length(vec2(Width, Height)); - ScaleX = Width / f; - ScaleY = Height / f; -} - -void CRenderTools::DrawSprite(float x, float y, float Size) const -{ - IGraphics::CQuadItem QuadItem(x, y, Size * gs_SpriteWScale, Size * gs_SpriteHScale); - Graphics()->QuadsDraw(&QuadItem, 1); -} - -void CRenderTools::DrawSprite(float x, float y, float ScaledWidth, float ScaledHeight) const -{ - IGraphics::CQuadItem QuadItem(x, y, ScaledWidth, ScaledHeight); - Graphics()->QuadsDraw(&QuadItem, 1); -} - -void CRenderTools::RenderCursor(vec2 Center, float Size) const -{ - Graphics()->WrapClamp(); - Graphics()->TextureSet(g_pData->m_aImages[IMAGE_CURSOR].m_Id); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - IGraphics::CQuadItem QuadItem(Center.x, Center.y, Size, Size); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); - Graphics()->WrapNormal(); -} - -void CRenderTools::RenderIcon(int ImageId, int SpriteId, const CUIRect *pRect, const ColorRGBA *pColor) const -{ - Graphics()->TextureSet(g_pData->m_aImages[ImageId].m_Id); - Graphics()->QuadsBegin(); - SelectSprite(SpriteId); - if(pColor) - Graphics()->SetColor(pColor->r * pColor->a, pColor->g * pColor->a, pColor->b * pColor->a, pColor->a); - IGraphics::CQuadItem QuadItem(pRect->x, pRect->y, pRect->w, pRect->h); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); -} - -int CRenderTools::QuadContainerAddSprite(int QuadContainerIndex, float x, float y, float Size) const -{ - IGraphics::CQuadItem QuadItem(x, y, Size, Size); - return Graphics()->QuadContainerAddQuads(QuadContainerIndex, &QuadItem, 1); -} - -int CRenderTools::QuadContainerAddSprite(int QuadContainerIndex, float Size) const -{ - IGraphics::CQuadItem QuadItem(-(Size) / 2.f, -(Size) / 2.f, (Size), (Size)); - return Graphics()->QuadContainerAddQuads(QuadContainerIndex, &QuadItem, 1); -} - -int CRenderTools::QuadContainerAddSprite(int QuadContainerIndex, float Width, float Height) const -{ - IGraphics::CQuadItem QuadItem(-(Width) / 2.f, -(Height) / 2.f, (Width), (Height)); - return Graphics()->QuadContainerAddQuads(QuadContainerIndex, &QuadItem, 1); -} - -int CRenderTools::QuadContainerAddSprite(int QuadContainerIndex, float X, float Y, float Width, float Height) const -{ - IGraphics::CQuadItem QuadItem(X, Y, Width, Height); - return Graphics()->QuadContainerAddQuads(QuadContainerIndex, &QuadItem, 1); -} - -void CRenderTools::GetRenderTeeAnimScaleAndBaseSize(const CTeeRenderInfo *pInfo, float &AnimScale, float &BaseSize) -{ - AnimScale = pInfo->m_Size * 1.0f / 64.0f; - BaseSize = pInfo->m_Size; -} - -void CRenderTools::GetRenderTeeBodyScale(float BaseSize, float &BodyScale) -{ - BodyScale = g_Config.m_ClFatSkins ? BaseSize * 1.3f : BaseSize; - BodyScale /= 64.0f; -} - -void CRenderTools::GetRenderTeeFeetScale(float BaseSize, float &FeetScaleWidth, float &FeetScaleHeight) -{ - FeetScaleWidth = BaseSize / 64.0f; - FeetScaleHeight = (BaseSize / 2) / 32.0f; -} - -void CRenderTools::GetRenderTeeBodySize(const CAnimState *pAnim, const CTeeRenderInfo *pInfo, vec2 &BodyOffset, float &Width, float &Height) -{ - float AnimScale, BaseSize; - GetRenderTeeAnimScaleAndBaseSize(pInfo, AnimScale, BaseSize); - - float BodyScale; - GetRenderTeeBodyScale(BaseSize, BodyScale); - - Width = pInfo->m_SkinMetrics.m_Body.WidthNormalized() * 64.0f * BodyScale; - Height = pInfo->m_SkinMetrics.m_Body.HeightNormalized() * 64.0f * BodyScale; - BodyOffset.x = pInfo->m_SkinMetrics.m_Body.OffsetXNormalized() * 64.0f * BodyScale; - BodyOffset.y = pInfo->m_SkinMetrics.m_Body.OffsetYNormalized() * 64.0f * BodyScale; -} - -void CRenderTools::GetRenderTeeFeetSize(const CAnimState *pAnim, const CTeeRenderInfo *pInfo, vec2 &FeetOffset, float &Width, float &Height) -{ - float AnimScale, BaseSize; - GetRenderTeeAnimScaleAndBaseSize(pInfo, AnimScale, BaseSize); - - float FeetScaleWidth, FeetScaleHeight; - GetRenderTeeFeetScale(BaseSize, FeetScaleWidth, FeetScaleHeight); - - Width = pInfo->m_SkinMetrics.m_Feet.WidthNormalized() * 64.0f * FeetScaleWidth; - Height = pInfo->m_SkinMetrics.m_Feet.HeightNormalized() * 32.0f * FeetScaleHeight; - FeetOffset.x = pInfo->m_SkinMetrics.m_Feet.OffsetXNormalized() * 64.0f * FeetScaleWidth; - FeetOffset.y = pInfo->m_SkinMetrics.m_Feet.OffsetYNormalized() * 32.0f * FeetScaleHeight; -} - -void CRenderTools::GetRenderTeeOffsetToRenderedTee(const CAnimState *pAnim, const CTeeRenderInfo *pInfo, vec2 &TeeOffsetToMid) -{ - float AnimScale, BaseSize; - GetRenderTeeAnimScaleAndBaseSize(pInfo, AnimScale, BaseSize); - vec2 BodyPos = vec2(pAnim->GetBody()->m_X, pAnim->GetBody()->m_Y) * AnimScale; - - float AssumedScale = BaseSize / 64.0f; - - // just use the lowest feet - vec2 FeetPos; - const CAnimKeyframe *pFoot = pAnim->GetFrontFoot(); - FeetPos = vec2(pFoot->m_X * AnimScale, pFoot->m_Y * AnimScale); - pFoot = pAnim->GetBackFoot(); - FeetPos = vec2(FeetPos.x, maximum(FeetPos.y, pFoot->m_Y * AnimScale)); - - vec2 BodyOffset; - float BodyWidth, BodyHeight; - GetRenderTeeBodySize(pAnim, pInfo, BodyOffset, BodyWidth, BodyHeight); - - // -32 is the assumed min relative position for the quad - float MinY = -32.0f * AssumedScale; - // the body pos shifts the body away from center - MinY += BodyPos.y; - // the actual body is smaller though, because it doesn't use the full skin image in most cases - MinY += BodyOffset.y; - - vec2 FeetOffset; - float FeetWidth, FeetHeight; - GetRenderTeeFeetSize(pAnim, pInfo, FeetOffset, FeetWidth, FeetHeight); - - // MaxY builds up from the MinY - float MaxY = MinY + BodyHeight; - // if the body is smaller than the total feet offset, use feet - // since feet are smaller in height, respect the assumed relative position - MaxY = maximum(MaxY, (-16.0f * AssumedScale + FeetPos.y) + FeetOffset.y + FeetHeight); - - // now we got the full rendered size - float FullHeight = (MaxY - MinY); - - // next step is to calculate the offset that was created compared to the assumed relative position - float MidOfRendered = MinY + FullHeight / 2.0f; - - // TODO: x coordinate is ignored for now, bcs it's not really used yet anyway - TeeOffsetToMid.x = 0; - // negative value, because the calculation that uses this offset should work with addition. - TeeOffsetToMid.y = -MidOfRendered; -} - -void CRenderTools::RenderTee(const CAnimState *pAnim, const CTeeRenderInfo *pInfo, int Emote, vec2 Dir, vec2 Pos, float Alpha) const -{ - if(pInfo->m_aSixup[g_Config.m_ClDummy].m_aTextures[protocol7::SKINPART_BODY].IsValid()) - RenderTee7(pAnim, pInfo, Emote, Dir, Pos, Alpha); - else - RenderTee6(pAnim, pInfo, Emote, Dir, Pos, Alpha); - - Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); - Graphics()->QuadsSetRotation(0); -} - -void CRenderTools::RenderTee7(const CAnimState *pAnim, const CTeeRenderInfo *pInfo, int Emote, vec2 Dir, vec2 Pos, float Alpha) const -{ - vec2 Direction = Dir; - vec2 Position = Pos; - bool IsBot = false; - - // first pass we draw the outline - // second pass we draw the filling - for(int Pass = 0; Pass < 2; Pass++) - { - bool OutLine = Pass == 0; - - for(int Filling = 0; Filling < 2; Filling++) - { - float AnimScale = pInfo->m_Size * 1.0f / 64.0f; - float BaseSize = pInfo->m_Size; - if(Filling == 1) - { - vec2 BodyPos = Position + vec2(pAnim->GetBody()->m_X, pAnim->GetBody()->m_Y) * AnimScale; - IGraphics::CQuadItem BodyItem(BodyPos.x, BodyPos.y, BaseSize, BaseSize); - IGraphics::CQuadItem BotItem(BodyPos.x + (2.f / 3.f) * AnimScale, BodyPos.y + (-16 + 2.f / 3.f) * AnimScale, BaseSize, BaseSize); // x+0.66, y+0.66 to correct some rendering bug - IGraphics::CQuadItem Item; - - // draw bot visuals (background) - if(IsBot && !OutLine) - { - Graphics()->TextureSet(pInfo->m_aSixup[g_Config.m_ClDummy].m_BotTexture); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, Alpha); - SelectSprite7(client_data7::SPRITE_TEE_BOT_BACKGROUND); - Item = BotItem; - Graphics()->QuadsDraw(&Item, 1); - Graphics()->QuadsEnd(); - } - - // draw bot visuals (foreground) - if(IsBot && !OutLine) - { - Graphics()->TextureSet(pInfo->m_aSixup[g_Config.m_ClDummy].m_BotTexture); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, Alpha); - SelectSprite7(client_data7::SPRITE_TEE_BOT_FOREGROUND); - Item = BotItem; - Graphics()->QuadsDraw(&Item, 1); - ColorRGBA Color = pInfo->m_aSixup[g_Config.m_ClDummy].m_BotColor; - Color.a = Alpha; - Graphics()->SetColor(Color); - SelectSprite7(client_data7::SPRITE_TEE_BOT_GLOW); - Item = BotItem; - Graphics()->QuadsDraw(&Item, 1); - Graphics()->QuadsEnd(); - } - - // draw decoration - if(pInfo->m_aSixup[g_Config.m_ClDummy].m_aTextures[protocol7::SKINPART_DECORATION].IsValid()) - { - Graphics()->TextureSet(pInfo->m_aSixup[g_Config.m_ClDummy].m_aTextures[protocol7::SKINPART_DECORATION]); - Graphics()->QuadsBegin(); - Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle * pi * 2); - ColorRGBA Color = pInfo->m_aSixup[g_Config.m_ClDummy].m_aColors[protocol7::SKINPART_DECORATION]; - Color.a = Alpha; - Graphics()->SetColor(Color); - SelectSprite7(OutLine ? client_data7::SPRITE_TEE_DECORATION_OUTLINE : client_data7::SPRITE_TEE_DECORATION); - Item = BodyItem; - Graphics()->QuadsDraw(&Item, 1); - Graphics()->QuadsEnd(); - } - - // draw body (behind marking) - Graphics()->TextureSet(pInfo->m_aSixup[g_Config.m_ClDummy].m_aTextures[protocol7::SKINPART_BODY]); - Graphics()->QuadsBegin(); - Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle * pi * 2); - if(OutLine) - { - Graphics()->SetColor(1.0f, 1.0f, 1.0f, Alpha); - SelectSprite7(client_data7::SPRITE_TEE_BODY_OUTLINE); - } - else - { - ColorRGBA Color = pInfo->m_aSixup[g_Config.m_ClDummy].m_aColors[protocol7::SKINPART_BODY]; - Color.a = Alpha; - Graphics()->SetColor(Color); - SelectSprite7(client_data7::SPRITE_TEE_BODY); - } - Item = BodyItem; - Graphics()->QuadsDraw(&Item, 1); - Graphics()->QuadsEnd(); - - // draw marking - if(pInfo->m_aSixup[g_Config.m_ClDummy].m_aTextures[protocol7::SKINPART_MARKING].IsValid() && !OutLine) - { - Graphics()->TextureSet(pInfo->m_aSixup[g_Config.m_ClDummy].m_aTextures[protocol7::SKINPART_MARKING]); - Graphics()->QuadsBegin(); - Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle * pi * 2); - ColorRGBA MarkingColor = pInfo->m_aSixup[g_Config.m_ClDummy].m_aColors[protocol7::SKINPART_MARKING]; - Graphics()->SetColor(MarkingColor.r * MarkingColor.a, MarkingColor.g * MarkingColor.a, MarkingColor.b * MarkingColor.a, MarkingColor.a * Alpha); - SelectSprite7(client_data7::SPRITE_TEE_MARKING); - Item = BodyItem; - Graphics()->QuadsDraw(&Item, 1); - Graphics()->QuadsEnd(); - } - - // draw body (in front of marking) - if(!OutLine) - { - Graphics()->TextureSet(pInfo->m_aSixup[g_Config.m_ClDummy].m_aTextures[protocol7::SKINPART_BODY]); - Graphics()->QuadsBegin(); - Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle * pi * 2); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, Alpha); - for(int t = 0; t < 2; t++) - { - SelectSprite7(t == 0 ? client_data7::SPRITE_TEE_BODY_SHADOW : client_data7::SPRITE_TEE_BODY_UPPER_OUTLINE); - Item = BodyItem; - Graphics()->QuadsDraw(&Item, 1); - } - Graphics()->QuadsEnd(); - } - - // draw eyes - Graphics()->TextureSet(pInfo->m_aSixup[g_Config.m_ClDummy].m_aTextures[protocol7::SKINPART_EYES]); - Graphics()->QuadsBegin(); - Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle * pi * 2); - if(IsBot) - { - ColorRGBA Color = pInfo->m_aSixup[g_Config.m_ClDummy].m_BotColor; - Color.a = Alpha; - Graphics()->SetColor(Color); - Emote = EMOTE_SURPRISE; - } - else - { - ColorRGBA Color = pInfo->m_aSixup[g_Config.m_ClDummy].m_aColors[protocol7::SKINPART_EYES]; - Color.a = Alpha; - Graphics()->SetColor(Color); - } - if(Pass == 1) - { - switch(Emote) - { - case EMOTE_PAIN: - SelectSprite7(client_data7::SPRITE_TEE_EYES_PAIN); - break; - case EMOTE_HAPPY: - SelectSprite7(client_data7::SPRITE_TEE_EYES_HAPPY); - break; - case EMOTE_SURPRISE: - SelectSprite7(client_data7::SPRITE_TEE_EYES_SURPRISE); - break; - case EMOTE_ANGRY: - SelectSprite7(client_data7::SPRITE_TEE_EYES_ANGRY); - break; - default: - SelectSprite7(client_data7::SPRITE_TEE_EYES_NORMAL); - break; - } - - float EyeScale = BaseSize * 0.60f; - float h = Emote == EMOTE_BLINK ? BaseSize * 0.15f / 2.0f : EyeScale / 2.0f; - vec2 Offset = vec2(Direction.x * 0.125f, -0.05f + Direction.y * 0.10f) * BaseSize; - IGraphics::CQuadItem QuadItem(BodyPos.x + Offset.x, BodyPos.y + Offset.y, EyeScale, h); - Graphics()->QuadsDraw(&QuadItem, 1); - } - Graphics()->QuadsEnd(); - - // draw xmas hat - if(!OutLine && pInfo->m_aSixup[g_Config.m_ClDummy].m_HatTexture.IsValid()) - { - Graphics()->TextureSet(pInfo->m_aSixup[g_Config.m_ClDummy].m_HatTexture); - Graphics()->QuadsBegin(); - Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle * pi * 2); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, Alpha); - int Flag = Direction.x < 0.0f ? SPRITE_FLAG_FLIP_X : 0; - switch(pInfo->m_aSixup[g_Config.m_ClDummy].m_HatSpriteIndex) - { - case 0: - SelectSprite7(client_data7::SPRITE_TEE_HATS_TOP1, Flag); - break; - case 1: - SelectSprite7(client_data7::SPRITE_TEE_HATS_TOP2, Flag); - break; - case 2: - SelectSprite7(client_data7::SPRITE_TEE_HATS_SIDE1, Flag); - break; - case 3: - SelectSprite7(client_data7::SPRITE_TEE_HATS_SIDE2, Flag); - } - Item = BodyItem; - Graphics()->QuadsDraw(&Item, 1); - Graphics()->QuadsEnd(); - } - } - - // draw feet - Graphics()->TextureSet(pInfo->m_aSixup[g_Config.m_ClDummy].m_aTextures[protocol7::SKINPART_FEET]); - Graphics()->QuadsBegin(); - const CAnimKeyframe *pFoot = Filling ? pAnim->GetFrontFoot() : pAnim->GetBackFoot(); - - float w = BaseSize / 2.1f; - float h = w; - - Graphics()->QuadsSetRotation(pFoot->m_Angle * pi * 2); - - if(OutLine) - { - Graphics()->SetColor(1.0f, 1.0f, 1.0f, Alpha); - SelectSprite7(client_data7::SPRITE_TEE_FOOT_OUTLINE); - } - else - { - bool Indicate = !pInfo->m_GotAirJump && g_Config.m_ClAirjumpindicator; - float ColorScale = 1.0f; - if(Indicate) - ColorScale = 0.5f; - Graphics()->SetColor( - pInfo->m_aSixup[g_Config.m_ClDummy].m_aColors[protocol7::SKINPART_FEET].r * ColorScale, - pInfo->m_aSixup[g_Config.m_ClDummy].m_aColors[protocol7::SKINPART_FEET].g * ColorScale, - pInfo->m_aSixup[g_Config.m_ClDummy].m_aColors[protocol7::SKINPART_FEET].b * ColorScale, - pInfo->m_aSixup[g_Config.m_ClDummy].m_aColors[protocol7::SKINPART_FEET].a * Alpha); - SelectSprite7(client_data7::SPRITE_TEE_FOOT); - } - - IGraphics::CQuadItem QuadItem(Position.x + pFoot->m_X * AnimScale, Position.y + pFoot->m_Y * AnimScale, w, h); - Graphics()->QuadsDraw(&QuadItem, 1); - Graphics()->QuadsEnd(); - } - } -} - -void CRenderTools::RenderTee6(const CAnimState *pAnim, const CTeeRenderInfo *pInfo, int Emote, vec2 Dir, vec2 Pos, float Alpha) const -{ - vec2 Direction = Dir; - vec2 Position = Pos; - - const CSkin::SSkinTextures *pSkinTextures = pInfo->m_CustomColoredSkin ? &pInfo->m_ColorableRenderSkin : &pInfo->m_OriginalRenderSkin; - - // first pass we draw the outline - // second pass we draw the filling - for(int Pass = 0; Pass < 2; Pass++) - { - int OutLine = Pass == 0 ? 1 : 0; - - for(int Filling = 0; Filling < 2; Filling++) - { - float AnimScale, BaseSize; - GetRenderTeeAnimScaleAndBaseSize(pInfo, AnimScale, BaseSize); - if(Filling == 1) - { - Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle * pi * 2); - - // draw body - Graphics()->SetColor(pInfo->m_ColorBody.r, pInfo->m_ColorBody.g, pInfo->m_ColorBody.b, Alpha); - vec2 BodyPos = Position + vec2(pAnim->GetBody()->m_X, pAnim->GetBody()->m_Y) * AnimScale; - float BodyScale; - GetRenderTeeBodyScale(BaseSize, BodyScale); - Graphics()->TextureSet(OutLine == 1 ? pSkinTextures->m_BodyOutline : pSkinTextures->m_Body); - Graphics()->RenderQuadContainerAsSprite(m_TeeQuadContainerIndex, OutLine, BodyPos.x, BodyPos.y, BodyScale, BodyScale); - - // draw eyes - if(Pass == 1) - { - int QuadOffset = 2; - int EyeQuadOffset = 0; - int TeeEye = 0; - - switch(Emote) - { - case EMOTE_PAIN: - EyeQuadOffset = 0; - TeeEye = SPRITE_TEE_EYE_PAIN - SPRITE_TEE_EYE_NORMAL; - break; - case EMOTE_HAPPY: - EyeQuadOffset = 1; - TeeEye = SPRITE_TEE_EYE_HAPPY - SPRITE_TEE_EYE_NORMAL; - break; - case EMOTE_SURPRISE: - EyeQuadOffset = 2; - TeeEye = SPRITE_TEE_EYE_SURPRISE - SPRITE_TEE_EYE_NORMAL; - break; - case EMOTE_ANGRY: - EyeQuadOffset = 3; - TeeEye = SPRITE_TEE_EYE_ANGRY - SPRITE_TEE_EYE_NORMAL; - break; - default: - EyeQuadOffset = 4; - break; - } - - float EyeScale = BaseSize * 0.40f; - float h = Emote == EMOTE_BLINK ? BaseSize * 0.15f : EyeScale; - float EyeSeparation = (0.075f - 0.010f * absolute(Direction.x)) * BaseSize; - vec2 Offset = vec2(Direction.x * 0.125f, -0.05f + Direction.y * 0.10f) * BaseSize; - - Graphics()->TextureSet(pSkinTextures->m_aEyes[TeeEye]); - Graphics()->RenderQuadContainerAsSprite(m_TeeQuadContainerIndex, QuadOffset + EyeQuadOffset, BodyPos.x - EyeSeparation + Offset.x, BodyPos.y + Offset.y, EyeScale / (64.f * 0.4f), h / (64.f * 0.4f)); - Graphics()->RenderQuadContainerAsSprite(m_TeeQuadContainerIndex, QuadOffset + EyeQuadOffset, BodyPos.x + EyeSeparation + Offset.x, BodyPos.y + Offset.y, -EyeScale / (64.f * 0.4f), h / (64.f * 0.4f)); - } - } - - // draw feet - const CAnimKeyframe *pFoot = Filling ? pAnim->GetFrontFoot() : pAnim->GetBackFoot(); - - float w = BaseSize; - float h = BaseSize / 2; - - int QuadOffset = 7; - if(Dir.x < 0 && pInfo->m_FeetFlipped) - { - QuadOffset += 2; - } - - Graphics()->QuadsSetRotation(pFoot->m_Angle * pi * 2); - - bool Indicate = !pInfo->m_GotAirJump && g_Config.m_ClAirjumpindicator; - float ColorScale = 1.0f; - - if(!OutLine) - { - ++QuadOffset; - if(Indicate) - ColorScale = 0.5f; - } - - Graphics()->SetColor(pInfo->m_ColorFeet.r * ColorScale, pInfo->m_ColorFeet.g * ColorScale, pInfo->m_ColorFeet.b * ColorScale, Alpha); - - Graphics()->TextureSet(OutLine == 1 ? pSkinTextures->m_FeetOutline : pSkinTextures->m_Feet); - Graphics()->RenderQuadContainerAsSprite(m_TeeQuadContainerIndex, QuadOffset, Position.x + pFoot->m_X * AnimScale, Position.y + pFoot->m_Y * AnimScale, w / 64.f, h / 32.f); - } - } -} - -void CRenderTools::CalcScreenParams(float Aspect, float Zoom, float *pWidth, float *pHeight) -{ - const float Amount = 1150 * 1000; - const float WMax = 1500; - const float HMax = 1050; - - const float f = std::sqrt(Amount) / std::sqrt(Aspect); - *pWidth = f * Aspect; - *pHeight = f; - - // limit the view - if(*pWidth > WMax) - { - *pWidth = WMax; - *pHeight = *pWidth / Aspect; - } - - if(*pHeight > HMax) - { - *pHeight = HMax; - *pWidth = *pHeight * Aspect; - } - - *pWidth *= Zoom; - *pHeight *= Zoom; -} - -void CRenderTools::MapScreenToWorld(float CenterX, float CenterY, float ParallaxX, float ParallaxY, - float ParallaxZoom, float OffsetX, float OffsetY, float Aspect, float Zoom, float *pPoints) -{ - float Width, Height; - CalcScreenParams(Aspect, Zoom, &Width, &Height); - - float Scale = (ParallaxZoom * (Zoom - 1.0f) + 100.0f) / 100.0f / Zoom; - Width *= Scale; - Height *= Scale; - - CenterX *= ParallaxX / 100.0f; - CenterY *= ParallaxY / 100.0f; - pPoints[0] = OffsetX + CenterX - Width / 2; - pPoints[1] = OffsetY + CenterY - Height / 2; - pPoints[2] = pPoints[0] + Width; - pPoints[3] = pPoints[1] + Height; -} - -void CRenderTools::MapScreenToGroup(float CenterX, float CenterY, CMapItemGroup *pGroup, float Zoom) -{ - float ParallaxZoom = clamp((double)(maximum(pGroup->m_ParallaxX, pGroup->m_ParallaxY)), 0., 100.); - float aPoints[4]; - MapScreenToWorld(CenterX, CenterY, pGroup->m_ParallaxX, pGroup->m_ParallaxY, ParallaxZoom, - pGroup->m_OffsetX, pGroup->m_OffsetY, Graphics()->ScreenAspect(), Zoom, aPoints); - Graphics()->MapScreen(aPoints[0], aPoints[1], aPoints[2], aPoints[3]); -} - -void CRenderTools::MapScreenToInterface(float CenterX, float CenterY) -{ - float aPoints[4]; - MapScreenToWorld(CenterX, CenterY, 100.0f, 100.0f, 100.0f, - 0, 0, Graphics()->ScreenAspect(), 1.0f, aPoints); - Graphics()->MapScreen(aPoints[0], aPoints[1], aPoints[2], aPoints[3]); -} diff --git a/src/game/client/render.h b/src/game/client/render.h deleted file mode 100644 index 12f40c3f8d..0000000000 --- a/src/game/client/render.h +++ /dev/null @@ -1,265 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_RENDER_H -#define GAME_CLIENT_RENDER_H - -#include - -#include -#include - -#include -#include -#include - -class CAnimState; -class CSpeedupTile; -class CSwitchTile; -class CTeleTile; -class CTile; -class CTuneTile; -namespace client_data7 { -struct CDataSprite; -} -struct CDataSprite; -struct CEnvPoint; -struct CEnvPointBezier; -struct CEnvPointBezier_upstream; -struct CMapItemGroup; -struct CQuad; - -#include - -class CTeeRenderInfo -{ -public: - CTeeRenderInfo() - { - Reset(); - } - - void Reset() - { - m_OriginalRenderSkin.Reset(); - m_ColorableRenderSkin.Reset(); - m_SkinMetrics.Reset(); - m_CustomColoredSkin = false; - m_BloodColor = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - m_ColorBody = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - m_ColorFeet = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - m_Size = 1.0f; - m_GotAirJump = true; - m_TeeRenderFlags = 0; - m_FeetFlipped = false; - - for(auto &Sixup : m_aSixup) - Sixup.Reset(); - } - - void Apply(const CSkin *pSkin) - { - m_OriginalRenderSkin = pSkin->m_OriginalSkin; - m_ColorableRenderSkin = pSkin->m_ColorableSkin; - m_BloodColor = pSkin->m_BloodColor; - m_SkinMetrics = pSkin->m_Metrics; - } - - void ApplyColors(bool CustomColoredSkin, int ColorBody, int ColorFeet) - { - m_CustomColoredSkin = CustomColoredSkin; - if(CustomColoredSkin) - { - m_ColorBody = color_cast(ColorHSLA(ColorBody).UnclampLighting(ColorHSLA::DARKEST_LGT)); - m_ColorFeet = color_cast(ColorHSLA(ColorFeet).UnclampLighting(ColorHSLA::DARKEST_LGT)); - } - else - { - m_ColorBody = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - m_ColorFeet = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - } - } - - CSkin::SSkinTextures m_OriginalRenderSkin; - CSkin::SSkinTextures m_ColorableRenderSkin; - - CSkin::SSkinMetrics m_SkinMetrics; - - bool m_CustomColoredSkin; - ColorRGBA m_BloodColor; - - ColorRGBA m_ColorBody; - ColorRGBA m_ColorFeet; - float m_Size; - bool m_GotAirJump; - int m_TeeRenderFlags; - bool m_FeetFlipped; - - bool Valid() const - { - return m_CustomColoredSkin ? m_ColorableRenderSkin.m_Body.IsValid() : m_OriginalRenderSkin.m_Body.IsValid(); - } - - class CSixup - { - public: - void Reset() - { - for(auto &Texture : m_aTextures) - Texture = IGraphics::CTextureHandle(); - m_BotTexture = IGraphics::CTextureHandle(); - for(ColorRGBA &PartColor : m_aColors) - { - PartColor = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - } - m_HatSpriteIndex = 0; - m_BotColor = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - } - bool Valid() const - { - for(const auto &Texture : m_aTextures) - if(!Texture.IsValid()) - return false; - return true; - } - - IGraphics::CTextureHandle m_aTextures[protocol7::NUM_SKINPARTS]; - ColorRGBA m_aColors[protocol7::NUM_SKINPARTS]; - IGraphics::CTextureHandle m_HatTexture; - IGraphics::CTextureHandle m_BotTexture; - int m_HatSpriteIndex; - ColorRGBA m_BotColor; - }; - - CSixup m_aSixup[NUM_DUMMIES]; -}; - -// Tee Render Flags -enum -{ - TEE_EFFECT_FROZEN = 1, - TEE_NO_WEAPON = 2, - TEE_EFFECT_SPARKLE = 4, -}; - -// sprite renderings -enum -{ - SPRITE_FLAG_FLIP_Y = 1, - SPRITE_FLAG_FLIP_X = 2, - - LAYERRENDERFLAG_OPAQUE = 1, - LAYERRENDERFLAG_TRANSPARENT = 2, - - TILERENDERFLAG_EXTEND = 4, -}; - -class IEnvelopePointAccess -{ -public: - virtual ~IEnvelopePointAccess() = default; - virtual int NumPoints() const = 0; - virtual const CEnvPoint *GetPoint(int Index) const = 0; - virtual const CEnvPointBezier *GetBezier(int Index) const = 0; -}; - -class CMapBasedEnvelopePointAccess : public IEnvelopePointAccess -{ - int m_StartPoint; - int m_NumPoints; - int m_NumPointsMax; - CEnvPoint *m_pPoints; - CEnvPointBezier *m_pPointsBezier; - CEnvPointBezier_upstream *m_pPointsBezierUpstream; - -public: - CMapBasedEnvelopePointAccess(class CDataFileReader *pReader); - CMapBasedEnvelopePointAccess(class IMap *pMap); - void SetPointsRange(int StartPoint, int NumPoints); - int StartPoint() const; - int NumPoints() const override; - int NumPointsMax() const; - const CEnvPoint *GetPoint(int Index) const override; - const CEnvPointBezier *GetBezier(int Index) const override; -}; - -typedef void (*ENVELOPE_EVAL)(int TimeOffsetMillis, int Env, ColorRGBA &Result, size_t Channels, void *pUser); - -class CRenderTools -{ - class IGraphics *m_pGraphics; - class ITextRender *m_pTextRender; - - int m_TeeQuadContainerIndex; - - static void GetRenderTeeBodyScale(float BaseSize, float &BodyScale); - static void GetRenderTeeFeetScale(float BaseSize, float &FeetScaleWidth, float &FeetScaleHeight); - - void SelectSprite(const CDataSprite *pSprite, int Flags) const; - - void RenderTee6(const CAnimState *pAnim, const CTeeRenderInfo *pInfo, int Emote, vec2 Dir, vec2 Pos, float Alpha = 1.0f) const; - void RenderTee7(const CAnimState *pAnim, const CTeeRenderInfo *pInfo, int Emote, vec2 Dir, vec2 Pos, float Alpha = 1.0f) const; - -public: - class IGraphics *Graphics() const { return m_pGraphics; } - class ITextRender *TextRender() const { return m_pTextRender; } - - void Init(class IGraphics *pGraphics, class ITextRender *pTextRender); - - void SelectSprite(int Id, int Flags = 0) const; - void SelectSprite7(int Id, int Flags = 0) const; - - void GetSpriteScale(const CDataSprite *pSprite, float &ScaleX, float &ScaleY) const; - void GetSpriteScale(int Id, float &ScaleX, float &ScaleY) const; - void GetSpriteScaleImpl(int Width, int Height, float &ScaleX, float &ScaleY) const; - - void DrawSprite(float x, float y, float Size) const; - void DrawSprite(float x, float y, float ScaledWidth, float ScaledHeight) const; - void RenderCursor(vec2 Center, float Size) const; - void RenderIcon(int ImageId, int SpriteId, const CUIRect *pRect, const ColorRGBA *pColor = nullptr) const; - int QuadContainerAddSprite(int QuadContainerIndex, float x, float y, float Size) const; - int QuadContainerAddSprite(int QuadContainerIndex, float Size) const; - int QuadContainerAddSprite(int QuadContainerIndex, float Width, float Height) const; - int QuadContainerAddSprite(int QuadContainerIndex, float X, float Y, float Width, float Height) const; - - // larger rendering methods - static void GetRenderTeeBodySize(const CAnimState *pAnim, const CTeeRenderInfo *pInfo, vec2 &BodyOffset, float &Width, float &Height); - static void GetRenderTeeFeetSize(const CAnimState *pAnim, const CTeeRenderInfo *pInfo, vec2 &FeetOffset, float &Width, float &Height); - static void GetRenderTeeAnimScaleAndBaseSize(const CTeeRenderInfo *pInfo, float &AnimScale, float &BaseSize); - - // returns the offset to use, to render the tee with @see RenderTee exactly in the mid - static void GetRenderTeeOffsetToRenderedTee(const CAnimState *pAnim, const CTeeRenderInfo *pInfo, vec2 &TeeOffsetToMid); - // object render methods - void RenderTee(const CAnimState *pAnim, const CTeeRenderInfo *pInfo, int Emote, vec2 Dir, vec2 Pos, float Alpha = 1.0f) const; - - // map render methods (render_map.cpp) - static void RenderEvalEnvelope(const IEnvelopePointAccess *pPoints, std::chrono::nanoseconds TimeNanos, ColorRGBA &Result, size_t Channels); - void RenderQuads(CQuad *pQuads, int NumQuads, int Flags, ENVELOPE_EVAL pfnEval, void *pUser) const; - void ForceRenderQuads(CQuad *pQuads, int NumQuads, int Flags, ENVELOPE_EVAL pfnEval, void *pUser, float Alpha = 1.0f) const; - void RenderTilemap(CTile *pTiles, int w, int h, float Scale, ColorRGBA Color, int RenderFlags) const; - - // render a rectangle made of IndexIn tiles, over a background made of IndexOut tiles - // the rectangle include all tiles in [RectX, RectX+RectW-1] x [RectY, RectY+RectH-1] - void RenderTileRectangle(int RectX, int RectY, int RectW, int RectH, unsigned char IndexIn, unsigned char IndexOut, float Scale, ColorRGBA Color, int RenderFlags) const; - - void RenderTile(int x, int y, unsigned char Index, float Scale, ColorRGBA Color) const; - - // helpers - void CalcScreenParams(float Aspect, float Zoom, float *pWidth, float *pHeight); - void MapScreenToWorld(float CenterX, float CenterY, float ParallaxX, float ParallaxY, - float ParallaxZoom, float OffsetX, float OffsetY, float Aspect, float Zoom, float *pPoints); - void MapScreenToGroup(float CenterX, float CenterY, CMapItemGroup *pGroup, float Zoom); - void MapScreenToInterface(float CenterX, float CenterY); - - // DDRace - - void RenderTeleOverlay(CTeleTile *pTele, int w, int h, float Scale, float Alpha = 1.0f) const; - void RenderSpeedupOverlay(CSpeedupTile *pSpeedup, int w, int h, float Scale, float Alpha = 1.0f) const; - void RenderSwitchOverlay(CSwitchTile *pSwitch, int w, int h, float Scale, float Alpha = 1.0f) const; - void RenderTuneOverlay(CTuneTile *pTune, int w, int h, float Scale, float Alpha = 1.0f) const; - void RenderTelemap(CTeleTile *pTele, int w, int h, float Scale, ColorRGBA Color, int RenderFlags) const; - void RenderSpeedupmap(CSpeedupTile *pSpeedup, int w, int h, float Scale, ColorRGBA Color, int RenderFlags) const; - void RenderSwitchmap(CSwitchTile *pSwitch, int w, int h, float Scale, ColorRGBA Color, int RenderFlags) const; - void RenderTunemap(CTuneTile *pTune, int w, int h, float Scale, ColorRGBA Color, int RenderFlags) const; -}; - -#endif diff --git a/src/game/client/render_map.cpp b/src/game/client/render_map.cpp deleted file mode 100644 index b438d8b1e3..0000000000 --- a/src/game/client/render_map.cpp +++ /dev/null @@ -1,1476 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include - -#include -#include -#include - -#include -#include -#include - -#include "render.h" - -#include - -#include -#include - -#include -#include - -using namespace std::chrono_literals; - -CMapBasedEnvelopePointAccess::CMapBasedEnvelopePointAccess(CDataFileReader *pReader) -{ - bool FoundBezierEnvelope = false; - int EnvStart, EnvNum; - pReader->GetType(MAPITEMTYPE_ENVELOPE, &EnvStart, &EnvNum); - for(int EnvIndex = 0; EnvIndex < EnvNum; EnvIndex++) - { - CMapItemEnvelope *pEnvelope = static_cast(pReader->GetItem(EnvStart + EnvIndex)); - if(pEnvelope->m_Version >= CMapItemEnvelope_v3::CURRENT_VERSION) - { - FoundBezierEnvelope = true; - break; - } - } - - if(FoundBezierEnvelope) - { - m_pPoints = nullptr; - m_pPointsBezier = nullptr; - - int EnvPointStart, FakeEnvPointNum; - pReader->GetType(MAPITEMTYPE_ENVPOINTS, &EnvPointStart, &FakeEnvPointNum); - if(FakeEnvPointNum > 0) - m_pPointsBezierUpstream = static_cast(pReader->GetItem(EnvPointStart)); - else - m_pPointsBezierUpstream = nullptr; - - m_NumPointsMax = pReader->GetItemSize(EnvPointStart) / sizeof(CEnvPointBezier_upstream); - } - else - { - int EnvPointStart, FakeEnvPointNum; - pReader->GetType(MAPITEMTYPE_ENVPOINTS, &EnvPointStart, &FakeEnvPointNum); - if(FakeEnvPointNum > 0) - m_pPoints = static_cast(pReader->GetItem(EnvPointStart)); - else - m_pPoints = nullptr; - - m_NumPointsMax = pReader->GetItemSize(EnvPointStart) / sizeof(CEnvPoint); - - int EnvPointBezierStart, FakeEnvPointBezierNum; - pReader->GetType(MAPITEMTYPE_ENVPOINTS_BEZIER, &EnvPointBezierStart, &FakeEnvPointBezierNum); - const int NumPointsBezier = pReader->GetItemSize(EnvPointBezierStart) / sizeof(CEnvPointBezier); - if(FakeEnvPointBezierNum > 0 && m_NumPointsMax == NumPointsBezier) - m_pPointsBezier = static_cast(pReader->GetItem(EnvPointBezierStart)); - else - m_pPointsBezier = nullptr; - - m_pPointsBezierUpstream = nullptr; - } - - SetPointsRange(0, m_NumPointsMax); -} - -CMapBasedEnvelopePointAccess::CMapBasedEnvelopePointAccess(IMap *pMap) : - CMapBasedEnvelopePointAccess(static_cast(pMap)->GetReader()) -{ -} - -void CMapBasedEnvelopePointAccess::SetPointsRange(int StartPoint, int NumPoints) -{ - m_StartPoint = clamp(StartPoint, 0, m_NumPointsMax); - m_NumPoints = clamp(NumPoints, 0, maximum(m_NumPointsMax - StartPoint, 0)); -} - -int CMapBasedEnvelopePointAccess::StartPoint() const -{ - return m_StartPoint; -} - -int CMapBasedEnvelopePointAccess::NumPoints() const -{ - return m_NumPoints; -} - -int CMapBasedEnvelopePointAccess::NumPointsMax() const -{ - return m_NumPointsMax; -} - -const CEnvPoint *CMapBasedEnvelopePointAccess::GetPoint(int Index) const -{ - if(Index < 0 || Index >= m_NumPoints) - return nullptr; - if(m_pPoints != nullptr) - return &m_pPoints[Index + m_StartPoint]; - if(m_pPointsBezierUpstream != nullptr) - return &m_pPointsBezierUpstream[Index + m_StartPoint]; - return nullptr; -} - -const CEnvPointBezier *CMapBasedEnvelopePointAccess::GetBezier(int Index) const -{ - if(Index < 0 || Index >= m_NumPoints) - return nullptr; - if(m_pPointsBezier != nullptr) - return &m_pPointsBezier[Index + m_StartPoint]; - if(m_pPointsBezierUpstream != nullptr) - return &m_pPointsBezierUpstream[Index + m_StartPoint].m_Bezier; - return nullptr; -} - -static double CubicRoot(double x) -{ - if(x == 0.0) - return 0.0; - else if(x < 0.0) - return -std::exp(std::log(-x) / 3.0); - else - return std::exp(std::log(x) / 3.0); -} - -static float SolveBezier(float x, float p0, float p1, float p2, float p3) -{ - const double x3 = -p0 + 3.0 * p1 - 3.0 * p2 + p3; - const double x2 = 3.0 * p0 - 6.0 * p1 + 3.0 * p2; - const double x1 = -3.0 * p0 + 3.0 * p1; - const double x0 = p0 - x; - - if(x3 == 0.0 && x2 == 0.0) - { - // linear - // a * t + b = 0 - const double a = x1; - const double b = x0; - - if(a == 0.0) - return 0.0f; - return -b / a; - } - else if(x3 == 0.0) - { - // quadratic - // t * t + b * t + c = 0 - const double b = x1 / x2; - const double c = x0 / x2; - - if(c == 0.0) - return 0.0f; - - const double D = b * b - 4.0 * c; - const double SqrtD = std::sqrt(D); - - const double t = (-b + SqrtD) / 2.0; - - if(0.0 <= t && t <= 1.0001) - return t; - return (-b - SqrtD) / 2.0; - } - else - { - // cubic - // t * t * t + a * t * t + b * t * t + c = 0 - const double a = x2 / x3; - const double b = x1 / x3; - const double c = x0 / x3; - - // substitute t = y - a / 3 - const double sub = a / 3.0; - - // depressed form x^3 + px + q = 0 - // cardano's method - const double p = b / 3.0 - a * a / 9.0; - const double q = (2.0 * a * a * a / 27.0 - a * b / 3.0 + c) / 2.0; - - const double D = q * q + p * p * p; - - if(D > 0.0) - { - // only one 'real' solution - const double s = std::sqrt(D); - return CubicRoot(s - q) - CubicRoot(s + q) - sub; - } - else if(D == 0.0) - { - // one single, one double solution or triple solution - const double s = CubicRoot(-q); - const double t = 2.0 * s - sub; - - if(0.0 <= t && t <= 1.0001) - return t; - return (-s - sub); - } - else - { - // Casus irreducibilis ... ,_, - const double phi = std::acos(-q / std::sqrt(-(p * p * p))) / 3.0; - const double s = 2.0 * std::sqrt(-p); - - const double t1 = s * std::cos(phi) - sub; - - if(0.0 <= t1 && t1 <= 1.0001) - return t1; - - const double t2 = -s * std::cos(phi + pi / 3.0) - sub; - - if(0.0 <= t2 && t2 <= 1.0001) - return t2; - return -s * std::cos(phi - pi / 3.0) - sub; - } - } -} - -void CRenderTools::RenderEvalEnvelope(const IEnvelopePointAccess *pPoints, std::chrono::nanoseconds TimeNanos, ColorRGBA &Result, size_t Channels) -{ - const int NumPoints = pPoints->NumPoints(); - if(NumPoints == 0) - { - return; - } - - if(NumPoints == 1) - { - const CEnvPoint *pFirstPoint = pPoints->GetPoint(0); - for(size_t c = 0; c < Channels; c++) - { - Result[c] = fx2f(pFirstPoint->m_aValues[c]); - } - return; - } - - const CEnvPoint *pLastPoint = pPoints->GetPoint(NumPoints - 1); - const int64_t MaxPointTime = (int64_t)pLastPoint->m_Time * std::chrono::nanoseconds(1ms).count(); - if(MaxPointTime > 0) // TODO: remove this check when implementing a IO check for maps(in this case broken envelopes) - TimeNanos = std::chrono::nanoseconds(TimeNanos.count() % MaxPointTime); - else - TimeNanos = decltype(TimeNanos)::zero(); - - const double TimeMillis = TimeNanos.count() / (double)std::chrono::nanoseconds(1ms).count(); - for(int i = 0; i < NumPoints - 1; i++) - { - const CEnvPoint *pCurrentPoint = pPoints->GetPoint(i); - const CEnvPoint *pNextPoint = pPoints->GetPoint(i + 1); - if(TimeMillis >= pCurrentPoint->m_Time && TimeMillis < pNextPoint->m_Time) - { - const float Delta = pNextPoint->m_Time - pCurrentPoint->m_Time; - float a = (float)(TimeMillis - pCurrentPoint->m_Time) / Delta; - - switch(pCurrentPoint->m_Curvetype) - { - case CURVETYPE_STEP: - a = 0.0f; - break; - - case CURVETYPE_SLOW: - a = a * a * a; - break; - - case CURVETYPE_FAST: - a = 1.0f - a; - a = 1.0f - a * a * a; - break; - - case CURVETYPE_SMOOTH: - a = -2.0f * a * a * a + 3.0f * a * a; // second hermite basis - break; - - case CURVETYPE_BEZIER: - { - const CEnvPointBezier *pCurrentPointBezier = pPoints->GetBezier(i); - const CEnvPointBezier *pNextPointBezier = pPoints->GetBezier(i + 1); - if(pCurrentPointBezier == nullptr || pNextPointBezier == nullptr) - break; // fallback to linear - for(size_t c = 0; c < Channels; c++) - { - // monotonic 2d cubic bezier curve - const vec2 p0 = vec2(pCurrentPoint->m_Time, fx2f(pCurrentPoint->m_aValues[c])); - const vec2 p3 = vec2(pNextPoint->m_Time, fx2f(pNextPoint->m_aValues[c])); - - const vec2 OutTang = vec2(pCurrentPointBezier->m_aOutTangentDeltaX[c], fx2f(pCurrentPointBezier->m_aOutTangentDeltaY[c])); - const vec2 InTang = vec2(pNextPointBezier->m_aInTangentDeltaX[c], fx2f(pNextPointBezier->m_aInTangentDeltaY[c])); - - vec2 p1 = p0 + OutTang; - vec2 p2 = p3 + InTang; - - // validate bezier curve - p1.x = clamp(p1.x, p0.x, p3.x); - p2.x = clamp(p2.x, p0.x, p3.x); - - // solve x(a) = time for a - a = clamp(SolveBezier(TimeMillis, p0.x, p1.x, p2.x, p3.x), 0.0f, 1.0f); - - // value = y(t) - Result[c] = bezier(p0.y, p1.y, p2.y, p3.y, a); - } - return; - } - - case CURVETYPE_LINEAR: [[fallthrough]]; - default: - break; - } - - for(size_t c = 0; c < Channels; c++) - { - const float v0 = fx2f(pCurrentPoint->m_aValues[c]); - const float v1 = fx2f(pNextPoint->m_aValues[c]); - Result[c] = v0 + (v1 - v0) * a; - } - - return; - } - } - - for(size_t c = 0; c < Channels; c++) - { - Result[c] = fx2f(pLastPoint->m_aValues[c]); - } -} - -static void Rotate(const CPoint *pCenter, CPoint *pPoint, float Rotation) -{ - int x = pPoint->x - pCenter->x; - int y = pPoint->y - pCenter->y; - pPoint->x = (int)(x * std::cos(Rotation) - y * std::sin(Rotation) + pCenter->x); - pPoint->y = (int)(x * std::sin(Rotation) + y * std::cos(Rotation) + pCenter->y); -} - -void CRenderTools::RenderQuads(CQuad *pQuads, int NumQuads, int RenderFlags, ENVELOPE_EVAL pfnEval, void *pUser) const -{ - if(!g_Config.m_ClShowQuads || g_Config.m_ClOverlayEntities == 100) - return; - - ForceRenderQuads(pQuads, NumQuads, RenderFlags, pfnEval, pUser, (100 - g_Config.m_ClOverlayEntities) / 100.0f); -} - -void CRenderTools::ForceRenderQuads(CQuad *pQuads, int NumQuads, int RenderFlags, ENVELOPE_EVAL pfnEval, void *pUser, float Alpha) const -{ - Graphics()->TrianglesBegin(); - float Conv = 1 / 255.0f; - for(int i = 0; i < NumQuads; i++) - { - CQuad *pQuad = &pQuads[i]; - - ColorRGBA Color = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - pfnEval(pQuad->m_ColorEnvOffset, pQuad->m_ColorEnv, Color, 4, pUser); - - if(Color.a <= 0.0f) - continue; - - bool Opaque = false; - /* TODO: Analyze quadtexture - if(a < 0.01f || (q->m_aColors[0].a < 0.01f && q->m_aColors[1].a < 0.01f && q->m_aColors[2].a < 0.01f && q->m_aColors[3].a < 0.01f)) - Opaque = true; - */ - if(Opaque && !(RenderFlags & LAYERRENDERFLAG_OPAQUE)) - continue; - if(!Opaque && !(RenderFlags & LAYERRENDERFLAG_TRANSPARENT)) - continue; - - Graphics()->QuadsSetSubsetFree( - fx2f(pQuad->m_aTexcoords[0].x), fx2f(pQuad->m_aTexcoords[0].y), - fx2f(pQuad->m_aTexcoords[1].x), fx2f(pQuad->m_aTexcoords[1].y), - fx2f(pQuad->m_aTexcoords[2].x), fx2f(pQuad->m_aTexcoords[2].y), - fx2f(pQuad->m_aTexcoords[3].x), fx2f(pQuad->m_aTexcoords[3].y)); - - ColorRGBA Position = ColorRGBA(0.0f, 0.0f, 0.0f, 0.0f); - pfnEval(pQuad->m_PosEnvOffset, pQuad->m_PosEnv, Position, 3, pUser); - const vec2 Offset = vec2(Position.r, Position.g); - const float Rotation = Position.b / 180.0f * pi; - - IGraphics::CColorVertex Array[4] = { - IGraphics::CColorVertex(0, pQuad->m_aColors[0].r * Conv * Color.r, pQuad->m_aColors[0].g * Conv * Color.g, pQuad->m_aColors[0].b * Conv * Color.b, pQuad->m_aColors[0].a * Conv * Color.a * Alpha), - IGraphics::CColorVertex(1, pQuad->m_aColors[1].r * Conv * Color.r, pQuad->m_aColors[1].g * Conv * Color.g, pQuad->m_aColors[1].b * Conv * Color.b, pQuad->m_aColors[1].a * Conv * Color.a * Alpha), - IGraphics::CColorVertex(2, pQuad->m_aColors[2].r * Conv * Color.r, pQuad->m_aColors[2].g * Conv * Color.g, pQuad->m_aColors[2].b * Conv * Color.b, pQuad->m_aColors[2].a * Conv * Color.a * Alpha), - IGraphics::CColorVertex(3, pQuad->m_aColors[3].r * Conv * Color.r, pQuad->m_aColors[3].g * Conv * Color.g, pQuad->m_aColors[3].b * Conv * Color.b, pQuad->m_aColors[3].a * Conv * Color.a * Alpha)}; - Graphics()->SetColorVertex(Array, 4); - - CPoint *pPoints = pQuad->m_aPoints; - - CPoint aRotated[4]; - if(Rotation != 0.0f) - { - for(size_t p = 0; p < std::size(aRotated); ++p) - { - aRotated[p] = pQuad->m_aPoints[p]; - Rotate(&pQuad->m_aPoints[4], &aRotated[p], Rotation); - } - pPoints = aRotated; - } - - IGraphics::CFreeformItem Freeform( - fx2f(pPoints[0].x) + Offset.x, fx2f(pPoints[0].y) + Offset.y, - fx2f(pPoints[1].x) + Offset.x, fx2f(pPoints[1].y) + Offset.y, - fx2f(pPoints[2].x) + Offset.x, fx2f(pPoints[2].y) + Offset.y, - fx2f(pPoints[3].x) + Offset.x, fx2f(pPoints[3].y) + Offset.y); - Graphics()->QuadsDrawFreeform(&Freeform, 1); - } - Graphics()->TrianglesEnd(); -} - -void CRenderTools::RenderTileRectangle(int RectX, int RectY, int RectW, int RectH, - unsigned char IndexIn, unsigned char IndexOut, - float Scale, ColorRGBA Color, int RenderFlags) const -{ - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - - // calculate the final pixelsize for the tiles - float TilePixelSize = 1024 / 32.0f; - float FinalTileSize = Scale / (ScreenX1 - ScreenX0) * Graphics()->ScreenWidth(); - float FinalTilesetScale = FinalTileSize / TilePixelSize; - - if(Graphics()->HasTextureArraysSupport()) - Graphics()->QuadsTex3DBegin(); - else - Graphics()->QuadsBegin(); - Graphics()->SetColor(Color); - - int StartY = (int)(ScreenY0 / Scale) - 1; - int StartX = (int)(ScreenX0 / Scale) - 1; - int EndY = (int)(ScreenY1 / Scale) + 1; - int EndX = (int)(ScreenX1 / Scale) + 1; - - // adjust the texture shift according to mipmap level - float TexSize = 1024.0f; - float Frac = (1.25f / TexSize) * (1 / FinalTilesetScale); - float Nudge = (0.5f / TexSize) * (1 / FinalTilesetScale); - - for(int y = StartY; y < EndY; y++) - { - for(int x = StartX; x < EndX; x++) - { - unsigned char Index = (x >= RectX && x < RectX + RectW && y >= RectY && y < RectY + RectH) ? IndexIn : IndexOut; - if(Index) - { - bool Render = false; - if(RenderFlags & LAYERRENDERFLAG_TRANSPARENT) - Render = true; - - if(Render) - { - int tx = Index % 16; - int ty = Index / 16; - int Px0 = tx * (1024 / 16); - int Py0 = ty * (1024 / 16); - int Px1 = Px0 + (1024 / 16) - 1; - int Py1 = Py0 + (1024 / 16) - 1; - - float x0 = Nudge + Px0 / TexSize + Frac; - float y0 = Nudge + Py0 / TexSize + Frac; - float x1 = Nudge + Px1 / TexSize - Frac; - float y1 = Nudge + Py0 / TexSize + Frac; - float x2 = Nudge + Px1 / TexSize - Frac; - float y2 = Nudge + Py1 / TexSize - Frac; - float x3 = Nudge + Px0 / TexSize + Frac; - float y3 = Nudge + Py1 / TexSize - Frac; - - if(Graphics()->HasTextureArraysSupport()) - { - x0 = 0; - y0 = 0; - x1 = x0 + 1; - y1 = y0; - x2 = x0 + 1; - y2 = y0 + 1; - x3 = x0; - y3 = y0 + 1; - } - - if(Graphics()->HasTextureArraysSupport()) - { - Graphics()->QuadsSetSubsetFree(x0, y0, x1, y1, x2, y2, x3, y3, Index); - IGraphics::CQuadItem QuadItem(x * Scale, y * Scale, Scale, Scale); - Graphics()->QuadsTex3DDrawTL(&QuadItem, 1); - } - else - { - Graphics()->QuadsSetSubsetFree(x0, y0, x1, y1, x2, y2, x3, y3); - IGraphics::CQuadItem QuadItem(x * Scale, y * Scale, Scale, Scale); - Graphics()->QuadsDrawTL(&QuadItem, 1); - } - } - } - } - } - - if(Graphics()->HasTextureArraysSupport()) - Graphics()->QuadsTex3DEnd(); - else - Graphics()->QuadsEnd(); - Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); -} - -void CRenderTools::RenderTilemap(CTile *pTiles, int w, int h, float Scale, ColorRGBA Color, int RenderFlags) const -{ - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - - // calculate the final pixelsize for the tiles - float TilePixelSize = 1024 / 32.0f; - float FinalTileSize = Scale / (ScreenX1 - ScreenX0) * Graphics()->ScreenWidth(); - float FinalTilesetScale = FinalTileSize / TilePixelSize; - - if(Graphics()->HasTextureArraysSupport()) - Graphics()->QuadsTex3DBegin(); - else - Graphics()->QuadsBegin(); - Graphics()->SetColor(Color); - const bool ColorOpaque = Color.a > 254.0f / 255.0f; - - int StartY = (int)(ScreenY0 / Scale) - 1; - int StartX = (int)(ScreenX0 / Scale) - 1; - int EndY = (int)(ScreenY1 / Scale) + 1; - int EndX = (int)(ScreenX1 / Scale) + 1; - - // adjust the texture shift according to mipmap level - float TexSize = 1024.0f; - float Frac = (1.25f / TexSize) * (1 / FinalTilesetScale); - float Nudge = (0.5f / TexSize) * (1 / FinalTilesetScale); - - for(int y = StartY; y < EndY; y++) - { - for(int x = StartX; x < EndX; x++) - { - int mx = x; - int my = y; - - if(RenderFlags & TILERENDERFLAG_EXTEND) - { - if(mx < 0) - mx = 0; - if(mx >= w) - mx = w - 1; - if(my < 0) - my = 0; - if(my >= h) - my = h - 1; - } - else - { - if(mx < 0) - continue; // mx = 0; - if(mx >= w) - continue; // mx = w-1; - if(my < 0) - continue; // my = 0; - if(my >= h) - continue; // my = h-1; - } - - int c = mx + my * w; - - unsigned char Index = pTiles[c].m_Index; - if(Index) - { - unsigned char Flags = pTiles[c].m_Flags; - - bool Render = false; - if(ColorOpaque && Flags & TILEFLAG_OPAQUE) - { - if(RenderFlags & LAYERRENDERFLAG_OPAQUE) - Render = true; - } - else - { - if(RenderFlags & LAYERRENDERFLAG_TRANSPARENT) - Render = true; - } - - if(Render) - { - int tx = Index % 16; - int ty = Index / 16; - int Px0 = tx * (1024 / 16); - int Py0 = ty * (1024 / 16); - int Px1 = Px0 + (1024 / 16) - 1; - int Py1 = Py0 + (1024 / 16) - 1; - - float x0 = Nudge + Px0 / TexSize + Frac; - float y0 = Nudge + Py0 / TexSize + Frac; - float x1 = Nudge + Px1 / TexSize - Frac; - float y1 = Nudge + Py0 / TexSize + Frac; - float x2 = Nudge + Px1 / TexSize - Frac; - float y2 = Nudge + Py1 / TexSize - Frac; - float x3 = Nudge + Px0 / TexSize + Frac; - float y3 = Nudge + Py1 / TexSize - Frac; - - if(Graphics()->HasTextureArraysSupport()) - { - x0 = 0; - y0 = 0; - x1 = x0 + 1; - y1 = y0; - x2 = x0 + 1; - y2 = y0 + 1; - x3 = x0; - y3 = y0 + 1; - } - - if(Flags & TILEFLAG_XFLIP) - { - x0 = x2; - x1 = x3; - x2 = x3; - x3 = x0; - } - - if(Flags & TILEFLAG_YFLIP) - { - y0 = y3; - y2 = y1; - y3 = y1; - y1 = y0; - } - - if(Flags & TILEFLAG_ROTATE) - { - float Tmp = x0; - x0 = x3; - x3 = x2; - x2 = x1; - x1 = Tmp; - Tmp = y0; - y0 = y3; - y3 = y2; - y2 = y1; - y1 = Tmp; - } - - if(Graphics()->HasTextureArraysSupport()) - { - Graphics()->QuadsSetSubsetFree(x0, y0, x1, y1, x2, y2, x3, y3, Index); - IGraphics::CQuadItem QuadItem(x * Scale, y * Scale, Scale, Scale); - Graphics()->QuadsTex3DDrawTL(&QuadItem, 1); - } - else - { - Graphics()->QuadsSetSubsetFree(x0, y0, x1, y1, x2, y2, x3, y3); - IGraphics::CQuadItem QuadItem(x * Scale, y * Scale, Scale, Scale); - Graphics()->QuadsDrawTL(&QuadItem, 1); - } - } - } - x += pTiles[c].m_Skip; - } - } - - if(Graphics()->HasTextureArraysSupport()) - Graphics()->QuadsTex3DEnd(); - else - Graphics()->QuadsEnd(); - Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); -} - -void CRenderTools::RenderTile(int x, int y, unsigned char Index, float Scale, ColorRGBA Color) const -{ - if(Graphics()->HasTextureArraysSupport()) - Graphics()->QuadsTex3DBegin(); - else - Graphics()->QuadsBegin(); - - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - - // calculate the final pixelsize for the tiles - float TilePixelSize = 1024 / Scale; - float FinalTileSize = Scale / (ScreenX1 - ScreenX0) * Graphics()->ScreenWidth(); - float FinalTilesetScale = FinalTileSize / TilePixelSize; - - float TexSize = 1024.0f; - float Frac = (1.25f / TexSize) * (1 / FinalTilesetScale); - float Nudge = (0.5f / TexSize) * (1 / FinalTilesetScale); - - int tx = Index % 16; - int ty = Index / 16; - int Px0 = tx * (1024 / 16); - int Py0 = ty * (1024 / 16); - int Px1 = Px0 + (1024 / 16) - 1; - int Py1 = Py0 + (1024 / 16) - 1; - - float x0 = Nudge + Px0 / TexSize + Frac; - float y0 = Nudge + Py0 / TexSize + Frac; - float x1 = Nudge + Px1 / TexSize - Frac; - float y1 = Nudge + Py0 / TexSize + Frac; - float x2 = Nudge + Px1 / TexSize - Frac; - float y2 = Nudge + Py1 / TexSize - Frac; - float x3 = Nudge + Px0 / TexSize + Frac; - float y3 = Nudge + Py1 / TexSize - Frac; - - if(Graphics()->HasTextureArraysSupport()) - { - x0 = 0; - y0 = 0; - x1 = x0 + 1; - y1 = y0; - x2 = x0 + 1; - y2 = y0 + 1; - x3 = x0; - y3 = y0 + 1; - } - - if(Graphics()->HasTextureArraysSupport()) - { - Graphics()->QuadsSetSubsetFree(x0, y0, x1, y1, x2, y2, x3, y3, Index); - IGraphics::CQuadItem QuadItem(x, y, Scale, Scale); - Graphics()->QuadsTex3DDrawTL(&QuadItem, 1); - } - else - { - Graphics()->QuadsSetSubsetFree(x0, y0, x1, y1, x2, y2, x3, y3); - IGraphics::CQuadItem QuadItem(x, y, Scale, Scale); - Graphics()->QuadsDrawTL(&QuadItem, 1); - } - - if(Graphics()->HasTextureArraysSupport()) - Graphics()->QuadsTex3DEnd(); - else - Graphics()->QuadsEnd(); - Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); -} - -void CRenderTools::RenderTeleOverlay(CTeleTile *pTele, int w, int h, float Scale, float Alpha) const -{ - if(!g_Config.m_ClTextEntities) - return; - - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - - int StartY = (int)(ScreenY0 / Scale) - 1; - int StartX = (int)(ScreenX0 / Scale) - 1; - int EndY = (int)(ScreenY1 / Scale) + 1; - int EndX = (int)(ScreenX1 / Scale) + 1; - - if(EndX - StartX > Graphics()->ScreenWidth() / g_Config.m_GfxTextOverlay || EndY - StartY > Graphics()->ScreenHeight() / g_Config.m_GfxTextOverlay) - return; // its useless to render text at this distance - - float Size = g_Config.m_ClTextEntitiesSize / 100.f; - char aBuf[16]; - - TextRender()->TextColor(1.0f, 1.0f, 1.0f, Alpha); - for(int y = StartY; y < EndY; y++) - { - for(int x = StartX; x < EndX; x++) - { - int mx = x; - int my = y; - - if(mx < 0) - continue; // mx = 0; - if(mx >= w) - continue; // mx = w-1; - if(my < 0) - continue; // my = 0; - if(my >= h) - continue; // my = h-1; - - int c = mx + my * w; - - unsigned char Index = pTele[c].m_Number; - if(Index && IsTeleTileNumberUsedAny(pTele[c].m_Type)) - { - str_format(aBuf, sizeof(aBuf), "%d", Index); - // Auto-resize text to fit inside the tile - float ScaledWidth = TextRender()->TextWidth(Size * Scale, aBuf, -1); - float Factor = clamp(Scale / ScaledWidth, 0.0f, 1.0f); - float LocalSize = Size * Factor; - float ToCenterOffset = (1 - LocalSize) / 2.f; - TextRender()->Text((mx + 0.5f) * Scale - (ScaledWidth * Factor) / 2.0f, (my + ToCenterOffset) * Scale, LocalSize * Scale, aBuf); - } - } - } - TextRender()->TextColor(TextRender()->DefaultTextColor()); - Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); -} - -void CRenderTools::RenderSpeedupOverlay(CSpeedupTile *pSpeedup, int w, int h, float Scale, float Alpha) const -{ - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - - int StartY = (int)(ScreenY0 / Scale) - 1; - int StartX = (int)(ScreenX0 / Scale) - 1; - int EndY = (int)(ScreenY1 / Scale) + 1; - int EndX = (int)(ScreenX1 / Scale) + 1; - - if(EndX - StartX > Graphics()->ScreenWidth() / g_Config.m_GfxTextOverlay || EndY - StartY > Graphics()->ScreenHeight() / g_Config.m_GfxTextOverlay) - return; // its useless to render text at this distance - - float Size = g_Config.m_ClTextEntitiesSize / 100.f; - float ToCenterOffset = (1 - Size) / 2.f; - char aBuf[16]; - - TextRender()->TextColor(1.0f, 1.0f, 1.0f, Alpha); - for(int y = StartY; y < EndY; y++) - { - for(int x = StartX; x < EndX; x++) - { - int mx = x; - int my = y; - - if(mx < 0) - continue; // mx = 0; - if(mx >= w) - continue; // mx = w-1; - if(my < 0) - continue; // my = 0; - if(my >= h) - continue; // my = h-1; - - int c = mx + my * w; - - int Force = (int)pSpeedup[c].m_Force; - int MaxSpeed = (int)pSpeedup[c].m_MaxSpeed; - if(Force) - { - // draw arrow - Graphics()->TextureSet(g_pData->m_aImages[IMAGE_SPEEDUP_ARROW].m_Id); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, Alpha); - SelectSprite(SPRITE_SPEEDUP_ARROW); - Graphics()->QuadsSetRotation(pSpeedup[c].m_Angle * (pi / 180.0f)); - DrawSprite(mx * Scale + 16, my * Scale + 16, 35.0f); - Graphics()->QuadsEnd(); - - // draw force and max speed - if(g_Config.m_ClTextEntities) - { - str_format(aBuf, sizeof(aBuf), "%d", Force); - TextRender()->Text(mx * Scale, (my + 0.5f + ToCenterOffset / 2) * Scale, Size * Scale / 2.f, aBuf); - if(MaxSpeed) - { - str_format(aBuf, sizeof(aBuf), "%d", MaxSpeed); - TextRender()->Text(mx * Scale, (my + ToCenterOffset / 2) * Scale, Size * Scale / 2.f, aBuf); - } - } - } - } - } - TextRender()->TextColor(TextRender()->DefaultTextColor()); - Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); -} - -void CRenderTools::RenderSwitchOverlay(CSwitchTile *pSwitch, int w, int h, float Scale, float Alpha) const -{ - if(!g_Config.m_ClTextEntities) - return; - - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - - int StartY = (int)(ScreenY0 / Scale) - 1; - int StartX = (int)(ScreenX0 / Scale) - 1; - int EndY = (int)(ScreenY1 / Scale) + 1; - int EndX = (int)(ScreenX1 / Scale) + 1; - - if(EndX - StartX > Graphics()->ScreenWidth() / g_Config.m_GfxTextOverlay || EndY - StartY > Graphics()->ScreenHeight() / g_Config.m_GfxTextOverlay) - return; // its useless to render text at this distance - - float Size = g_Config.m_ClTextEntitiesSize / 100.f; - float ToCenterOffset = (1 - Size) / 2.f; - char aBuf[16]; - - TextRender()->TextColor(1.0f, 1.0f, 1.0f, Alpha); - for(int y = StartY; y < EndY; y++) - { - for(int x = StartX; x < EndX; x++) - { - int mx = x; - int my = y; - - if(mx < 0) - continue; // mx = 0; - if(mx >= w) - continue; // mx = w-1; - if(my < 0) - continue; // my = 0; - if(my >= h) - continue; // my = h-1; - - int c = mx + my * w; - - unsigned char Index = pSwitch[c].m_Number; - if(Index && IsSwitchTileNumberUsed(pSwitch[c].m_Type)) - { - str_format(aBuf, sizeof(aBuf), "%d", Index); - TextRender()->Text(mx * Scale, (my + ToCenterOffset / 2) * Scale, Size * Scale / 2.f, aBuf); - } - - unsigned char Delay = pSwitch[c].m_Delay; - if(Delay && IsSwitchTileDelayUsed(pSwitch[c].m_Type)) - { - str_format(aBuf, sizeof(aBuf), "%d", Delay); - TextRender()->Text(mx * Scale, (my + 0.5f + ToCenterOffset / 2) * Scale, Size * Scale / 2.f, aBuf); - } - } - } - TextRender()->TextColor(TextRender()->DefaultTextColor()); - Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); -} - -void CRenderTools::RenderTuneOverlay(CTuneTile *pTune, int w, int h, float Scale, float Alpha) const -{ - if(!g_Config.m_ClTextEntities) - return; - - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - - int StartY = (int)(ScreenY0 / Scale) - 1; - int StartX = (int)(ScreenX0 / Scale) - 1; - int EndY = (int)(ScreenY1 / Scale) + 1; - int EndX = (int)(ScreenX1 / Scale) + 1; - - if(EndX - StartX > Graphics()->ScreenWidth() / g_Config.m_GfxTextOverlay || EndY - StartY > Graphics()->ScreenHeight() / g_Config.m_GfxTextOverlay) - return; // its useless to render text at this distance - - float Size = g_Config.m_ClTextEntitiesSize / 100.f; - char aBuf[16]; - - TextRender()->TextColor(1.0f, 1.0f, 1.0f, Alpha); - for(int y = StartY; y < EndY; y++) - { - for(int x = StartX; x < EndX; x++) - { - int mx = x; - int my = y; - - if(mx < 0) - continue; // mx = 0; - if(mx >= w) - continue; // mx = w-1; - if(my < 0) - continue; // my = 0; - if(my >= h) - continue; // my = h-1; - - int c = mx + my * w; - - unsigned char Index = pTune[c].m_Number; - if(Index) - { - str_format(aBuf, sizeof(aBuf), "%d", Index); - TextRender()->Text(mx * Scale + 11.f, my * Scale + 6.f, Size * Scale / 1.5f - 5.f, aBuf); // numbers shouldn't be too big and in the center of the tile - } - } - } - TextRender()->TextColor(TextRender()->DefaultTextColor()); - Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); -} - -void CRenderTools::RenderTelemap(CTeleTile *pTele, int w, int h, float Scale, ColorRGBA Color, int RenderFlags) const -{ - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - - // calculate the final pixelsize for the tiles - float TilePixelSize = 1024 / 32.0f; - float FinalTileSize = Scale / (ScreenX1 - ScreenX0) * Graphics()->ScreenWidth(); - float FinalTilesetScale = FinalTileSize / TilePixelSize; - - if(Graphics()->HasTextureArraysSupport()) - Graphics()->QuadsTex3DBegin(); - else - Graphics()->QuadsBegin(); - Graphics()->SetColor(Color); - - int StartY = (int)(ScreenY0 / Scale) - 1; - int StartX = (int)(ScreenX0 / Scale) - 1; - int EndY = (int)(ScreenY1 / Scale) + 1; - int EndX = (int)(ScreenX1 / Scale) + 1; - - // adjust the texture shift according to mipmap level - float TexSize = 1024.0f; - float Frac = (1.25f / TexSize) * (1 / FinalTilesetScale); - float Nudge = (0.5f / TexSize) * (1 / FinalTilesetScale); - - for(int y = StartY; y < EndY; y++) - for(int x = StartX; x < EndX; x++) - { - int mx = x; - int my = y; - - if(RenderFlags & TILERENDERFLAG_EXTEND) - { - if(mx < 0) - mx = 0; - if(mx >= w) - mx = w - 1; - if(my < 0) - my = 0; - if(my >= h) - my = h - 1; - } - else - { - if(mx < 0) - continue; // mx = 0; - if(mx >= w) - continue; // mx = w-1; - if(my < 0) - continue; // my = 0; - if(my >= h) - continue; // my = h-1; - } - - int c = mx + my * w; - - unsigned char Index = pTele[c].m_Type; - if(Index) - { - bool Render = false; - if(RenderFlags & LAYERRENDERFLAG_TRANSPARENT) - Render = true; - - if(Render) - { - int tx = Index % 16; - int ty = Index / 16; - int Px0 = tx * (1024 / 16); - int Py0 = ty * (1024 / 16); - int Px1 = Px0 + (1024 / 16) - 1; - int Py1 = Py0 + (1024 / 16) - 1; - - float x0 = Nudge + Px0 / TexSize + Frac; - float y0 = Nudge + Py0 / TexSize + Frac; - float x1 = Nudge + Px1 / TexSize - Frac; - float y1 = Nudge + Py0 / TexSize + Frac; - float x2 = Nudge + Px1 / TexSize - Frac; - float y2 = Nudge + Py1 / TexSize - Frac; - float x3 = Nudge + Px0 / TexSize + Frac; - float y3 = Nudge + Py1 / TexSize - Frac; - - if(Graphics()->HasTextureArraysSupport()) - { - x0 = 0; - y0 = 0; - x1 = x0 + 1; - y1 = y0; - x2 = x0 + 1; - y2 = y0 + 1; - x3 = x0; - y3 = y0 + 1; - } - - if(Graphics()->HasTextureArraysSupport()) - { - Graphics()->QuadsSetSubsetFree(x0, y0, x1, y1, x2, y2, x3, y3, Index); - IGraphics::CQuadItem QuadItem(x * Scale, y * Scale, Scale, Scale); - Graphics()->QuadsTex3DDrawTL(&QuadItem, 1); - } - else - { - Graphics()->QuadsSetSubsetFree(x0, y0, x1, y1, x2, y2, x3, y3); - IGraphics::CQuadItem QuadItem(x * Scale, y * Scale, Scale, Scale); - Graphics()->QuadsDrawTL(&QuadItem, 1); - } - } - } - } - - if(Graphics()->HasTextureArraysSupport()) - Graphics()->QuadsTex3DEnd(); - else - Graphics()->QuadsEnd(); - Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); -} - -void CRenderTools::RenderSpeedupmap(CSpeedupTile *pSpeedupTile, int w, int h, float Scale, ColorRGBA Color, int RenderFlags) const -{ - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - - // calculate the final pixelsize for the tiles - float TilePixelSize = 1024 / 32.0f; - float FinalTileSize = Scale / (ScreenX1 - ScreenX0) * Graphics()->ScreenWidth(); - float FinalTilesetScale = FinalTileSize / TilePixelSize; - - if(Graphics()->HasTextureArraysSupport()) - Graphics()->QuadsTex3DBegin(); - else - Graphics()->QuadsBegin(); - Graphics()->SetColor(Color); - - int StartY = (int)(ScreenY0 / Scale) - 1; - int StartX = (int)(ScreenX0 / Scale) - 1; - int EndY = (int)(ScreenY1 / Scale) + 1; - int EndX = (int)(ScreenX1 / Scale) + 1; - - // adjust the texture shift according to mipmap level - float TexSize = 1024.0f; - float Frac = (1.25f / TexSize) * (1 / FinalTilesetScale); - float Nudge = (0.5f / TexSize) * (1 / FinalTilesetScale); - - for(int y = StartY; y < EndY; y++) - for(int x = StartX; x < EndX; x++) - { - int mx = x; - int my = y; - - if(RenderFlags & TILERENDERFLAG_EXTEND) - { - if(mx < 0) - mx = 0; - if(mx >= w) - mx = w - 1; - if(my < 0) - my = 0; - if(my >= h) - my = h - 1; - } - else - { - if(mx < 0) - continue; // mx = 0; - if(mx >= w) - continue; // mx = w-1; - if(my < 0) - continue; // my = 0; - if(my >= h) - continue; // my = h-1; - } - - int c = mx + my * w; - - unsigned char Index = pSpeedupTile[c].m_Type; - if(Index) - { - bool Render = false; - if(RenderFlags & LAYERRENDERFLAG_TRANSPARENT) - Render = true; - - if(Render) - { - int tx = Index % 16; - int ty = Index / 16; - int Px0 = tx * (1024 / 16); - int Py0 = ty * (1024 / 16); - int Px1 = Px0 + (1024 / 16) - 1; - int Py1 = Py0 + (1024 / 16) - 1; - - float x0 = Nudge + Px0 / TexSize + Frac; - float y0 = Nudge + Py0 / TexSize + Frac; - float x1 = Nudge + Px1 / TexSize - Frac; - float y1 = Nudge + Py0 / TexSize + Frac; - float x2 = Nudge + Px1 / TexSize - Frac; - float y2 = Nudge + Py1 / TexSize - Frac; - float x3 = Nudge + Px0 / TexSize + Frac; - float y3 = Nudge + Py1 / TexSize - Frac; - - if(Graphics()->HasTextureArraysSupport()) - { - x0 = 0; - y0 = 0; - x1 = x0 + 1; - y1 = y0; - x2 = x0 + 1; - y2 = y0 + 1; - x3 = x0; - y3 = y0 + 1; - } - - if(Graphics()->HasTextureArraysSupport()) - { - Graphics()->QuadsSetSubsetFree(x0, y0, x1, y1, x2, y2, x3, y3, Index); - IGraphics::CQuadItem QuadItem(x * Scale, y * Scale, Scale, Scale); - Graphics()->QuadsTex3DDrawTL(&QuadItem, 1); - } - else - { - Graphics()->QuadsSetSubsetFree(x0, y0, x1, y1, x2, y2, x3, y3); - IGraphics::CQuadItem QuadItem(x * Scale, y * Scale, Scale, Scale); - Graphics()->QuadsDrawTL(&QuadItem, 1); - } - } - } - } - - if(Graphics()->HasTextureArraysSupport()) - Graphics()->QuadsTex3DEnd(); - else - Graphics()->QuadsEnd(); - Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); -} - -void CRenderTools::RenderSwitchmap(CSwitchTile *pSwitchTile, int w, int h, float Scale, ColorRGBA Color, int RenderFlags) const -{ - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - - // calculate the final pixelsize for the tiles - float TilePixelSize = 1024 / 32.0f; - float FinalTileSize = Scale / (ScreenX1 - ScreenX0) * Graphics()->ScreenWidth(); - float FinalTilesetScale = FinalTileSize / TilePixelSize; - - if(Graphics()->HasTextureArraysSupport()) - Graphics()->QuadsTex3DBegin(); - else - Graphics()->QuadsBegin(); - Graphics()->SetColor(Color); - - int StartY = (int)(ScreenY0 / Scale) - 1; - int StartX = (int)(ScreenX0 / Scale) - 1; - int EndY = (int)(ScreenY1 / Scale) + 1; - int EndX = (int)(ScreenX1 / Scale) + 1; - - // adjust the texture shift according to mipmap level - float TexSize = 1024.0f; - float Frac = (1.25f / TexSize) * (1 / FinalTilesetScale); - float Nudge = (0.5f / TexSize) * (1 / FinalTilesetScale); - - for(int y = StartY; y < EndY; y++) - for(int x = StartX; x < EndX; x++) - { - int mx = x; - int my = y; - - if(RenderFlags & TILERENDERFLAG_EXTEND) - { - if(mx < 0) - mx = 0; - if(mx >= w) - mx = w - 1; - if(my < 0) - my = 0; - if(my >= h) - my = h - 1; - } - else - { - if(mx < 0) - continue; // mx = 0; - if(mx >= w) - continue; // mx = w-1; - if(my < 0) - continue; // my = 0; - if(my >= h) - continue; // my = h-1; - } - - int c = mx + my * w; - - unsigned char Index = pSwitchTile[c].m_Type; - if(Index) - { - if(Index == TILE_SWITCHTIMEDOPEN) - Index = 8; - - unsigned char Flags = pSwitchTile[c].m_Flags; - - bool Render = false; - if(Flags & TILEFLAG_OPAQUE) - { - if(RenderFlags & LAYERRENDERFLAG_OPAQUE) - Render = true; - } - else - { - if(RenderFlags & LAYERRENDERFLAG_TRANSPARENT) - Render = true; - } - - if(Render) - { - int tx = Index % 16; - int ty = Index / 16; - int Px0 = tx * (1024 / 16); - int Py0 = ty * (1024 / 16); - int Px1 = Px0 + (1024 / 16) - 1; - int Py1 = Py0 + (1024 / 16) - 1; - - float x0 = Nudge + Px0 / TexSize + Frac; - float y0 = Nudge + Py0 / TexSize + Frac; - float x1 = Nudge + Px1 / TexSize - Frac; - float y1 = Nudge + Py0 / TexSize + Frac; - float x2 = Nudge + Px1 / TexSize - Frac; - float y2 = Nudge + Py1 / TexSize - Frac; - float x3 = Nudge + Px0 / TexSize + Frac; - float y3 = Nudge + Py1 / TexSize - Frac; - - if(Graphics()->HasTextureArraysSupport()) - { - x0 = 0; - y0 = 0; - x1 = x0 + 1; - y1 = y0; - x2 = x0 + 1; - y2 = y0 + 1; - x3 = x0; - y3 = y0 + 1; - } - - if(Flags & TILEFLAG_XFLIP) - { - x0 = x2; - x1 = x3; - x2 = x3; - x3 = x0; - } - - if(Flags & TILEFLAG_YFLIP) - { - y0 = y3; - y2 = y1; - y3 = y1; - y1 = y0; - } - - if(Flags & TILEFLAG_ROTATE) - { - float Tmp = x0; - x0 = x3; - x3 = x2; - x2 = x1; - x1 = Tmp; - Tmp = y0; - y0 = y3; - y3 = y2; - y2 = y1; - y1 = Tmp; - } - - if(Graphics()->HasTextureArraysSupport()) - { - Graphics()->QuadsSetSubsetFree(x0, y0, x1, y1, x2, y2, x3, y3, Index); - IGraphics::CQuadItem QuadItem(x * Scale, y * Scale, Scale, Scale); - Graphics()->QuadsTex3DDrawTL(&QuadItem, 1); - } - else - { - Graphics()->QuadsSetSubsetFree(x0, y0, x1, y1, x2, y2, x3, y3); - IGraphics::CQuadItem QuadItem(x * Scale, y * Scale, Scale, Scale); - Graphics()->QuadsDrawTL(&QuadItem, 1); - } - } - } - } - - if(Graphics()->HasTextureArraysSupport()) - Graphics()->QuadsTex3DEnd(); - else - Graphics()->QuadsEnd(); - Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); -} - -void CRenderTools::RenderTunemap(CTuneTile *pTune, int w, int h, float Scale, ColorRGBA Color, int RenderFlags) const -{ - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - - // calculate the final pixelsize for the tiles - float TilePixelSize = 1024 / 32.0f; - float FinalTileSize = Scale / (ScreenX1 - ScreenX0) * Graphics()->ScreenWidth(); - float FinalTilesetScale = FinalTileSize / TilePixelSize; - - if(Graphics()->HasTextureArraysSupport()) - Graphics()->QuadsTex3DBegin(); - else - Graphics()->QuadsBegin(); - Graphics()->SetColor(Color); - - int StartY = (int)(ScreenY0 / Scale) - 1; - int StartX = (int)(ScreenX0 / Scale) - 1; - int EndY = (int)(ScreenY1 / Scale) + 1; - int EndX = (int)(ScreenX1 / Scale) + 1; - - // adjust the texture shift according to mipmap level - float TexSize = 1024.0f; - float Frac = (1.25f / TexSize) * (1 / FinalTilesetScale); - float Nudge = (0.5f / TexSize) * (1 / FinalTilesetScale); - - for(int y = StartY; y < EndY; y++) - for(int x = StartX; x < EndX; x++) - { - int mx = x; - int my = y; - - if(RenderFlags & TILERENDERFLAG_EXTEND) - { - if(mx < 0) - mx = 0; - if(mx >= w) - mx = w - 1; - if(my < 0) - my = 0; - if(my >= h) - my = h - 1; - } - else - { - if(mx < 0) - continue; // mx = 0; - if(mx >= w) - continue; // mx = w-1; - if(my < 0) - continue; // my = 0; - if(my >= h) - continue; // my = h-1; - } - - int c = mx + my * w; - - unsigned char Index = pTune[c].m_Type; - if(Index) - { - bool Render = false; - if(RenderFlags & LAYERRENDERFLAG_TRANSPARENT) - Render = true; - - if(Render) - { - int tx = Index % 16; - int ty = Index / 16; - int Px0 = tx * (1024 / 16); - int Py0 = ty * (1024 / 16); - int Px1 = Px0 + (1024 / 16) - 1; - int Py1 = Py0 + (1024 / 16) - 1; - - float x0 = Nudge + Px0 / TexSize + Frac; - float y0 = Nudge + Py0 / TexSize + Frac; - float x1 = Nudge + Px1 / TexSize - Frac; - float y1 = Nudge + Py0 / TexSize + Frac; - float x2 = Nudge + Px1 / TexSize - Frac; - float y2 = Nudge + Py1 / TexSize - Frac; - float x3 = Nudge + Px0 / TexSize + Frac; - float y3 = Nudge + Py1 / TexSize - Frac; - - if(Graphics()->HasTextureArraysSupport()) - { - x0 = 0; - y0 = 0; - x1 = x0 + 1; - y1 = y0; - x2 = x0 + 1; - y2 = y0 + 1; - x3 = x0; - y3 = y0 + 1; - } - - if(Graphics()->HasTextureArraysSupport()) - { - Graphics()->QuadsSetSubsetFree(x0, y0, x1, y1, x2, y2, x3, y3, Index); - IGraphics::CQuadItem QuadItem(x * Scale, y * Scale, Scale, Scale); - Graphics()->QuadsTex3DDrawTL(&QuadItem, 1); - } - else - { - Graphics()->QuadsSetSubsetFree(x0, y0, x1, y1, x2, y2, x3, y3); - IGraphics::CQuadItem QuadItem(x * Scale, y * Scale, Scale, Scale); - Graphics()->QuadsDrawTL(&QuadItem, 1); - } - } - } - } - - if(Graphics()->HasTextureArraysSupport()) - Graphics()->QuadsTex3DEnd(); - else - Graphics()->QuadsEnd(); - Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); -} diff --git a/src/game/client/sixup_translate_game.cpp b/src/game/client/sixup_translate_game.cpp deleted file mode 100644 index 6588348cee..0000000000 --- a/src/game/client/sixup_translate_game.cpp +++ /dev/null @@ -1,726 +0,0 @@ -#include -#include -#include -#include -#include - -#include - -enum -{ - STR_TEAM_GAME, - STR_TEAM_RED, - STR_TEAM_BLUE, - STR_TEAM_SPECTATORS, -}; - -static int GetStrTeam7(int Team, bool Teamplay) -{ - if(Teamplay) - { - if(Team == TEAM_RED) - return STR_TEAM_RED; - else if(Team == TEAM_BLUE) - return STR_TEAM_BLUE; - } - else if(Team == 0) - return STR_TEAM_GAME; - - return STR_TEAM_SPECTATORS; -} - -enum -{ - DO_CHAT = 0, - DO_BROADCAST, - DO_SPECIAL, - - PARA_NONE = 0, - PARA_I, - PARA_II, - PARA_III, -}; - -struct CGameMsg7 -{ - int m_Action; - int m_ParaType; - const char *m_pText; -}; - -static CGameMsg7 gs_GameMsgList7[protocol7::NUM_GAMEMSGS] = { - {/*GAMEMSG_TEAM_SWAP*/ DO_CHAT, PARA_NONE, "Teams were swapped"}, - {/*GAMEMSG_SPEC_INVALIDID*/ DO_CHAT, PARA_NONE, "Invalid spectator id used"}, //! - {/*GAMEMSG_TEAM_SHUFFLE*/ DO_CHAT, PARA_NONE, "Teams were shuffled"}, - {/*GAMEMSG_TEAM_BALANCE*/ DO_CHAT, PARA_NONE, "Teams have been balanced"}, - {/*GAMEMSG_CTF_DROP*/ DO_SPECIAL, PARA_NONE, ""}, // special - play ctf drop sound - {/*GAMEMSG_CTF_RETURN*/ DO_SPECIAL, PARA_NONE, ""}, // special - play ctf return sound - - {/*GAMEMSG_TEAM_ALL*/ DO_SPECIAL, PARA_I, ""}, // special - add team name - {/*GAMEMSG_TEAM_BALANCE_VICTIM*/ DO_SPECIAL, PARA_I, ""}, // special - add team name - {/*GAMEMSG_CTF_GRAB*/ DO_SPECIAL, PARA_I, ""}, // special - play ctf grab sound based on team - - {/*GAMEMSG_CTF_CAPTURE*/ DO_SPECIAL, PARA_III, ""}, // special - play ctf capture sound + capture chat message - - {/*GAMEMSG_GAME_PAUSED*/ DO_SPECIAL, PARA_I, ""}, // special - add player name -}; - -void CGameClient::DoTeamChangeMessage7(const char *pName, int ClientId, int Team, const char *pPrefix) -{ - char aBuf[128]; - switch(GetStrTeam7(Team, m_pClient->m_TranslationContext.m_GameFlags & protocol7::GAMEFLAG_TEAMS)) - { - case STR_TEAM_GAME: str_format(aBuf, sizeof(aBuf), "'%s' %sjoined the game", pName, pPrefix); break; - case STR_TEAM_RED: str_format(aBuf, sizeof(aBuf), "'%s' %sjoined the red team", pName, pPrefix); break; - case STR_TEAM_BLUE: str_format(aBuf, sizeof(aBuf), "'%s' %sjoined the blue team", pName, pPrefix); break; - case STR_TEAM_SPECTATORS: str_format(aBuf, sizeof(aBuf), "'%s' %sjoined the spectators", pName, pPrefix); break; - } - m_Chat.AddLine(-1, 0, aBuf); -} - -template -void CGameClient::ApplySkin7InfoFromGameMsg(const T *pMsg, int ClientId, int Conn) -{ - CClientData *pClient = &m_aClients[ClientId]; - char *apSkinPartsPtr[protocol7::NUM_SKINPARTS]; - for(int Part = 0; Part < protocol7::NUM_SKINPARTS; Part++) - { - str_utf8_copy_num(pClient->m_aSixup[Conn].m_aaSkinPartNames[Part], pMsg->m_apSkinPartNames[Part], sizeof(pClient->m_aSixup[Conn].m_aaSkinPartNames[Part]), protocol7::MAX_SKIN_LENGTH); - apSkinPartsPtr[Part] = pClient->m_aSixup[Conn].m_aaSkinPartNames[Part]; - pClient->m_aSixup[Conn].m_aUseCustomColors[Part] = pMsg->m_aUseCustomColors[Part]; - pClient->m_aSixup[Conn].m_aSkinPartColors[Part] = pMsg->m_aSkinPartColors[Part]; - } - m_Skins7.ValidateSkinParts(apSkinPartsPtr, pClient->m_aSixup[Conn].m_aUseCustomColors, pClient->m_aSixup[Conn].m_aSkinPartColors, m_pClient->m_TranslationContext.m_GameFlags); - - if(time_season() == SEASON_XMAS) - { - pClient->m_SkinInfo.m_aSixup[Conn].m_HatTexture = m_Skins7.XmasHatTexture(); - pClient->m_SkinInfo.m_aSixup[Conn].m_HatSpriteIndex = ClientId % CSkins7::HAT_NUM; - } - else - pClient->m_SkinInfo.m_aSixup[Conn].m_HatTexture.Invalidate(); - - for(int Part = 0; Part < protocol7::NUM_SKINPARTS; Part++) - { - const CSkins7::CSkinPart *pSkinPart = m_Skins7.FindSkinPart(Part, pClient->m_aSixup[Conn].m_aaSkinPartNames[Part], false); - if(pClient->m_aSixup[Conn].m_aUseCustomColors[Part]) - { - pClient->m_SkinInfo.m_aSixup[Conn].m_aTextures[Part] = pSkinPart->m_ColorTexture; - pClient->m_SkinInfo.m_aSixup[Conn].m_aColors[Part] = m_Skins7.GetColor(pMsg->m_aSkinPartColors[Part], Part == protocol7::SKINPART_MARKING); - } - else - { - pClient->m_SkinInfo.m_aSixup[Conn].m_aTextures[Part] = pSkinPart->m_OrgTexture; - pClient->m_SkinInfo.m_aSixup[Conn].m_aColors[Part] = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - } - if(pClient->m_SkinInfo.m_aSixup[Conn].m_HatTexture.IsValid()) - { - if(Part == protocol7::SKINPART_BODY && str_comp(pClient->m_aSixup[Conn].m_aaSkinPartNames[Part], "standard")) - pClient->m_SkinInfo.m_aSixup[Conn].m_HatSpriteIndex = CSkins7::HAT_OFFSET_SIDE + (ClientId % CSkins7::HAT_NUM); - if(Part == protocol7::SKINPART_DECORATION && !str_comp(pClient->m_aSixup[Conn].m_aaSkinPartNames[Part], "twinbopp")) - pClient->m_SkinInfo.m_aSixup[Conn].m_HatSpriteIndex = CSkins7::HAT_OFFSET_SIDE + (ClientId % CSkins7::HAT_NUM); - } - } -} - -void CGameClient::ApplySkin7InfoFromSnapObj(const protocol7::CNetObj_De_ClientInfo *pObj, int ClientId) -{ - char aSkinPartNames[protocol7::NUM_SKINPARTS][protocol7::MAX_SKIN_ARRAY_SIZE]; - protocol7::CNetMsg_Sv_SkinChange Msg; - Msg.m_ClientId = ClientId; - for(int Part = 0; Part < protocol7::NUM_SKINPARTS; Part++) - { - IntsToStr(pObj->m_aaSkinPartNames[Part], 6, aSkinPartNames[Part], std::size(aSkinPartNames[Part])); - Msg.m_apSkinPartNames[Part] = aSkinPartNames[Part]; - Msg.m_aUseCustomColors[Part] = pObj->m_aUseCustomColors[Part]; - Msg.m_aSkinPartColors[Part] = pObj->m_aSkinPartColors[Part]; - } - ApplySkin7InfoFromGameMsg(&Msg, ClientId, 0); -} - -void *CGameClient::TranslateGameMsg(int *pMsgId, CUnpacker *pUnpacker, int Conn) -{ - if(!m_pClient->IsSixup()) - { - return m_NetObjHandler.SecureUnpackMsg(*pMsgId, pUnpacker); - } - - void *pRawMsg = m_NetObjHandler7.SecureUnpackMsg(*pMsgId, pUnpacker); - if(!pRawMsg) - { - if(*pMsgId > __NETMSGTYPE_UUID_HELPER && *pMsgId < OFFSET_MAPITEMTYPE_UUID) - { - void *pDDNetExMsg = m_NetObjHandler.SecureUnpackMsg(*pMsgId, pUnpacker); - if(pDDNetExMsg) - return pDDNetExMsg; - } - - dbg_msg("sixup", "dropped weird message '%s' (%d), failed on '%s'", m_NetObjHandler7.GetMsgName(*pMsgId), *pMsgId, m_NetObjHandler7.FailedMsgOn()); - return nullptr; - } - static char s_aRawMsg[1024]; - - if(*pMsgId == protocol7::NETMSGTYPE_SV_MOTD) - { - protocol7::CNetMsg_Sv_Motd *pMsg7 = (protocol7::CNetMsg_Sv_Motd *)pRawMsg; - ::CNetMsg_Sv_Motd *pMsg = (::CNetMsg_Sv_Motd *)s_aRawMsg; - - pMsg->m_pMessage = pMsg7->m_pMessage; - - return s_aRawMsg; - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_BROADCAST) - { - protocol7::CNetMsg_Sv_Broadcast *pMsg7 = (protocol7::CNetMsg_Sv_Broadcast *)pRawMsg; - ::CNetMsg_Sv_Broadcast *pMsg = (::CNetMsg_Sv_Broadcast *)s_aRawMsg; - - pMsg->m_pMessage = pMsg7->m_pMessage; - - return s_aRawMsg; - } - else if(*pMsgId == protocol7::NETMSGTYPE_CL_SETTEAM) - { - protocol7::CNetMsg_Cl_SetTeam *pMsg7 = (protocol7::CNetMsg_Cl_SetTeam *)pRawMsg; - ::CNetMsg_Cl_SetTeam *pMsg = (::CNetMsg_Cl_SetTeam *)s_aRawMsg; - - pMsg->m_Team = pMsg7->m_Team; - - return s_aRawMsg; - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_TEAM) - { - protocol7::CNetMsg_Sv_Team *pMsg7 = (protocol7::CNetMsg_Sv_Team *)pRawMsg; - - if(Client()->State() != IClient::STATE_DEMOPLAYBACK) - { - m_aClients[pMsg7->m_ClientId].m_Team = pMsg7->m_Team; - m_pClient->m_TranslationContext.m_aClients[pMsg7->m_ClientId].m_Team = pMsg7->m_Team; - m_aClients[pMsg7->m_ClientId].UpdateRenderInfo(IsTeamPlay()); - - // if(pMsg7->m_ClientId == m_LocalClientId) - // { - // m_TeamCooldownTick = pMsg7->m_CooldownTick; - // m_TeamChangeTime = Client()->LocalTime(); - // } - } - - if(Conn != g_Config.m_ClDummy) - return nullptr; - - if(pMsg7->m_Silent == 0) - { - DoTeamChangeMessage7(m_aClients[pMsg7->m_ClientId].m_aName, pMsg7->m_ClientId, pMsg7->m_Team); - } - - // we drop the message and add the new team - // info to the playerinfo snap item - // using translation context - return nullptr; - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_WEAPONPICKUP) - { - protocol7::CNetMsg_Sv_WeaponPickup *pMsg7 = (protocol7::CNetMsg_Sv_WeaponPickup *)pRawMsg; - ::CNetMsg_Sv_WeaponPickup *pMsg = (::CNetMsg_Sv_WeaponPickup *)s_aRawMsg; - - pMsg->m_Weapon = pMsg7->m_Weapon; - - return s_aRawMsg; - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_SERVERSETTINGS) - { - // 0.7 only message for ui enrichment like locked teams - protocol7::CNetMsg_Sv_ServerSettings *pMsg = (protocol7::CNetMsg_Sv_ServerSettings *)pRawMsg; - - if(!m_pClient->m_TranslationContext.m_ServerSettings.m_TeamLock && pMsg->m_TeamLock) - m_Chat.AddLine(-1, 0, "Teams were locked"); - else if(m_pClient->m_TranslationContext.m_ServerSettings.m_TeamLock && !pMsg->m_TeamLock) - m_Chat.AddLine(-1, 0, "Teams were unlocked"); - - m_pClient->m_TranslationContext.m_ServerSettings.m_KickVote = pMsg->m_KickVote; - m_pClient->m_TranslationContext.m_ServerSettings.m_KickMin = pMsg->m_KickMin; - m_pClient->m_TranslationContext.m_ServerSettings.m_SpecVote = pMsg->m_SpecVote; - m_pClient->m_TranslationContext.m_ServerSettings.m_TeamLock = pMsg->m_TeamLock; - m_pClient->m_TranslationContext.m_ServerSettings.m_TeamBalance = pMsg->m_TeamBalance; - m_pClient->m_TranslationContext.m_ServerSettings.m_PlayerSlots = pMsg->m_PlayerSlots; - return nullptr; // There is no 0.6 equivalent - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_RACEFINISH) - { - *pMsgId = NETMSGTYPE_SV_RACEFINISH; - protocol7::CNetMsg_Sv_RaceFinish *pMsg7 = (protocol7::CNetMsg_Sv_RaceFinish *)pRawMsg; - ::CNetMsg_Sv_RaceFinish *pMsg = (::CNetMsg_Sv_RaceFinish *)s_aRawMsg; - - pMsg->m_ClientId = pMsg7->m_ClientId; - pMsg->m_Time = pMsg7->m_Time; - pMsg->m_Diff = pMsg7->m_Diff; - pMsg->m_RecordPersonal = pMsg7->m_RecordPersonal; - pMsg->m_RecordServer = pMsg7->m_RecordServer; - - return s_aRawMsg; - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_COMMANDINFOREMOVE) - { - *pMsgId = NETMSGTYPE_SV_COMMANDINFOREMOVE; - protocol7::CNetMsg_Sv_CommandInfoRemove *pMsg7 = (protocol7::CNetMsg_Sv_CommandInfoRemove *)pRawMsg; - ::CNetMsg_Sv_CommandInfoRemove *pMsg = (::CNetMsg_Sv_CommandInfoRemove *)s_aRawMsg; - - pMsg->m_pName = pMsg7->m_pName; - - return s_aRawMsg; - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_COMMANDINFO) - { - *pMsgId = NETMSGTYPE_SV_COMMANDINFO; - protocol7::CNetMsg_Sv_CommandInfo *pMsg7 = (protocol7::CNetMsg_Sv_CommandInfo *)pRawMsg; - ::CNetMsg_Sv_CommandInfo *pMsg = (::CNetMsg_Sv_CommandInfo *)s_aRawMsg; - - pMsg->m_pName = pMsg7->m_pName; - pMsg->m_pArgsFormat = pMsg7->m_pArgsFormat; - pMsg->m_pHelpText = pMsg7->m_pHelpText; - - return s_aRawMsg; - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_SKINCHANGE) - { - protocol7::CNetMsg_Sv_SkinChange *pMsg7 = (protocol7::CNetMsg_Sv_SkinChange *)pRawMsg; - - if(pMsg7->m_ClientId < 0 || pMsg7->m_ClientId >= MAX_CLIENTS) - { - dbg_msg("sixup", "Sv_SkinChange got invalid ClientId: %d", pMsg7->m_ClientId); - return nullptr; - } - - CTranslationContext::CClientData &Client = m_pClient->m_TranslationContext.m_aClients[pMsg7->m_ClientId]; - Client.m_Active = true; - ApplySkin7InfoFromGameMsg(pMsg7, pMsg7->m_ClientId, Conn); - // skin will be moved to the 0.6 snap by the translation context - // and we drop the game message - return nullptr; - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_VOTECLEAROPTIONS) - { - *pMsgId = NETMSGTYPE_SV_VOTECLEAROPTIONS; - return s_aRawMsg; - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_VOTEOPTIONADD) - { - *pMsgId = NETMSGTYPE_SV_VOTEOPTIONADD; - protocol7::CNetMsg_Sv_VoteOptionAdd *pMsg7 = (protocol7::CNetMsg_Sv_VoteOptionAdd *)pRawMsg; - ::CNetMsg_Sv_VoteOptionAdd *pMsg = (::CNetMsg_Sv_VoteOptionAdd *)s_aRawMsg; - pMsg->m_pDescription = pMsg7->m_pDescription; - return s_aRawMsg; - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_VOTEOPTIONREMOVE) - { - *pMsgId = NETMSGTYPE_SV_VOTEOPTIONREMOVE; - protocol7::CNetMsg_Sv_VoteOptionRemove *pMsg7 = (protocol7::CNetMsg_Sv_VoteOptionRemove *)pRawMsg; - ::CNetMsg_Sv_VoteOptionRemove *pMsg = (::CNetMsg_Sv_VoteOptionRemove *)s_aRawMsg; - pMsg->m_pDescription = pMsg7->m_pDescription; - return s_aRawMsg; - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_VOTEOPTIONLISTADD) - { - ::CNetMsg_Sv_VoteOptionListAdd *pMsg = (::CNetMsg_Sv_VoteOptionListAdd *)s_aRawMsg; - int NumOptions = pUnpacker->GetInt(); - if(NumOptions > 14) - { - for(int i = 0; i < NumOptions; i++) - { - const char *pDescription = pUnpacker->GetString(CUnpacker::SANITIZE_CC); - if(pUnpacker->Error()) - continue; - - m_Voting.AddOption(pDescription); - } - // 0.7 can send more vote options than - // the 0.6 protocol fit - // in that case we do not translate it but just - // reimplement what 0.6 would do - return nullptr; - } - pMsg->m_NumOptions = 0; - for(int i = 0; i < NumOptions; i++) - { - const char *pDescription = pUnpacker->GetString(CUnpacker::SANITIZE_CC); - if(pUnpacker->Error()) - continue; - - pMsg->m_NumOptions++; - switch(i) - { - case 0: (pMsg->m_pDescription0 = pDescription); break; - case 1: (pMsg->m_pDescription1 = pDescription); break; - case 2: (pMsg->m_pDescription2 = pDescription); break; - case 3: (pMsg->m_pDescription3 = pDescription); break; - case 4: (pMsg->m_pDescription4 = pDescription); break; - case 5: (pMsg->m_pDescription5 = pDescription); break; - case 6: (pMsg->m_pDescription6 = pDescription); break; - case 7: (pMsg->m_pDescription7 = pDescription); break; - case 8: (pMsg->m_pDescription8 = pDescription); break; - case 9: (pMsg->m_pDescription9 = pDescription); break; - case 10: (pMsg->m_pDescription10 = pDescription); break; - case 11: (pMsg->m_pDescription11 = pDescription); break; - case 12: (pMsg->m_pDescription12 = pDescription); break; - case 13: (pMsg->m_pDescription13 = pDescription); break; - case 14: (pMsg->m_pDescription14 = pDescription); - } - } - return s_aRawMsg; - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_VOTESET) - { - *pMsgId = NETMSGTYPE_SV_VOTESET; - protocol7::CNetMsg_Sv_VoteSet *pMsg7 = (protocol7::CNetMsg_Sv_VoteSet *)pRawMsg; - ::CNetMsg_Sv_VoteSet *pMsg = (::CNetMsg_Sv_VoteSet *)s_aRawMsg; - - pMsg->m_Timeout = pMsg7->m_Timeout; - pMsg->m_pDescription = pMsg7->m_pDescription; - pMsg->m_pReason = pMsg7->m_pReason; - - char aBuf[128]; - if(pMsg7->m_Timeout) - { - if(pMsg7->m_ClientId != -1) - { - const char *pName = m_aClients[pMsg7->m_ClientId].m_aName; - switch(pMsg7->m_Type) - { - case protocol7::VOTE_START_OP: - str_format(aBuf, sizeof(aBuf), "'%s' called vote to change server option '%s' (%s)", pName, pMsg7->m_pDescription, pMsg7->m_pReason); - m_Chat.AddLine(-1, 0, aBuf); - break; - case protocol7::VOTE_START_KICK: - { - str_format(aBuf, sizeof(aBuf), "'%s' called for vote to kick '%s' (%s)", pName, pMsg7->m_pDescription, pMsg7->m_pReason); - m_Chat.AddLine(-1, 0, aBuf); - break; - } - case protocol7::VOTE_START_SPEC: - { - str_format(aBuf, sizeof(aBuf), "'%s' called for vote to move '%s' to spectators (%s)", pName, pMsg7->m_pDescription, pMsg7->m_pReason); - m_Chat.AddLine(-1, 0, aBuf); - } - } - } - } - else - { - switch(pMsg7->m_Type) - { - case protocol7::VOTE_START_OP: - str_format(aBuf, sizeof(aBuf), "Admin forced server option '%s' (%s)", pMsg7->m_pDescription, pMsg7->m_pReason); - m_Chat.AddLine(-1, 0, aBuf); - break; - case protocol7::VOTE_START_SPEC: - str_format(aBuf, sizeof(aBuf), "Admin moved '%s' to spectator (%s)", pMsg7->m_pDescription, pMsg7->m_pReason); - m_Chat.AddLine(-1, 0, aBuf); - break; - case protocol7::VOTE_END_ABORT: - m_Voting.OnReset(); - m_Chat.AddLine(-1, 0, "Vote aborted"); - break; - case protocol7::VOTE_END_PASS: - m_Voting.OnReset(); - m_Chat.AddLine(-1, 0, pMsg7->m_ClientId == -1 ? "Admin forced vote yes" : "Vote passed"); - break; - case protocol7::VOTE_END_FAIL: - m_Voting.OnReset(); - m_Chat.AddLine(-1, 0, pMsg7->m_ClientId == -1 ? "Admin forced vote no" : "Vote failed"); - } - } - - return s_aRawMsg; - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_VOTESTATUS) - { - *pMsgId = NETMSGTYPE_SV_VOTESTATUS; - protocol7::CNetMsg_Sv_VoteStatus *pMsg7 = (protocol7::CNetMsg_Sv_VoteStatus *)pRawMsg; - ::CNetMsg_Sv_VoteStatus *pMsg = (::CNetMsg_Sv_VoteStatus *)s_aRawMsg; - - pMsg->m_Yes = pMsg7->m_Yes; - pMsg->m_No = pMsg7->m_No; - pMsg->m_Pass = pMsg7->m_Pass; - pMsg->m_Total = pMsg7->m_Total; - - return s_aRawMsg; - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_READYTOENTER) - { - *pMsgId = NETMSGTYPE_SV_READYTOENTER; - return s_aRawMsg; - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_CLIENTDROP) - { - protocol7::CNetMsg_Sv_ClientDrop *pMsg7 = (protocol7::CNetMsg_Sv_ClientDrop *)pRawMsg; - if(pMsg7->m_ClientId < 0 || pMsg7->m_ClientId >= MAX_CLIENTS) - { - dbg_msg("sixup", "Sv_ClientDrop got invalid ClientId: %d", pMsg7->m_ClientId); - return nullptr; - } - CTranslationContext::CClientData &Client = m_pClient->m_TranslationContext.m_aClients[pMsg7->m_ClientId]; - Client.Reset(); - - if(pMsg7->m_Silent) - return nullptr; - - if(Conn != g_Config.m_ClDummy) - return nullptr; - - static char s_aBuf[128]; - if(pMsg7->m_pReason[0]) - str_format(s_aBuf, sizeof(s_aBuf), "'%s' has left the game (%s)", m_aClients[pMsg7->m_ClientId].m_aName, pMsg7->m_pReason); - else - str_format(s_aBuf, sizeof(s_aBuf), "'%s' has left the game", m_aClients[pMsg7->m_ClientId].m_aName); - m_Chat.AddLine(-1, 0, s_aBuf); - - return nullptr; - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_CLIENTINFO) - { - protocol7::CNetMsg_Sv_ClientInfo *pMsg7 = (protocol7::CNetMsg_Sv_ClientInfo *)pRawMsg; - if(pMsg7->m_ClientId < 0 || pMsg7->m_ClientId >= MAX_CLIENTS) - { - dbg_msg("sixup", "Sv_ClientInfo got invalid ClientId: %d", pMsg7->m_ClientId); - return nullptr; - } - - if(pMsg7->m_Local) - { - m_pClient->m_TranslationContext.m_aLocalClientId[Conn] = pMsg7->m_ClientId; - } - CTranslationContext::CClientData &Client = m_pClient->m_TranslationContext.m_aClients[pMsg7->m_ClientId]; - Client.m_Active = true; - Client.m_Team = pMsg7->m_Team; - str_copy(Client.m_aName, pMsg7->m_pName); - str_copy(Client.m_aClan, pMsg7->m_pClan); - Client.m_Country = pMsg7->m_Country; - ApplySkin7InfoFromGameMsg(pMsg7, pMsg7->m_ClientId, Conn); - if(m_pClient->m_TranslationContext.m_aLocalClientId[Conn] == -1) - return nullptr; - if(pMsg7->m_Silent || pMsg7->m_Local) - return nullptr; - - if(Conn != g_Config.m_ClDummy) - return nullptr; - - DoTeamChangeMessage7( - pMsg7->m_pName, - pMsg7->m_ClientId, - pMsg7->m_Team, - "entered and "); - - return nullptr; // we only do side effects and add stuff to the snap here - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_GAMEINFO) - { - protocol7::CNetMsg_Sv_GameInfo *pMsg7 = (protocol7::CNetMsg_Sv_GameInfo *)pRawMsg; - m_pClient->m_TranslationContext.m_GameFlags = pMsg7->m_GameFlags; - m_pClient->m_TranslationContext.m_ScoreLimit = pMsg7->m_ScoreLimit; - m_pClient->m_TranslationContext.m_TimeLimit = pMsg7->m_TimeLimit; - m_pClient->m_TranslationContext.m_MatchNum = pMsg7->m_MatchNum; - m_pClient->m_TranslationContext.m_MatchCurrent = pMsg7->m_MatchCurrent; - m_pClient->m_TranslationContext.m_ShouldSendGameInfo = true; - return nullptr; // Added to snap by translation context - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_EMOTICON) - { - *pMsgId = NETMSGTYPE_SV_EMOTICON; - protocol7::CNetMsg_Sv_Emoticon *pMsg7 = (protocol7::CNetMsg_Sv_Emoticon *)pRawMsg; - ::CNetMsg_Sv_Emoticon *pMsg = (::CNetMsg_Sv_Emoticon *)s_aRawMsg; - - pMsg->m_ClientId = pMsg7->m_ClientId; - pMsg->m_Emoticon = pMsg7->m_Emoticon; - - return s_aRawMsg; - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_KILLMSG) - { - *pMsgId = NETMSGTYPE_SV_KILLMSG; - - protocol7::CNetMsg_Sv_KillMsg *pMsg7 = (protocol7::CNetMsg_Sv_KillMsg *)pRawMsg; - ::CNetMsg_Sv_KillMsg *pMsg = (::CNetMsg_Sv_KillMsg *)s_aRawMsg; - - pMsg->m_Killer = pMsg7->m_Killer; - pMsg->m_Victim = pMsg7->m_Victim; - pMsg->m_Weapon = pMsg7->m_Weapon; - pMsg->m_ModeSpecial = pMsg7->m_ModeSpecial; - - return s_aRawMsg; - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_CHAT) - { - *pMsgId = NETMSGTYPE_SV_CHAT; - - protocol7::CNetMsg_Sv_Chat *pMsg7 = (protocol7::CNetMsg_Sv_Chat *)pRawMsg; - ::CNetMsg_Sv_Chat *pMsg = (::CNetMsg_Sv_Chat *)s_aRawMsg; - - if(pMsg7->m_Mode == protocol7::CHAT_WHISPER) - { - bool Receive = pMsg7->m_TargetId == m_pClient->m_TranslationContext.m_aLocalClientId[Conn]; - - pMsg->m_Team = Receive ? 3 : 2; - pMsg->m_ClientId = Receive ? pMsg7->m_ClientId : pMsg7->m_TargetId; - } - else - { - pMsg->m_Team = pMsg7->m_Mode == protocol7::CHAT_TEAM ? 1 : 0; - pMsg->m_ClientId = pMsg7->m_ClientId; - } - - pMsg->m_pMessage = pMsg7->m_pMessage; - - return s_aRawMsg; - } - else if(*pMsgId == protocol7::NETMSGTYPE_SV_GAMEMSG) - { - int GameMsgId = pUnpacker->GetInt(); - - /** - * Prints chat message only once - * even if it is being sent to main tee and dummy - */ - auto SendChat = [Conn, GameMsgId, this](const char *pText) -> void { - if(GameMsgId != protocol7::GAMEMSG_TEAM_BALANCE_VICTIM && GameMsgId != protocol7::GAMEMSG_SPEC_INVALIDID) - { - if(Conn != g_Config.m_ClDummy) - return; - } - m_Chat.AddLine(-1, 0, pText); - }; - - // check for valid gamemsgid - if(GameMsgId < 0 || GameMsgId >= protocol7::NUM_GAMEMSGS) - return nullptr; - - int aParaI[3] = {0}; - int NumParaI = 0; - - // get paras - switch(gs_GameMsgList7[GameMsgId].m_ParaType) - { - case PARA_I: NumParaI = 1; break; - case PARA_II: NumParaI = 2; break; - case PARA_III: NumParaI = 3; break; - } - for(int i = 0; i < NumParaI; i++) - { - aParaI[i] = pUnpacker->GetInt(); - } - - // check for unpacking errors - if(pUnpacker->Error()) - return nullptr; - - // handle special messages - char aBuf[256]; - bool TeamPlay = m_pClient->m_TranslationContext.m_GameFlags & protocol7::GAMEFLAG_TEAMS; - if(gs_GameMsgList7[GameMsgId].m_Action == DO_SPECIAL) - { - switch(GameMsgId) - { - case protocol7::GAMEMSG_CTF_DROP: - if(Conn == g_Config.m_ClDummy) - m_Sounds.Enqueue(CSounds::CHN_GLOBAL, SOUND_CTF_DROP); - break; - case protocol7::GAMEMSG_CTF_RETURN: - if(Conn == g_Config.m_ClDummy) - m_Sounds.Enqueue(CSounds::CHN_GLOBAL, SOUND_CTF_RETURN); - break; - case protocol7::GAMEMSG_TEAM_ALL: - { - const char *pMsg = ""; - switch(GetStrTeam7(aParaI[0], TeamPlay)) - { - case STR_TEAM_GAME: pMsg = "All players were moved to the game"; break; - case STR_TEAM_RED: pMsg = "All players were moved to the red team"; break; - case STR_TEAM_BLUE: pMsg = "All players were moved to the blue team"; break; - case STR_TEAM_SPECTATORS: pMsg = "All players were moved to the spectators"; break; - } - m_Broadcast.DoBroadcast(pMsg); // client side broadcast - } - break; - case protocol7::GAMEMSG_TEAM_BALANCE_VICTIM: - { - const char *pMsg = ""; - switch(GetStrTeam7(aParaI[0], TeamPlay)) - { - case STR_TEAM_RED: pMsg = "You were moved to the red team due to team balancing"; break; - case STR_TEAM_BLUE: pMsg = "You were moved to the blue team due to team balancing"; break; - } - m_Broadcast.DoBroadcast(pMsg); // client side broadcast - } - break; - case protocol7::GAMEMSG_CTF_GRAB: - if(Conn == g_Config.m_ClDummy) - m_Sounds.Enqueue(CSounds::CHN_GLOBAL, SOUND_CTF_GRAB_EN); - break; - case protocol7::GAMEMSG_GAME_PAUSED: - { - int ClientId = clamp(aParaI[0], 0, MAX_CLIENTS - 1); - str_format(aBuf, sizeof(aBuf), "'%s' initiated a pause", m_aClients[ClientId].m_aName); - SendChat(aBuf); - } - break; - case protocol7::GAMEMSG_CTF_CAPTURE: - if(Conn == g_Config.m_ClDummy) - m_Sounds.Enqueue(CSounds::CHN_GLOBAL, SOUND_CTF_CAPTURE); - int ClientId = clamp(aParaI[1], 0, MAX_CLIENTS - 1); - m_aStats[ClientId].m_FlagCaptures++; - - float Time = aParaI[2] / (float)Client()->GameTickSpeed(); - if(Time <= 60) - { - if(aParaI[0]) - { - str_format(aBuf, sizeof(aBuf), "The blue flag was captured by '%s' (%.2f seconds)", m_aClients[ClientId].m_aName, Time); - } - else - { - str_format(aBuf, sizeof(aBuf), "The red flag was captured by '%s' (%.2f seconds)", m_aClients[ClientId].m_aName, Time); - } - } - else - { - if(aParaI[0]) - { - str_format(aBuf, sizeof(aBuf), "The blue flag was captured by '%s'", m_aClients[ClientId].m_aName); - } - else - { - str_format(aBuf, sizeof(aBuf), "The red flag was captured by '%s'", m_aClients[ClientId].m_aName); - } - } - SendChat(aBuf); - } - return nullptr; - } - - // build message - const char *pText = ""; - if(NumParaI == 0) - { - pText = gs_GameMsgList7[GameMsgId].m_pText; - } - - // handle message - switch(gs_GameMsgList7[GameMsgId].m_Action) - { - case DO_CHAT: - SendChat(pText); - break; - case DO_BROADCAST: - m_Broadcast.DoBroadcast(pText); // client side broadcast - break; - } - - // no need to handle it in 0.6 since we printed - // the message already - return nullptr; - } - - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "dropped weird message '%s' (%d), failed on '%s'", m_NetObjHandler7.GetMsgName(*pMsgId), *pMsgId, m_NetObjHandler7.FailedMsgOn()); - Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client", aBuf); - - return nullptr; -} diff --git a/src/game/client/sixup_translate_snapshot.cpp b/src/game/client/sixup_translate_snapshot.cpp deleted file mode 100644 index 2c33f4e1db..0000000000 --- a/src/game/client/sixup_translate_snapshot.cpp +++ /dev/null @@ -1,564 +0,0 @@ -#include -#include -#include -#include -#include - -int CGameClient::TranslateSnap(CSnapshot *pSnapDstSix, CSnapshot *pSnapSrcSeven, int Conn, bool Dummy) -{ - CSnapshotBuilder Builder; - Builder.Init(); - - float LocalTime = Client()->LocalTime(); - int GameTick = Client()->GameTick(g_Config.m_ClDummy); - CTranslationContext &TranslationContext = Client()->m_TranslationContext; - - for(auto &PlayerInfosRace : TranslationContext.m_apPlayerInfosRace) - PlayerInfosRace = nullptr; - - int SpectatorId = -3; - - for(int i = 0; i < pSnapSrcSeven->NumItems(); i++) - { - const CSnapshotItem *pItem7 = (CSnapshotItem *)pSnapSrcSeven->GetItem(i); - const int Size = pSnapSrcSeven->GetItemSize(i); - const int ItemType = pSnapSrcSeven->GetItemType(i); - - // ddnet ex snap items - if((ItemType > __NETOBJTYPE_UUID_HELPER && ItemType < OFFSET_NETMSGTYPE_UUID) || pItem7->Type() == NETOBJTYPE_EX) - { - CUnpacker Unpacker; - Unpacker.Reset(pItem7->Data(), Size); - - void *pRawObj = GetNetObjHandler()->SecureUnpackObj(ItemType, &Unpacker); - if(!pRawObj) - { - if(ItemType != UUID_UNKNOWN) - dbg_msg("sixup", "dropped weird ddnet ex object '%s' (%d), failed on '%s'", GetNetObjHandler()->GetObjName(ItemType), ItemType, GetNetObjHandler()->FailedObjOn()); - continue; - } - const int ItemSize = GetNetObjHandler()->GetUnpackedObjSize(ItemType); - - void *pObj = Builder.NewItem(pItem7->Type(), pItem7->Id(), ItemSize); - if(!pObj) - return -17; - - mem_copy(pObj, pRawObj, ItemSize); - continue; - } - - if(GetNetObjHandler7()->ValidateObj(pItem7->Type(), pItem7->Data(), Size) != 0) - { - if(pItem7->Type() > 0 && pItem7->Type() < CSnapshot::OFFSET_UUID_TYPE) - { - dbg_msg( - "sixup", - "invalidated index=%d type=%d (%s) size=%d id=%d", - i, - pItem7->Type(), - GetNetObjHandler7()->GetObjName(pItem7->Type()), - Size, - pItem7->Id()); - } - pSnapSrcSeven->InvalidateItem(i); - } - - if(pItem7->Type() == protocol7::NETOBJTYPE_PLAYERINFORACE) - { - const protocol7::CNetObj_PlayerInfoRace *pInfo = (const protocol7::CNetObj_PlayerInfoRace *)pItem7->Data(); - int ClientId = pItem7->Id(); - if(ClientId < MAX_CLIENTS && TranslationContext.m_aClients[ClientId].m_Active) - { - TranslationContext.m_apPlayerInfosRace[ClientId] = pInfo; - } - } - else if(pItem7->Type() == protocol7::NETOBJTYPE_SPECTATORINFO) - { - const protocol7::CNetObj_SpectatorInfo *pSpec7 = (const protocol7::CNetObj_SpectatorInfo *)pItem7->Data(); - SpectatorId = pSpec7->m_SpectatorId; - if(pSpec7->m_SpecMode == protocol7::SPEC_FREEVIEW) - SpectatorId = SPEC_FREEVIEW; - } - } - - // hack to put game info in the snap - // even though in 0.7 we get it as a game message - // this message has to be on the top - // the client looks at the items in order and needs the gameinfo at the top - // otherwise it will not render skins with team colors - if(TranslationContext.m_ShouldSendGameInfo) - { - void *pObj = Builder.NewItem(NETOBJTYPE_GAMEINFO, 0, sizeof(CNetObj_GameInfo)); - if(!pObj) - return -1; - - int GameStateFlagsSix = 0; - if(TranslationContext.m_GameStateFlags7 & protocol7::GAMESTATEFLAG_GAMEOVER) - GameStateFlagsSix |= GAMESTATEFLAG_GAMEOVER; - if(TranslationContext.m_GameStateFlags7 & protocol7::GAMESTATEFLAG_SUDDENDEATH) - GameStateFlagsSix |= GAMESTATEFLAG_SUDDENDEATH; - if(TranslationContext.m_GameStateFlags7 & protocol7::GAMESTATEFLAG_PAUSED) - GameStateFlagsSix |= GAMESTATEFLAG_PAUSED; - - /* - This is a 0.7 only flag that we just ignore for now - - GAMESTATEFLAG_ROUNDOVER - */ - - CNetObj_GameInfo Info6 = {}; - Info6.m_GameFlags = TranslationContext.m_GameFlags; - Info6.m_GameStateFlags = GameStateFlagsSix; - Info6.m_RoundStartTick = TranslationContext.m_GameStartTick7; - Info6.m_WarmupTimer = 0; // removed in 0.7 - if(TranslationContext.m_GameStateFlags7 & protocol7::GAMESTATEFLAG_WARMUP) - Info6.m_WarmupTimer = TranslationContext.m_GameStateEndTick7 - GameTick; - if(TranslationContext.m_GameStateFlags7 & protocol7::GAMESTATEFLAG_STARTCOUNTDOWN) - Info6.m_WarmupTimer = TranslationContext.m_GameStateEndTick7 - GameTick; - - // hack to port 0.7 race timer to ddnet warmup gametimer hack - int TimerClientId = clamp(TranslationContext.m_aLocalClientId[Conn], 0, (int)MAX_CLIENTS); - if(SpectatorId >= 0) - TimerClientId = SpectatorId; - const protocol7::CNetObj_PlayerInfoRace *pRaceInfo = TranslationContext.m_apPlayerInfosRace[TimerClientId]; - if(pRaceInfo) - { - Info6.m_WarmupTimer = -pRaceInfo->m_RaceStartTick; - Info6.m_GameStateFlags |= GAMESTATEFLAG_RACETIME; - } - - Info6.m_ScoreLimit = TranslationContext.m_ScoreLimit; - Info6.m_TimeLimit = TranslationContext.m_TimeLimit; - Info6.m_RoundNum = TranslationContext.m_MatchNum; - Info6.m_RoundCurrent = TranslationContext.m_MatchCurrent; - - mem_copy(pObj, &Info6, sizeof(CNetObj_GameInfo)); - } - - for(int i = 0; i < MAX_CLIENTS; i++) - { - const CTranslationContext::CClientData &Client = TranslationContext.m_aClients[i]; - if(!Client.m_Active) - continue; - - void *pObj = Builder.NewItem(NETOBJTYPE_CLIENTINFO, i, sizeof(CNetObj_ClientInfo)); - if(!pObj) - return -2; - - CNetObj_ClientInfo Info6 = {}; - StrToInts(&Info6.m_Name0, 4, Client.m_aName); - StrToInts(&Info6.m_Clan0, 3, Client.m_aClan); - Info6.m_Country = Client.m_Country; - StrToInts(&Info6.m_Skin0, 6, Client.m_aSkinName); - Info6.m_UseCustomColor = Client.m_UseCustomColor; - Info6.m_ColorBody = Client.m_ColorBody; - Info6.m_ColorFeet = Client.m_ColorFeet; - mem_copy(pObj, &Info6, sizeof(CNetObj_ClientInfo)); - } - - bool NewGameData = false; - - for(int i = 0; i < pSnapSrcSeven->NumItems(); i++) - { - const CSnapshotItem *pItem7 = pSnapSrcSeven->GetItem(i); - const int Size = pSnapSrcSeven->GetItemSize(i); - // the first few items are a full match - // no translation needed - if(pItem7->Type() == protocol7::NETOBJTYPE_PROJECTILE || - pItem7->Type() == protocol7::NETOBJTYPE_LASER || - pItem7->Type() == protocol7::NETOBJTYPE_FLAG) - { - void *pObj = Builder.NewItem(pItem7->Type(), pItem7->Id(), Size); - if(!pObj) - return -4; - - mem_copy(pObj, pItem7->Data(), Size); - } - else if(pItem7->Type() == protocol7::NETOBJTYPE_PICKUP) - { - void *pObj = Builder.NewItem(NETOBJTYPE_PICKUP, pItem7->Id(), sizeof(CNetObj_Pickup)); - if(!pObj) - return -5; - - const protocol7::CNetObj_Pickup *pPickup7 = (const protocol7::CNetObj_Pickup *)pItem7->Data(); - CNetObj_Pickup Pickup6 = {}; - Pickup6.m_X = pPickup7->m_X; - Pickup6.m_Y = pPickup7->m_Y; - PickupType_SevenToSix(pPickup7->m_Type, Pickup6.m_Type, Pickup6.m_Subtype); - - mem_copy(pObj, &Pickup6, sizeof(CNetObj_Pickup)); - } - else if(pItem7->Type() == protocol7::NETOBJTYPE_GAMEDATA) - { - const protocol7::CNetObj_GameData *pGameData = (const protocol7::CNetObj_GameData *)pItem7->Data(); - TranslationContext.m_GameStateFlags7 = pGameData->m_GameStateFlags; - TranslationContext.m_GameStartTick7 = pGameData->m_GameStartTick; - TranslationContext.m_GameStateEndTick7 = pGameData->m_GameStateEndTick; - } - else if(pItem7->Type() == protocol7::NETOBJTYPE_GAMEDATATEAM) - { - // 0.7 added GameDataTeam and GameDataFlag - // both items merged together have all fields of the 0.6 GameData - // so if we get either one of them we store the details in the translation context - // and build one GameData snap item after this loop - const protocol7::CNetObj_GameDataTeam *pTeam7 = (const protocol7::CNetObj_GameDataTeam *)pItem7->Data(); - - TranslationContext.m_TeamscoreRed = pTeam7->m_TeamscoreRed; - TranslationContext.m_TeamscoreBlue = pTeam7->m_TeamscoreBlue; - NewGameData = true; - } - else if(pItem7->Type() == protocol7::NETOBJTYPE_GAMEDATAFLAG) - { - const protocol7::CNetObj_GameDataFlag *pFlag7 = (const protocol7::CNetObj_GameDataFlag *)pItem7->Data(); - - TranslationContext.m_FlagCarrierRed = pFlag7->m_FlagCarrierRed; - TranslationContext.m_FlagCarrierBlue = pFlag7->m_FlagCarrierBlue; - NewGameData = true; - - // used for blinking the flags in the hud - // but that already works the 0.6 way - // and is covered by the NETOBJTYPE_GAMEDATA translation - // pFlag7->m_FlagDropTickRed; - // pFlag7->m_FlagDropTickBlue; - } - else if(pItem7->Type() == protocol7::NETOBJTYPE_CHARACTER) - { - void *pObj = Builder.NewItem(NETOBJTYPE_CHARACTER, pItem7->Id(), sizeof(CNetObj_Character)); - if(!pObj) - return -6; - - const protocol7::CNetObj_Character *pChar7 = (const protocol7::CNetObj_Character *)pItem7->Data(); - - CNetObj_Character Char6 = {}; - // character core is unchanged - mem_copy(&Char6, pItem7->Data(), sizeof(CNetObj_CharacterCore)); - - Char6.m_PlayerFlags = 0; - if(pItem7->Id() >= 0 && pItem7->Id() < MAX_CLIENTS) - Char6.m_PlayerFlags = PlayerFlags_SevenToSix(TranslationContext.m_aClients[pItem7->Id()].m_PlayerFlags7); - Char6.m_Health = pChar7->m_Health; - Char6.m_Armor = pChar7->m_Armor; - Char6.m_AmmoCount = pChar7->m_AmmoCount; - Char6.m_Weapon = pChar7->m_Weapon; - Char6.m_Emote = pChar7->m_Emote; - Char6.m_AttackTick = pChar7->m_AttackTick; - - if(pChar7->m_TriggeredEvents & protocol7::COREEVENTFLAG_HOOK_ATTACH_PLAYER) - { - void *pEvent = Builder.NewItem(NETEVENTTYPE_SOUNDWORLD, pItem7->Id(), sizeof(CNetEvent_SoundWorld)); - if(!pEvent) - return -7; - - CNetEvent_SoundWorld Sound = {}; - Sound.m_X = pChar7->m_X; - Sound.m_Y = pChar7->m_Y; - Sound.m_SoundId = SOUND_HOOK_ATTACH_PLAYER; - mem_copy(pEvent, &Sound, sizeof(CNetEvent_SoundWorld)); - } - - if(TranslationContext.m_aLocalClientId[Conn] != pItem7->Id()) - { - if(pChar7->m_TriggeredEvents & protocol7::COREEVENTFLAG_GROUND_JUMP) - { - void *pEvent = Builder.NewItem(NETEVENTTYPE_SOUNDWORLD, pItem7->Id(), sizeof(CNetEvent_SoundWorld)); - if(!pEvent) - return -7; - - CNetEvent_SoundWorld Sound = {}; - Sound.m_X = pChar7->m_X; - Sound.m_Y = pChar7->m_Y; - Sound.m_SoundId = SOUND_PLAYER_JUMP; - mem_copy(pEvent, &Sound, sizeof(CNetEvent_SoundWorld)); - } - if(pChar7->m_TriggeredEvents & protocol7::COREEVENTFLAG_HOOK_ATTACH_GROUND) - { - void *pEvent = Builder.NewItem(NETEVENTTYPE_SOUNDWORLD, pItem7->Id(), sizeof(CNetEvent_SoundWorld)); - if(!pEvent) - return -7; - - CNetEvent_SoundWorld Sound = {}; - Sound.m_X = pChar7->m_X; - Sound.m_Y = pChar7->m_Y; - Sound.m_SoundId = SOUND_HOOK_ATTACH_GROUND; - mem_copy(pEvent, &Sound, sizeof(CNetEvent_SoundWorld)); - } - if(pChar7->m_TriggeredEvents & protocol7::COREEVENTFLAG_HOOK_HIT_NOHOOK) - { - void *pEvent = Builder.NewItem(NETEVENTTYPE_SOUNDWORLD, pItem7->Id(), sizeof(CNetEvent_SoundWorld)); - if(!pEvent) - return -7; - - CNetEvent_SoundWorld Sound = {}; - Sound.m_X = pChar7->m_X; - Sound.m_Y = pChar7->m_Y; - Sound.m_SoundId = SOUND_HOOK_NOATTACH; - mem_copy(pEvent, &Sound, sizeof(CNetEvent_SoundWorld)); - } - } - - mem_copy(pObj, &Char6, sizeof(CNetObj_Character)); - } - else if(pItem7->Type() == protocol7::NETOBJTYPE_PLAYERINFO) - { - void *pObj = Builder.NewItem(NETOBJTYPE_PLAYERINFO, pItem7->Id(), sizeof(CNetObj_PlayerInfo)); - if(!pObj) - return -8; - - const protocol7::CNetObj_PlayerInfo *pInfo7 = (const protocol7::CNetObj_PlayerInfo *)pItem7->Data(); - CNetObj_PlayerInfo Info6 = {}; - Info6.m_Local = TranslationContext.m_aLocalClientId[Conn] == pItem7->Id(); - Info6.m_ClientId = pItem7->Id(); - Info6.m_Team = 0; - if(pItem7->Id() >= 0 && pItem7->Id() < MAX_CLIENTS) - { - Info6.m_Team = TranslationContext.m_aClients[pItem7->Id()].m_Team; - TranslationContext.m_aClients[pItem7->Id()].m_PlayerFlags7 = pInfo7->m_PlayerFlags; - } - Info6.m_Score = pInfo7->m_Score; - Info6.m_Latency = pInfo7->m_Latency; - mem_copy(pObj, &Info6, sizeof(CNetObj_PlayerInfo)); - } - else if(pItem7->Type() == protocol7::NETOBJTYPE_SPECTATORINFO) - { - void *pObj = Builder.NewItem(NETOBJTYPE_SPECTATORINFO, pItem7->Id(), sizeof(CNetObj_SpectatorInfo)); - if(!pObj) - return -9; - - const protocol7::CNetObj_SpectatorInfo *pSpec7 = (const protocol7::CNetObj_SpectatorInfo *)pItem7->Data(); - CNetObj_SpectatorInfo Spec6 = {}; - Spec6.m_SpectatorId = pSpec7->m_SpectatorId; - if(pSpec7->m_SpecMode == protocol7::SPEC_FREEVIEW) - Spec6.m_SpectatorId = SPEC_FREEVIEW; - Spec6.m_X = pSpec7->m_X; - Spec6.m_Y = pSpec7->m_Y; - mem_copy(pObj, &Spec6, sizeof(CNetObj_SpectatorInfo)); - } - else if(pItem7->Type() == protocol7::NETEVENTTYPE_EXPLOSION) - { - void *pEvent = Builder.NewItem(NETEVENTTYPE_EXPLOSION, pItem7->Id(), sizeof(CNetEvent_Explosion)); - if(!pEvent) - return -10; - - const protocol7::CNetEvent_Explosion *pExplosion7 = (const protocol7::CNetEvent_Explosion *)pItem7->Data(); - CNetEvent_Explosion Explosion6 = {}; - Explosion6.m_X = pExplosion7->m_X; - Explosion6.m_Y = pExplosion7->m_Y; - mem_copy(pEvent, &Explosion6, sizeof(CNetEvent_Explosion)); - } - else if(pItem7->Type() == protocol7::NETEVENTTYPE_SPAWN) - { - void *pEvent = Builder.NewItem(NETEVENTTYPE_SPAWN, pItem7->Id(), sizeof(CNetEvent_Spawn)); - if(!pEvent) - return -11; - - const protocol7::CNetEvent_Spawn *pSpawn7 = (const protocol7::CNetEvent_Spawn *)pItem7->Data(); - CNetEvent_Spawn Spawn6 = {}; - Spawn6.m_X = pSpawn7->m_X; - Spawn6.m_Y = pSpawn7->m_Y; - mem_copy(pEvent, &Spawn6, sizeof(CNetEvent_Spawn)); - } - else if(pItem7->Type() == protocol7::NETEVENTTYPE_HAMMERHIT) - { - void *pEvent = Builder.NewItem(NETEVENTTYPE_HAMMERHIT, pItem7->Id(), sizeof(CNetEvent_HammerHit)); - if(!pEvent) - return -12; - - const protocol7::CNetEvent_HammerHit *pHammerHit7 = (const protocol7::CNetEvent_HammerHit *)pItem7->Data(); - CNetEvent_HammerHit HammerHit6 = {}; - HammerHit6.m_X = pHammerHit7->m_X; - HammerHit6.m_Y = pHammerHit7->m_Y; - mem_copy(pEvent, &HammerHit6, sizeof(CNetEvent_HammerHit)); - } - else if(pItem7->Type() == protocol7::NETEVENTTYPE_DEATH) - { - void *pEvent = Builder.NewItem(NETEVENTTYPE_DEATH, pItem7->Id(), sizeof(CNetEvent_Death)); - if(!pEvent) - return -13; - - const protocol7::CNetEvent_Death *pDeath7 = (const protocol7::CNetEvent_Death *)pItem7->Data(); - CNetEvent_Death Death6 = {}; - Death6.m_X = pDeath7->m_X; - Death6.m_Y = pDeath7->m_Y; - Death6.m_ClientId = pDeath7->m_ClientId; - mem_copy(pEvent, &Death6, sizeof(CNetEvent_Death)); - } - else if(pItem7->Type() == protocol7::NETEVENTTYPE_SOUNDWORLD) - { - void *pEvent = Builder.NewItem(NETEVENTTYPE_SOUNDWORLD, pItem7->Id(), sizeof(CNetEvent_SoundWorld)); - if(!pEvent) - return -14; - - const protocol7::CNetEvent_SoundWorld *pSoundWorld7 = (const protocol7::CNetEvent_SoundWorld *)pItem7->Data(); - CNetEvent_SoundWorld SoundWorld6 = {}; - SoundWorld6.m_X = pSoundWorld7->m_X; - SoundWorld6.m_Y = pSoundWorld7->m_Y; - SoundWorld6.m_SoundId = pSoundWorld7->m_SoundId; - mem_copy(pEvent, &SoundWorld6, sizeof(CNetEvent_SoundWorld)); - } - else if(pItem7->Type() == protocol7::NETEVENTTYPE_DAMAGE) - { - // 0.7 introduced amount for damage indicators - // so for one 0.7 item we might create multiple 0.6 ones - const protocol7::CNetEvent_Damage *pDmg7 = (const protocol7::CNetEvent_Damage *)pItem7->Data(); - - int Amount = pDmg7->m_HealthAmount + pDmg7->m_ArmorAmount; - if(Amount < 1) - continue; - - int ClientId = pDmg7->m_ClientId; - TranslationContext.m_aDamageTaken[ClientId]++; - - float Angle; - // create healthmod indicator - if(LocalTime < TranslationContext.m_aDamageTakenTick[ClientId] + 0.5f) - { - // make sure that the damage indicators don't group together - Angle = TranslationContext.m_aDamageTaken[ClientId] * 0.25f; - } - else - { - TranslationContext.m_aDamageTaken[ClientId] = 0; - Angle = 0; - } - - TranslationContext.m_aDamageTakenTick[ClientId] = LocalTime; - - float a = 3 * pi / 2 + Angle; - float s = a - pi / 3; - float e = a + pi / 3; - for(int k = 0; k < Amount; k++) - { - // pItem7->Id() is reused that is technically wrong - // but the client implementation does not look at the ids - // and renders the damage indicators just fine - void *pEvent = Builder.NewItem(NETEVENTTYPE_DAMAGEIND, pItem7->Id(), sizeof(CNetEvent_DamageInd)); - if(!pEvent) - return -16; - - CNetEvent_DamageInd Dmg6 = {}; - Dmg6.m_X = pDmg7->m_X; - Dmg6.m_Y = pDmg7->m_Y; - float f = mix(s, e, float(k + 1) / float(Amount + 2)); - Dmg6.m_Angle = (int)(f * 256.0f); - mem_copy(pEvent, &Dmg6, sizeof(CNetEvent_DamageInd)); - } - } - else if(pItem7->Type() == protocol7::NETOBJTYPE_DE_CLIENTINFO) - { - const protocol7::CNetObj_De_ClientInfo *pInfo = (const protocol7::CNetObj_De_ClientInfo *)pItem7->Data(); - - const int ClientId = pItem7->Id(); - - if(ClientId < 0 || ClientId >= MAX_CLIENTS) - { - dbg_msg("sixup", "De_ClientInfo got invalid ClientId: %d", ClientId); - return -17; - } - - if(pInfo->m_Local) - { - TranslationContext.m_aLocalClientId[Conn] = ClientId; - } - CTranslationContext::CClientData &Client = TranslationContext.m_aClients[ClientId]; - Client.m_Active = true; - Client.m_Team = pInfo->m_Team; - IntsToStr(pInfo->m_aName, 4, Client.m_aName, std::size(Client.m_aName)); - IntsToStr(pInfo->m_aClan, 3, Client.m_aClan, std::size(Client.m_aClan)); - Client.m_Country = pInfo->m_Country; - - ApplySkin7InfoFromSnapObj(pInfo, ClientId); - } - else if(pItem7->Type() == protocol7::NETOBJTYPE_DE_GAMEINFO) - { - const protocol7::CNetObj_De_GameInfo *pInfo = (const protocol7::CNetObj_De_GameInfo *)pItem7->Data(); - - TranslationContext.m_GameFlags = pInfo->m_GameFlags; - TranslationContext.m_ScoreLimit = pInfo->m_ScoreLimit; - TranslationContext.m_TimeLimit = pInfo->m_TimeLimit; - TranslationContext.m_MatchNum = pInfo->m_MatchNum; - TranslationContext.m_MatchCurrent = pInfo->m_MatchCurrent; - TranslationContext.m_ShouldSendGameInfo = true; - } - } - - if(NewGameData) - { - void *pObj = Builder.NewItem(NETOBJTYPE_GAMEDATA, 0, sizeof(CNetObj_GameData)); - if(!pObj) - return -17; - - CNetObj_GameData GameData = {}; - GameData.m_TeamscoreRed = TranslationContext.m_TeamscoreRed; - GameData.m_TeamscoreBlue = TranslationContext.m_TeamscoreBlue; - GameData.m_FlagCarrierRed = TranslationContext.m_FlagCarrierRed; - GameData.m_FlagCarrierBlue = TranslationContext.m_FlagCarrierBlue; - mem_copy(pObj, &GameData, sizeof(CNetObj_GameData)); - } - - return Builder.Finish(pSnapDstSix); -} - -int CGameClient::OnDemoRecSnap7(CSnapshot *pFrom, CSnapshot *pTo, int Conn) -{ - CSnapshotBuilder Builder; - Builder.Init7(pFrom); - - // add client info - for(int i = 0; i < MAX_CLIENTS; i++) - { - if(!m_aClients[i].m_Active) - continue; - - void *pItem = Builder.NewItem(protocol7::NETOBJTYPE_DE_CLIENTINFO, i, sizeof(protocol7::CNetObj_De_ClientInfo)); - if(!pItem) - return -1; - - CTranslationContext::CClientData &ClientData = Client()->m_TranslationContext.m_aClients[i]; - - protocol7::CNetObj_De_ClientInfo ClientInfoObj; - ClientInfoObj.m_Local = i == Client()->m_TranslationContext.m_aLocalClientId[Conn]; - ClientInfoObj.m_Team = ClientData.m_Team; - StrToInts(ClientInfoObj.m_aName, 4, m_aClients[i].m_aName); - StrToInts(ClientInfoObj.m_aClan, 3, m_aClients[i].m_aClan); - ClientInfoObj.m_Country = ClientData.m_Country; - - for(int Part = 0; Part < protocol7::NUM_SKINPARTS; Part++) - { - StrToInts(ClientInfoObj.m_aaSkinPartNames[Part], 6, m_aClients[i].m_aSixup[Conn].m_aaSkinPartNames[Part]); - ClientInfoObj.m_aUseCustomColors[Part] = m_aClients[i].m_aSixup[Conn].m_aUseCustomColors[Part]; - ClientInfoObj.m_aSkinPartColors[Part] = m_aClients[i].m_aSixup[Conn].m_aSkinPartColors[Part]; - } - - mem_copy(pItem, &ClientInfoObj, sizeof(protocol7::CNetObj_De_ClientInfo)); - } - - // add tuning - CTuningParams StandardTuning; - if(mem_comp(&StandardTuning, &m_aTuning[Conn], sizeof(CTuningParams)) != 0) - { - void *pItem = Builder.NewItem(protocol7::NETOBJTYPE_DE_TUNEPARAMS, 0, sizeof(protocol7::CNetObj_De_TuneParams)); - if(!pItem) - return -2; - - protocol7::CNetObj_De_TuneParams TuneParams; - mem_copy(&TuneParams.m_aTuneParams, &m_aTuning[Conn], sizeof(TuneParams)); - mem_copy(pItem, &TuneParams, sizeof(protocol7::CNetObj_De_TuneParams)); - } - - // add game info - void *pItem = Builder.NewItem(protocol7::NETOBJTYPE_DE_GAMEINFO, 0, sizeof(protocol7::CNetObj_De_GameInfo)); - if(!pItem) - return -3; - - protocol7::CNetObj_De_GameInfo GameInfo; - - GameInfo.m_GameFlags = Client()->m_TranslationContext.m_GameFlags; - GameInfo.m_ScoreLimit = Client()->m_TranslationContext.m_ScoreLimit; - GameInfo.m_TimeLimit = Client()->m_TranslationContext.m_TimeLimit; - GameInfo.m_MatchNum = Client()->m_TranslationContext.m_MatchNum; - GameInfo.m_MatchCurrent = Client()->m_TranslationContext.m_MatchCurrent; - - mem_copy(pItem, &GameInfo, sizeof(protocol7::CNetObj_De_GameInfo)); - - return Builder.Finish(pTo); -} diff --git a/src/game/client/skin.h b/src/game/client/skin.h deleted file mode 100644 index 714df154ce..0000000000 --- a/src/game/client/skin.h +++ /dev/null @@ -1,182 +0,0 @@ -#ifndef GAME_CLIENT_SKIN_H -#define GAME_CLIENT_SKIN_H - -#include -#include -#include - -#include -#include - -#include - -// do this better and nicer -struct CSkin -{ -private: - char m_aName[MAX_SKIN_LENGTH]; - -public: - struct SSkinTextures - { - IGraphics::CTextureHandle m_Body; - IGraphics::CTextureHandle m_BodyOutline; - - IGraphics::CTextureHandle m_Feet; - IGraphics::CTextureHandle m_FeetOutline; - - IGraphics::CTextureHandle m_Hands; - IGraphics::CTextureHandle m_HandsOutline; - - IGraphics::CTextureHandle m_aEyes[6]; - - void Reset() - { - m_Body = IGraphics::CTextureHandle(); - m_BodyOutline = IGraphics::CTextureHandle(); - m_Feet = IGraphics::CTextureHandle(); - m_FeetOutline = IGraphics::CTextureHandle(); - m_Hands = IGraphics::CTextureHandle(); - m_HandsOutline = IGraphics::CTextureHandle(); - for(auto &Eye : m_aEyes) - Eye = IGraphics::CTextureHandle(); - } - - void Unload(IGraphics *pGraphics) - { - pGraphics->UnloadTexture(&m_Body); - pGraphics->UnloadTexture(&m_BodyOutline); - pGraphics->UnloadTexture(&m_Feet); - pGraphics->UnloadTexture(&m_FeetOutline); - pGraphics->UnloadTexture(&m_Hands); - pGraphics->UnloadTexture(&m_HandsOutline); - for(auto &Eye : m_aEyes) - pGraphics->UnloadTexture(&Eye); - } - }; - - SSkinTextures m_OriginalSkin; - SSkinTextures m_ColorableSkin; - ColorRGBA m_BloodColor; - - template - struct SSkinMetricVariableInt - { - int m_Value; - operator int() const { return m_Value; } - SSkinMetricVariableInt &operator=(int NewVal) - { - if(IsSizeType) - m_Value = maximum(m_Value, NewVal); - else - m_Value = minimum(m_Value, NewVal); - return *this; - } - - SSkinMetricVariableInt() - { - Reset(); - } - - void Reset() - { - if(IsSizeType) - m_Value = std::numeric_limits::lowest(); - else - m_Value = std::numeric_limits::max(); - } - }; - - struct SSkinMetricVariable - { - SSkinMetricVariableInt m_Width; - SSkinMetricVariableInt m_Height; - SSkinMetricVariableInt m_OffsetX; - SSkinMetricVariableInt m_OffsetY; - - // these can be used to normalize the metrics - SSkinMetricVariableInt m_MaxWidth; - SSkinMetricVariableInt m_MaxHeight; - - float WidthNormalized() const - { - return (float)m_Width / (float)m_MaxWidth; - } - - float HeightNormalized() const - { - return (float)m_Height / (float)m_MaxHeight; - } - - float OffsetXNormalized() const - { - return (float)m_OffsetX / (float)m_MaxWidth; - } - - float OffsetYNormalized() const - { - return (float)m_OffsetY / (float)m_MaxHeight; - } - - void Reset() - { - m_Width.Reset(); - m_Height.Reset(); - m_OffsetX.Reset(); - m_OffsetY.Reset(); - m_MaxWidth.Reset(); - m_MaxHeight.Reset(); - } - }; - - struct SSkinMetrics - { - SSkinMetricVariable m_Body; - SSkinMetricVariable m_Feet; - - void Reset() - { - m_Body.Reset(); - m_Feet.Reset(); - } - - SSkinMetrics() - { - Reset(); - } - }; - SSkinMetrics m_Metrics; - - bool operator<(const CSkin &Other) const { return str_comp(m_aName, Other.m_aName) < 0; } - bool operator==(const CSkin &Other) const { return !str_comp(m_aName, Other.m_aName); } - - CSkin(const char *pName) - { - str_copy(m_aName, pName); - } - CSkin(CSkin &&) = default; - CSkin &operator=(CSkin &&) = default; - - const char *GetName() const { return m_aName; } - - // has to be kept in sync with m_aSkinNameRestrictions - static bool IsValidName(const char *pName) - { - if(pName[0] == '\0' || str_length(pName) >= (int)sizeof(CSkin("").m_aName)) - { - return false; - } - - for(int i = 0; pName[i] != '\0'; ++i) - { - if(pName[i] == '"' || pName[i] == '/' || pName[i] == '\\') - { - return false; - } - } - return true; - } - static constexpr char m_aSkinNameRestrictions[] = "Skin names must be valid filenames shorter than 24 characters."; -}; - -#endif diff --git a/src/game/client/ui.cpp b/src/game/client/ui.cpp deleted file mode 100644 index b551d19c74..0000000000 --- a/src/game/client/ui.cpp +++ /dev/null @@ -1,2184 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include "ui.h" -#include "ui_scrollregion.h" - -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include - -using namespace FontIcons; - -void CUIElement::Init(CUi *pUI, int RequestedRectCount) -{ - m_pUI = pUI; - pUI->AddUIElement(this); - if(RequestedRectCount > 0) - InitRects(RequestedRectCount); -} - -void CUIElement::InitRects(int RequestedRectCount) -{ - dbg_assert(m_vUIRects.empty(), "UI rects can only be initialized once, create another ui element instead."); - m_vUIRects.resize(RequestedRectCount); - for(auto &Rect : m_vUIRects) - Rect.m_pParent = this; -} - -CUIElement::SUIElementRect::SUIElementRect() { Reset(); } - -void CUIElement::SUIElementRect::Reset() -{ - m_UIRectQuadContainer = -1; - m_UITextContainer.Reset(); - m_X = -1; - m_Y = -1; - m_Width = -1; - m_Height = -1; - m_Rounding = -1.0f; - m_Corners = -1; - m_Text.clear(); - m_Cursor.Reset(); - m_TextColor = ColorRGBA(-1, -1, -1, -1); - m_TextOutlineColor = ColorRGBA(-1, -1, -1, -1); - m_QuadColor = ColorRGBA(-1, -1, -1, -1); - m_ReadCursorGlyphCount = -1; -} - -void CUIElement::SUIElementRect::Draw(const CUIRect *pRect, ColorRGBA Color, int Corners, float Rounding) -{ - bool NeedsRecreate = false; - if(m_UIRectQuadContainer == -1 || m_Width != pRect->w || m_Height != pRect->h || m_QuadColor != Color) - { - m_pParent->Ui()->Graphics()->DeleteQuadContainer(m_UIRectQuadContainer); - NeedsRecreate = true; - } - m_X = pRect->x; - m_Y = pRect->y; - if(NeedsRecreate) - { - m_Width = pRect->w; - m_Height = pRect->h; - m_QuadColor = Color; - - m_pParent->Ui()->Graphics()->SetColor(Color); - m_UIRectQuadContainer = m_pParent->Ui()->Graphics()->CreateRectQuadContainer(0, 0, pRect->w, pRect->h, Rounding, Corners); - m_pParent->Ui()->Graphics()->SetColor(1, 1, 1, 1); - } - - m_pParent->Ui()->Graphics()->TextureClear(); - m_pParent->Ui()->Graphics()->RenderQuadContainerEx(m_UIRectQuadContainer, - 0, -1, m_X, m_Y, 1, 1); -} - -/******************************************************** - UI -*********************************************************/ - -const CLinearScrollbarScale CUi::ms_LinearScrollbarScale; -const CLogarithmicScrollbarScale CUi::ms_LogarithmicScrollbarScale(25); -const CDarkButtonColorFunction CUi::ms_DarkButtonColorFunction; -const CLightButtonColorFunction CUi::ms_LightButtonColorFunction; -const CScrollBarColorFunction CUi::ms_ScrollBarColorFunction; -const float CUi::ms_FontmodHeight = 0.8f; - -CUi *CUIElementBase::s_pUI = nullptr; - -IClient *CUIElementBase::Client() const { return s_pUI->Client(); } -IGraphics *CUIElementBase::Graphics() const { return s_pUI->Graphics(); } -IInput *CUIElementBase::Input() const { return s_pUI->Input(); } -ITextRender *CUIElementBase::TextRender() const { return s_pUI->TextRender(); } - -void CUi::Init(IKernel *pKernel) -{ - m_pClient = pKernel->RequestInterface(); - m_pGraphics = pKernel->RequestInterface(); - m_pInput = pKernel->RequestInterface(); - m_pTextRender = pKernel->RequestInterface(); - CUIRect::Init(m_pGraphics); - CLineInput::Init(m_pClient, m_pGraphics, m_pInput, m_pTextRender); - CUIElementBase::Init(this); -} - -CUi::CUi() -{ - m_Enabled = true; - - m_Screen.x = 0.0f; - m_Screen.y = 0.0f; -} - -CUi::~CUi() -{ - for(CUIElement *&pEl : m_vpOwnUIElements) - { - delete pEl; - } - m_vpOwnUIElements.clear(); -} - -CUIElement *CUi::GetNewUIElement(int RequestedRectCount) -{ - CUIElement *pNewEl = new CUIElement(this, RequestedRectCount); - - m_vpOwnUIElements.push_back(pNewEl); - - return pNewEl; -} - -void CUi::AddUIElement(CUIElement *pElement) -{ - m_vpUIElements.push_back(pElement); -} - -void CUi::ResetUIElement(CUIElement &UIElement) const -{ - for(CUIElement::SUIElementRect &Rect : UIElement.m_vUIRects) - { - Graphics()->DeleteQuadContainer(Rect.m_UIRectQuadContainer); - TextRender()->DeleteTextContainer(Rect.m_UITextContainer); - Rect.Reset(); - } -} - -void CUi::OnElementsReset() -{ - for(CUIElement *pEl : m_vpUIElements) - { - ResetUIElement(*pEl); - } -} - -void CUi::OnWindowResize() -{ - OnElementsReset(); -} - -void CUi::OnCursorMove(float X, float Y) -{ - if(!CheckMouseLock()) - { - m_UpdatedMousePos.x = clamp(m_UpdatedMousePos.x + X, 0.0f, Graphics()->WindowWidth() - 1.0f); - m_UpdatedMousePos.y = clamp(m_UpdatedMousePos.y + Y, 0.0f, Graphics()->WindowHeight() - 1.0f); - } - - m_UpdatedMouseDelta += vec2(X, Y); -} - -void CUi::Update(vec2 MouseWorldPos) -{ - const vec2 WindowSize = vec2(Graphics()->WindowWidth(), Graphics()->WindowHeight()); - const CUIRect *pScreen = Screen(); - - unsigned UpdatedMouseButtonsNext = 0; - if(Enabled()) - { - // Update mouse buttons based on mouse keys - for(int MouseKey = KEY_MOUSE_1; MouseKey <= KEY_MOUSE_3; ++MouseKey) - { - if(Input()->KeyIsPressed(MouseKey)) - { - m_UpdatedMouseButtons |= 1 << (MouseKey - KEY_MOUSE_1); - } - } - - // Update mouse position and buttons based on touch finger state - UpdateTouchState(m_TouchState); - if(m_TouchState.m_AnyPressed) - { - if(!CheckMouseLock()) - { - m_UpdatedMousePos = m_TouchState.m_PrimaryPosition * WindowSize; - m_UpdatedMousePos.x = clamp(m_UpdatedMousePos.x, 0.0f, WindowSize.x - 1.0f); - m_UpdatedMousePos.y = clamp(m_UpdatedMousePos.y, 0.0f, WindowSize.y - 1.0f); - } - m_UpdatedMouseDelta += m_TouchState.m_PrimaryDelta * WindowSize; - - // Scroll currently hovered scroll region with touch scroll gesture. - if(m_TouchState.m_ScrollAmount != vec2(0.0f, 0.0f)) - { - if(m_pHotScrollRegion != nullptr) - { - m_pHotScrollRegion->ScrollRelativeDirect(-m_TouchState.m_ScrollAmount.y * pScreen->h); - } - m_TouchState.m_ScrollAmount = vec2(0.0f, 0.0f); - } - - // We need to delay the click until the next update or it's not possible to use UI - // elements because click and hover would happen at the same time for touch events. - if(m_TouchState.m_PrimaryPressed) - { - UpdatedMouseButtonsNext |= 1; - } - if(m_TouchState.m_SecondaryPressed) - { - UpdatedMouseButtonsNext |= 2; - } - } - } - - m_MousePos = m_UpdatedMousePos * vec2(pScreen->w, pScreen->h) / WindowSize; - m_MouseDelta = m_UpdatedMouseDelta; - m_UpdatedMouseDelta = vec2(0.0f, 0.0f); - m_MouseWorldPos = MouseWorldPos; - m_LastMouseButtons = m_MouseButtons; - m_MouseButtons = m_UpdatedMouseButtons; - m_UpdatedMouseButtons = UpdatedMouseButtonsNext; - - m_pHotItem = m_pBecomingHotItem; - if(m_pActiveItem) - m_pHotItem = m_pActiveItem; - m_pBecomingHotItem = nullptr; - m_pHotScrollRegion = m_pBecomingHotScrollRegion; - m_pBecomingHotScrollRegion = nullptr; - - if(Enabled()) - { - CLineInput *pActiveInput = CLineInput::GetActiveInput(); - if(pActiveInput && m_pLastActiveItem && pActiveInput != m_pLastActiveItem) - pActiveInput->Deactivate(); - } - else - { - m_pHotItem = nullptr; - m_pActiveItem = nullptr; - m_pHotScrollRegion = nullptr; - } - - m_ProgressSpinnerOffset += Client()->RenderFrameTime() * 1.5f; - m_ProgressSpinnerOffset = std::fmod(m_ProgressSpinnerOffset, 1.0f); -} - -void CUi::DebugRender(float X, float Y) -{ - MapScreen(); - - char aBuf[128]; - str_format(aBuf, sizeof(aBuf), "hot=%p nexthot=%p active=%p lastactive=%p", HotItem(), NextHotItem(), ActiveItem(), m_pLastActiveItem); - TextRender()->Text(X, Y, 10.0f, aBuf); -} - -bool CUi::MouseInside(const CUIRect *pRect) const -{ - return pRect->Inside(MousePos()); -} - -void CUi::ConvertMouseMove(float *pX, float *pY, IInput::ECursorType CursorType) const -{ - float Factor = 1.0f; - switch(CursorType) - { - case IInput::CURSOR_MOUSE: - Factor = g_Config.m_UiMousesens / 100.0f; - break; - case IInput::CURSOR_JOYSTICK: - Factor = g_Config.m_UiControllerSens / 100.0f; - break; - default: - dbg_msg("assert", "CUi::ConvertMouseMove CursorType %d", (int)CursorType); - dbg_break(); - break; - } - - if(m_MouseSlow) - Factor *= 0.05f; - - *pX *= Factor; - *pY *= Factor; -} - -void CUi::UpdateTouchState(CTouchState &State) const -{ - const std::vector &vTouchFingerStates = Input()->TouchFingerStates(); - - // Updated touch position as long as any finger is beinged pressed. - const bool WasAnyPressed = State.m_AnyPressed; - State.m_AnyPressed = !vTouchFingerStates.empty(); - if(State.m_AnyPressed) - { - // We always use the position of first finger being pressed down. Multi-touch UI is - // not possible and always choosing the last finger would cause the cursor to briefly - // warp without having any effect if multiple fingers are used. - const IInput::CTouchFingerState &PrimaryTouchFingerState = vTouchFingerStates.front(); - State.m_PrimaryPosition = PrimaryTouchFingerState.m_Position; - State.m_PrimaryDelta = PrimaryTouchFingerState.m_Delta; - } - - // Update primary (left click) and secondary (right click) action. - if(State.m_SecondaryPressedNext) - { - // The secondary action is delayed by one frame until the primary has been released, - // otherwise most UI elements cannot be activated by the secondary action because they - // never become the hot-item unless all mouse buttons are released for one frame. - State.m_SecondaryPressedNext = false; - State.m_SecondaryPressed = true; - } - else if(vTouchFingerStates.size() != 1) - { - // Consider primary and secondary to be pressed only when exactly one finger is pressed, - // to avoid UI elements and console text selection being activated while scrolling. - State.m_PrimaryPressed = false; - State.m_SecondaryPressed = false; - } - else if(!WasAnyPressed) - { - State.m_PrimaryPressed = true; - State.m_SecondaryActivationTime = Client()->GlobalTime(); - State.m_SecondaryActivationDelta = vec2(0.0f, 0.0f); - } - else if(State.m_PrimaryPressed) - { - // Activate secondary by pressing and holding roughly on the same position for some time. - const float SecondaryActivationDelay = 0.5f; - const float SecondaryActivationMaxDistance = 0.001f; - State.m_SecondaryActivationDelta += State.m_PrimaryDelta; - if(Client()->GlobalTime() - State.m_SecondaryActivationTime >= SecondaryActivationDelay && - length(State.m_SecondaryActivationDelta) <= SecondaryActivationMaxDistance) - { - State.m_PrimaryPressed = false; - State.m_SecondaryPressedNext = true; - } - } - - // Handle two fingers being moved roughly in same direction as a scrolling gesture. - if(vTouchFingerStates.size() == 2) - { - const vec2 Delta0 = vTouchFingerStates[0].m_Delta; - const vec2 Delta1 = vTouchFingerStates[1].m_Delta; - const float Similarity = dot(normalize(Delta0), normalize(Delta1)); - const float SimilarityThreshold = 0.8f; // How parallel the deltas have to be (1.0f being completely parallel) - if(Similarity > SimilarityThreshold) - { - const float DirectionThreshold = 3.0f; // How much longer the delta of one axis has to be compared to other axis - - // Vertical scrolling (y-delta must be larger than x-delta) - if(absolute(Delta0.y) > DirectionThreshold * absolute(Delta0.x) && - absolute(Delta1.y) > DirectionThreshold * absolute(Delta1.x) && - Delta0.y * Delta1.y > 0.0f) // Same y direction required - { - // Accumulate average delta of the two fingers - State.m_ScrollAmount.y += (Delta0.y + Delta1.y) / 2.0f; - } - } - } - else - { - // Scrolling gesture should start from zero again if released. - State.m_ScrollAmount = vec2(0.0f, 0.0f); - } -} - -bool CUi::ConsumeHotkey(EHotkey Hotkey) -{ - const bool Pressed = m_HotkeysPressed & Hotkey; - m_HotkeysPressed &= ~Hotkey; - return Pressed; -} - -bool CUi::OnInput(const IInput::CEvent &Event) -{ - if(!Enabled()) - return false; - - CLineInput *pActiveInput = CLineInput::GetActiveInput(); - if(pActiveInput && pActiveInput->ProcessInput(Event)) - return true; - - if(Event.m_Flags & IInput::FLAG_PRESS) - { - unsigned LastHotkeysPressed = m_HotkeysPressed; - if(Event.m_Key == KEY_RETURN || Event.m_Key == KEY_KP_ENTER) - m_HotkeysPressed |= HOTKEY_ENTER; - else if(Event.m_Key == KEY_ESCAPE) - m_HotkeysPressed |= HOTKEY_ESCAPE; - else if(Event.m_Key == KEY_TAB && !Input()->AltIsPressed()) - m_HotkeysPressed |= HOTKEY_TAB; - else if(Event.m_Key == KEY_DELETE) - m_HotkeysPressed |= HOTKEY_DELETE; - else if(Event.m_Key == KEY_UP) - m_HotkeysPressed |= HOTKEY_UP; - else if(Event.m_Key == KEY_DOWN) - m_HotkeysPressed |= HOTKEY_DOWN; - else if(Event.m_Key == KEY_LEFT) - m_HotkeysPressed |= HOTKEY_LEFT; - else if(Event.m_Key == KEY_RIGHT) - m_HotkeysPressed |= HOTKEY_RIGHT; - else if(Event.m_Key == KEY_MOUSE_WHEEL_UP) - m_HotkeysPressed |= HOTKEY_SCROLL_UP; - else if(Event.m_Key == KEY_MOUSE_WHEEL_DOWN) - m_HotkeysPressed |= HOTKEY_SCROLL_DOWN; - else if(Event.m_Key == KEY_PAGEUP) - m_HotkeysPressed |= HOTKEY_PAGE_UP; - else if(Event.m_Key == KEY_PAGEDOWN) - m_HotkeysPressed |= HOTKEY_PAGE_DOWN; - else if(Event.m_Key == KEY_HOME) - m_HotkeysPressed |= HOTKEY_HOME; - else if(Event.m_Key == KEY_END) - m_HotkeysPressed |= HOTKEY_END; - return LastHotkeysPressed != m_HotkeysPressed; - } - return false; -} - -float CUi::ButtonColorMul(const void *pId) -{ - if(CheckActiveItem(pId)) - return ButtonColorMulActive(); - else if(HotItem() == pId) - return ButtonColorMulHot(); - return ButtonColorMulDefault(); -} - -const CUIRect *CUi::Screen() -{ - m_Screen.h = 600.0f; - m_Screen.w = Graphics()->ScreenAspect() * m_Screen.h; - return &m_Screen; -} - -void CUi::MapScreen() -{ - const CUIRect *pScreen = Screen(); - Graphics()->MapScreen(pScreen->x, pScreen->y, pScreen->w, pScreen->h); -} - -float CUi::PixelSize() -{ - return Screen()->w / Graphics()->ScreenWidth(); -} - -void CUi::ClipEnable(const CUIRect *pRect) -{ - if(IsClipped()) - { - const CUIRect *pOldRect = ClipArea(); - CUIRect Intersection; - Intersection.x = std::max(pRect->x, pOldRect->x); - Intersection.y = std::max(pRect->y, pOldRect->y); - Intersection.w = std::min(pRect->x + pRect->w, pOldRect->x + pOldRect->w) - pRect->x; - Intersection.h = std::min(pRect->y + pRect->h, pOldRect->y + pOldRect->h) - pRect->y; - m_vClips.push_back(Intersection); - } - else - { - m_vClips.push_back(*pRect); - } - UpdateClipping(); -} - -void CUi::ClipDisable() -{ - dbg_assert(IsClipped(), "no clip region"); - m_vClips.pop_back(); - UpdateClipping(); -} - -const CUIRect *CUi::ClipArea() const -{ - dbg_assert(IsClipped(), "no clip region"); - return &m_vClips.back(); -} - -void CUi::UpdateClipping() -{ - if(IsClipped()) - { - const CUIRect *pRect = ClipArea(); - const float XScale = Graphics()->ScreenWidth() / Screen()->w; - const float YScale = Graphics()->ScreenHeight() / Screen()->h; - Graphics()->ClipEnable((int)(pRect->x * XScale), (int)(pRect->y * YScale), (int)(pRect->w * XScale), (int)(pRect->h * YScale)); - } - else - { - Graphics()->ClipDisable(); - } -} - -int CUi::DoButtonLogic(const void *pId, int Checked, const CUIRect *pRect) -{ - // logic - int ReturnValue = 0; - const bool Inside = MouseHovered(pRect); - - if(CheckActiveItem(pId)) - { - dbg_assert(m_ActiveButtonLogicButton >= 0, "m_ActiveButtonLogicButton invalid"); - if(!MouseButton(m_ActiveButtonLogicButton)) - { - if(Inside && Checked >= 0) - ReturnValue = 1 + m_ActiveButtonLogicButton; - SetActiveItem(nullptr); - m_ActiveButtonLogicButton = -1; - } - } - else if(HotItem() == pId) - { - for(int i = 0; i < 3; ++i) - { - if(MouseButton(i)) - { - SetActiveItem(pId); - m_ActiveButtonLogicButton = i; - } - } - } - - if(Inside && !MouseButton(0) && !MouseButton(1) && !MouseButton(2)) - SetHotItem(pId); - - return ReturnValue; -} - -int CUi::DoDraggableButtonLogic(const void *pId, int Checked, const CUIRect *pRect, bool *pClicked, bool *pAbrupted) -{ - // logic - int ReturnValue = 0; - const bool Inside = MouseHovered(pRect); - - if(pClicked != nullptr) - *pClicked = false; - if(pAbrupted != nullptr) - *pAbrupted = false; - - if(CheckActiveItem(pId)) - { - dbg_assert(m_ActiveDraggableButtonLogicButton >= 0, "m_ActiveDraggableButtonLogicButton invalid"); - if(m_ActiveDraggableButtonLogicButton == 0) - { - if(Checked >= 0) - ReturnValue = 1 + m_ActiveDraggableButtonLogicButton; - if(!MouseButton(m_ActiveDraggableButtonLogicButton)) - { - if(pClicked != nullptr) - *pClicked = true; - SetActiveItem(nullptr); - m_ActiveDraggableButtonLogicButton = -1; - } - if(MouseButton(1)) - { - if(pAbrupted != nullptr) - *pAbrupted = true; - SetActiveItem(nullptr); - m_ActiveDraggableButtonLogicButton = -1; - } - } - else if(!MouseButton(m_ActiveDraggableButtonLogicButton)) - { - if(Inside && Checked >= 0) - ReturnValue = 1 + m_ActiveDraggableButtonLogicButton; - if(pClicked != nullptr) - *pClicked = true; - SetActiveItem(nullptr); - m_ActiveDraggableButtonLogicButton = -1; - } - } - else if(HotItem() == pId) - { - for(int i = 0; i < 3; ++i) - { - if(MouseButton(i)) - { - SetActiveItem(pId); - m_ActiveDraggableButtonLogicButton = i; - } - } - } - - if(Inside && !MouseButton(0) && !MouseButton(1) && !MouseButton(2)) - SetHotItem(pId); - - return ReturnValue; -} - -bool CUi::DoDoubleClickLogic(const void *pId) -{ - if(m_DoubleClickState.m_pLastClickedId == pId && - Client()->GlobalTime() - m_DoubleClickState.m_LastClickTime < 0.5f && - distance(m_DoubleClickState.m_LastClickPos, MousePos()) <= 32.0f * Screen()->h / Graphics()->ScreenHeight()) - { - m_DoubleClickState.m_pLastClickedId = nullptr; - return true; - } - m_DoubleClickState.m_pLastClickedId = pId; - m_DoubleClickState.m_LastClickTime = Client()->GlobalTime(); - m_DoubleClickState.m_LastClickPos = MousePos(); - return false; -} - -EEditState CUi::DoPickerLogic(const void *pId, const CUIRect *pRect, float *pX, float *pY) -{ - if(MouseHovered(pRect)) - SetHotItem(pId); - - EEditState Res = EEditState::EDITING; - - if(HotItem() == pId && MouseButtonClicked(0)) - { - SetActiveItem(pId); - if(!m_pLastEditingItem) - { - m_pLastEditingItem = pId; - Res = EEditState::START; - } - } - - if(CheckActiveItem(pId) && !MouseButton(0)) - { - SetActiveItem(nullptr); - if(m_pLastEditingItem == pId) - { - m_pLastEditingItem = nullptr; - Res = EEditState::END; - } - } - - if(!CheckActiveItem(pId) && Res == EEditState::EDITING) - return EEditState::NONE; - - if(Input()->ShiftIsPressed()) - m_MouseSlow = true; - - if(pX) - *pX = clamp(MouseX() - pRect->x, 0.0f, pRect->w); - if(pY) - *pY = clamp(MouseY() - pRect->y, 0.0f, pRect->h); - - return Res; -} - -void CUi::DoSmoothScrollLogic(float *pScrollOffset, float *pScrollOffsetChange, float ViewPortSize, float TotalSize, bool SmoothClamp, float ScrollSpeed) const -{ - // reset scrolling if it's not necessary anymore - if(TotalSize < ViewPortSize) - { - *pScrollOffsetChange = -*pScrollOffset; - } - - // instant scrolling if distance too long - if(absolute(*pScrollOffsetChange) > 2.0f * ViewPortSize) - { - *pScrollOffset += *pScrollOffsetChange; - *pScrollOffsetChange = 0.0f; - } - - // smooth scrolling - if(*pScrollOffsetChange) - { - const float Delta = *pScrollOffsetChange * clamp(Client()->RenderFrameTime() * ScrollSpeed, 0.0f, 1.0f); - *pScrollOffset += Delta; - *pScrollOffsetChange -= Delta; - } - - // clamp to first item - if(*pScrollOffset < 0.0f) - { - if(SmoothClamp && *pScrollOffset < -0.1f) - { - *pScrollOffsetChange = -*pScrollOffset; - } - else - { - *pScrollOffset = 0.0f; - *pScrollOffsetChange = 0.0f; - } - } - - // clamp to last item - if(TotalSize > ViewPortSize && *pScrollOffset > TotalSize - ViewPortSize) - { - if(SmoothClamp && *pScrollOffset - (TotalSize - ViewPortSize) > 0.1f) - { - *pScrollOffsetChange = (TotalSize - ViewPortSize) - *pScrollOffset; - } - else - { - *pScrollOffset = TotalSize - ViewPortSize; - *pScrollOffsetChange = 0.0f; - } - } -} - -struct SCursorAndBoundingBox -{ - vec2 m_TextSize; - float m_BiggestCharacterHeight; - int m_LineCount; -}; - -static SCursorAndBoundingBox CalcFontSizeCursorHeightAndBoundingBox(ITextRender *pTextRender, const char *pText, int Flags, float &Size, float MaxWidth, const SLabelProperties &LabelProps) -{ - const float MinFontSize = 5.0f; - const float MaxTextWidth = LabelProps.m_MaxWidth != -1.0f ? LabelProps.m_MaxWidth : MaxWidth; - const int FlagsWithoutStop = Flags & ~(TEXTFLAG_STOP_AT_END | TEXTFLAG_ELLIPSIS_AT_END); - const float MaxTextWidthWithoutStop = Flags == FlagsWithoutStop ? LabelProps.m_MaxWidth : -1.0f; - - float TextBoundingHeight = 0.0f; - float TextHeight = 0.0f; - int LineCount = 0; - STextSizeProperties TextSizeProps{}; - TextSizeProps.m_pHeight = &TextHeight; - TextSizeProps.m_pMaxCharacterHeightInLine = &TextBoundingHeight; - TextSizeProps.m_pLineCount = &LineCount; - - float TextWidth; - do - { - Size = maximum(Size, MinFontSize); - // Only consider stop-at-end and ellipsis-at-end when minimum font size reached or font scaling disabled - if((Size == MinFontSize || !LabelProps.m_EnableWidthCheck) && Flags != FlagsWithoutStop) - TextWidth = pTextRender->TextWidth(Size, pText, -1, LabelProps.m_MaxWidth, Flags, TextSizeProps); - else - TextWidth = pTextRender->TextWidth(Size, pText, -1, MaxTextWidthWithoutStop, FlagsWithoutStop, TextSizeProps); - if(TextWidth <= MaxTextWidth + 0.001f || !LabelProps.m_EnableWidthCheck || Size == MinFontSize) - break; - Size--; - } while(true); - - SCursorAndBoundingBox Res{}; - Res.m_TextSize = vec2(TextWidth, TextHeight); - Res.m_BiggestCharacterHeight = TextBoundingHeight; - Res.m_LineCount = LineCount; - return Res; -} - -static int GetFlagsForLabelProperties(const SLabelProperties &LabelProps, const CTextCursor *pReadCursor) -{ - if(pReadCursor != nullptr) - return pReadCursor->m_Flags & ~TEXTFLAG_RENDER; - - int Flags = 0; - Flags |= LabelProps.m_StopAtEnd ? TEXTFLAG_STOP_AT_END : 0; - Flags |= LabelProps.m_EllipsisAtEnd ? TEXTFLAG_ELLIPSIS_AT_END : 0; - return Flags; -} - -vec2 CUi::CalcAlignedCursorPos(const CUIRect *pRect, vec2 TextSize, int Align, const float *pBiggestCharHeight) -{ - vec2 Cursor(pRect->x, pRect->y); - - const int HorizontalAlign = Align & TEXTALIGN_MASK_HORIZONTAL; - if(HorizontalAlign == TEXTALIGN_CENTER) - { - Cursor.x += (pRect->w - TextSize.x) / 2.0f; - } - else if(HorizontalAlign == TEXTALIGN_RIGHT) - { - Cursor.x += pRect->w - TextSize.x; - } - - const int VerticalAlign = Align & TEXTALIGN_MASK_VERTICAL; - if(VerticalAlign == TEXTALIGN_MIDDLE) - { - Cursor.y += pBiggestCharHeight != nullptr ? ((pRect->h - *pBiggestCharHeight) / 2.0f - (TextSize.y - *pBiggestCharHeight)) : (pRect->h - TextSize.y) / 2.0f; - } - else if(VerticalAlign == TEXTALIGN_BOTTOM) - { - Cursor.y += pRect->h - TextSize.y; - } - - return Cursor; -} - -void CUi::DoLabel(const CUIRect *pRect, const char *pText, float Size, int Align, const SLabelProperties &LabelProps) const -{ - const int Flags = GetFlagsForLabelProperties(LabelProps, nullptr); - const SCursorAndBoundingBox TextBounds = CalcFontSizeCursorHeightAndBoundingBox(TextRender(), pText, Flags, Size, pRect->w, LabelProps); - const vec2 CursorPos = CalcAlignedCursorPos(pRect, TextBounds.m_TextSize, Align, TextBounds.m_LineCount == 1 ? &TextBounds.m_BiggestCharacterHeight : nullptr); - - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, CursorPos.x, CursorPos.y, Size, TEXTFLAG_RENDER | Flags); - Cursor.m_vColorSplits = LabelProps.m_vColorSplits; - Cursor.m_LineWidth = (float)LabelProps.m_MaxWidth; - TextRender()->TextEx(&Cursor, pText, -1); -} - -void CUi::DoLabel(CUIElement::SUIElementRect &RectEl, const CUIRect *pRect, const char *pText, float Size, int Align, const SLabelProperties &LabelProps, int StrLen, const CTextCursor *pReadCursor) const -{ - const int Flags = GetFlagsForLabelProperties(LabelProps, pReadCursor); - const SCursorAndBoundingBox TextBounds = CalcFontSizeCursorHeightAndBoundingBox(TextRender(), pText, Flags, Size, pRect->w, LabelProps); - - CTextCursor Cursor; - if(pReadCursor) - { - Cursor = *pReadCursor; - } - else - { - const vec2 CursorPos = CalcAlignedCursorPos(pRect, TextBounds.m_TextSize, Align); - TextRender()->SetCursor(&Cursor, CursorPos.x, CursorPos.y, Size, TEXTFLAG_RENDER | Flags); - } - Cursor.m_LineWidth = LabelProps.m_MaxWidth; - - RectEl.m_TextColor = TextRender()->GetTextColor(); - RectEl.m_TextOutlineColor = TextRender()->GetTextOutlineColor(); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - TextRender()->TextOutlineColor(TextRender()->DefaultTextOutlineColor()); - TextRender()->CreateTextContainer(RectEl.m_UITextContainer, &Cursor, pText, StrLen); - TextRender()->TextColor(RectEl.m_TextColor); - TextRender()->TextOutlineColor(RectEl.m_TextOutlineColor); - RectEl.m_Cursor = Cursor; -} - -void CUi::DoLabelStreamed(CUIElement::SUIElementRect &RectEl, const CUIRect *pRect, const char *pText, float Size, int Align, const SLabelProperties &LabelProps, int StrLen, const CTextCursor *pReadCursor) const -{ - const int ReadCursorGlyphCount = pReadCursor == nullptr ? -1 : pReadCursor->m_GlyphCount; - bool NeedsRecreate = false; - bool ColorChanged = RectEl.m_TextColor != TextRender()->GetTextColor() || RectEl.m_TextOutlineColor != TextRender()->GetTextOutlineColor(); - if((!RectEl.m_UITextContainer.Valid() && pText[0] != '\0' && StrLen != 0) || RectEl.m_Width != pRect->w || RectEl.m_Height != pRect->h || ColorChanged || RectEl.m_ReadCursorGlyphCount != ReadCursorGlyphCount) - { - NeedsRecreate = true; - } - else - { - if(StrLen <= -1) - { - if(str_comp(RectEl.m_Text.c_str(), pText) != 0) - NeedsRecreate = true; - } - else - { - if(StrLen != (int)RectEl.m_Text.size() || str_comp_num(RectEl.m_Text.c_str(), pText, StrLen) != 0) - NeedsRecreate = true; - } - } - RectEl.m_X = pRect->x; - RectEl.m_Y = pRect->y; - if(NeedsRecreate) - { - TextRender()->DeleteTextContainer(RectEl.m_UITextContainer); - - RectEl.m_Width = pRect->w; - RectEl.m_Height = pRect->h; - - if(StrLen > 0) - RectEl.m_Text = std::string(pText, StrLen); - else if(StrLen < 0) - RectEl.m_Text = pText; - else - RectEl.m_Text.clear(); - - RectEl.m_ReadCursorGlyphCount = ReadCursorGlyphCount; - - CUIRect TmpRect; - TmpRect.x = 0; - TmpRect.y = 0; - TmpRect.w = pRect->w; - TmpRect.h = pRect->h; - - DoLabel(RectEl, &TmpRect, pText, Size, TEXTALIGN_TL, LabelProps, StrLen, pReadCursor); - } - - if(RectEl.m_UITextContainer.Valid()) - { - const vec2 CursorPos = CalcAlignedCursorPos(pRect, vec2(RectEl.m_Cursor.m_LongestLineWidth, RectEl.m_Cursor.Height()), Align); - TextRender()->RenderTextContainer(RectEl.m_UITextContainer, RectEl.m_TextColor, RectEl.m_TextOutlineColor, CursorPos.x, CursorPos.y); - } -} - -bool CUi::DoEditBox(CLineInput *pLineInput, const CUIRect *pRect, float FontSize, int Corners, const std::vector &vColorSplits) -{ - const bool Inside = MouseHovered(pRect); - const bool Active = m_pLastActiveItem == pLineInput; - const bool Changed = pLineInput->WasChanged(); - const bool CursorChanged = pLineInput->WasCursorChanged(); - - const float VSpacing = 2.0f; - CUIRect Textbox; - pRect->VMargin(VSpacing, &Textbox); - - bool JustGotActive = false; - if(CheckActiveItem(pLineInput)) - { - if(MouseButton(0)) - { - if(pLineInput->IsActive() && (Input()->HasComposition() || Input()->GetCandidateCount())) - { - // Clear IME composition/candidates on mouse press - Input()->StopTextInput(); - Input()->StartTextInput(); - } - } - else - { - SetActiveItem(nullptr); - } - } - else if(HotItem() == pLineInput) - { - if(MouseButton(0)) - { - if(!Active) - JustGotActive = true; - SetActiveItem(pLineInput); - } - } - - if(Inside && !MouseButton(0)) - SetHotItem(pLineInput); - - if(Enabled() && Active && !JustGotActive) - pLineInput->Activate(EInputPriority::UI); - else - pLineInput->Deactivate(); - - float ScrollOffset = pLineInput->GetScrollOffset(); - float ScrollOffsetChange = pLineInput->GetScrollOffsetChange(); - - // Update mouse selection information - CLineInput::SMouseSelection *pMouseSelection = pLineInput->GetMouseSelection(); - if(Inside) - { - if(!pMouseSelection->m_Selecting && MouseButtonClicked(0)) - { - pMouseSelection->m_Selecting = true; - pMouseSelection->m_PressMouse = MousePos(); - pMouseSelection->m_Offset.x = ScrollOffset; - } - } - if(pMouseSelection->m_Selecting) - { - pMouseSelection->m_ReleaseMouse = MousePos(); - if(!MouseButton(0)) - { - pMouseSelection->m_Selecting = false; - } - } - if(ScrollOffset != pMouseSelection->m_Offset.x) - { - // When the scroll offset is changed, update the position that the mouse was pressed at, - // so the existing text selection still stays mostly the same. - // TODO: The selection may change by one character temporarily, due to different character widths. - // Needs text render adjustment: keep selection start based on character. - pMouseSelection->m_PressMouse.x -= ScrollOffset - pMouseSelection->m_Offset.x; - pMouseSelection->m_Offset.x = ScrollOffset; - } - - // Render - pRect->Draw(ms_LightButtonColorFunction.GetColor(Active, HotItem() == pLineInput), Corners, 3.0f); - ClipEnable(pRect); - Textbox.x -= ScrollOffset; - const STextBoundingBox BoundingBox = pLineInput->Render(&Textbox, FontSize, TEXTALIGN_ML, Changed || CursorChanged, -1.0f, 0.0f, vColorSplits); - ClipDisable(); - - // Scroll left or right if necessary - if(Active && !JustGotActive && (Changed || CursorChanged || Input()->HasComposition())) - { - const float CaretPositionX = pLineInput->GetCaretPosition().x - Textbox.x - ScrollOffset - ScrollOffsetChange; - if(CaretPositionX > Textbox.w) - ScrollOffsetChange += CaretPositionX - Textbox.w; - else if(CaretPositionX < 0.0f) - ScrollOffsetChange += CaretPositionX; - } - - DoSmoothScrollLogic(&ScrollOffset, &ScrollOffsetChange, Textbox.w, BoundingBox.m_W, true); - - pLineInput->SetScrollOffset(ScrollOffset); - pLineInput->SetScrollOffsetChange(ScrollOffsetChange); - - return Changed; -} - -bool CUi::DoClearableEditBox(CLineInput *pLineInput, const CUIRect *pRect, float FontSize, int Corners, const std::vector &vColorSplits) -{ - CUIRect EditBox, ClearButton; - pRect->VSplitRight(pRect->h, &EditBox, &ClearButton); - - bool ReturnValue = DoEditBox(pLineInput, &EditBox, FontSize, Corners & ~IGraphics::CORNER_R, vColorSplits); - - ClearButton.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.33f * ButtonColorMul(pLineInput->GetClearButtonId())), Corners & ~IGraphics::CORNER_L, 3.0f); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - DoLabel(&ClearButton, "×", ClearButton.h * CUi::ms_FontmodHeight * 0.8f, TEXTALIGN_MC); - TextRender()->SetRenderFlags(0); - if(DoButtonLogic(pLineInput->GetClearButtonId(), 0, &ClearButton)) - { - pLineInput->Clear(); - SetActiveItem(pLineInput); - ReturnValue = true; - } - - return ReturnValue; -} - -bool CUi::DoEditBox_Search(CLineInput *pLineInput, const CUIRect *pRect, float FontSize, bool HotkeyEnabled) -{ - CUIRect QuickSearch = *pRect; - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - DoLabel(&QuickSearch, FONT_ICON_MAGNIFYING_GLASS, FontSize, TEXTALIGN_ML); - const float SearchWidth = TextRender()->TextWidth(FontSize, FONT_ICON_MAGNIFYING_GLASS); - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - QuickSearch.VSplitLeft(SearchWidth + 5.0f, nullptr, &QuickSearch); - if(HotkeyEnabled && Input()->ModifierIsPressed() && Input()->KeyPress(KEY_F)) - { - SetActiveItem(pLineInput); - pLineInput->SelectAll(); - } - pLineInput->SetEmptyText(Localize("Search")); - return DoClearableEditBox(pLineInput, &QuickSearch, FontSize); -} - -int CUi::DoButton_Menu(CUIElement &UIElement, const CButtonContainer *pId, const std::function &GetTextLambda, const CUIRect *pRect, const SMenuButtonProperties &Props) -{ - CUIRect Text = *pRect, DropDownIcon; - Text.HMargin(pRect->h >= 20.0f ? 2.0f : 1.0f, &Text); - Text.HMargin((Text.h * Props.m_FontFactor) / 2.0f, &Text); - if(Props.m_ShowDropDownIcon) - { - Text.VSplitRight(pRect->h * 0.25f, &Text, nullptr); - Text.VSplitRight(pRect->h * 0.75f, &Text, &DropDownIcon); - } - - if(!UIElement.AreRectsInit() || Props.m_HintRequiresStringCheck || Props.m_HintCanChangePositionOrSize || !UIElement.Rect(0)->m_UITextContainer.Valid()) - { - bool NeedsRecalc = !UIElement.AreRectsInit() || !UIElement.Rect(0)->m_UITextContainer.Valid(); - if(Props.m_HintCanChangePositionOrSize) - { - if(UIElement.AreRectsInit()) - { - if(UIElement.Rect(0)->m_X != pRect->x || UIElement.Rect(0)->m_Y != pRect->y || UIElement.Rect(0)->m_Width != pRect->w || UIElement.Rect(0)->m_Height != pRect->h || UIElement.Rect(0)->m_Rounding != Props.m_Rounding || UIElement.Rect(0)->m_Corners != Props.m_Corners) - { - NeedsRecalc = true; - } - } - } - const char *pText = nullptr; - if(Props.m_HintRequiresStringCheck) - { - if(UIElement.AreRectsInit()) - { - pText = GetTextLambda(); - if(str_comp(UIElement.Rect(0)->m_Text.c_str(), pText) != 0) - { - NeedsRecalc = true; - } - } - } - if(NeedsRecalc) - { - if(!UIElement.AreRectsInit()) - { - UIElement.InitRects(3); - } - ResetUIElement(UIElement); - - for(int i = 0; i < 3; ++i) - { - ColorRGBA Color = Props.m_Color; - if(i == 0) - Color.a *= ButtonColorMulActive(); - else if(i == 1) - Color.a *= ButtonColorMulHot(); - else if(i == 2) - Color.a *= ButtonColorMulDefault(); - Graphics()->SetColor(Color); - - CUIElement::SUIElementRect &NewRect = *UIElement.Rect(i); - NewRect.m_UIRectQuadContainer = Graphics()->CreateRectQuadContainer(pRect->x, pRect->y, pRect->w, pRect->h, Props.m_Rounding, Props.m_Corners); - - NewRect.m_X = pRect->x; - NewRect.m_Y = pRect->y; - NewRect.m_Width = pRect->w; - NewRect.m_Height = pRect->h; - NewRect.m_Rounding = Props.m_Rounding; - NewRect.m_Corners = Props.m_Corners; - if(i == 0) - { - if(pText == nullptr) - pText = GetTextLambda(); - NewRect.m_Text = pText; - if(Props.m_UseIconFont) - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - DoLabel(NewRect, &Text, pText, Text.h * CUi::ms_FontmodHeight, TEXTALIGN_MC); - if(Props.m_UseIconFont) - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - } - } - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - } - } - // render - size_t Index = 2; - if(CheckActiveItem(pId)) - Index = 0; - else if(HotItem() == pId) - Index = 1; - Graphics()->TextureClear(); - Graphics()->RenderQuadContainer(UIElement.Rect(Index)->m_UIRectQuadContainer, -1); - if(Props.m_ShowDropDownIcon) - { - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - DoLabel(&DropDownIcon, FONT_ICON_CIRCLE_CHEVRON_DOWN, DropDownIcon.h * CUi::ms_FontmodHeight, TEXTALIGN_MR); - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - } - ColorRGBA ColorText(TextRender()->DefaultTextColor()); - ColorRGBA ColorTextOutline(TextRender()->DefaultTextOutlineColor()); - if(UIElement.Rect(0)->m_UITextContainer.Valid()) - TextRender()->RenderTextContainer(UIElement.Rect(0)->m_UITextContainer, ColorText, ColorTextOutline); - return DoButtonLogic(pId, Props.m_Checked, pRect); -} - -int CUi::DoButton_PopupMenu(CButtonContainer *pButtonContainer, const char *pText, const CUIRect *pRect, float Size, int Align, float Padding, bool TransparentInactive, bool Enabled) -{ - if(!TransparentInactive || CheckActiveItem(pButtonContainer) || HotItem() == pButtonContainer) - pRect->Draw(Enabled ? ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f * ButtonColorMul(pButtonContainer)) : ColorRGBA(0.0f, 0.0f, 0.0f, 0.4f), IGraphics::CORNER_ALL, 3.0f); - - CUIRect Label; - pRect->Margin(Padding, &Label); - DoLabel(&Label, pText, Size, Align); - - return Enabled ? DoButtonLogic(pButtonContainer, 0, pRect) : 0; -} - -int64_t CUi::DoValueSelector(const void *pId, const CUIRect *pRect, const char *pLabel, int64_t Current, int64_t Min, int64_t Max, const SValueSelectorProperties &Props) -{ - return DoValueSelectorWithState(pId, pRect, pLabel, Current, Min, Max, Props).m_Value; -} - -SEditResult CUi::DoValueSelectorWithState(const void *pId, const CUIRect *pRect, const char *pLabel, int64_t Current, int64_t Min, int64_t Max, const SValueSelectorProperties &Props) -{ - // logic - const bool Inside = MouseInside(pRect); - const int Base = Props.m_IsHex ? 16 : 10; - - if(HotItem() == pId && m_ActiveValueSelectorState.m_Button >= 0 && !MouseButton(m_ActiveValueSelectorState.m_Button)) - { - DisableMouseLock(); - if(CheckActiveItem(pId)) - { - SetActiveItem(nullptr); - } - if(Inside && ((m_ActiveValueSelectorState.m_Button == 0 && !m_ActiveValueSelectorState.m_DidScroll && DoDoubleClickLogic(pId)) || m_ActiveValueSelectorState.m_Button == 1)) - { - m_ActiveValueSelectorState.m_pLastTextId = pId; - m_ActiveValueSelectorState.m_NumberInput.SetInteger64(Current, Base, Props.m_HexPrefix); - m_ActiveValueSelectorState.m_NumberInput.SelectAll(); - } - m_ActiveValueSelectorState.m_Button = -1; - } - - if(m_ActiveValueSelectorState.m_pLastTextId == pId) - { - SetActiveItem(&m_ActiveValueSelectorState.m_NumberInput); - DoEditBox(&m_ActiveValueSelectorState.m_NumberInput, pRect, 10.0f); - - if(ConsumeHotkey(HOTKEY_ENTER) || ((MouseButtonClicked(1) || MouseButtonClicked(0)) && !Inside)) - { - Current = clamp(m_ActiveValueSelectorState.m_NumberInput.GetInteger64(Base), Min, Max); - DisableMouseLock(); - SetActiveItem(nullptr); - m_ActiveValueSelectorState.m_pLastTextId = nullptr; - } - - if(ConsumeHotkey(HOTKEY_ESCAPE)) - { - DisableMouseLock(); - SetActiveItem(nullptr); - m_ActiveValueSelectorState.m_pLastTextId = nullptr; - } - } - else - { - if(CheckActiveItem(pId)) - { - dbg_assert(m_ActiveValueSelectorState.m_Button >= 0, "m_ActiveValueSelectorState.m_Button invalid"); - if(Props.m_UseScroll && m_ActiveValueSelectorState.m_Button == 0 && MouseButton(0)) - { - m_ActiveValueSelectorState.m_ScrollValue += MouseDeltaX() * (Input()->ShiftIsPressed() ? 0.05f : 1.0f); - - if(absolute(m_ActiveValueSelectorState.m_ScrollValue) > Props.m_Scale) - { - const int64_t Count = (int64_t)(m_ActiveValueSelectorState.m_ScrollValue / Props.m_Scale); - m_ActiveValueSelectorState.m_ScrollValue = std::fmod(m_ActiveValueSelectorState.m_ScrollValue, Props.m_Scale); - Current += Props.m_Step * Count; - Current = clamp(Current, Min, Max); - m_ActiveValueSelectorState.m_DidScroll = true; - - // Constrain to discrete steps - if(Count > 0) - Current = Current / Props.m_Step * Props.m_Step; - else - Current = std::ceil(Current / (float)Props.m_Step) * Props.m_Step; - } - } - } - else if(HotItem() == pId) - { - if(MouseButton(0)) - { - m_ActiveValueSelectorState.m_Button = 0; - m_ActiveValueSelectorState.m_DidScroll = false; - m_ActiveValueSelectorState.m_ScrollValue = 0.0f; - SetActiveItem(pId); - if(Props.m_UseScroll) - EnableMouseLock(pId); - } - else if(MouseButton(1)) - { - m_ActiveValueSelectorState.m_Button = 1; - SetActiveItem(pId); - } - } - - // render - char aBuf[128]; - if(pLabel[0] != '\0') - { - if(Props.m_IsHex) - str_format(aBuf, sizeof(aBuf), "%s #%0*" PRIX64, pLabel, Props.m_HexPrefix, Current); - else - str_format(aBuf, sizeof(aBuf), "%s %" PRId64, pLabel, Current); - } - else - { - if(Props.m_IsHex) - str_format(aBuf, sizeof(aBuf), "#%0*" PRIX64, Props.m_HexPrefix, Current); - else - str_format(aBuf, sizeof(aBuf), "%" PRId64, Current); - } - pRect->Draw(Props.m_Color, IGraphics::CORNER_ALL, 3.0f); - DoLabel(pRect, aBuf, 10.0f, TEXTALIGN_MC); - } - - if(Inside && !MouseButton(0) && !MouseButton(1)) - SetHotItem(pId); - - EEditState State = EEditState::NONE; - if(m_pLastEditingItem == pId) - { - State = EEditState::EDITING; - } - if(((CheckActiveItem(pId) && CheckMouseLock()) || m_ActiveValueSelectorState.m_pLastTextId == pId) && m_pLastEditingItem != pId) - { - State = EEditState::START; - m_pLastEditingItem = pId; - } - if(!CheckMouseLock() && m_ActiveValueSelectorState.m_pLastTextId != pId && m_pLastEditingItem == pId) - { - State = EEditState::END; - m_pLastEditingItem = nullptr; - } - - return SEditResult{State, Current}; -} - -float CUi::DoScrollbarV(const void *pId, const CUIRect *pRect, float Current) -{ - Current = clamp(Current, 0.0f, 1.0f); - - // layout - CUIRect Rail; - pRect->Margin(5.0f, &Rail); - - CUIRect Handle; - Rail.HSplitTop(clamp(33.0f, Rail.w, Rail.h / 3.0f), &Handle, 0); - Handle.y = Rail.y + (Rail.h - Handle.h) * Current; - - // logic - const bool InsideRail = MouseHovered(&Rail); - const bool InsideHandle = MouseHovered(&Handle); - bool Grabbed = false; // whether to apply the offset - - if(CheckActiveItem(pId)) - { - if(MouseButton(0)) - { - Grabbed = true; - if(Input()->ShiftIsPressed()) - m_MouseSlow = true; - } - else - { - SetActiveItem(nullptr); - } - } - else if(HotItem() == pId) - { - if(InsideHandle) - { - if(MouseButton(0)) - { - SetActiveItem(pId); - m_ActiveScrollbarOffset = MouseY() - Handle.y; - Grabbed = true; - } - } - else if(MouseButtonClicked(0)) - { - SetActiveItem(pId); - m_ActiveScrollbarOffset = Handle.h / 2.0f; - Grabbed = true; - } - } - - if(InsideRail && !MouseButton(0)) - { - SetHotItem(pId); - } - - float ReturnValue = Current; - if(Grabbed) - { - const float Min = Rail.y; - const float Max = Rail.h - Handle.h; - const float Cur = MouseY() - m_ActiveScrollbarOffset; - ReturnValue = clamp((Cur - Min) / Max, 0.0f, 1.0f); - } - - // render - Rail.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_ALL, Rail.w / 2.0f); - Handle.Draw(ms_ScrollBarColorFunction.GetColor(CheckActiveItem(pId), HotItem() == pId), IGraphics::CORNER_ALL, Handle.w / 2.0f); - - return ReturnValue; -} - -float CUi::DoScrollbarH(const void *pId, const CUIRect *pRect, float Current, const ColorRGBA *pColorInner) -{ - Current = clamp(Current, 0.0f, 1.0f); - - // layout - CUIRect Rail; - if(pColorInner) - Rail = *pRect; - else - pRect->HMargin(5.0f, &Rail); - - CUIRect Handle; - Rail.VSplitLeft(pColorInner ? 8.0f : clamp(33.0f, Rail.h, Rail.w / 3.0f), &Handle, 0); - Handle.x += (Rail.w - Handle.w) * Current; - - CUIRect HandleArea = Handle; - if(!pColorInner) - { - HandleArea.h = pRect->h * 0.9f; - HandleArea.y = pRect->y + pRect->h * 0.05f; - HandleArea.w += 6.0f; - HandleArea.x -= 3.0f; - } - - // logic - const bool InsideRail = MouseHovered(&Rail); - const bool InsideHandle = MouseHovered(&HandleArea); - bool Grabbed = false; // whether to apply the offset - - if(CheckActiveItem(pId)) - { - if(MouseButton(0)) - { - Grabbed = true; - if(Input()->ShiftIsPressed()) - m_MouseSlow = true; - } - else - { - SetActiveItem(nullptr); - } - } - else if(HotItem() == pId) - { - if(InsideHandle) - { - if(MouseButton(0)) - { - SetActiveItem(pId); - m_ActiveScrollbarOffset = MouseX() - Handle.x; - Grabbed = true; - } - } - else if(MouseButtonClicked(0)) - { - SetActiveItem(pId); - m_ActiveScrollbarOffset = Handle.w / 2.0f; - Grabbed = true; - } - } - - if(!pColorInner && (InsideHandle || Grabbed) && (CheckActiveItem(pId) || HotItem() == pId)) - { - Handle.h += 3.0f; - Handle.y -= 1.5f; - } - - if(InsideRail && !MouseButton(0)) - { - SetHotItem(pId); - } - - float ReturnValue = Current; - if(Grabbed) - { - const float Min = Rail.x; - const float Max = Rail.w - Handle.w; - const float Cur = MouseX() - m_ActiveScrollbarOffset; - ReturnValue = clamp((Cur - Min) / Max, 0.0f, 1.0f); - } - - // render - const ColorRGBA HandleColor = ms_ScrollBarColorFunction.GetColor(CheckActiveItem(pId), HotItem() == pId); - if(pColorInner) - { - CUIRect Slider; - Handle.VMargin(-2.0f, &Slider); - Slider.HMargin(-3.0f, &Slider); - Slider.Draw(ColorRGBA(0.15f, 0.15f, 0.15f, 1.0f).Multiply(HandleColor), IGraphics::CORNER_ALL, 5.0f); - Slider.Margin(2.0f, &Slider); - Slider.Draw(pColorInner->Multiply(HandleColor), IGraphics::CORNER_ALL, 3.0f); - } - else - { - Rail.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_ALL, Rail.h / 2.0f); - Handle.Draw(HandleColor, IGraphics::CORNER_ALL, Rail.h / 2.0f); - } - - return ReturnValue; -} - -bool CUi::DoScrollbarOption(const void *pId, int *pOption, const CUIRect *pRect, const char *pStr, int Min, int Max, const IScrollbarScale *pScale, unsigned Flags, const char *pSuffix) -{ - const bool Infinite = Flags & CUi::SCROLLBAR_OPTION_INFINITE; - const bool NoClampValue = Flags & CUi::SCROLLBAR_OPTION_NOCLAMPVALUE; - const bool MultiLine = Flags & CUi::SCROLLBAR_OPTION_MULTILINE; - - int Value = *pOption; - if(Infinite) - { - Max += 1; - if(Value == 0) - Value = Max; - } - - char aBuf[256]; - if(!Infinite || Value != Max) - str_format(aBuf, sizeof(aBuf), "%s: %i%s", pStr, Value, pSuffix); - else - str_format(aBuf, sizeof(aBuf), "%s: ∞", pStr); - - if(NoClampValue) - { - // clamp the value internally for the scrollbar - Value = clamp(Value, Min, Max); - } - - CUIRect Label, ScrollBar; - if(MultiLine) - pRect->HSplitMid(&Label, &ScrollBar); - else - pRect->VSplitMid(&Label, &ScrollBar, minimum(10.0f, pRect->w * 0.05f)); - - const float FontSize = Label.h * CUi::ms_FontmodHeight * 0.8f; - DoLabel(&Label, aBuf, FontSize, TEXTALIGN_ML); - - Value = pScale->ToAbsolute(DoScrollbarH(pId, &ScrollBar, pScale->ToRelative(Value, Min, Max)), Min, Max); - if(NoClampValue && ((Value == Min && *pOption < Min) || (Value == Max && *pOption > Max))) - { - Value = *pOption; // use previous out of range value instead if the scrollbar is at the edge - } - else if(Infinite) - { - if(Value == Max) - Value = 0; - } - - if(*pOption != Value) - { - *pOption = Value; - return true; - } - return false; -} - -void CUi::RenderProgressBar(CUIRect ProgressBar, float Progress) -{ - const float Rounding = minimum(5.0f, ProgressBar.h / 2.0f); - ProgressBar.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f), IGraphics::CORNER_ALL, Rounding); - ProgressBar.w = maximum(ProgressBar.w * Progress, 2 * Rounding); - ProgressBar.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f), IGraphics::CORNER_ALL, Rounding); -} - -void CUi::RenderProgressSpinner(vec2 Center, float OuterRadius, const SProgressSpinnerProperties &Props) const -{ - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - - // The filled and unfilled segments need to begin at the same angle offset - // or the differences in pixel alignment will make the filled segments flicker. - const float SegmentsAngle = 2.0f * pi / Props.m_Segments; - const float InnerRadius = OuterRadius * 0.75f; - const float AngleOffset = -0.5f * pi; - Graphics()->SetColor(Props.m_Color.WithMultipliedAlpha(0.5f)); - for(int i = 0; i < Props.m_Segments; ++i) - { - const float Angle1 = AngleOffset + i * SegmentsAngle; - const float Angle2 = AngleOffset + (i + 1) * SegmentsAngle; - IGraphics::CFreeformItem Item = IGraphics::CFreeformItem( - Center.x + std::cos(Angle1) * InnerRadius, Center.y + std::sin(Angle1) * InnerRadius, - Center.x + std::cos(Angle2) * InnerRadius, Center.y + std::sin(Angle2) * InnerRadius, - Center.x + std::cos(Angle1) * OuterRadius, Center.y + std::sin(Angle1) * OuterRadius, - Center.x + std::cos(Angle2) * OuterRadius, Center.y + std::sin(Angle2) * OuterRadius); - Graphics()->QuadsDrawFreeform(&Item, 1); - } - - const float FilledRatio = Props.m_Progress < 0.0f ? 0.333f : Props.m_Progress; - const int FilledSegmentOffset = Props.m_Progress < 0.0f ? round_to_int(m_ProgressSpinnerOffset * Props.m_Segments) : 0; - const int FilledNumSegments = minimum(Props.m_Segments * FilledRatio + (Props.m_Progress < 0.0f ? 0 : 1), Props.m_Segments); - Graphics()->SetColor(Props.m_Color); - for(int i = 0; i < FilledNumSegments; ++i) - { - const float Angle1 = AngleOffset + (i + FilledSegmentOffset) * SegmentsAngle; - const float Angle2 = AngleOffset + ((i + 1 == FilledNumSegments && Props.m_Progress >= 0.0f) ? (2.0f * pi * Props.m_Progress) : ((i + FilledSegmentOffset + 1) * SegmentsAngle)); - IGraphics::CFreeformItem Item = IGraphics::CFreeformItem( - Center.x + std::cos(Angle1) * InnerRadius, Center.y + std::sin(Angle1) * InnerRadius, - Center.x + std::cos(Angle2) * InnerRadius, Center.y + std::sin(Angle2) * InnerRadius, - Center.x + std::cos(Angle1) * OuterRadius, Center.y + std::sin(Angle1) * OuterRadius, - Center.x + std::cos(Angle2) * OuterRadius, Center.y + std::sin(Angle2) * OuterRadius); - Graphics()->QuadsDrawFreeform(&Item, 1); - } - - Graphics()->QuadsEnd(); -} - -void CUi::DoPopupMenu(const SPopupMenuId *pId, float X, float Y, float Width, float Height, void *pContext, FPopupMenuFunction pfnFunc, const SPopupMenuProperties &Props) -{ - constexpr float Margin = SPopupMenu::POPUP_BORDER + SPopupMenu::POPUP_MARGIN; - if(X + Width > Screen()->w - Margin) - X = maximum(X - Width, Margin); - if(Y + Height > Screen()->h - Margin) - Y = maximum(Y - Height, Margin); - - m_vPopupMenus.emplace_back(); - SPopupMenu *pNewMenu = &m_vPopupMenus.back(); - pNewMenu->m_pId = pId; - pNewMenu->m_Props = Props; - pNewMenu->m_Rect.x = X; - pNewMenu->m_Rect.y = Y; - pNewMenu->m_Rect.w = Width; - pNewMenu->m_Rect.h = Height; - pNewMenu->m_pContext = pContext; - pNewMenu->m_pfnFunc = pfnFunc; -} - -void CUi::RenderPopupMenus() -{ - for(size_t i = 0; i < m_vPopupMenus.size(); ++i) - { - const SPopupMenu &PopupMenu = m_vPopupMenus[i]; - const SPopupMenuId *pId = PopupMenu.m_pId; - const bool Inside = MouseInside(&PopupMenu.m_Rect); - const bool Active = i == m_vPopupMenus.size() - 1; - - if(Active) - { - // Prevent UI elements below the popup menu from being activated. - SetHotItem(pId); - } - - if(CheckActiveItem(pId)) - { - if(!MouseButton(0)) - { - if(!Inside) - { - ClosePopupMenu(pId); - --i; - continue; - } - SetActiveItem(nullptr); - } - } - else if(HotItem() == pId) - { - if(MouseButton(0)) - SetActiveItem(pId); - } - - if(Inside) - { - // Prevent scroll regions directly behind popup menus from using the mouse scroll events. - SetHotScrollRegion(nullptr); - } - - CUIRect PopupRect = PopupMenu.m_Rect; - PopupRect.Draw(PopupMenu.m_Props.m_BorderColor, PopupMenu.m_Props.m_Corners, 3.0f); - PopupRect.Margin(SPopupMenu::POPUP_BORDER, &PopupRect); - PopupRect.Draw(PopupMenu.m_Props.m_BackgroundColor, PopupMenu.m_Props.m_Corners, 3.0f); - PopupRect.Margin(SPopupMenu::POPUP_MARGIN, &PopupRect); - - // The popup render function can open/close popups, which may resize the vector and thus - // invalidate the variable PopupMenu. We therefore store pId in a separate variable. - EPopupMenuFunctionResult Result = PopupMenu.m_pfnFunc(PopupMenu.m_pContext, PopupRect, Active); - if(Result != POPUP_KEEP_OPEN || (Active && ConsumeHotkey(HOTKEY_ESCAPE))) - ClosePopupMenu(pId, Result == POPUP_CLOSE_CURRENT_AND_DESCENDANTS); - } -} - -void CUi::ClosePopupMenu(const SPopupMenuId *pId, bool IncludeDescendants) -{ - auto PopupMenuToClose = std::find_if(m_vPopupMenus.begin(), m_vPopupMenus.end(), [pId](const SPopupMenu PopupMenu) { return PopupMenu.m_pId == pId; }); - if(PopupMenuToClose != m_vPopupMenus.end()) - { - if(IncludeDescendants) - m_vPopupMenus.erase(PopupMenuToClose, m_vPopupMenus.end()); - else - m_vPopupMenus.erase(PopupMenuToClose); - SetActiveItem(nullptr); - if(m_pfnPopupMenuClosedCallback) - m_pfnPopupMenuClosedCallback(); - } -} - -void CUi::ClosePopupMenus() -{ - if(m_vPopupMenus.empty()) - return; - - m_vPopupMenus.clear(); - SetActiveItem(nullptr); - if(m_pfnPopupMenuClosedCallback) - m_pfnPopupMenuClosedCallback(); -} - -bool CUi::IsPopupOpen() const -{ - return !m_vPopupMenus.empty(); -} - -bool CUi::IsPopupOpen(const SPopupMenuId *pId) const -{ - return std::any_of(m_vPopupMenus.begin(), m_vPopupMenus.end(), [pId](const SPopupMenu PopupMenu) { return PopupMenu.m_pId == pId; }); -} - -bool CUi::IsPopupHovered() const -{ - return std::any_of(m_vPopupMenus.begin(), m_vPopupMenus.end(), [this](const SPopupMenu PopupMenu) { return MouseHovered(&PopupMenu.m_Rect); }); -} - -void CUi::SetPopupMenuClosedCallback(FPopupMenuClosedCallback pfnCallback) -{ - m_pfnPopupMenuClosedCallback = std::move(pfnCallback); -} - -void CUi::SMessagePopupContext::DefaultColor(ITextRender *pTextRender) -{ - m_TextColor = pTextRender->DefaultTextColor(); -} - -void CUi::SMessagePopupContext::ErrorColor() -{ - m_TextColor = ColorRGBA(1.0f, 0.0f, 0.0f, 1.0f); -} - -CUi::EPopupMenuFunctionResult CUi::PopupMessage(void *pContext, CUIRect View, bool Active) -{ - SMessagePopupContext *pMessagePopup = static_cast(pContext); - CUi *pUI = pMessagePopup->m_pUI; - - pUI->TextRender()->TextColor(pMessagePopup->m_TextColor); - pUI->TextRender()->Text(View.x, View.y, SMessagePopupContext::POPUP_FONT_SIZE, pMessagePopup->m_aMessage, View.w); - pUI->TextRender()->TextColor(pUI->TextRender()->DefaultTextColor()); - - return (Active && pUI->ConsumeHotkey(HOTKEY_ENTER)) ? CUi::POPUP_CLOSE_CURRENT : CUi::POPUP_KEEP_OPEN; -} - -void CUi::ShowPopupMessage(float X, float Y, SMessagePopupContext *pContext) -{ - const float TextWidth = minimum(std::ceil(TextRender()->TextWidth(SMessagePopupContext::POPUP_FONT_SIZE, pContext->m_aMessage, -1, -1.0f) + 0.5f), SMessagePopupContext::POPUP_MAX_WIDTH); - float TextHeight = 0.0f; - STextSizeProperties TextSizeProps{}; - TextSizeProps.m_pHeight = &TextHeight; - TextRender()->TextWidth(SMessagePopupContext::POPUP_FONT_SIZE, pContext->m_aMessage, -1, TextWidth, 0, TextSizeProps); - pContext->m_pUI = this; - DoPopupMenu(pContext, X, Y, TextWidth + 10.0f, TextHeight + 10.0f, pContext, PopupMessage); -} - -CUi::SConfirmPopupContext::SConfirmPopupContext() -{ - Reset(); -} - -void CUi::SConfirmPopupContext::Reset() -{ - m_Result = SConfirmPopupContext::UNSET; -} - -void CUi::SConfirmPopupContext::YesNoButtons() -{ - str_copy(m_aPositiveButtonLabel, Localize("Yes")); - str_copy(m_aNegativeButtonLabel, Localize("No")); -} - -void CUi::ShowPopupConfirm(float X, float Y, SConfirmPopupContext *pContext) -{ - const float TextWidth = minimum(std::ceil(TextRender()->TextWidth(SConfirmPopupContext::POPUP_FONT_SIZE, pContext->m_aMessage, -1, -1.0f) + 0.5f), SConfirmPopupContext::POPUP_MAX_WIDTH); - float TextHeight = 0.0f; - STextSizeProperties TextSizeProps{}; - TextSizeProps.m_pHeight = &TextHeight; - TextRender()->TextWidth(SConfirmPopupContext::POPUP_FONT_SIZE, pContext->m_aMessage, -1, TextWidth, 0, TextSizeProps); - const float PopupHeight = TextHeight + SConfirmPopupContext::POPUP_BUTTON_HEIGHT + SConfirmPopupContext::POPUP_BUTTON_SPACING + 10.0f; - pContext->m_pUI = this; - pContext->m_Result = SConfirmPopupContext::UNSET; - DoPopupMenu(pContext, X, Y, TextWidth + 10.0f, PopupHeight, pContext, PopupConfirm); -} - -CUi::EPopupMenuFunctionResult CUi::PopupConfirm(void *pContext, CUIRect View, bool Active) -{ - SConfirmPopupContext *pConfirmPopup = static_cast(pContext); - CUi *pUI = pConfirmPopup->m_pUI; - - CUIRect Label, ButtonBar, CancelButton, ConfirmButton; - View.HSplitBottom(SConfirmPopupContext::POPUP_BUTTON_HEIGHT, &Label, &ButtonBar); - ButtonBar.VSplitMid(&CancelButton, &ConfirmButton, SConfirmPopupContext::POPUP_BUTTON_SPACING); - - pUI->TextRender()->Text(Label.x, Label.y, SConfirmPopupContext::POPUP_FONT_SIZE, pConfirmPopup->m_aMessage, Label.w); - - if(pUI->DoButton_PopupMenu(&pConfirmPopup->m_CancelButton, pConfirmPopup->m_aNegativeButtonLabel, &CancelButton, SConfirmPopupContext::POPUP_FONT_SIZE, TEXTALIGN_MC)) - { - pConfirmPopup->m_Result = SConfirmPopupContext::CANCELED; - return CUi::POPUP_CLOSE_CURRENT; - } - - if(pUI->DoButton_PopupMenu(&pConfirmPopup->m_ConfirmButton, pConfirmPopup->m_aPositiveButtonLabel, &ConfirmButton, SConfirmPopupContext::POPUP_FONT_SIZE, TEXTALIGN_MC) || (Active && pUI->ConsumeHotkey(HOTKEY_ENTER))) - { - pConfirmPopup->m_Result = SConfirmPopupContext::CONFIRMED; - return CUi::POPUP_CLOSE_CURRENT; - } - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::SSelectionPopupContext::SSelectionPopupContext() -{ - Reset(); -} - -void CUi::SSelectionPopupContext::Reset() -{ - m_Props = SPopupMenuProperties(); - m_aMessage[0] = '\0'; - m_pSelection = nullptr; - m_SelectionIndex = -1; - m_vEntries.clear(); - m_vButtonContainers.clear(); - m_EntryHeight = 12.0f; - m_EntryPadding = 0.0f; - m_EntrySpacing = 5.0f; - m_FontSize = 10.0f; - m_Width = 300.0f + (SPopupMenu::POPUP_BORDER + SPopupMenu::POPUP_MARGIN) * 2; - m_AlignmentHeight = -1.0f; - m_TransparentButtons = false; -} - -CUi::EPopupMenuFunctionResult CUi::PopupSelection(void *pContext, CUIRect View, bool Active) -{ - SSelectionPopupContext *pSelectionPopup = static_cast(pContext); - CUi *pUI = pSelectionPopup->m_pUI; - CScrollRegion *pScrollRegion = pSelectionPopup->m_pScrollRegion; - - vec2 ScrollOffset(0.0f, 0.0f); - CScrollRegionParams ScrollParams; - ScrollParams.m_ScrollbarWidth = 10.0f; - ScrollParams.m_ScrollbarMargin = SPopupMenu::POPUP_MARGIN; - ScrollParams.m_ScrollbarNoMarginRight = true; - ScrollParams.m_ScrollUnit = 3 * (pSelectionPopup->m_EntryHeight + pSelectionPopup->m_EntrySpacing); - pScrollRegion->Begin(&View, &ScrollOffset, &ScrollParams); - View.y += ScrollOffset.y; - - CUIRect Slot; - if(pSelectionPopup->m_aMessage[0] != '\0') - { - const STextBoundingBox TextBoundingBox = pUI->TextRender()->TextBoundingBox(pSelectionPopup->m_FontSize, pSelectionPopup->m_aMessage, -1, pSelectionPopup->m_Width); - View.HSplitTop(TextBoundingBox.m_H, &Slot, &View); - if(pScrollRegion->AddRect(Slot)) - { - pUI->TextRender()->Text(Slot.x, Slot.y, pSelectionPopup->m_FontSize, pSelectionPopup->m_aMessage, Slot.w); - } - } - - pSelectionPopup->m_vButtonContainers.resize(pSelectionPopup->m_vEntries.size()); - - size_t Index = 0; - for(const auto &Entry : pSelectionPopup->m_vEntries) - { - if(pSelectionPopup->m_aMessage[0] != '\0' || Index != 0) - View.HSplitTop(pSelectionPopup->m_EntrySpacing, nullptr, &View); - View.HSplitTop(pSelectionPopup->m_EntryHeight, &Slot, &View); - if(pScrollRegion->AddRect(Slot)) - { - if(pUI->DoButton_PopupMenu(&pSelectionPopup->m_vButtonContainers[Index], Entry.c_str(), &Slot, pSelectionPopup->m_FontSize, TEXTALIGN_ML, pSelectionPopup->m_EntryPadding, pSelectionPopup->m_TransparentButtons)) - { - pSelectionPopup->m_pSelection = &Entry; - pSelectionPopup->m_SelectionIndex = Index; - } - } - ++Index; - } - - pScrollRegion->End(); - - return pSelectionPopup->m_pSelection == nullptr ? CUi::POPUP_KEEP_OPEN : CUi::POPUP_CLOSE_CURRENT; -} - -void CUi::ShowPopupSelection(float X, float Y, SSelectionPopupContext *pContext) -{ - const STextBoundingBox TextBoundingBox = TextRender()->TextBoundingBox(pContext->m_FontSize, pContext->m_aMessage, -1, pContext->m_Width); - const float PopupHeight = minimum((pContext->m_aMessage[0] == '\0' ? -pContext->m_EntrySpacing : TextBoundingBox.m_H) + pContext->m_vEntries.size() * (pContext->m_EntryHeight + pContext->m_EntrySpacing) + (SPopupMenu::POPUP_BORDER + SPopupMenu::POPUP_MARGIN) * 2 + CScrollRegion::HEIGHT_MAGIC_FIX, Screen()->h * 0.4f); - pContext->m_pUI = this; - pContext->m_pSelection = nullptr; - pContext->m_SelectionIndex = -1; - pContext->m_Props.m_Corners = IGraphics::CORNER_ALL; - if(pContext->m_AlignmentHeight >= 0.0f) - { - constexpr float Margin = SPopupMenu::POPUP_BORDER + SPopupMenu::POPUP_MARGIN; - if(X + pContext->m_Width > Screen()->w - Margin) - { - X = maximum(X - pContext->m_Width, Margin); - } - if(Y + pContext->m_AlignmentHeight + PopupHeight > Screen()->h - Margin) - { - Y -= PopupHeight; - pContext->m_Props.m_Corners = IGraphics::CORNER_T; - } - else - { - Y += pContext->m_AlignmentHeight; - pContext->m_Props.m_Corners = IGraphics::CORNER_B; - } - } - DoPopupMenu(pContext, X, Y, pContext->m_Width, PopupHeight, pContext, PopupSelection, pContext->m_Props); -} - -int CUi::DoDropDown(CUIRect *pRect, int CurSelection, const char **pStrs, int Num, SDropDownState &State) -{ - if(!State.m_Init) - { - State.m_UiElement.Init(this, -1); - State.m_Init = true; - } - - const auto LabelFunc = [CurSelection, pStrs]() { - return CurSelection > -1 ? pStrs[CurSelection] : ""; - }; - - SMenuButtonProperties Props; - Props.m_HintRequiresStringCheck = true; - Props.m_HintCanChangePositionOrSize = true; - Props.m_ShowDropDownIcon = true; - if(IsPopupOpen(&State.m_SelectionPopupContext)) - Props.m_Corners = IGraphics::CORNER_ALL & (~State.m_SelectionPopupContext.m_Props.m_Corners); - if(DoButton_Menu(State.m_UiElement, &State.m_ButtonContainer, LabelFunc, pRect, Props)) - { - State.m_SelectionPopupContext.Reset(); - State.m_SelectionPopupContext.m_Props.m_BorderColor = ColorRGBA(0.7f, 0.7f, 0.7f, 0.9f); - State.m_SelectionPopupContext.m_Props.m_BackgroundColor = ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f); - for(int i = 0; i < Num; ++i) - State.m_SelectionPopupContext.m_vEntries.emplace_back(pStrs[i]); - State.m_SelectionPopupContext.m_EntryHeight = pRect->h; - State.m_SelectionPopupContext.m_EntryPadding = pRect->h >= 20.0f ? 2.0f : 1.0f; - State.m_SelectionPopupContext.m_FontSize = (State.m_SelectionPopupContext.m_EntryHeight - 2 * State.m_SelectionPopupContext.m_EntryPadding) * CUi::ms_FontmodHeight; - State.m_SelectionPopupContext.m_Width = pRect->w; - State.m_SelectionPopupContext.m_AlignmentHeight = pRect->h; - State.m_SelectionPopupContext.m_TransparentButtons = true; - ShowPopupSelection(pRect->x, pRect->y, &State.m_SelectionPopupContext); - } - - if(State.m_SelectionPopupContext.m_SelectionIndex >= 0) - { - const int NewSelection = State.m_SelectionPopupContext.m_SelectionIndex; - State.m_SelectionPopupContext.Reset(); - return NewSelection; - } - - return CurSelection; -} - -CUi::EPopupMenuFunctionResult CUi::PopupColorPicker(void *pContext, CUIRect View, bool Active) -{ - SColorPickerPopupContext *pColorPicker = static_cast(pContext); - CUi *pUI = pColorPicker->m_pUI; - pColorPicker->m_State = EEditState::NONE; - - CUIRect ColorsArea, HueArea, BottomArea, ModeButtonArea, HueRect, SatRect, ValueRect, HexRect, AlphaRect; - - View.HSplitTop(140.0f, &ColorsArea, &BottomArea); - ColorsArea.VSplitRight(20.0f, &ColorsArea, &HueArea); - - BottomArea.HSplitTop(3.0f, nullptr, &BottomArea); - HueArea.VSplitLeft(3.0f, nullptr, &HueArea); - - BottomArea.HSplitTop(20.0f, &HueRect, &BottomArea); - BottomArea.HSplitTop(3.0f, nullptr, &BottomArea); - - constexpr float ValuePadding = 5.0f; - const float HsvValueWidth = (HueRect.w - ValuePadding * 2) / 3.0f; - const float HexValueWidth = HsvValueWidth * 2 + ValuePadding; - - HueRect.VSplitLeft(HsvValueWidth, &HueRect, &SatRect); - SatRect.VSplitLeft(ValuePadding, nullptr, &SatRect); - SatRect.VSplitLeft(HsvValueWidth, &SatRect, &ValueRect); - ValueRect.VSplitLeft(ValuePadding, nullptr, &ValueRect); - - BottomArea.HSplitTop(20.0f, &HexRect, &BottomArea); - BottomArea.HSplitTop(3.0f, nullptr, &BottomArea); - HexRect.VSplitLeft(HexValueWidth, &HexRect, &AlphaRect); - AlphaRect.VSplitLeft(ValuePadding, nullptr, &AlphaRect); - BottomArea.HSplitTop(20.0f, &ModeButtonArea, &BottomArea); - - const ColorRGBA BlackColor = ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f); - - HueArea.Draw(BlackColor, IGraphics::CORNER_NONE, 0.0f); - HueArea.Margin(1.0f, &HueArea); - - ColorsArea.Draw(BlackColor, IGraphics::CORNER_NONE, 0.0f); - ColorsArea.Margin(1.0f, &ColorsArea); - - ColorHSVA PickerColorHSV = pColorPicker->m_HsvaColor; - ColorRGBA PickerColorRGB = pColorPicker->m_RgbaColor; - ColorHSLA PickerColorHSL = pColorPicker->m_HslaColor; - - // Color Area - ColorRGBA TL, TR, BL, BR; - TL = BL = color_cast(ColorHSVA(PickerColorHSV.x, 0.0f, 1.0f)); - TR = BR = color_cast(ColorHSVA(PickerColorHSV.x, 1.0f, 1.0f)); - ColorsArea.Draw4(TL, TR, BL, BR, IGraphics::CORNER_NONE, 0.0f); - - TL = TR = ColorRGBA(0.0f, 0.0f, 0.0f, 0.0f); - BL = BR = ColorRGBA(0.0f, 0.0f, 0.0f, 1.0f); - ColorsArea.Draw4(TL, TR, BL, BR, IGraphics::CORNER_NONE, 0.0f); - - // Hue Area - static const float s_aaColorIndices[7][3] = { - {1.0f, 0.0f, 0.0f}, // red - {1.0f, 0.0f, 1.0f}, // magenta - {0.0f, 0.0f, 1.0f}, // blue - {0.0f, 1.0f, 1.0f}, // cyan - {0.0f, 1.0f, 0.0f}, // green - {1.0f, 1.0f, 0.0f}, // yellow - {1.0f, 0.0f, 0.0f}, // red - }; - - const float HuePickerOffset = HueArea.h / 6.0f; - CUIRect HuePartialArea = HueArea; - HuePartialArea.h = HuePickerOffset; - - for(size_t j = 0; j < std::size(s_aaColorIndices) - 1; j++) - { - TL = ColorRGBA(s_aaColorIndices[j][0], s_aaColorIndices[j][1], s_aaColorIndices[j][2], 1.0f); - BL = ColorRGBA(s_aaColorIndices[j + 1][0], s_aaColorIndices[j + 1][1], s_aaColorIndices[j + 1][2], 1.0f); - - HuePartialArea.y = HueArea.y + HuePickerOffset * j; - HuePartialArea.Draw4(TL, TL, BL, BL, IGraphics::CORNER_NONE, 0.0f); - } - - const auto &&RenderAlphaSelector = [&](unsigned OldA) -> SEditResult { - if(pColorPicker->m_Alpha) - { - return pUI->DoValueSelectorWithState(&pColorPicker->m_aValueSelectorIds[3], &AlphaRect, "A:", OldA, 0, 255); - } - else - { - char aBuf[8]; - str_format(aBuf, sizeof(aBuf), "A: %d", OldA); - pUI->DoLabel(&AlphaRect, aBuf, 10.0f, TEXTALIGN_MC); - AlphaRect.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.65f), IGraphics::CORNER_ALL, 3.0f); - return {EEditState::NONE, OldA}; - } - }; - - // Editboxes Area - if(pColorPicker->m_ColorMode == SColorPickerPopupContext::MODE_HSVA) - { - const unsigned OldH = round_to_int(PickerColorHSV.h * 255.0f); - const unsigned OldS = round_to_int(PickerColorHSV.s * 255.0f); - const unsigned OldV = round_to_int(PickerColorHSV.v * 255.0f); - const unsigned OldA = round_to_int(PickerColorHSV.a * 255.0f); - - const auto [StateH, H] = pUI->DoValueSelectorWithState(&pColorPicker->m_aValueSelectorIds[0], &HueRect, "H:", OldH, 0, 255); - const auto [StateS, S] = pUI->DoValueSelectorWithState(&pColorPicker->m_aValueSelectorIds[1], &SatRect, "S:", OldS, 0, 255); - const auto [StateV, V] = pUI->DoValueSelectorWithState(&pColorPicker->m_aValueSelectorIds[2], &ValueRect, "V:", OldV, 0, 255); - const auto [StateA, A] = RenderAlphaSelector(OldA); - - if(OldH != H || OldS != S || OldV != V || OldA != A) - { - PickerColorHSV = ColorHSVA(H / 255.0f, S / 255.0f, V / 255.0f, A / 255.0f); - PickerColorHSL = color_cast(PickerColorHSV); - PickerColorRGB = color_cast(PickerColorHSL); - } - - for(auto State : {StateH, StateS, StateV, StateA}) - { - if(State != EEditState::NONE) - { - pColorPicker->m_State = State; - break; - } - } - } - else if(pColorPicker->m_ColorMode == SColorPickerPopupContext::MODE_RGBA) - { - const unsigned OldR = round_to_int(PickerColorRGB.r * 255.0f); - const unsigned OldG = round_to_int(PickerColorRGB.g * 255.0f); - const unsigned OldB = round_to_int(PickerColorRGB.b * 255.0f); - const unsigned OldA = round_to_int(PickerColorRGB.a * 255.0f); - - const auto [StateR, R] = pUI->DoValueSelectorWithState(&pColorPicker->m_aValueSelectorIds[0], &HueRect, "R:", OldR, 0, 255); - const auto [StateG, G] = pUI->DoValueSelectorWithState(&pColorPicker->m_aValueSelectorIds[1], &SatRect, "G:", OldG, 0, 255); - const auto [StateB, B] = pUI->DoValueSelectorWithState(&pColorPicker->m_aValueSelectorIds[2], &ValueRect, "B:", OldB, 0, 255); - const auto [StateA, A] = RenderAlphaSelector(OldA); - - if(OldR != R || OldG != G || OldB != B || OldA != A) - { - PickerColorRGB = ColorRGBA(R / 255.0f, G / 255.0f, B / 255.0f, A / 255.0f); - PickerColorHSL = color_cast(PickerColorRGB); - PickerColorHSV = color_cast(PickerColorHSL); - } - - for(auto State : {StateR, StateG, StateB, StateA}) - { - if(State != EEditState::NONE) - { - pColorPicker->m_State = State; - break; - } - } - } - else if(pColorPicker->m_ColorMode == SColorPickerPopupContext::MODE_HSLA) - { - const unsigned OldH = round_to_int(PickerColorHSL.h * 255.0f); - const unsigned OldS = round_to_int(PickerColorHSL.s * 255.0f); - const unsigned OldL = round_to_int(PickerColorHSL.l * 255.0f); - const unsigned OldA = round_to_int(PickerColorHSL.a * 255.0f); - - const auto [StateH, H] = pUI->DoValueSelectorWithState(&pColorPicker->m_aValueSelectorIds[0], &HueRect, "H:", OldH, 0, 255); - const auto [StateS, S] = pUI->DoValueSelectorWithState(&pColorPicker->m_aValueSelectorIds[1], &SatRect, "S:", OldS, 0, 255); - const auto [StateL, L] = pUI->DoValueSelectorWithState(&pColorPicker->m_aValueSelectorIds[2], &ValueRect, "L:", OldL, 0, 255); - const auto [StateA, A] = RenderAlphaSelector(OldA); - - if(OldH != H || OldS != S || OldL != L || OldA != A) - { - PickerColorHSL = ColorHSLA(H / 255.0f, S / 255.0f, L / 255.0f, A / 255.0f); - PickerColorHSV = color_cast(PickerColorHSL); - PickerColorRGB = color_cast(PickerColorHSL); - } - - for(auto State : {StateH, StateS, StateL, StateA}) - { - if(State != EEditState::NONE) - { - pColorPicker->m_State = State; - break; - } - } - } - else - { - dbg_assert(false, "Color picker mode invalid"); - } - - SValueSelectorProperties Props; - Props.m_UseScroll = false; - Props.m_IsHex = true; - Props.m_HexPrefix = pColorPicker->m_Alpha ? 8 : 6; - const unsigned OldHex = PickerColorRGB.PackAlphaLast(pColorPicker->m_Alpha); - auto [HexState, Hex] = pUI->DoValueSelectorWithState(&pColorPicker->m_aValueSelectorIds[4], &HexRect, "Hex:", OldHex, 0, pColorPicker->m_Alpha ? 0xFFFFFFFFll : 0xFFFFFFll, Props); - if(OldHex != Hex) - { - const float OldAlpha = PickerColorRGB.a; - PickerColorRGB = ColorRGBA::UnpackAlphaLast(Hex, pColorPicker->m_Alpha); - if(!pColorPicker->m_Alpha) - PickerColorRGB.a = OldAlpha; - PickerColorHSL = color_cast(PickerColorRGB); - PickerColorHSV = color_cast(PickerColorHSL); - } - - if(HexState != EEditState::NONE) - pColorPicker->m_State = HexState; - - // Logic - float PickerX, PickerY; - EEditState ColorPickerRes = pUI->DoPickerLogic(&pColorPicker->m_ColorPickerId, &ColorsArea, &PickerX, &PickerY); - if(ColorPickerRes != EEditState::NONE) - { - PickerColorHSV.y = PickerX / ColorsArea.w; - PickerColorHSV.z = 1.0f - PickerY / ColorsArea.h; - PickerColorHSL = color_cast(PickerColorHSV); - PickerColorRGB = color_cast(PickerColorHSL); - pColorPicker->m_State = ColorPickerRes; - } - - EEditState HuePickerRes = pUI->DoPickerLogic(&pColorPicker->m_HuePickerId, &HueArea, &PickerX, &PickerY); - if(HuePickerRes != EEditState::NONE) - { - PickerColorHSV.x = 1.0f - PickerY / HueArea.h; - PickerColorHSL = color_cast(PickerColorHSV); - PickerColorRGB = color_cast(PickerColorHSL); - pColorPicker->m_State = HuePickerRes; - } - - // Marker Color Area - const float MarkerX = ColorsArea.x + ColorsArea.w * PickerColorHSV.y; - const float MarkerY = ColorsArea.y + ColorsArea.h * (1.0f - PickerColorHSV.z); - - const float MarkerOutlineInd = PickerColorHSV.z > 0.5f ? 0.0f : 1.0f; - const ColorRGBA MarkerOutline = ColorRGBA(MarkerOutlineInd, MarkerOutlineInd, MarkerOutlineInd, 1.0f); - - pUI->Graphics()->TextureClear(); - pUI->Graphics()->QuadsBegin(); - pUI->Graphics()->SetColor(MarkerOutline); - pUI->Graphics()->DrawCircle(MarkerX, MarkerY, 4.5f, 32); - pUI->Graphics()->SetColor(PickerColorRGB); - pUI->Graphics()->DrawCircle(MarkerX, MarkerY, 3.5f, 32); - pUI->Graphics()->QuadsEnd(); - - // Marker Hue Area - CUIRect HueMarker; - HueArea.Margin(-2.5f, &HueMarker); - HueMarker.h = 6.5f; - HueMarker.y = (HueArea.y + HueArea.h * (1.0f - PickerColorHSV.x)) - HueMarker.h / 2.0f; - - const ColorRGBA HueMarkerColor = color_cast(ColorHSVA(PickerColorHSV.x, 1.0f, 1.0f, 1.0f)); - const float HueMarkerOutlineColor = PickerColorHSV.x > 0.75f ? 1.0f : 0.0f; - const ColorRGBA HueMarkerOutline = ColorRGBA(HueMarkerOutlineColor, HueMarkerOutlineColor, HueMarkerOutlineColor, 1.0f); - - HueMarker.Draw(HueMarkerOutline, IGraphics::CORNER_ALL, 1.2f); - HueMarker.Margin(1.2f, &HueMarker); - HueMarker.Draw(HueMarkerColor, IGraphics::CORNER_ALL, 1.2f); - - pColorPicker->m_HsvaColor = PickerColorHSV; - pColorPicker->m_RgbaColor = PickerColorRGB; - pColorPicker->m_HslaColor = PickerColorHSL; - if(pColorPicker->m_pHslaColor != nullptr) - *pColorPicker->m_pHslaColor = PickerColorHSL.Pack(pColorPicker->m_Alpha); - - static const SColorPickerPopupContext::EColorPickerMode s_aModes[] = {SColorPickerPopupContext::MODE_HSVA, SColorPickerPopupContext::MODE_RGBA, SColorPickerPopupContext::MODE_HSLA}; - static const char *s_apModeLabels[std::size(s_aModes)] = {"HSVA", "RGBA", "HSLA"}; - for(SColorPickerPopupContext::EColorPickerMode Mode : s_aModes) - { - CUIRect ModeButton; - ModeButtonArea.VSplitLeft(HsvValueWidth, &ModeButton, &ModeButtonArea); - ModeButtonArea.VSplitLeft(ValuePadding, nullptr, &ModeButtonArea); - if(pUI->DoButton_PopupMenu(&pColorPicker->m_aModeButtons[(int)Mode], s_apModeLabels[Mode], &ModeButton, 10.0f, TEXTALIGN_MC, 2.0f, false, pColorPicker->m_ColorMode != Mode)) - { - pColorPicker->m_ColorMode = Mode; - } - } - - return CUi::POPUP_KEEP_OPEN; -} - -void CUi::ShowPopupColorPicker(float X, float Y, SColorPickerPopupContext *pContext) -{ - pContext->m_pUI = this; - if(pContext->m_ColorMode == SColorPickerPopupContext::MODE_UNSET) - pContext->m_ColorMode = SColorPickerPopupContext::MODE_HSVA; - DoPopupMenu(pContext, X, Y, 160.0f + 10.0f, 209.0f + 10.0f, pContext, PopupColorPicker); -} diff --git a/src/game/client/ui.h b/src/game/client/ui.h deleted file mode 100644 index 2f52c156b0..0000000000 --- a/src/game/client/ui.h +++ /dev/null @@ -1,763 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_UI_H -#define GAME_CLIENT_UI_H - -#include "lineinput.h" -#include "ui_rect.h" - -#include -#include - -#include -#include -#include -#include - -class CScrollRegion; -class IClient; -class IGraphics; -class IKernel; - -enum class EEditState -{ - NONE, - START, - EDITING, - END, - ONE_GO -}; - -template -struct SEditResult -{ - EEditState m_State; - T m_Value; -}; - -struct SUIAnimator -{ - bool m_Active; - bool m_ScaleLabel; - bool m_RepositionLabel; - - std::chrono::nanoseconds m_Time; - float m_Value; - - float m_XOffset; - float m_YOffset; - float m_WOffset; - float m_HOffset; -}; - -class IScrollbarScale -{ -public: - virtual float ToRelative(int AbsoluteValue, int Min, int Max) const = 0; - virtual int ToAbsolute(float RelativeValue, int Min, int Max) const = 0; -}; -class CLinearScrollbarScale : public IScrollbarScale -{ -public: - float ToRelative(int AbsoluteValue, int Min, int Max) const override - { - return (AbsoluteValue - Min) / (float)(Max - Min); - } - int ToAbsolute(float RelativeValue, int Min, int Max) const override - { - return round_to_int(RelativeValue * (Max - Min) + Min + 0.1f); - } -}; -class CLogarithmicScrollbarScale : public IScrollbarScale -{ -private: - int m_MinAdjustment; - -public: - CLogarithmicScrollbarScale(int MinAdjustment) - { - m_MinAdjustment = maximum(MinAdjustment, 1); // must be at least 1 to support Min == 0 with logarithm - } - float ToRelative(int AbsoluteValue, int Min, int Max) const override - { - if(Min < m_MinAdjustment) - { - AbsoluteValue += m_MinAdjustment; - Min += m_MinAdjustment; - Max += m_MinAdjustment; - } - return (std::log(AbsoluteValue) - std::log(Min)) / (float)(std::log(Max) - std::log(Min)); - } - int ToAbsolute(float RelativeValue, int Min, int Max) const override - { - int ResultAdjustment = 0; - if(Min < m_MinAdjustment) - { - Min += m_MinAdjustment; - Max += m_MinAdjustment; - ResultAdjustment = -m_MinAdjustment; - } - return round_to_int(std::exp(RelativeValue * (std::log(Max) - std::log(Min)) + std::log(Min))) + ResultAdjustment; - } -}; - -class IButtonColorFunction -{ -public: - virtual ColorRGBA GetColor(bool Active, bool Hovered) const = 0; -}; -class CDarkButtonColorFunction : public IButtonColorFunction -{ -public: - ColorRGBA GetColor(bool Active, bool Hovered) const override - { - if(Active) - return ColorRGBA(0.15f, 0.15f, 0.15f, 0.25f); - else if(Hovered) - return ColorRGBA(0.5f, 0.5f, 0.5f, 0.25f); - return ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f); - } -}; -class CLightButtonColorFunction : public IButtonColorFunction -{ -public: - ColorRGBA GetColor(bool Active, bool Hovered) const override - { - if(Active) - return ColorRGBA(1.0f, 1.0f, 1.0f, 0.4f); - else if(Hovered) - return ColorRGBA(1.0f, 1.0f, 1.0f, 0.6f); - return ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f); - } -}; -class CScrollBarColorFunction : public IButtonColorFunction -{ -public: - ColorRGBA GetColor(bool Active, bool Hovered) const override - { - if(Active) - return ColorRGBA(0.9f, 0.9f, 0.9f, 1.0f); - else if(Hovered) - return ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - return ColorRGBA(0.8f, 0.8f, 0.8f, 1.0f); - } -}; - -class CUi; - -class CUIElement -{ - friend class CUi; - - CUi *m_pUI; - - CUIElement(CUi *pUI, int RequestedRectCount) { Init(pUI, RequestedRectCount); } - -public: - struct SUIElementRect - { - CUIElement *m_pParent; - - public: - int m_UIRectQuadContainer; - STextContainerIndex m_UITextContainer; - - float m_X; - float m_Y; - float m_Width; - float m_Height; - float m_Rounding; - int m_Corners; - - std::string m_Text; - int m_ReadCursorGlyphCount; - - CTextCursor m_Cursor; - - ColorRGBA m_TextColor; - ColorRGBA m_TextOutlineColor; - - SUIElementRect(); - - ColorRGBA m_QuadColor; - - void Reset(); - void Draw(const CUIRect *pRect, ColorRGBA Color, int Corners, float Rounding); - }; - -protected: - CUi *Ui() const { return m_pUI; } - std::vector m_vUIRects; - -public: - CUIElement() = default; - - void Init(CUi *pUI, int RequestedRectCount); - - SUIElementRect *Rect(size_t Index) - { - return &m_vUIRects[Index]; - } - - bool AreRectsInit() - { - return !m_vUIRects.empty(); - } - - void InitRects(int RequestedRectCount); -}; - -struct SLabelProperties -{ - float m_MaxWidth = -1; - bool m_StopAtEnd = false; - bool m_EllipsisAtEnd = false; - bool m_EnableWidthCheck = true; - std::vector m_vColorSplits = {}; -}; - -struct SMenuButtonProperties -{ - int m_Checked = 0; - bool m_HintRequiresStringCheck = false; - bool m_HintCanChangePositionOrSize = false; - bool m_UseIconFont = false; - bool m_ShowDropDownIcon = false; - int m_Corners = IGraphics::CORNER_ALL; - float m_Rounding = 5.0f; - float m_FontFactor = 0.0f; - ColorRGBA m_Color = ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f); -}; - -class CUIElementBase -{ -private: - static CUi *s_pUI; - -public: - static void Init(CUi *pUI) { s_pUI = pUI; } - - IClient *Client() const; - IGraphics *Graphics() const; - IInput *Input() const; - ITextRender *TextRender() const; - CUi *Ui() const { return s_pUI; } -}; - -class CButtonContainer -{ -}; - -struct SValueSelectorProperties -{ - bool m_UseScroll = true; - int64_t m_Step = 1; - float m_Scale = 1.0f; - bool m_IsHex = false; - int m_HexPrefix = 6; - ColorRGBA m_Color = ColorRGBA(0.0f, 0.0f, 0.0f, 0.4f); -}; - -struct SProgressSpinnerProperties -{ - float m_Progress = -1.0f; // between 0.0f and 1.0f, or negative for indeterminate progress - ColorRGBA m_Color = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - int m_Segments = 64; -}; - -/** - * Type safe UI ID for popup menus. - */ -struct SPopupMenuId -{ -}; - -struct SPopupMenuProperties -{ - int m_Corners = IGraphics::CORNER_ALL; - ColorRGBA m_BorderColor = ColorRGBA(0.5f, 0.5f, 0.5f, 0.75f); - ColorRGBA m_BackgroundColor = ColorRGBA(0.0f, 0.0f, 0.0f, 0.75f); -}; - -class CUi -{ -public: - /** - * These enum values are returned by popup menu functions to specify the behavior. - */ - enum EPopupMenuFunctionResult - { - /** - * The current popup menu will be kept open. - */ - POPUP_KEEP_OPEN = 0, - - /** - * The current popup menu will be closed. - */ - POPUP_CLOSE_CURRENT = 1, - - /** - * The current popup menu and all popup menus above it will be closed. - */ - POPUP_CLOSE_CURRENT_AND_DESCENDANTS = 2, - }; - - /** - * Callback that draws a popup menu. - * - * @param pContext The context object of the popup menu. - * @param View The UI rect where the popup menu's contents should be drawn. - * @param Active Whether this popup is active (the top-most popup). - * Only the active popup should handle key and mouse events. - * - * @return Value from the @link EPopupMenuFunctionResult @endlink enum. - */ - typedef EPopupMenuFunctionResult (*FPopupMenuFunction)(void *pContext, CUIRect View, bool Active); - - /** - * Callback that is called when one or more popups are closed. - */ - typedef std::function FPopupMenuClosedCallback; - - /** - * Represents the aggregated state of current touch events to control a user interface. - */ - class CTouchState - { - friend class CUi; - - bool m_SecondaryPressedNext = false; - float m_SecondaryActivationTime = 0.0f; - vec2 m_SecondaryActivationDelta = vec2(0.0f, 0.0f); - - public: - bool m_AnyPressed = false; - bool m_PrimaryPressed = false; - bool m_SecondaryPressed = false; - vec2 m_PrimaryPosition = vec2(-1.0f, -1.0f); - vec2 m_PrimaryDelta = vec2(0.0f, 0.0f); - vec2 m_ScrollAmount = vec2(0.0f, 0.0f); - }; - -private: - bool m_Enabled; - - const void *m_pHotItem = nullptr; - const void *m_pActiveItem = nullptr; - const void *m_pLastActiveItem = nullptr; // only used internally to track active CLineInput - const void *m_pBecomingHotItem = nullptr; - CScrollRegion *m_pHotScrollRegion = nullptr; - CScrollRegion *m_pBecomingHotScrollRegion = nullptr; - bool m_ActiveItemValid = false; - - int m_ActiveButtonLogicButton = -1; - int m_ActiveDraggableButtonLogicButton = -1; - class CDoubleClickState - { - public: - const void *m_pLastClickedId = nullptr; - float m_LastClickTime = -1.0f; - vec2 m_LastClickPos = vec2(-1.0f, -1.0f); - }; - CDoubleClickState m_DoubleClickState; - const void *m_pLastEditingItem = nullptr; - float m_ActiveScrollbarOffset = 0.0f; - float m_ProgressSpinnerOffset = 0.0f; - class CValueSelectorState - { - public: - int m_Button = -1; - bool m_DidScroll = false; - float m_ScrollValue = 0.0f; - CLineInputNumber m_NumberInput; - const void *m_pLastTextId = nullptr; - }; - CValueSelectorState m_ActiveValueSelectorState; - - vec2 m_UpdatedMousePos = vec2(0.0f, 0.0f); // in window screen space - vec2 m_UpdatedMouseDelta = vec2(0.0f, 0.0f); // in window screen space - vec2 m_MousePos = vec2(0.0f, 0.0f); // in gui space - vec2 m_MouseDelta = vec2(0.0f, 0.0f); // in gui space - vec2 m_MouseWorldPos = vec2(-1.0f, -1.0f); // in world space - unsigned m_UpdatedMouseButtons = 0; - unsigned m_MouseButtons = 0; - unsigned m_LastMouseButtons = 0; - CTouchState m_TouchState; - bool m_MouseSlow = false; - bool m_MouseLock = false; - const void *m_pMouseLockId = nullptr; - - unsigned m_HotkeysPressed = 0; - - CUIRect m_Screen; - - std::vector m_vClips; - void UpdateClipping(); - - struct SPopupMenu - { - static constexpr float POPUP_BORDER = 1.0f; - static constexpr float POPUP_MARGIN = 4.0f; - - const SPopupMenuId *m_pId; - SPopupMenuProperties m_Props; - CUIRect m_Rect; - void *m_pContext; - FPopupMenuFunction m_pfnFunc; - }; - std::vector m_vPopupMenus; - FPopupMenuClosedCallback m_pfnPopupMenuClosedCallback = nullptr; - - static CUi::EPopupMenuFunctionResult PopupMessage(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupConfirm(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupSelection(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupColorPicker(void *pContext, CUIRect View, bool Active); - - IClient *m_pClient; - IGraphics *m_pGraphics; - IInput *m_pInput; - ITextRender *m_pTextRender; - - std::vector m_vpOwnUIElements; // ui elements maintained by CUi class - std::vector m_vpUIElements; - -public: - static const CLinearScrollbarScale ms_LinearScrollbarScale; - static const CLogarithmicScrollbarScale ms_LogarithmicScrollbarScale; - static const CDarkButtonColorFunction ms_DarkButtonColorFunction; - static const CLightButtonColorFunction ms_LightButtonColorFunction; - static const CScrollBarColorFunction ms_ScrollBarColorFunction; - - static const float ms_FontmodHeight; - - void Init(IKernel *pKernel); - IClient *Client() const { return m_pClient; } - IGraphics *Graphics() const { return m_pGraphics; } - IInput *Input() const { return m_pInput; } - ITextRender *TextRender() const { return m_pTextRender; } - - CUi(); - ~CUi(); - - enum EHotkey : unsigned - { - HOTKEY_ENTER = 1 << 0, - HOTKEY_ESCAPE = 1 << 1, - HOTKEY_UP = 1 << 2, - HOTKEY_DOWN = 1 << 3, - HOTKEY_LEFT = 1 << 4, - HOTKEY_RIGHT = 1 << 5, - HOTKEY_DELETE = 1 << 6, - HOTKEY_TAB = 1 << 7, - HOTKEY_SCROLL_UP = 1 << 8, - HOTKEY_SCROLL_DOWN = 1 << 9, - HOTKEY_PAGE_UP = 1 << 10, - HOTKEY_PAGE_DOWN = 1 << 11, - HOTKEY_HOME = 1 << 12, - HOTKEY_END = 1 << 13, - }; - - void ResetUIElement(CUIElement &UIElement) const; - - CUIElement *GetNewUIElement(int RequestedRectCount); - - void AddUIElement(CUIElement *pElement); - void OnElementsReset(); - void OnWindowResize(); - void OnCursorMove(float X, float Y); - - void SetEnabled(bool Enabled) { m_Enabled = Enabled; } - bool Enabled() const { return m_Enabled; } - void Update(vec2 MouseWorldPos = vec2(-1.0f, -1.0f)); - void DebugRender(float X, float Y); - - vec2 MousePos() const { return m_MousePos; } - float MouseX() const { return m_MousePos.x; } - float MouseY() const { return m_MousePos.y; } - vec2 MouseDelta() const { return m_MouseDelta; } - float MouseDeltaX() const { return m_MouseDelta.x; } - float MouseDeltaY() const { return m_MouseDelta.y; } - vec2 MouseWorldPos() const { return m_MouseWorldPos; } - float MouseWorldX() const { return m_MouseWorldPos.x; } - float MouseWorldY() const { return m_MouseWorldPos.y; } - vec2 UpdatedMousePos() const { return m_UpdatedMousePos; } - vec2 UpdatedMouseDelta() const { return m_UpdatedMouseDelta; } - int MouseButton(int Index) const { return (m_MouseButtons >> Index) & 1; } - int MouseButtonClicked(int Index) const { return MouseButton(Index) && !((m_LastMouseButtons >> Index) & 1); } - bool CheckMouseLock() - { - if(m_MouseLock && ActiveItem() != m_pMouseLockId) - DisableMouseLock(); - return m_MouseLock; - } - void EnableMouseLock(const void *pId) - { - m_MouseLock = true; - m_pMouseLockId = pId; - } - void DisableMouseLock() { m_MouseLock = false; } - - void SetHotItem(const void *pId) { m_pBecomingHotItem = pId; } - void SetActiveItem(const void *pId) - { - m_ActiveItemValid = true; - m_pActiveItem = pId; - if(pId) - m_pLastActiveItem = pId; - } - bool CheckActiveItem(const void *pId) - { - if(m_pActiveItem == pId) - { - m_ActiveItemValid = true; - return true; - } - return false; - } - void SetHotScrollRegion(CScrollRegion *pId) { m_pBecomingHotScrollRegion = pId; } - const void *HotItem() const { return m_pHotItem; } - const void *NextHotItem() const { return m_pBecomingHotItem; } - const void *ActiveItem() const { return m_pActiveItem; } - const CScrollRegion *HotScrollRegion() const { return m_pHotScrollRegion; } - - void StartCheck() { m_ActiveItemValid = false; } - void FinishCheck() - { - if(!m_ActiveItemValid && m_pActiveItem != nullptr) - { - SetActiveItem(nullptr); - m_pHotItem = nullptr; - m_pBecomingHotItem = nullptr; - } - } - - bool MouseInside(const CUIRect *pRect) const; - bool MouseInsideClip() const { return !IsClipped() || MouseInside(ClipArea()); } - bool MouseHovered(const CUIRect *pRect) const { return MouseInside(pRect) && MouseInsideClip(); } - void ConvertMouseMove(float *pX, float *pY, IInput::ECursorType CursorType) const; - void UpdateTouchState(CTouchState &State) const; - void ResetMouseSlow() { m_MouseSlow = false; } - - bool ConsumeHotkey(EHotkey Hotkey); - void ClearHotkeys() { m_HotkeysPressed = 0; } - bool OnInput(const IInput::CEvent &Event); - - constexpr float ButtonColorMulActive() const { return 0.5f; } - constexpr float ButtonColorMulHot() const { return 1.5f; } - constexpr float ButtonColorMulDefault() const { return 1.0f; } - float ButtonColorMul(const void *pId); - - const CUIRect *Screen(); - void MapScreen(); - float PixelSize(); - - void ClipEnable(const CUIRect *pRect); - void ClipDisable(); - const CUIRect *ClipArea() const; - inline bool IsClipped() const { return !m_vClips.empty(); } - - int DoButtonLogic(const void *pId, int Checked, const CUIRect *pRect); - int DoDraggableButtonLogic(const void *pId, int Checked, const CUIRect *pRect, bool *pClicked, bool *pAbrupted); - bool DoDoubleClickLogic(const void *pId); - EEditState DoPickerLogic(const void *pId, const CUIRect *pRect, float *pX, float *pY); - void DoSmoothScrollLogic(float *pScrollOffset, float *pScrollOffsetChange, float ViewPortSize, float TotalSize, bool SmoothClamp = false, float ScrollSpeed = 10.0f) const; - static vec2 CalcAlignedCursorPos(const CUIRect *pRect, vec2 TextSize, int Align, const float *pBiggestCharHeight = nullptr); - - void DoLabel(const CUIRect *pRect, const char *pText, float Size, int Align, const SLabelProperties &LabelProps = {}) const; - - void DoLabel(CUIElement::SUIElementRect &RectEl, const CUIRect *pRect, const char *pText, float Size, int Align, const SLabelProperties &LabelProps = {}, int StrLen = -1, const CTextCursor *pReadCursor = nullptr) const; - void DoLabelStreamed(CUIElement::SUIElementRect &RectEl, const CUIRect *pRect, const char *pText, float Size, int Align, const SLabelProperties &LabelProps = {}, int StrLen = -1, const CTextCursor *pReadCursor = nullptr) const; - - /** - * Creates an input field. - * - * @see DoClearableEditBox - * - * @param pLineInput This pointer will be stored and written to on next user input. - * So you can not pass in a pointer that goes out of scope such as a local variable. - * Pass in either a member variable of the current class or a static variable. - * For example ```static CLineInputBuffered s_MyInput;``` - * @param pRect the UI rect it will attach to with a 2.0f margin - * @param FontSize Size of the font (`10.0f`, `12.0f` and `14.0f` are commonly used here) - * @param Corners Number of corners (default: `IGraphics::CORNER_ALL`) - * @param vColorSplits Sets color splits of the `CTextCursor` to allow multicolored text - * - * @return true if the value of the input field changed since the last call. - */ - bool DoEditBox(CLineInput *pLineInput, const CUIRect *pRect, float FontSize, int Corners = IGraphics::CORNER_ALL, const std::vector &vColorSplits = {}); - - /** - * Creates an input field with a clear [x] button attached to it. - * - * @see DoEditBox - * - * @param pLineInput This pointer will be stored and written to on next user input. - * So you can not pass in a pointer that goes out of scope such as a local variable. - * Pass in either a member variable of the current class or a static variable. - * For example ```static CLineInputBuffered s_MyInput;``` - * @param pRect the UI rect it will attach to - * @param FontSize Size of the font (`10.0f`, `12.0f` and `14.0f` are commonly used here) - * @param Corners Number of corners (default: `IGraphics::CORNER_ALL`) - * @param vColorSplits Sets color splits of the `CTextCursor` to allow multicolored text - * - * @return true if the value of the input field changed since the last call. - */ - bool DoClearableEditBox(CLineInput *pLineInput, const CUIRect *pRect, float FontSize, int Corners = IGraphics::CORNER_ALL, const std::vector &vColorSplits = {}); - - /** - * Creates an input field with a search icon and a clear [x] button attached to it. - * The input will have default text "Search" and the hotkey Ctrl+F can be used to activate the input. - * - * @see DoEditBox - * - * @param pLineInput This pointer will be stored and written to on next user input. - * So you can not pass in a pointer that goes out of scope such as a local variable. - * Pass in either a member variable of the current class or a static variable. - * For example ```static CLineInputBuffered s_MyInput;``` - * @param pRect the UI rect it will attach to - * @param FontSize Size of the font (`10.0f`, `12.0f` and `14.0f` are commonly used here) - * @param HotkeyEnabled Whether the hotkey to enable this editbox is currently enabled. - * - * @return true if the value of the input field changed since the last call. - */ - bool DoEditBox_Search(CLineInput *pLineInput, const CUIRect *pRect, float FontSize, bool HotkeyEnabled); - - int DoButton_Menu(CUIElement &UIElement, const CButtonContainer *pId, const std::function &GetTextLambda, const CUIRect *pRect, const SMenuButtonProperties &Props = {}); - // only used for popup menus - int DoButton_PopupMenu(CButtonContainer *pButtonContainer, const char *pText, const CUIRect *pRect, float Size, int Align, float Padding = 0.0f, bool TransparentInactive = false, bool Enabled = true); - - // value selector - SEditResult DoValueSelectorWithState(const void *pId, const CUIRect *pRect, const char *pLabel, int64_t Current, int64_t Min, int64_t Max, const SValueSelectorProperties &Props = {}); - int64_t DoValueSelector(const void *pId, const CUIRect *pRect, const char *pLabel, int64_t Current, int64_t Min, int64_t Max, const SValueSelectorProperties &Props = {}); - - // scrollbars - enum - { - SCROLLBAR_OPTION_INFINITE = 1 << 0, - SCROLLBAR_OPTION_NOCLAMPVALUE = 1 << 1, - SCROLLBAR_OPTION_MULTILINE = 1 << 2, - }; - float DoScrollbarV(const void *pId, const CUIRect *pRect, float Current); - float DoScrollbarH(const void *pId, const CUIRect *pRect, float Current, const ColorRGBA *pColorInner = nullptr); - bool DoScrollbarOption(const void *pId, int *pOption, const CUIRect *pRect, const char *pStr, int Min, int Max, const IScrollbarScale *pScale = &ms_LinearScrollbarScale, unsigned Flags = 0u, const char *pSuffix = ""); - - // progress bar - void RenderProgressBar(CUIRect ProgressBar, float Progress); - - // progress spinner - void RenderProgressSpinner(vec2 Center, float OuterRadius, const SProgressSpinnerProperties &Props = {}) const; - - // popup menu - void DoPopupMenu(const SPopupMenuId *pId, float X, float Y, float Width, float Height, void *pContext, FPopupMenuFunction pfnFunc, const SPopupMenuProperties &Props = {}); - void RenderPopupMenus(); - void ClosePopupMenu(const SPopupMenuId *pId, bool IncludeDescendants = false); - void ClosePopupMenus(); - bool IsPopupOpen() const; - bool IsPopupOpen(const SPopupMenuId *pId) const; - bool IsPopupHovered() const; - void SetPopupMenuClosedCallback(FPopupMenuClosedCallback pfnCallback); - - struct SMessagePopupContext : public SPopupMenuId - { - static constexpr float POPUP_MAX_WIDTH = 200.0f; - static constexpr float POPUP_FONT_SIZE = 10.0f; - - CUi *m_pUI; // set by CUi when popup is shown - char m_aMessage[1024]; - ColorRGBA m_TextColor; - - void DefaultColor(class ITextRender *pTextRender); - void ErrorColor(); - }; - void ShowPopupMessage(float X, float Y, SMessagePopupContext *pContext); - - struct SConfirmPopupContext : public SPopupMenuId - { - enum EConfirmationResult - { - UNSET = 0, - CONFIRMED, - CANCELED, - }; - static constexpr float POPUP_MAX_WIDTH = 200.0f; - static constexpr float POPUP_FONT_SIZE = 10.0f; - static constexpr float POPUP_BUTTON_HEIGHT = 12.0f; - static constexpr float POPUP_BUTTON_SPACING = 5.0f; - - CUi *m_pUI; // set by CUi when popup is shown - char m_aPositiveButtonLabel[128]; - char m_aNegativeButtonLabel[128]; - char m_aMessage[1024]; - EConfirmationResult m_Result; - - CButtonContainer m_CancelButton; - CButtonContainer m_ConfirmButton; - - SConfirmPopupContext(); - void Reset(); - void YesNoButtons(); - }; - void ShowPopupConfirm(float X, float Y, SConfirmPopupContext *pContext); - - struct SSelectionPopupContext : public SPopupMenuId - { - CUi *m_pUI; // set by CUi when popup is shown - CScrollRegion *m_pScrollRegion; - SPopupMenuProperties m_Props; - char m_aMessage[256]; - std::vector m_vEntries; - std::vector m_vButtonContainers; - const std::string *m_pSelection; - int m_SelectionIndex; - float m_EntryHeight; - float m_EntryPadding; - float m_EntrySpacing; - float m_FontSize; - float m_Width; - float m_AlignmentHeight; - bool m_TransparentButtons; - - SSelectionPopupContext(); - void Reset(); - }; - void ShowPopupSelection(float X, float Y, SSelectionPopupContext *pContext); - - struct SColorPickerPopupContext : public SPopupMenuId - { - enum EColorPickerMode - { - MODE_UNSET = -1, - MODE_HSVA, - MODE_RGBA, - MODE_HSLA, - }; - - CUi *m_pUI; // set by CUi when popup is shown - EColorPickerMode m_ColorMode = MODE_UNSET; - bool m_Alpha = false; - unsigned int *m_pHslaColor = nullptr; // may be nullptr - ColorHSVA m_HsvaColor; - ColorRGBA m_RgbaColor; - ColorHSLA m_HslaColor; - // UI element IDs - const char m_HuePickerId = 0; - const char m_ColorPickerId = 0; - const char m_aValueSelectorIds[5] = {0}; - CButtonContainer m_aModeButtons[(int)MODE_HSLA + 1]; - EEditState m_State; - }; - void ShowPopupColorPicker(float X, float Y, SColorPickerPopupContext *pContext); - - // dropdown menu - struct SDropDownState - { - SSelectionPopupContext m_SelectionPopupContext; - CUIElement m_UiElement; - CButtonContainer m_ButtonContainer; - bool m_Init = false; - }; - int DoDropDown(CUIRect *pRect, int CurSelection, const char **pStrs, int Num, SDropDownState &State); -}; - -#endif diff --git a/src/game/client/ui_listbox.cpp b/src/game/client/ui_listbox.cpp deleted file mode 100644 index cfbe18ddb0..0000000000 --- a/src/game/client/ui_listbox.cpp +++ /dev/null @@ -1,216 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include - -#include -#include - -#include - -#include "ui_listbox.h" - -CListBox::CListBox() -{ - m_ScrollOffset = vec2(0.0f, 0.0f); - m_ListBoxUpdateScroll = false; - m_ScrollbarWidth = 20.0f; - m_ScrollbarMargin = 5.0f; - m_HasHeader = false; - m_AutoSpacing = 0.0f; - m_ScrollbarShown = false; - m_Active = true; -} - -void CListBox::DoBegin(const CUIRect *pRect) -{ - // setup the variables - m_ListBoxView = *pRect; -} - -void CListBox::DoHeader(const CUIRect *pRect, const char *pTitle, float HeaderHeight, float Spacing) -{ - CUIRect View = *pRect; - CUIRect Header; - - // background - View.HSplitTop(HeaderHeight + Spacing, &Header, 0); - Header.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.15f), m_BackgroundCorners & IGraphics::CORNER_T, 5.0f); - - // draw header - View.HSplitTop(HeaderHeight, &Header, &View); - Ui()->DoLabel(&Header, pTitle, Header.h * CUi::ms_FontmodHeight * 0.8f, TEXTALIGN_MC); - - View.HSplitTop(Spacing, &Header, &View); - - // setup the variables - m_ListBoxView = View; - m_HasHeader = true; -} - -void CListBox::DoSpacing(float Spacing) -{ - CUIRect View = m_ListBoxView; - View.HSplitTop(Spacing, 0, &View); - m_ListBoxView = View; -} - -void CListBox::DoFooter(const char *pBottomText, float FooterHeight) -{ - m_pBottomText = pBottomText; - m_FooterHeight = FooterHeight; -} - -void CListBox::DoStart(float RowHeight, int NumItems, int ItemsPerRow, int RowsPerScroll, int SelectedIndex, const CUIRect *pRect, bool Background, int BackgroundCorners, bool ForceShowScrollbar) -{ - CUIRect View; - if(pRect) - View = *pRect; - else - View = m_ListBoxView; - - // background - m_BackgroundCorners = BackgroundCorners; - if(Background) - View.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.15f), m_BackgroundCorners & (m_HasHeader ? IGraphics::CORNER_B : IGraphics::CORNER_ALL), 5.0f); - - // draw footers - if(m_pBottomText) - { - CUIRect Footer; - View.HSplitBottom(m_FooterHeight, &View, &Footer); - Footer.VSplitLeft(10.0f, 0, &Footer); - Ui()->DoLabel(&Footer, m_pBottomText, Footer.h * CUi::ms_FontmodHeight * 0.8f, TEXTALIGN_MC); - } - - // setup the variables - m_ListBoxView = View; - m_RowView = {}; - m_ListBoxSelectedIndex = SelectedIndex; - m_ListBoxNewSelected = SelectedIndex; - m_ListBoxNewSelOffset = 0; - m_ListBoxItemIndex = 0; - m_ListBoxRowHeight = RowHeight; - m_ListBoxNumItems = NumItems; - m_ListBoxItemsPerRow = ItemsPerRow; - m_ListBoxItemActivated = false; - m_ListBoxItemSelected = false; - - // handle input - if(m_Active && !Input()->ModifierIsPressed() && !Input()->ShiftIsPressed() && !Input()->AltIsPressed()) - { - if(Ui()->ConsumeHotkey(CUi::HOTKEY_DOWN)) - m_ListBoxNewSelOffset += m_ListBoxItemsPerRow; - else if(Ui()->ConsumeHotkey(CUi::HOTKEY_UP)) - m_ListBoxNewSelOffset -= m_ListBoxItemsPerRow; - else if(Ui()->ConsumeHotkey(CUi::HOTKEY_RIGHT) && m_ListBoxItemsPerRow > 1) - m_ListBoxNewSelOffset += 1; - else if(Ui()->ConsumeHotkey(CUi::HOTKEY_LEFT) && m_ListBoxItemsPerRow > 1) - m_ListBoxNewSelOffset -= 1; - else if(Ui()->ConsumeHotkey(CUi::HOTKEY_PAGE_UP)) - m_ListBoxNewSelOffset = -ItemsPerRow * RowsPerScroll * 4; - else if(Ui()->ConsumeHotkey(CUi::HOTKEY_PAGE_DOWN)) - m_ListBoxNewSelOffset = ItemsPerRow * RowsPerScroll * 4; - else if(Ui()->ConsumeHotkey(CUi::HOTKEY_HOME)) - m_ListBoxNewSelOffset = 1 - m_ListBoxNumItems; - else if(Ui()->ConsumeHotkey(CUi::HOTKEY_END)) - m_ListBoxNewSelOffset = m_ListBoxNumItems - 1; - } - - // setup the scrollbar - m_ScrollOffset = vec2(0.0f, 0.0f); - CScrollRegionParams ScrollParams; - ScrollParams.m_ScrollbarWidth = ScrollbarWidthMax(); - ScrollParams.m_ScrollbarMargin = ScrollbarMargin(); - ScrollParams.m_ScrollUnit = (m_ListBoxRowHeight + m_AutoSpacing) * RowsPerScroll; - ScrollParams.m_Flags = ForceShowScrollbar ? CScrollRegionParams::FLAG_CONTENT_STATIC_WIDTH : 0; - m_ScrollRegion.Begin(&m_ListBoxView, &m_ScrollOffset, &ScrollParams); - m_ListBoxView.y += m_ScrollOffset.y; -} - -CListboxItem CListBox::DoNextRow() -{ - CListboxItem Item = {}; - - if(m_ListBoxItemIndex % m_ListBoxItemsPerRow == 0) - m_ListBoxView.HSplitTop(m_ListBoxRowHeight, &m_RowView, &m_ListBoxView); - m_ScrollRegion.AddRect(m_RowView); - if(m_ListBoxUpdateScroll && m_ListBoxSelectedIndex == m_ListBoxItemIndex) - { - m_ScrollRegion.ScrollHere(CScrollRegion::SCROLLHERE_KEEP_IN_VIEW); - m_ListBoxUpdateScroll = false; - } - - m_RowView.VSplitLeft(m_RowView.w / (m_ListBoxItemsPerRow - m_ListBoxItemIndex % m_ListBoxItemsPerRow), &Item.m_Rect, &m_RowView); - - Item.m_Selected = m_ListBoxSelectedIndex == m_ListBoxItemIndex; - Item.m_Visible = !m_ScrollRegion.RectClipped(Item.m_Rect); - - m_ListBoxItemIndex++; - return Item; -} - -CListboxItem CListBox::DoNextItem(const void *pId, bool Selected, float CornerRadius) -{ - if(m_AutoSpacing > 0.0f && m_ListBoxItemIndex > 0) - DoSpacing(m_AutoSpacing); - - const int ThisItemIndex = m_ListBoxItemIndex; - if(Selected) - { - if(m_ListBoxSelectedIndex == m_ListBoxNewSelected) - m_ListBoxNewSelected = ThisItemIndex; - m_ListBoxSelectedIndex = ThisItemIndex; - } - - CListboxItem Item = DoNextRow(); - const int ItemClicked = Item.m_Visible ? Ui()->DoButtonLogic(pId, 0, &Item.m_Rect) : 0; - if(ItemClicked) - { - m_ListBoxNewSelected = ThisItemIndex; - m_ListBoxItemSelected = true; - m_Active = true; - } - - // process input, regard selected index - if(m_ListBoxNewSelected == ThisItemIndex) - { - if(m_Active) - { - if(Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER) || (ItemClicked == 1 && Ui()->DoDoubleClickLogic(pId))) - { - m_ListBoxItemActivated = true; - Ui()->SetActiveItem(nullptr); - } - } - - Item.m_Rect.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, m_Active ? 0.5f : 0.33f), IGraphics::CORNER_ALL, CornerRadius); - } - if(Ui()->HotItem() == pId && !m_ScrollRegion.Animating()) - { - Item.m_Rect.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.33f), IGraphics::CORNER_ALL, CornerRadius); - } - - return Item; -} - -CListboxItem CListBox::DoSubheader() -{ - CListboxItem Item = DoNextRow(); - Item.m_Rect.Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.2f), IGraphics::CORNER_NONE, 0.0f); - return Item; -} - -int CListBox::DoEnd() -{ - m_ScrollRegion.End(); - m_Active |= m_ScrollRegion.Active(); - - m_ScrollbarShown = m_ScrollRegion.ScrollbarShown(); - if(m_ListBoxNewSelOffset != 0 && m_ListBoxNumItems > 0 && m_ListBoxSelectedIndex == m_ListBoxNewSelected) - { - m_ListBoxNewSelected = clamp((m_ListBoxNewSelected == -1 ? 0 : m_ListBoxNewSelected) + m_ListBoxNewSelOffset, 0, m_ListBoxNumItems - 1); - ScrollToSelected(); - } - return m_ListBoxNewSelected; -} diff --git a/src/game/client/ui_listbox.h b/src/game/client/ui_listbox.h deleted file mode 100644 index 26ecc71710..0000000000 --- a/src/game/client/ui_listbox.h +++ /dev/null @@ -1,75 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_UI_LISTBOX_H -#define GAME_CLIENT_UI_LISTBOX_H - -#include "ui_scrollregion.h" - -struct CListboxItem -{ - bool m_Visible; - bool m_Selected; - CUIRect m_Rect; -}; - -// Instances of CListBox must be static, as member addresses are used as UI item IDs -class CListBox : private CUIElementBase -{ -private: - CUIRect m_ListBoxView; - CUIRect m_RowView; - float m_ListBoxRowHeight; - int m_ListBoxItemIndex; - int m_ListBoxSelectedIndex; - int m_ListBoxNewSelected; - int m_ListBoxNewSelOffset; - bool m_ListBoxUpdateScroll; - int m_ListBoxNumItems; - int m_ListBoxItemsPerRow; - bool m_ListBoxItemSelected; - bool m_ListBoxItemActivated; - bool m_ScrollbarShown; - const char *m_pBottomText; - float m_FooterHeight; - float m_AutoSpacing; - CScrollRegion m_ScrollRegion; - vec2 m_ScrollOffset; - int m_BackgroundCorners; - float m_ScrollbarWidth; - float m_ScrollbarMargin; - bool m_HasHeader; - bool m_Active; - -protected: - CListboxItem DoNextRow(); - -public: - CListBox(); - - void DoBegin(const CUIRect *pRect); - void DoHeader(const CUIRect *pRect, const char *pTitle, float HeaderHeight = 20.0f, float Spacing = 2.0f); - void DoAutoSpacing(float Spacing = 20.0f) { m_AutoSpacing = Spacing; } - void DoSpacing(float Spacing = 20.0f); - void DoFooter(const char *pBottomText, float FooterHeight = 20.0f); // call before DoStart to create a footer - void DoStart(float RowHeight, int NumItems, int ItemsPerRow, int RowsPerScroll, int SelectedIndex, const CUIRect *pRect = nullptr, bool Background = true, int BackgroundCorners = IGraphics::CORNER_ALL, bool ForceShowScrollbar = false); - void ScrollToSelected() { m_ListBoxUpdateScroll = true; } - CListboxItem DoNextItem(const void *pId, bool Selected = false, float CornerRadius = 5.0f); - CListboxItem DoSubheader(); - int DoEnd(); - - // Active state must be set before calling DoStart. - bool Active() const { return m_Active; } - void SetActive(bool Active) { m_Active = Active; } - - bool WasItemSelected() const { return m_ListBoxItemSelected; } - bool WasItemActivated() const { return m_ListBoxItemActivated; } - - bool ScrollbarShown() const { return m_ScrollbarShown; } - float ScrollbarWidth() const { return ScrollbarShown() ? ScrollbarWidthMax() : 0.0f; } - float ScrollbarWidthMax() const { return m_ScrollbarWidth; } - void SetScrollbarWidth(float Width) { m_ScrollbarWidth = Width; } - float ScrollbarMargin() const { return m_ScrollbarMargin; } - void SetScrollbarMargin(float Margin) { m_ScrollbarMargin = Margin; } -}; - -#endif diff --git a/src/game/client/ui_rect.cpp b/src/game/client/ui_rect.cpp deleted file mode 100644 index 347477ad2a..0000000000 --- a/src/game/client/ui_rect.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include "ui_rect.h" - -#include - -IGraphics *CUIRect::s_pGraphics = nullptr; - -void CUIRect::HSplitMid(CUIRect *pTop, CUIRect *pBottom, float Spacing) const -{ - CUIRect r = *this; - const float Cut = r.h / 2; - const float HalfSpacing = Spacing / 2; - - if(pTop) - { - pTop->x = r.x; - pTop->y = r.y; - pTop->w = r.w; - pTop->h = Cut - HalfSpacing; - } - - if(pBottom) - { - pBottom->x = r.x; - pBottom->y = r.y + Cut + HalfSpacing; - pBottom->w = r.w; - pBottom->h = Cut - HalfSpacing; - } -} - -void CUIRect::HSplitTop(float Cut, CUIRect *pTop, CUIRect *pBottom) const -{ - CUIRect r = *this; - - if(pTop) - { - pTop->x = r.x; - pTop->y = r.y; - pTop->w = r.w; - pTop->h = Cut; - } - - if(pBottom) - { - pBottom->x = r.x; - pBottom->y = r.y + Cut; - pBottom->w = r.w; - pBottom->h = r.h - Cut; - } -} - -void CUIRect::HSplitBottom(float Cut, CUIRect *pTop, CUIRect *pBottom) const -{ - CUIRect r = *this; - - if(pTop) - { - pTop->x = r.x; - pTop->y = r.y; - pTop->w = r.w; - pTop->h = r.h - Cut; - } - - if(pBottom) - { - pBottom->x = r.x; - pBottom->y = r.y + r.h - Cut; - pBottom->w = r.w; - pBottom->h = Cut; - } -} - -void CUIRect::VSplitMid(CUIRect *pLeft, CUIRect *pRight, float Spacing) const -{ - CUIRect r = *this; - const float Cut = r.w / 2; - const float HalfSpacing = Spacing / 2; - - if(pLeft) - { - pLeft->x = r.x; - pLeft->y = r.y; - pLeft->w = Cut - HalfSpacing; - pLeft->h = r.h; - } - - if(pRight) - { - pRight->x = r.x + Cut + HalfSpacing; - pRight->y = r.y; - pRight->w = Cut - HalfSpacing; - pRight->h = r.h; - } -} - -void CUIRect::VSplitLeft(float Cut, CUIRect *pLeft, CUIRect *pRight) const -{ - CUIRect r = *this; - - if(pLeft) - { - pLeft->x = r.x; - pLeft->y = r.y; - pLeft->w = Cut; - pLeft->h = r.h; - } - - if(pRight) - { - pRight->x = r.x + Cut; - pRight->y = r.y; - pRight->w = r.w - Cut; - pRight->h = r.h; - } -} - -void CUIRect::VSplitRight(float Cut, CUIRect *pLeft, CUIRect *pRight) const -{ - CUIRect r = *this; - - if(pLeft) - { - pLeft->x = r.x; - pLeft->y = r.y; - pLeft->w = r.w - Cut; - pLeft->h = r.h; - } - - if(pRight) - { - pRight->x = r.x + r.w - Cut; - pRight->y = r.y; - pRight->w = Cut; - pRight->h = r.h; - } -} - -void CUIRect::Margin(vec2 Cut, CUIRect *pOtherRect) const -{ - CUIRect r = *this; - - pOtherRect->x = r.x + Cut.x; - pOtherRect->y = r.y + Cut.y; - pOtherRect->w = r.w - 2 * Cut.x; - pOtherRect->h = r.h - 2 * Cut.y; -} - -void CUIRect::Margin(float Cut, CUIRect *pOtherRect) const -{ - Margin(vec2(Cut, Cut), pOtherRect); -} - -void CUIRect::VMargin(float Cut, CUIRect *pOtherRect) const -{ - Margin(vec2(Cut, 0.0f), pOtherRect); -} - -void CUIRect::HMargin(float Cut, CUIRect *pOtherRect) const -{ - Margin(vec2(0.0f, Cut), pOtherRect); -} - -bool CUIRect::Inside(vec2 Point) const -{ - return Point.x >= x && Point.x < x + w && Point.y >= y && Point.y < y + h; -} - -void CUIRect::Draw(ColorRGBA Color, int Corners, float Rounding) const -{ - s_pGraphics->DrawRect(x, y, w, h, Color, Corners, Rounding); -} - -void CUIRect::Draw4(ColorRGBA ColorTopLeft, ColorRGBA ColorTopRight, ColorRGBA ColorBottomLeft, ColorRGBA ColorBottomRight, int Corners, float Rounding) const -{ - s_pGraphics->DrawRect4(x, y, w, h, ColorTopLeft, ColorTopRight, ColorBottomLeft, ColorBottomRight, Corners, Rounding); -} diff --git a/src/game/client/ui_rect.h b/src/game/client/ui_rect.h deleted file mode 100644 index f3d38e420e..0000000000 --- a/src/game/client/ui_rect.h +++ /dev/null @@ -1,159 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_UI_RECT_H -#define GAME_CLIENT_UI_RECT_H - -#include - -class IGraphics; - -class CUIRect -{ - static IGraphics *s_pGraphics; - -public: - static void Init(IGraphics *pGraphics) { s_pGraphics = pGraphics; } - - float x, y, w, h; - - /** - * Splits 2 CUIRect inside *this* CUIRect horizontally. You can pass null pointers. - * - * @param pTop This rect will end up taking the top half of this CUIRect. - * @param pBottom This rect will end up taking the bottom half of this CUIRect. - * @param Spacing Total size of margin between split rects. - */ - void HSplitMid(CUIRect *pTop, CUIRect *pBottom, float Spacing = 0.0f) const; - /** - * Splits 2 CUIRect inside *this* CUIRect. - * - * The cut parameter determines the height of the top rect, so it allows more customization than HSplitMid. - * - * This method doesn't check if Cut is bigger than *this* rect height. - * - * @param Cut The height of the pTop rect. - * @param pTop The rect that ends up at the top with a height equal to Cut. - * @param pBottom The rect that ends up at the bottom with a height equal to *this* rect minus the Cut. - */ - void HSplitTop(float Cut, CUIRect *pTop, CUIRect *pBottom) const; - /** - * Splits 2 CUIRect inside *this* CUIRect. - * - * The cut parameter determines the height of the bottom rect, so it allows more customization than HSplitMid. - * - * This method doesn't check if Cut is bigger than *this* rect height. - * - * @param Cut The height of the pBottom rect. - * @param pTop The rect that ends up at the top with a height equal to *this* CUIRect height minus Cut. - * @param pBottom The rect that ends up at the bottom with a height equal to Cut. - */ - void HSplitBottom(float Cut, CUIRect *pTop, CUIRect *pBottom) const; - /** - * Splits 2 CUIRect inside *this* CUIRect vertically. You can pass null pointers. - * - * @param pLeft This rect will take up the left half of *this* CUIRect. - * @param pRight This rect will take up the right half of *this* CUIRect. - * @param Spacing Total size of margin between split rects. - */ - void VSplitMid(CUIRect *pLeft, CUIRect *pRight, float Spacing = 0.0f) const; - /** - * Splits 2 CUIRect inside *this* CUIRect. - * - * The cut parameter determines the width of the left rect, so it allows more customization than VSplitMid. - * - * This method doesn't check if Cut is bigger than *this* rect width. - * - * @param Cut The width of the pLeft rect. - * @param pLeft The rect that ends up at the left with a width equal to Cut. - * @param pRight The rect that ends up at the right with a width equal to *this* rect minus the Cut. - */ - void VSplitLeft(float Cut, CUIRect *pLeft, CUIRect *pRight) const; - /** - * Splits 2 CUIRect inside *this* CUIRect. - * - * The cut parameter determines the width of the right rect, so it allows more customization than VSplitMid. - * - * This method doesn't check if Cut is bigger than *this* rect width. - * - * @param Cut The width of the pRight rect. - * @param pLeft The rect that ends up at the left with a width equal to *this* CUIRect width minus Cut. - * @param pRight The rect that ends up at the right with a width equal to Cut. - */ - void VSplitRight(float Cut, CUIRect *pLeft, CUIRect *pRight) const; - - /** - * Places pOtherRect inside *this* CUIRect with Cut as the margin. - * - * @param Cut The margin as a vec2. - * The x component applies to the vertical axis. - * The y component applies to the horizontal axis. - * @param pOtherRect The CUIRect to place inside *this* CUIRect. - */ - void Margin(vec2 Cut, CUIRect *pOtherRect) const; - /** - * Places pOtherRect inside *this* CUIRect with Cut as the margin. - * - * @param Cut The margin. - * @param pOtherRect The CUIRect to place inside *this* CUIRect. - */ - void Margin(float Cut, CUIRect *pOtherRect) const; - /** - * Places pOtherRect inside *this* CUIRect applying Cut as the margin only on the vertical axis. - * - * @param Cut The margin. - * @param pOtherRect The CUIRect to place inside *this* CUIRect - */ - void VMargin(float Cut, CUIRect *pOtherRect) const; - /** - * Places pOtherRect inside *this* CUIRect applying Cut as the margin only on the horizontal axis. - * - * @param Cut The margin. - * @param pOtherRect The CUIRect to place inside *this* CUIRect - */ - void HMargin(float Cut, CUIRect *pOtherRect) const; - - /** - * Checks whether a point is inside *this* CUIRect. - * - * @param Point The point's position. - * @return true iff the given point is inside *this* CUIRect. - */ - bool Inside(vec2 Point) const; - - /** - * Fill background of *this* CUIRect. - * - * @note Example of filling a black half transparent background with 5px rounded edges on all sides - * @note ```MyCuiRect.Draw(ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f), IGraphics::CORNER_ALL, 5.0f);``` - * - * @note Example of filling a red background with sharp edges - * @note ```MyCuiRect.Draw(ColorRGBA(1.0f, 0.0f, 0.0f), IGraphics::CORNER_NONE, 0.0f);``` - * - * @param Color - * @param Corners - * @param Rounding - */ - void Draw(ColorRGBA Color, int Corners, float Rounding) const; - void Draw4(ColorRGBA ColorTopLeft, ColorRGBA ColorTopRight, ColorRGBA ColorBottomLeft, ColorRGBA ColorBottomRight, int Corners, float Rounding) const; - - /** - * Returns the top-left position of *this* CUIRect as a vec2. - * - * @return Top-left position as vec2. - */ - vec2 TopLeft() const { return vec2(x, y); } - /** - * Returns the size of *this* CUIRect as a vec2. - * - * @return Size as vec2. - */ - vec2 Size() const { return vec2(w, h); } - /** - * Returns the center position of *this* CUIRect as a vec2. - * - * @return Center position as vec2. - */ - vec2 Center() const { return TopLeft() + Size() / 2.0f; } -}; - -#endif diff --git a/src/game/client/ui_scrollregion.cpp b/src/game/client/ui_scrollregion.cpp deleted file mode 100644 index 8c0cdba6c5..0000000000 --- a/src/game/client/ui_scrollregion.cpp +++ /dev/null @@ -1,276 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include -#include - -#include -#include -#include - -#include "ui_scrollregion.h" - -CScrollRegion::CScrollRegion() -{ - m_ScrollY = 0.0f; - m_ContentH = 0.0f; - m_RequestScrollY = -1.0f; - m_ScrollDirection = SCROLLRELATIVE_NONE; - m_ScrollSpeedMultiplier = 1.0f; - - m_AnimTimeMax = 0.0f; - m_AnimTime = 0.0f; - m_AnimInitScrollY = 0.0f; - m_AnimTargetScrollY = 0.0f; - - m_SliderGrabPos = 0.0f; - m_ContentScrollOff = vec2(0.0f, 0.0f); - m_Params = CScrollRegionParams(); -} - -void CScrollRegion::Begin(CUIRect *pClipRect, vec2 *pOutOffset, const CScrollRegionParams *pParams) -{ - if(pParams) - m_Params = *pParams; - - const bool ContentOverflows = m_ContentH > pClipRect->h; - const bool ForceShowScrollbar = m_Params.m_Flags & CScrollRegionParams::FLAG_CONTENT_STATIC_WIDTH; - - const bool HasScrollBar = ContentOverflows || ForceShowScrollbar; - CUIRect ScrollBarBg; - pClipRect->VSplitRight(m_Params.m_ScrollbarWidth, HasScrollBar ? pClipRect : nullptr, &ScrollBarBg); - if(m_Params.m_ScrollbarNoMarginRight) - { - ScrollBarBg.HMargin(m_Params.m_ScrollbarMargin, &m_RailRect); - m_RailRect.VSplitLeft(m_Params.m_ScrollbarMargin, nullptr, &m_RailRect); - } - else - ScrollBarBg.Margin(m_Params.m_ScrollbarMargin, &m_RailRect); - - // only show scrollbar if required - if(HasScrollBar) - { - if(m_Params.m_ScrollbarBgColor.a > 0.0f) - ScrollBarBg.Draw(m_Params.m_ScrollbarBgColor, IGraphics::CORNER_R, 4.0f); - if(m_Params.m_RailBgColor.a > 0.0f) - m_RailRect.Draw(m_Params.m_RailBgColor, IGraphics::CORNER_ALL, m_RailRect.w / 2.0f); - } - if(!ContentOverflows) - m_ContentScrollOff.y = 0.0f; - - if(m_Params.m_ClipBgColor.a > 0.0f) - pClipRect->Draw(m_Params.m_ClipBgColor, HasScrollBar ? IGraphics::CORNER_L : IGraphics::CORNER_ALL, 4.0f); - - Ui()->ClipEnable(pClipRect); - - m_ClipRect = *pClipRect; - m_ContentH = 0.0f; - *pOutOffset = m_ContentScrollOff; -} - -void CScrollRegion::End() -{ - Ui()->ClipDisable(); - - // only show scrollbar if content overflows - if(m_ContentH <= m_ClipRect.h) - return; - - // scroll wheel - CUIRect RegionRect = m_ClipRect; - RegionRect.w += m_Params.m_ScrollbarWidth; - - if(m_ScrollDirection != SCROLLRELATIVE_NONE || Ui()->HotScrollRegion() == this) - { - bool ProgrammaticScroll = false; - if(Ui()->ConsumeHotkey(CUi::HOTKEY_SCROLL_UP)) - m_ScrollDirection = SCROLLRELATIVE_UP; - else if(Ui()->ConsumeHotkey(CUi::HOTKEY_SCROLL_DOWN)) - m_ScrollDirection = SCROLLRELATIVE_DOWN; - else - ProgrammaticScroll = true; - - if(!ProgrammaticScroll) - m_ScrollSpeedMultiplier = 1.0f; - - if(m_ScrollDirection != SCROLLRELATIVE_NONE) - { - const bool IsPageScroll = Input()->AltIsPressed(); - const float ScrollUnit = IsPageScroll && !ProgrammaticScroll ? m_ClipRect.h : m_Params.m_ScrollUnit; - - m_AnimTimeMax = g_Config.m_UiSmoothScrollTime / 1000.0f; - m_AnimTime = m_AnimTimeMax; - m_AnimInitScrollY = m_ScrollY; - m_AnimTargetScrollY = (ProgrammaticScroll ? m_ScrollY : m_AnimTargetScrollY) + (int)m_ScrollDirection * ScrollUnit * m_ScrollSpeedMultiplier; - m_ScrollDirection = SCROLLRELATIVE_NONE; - m_ScrollSpeedMultiplier = 1.0f; - } - } - - if(Ui()->Enabled() && Ui()->MouseHovered(&RegionRect)) - { - Ui()->SetHotScrollRegion(this); - } - - const float SliderHeight = maximum(m_Params.m_SliderMinHeight, m_ClipRect.h / m_ContentH * m_RailRect.h); - - CUIRect Slider = m_RailRect; - Slider.h = SliderHeight; - - const float MaxSlider = m_RailRect.h - SliderHeight; - const float MaxScroll = m_ContentH - m_ClipRect.h; - - if(m_RequestScrollY >= 0.0f) - { - m_AnimTargetScrollY = m_RequestScrollY; - m_AnimTime = 0.0f; - m_RequestScrollY = -1.0f; - } - - m_AnimTargetScrollY = clamp(m_AnimTargetScrollY, 0.0f, MaxScroll); - - if(absolute(m_AnimInitScrollY - m_AnimTargetScrollY) < 0.5f) - m_AnimTime = 0.0f; - - if(m_AnimTime > 0.0f) - { - m_AnimTime -= Client()->RenderFrameTime(); - float AnimProgress = (1.0f - std::pow(m_AnimTime / m_AnimTimeMax, 3.0f)); // cubic ease out - m_ScrollY = m_AnimInitScrollY + (m_AnimTargetScrollY - m_AnimInitScrollY) * AnimProgress; - } - else - { - m_ScrollY = m_AnimTargetScrollY; - } - - Slider.y += m_ScrollY / MaxScroll * MaxSlider; - - bool Grabbed = false; - const void *pId = &m_ScrollY; - const bool InsideSlider = Ui()->MouseHovered(&Slider); - const bool InsideRail = Ui()->MouseHovered(&m_RailRect); - - if(Ui()->CheckActiveItem(pId) && Ui()->MouseButton(0)) - { - float MouseY = Ui()->MouseY(); - m_ScrollY += (MouseY - (Slider.y + m_SliderGrabPos)) / MaxSlider * MaxScroll; - m_SliderGrabPos = clamp(m_SliderGrabPos, 0.0f, SliderHeight); - m_AnimTargetScrollY = m_ScrollY; - m_AnimTime = 0.0f; - Grabbed = true; - } - else if(InsideSlider) - { - if(!Ui()->MouseButton(0)) - Ui()->SetHotItem(pId); - - if(!Ui()->CheckActiveItem(pId) && Ui()->MouseButtonClicked(0)) - { - Ui()->SetActiveItem(pId); - m_SliderGrabPos = Ui()->MouseY() - Slider.y; - m_AnimTargetScrollY = m_ScrollY; - m_AnimTime = 0.0f; - } - } - else if(InsideRail && Ui()->MouseButtonClicked(0)) - { - m_ScrollY += (Ui()->MouseY() - (Slider.y + Slider.h / 2.0f)) / MaxSlider * MaxScroll; - Ui()->SetHotItem(pId); - Ui()->SetActiveItem(pId); - m_SliderGrabPos = Slider.h / 2.0f; - m_AnimTargetScrollY = m_ScrollY; - m_AnimTime = 0.0f; - } - - if(Ui()->CheckActiveItem(pId) && !Ui()->MouseButton(0)) - { - Ui()->SetActiveItem(nullptr); - } - - m_ScrollY = clamp(m_ScrollY, 0.0f, MaxScroll); - m_ContentScrollOff.y = -m_ScrollY; - - Slider.Draw(m_Params.SliderColor(Grabbed, Ui()->HotItem() == pId), IGraphics::CORNER_ALL, Slider.w / 2.0f); -} - -bool CScrollRegion::AddRect(const CUIRect &Rect, bool ShouldScrollHere) -{ - m_LastAddedRect = Rect; - // Round up and add magic to fix pixel clipping at the end of the scrolling area - m_ContentH = maximum(std::ceil(Rect.y + Rect.h - (m_ClipRect.y + m_ContentScrollOff.y)) + HEIGHT_MAGIC_FIX, m_ContentH); - if(ShouldScrollHere) - ScrollHere(); - return !RectClipped(Rect); -} - -void CScrollRegion::ScrollHere(EScrollOption Option) -{ - const float MinHeight = minimum(m_ClipRect.h, m_LastAddedRect.h); - const float TopScroll = m_LastAddedRect.y - (m_ClipRect.y + m_ContentScrollOff.y); - - switch(Option) - { - case SCROLLHERE_TOP: - m_RequestScrollY = TopScroll; - break; - - case SCROLLHERE_BOTTOM: - m_RequestScrollY = TopScroll - (m_ClipRect.h - MinHeight); - break; - - case SCROLLHERE_KEEP_IN_VIEW: - default: - const float DeltaY = m_LastAddedRect.y - m_ClipRect.y; - if(DeltaY < 0) - m_RequestScrollY = TopScroll; - else if(DeltaY > (m_ClipRect.h - MinHeight)) - m_RequestScrollY = TopScroll - (m_ClipRect.h - MinHeight); - break; - } -} - -void CScrollRegion::ScrollRelative(EScrollRelative Direction, float SpeedMultiplier) -{ - m_ScrollDirection = Direction; - m_ScrollSpeedMultiplier = SpeedMultiplier; -} - -void CScrollRegion::ScrollRelativeDirect(float ScrollAmount) -{ - m_RequestScrollY = clamp(m_ScrollY + ScrollAmount, 0.0f, m_ContentH - m_ClipRect.h); -} - -void CScrollRegion::DoEdgeScrolling() -{ - if(!ScrollbarShown()) - return; - - const float ScrollBorderSize = 20.0f; - const float MaxScrollMultiplier = 2.0f; - const float ScrollSpeedFactor = MaxScrollMultiplier / ScrollBorderSize; - const float TopScrollPosition = m_ClipRect.y + ScrollBorderSize; - const float BottomScrollPosition = m_ClipRect.y + m_ClipRect.h - ScrollBorderSize; - if(Ui()->MouseY() < TopScrollPosition) - ScrollRelative(SCROLLRELATIVE_UP, minimum(MaxScrollMultiplier, (TopScrollPosition - Ui()->MouseY()) * ScrollSpeedFactor)); - else if(Ui()->MouseY() > BottomScrollPosition) - ScrollRelative(SCROLLRELATIVE_DOWN, minimum(MaxScrollMultiplier, (Ui()->MouseY() - BottomScrollPosition) * ScrollSpeedFactor)); -} - -bool CScrollRegion::RectClipped(const CUIRect &Rect) const -{ - return (m_ClipRect.x > (Rect.x + Rect.w) || (m_ClipRect.x + m_ClipRect.w) < Rect.x || m_ClipRect.y > (Rect.y + Rect.h) || (m_ClipRect.y + m_ClipRect.h) < Rect.y); -} - -bool CScrollRegion::ScrollbarShown() const -{ - return m_ContentH > m_ClipRect.h; -} - -bool CScrollRegion::Animating() const -{ - return m_AnimTime > 0.0f; -} - -bool CScrollRegion::Active() const -{ - return Ui()->ActiveItem() == &m_ScrollY; -} diff --git a/src/game/client/ui_scrollregion.h b/src/game/client/ui_scrollregion.h deleted file mode 100644 index 0094b66e27..0000000000 --- a/src/game/client/ui_scrollregion.h +++ /dev/null @@ -1,146 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_CLIENT_UI_SCROLLREGION_H -#define GAME_CLIENT_UI_SCROLLREGION_H - -#include "ui.h" - -struct CScrollRegionParams -{ - float m_ScrollbarWidth; - float m_ScrollbarMargin; - bool m_ScrollbarNoMarginRight; - float m_SliderMinHeight; - float m_ScrollUnit; - ColorRGBA m_ClipBgColor; - ColorRGBA m_ScrollbarBgColor; - ColorRGBA m_RailBgColor; - ColorRGBA m_SliderColor; - ColorRGBA m_SliderColorHover; - ColorRGBA m_SliderColorGrabbed; - unsigned m_Flags; - - enum - { - FLAG_CONTENT_STATIC_WIDTH = 1 << 0, - }; - - CScrollRegionParams() - { - m_ScrollbarWidth = 20.0f; - m_ScrollbarMargin = 5.0f; - m_ScrollbarNoMarginRight = false; - m_SliderMinHeight = 25.0f; - m_ScrollUnit = 10.0f; - m_ClipBgColor = ColorRGBA(0.0f, 0.0f, 0.0f, 0.0f); - m_ScrollbarBgColor = ColorRGBA(0.0f, 0.0f, 0.0f, 0.0f); - m_RailBgColor = ColorRGBA(1.0f, 1.0f, 1.0f, 0.25f); - m_SliderColor = ColorRGBA(0.8f, 0.8f, 0.8f, 1.0f); - m_SliderColorHover = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - m_SliderColorGrabbed = ColorRGBA(0.9f, 0.9f, 0.9f, 1.0f); - m_Flags = 0; - } - - ColorRGBA SliderColor(bool Active, bool Hovered) const - { - if(Active) - return m_SliderColorGrabbed; - else if(Hovered) - return m_SliderColorHover; - return m_SliderColor; - } -}; - -/* -Usage: - -- Initialization -- - static CScrollRegion s_ScrollRegion; - vec2 ScrollOffset(0, 0); - s_ScrollRegion.Begin(&ScrollRegionRect, &ScrollOffset); - Content = ScrollRegionRect; - Content.y += ScrollOffset.y; - - -- "Register" your content rects -- - CUIRect Rect; - Content.HSplitTop(SomeValue, &Rect, &Content); - s_ScrollRegion.AddRect(Rect); - - -- [Optional] Knowing if a rect is clipped -- - s_ScrollRegion.RectClipped(Rect); - - -- [Optional] Scroll to a rect (to the last added rect)-- - ... - s_ScrollRegion.AddRect(Rect); - s_ScrollRegion.ScrollHere(Option); - - -- [Convenience] Add rect and check for visibility at the same time - if(s_ScrollRegion.AddRect(Rect)) - // The rect is visible (not clipped) - - -- [Convenience] Add rect and scroll to it if it's selected - if(s_ScrollRegion.AddRect(Rect, ScrollToSelection && IsSelected)) - // The rect is visible (not clipped) - - -- End -- - s_ScrollRegion.End(); -*/ - -// Instances of CScrollRegion must be static, as member addresses are used as UI item IDs -class CScrollRegion : private CUIElementBase -{ -public: - // TODO: Properly fix whatever is causing the 1-pixel discrepancy in scrolling rect height and remove this magic value. - // Currently this must be added when calculating the required height of a UI rect for a scroll region to get a perfect fit. - static constexpr float HEIGHT_MAGIC_FIX = 1.0f; - - enum EScrollRelative - { - SCROLLRELATIVE_UP = -1, - SCROLLRELATIVE_NONE = 0, - SCROLLRELATIVE_DOWN = 1, - }; - -private: - float m_ScrollY; - float m_ContentH; - float m_RequestScrollY; // [0, ContentHeight] - EScrollRelative m_ScrollDirection; - float m_ScrollSpeedMultiplier; - - float m_AnimTimeMax; - float m_AnimTime; - float m_AnimInitScrollY; - float m_AnimTargetScrollY; - - CUIRect m_ClipRect; - CUIRect m_RailRect; - CUIRect m_LastAddedRect; // saved for ScrollHere() - float m_SliderGrabPos; // where did user grab the slider - vec2 m_ContentScrollOff; - CScrollRegionParams m_Params; - -public: - enum EScrollOption - { - SCROLLHERE_KEEP_IN_VIEW = 0, - SCROLLHERE_TOP, - SCROLLHERE_BOTTOM, - }; - - CScrollRegion(); - void Begin(CUIRect *pClipRect, vec2 *pOutOffset, const CScrollRegionParams *pParams = nullptr); - void End(); - bool AddRect(const CUIRect &Rect, bool ShouldScrollHere = false); // returns true if the added rect is visible (not clipped) - void ScrollHere(EScrollOption Option = SCROLLHERE_KEEP_IN_VIEW); - void ScrollRelative(EScrollRelative Direction, float SpeedMultiplier = 1.0f); - void ScrollRelativeDirect(float ScrollAmount); - const CUIRect *ClipRect() const { return &m_ClipRect; } - void DoEdgeScrolling(); - bool RectClipped(const CUIRect &Rect) const; - bool ScrollbarShown() const; - bool Animating() const; - bool Active() const; - const CScrollRegionParams &Params() const { return m_Params; } -}; - -#endif diff --git a/src/game/editor/auto_map.cpp b/src/game/editor/auto_map.cpp deleted file mode 100644 index 4edb402384..0000000000 --- a/src/game/editor/auto_map.cpp +++ /dev/null @@ -1,570 +0,0 @@ -#include -#include // sscanf - -#include -#include -#include - -#include -#include - -#include "auto_map.h" -#include "editor_actions.h" - -// Based on triple32inc from https://github.com/skeeto/hash-prospector/tree/79a6074062a84907df6e45b756134b74e2956760 -static uint32_t HashUInt32(uint32_t Num) -{ - Num++; - Num ^= Num >> 17; - Num *= 0xed5ad4bbu; - Num ^= Num >> 11; - Num *= 0xac4c1b51u; - Num ^= Num >> 15; - Num *= 0x31848babu; - Num ^= Num >> 14; - return Num; -} - -#define HASH_MAX 65536 - -static int HashLocation(uint32_t Seed, uint32_t Run, uint32_t Rule, uint32_t X, uint32_t Y) -{ - const uint32_t Prime = 31; - uint32_t Hash = 1; - Hash = Hash * Prime + HashUInt32(Seed); - Hash = Hash * Prime + HashUInt32(Run); - Hash = Hash * Prime + HashUInt32(Rule); - Hash = Hash * Prime + HashUInt32(X); - Hash = Hash * Prime + HashUInt32(Y); - Hash = HashUInt32(Hash * Prime); // Just to double-check that values are well-distributed - return Hash % HASH_MAX; -} - -CAutoMapper::CAutoMapper(CEditor *pEditor) -{ - OnInit(pEditor); -} - -void CAutoMapper::Load(const char *pTileName) -{ - char aPath[IO_MAX_PATH_LENGTH]; - str_format(aPath, sizeof(aPath), "editor/automap/%s.rules", pTileName); - CLineReader LineReader; - if(!LineReader.OpenFile(Storage()->OpenFile(aPath, IOFLAG_READ, IStorage::TYPE_ALL))) - { - char aBuf[IO_MAX_PATH_LENGTH + 32]; - str_format(aBuf, sizeof(aBuf), "failed to load %s", aPath); - Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "editor/automap", aBuf); - return; - } - - CConfiguration *pCurrentConf = nullptr; - CRun *pCurrentRun = nullptr; - CIndexRule *pCurrentIndex = nullptr; - - // read each line - while(const char *pLine = LineReader.Get()) - { - // skip blank/empty lines as well as comments - if(str_length(pLine) > 0 && pLine[0] != '#' && pLine[0] != '\n' && pLine[0] != '\r' && pLine[0] != '\t' && pLine[0] != '\v' && pLine[0] != ' ') - { - if(pLine[0] == '[') - { - // new configuration, get the name - pLine++; - CConfiguration NewConf; - NewConf.m_aName[0] = '\0'; - NewConf.m_StartX = 0; - NewConf.m_StartY = 0; - NewConf.m_EndX = 0; - NewConf.m_EndY = 0; - m_vConfigs.push_back(NewConf); - int ConfigurationId = m_vConfigs.size() - 1; - pCurrentConf = &m_vConfigs[ConfigurationId]; - str_copy(pCurrentConf->m_aName, pLine, minimum(sizeof(pCurrentConf->m_aName), str_length(pLine))); - - // add start run - CRun NewRun; - NewRun.m_AutomapCopy = true; - pCurrentConf->m_vRuns.push_back(NewRun); - int RunId = pCurrentConf->m_vRuns.size() - 1; - pCurrentRun = &pCurrentConf->m_vRuns[RunId]; - } - else if(str_startswith(pLine, "NewRun") && pCurrentConf) - { - // add new run - CRun NewRun; - NewRun.m_AutomapCopy = true; - pCurrentConf->m_vRuns.push_back(NewRun); - int RunId = pCurrentConf->m_vRuns.size() - 1; - pCurrentRun = &pCurrentConf->m_vRuns[RunId]; - } - else if(str_startswith(pLine, "Index") && pCurrentRun) - { - // new index - int Id = 0; - char aOrientation1[128] = ""; - char aOrientation2[128] = ""; - char aOrientation3[128] = ""; - - sscanf(pLine, "Index %d %127s %127s %127s", &Id, aOrientation1, aOrientation2, aOrientation3); - - CIndexRule NewIndexRule; - NewIndexRule.m_Id = Id; - NewIndexRule.m_Flag = 0; - NewIndexRule.m_RandomProbability = 1.0f; - NewIndexRule.m_DefaultRule = true; - NewIndexRule.m_SkipEmpty = false; - NewIndexRule.m_SkipFull = false; - - if(str_length(aOrientation1) > 0) - { - if(!str_comp(aOrientation1, "XFLIP")) - NewIndexRule.m_Flag |= TILEFLAG_XFLIP; - else if(!str_comp(aOrientation1, "YFLIP")) - NewIndexRule.m_Flag |= TILEFLAG_YFLIP; - else if(!str_comp(aOrientation1, "ROTATE")) - NewIndexRule.m_Flag |= TILEFLAG_ROTATE; - } - - if(str_length(aOrientation2) > 0) - { - if(!str_comp(aOrientation2, "XFLIP")) - NewIndexRule.m_Flag |= TILEFLAG_XFLIP; - else if(!str_comp(aOrientation2, "YFLIP")) - NewIndexRule.m_Flag |= TILEFLAG_YFLIP; - else if(!str_comp(aOrientation2, "ROTATE")) - NewIndexRule.m_Flag |= TILEFLAG_ROTATE; - } - - if(str_length(aOrientation3) > 0) - { - if(!str_comp(aOrientation3, "XFLIP")) - NewIndexRule.m_Flag |= TILEFLAG_XFLIP; - else if(!str_comp(aOrientation3, "YFLIP")) - NewIndexRule.m_Flag |= TILEFLAG_YFLIP; - else if(!str_comp(aOrientation3, "ROTATE")) - NewIndexRule.m_Flag |= TILEFLAG_ROTATE; - } - - // add the index rule object and make it current - pCurrentRun->m_vIndexRules.push_back(NewIndexRule); - int IndexRuleId = pCurrentRun->m_vIndexRules.size() - 1; - pCurrentIndex = &pCurrentRun->m_vIndexRules[IndexRuleId]; - } - else if(str_startswith(pLine, "Pos") && pCurrentIndex) - { - int x = 0, y = 0; - char aValue[128]; - int Value = CPosRule::NORULE; - std::vector vNewIndexList; - - sscanf(pLine, "Pos %d %d %127s", &x, &y, aValue); - - if(!str_comp(aValue, "EMPTY")) - { - Value = CPosRule::INDEX; - CIndexInfo NewIndexInfo = {0, 0, false}; - vNewIndexList.push_back(NewIndexInfo); - } - else if(!str_comp(aValue, "FULL")) - { - Value = CPosRule::NOTINDEX; - CIndexInfo NewIndexInfo1 = {0, 0, false}; - // CIndexInfo NewIndexInfo2 = {-1, 0}; - vNewIndexList.push_back(NewIndexInfo1); - // vNewIndexList.push_back(NewIndexInfo2); - } - else if(!str_comp(aValue, "INDEX") || !str_comp(aValue, "NOTINDEX")) - { - if(!str_comp(aValue, "INDEX")) - Value = CPosRule::INDEX; - else - Value = CPosRule::NOTINDEX; - - int pWord = 4; - while(true) - { - int Id = 0; - char aOrientation1[128] = ""; - char aOrientation2[128] = ""; - char aOrientation3[128] = ""; - char aOrientation4[128] = ""; - sscanf(str_trim_words(pLine, pWord), "%d %127s %127s %127s %127s", &Id, aOrientation1, aOrientation2, aOrientation3, aOrientation4); - - CIndexInfo NewIndexInfo; - NewIndexInfo.m_Id = Id; - NewIndexInfo.m_Flag = 0; - NewIndexInfo.m_TestFlag = false; - - if(!str_comp(aOrientation1, "OR")) - { - vNewIndexList.push_back(NewIndexInfo); - pWord += 2; - continue; - } - else if(str_length(aOrientation1) > 0) - { - NewIndexInfo.m_TestFlag = true; - if(!str_comp(aOrientation1, "XFLIP")) - NewIndexInfo.m_Flag = TILEFLAG_XFLIP; - else if(!str_comp(aOrientation1, "YFLIP")) - NewIndexInfo.m_Flag = TILEFLAG_YFLIP; - else if(!str_comp(aOrientation1, "ROTATE")) - NewIndexInfo.m_Flag = TILEFLAG_ROTATE; - else if(!str_comp(aOrientation1, "NONE")) - NewIndexInfo.m_Flag = 0; - else - NewIndexInfo.m_TestFlag = false; - } - else - { - vNewIndexList.push_back(NewIndexInfo); - break; - } - - if(!str_comp(aOrientation2, "OR")) - { - vNewIndexList.push_back(NewIndexInfo); - pWord += 3; - continue; - } - else if(str_length(aOrientation2) > 0 && NewIndexInfo.m_Flag != 0) - { - if(!str_comp(aOrientation2, "XFLIP")) - NewIndexInfo.m_Flag |= TILEFLAG_XFLIP; - else if(!str_comp(aOrientation2, "YFLIP")) - NewIndexInfo.m_Flag |= TILEFLAG_YFLIP; - else if(!str_comp(aOrientation2, "ROTATE")) - NewIndexInfo.m_Flag |= TILEFLAG_ROTATE; - } - else - { - vNewIndexList.push_back(NewIndexInfo); - break; - } - - if(!str_comp(aOrientation3, "OR")) - { - vNewIndexList.push_back(NewIndexInfo); - pWord += 4; - continue; - } - else if(str_length(aOrientation3) > 0 && NewIndexInfo.m_Flag != 0) - { - if(!str_comp(aOrientation3, "XFLIP")) - NewIndexInfo.m_Flag |= TILEFLAG_XFLIP; - else if(!str_comp(aOrientation3, "YFLIP")) - NewIndexInfo.m_Flag |= TILEFLAG_YFLIP; - else if(!str_comp(aOrientation3, "ROTATE")) - NewIndexInfo.m_Flag |= TILEFLAG_ROTATE; - } - else - { - vNewIndexList.push_back(NewIndexInfo); - break; - } - - if(!str_comp(aOrientation4, "OR")) - { - vNewIndexList.push_back(NewIndexInfo); - pWord += 5; - continue; - } - else - { - vNewIndexList.push_back(NewIndexInfo); - break; - } - } - } - - if(Value != CPosRule::NORULE) - { - CPosRule NewPosRule = {x, y, Value, vNewIndexList}; - pCurrentIndex->m_vRules.push_back(NewPosRule); - - pCurrentConf->m_StartX = minimum(pCurrentConf->m_StartX, NewPosRule.m_X); - pCurrentConf->m_StartY = minimum(pCurrentConf->m_StartY, NewPosRule.m_Y); - pCurrentConf->m_EndX = maximum(pCurrentConf->m_EndX, NewPosRule.m_X); - pCurrentConf->m_EndY = maximum(pCurrentConf->m_EndY, NewPosRule.m_Y); - - if(x == 0 && y == 0) - { - for(const auto &Index : vNewIndexList) - { - if(Index.m_Id == 0 && Value == CPosRule::INDEX) - { - // Skip full tiles if we have a rule "POS 0 0 INDEX 0" - // because that forces the tile to be empty - pCurrentIndex->m_SkipFull = true; - } - else if((Index.m_Id > 0 && Value == CPosRule::INDEX) || (Index.m_Id == 0 && Value == CPosRule::NOTINDEX)) - { - // Skip empty tiles if we have a rule "POS 0 0 INDEX i" where i > 0 - // or if we have a rule "POS 0 0 NOTINDEX 0" - pCurrentIndex->m_SkipEmpty = true; - } - } - } - } - } - else if(str_startswith(pLine, "Random") && pCurrentIndex) - { - float Value; - char Specifier = ' '; - sscanf(pLine, "Random %f%c", &Value, &Specifier); - if(Specifier == '%') - { - pCurrentIndex->m_RandomProbability = Value / 100.0f; - } - else - { - pCurrentIndex->m_RandomProbability = 1.0f / Value; - } - } - else if(str_startswith(pLine, "NoDefaultRule") && pCurrentIndex) - { - pCurrentIndex->m_DefaultRule = false; - } - else if(str_startswith(pLine, "NoLayerCopy") && pCurrentRun) - { - pCurrentRun->m_AutomapCopy = false; - } - } - } - - // add default rule for Pos 0 0 if there is none - for(auto &Config : m_vConfigs) - { - for(auto &Run : Config.m_vRuns) - { - for(auto &IndexRule : Run.m_vIndexRules) - { - bool Found = false; - - // Search for the exact rule "POS 0 0 INDEX 0" which corresponds to the default rule - for(const auto &Rule : IndexRule.m_vRules) - { - if(Rule.m_X == 0 && Rule.m_Y == 0 && Rule.m_Value == CPosRule::INDEX) - { - for(const auto &Index : Rule.m_vIndexList) - { - if(Index.m_Id == 0) - Found = true; - } - break; - } - - if(Found) - break; - } - - // If the default rule was not found, and we require it, then add it - if(!Found && IndexRule.m_DefaultRule) - { - std::vector vNewIndexList; - CIndexInfo NewIndexInfo = {0, 0, false}; - vNewIndexList.push_back(NewIndexInfo); - CPosRule NewPosRule = {0, 0, CPosRule::NOTINDEX, vNewIndexList}; - IndexRule.m_vRules.push_back(NewPosRule); - - IndexRule.m_SkipEmpty = true; - IndexRule.m_SkipFull = false; - } - - if(IndexRule.m_SkipEmpty && IndexRule.m_SkipFull) - { - IndexRule.m_SkipEmpty = false; - IndexRule.m_SkipFull = false; - } - } - } - } - - char aBuf[IO_MAX_PATH_LENGTH + 16]; - str_format(aBuf, sizeof(aBuf), "loaded %s", aPath); - Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "editor/automap", aBuf); - - m_FileLoaded = true; -} - -const char *CAutoMapper::GetConfigName(int Index) -{ - if(Index < 0 || Index >= (int)m_vConfigs.size()) - return ""; - - return m_vConfigs[Index].m_aName; -} - -void CAutoMapper::ProceedLocalized(CLayerTiles *pLayer, int ConfigId, int Seed, int X, int Y, int Width, int Height) -{ - if(!m_FileLoaded || pLayer->m_Readonly || ConfigId < 0 || ConfigId >= (int)m_vConfigs.size()) - return; - - if(Width < 0) - Width = pLayer->m_Width; - - if(Height < 0) - Height = pLayer->m_Height; - - CConfiguration *pConf = &m_vConfigs[ConfigId]; - - int CommitFromX = clamp(X + pConf->m_StartX, 0, pLayer->m_Width); - int CommitFromY = clamp(Y + pConf->m_StartY, 0, pLayer->m_Height); - int CommitToX = clamp(X + Width + pConf->m_EndX, 0, pLayer->m_Width); - int CommitToY = clamp(Y + Height + pConf->m_EndY, 0, pLayer->m_Height); - - int UpdateFromX = clamp(X + 3 * pConf->m_StartX, 0, pLayer->m_Width); - int UpdateFromY = clamp(Y + 3 * pConf->m_StartY, 0, pLayer->m_Height); - int UpdateToX = clamp(X + Width + 3 * pConf->m_EndX, 0, pLayer->m_Width); - int UpdateToY = clamp(Y + Height + 3 * pConf->m_EndY, 0, pLayer->m_Height); - - CLayerTiles *pUpdateLayer = new CLayerTiles(Editor(), UpdateToX - UpdateFromX, UpdateToY - UpdateFromY); - - for(int y = UpdateFromY; y < UpdateToY; y++) - { - for(int x = UpdateFromX; x < UpdateToX; x++) - { - CTile *pIn = &pLayer->m_pTiles[y * pLayer->m_Width + x]; - CTile *pOut = &pUpdateLayer->m_pTiles[(y - UpdateFromY) * pUpdateLayer->m_Width + x - UpdateFromX]; - pOut->m_Index = pIn->m_Index; - pOut->m_Flags = pIn->m_Flags; - } - } - - Proceed(pUpdateLayer, ConfigId, Seed, UpdateFromX, UpdateFromY); - - for(int y = CommitFromY; y < CommitToY; y++) - { - for(int x = CommitFromX; x < CommitToX; x++) - { - CTile *pIn = &pUpdateLayer->m_pTiles[(y - UpdateFromY) * pUpdateLayer->m_Width + x - UpdateFromX]; - CTile *pOut = &pLayer->m_pTiles[y * pLayer->m_Width + x]; - CTile Previous = *pOut; - pOut->m_Index = pIn->m_Index; - pOut->m_Flags = pIn->m_Flags; - pLayer->RecordStateChange(x, y, Previous, *pOut); - } - } - - delete pUpdateLayer; -} - -void CAutoMapper::Proceed(CLayerTiles *pLayer, int ConfigId, int Seed, int SeedOffsetX, int SeedOffsetY) -{ - if(!m_FileLoaded || pLayer->m_Readonly || ConfigId < 0 || ConfigId >= (int)m_vConfigs.size()) - return; - - if(Seed == 0) - Seed = rand(); - - CConfiguration *pConf = &m_vConfigs[ConfigId]; - pLayer->ClearHistory(); - - // for every run: copy tiles, automap, overwrite tiles - for(size_t h = 0; h < pConf->m_vRuns.size(); ++h) - { - CRun *pRun = &pConf->m_vRuns[h]; - - // don't make copy if it's requested - CLayerTiles *pReadLayer; - if(pRun->m_AutomapCopy) - { - pReadLayer = new CLayerTiles(Editor(), pLayer->m_Width, pLayer->m_Height); - - for(int y = 0; y < pLayer->m_Height; y++) - { - for(int x = 0; x < pLayer->m_Width; x++) - { - CTile *pIn = &pLayer->m_pTiles[y * pLayer->m_Width + x]; - CTile *pOut = &pReadLayer->m_pTiles[y * pLayer->m_Width + x]; - pOut->m_Index = pIn->m_Index; - pOut->m_Flags = pIn->m_Flags; - } - } - } - else - { - pReadLayer = pLayer; - } - - // auto map - for(int y = 0; y < pLayer->m_Height; y++) - { - for(int x = 0; x < pLayer->m_Width; x++) - { - CTile *pTile = &(pLayer->m_pTiles[y * pLayer->m_Width + x]); - const CTile *pReadTile = &(pReadLayer->m_pTiles[y * pLayer->m_Width + x]); - Editor()->m_Map.OnModify(); - - for(size_t i = 0; i < pRun->m_vIndexRules.size(); ++i) - { - CIndexRule *pIndexRule = &pRun->m_vIndexRules[i]; - if(pIndexRule->m_SkipEmpty && pReadTile->m_Index == 0) // skip empty tiles - continue; - if(pIndexRule->m_SkipFull && pReadTile->m_Index != 0) // skip full tiles - continue; - - bool RespectRules = true; - for(size_t j = 0; j < pIndexRule->m_vRules.size() && RespectRules; ++j) - { - CPosRule *pRule = &pIndexRule->m_vRules[j]; - - int CheckIndex, CheckFlags; - int CheckX = x + pRule->m_X; - int CheckY = y + pRule->m_Y; - if(CheckX >= 0 && CheckX < pLayer->m_Width && CheckY >= 0 && CheckY < pLayer->m_Height) - { - int CheckTile = CheckY * pLayer->m_Width + CheckX; - CheckIndex = pReadLayer->m_pTiles[CheckTile].m_Index; - CheckFlags = pReadLayer->m_pTiles[CheckTile].m_Flags & (TILEFLAG_ROTATE | TILEFLAG_XFLIP | TILEFLAG_YFLIP); - } - else - { - CheckIndex = -1; - CheckFlags = 0; - } - - if(pRule->m_Value == CPosRule::INDEX) - { - RespectRules = false; - for(const auto &Index : pRule->m_vIndexList) - { - if(CheckIndex == Index.m_Id && (!Index.m_TestFlag || CheckFlags == Index.m_Flag)) - { - RespectRules = true; - break; - } - } - } - else if(pRule->m_Value == CPosRule::NOTINDEX) - { - for(const auto &Index : pRule->m_vIndexList) - { - if(CheckIndex == Index.m_Id && (!Index.m_TestFlag || CheckFlags == Index.m_Flag)) - { - RespectRules = false; - break; - } - } - } - } - - if(RespectRules && - (pIndexRule->m_RandomProbability >= 1.0f || HashLocation(Seed, h, i, x + SeedOffsetX, y + SeedOffsetY) < HASH_MAX * pIndexRule->m_RandomProbability)) - { - CTile Previous = *pTile; - pTile->m_Index = pIndexRule->m_Id; - pTile->m_Flags = pIndexRule->m_Flag; - pLayer->RecordStateChange(x, y, Previous, *pTile); - } - } - } - } - - // clean-up - if(pRun->m_AutomapCopy && pReadLayer != pLayer) - delete pReadLayer; - } -} diff --git a/src/game/editor/auto_map.h b/src/game/editor/auto_map.h deleted file mode 100644 index 02ddd9b892..0000000000 --- a/src/game/editor/auto_map.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef GAME_EDITOR_AUTO_MAP_H -#define GAME_EDITOR_AUTO_MAP_H - -#include - -#include "component.h" - -class CAutoMapper : public CEditorComponent -{ - struct CIndexInfo - { - int m_Id; - int m_Flag; - bool m_TestFlag; - }; - - struct CPosRule - { - int m_X; - int m_Y; - int m_Value; - std::vector m_vIndexList; - - enum - { - NORULE = 0, - INDEX, - NOTINDEX - }; - }; - - struct CIndexRule - { - int m_Id; - std::vector m_vRules; - int m_Flag; - float m_RandomProbability; - bool m_DefaultRule; - bool m_SkipEmpty; - bool m_SkipFull; - }; - - struct CRun - { - std::vector m_vIndexRules; - bool m_AutomapCopy; - }; - - struct CConfiguration - { - std::vector m_vRuns; - char m_aName[128]; - int m_StartX; - int m_StartY; - int m_EndX; - int m_EndY; - }; - -public: - explicit CAutoMapper(CEditor *pEditor); - - void Load(const char *pTileName); - void ProceedLocalized(class CLayerTiles *pLayer, int ConfigId, int Seed = 0, int X = 0, int Y = 0, int Width = -1, int Height = -1); - void Proceed(class CLayerTiles *pLayer, int ConfigId, int Seed = 0, int SeedOffsetX = 0, int SeedOffsetY = 0); - - int ConfigNamesNum() const { return m_vConfigs.size(); } - const char *GetConfigName(int Index); - - bool IsLoaded() const { return m_FileLoaded; } - -private: - std::vector m_vConfigs = {}; - bool m_FileLoaded = false; -}; - -#endif diff --git a/src/game/editor/component.cpp b/src/game/editor/component.cpp deleted file mode 100644 index f008ab4e45..0000000000 --- a/src/game/editor/component.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include "component.h" - -bool CEditorComponent::OnInput(const IInput::CEvent &Event) -{ - for(CEditorComponent &Component : m_vSubComponents) - { - if(Component.OnInput(Event)) - return true; - } - return false; -} - -void CEditorComponent::InitSubComponents() -{ - for(CEditorComponent &Component : m_vSubComponents) - { - Component.OnInit(Editor()); - } -} - -void CEditorComponent::RegisterSubComponent(CEditorComponent &Component) -{ - m_vSubComponents.emplace_back(Component); -} diff --git a/src/game/editor/component.h b/src/game/editor/component.h deleted file mode 100644 index c5bb24697a..0000000000 --- a/src/game/editor/component.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef GAME_EDITOR_COMPONENT_H -#define GAME_EDITOR_COMPONENT_H - -#include "editor_object.h" - -#include - -class CEditorComponent : public CEditorObject -{ -public: - /** - * Gets called before `OnRender`. Should return true - * if the event was consumed. By default the events - * are forwarded to the subcomponents. - */ - virtual bool OnInput(const IInput::CEvent &Event) override; - - /** - * Initialise all registered subcomponents. - * Needs to be called after the interfaces have been initialised. - */ - void InitSubComponents(); - - // Register a new subcomponent. - void RegisterSubComponent(CEditorComponent &Component); - -private: - std::vector> m_vSubComponents = {}; -}; - -#endif diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp deleted file mode 100644 index d2a740ad81..0000000000 --- a/src/game/editor/editor.cpp +++ /dev/null @@ -1,9224 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include - -#include -#include - -#if defined(CONF_FAMILY_UNIX) -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "auto_map.h" -#include "editor.h" -#include "editor_actions.h" - -#include -#include -#include -#include - -using namespace FontIcons; - -static const char *VANILLA_IMAGES[] = { - "bg_cloud1", - "bg_cloud2", - "bg_cloud3", - "desert_doodads", - "desert_main", - "desert_mountains", - "desert_mountains2", - "desert_sun", - "generic_deathtiles", - "generic_unhookable", - "grass_doodads", - "grass_main", - "jungle_background", - "jungle_deathtiles", - "jungle_doodads", - "jungle_main", - "jungle_midground", - "jungle_unhookables", - "moon", - "mountains", - "snow", - "stars", - "sun", - "winter_doodads", - "winter_main", - "winter_mountains", - "winter_mountains2", - "winter_mountains3"}; - -bool CEditor::IsVanillaImage(const char *pImage) -{ - return std::any_of(std::begin(VANILLA_IMAGES), std::end(VANILLA_IMAGES), [pImage](const char *pVanillaImage) { return str_comp(pImage, pVanillaImage) == 0; }); -} - -static const char *FILETYPE_EXTENSIONS[CEditor::NUM_FILETYPES] = { - ".map", - ".png", - ".opus"}; - -const void *CEditor::ms_pUiGotContext; - -enum -{ - BUTTON_CONTEXT = 1, -}; - -void CEditor::EnvelopeEval(int TimeOffsetMillis, int Env, ColorRGBA &Result, size_t Channels, void *pUser) -{ - CEditor *pThis = (CEditor *)pUser; - if(Env < 0 || Env >= (int)pThis->m_Map.m_vpEnvelopes.size()) - return; - - std::shared_ptr pEnv = pThis->m_Map.m_vpEnvelopes[Env]; - float Time = pThis->m_AnimateTime; - Time *= pThis->m_AnimateSpeed; - Time += (TimeOffsetMillis / 1000.0f); - pEnv->Eval(Time, Result, Channels); -} - -/******************************************************** - OTHER -*********************************************************/ - -bool CEditor::DoEditBox(CLineInput *pLineInput, const CUIRect *pRect, float FontSize, int Corners, const char *pToolTip, const std::vector &vColorSplits) -{ - UpdateTooltip(pLineInput, pRect, pToolTip); - return Ui()->DoEditBox(pLineInput, pRect, FontSize, Corners, vColorSplits); -} - -bool CEditor::DoClearableEditBox(CLineInput *pLineInput, const CUIRect *pRect, float FontSize, int Corners, const char *pToolTip, const std::vector &vColorSplits) -{ - UpdateTooltip(pLineInput, pRect, pToolTip); - return Ui()->DoClearableEditBox(pLineInput, pRect, FontSize, Corners, vColorSplits); -} - -ColorRGBA CEditor::GetButtonColor(const void *pId, int Checked) -{ - if(Checked < 0) - return ColorRGBA(0, 0, 0, 0.5f); - - switch(Checked) - { - case 8: // invisible - return ColorRGBA(0, 0, 0, 0); - case 7: // selected + game layers - if(Ui()->HotItem() == pId) - return ColorRGBA(1, 0, 0, 0.4f); - return ColorRGBA(1, 0, 0, 0.2f); - - case 6: // game layers - if(Ui()->HotItem() == pId) - return ColorRGBA(1, 1, 1, 0.4f); - return ColorRGBA(1, 1, 1, 0.2f); - - case 5: // selected + image/sound should be embedded - if(Ui()->HotItem() == pId) - return ColorRGBA(1, 0, 0, 0.75f); - return ColorRGBA(1, 0, 0, 0.5f); - - case 4: // image/sound should be embedded - if(Ui()->HotItem() == pId) - return ColorRGBA(1, 0, 0, 1.0f); - return ColorRGBA(1, 0, 0, 0.875f); - - case 3: // selected + unused image/sound - if(Ui()->HotItem() == pId) - return ColorRGBA(1, 0, 1, 0.75f); - return ColorRGBA(1, 0, 1, 0.5f); - - case 2: // unused image/sound - if(Ui()->HotItem() == pId) - return ColorRGBA(0, 0, 1, 0.75f); - return ColorRGBA(0, 0, 1, 0.5f); - - case 1: // selected - if(Ui()->HotItem() == pId) - return ColorRGBA(1, 0, 0, 0.75f); - return ColorRGBA(1, 0, 0, 0.5f); - - default: // regular - if(Ui()->HotItem() == pId) - return ColorRGBA(1, 1, 1, 0.75f); - return ColorRGBA(1, 1, 1, 0.5f); - } -} - -void CEditor::UpdateTooltip(const void *pId, const CUIRect *pRect, const char *pToolTip) -{ - if(Ui()->MouseInside(pRect) && !pToolTip) - str_copy(m_aTooltip, ""); - else if(Ui()->HotItem() == pId && pToolTip) - str_copy(m_aTooltip, pToolTip); -} - -int CEditor::DoButton_Editor_Common(const void *pId, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip) -{ - if(Ui()->MouseInside(pRect)) - { - if(Flags & BUTTON_CONTEXT) - ms_pUiGotContext = pId; - } - - UpdateTooltip(pId, pRect, pToolTip); - return Ui()->DoButtonLogic(pId, Checked, pRect); -} - -int CEditor::DoButton_Editor(const void *pId, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip) -{ - pRect->Draw(GetButtonColor(pId, Checked), IGraphics::CORNER_ALL, 3.0f); - CUIRect NewRect = *pRect; - Ui()->DoLabel(&NewRect, pText, 10.0f, TEXTALIGN_MC); - Checked %= 2; - return DoButton_Editor_Common(pId, pText, Checked, pRect, Flags, pToolTip); -} - -int CEditor::DoButton_Env(const void *pId, const char *pText, int Checked, const CUIRect *pRect, const char *pToolTip, ColorRGBA BaseColor, int Corners) -{ - float Bright = Checked ? 1.0f : 0.5f; - float Alpha = Ui()->HotItem() == pId ? 1.0f : 0.75f; - ColorRGBA Color = ColorRGBA(BaseColor.r * Bright, BaseColor.g * Bright, BaseColor.b * Bright, Alpha); - - pRect->Draw(Color, Corners, 3.0f); - Ui()->DoLabel(pRect, pText, 10.0f, TEXTALIGN_MC); - Checked %= 2; - return DoButton_Editor_Common(pId, pText, Checked, pRect, 0, pToolTip); -} - -int CEditor::DoButton_MenuItem(const void *pId, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip) -{ - if(Ui()->HotItem() == pId || Checked) - pRect->Draw(GetButtonColor(pId, Checked), IGraphics::CORNER_ALL, 3.0f); - - CUIRect Rect; - pRect->VMargin(5.0f, &Rect); - - SLabelProperties Props; - Props.m_MaxWidth = Rect.w; - Props.m_EllipsisAtEnd = true; - Ui()->DoLabel(&Rect, pText, 10.0f, TEXTALIGN_ML, Props); - - return DoButton_Editor_Common(pId, pText, Checked, pRect, Flags, pToolTip); -} - -int CEditor::DoButton_Ex(const void *pId, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip, int Corners, float FontSize, int Align) -{ - pRect->Draw(GetButtonColor(pId, Checked), Corners, 3.0f); - - CUIRect Rect; - pRect->VMargin(((Align & TEXTALIGN_MASK_HORIZONTAL) == TEXTALIGN_CENTER) ? 1.0f : 5.0f, &Rect); - - SLabelProperties Props; - Props.m_MaxWidth = Rect.w; - Props.m_EllipsisAtEnd = true; - Ui()->DoLabel(&Rect, pText, FontSize, Align, Props); - - return DoButton_Editor_Common(pId, pText, Checked, pRect, Flags, pToolTip); -} - -int CEditor::DoButton_FontIcon(const void *pId, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip, int Corners, float FontSize) -{ - pRect->Draw(GetButtonColor(pId, Checked), Corners, 3.0f); - - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING); - Ui()->DoLabel(pRect, pText, FontSize, TEXTALIGN_MC); - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - - return DoButton_Editor_Common(pId, pText, Checked, pRect, Flags, pToolTip); -} - -int CEditor::DoButton_DraggableEx(const void *pId, const char *pText, int Checked, const CUIRect *pRect, bool *pClicked, bool *pAbrupted, int Flags, const char *pToolTip, int Corners, float FontSize) -{ - pRect->Draw(GetButtonColor(pId, Checked), Corners, 3.0f); - - CUIRect Rect; - pRect->VMargin(pRect->w > 20.0f ? 5.0f : 0.0f, &Rect); - - SLabelProperties Props; - Props.m_MaxWidth = Rect.w; - Props.m_EllipsisAtEnd = true; - Ui()->DoLabel(&Rect, pText, FontSize, TEXTALIGN_MC, Props); - - if(Ui()->MouseInside(pRect)) - { - if(Flags & BUTTON_CONTEXT) - ms_pUiGotContext = pId; - } - - UpdateTooltip(pId, pRect, pToolTip); - return Ui()->DoDraggableButtonLogic(pId, Checked, pRect, pClicked, pAbrupted); -} - -void CEditor::RenderBackground(CUIRect View, IGraphics::CTextureHandle Texture, float Size, float Brightness) const -{ - Graphics()->TextureSet(Texture); - Graphics()->BlendNormal(); - Graphics()->QuadsBegin(); - Graphics()->SetColor(Brightness, Brightness, Brightness, 1.0f); - Graphics()->QuadsSetSubset(0, 0, View.w / Size, View.h / Size); - IGraphics::CQuadItem QuadItem(View.x, View.y, View.w, View.h); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); -} - -SEditResult CEditor::UiDoValueSelector(void *pId, CUIRect *pRect, const char *pLabel, int Current, int Min, int Max, int Step, float Scale, const char *pToolTip, bool IsDegree, bool IsHex, int Corners, const ColorRGBA *pColor, bool ShowValue) -{ - // logic - static bool s_DidScroll = false; - static float s_ScrollValue = 0.0f; - static CLineInputNumber s_NumberInput; - static int s_ButtonUsed = -1; - static void *s_pLastTextId = nullptr; - - const bool Inside = Ui()->MouseInside(pRect); - const int Base = IsHex ? 16 : 10; - - if(Ui()->HotItem() == pId && s_ButtonUsed >= 0 && !Ui()->MouseButton(s_ButtonUsed)) - { - Ui()->DisableMouseLock(); - if(Ui()->CheckActiveItem(pId)) - { - Ui()->SetActiveItem(nullptr); - } - if(Inside && ((s_ButtonUsed == 0 && !s_DidScroll && Ui()->DoDoubleClickLogic(pId)) || s_ButtonUsed == 1)) - { - s_pLastTextId = pId; - s_NumberInput.SetInteger(Current, Base); - s_NumberInput.SelectAll(); - } - s_ButtonUsed = -1; - } - - if(s_pLastTextId == pId) - { - str_copy(m_aTooltip, "Type your number"); - Ui()->SetActiveItem(&s_NumberInput); - DoEditBox(&s_NumberInput, pRect, 10.0f, Corners); - - if(Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER) || ((Ui()->MouseButtonClicked(1) || Ui()->MouseButtonClicked(0)) && !Inside)) - { - Current = clamp(s_NumberInput.GetInteger(Base), Min, Max); - Ui()->DisableMouseLock(); - Ui()->SetActiveItem(nullptr); - s_pLastTextId = nullptr; - } - - if(Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) - { - Ui()->DisableMouseLock(); - Ui()->SetActiveItem(nullptr); - s_pLastTextId = nullptr; - } - } - else - { - if(Ui()->CheckActiveItem(pId)) - { - if(s_ButtonUsed == 0 && Ui()->MouseButton(0)) - { - s_ScrollValue += Ui()->MouseDeltaX() * (Input()->ShiftIsPressed() ? 0.05f : 1.0f); - - if(absolute(s_ScrollValue) >= Scale) - { - int Count = (int)(s_ScrollValue / Scale); - s_ScrollValue = std::fmod(s_ScrollValue, Scale); - Current += Step * Count; - Current = clamp(Current, Min, Max); - s_DidScroll = true; - - // Constrain to discrete steps - if(Count > 0) - Current = Current / Step * Step; - else - Current = std::ceil(Current / (float)Step) * Step; - } - } - - if(pToolTip && s_pLastTextId != pId) - str_copy(m_aTooltip, pToolTip); - } - else if(Ui()->HotItem() == pId) - { - if(Ui()->MouseButton(0)) - { - s_ButtonUsed = 0; - s_DidScroll = false; - s_ScrollValue = 0.0f; - Ui()->SetActiveItem(pId); - Ui()->EnableMouseLock(pId); - } - else if(Ui()->MouseButton(1)) - { - s_ButtonUsed = 1; - Ui()->SetActiveItem(pId); - } - - if(pToolTip && s_pLastTextId != pId) - str_copy(m_aTooltip, pToolTip); - } - - // render - char aBuf[128]; - if(pLabel[0] != '\0') - { - if(ShowValue) - str_format(aBuf, sizeof(aBuf), "%s %d", pLabel, Current); - else - str_copy(aBuf, pLabel); - } - else if(IsDegree) - str_format(aBuf, sizeof(aBuf), "%d°", Current); - else if(IsHex) - str_format(aBuf, sizeof(aBuf), "#%06X", Current); - else - str_format(aBuf, sizeof(aBuf), "%d", Current); - pRect->Draw(pColor ? *pColor : GetButtonColor(pId, 0), Corners, 3.0f); - Ui()->DoLabel(pRect, aBuf, 10, TEXTALIGN_MC); - } - - if(Inside && !Ui()->MouseButton(0) && !Ui()->MouseButton(1)) - Ui()->SetHotItem(pId); - - static const void *s_pEditing = nullptr; - EEditState State = EEditState::NONE; - if(s_pEditing == pId) - { - State = EEditState::EDITING; - } - if(((Ui()->CheckActiveItem(pId) && Ui()->CheckMouseLock()) || s_pLastTextId == pId) && s_pEditing != pId) - { - State = EEditState::START; - s_pEditing = pId; - } - if(!Ui()->CheckMouseLock() && s_pLastTextId != pId && s_pEditing == pId) - { - State = EEditState::END; - s_pEditing = nullptr; - } - - return SEditResult{State, Current}; -} - -std::shared_ptr CEditor::GetSelectedGroup() const -{ - if(m_SelectedGroup >= 0 && m_SelectedGroup < (int)m_Map.m_vpGroups.size()) - return m_Map.m_vpGroups[m_SelectedGroup]; - return nullptr; -} - -std::shared_ptr CEditor::GetSelectedLayer(int Index) const -{ - std::shared_ptr pGroup = GetSelectedGroup(); - if(!pGroup) - return nullptr; - - if(Index < 0 || Index >= (int)m_vSelectedLayers.size()) - return nullptr; - - int LayerIndex = m_vSelectedLayers[Index]; - - if(LayerIndex >= 0 && LayerIndex < (int)m_Map.m_vpGroups[m_SelectedGroup]->m_vpLayers.size()) - return pGroup->m_vpLayers[LayerIndex]; - return nullptr; -} - -std::shared_ptr CEditor::GetSelectedLayerType(int Index, int Type) const -{ - std::shared_ptr pLayer = GetSelectedLayer(Index); - if(pLayer && pLayer->m_Type == Type) - return pLayer; - return nullptr; -} - -std::vector CEditor::GetSelectedQuads() -{ - std::shared_ptr pQuadLayer = std::static_pointer_cast(GetSelectedLayerType(0, LAYERTYPE_QUADS)); - std::vector vpQuads; - if(!pQuadLayer) - return vpQuads; - vpQuads.resize(m_vSelectedQuads.size()); - for(int i = 0; i < (int)m_vSelectedQuads.size(); ++i) - vpQuads[i] = &pQuadLayer->m_vQuads[m_vSelectedQuads[i]]; - return vpQuads; -} - -CSoundSource *CEditor::GetSelectedSource() const -{ - std::shared_ptr pSounds = std::static_pointer_cast(GetSelectedLayerType(0, LAYERTYPE_SOUNDS)); - if(!pSounds) - return nullptr; - if(m_SelectedSource >= 0 && m_SelectedSource < (int)pSounds->m_vSources.size()) - return &pSounds->m_vSources[m_SelectedSource]; - return nullptr; -} - -void CEditor::SelectLayer(int LayerIndex, int GroupIndex) -{ - if(GroupIndex != -1) - m_SelectedGroup = GroupIndex; - - m_vSelectedLayers.clear(); - DeselectQuads(); - DeselectQuadPoints(); - AddSelectedLayer(LayerIndex); -} - -void CEditor::AddSelectedLayer(int LayerIndex) -{ - m_vSelectedLayers.push_back(LayerIndex); - - m_QuadKnifeActive = false; -} - -void CEditor::SelectQuad(int Index) -{ - m_vSelectedQuads.clear(); - m_vSelectedQuads.push_back(Index); -} - -void CEditor::ToggleSelectQuad(int Index) -{ - int ListIndex = FindSelectedQuadIndex(Index); - if(ListIndex < 0) - m_vSelectedQuads.push_back(Index); - else - m_vSelectedQuads.erase(m_vSelectedQuads.begin() + ListIndex); -} - -void CEditor::DeselectQuads() -{ - m_vSelectedQuads.clear(); -} - -void CEditor::DeselectQuadPoints() -{ - m_SelectedQuadPoints = 0; -} - -void CEditor::SelectQuadPoint(int QuadIndex, int Index) -{ - SelectQuad(QuadIndex); - m_SelectedQuadPoints = 1 << Index; -} - -void CEditor::ToggleSelectQuadPoint(int QuadIndex, int Index) -{ - if(IsQuadPointSelected(QuadIndex, Index)) - { - m_SelectedQuadPoints ^= 1 << Index; - } - else - { - if(!IsQuadSelected(QuadIndex)) - { - ToggleSelectQuad(QuadIndex); - } - - if(!(m_SelectedQuadPoints & 1 << Index)) - { - m_SelectedQuadPoints ^= 1 << Index; - } - } -} - -void CEditor::DeleteSelectedQuads() -{ - std::shared_ptr pLayer = std::static_pointer_cast(GetSelectedLayerType(0, LAYERTYPE_QUADS)); - if(!pLayer) - return; - - std::vector vSelectedQuads(m_vSelectedQuads); - std::vector vDeletedQuads; - - for(int i = 0; i < (int)m_vSelectedQuads.size(); ++i) - { - auto const &Quad = pLayer->m_vQuads[m_vSelectedQuads[i]]; - vDeletedQuads.push_back(Quad); - - pLayer->m_vQuads.erase(pLayer->m_vQuads.begin() + m_vSelectedQuads[i]); - for(int j = i + 1; j < (int)m_vSelectedQuads.size(); ++j) - if(m_vSelectedQuads[j] > m_vSelectedQuads[i]) - m_vSelectedQuads[j]--; - - m_vSelectedQuads.erase(m_vSelectedQuads.begin() + i); - i--; - } - - m_EditorHistory.RecordAction(std::make_shared(this, m_SelectedGroup, m_vSelectedLayers[0], vSelectedQuads, vDeletedQuads)); -} - -bool CEditor::IsQuadSelected(int Index) const -{ - return FindSelectedQuadIndex(Index) >= 0; -} - -bool CEditor::IsQuadCornerSelected(int Index) const -{ - return m_SelectedQuadPoints & (1 << Index); -} - -bool CEditor::IsQuadPointSelected(int QuadIndex, int Index) const -{ - return IsQuadSelected(QuadIndex) && IsQuadCornerSelected(Index); -} - -int CEditor::FindSelectedQuadIndex(int Index) const -{ - for(size_t i = 0; i < m_vSelectedQuads.size(); ++i) - if(m_vSelectedQuads[i] == Index) - return i; - return -1; -} - -int CEditor::FindEnvPointIndex(int Index, int Channel) const -{ - auto Iter = std::find( - m_vSelectedEnvelopePoints.begin(), - m_vSelectedEnvelopePoints.end(), - std::pair(Index, Channel)); - - if(Iter != m_vSelectedEnvelopePoints.end()) - return Iter - m_vSelectedEnvelopePoints.begin(); - else - return -1; -} - -void CEditor::SelectEnvPoint(int Index) -{ - m_vSelectedEnvelopePoints.clear(); - - for(int c = 0; c < CEnvPoint::MAX_CHANNELS; c++) - m_vSelectedEnvelopePoints.emplace_back(Index, c); -} - -void CEditor::SelectEnvPoint(int Index, int Channel) -{ - DeselectEnvPoints(); - m_vSelectedEnvelopePoints.emplace_back(Index, Channel); -} - -void CEditor::ToggleEnvPoint(int Index, int Channel) -{ - if(IsTangentSelected()) - DeselectEnvPoints(); - - int ListIndex = FindEnvPointIndex(Index, Channel); - - if(ListIndex >= 0) - { - m_vSelectedEnvelopePoints.erase(m_vSelectedEnvelopePoints.begin() + ListIndex); - } - else - m_vSelectedEnvelopePoints.emplace_back(Index, Channel); -} - -bool CEditor::IsEnvPointSelected(int Index, int Channel) const -{ - int ListIndex = FindEnvPointIndex(Index, Channel); - - return ListIndex >= 0; -} - -bool CEditor::IsEnvPointSelected(int Index) const -{ - auto Iter = std::find_if( - m_vSelectedEnvelopePoints.begin(), - m_vSelectedEnvelopePoints.end(), - [&](auto pair) { return pair.first == Index; }); - - return Iter != m_vSelectedEnvelopePoints.end(); -} - -void CEditor::DeselectEnvPoints() -{ - m_vSelectedEnvelopePoints.clear(); - m_SelectedTangentInPoint = std::pair(-1, -1); - m_SelectedTangentOutPoint = std::pair(-1, -1); -} - -void CEditor::SelectTangentOutPoint(int Index, int Channel) -{ - DeselectEnvPoints(); - m_SelectedTangentOutPoint = std::pair(Index, Channel); -} - -bool CEditor::IsTangentOutPointSelected(int Index, int Channel) const -{ - return m_SelectedTangentOutPoint == std::pair(Index, Channel); -} - -void CEditor::SelectTangentInPoint(int Index, int Channel) -{ - DeselectEnvPoints(); - m_SelectedTangentInPoint = std::pair(Index, Channel); -} - -bool CEditor::IsTangentInPointSelected(int Index, int Channel) const -{ - return m_SelectedTangentInPoint == std::pair(Index, Channel); -} - -bool CEditor::IsTangentInSelected() const -{ - return m_SelectedTangentInPoint != std::pair(-1, -1); -} - -bool CEditor::IsTangentOutSelected() const -{ - return m_SelectedTangentOutPoint != std::pair(-1, -1); -} - -bool CEditor::IsTangentSelected() const -{ - return IsTangentInSelected() || IsTangentOutSelected(); -} - -std::pair CEditor::EnvGetSelectedTimeAndValue() const -{ - if(m_SelectedEnvelope < 0 || m_SelectedEnvelope >= (int)m_Map.m_vpEnvelopes.size()) - return {}; - - std::shared_ptr pEnvelope = m_Map.m_vpEnvelopes[m_SelectedEnvelope]; - int CurrentTime; - int CurrentValue; - if(IsTangentInSelected()) - { - auto [SelectedIndex, SelectedChannel] = m_SelectedTangentInPoint; - - CurrentTime = pEnvelope->m_vPoints[SelectedIndex].m_Time + pEnvelope->m_vPoints[SelectedIndex].m_Bezier.m_aInTangentDeltaX[SelectedChannel]; - CurrentValue = pEnvelope->m_vPoints[SelectedIndex].m_aValues[SelectedChannel] + pEnvelope->m_vPoints[SelectedIndex].m_Bezier.m_aInTangentDeltaY[SelectedChannel]; - } - else if(IsTangentOutSelected()) - { - auto [SelectedIndex, SelectedChannel] = m_SelectedTangentOutPoint; - - CurrentTime = pEnvelope->m_vPoints[SelectedIndex].m_Time + pEnvelope->m_vPoints[SelectedIndex].m_Bezier.m_aOutTangentDeltaX[SelectedChannel]; - CurrentValue = pEnvelope->m_vPoints[SelectedIndex].m_aValues[SelectedChannel] + pEnvelope->m_vPoints[SelectedIndex].m_Bezier.m_aOutTangentDeltaY[SelectedChannel]; - } - else - { - auto [SelectedIndex, SelectedChannel] = m_vSelectedEnvelopePoints.front(); - - CurrentTime = pEnvelope->m_vPoints[SelectedIndex].m_Time; - CurrentValue = pEnvelope->m_vPoints[SelectedIndex].m_aValues[SelectedChannel]; - } - - return std::pair{CurrentTime, CurrentValue}; -} - -void CEditor::SelectNextLayer() -{ - int CurrentLayer = 0; - for(const auto &Selected : m_vSelectedLayers) - CurrentLayer = maximum(Selected, CurrentLayer); - SelectLayer(CurrentLayer); - - if(m_vSelectedLayers[0] < (int)m_Map.m_vpGroups[m_SelectedGroup]->m_vpLayers.size() - 1) - { - SelectLayer(m_vSelectedLayers[0] + 1); - } - else - { - for(size_t Group = m_SelectedGroup + 1; Group < m_Map.m_vpGroups.size(); Group++) - { - if(!m_Map.m_vpGroups[Group]->m_vpLayers.empty()) - { - SelectLayer(0, Group); - break; - } - } - } -} - -void CEditor::SelectPreviousLayer() -{ - int CurrentLayer = std::numeric_limits::max(); - for(const auto &Selected : m_vSelectedLayers) - CurrentLayer = minimum(Selected, CurrentLayer); - SelectLayer(CurrentLayer); - - if(m_vSelectedLayers[0] > 0) - { - SelectLayer(m_vSelectedLayers[0] - 1); - } - else - { - for(int Group = m_SelectedGroup - 1; Group >= 0; Group--) - { - if(!m_Map.m_vpGroups[Group]->m_vpLayers.empty()) - { - SelectLayer(m_Map.m_vpGroups[Group]->m_vpLayers.size() - 1, Group); - break; - } - } - } -} - -bool CEditor::CallbackOpenMap(const char *pFileName, int StorageType, void *pUser) -{ - CEditor *pEditor = (CEditor *)pUser; - if(pEditor->Load(pFileName, StorageType)) - { - pEditor->m_ValidSaveFilename = StorageType == IStorage::TYPE_SAVE && (pEditor->m_pFileDialogPath == pEditor->m_aFileDialogCurrentFolder || (pEditor->m_pFileDialogPath == pEditor->m_aFileDialogCurrentLink && str_comp(pEditor->m_aFileDialogCurrentLink, "themes") == 0)); - if(pEditor->m_Dialog == DIALOG_FILE) - pEditor->m_Dialog = DIALOG_NONE; - return true; - } - else - { - pEditor->ShowFileDialogError("Failed to load map from file '%s'.", pFileName); - return false; - } -} - -bool CEditor::CallbackAppendMap(const char *pFileName, int StorageType, void *pUser) -{ - CEditor *pEditor = (CEditor *)pUser; - if(pEditor->Append(pFileName, StorageType)) - { - pEditor->m_Dialog = DIALOG_NONE; - return true; - } - else - { - pEditor->m_aFileName[0] = 0; - pEditor->ShowFileDialogError("Failed to load map from file '%s'.", pFileName); - return false; - } -} - -bool CEditor::CallbackSaveMap(const char *pFileName, int StorageType, void *pUser) -{ - dbg_assert(StorageType == IStorage::TYPE_SAVE, "Saving only allowed for IStorage::TYPE_SAVE"); - - CEditor *pEditor = static_cast(pUser); - char aBuf[IO_MAX_PATH_LENGTH]; - // add map extension - if(!str_endswith(pFileName, ".map")) - { - str_format(aBuf, sizeof(aBuf), "%s.map", pFileName); - pFileName = aBuf; - } - - // Save map to specified file - if(pEditor->Save(pFileName)) - { - str_copy(pEditor->m_aFileName, pFileName); - pEditor->m_ValidSaveFilename = true; - pEditor->m_Map.m_Modified = false; - } - else - { - pEditor->ShowFileDialogError("Failed to save map to file '%s'.", pFileName); - return false; - } - - // Also update autosave if it's older than half the configured autosave interval, so we also have periodic backups. - const float Time = pEditor->Client()->GlobalTime(); - if(g_Config.m_EdAutosaveInterval > 0 && pEditor->m_Map.m_LastSaveTime < Time && Time - pEditor->m_Map.m_LastSaveTime > 30 * g_Config.m_EdAutosaveInterval) - { - if(!pEditor->PerformAutosave()) - return false; - } - - pEditor->m_Dialog = DIALOG_NONE; - return true; -} - -bool CEditor::CallbackSaveCopyMap(const char *pFileName, int StorageType, void *pUser) -{ - dbg_assert(StorageType == IStorage::TYPE_SAVE, "Saving only allowed for IStorage::TYPE_SAVE"); - - CEditor *pEditor = static_cast(pUser); - char aBuf[IO_MAX_PATH_LENGTH]; - // add map extension - if(!str_endswith(pFileName, ".map")) - { - str_format(aBuf, sizeof(aBuf), "%s.map", pFileName); - pFileName = aBuf; - } - - if(pEditor->Save(pFileName)) - { - pEditor->m_Dialog = DIALOG_NONE; - return true; - } - else - { - pEditor->ShowFileDialogError("Failed to save map to file '%s'.", pFileName); - return false; - } -} - -bool CEditor::CallbackSaveImage(const char *pFileName, int StorageType, void *pUser) -{ - dbg_assert(StorageType == IStorage::TYPE_SAVE, "Saving only allowed for IStorage::TYPE_SAVE"); - - CEditor *pEditor = static_cast(pUser); - char aBuf[IO_MAX_PATH_LENGTH]; - - // add file extension - if(!str_endswith(pFileName, ".png")) - { - str_format(aBuf, sizeof(aBuf), "%s.png", pFileName); - pFileName = aBuf; - } - - std::shared_ptr pImg = pEditor->m_Map.m_vpImages[pEditor->m_SelectedImage]; - - if(CImageLoader::SavePng(pEditor->Storage()->OpenFile(pFileName, IOFLAG_WRITE, StorageType), pFileName, *pImg)) - { - pEditor->m_Dialog = DIALOG_NONE; - return true; - } - else - { - pEditor->ShowFileDialogError("Failed to write image to file '%s'.", pFileName); - return false; - } -} - -bool CEditor::CallbackSaveSound(const char *pFileName, int StorageType, void *pUser) -{ - dbg_assert(StorageType == IStorage::TYPE_SAVE, "Saving only allowed for IStorage::TYPE_SAVE"); - - CEditor *pEditor = static_cast(pUser); - char aBuf[IO_MAX_PATH_LENGTH]; - - // add file extension - if(!str_endswith(pFileName, ".opus")) - { - str_format(aBuf, sizeof(aBuf), "%s.opus", pFileName); - pFileName = aBuf; - } - std::shared_ptr pSound = pEditor->m_Map.m_vpSounds[pEditor->m_SelectedSound]; - IOHANDLE File = pEditor->Storage()->OpenFile(pFileName, IOFLAG_WRITE, StorageType); - - if(File) - { - io_write(File, pSound->m_pData, pSound->m_DataSize); - io_close(File); - pEditor->OnDialogClose(); - pEditor->m_Dialog = DIALOG_NONE; - return true; - } - pEditor->ShowFileDialogError("Failed to open file '%s'.", pFileName); - return false; -} - -bool CEditor::CallbackCustomEntities(const char *pFileName, int StorageType, void *pUser) -{ - CEditor *pEditor = (CEditor *)pUser; - - char aBuf[IO_MAX_PATH_LENGTH]; - IStorage::StripPathAndExtension(pFileName, aBuf, sizeof(aBuf)); - - if(std::find(pEditor->m_vSelectEntitiesFiles.begin(), pEditor->m_vSelectEntitiesFiles.end(), std::string(aBuf)) != pEditor->m_vSelectEntitiesFiles.end()) - { - pEditor->ShowFileDialogError("Custom entities cannot have the same name as default entities."); - return false; - } - - CImageInfo ImgInfo; - if(!pEditor->Graphics()->LoadPng(ImgInfo, pFileName, StorageType)) - { - pEditor->ShowFileDialogError("Failed to load image from file '%s'.", pFileName); - return false; - } - - pEditor->m_SelectEntitiesImage = aBuf; - pEditor->m_AllowPlaceUnusedTiles = -1; - pEditor->m_PreventUnusedTilesWasWarned = false; - - pEditor->Graphics()->UnloadTexture(&pEditor->m_EntitiesTexture); - pEditor->m_EntitiesTexture = pEditor->Graphics()->LoadTextureRawMove(ImgInfo, pEditor->GetTextureUsageFlag()); - - pEditor->m_Dialog = DIALOG_NONE; - return true; -} - -void CEditor::DoAudioPreview(CUIRect View, const void *pPlayPauseButtonId, const void *pStopButtonId, const void *pSeekBarId, int SampleId) -{ - CUIRect Button, SeekBar; - // play/pause button - { - View.VSplitLeft(View.h, &Button, &View); - if(DoButton_FontIcon(pPlayPauseButtonId, Sound()->IsPlaying(SampleId) ? FONT_ICON_PAUSE : FONT_ICON_PLAY, 0, &Button, 0, "Play/pause audio preview", IGraphics::CORNER_ALL) || - (m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && Input()->KeyPress(KEY_SPACE))) - { - if(Sound()->IsPlaying(SampleId)) - { - Sound()->Pause(SampleId); - } - else - { - if(SampleId != m_ToolbarPreviewSound && m_ToolbarPreviewSound >= 0 && Sound()->IsPlaying(m_ToolbarPreviewSound)) - Sound()->Pause(m_ToolbarPreviewSound); - - Sound()->Play(CSounds::CHN_GUI, SampleId, ISound::FLAG_PREVIEW, 1.0f); - } - } - } - // stop button - { - View.VSplitLeft(2.0f, nullptr, &View); - View.VSplitLeft(View.h, &Button, &View); - if(DoButton_FontIcon(pStopButtonId, FONT_ICON_STOP, 0, &Button, 0, "Stop audio preview", IGraphics::CORNER_ALL)) - { - Sound()->Stop(SampleId); - } - } - // do seekbar - { - View.VSplitLeft(5.0f, nullptr, &View); - const float Cut = std::min(View.w, 200.0f); - View.VSplitLeft(Cut, &SeekBar, &View); - SeekBar.HMargin(2.5f, &SeekBar); - - const float Rounding = 5.0f; - - char aBuffer[64]; - const float CurrentTime = Sound()->GetSampleCurrentTime(SampleId); - const float TotalTime = Sound()->GetSampleTotalTime(SampleId); - - // draw seek bar - SeekBar.Draw(ColorRGBA(0, 0, 0, 0.5f), IGraphics::CORNER_ALL, Rounding); - - // draw filled bar - const float Amount = CurrentTime / TotalTime; - CUIRect FilledBar = SeekBar; - FilledBar.w = 2 * Rounding + (FilledBar.w - 2 * Rounding) * Amount; - FilledBar.Draw(ColorRGBA(1, 1, 1, 0.5f), IGraphics::CORNER_ALL, Rounding); - - // draw time - char aCurrentTime[32]; - str_time_float(CurrentTime, TIME_HOURS, aCurrentTime, sizeof(aCurrentTime)); - char aTotalTime[32]; - str_time_float(TotalTime, TIME_HOURS, aTotalTime, sizeof(aTotalTime)); - str_format(aBuffer, sizeof(aBuffer), "%s / %s", aCurrentTime, aTotalTime); - Ui()->DoLabel(&SeekBar, aBuffer, SeekBar.h * 0.70f, TEXTALIGN_MC); - - // do the logic - const bool Inside = Ui()->MouseInside(&SeekBar); - - if(Ui()->CheckActiveItem(pSeekBarId)) - { - if(!Ui()->MouseButton(0)) - { - Ui()->SetActiveItem(nullptr); - } - else - { - const float AmountSeek = clamp((Ui()->MouseX() - SeekBar.x - Rounding) / (SeekBar.w - 2 * Rounding), 0.0f, 1.0f); - Sound()->SetSampleCurrentTime(SampleId, AmountSeek); - } - } - else if(Ui()->HotItem() == pSeekBarId) - { - if(Ui()->MouseButton(0)) - Ui()->SetActiveItem(pSeekBarId); - } - - if(Inside && !Ui()->MouseButton(0)) - Ui()->SetHotItem(pSeekBarId); - } -} - -void CEditor::DoToolbarLayers(CUIRect ToolBar) -{ - const bool ModPressed = Input()->ModifierIsPressed(); - const bool ShiftPressed = Input()->ShiftIsPressed(); - - // handle shortcut for info button - if(m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && Input()->KeyPress(KEY_I) && ModPressed && !ShiftPressed) - { - if(m_ShowTileInfo == SHOW_TILE_HEXADECIMAL) - m_ShowTileInfo = SHOW_TILE_DECIMAL; - else if(m_ShowTileInfo != SHOW_TILE_OFF) - m_ShowTileInfo = SHOW_TILE_OFF; - else - m_ShowTileInfo = SHOW_TILE_DECIMAL; - m_ShowEnvelopePreview = SHOWENV_NONE; - } - - // handle shortcut for hex button - if(m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && Input()->KeyPress(KEY_I) && ModPressed && ShiftPressed) - { - m_ShowTileInfo = m_ShowTileInfo == SHOW_TILE_HEXADECIMAL ? SHOW_TILE_OFF : SHOW_TILE_HEXADECIMAL; - m_ShowEnvelopePreview = SHOWENV_NONE; - } - - // handle shortcut for unused button - if(m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && Input()->KeyPress(KEY_U) && ModPressed) - m_AllowPlaceUnusedTiles = !m_AllowPlaceUnusedTiles; - - CUIRect TB_Top, TB_Bottom; - CUIRect Button; - - ToolBar.HSplitMid(&TB_Top, &TB_Bottom, 5.0f); - - // top line buttons - { - // detail button - TB_Top.VSplitLeft(40.0f, &Button, &TB_Top); - static int s_HqButton = 0; - if(DoButton_Editor(&s_HqButton, "HD", m_ShowDetail, &Button, 0, "[ctrl+h] Toggle High Detail") || - (m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && Input()->KeyPress(KEY_H) && ModPressed)) - { - m_ShowDetail = !m_ShowDetail; - } - - TB_Top.VSplitLeft(5.0f, nullptr, &TB_Top); - - // animation button - TB_Top.VSplitLeft(25.0f, &Button, &TB_Top); - static char s_AnimateButton; - if(DoButton_FontIcon(&s_AnimateButton, FONT_ICON_CIRCLE_PLAY, m_Animate, &Button, 0, "[ctrl+m] Toggle animation", IGraphics::CORNER_L) || - (m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && Input()->KeyPress(KEY_M) && ModPressed)) - { - m_AnimateStart = time_get(); - m_Animate = !m_Animate; - } - - // animation settings button - TB_Top.VSplitLeft(14.0f, &Button, &TB_Top); - static char s_AnimateSettingsButton; - if(DoButton_FontIcon(&s_AnimateSettingsButton, FONT_ICON_CIRCLE_CHEVRON_DOWN, 0, &Button, 0, "Change animation settings.", IGraphics::CORNER_R, 8.0f)) - { - m_AnimateUpdatePopup = true; - static SPopupMenuId s_PopupAnimateSettingsId; - Ui()->DoPopupMenu(&s_PopupAnimateSettingsId, Button.x, Button.y + Button.h, 150.0f, 37.0f, this, PopupAnimateSettings); - } - - TB_Top.VSplitLeft(5.0f, nullptr, &TB_Top); - - // proof button - TB_Top.VSplitLeft(40.0f, &Button, &TB_Top); - if(DoButton_Ex(&m_QuickActionProof, m_QuickActionProof.Label(), m_QuickActionProof.Active(), &Button, 0, m_QuickActionProof.Description(), IGraphics::CORNER_L)) - { - m_QuickActionProof.Call(); - } - - TB_Top.VSplitLeft(14.0f, &Button, &TB_Top); - static int s_ProofModeButton = 0; - if(DoButton_FontIcon(&s_ProofModeButton, FONT_ICON_CIRCLE_CHEVRON_DOWN, 0, &Button, 0, "Select proof mode.", IGraphics::CORNER_R, 8.0f)) - { - static SPopupMenuId s_PopupProofModeId; - Ui()->DoPopupMenu(&s_PopupProofModeId, Button.x, Button.y + Button.h, 60.0f, 36.0f, this, PopupProofMode); - } - - TB_Top.VSplitLeft(5.0f, nullptr, &TB_Top); - - // zoom button - TB_Top.VSplitLeft(40.0f, &Button, &TB_Top); - static int s_ZoomButton = 0; - if(DoButton_Editor(&s_ZoomButton, "Zoom", m_PreviewZoom, &Button, 0, "Toggles preview of how layers will be zoomed in-game")) - { - m_PreviewZoom = !m_PreviewZoom; - } - - TB_Top.VSplitLeft(5.0f, nullptr, &TB_Top); - - // grid button - TB_Top.VSplitLeft(25.0f, &Button, &TB_Top); - static int s_GridButton = 0; - if(DoButton_FontIcon(&s_GridButton, FONT_ICON_BORDER_ALL, m_QuickActionToggleGrid.Active(), &Button, 0, m_QuickActionToggleGrid.Description(), IGraphics::CORNER_L) || - (m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && Input()->KeyPress(KEY_G) && ModPressed && !ShiftPressed)) - { - m_QuickActionToggleGrid.Call(); - } - - // grid settings button - TB_Top.VSplitLeft(14.0f, &Button, &TB_Top); - static char s_GridSettingsButton; - if(DoButton_FontIcon(&s_GridSettingsButton, FONT_ICON_CIRCLE_CHEVRON_DOWN, 0, &Button, 0, "Change grid settings.", IGraphics::CORNER_R, 8.0f)) - { - MapView()->MapGrid()->DoSettingsPopup(vec2(Button.x, Button.y + Button.h)); - } - - TB_Top.VSplitLeft(5.0f, nullptr, &TB_Top); - - // zoom group - TB_Top.VSplitLeft(20.0f, &Button, &TB_Top); - static int s_ZoomOutButton = 0; - if(DoButton_FontIcon(&s_ZoomOutButton, FONT_ICON_MINUS, 0, &Button, 0, m_QuickActionZoomOut.Description(), IGraphics::CORNER_L)) - { - m_QuickActionZoomOut.Call(); - } - - TB_Top.VSplitLeft(25.0f, &Button, &TB_Top); - static int s_ZoomNormalButton = 0; - if(DoButton_FontIcon(&s_ZoomNormalButton, FONT_ICON_MAGNIFYING_GLASS, 0, &Button, 0, m_QuickActionResetZoom.Description(), IGraphics::CORNER_NONE)) - { - m_QuickActionResetZoom.Call(); - } - - TB_Top.VSplitLeft(20.0f, &Button, &TB_Top); - static int s_ZoomInButton = 0; - if(DoButton_FontIcon(&s_ZoomInButton, FONT_ICON_PLUS, 0, &Button, 0, m_QuickActionZoomIn.Description(), IGraphics::CORNER_R)) - { - m_QuickActionZoomIn.Call(); - } - - TB_Top.VSplitLeft(5.0f, nullptr, &TB_Top); - - // undo/redo group - TB_Top.VSplitLeft(25.0f, &Button, &TB_Top); - static int s_UndoButton = 0; - if(DoButton_FontIcon(&s_UndoButton, FONT_ICON_UNDO, m_EditorHistory.CanUndo() - 1, &Button, 0, "[ctrl+z] Undo last action", IGraphics::CORNER_L)) - { - m_EditorHistory.Undo(); - } - - TB_Top.VSplitLeft(25.0f, &Button, &TB_Top); - static int s_RedoButton = 0; - if(DoButton_FontIcon(&s_RedoButton, FONT_ICON_REDO, m_EditorHistory.CanRedo() - 1, &Button, 0, "[ctrl+y] Redo last action", IGraphics::CORNER_R)) - { - m_EditorHistory.Redo(); - } - - TB_Top.VSplitLeft(5.0f, nullptr, &TB_Top); - - // brush manipulation - { - int Enabled = m_pBrush->IsEmpty() ? -1 : 0; - - // flip buttons - TB_Top.VSplitLeft(25.0f, &Button, &TB_Top); - static int s_FlipXButton = 0; - if(DoButton_FontIcon(&s_FlipXButton, FONT_ICON_ARROWS_LEFT_RIGHT, Enabled, &Button, 0, "[N] Flip brush horizontal", IGraphics::CORNER_L) || (Input()->KeyPress(KEY_N) && m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr)) - { - for(auto &pLayer : m_pBrush->m_vpLayers) - pLayer->BrushFlipX(); - } - - TB_Top.VSplitLeft(25.0f, &Button, &TB_Top); - static int s_FlipyButton = 0; - if(DoButton_FontIcon(&s_FlipyButton, FONT_ICON_ARROWS_UP_DOWN, Enabled, &Button, 0, "[M] Flip brush vertical", IGraphics::CORNER_R) || (Input()->KeyPress(KEY_M) && m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr)) - { - for(auto &pLayer : m_pBrush->m_vpLayers) - pLayer->BrushFlipY(); - } - TB_Top.VSplitLeft(5.0f, nullptr, &TB_Top); - - // rotate buttons - TB_Top.VSplitLeft(25.0f, &Button, &TB_Top); - static int s_RotationAmount = 90; - bool TileLayer = false; - // check for tile layers in brush selection - for(auto &pLayer : m_pBrush->m_vpLayers) - if(pLayer->m_Type == LAYERTYPE_TILES) - { - TileLayer = true; - s_RotationAmount = maximum(90, (s_RotationAmount / 90) * 90); - break; - } - - static int s_CcwButton = 0; - if(DoButton_FontIcon(&s_CcwButton, FONT_ICON_ARROW_ROTATE_LEFT, Enabled, &Button, 0, "[R] Rotates the brush counter clockwise", IGraphics::CORNER_L) || (Input()->KeyPress(KEY_R) && m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr)) - { - for(auto &pLayer : m_pBrush->m_vpLayers) - pLayer->BrushRotate(-s_RotationAmount / 360.0f * pi * 2); - } - - TB_Top.VSplitLeft(30.0f, &Button, &TB_Top); - auto RotationAmountRes = UiDoValueSelector(&s_RotationAmount, &Button, "", s_RotationAmount, TileLayer ? 90 : 1, 359, TileLayer ? 90 : 1, TileLayer ? 10.0f : 2.0f, "Rotation of the brush in degrees. Use left mouse button to drag and change the value. Hold shift to be more precise.", true, false, IGraphics::CORNER_NONE); - s_RotationAmount = RotationAmountRes.m_Value; - - TB_Top.VSplitLeft(25.0f, &Button, &TB_Top); - static int s_CwButton = 0; - if(DoButton_FontIcon(&s_CwButton, FONT_ICON_ARROW_ROTATE_RIGHT, Enabled, &Button, 0, "[T] Rotates the brush clockwise", IGraphics::CORNER_R) || (Input()->KeyPress(KEY_T) && m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr)) - { - for(auto &pLayer : m_pBrush->m_vpLayers) - pLayer->BrushRotate(s_RotationAmount / 360.0f * pi * 2); - } - } - - // Color pipette and palette - { - const float PipetteButtonWidth = 30.0f; - const float ColorPickerButtonWidth = 20.0f; - const float Spacing = 2.0f; - const size_t NumColorsShown = clamp(round_to_int((TB_Top.w - PipetteButtonWidth - 40.0f) / (ColorPickerButtonWidth + Spacing)), 1, std::size(m_aSavedColors)); - - CUIRect ColorPalette; - TB_Top.VSplitRight(NumColorsShown * (ColorPickerButtonWidth + Spacing) + PipetteButtonWidth, &TB_Top, &ColorPalette); - - // Pipette button - static char s_PipetteButton; - ColorPalette.VSplitLeft(PipetteButtonWidth, &Button, &ColorPalette); - ColorPalette.VSplitLeft(Spacing, nullptr, &ColorPalette); - if(DoButton_FontIcon(&s_PipetteButton, FONT_ICON_EYE_DROPPER, m_QuickActionPipette.Active(), &Button, 0, m_QuickActionPipette.Description(), IGraphics::CORNER_ALL) || - (CLineInput::GetActiveInput() == nullptr && ModPressed && ShiftPressed && Input()->KeyPress(KEY_C))) - { - m_QuickActionPipette.Call(); - } - - // Palette color pickers - for(size_t i = 0; i < NumColorsShown; ++i) - { - ColorPalette.VSplitLeft(ColorPickerButtonWidth, &Button, &ColorPalette); - ColorPalette.VSplitLeft(Spacing, nullptr, &ColorPalette); - const auto &&SetColor = [&](ColorRGBA NewColor) { - m_aSavedColors[i] = NewColor; - }; - DoColorPickerButton(&m_aSavedColors[i], &Button, m_aSavedColors[i], SetColor); - } - } - } - - // Bottom line buttons - { - // refocus button - { - TB_Bottom.VSplitLeft(50.0f, &Button, &TB_Bottom); - int FocusButtonChecked = MapView()->IsFocused() ? -1 : 1; - if(DoButton_Editor(&m_QuickActionRefocus, m_QuickActionRefocus.Label(), FocusButtonChecked, &Button, 0, m_QuickActionRefocus.Description()) || (m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && Input()->KeyPress(KEY_HOME))) - m_QuickActionRefocus.Call(); - TB_Bottom.VSplitLeft(5.0f, nullptr, &TB_Bottom); - } - - // tile manipulation - { - // do tele/tune/switch/speedup button - { - std::shared_ptr pS = std::static_pointer_cast(GetSelectedLayerType(0, LAYERTYPE_TILES)); - if(pS) - { - const char *pButtonName = nullptr; - CUi::FPopupMenuFunction pfnPopupFunc = nullptr; - int Rows = 0; - int ExtraWidth = 0; - if(pS == m_Map.m_pSwitchLayer) - { - pButtonName = "Switch"; - pfnPopupFunc = PopupSwitch; - Rows = 3; - } - else if(pS == m_Map.m_pSpeedupLayer) - { - pButtonName = "Speedup"; - pfnPopupFunc = PopupSpeedup; - Rows = 3; - } - else if(pS == m_Map.m_pTuneLayer) - { - pButtonName = "Tune"; - pfnPopupFunc = PopupTune; - Rows = 1; - } - else if(pS == m_Map.m_pTeleLayer) - { - pButtonName = "Tele"; - pfnPopupFunc = PopupTele; - Rows = 3; - ExtraWidth = 50; - } - - if(pButtonName != nullptr) - { - static char s_aButtonTooltip[64]; - str_format(s_aButtonTooltip, sizeof(s_aButtonTooltip), "[ctrl+t] %s", pButtonName); - - TB_Bottom.VSplitLeft(60.0f, &Button, &TB_Bottom); - static int s_ModifierButton = 0; - if(DoButton_Ex(&s_ModifierButton, pButtonName, 0, &Button, 0, s_aButtonTooltip, IGraphics::CORNER_ALL) || (m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && ModPressed && Input()->KeyPress(KEY_T))) - { - static SPopupMenuId s_PopupModifierId; - if(!Ui()->IsPopupOpen(&s_PopupModifierId)) - { - Ui()->DoPopupMenu(&s_PopupModifierId, Button.x, Button.y + Button.h, 120 + ExtraWidth, 10.0f + Rows * 13.0f, this, pfnPopupFunc); - } - } - TB_Bottom.VSplitLeft(5.0f, nullptr, &TB_Bottom); - } - } - } - } - - // do add quad/sound button - std::shared_ptr pLayer = GetSelectedLayer(0); - if(pLayer && (pLayer->m_Type == LAYERTYPE_QUADS || pLayer->m_Type == LAYERTYPE_SOUNDS)) - { - TB_Bottom.VSplitLeft(60.0f, &Button, &TB_Bottom); - - if(pLayer->m_Type == LAYERTYPE_QUADS) - { - if(DoButton_Editor(&m_QuickActionAddQuad, m_QuickActionAddQuad.Label(), 0, &Button, 0, m_QuickActionAddQuad.Description()) || - (m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && Input()->KeyPress(KEY_Q) && ModPressed)) - { - m_QuickActionAddQuad.Call(); - } - } - else if(pLayer->m_Type == LAYERTYPE_SOUNDS) - { - if(DoButton_Editor(&m_QuickActionAddSound, m_QuickActionAddSound.Label(), 0, &Button, 0, m_QuickActionAddSound.Description()) || - (m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && Input()->KeyPress(KEY_Q) && ModPressed)) - { - m_QuickActionAddSound.Call(); - } - } - - TB_Bottom.VSplitLeft(5.0f, &Button, &TB_Bottom); - } - - // Brush draw mode button - { - TB_Bottom.VSplitLeft(65.0f, &Button, &TB_Bottom); - static int s_BrushDrawModeButton = 0; - if(DoButton_Editor(&s_BrushDrawModeButton, "Destructive", m_BrushDrawDestructive, &Button, 0, "[ctrl+d] Toggle brush draw mode") || - (m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && Input()->KeyPress(KEY_D) && ModPressed && !ShiftPressed)) - m_BrushDrawDestructive = !m_BrushDrawDestructive; - TB_Bottom.VSplitLeft(5.0f, &Button, &TB_Bottom); - } - } -} - -void CEditor::DoToolbarImages(CUIRect ToolBar) -{ - CUIRect ToolBarTop, ToolBarBottom; - ToolBar.HSplitMid(&ToolBarTop, &ToolBarBottom, 5.0f); - - if(m_SelectedImage >= 0 && (size_t)m_SelectedImage < m_Map.m_vpImages.size()) - { - const std::shared_ptr pSelectedImage = m_Map.m_vpImages[m_SelectedImage]; - char aLabel[64]; - str_format(aLabel, sizeof(aLabel), "Size: %" PRIzu " × %" PRIzu, pSelectedImage->m_Width, pSelectedImage->m_Height); - Ui()->DoLabel(&ToolBarBottom, aLabel, 12.0f, TEXTALIGN_ML); - } -} - -void CEditor::DoToolbarSounds(CUIRect ToolBar) -{ - CUIRect ToolBarTop, ToolBarBottom; - ToolBar.HSplitMid(&ToolBarTop, &ToolBarBottom, 5.0f); - - if(m_SelectedSound >= 0 && (size_t)m_SelectedSound < m_Map.m_vpSounds.size()) - { - const std::shared_ptr pSelectedSound = m_Map.m_vpSounds[m_SelectedSound]; - if(pSelectedSound->m_SoundId != m_ToolbarPreviewSound && m_ToolbarPreviewSound >= 0 && Sound()->IsPlaying(m_ToolbarPreviewSound)) - Sound()->Stop(m_ToolbarPreviewSound); - m_ToolbarPreviewSound = pSelectedSound->m_SoundId; - } - else - { - m_ToolbarPreviewSound = -1; - } - - if(m_ToolbarPreviewSound >= 0) - { - static int s_PlayPauseButton, s_StopButton, s_SeekBar = 0; - DoAudioPreview(ToolBarBottom, &s_PlayPauseButton, &s_StopButton, &s_SeekBar, m_ToolbarPreviewSound); - } -} - -static void Rotate(const CPoint *pCenter, CPoint *pPoint, float Rotation) -{ - int x = pPoint->x - pCenter->x; - int y = pPoint->y - pCenter->y; - pPoint->x = (int)(x * std::cos(Rotation) - y * std::sin(Rotation) + pCenter->x); - pPoint->y = (int)(x * std::sin(Rotation) + y * std::cos(Rotation) + pCenter->y); -} - -void CEditor::DoSoundSource(int LayerIndex, CSoundSource *pSource, int Index) -{ - void *pId = &pSource->m_Position; - - static ESoundSourceOp s_Operation = ESoundSourceOp::OP_NONE; - - float wx = Ui()->MouseWorldX(); - float wy = Ui()->MouseWorldY(); - - float CenterX = fx2f(pSource->m_Position.x); - float CenterY = fx2f(pSource->m_Position.y); - - float dx = (CenterX - wx) / m_MouseWorldScale; - float dy = (CenterY - wy) / m_MouseWorldScale; - if(dx * dx + dy * dy < 50) - Ui()->SetHotItem(pId); - - const bool IgnoreGrid = Input()->AltIsPressed(); - static CSoundSourceOperationTracker s_Tracker(this); - - if(s_Operation == ESoundSourceOp::OP_NONE) - { - if(!Ui()->MouseButton(0)) - s_Tracker.End(); - } - - if(Ui()->CheckActiveItem(pId)) - { - if(s_Operation != ESoundSourceOp::OP_NONE) - { - s_Tracker.Begin(pSource, s_Operation, LayerIndex); - } - - if(m_MouseDeltaWorld != vec2(0.0f, 0.0f)) - { - if(s_Operation == ESoundSourceOp::OP_MOVE) - { - float x = wx; - float y = wy; - if(MapView()->MapGrid()->IsEnabled() && !IgnoreGrid) - MapView()->MapGrid()->SnapToGrid(x, y); - pSource->m_Position.x = f2fx(x); - pSource->m_Position.y = f2fx(y); - } - } - - if(s_Operation == ESoundSourceOp::OP_CONTEXT_MENU) - { - if(!Ui()->MouseButton(1)) - { - if(m_vSelectedLayers.size() == 1) - { - static SPopupMenuId s_PopupSourceId; - Ui()->DoPopupMenu(&s_PopupSourceId, Ui()->MouseX(), Ui()->MouseY(), 120, 200, this, PopupSource); - Ui()->DisableMouseLock(); - } - s_Operation = ESoundSourceOp::OP_NONE; - Ui()->SetActiveItem(nullptr); - } - } - else - { - if(!Ui()->MouseButton(0)) - { - Ui()->DisableMouseLock(); - s_Operation = ESoundSourceOp::OP_NONE; - Ui()->SetActiveItem(nullptr); - } - } - - Graphics()->SetColor(1, 1, 1, 1); - } - else if(Ui()->HotItem() == pId) - { - ms_pUiGotContext = pId; - - Graphics()->SetColor(1, 1, 1, 1); - str_copy(m_aTooltip, "Left mouse button to move. Hold alt to ignore grid."); - - if(Ui()->MouseButton(0)) - { - s_Operation = ESoundSourceOp::OP_MOVE; - - Ui()->SetActiveItem(pId); - m_SelectedSource = Index; - } - - if(Ui()->MouseButton(1)) - { - m_SelectedSource = Index; - s_Operation = ESoundSourceOp::OP_CONTEXT_MENU; - Ui()->SetActiveItem(pId); - } - } - else - { - Graphics()->SetColor(0, 1, 0, 1); - } - - IGraphics::CQuadItem QuadItem(CenterX, CenterY, 5.0f * m_MouseWorldScale, 5.0f * m_MouseWorldScale); - Graphics()->QuadsDraw(&QuadItem, 1); -} - -void CEditor::PreparePointDrag(const std::shared_ptr &pLayer, CQuad *pQuad, int QuadIndex, int PointIndex) -{ - m_QuadDragOriginalPoints[QuadIndex][PointIndex] = pQuad->m_aPoints[PointIndex]; -} - -void CEditor::DoPointDrag(const std::shared_ptr &pLayer, CQuad *pQuad, int QuadIndex, int PointIndex, int OffsetX, int OffsetY) -{ - pQuad->m_aPoints[PointIndex].x = m_QuadDragOriginalPoints[QuadIndex][PointIndex].x + OffsetX; - pQuad->m_aPoints[PointIndex].y = m_QuadDragOriginalPoints[QuadIndex][PointIndex].y + OffsetY; -} - -CEditor::EAxis CEditor::GetDragAxis(int OffsetX, int OffsetY) const -{ - if(Input()->ShiftIsPressed()) - if(absolute(OffsetX) < absolute(OffsetY)) - return EAxis::AXIS_Y; - else - return EAxis::AXIS_X; - else - return EAxis::AXIS_NONE; -} - -void CEditor::DrawAxis(EAxis Axis, CPoint &OriginalPoint, CPoint &Point) const -{ - if(Axis == EAxis::AXIS_NONE) - return; - - Graphics()->SetColor(1, 0, 0.1f, 1); - if(Axis == EAxis::AXIS_X) - { - IGraphics::CQuadItem Line(fx2f(OriginalPoint.x + Point.x) / 2.0f, fx2f(OriginalPoint.y), fx2f(Point.x - OriginalPoint.x), 1.0f * m_MouseWorldScale); - Graphics()->QuadsDraw(&Line, 1); - } - else if(Axis == EAxis::AXIS_Y) - { - IGraphics::CQuadItem Line(fx2f(OriginalPoint.x), fx2f(OriginalPoint.y + Point.y) / 2.0f, 1.0f * m_MouseWorldScale, fx2f(Point.y - OriginalPoint.y)); - Graphics()->QuadsDraw(&Line, 1); - } - - // Draw ghost of original point - IGraphics::CQuadItem QuadItem(fx2f(OriginalPoint.x), fx2f(OriginalPoint.y), 5.0f * m_MouseWorldScale, 5.0f * m_MouseWorldScale); - Graphics()->QuadsDraw(&QuadItem, 1); -} - -void CEditor::ComputePointAlignments(const std::shared_ptr &pLayer, CQuad *pQuad, int QuadIndex, int PointIndex, int OffsetX, int OffsetY, std::vector &vAlignments, bool Append) const -{ - if(!Append) - vAlignments.clear(); - if(!g_Config.m_EdAlignQuads) - return; - - bool GridEnabled = MapView()->MapGrid()->IsEnabled() && !Input()->AltIsPressed(); - - // Perform computation from the original position of this point - int Threshold = f2fx(maximum(5.0f, 10.0f * m_MouseWorldScale)); - CPoint OrigPoint = m_QuadDragOriginalPoints.at(QuadIndex)[PointIndex]; - // Get the "current" point by applying the offset - CPoint Point = OrigPoint + ivec2(OffsetX, OffsetY); - - // Save smallest diff on both axis to only keep closest alignments - int SmallestDiffX = Threshold + 1, SmallestDiffY = Threshold + 1; - // Store both axis alignments in separate vectors - std::vector vAlignmentsX, vAlignmentsY; - - // Check if we can align/snap to a specific point - auto &&CheckAlignment = [&](CPoint *pQuadPoint) { - int DX = pQuadPoint->x - Point.x; - int DY = pQuadPoint->y - Point.y; - int DiffX = absolute(DX); - int DiffY = absolute(DY); - - if(DiffX <= Threshold && (!GridEnabled || DiffX == 0)) - { - // Only store alignments that have the smallest difference - if(DiffX < SmallestDiffX) - { - vAlignmentsX.clear(); - SmallestDiffX = DiffX; - } - - // We can have multiple alignments having the same difference/distance - if(DiffX == SmallestDiffX) - { - vAlignmentsX.push_back(SAlignmentInfo{ - *pQuadPoint, // Aligned point - {OrigPoint.y}, // Value that can change (which is not snapped), original position - EAxis::AXIS_Y, // The alignment axis - PointIndex, // The index of the point - DX, - }); - } - } - - if(DiffY <= Threshold && (!GridEnabled || DiffY == 0)) - { - // Only store alignments that have the smallest difference - if(DiffY < SmallestDiffY) - { - vAlignmentsY.clear(); - SmallestDiffY = DiffY; - } - - if(DiffY == SmallestDiffY) - { - vAlignmentsY.push_back(SAlignmentInfo{ - *pQuadPoint, - {OrigPoint.x}, - EAxis::AXIS_X, - PointIndex, - DY, - }); - } - } - }; - - // Iterate through all the quads of the current layer - // Check alignment with each point of the quad (corners & pivot) - // Compute an AABB (Axis Aligned Bounding Box) to get the center of the quad - // Check alignment with the center of the quad - for(size_t i = 0; i < pLayer->m_vQuads.size(); i++) - { - auto *pCurrentQuad = &pLayer->m_vQuads[i]; - CPoint Min = pCurrentQuad->m_aPoints[0]; - CPoint Max = pCurrentQuad->m_aPoints[0]; - - for(int v = 0; v < 5; v++) - { - CPoint *pQuadPoint = &pCurrentQuad->m_aPoints[v]; - - if(v != 4) - { // Don't use pivot to compute AABB - if(pQuadPoint->x < Min.x) - Min.x = pQuadPoint->x; - if(pQuadPoint->y < Min.y) - Min.y = pQuadPoint->y; - if(pQuadPoint->x > Max.x) - Max.x = pQuadPoint->x; - if(pQuadPoint->y > Max.y) - Max.y = pQuadPoint->y; - } - - // Don't check alignment with current point - if(pQuadPoint == &pQuad->m_aPoints[PointIndex]) - continue; - - // Don't check alignment with other selected points - bool IsCurrentPointSelected = IsQuadSelected(i) && (IsQuadCornerSelected(v) || (v == PointIndex && PointIndex == 4)); - if(IsCurrentPointSelected) - continue; - - CheckAlignment(pQuadPoint); - } - - // Don't check alignment with center of selected quads - if(!IsQuadSelected(i)) - { - CPoint Center = (Min + Max) / 2.0f; - CheckAlignment(&Center); - } - } - - // Finally concatenate both alignment vectors into the output - vAlignments.reserve(vAlignmentsX.size() + vAlignmentsY.size()); - vAlignments.insert(vAlignments.end(), vAlignmentsX.begin(), vAlignmentsX.end()); - vAlignments.insert(vAlignments.end(), vAlignmentsY.begin(), vAlignmentsY.end()); -} - -void CEditor::ComputePointsAlignments(const std::shared_ptr &pLayer, bool Pivot, int OffsetX, int OffsetY, std::vector &vAlignments) const -{ - // This method is used to compute alignments from selected points - // and only apply the closest alignment on X and Y to the offset. - - vAlignments.clear(); - std::vector vAllAlignments; - - for(int Selected : m_vSelectedQuads) - { - CQuad *pQuad = &pLayer->m_vQuads[Selected]; - - if(!Pivot) - { - for(int m = 0; m < 4; m++) - { - if(IsQuadPointSelected(Selected, m)) - { - ComputePointAlignments(pLayer, pQuad, Selected, m, OffsetX, OffsetY, vAllAlignments, true); - } - } - } - else - { - ComputePointAlignments(pLayer, pQuad, Selected, 4, OffsetX, OffsetY, vAllAlignments, true); - } - } - - int SmallestDiffX, SmallestDiffY; - SmallestDiffX = SmallestDiffY = std::numeric_limits::max(); - - std::vector vAlignmentsX, vAlignmentsY; - - for(const auto &Alignment : vAllAlignments) - { - int AbsDiff = absolute(Alignment.m_Diff); - if(Alignment.m_Axis == EAxis::AXIS_X) - { - if(AbsDiff < SmallestDiffY) - { - SmallestDiffY = AbsDiff; - vAlignmentsY.clear(); - } - if(AbsDiff == SmallestDiffY) - vAlignmentsY.emplace_back(Alignment); - } - else if(Alignment.m_Axis == EAxis::AXIS_Y) - { - if(AbsDiff < SmallestDiffX) - { - SmallestDiffX = AbsDiff; - vAlignmentsX.clear(); - } - if(AbsDiff == SmallestDiffX) - vAlignmentsX.emplace_back(Alignment); - } - } - - vAlignments.reserve(vAlignmentsX.size() + vAlignmentsY.size()); - vAlignments.insert(vAlignments.end(), vAlignmentsX.begin(), vAlignmentsX.end()); - vAlignments.insert(vAlignments.end(), vAlignmentsY.begin(), vAlignmentsY.end()); -} - -void CEditor::ComputeAABBAlignments(const std::shared_ptr &pLayer, const SAxisAlignedBoundingBox &AABB, int OffsetX, int OffsetY, std::vector &vAlignments) const -{ - vAlignments.clear(); - if(!g_Config.m_EdAlignQuads) - return; - - // This method is a bit different than the point alignment in the way where instead of trying to aling 1 point to all quads, - // we try to align 5 points to all quads, these 5 points being 5 points of an AABB. - // Otherwise, the concept is the same, we use the original position of the AABB to make the computations. - int Threshold = f2fx(maximum(5.0f, 10.0f * m_MouseWorldScale)); - int SmallestDiffX = Threshold + 1, SmallestDiffY = Threshold + 1; - std::vector vAlignmentsX, vAlignmentsY; - - bool GridEnabled = MapView()->MapGrid()->IsEnabled() && !Input()->AltIsPressed(); - - auto &&CheckAlignment = [&](CPoint &Aligned, int Point) { - CPoint ToCheck = AABB.m_aPoints[Point] + ivec2(OffsetX, OffsetY); - int DX = Aligned.x - ToCheck.x; - int DY = Aligned.y - ToCheck.y; - int DiffX = absolute(DX); - int DiffY = absolute(DY); - - if(DiffX <= Threshold && (!GridEnabled || DiffX == 0)) - { - if(DiffX < SmallestDiffX) - { - SmallestDiffX = DiffX; - vAlignmentsX.clear(); - } - - if(DiffX == SmallestDiffX) - { - vAlignmentsX.push_back(SAlignmentInfo{ - Aligned, - {AABB.m_aPoints[Point].y}, - EAxis::AXIS_Y, - Point, - DX, - }); - } - } - - if(DiffY <= Threshold && (!GridEnabled || DiffY == 0)) - { - if(DiffY < SmallestDiffY) - { - SmallestDiffY = DiffY; - vAlignmentsY.clear(); - } - - if(DiffY == SmallestDiffY) - { - vAlignmentsY.push_back(SAlignmentInfo{ - Aligned, - {AABB.m_aPoints[Point].x}, - EAxis::AXIS_X, - Point, - DY, - }); - } - } - }; - - auto &&CheckAABBAlignment = [&](CPoint &QuadMin, CPoint &QuadMax) { - CPoint QuadCenter = (QuadMin + QuadMax) / 2.0f; - CPoint aQuadPoints[5] = { - QuadMin, // Top left - {QuadMax.x, QuadMin.y}, // Top right - {QuadMin.x, QuadMax.y}, // Bottom left - QuadMax, // Bottom right - QuadCenter, - }; - - // Check all points with all the other points - for(auto &QuadPoint : aQuadPoints) - { - // i is the quad point which is "aligned" and that we want to compare with - for(int j = 0; j < 5; j++) - { - // j is the point we try to align - CheckAlignment(QuadPoint, j); - } - } - }; - - // Iterate through all quads of the current layer - // Compute AABB of all quads and check if the dragged AABB can be aligned to this AABB. - for(size_t i = 0; i < pLayer->m_vQuads.size(); i++) - { - auto *pCurrentQuad = &pLayer->m_vQuads[i]; - if(IsQuadSelected(i)) // Don't check with other selected quads - continue; - - // Get AABB of this quad - CPoint QuadMin = pCurrentQuad->m_aPoints[0], QuadMax = pCurrentQuad->m_aPoints[0]; - for(int v = 1; v < 4; v++) - { - QuadMin.x = minimum(QuadMin.x, pCurrentQuad->m_aPoints[v].x); - QuadMin.y = minimum(QuadMin.y, pCurrentQuad->m_aPoints[v].y); - QuadMax.x = maximum(QuadMax.x, pCurrentQuad->m_aPoints[v].x); - QuadMax.y = maximum(QuadMax.y, pCurrentQuad->m_aPoints[v].y); - } - - CheckAABBAlignment(QuadMin, QuadMax); - } - - // Finally, concatenate both alignment vectors into the output - vAlignments.reserve(vAlignmentsX.size() + vAlignmentsY.size()); - vAlignments.insert(vAlignments.end(), vAlignmentsX.begin(), vAlignmentsX.end()); - vAlignments.insert(vAlignments.end(), vAlignmentsY.begin(), vAlignmentsY.end()); -} - -void CEditor::DrawPointAlignments(const std::vector &vAlignments, int OffsetX, int OffsetY) const -{ - if(!g_Config.m_EdAlignQuads) - return; - - // Drawing an alignment is easy, we convert fixed to float for the aligned point coords - // and we also convert the "changing" value after applying the offset (which might be edited to actually align the value with the alignment). - Graphics()->SetColor(1, 0, 0.1f, 1); - for(const SAlignmentInfo &Alignment : vAlignments) - { - // We don't use IGraphics::CLineItem to draw because we don't want to stop QuadsBegin(), quads work just fine. - if(Alignment.m_Axis == EAxis::AXIS_X) - { // Alignment on X axis is same Y values but different X values - IGraphics::CQuadItem Line(fx2f(Alignment.m_AlignedPoint.x), fx2f(Alignment.m_AlignedPoint.y), fx2f(Alignment.m_X + OffsetX - Alignment.m_AlignedPoint.x), 1.0f * m_MouseWorldScale); - Graphics()->QuadsDrawTL(&Line, 1); - } - else if(Alignment.m_Axis == EAxis::AXIS_Y) - { // Alignment on Y axis is same X values but different Y values - IGraphics::CQuadItem Line(fx2f(Alignment.m_AlignedPoint.x), fx2f(Alignment.m_AlignedPoint.y), 1.0f * m_MouseWorldScale, fx2f(Alignment.m_Y + OffsetY - Alignment.m_AlignedPoint.y)); - Graphics()->QuadsDrawTL(&Line, 1); - } - } -} - -void CEditor::DrawAABB(const SAxisAlignedBoundingBox &AABB, int OffsetX, int OffsetY) const -{ - // Drawing an AABB is simply converting the points from fixed to float - // Then making lines out of quads and drawing them - vec2 TL = {fx2f(AABB.m_aPoints[SAxisAlignedBoundingBox::POINT_TL].x + OffsetX), fx2f(AABB.m_aPoints[SAxisAlignedBoundingBox::POINT_TL].y + OffsetY)}; - vec2 TR = {fx2f(AABB.m_aPoints[SAxisAlignedBoundingBox::POINT_TR].x + OffsetX), fx2f(AABB.m_aPoints[SAxisAlignedBoundingBox::POINT_TR].y + OffsetY)}; - vec2 BL = {fx2f(AABB.m_aPoints[SAxisAlignedBoundingBox::POINT_BL].x + OffsetX), fx2f(AABB.m_aPoints[SAxisAlignedBoundingBox::POINT_BL].y + OffsetY)}; - vec2 BR = {fx2f(AABB.m_aPoints[SAxisAlignedBoundingBox::POINT_BR].x + OffsetX), fx2f(AABB.m_aPoints[SAxisAlignedBoundingBox::POINT_BR].y + OffsetY)}; - vec2 Center = {fx2f(AABB.m_aPoints[SAxisAlignedBoundingBox::POINT_CENTER].x + OffsetX), fx2f(AABB.m_aPoints[SAxisAlignedBoundingBox::POINT_CENTER].y + OffsetY)}; - - // We don't use IGraphics::CLineItem to draw because we don't want to stop QuadsBegin(), quads work just fine. - IGraphics::CQuadItem Lines[4] = { - {TL.x, TL.y, TR.x - TL.x, 1.0f * m_MouseWorldScale}, - {TL.x, TL.y, 1.0f * m_MouseWorldScale, BL.y - TL.y}, - {TR.x, TR.y, 1.0f * m_MouseWorldScale, BR.y - TR.y}, - {BL.x, BL.y, BR.x - BL.x, 1.0f * m_MouseWorldScale}, - }; - Graphics()->SetColor(1, 0, 1, 1); - Graphics()->QuadsDrawTL(Lines, 4); - - IGraphics::CQuadItem CenterQuad(Center.x, Center.y, 5.0f * m_MouseWorldScale, 5.0f * m_MouseWorldScale); - Graphics()->QuadsDraw(&CenterQuad, 1); -} - -void CEditor::QuadSelectionAABB(const std::shared_ptr &pLayer, SAxisAlignedBoundingBox &OutAABB) -{ - // Compute an englobing AABB of the current selection of quads - CPoint Min{ - std::numeric_limits::max(), - std::numeric_limits::max(), - }; - CPoint Max{ - std::numeric_limits::min(), - std::numeric_limits::min(), - }; - for(int Selected : m_vSelectedQuads) - { - CQuad *pQuad = &pLayer->m_vQuads[Selected]; - for(int i = 0; i < 4; i++) - { - auto *pPoint = &pQuad->m_aPoints[i]; - Min.x = minimum(Min.x, pPoint->x); - Min.y = minimum(Min.y, pPoint->y); - Max.x = maximum(Max.x, pPoint->x); - Max.y = maximum(Max.y, pPoint->y); - } - } - CPoint Center = (Min + Max) / 2.0f; - CPoint aPoints[SAxisAlignedBoundingBox::NUM_POINTS] = { - Min, // Top left - {Max.x, Min.y}, // Top right - {Min.x, Max.y}, // Bottom left - Max, // Bottom right - Center, - }; - mem_copy(OutAABB.m_aPoints, aPoints, sizeof(CPoint) * SAxisAlignedBoundingBox::NUM_POINTS); -} - -void CEditor::ApplyAlignments(const std::vector &vAlignments, int &OffsetX, int &OffsetY) -{ - if(vAlignments.empty()) - return; - - // Find X and Y aligment - const int *pAlignedX = nullptr; - const int *pAlignedY = nullptr; - - // To Find the alignments we simply iterate through the vector of alignments and find the first - // X and Y alignments. - // Then, we use the saved m_Diff to adjust the offset - int AdjustX = 0, AdjustY = 0; - for(const SAlignmentInfo &Alignment : vAlignments) - { - if(Alignment.m_Axis == EAxis::AXIS_X && !pAlignedY) - { - pAlignedY = &Alignment.m_AlignedPoint.y; - AdjustY = Alignment.m_Diff; - } - else if(Alignment.m_Axis == EAxis::AXIS_Y && !pAlignedX) - { - pAlignedX = &Alignment.m_AlignedPoint.x; - AdjustX = Alignment.m_Diff; - } - } - - // Adjust offset - OffsetX += AdjustX; - OffsetY += AdjustY; -} - -void CEditor::ApplyAxisAlignment(int &OffsetX, int &OffsetY) const -{ - // This is used to preserve axis alignment when pressing `Shift` - // Should be called before any other computation - EAxis Axis = GetDragAxis(OffsetX, OffsetY); - OffsetX = ((Axis == EAxis::AXIS_NONE || Axis == EAxis::AXIS_X) ? OffsetX : 0); - OffsetY = ((Axis == EAxis::AXIS_NONE || Axis == EAxis::AXIS_Y) ? OffsetY : 0); -} - -void CEditor::DoQuad(int LayerIndex, const std::shared_ptr &pLayer, CQuad *pQuad, int Index) -{ - enum - { - OP_NONE = 0, - OP_SELECT, - OP_MOVE_ALL, - OP_MOVE_PIVOT, - OP_ROTATE, - OP_CONTEXT_MENU, - OP_DELETE, - }; - - // some basic values - void *pId = &pQuad->m_aPoints[4]; // use pivot addr as id - static std::vector> s_vvRotatePoints; - static int s_Operation = OP_NONE; - static float s_MouseXStart = 0.0f; - static float s_MouseYStart = 0.0f; - static float s_RotateAngle = 0; - float wx = Ui()->MouseWorldX(); - float wy = Ui()->MouseWorldY(); - static CPoint s_OriginalPosition; - static std::vector s_PivotAlignments; // Alignments per pivot per quad - static std::vector s_vAABBAlignments; // Alignments for one AABB (single quad or selection of multiple quads) - static SAxisAlignedBoundingBox s_SelectionAABB; // Selection AABB - static ivec2 s_LastOffset; // Last offset, stored as static so we can use it to draw every frame - - // get pivot - float CenterX = fx2f(pQuad->m_aPoints[4].x); - float CenterY = fx2f(pQuad->m_aPoints[4].y); - - const bool IgnoreGrid = Input()->AltIsPressed(); - - auto &&GetDragOffset = [&]() -> ivec2 { - float x = wx; - float y = wy; - if(MapView()->MapGrid()->IsEnabled() && !IgnoreGrid) - MapView()->MapGrid()->SnapToGrid(x, y); - - int OffsetX = f2fx(x) - s_OriginalPosition.x; - int OffsetY = f2fx(y) - s_OriginalPosition.y; - - return {OffsetX, OffsetY}; - }; - - // draw selection background - if(IsQuadSelected(Index)) - { - Graphics()->SetColor(0, 0, 0, 1); - IGraphics::CQuadItem QuadItem(CenterX, CenterY, 7.0f * m_MouseWorldScale, 7.0f * m_MouseWorldScale); - Graphics()->QuadsDraw(&QuadItem, 1); - } - - if(Ui()->CheckActiveItem(pId)) - { - if(m_MouseDeltaWorld != vec2(0.0f, 0.0f)) - { - if(s_Operation == OP_SELECT) - { - float x = s_MouseXStart - Ui()->MouseX(); - float y = s_MouseYStart - Ui()->MouseY(); - - if(x * x + y * y > 20.0f) - { - if(!IsQuadSelected(Index)) - SelectQuad(Index); - - s_OriginalPosition = pQuad->m_aPoints[4]; - - if(Input()->ShiftIsPressed()) - { - s_Operation = OP_MOVE_PIVOT; - // When moving, we need to save the original position of all selected pivots - for(int Selected : m_vSelectedQuads) - { - CQuad *pCurrentQuad = &pLayer->m_vQuads[Selected]; - PreparePointDrag(pLayer, pCurrentQuad, Selected, 4); - } - } - else - { - s_Operation = OP_MOVE_ALL; - // When moving, we need to save the original position of all selected quads points - for(int Selected : m_vSelectedQuads) - { - CQuad *pCurrentQuad = &pLayer->m_vQuads[Selected]; - for(size_t v = 0; v < 5; v++) - PreparePointDrag(pLayer, pCurrentQuad, Selected, v); - } - // And precompute AABB of selection since it will not change during drag - if(g_Config.m_EdAlignQuads) - QuadSelectionAABB(pLayer, s_SelectionAABB); - } - } - } - - // check if we only should move pivot - if(s_Operation == OP_MOVE_PIVOT) - { - m_QuadTracker.BeginQuadTrack(pLayer, m_vSelectedQuads, -1, LayerIndex); - - s_LastOffset = GetDragOffset(); // Update offset - ApplyAxisAlignment(s_LastOffset.x, s_LastOffset.y); // Apply axis alignment to the offset - - ComputePointsAlignments(pLayer, true, s_LastOffset.x, s_LastOffset.y, s_PivotAlignments); - ApplyAlignments(s_PivotAlignments, s_LastOffset.x, s_LastOffset.y); - - for(auto &Selected : m_vSelectedQuads) - { - CQuad *pCurrentQuad = &pLayer->m_vQuads[Selected]; - DoPointDrag(pLayer, pCurrentQuad, Selected, 4, s_LastOffset.x, s_LastOffset.y); - } - } - else if(s_Operation == OP_MOVE_ALL) - { - m_QuadTracker.BeginQuadTrack(pLayer, m_vSelectedQuads, -1, LayerIndex); - - // Compute drag offset - s_LastOffset = GetDragOffset(); - ApplyAxisAlignment(s_LastOffset.x, s_LastOffset.y); - - // Then compute possible alignments with the selection AABB - ComputeAABBAlignments(pLayer, s_SelectionAABB, s_LastOffset.x, s_LastOffset.y, s_vAABBAlignments); - // Apply alignments before drag - ApplyAlignments(s_vAABBAlignments, s_LastOffset.x, s_LastOffset.y); - // Then do the drag - for(int Selected : m_vSelectedQuads) - { - CQuad *pCurrentQuad = &pLayer->m_vQuads[Selected]; - for(int v = 0; v < 5; v++) - DoPointDrag(pLayer, pCurrentQuad, Selected, v, s_LastOffset.x, s_LastOffset.y); - } - } - else if(s_Operation == OP_ROTATE) - { - m_QuadTracker.BeginQuadTrack(pLayer, m_vSelectedQuads, -1, LayerIndex); - - for(size_t i = 0; i < m_vSelectedQuads.size(); ++i) - { - CQuad *pCurrentQuad = &pLayer->m_vQuads[m_vSelectedQuads[i]]; - for(int v = 0; v < 4; v++) - { - pCurrentQuad->m_aPoints[v] = s_vvRotatePoints[i][v]; - Rotate(&pCurrentQuad->m_aPoints[4], &pCurrentQuad->m_aPoints[v], s_RotateAngle); - } - } - - s_RotateAngle += Ui()->MouseDeltaX() * (Input()->ShiftIsPressed() ? 0.0001f : 0.002f); - } - } - - // Draw axis and aligments when moving - if(s_Operation == OP_MOVE_PIVOT || s_Operation == OP_MOVE_ALL) - { - EAxis Axis = GetDragAxis(s_LastOffset.x, s_LastOffset.y); - DrawAxis(Axis, s_OriginalPosition, pQuad->m_aPoints[4]); - - str_copy(m_aTooltip, "Hold shift to keep alignment on one axis."); - } - - if(s_Operation == OP_MOVE_PIVOT) - DrawPointAlignments(s_PivotAlignments, s_LastOffset.x, s_LastOffset.y); - - if(s_Operation == OP_MOVE_ALL) - { - DrawPointAlignments(s_vAABBAlignments, s_LastOffset.x, s_LastOffset.y); - - if(g_Config.m_EdShowQuadsRect) - DrawAABB(s_SelectionAABB, s_LastOffset.x, s_LastOffset.y); - } - - if(s_Operation == OP_CONTEXT_MENU) - { - if(!Ui()->MouseButton(1)) - { - if(m_vSelectedLayers.size() == 1) - { - m_SelectedQuadIndex = FindSelectedQuadIndex(Index); - - static SPopupMenuId s_PopupQuadId; - Ui()->DoPopupMenu(&s_PopupQuadId, Ui()->MouseX(), Ui()->MouseY(), 120, 222, this, PopupQuad); - Ui()->DisableMouseLock(); - } - s_Operation = OP_NONE; - Ui()->SetActiveItem(nullptr); - } - } - else if(s_Operation == OP_DELETE) - { - if(!Ui()->MouseButton(1)) - { - if(m_vSelectedLayers.size() == 1) - { - Ui()->DisableMouseLock(); - m_Map.OnModify(); - DeleteSelectedQuads(); - } - s_Operation = OP_NONE; - Ui()->SetActiveItem(nullptr); - } - } - else if(s_Operation == OP_ROTATE) - { - if(Ui()->MouseButton(0)) - { - Ui()->DisableMouseLock(); - s_Operation = OP_NONE; - Ui()->SetActiveItem(nullptr); - m_QuadTracker.EndQuadTrack(); - } - else if(Ui()->MouseButton(1)) - { - Ui()->DisableMouseLock(); - s_Operation = OP_NONE; - Ui()->SetActiveItem(nullptr); - - // Reset points to old position - for(size_t i = 0; i < m_vSelectedQuads.size(); ++i) - { - CQuad *pCurrentQuad = &pLayer->m_vQuads[m_vSelectedQuads[i]]; - for(int v = 0; v < 4; v++) - pCurrentQuad->m_aPoints[v] = s_vvRotatePoints[i][v]; - } - } - } - else - { - if(!Ui()->MouseButton(0)) - { - if(s_Operation == OP_SELECT) - { - if(Input()->ShiftIsPressed()) - ToggleSelectQuad(Index); - else - SelectQuad(Index); - } - else if(s_Operation == OP_MOVE_PIVOT || s_Operation == OP_MOVE_ALL) - { - m_QuadTracker.EndQuadTrack(); - } - - Ui()->DisableMouseLock(); - s_Operation = OP_NONE; - Ui()->SetActiveItem(nullptr); - - s_LastOffset = ivec2(); - s_OriginalPosition = ivec2(); - s_vAABBAlignments.clear(); - s_PivotAlignments.clear(); - } - } - - Graphics()->SetColor(1, 1, 1, 1); - } - else if(Input()->KeyPress(KEY_R) && !m_vSelectedQuads.empty() && m_Dialog == DIALOG_NONE) - { - Ui()->EnableMouseLock(pId); - Ui()->SetActiveItem(pId); - s_Operation = OP_ROTATE; - s_RotateAngle = 0; - - s_vvRotatePoints.clear(); - s_vvRotatePoints.resize(m_vSelectedQuads.size()); - for(size_t i = 0; i < m_vSelectedQuads.size(); ++i) - { - CQuad *pCurrentQuad = &pLayer->m_vQuads[m_vSelectedQuads[i]]; - - s_vvRotatePoints[i].resize(4); - s_vvRotatePoints[i][0] = pCurrentQuad->m_aPoints[0]; - s_vvRotatePoints[i][1] = pCurrentQuad->m_aPoints[1]; - s_vvRotatePoints[i][2] = pCurrentQuad->m_aPoints[2]; - s_vvRotatePoints[i][3] = pCurrentQuad->m_aPoints[3]; - } - } - else if(Ui()->HotItem() == pId) - { - ms_pUiGotContext = pId; - - Graphics()->SetColor(1, 1, 1, 1); - str_copy(m_aTooltip, "Left mouse button to move. Hold shift to move pivot. Hold alt to ignore grid. Hold shift and right click to delete."); - - if(Ui()->MouseButton(0)) - { - Ui()->SetActiveItem(pId); - - s_MouseXStart = Ui()->MouseX(); - s_MouseYStart = Ui()->MouseY(); - - s_Operation = OP_SELECT; - } - else if(Ui()->MouseButtonClicked(1)) - { - if(Input()->ShiftIsPressed()) - { - s_Operation = OP_DELETE; - - if(!IsQuadSelected(Index)) - SelectQuad(Index); - - Ui()->SetActiveItem(pId); - } - else - { - s_Operation = OP_CONTEXT_MENU; - - if(!IsQuadSelected(Index)) - SelectQuad(Index); - - Ui()->SetActiveItem(pId); - } - } - } - else - Graphics()->SetColor(0, 1, 0, 1); - - IGraphics::CQuadItem QuadItem(CenterX, CenterY, 5.0f * m_MouseWorldScale, 5.0f * m_MouseWorldScale); - Graphics()->QuadsDraw(&QuadItem, 1); -} - -void CEditor::DoQuadPoint(int LayerIndex, const std::shared_ptr &pLayer, CQuad *pQuad, int QuadIndex, int V) -{ - void *pId = &pQuad->m_aPoints[V]; - - float wx = Ui()->MouseWorldX(); - float wy = Ui()->MouseWorldY(); - - float px = fx2f(pQuad->m_aPoints[V].x); - float py = fx2f(pQuad->m_aPoints[V].y); - - // draw selection background - if(IsQuadPointSelected(QuadIndex, V)) - { - Graphics()->SetColor(0, 0, 0, 1); - IGraphics::CQuadItem QuadItem(px, py, 7.0f * m_MouseWorldScale, 7.0f * m_MouseWorldScale); - Graphics()->QuadsDraw(&QuadItem, 1); - } - - enum - { - OP_NONE = 0, - OP_SELECT, - OP_MOVEPOINT, - OP_MOVEUV, - OP_CONTEXT_MENU - }; - - static int s_Operation = OP_NONE; - static float s_MouseXStart = 0.0f; - static float s_MouseYStart = 0.0f; - static CPoint s_OriginalPoint; - static std::vector s_Alignments; // Alignments - static ivec2 s_LastOffset; - - const bool IgnoreGrid = Input()->AltIsPressed(); - - auto &&GetDragOffset = [&]() -> ivec2 { - float x = wx; - float y = wy; - if(MapView()->MapGrid()->IsEnabled() && !IgnoreGrid) - MapView()->MapGrid()->SnapToGrid(x, y); - - int OffsetX = f2fx(x) - s_OriginalPoint.x; - int OffsetY = f2fx(y) - s_OriginalPoint.y; - - return {OffsetX, OffsetY}; - }; - - if(Ui()->CheckActiveItem(pId)) - { - if(m_MouseDeltaWorld != vec2(0.0f, 0.0f)) - { - if(s_Operation == OP_SELECT) - { - float x = s_MouseXStart - Ui()->MouseX(); - float y = s_MouseYStart - Ui()->MouseY(); - - if(x * x + y * y > 20.0f) - { - if(!IsQuadPointSelected(QuadIndex, V)) - SelectQuadPoint(QuadIndex, V); - - if(Input()->ShiftIsPressed()) - { - s_Operation = OP_MOVEUV; - Ui()->EnableMouseLock(pId); - } - else - { - s_Operation = OP_MOVEPOINT; - // Save original positions before moving - s_OriginalPoint = pQuad->m_aPoints[V]; - for(int Selected : m_vSelectedQuads) - { - for(int m = 0; m < 4; m++) - if(IsQuadPointSelected(Selected, m)) - PreparePointDrag(pLayer, &pLayer->m_vQuads[Selected], Selected, m); - } - } - } - } - - if(s_Operation == OP_MOVEPOINT) - { - m_QuadTracker.BeginQuadTrack(pLayer, m_vSelectedQuads, -1, LayerIndex); - - s_LastOffset = GetDragOffset(); // Update offset - ApplyAxisAlignment(s_LastOffset.x, s_LastOffset.y); // Apply axis alignment to offset - - ComputePointsAlignments(pLayer, false, s_LastOffset.x, s_LastOffset.y, s_Alignments); - ApplyAlignments(s_Alignments, s_LastOffset.x, s_LastOffset.y); - - for(int Selected : m_vSelectedQuads) - { - for(int m = 0; m < 4; m++) - { - if(IsQuadPointSelected(Selected, m)) - { - DoPointDrag(pLayer, &pLayer->m_vQuads[Selected], Selected, m, s_LastOffset.x, s_LastOffset.y); - } - } - } - } - else if(s_Operation == OP_MOVEUV) - { - int SelectedPoints = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3); - - m_QuadTracker.BeginQuadPointPropTrack(pLayer, m_vSelectedQuads, SelectedPoints, -1, LayerIndex); - m_QuadTracker.AddQuadPointPropTrack(EQuadPointProp::PROP_TEX_U); - m_QuadTracker.AddQuadPointPropTrack(EQuadPointProp::PROP_TEX_V); - - for(int Selected : m_vSelectedQuads) - { - CQuad *pSelectedQuad = &pLayer->m_vQuads[Selected]; - for(int m = 0; m < 4; m++) - { - if(IsQuadPointSelected(Selected, m)) - { - // 0,2;1,3 - line x - // 0,1;2,3 - line y - - pSelectedQuad->m_aTexcoords[m].x += f2fx(m_MouseDeltaWorld.x * 0.001f); - pSelectedQuad->m_aTexcoords[(m + 2) % 4].x += f2fx(m_MouseDeltaWorld.x * 0.001f); - - pSelectedQuad->m_aTexcoords[m].y += f2fx(m_MouseDeltaWorld.y * 0.001f); - pSelectedQuad->m_aTexcoords[m ^ 1].y += f2fx(m_MouseDeltaWorld.y * 0.001f); - } - } - } - } - } - - // Draw axis and alignments when dragging - if(s_Operation == OP_MOVEPOINT) - { - Graphics()->SetColor(1, 0, 0.1f, 1); - - // Axis - EAxis Axis = GetDragAxis(s_LastOffset.x, s_LastOffset.y); - DrawAxis(Axis, s_OriginalPoint, pQuad->m_aPoints[V]); - - // Alignments - DrawPointAlignments(s_Alignments, s_LastOffset.x, s_LastOffset.y); - - str_copy(m_aTooltip, "Hold shift to keep alignment on one axis."); - } - - if(s_Operation == OP_CONTEXT_MENU) - { - if(!Ui()->MouseButton(1)) - { - if(m_vSelectedLayers.size() == 1) - { - if(!IsQuadSelected(QuadIndex)) - SelectQuad(QuadIndex); - - m_SelectedQuadPoint = V; - m_SelectedQuadIndex = FindSelectedQuadIndex(QuadIndex); - - static SPopupMenuId s_PopupPointId; - Ui()->DoPopupMenu(&s_PopupPointId, Ui()->MouseX(), Ui()->MouseY(), 120, 75, this, PopupPoint); - } - Ui()->SetActiveItem(nullptr); - } - } - else - { - if(!Ui()->MouseButton(0)) - { - if(s_Operation == OP_SELECT) - { - if(Input()->ShiftIsPressed()) - ToggleSelectQuadPoint(QuadIndex, V); - else - SelectQuadPoint(QuadIndex, V); - } - - if(s_Operation == OP_MOVEPOINT) - { - m_QuadTracker.EndQuadTrack(); - } - else if(s_Operation == OP_MOVEUV) - { - m_QuadTracker.EndQuadPointPropTrackAll(); - } - - Ui()->DisableMouseLock(); - Ui()->SetActiveItem(nullptr); - } - } - - Graphics()->SetColor(1, 1, 1, 1); - } - else if(Ui()->HotItem() == pId) - { - ms_pUiGotContext = pId; - - Graphics()->SetColor(1, 1, 1, 1); - str_copy(m_aTooltip, "Left mouse button to move. Hold shift to move the texture. Hold alt to ignore grid."); - - if(Ui()->MouseButton(0)) - { - Ui()->SetActiveItem(pId); - - s_MouseXStart = Ui()->MouseX(); - s_MouseYStart = Ui()->MouseY(); - - s_Operation = OP_SELECT; - } - else if(Ui()->MouseButton(1)) - { - s_Operation = OP_CONTEXT_MENU; - - Ui()->SetActiveItem(pId); - - if(!IsQuadPointSelected(QuadIndex, V)) - SelectQuadPoint(QuadIndex, V); - } - } - else - Graphics()->SetColor(1, 0, 0, 1); - - IGraphics::CQuadItem QuadItem(px, py, 5.0f * m_MouseWorldScale, 5.0f * m_MouseWorldScale); - Graphics()->QuadsDraw(&QuadItem, 1); -} - -float CEditor::TriangleArea(vec2 A, vec2 B, vec2 C) -{ - return absolute(((B.x - A.x) * (C.y - A.y) - (C.x - A.x) * (B.y - A.y)) * 0.5f); -} - -bool CEditor::IsInTriangle(vec2 Point, vec2 A, vec2 B, vec2 C) -{ - // Normalize to increase precision - vec2 Min(minimum(A.x, B.x, C.x), minimum(A.y, B.y, C.y)); - vec2 Max(maximum(A.x, B.x, C.x), maximum(A.y, B.y, C.y)); - vec2 Size(Max.x - Min.x, Max.y - Min.y); - - if(Size.x < 0.0000001f || Size.y < 0.0000001f) - return false; - - vec2 Normal(1.f / Size.x, 1.f / Size.y); - - A = (A - Min) * Normal; - B = (B - Min) * Normal; - C = (C - Min) * Normal; - Point = (Point - Min) * Normal; - - float Area = TriangleArea(A, B, C); - return Area > 0.f && absolute(TriangleArea(Point, A, B) + TriangleArea(Point, B, C) + TriangleArea(Point, C, A) - Area) < 0.000001f; -} - -void CEditor::DoQuadKnife(int QuadIndex) -{ - std::shared_ptr pLayer = std::static_pointer_cast(GetSelectedLayerType(0, LAYERTYPE_QUADS)); - CQuad *pQuad = &pLayer->m_vQuads[QuadIndex]; - - const bool IgnoreGrid = Input()->AltIsPressed(); - float SnapRadius = 4.f * m_MouseWorldScale; - - vec2 Mouse = vec2(Ui()->MouseWorldX(), Ui()->MouseWorldY()); - vec2 Point = Mouse; - - vec2 v[4] = { - vec2(fx2f(pQuad->m_aPoints[0].x), fx2f(pQuad->m_aPoints[0].y)), - vec2(fx2f(pQuad->m_aPoints[1].x), fx2f(pQuad->m_aPoints[1].y)), - vec2(fx2f(pQuad->m_aPoints[3].x), fx2f(pQuad->m_aPoints[3].y)), - vec2(fx2f(pQuad->m_aPoints[2].x), fx2f(pQuad->m_aPoints[2].y))}; - - str_copy(m_aTooltip, "Left click inside the quad to select an area to slice. Hold alt to ignore grid. Right click to leave knife mode"); - - if(Ui()->MouseButtonClicked(1)) - { - m_QuadKnifeActive = false; - return; - } - - // Handle snapping - if(MapView()->MapGrid()->IsEnabled() && !IgnoreGrid) - { - float CellSize = MapView()->MapGrid()->GridLineDistance(); - vec2 OnGrid(Mouse.x, Mouse.y); - MapView()->MapGrid()->SnapToGrid(OnGrid.x, OnGrid.y); - - if(IsInTriangle(OnGrid, v[0], v[1], v[2]) || IsInTriangle(OnGrid, v[0], v[3], v[2])) - Point = OnGrid; - else - { - float MinDistance = -1.f; - - for(int i = 0; i < 4; i++) - { - int j = (i + 1) % 4; - vec2 Min(minimum(v[i].x, v[j].x), minimum(v[i].y, v[j].y)); - vec2 Max(maximum(v[i].x, v[j].x), maximum(v[i].y, v[j].y)); - - if(in_range(OnGrid.y, Min.y, Max.y) && Max.y - Min.y > 0.0000001f) - { - vec2 OnEdge(v[i].x + (OnGrid.y - v[i].y) / (v[j].y - v[i].y) * (v[j].x - v[i].x), OnGrid.y); - float Distance = absolute(OnGrid.x - OnEdge.x); - - if(Distance < CellSize && (Distance < MinDistance || MinDistance < 0.f)) - { - MinDistance = Distance; - Point = OnEdge; - } - } - - if(in_range(OnGrid.x, Min.x, Max.x) && Max.x - Min.x > 0.0000001f) - { - vec2 OnEdge(OnGrid.x, v[i].y + (OnGrid.x - v[i].x) / (v[j].x - v[i].x) * (v[j].y - v[i].y)); - float Distance = absolute(OnGrid.y - OnEdge.y); - - if(Distance < CellSize && (Distance < MinDistance || MinDistance < 0.f)) - { - MinDistance = Distance; - Point = OnEdge; - } - } - } - } - } - else - { - float MinDistance = -1.f; - - // Try snapping to corners - for(const auto &x : v) - { - float Distance = distance(Mouse, x); - - if(Distance <= SnapRadius && (Distance < MinDistance || MinDistance < 0.f)) - { - MinDistance = Distance; - Point = x; - } - } - - if(MinDistance < 0.f) - { - // Try snapping to edges - for(int i = 0; i < 4; i++) - { - int j = (i + 1) % 4; - vec2 s(v[j] - v[i]); - - float t = ((Mouse.x - v[i].x) * s.x + (Mouse.y - v[i].y) * s.y) / (s.x * s.x + s.y * s.y); - - if(in_range(t, 0.f, 1.f)) - { - vec2 OnEdge = vec2((v[i].x + t * s.x), (v[i].y + t * s.y)); - float Distance = distance(Mouse, OnEdge); - - if(Distance <= SnapRadius && (Distance < MinDistance || MinDistance < 0.f)) - { - MinDistance = Distance; - Point = OnEdge; - } - } - } - } - } - - bool ValidPosition = IsInTriangle(Point, v[0], v[1], v[2]) || IsInTriangle(Point, v[0], v[3], v[2]); - - if(Ui()->MouseButtonClicked(0) && ValidPosition) - { - m_aQuadKnifePoints[m_QuadKnifeCount] = Point; - m_QuadKnifeCount++; - } - - if(m_QuadKnifeCount == 4) - { - if(IsInTriangle(m_aQuadKnifePoints[3], m_aQuadKnifePoints[0], m_aQuadKnifePoints[1], m_aQuadKnifePoints[2]) || - IsInTriangle(m_aQuadKnifePoints[1], m_aQuadKnifePoints[0], m_aQuadKnifePoints[2], m_aQuadKnifePoints[3])) - { - // Fix concave order - std::swap(m_aQuadKnifePoints[0], m_aQuadKnifePoints[3]); - std::swap(m_aQuadKnifePoints[1], m_aQuadKnifePoints[2]); - } - - std::swap(m_aQuadKnifePoints[2], m_aQuadKnifePoints[3]); - - CQuad *pResult = pLayer->NewQuad(64, 64, 64, 64); - pQuad = &pLayer->m_vQuads[QuadIndex]; - - for(int i = 0; i < 4; i++) - { - int t = IsInTriangle(m_aQuadKnifePoints[i], v[0], v[3], v[2]) ? 2 : 1; - - vec2 A = vec2(fx2f(pQuad->m_aPoints[0].x), fx2f(pQuad->m_aPoints[0].y)); - vec2 B = vec2(fx2f(pQuad->m_aPoints[3].x), fx2f(pQuad->m_aPoints[3].y)); - vec2 C = vec2(fx2f(pQuad->m_aPoints[t].x), fx2f(pQuad->m_aPoints[t].y)); - - float TriArea = TriangleArea(A, B, C); - float WeightA = TriangleArea(m_aQuadKnifePoints[i], B, C) / TriArea; - float WeightB = TriangleArea(m_aQuadKnifePoints[i], C, A) / TriArea; - float WeightC = TriangleArea(m_aQuadKnifePoints[i], A, B) / TriArea; - - pResult->m_aColors[i].r = (int)std::round(pQuad->m_aColors[0].r * WeightA + pQuad->m_aColors[3].r * WeightB + pQuad->m_aColors[t].r * WeightC); - pResult->m_aColors[i].g = (int)std::round(pQuad->m_aColors[0].g * WeightA + pQuad->m_aColors[3].g * WeightB + pQuad->m_aColors[t].g * WeightC); - pResult->m_aColors[i].b = (int)std::round(pQuad->m_aColors[0].b * WeightA + pQuad->m_aColors[3].b * WeightB + pQuad->m_aColors[t].b * WeightC); - pResult->m_aColors[i].a = (int)std::round(pQuad->m_aColors[0].a * WeightA + pQuad->m_aColors[3].a * WeightB + pQuad->m_aColors[t].a * WeightC); - - pResult->m_aTexcoords[i].x = (int)std::round(pQuad->m_aTexcoords[0].x * WeightA + pQuad->m_aTexcoords[3].x * WeightB + pQuad->m_aTexcoords[t].x * WeightC); - pResult->m_aTexcoords[i].y = (int)std::round(pQuad->m_aTexcoords[0].y * WeightA + pQuad->m_aTexcoords[3].y * WeightB + pQuad->m_aTexcoords[t].y * WeightC); - - pResult->m_aPoints[i].x = f2fx(m_aQuadKnifePoints[i].x); - pResult->m_aPoints[i].y = f2fx(m_aQuadKnifePoints[i].y); - } - - pResult->m_aPoints[4].x = ((pResult->m_aPoints[0].x + pResult->m_aPoints[3].x) / 2 + (pResult->m_aPoints[1].x + pResult->m_aPoints[2].x) / 2) / 2; - pResult->m_aPoints[4].y = ((pResult->m_aPoints[0].y + pResult->m_aPoints[3].y) / 2 + (pResult->m_aPoints[1].y + pResult->m_aPoints[2].y) / 2) / 2; - - m_QuadKnifeCount = 0; - m_EditorHistory.RecordAction(std::make_shared(this, m_SelectedGroup, m_vSelectedLayers[0])); - } - - // Render - Graphics()->TextureClear(); - Graphics()->LinesBegin(); - - IGraphics::CLineItem aEdges[4] = { - IGraphics::CLineItem(v[0].x, v[0].y, v[1].x, v[1].y), - IGraphics::CLineItem(v[1].x, v[1].y, v[2].x, v[2].y), - IGraphics::CLineItem(v[2].x, v[2].y, v[3].x, v[3].y), - IGraphics::CLineItem(v[3].x, v[3].y, v[0].x, v[0].y)}; - - Graphics()->SetColor(1.f, 0.5f, 0.f, 1.f); - Graphics()->LinesDraw(aEdges, 4); - - IGraphics::CLineItem aLines[4]; - int LineCount = maximum(m_QuadKnifeCount - 1, 0); - - for(int i = 0; i < LineCount; i++) - aLines[i] = IGraphics::CLineItem(m_aQuadKnifePoints[i].x, m_aQuadKnifePoints[i].y, m_aQuadKnifePoints[i + 1].x, m_aQuadKnifePoints[i + 1].y); - - Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); - Graphics()->LinesDraw(aLines, LineCount); - - if(ValidPosition) - { - if(m_QuadKnifeCount > 0) - { - IGraphics::CLineItem LineCurrent(Point.x, Point.y, m_aQuadKnifePoints[m_QuadKnifeCount - 1].x, m_aQuadKnifePoints[m_QuadKnifeCount - 1].y); - Graphics()->LinesDraw(&LineCurrent, 1); - } - - if(m_QuadKnifeCount == 3) - { - IGraphics::CLineItem LineClose(Point.x, Point.y, m_aQuadKnifePoints[0].x, m_aQuadKnifePoints[0].y); - Graphics()->LinesDraw(&LineClose, 1); - } - } - - Graphics()->LinesEnd(); - Graphics()->QuadsBegin(); - - IGraphics::CQuadItem aMarkers[4]; - - for(int i = 0; i < m_QuadKnifeCount; i++) - aMarkers[i] = IGraphics::CQuadItem(m_aQuadKnifePoints[i].x, m_aQuadKnifePoints[i].y, 5.f * m_MouseWorldScale, 5.f * m_MouseWorldScale); - - Graphics()->SetColor(0.f, 0.f, 1.f, 1.f); - Graphics()->QuadsDraw(aMarkers, m_QuadKnifeCount); - - if(ValidPosition) - { - IGraphics::CQuadItem MarkerCurrent(Point.x, Point.y, 5.f * m_MouseWorldScale, 5.f * m_MouseWorldScale); - Graphics()->QuadsDraw(&MarkerCurrent, 1); - } - - Graphics()->QuadsEnd(); -} - -void CEditor::DoQuadEnvelopes(const std::vector &vQuads, IGraphics::CTextureHandle Texture) -{ - size_t Num = vQuads.size(); - std::shared_ptr *apEnvelope = new std::shared_ptr[Num]; - for(size_t i = 0; i < Num; i++) - apEnvelope[i] = nullptr; - - for(size_t i = 0; i < Num; i++) - { - if((m_ShowEnvelopePreview == SHOWENV_SELECTED && vQuads[i].m_PosEnv == m_SelectedEnvelope) || m_ShowEnvelopePreview == SHOWENV_ALL) - if(vQuads[i].m_PosEnv >= 0 && vQuads[i].m_PosEnv < (int)m_Map.m_vpEnvelopes.size()) - apEnvelope[i] = m_Map.m_vpEnvelopes[vQuads[i].m_PosEnv]; - } - - // Draw Lines - Graphics()->TextureClear(); - Graphics()->LinesBegin(); - Graphics()->SetColor(80.0f / 255, 150.0f / 255, 230.f / 255, 0.5f); - for(size_t j = 0; j < Num; j++) - { - if(!apEnvelope[j]) - continue; - - // QuadParams - const CPoint *pPivotPoint = &vQuads[j].m_aPoints[4]; - for(size_t i = 0; i < apEnvelope[j]->m_vPoints.size() - 1; i++) - { - ColorRGBA Result = ColorRGBA(0.0f, 0.0f, 0.0f, 0.0f); - apEnvelope[j]->Eval(apEnvelope[j]->m_vPoints[i].m_Time / 1000.0f + 0.000001f, Result, 2); - vec2 Pos0 = vec2(fx2f(pPivotPoint->x) + Result.r, fx2f(pPivotPoint->y) + Result.g); - - const int Steps = 15; - for(int n = 1; n <= Steps; n++) - { - const float Time = mix(apEnvelope[j]->m_vPoints[i].m_Time, apEnvelope[j]->m_vPoints[i + 1].m_Time, (float)n / Steps); - Result = ColorRGBA(0.0f, 0.0f, 0.0f, 0.0f); - apEnvelope[j]->Eval(Time / 1000.0f - 0.000001f, Result, 2); - - vec2 Pos1 = vec2(fx2f(pPivotPoint->x) + Result.r, fx2f(pPivotPoint->y) + Result.g); - - IGraphics::CLineItem Line = IGraphics::CLineItem(Pos0.x, Pos0.y, Pos1.x, Pos1.y); - Graphics()->LinesDraw(&Line, 1); - - Pos0 = Pos1; - } - } - } - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - Graphics()->LinesEnd(); - - // Draw Quads - Graphics()->TextureSet(Texture); - Graphics()->QuadsBegin(); - - for(size_t j = 0; j < Num; j++) - { - if(!apEnvelope[j]) - continue; - - // QuadParams - const CPoint *pPoints = vQuads[j].m_aPoints; - - for(size_t i = 0; i < apEnvelope[j]->m_vPoints.size(); i++) - { - // Calc Env Position - float OffsetX = fx2f(apEnvelope[j]->m_vPoints[i].m_aValues[0]); - float OffsetY = fx2f(apEnvelope[j]->m_vPoints[i].m_aValues[1]); - float Rot = fx2f(apEnvelope[j]->m_vPoints[i].m_aValues[2]) / 360.0f * pi * 2; - - // Set Colours - float Alpha = (m_SelectedQuadEnvelope == vQuads[j].m_PosEnv && IsEnvPointSelected(i)) ? 0.65f : 0.35f; - IGraphics::CColorVertex aArray[4] = { - IGraphics::CColorVertex(0, vQuads[j].m_aColors[0].r, vQuads[j].m_aColors[0].g, vQuads[j].m_aColors[0].b, Alpha), - IGraphics::CColorVertex(1, vQuads[j].m_aColors[1].r, vQuads[j].m_aColors[1].g, vQuads[j].m_aColors[1].b, Alpha), - IGraphics::CColorVertex(2, vQuads[j].m_aColors[2].r, vQuads[j].m_aColors[2].g, vQuads[j].m_aColors[2].b, Alpha), - IGraphics::CColorVertex(3, vQuads[j].m_aColors[3].r, vQuads[j].m_aColors[3].g, vQuads[j].m_aColors[3].b, Alpha)}; - Graphics()->SetColorVertex(aArray, 4); - - // Rotation - CPoint aRotated[4]; - if(Rot != 0) - { - aRotated[0] = vQuads[j].m_aPoints[0]; - aRotated[1] = vQuads[j].m_aPoints[1]; - aRotated[2] = vQuads[j].m_aPoints[2]; - aRotated[3] = vQuads[j].m_aPoints[3]; - pPoints = aRotated; - - Rotate(&vQuads[j].m_aPoints[4], &aRotated[0], Rot); - Rotate(&vQuads[j].m_aPoints[4], &aRotated[1], Rot); - Rotate(&vQuads[j].m_aPoints[4], &aRotated[2], Rot); - Rotate(&vQuads[j].m_aPoints[4], &aRotated[3], Rot); - } - - // Set Texture Coords - Graphics()->QuadsSetSubsetFree( - fx2f(vQuads[j].m_aTexcoords[0].x), fx2f(vQuads[j].m_aTexcoords[0].y), - fx2f(vQuads[j].m_aTexcoords[1].x), fx2f(vQuads[j].m_aTexcoords[1].y), - fx2f(vQuads[j].m_aTexcoords[2].x), fx2f(vQuads[j].m_aTexcoords[2].y), - fx2f(vQuads[j].m_aTexcoords[3].x), fx2f(vQuads[j].m_aTexcoords[3].y)); - - // Set Quad Coords & Draw - IGraphics::CFreeformItem Freeform( - fx2f(pPoints[0].x) + OffsetX, fx2f(pPoints[0].y) + OffsetY, - fx2f(pPoints[1].x) + OffsetX, fx2f(pPoints[1].y) + OffsetY, - fx2f(pPoints[2].x) + OffsetX, fx2f(pPoints[2].y) + OffsetY, - fx2f(pPoints[3].x) + OffsetX, fx2f(pPoints[3].y) + OffsetY); - Graphics()->QuadsDrawFreeform(&Freeform, 1); - } - } - Graphics()->QuadsEnd(); - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - - // Draw QuadPoints - for(size_t j = 0; j < Num; j++) - { - if(!apEnvelope[j]) - continue; - - for(size_t i = 0; i < apEnvelope[j]->m_vPoints.size(); i++) - DoQuadEnvPoint(&vQuads[j], j, i); - } - Graphics()->QuadsEnd(); - delete[] apEnvelope; -} - -void CEditor::DoQuadEnvPoint(const CQuad *pQuad, int QIndex, int PIndex) -{ - enum - { - OP_NONE = 0, - OP_MOVE, - OP_ROTATE, - }; - - // some basic values - static float s_LastWx = 0; - static float s_LastWy = 0; - static int s_Operation = OP_NONE; - float wx = Ui()->MouseWorldX(); - float wy = Ui()->MouseWorldY(); - std::shared_ptr pEnvelope = m_Map.m_vpEnvelopes[pQuad->m_PosEnv]; - void *pId = &pEnvelope->m_vPoints[PIndex]; - - // get pivot - float CenterX = fx2f(pQuad->m_aPoints[4].x) + fx2f(pEnvelope->m_vPoints[PIndex].m_aValues[0]); - float CenterY = fx2f(pQuad->m_aPoints[4].y) + fx2f(pEnvelope->m_vPoints[PIndex].m_aValues[1]); - - const bool IgnoreGrid = Input()->AltIsPressed(); - - if(Ui()->CheckActiveItem(pId) && m_CurrentQuadIndex == QIndex) - { - if(s_Operation == OP_MOVE) - { - if(MapView()->MapGrid()->IsEnabled() && !IgnoreGrid) - { - float x = wx; - float y = wy; - MapView()->MapGrid()->SnapToGrid(x, y); - pEnvelope->m_vPoints[PIndex].m_aValues[0] = f2fx(x) - pQuad->m_aPoints[4].x; - pEnvelope->m_vPoints[PIndex].m_aValues[1] = f2fx(y) - pQuad->m_aPoints[4].y; - } - else - { - pEnvelope->m_vPoints[PIndex].m_aValues[0] += f2fx(wx - s_LastWx); - pEnvelope->m_vPoints[PIndex].m_aValues[1] += f2fx(wy - s_LastWy); - } - } - else if(s_Operation == OP_ROTATE) - pEnvelope->m_vPoints[PIndex].m_aValues[2] += 10 * Ui()->MouseDeltaX(); - - s_LastWx = wx; - s_LastWy = wy; - - if(!Ui()->MouseButton(0)) - { - Ui()->DisableMouseLock(); - s_Operation = OP_NONE; - Ui()->SetActiveItem(nullptr); - } - - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - } - else if(Ui()->HotItem() == pId && m_CurrentQuadIndex == QIndex) - { - ms_pUiGotContext = pId; - - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - str_copy(m_aTooltip, "Left mouse button to move. Hold ctrl to rotate. Hold alt to ignore grid."); - - if(Ui()->MouseButton(0)) - { - if(Input()->ModifierIsPressed()) - { - Ui()->EnableMouseLock(pId); - s_Operation = OP_ROTATE; - - SelectQuad(QIndex); - } - else - { - s_Operation = OP_MOVE; - - SelectQuad(QIndex); - } - - SelectEnvPoint(PIndex); - m_SelectedQuadEnvelope = pQuad->m_PosEnv; - - Ui()->SetActiveItem(pId); - - s_LastWx = wx; - s_LastWy = wy; - } - else - { - DeselectEnvPoints(); - m_SelectedQuadEnvelope = -1; - } - } - else - Graphics()->SetColor(0.0f, 1.0f, 0.0f, 1.0f); - - IGraphics::CQuadItem QuadItem(CenterX, CenterY, 5.0f * m_MouseWorldScale, 5.0f * m_MouseWorldScale); - Graphics()->QuadsDraw(&QuadItem, 1); -} - -void CEditor::DoMapEditor(CUIRect View) -{ - // render all good stuff - if(!m_ShowPicker) - { - MapView()->RenderMap(); - } - else - { - // fix aspect ratio of the image in the picker - float Max = minimum(View.w, View.h); - View.w = View.h = Max; - } - - const bool Inside = Ui()->MouseInside(&View); - - // fetch mouse position - float wx = Ui()->MouseWorldX(); - float wy = Ui()->MouseWorldY(); - float mx = Ui()->MouseX(); - float my = Ui()->MouseY(); - - static float s_StartWx = 0; - static float s_StartWy = 0; - - enum - { - OP_NONE = 0, - OP_BRUSH_GRAB, - OP_BRUSH_DRAW, - OP_BRUSH_PAINT, - OP_PAN_WORLD, - OP_PAN_EDITOR, - }; - - // remap the screen so it can display the whole tileset - if(m_ShowPicker) - { - CUIRect Screen = *Ui()->Screen(); - float Size = 32.0f * 16.0f; - float w = Size * (Screen.w / View.w); - float h = Size * (Screen.h / View.h); - float x = -(View.x / Screen.w) * w; - float y = -(View.y / Screen.h) * h; - wx = x + w * mx / Screen.w; - wy = y + h * my / Screen.h; - std::shared_ptr pTileLayer = std::static_pointer_cast(GetSelectedLayerType(0, LAYERTYPE_TILES)); - if(pTileLayer) - { - Graphics()->MapScreen(x, y, x + w, y + h); - m_pTilesetPicker->m_Image = pTileLayer->m_Image; - if(m_BrushColorEnabled) - { - m_pTilesetPicker->m_Color = pTileLayer->m_Color; - m_pTilesetPicker->m_Color.a = 255; - } - else - { - m_pTilesetPicker->m_Color = {255, 255, 255, 255}; - } - - m_pTilesetPicker->m_Game = pTileLayer->m_Game; - m_pTilesetPicker->m_Tele = pTileLayer->m_Tele; - m_pTilesetPicker->m_Speedup = pTileLayer->m_Speedup; - m_pTilesetPicker->m_Front = pTileLayer->m_Front; - m_pTilesetPicker->m_Switch = pTileLayer->m_Switch; - m_pTilesetPicker->m_Tune = pTileLayer->m_Tune; - - m_pTilesetPicker->Render(true); - - if(m_ShowTileInfo != SHOW_TILE_OFF) - m_pTilesetPicker->ShowInfo(); - } - else - { - std::shared_ptr pQuadLayer = std::static_pointer_cast(GetSelectedLayerType(0, LAYERTYPE_QUADS)); - if(pQuadLayer) - { - m_pQuadsetPicker->m_Image = pQuadLayer->m_Image; - m_pQuadsetPicker->m_vQuads[0].m_aPoints[0].x = f2fx(View.x); - m_pQuadsetPicker->m_vQuads[0].m_aPoints[0].y = f2fx(View.y); - m_pQuadsetPicker->m_vQuads[0].m_aPoints[1].x = f2fx((View.x + View.w)); - m_pQuadsetPicker->m_vQuads[0].m_aPoints[1].y = f2fx(View.y); - m_pQuadsetPicker->m_vQuads[0].m_aPoints[2].x = f2fx(View.x); - m_pQuadsetPicker->m_vQuads[0].m_aPoints[2].y = f2fx((View.y + View.h)); - m_pQuadsetPicker->m_vQuads[0].m_aPoints[3].x = f2fx((View.x + View.w)); - m_pQuadsetPicker->m_vQuads[0].m_aPoints[3].y = f2fx((View.y + View.h)); - m_pQuadsetPicker->m_vQuads[0].m_aPoints[4].x = f2fx((View.x + View.w / 2)); - m_pQuadsetPicker->m_vQuads[0].m_aPoints[4].y = f2fx((View.y + View.h / 2)); - m_pQuadsetPicker->Render(); - } - } - } - - static int s_Operation = OP_NONE; - - // draw layer borders - std::pair> apEditLayers[128]; - size_t NumEditLayers = 0; - - if(m_ShowPicker && GetSelectedLayer(0) && GetSelectedLayer(0)->m_Type == LAYERTYPE_TILES) - { - apEditLayers[0] = {0, m_pTilesetPicker}; - NumEditLayers++; - } - else if(m_ShowPicker) - { - apEditLayers[0] = {0, m_pQuadsetPicker}; - NumEditLayers++; - } - else - { - // pick a type of layers to edit, preferring Tiles layers. - int EditingType = -1; - for(size_t i = 0; i < m_vSelectedLayers.size(); i++) - { - std::shared_ptr pLayer = GetSelectedLayer(i); - if(pLayer && (EditingType == -1 || pLayer->m_Type == LAYERTYPE_TILES)) - { - EditingType = pLayer->m_Type; - if(EditingType == LAYERTYPE_TILES) - break; - } - } - for(size_t i = 0; i < m_vSelectedLayers.size() && NumEditLayers < 128; i++) - { - apEditLayers[NumEditLayers] = {m_vSelectedLayers[i], GetSelectedLayerType(i, EditingType)}; - if(apEditLayers[NumEditLayers].second) - { - NumEditLayers++; - } - } - - MapView()->RenderGroupBorder(); - MapView()->MapGrid()->OnRender(View); - } - - const bool ShouldPan = Ui()->HotItem() == &m_MapEditorId && ((Input()->ModifierIsPressed() && Ui()->MouseButton(0)) || Ui()->MouseButton(2)); - if(m_pContainerPanned == &m_MapEditorId) - { - // do panning - if(ShouldPan) - { - if(Input()->ShiftIsPressed()) - s_Operation = OP_PAN_EDITOR; - else - s_Operation = OP_PAN_WORLD; - Ui()->SetActiveItem(&m_MapEditorId); - } - else - s_Operation = OP_NONE; - - if(s_Operation == OP_PAN_WORLD) - MapView()->OffsetWorld(-Ui()->MouseDelta() * m_MouseWorldScale); - else if(s_Operation == OP_PAN_EDITOR) - MapView()->OffsetEditor(-Ui()->MouseDelta() * m_MouseWorldScale); - - if(s_Operation == OP_NONE) - m_pContainerPanned = nullptr; - } - - if(Inside) - { - Ui()->SetHotItem(&m_MapEditorId); - - // do global operations like pan and zoom - if(Ui()->CheckActiveItem(nullptr) && (Ui()->MouseButton(0) || Ui()->MouseButton(2))) - { - s_StartWx = wx; - s_StartWy = wy; - - if(ShouldPan && m_pContainerPanned == nullptr) - m_pContainerPanned = &m_MapEditorId; - } - - // brush editing - if(Ui()->HotItem() == &m_MapEditorId) - { - if(m_ShowPicker) - { - std::shared_ptr pLayer = GetSelectedLayer(0); - int Layer; - if(pLayer == m_Map.m_pGameLayer) - Layer = LAYER_GAME; - else if(pLayer == m_Map.m_pFrontLayer) - Layer = LAYER_FRONT; - else if(pLayer == m_Map.m_pSwitchLayer) - Layer = LAYER_SWITCH; - else if(pLayer == m_Map.m_pTeleLayer) - Layer = LAYER_TELE; - else if(pLayer == m_Map.m_pSpeedupLayer) - Layer = LAYER_SPEEDUP; - else if(pLayer == m_Map.m_pTuneLayer) - Layer = LAYER_TUNE; - else - Layer = NUM_LAYERS; - - EExplanation Explanation; - if(m_SelectEntitiesImage == "DDNet") - Explanation = EExplanation::DDNET; - else if(m_SelectEntitiesImage == "FNG") - Explanation = EExplanation::FNG; - else if(m_SelectEntitiesImage == "Race") - Explanation = EExplanation::RACE; - else if(m_SelectEntitiesImage == "Vanilla") - Explanation = EExplanation::VANILLA; - else if(m_SelectEntitiesImage == "blockworlds") - Explanation = EExplanation::BLOCKWORLDS; - else - Explanation = EExplanation::NONE; - - if(Layer != NUM_LAYERS) - { - const char *pExplanation = Explain(Explanation, (int)wx / 32 + (int)wy / 32 * 16, Layer); - if(pExplanation) - str_copy(m_aTooltip, pExplanation); - } - } - else if(m_pBrush->IsEmpty() && GetSelectedLayerType(0, LAYERTYPE_QUADS) != nullptr) - str_copy(m_aTooltip, "Use left mouse button to drag and create a brush. Hold shift to select multiple quads. Press R to rotate selected quads. Use ctrl+right mouse to select layer."); - else if(m_pBrush->IsEmpty()) - { - if(g_Config.m_EdLayerSelector) - str_copy(m_aTooltip, "Use left mouse button to drag and create a brush. Use ctrl+right click to select layer for hovered tile."); - else - str_copy(m_aTooltip, "Use left mouse button to drag and create a brush."); - } - else - str_copy(m_aTooltip, "Use left mouse button to paint with the brush. Right button clears the brush."); - - if(Ui()->CheckActiveItem(&m_MapEditorId)) - { - CUIRect r; - r.x = s_StartWx; - r.y = s_StartWy; - r.w = wx - s_StartWx; - r.h = wy - s_StartWy; - if(r.w < 0) - { - r.x += r.w; - r.w = -r.w; - } - - if(r.h < 0) - { - r.y += r.h; - r.h = -r.h; - } - - if(s_Operation == OP_BRUSH_DRAW) - { - if(!m_pBrush->IsEmpty()) - { - // draw with brush - for(size_t k = 0; k < NumEditLayers; k++) - { - size_t BrushIndex = k % m_pBrush->m_vpLayers.size(); - if(apEditLayers[k].second->m_Type == m_pBrush->m_vpLayers[BrushIndex]->m_Type) - { - if(apEditLayers[k].second->m_Type == LAYERTYPE_TILES) - { - std::shared_ptr pLayer = std::static_pointer_cast(apEditLayers[k].second); - std::shared_ptr pBrushLayer = std::static_pointer_cast(m_pBrush->m_vpLayers[BrushIndex]); - - if(pLayer->m_Tele <= pBrushLayer->m_Tele && pLayer->m_Speedup <= pBrushLayer->m_Speedup && pLayer->m_Front <= pBrushLayer->m_Front && pLayer->m_Game <= pBrushLayer->m_Game && pLayer->m_Switch <= pBrushLayer->m_Switch && pLayer->m_Tune <= pBrushLayer->m_Tune) - pLayer->BrushDraw(pBrushLayer, vec2(wx, wy)); - } - else - { - apEditLayers[k].second->BrushDraw(m_pBrush->m_vpLayers[BrushIndex], vec2(wx, wy)); - } - } - } - } - } - else if(s_Operation == OP_BRUSH_GRAB) - { - if(!Ui()->MouseButton(0)) - { - std::shared_ptr pQuadLayer = std::static_pointer_cast(GetSelectedLayerType(0, LAYERTYPE_QUADS)); - if(Input()->ShiftIsPressed() && pQuadLayer) - { - DeselectQuads(); - for(size_t i = 0; i < pQuadLayer->m_vQuads.size(); i++) - { - const CQuad &Quad = pQuadLayer->m_vQuads[i]; - vec2 Position = vec2(fx2f(Quad.m_aPoints[4].x), fx2f(Quad.m_aPoints[4].y)); - if(r.Inside(Position) && !IsQuadSelected(i)) - ToggleSelectQuad(i); - } - } - else - { - // grab brush - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "grabbing %f %f %f %f", r.x, r.y, r.w, r.h); - Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "editor", aBuf); - - // TODO: do all layers - int Grabs = 0; - for(size_t k = 0; k < NumEditLayers; k++) - Grabs += apEditLayers[k].second->BrushGrab(m_pBrush, r); - if(Grabs == 0) - m_pBrush->Clear(); - - DeselectQuads(); - DeselectQuadPoints(); - } - } - else - { - for(size_t k = 0; k < NumEditLayers; k++) - apEditLayers[k].second->BrushSelecting(r); - Ui()->MapScreen(); - } - } - else if(s_Operation == OP_BRUSH_PAINT) - { - if(!Ui()->MouseButton(0)) - { - for(size_t k = 0; k < NumEditLayers; k++) - { - size_t BrushIndex = k; - if(m_pBrush->m_vpLayers.size() != NumEditLayers) - BrushIndex = 0; - std::shared_ptr pBrush = m_pBrush->IsEmpty() ? nullptr : m_pBrush->m_vpLayers[BrushIndex]; - apEditLayers[k].second->FillSelection(m_pBrush->IsEmpty(), pBrush, r); - } - std::shared_ptr Action = std::make_shared(this, m_SelectedGroup); - m_EditorHistory.RecordAction(Action); - } - else - { - for(size_t k = 0; k < NumEditLayers; k++) - apEditLayers[k].second->BrushSelecting(r); - Ui()->MapScreen(); - } - } - } - else - { - if(Ui()->MouseButton(1)) - { - m_pBrush->Clear(); - } - - if(!Input()->ModifierIsPressed() && Ui()->MouseButton(0) && s_Operation == OP_NONE && !m_QuadKnifeActive) - { - Ui()->SetActiveItem(&m_MapEditorId); - - if(m_pBrush->IsEmpty()) - s_Operation = OP_BRUSH_GRAB; - else - { - s_Operation = OP_BRUSH_DRAW; - for(size_t k = 0; k < NumEditLayers; k++) - { - size_t BrushIndex = k; - if(m_pBrush->m_vpLayers.size() != NumEditLayers) - BrushIndex = 0; - - if(apEditLayers[k].second->m_Type == m_pBrush->m_vpLayers[BrushIndex]->m_Type) - apEditLayers[k].second->BrushPlace(m_pBrush->m_vpLayers[BrushIndex], vec2(wx, wy)); - } - } - - std::shared_ptr pLayer = std::static_pointer_cast(GetSelectedLayerType(0, LAYERTYPE_TILES)); - if(Input()->ShiftIsPressed() && pLayer) - s_Operation = OP_BRUSH_PAINT; - } - - if(!m_pBrush->IsEmpty()) - { - m_pBrush->m_OffsetX = -(int)wx; - m_pBrush->m_OffsetY = -(int)wy; - for(const auto &pLayer : m_pBrush->m_vpLayers) - { - if(pLayer->m_Type == LAYERTYPE_TILES) - { - m_pBrush->m_OffsetX = -(int)(wx / 32.0f) * 32; - m_pBrush->m_OffsetY = -(int)(wy / 32.0f) * 32; - break; - } - } - - std::shared_ptr pGroup = GetSelectedGroup(); - if(!m_ShowPicker && pGroup) - { - m_pBrush->m_OffsetX += pGroup->m_OffsetX; - m_pBrush->m_OffsetY += pGroup->m_OffsetY; - m_pBrush->m_ParallaxX = pGroup->m_ParallaxX; - m_pBrush->m_ParallaxY = pGroup->m_ParallaxY; - m_pBrush->Render(); - float w, h; - m_pBrush->GetSize(&w, &h); - - IGraphics::CLineItem Array[4] = { - IGraphics::CLineItem(0, 0, w, 0), - IGraphics::CLineItem(w, 0, w, h), - IGraphics::CLineItem(w, h, 0, h), - IGraphics::CLineItem(0, h, 0, 0)}; - Graphics()->TextureClear(); - Graphics()->LinesBegin(); - Graphics()->LinesDraw(Array, 4); - Graphics()->LinesEnd(); - } - } - } - } - - // quad & sound editing - { - if(!m_ShowPicker && m_pBrush->IsEmpty()) - { - // fetch layers - std::shared_ptr pGroup = GetSelectedGroup(); - if(pGroup) - pGroup->MapScreen(); - - for(size_t k = 0; k < NumEditLayers; k++) - { - auto &[LayerIndex, pEditLayer] = apEditLayers[k]; - - if(pEditLayer->m_Type == LAYERTYPE_QUADS) - { - std::shared_ptr pLayer = std::static_pointer_cast(pEditLayer); - - if(m_ShowEnvelopePreview == SHOWENV_NONE) - m_ShowEnvelopePreview = SHOWENV_ALL; - - if(m_QuadKnifeActive) - DoQuadKnife(m_vSelectedQuads[m_SelectedQuadIndex]); - else - { - SetHotQuadPoint(pLayer); - - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - for(size_t i = 0; i < pLayer->m_vQuads.size(); i++) - { - for(int v = 0; v < 4; v++) - DoQuadPoint(LayerIndex, pLayer, &pLayer->m_vQuads[i], i, v); - - DoQuad(LayerIndex, pLayer, &pLayer->m_vQuads[i], i); - } - Graphics()->QuadsEnd(); - } - } - - if(pEditLayer->m_Type == LAYERTYPE_SOUNDS) - { - std::shared_ptr pLayer = std::static_pointer_cast(pEditLayer); - - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - for(size_t i = 0; i < pLayer->m_vSources.size(); i++) - { - DoSoundSource(LayerIndex, &pLayer->m_vSources[i], i); - } - Graphics()->QuadsEnd(); - } - } - - Ui()->MapScreen(); - } - } - - // menu proof selection - if(MapView()->ProofMode()->IsModeMenu() && !m_ShowPicker) - { - MapView()->ProofMode()->ResetMenuBackgroundPositions(); - for(int i = 0; i < (int)MapView()->ProofMode()->m_vMenuBackgroundPositions.size(); i++) - { - vec2 Pos = MapView()->ProofMode()->m_vMenuBackgroundPositions[i]; - Pos += MapView()->GetWorldOffset() - MapView()->ProofMode()->m_vMenuBackgroundPositions[MapView()->ProofMode()->m_CurrentMenuProofIndex]; - Pos.y -= 3.0f; - - if(distance(Pos, m_MouseWorldNoParaPos) <= 20.0f) - { - Ui()->SetHotItem(&MapView()->ProofMode()->m_vMenuBackgroundPositions[i]); - - if(i != MapView()->ProofMode()->m_CurrentMenuProofIndex && Ui()->CheckActiveItem(&MapView()->ProofMode()->m_vMenuBackgroundPositions[i])) - { - if(!Ui()->MouseButton(0)) - { - MapView()->ProofMode()->m_CurrentMenuProofIndex = i; - MapView()->SetWorldOffset(MapView()->ProofMode()->m_vMenuBackgroundPositions[i]); - Ui()->SetActiveItem(nullptr); - } - } - else if(Ui()->HotItem() == &MapView()->ProofMode()->m_vMenuBackgroundPositions[i]) - { - char aTooltipPrefix[32] = "Switch proof position to"; - if(i == MapView()->ProofMode()->m_CurrentMenuProofIndex) - str_copy(aTooltipPrefix, "Current proof position at"); - - char aNumBuf[8]; - if(i < (TILE_TIME_CHECKPOINT_LAST - TILE_TIME_CHECKPOINT_FIRST)) - str_format(aNumBuf, sizeof(aNumBuf), "#%d", i + 1); - else - aNumBuf[0] = '\0'; - - char aTooltipPositions[128]; - str_format(aTooltipPositions, sizeof(aTooltipPositions), "%s %s", MapView()->ProofMode()->m_vpMenuBackgroundPositionNames[i], aNumBuf); - - for(int k : MapView()->ProofMode()->m_vMenuBackgroundCollisions.at(i)) - { - if(k == MapView()->ProofMode()->m_CurrentMenuProofIndex) - str_copy(aTooltipPrefix, "Current proof position at"); - - Pos = MapView()->ProofMode()->m_vMenuBackgroundPositions[k]; - Pos += MapView()->GetWorldOffset() - MapView()->ProofMode()->m_vMenuBackgroundPositions[MapView()->ProofMode()->m_CurrentMenuProofIndex]; - Pos.y -= 3.0f; - - if(distance(Pos, m_MouseWorldNoParaPos) > 20.0f) - continue; - - if(i < (TILE_TIME_CHECKPOINT_LAST - TILE_TIME_CHECKPOINT_FIRST)) - str_format(aNumBuf, sizeof(aNumBuf), "#%d", k + 1); - else - aNumBuf[0] = '\0'; - - char aTooltipPositionsCopy[128]; - str_copy(aTooltipPositionsCopy, aTooltipPositions); - str_format(aTooltipPositions, sizeof(aTooltipPositions), "%s, %s %s", aTooltipPositionsCopy, MapView()->ProofMode()->m_vpMenuBackgroundPositionNames[k], aNumBuf); - } - str_format(m_aMenuBackgroundTooltip, sizeof(m_aMenuBackgroundTooltip), "%s %s", aTooltipPrefix, aTooltipPositions); - - str_copy(m_aTooltip, m_aMenuBackgroundTooltip); - if(Ui()->MouseButton(0)) - Ui()->SetActiveItem(&MapView()->ProofMode()->m_vMenuBackgroundPositions[i]); - } - break; - } - } - } - - if(Ui()->CheckActiveItem(&m_MapEditorId) && m_pContainerPanned == nullptr) - { - // release mouse - if(!Ui()->MouseButton(0)) - { - if(s_Operation == OP_BRUSH_DRAW) - { - std::shared_ptr Action = std::make_shared(this, m_SelectedGroup); - - if(!Action->IsEmpty()) // Avoid recording tile draw action when placing quads only - m_EditorHistory.RecordAction(Action); - } - - s_Operation = OP_NONE; - Ui()->SetActiveItem(nullptr); - } - } - if(!Input()->ModifierIsPressed() && m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr) - { - float PanSpeed = Input()->ShiftIsPressed() ? 200.0f : 64.0f; - if(Input()->KeyPress(KEY_A)) - MapView()->OffsetWorld({-PanSpeed * m_MouseWorldScale, 0}); - else if(Input()->KeyPress(KEY_D)) - MapView()->OffsetWorld({PanSpeed * m_MouseWorldScale, 0}); - if(Input()->KeyPress(KEY_W)) - MapView()->OffsetWorld({0, -PanSpeed * m_MouseWorldScale}); - else if(Input()->KeyPress(KEY_S)) - MapView()->OffsetWorld({0, PanSpeed * m_MouseWorldScale}); - } - } - else if(Ui()->CheckActiveItem(&m_MapEditorId) && m_pContainerPanned == nullptr) - { - // release mouse - if(!Ui()->MouseButton(0)) - { - s_Operation = OP_NONE; - Ui()->SetActiveItem(nullptr); - } - } - - if(!m_ShowPicker && GetSelectedGroup() && GetSelectedGroup()->m_UseClipping) - { - std::shared_ptr pGameGroup = m_Map.m_pGameGroup; - pGameGroup->MapScreen(); - - Graphics()->TextureClear(); - Graphics()->LinesBegin(); - - CUIRect r; - r.x = GetSelectedGroup()->m_ClipX; - r.y = GetSelectedGroup()->m_ClipY; - r.w = GetSelectedGroup()->m_ClipW; - r.h = GetSelectedGroup()->m_ClipH; - - IGraphics::CLineItem Array[4] = { - IGraphics::CLineItem(r.x, r.y, r.x + r.w, r.y), - IGraphics::CLineItem(r.x + r.w, r.y, r.x + r.w, r.y + r.h), - IGraphics::CLineItem(r.x + r.w, r.y + r.h, r.x, r.y + r.h), - IGraphics::CLineItem(r.x, r.y + r.h, r.x, r.y)}; - Graphics()->SetColor(1, 0, 0, 1); - Graphics()->LinesDraw(Array, 4); - - Graphics()->LinesEnd(); - } - - MapView()->ProofMode()->RenderScreenSizes(); - - if(!m_ShowPicker && m_ShowTileInfo != SHOW_TILE_OFF && m_ShowEnvelopePreview != SHOWENV_NONE && GetSelectedLayer(0) && GetSelectedLayer(0)->m_Type == LAYERTYPE_QUADS) - { - GetSelectedGroup()->MapScreen(); - - std::shared_ptr pLayer = std::static_pointer_cast(GetSelectedLayer(0)); - IGraphics::CTextureHandle Texture; - if(pLayer->m_Image >= 0 && pLayer->m_Image < (int)m_Map.m_vpImages.size()) - Texture = m_Map.m_vpImages[pLayer->m_Image]->m_Texture; - - DoQuadEnvelopes(pLayer->m_vQuads, Texture); - m_ShowEnvelopePreview = SHOWENV_NONE; - } - - Ui()->MapScreen(); -} - -void CEditor::SetHotQuadPoint(const std::shared_ptr &pLayer) -{ - float wx = Ui()->MouseWorldX(); - float wy = Ui()->MouseWorldY(); - - float MinDist = 500.0f; - void *pMinPoint = nullptr; - - auto UpdateMinimum = [&](float px, float py, void *pId) { - float dx = (px - wx) / m_MouseWorldScale; - float dy = (py - wy) / m_MouseWorldScale; - - float CurrDist = dx * dx + dy * dy; - if(CurrDist < MinDist) - { - MinDist = CurrDist; - pMinPoint = pId; - return true; - } - return false; - }; - - for(size_t i = 0; i < pLayer->m_vQuads.size(); i++) - { - CQuad &Quad = pLayer->m_vQuads.at(i); - - if(m_ShowTileInfo != SHOW_TILE_OFF && m_ShowEnvelopePreview != SHOWENV_NONE && Quad.m_PosEnv >= 0) - { - for(auto &EnvPoint : m_Map.m_vpEnvelopes[Quad.m_PosEnv]->m_vPoints) - { - float px = fx2f(Quad.m_aPoints[4].x) + fx2f(EnvPoint.m_aValues[0]); - float py = fx2f(Quad.m_aPoints[4].y) + fx2f(EnvPoint.m_aValues[1]); - if(UpdateMinimum(px, py, &EnvPoint)) - m_CurrentQuadIndex = i; - } - } - - for(auto &Point : Quad.m_aPoints) - UpdateMinimum(fx2f(Point.x), fx2f(Point.y), &Point); - } - - if(pMinPoint != nullptr) - Ui()->SetHotItem(pMinPoint); -} - -void CEditor::DoColorPickerButton(const void *pId, const CUIRect *pRect, ColorRGBA Color, const std::function &SetColor) -{ - CUIRect ColorRect; - pRect->Draw(ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f * Ui()->ButtonColorMul(pId)), IGraphics::CORNER_ALL, 3.0f); - pRect->Margin(1.0f, &ColorRect); - ColorRect.Draw(Color, IGraphics::CORNER_ALL, 3.0f); - - const int ButtonResult = DoButton_Editor_Common(pId, nullptr, 0, pRect, 0, "Click to show the color picker. Shift+rightclick to copy color to clipboard. Shift+leftclick to paste color from clipboard."); - if(Input()->ShiftIsPressed()) - { - if(ButtonResult == 1) - { - std::string Clipboard = Input()->GetClipboardText(); - if(Clipboard[0] == '#' || Clipboard[0] == '$') // ignore leading # (web color format) and $ (console color format) - Clipboard = Clipboard.substr(1); - if(str_isallnum_hex(Clipboard.c_str())) - { - std::optional ParsedColor = color_parse(Clipboard.c_str()); - if(ParsedColor) - { - m_ColorPickerPopupContext.m_State = EEditState::ONE_GO; - SetColor(ParsedColor.value()); - } - } - } - else if(ButtonResult == 2) - { - char aClipboard[9]; - str_format(aClipboard, sizeof(aClipboard), "%08X", Color.PackAlphaLast()); - Input()->SetClipboardText(aClipboard); - } - } - else if(ButtonResult > 0) - { - if(m_ColorPickerPopupContext.m_ColorMode == CUi::SColorPickerPopupContext::MODE_UNSET) - m_ColorPickerPopupContext.m_ColorMode = CUi::SColorPickerPopupContext::MODE_RGBA; - m_ColorPickerPopupContext.m_RgbaColor = Color; - m_ColorPickerPopupContext.m_HslaColor = color_cast(Color); - m_ColorPickerPopupContext.m_HsvaColor = color_cast(m_ColorPickerPopupContext.m_HslaColor); - m_ColorPickerPopupContext.m_Alpha = true; - m_pColorPickerPopupActiveId = pId; - Ui()->ShowPopupColorPicker(Ui()->MouseX(), Ui()->MouseY(), &m_ColorPickerPopupContext); - } - - if(Ui()->IsPopupOpen(&m_ColorPickerPopupContext)) - { - if(m_pColorPickerPopupActiveId == pId) - SetColor(m_ColorPickerPopupContext.m_RgbaColor); - } - else - { - m_pColorPickerPopupActiveId = nullptr; - if(m_ColorPickerPopupContext.m_State == EEditState::EDITING) - { - ColorRGBA c = color_cast(m_ColorPickerPopupContext.m_HsvaColor); - m_ColorPickerPopupContext.m_State = EEditState::END; - SetColor(c); - m_ColorPickerPopupContext.m_State = EEditState::NONE; - } - } -} - -void CEditor::RenderLayers(CUIRect LayersBox) -{ - const float RowHeight = 12.0f; - char aBuf[64]; - - CUIRect UnscrolledLayersBox = LayersBox; - - static CScrollRegion s_ScrollRegion; - vec2 ScrollOffset(0.0f, 0.0f); - CScrollRegionParams ScrollParams; - ScrollParams.m_ScrollbarWidth = 10.0f; - ScrollParams.m_ScrollbarMargin = 3.0f; - ScrollParams.m_ScrollUnit = RowHeight * 5.0f; - s_ScrollRegion.Begin(&LayersBox, &ScrollOffset, &ScrollParams); - LayersBox.y += ScrollOffset.y; - - enum - { - OP_NONE = 0, - OP_CLICK, - OP_LAYER_DRAG, - OP_GROUP_DRAG - }; - static int s_Operation = OP_NONE; - static int s_PreviousOperation = OP_NONE; - static const void *s_pDraggedButton = nullptr; - static float s_InitialMouseY = 0; - static float s_InitialCutHeight = 0; - constexpr float MinDragDistance = 5.0f; - int GroupAfterDraggedLayer = -1; - int LayerAfterDraggedLayer = -1; - bool DraggedPositionFound = false; - bool MoveLayers = false; - bool MoveGroup = false; - bool StartDragLayer = false; - bool StartDragGroup = false; - std::vector vButtonsPerGroup; - - auto SetOperation = [](int Operation) { - if(Operation != s_Operation) - { - s_PreviousOperation = s_Operation; - s_Operation = Operation; - if(Operation == OP_NONE) - { - s_pDraggedButton = nullptr; - } - } - }; - - vButtonsPerGroup.reserve(m_Map.m_vpGroups.size()); - for(const std::shared_ptr &pGroup : m_Map.m_vpGroups) - { - vButtonsPerGroup.push_back(pGroup->m_vpLayers.size() + 1); - } - - if(s_pDraggedButton != nullptr && Ui()->ActiveItem() != s_pDraggedButton) - { - SetOperation(OP_NONE); - } - - if(s_Operation == OP_LAYER_DRAG || s_Operation == OP_GROUP_DRAG) - { - float MinDraggableValue = UnscrolledLayersBox.y; - float MaxDraggableValue = MinDraggableValue; - for(int NumButtons : vButtonsPerGroup) - { - MaxDraggableValue += NumButtons * (RowHeight + 2.0f) + 5.0f; - } - MaxDraggableValue += ScrollOffset.y; - - if(s_Operation == OP_GROUP_DRAG) - { - MaxDraggableValue -= vButtonsPerGroup[m_SelectedGroup] * (RowHeight + 2.0f) + 5.0f; - } - else if(s_Operation == OP_LAYER_DRAG) - { - MinDraggableValue += RowHeight + 2.0f; - MaxDraggableValue -= m_vSelectedLayers.size() * (RowHeight + 2.0f) + 5.0f; - } - - UnscrolledLayersBox.HSplitTop(s_InitialCutHeight, nullptr, &UnscrolledLayersBox); - UnscrolledLayersBox.y -= s_InitialMouseY - Ui()->MouseY(); - - UnscrolledLayersBox.y = clamp(UnscrolledLayersBox.y, MinDraggableValue, MaxDraggableValue); - - UnscrolledLayersBox.w = LayersBox.w; - } - - static bool s_ScrollToSelectionNext = false; - const bool ScrollToSelection = LayerSelector()->SelectByTile() || s_ScrollToSelectionNext; - s_ScrollToSelectionNext = false; - - // render layers - for(int g = 0; g < (int)m_Map.m_vpGroups.size(); g++) - { - if(s_Operation == OP_LAYER_DRAG && g > 0 && !DraggedPositionFound && Ui()->MouseY() < LayersBox.y + RowHeight / 2) - { - DraggedPositionFound = true; - GroupAfterDraggedLayer = g; - - LayerAfterDraggedLayer = m_Map.m_vpGroups[g - 1]->m_vpLayers.size(); - - CUIRect Slot; - LayersBox.HSplitTop(m_vSelectedLayers.size() * (RowHeight + 2.0f), &Slot, &LayersBox); - s_ScrollRegion.AddRect(Slot); - } - - CUIRect Slot, VisibleToggle; - if(s_Operation == OP_GROUP_DRAG) - { - if(g == m_SelectedGroup) - { - UnscrolledLayersBox.HSplitTop(RowHeight, &Slot, &UnscrolledLayersBox); - UnscrolledLayersBox.HSplitTop(2.0f, nullptr, &UnscrolledLayersBox); - } - else if(!DraggedPositionFound && Ui()->MouseY() < LayersBox.y + RowHeight * vButtonsPerGroup[g] / 2 + 3.0f) - { - DraggedPositionFound = true; - GroupAfterDraggedLayer = g; - - CUIRect TmpSlot; - if(m_Map.m_vpGroups[m_SelectedGroup]->m_Collapse) - LayersBox.HSplitTop(RowHeight + 7.0f, &TmpSlot, &LayersBox); - else - LayersBox.HSplitTop(vButtonsPerGroup[m_SelectedGroup] * (RowHeight + 2.0f) + 5.0f, &TmpSlot, &LayersBox); - s_ScrollRegion.AddRect(TmpSlot, false); - } - } - if(s_Operation != OP_GROUP_DRAG || g != m_SelectedGroup) - { - LayersBox.HSplitTop(RowHeight, &Slot, &LayersBox); - - CUIRect TmpRect; - LayersBox.HSplitTop(2.0f, &TmpRect, &LayersBox); - s_ScrollRegion.AddRect(TmpRect); - } - - if(s_ScrollRegion.AddRect(Slot)) - { - Slot.VSplitLeft(15.0f, &VisibleToggle, &Slot); - - const int MouseClick = DoButton_FontIcon(&m_Map.m_vpGroups[g]->m_Visible, m_Map.m_vpGroups[g]->m_Visible ? FONT_ICON_EYE : FONT_ICON_EYE_SLASH, m_Map.m_vpGroups[g]->m_Collapse ? 1 : 0, &VisibleToggle, 0, "Left click to toggle visibility. Right click to show this group only.", IGraphics::CORNER_L, 8.0f); - if(MouseClick == 1) - { - m_Map.m_vpGroups[g]->m_Visible = !m_Map.m_vpGroups[g]->m_Visible; - } - else if(MouseClick == 2) - { - if(Input()->ShiftIsPressed()) - { - if(g != m_SelectedGroup) - SelectLayer(0, g); - } - - int NumActive = 0; - for(auto &Group : m_Map.m_vpGroups) - { - if(Group == m_Map.m_vpGroups[g]) - { - Group->m_Visible = true; - continue; - } - - if(Group->m_Visible) - { - Group->m_Visible = false; - NumActive++; - } - } - if(NumActive == 0) - { - for(auto &Group : m_Map.m_vpGroups) - { - Group->m_Visible = true; - } - } - } - - str_format(aBuf, sizeof(aBuf), "#%d %s", g, m_Map.m_vpGroups[g]->m_aName); - - bool Clicked; - bool Abrupted; - if(int Result = DoButton_DraggableEx(m_Map.m_vpGroups[g].get(), aBuf, g == m_SelectedGroup, &Slot, &Clicked, &Abrupted, - BUTTON_CONTEXT, m_Map.m_vpGroups[g]->m_Collapse ? "Select group. Shift click to select all layers. Double click to expand." : "Select group. Shift click to select all layers. Double click to collapse.", IGraphics::CORNER_R)) - { - if(s_Operation == OP_NONE) - { - s_InitialMouseY = Ui()->MouseY(); - s_InitialCutHeight = s_InitialMouseY - UnscrolledLayersBox.y; - SetOperation(OP_CLICK); - - if(g != m_SelectedGroup) - SelectLayer(0, g); - } - - if(Abrupted) - { - SetOperation(OP_NONE); - } - - if(s_Operation == OP_CLICK && absolute(Ui()->MouseY() - s_InitialMouseY) > MinDragDistance) - { - StartDragGroup = true; - s_pDraggedButton = m_Map.m_vpGroups[g].get(); - } - - if(s_Operation == OP_CLICK && Clicked) - { - if(g != m_SelectedGroup) - SelectLayer(0, g); - - if(Input()->ShiftIsPressed() && m_SelectedGroup == g) - { - m_vSelectedLayers.clear(); - for(size_t i = 0; i < m_Map.m_vpGroups[g]->m_vpLayers.size(); i++) - { - AddSelectedLayer(i); - } - } - - if(Result == 2) - { - static SPopupMenuId s_PopupGroupId; - Ui()->DoPopupMenu(&s_PopupGroupId, Ui()->MouseX(), Ui()->MouseY(), 145, 256, this, PopupGroup); - } - - if(!m_Map.m_vpGroups[g]->m_vpLayers.empty() && Ui()->DoDoubleClickLogic(m_Map.m_vpGroups[g].get())) - m_Map.m_vpGroups[g]->m_Collapse ^= 1; - - SetOperation(OP_NONE); - } - - if(s_Operation == OP_GROUP_DRAG && Clicked) - MoveGroup = true; - } - else if(s_pDraggedButton == m_Map.m_vpGroups[g].get()) - { - SetOperation(OP_NONE); - } - } - - for(int i = 0; i < (int)m_Map.m_vpGroups[g]->m_vpLayers.size(); i++) - { - if(m_Map.m_vpGroups[g]->m_Collapse) - continue; - - bool IsLayerSelected = false; - if(m_SelectedGroup == g) - { - for(const auto &Selected : m_vSelectedLayers) - { - if(Selected == i) - { - IsLayerSelected = true; - break; - } - } - } - - if(s_Operation == OP_GROUP_DRAG && g == m_SelectedGroup) - { - UnscrolledLayersBox.HSplitTop(RowHeight + 2.0f, &Slot, &UnscrolledLayersBox); - } - else if(s_Operation == OP_LAYER_DRAG) - { - if(IsLayerSelected) - { - UnscrolledLayersBox.HSplitTop(RowHeight + 2.0f, &Slot, &UnscrolledLayersBox); - } - else - { - if(!DraggedPositionFound && Ui()->MouseY() < LayersBox.y + RowHeight / 2) - { - DraggedPositionFound = true; - GroupAfterDraggedLayer = g + 1; - LayerAfterDraggedLayer = i; - for(size_t j = 0; j < m_vSelectedLayers.size(); j++) - { - LayersBox.HSplitTop(RowHeight + 2.0f, nullptr, &LayersBox); - s_ScrollRegion.AddRect(Slot); - } - } - LayersBox.HSplitTop(RowHeight + 2.0f, &Slot, &LayersBox); - if(!s_ScrollRegion.AddRect(Slot, ScrollToSelection && IsLayerSelected)) - continue; - } - } - else - { - LayersBox.HSplitTop(RowHeight + 2.0f, &Slot, &LayersBox); - if(!s_ScrollRegion.AddRect(Slot, ScrollToSelection && IsLayerSelected)) - continue; - } - - Slot.HSplitTop(RowHeight, &Slot, nullptr); - - CUIRect Button; - Slot.VSplitLeft(12.0f, nullptr, &Slot); - Slot.VSplitLeft(15.0f, &VisibleToggle, &Button); - - const int MouseClick = DoButton_FontIcon(&m_Map.m_vpGroups[g]->m_vpLayers[i]->m_Visible, m_Map.m_vpGroups[g]->m_vpLayers[i]->m_Visible ? FONT_ICON_EYE : FONT_ICON_EYE_SLASH, 0, &VisibleToggle, 0, "Left click to toggle visibility. Right click to show only this layer within its group.", IGraphics::CORNER_L, 8.0f); - if(MouseClick == 1) - { - m_Map.m_vpGroups[g]->m_vpLayers[i]->m_Visible = !m_Map.m_vpGroups[g]->m_vpLayers[i]->m_Visible; - } - else if(MouseClick == 2) - { - if(Input()->ShiftIsPressed()) - { - if(!IsLayerSelected) - SelectLayer(i, g); - } - - int NumActive = 0; - for(auto &Layer : m_Map.m_vpGroups[g]->m_vpLayers) - { - if(Layer == m_Map.m_vpGroups[g]->m_vpLayers[i]) - { - Layer->m_Visible = true; - continue; - } - - if(Layer->m_Visible) - { - Layer->m_Visible = false; - NumActive++; - } - } - if(NumActive == 0) - { - for(auto &Layer : m_Map.m_vpGroups[g]->m_vpLayers) - { - Layer->m_Visible = true; - } - } - } - - if(m_Map.m_vpGroups[g]->m_vpLayers[i]->m_aName[0]) - str_copy(aBuf, m_Map.m_vpGroups[g]->m_vpLayers[i]->m_aName); - else - { - if(m_Map.m_vpGroups[g]->m_vpLayers[i]->m_Type == LAYERTYPE_TILES) - { - std::shared_ptr pTiles = std::static_pointer_cast(m_Map.m_vpGroups[g]->m_vpLayers[i]); - str_copy(aBuf, pTiles->m_Image >= 0 ? m_Map.m_vpImages[pTiles->m_Image]->m_aName : "Tiles"); - } - else if(m_Map.m_vpGroups[g]->m_vpLayers[i]->m_Type == LAYERTYPE_QUADS) - { - std::shared_ptr pQuads = std::static_pointer_cast(m_Map.m_vpGroups[g]->m_vpLayers[i]); - str_copy(aBuf, pQuads->m_Image >= 0 ? m_Map.m_vpImages[pQuads->m_Image]->m_aName : "Quads"); - } - else if(m_Map.m_vpGroups[g]->m_vpLayers[i]->m_Type == LAYERTYPE_SOUNDS) - { - std::shared_ptr pSounds = std::static_pointer_cast(m_Map.m_vpGroups[g]->m_vpLayers[i]); - str_copy(aBuf, pSounds->m_Sound >= 0 ? m_Map.m_vpSounds[pSounds->m_Sound]->m_aName : "Sounds"); - } - } - - int Checked = IsLayerSelected ? 1 : 0; - if(m_Map.m_vpGroups[g]->m_vpLayers[i]->IsEntitiesLayer()) - { - Checked += 6; - } - - bool Clicked; - bool Abrupted; - if(int Result = DoButton_DraggableEx(m_Map.m_vpGroups[g]->m_vpLayers[i].get(), aBuf, Checked, &Button, &Clicked, &Abrupted, - BUTTON_CONTEXT, "Select layer. Shift click to select multiple.", IGraphics::CORNER_R)) - { - if(s_Operation == OP_NONE) - { - s_InitialMouseY = Ui()->MouseY(); - s_InitialCutHeight = s_InitialMouseY - UnscrolledLayersBox.y; - - SetOperation(OP_CLICK); - - if(!Input()->ShiftIsPressed() && !IsLayerSelected) - { - SelectLayer(i, g); - } - } - - if(Abrupted) - { - SetOperation(OP_NONE); - } - - if(s_Operation == OP_CLICK && absolute(Ui()->MouseY() - s_InitialMouseY) > MinDragDistance) - { - bool EntitiesLayerSelected = false; - for(int k : m_vSelectedLayers) - { - if(m_Map.m_vpGroups[m_SelectedGroup]->m_vpLayers[k]->IsEntitiesLayer()) - EntitiesLayerSelected = true; - } - - if(!EntitiesLayerSelected) - StartDragLayer = true; - - s_pDraggedButton = m_Map.m_vpGroups[g]->m_vpLayers[i].get(); - } - - if(s_Operation == OP_CLICK && Clicked) - { - static SLayerPopupContext s_LayerPopupContext = {}; - s_LayerPopupContext.m_pEditor = this; - if(Result == 1) - { - if(Input()->ShiftIsPressed() && m_SelectedGroup == g) - { - auto Position = std::find(m_vSelectedLayers.begin(), m_vSelectedLayers.end(), i); - if(Position != m_vSelectedLayers.end()) - m_vSelectedLayers.erase(Position); - else - AddSelectedLayer(i); - } - else if(!Input()->ShiftIsPressed()) - { - SelectLayer(i, g); - } - } - else if(Result == 2) - { - s_LayerPopupContext.m_vpLayers.clear(); - s_LayerPopupContext.m_vLayerIndices.clear(); - - if(!IsLayerSelected) - { - SelectLayer(i, g); - } - - if(m_vSelectedLayers.size() > 1) - { - bool AllTile = true; - for(size_t j = 0; AllTile && j < m_vSelectedLayers.size(); j++) - { - int LayerIndex = m_vSelectedLayers[j]; - if(m_Map.m_vpGroups[m_SelectedGroup]->m_vpLayers[LayerIndex]->m_Type == LAYERTYPE_TILES) - { - s_LayerPopupContext.m_vpLayers.push_back(std::static_pointer_cast(m_Map.m_vpGroups[m_SelectedGroup]->m_vpLayers[m_vSelectedLayers[j]])); - s_LayerPopupContext.m_vLayerIndices.push_back(LayerIndex); - } - else - AllTile = false; - } - - // Don't allow editing if all selected layers are not tile layers - if(!AllTile) - { - s_LayerPopupContext.m_vpLayers.clear(); - s_LayerPopupContext.m_vLayerIndices.clear(); - } - } - - Ui()->DoPopupMenu(&s_LayerPopupContext, Ui()->MouseX(), Ui()->MouseY(), 120, 270, &s_LayerPopupContext, PopupLayer); - } - - SetOperation(OP_NONE); - } - - if(s_Operation == OP_LAYER_DRAG && Clicked) - { - MoveLayers = true; - } - } - else if(s_pDraggedButton == m_Map.m_vpGroups[g]->m_vpLayers[i].get()) - { - SetOperation(OP_NONE); - } - } - - if(s_Operation != OP_GROUP_DRAG || g != m_SelectedGroup) - { - LayersBox.HSplitTop(5.0f, &Slot, &LayersBox); - s_ScrollRegion.AddRect(Slot); - } - } - - if(!DraggedPositionFound && s_Operation == OP_LAYER_DRAG) - { - GroupAfterDraggedLayer = m_Map.m_vpGroups.size(); - LayerAfterDraggedLayer = m_Map.m_vpGroups[GroupAfterDraggedLayer - 1]->m_vpLayers.size(); - - CUIRect TmpSlot; - LayersBox.HSplitTop(m_vSelectedLayers.size() * (RowHeight + 2.0f), &TmpSlot, &LayersBox); - s_ScrollRegion.AddRect(TmpSlot); - } - - if(!DraggedPositionFound && s_Operation == OP_GROUP_DRAG) - { - GroupAfterDraggedLayer = m_Map.m_vpGroups.size(); - - CUIRect TmpSlot; - if(m_Map.m_vpGroups[m_SelectedGroup]->m_Collapse) - LayersBox.HSplitTop(RowHeight + 7.0f, &TmpSlot, &LayersBox); - else - LayersBox.HSplitTop(vButtonsPerGroup[m_SelectedGroup] * (RowHeight + 2.0f) + 5.0f, &TmpSlot, &LayersBox); - s_ScrollRegion.AddRect(TmpSlot, false); - } - - if(MoveLayers && 1 <= GroupAfterDraggedLayer && GroupAfterDraggedLayer <= (int)m_Map.m_vpGroups.size()) - { - std::vector> &vpNewGroupLayers = m_Map.m_vpGroups[GroupAfterDraggedLayer - 1]->m_vpLayers; - if(0 <= LayerAfterDraggedLayer && LayerAfterDraggedLayer <= (int)vpNewGroupLayers.size()) - { - std::vector> vpSelectedLayers; - std::vector> &vpSelectedGroupLayers = m_Map.m_vpGroups[m_SelectedGroup]->m_vpLayers; - std::shared_ptr pNextLayer = nullptr; - if(LayerAfterDraggedLayer < (int)vpNewGroupLayers.size()) - pNextLayer = vpNewGroupLayers[LayerAfterDraggedLayer]; - - std::sort(m_vSelectedLayers.begin(), m_vSelectedLayers.end(), std::greater<>()); - for(int k : m_vSelectedLayers) - { - vpSelectedLayers.insert(vpSelectedLayers.begin(), vpSelectedGroupLayers[k]); - } - for(int k : m_vSelectedLayers) - { - vpSelectedGroupLayers.erase(vpSelectedGroupLayers.begin() + k); - } - - auto InsertPosition = std::find(vpNewGroupLayers.begin(), vpNewGroupLayers.end(), pNextLayer); - int InsertPositionIndex = InsertPosition - vpNewGroupLayers.begin(); - vpNewGroupLayers.insert(InsertPosition, vpSelectedLayers.begin(), vpSelectedLayers.end()); - - int NumSelectedLayers = m_vSelectedLayers.size(); - m_vSelectedLayers.clear(); - for(int i = 0; i < NumSelectedLayers; i++) - m_vSelectedLayers.push_back(InsertPositionIndex + i); - - m_SelectedGroup = GroupAfterDraggedLayer - 1; - m_Map.OnModify(); - } - } - - if(MoveGroup && 0 <= GroupAfterDraggedLayer && GroupAfterDraggedLayer <= (int)m_Map.m_vpGroups.size()) - { - std::shared_ptr pSelectedGroup = m_Map.m_vpGroups[m_SelectedGroup]; - std::shared_ptr pNextGroup = nullptr; - if(GroupAfterDraggedLayer < (int)m_Map.m_vpGroups.size()) - pNextGroup = m_Map.m_vpGroups[GroupAfterDraggedLayer]; - - m_Map.m_vpGroups.erase(m_Map.m_vpGroups.begin() + m_SelectedGroup); - - auto InsertPosition = std::find(m_Map.m_vpGroups.begin(), m_Map.m_vpGroups.end(), pNextGroup); - m_Map.m_vpGroups.insert(InsertPosition, pSelectedGroup); - - auto Pos = std::find(m_Map.m_vpGroups.begin(), m_Map.m_vpGroups.end(), pSelectedGroup); - m_SelectedGroup = Pos - m_Map.m_vpGroups.begin(); - - m_Map.OnModify(); - } - - static int s_InitialGroupIndex; - static std::vector s_vInitialLayerIndices; - - if(MoveLayers || MoveGroup) - { - SetOperation(OP_NONE); - } - if(StartDragLayer) - { - SetOperation(OP_LAYER_DRAG); - s_InitialGroupIndex = m_SelectedGroup; - s_vInitialLayerIndices = std::vector(m_vSelectedLayers); - } - if(StartDragGroup) - { - s_InitialGroupIndex = m_SelectedGroup; - SetOperation(OP_GROUP_DRAG); - } - - if(s_Operation == OP_LAYER_DRAG || s_Operation == OP_GROUP_DRAG) - { - if(s_pDraggedButton == nullptr) - { - SetOperation(OP_NONE); - } - else - { - s_ScrollRegion.DoEdgeScrolling(); - Ui()->SetActiveItem(s_pDraggedButton); - } - } - - if(Input()->KeyPress(KEY_DOWN) && m_Dialog == DIALOG_NONE && !Ui()->IsPopupOpen() && CLineInput::GetActiveInput() == nullptr && s_Operation == OP_NONE) - { - if(Input()->ShiftIsPressed()) - { - if(m_vSelectedLayers[m_vSelectedLayers.size() - 1] < (int)m_Map.m_vpGroups[m_SelectedGroup]->m_vpLayers.size() - 1) - AddSelectedLayer(m_vSelectedLayers[m_vSelectedLayers.size() - 1] + 1); - } - else - { - SelectNextLayer(); - } - s_ScrollToSelectionNext = true; - } - if(Input()->KeyPress(KEY_UP) && m_Dialog == DIALOG_NONE && !Ui()->IsPopupOpen() && CLineInput::GetActiveInput() == nullptr && s_Operation == OP_NONE) - { - if(Input()->ShiftIsPressed()) - { - if(m_vSelectedLayers[m_vSelectedLayers.size() - 1] > 0) - AddSelectedLayer(m_vSelectedLayers[m_vSelectedLayers.size() - 1] - 1); - } - else - { - SelectPreviousLayer(); - } - - s_ScrollToSelectionNext = true; - } - - CUIRect AddGroupButton, CollapseAllButton; - LayersBox.HSplitTop(RowHeight + 1.0f, &AddGroupButton, &LayersBox); - if(s_ScrollRegion.AddRect(AddGroupButton)) - { - AddGroupButton.HSplitTop(RowHeight, &AddGroupButton, 0); - if(DoButton_Editor(&m_QuickActionAddGroup, m_QuickActionAddGroup.Label(), 0, &AddGroupButton, IGraphics::CORNER_R, m_QuickActionAddGroup.Description())) - { - m_QuickActionAddGroup.Call(); - } - } - - LayersBox.HSplitTop(5.0f, nullptr, &LayersBox); - LayersBox.HSplitTop(RowHeight + 1.0f, &CollapseAllButton, &LayersBox); - if(s_ScrollRegion.AddRect(CollapseAllButton)) - { - unsigned long TotalCollapsed = 0; - for(const auto &pGroup : m_Map.m_vpGroups) - { - if(pGroup->m_Collapse) - { - TotalCollapsed++; - } - } - - const char *pActionText = TotalCollapsed == m_Map.m_vpGroups.size() ? "Expand all" : "Collapse all"; - - CollapseAllButton.HSplitTop(RowHeight, &CollapseAllButton, 0); - static int s_CollapseAllButton = 0; - if(DoButton_Editor(&s_CollapseAllButton, pActionText, 0, &CollapseAllButton, IGraphics::CORNER_R, "Expand or collapse all groups")) - { - for(const auto &pGroup : m_Map.m_vpGroups) - { - if(TotalCollapsed == m_Map.m_vpGroups.size()) - pGroup->m_Collapse = false; - else - pGroup->m_Collapse = true; - } - } - } - - s_ScrollRegion.End(); - - if(s_Operation == OP_NONE) - { - if(s_PreviousOperation == OP_GROUP_DRAG) - { - s_PreviousOperation = OP_NONE; - m_EditorHistory.RecordAction(std::make_shared(this, m_SelectedGroup, EGroupProp::PROP_ORDER, s_InitialGroupIndex, m_SelectedGroup)); - } - else if(s_PreviousOperation == OP_LAYER_DRAG) - { - if(s_InitialGroupIndex != m_SelectedGroup) - { - m_EditorHistory.RecordAction(std::make_shared(this, s_InitialGroupIndex, s_vInitialLayerIndices, m_SelectedGroup, m_vSelectedLayers)); - } - else - { - std::vector> vpActions; - std::vector vLayerIndices = m_vSelectedLayers; - std::sort(vLayerIndices.begin(), vLayerIndices.end()); - std::sort(s_vInitialLayerIndices.begin(), s_vInitialLayerIndices.end()); - for(int k = 0; k < (int)vLayerIndices.size(); k++) - { - int LayerIndex = vLayerIndices[k]; - vpActions.push_back(std::make_shared(this, m_SelectedGroup, LayerIndex, ELayerProp::PROP_ORDER, s_vInitialLayerIndices[k], LayerIndex)); - } - m_EditorHistory.RecordAction(std::make_shared(this, vpActions, nullptr, true)); - } - s_PreviousOperation = OP_NONE; - } - } -} - -bool CEditor::ReplaceImage(const char *pFileName, int StorageType, bool CheckDuplicate) -{ - // check if we have that image already - char aBuf[128]; - IStorage::StripPathAndExtension(pFileName, aBuf, sizeof(aBuf)); - if(CheckDuplicate) - { - for(const auto &pImage : m_Map.m_vpImages) - { - if(!str_comp(pImage->m_aName, aBuf)) - { - ShowFileDialogError("Image named '%s' was already added.", pImage->m_aName); - return false; - } - } - } - - CImageInfo ImgInfo; - if(!Graphics()->LoadPng(ImgInfo, pFileName, StorageType)) - { - ShowFileDialogError("Failed to load image from file '%s'.", pFileName); - return false; - } - - std::shared_ptr pImg = m_Map.m_vpImages[m_SelectedImage]; - Graphics()->UnloadTexture(&(pImg->m_Texture)); - pImg->Free(); - pImg->m_Width = ImgInfo.m_Width; - pImg->m_Height = ImgInfo.m_Height; - pImg->m_Format = ImgInfo.m_Format; - pImg->m_pData = ImgInfo.m_pData; - str_copy(pImg->m_aName, aBuf); - pImg->m_External = IsVanillaImage(pImg->m_aName); - - ConvertToRgba(*pImg); - if(g_Config.m_ClEditorDilate == 1) - { - DilateImage(*pImg); - } - - pImg->m_AutoMapper.Load(pImg->m_aName); - int TextureLoadFlag = Graphics()->Uses2DTextureArrays() ? IGraphics::TEXLOAD_TO_2D_ARRAY_TEXTURE : IGraphics::TEXLOAD_TO_3D_TEXTURE; - if(pImg->m_Width % 16 != 0 || pImg->m_Height % 16 != 0) - TextureLoadFlag = 0; - pImg->m_Texture = Graphics()->LoadTextureRaw(*pImg, TextureLoadFlag, pFileName); - - SortImages(); - for(size_t i = 0; i < m_Map.m_vpImages.size(); ++i) - { - if(!str_comp(m_Map.m_vpImages[i]->m_aName, pImg->m_aName)) - m_SelectedImage = i; - } - m_Dialog = DIALOG_NONE; - return true; -} - -bool CEditor::ReplaceImageCallback(const char *pFileName, int StorageType, void *pUser) -{ - return static_cast(pUser)->ReplaceImage(pFileName, StorageType, true); -} - -bool CEditor::AddImage(const char *pFileName, int StorageType, void *pUser) -{ - CEditor *pEditor = (CEditor *)pUser; - - // check if we have that image already - char aBuf[128]; - IStorage::StripPathAndExtension(pFileName, aBuf, sizeof(aBuf)); - for(const auto &pImage : pEditor->m_Map.m_vpImages) - { - if(!str_comp(pImage->m_aName, aBuf)) - { - pEditor->ShowFileDialogError("Image named '%s' was already added.", pImage->m_aName); - return false; - } - } - - if(pEditor->m_Map.m_vpImages.size() >= MAX_MAPIMAGES) - { - pEditor->m_PopupEventType = POPEVENT_IMAGE_MAX; - pEditor->m_PopupEventActivated = true; - return false; - } - - CImageInfo ImgInfo; - if(!pEditor->Graphics()->LoadPng(ImgInfo, pFileName, StorageType)) - { - pEditor->ShowFileDialogError("Failed to load image from file '%s'.", pFileName); - return false; - } - - std::shared_ptr pImg = std::make_shared(pEditor); - pImg->m_Width = ImgInfo.m_Width; - pImg->m_Height = ImgInfo.m_Height; - pImg->m_Format = ImgInfo.m_Format; - pImg->m_pData = ImgInfo.m_pData; - pImg->m_External = IsVanillaImage(aBuf); - - ConvertToRgba(*pImg); - if(g_Config.m_ClEditorDilate == 1) - { - DilateImage(*pImg); - } - - int TextureLoadFlag = pEditor->Graphics()->Uses2DTextureArrays() ? IGraphics::TEXLOAD_TO_2D_ARRAY_TEXTURE : IGraphics::TEXLOAD_TO_3D_TEXTURE; - if(pImg->m_Width % 16 != 0 || pImg->m_Height % 16 != 0) - TextureLoadFlag = 0; - pImg->m_Texture = pEditor->Graphics()->LoadTextureRaw(*pImg, TextureLoadFlag, pFileName); - str_copy(pImg->m_aName, aBuf); - pImg->m_AutoMapper.Load(pImg->m_aName); - pEditor->m_Map.m_vpImages.push_back(pImg); - pEditor->SortImages(); - if(pEditor->m_SelectedImage >= 0 && (size_t)pEditor->m_SelectedImage < pEditor->m_Map.m_vpImages.size()) - { - for(int i = 0; i <= pEditor->m_SelectedImage; ++i) - if(!str_comp(pEditor->m_Map.m_vpImages[i]->m_aName, aBuf)) - { - pEditor->m_SelectedImage++; - break; - } - } - pEditor->m_Dialog = DIALOG_NONE; - return true; -} - -bool CEditor::AddSound(const char *pFileName, int StorageType, void *pUser) -{ - CEditor *pEditor = (CEditor *)pUser; - - // check if we have that sound already - char aBuf[128]; - IStorage::StripPathAndExtension(pFileName, aBuf, sizeof(aBuf)); - for(const auto &pSound : pEditor->m_Map.m_vpSounds) - { - if(!str_comp(pSound->m_aName, aBuf)) - { - pEditor->ShowFileDialogError("Sound named '%s' was already added.", pSound->m_aName); - return false; - } - } - - if(pEditor->m_Map.m_vpSounds.size() >= MAX_MAPSOUNDS) - { - pEditor->m_PopupEventType = POPEVENT_SOUND_MAX; - pEditor->m_PopupEventActivated = true; - return false; - } - - // load external - void *pData; - unsigned DataSize; - if(!pEditor->Storage()->ReadFile(pFileName, StorageType, &pData, &DataSize)) - { - pEditor->ShowFileDialogError("Failed to open sound file '%s'.", pFileName); - return false; - } - - // load sound - const int SoundId = pEditor->Sound()->LoadOpusFromMem(pData, DataSize, true); - if(SoundId == -1) - { - free(pData); - pEditor->ShowFileDialogError("Failed to load sound from file '%s'.", pFileName); - return false; - } - - // add sound - std::shared_ptr pSound = std::make_shared(pEditor); - pSound->m_SoundId = SoundId; - pSound->m_DataSize = DataSize; - pSound->m_pData = pData; - str_copy(pSound->m_aName, aBuf); - pEditor->m_Map.m_vpSounds.push_back(pSound); - - if(pEditor->m_SelectedSound >= 0 && (size_t)pEditor->m_SelectedSound < pEditor->m_Map.m_vpSounds.size()) - { - for(int i = 0; i <= pEditor->m_SelectedSound; ++i) - if(!str_comp(pEditor->m_Map.m_vpSounds[i]->m_aName, aBuf)) - { - pEditor->m_SelectedSound++; - break; - } - } - - pEditor->OnDialogClose(); - pEditor->m_Dialog = DIALOG_NONE; - return true; -} - -bool CEditor::ReplaceSound(const char *pFileName, int StorageType, bool CheckDuplicate) -{ - // check if we have that sound already - char aBuf[128]; - IStorage::StripPathAndExtension(pFileName, aBuf, sizeof(aBuf)); - if(CheckDuplicate) - { - for(const auto &pSound : m_Map.m_vpSounds) - { - if(!str_comp(pSound->m_aName, aBuf)) - { - ShowFileDialogError("Sound named '%s' was already added.", pSound->m_aName); - return false; - } - } - } - - // load external - void *pData; - unsigned DataSize; - if(!Storage()->ReadFile(pFileName, StorageType, &pData, &DataSize)) - { - ShowFileDialogError("Failed to open sound file '%s'.", pFileName); - return false; - } - - // load sound - const int SoundId = Sound()->LoadOpusFromMem(pData, DataSize, true); - if(SoundId == -1) - { - free(pData); - ShowFileDialogError("Failed to load sound from file '%s'.", pFileName); - return false; - } - - std::shared_ptr pSound = m_Map.m_vpSounds[m_SelectedSound]; - - // unload sample - Sound()->UnloadSample(pSound->m_SoundId); - free(pSound->m_pData); - - // replace sound - str_copy(pSound->m_aName, aBuf); - pSound->m_SoundId = SoundId; - pSound->m_pData = pData; - pSound->m_DataSize = DataSize; - - OnDialogClose(); - m_Dialog = DIALOG_NONE; - return true; -} - -bool CEditor::ReplaceSoundCallback(const char *pFileName, int StorageType, void *pUser) -{ - return static_cast(pUser)->ReplaceSound(pFileName, StorageType, true); -} - -void CEditor::SelectGameLayer() -{ - for(size_t g = 0; g < m_Map.m_vpGroups.size(); g++) - { - for(size_t i = 0; i < m_Map.m_vpGroups[g]->m_vpLayers.size(); i++) - { - if(m_Map.m_vpGroups[g]->m_vpLayers[i] == m_Map.m_pGameLayer) - { - SelectLayer(i, g); - return; - } - } - } -} - -std::vector CEditor::SortImages() -{ - static const auto &&s_ImageNameComparator = [](const std::shared_ptr &pLhs, const std::shared_ptr &pRhs) { - return str_comp(pLhs->m_aName, pRhs->m_aName) < 0; - }; - if(!std::is_sorted(m_Map.m_vpImages.begin(), m_Map.m_vpImages.end(), s_ImageNameComparator)) - { - const std::vector> vpTemp = m_Map.m_vpImages; - std::vector vSortedIndex; - vSortedIndex.resize(vpTemp.size()); - - std::sort(m_Map.m_vpImages.begin(), m_Map.m_vpImages.end(), s_ImageNameComparator); - for(size_t OldIndex = 0; OldIndex < vpTemp.size(); OldIndex++) - { - for(size_t NewIndex = 0; NewIndex < m_Map.m_vpImages.size(); NewIndex++) - { - if(vpTemp[OldIndex] == m_Map.m_vpImages[NewIndex]) - { - vSortedIndex[OldIndex] = NewIndex; - break; - } - } - } - m_Map.ModifyImageIndex([vSortedIndex](int *pIndex) { - if(*pIndex >= 0) - *pIndex = vSortedIndex[*pIndex]; - }); - - return vSortedIndex; - } - - return std::vector(); -} - -void CEditor::RenderImagesList(CUIRect ToolBox) -{ - const float RowHeight = 12.0f; - - static CScrollRegion s_ScrollRegion; - vec2 ScrollOffset(0.0f, 0.0f); - CScrollRegionParams ScrollParams; - ScrollParams.m_ScrollbarWidth = 10.0f; - ScrollParams.m_ScrollbarMargin = 3.0f; - ScrollParams.m_ScrollUnit = RowHeight * 5; - s_ScrollRegion.Begin(&ToolBox, &ScrollOffset, &ScrollParams); - ToolBox.y += ScrollOffset.y; - - bool ScrollToSelection = false; - if(m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && !m_Map.m_vpImages.empty()) - { - if(Input()->KeyPress(KEY_DOWN)) - { - int OldImage = m_SelectedImage; - m_SelectedImage = clamp(m_SelectedImage, 0, (int)m_Map.m_vpImages.size() - 1); - for(size_t i = m_SelectedImage + 1; i < m_Map.m_vpImages.size(); i++) - { - if(m_Map.m_vpImages[i]->m_External == m_Map.m_vpImages[m_SelectedImage]->m_External) - { - m_SelectedImage = i; - break; - } - } - if(m_SelectedImage == OldImage && !m_Map.m_vpImages[m_SelectedImage]->m_External) - { - for(size_t i = 0; i < m_Map.m_vpImages.size(); i++) - { - if(m_Map.m_vpImages[i]->m_External) - { - m_SelectedImage = i; - break; - } - } - } - ScrollToSelection = OldImage != m_SelectedImage; - } - else if(Input()->KeyPress(KEY_UP)) - { - int OldImage = m_SelectedImage; - m_SelectedImage = clamp(m_SelectedImage, 0, (int)m_Map.m_vpImages.size() - 1); - for(int i = m_SelectedImage - 1; i >= 0; i--) - { - if(m_Map.m_vpImages[i]->m_External == m_Map.m_vpImages[m_SelectedImage]->m_External) - { - m_SelectedImage = i; - break; - } - } - if(m_SelectedImage == OldImage && m_Map.m_vpImages[m_SelectedImage]->m_External) - { - for(int i = (int)m_Map.m_vpImages.size() - 1; i >= 0; i--) - { - if(!m_Map.m_vpImages[i]->m_External) - { - m_SelectedImage = i; - break; - } - } - } - ScrollToSelection = OldImage != m_SelectedImage; - } - } - - for(int e = 0; e < 2; e++) // two passes, first embedded, then external - { - CUIRect Slot; - ToolBox.HSplitTop(RowHeight + 3.0f, &Slot, &ToolBox); - if(s_ScrollRegion.AddRect(Slot)) - Ui()->DoLabel(&Slot, e == 0 ? "Embedded" : "External", 12.0f, TEXTALIGN_MC); - - for(int i = 0; i < (int)m_Map.m_vpImages.size(); i++) - { - if((e && !m_Map.m_vpImages[i]->m_External) || - (!e && m_Map.m_vpImages[i]->m_External)) - { - continue; - } - - ToolBox.HSplitTop(RowHeight + 2.0f, &Slot, &ToolBox); - int Selected = m_SelectedImage == i; - if(!s_ScrollRegion.AddRect(Slot, Selected && ScrollToSelection)) - continue; - Slot.HSplitTop(RowHeight, &Slot, nullptr); - - const bool ImageUsed = std::any_of(m_Map.m_vpGroups.cbegin(), m_Map.m_vpGroups.cend(), [i](const auto &pGroup) { - return std::any_of(pGroup->m_vpLayers.cbegin(), pGroup->m_vpLayers.cend(), [i](const auto &pLayer) { - if(pLayer->m_Type == LAYERTYPE_QUADS) - return std::static_pointer_cast(pLayer)->m_Image == i; - else if(pLayer->m_Type == LAYERTYPE_TILES) - return std::static_pointer_cast(pLayer)->m_Image == i; - return false; - }); - }); - - if(!ImageUsed) - Selected += 2; // Image is unused - - if(Selected < 2 && e == 1) - { - if(!IsVanillaImage(m_Map.m_vpImages[i]->m_aName)) - { - Selected += 4; // Image should be embedded - } - } - - if(int Result = DoButton_Ex(&m_Map.m_vpImages[i], m_Map.m_vpImages[i]->m_aName, Selected, &Slot, - BUTTON_CONTEXT, "Select image.", IGraphics::CORNER_ALL)) - { - m_SelectedImage = i; - - if(Result == 2) - { - const std::shared_ptr pImg = m_Map.m_vpImages[m_SelectedImage]; - const int Height = pImg->m_External ? 73 : 107; - static SPopupMenuId s_PopupImageId; - Ui()->DoPopupMenu(&s_PopupImageId, Ui()->MouseX(), Ui()->MouseY(), 140, Height, this, PopupImage); - } - } - } - - // separator - ToolBox.HSplitTop(5.0f, &Slot, &ToolBox); - if(s_ScrollRegion.AddRect(Slot)) - { - IGraphics::CLineItem LineItem(Slot.x, Slot.y + Slot.h / 2, Slot.x + Slot.w, Slot.y + Slot.h / 2); - Graphics()->TextureClear(); - Graphics()->LinesBegin(); - Graphics()->LinesDraw(&LineItem, 1); - Graphics()->LinesEnd(); - } - } - - // new image - static int s_AddImageButton = 0; - CUIRect AddImageButton; - ToolBox.HSplitTop(5.0f + RowHeight + 1.0f, &AddImageButton, &ToolBox); - if(s_ScrollRegion.AddRect(AddImageButton)) - { - AddImageButton.HSplitTop(5.0f, nullptr, &AddImageButton); - AddImageButton.HSplitTop(RowHeight, &AddImageButton, nullptr); - if(DoButton_Editor(&s_AddImageButton, m_QuickActionAddImage.Label(), 0, &AddImageButton, 0, m_QuickActionAddImage.Description())) - m_QuickActionAddImage.Call(); - } - s_ScrollRegion.End(); -} - -void CEditor::RenderSelectedImage(CUIRect View) -{ - if(m_SelectedImage < 0 || (size_t)m_SelectedImage >= m_Map.m_vpImages.size()) - return; - - View.Margin(10.0f, &View); - if(View.h < View.w) - View.w = View.h; - else - View.h = View.w; - float Max = maximum(m_Map.m_vpImages[m_SelectedImage]->m_Width, m_Map.m_vpImages[m_SelectedImage]->m_Height); - View.w *= m_Map.m_vpImages[m_SelectedImage]->m_Width / Max; - View.h *= m_Map.m_vpImages[m_SelectedImage]->m_Height / Max; - Graphics()->TextureSet(m_Map.m_vpImages[m_SelectedImage]->m_Texture); - Graphics()->BlendNormal(); - Graphics()->WrapClamp(); - Graphics()->QuadsBegin(); - IGraphics::CQuadItem QuadItem(View.x, View.y, View.w, View.h); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); - Graphics()->WrapNormal(); -} - -void CEditor::RenderSounds(CUIRect ToolBox) -{ - const float RowHeight = 12.0f; - - static CScrollRegion s_ScrollRegion; - vec2 ScrollOffset(0.0f, 0.0f); - CScrollRegionParams ScrollParams; - ScrollParams.m_ScrollbarWidth = 10.0f; - ScrollParams.m_ScrollbarMargin = 3.0f; - ScrollParams.m_ScrollUnit = RowHeight * 5; - s_ScrollRegion.Begin(&ToolBox, &ScrollOffset, &ScrollParams); - ToolBox.y += ScrollOffset.y; - - bool ScrollToSelection = false; - if(m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && !m_Map.m_vpSounds.empty()) - { - if(Input()->KeyPress(KEY_DOWN)) - { - m_SelectedSound = (m_SelectedSound + 1) % m_Map.m_vpSounds.size(); - ScrollToSelection = true; - } - else if(Input()->KeyPress(KEY_UP)) - { - m_SelectedSound = (m_SelectedSound + m_Map.m_vpSounds.size() - 1) % m_Map.m_vpSounds.size(); - ScrollToSelection = true; - } - } - - CUIRect Slot; - ToolBox.HSplitTop(RowHeight + 3.0f, &Slot, &ToolBox); - if(s_ScrollRegion.AddRect(Slot)) - Ui()->DoLabel(&Slot, "Embedded", 12.0f, TEXTALIGN_MC); - - for(int i = 0; i < (int)m_Map.m_vpSounds.size(); i++) - { - ToolBox.HSplitTop(RowHeight + 2.0f, &Slot, &ToolBox); - int Selected = m_SelectedSound == i; - if(!s_ScrollRegion.AddRect(Slot, Selected && ScrollToSelection)) - continue; - Slot.HSplitTop(RowHeight, &Slot, nullptr); - - const bool SoundUsed = std::any_of(m_Map.m_vpGroups.cbegin(), m_Map.m_vpGroups.cend(), [i](const auto &pGroup) { - return std::any_of(pGroup->m_vpLayers.cbegin(), pGroup->m_vpLayers.cend(), [i](const auto &pLayer) { - if(pLayer->m_Type == LAYERTYPE_SOUNDS) - return std::static_pointer_cast(pLayer)->m_Sound == i; - return false; - }); - }); - - if(!SoundUsed) - Selected += 2; // Sound is unused - - if(int Result = DoButton_Ex(&m_Map.m_vpSounds[i], m_Map.m_vpSounds[i]->m_aName, Selected, &Slot, - BUTTON_CONTEXT, "Select sound.", IGraphics::CORNER_ALL)) - { - m_SelectedSound = i; - - if(Result == 2) - { - static SPopupMenuId s_PopupSoundId; - Ui()->DoPopupMenu(&s_PopupSoundId, Ui()->MouseX(), Ui()->MouseY(), 140, 90, this, PopupSound); - } - } - } - - // separator - ToolBox.HSplitTop(5.0f, &Slot, &ToolBox); - if(s_ScrollRegion.AddRect(Slot)) - { - IGraphics::CLineItem LineItem(Slot.x, Slot.y + Slot.h / 2, Slot.x + Slot.w, Slot.y + Slot.h / 2); - Graphics()->TextureClear(); - Graphics()->LinesBegin(); - Graphics()->LinesDraw(&LineItem, 1); - Graphics()->LinesEnd(); - } - - // new sound - static int s_AddSoundButton = 0; - CUIRect AddSoundButton; - ToolBox.HSplitTop(5.0f + RowHeight + 1.0f, &AddSoundButton, &ToolBox); - if(s_ScrollRegion.AddRect(AddSoundButton)) - { - AddSoundButton.HSplitTop(5.0f, nullptr, &AddSoundButton); - AddSoundButton.HSplitTop(RowHeight, &AddSoundButton, nullptr); - if(DoButton_Editor(&s_AddSoundButton, "Add", 0, &AddSoundButton, 0, "Load a new sound to use in the map")) - InvokeFileDialog(IStorage::TYPE_ALL, FILETYPE_SOUND, "Add Sound", "Add", "mapres", false, AddSound, this); - } - s_ScrollRegion.End(); -} - -static int EditorListdirCallback(const CFsFileInfo *pInfo, int IsDir, int StorageType, void *pUser) -{ - CEditor *pEditor = (CEditor *)pUser; - if((pInfo->m_pName[0] == '.' && (pInfo->m_pName[1] == 0 || - (pInfo->m_pName[1] == '.' && pInfo->m_pName[2] == 0 && (pEditor->m_FileDialogShowingRoot || (!pEditor->m_FileDialogMultipleStorages && (!str_comp(pEditor->m_pFileDialogPath, "maps") || !str_comp(pEditor->m_pFileDialogPath, "mapres"))))))) || - (!IsDir && ((pEditor->m_FileDialogFileType == CEditor::FILETYPE_MAP && !str_endswith(pInfo->m_pName, ".map")) || - (pEditor->m_FileDialogFileType == CEditor::FILETYPE_IMG && !str_endswith(pInfo->m_pName, ".png")) || - (pEditor->m_FileDialogFileType == CEditor::FILETYPE_SOUND && !str_endswith(pInfo->m_pName, ".opus"))))) - return 0; - - CEditor::CFilelistItem Item; - str_copy(Item.m_aFilename, pInfo->m_pName); - if(IsDir) - str_format(Item.m_aName, sizeof(Item.m_aName), "%s/", pInfo->m_pName); - else - { - int LenEnding = pEditor->m_FileDialogFileType == CEditor::FILETYPE_SOUND ? 5 : 4; - str_truncate(Item.m_aName, sizeof(Item.m_aName), pInfo->m_pName, str_length(pInfo->m_pName) - LenEnding); - } - Item.m_IsDir = IsDir != 0; - Item.m_IsLink = false; - Item.m_StorageType = StorageType; - Item.m_TimeModified = pInfo->m_TimeModified; - pEditor->m_vCompleteFileList.push_back(Item); - - return 0; -} - -void CEditor::SortFilteredFileList() -{ - if(m_SortByFilename == 1) - { - std::sort(m_vpFilteredFileList.begin(), m_vpFilteredFileList.end(), CEditor::CompareFilenameAscending); - } - else - { - std::sort(m_vpFilteredFileList.begin(), m_vpFilteredFileList.end(), CEditor::CompareFilenameDescending); - } - - if(m_SortByTimeModified == 1) - { - std::stable_sort(m_vpFilteredFileList.begin(), m_vpFilteredFileList.end(), CEditor::CompareTimeModifiedAscending); - } - else if(m_SortByTimeModified == -1) - { - std::stable_sort(m_vpFilteredFileList.begin(), m_vpFilteredFileList.end(), CEditor::CompareTimeModifiedDescending); - } -} - -void CEditor::RenderFileDialog() -{ - // GUI coordsys - Ui()->MapScreen(); - CUIRect View = *Ui()->Screen(); - CUIRect Preview = {0.0f, 0.0f, 0.0f, 0.0f}; - float Width = View.w, Height = View.h; - - View.Draw(ColorRGBA(0, 0, 0, 0.25f), 0, 0); - View.VMargin(150.0f, &View); - View.HMargin(50.0f, &View); - View.Draw(ColorRGBA(0, 0, 0, 0.75f), IGraphics::CORNER_ALL, 5.0f); - View.Margin(10.0f, &View); - - CUIRect Title, FileBox, FileBoxLabel, ButtonBar, PathBox; - View.HSplitTop(18.0f, &Title, &View); - View.HSplitTop(5.0f, nullptr, &View); // some spacing - View.HSplitBottom(14.0f, &View, &ButtonBar); - View.HSplitBottom(10.0f, &View, nullptr); // some spacing - View.HSplitBottom(14.0f, &View, &PathBox); - View.HSplitBottom(5.0f, &View, nullptr); // some spacing - View.HSplitBottom(14.0f, &View, &FileBox); - FileBox.VSplitLeft(55.0f, &FileBoxLabel, &FileBox); - View.HSplitBottom(10.0f, &View, nullptr); // some spacing - if(m_FileDialogFileType == CEditor::FILETYPE_IMG || m_FileDialogFileType == CEditor::FILETYPE_SOUND) - View.VSplitMid(&View, &Preview); - - // title bar - if(!m_FileDialogShowingRoot) - { - CUIRect ButtonTimeModified, ButtonFileName; - Title.VSplitRight(10.0f, &Title, nullptr); - Title.VSplitRight(90.0f, &Title, &ButtonTimeModified); - Title.VSplitRight(10.0f, &Title, nullptr); - Title.VSplitRight(90.0f, &Title, &ButtonFileName); - Title.VSplitRight(10.0f, &Title, nullptr); - - const char *aSortIndicator[3] = {"▼", "", "▲"}; - - static int s_ButtonTimeModified = 0; - char aBufLabelButtonTimeModified[64]; - str_format(aBufLabelButtonTimeModified, sizeof(aBufLabelButtonTimeModified), "Time modified %s", aSortIndicator[m_SortByTimeModified + 1]); - if(DoButton_Editor(&s_ButtonTimeModified, aBufLabelButtonTimeModified, 0, &ButtonTimeModified, 0, "Sort by time modified")) - { - if(m_SortByTimeModified == 1) - { - m_SortByTimeModified = -1; - } - else if(m_SortByTimeModified == -1) - { - m_SortByTimeModified = 0; - } - else - { - m_SortByTimeModified = 1; - } - - RefreshFilteredFileList(); - } - - static int s_ButtonFileName = 0; - char aBufLabelButtonFilename[64]; - str_format(aBufLabelButtonFilename, sizeof(aBufLabelButtonFilename), "Filename %s", aSortIndicator[m_SortByFilename + 1]); - if(DoButton_Editor(&s_ButtonFileName, aBufLabelButtonFilename, 0, &ButtonFileName, 0, "Sort by file name")) - { - if(m_SortByFilename == 1) - { - m_SortByFilename = -1; - m_SortByTimeModified = 0; - } - else - { - m_SortByFilename = 1; - m_SortByTimeModified = 0; - } - - RefreshFilteredFileList(); - } - } - - Title.Draw(ColorRGBA(1, 1, 1, 0.25f), IGraphics::CORNER_ALL, 4.0f); - Title.VMargin(10.0f, &Title); - Ui()->DoLabel(&Title, m_pFileDialogTitle, 12.0f, TEXTALIGN_ML); - - // pathbox - if(m_FilesSelectedIndex >= 0 && m_vpFilteredFileList[m_FilesSelectedIndex]->m_StorageType >= IStorage::TYPE_SAVE) - { - char aPath[IO_MAX_PATH_LENGTH], aBuf[128 + IO_MAX_PATH_LENGTH]; - Storage()->GetCompletePath(m_vpFilteredFileList[m_FilesSelectedIndex]->m_StorageType, m_pFileDialogPath, aPath, sizeof(aPath)); - str_format(aBuf, sizeof(aBuf), "Current path: %s", aPath); - Ui()->DoLabel(&PathBox, aBuf, 10.0f, TEXTALIGN_ML); - } - - // filebox - static CListBox s_ListBox; - s_ListBox.SetActive(!Ui()->IsPopupOpen()); - - const auto &&UpdateFileNameInput = [this]() { - if(m_FilesSelectedIndex >= 0 && !m_vpFilteredFileList[m_FilesSelectedIndex]->m_IsDir) - { - char aNameWithoutExt[IO_MAX_PATH_LENGTH]; - fs_split_file_extension(m_vpFilteredFileList[m_FilesSelectedIndex]->m_aFilename, aNameWithoutExt, sizeof(aNameWithoutExt)); - m_FileDialogFileNameInput.Set(aNameWithoutExt); - } - else - m_FileDialogFileNameInput.Clear(); - }; - const auto &&UpdateSelectedIndex = [&]() { - m_FilesSelectedIndex = -1; - m_aFilesSelectedName[0] = '\0'; - // find first valid entry, if it exists - for(size_t i = 0; i < m_vpFilteredFileList.size(); i++) - { - if(str_comp_nocase(m_vpFilteredFileList[i]->m_aName, m_FileDialogFileNameInput.GetString()) == 0) - { - m_FilesSelectedIndex = i; - str_copy(m_aFilesSelectedName, m_vpFilteredFileList[i]->m_aName); - break; - } - } - if(m_FilesSelectedIndex >= 0) - s_ListBox.ScrollToSelected(); - }; - - if(m_FileDialogSaveAction) - { - Ui()->DoLabel(&FileBoxLabel, "Filename:", 10.0f, TEXTALIGN_ML); - if(DoEditBox(&m_FileDialogFileNameInput, &FileBox, 10.0f)) - { - // remove '/' and '\' - for(int i = 0; m_FileDialogFileNameInput.GetString()[i]; ++i) - { - if(m_FileDialogFileNameInput.GetString()[i] == '/' || m_FileDialogFileNameInput.GetString()[i] == '\\') - { - m_FileDialogFileNameInput.SetRange(m_FileDialogFileNameInput.GetString() + i + 1, i, m_FileDialogFileNameInput.GetLength()); - --i; - } - } - UpdateSelectedIndex(); - } - - if(m_FileDialogOpening) - { - Ui()->SetActiveItem(&m_FileDialogFileNameInput); - if(!m_FileDialogFileNameInput.IsEmpty()) - { - UpdateSelectedIndex(); - } - } - } - else - { - // render search bar - Ui()->DoLabel(&FileBoxLabel, "Search:", 10.0f, TEXTALIGN_ML); - if(m_FileDialogOpening || (Input()->KeyPress(KEY_F) && Input()->ModifierIsPressed())) - { - Ui()->SetActiveItem(&m_FileDialogFilterInput); - m_FileDialogFilterInput.SelectAll(); - } - if(m_FileDialogOpening) - { - UpdateFileNameInput(); - } - if(Ui()->DoClearableEditBox(&m_FileDialogFilterInput, &FileBox, 10.0f)) - { - RefreshFilteredFileList(); - if(m_vpFilteredFileList.empty()) - { - m_FilesSelectedIndex = -1; - } - else if(m_FilesSelectedIndex == -1 || (!m_FileDialogFilterInput.IsEmpty() && !str_find_nocase(m_vpFilteredFileList[m_FilesSelectedIndex]->m_aName, m_FileDialogFilterInput.GetString()))) - { - // we need to refresh selection - m_FilesSelectedIndex = -1; - for(size_t i = 0; i < m_vpFilteredFileList.size(); i++) - { - if(str_find_nocase(m_vpFilteredFileList[i]->m_aName, m_FileDialogFilterInput.GetString())) - { - m_FilesSelectedIndex = i; - break; - } - } - if(m_FilesSelectedIndex == -1) - { - // select first item - m_FilesSelectedIndex = 0; - } - } - if(m_FilesSelectedIndex >= 0) - str_copy(m_aFilesSelectedName, m_vpFilteredFileList[m_FilesSelectedIndex]->m_aName); - else - m_aFilesSelectedName[0] = '\0'; - UpdateFileNameInput(); - s_ListBox.ScrollToSelected(); - m_FilePreviewState = PREVIEW_UNLOADED; - } - } - - m_FileDialogOpening = false; - - if(m_FilesSelectedIndex > -1) - { - if(m_FilePreviewState == PREVIEW_UNLOADED) - { - if(m_FileDialogFileType == CEditor::FILETYPE_IMG && str_endswith(m_vpFilteredFileList[m_FilesSelectedIndex]->m_aFilename, ".png")) - { - char aBuffer[IO_MAX_PATH_LENGTH]; - str_format(aBuffer, sizeof(aBuffer), "%s/%s", m_pFileDialogPath, m_vpFilteredFileList[m_FilesSelectedIndex]->m_aFilename); - CImageInfo PreviewImageInfo; - if(Graphics()->LoadPng(PreviewImageInfo, aBuffer, m_vpFilteredFileList[m_FilesSelectedIndex]->m_StorageType)) - { - Graphics()->UnloadTexture(&m_FilePreviewImage); - m_FilePreviewImageWidth = PreviewImageInfo.m_Width; - m_FilePreviewImageHeight = PreviewImageInfo.m_Height; - m_FilePreviewImage = Graphics()->LoadTextureRawMove(PreviewImageInfo, 0, aBuffer); - m_FilePreviewState = PREVIEW_LOADED; - } - else - { - m_FilePreviewState = PREVIEW_ERROR; - } - } - else if(m_FileDialogFileType == CEditor::FILETYPE_SOUND && str_endswith(m_vpFilteredFileList[m_FilesSelectedIndex]->m_aFilename, ".opus")) - { - char aBuffer[IO_MAX_PATH_LENGTH]; - str_format(aBuffer, sizeof(aBuffer), "%s/%s", m_pFileDialogPath, m_vpFilteredFileList[m_FilesSelectedIndex]->m_aFilename); - Sound()->UnloadSample(m_FilePreviewSound); - m_FilePreviewSound = Sound()->LoadOpus(aBuffer, m_vpFilteredFileList[m_FilesSelectedIndex]->m_StorageType); - m_FilePreviewState = m_FilePreviewSound == -1 ? PREVIEW_ERROR : PREVIEW_LOADED; - } - } - - if(m_FileDialogFileType == CEditor::FILETYPE_IMG) - { - Preview.Margin(10.0f, &Preview); - if(m_FilePreviewState == PREVIEW_LOADED) - { - CUIRect PreviewLabel, PreviewImage; - Preview.HSplitTop(20.0f, &PreviewLabel, &PreviewImage); - - char aLabel[64]; - str_format(aLabel, sizeof(aLabel), "Size: %d × %d", m_FilePreviewImageWidth, m_FilePreviewImageHeight); - Ui()->DoLabel(&PreviewLabel, aLabel, 12.0f, TEXTALIGN_ML); - - int w = m_FilePreviewImageWidth; - int h = m_FilePreviewImageHeight; - if(m_FilePreviewImageWidth > PreviewImage.w) - { - h = m_FilePreviewImageHeight * PreviewImage.w / m_FilePreviewImageWidth; - w = PreviewImage.w; - } - if(h > PreviewImage.h) - { - w = w * PreviewImage.h / h; - h = PreviewImage.h; - } - - Graphics()->TextureSet(m_FilePreviewImage); - Graphics()->BlendNormal(); - Graphics()->QuadsBegin(); - IGraphics::CQuadItem QuadItem(PreviewImage.x, PreviewImage.y, w, h); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); - } - else if(m_FilePreviewState == PREVIEW_ERROR) - { - SLabelProperties Props; - Props.m_MaxWidth = Preview.w; - Ui()->DoLabel(&Preview, "Failed to load the image (check the local console for details).", 12.0f, TEXTALIGN_TL, Props); - } - } - else if(m_FileDialogFileType == CEditor::FILETYPE_SOUND) - { - Preview.Margin(10.0f, &Preview); - if(m_FilePreviewState == PREVIEW_LOADED) - { - Preview.HSplitTop(20.0f, &Preview, nullptr); - Preview.VSplitLeft(Preview.h / 4.0f, nullptr, &Preview); - - static int s_PlayPauseButton, s_StopButton, s_SeekBar = 0; - DoAudioPreview(Preview, &s_PlayPauseButton, &s_StopButton, &s_SeekBar, m_FilePreviewSound); - } - else if(m_FilePreviewState == PREVIEW_ERROR) - { - SLabelProperties Props; - Props.m_MaxWidth = Preview.w; - Ui()->DoLabel(&Preview, "Failed to load the sound (check the local console for details). Make sure you enabled sounds in the settings.", 12.0f, TEXTALIGN_TL, Props); - } - } - } - - s_ListBox.DoStart(15.0f, m_vpFilteredFileList.size(), 1, 5, m_FilesSelectedIndex, &View, false); - - for(size_t i = 0; i < m_vpFilteredFileList.size(); i++) - { - const CListboxItem Item = s_ListBox.DoNextItem(m_vpFilteredFileList[i], m_FilesSelectedIndex >= 0 && (size_t)m_FilesSelectedIndex == i); - if(!Item.m_Visible) - continue; - - CUIRect Button, FileIcon, TimeModified; - Item.m_Rect.VSplitLeft(Item.m_Rect.h, &FileIcon, &Button); - Button.VSplitLeft(5.0f, nullptr, &Button); - Button.VSplitRight(100.0f, &Button, &TimeModified); - Button.VSplitRight(5.0f, &Button, nullptr); - - const char *pIconType; - if(!m_vpFilteredFileList[i]->m_IsDir) - { - switch(m_FileDialogFileType) - { - case FILETYPE_MAP: - pIconType = FONT_ICON_MAP; - break; - case FILETYPE_IMG: - pIconType = FONT_ICON_IMAGE; - break; - case FILETYPE_SOUND: - pIconType = FONT_ICON_MUSIC; - break; - default: - pIconType = FONT_ICON_FILE; - } - } - else - { - if(m_vpFilteredFileList[i]->m_IsLink || str_comp(m_vpFilteredFileList[i]->m_aFilename, "..") == 0) - pIconType = FONT_ICON_FOLDER_TREE; - else - pIconType = FONT_ICON_FOLDER; - } - - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING); - Ui()->DoLabel(&FileIcon, pIconType, 12.0f, TEXTALIGN_ML); - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - - SLabelProperties Props; - Props.m_MaxWidth = Button.w; - Props.m_EllipsisAtEnd = true; - Ui()->DoLabel(&Button, m_vpFilteredFileList[i]->m_aName, 10.0f, TEXTALIGN_ML, Props); - - if(!m_vpFilteredFileList[i]->m_IsLink && str_comp(m_vpFilteredFileList[i]->m_aFilename, "..") != 0) - { - char aBufTimeModified[64]; - str_timestamp_ex(m_vpFilteredFileList[i]->m_TimeModified, aBufTimeModified, sizeof(aBufTimeModified), "%d.%m.%Y %H:%M"); - Ui()->DoLabel(&TimeModified, aBufTimeModified, 10.0f, TEXTALIGN_MR); - } - } - - const int NewSelection = s_ListBox.DoEnd(); - if(NewSelection != m_FilesSelectedIndex) - { - m_FilesSelectedIndex = NewSelection; - str_copy(m_aFilesSelectedName, m_vpFilteredFileList[m_FilesSelectedIndex]->m_aName); - const bool WasChanged = m_FileDialogFileNameInput.WasChanged(); - UpdateFileNameInput(); - if(!WasChanged) // ensure that changed flag is not set if it wasn't previously set, as this would reset the selection after DoEditBox is called - m_FileDialogFileNameInput.WasChanged(); // this clears the changed flag - m_FilePreviewState = PREVIEW_UNLOADED; - } - - const float ButtonSpacing = ButtonBar.w > 600.0f ? 40.0f : 10.0f; - - // the buttons - static int s_OkButton = 0; - static int s_CancelButton = 0; - static int s_RefreshButton = 0; - static int s_ShowDirectoryButton = 0; - static int s_DeleteButton = 0; - static int s_NewFolderButton = 0; - - CUIRect Button; - ButtonBar.VSplitRight(50.0f, &ButtonBar, &Button); - const bool IsDir = m_FilesSelectedIndex >= 0 && m_vpFilteredFileList[m_FilesSelectedIndex]->m_IsDir; - if(DoButton_Editor(&s_OkButton, IsDir ? "Open" : m_pFileDialogButtonText, 0, &Button, 0, nullptr) || s_ListBox.WasItemActivated() || (s_ListBox.Active() && Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER))) - { - if(IsDir) // folder - { - m_FileDialogFilterInput.Clear(); - Ui()->SetActiveItem(&m_FileDialogFilterInput); - const bool ParentFolder = str_comp(m_vpFilteredFileList[m_FilesSelectedIndex]->m_aFilename, "..") == 0; - if(ParentFolder) // parent folder - { - str_copy(m_aFilesSelectedName, fs_filename(m_pFileDialogPath)); - str_append(m_aFilesSelectedName, "/"); - if(fs_parent_dir(m_pFileDialogPath)) - { - if(str_comp(m_pFileDialogPath, m_aFileDialogCurrentFolder) == 0) - { - m_FileDialogShowingRoot = true; - if(m_FileDialogStorageType == IStorage::TYPE_ALL) - { - m_aFilesSelectedName[0] = '\0'; // will select first list item - } - else - { - Storage()->GetCompletePath(m_FileDialogStorageType, m_pFileDialogPath, m_aFilesSelectedName, sizeof(m_aFilesSelectedName)); - str_append(m_aFilesSelectedName, "/"); - } - } - else - { - m_pFileDialogPath = m_aFileDialogCurrentFolder; // leave the link - str_copy(m_aFilesSelectedName, m_aFileDialogCurrentLink); - str_append(m_aFilesSelectedName, "/"); - } - } - } - else // sub folder - { - if(m_vpFilteredFileList[m_FilesSelectedIndex]->m_IsLink) - { - m_pFileDialogPath = m_aFileDialogCurrentLink; // follow the link - str_copy(m_aFileDialogCurrentLink, m_vpFilteredFileList[m_FilesSelectedIndex]->m_aFilename); - } - else - { - char aTemp[IO_MAX_PATH_LENGTH]; - str_copy(aTemp, m_pFileDialogPath); - str_format(m_pFileDialogPath, IO_MAX_PATH_LENGTH, "%s/%s", aTemp, m_vpFilteredFileList[m_FilesSelectedIndex]->m_aFilename); - } - if(m_FileDialogShowingRoot) - m_FileDialogStorageType = m_vpFilteredFileList[m_FilesSelectedIndex]->m_StorageType; - m_FileDialogShowingRoot = false; - } - FilelistPopulate(m_FileDialogStorageType, ParentFolder); - UpdateFileNameInput(); - } - else // file - { - const int StorageType = m_FilesSelectedIndex >= 0 ? m_vpFilteredFileList[m_FilesSelectedIndex]->m_StorageType : m_FileDialogStorageType; - str_format(m_aFileSaveName, sizeof(m_aFileSaveName), "%s/%s", m_pFileDialogPath, m_FileDialogFileNameInput.GetString()); - if(!str_endswith(m_aFileSaveName, FILETYPE_EXTENSIONS[m_FileDialogFileType])) - str_append(m_aFileSaveName, FILETYPE_EXTENSIONS[m_FileDialogFileType]); - - if(m_FileDialogSaveAction && Storage()->FileExists(m_aFileSaveName, StorageType)) - { - if(m_pfnFileDialogFunc == &CallbackSaveMap) - m_PopupEventType = POPEVENT_SAVE; - else if(m_pfnFileDialogFunc == &CallbackSaveCopyMap) - m_PopupEventType = POPEVENT_SAVE_COPY; - else if(m_pfnFileDialogFunc == &CallbackSaveImage) - m_PopupEventType = POPEVENT_SAVE_IMG; - else if(m_pfnFileDialogFunc == &CallbackSaveSound) - m_PopupEventType = POPEVENT_SAVE_SOUND; - else - dbg_assert(false, "m_pfnFileDialogFunc unhandled for saving"); - m_PopupEventActivated = true; - } - else if(m_pfnFileDialogFunc && (m_FileDialogSaveAction || m_FilesSelectedIndex >= 0)) - { - m_pfnFileDialogFunc(m_aFileSaveName, StorageType, m_pFileDialogUser); - } - } - } - - ButtonBar.VSplitRight(ButtonSpacing, &ButtonBar, nullptr); - ButtonBar.VSplitRight(50.0f, &ButtonBar, &Button); - if(DoButton_Editor(&s_CancelButton, "Cancel", 0, &Button, 0, nullptr) || (s_ListBox.Active() && Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE))) - { - OnDialogClose(); - m_Dialog = DIALOG_NONE; - } - - ButtonBar.VSplitRight(ButtonSpacing, &ButtonBar, nullptr); - ButtonBar.VSplitRight(50.0f, &ButtonBar, &Button); - if(DoButton_Editor(&s_RefreshButton, "Refresh", 0, &Button, 0, nullptr) || (s_ListBox.Active() && (Input()->KeyIsPressed(KEY_F5) || (Input()->ModifierIsPressed() && Input()->KeyIsPressed(KEY_R))))) - FilelistPopulate(m_FileDialogLastPopulatedStorageType, true); - - if(m_FilesSelectedIndex >= 0 && m_vpFilteredFileList[m_FilesSelectedIndex]->m_StorageType != IStorage::TYPE_ALL) - { - ButtonBar.VSplitRight(ButtonSpacing, &ButtonBar, nullptr); - ButtonBar.VSplitRight(90.0f, &ButtonBar, &Button); - if(DoButton_Editor(&s_ShowDirectoryButton, "Show directory", 0, &Button, 0, "Open the current directory in the file browser")) - { - char aOpenPath[IO_MAX_PATH_LENGTH]; - Storage()->GetCompletePath(m_FilesSelectedIndex >= 0 ? m_vpFilteredFileList[m_FilesSelectedIndex]->m_StorageType : IStorage::TYPE_SAVE, m_pFileDialogPath, aOpenPath, sizeof(aOpenPath)); - if(!Client()->ViewFile(aOpenPath)) - { - ShowFileDialogError("Failed to open the directory '%s'.", aOpenPath); - } - } - } - - ButtonBar.VSplitRight(ButtonSpacing, &ButtonBar, nullptr); - ButtonBar.VSplitRight(50.0f, &ButtonBar, &Button); - static CUi::SConfirmPopupContext s_ConfirmDeletePopupContext; - if(m_FilesSelectedIndex >= 0 && m_vpFilteredFileList[m_FilesSelectedIndex]->m_StorageType == IStorage::TYPE_SAVE && !m_vpFilteredFileList[m_FilesSelectedIndex]->m_IsLink && str_comp(m_vpFilteredFileList[m_FilesSelectedIndex]->m_aFilename, "..") != 0) - { - if(DoButton_Editor(&s_DeleteButton, "Delete", 0, &Button, 0, nullptr) || (s_ListBox.Active() && Ui()->ConsumeHotkey(CUi::HOTKEY_DELETE))) - { - s_ConfirmDeletePopupContext.Reset(); - s_ConfirmDeletePopupContext.YesNoButtons(); - str_format(s_ConfirmDeletePopupContext.m_aMessage, sizeof(s_ConfirmDeletePopupContext.m_aMessage), "Are you sure that you want to delete the %s '%s/%s'?", IsDir ? "folder" : "file", m_pFileDialogPath, m_vpFilteredFileList[m_FilesSelectedIndex]->m_aFilename); - Ui()->ShowPopupConfirm(Ui()->MouseX(), Ui()->MouseY(), &s_ConfirmDeletePopupContext); - } - if(s_ConfirmDeletePopupContext.m_Result == CUi::SConfirmPopupContext::CONFIRMED) - { - char aDeleteFilePath[IO_MAX_PATH_LENGTH]; - str_format(aDeleteFilePath, sizeof(aDeleteFilePath), "%s/%s", m_pFileDialogPath, m_vpFilteredFileList[m_FilesSelectedIndex]->m_aFilename); - if(IsDir) - { - if(Storage()->RemoveFolder(aDeleteFilePath, IStorage::TYPE_SAVE)) - FilelistPopulate(m_FileDialogLastPopulatedStorageType, true); - else - ShowFileDialogError("Failed to delete folder '%s'. Make sure it's empty first.", aDeleteFilePath); - } - else - { - if(Storage()->RemoveFile(aDeleteFilePath, IStorage::TYPE_SAVE)) - FilelistPopulate(m_FileDialogLastPopulatedStorageType, true); - else - ShowFileDialogError("Failed to delete file '%s'.", aDeleteFilePath); - } - UpdateFileNameInput(); - } - if(s_ConfirmDeletePopupContext.m_Result != CUi::SConfirmPopupContext::UNSET) - s_ConfirmDeletePopupContext.Reset(); - } - else - s_ConfirmDeletePopupContext.Reset(); - - if(!m_FileDialogShowingRoot && m_FileDialogStorageType == IStorage::TYPE_SAVE) - { - ButtonBar.VSplitLeft(70.0f, &Button, &ButtonBar); - if(DoButton_Editor(&s_NewFolderButton, "New folder", 0, &Button, 0, nullptr)) - { - m_FileDialogNewFolderNameInput.Clear(); - static SPopupMenuId s_PopupNewFolderId; - constexpr float PopupWidth = 400.0f; - constexpr float PopupHeight = 110.0f; - Ui()->DoPopupMenu(&s_PopupNewFolderId, Width / 2.0f - PopupWidth / 2.0f, Height / 2.0f - PopupHeight / 2.0f, PopupWidth, PopupHeight, this, PopupNewFolder); - Ui()->SetActiveItem(&m_FileDialogNewFolderNameInput); - } - } -} - -void CEditor::RefreshFilteredFileList() -{ - m_vpFilteredFileList.clear(); - for(const CFilelistItem &Item : m_vCompleteFileList) - { - if(m_FileDialogFilterInput.IsEmpty() || str_find_nocase(Item.m_aName, m_FileDialogFilterInput.GetString())) - { - m_vpFilteredFileList.push_back(&Item); - } - } - if(!m_FileDialogShowingRoot) - SortFilteredFileList(); - if(!m_vpFilteredFileList.empty()) - { - if(m_aFilesSelectedName[0]) - { - for(size_t i = 0; i < m_vpFilteredFileList.size(); i++) - { - if(m_aFilesSelectedName[0] && str_comp(m_vpFilteredFileList[i]->m_aName, m_aFilesSelectedName) == 0) - { - m_FilesSelectedIndex = i; - break; - } - } - } - m_FilesSelectedIndex = clamp(m_FilesSelectedIndex, 0, m_vpFilteredFileList.size() - 1); - str_copy(m_aFilesSelectedName, m_vpFilteredFileList[m_FilesSelectedIndex]->m_aName); - } - else - { - m_FilesSelectedIndex = -1; - m_aFilesSelectedName[0] = '\0'; - } -} - -void CEditor::FilelistPopulate(int StorageType, bool KeepSelection) -{ - m_FileDialogLastPopulatedStorageType = StorageType; - m_vCompleteFileList.clear(); - if(m_FileDialogShowingRoot) - { - { - CFilelistItem Item; - str_copy(Item.m_aFilename, m_pFileDialogPath); - str_copy(Item.m_aName, "All combined"); - Item.m_IsDir = true; - Item.m_IsLink = true; - Item.m_StorageType = IStorage::TYPE_ALL; - Item.m_TimeModified = 0; - m_vCompleteFileList.push_back(Item); - } - - for(int CheckStorageType = IStorage::TYPE_SAVE; CheckStorageType < Storage()->NumPaths(); ++CheckStorageType) - { - if(Storage()->FolderExists(m_pFileDialogPath, CheckStorageType)) - { - CFilelistItem Item; - str_copy(Item.m_aFilename, m_pFileDialogPath); - Storage()->GetCompletePath(CheckStorageType, m_pFileDialogPath, Item.m_aName, sizeof(Item.m_aName)); - str_append(Item.m_aName, "/", sizeof(Item.m_aName)); - Item.m_IsDir = true; - Item.m_IsLink = true; - Item.m_StorageType = CheckStorageType; - Item.m_TimeModified = 0; - m_vCompleteFileList.push_back(Item); - } - } - } - else - { - // Add links for downloadedmaps and themes - if(!str_comp(m_pFileDialogPath, "maps")) - { - if(str_comp(m_pFileDialogButtonText, "Save") != 0 && Storage()->FolderExists("downloadedmaps", StorageType)) - { - CFilelistItem Item; - str_copy(Item.m_aFilename, "downloadedmaps"); - str_copy(Item.m_aName, "downloadedmaps/"); - Item.m_IsDir = true; - Item.m_IsLink = true; - Item.m_StorageType = StorageType; - Item.m_TimeModified = 0; - m_vCompleteFileList.push_back(Item); - } - - if(Storage()->FolderExists("themes", StorageType)) - { - CFilelistItem Item; - str_copy(Item.m_aFilename, "themes"); - str_copy(Item.m_aName, "themes/"); - Item.m_IsDir = true; - Item.m_IsLink = true; - Item.m_StorageType = StorageType; - Item.m_TimeModified = 0; - m_vCompleteFileList.push_back(Item); - } - } - Storage()->ListDirectoryInfo(StorageType, m_pFileDialogPath, EditorListdirCallback, this); - } - RefreshFilteredFileList(); - if(!KeepSelection) - { - m_FilesSelectedIndex = m_vpFilteredFileList.empty() ? -1 : 0; - if(m_FilesSelectedIndex >= 0) - str_copy(m_aFilesSelectedName, m_vpFilteredFileList[m_FilesSelectedIndex]->m_aName); - else - m_aFilesSelectedName[0] = '\0'; - } - m_FilePreviewState = PREVIEW_UNLOADED; -} - -void CEditor::InvokeFileDialog(int StorageType, int FileType, const char *pTitle, const char *pButtonText, - const char *pBasePath, bool FilenameAsDefault, - bool (*pfnFunc)(const char *pFileName, int StorageType, void *pUser), void *pUser) -{ - m_FileDialogStorageType = StorageType; - if(m_FileDialogStorageType == IStorage::TYPE_ALL) - { - int NumStoragesWithFolder = 0; - for(int CheckStorageType = IStorage::TYPE_SAVE; CheckStorageType < Storage()->NumPaths(); ++CheckStorageType) - { - if(Storage()->FolderExists(pBasePath, CheckStorageType)) - { - NumStoragesWithFolder++; - } - } - m_FileDialogMultipleStorages = NumStoragesWithFolder > 1; - } - else - { - m_FileDialogMultipleStorages = false; - } - m_FileDialogSaveAction = m_FileDialogStorageType == IStorage::TYPE_SAVE; - - Ui()->ClosePopupMenus(); - m_pFileDialogTitle = pTitle; - m_pFileDialogButtonText = pButtonText; - m_pfnFileDialogFunc = pfnFunc; - m_pFileDialogUser = pUser; - m_FileDialogFileNameInput.Clear(); - m_FileDialogFilterInput.Clear(); - m_aFileDialogCurrentFolder[0] = 0; - m_aFileDialogCurrentLink[0] = 0; - m_pFileDialogPath = m_aFileDialogCurrentFolder; - m_FileDialogFileType = FileType; - m_FilePreviewState = PREVIEW_UNLOADED; - m_FileDialogOpening = true; - m_FileDialogShowingRoot = false; - - if(FilenameAsDefault) - { - char aDefaultName[IO_MAX_PATH_LENGTH]; - fs_split_file_extension(fs_filename(m_aFileName), aDefaultName, sizeof(aDefaultName)); - m_FileDialogFileNameInput.Set(aDefaultName); - } - if(pBasePath) - str_copy(m_aFileDialogCurrentFolder, pBasePath); - - FilelistPopulate(m_FileDialogStorageType); - - m_FileDialogOpening = true; - m_Dialog = DIALOG_FILE; -} - -void CEditor::ShowFileDialogError(const char *pFormat, ...) -{ - char aMessage[1024]; - va_list VarArgs; - va_start(VarArgs, pFormat); - str_format_v(aMessage, sizeof(aMessage), pFormat, VarArgs); - va_end(VarArgs); - - auto ContextIterator = m_PopupMessageContexts.find(aMessage); - CUi::SMessagePopupContext *pContext; - if(ContextIterator != m_PopupMessageContexts.end()) - { - pContext = ContextIterator->second; - Ui()->ClosePopupMenu(pContext); - } - else - { - pContext = new CUi::SMessagePopupContext(); - pContext->ErrorColor(); - str_copy(pContext->m_aMessage, aMessage); - m_PopupMessageContexts[pContext->m_aMessage] = pContext; - } - Ui()->ShowPopupMessage(Ui()->MouseX(), Ui()->MouseY(), pContext); -} - -void CEditor::RenderModebar(CUIRect View) -{ - CUIRect Mentions, IngameMoved, ModeButtons, ModeButton; - View.HSplitTop(12.0f, &Mentions, &View); - View.HSplitTop(12.0f, &IngameMoved, &View); - View.HSplitTop(8.0f, nullptr, &ModeButtons); - const float Width = m_ToolBoxWidth - 5.0f; - ModeButtons.VSplitLeft(Width, &ModeButtons, nullptr); - const float ButtonWidth = Width / 3; - - // mentions - if(m_Mentions) - { - char aBuf[64]; - if(m_Mentions == 1) - str_copy(aBuf, Localize("1 new mention")); - else if(m_Mentions <= 9) - str_format(aBuf, sizeof(aBuf), Localize("%d new mentions"), m_Mentions); - else - str_copy(aBuf, Localize("9+ new mentions")); - - TextRender()->TextColor(ColorRGBA(1.0f, 0.0f, 0.0f, 1.0f)); - Ui()->DoLabel(&Mentions, aBuf, 10.0f, TEXTALIGN_MC); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - } - - // ingame moved warning - if(m_IngameMoved) - { - TextRender()->TextColor(ColorRGBA(1.0f, 0.0f, 0.0f, 1.0f)); - Ui()->DoLabel(&IngameMoved, Localize("Moved ingame"), 10.0f, TEXTALIGN_MC); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - } - - // mode buttons - { - ModeButtons.VSplitLeft(ButtonWidth, &ModeButton, &ModeButtons); - static int s_LayersButton = 0; - if(DoButton_FontIcon(&s_LayersButton, FONT_ICON_LAYER_GROUP, m_Mode == MODE_LAYERS, &ModeButton, 0, "Go to layers management.", IGraphics::CORNER_L)) - { - m_Mode = MODE_LAYERS; - } - - ModeButtons.VSplitLeft(ButtonWidth, &ModeButton, &ModeButtons); - static int s_ImagesButton = 0; - if(DoButton_FontIcon(&s_ImagesButton, FONT_ICON_IMAGE, m_Mode == MODE_IMAGES, &ModeButton, 0, "Go to images management.", IGraphics::CORNER_NONE)) - { - m_Mode = MODE_IMAGES; - } - - ModeButtons.VSplitLeft(ButtonWidth, &ModeButton, &ModeButtons); - static int s_SoundsButton = 0; - if(DoButton_FontIcon(&s_SoundsButton, FONT_ICON_MUSIC, m_Mode == MODE_SOUNDS, &ModeButton, 0, "Go to sounds management.", IGraphics::CORNER_R)) - { - m_Mode = MODE_SOUNDS; - } - - if(Input()->KeyPress(KEY_LEFT) && m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr) - { - m_Mode = (m_Mode + NUM_MODES - 1) % NUM_MODES; - } - else if(Input()->KeyPress(KEY_RIGHT) && m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr) - { - m_Mode = (m_Mode + 1) % NUM_MODES; - } - } -} - -void CEditor::RenderStatusbar(CUIRect View, CUIRect *pTooltipRect) -{ - CUIRect Button; - View.VSplitRight(100.0f, &View, &Button); - if(DoButton_Editor(&m_QuickActionEnvelopes, m_QuickActionEnvelopes.Label(), m_QuickActionEnvelopes.Color(), &Button, 0, m_QuickActionEnvelopes.Description()) == 1) - { - m_QuickActionEnvelopes.Call(); - } - - View.VSplitRight(10.0f, &View, nullptr); - View.VSplitRight(100.0f, &View, &Button); - if(DoButton_Editor(&m_QuickActionServerSettings, m_QuickActionServerSettings.Label(), m_QuickActionServerSettings.Color(), &Button, 0, m_QuickActionServerSettings.Description()) == 1) - { - m_QuickActionServerSettings.Call(); - } - - View.VSplitRight(10.0f, &View, nullptr); - View.VSplitRight(100.0f, &View, &Button); - if(DoButton_Editor(&m_QuickActionHistory, m_QuickActionHistory.Label(), m_QuickActionHistory.Color(), &Button, 0, m_QuickActionHistory.Description()) == 1) - { - m_QuickActionHistory.Call(); - } - - View.VSplitRight(10.0f, pTooltipRect, nullptr); -} - -void CEditor::RenderTooltip(CUIRect TooltipRect) -{ - if(str_comp(m_aTooltip, "") == 0) - return; - - char aBuf[256]; - if(ms_pUiGotContext && ms_pUiGotContext == Ui()->HotItem()) - str_format(aBuf, sizeof(aBuf), "%s Right click for context menu.", m_aTooltip); - else - str_copy(aBuf, m_aTooltip); - - SLabelProperties Props; - Props.m_MaxWidth = TooltipRect.w; - Props.m_EllipsisAtEnd = true; - Ui()->DoLabel(&TooltipRect, aBuf, 10.0f, TEXTALIGN_ML, Props); -} - -bool CEditor::IsEnvelopeUsed(int EnvelopeIndex) const -{ - for(const auto &pGroup : m_Map.m_vpGroups) - { - for(const auto &pLayer : pGroup->m_vpLayers) - { - if(pLayer->m_Type == LAYERTYPE_QUADS) - { - std::shared_ptr pLayerQuads = std::static_pointer_cast(pLayer); - for(const auto &Quad : pLayerQuads->m_vQuads) - { - if(Quad.m_PosEnv == EnvelopeIndex || Quad.m_ColorEnv == EnvelopeIndex) - { - return true; - } - } - } - else if(pLayer->m_Type == LAYERTYPE_SOUNDS) - { - std::shared_ptr pLayerSounds = std::static_pointer_cast(pLayer); - for(const auto &Source : pLayerSounds->m_vSources) - { - if(Source.m_PosEnv == EnvelopeIndex || Source.m_SoundEnv == EnvelopeIndex) - { - return true; - } - } - } - else if(pLayer->m_Type == LAYERTYPE_TILES) - { - std::shared_ptr pLayerTiles = std::static_pointer_cast(pLayer); - if(pLayerTiles->m_ColorEnv == EnvelopeIndex) - return true; - } - } - } - return false; -} - -void CEditor::RemoveUnusedEnvelopes() -{ - m_EnvelopeEditorHistory.BeginBulk(); - int DeletedCount = 0; - for(size_t Envelope = 0; Envelope < m_Map.m_vpEnvelopes.size();) - { - if(IsEnvelopeUsed(Envelope)) - { - ++Envelope; - } - else - { - m_EnvelopeEditorHistory.RecordAction(std::make_shared(this, Envelope)); - m_Map.DeleteEnvelope(Envelope); - DeletedCount++; - } - } - char aDisplay[256]; - str_format(aDisplay, sizeof(aDisplay), "Tool 'Remove unused envelopes': delete %d envelopes", DeletedCount); - m_EnvelopeEditorHistory.EndBulk(aDisplay); -} - -void CEditor::ZoomAdaptOffsetX(float ZoomFactor, const CUIRect &View) -{ - float PosX = g_Config.m_EdZoomTarget ? (Ui()->MouseX() - View.x) / View.w : 0.5f; - m_OffsetEnvelopeX = PosX - (PosX - m_OffsetEnvelopeX) * ZoomFactor; -} - -void CEditor::UpdateZoomEnvelopeX(const CUIRect &View) -{ - float OldZoom = m_ZoomEnvelopeX.GetValue(); - if(m_ZoomEnvelopeX.UpdateValue()) - ZoomAdaptOffsetX(OldZoom / m_ZoomEnvelopeX.GetValue(), View); -} - -void CEditor::ZoomAdaptOffsetY(float ZoomFactor, const CUIRect &View) -{ - float PosY = g_Config.m_EdZoomTarget ? 1.0f - (Ui()->MouseY() - View.y) / View.h : 0.5f; - m_OffsetEnvelopeY = PosY - (PosY - m_OffsetEnvelopeY) * ZoomFactor; -} - -void CEditor::UpdateZoomEnvelopeY(const CUIRect &View) -{ - float OldZoom = m_ZoomEnvelopeY.GetValue(); - if(m_ZoomEnvelopeY.UpdateValue()) - ZoomAdaptOffsetY(OldZoom / m_ZoomEnvelopeY.GetValue(), View); -} - -void CEditor::ResetZoomEnvelope(const std::shared_ptr &pEnvelope, int ActiveChannels) -{ - auto [Bottom, Top] = pEnvelope->GetValueRange(ActiveChannels); - float EndTime = pEnvelope->EndTime(); - float ValueRange = absolute(Top - Bottom); - - if(ValueRange < m_ZoomEnvelopeY.GetMinValue()) - { - // Set view to some sane default if range is too small - m_OffsetEnvelopeY = 0.5f - ValueRange / m_ZoomEnvelopeY.GetMinValue() / 2.0f - Bottom / m_ZoomEnvelopeY.GetMinValue(); - m_ZoomEnvelopeY.SetValueInstant(m_ZoomEnvelopeY.GetMinValue()); - } - else if(ValueRange > m_ZoomEnvelopeY.GetMaxValue()) - { - m_OffsetEnvelopeY = -Bottom / m_ZoomEnvelopeY.GetMaxValue(); - m_ZoomEnvelopeY.SetValueInstant(m_ZoomEnvelopeY.GetMaxValue()); - } - else - { - // calculate biggest possible spacing - float SpacingFactor = minimum(1.25f, m_ZoomEnvelopeY.GetMaxValue() / ValueRange); - m_ZoomEnvelopeY.SetValueInstant(SpacingFactor * ValueRange); - float Space = 1.0f / SpacingFactor; - float Spacing = (1.0f - Space) / 2.0f; - - if(Top >= 0 && Bottom >= 0) - m_OffsetEnvelopeY = Spacing - Bottom / m_ZoomEnvelopeY.GetValue(); - else if(Top <= 0 && Bottom <= 0) - m_OffsetEnvelopeY = Spacing - Bottom / m_ZoomEnvelopeY.GetValue(); - else - m_OffsetEnvelopeY = Spacing + Space * absolute(Bottom) / ValueRange; - } - - if(EndTime < m_ZoomEnvelopeX.GetMinValue()) - { - m_OffsetEnvelopeX = 0.5f - EndTime / m_ZoomEnvelopeX.GetMinValue(); - m_ZoomEnvelopeX.SetValueInstant(m_ZoomEnvelopeX.GetMinValue()); - } - else if(EndTime > m_ZoomEnvelopeX.GetMaxValue()) - { - m_OffsetEnvelopeX = 0.0f; - m_ZoomEnvelopeX.SetValueInstant(m_ZoomEnvelopeX.GetMaxValue()); - } - else - { - float SpacingFactor = minimum(1.25f, m_ZoomEnvelopeX.GetMaxValue() / EndTime); - m_ZoomEnvelopeX.SetValueInstant(SpacingFactor * EndTime); - float Space = 1.0f / SpacingFactor; - float Spacing = (1.0f - Space) / 2.0f; - - m_OffsetEnvelopeX = Spacing; - } -} - -float fxt2f(int t) -{ - return t / 1000.0f; -} - -int f2fxt(float t) -{ - return static_cast(t * 1000.0f); -} - -float CEditor::ScreenToEnvelopeX(const CUIRect &View, float x) const -{ - return (x - View.x - View.w * m_OffsetEnvelopeX) / View.w * m_ZoomEnvelopeX.GetValue(); -} - -float CEditor::EnvelopeToScreenX(const CUIRect &View, float x) const -{ - return View.x + View.w * m_OffsetEnvelopeX + x / m_ZoomEnvelopeX.GetValue() * View.w; -} - -float CEditor::ScreenToEnvelopeY(const CUIRect &View, float y) const -{ - return (View.h - y + View.y) / View.h * m_ZoomEnvelopeY.GetValue() - m_OffsetEnvelopeY * m_ZoomEnvelopeY.GetValue(); -} - -float CEditor::EnvelopeToScreenY(const CUIRect &View, float y) const -{ - return View.y + View.h - y / m_ZoomEnvelopeY.GetValue() * View.h - m_OffsetEnvelopeY * View.h; -} - -float CEditor::ScreenToEnvelopeDX(const CUIRect &View, float DeltaX) -{ - return DeltaX / Graphics()->ScreenWidth() * Ui()->Screen()->w / View.w * m_ZoomEnvelopeX.GetValue(); -} - -float CEditor::ScreenToEnvelopeDY(const CUIRect &View, float DeltaY) -{ - return DeltaY / Graphics()->ScreenHeight() * Ui()->Screen()->h / View.h * m_ZoomEnvelopeY.GetValue(); -} - -void CEditor::RemoveTimeOffsetEnvelope(const std::shared_ptr &pEnvelope) -{ - int TimeOffset = pEnvelope->m_vPoints[0].m_Time; - for(auto &Point : pEnvelope->m_vPoints) - Point.m_Time -= TimeOffset; - - m_OffsetEnvelopeX += fxt2f(TimeOffset) / m_ZoomEnvelopeX.GetValue(); -}; - -static float ClampDelta(float Val, float Delta, float Min, float Max) -{ - if(Val + Delta <= Min) - return Min - Val; - if(Val + Delta >= Max) - return Max - Val; - return Delta; -} - -class CTimeStep -{ -public: - template - CTimeStep(T t) - { - if constexpr(std::is_same_v) - m_Unit = ETimeUnit::MILLISECONDS; - else if constexpr(std::is_same_v) - m_Unit = ETimeUnit::SECONDS; - else - m_Unit = ETimeUnit::MINUTES; - - m_Value = t; - } - - CTimeStep operator*(int k) const - { - return CTimeStep(m_Value * k, m_Unit); - } - - CTimeStep operator-(const CTimeStep &Other) - { - return CTimeStep(m_Value - Other.m_Value, m_Unit); - } - - void Format(char *pBuffer, size_t BufferSize) - { - int Milliseconds = m_Value.count() % 1000; - int Seconds = std::chrono::duration_cast(m_Value).count() % 60; - int Minutes = std::chrono::duration_cast(m_Value).count(); - - switch(m_Unit) - { - case ETimeUnit::MILLISECONDS: - if(Minutes != 0) - str_format(pBuffer, BufferSize, "%d:%02d.%03dmin", Minutes, Seconds, Milliseconds); - else if(Seconds != 0) - str_format(pBuffer, BufferSize, "%d.%03ds", Seconds, Milliseconds); - else - str_format(pBuffer, BufferSize, "%dms", Milliseconds); - break; - case ETimeUnit::SECONDS: - if(Minutes != 0) - str_format(pBuffer, BufferSize, "%d:%02dmin", Minutes, Seconds); - else - str_format(pBuffer, BufferSize, "%ds", Seconds); - break; - case ETimeUnit::MINUTES: - str_format(pBuffer, BufferSize, "%dmin", Minutes); - break; - } - } - - float AsSeconds() const - { - return std::chrono::duration_cast>(m_Value).count(); - } - -private: - enum class ETimeUnit - { - MILLISECONDS, - SECONDS, - MINUTES - } m_Unit; - std::chrono::milliseconds m_Value; - - CTimeStep(std::chrono::milliseconds Value, ETimeUnit Unit) - { - m_Value = Value; - m_Unit = Unit; - } -}; - -void CEditor::SetHotEnvelopePoint(const CUIRect &View, const std::shared_ptr &pEnvelope, int ActiveChannels) -{ - if(!Ui()->MouseInside(&View)) - return; - - float mx = Ui()->MouseX(); - float my = Ui()->MouseY(); - - float MinDist = 200.0f; - int *pMinPoint = nullptr; - - auto UpdateMinimum = [&](float px, float py, int *pId) { - float dx = px - mx; - float dy = py - my; - - float CurrDist = dx * dx + dy * dy; - if(CurrDist < MinDist) - { - MinDist = CurrDist; - pMinPoint = pId; - } - }; - - for(size_t i = 0; i < pEnvelope->m_vPoints.size(); i++) - { - for(int c = pEnvelope->GetChannels() - 1; c >= 0; c--) - { - if(!(ActiveChannels & (1 << c))) - continue; - - if(i > 0 && pEnvelope->m_vPoints[i - 1].m_Curvetype == CURVETYPE_BEZIER) - { - float px = EnvelopeToScreenX(View, fxt2f(pEnvelope->m_vPoints[i].m_Time + pEnvelope->m_vPoints[i].m_Bezier.m_aInTangentDeltaX[c])); - float py = EnvelopeToScreenY(View, fx2f(pEnvelope->m_vPoints[i].m_aValues[c] + pEnvelope->m_vPoints[i].m_Bezier.m_aInTangentDeltaY[c])); - UpdateMinimum(px, py, &pEnvelope->m_vPoints[i].m_Bezier.m_aInTangentDeltaX[c]); - } - - if(pEnvelope->m_vPoints[i].m_Curvetype == CURVETYPE_BEZIER) - { - float px = EnvelopeToScreenX(View, fxt2f(pEnvelope->m_vPoints[i].m_Time + pEnvelope->m_vPoints[i].m_Bezier.m_aOutTangentDeltaX[c])); - float py = EnvelopeToScreenY(View, fx2f(pEnvelope->m_vPoints[i].m_aValues[c] + pEnvelope->m_vPoints[i].m_Bezier.m_aOutTangentDeltaY[c])); - UpdateMinimum(px, py, &pEnvelope->m_vPoints[i].m_Bezier.m_aOutTangentDeltaX[c]); - } - - float px = EnvelopeToScreenX(View, fxt2f(pEnvelope->m_vPoints[i].m_Time)); - float py = EnvelopeToScreenY(View, fx2f(pEnvelope->m_vPoints[i].m_aValues[c])); - UpdateMinimum(px, py, &pEnvelope->m_vPoints[i].m_aValues[c]); - } - } - - if(pMinPoint != nullptr) - Ui()->SetHotItem(pMinPoint); -} - -void CEditor::RenderEnvelopeEditor(CUIRect View) -{ - if(m_SelectedEnvelope < 0) - m_SelectedEnvelope = 0; - if(m_SelectedEnvelope >= (int)m_Map.m_vpEnvelopes.size()) - m_SelectedEnvelope = m_Map.m_vpEnvelopes.size() - 1; - - std::shared_ptr pEnvelope = nullptr; - if(m_SelectedEnvelope >= 0 && m_SelectedEnvelope < (int)m_Map.m_vpEnvelopes.size()) - pEnvelope = m_Map.m_vpEnvelopes[m_SelectedEnvelope]; - - static EEnvelopeEditorOp s_Operation = EEnvelopeEditorOp::OP_NONE; - static std::vector s_vAccurateDragValuesX = {}; - static std::vector s_vAccurateDragValuesY = {}; - static float s_MouseXStart = 0.0f; - static float s_MouseYStart = 0.0f; - - static CLineInput s_NameInput; - - CUIRect ToolBar, CurveBar, ColorBar, DragBar; - View.HSplitTop(30.0f, &DragBar, nullptr); - DragBar.y -= 2.0f; - DragBar.w += 2.0f; - DragBar.h += 4.0f; - DoEditorDragBar(View, &DragBar, EDragSide::SIDE_TOP, &m_aExtraEditorSplits[EXTRAEDITOR_ENVELOPES]); - View.HSplitTop(15.0f, &ToolBar, &View); - View.HSplitTop(15.0f, &CurveBar, &View); - ToolBar.Margin(2.0f, &ToolBar); - CurveBar.Margin(2.0f, &CurveBar); - - bool CurrentEnvelopeSwitched = false; - - // do the toolbar - static int s_ActiveChannels = 0xf; - { - CUIRect Button; - std::shared_ptr pNewEnv = nullptr; - - // redo button - ToolBar.VSplitRight(25.0f, &ToolBar, &Button); - static int s_RedoButton = 0; - if(DoButton_FontIcon(&s_RedoButton, FONT_ICON_REDO, m_EnvelopeEditorHistory.CanRedo() ? 0 : -1, &Button, 0, "[Ctrl+Y] Redo last action", IGraphics::CORNER_R, 11.0f) == 1) - { - m_EnvelopeEditorHistory.Redo(); - } - - // undo button - ToolBar.VSplitRight(25.0f, &ToolBar, &Button); - ToolBar.VSplitRight(10.0f, &ToolBar, nullptr); - static int s_UndoButton = 0; - if(DoButton_FontIcon(&s_UndoButton, FONT_ICON_UNDO, m_EnvelopeEditorHistory.CanUndo() ? 0 : -1, &Button, 0, "[Ctrl+Z] Undo last action", IGraphics::CORNER_L, 11.0f) == 1) - { - m_EnvelopeEditorHistory.Undo(); - } - - ToolBar.VSplitRight(50.0f, &ToolBar, &Button); - static int s_NewSoundButton = 0; - if(DoButton_Editor(&s_NewSoundButton, "Sound+", 0, &Button, 0, "Creates a new sound envelope")) - { - m_Map.OnModify(); - pNewEnv = m_Map.NewEnvelope(CEnvelope::EType::SOUND); - } - - ToolBar.VSplitRight(5.0f, &ToolBar, nullptr); - ToolBar.VSplitRight(50.0f, &ToolBar, &Button); - static int s_New4dButton = 0; - if(DoButton_Editor(&s_New4dButton, "Color+", 0, &Button, 0, "Creates a new color envelope")) - { - m_Map.OnModify(); - pNewEnv = m_Map.NewEnvelope(CEnvelope::EType::COLOR); - } - - ToolBar.VSplitRight(5.0f, &ToolBar, nullptr); - ToolBar.VSplitRight(50.0f, &ToolBar, &Button); - static int s_New2dButton = 0; - if(DoButton_Editor(&s_New2dButton, "Pos.+", 0, &Button, 0, "Creates a new position envelope")) - { - m_Map.OnModify(); - pNewEnv = m_Map.NewEnvelope(CEnvelope::EType::POSITION); - } - - if(m_SelectedEnvelope >= 0) - { - // Delete button - ToolBar.VSplitRight(10.0f, &ToolBar, nullptr); - ToolBar.VSplitRight(25.0f, &ToolBar, &Button); - static int s_DeleteButton = 0; - if(DoButton_Editor(&s_DeleteButton, "✗", 0, &Button, 0, "Delete this envelope")) - { - m_EnvelopeEditorHistory.RecordAction(std::make_shared(this, m_SelectedEnvelope)); - m_Map.DeleteEnvelope(m_SelectedEnvelope); - if(m_SelectedEnvelope >= (int)m_Map.m_vpEnvelopes.size()) - m_SelectedEnvelope = m_Map.m_vpEnvelopes.size() - 1; - pEnvelope = m_SelectedEnvelope >= 0 ? m_Map.m_vpEnvelopes[m_SelectedEnvelope] : nullptr; - m_Map.OnModify(); - } - - // Move right button - ToolBar.VSplitRight(5.0f, &ToolBar, nullptr); - ToolBar.VSplitRight(25.0f, &ToolBar, &Button); - static int s_MoveRightButton = 0; - if(DoButton_Ex(&s_MoveRightButton, "→", 0, &Button, 0, "Move this envelope to the right", IGraphics::CORNER_R)) - { - m_EnvelopeEditorHistory.RecordAction(std::make_shared(this, m_SelectedEnvelope, CEditorActionEnvelopeEdit::EEditType::ORDER, m_SelectedEnvelope, m_SelectedEnvelope + 1)); - m_Map.SwapEnvelopes(m_SelectedEnvelope, m_SelectedEnvelope + 1); - m_SelectedEnvelope = clamp(m_SelectedEnvelope + 1, 0, m_Map.m_vpEnvelopes.size() - 1); - pEnvelope = m_Map.m_vpEnvelopes[m_SelectedEnvelope]; - m_Map.OnModify(); - } - - // Move left button - ToolBar.VSplitRight(25.0f, &ToolBar, &Button); - static int s_MoveLeftButton = 0; - if(DoButton_Ex(&s_MoveLeftButton, "←", 0, &Button, 0, "Move this envelope to the left", IGraphics::CORNER_L)) - { - m_EnvelopeEditorHistory.RecordAction(std::make_shared(this, m_SelectedEnvelope, CEditorActionEnvelopeEdit::EEditType::ORDER, m_SelectedEnvelope, m_SelectedEnvelope - 1)); - m_Map.SwapEnvelopes(m_SelectedEnvelope - 1, m_SelectedEnvelope); - m_SelectedEnvelope = clamp(m_SelectedEnvelope - 1, 0, m_Map.m_vpEnvelopes.size() - 1); - pEnvelope = m_Map.m_vpEnvelopes[m_SelectedEnvelope]; - m_Map.OnModify(); - } - - if(pEnvelope) - { - ToolBar.VSplitRight(5.0f, &ToolBar, nullptr); - ToolBar.VSplitRight(20.0f, &ToolBar, &Button); - static int s_ZoomOutButton = 0; - if(DoButton_FontIcon(&s_ZoomOutButton, FONT_ICON_MINUS, 0, &Button, 0, "[NumPad-] Zoom out horizontally, hold shift to zoom vertically", IGraphics::CORNER_R, 9.0f)) - { - if(Input()->ShiftIsPressed()) - m_ZoomEnvelopeY.ChangeValue(0.1f * m_ZoomEnvelopeY.GetValue()); - else - m_ZoomEnvelopeX.ChangeValue(0.1f * m_ZoomEnvelopeX.GetValue()); - } - - ToolBar.VSplitRight(20.0f, &ToolBar, &Button); - static int s_ResetZoomButton = 0; - if(DoButton_FontIcon(&s_ResetZoomButton, FONT_ICON_MAGNIFYING_GLASS, 0, &Button, 0, "[NumPad*] Reset zoom to default value", IGraphics::CORNER_NONE, 9.0f)) - ResetZoomEnvelope(pEnvelope, s_ActiveChannels); - - ToolBar.VSplitRight(20.0f, &ToolBar, &Button); - static int s_ZoomInButton = 0; - if(DoButton_FontIcon(&s_ZoomInButton, FONT_ICON_PLUS, 0, &Button, 0, "[NumPad+] Zoom in horizontally, hold shift to zoom vertically", IGraphics::CORNER_L, 9.0f)) - { - if(Input()->ShiftIsPressed()) - m_ZoomEnvelopeY.ChangeValue(-0.1f * m_ZoomEnvelopeY.GetValue()); - else - m_ZoomEnvelopeX.ChangeValue(-0.1f * m_ZoomEnvelopeX.GetValue()); - } - } - - // Margin on the right side - ToolBar.VSplitRight(7.0f, &ToolBar, nullptr); - } - - if(pNewEnv) // add the default points - { - if(pNewEnv->GetChannels() == 4) - { - pNewEnv->AddPoint(0, f2fx(1.0f), f2fx(1.0f), f2fx(1.0f), f2fx(1.0f)); - pNewEnv->AddPoint(1000, f2fx(1.0f), f2fx(1.0f), f2fx(1.0f), f2fx(1.0f)); - } - else - { - pNewEnv->AddPoint(0, 0); - pNewEnv->AddPoint(1000, 0); - } - - m_EnvelopeEditorHistory.RecordAction(std::make_shared(this, pNewEnv)); - } - - CUIRect Shifter, Inc, Dec; - ToolBar.VSplitLeft(60.0f, &Shifter, &ToolBar); - Shifter.VSplitRight(15.0f, &Shifter, &Inc); - Shifter.VSplitLeft(15.0f, &Dec, &Shifter); - char aBuf[64]; - str_format(aBuf, sizeof(aBuf), "%d/%d", m_SelectedEnvelope + 1, (int)m_Map.m_vpEnvelopes.size()); - - ColorRGBA EnvColor = ColorRGBA(1, 1, 1, 0.5f); - if(!m_Map.m_vpEnvelopes.empty()) - { - EnvColor = IsEnvelopeUsed(m_SelectedEnvelope) ? ColorRGBA(1, 0.7f, 0.7f, 0.5f) : ColorRGBA(0.7f, 1, 0.7f, 0.5f); - } - - static int s_EnvelopeSelector = 0; - auto NewValueRes = UiDoValueSelector(&s_EnvelopeSelector, &Shifter, aBuf, m_SelectedEnvelope + 1, 1, m_Map.m_vpEnvelopes.size(), 1, 1.0f, "Select Envelope", false, false, IGraphics::CORNER_NONE, &EnvColor, false); - int NewValue = NewValueRes.m_Value; - if(NewValue - 1 != m_SelectedEnvelope) - { - m_SelectedEnvelope = NewValue - 1; - CurrentEnvelopeSwitched = true; - } - - static int s_PrevButton = 0; - if(DoButton_FontIcon(&s_PrevButton, FONT_ICON_MINUS, 0, &Dec, 0, "Previous Envelope", IGraphics::CORNER_L, 7.0f)) - { - m_SelectedEnvelope--; - if(m_SelectedEnvelope < 0) - m_SelectedEnvelope = m_Map.m_vpEnvelopes.size() - 1; - CurrentEnvelopeSwitched = true; - } - - static int s_NextButton = 0; - if(DoButton_FontIcon(&s_NextButton, FONT_ICON_PLUS, 0, &Inc, 0, "Next Envelope", IGraphics::CORNER_R, 7.0f)) - { - m_SelectedEnvelope++; - if(m_SelectedEnvelope >= (int)m_Map.m_vpEnvelopes.size()) - m_SelectedEnvelope = 0; - CurrentEnvelopeSwitched = true; - } - - if(pEnvelope) - { - ToolBar.VSplitLeft(15.0f, nullptr, &ToolBar); - ToolBar.VSplitLeft(40.0f, &Button, &ToolBar); - Ui()->DoLabel(&Button, "Name:", 10.0f, TEXTALIGN_MR); - - ToolBar.VSplitLeft(3.0f, nullptr, &ToolBar); - ToolBar.VSplitLeft(ToolBar.w > ToolBar.h * 40 ? 80.0f : 60.0f, &Button, &ToolBar); - - s_NameInput.SetBuffer(pEnvelope->m_aName, sizeof(pEnvelope->m_aName)); - if(DoEditBox(&s_NameInput, &Button, 10.0f, IGraphics::CORNER_ALL, "The name of the selected envelope")) - { - m_Map.OnModify(); - } - } - } - - bool ShowColorBar = false; - if(pEnvelope && pEnvelope->GetChannels() == 4) - { - ShowColorBar = true; - View.HSplitTop(20.0f, &ColorBar, &View); - ColorBar.Margin(2.0f, &ColorBar); - } - - RenderBackground(View, m_CheckerTexture, 32.0f, 0.1f); - - if(pEnvelope) - { - if(m_ResetZoomEnvelope) - { - m_ResetZoomEnvelope = false; - ResetZoomEnvelope(pEnvelope, s_ActiveChannels); - } - - ColorRGBA aColors[] = {ColorRGBA(1, 0.2f, 0.2f), ColorRGBA(0.2f, 1, 0.2f), ColorRGBA(0.2f, 0.2f, 1), ColorRGBA(1, 1, 0.2f)}; - - CUIRect Button; - - ToolBar.VSplitLeft(15.0f, &Button, &ToolBar); - - static const char *s_aapNames[4][CEnvPoint::MAX_CHANNELS] = { - {"V", "", "", ""}, - {"", "", "", ""}, - {"X", "Y", "R", ""}, - {"R", "G", "B", "A"}, - }; - - static const char *s_aapDescriptions[4][CEnvPoint::MAX_CHANNELS] = { - {"Volume of the envelope", "", "", ""}, - {"", "", "", ""}, - {"X-axis of the envelope", "Y-axis of the envelope", "Rotation of the envelope", ""}, - {"Red value of the envelope", "Green value of the envelope", "Blue value of the envelope", "Alpha value of the envelope"}, - }; - - static int s_aChannelButtons[CEnvPoint::MAX_CHANNELS] = {0}; - int Bit = 1; - - for(int i = 0; i < CEnvPoint::MAX_CHANNELS; i++, Bit <<= 1) - { - ToolBar.VSplitLeft(15.0f, &Button, &ToolBar); - if(i < pEnvelope->GetChannels()) - { - int Corners = IGraphics::CORNER_NONE; - if(pEnvelope->GetChannels() == 1) - Corners = IGraphics::CORNER_ALL; - else if(i == 0) - Corners = IGraphics::CORNER_L; - else if(i == pEnvelope->GetChannels() - 1) - Corners = IGraphics::CORNER_R; - - if(DoButton_Env(&s_aChannelButtons[i], s_aapNames[pEnvelope->GetChannels() - 1][i], s_ActiveChannels & Bit, &Button, s_aapDescriptions[pEnvelope->GetChannels() - 1][i], aColors[i], Corners)) - s_ActiveChannels ^= Bit; - } - } - - // toggle sync button - ToolBar.VSplitLeft(15.0f, nullptr, &ToolBar); - ToolBar.VSplitLeft(40.0f, &Button, &ToolBar); - - static int s_SyncButton; - if(DoButton_Editor(&s_SyncButton, "Sync", pEnvelope->m_Synchronized, &Button, 0, "Synchronize envelope animation to game time (restarts when you touch the start line)")) - { - m_EnvelopeEditorHistory.RecordAction(std::make_shared(this, m_SelectedEnvelope, CEditorActionEnvelopeEdit::EEditType::SYNC, pEnvelope->m_Synchronized, !pEnvelope->m_Synchronized)); - pEnvelope->m_Synchronized = !pEnvelope->m_Synchronized; - m_Map.OnModify(); - } - - static int s_EnvelopeEditorId = 0; - static int s_EnvelopeEditorButtonUsed = -1; - const bool ShouldPan = s_Operation == EEnvelopeEditorOp::OP_NONE && (Ui()->MouseButton(2) || (Ui()->MouseButton(0) && Input()->ModifierIsPressed())); - if(m_pContainerPanned == &s_EnvelopeEditorId) - { - if(!ShouldPan) - m_pContainerPanned = nullptr; - else - { - m_OffsetEnvelopeX += Ui()->MouseDeltaX() / Graphics()->ScreenWidth() * Ui()->Screen()->w / View.w; - m_OffsetEnvelopeY -= Ui()->MouseDeltaY() / Graphics()->ScreenHeight() * Ui()->Screen()->h / View.h; - } - } - - if(Ui()->MouseInside(&View) && m_Dialog == DIALOG_NONE) - { - Ui()->SetHotItem(&s_EnvelopeEditorId); - - if(ShouldPan && m_pContainerPanned == nullptr) - m_pContainerPanned = &s_EnvelopeEditorId; - - if(Input()->KeyPress(KEY_KP_MULTIPLY)) - ResetZoomEnvelope(pEnvelope, s_ActiveChannels); - if(Input()->ShiftIsPressed()) - { - if(Input()->KeyPress(KEY_KP_MINUS)) - m_ZoomEnvelopeY.ChangeValue(0.1f * m_ZoomEnvelopeY.GetValue()); - if(Input()->KeyPress(KEY_KP_PLUS)) - m_ZoomEnvelopeY.ChangeValue(-0.1f * m_ZoomEnvelopeY.GetValue()); - if(Input()->KeyPress(KEY_MOUSE_WHEEL_DOWN)) - m_ZoomEnvelopeY.ChangeValue(0.1f * m_ZoomEnvelopeY.GetValue()); - if(Input()->KeyPress(KEY_MOUSE_WHEEL_UP)) - m_ZoomEnvelopeY.ChangeValue(-0.1f * m_ZoomEnvelopeY.GetValue()); - } - else - { - if(Input()->KeyPress(KEY_KP_MINUS)) - m_ZoomEnvelopeX.ChangeValue(0.1f * m_ZoomEnvelopeX.GetValue()); - if(Input()->KeyPress(KEY_KP_PLUS)) - m_ZoomEnvelopeX.ChangeValue(-0.1f * m_ZoomEnvelopeX.GetValue()); - if(Input()->KeyPress(KEY_MOUSE_WHEEL_DOWN)) - m_ZoomEnvelopeX.ChangeValue(0.1f * m_ZoomEnvelopeX.GetValue()); - if(Input()->KeyPress(KEY_MOUSE_WHEEL_UP)) - m_ZoomEnvelopeX.ChangeValue(-0.1f * m_ZoomEnvelopeX.GetValue()); - } - } - - if(Ui()->HotItem() == &s_EnvelopeEditorId) - { - // do stuff - if(Ui()->MouseButton(0)) - { - s_EnvelopeEditorButtonUsed = 0; - if(s_Operation != EEnvelopeEditorOp::OP_BOX_SELECT && !Input()->ModifierIsPressed()) - { - s_Operation = EEnvelopeEditorOp::OP_BOX_SELECT; - s_MouseXStart = Ui()->MouseX(); - s_MouseYStart = Ui()->MouseY(); - } - } - else if(s_EnvelopeEditorButtonUsed == 0) - { - if(Ui()->DoDoubleClickLogic(&s_EnvelopeEditorId)) - { - // add point - float Time = ScreenToEnvelopeX(View, Ui()->MouseX()); - ColorRGBA Channels = ColorRGBA(0.0f, 0.0f, 0.0f, 0.0f); - if(in_range(Time, 0.0f, pEnvelope->EndTime())) - pEnvelope->Eval(Time, Channels, 4); - - int FixedTime = std::round(Time * 1000.0f); - bool TimeFound = false; - for(CEnvPoint &Point : pEnvelope->m_vPoints) - { - if(Point.m_Time == FixedTime) - TimeFound = true; - } - - if(!TimeFound) - m_EnvelopeEditorHistory.Execute(std::make_shared(this, m_SelectedEnvelope, FixedTime, Channels)); - - if(FixedTime < 0) - RemoveTimeOffsetEnvelope(pEnvelope); - m_Map.OnModify(); - } - s_EnvelopeEditorButtonUsed = -1; - } - - m_ShowEnvelopePreview = SHOWENV_SELECTED; - str_copy(m_aTooltip, "Double-click to create a new point. Use shift to change the zoom axis. Press S to scale selected envelope points."); - } - - UpdateZoomEnvelopeX(View); - UpdateZoomEnvelopeY(View); - - { - float UnitsPerLineY = 0.001f; - static const float s_aUnitPerLineOptionsY[] = {0.005f, 0.01f, 0.025f, 0.05f, 0.1f, 0.25f, 0.5f, 1.0f, 2.0f, 4.0f, 8.0f, 16.0f, 32.0f, 2 * 32.0f, 5 * 32.0f, 10 * 32.0f, 20 * 32.0f, 50 * 32.0f, 100 * 32.0f}; - for(float Value : s_aUnitPerLineOptionsY) - { - if(Value / m_ZoomEnvelopeY.GetValue() * View.h < 40.0f) - UnitsPerLineY = Value; - } - int NumLinesY = m_ZoomEnvelopeY.GetValue() / UnitsPerLineY + 1; - - Ui()->ClipEnable(&View); - Graphics()->TextureClear(); - Graphics()->LinesBegin(); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.2f); - - float BaseValue = static_cast(m_OffsetEnvelopeY * m_ZoomEnvelopeY.GetValue() / UnitsPerLineY) * UnitsPerLineY; - for(int i = 0; i <= NumLinesY; i++) - { - float Value = UnitsPerLineY * i - BaseValue; - IGraphics::CLineItem LineItem(View.x, EnvelopeToScreenY(View, Value), View.x + View.w, EnvelopeToScreenY(View, Value)); - Graphics()->LinesDraw(&LineItem, 1); - } - - Graphics()->LinesEnd(); - - Ui()->TextRender()->TextColor(1.0f, 1.0f, 1.0f, 0.4f); - for(int i = 0; i <= NumLinesY; i++) - { - float Value = UnitsPerLineY * i - BaseValue; - char aValueBuffer[16]; - if(UnitsPerLineY >= 1.0f) - { - str_format(aValueBuffer, sizeof(aValueBuffer), "%d", static_cast(Value)); - } - else - { - str_format(aValueBuffer, sizeof(aValueBuffer), "%.3f", Value); - } - Ui()->TextRender()->Text(View.x, EnvelopeToScreenY(View, Value) + 4.0f, 8.0f, aValueBuffer); - } - Ui()->TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); - Ui()->ClipDisable(); - } - - { - using namespace std::chrono_literals; - CTimeStep UnitsPerLineX = 1ms; - static const CTimeStep s_aUnitPerLineOptionsX[] = {5ms, 10ms, 25ms, 50ms, 100ms, 250ms, 500ms, 1s, 2s, 5s, 10s, 15s, 30s, 1min}; - for(CTimeStep Value : s_aUnitPerLineOptionsX) - { - if(Value.AsSeconds() / m_ZoomEnvelopeX.GetValue() * View.w < 160.0f) - UnitsPerLineX = Value; - } - int NumLinesX = m_ZoomEnvelopeX.GetValue() / UnitsPerLineX.AsSeconds() + 1; - - Ui()->ClipEnable(&View); - Graphics()->TextureClear(); - Graphics()->LinesBegin(); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.2f); - - CTimeStep BaseValue = UnitsPerLineX * static_cast(m_OffsetEnvelopeX * m_ZoomEnvelopeX.GetValue() / UnitsPerLineX.AsSeconds()); - for(int i = 0; i <= NumLinesX; i++) - { - float Value = UnitsPerLineX.AsSeconds() * i - BaseValue.AsSeconds(); - IGraphics::CLineItem LineItem(EnvelopeToScreenX(View, Value), View.y, EnvelopeToScreenX(View, Value), View.y + View.h); - Graphics()->LinesDraw(&LineItem, 1); - } - - Graphics()->LinesEnd(); - - Ui()->TextRender()->TextColor(1.0f, 1.0f, 1.0f, 0.4f); - for(int i = 0; i <= NumLinesX; i++) - { - CTimeStep Value = UnitsPerLineX * i - BaseValue; - if(Value.AsSeconds() >= 0) - { - char aValueBuffer[16]; - Value.Format(aValueBuffer, sizeof(aValueBuffer)); - - Ui()->TextRender()->Text(EnvelopeToScreenX(View, Value.AsSeconds()) + 1.0f, View.y + View.h - 8.0f, 8.0f, aValueBuffer); - } - } - Ui()->TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); - Ui()->ClipDisable(); - } - - // render tangents for bezier curves - { - Ui()->ClipEnable(&View); - Graphics()->TextureClear(); - Graphics()->LinesBegin(); - for(int c = 0; c < pEnvelope->GetChannels(); c++) - { - if(!(s_ActiveChannels & (1 << c))) - continue; - - for(int i = 0; i < (int)pEnvelope->m_vPoints.size(); i++) - { - float PosX = EnvelopeToScreenX(View, fxt2f(pEnvelope->m_vPoints[i].m_Time)); - float PosY = EnvelopeToScreenY(View, fx2f(pEnvelope->m_vPoints[i].m_aValues[c])); - - // Out-Tangent - if(pEnvelope->m_vPoints[i].m_Curvetype == CURVETYPE_BEZIER) - { - float TangentX = EnvelopeToScreenX(View, fxt2f(pEnvelope->m_vPoints[i].m_Time + pEnvelope->m_vPoints[i].m_Bezier.m_aOutTangentDeltaX[c])); - float TangentY = EnvelopeToScreenY(View, fx2f(pEnvelope->m_vPoints[i].m_aValues[c] + pEnvelope->m_vPoints[i].m_Bezier.m_aOutTangentDeltaY[c])); - - if(IsTangentOutPointSelected(i, c)) - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.4f); - else - Graphics()->SetColor(aColors[c].r, aColors[c].g, aColors[c].b, 0.4f); - - IGraphics::CLineItem LineItem(TangentX, TangentY, PosX, PosY); - Graphics()->LinesDraw(&LineItem, 1); - } - - // In-Tangent - if(i > 0 && pEnvelope->m_vPoints[i - 1].m_Curvetype == CURVETYPE_BEZIER) - { - float TangentX = EnvelopeToScreenX(View, fxt2f(pEnvelope->m_vPoints[i].m_Time + pEnvelope->m_vPoints[i].m_Bezier.m_aInTangentDeltaX[c])); - float TangentY = EnvelopeToScreenY(View, fx2f(pEnvelope->m_vPoints[i].m_aValues[c] + pEnvelope->m_vPoints[i].m_Bezier.m_aInTangentDeltaY[c])); - - if(IsTangentInPointSelected(i, c)) - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.4f); - else - Graphics()->SetColor(aColors[c].r, aColors[c].g, aColors[c].b, 0.4f); - - IGraphics::CLineItem LineItem(TangentX, TangentY, PosX, PosY); - Graphics()->LinesDraw(&LineItem, 1); - } - } - } - Graphics()->LinesEnd(); - Ui()->ClipDisable(); - } - - // render lines - { - float EndTimeTotal = maximum(0.000001f, pEnvelope->EndTime()); - float EndX = clamp(EnvelopeToScreenX(View, EndTimeTotal), View.x, View.x + View.w); - float StartX = clamp(View.x + View.w * m_OffsetEnvelopeX, View.x, View.x + View.w); - - float EndTime = ScreenToEnvelopeX(View, EndX); - float StartTime = ScreenToEnvelopeX(View, StartX); - - Ui()->ClipEnable(&View); - Graphics()->TextureClear(); - Graphics()->LinesBegin(); - for(int c = 0; c < pEnvelope->GetChannels(); c++) - { - if(s_ActiveChannels & (1 << c)) - Graphics()->SetColor(aColors[c].r, aColors[c].g, aColors[c].b, 1); - else - Graphics()->SetColor(aColors[c].r * 0.5f, aColors[c].g * 0.5f, aColors[c].b * 0.5f, 1); - - int Steps = static_cast(((EndX - StartX) / Ui()->Screen()->w) * Graphics()->ScreenWidth()); - float StepTime = (EndTime - StartTime) / static_cast(Steps); - float StepSize = (EndX - StartX) / static_cast(Steps); - - ColorRGBA Channels = ColorRGBA(0.0f, 0.0f, 0.0f, 0.0f); - pEnvelope->Eval(StartTime, Channels, c + 1); - float PrevY = EnvelopeToScreenY(View, Channels[c]); - for(int i = 1; i < Steps; i++) - { - Channels = ColorRGBA(0.0f, 0.0f, 0.0f, 0.0f); - pEnvelope->Eval(StartTime + i * StepTime, Channels, c + 1); - float CurrentY = EnvelopeToScreenY(View, Channels[c]); - - IGraphics::CLineItem LineItem( - StartX + (i - 1) * StepSize, - PrevY, - StartX + i * StepSize, - CurrentY); - Graphics()->LinesDraw(&LineItem, 1); - - PrevY = CurrentY; - } - } - Graphics()->LinesEnd(); - Ui()->ClipDisable(); - } - - // render curve options - { - for(int i = 0; i < (int)pEnvelope->m_vPoints.size() - 1; i++) - { - float t0 = fxt2f(pEnvelope->m_vPoints[i].m_Time); - float t1 = fxt2f(pEnvelope->m_vPoints[i + 1].m_Time); - - CUIRect CurveButton; - CurveButton.x = EnvelopeToScreenX(View, t0 + (t1 - t0) * 0.5f); - CurveButton.y = CurveBar.y; - CurveButton.h = CurveBar.h; - CurveButton.w = CurveBar.h; - CurveButton.x -= CurveButton.w / 2.0f; - const void *pId = &pEnvelope->m_vPoints[i].m_Curvetype; - static const char *const TYPE_NAMES[NUM_CURVETYPES] = {"N", "L", "S", "F", "M", "B"}; - const char *pTypeName = "!?"; - if(0 <= pEnvelope->m_vPoints[i].m_Curvetype && pEnvelope->m_vPoints[i].m_Curvetype < (int)std::size(TYPE_NAMES)) - pTypeName = TYPE_NAMES[pEnvelope->m_vPoints[i].m_Curvetype]; - - if(CurveButton.x >= View.x) - { - const int ButtonResult = DoButton_Editor(pId, pTypeName, 0, &CurveButton, BUTTON_CONTEXT, "Switch curve type (N = step, L = linear, S = slow, F = fast, M = smooth, B = bezier)."); - if(ButtonResult == 1) - { - const int PrevCurve = pEnvelope->m_vPoints[i].m_Curvetype; - const int Direction = Input()->ShiftIsPressed() ? -1 : 1; - pEnvelope->m_vPoints[i].m_Curvetype = (pEnvelope->m_vPoints[i].m_Curvetype + Direction + NUM_CURVETYPES) % NUM_CURVETYPES; - - m_EnvelopeEditorHistory.RecordAction(std::make_shared(this, - m_SelectedEnvelope, i, 0, CEditorActionEnvelopeEditPoint::EEditType::CURVE_TYPE, PrevCurve, pEnvelope->m_vPoints[i].m_Curvetype)); - m_Map.OnModify(); - } - else if(ButtonResult == 2) - { - m_PopupEnvelopeSelectedPoint = i; - static SPopupMenuId s_PopupCurvetypeId; - Ui()->DoPopupMenu(&s_PopupCurvetypeId, Ui()->MouseX(), Ui()->MouseY(), 80, NUM_CURVETYPES * 14.0f + 10.0f, this, PopupEnvelopeCurvetype); - } - } - } - } - - // render colorbar - if(ShowColorBar) - { - Ui()->ClipEnable(&ColorBar); - - float StartX = maximum(EnvelopeToScreenX(View, 0), ColorBar.x); - float EndX = EnvelopeToScreenX(View, pEnvelope->EndTime()); - CUIRect BackgroundView{ - StartX, - ColorBar.y, - minimum(EndX - StartX, ColorBar.x + ColorBar.w - StartX), - ColorBar.h}; - RenderBackground(BackgroundView, m_CheckerTexture, 16.0f, 1.0f); - - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - for(int i = 0; i < (int)pEnvelope->m_vPoints.size() - 1; i++) - { - float r0 = fx2f(pEnvelope->m_vPoints[i].m_aValues[0]); - float g0 = fx2f(pEnvelope->m_vPoints[i].m_aValues[1]); - float b0 = fx2f(pEnvelope->m_vPoints[i].m_aValues[2]); - float a0 = fx2f(pEnvelope->m_vPoints[i].m_aValues[3]); - float r1 = fx2f(pEnvelope->m_vPoints[i + 1].m_aValues[0]); - float g1 = fx2f(pEnvelope->m_vPoints[i + 1].m_aValues[1]); - float b1 = fx2f(pEnvelope->m_vPoints[i + 1].m_aValues[2]); - float a1 = fx2f(pEnvelope->m_vPoints[i + 1].m_aValues[3]); - - IGraphics::CColorVertex Array[4] = {IGraphics::CColorVertex(0, r0, g0, b0, a0), - IGraphics::CColorVertex(1, r1, g1, b1, a1), - IGraphics::CColorVertex(2, r1, g1, b1, a1), - IGraphics::CColorVertex(3, r0, g0, b0, a0)}; - Graphics()->SetColorVertex(Array, 4); - - float x0 = EnvelopeToScreenX(View, fxt2f(pEnvelope->m_vPoints[i].m_Time)); - float x1 = EnvelopeToScreenX(View, fxt2f(pEnvelope->m_vPoints[i + 1].m_Time)); - - IGraphics::CQuadItem QuadItem(x0, ColorBar.y, x1 - x0, ColorBar.h); - Graphics()->QuadsDrawTL(&QuadItem, 1); - } - Graphics()->QuadsEnd(); - Ui()->ClipDisable(); - } - - // render handles - if(CurrentEnvelopeSwitched) - { - DeselectEnvPoints(); - m_ResetZoomEnvelope = true; - } - - { - static SPopupMenuId s_PopupEnvPointId; - const auto &&ShowPopupEnvPoint = [&]() { - Ui()->DoPopupMenu(&s_PopupEnvPointId, Ui()->MouseX(), Ui()->MouseY(), 150, 56 + (pEnvelope->GetChannels() == 4 && !IsTangentSelected() ? 16.0f : 0.0f), this, PopupEnvPoint); - }; - - if(s_Operation == EEnvelopeEditorOp::OP_NONE) - { - SetHotEnvelopePoint(View, pEnvelope, s_ActiveChannels); - if(!Ui()->MouseButton(0)) - m_EnvOpTracker.Stop(false); - } - else - { - m_EnvOpTracker.Begin(s_Operation); - } - - Ui()->ClipEnable(&View); - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - for(int c = 0; c < pEnvelope->GetChannels(); c++) - { - if(!(s_ActiveChannels & (1 << c))) - continue; - - for(int i = 0; i < (int)pEnvelope->m_vPoints.size(); i++) - { - // point handle - { - CUIRect Final; - Final.x = EnvelopeToScreenX(View, fxt2f(pEnvelope->m_vPoints[i].m_Time)); - Final.y = EnvelopeToScreenY(View, fx2f(pEnvelope->m_vPoints[i].m_aValues[c])); - Final.x -= 2.0f; - Final.y -= 2.0f; - Final.w = 4.0f; - Final.h = 4.0f; - - const void *pId = &pEnvelope->m_vPoints[i].m_aValues[c]; - - if(IsEnvPointSelected(i, c)) - { - Graphics()->SetColor(1, 1, 1, 1); - CUIRect Background = { - Final.x - 0.2f * Final.w, - Final.y - 0.2f * Final.h, - Final.w * 1.4f, - Final.h * 1.4f}; - IGraphics::CQuadItem QuadItem(Background.x, Background.y, Background.w, Background.h); - Graphics()->QuadsDrawTL(&QuadItem, 1); - } - - if(Ui()->CheckActiveItem(pId)) - { - m_ShowEnvelopePreview = SHOWENV_SELECTED; - - if(s_Operation == EEnvelopeEditorOp::OP_SELECT) - { - float dx = s_MouseXStart - Ui()->MouseX(); - float dy = s_MouseYStart - Ui()->MouseY(); - - if(dx * dx + dy * dy > 20.0f) - { - s_Operation = EEnvelopeEditorOp::OP_DRAG_POINT; - - if(!IsEnvPointSelected(i, c)) - SelectEnvPoint(i, c); - } - } - - if(s_Operation == EEnvelopeEditorOp::OP_DRAG_POINT || s_Operation == EEnvelopeEditorOp::OP_DRAG_POINT_X || s_Operation == EEnvelopeEditorOp::OP_DRAG_POINT_Y) - { - if(Input()->ShiftIsPressed()) - { - if(s_Operation == EEnvelopeEditorOp::OP_DRAG_POINT || s_Operation == EEnvelopeEditorOp::OP_DRAG_POINT_Y) - { - s_Operation = EEnvelopeEditorOp::OP_DRAG_POINT_X; - s_vAccurateDragValuesX.clear(); - for(auto [SelectedIndex, _] : m_vSelectedEnvelopePoints) - s_vAccurateDragValuesX.push_back(pEnvelope->m_vPoints[SelectedIndex].m_Time); - } - else - { - float DeltaX = ScreenToEnvelopeDX(View, Ui()->MouseDeltaX()) * (Input()->ModifierIsPressed() ? 50.0f : 1000.0f); - - for(size_t k = 0; k < m_vSelectedEnvelopePoints.size(); k++) - { - int SelectedIndex = m_vSelectedEnvelopePoints[k].first; - int BoundLow = f2fxt(ScreenToEnvelopeX(View, View.x)); - int BoundHigh = f2fxt(ScreenToEnvelopeX(View, View.x + View.w)); - for(int j = 0; j < SelectedIndex; j++) - { - if(!IsEnvPointSelected(j)) - BoundLow = maximum(pEnvelope->m_vPoints[j].m_Time + 1, BoundLow); - } - for(int j = SelectedIndex + 1; j < (int)pEnvelope->m_vPoints.size(); j++) - { - if(!IsEnvPointSelected(j)) - BoundHigh = minimum(pEnvelope->m_vPoints[j].m_Time - 1, BoundHigh); - } - - DeltaX = ClampDelta(s_vAccurateDragValuesX[k], DeltaX, BoundLow, BoundHigh); - } - for(size_t k = 0; k < m_vSelectedEnvelopePoints.size(); k++) - { - int SelectedIndex = m_vSelectedEnvelopePoints[k].first; - s_vAccurateDragValuesX[k] += DeltaX; - pEnvelope->m_vPoints[SelectedIndex].m_Time = std::round(s_vAccurateDragValuesX[k]); - } - for(size_t k = 0; k < m_vSelectedEnvelopePoints.size(); k++) - { - int SelectedIndex = m_vSelectedEnvelopePoints[k].first; - if(SelectedIndex == 0 && pEnvelope->m_vPoints[SelectedIndex].m_Time != 0) - { - RemoveTimeOffsetEnvelope(pEnvelope); - float Offset = s_vAccurateDragValuesX[k]; - for(auto &Value : s_vAccurateDragValuesX) - Value -= Offset; - break; - } - } - } - } - else - { - if(s_Operation == EEnvelopeEditorOp::OP_DRAG_POINT || s_Operation == EEnvelopeEditorOp::OP_DRAG_POINT_X) - { - s_Operation = EEnvelopeEditorOp::OP_DRAG_POINT_Y; - s_vAccurateDragValuesY.clear(); - for(auto [SelectedIndex, SelectedChannel] : m_vSelectedEnvelopePoints) - s_vAccurateDragValuesY.push_back(pEnvelope->m_vPoints[SelectedIndex].m_aValues[SelectedChannel]); - } - else - { - float DeltaY = ScreenToEnvelopeDY(View, Ui()->MouseDeltaY()) * (Input()->ModifierIsPressed() ? 51.2f : 1024.0f); - for(size_t k = 0; k < m_vSelectedEnvelopePoints.size(); k++) - { - auto [SelectedIndex, SelectedChannel] = m_vSelectedEnvelopePoints[k]; - s_vAccurateDragValuesY[k] -= DeltaY; - pEnvelope->m_vPoints[SelectedIndex].m_aValues[SelectedChannel] = std::round(s_vAccurateDragValuesY[k]); - - if(pEnvelope->GetChannels() == 1 || pEnvelope->GetChannels() == 4) - { - pEnvelope->m_vPoints[i].m_aValues[c] = clamp(pEnvelope->m_vPoints[i].m_aValues[c], 0, 1024); - s_vAccurateDragValuesY[k] = clamp(s_vAccurateDragValuesY[k], 0, 1024); - } - } - } - } - } - - if(s_Operation == EEnvelopeEditorOp::OP_CONTEXT_MENU) - { - if(!Ui()->MouseButton(1)) - { - if(m_vSelectedEnvelopePoints.size() == 1) - { - m_UpdateEnvPointInfo = true; - ShowPopupEnvPoint(); - } - else if(m_vSelectedEnvelopePoints.size() > 1) - { - static SPopupMenuId s_PopupEnvPointMultiId; - Ui()->DoPopupMenu(&s_PopupEnvPointMultiId, Ui()->MouseX(), Ui()->MouseY(), 80, 22, this, PopupEnvPointMulti); - } - Ui()->SetActiveItem(nullptr); - s_Operation = EEnvelopeEditorOp::OP_NONE; - } - } - else if(!Ui()->MouseButton(0)) - { - Ui()->SetActiveItem(nullptr); - m_SelectedQuadEnvelope = -1; - - if(s_Operation == EEnvelopeEditorOp::OP_SELECT) - { - if(Input()->ShiftIsPressed()) - ToggleEnvPoint(i, c); - else - SelectEnvPoint(i, c); - } - - s_Operation = EEnvelopeEditorOp::OP_NONE; - m_Map.OnModify(); - } - - Graphics()->SetColor(1, 1, 1, 1); - } - else if(Ui()->HotItem() == pId) - { - if(Ui()->MouseButton(0)) - { - Ui()->SetActiveItem(pId); - s_Operation = EEnvelopeEditorOp::OP_SELECT; - m_SelectedQuadEnvelope = m_SelectedEnvelope; - - s_MouseXStart = Ui()->MouseX(); - s_MouseYStart = Ui()->MouseY(); - } - else if(Ui()->MouseButtonClicked(1)) - { - if(Input()->ShiftIsPressed()) - { - m_EnvelopeEditorHistory.Execute(std::make_shared(this, m_SelectedEnvelope, i)); - } - else - { - s_Operation = EEnvelopeEditorOp::OP_CONTEXT_MENU; - if(!IsEnvPointSelected(i, c)) - SelectEnvPoint(i, c); - Ui()->SetActiveItem(pId); - } - } - - m_ShowEnvelopePreview = SHOWENV_SELECTED; - Graphics()->SetColor(1, 1, 1, 1); - str_copy(m_aTooltip, "Envelope point. Left mouse to drag. Hold ctrl to be more precise. Hold shift to alter time. Shift + right-click to delete."); - ms_pUiGotContext = pId; - } - else - Graphics()->SetColor(aColors[c].r, aColors[c].g, aColors[c].b, 1.0f); - - IGraphics::CQuadItem QuadItem(Final.x, Final.y, Final.w, Final.h); - Graphics()->QuadsDrawTL(&QuadItem, 1); - } - - // tangent handles for bezier curves - if(i >= 0 && i < (int)pEnvelope->m_vPoints.size()) - { - // Out-Tangent handle - if(pEnvelope->m_vPoints[i].m_Curvetype == CURVETYPE_BEZIER) - { - CUIRect Final; - Final.x = EnvelopeToScreenX(View, fxt2f(pEnvelope->m_vPoints[i].m_Time + pEnvelope->m_vPoints[i].m_Bezier.m_aOutTangentDeltaX[c])); - Final.y = EnvelopeToScreenY(View, fx2f(pEnvelope->m_vPoints[i].m_aValues[c] + pEnvelope->m_vPoints[i].m_Bezier.m_aOutTangentDeltaY[c])); - Final.x -= 2.0f; - Final.y -= 2.0f; - Final.w = 4.0f; - Final.h = 4.0f; - - // handle logic - const void *pId = &pEnvelope->m_vPoints[i].m_Bezier.m_aOutTangentDeltaX[c]; - - if(IsTangentOutPointSelected(i, c)) - { - Graphics()->SetColor(1, 1, 1, 1); - IGraphics::CFreeformItem FreeformItem( - Final.x + Final.w / 2.0f, - Final.y - 1, - Final.x + Final.w / 2.0f, - Final.y - 1, - Final.x + Final.w + 1, - Final.y + Final.h + 1, - Final.x - 1, - Final.y + Final.h + 1); - Graphics()->QuadsDrawFreeform(&FreeformItem, 1); - } - - if(Ui()->CheckActiveItem(pId)) - { - m_ShowEnvelopePreview = SHOWENV_SELECTED; - - if(s_Operation == EEnvelopeEditorOp::OP_SELECT) - { - float dx = s_MouseXStart - Ui()->MouseX(); - float dy = s_MouseYStart - Ui()->MouseY(); - - if(dx * dx + dy * dy > 20.0f) - { - s_Operation = EEnvelopeEditorOp::OP_DRAG_POINT; - - s_vAccurateDragValuesX = {static_cast(pEnvelope->m_vPoints[i].m_Bezier.m_aOutTangentDeltaX[c])}; - s_vAccurateDragValuesY = {static_cast(pEnvelope->m_vPoints[i].m_Bezier.m_aOutTangentDeltaY[c])}; - - if(!IsTangentOutPointSelected(i, c)) - SelectTangentOutPoint(i, c); - } - } - - if(s_Operation == EEnvelopeEditorOp::OP_DRAG_POINT) - { - float DeltaX = ScreenToEnvelopeDX(View, Ui()->MouseDeltaX()) * (Input()->ModifierIsPressed() ? 50.0f : 1000.0f); - float DeltaY = ScreenToEnvelopeDY(View, Ui()->MouseDeltaY()) * (Input()->ModifierIsPressed() ? 51.2f : 1024.0f); - s_vAccurateDragValuesX[0] += DeltaX; - s_vAccurateDragValuesY[0] -= DeltaY; - - pEnvelope->m_vPoints[i].m_Bezier.m_aOutTangentDeltaX[c] = std::round(s_vAccurateDragValuesX[0]); - pEnvelope->m_vPoints[i].m_Bezier.m_aOutTangentDeltaY[c] = std::round(s_vAccurateDragValuesY[0]); - - // clamp time value - pEnvelope->m_vPoints[i].m_Bezier.m_aOutTangentDeltaX[c] = clamp(pEnvelope->m_vPoints[i].m_Bezier.m_aOutTangentDeltaX[c], 0, f2fxt(ScreenToEnvelopeX(View, View.x + View.w)) - pEnvelope->m_vPoints[i].m_Time); - s_vAccurateDragValuesX[0] = clamp(s_vAccurateDragValuesX[0], 0, f2fxt(ScreenToEnvelopeX(View, View.x + View.w)) - pEnvelope->m_vPoints[i].m_Time); - } - - if(s_Operation == EEnvelopeEditorOp::OP_CONTEXT_MENU) - { - if(!Ui()->MouseButton(1)) - { - if(IsTangentOutPointSelected(i, c)) - { - m_UpdateEnvPointInfo = true; - ShowPopupEnvPoint(); - } - Ui()->SetActiveItem(nullptr); - s_Operation = EEnvelopeEditorOp::OP_NONE; - } - } - else if(!Ui()->MouseButton(0)) - { - Ui()->SetActiveItem(nullptr); - m_SelectedQuadEnvelope = -1; - - if(s_Operation == EEnvelopeEditorOp::OP_SELECT) - SelectTangentOutPoint(i, c); - - s_Operation = EEnvelopeEditorOp::OP_NONE; - m_Map.OnModify(); - } - - Graphics()->SetColor(1, 1, 1, 1); - } - else if(Ui()->HotItem() == pId) - { - if(Ui()->MouseButton(0)) - { - Ui()->SetActiveItem(pId); - s_Operation = EEnvelopeEditorOp::OP_SELECT; - m_SelectedQuadEnvelope = m_SelectedEnvelope; - - s_MouseXStart = Ui()->MouseX(); - s_MouseYStart = Ui()->MouseY(); - } - else if(Ui()->MouseButtonClicked(1)) - { - if(Input()->ShiftIsPressed()) - { - SelectTangentOutPoint(i, c); - pEnvelope->m_vPoints[i].m_Bezier.m_aOutTangentDeltaX[c] = 0.0f; - pEnvelope->m_vPoints[i].m_Bezier.m_aOutTangentDeltaY[c] = 0.0f; - m_Map.OnModify(); - } - else - { - s_Operation = EEnvelopeEditorOp::OP_CONTEXT_MENU; - SelectTangentOutPoint(i, c); - Ui()->SetActiveItem(pId); - } - } - - m_ShowEnvelopePreview = SHOWENV_SELECTED; - Graphics()->SetColor(1, 1, 1, 1); - str_copy(m_aTooltip, "Bezier out-tangent. Left mouse to drag. Hold ctrl to be more precise. Shift + right-click to reset."); - ms_pUiGotContext = pId; - } - else - Graphics()->SetColor(aColors[c].r, aColors[c].g, aColors[c].b, 1.0f); - - // draw triangle - IGraphics::CFreeformItem FreeformItem(Final.x + Final.w / 2.0f, Final.y, Final.x + Final.w / 2.0f, Final.y, Final.x + Final.w, Final.y + Final.h, Final.x, Final.y + Final.h); - Graphics()->QuadsDrawFreeform(&FreeformItem, 1); - } - - // In-Tangent handle - if(i > 0 && pEnvelope->m_vPoints[i - 1].m_Curvetype == CURVETYPE_BEZIER) - { - CUIRect Final; - Final.x = EnvelopeToScreenX(View, fxt2f(pEnvelope->m_vPoints[i].m_Time + pEnvelope->m_vPoints[i].m_Bezier.m_aInTangentDeltaX[c])); - Final.y = EnvelopeToScreenY(View, fx2f(pEnvelope->m_vPoints[i].m_aValues[c] + pEnvelope->m_vPoints[i].m_Bezier.m_aInTangentDeltaY[c])); - Final.x -= 2.0f; - Final.y -= 2.0f; - Final.w = 4.0f; - Final.h = 4.0f; - - // handle logic - const void *pId = &pEnvelope->m_vPoints[i].m_Bezier.m_aInTangentDeltaX[c]; - - if(IsTangentInPointSelected(i, c)) - { - Graphics()->SetColor(1, 1, 1, 1); - IGraphics::CFreeformItem FreeformItem( - Final.x + Final.w / 2.0f, - Final.y - 1, - Final.x + Final.w / 2.0f, - Final.y - 1, - Final.x + Final.w + 1, - Final.y + Final.h + 1, - Final.x - 1, - Final.y + Final.h + 1); - Graphics()->QuadsDrawFreeform(&FreeformItem, 1); - } - - if(Ui()->CheckActiveItem(pId)) - { - m_ShowEnvelopePreview = SHOWENV_SELECTED; - - if(s_Operation == EEnvelopeEditorOp::OP_SELECT) - { - float dx = s_MouseXStart - Ui()->MouseX(); - float dy = s_MouseYStart - Ui()->MouseY(); - - if(dx * dx + dy * dy > 20.0f) - { - s_Operation = EEnvelopeEditorOp::OP_DRAG_POINT; - - s_vAccurateDragValuesX = {static_cast(pEnvelope->m_vPoints[i].m_Bezier.m_aInTangentDeltaX[c])}; - s_vAccurateDragValuesY = {static_cast(pEnvelope->m_vPoints[i].m_Bezier.m_aInTangentDeltaY[c])}; - - if(!IsTangentInPointSelected(i, c)) - SelectTangentInPoint(i, c); - } - } - - if(s_Operation == EEnvelopeEditorOp::OP_DRAG_POINT) - { - float DeltaX = ScreenToEnvelopeDX(View, Ui()->MouseDeltaX()) * (Input()->ModifierIsPressed() ? 50.0f : 1000.0f); - float DeltaY = ScreenToEnvelopeDY(View, Ui()->MouseDeltaY()) * (Input()->ModifierIsPressed() ? 51.2f : 1024.0f); - s_vAccurateDragValuesX[0] += DeltaX; - s_vAccurateDragValuesY[0] -= DeltaY; - - pEnvelope->m_vPoints[i].m_Bezier.m_aInTangentDeltaX[c] = std::round(s_vAccurateDragValuesX[0]); - pEnvelope->m_vPoints[i].m_Bezier.m_aInTangentDeltaY[c] = std::round(s_vAccurateDragValuesY[0]); - - // clamp time value - pEnvelope->m_vPoints[i].m_Bezier.m_aInTangentDeltaX[c] = clamp(pEnvelope->m_vPoints[i].m_Bezier.m_aInTangentDeltaX[c], f2fxt(ScreenToEnvelopeX(View, View.x)) - pEnvelope->m_vPoints[i].m_Time, 0); - s_vAccurateDragValuesX[0] = clamp(s_vAccurateDragValuesX[0], f2fxt(ScreenToEnvelopeX(View, View.x)) - pEnvelope->m_vPoints[i].m_Time, 0); - } - - if(s_Operation == EEnvelopeEditorOp::OP_CONTEXT_MENU) - { - if(!Ui()->MouseButton(1)) - { - if(IsTangentInPointSelected(i, c)) - { - m_UpdateEnvPointInfo = true; - ShowPopupEnvPoint(); - } - Ui()->SetActiveItem(nullptr); - s_Operation = EEnvelopeEditorOp::OP_NONE; - } - } - else if(!Ui()->MouseButton(0)) - { - Ui()->SetActiveItem(nullptr); - m_SelectedQuadEnvelope = -1; - - if(s_Operation == EEnvelopeEditorOp::OP_SELECT) - SelectTangentInPoint(i, c); - - s_Operation = EEnvelopeEditorOp::OP_NONE; - m_Map.OnModify(); - } - - Graphics()->SetColor(1, 1, 1, 1); - } - else if(Ui()->HotItem() == pId) - { - if(Ui()->MouseButton(0)) - { - Ui()->SetActiveItem(pId); - s_Operation = EEnvelopeEditorOp::OP_SELECT; - m_SelectedQuadEnvelope = m_SelectedEnvelope; - - s_MouseXStart = Ui()->MouseX(); - s_MouseYStart = Ui()->MouseY(); - } - else if(Ui()->MouseButtonClicked(1)) - { - if(Input()->ShiftIsPressed()) - { - SelectTangentInPoint(i, c); - pEnvelope->m_vPoints[i].m_Bezier.m_aInTangentDeltaX[c] = 0.0f; - pEnvelope->m_vPoints[i].m_Bezier.m_aInTangentDeltaY[c] = 0.0f; - m_Map.OnModify(); - } - else - { - s_Operation = EEnvelopeEditorOp::OP_CONTEXT_MENU; - SelectTangentInPoint(i, c); - Ui()->SetActiveItem(pId); - } - } - - m_ShowEnvelopePreview = SHOWENV_SELECTED; - Graphics()->SetColor(1, 1, 1, 1); - str_copy(m_aTooltip, "Bezier in-tangent. Left mouse to drag. Hold ctrl to be more precise. Shift + right-click to reset."); - ms_pUiGotContext = pId; - } - else - Graphics()->SetColor(aColors[c].r, aColors[c].g, aColors[c].b, 1.0f); - - // draw triangle - IGraphics::CFreeformItem FreeformItem(Final.x + Final.w / 2.0f, Final.y, Final.x + Final.w / 2.0f, Final.y, Final.x + Final.w, Final.y + Final.h, Final.x, Final.y + Final.h); - Graphics()->QuadsDrawFreeform(&FreeformItem, 1); - } - } - } - } - Graphics()->QuadsEnd(); - Ui()->ClipDisable(); - } - - // handle scaling - static float s_ScaleFactorX = 1.0f; - static float s_ScaleFactorY = 1.0f; - static float s_MidpointX = 0.0f; - static float s_MidpointY = 0.0f; - static std::vector s_vInitialPositionsX; - static std::vector s_vInitialPositionsY; - if(s_Operation == EEnvelopeEditorOp::OP_NONE && !s_NameInput.IsActive() && Input()->KeyIsPressed(KEY_S) && !Input()->ModifierIsPressed() && !m_vSelectedEnvelopePoints.empty()) - { - s_Operation = EEnvelopeEditorOp::OP_SCALE; - s_ScaleFactorX = 1.0f; - s_ScaleFactorY = 1.0f; - auto [FirstPointIndex, FirstPointChannel] = m_vSelectedEnvelopePoints.front(); - - float MaximumX = pEnvelope->m_vPoints[FirstPointIndex].m_Time; - float MinimumX = MaximumX; - s_vInitialPositionsX.clear(); - for(auto [SelectedIndex, _] : m_vSelectedEnvelopePoints) - { - float Value = pEnvelope->m_vPoints[SelectedIndex].m_Time; - s_vInitialPositionsX.push_back(Value); - MaximumX = maximum(MaximumX, Value); - MinimumX = minimum(MinimumX, Value); - } - s_MidpointX = (MaximumX - MinimumX) / 2.0f + MinimumX; - - float MaximumY = pEnvelope->m_vPoints[FirstPointIndex].m_aValues[FirstPointChannel]; - float MinimumY = MaximumY; - s_vInitialPositionsY.clear(); - for(auto [SelectedIndex, SelectedChannel] : m_vSelectedEnvelopePoints) - { - float Value = pEnvelope->m_vPoints[SelectedIndex].m_aValues[SelectedChannel]; - s_vInitialPositionsY.push_back(Value); - MaximumY = maximum(MaximumY, Value); - MinimumY = minimum(MinimumY, Value); - } - s_MidpointY = (MaximumY - MinimumY) / 2.0f + MinimumY; - } - - if(s_Operation == EEnvelopeEditorOp::OP_SCALE) - { - str_copy(m_aTooltip, "Press shift to scale the time. Press alt to scale along midpoint. Press ctrl to be more precise."); - - if(Input()->ShiftIsPressed()) - { - s_ScaleFactorX += Ui()->MouseDeltaX() / Graphics()->ScreenWidth() * (Input()->ModifierIsPressed() ? 0.5f : 10.0f); - float Midpoint = Input()->AltIsPressed() ? s_MidpointX : 0.0f; - for(size_t k = 0; k < m_vSelectedEnvelopePoints.size(); k++) - { - int SelectedIndex = m_vSelectedEnvelopePoints[k].first; - int BoundLow = f2fxt(ScreenToEnvelopeX(View, View.x)); - int BoundHigh = f2fxt(ScreenToEnvelopeX(View, View.x + View.w)); - for(int j = 0; j < SelectedIndex; j++) - { - if(!IsEnvPointSelected(j)) - BoundLow = maximum(pEnvelope->m_vPoints[j].m_Time + 1, BoundLow); - } - for(int j = SelectedIndex + 1; j < (int)pEnvelope->m_vPoints.size(); j++) - { - if(!IsEnvPointSelected(j)) - BoundHigh = minimum(pEnvelope->m_vPoints[j].m_Time - 1, BoundHigh); - } - - float Value = s_vInitialPositionsX[k]; - float ScaleBoundLow = (BoundLow - Midpoint) / (Value - Midpoint); - float ScaleBoundHigh = (BoundHigh - Midpoint) / (Value - Midpoint); - float ScaleBoundMin = minimum(ScaleBoundLow, ScaleBoundHigh); - float ScaleBoundMax = maximum(ScaleBoundLow, ScaleBoundHigh); - s_ScaleFactorX = clamp(s_ScaleFactorX, ScaleBoundMin, ScaleBoundMax); - } - - for(size_t k = 0; k < m_vSelectedEnvelopePoints.size(); k++) - { - int SelectedIndex = m_vSelectedEnvelopePoints[k].first; - float ScaleMinimum = s_vInitialPositionsX[k] - Midpoint > fxt2f(1) ? fxt2f(1) / (s_vInitialPositionsX[k] - Midpoint) : 0.0f; - float ScaleFactor = maximum(ScaleMinimum, s_ScaleFactorX); - pEnvelope->m_vPoints[SelectedIndex].m_Time = std::round((s_vInitialPositionsX[k] - Midpoint) * ScaleFactor + Midpoint); - } - for(size_t k = 1; k < pEnvelope->m_vPoints.size(); k++) - { - if(pEnvelope->m_vPoints[k].m_Time <= pEnvelope->m_vPoints[k - 1].m_Time) - pEnvelope->m_vPoints[k].m_Time = pEnvelope->m_vPoints[k - 1].m_Time + 1; - } - for(auto [SelectedIndex, _] : m_vSelectedEnvelopePoints) - { - if(SelectedIndex == 0 && pEnvelope->m_vPoints[SelectedIndex].m_Time != 0) - { - float Offset = pEnvelope->m_vPoints[0].m_Time; - RemoveTimeOffsetEnvelope(pEnvelope); - s_MidpointX -= Offset; - for(auto &Value : s_vInitialPositionsX) - Value -= Offset; - break; - } - } - } - else - { - s_ScaleFactorY -= Ui()->MouseDeltaY() / Graphics()->ScreenHeight() * (Input()->ModifierIsPressed() ? 0.5f : 10.0f); - for(size_t k = 0; k < m_vSelectedEnvelopePoints.size(); k++) - { - auto [SelectedIndex, SelectedChannel] = m_vSelectedEnvelopePoints[k]; - if(Input()->AltIsPressed()) - pEnvelope->m_vPoints[SelectedIndex].m_aValues[SelectedChannel] = std::round((s_vInitialPositionsY[k] - s_MidpointY) * s_ScaleFactorY + s_MidpointY); - else - pEnvelope->m_vPoints[SelectedIndex].m_aValues[SelectedChannel] = std::round(s_vInitialPositionsY[k] * s_ScaleFactorY); - - if(pEnvelope->GetChannels() == 1 || pEnvelope->GetChannels() == 4) - pEnvelope->m_vPoints[SelectedIndex].m_aValues[SelectedChannel] = clamp(pEnvelope->m_vPoints[SelectedIndex].m_aValues[SelectedChannel], 0, 1024); - } - } - - if(Ui()->MouseButton(0)) - { - s_Operation = EEnvelopeEditorOp::OP_NONE; - m_EnvOpTracker.Stop(false); - } - else if(Ui()->MouseButton(1) || Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) - { - for(size_t k = 0; k < m_vSelectedEnvelopePoints.size(); k++) - { - int SelectedIndex = m_vSelectedEnvelopePoints[k].first; - pEnvelope->m_vPoints[SelectedIndex].m_Time = std::round(s_vInitialPositionsX[k]); - } - for(size_t k = 0; k < m_vSelectedEnvelopePoints.size(); k++) - { - auto [SelectedIndex, SelectedChannel] = m_vSelectedEnvelopePoints[k]; - pEnvelope->m_vPoints[SelectedIndex].m_aValues[SelectedChannel] = std::round(s_vInitialPositionsY[k]); - } - RemoveTimeOffsetEnvelope(pEnvelope); - s_Operation = EEnvelopeEditorOp::OP_NONE; - } - } - - // handle box selection - if(s_Operation == EEnvelopeEditorOp::OP_BOX_SELECT) - { - IGraphics::CLineItem aLines[4] = { - {s_MouseXStart, s_MouseYStart, Ui()->MouseX(), s_MouseYStart}, - {s_MouseXStart, s_MouseYStart, s_MouseXStart, Ui()->MouseY()}, - {s_MouseXStart, Ui()->MouseY(), Ui()->MouseX(), Ui()->MouseY()}, - {Ui()->MouseX(), s_MouseYStart, Ui()->MouseX(), Ui()->MouseY()}}; - Ui()->ClipEnable(&View); - Graphics()->LinesBegin(); - Graphics()->LinesDraw(aLines, std::size(aLines)); - Graphics()->LinesEnd(); - Ui()->ClipDisable(); - - if(!Ui()->MouseButton(0)) - { - s_Operation = EEnvelopeEditorOp::OP_NONE; - Ui()->SetActiveItem(nullptr); - - float TimeStart = ScreenToEnvelopeX(View, s_MouseXStart); - float TimeEnd = ScreenToEnvelopeX(View, Ui()->MouseX()); - float ValueStart = ScreenToEnvelopeY(View, s_MouseYStart); - float ValueEnd = ScreenToEnvelopeY(View, Ui()->MouseY()); - - float TimeMin = minimum(TimeStart, TimeEnd); - float TimeMax = maximum(TimeStart, TimeEnd); - float ValueMin = minimum(ValueStart, ValueEnd); - float ValueMax = maximum(ValueStart, ValueEnd); - - if(!Input()->ShiftIsPressed()) - DeselectEnvPoints(); - - for(int i = 0; i < (int)pEnvelope->m_vPoints.size(); i++) - { - for(int c = 0; c < CEnvPoint::MAX_CHANNELS; c++) - { - if(!(s_ActiveChannels & (1 << c))) - continue; - - float Time = fxt2f(pEnvelope->m_vPoints[i].m_Time); - float Value = fx2f(pEnvelope->m_vPoints[i].m_aValues[c]); - - if(in_range(Time, TimeMin, TimeMax) && in_range(Value, ValueMin, ValueMax)) - ToggleEnvPoint(i, c); - } - } - } - } - } -} - -void CEditor::RenderEditorHistory(CUIRect View) -{ - enum EHistoryType - { - EDITOR_HISTORY, - ENVELOPE_HISTORY, - SERVER_SETTINGS_HISTORY - }; - - static EHistoryType s_HistoryType = EDITOR_HISTORY; - static int s_ActionSelectedIndex = 0; - static CListBox s_ListBox; - s_ListBox.SetActive(m_Dialog == DIALOG_NONE && !Ui()->IsPopupOpen()); - - const bool GotSelection = s_ListBox.Active() && s_ActionSelectedIndex >= 0 && (size_t)s_ActionSelectedIndex < m_Map.m_vSettings.size(); - - CUIRect ToolBar, Button, Label, List, DragBar; - View.HSplitTop(22.0f, &DragBar, nullptr); - DragBar.y -= 2.0f; - DragBar.w += 2.0f; - DragBar.h += 4.0f; - DoEditorDragBar(View, &DragBar, EDragSide::SIDE_TOP, &m_aExtraEditorSplits[EXTRAEDITOR_HISTORY]); - View.HSplitTop(20.0f, &ToolBar, &View); - View.HSplitTop(2.0f, nullptr, &List); - ToolBar.HMargin(2.0f, &ToolBar); - - CUIRect TypeButtons, HistoryTypeButton; - const int HistoryTypeBtnSize = 70.0f; - ToolBar.VSplitLeft(3 * HistoryTypeBtnSize, &TypeButtons, &Label); - - // history type buttons - { - TypeButtons.VSplitLeft(HistoryTypeBtnSize, &HistoryTypeButton, &TypeButtons); - static int s_EditorHistoryButton = 0; - if(DoButton_Ex(&s_EditorHistoryButton, "Editor", s_HistoryType == EDITOR_HISTORY, &HistoryTypeButton, 0, "Show map editor history.", IGraphics::CORNER_L)) - { - s_HistoryType = EDITOR_HISTORY; - } - - TypeButtons.VSplitLeft(HistoryTypeBtnSize, &HistoryTypeButton, &TypeButtons); - static int s_EnvelopeEditorHistoryButton = 0; - if(DoButton_Ex(&s_EnvelopeEditorHistoryButton, "Envelope", s_HistoryType == ENVELOPE_HISTORY, &HistoryTypeButton, 0, "Show envelope editor history.", IGraphics::CORNER_NONE)) - { - s_HistoryType = ENVELOPE_HISTORY; - } - - TypeButtons.VSplitLeft(HistoryTypeBtnSize, &HistoryTypeButton, &TypeButtons); - static int s_ServerSettingsHistoryButton = 0; - if(DoButton_Ex(&s_ServerSettingsHistoryButton, "Settings", s_HistoryType == SERVER_SETTINGS_HISTORY, &HistoryTypeButton, 0, "Show server settings editor history.", IGraphics::CORNER_R)) - { - s_HistoryType = SERVER_SETTINGS_HISTORY; - } - } - - SLabelProperties InfoProps; - InfoProps.m_MaxWidth = ToolBar.w - 60.f; - InfoProps.m_EllipsisAtEnd = true; - Label.VSplitLeft(8.0f, nullptr, &Label); - Ui()->DoLabel(&Label, "Editor history. Click on an action to undo all actions above.", 10.0f, TEXTALIGN_ML, InfoProps); - - CEditorHistory *pCurrentHistory; - if(s_HistoryType == EDITOR_HISTORY) - pCurrentHistory = &m_EditorHistory; - else if(s_HistoryType == ENVELOPE_HISTORY) - pCurrentHistory = &m_EnvelopeEditorHistory; - else if(s_HistoryType == SERVER_SETTINGS_HISTORY) - pCurrentHistory = &m_ServerSettingsHistory; - else - return; - - // delete button - ToolBar.VSplitRight(25.0f, &ToolBar, &Button); - ToolBar.VSplitRight(5.0f, &ToolBar, nullptr); - static int s_DeleteButton = 0; - if(DoButton_FontIcon(&s_DeleteButton, FONT_ICON_TRASH, (!pCurrentHistory->m_vpUndoActions.empty() || !pCurrentHistory->m_vpRedoActions.empty()) ? 0 : -1, &Button, 0, "Clear the history.", IGraphics::CORNER_ALL, 9.0f) == 1 || (GotSelection && CLineInput::GetActiveInput() == nullptr && m_Dialog == DIALOG_NONE && Ui()->ConsumeHotkey(CUi::HOTKEY_DELETE))) - { - pCurrentHistory->Clear(); - s_ActionSelectedIndex = 0; - } - - // actions list - int RedoSize = (int)pCurrentHistory->m_vpRedoActions.size(); - int UndoSize = (int)pCurrentHistory->m_vpUndoActions.size(); - s_ActionSelectedIndex = RedoSize; - s_ListBox.DoStart(15.0f, RedoSize + UndoSize, 1, 3, s_ActionSelectedIndex, &List); - - for(int i = 0; i < RedoSize; i++) - { - const CListboxItem Item = s_ListBox.DoNextItem(&pCurrentHistory->m_vpRedoActions[i], s_ActionSelectedIndex >= 0 && s_ActionSelectedIndex == i); - if(!Item.m_Visible) - continue; - - Item.m_Rect.VMargin(5.0f, &Label); - - SLabelProperties Props; - Props.m_MaxWidth = Label.w; - Props.m_EllipsisAtEnd = true; - TextRender()->TextColor({.5f, .5f, .5f}); - TextRender()->TextOutlineColor(TextRender()->DefaultTextOutlineColor()); - Ui()->DoLabel(&Label, pCurrentHistory->m_vpRedoActions[i]->DisplayText(), 10.0f, TEXTALIGN_ML, Props); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - } - - for(int i = 0; i < UndoSize; i++) - { - const CListboxItem Item = s_ListBox.DoNextItem(&pCurrentHistory->m_vpUndoActions[UndoSize - i - 1], s_ActionSelectedIndex >= RedoSize && s_ActionSelectedIndex == (i + RedoSize)); - if(!Item.m_Visible) - continue; - - Item.m_Rect.VMargin(5.0f, &Label); - - SLabelProperties Props; - Props.m_MaxWidth = Label.w; - Props.m_EllipsisAtEnd = true; - Ui()->DoLabel(&Label, pCurrentHistory->m_vpUndoActions[UndoSize - i - 1]->DisplayText(), 10.0f, TEXTALIGN_ML, Props); - } - - { // Base action "Loaded map" that cannot be undone - static int s_BaseAction; - const CListboxItem Item = s_ListBox.DoNextItem(&s_BaseAction, s_ActionSelectedIndex == RedoSize + UndoSize); - if(Item.m_Visible) - { - Item.m_Rect.VMargin(5.0f, &Label); - - Ui()->DoLabel(&Label, "Loaded map", 10.0f, TEXTALIGN_ML); - } - } - - const int NewSelected = s_ListBox.DoEnd(); - if(s_ActionSelectedIndex != NewSelected) - { - // Figure out if we should undo or redo some actions - // Undo everything until the selected index - if(NewSelected > s_ActionSelectedIndex) - { - for(int i = 0; i < (NewSelected - s_ActionSelectedIndex); i++) - { - pCurrentHistory->Undo(); - } - } - else - { - for(int i = 0; i < (s_ActionSelectedIndex - NewSelected); i++) - { - pCurrentHistory->Redo(); - } - } - s_ActionSelectedIndex = NewSelected; - } -} - -void CEditor::DoEditorDragBar(CUIRect View, CUIRect *pDragBar, EDragSide Side, float *pValue, float MinValue, float MaxValue) -{ - enum EDragOperation - { - OP_NONE, - OP_DRAGGING, - OP_CLICKED - }; - static EDragOperation s_Operation = OP_NONE; - static float s_InitialMouseY = 0.0f; - static float s_InitialMouseOffsetY = 0.0f; - static float s_InitialMouseX = 0.0f; - static float s_InitialMouseOffsetX = 0.0f; - - bool IsVertical = Side == EDragSide::SIDE_TOP || Side == EDragSide::SIDE_BOTTOM; - - if(Ui()->MouseInside(pDragBar) && Ui()->HotItem() == pDragBar) - m_CursorType = IsVertical ? CURSOR_RESIZE_V : CURSOR_RESIZE_H; - - bool Clicked; - bool Abrupted; - if(int Result = DoButton_DraggableEx(pDragBar, "", 8, pDragBar, &Clicked, &Abrupted, 0, "Change the size of the editor by dragging.")) - { - if(s_Operation == OP_NONE && Result == 1) - { - s_InitialMouseY = Ui()->MouseY(); - s_InitialMouseOffsetY = Ui()->MouseY() - pDragBar->y; - s_InitialMouseX = Ui()->MouseX(); - s_InitialMouseOffsetX = Ui()->MouseX() - pDragBar->x; - s_Operation = OP_CLICKED; - } - - if(Clicked || Abrupted) - s_Operation = OP_NONE; - - if(s_Operation == OP_CLICKED && absolute(IsVertical ? Ui()->MouseY() - s_InitialMouseY : Ui()->MouseX() - s_InitialMouseX) > 5.0f) - s_Operation = OP_DRAGGING; - - if(s_Operation == OP_DRAGGING) - { - if(Side == EDragSide::SIDE_TOP) - *pValue = clamp(s_InitialMouseOffsetY + View.y + View.h - Ui()->MouseY(), MinValue, MaxValue); - else if(Side == EDragSide::SIDE_RIGHT) - *pValue = clamp(Ui()->MouseX() - s_InitialMouseOffsetX - View.x + pDragBar->w, MinValue, MaxValue); - else if(Side == EDragSide::SIDE_BOTTOM) - *pValue = clamp(Ui()->MouseY() - s_InitialMouseOffsetY - View.y + pDragBar->h, MinValue, MaxValue); - else if(Side == EDragSide::SIDE_LEFT) - *pValue = clamp(s_InitialMouseOffsetX + View.x + View.w - Ui()->MouseX(), MinValue, MaxValue); - - m_CursorType = IsVertical ? CURSOR_RESIZE_V : CURSOR_RESIZE_H; - } - } -} - -void CEditor::RenderMenubar(CUIRect MenuBar) -{ - SPopupMenuProperties PopupProperties; - PopupProperties.m_Corners = IGraphics::CORNER_R | IGraphics::CORNER_B; - - CUIRect FileButton; - static int s_FileButton = 0; - MenuBar.VSplitLeft(60.0f, &FileButton, &MenuBar); - if(DoButton_Ex(&s_FileButton, "File", 0, &FileButton, 0, nullptr, IGraphics::CORNER_T, EditorFontSizes::MENU, TEXTALIGN_ML)) - { - static SPopupMenuId s_PopupMenuFileId; - Ui()->DoPopupMenu(&s_PopupMenuFileId, FileButton.x, FileButton.y + FileButton.h - 1.0f, 120.0f, 174.0f, this, PopupMenuFile, PopupProperties); - } - - MenuBar.VSplitLeft(5.0f, nullptr, &MenuBar); - - CUIRect ToolsButton; - static int s_ToolsButton = 0; - MenuBar.VSplitLeft(60.0f, &ToolsButton, &MenuBar); - if(DoButton_Ex(&s_ToolsButton, "Tools", 0, &ToolsButton, 0, nullptr, IGraphics::CORNER_T, EditorFontSizes::MENU, TEXTALIGN_ML)) - { - static SPopupMenuId s_PopupMenuToolsId; - Ui()->DoPopupMenu(&s_PopupMenuToolsId, ToolsButton.x, ToolsButton.y + ToolsButton.h - 1.0f, 200.0f, 64.0f, this, PopupMenuTools, PopupProperties); - } - - MenuBar.VSplitLeft(5.0f, nullptr, &MenuBar); - - CUIRect SettingsButton; - static int s_SettingsButton = 0; - MenuBar.VSplitLeft(60.0f, &SettingsButton, &MenuBar); - if(DoButton_Ex(&s_SettingsButton, "Settings", 0, &SettingsButton, 0, nullptr, IGraphics::CORNER_T, EditorFontSizes::MENU, TEXTALIGN_ML)) - { - static SPopupMenuId s_PopupMenuEntitiesId; - Ui()->DoPopupMenu(&s_PopupMenuEntitiesId, SettingsButton.x, SettingsButton.y + SettingsButton.h - 1.0f, 210.0f, 120.0f, this, PopupMenuSettings, PopupProperties); - } - - CUIRect ChangedIndicator, Info, Help, Close; - MenuBar.VSplitLeft(5.0f, nullptr, &MenuBar); - MenuBar.VSplitLeft(MenuBar.h, &ChangedIndicator, &MenuBar); - MenuBar.VSplitRight(15.0f, &MenuBar, &Close); - MenuBar.VSplitRight(5.0f, &MenuBar, nullptr); - MenuBar.VSplitRight(15.0f, &MenuBar, &Help); - MenuBar.VSplitRight(5.0f, &MenuBar, nullptr); - MenuBar.VSplitLeft(MenuBar.w * 0.6f, &MenuBar, &Info); - MenuBar.VSplitRight(5.0f, &MenuBar, nullptr); - - if(m_Map.m_Modified) - { - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - Ui()->DoLabel(&ChangedIndicator, FONT_ICON_CIRCLE, 8.0f, TEXTALIGN_MC); - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); - static int s_ChangedIndicator; - DoButton_Editor_Common(&s_ChangedIndicator, "", 0, &ChangedIndicator, 0, "This map has unsaved changes"); // just for the tooltip, result unused - } - - char aBuf[IO_MAX_PATH_LENGTH + 32]; - str_format(aBuf, sizeof(aBuf), "File: %s", m_aFileName); - SLabelProperties Props; - Props.m_MaxWidth = MenuBar.w; - Props.m_EllipsisAtEnd = true; - Ui()->DoLabel(&MenuBar, aBuf, 10.0f, TEXTALIGN_ML, Props); - - char aTimeStr[6]; - str_timestamp_format(aTimeStr, sizeof(aTimeStr), "%H:%M"); - - str_format(aBuf, sizeof(aBuf), "X: %.1f, Y: %.1f, Z: %.1f, A: %.1f, G: %i %s", Ui()->MouseWorldX() / 32.0f, Ui()->MouseWorldY() / 32.0f, MapView()->Zoom()->GetValue(), m_AnimateSpeed, MapView()->MapGrid()->Factor(), aTimeStr); - Ui()->DoLabel(&Info, aBuf, 10.0f, TEXTALIGN_MR); - - static int s_HelpButton = 0; - if(DoButton_Editor(&s_HelpButton, "?", 0, &Help, 0, "[F1] Open the DDNet Wiki page for the Map Editor in a web browser") || (Input()->KeyPress(KEY_F1) && m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr)) - { - const char *pLink = Localize("https://wiki.ddnet.org/wiki/Mapping"); - if(!Client()->ViewLink(pLink)) - { - ShowFileDialogError("Failed to open the link '%s' in the default web browser.", pLink); - } - } - - static int s_CloseButton = 0; - if(DoButton_Editor(&s_CloseButton, "×", 0, &Close, 0, "Exits from the editor")) - { - OnClose(); - g_Config.m_ClEditor = 0; - } -} - -void CEditor::Render() -{ - // basic start - Graphics()->Clear(0.0f, 0.0f, 0.0f); - CUIRect View = *Ui()->Screen(); - Ui()->MapScreen(); - m_CursorType = CURSOR_NORMAL; - - float Width = View.w; - float Height = View.h; - - // reset tip - str_copy(m_aTooltip, ""); - - // render checker - RenderBackground(View, m_CheckerTexture, 32.0f, 1.0f); - - CUIRect MenuBar, ModeBar, ToolBar, StatusBar, ExtraEditor, ToolBox; - m_ShowPicker = Input()->KeyIsPressed(KEY_SPACE) && m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && m_vSelectedLayers.size() == 1; - - if(m_GuiActive) - { - View.HSplitTop(16.0f, &MenuBar, &View); - View.HSplitTop(53.0f, &ToolBar, &View); - View.VSplitLeft(m_ToolBoxWidth, &ToolBox, &View); - - View.HSplitBottom(16.0f, &View, &StatusBar); - if(!m_ShowPicker && m_ActiveExtraEditor != EXTRAEDITOR_NONE) - View.HSplitBottom(m_aExtraEditorSplits[(int)m_ActiveExtraEditor], &View, &ExtraEditor); - } - else - { - // hack to get keyboard inputs from toolbar even when GUI is not active - ToolBar.x = -100; - ToolBar.y = -100; - ToolBar.w = 50; - ToolBar.h = 50; - } - - // a little hack for now - if(m_Mode == MODE_LAYERS) - DoMapEditor(View); - - if(m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr) - { - // handle undo/redo hotkeys - if(Input()->KeyPress(KEY_Z) && Input()->ModifierIsPressed() && !Input()->ShiftIsPressed()) - UndoLastAction(); - if((Input()->KeyPress(KEY_Y) && Input()->ModifierIsPressed()) || (Input()->KeyPress(KEY_Z) && Input()->ModifierIsPressed() && Input()->ShiftIsPressed())) - RedoLastAction(); - - // handle brush save/load hotkeys - for(int i = KEY_1; i <= KEY_0; i++) - { - if(Input()->KeyPress(i)) - { - int Slot = i - KEY_1; - if(Input()->ModifierIsPressed() && !m_pBrush->IsEmpty()) - { - dbg_msg("editor", "saving current brush to %d", Slot); - m_apSavedBrushes[Slot] = std::make_shared(*m_pBrush); - } - else if(m_apSavedBrushes[Slot]) - { - dbg_msg("editor", "loading brush from slot %d", Slot); - m_pBrush = std::make_shared(*m_apSavedBrushes[Slot]); - } - } - } - } - - const float BackgroundBrightness = 0.26f; - const float BackgroundScale = 80.0f; - - if(m_GuiActive) - { - RenderBackground(MenuBar, IGraphics::CTextureHandle(), BackgroundScale, 0.0f); - MenuBar.Margin(2.0f, &MenuBar); - - RenderBackground(ToolBox, g_pData->m_aImages[IMAGE_BACKGROUND_NOISE].m_Id, BackgroundScale, BackgroundBrightness); - ToolBox.Margin(2.0f, &ToolBox); - - RenderBackground(ToolBar, g_pData->m_aImages[IMAGE_BACKGROUND_NOISE].m_Id, BackgroundScale, BackgroundBrightness); - ToolBar.Margin(2.0f, &ToolBar); - ToolBar.VSplitLeft(m_ToolBoxWidth, &ModeBar, &ToolBar); - - RenderBackground(StatusBar, g_pData->m_aImages[IMAGE_BACKGROUND_NOISE].m_Id, BackgroundScale, BackgroundBrightness); - StatusBar.Margin(2.0f, &StatusBar); - } - - // do the toolbar - if(m_Mode == MODE_LAYERS) - DoToolbarLayers(ToolBar); - else if(m_Mode == MODE_IMAGES) - DoToolbarImages(ToolBar); - else if(m_Mode == MODE_SOUNDS) - DoToolbarSounds(ToolBar); - - if(m_Dialog == DIALOG_NONE) - { - const bool ModPressed = Input()->ModifierIsPressed(); - const bool ShiftPressed = Input()->ShiftIsPressed(); - const bool AltPressed = Input()->AltIsPressed(); - - if(CLineInput::GetActiveInput() == nullptr) - { - // ctrl+a to append map - if(Input()->KeyPress(KEY_A) && ModPressed) - { - InvokeFileDialog(IStorage::TYPE_ALL, FILETYPE_MAP, "Append map", "Append", "maps", false, CallbackAppendMap, this); - } - } - - // ctrl+n to create new map - if(Input()->KeyPress(KEY_N) && ModPressed) - { - if(HasUnsavedData()) - { - if(!m_PopupEventWasActivated) - { - m_PopupEventType = POPEVENT_NEW; - m_PopupEventActivated = true; - } - } - else - { - Reset(); - m_aFileName[0] = 0; - } - } - // ctrl+o or ctrl+l to open - if((Input()->KeyPress(KEY_O) || Input()->KeyPress(KEY_L)) && ModPressed) - { - if(ShiftPressed) - { - if(HasUnsavedData()) - { - if(!m_PopupEventWasActivated) - { - m_PopupEventType = POPEVENT_LOADCURRENT; - m_PopupEventActivated = true; - } - } - else - { - LoadCurrentMap(); - } - } - else - { - if(HasUnsavedData()) - { - if(!m_PopupEventWasActivated) - { - m_PopupEventType = POPEVENT_LOAD; - m_PopupEventActivated = true; - } - } - else - { - InvokeFileDialog(IStorage::TYPE_ALL, FILETYPE_MAP, "Load map", "Load", "maps", false, CallbackOpenMap, this); - } - } - } - - // ctrl+shift+alt+s to save copy - if(Input()->KeyPress(KEY_S) && ModPressed && ShiftPressed && AltPressed) - InvokeFileDialog(IStorage::TYPE_SAVE, FILETYPE_MAP, "Save map", "Save", "maps", true, CallbackSaveCopyMap, this); - // ctrl+shift+s to save as - else if(Input()->KeyPress(KEY_S) && ModPressed && ShiftPressed) - m_QuickActionSaveAs.Call(); - // ctrl+s to save - else if(Input()->KeyPress(KEY_S) && ModPressed) - { - if(m_aFileName[0] && m_ValidSaveFilename) - { - if(!m_PopupEventWasActivated) - { - str_copy(m_aFileSaveName, m_aFileName); - CallbackSaveMap(m_aFileSaveName, IStorage::TYPE_SAVE, this); - } - } - else - InvokeFileDialog(IStorage::TYPE_SAVE, FILETYPE_MAP, "Save map", "Save", "maps", false, CallbackSaveMap, this); - } - } - - if(m_GuiActive) - { - CUIRect DragBar; - ToolBox.VSplitRight(1.0f, &ToolBox, &DragBar); - DragBar.x -= 2.0f; - DragBar.w += 4.0f; - DoEditorDragBar(ToolBox, &DragBar, EDragSide::SIDE_RIGHT, &m_ToolBoxWidth); - - if(m_Mode == MODE_LAYERS) - RenderLayers(ToolBox); - else if(m_Mode == MODE_IMAGES) - { - RenderImagesList(ToolBox); - RenderSelectedImage(View); - } - else if(m_Mode == MODE_SOUNDS) - RenderSounds(ToolBox); - } - - Ui()->MapScreen(); - - CUIRect TooltipRect; - if(m_GuiActive) - { - RenderMenubar(MenuBar); - RenderModebar(ModeBar); - if(!m_ShowPicker) - { - if(m_ActiveExtraEditor != EXTRAEDITOR_NONE) - { - RenderBackground(ExtraEditor, g_pData->m_aImages[IMAGE_BACKGROUND_NOISE].m_Id, BackgroundScale, BackgroundBrightness); - ExtraEditor.HMargin(2.0f, &ExtraEditor); - ExtraEditor.VSplitRight(2.0f, &ExtraEditor, nullptr); - } - - static bool s_ShowServerSettingsEditorLast = false; - if(m_ActiveExtraEditor == EXTRAEDITOR_ENVELOPES) - { - RenderEnvelopeEditor(ExtraEditor); - } - else if(m_ActiveExtraEditor == EXTRAEDITOR_SERVER_SETTINGS) - { - RenderServerSettingsEditor(ExtraEditor, s_ShowServerSettingsEditorLast); - } - else if(m_ActiveExtraEditor == EXTRAEDITOR_HISTORY) - { - RenderEditorHistory(ExtraEditor); - } - s_ShowServerSettingsEditorLast = m_ActiveExtraEditor == EXTRAEDITOR_SERVER_SETTINGS; - } - RenderStatusbar(StatusBar, &TooltipRect); - } - - RenderPressedKeys(View); - RenderSavingIndicator(View); - - if(m_Dialog == DIALOG_FILE) - { - static int s_NullUiTarget = 0; - Ui()->SetHotItem(&s_NullUiTarget); - RenderFileDialog(); - } - else if(m_Dialog == DIALOG_MAPSETTINGS_ERROR) - { - static int s_NullUiTarget = 0; - Ui()->SetHotItem(&s_NullUiTarget); - RenderMapSettingsErrorDialog(); - } - - if(m_PopupEventActivated) - { - static SPopupMenuId s_PopupEventId; - constexpr float PopupWidth = 400.0f; - constexpr float PopupHeight = 150.0f; - Ui()->DoPopupMenu(&s_PopupEventId, Width / 2.0f - PopupWidth / 2.0f, Height / 2.0f - PopupHeight / 2.0f, PopupWidth, PopupHeight, this, PopupEvent); - m_PopupEventActivated = false; - m_PopupEventWasActivated = true; - } - - if(m_Dialog == DIALOG_NONE && !Ui()->IsPopupHovered() && Ui()->MouseInside(&View)) - { - // handle zoom hotkeys - if(Input()->KeyPress(KEY_KP_MINUS)) - MapView()->Zoom()->ChangeValue(50.0f); - if(Input()->KeyPress(KEY_KP_PLUS)) - MapView()->Zoom()->ChangeValue(-50.0f); - if(Input()->KeyPress(KEY_KP_MULTIPLY)) - MapView()->ResetZoom(); - - if(m_pBrush->IsEmpty() || !Input()->ShiftIsPressed()) - { - if(Input()->KeyPress(KEY_MOUSE_WHEEL_DOWN)) - MapView()->Zoom()->ChangeValue(20.0f); - if(Input()->KeyPress(KEY_MOUSE_WHEEL_UP)) - MapView()->Zoom()->ChangeValue(-20.0f); - } - if(!m_pBrush->IsEmpty()) - { - const bool HasTeleTiles = std::any_of(m_pBrush->m_vpLayers.begin(), m_pBrush->m_vpLayers.end(), [](auto pLayer) { - return pLayer->m_Type == LAYERTYPE_TILES && std::static_pointer_cast(pLayer)->m_Tele; - }); - if(HasTeleTiles) - str_copy(m_aTooltip, "Use shift+mousewheel up/down to adjust the tele numbers. Use ctrl+f to change all tele numbers to the first unused number."); - - if(Input()->ShiftIsPressed()) - { - if(Input()->KeyPress(KEY_MOUSE_WHEEL_DOWN)) - AdjustBrushSpecialTiles(false, -1); - if(Input()->KeyPress(KEY_MOUSE_WHEEL_UP)) - AdjustBrushSpecialTiles(false, 1); - } - - // Use ctrl+f to replace number in brush with next free - if(Input()->ModifierIsPressed() && Input()->KeyPress(KEY_F)) - AdjustBrushSpecialTiles(true); - } - } - - for(CEditorComponent &Component : m_vComponents) - Component.OnRender(View); - - MapView()->UpdateZoom(); - - // Cancel color pipette with escape before closing popup menus with escape - if(m_ColorPipetteActive && Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) - { - m_ColorPipetteActive = false; - } - - Ui()->RenderPopupMenus(); - FreeDynamicPopupMenus(); - - UpdateColorPipette(); - - if(m_Dialog == DIALOG_NONE && !m_PopupEventActivated && Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) - { - OnClose(); - g_Config.m_ClEditor = 0; - } - - // The tooltip can be set in popup menus so we have to render the tooltip after the popup menus. - if(m_GuiActive) - RenderTooltip(TooltipRect); - - RenderMousePointer(); -} - -void CEditor::RenderPressedKeys(CUIRect View) -{ - if(!g_Config.m_EdShowkeys) - return; - - Ui()->MapScreen(); - CTextCursor Cursor; - TextRender()->SetCursor(&Cursor, View.x + 10, View.y + View.h - 24 - 10, 24.0f, TEXTFLAG_RENDER); - - int NKeys = 0; - for(int i = 0; i < KEY_LAST; i++) - { - if(Input()->KeyIsPressed(i)) - { - if(NKeys) - TextRender()->TextEx(&Cursor, " + ", -1); - TextRender()->TextEx(&Cursor, Input()->KeyName(i), -1); - NKeys++; - } - } -} - -void CEditor::RenderSavingIndicator(CUIRect View) -{ - if(m_WriterFinishJobs.empty()) - return; - - const char *pText = "Saving…"; - const float FontSize = 24.0f; - - Ui()->MapScreen(); - CUIRect Label, Spinner; - View.Margin(20.0f, &View); - View.HSplitBottom(FontSize, nullptr, &View); - View.VSplitRight(TextRender()->TextWidth(FontSize, pText) + 2.0f, &Spinner, &Label); - Spinner.VSplitRight(Spinner.h, nullptr, &Spinner); - Ui()->DoLabel(&Label, pText, FontSize, TEXTALIGN_MR); - Ui()->RenderProgressSpinner(Spinner.Center(), 8.0f); -} - -void CEditor::FreeDynamicPopupMenus() -{ - auto Iterator = m_PopupMessageContexts.begin(); - while(Iterator != m_PopupMessageContexts.end()) - { - if(!Ui()->IsPopupOpen(Iterator->second)) - { - CUi::SMessagePopupContext *pContext = Iterator->second; - Iterator = m_PopupMessageContexts.erase(Iterator); - delete pContext; - } - else - ++Iterator; - } -} - -void CEditor::UpdateColorPipette() -{ - if(!m_ColorPipetteActive) - return; - - static char s_PipetteScreenButton; - if(Ui()->HotItem() == &s_PipetteScreenButton) - { - // Read color one pixel to the top and left as we would otherwise not read the correct - // color due to the cursor sprite being rendered over the current mouse position. - const int PixelX = clamp(round_to_int((Ui()->MouseX() - 1.0f) / Ui()->Screen()->w * Graphics()->ScreenWidth()), 0, Graphics()->ScreenWidth() - 1); - const int PixelY = clamp(round_to_int((Ui()->MouseY() - 1.0f) / Ui()->Screen()->h * Graphics()->ScreenHeight()), 0, Graphics()->ScreenHeight() - 1); - Graphics()->ReadPixel(ivec2(PixelX, PixelY), &m_PipetteColor); - } - - // Simulate button overlaying the entire screen to intercept all clicks for color pipette. - const int ButtonResult = DoButton_Editor_Common(&s_PipetteScreenButton, "", 0, Ui()->Screen(), 0, "Left click to pick a color from the screen. Right click to cancel pipette mode."); - // Don't handle clicks if we are panning, so the pipette stays active while panning. - // Checking m_pContainerPanned alone is not enough, as this variable is reset when - // panning ends before this function is called. - if(m_pContainerPanned == nullptr && m_pContainerPannedLast == nullptr) - { - if(ButtonResult == 1) - { - char aClipboard[9]; - str_format(aClipboard, sizeof(aClipboard), "%08X", m_PipetteColor.PackAlphaLast()); - Input()->SetClipboardText(aClipboard); - - // Check if any of the saved colors is equal to the picked color and - // bring it to the front of the list instead of adding a duplicate. - int ShiftEnd = (int)std::size(m_aSavedColors) - 1; - for(int i = 0; i < (int)std::size(m_aSavedColors); ++i) - { - if(m_aSavedColors[i].Pack() == m_PipetteColor.Pack()) - { - ShiftEnd = i; - break; - } - } - for(int i = ShiftEnd; i > 0; --i) - { - m_aSavedColors[i] = m_aSavedColors[i - 1]; - } - m_aSavedColors[0] = m_PipetteColor; - } - if(ButtonResult > 0) - { - m_ColorPipetteActive = false; - } - } -} - -void CEditor::RenderMousePointer() -{ - if(!m_ShowMousePointer) - return; - - constexpr float CursorSize = 16.0f; - - // Cursor - Graphics()->WrapClamp(); - Graphics()->TextureSet(m_aCursorTextures[m_CursorType]); - Graphics()->QuadsBegin(); - if(m_CursorType == CURSOR_RESIZE_V) - { - Graphics()->QuadsSetRotation(pi / 2.0f); - } - if(ms_pUiGotContext == Ui()->HotItem()) - { - Graphics()->SetColor(1.0f, 0.0f, 0.0f, 1.0f); - } - const float CursorOffset = m_CursorType == CURSOR_RESIZE_V || m_CursorType == CURSOR_RESIZE_H ? -CursorSize / 2.0f : 0.0f; - IGraphics::CQuadItem QuadItem(Ui()->MouseX() + CursorOffset, Ui()->MouseY() + CursorOffset, CursorSize, CursorSize); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); - Graphics()->WrapNormal(); - - // Pipette color - if(m_ColorPipetteActive) - { - CUIRect PipetteRect = {Ui()->MouseX() + CursorSize, Ui()->MouseY() + CursorSize, 80.0f, 20.0f}; - if(PipetteRect.x + PipetteRect.w + 2.0f > Ui()->Screen()->w) - { - PipetteRect.x = Ui()->MouseX() - PipetteRect.w - CursorSize / 2.0f; - } - if(PipetteRect.y + PipetteRect.h + 2.0f > Ui()->Screen()->h) - { - PipetteRect.y = Ui()->MouseY() - PipetteRect.h - CursorSize / 2.0f; - } - PipetteRect.Draw(ColorRGBA(0.2f, 0.2f, 0.2f, 0.7f), IGraphics::CORNER_ALL, 3.0f); - - CUIRect Pipette, Label; - PipetteRect.VSplitLeft(PipetteRect.h, &Pipette, &Label); - Pipette.Margin(2.0f, &Pipette); - Pipette.Draw(m_PipetteColor, IGraphics::CORNER_ALL, 3.0f); - - char aLabel[8]; - str_format(aLabel, sizeof(aLabel), "#%06X", m_PipetteColor.PackAlphaLast(false)); - Ui()->DoLabel(&Label, aLabel, 10.0f, TEXTALIGN_MC); - } -} - -void CEditor::Reset(bool CreateDefault) -{ - Ui()->ClosePopupMenus(); - m_Map.Clean(); - - for(CEditorComponent &Component : m_vComponents) - Component.OnReset(); - - // create default layers - if(CreateDefault) - { - m_EditorWasUsedBefore = true; - m_Map.CreateDefault(GetEntitiesTexture()); - } - - SelectGameLayer(); - DeselectQuads(); - DeselectQuadPoints(); - m_SelectedEnvelope = 0; - m_SelectedImage = 0; - m_SelectedSound = 0; - m_SelectedSource = -1; - - m_pContainerPanned = nullptr; - m_pContainerPannedLast = nullptr; - - m_Map.m_Modified = false; - m_Map.m_ModifiedAuto = false; - m_Map.m_LastModifiedTime = -1.0f; - m_Map.m_LastSaveTime = Client()->GlobalTime(); - m_Map.m_LastAutosaveUpdateTime = -1.0f; - - m_ShowEnvelopePreview = SHOWENV_NONE; - m_ShiftBy = 1; - - m_ResetZoomEnvelope = true; - m_SettingsCommandInput.Clear(); - - m_EditorHistory.Clear(); - m_EnvelopeEditorHistory.Clear(); - m_ServerSettingsHistory.Clear(); - - m_QuadTracker.m_pEditor = this; - - m_EnvOpTracker.m_pEditor = this; - m_EnvOpTracker.Reset(); - - m_MapSettingsCommandContext.Reset(); -} - -int CEditor::GetTextureUsageFlag() const -{ - return Graphics()->Uses2DTextureArrays() ? IGraphics::TEXLOAD_TO_2D_ARRAY_TEXTURE : IGraphics::TEXLOAD_TO_3D_TEXTURE; -} - -IGraphics::CTextureHandle CEditor::GetFrontTexture() -{ - if(!m_FrontTexture.IsValid()) - m_FrontTexture = Graphics()->LoadTexture("editor/front.png", IStorage::TYPE_ALL, GetTextureUsageFlag()); - return m_FrontTexture; -} - -IGraphics::CTextureHandle CEditor::GetTeleTexture() -{ - if(!m_TeleTexture.IsValid()) - m_TeleTexture = Graphics()->LoadTexture("editor/tele.png", IStorage::TYPE_ALL, GetTextureUsageFlag()); - return m_TeleTexture; -} - -IGraphics::CTextureHandle CEditor::GetSpeedupTexture() -{ - if(!m_SpeedupTexture.IsValid()) - m_SpeedupTexture = Graphics()->LoadTexture("editor/speedup.png", IStorage::TYPE_ALL, GetTextureUsageFlag()); - return m_SpeedupTexture; -} - -IGraphics::CTextureHandle CEditor::GetSwitchTexture() -{ - if(!m_SwitchTexture.IsValid()) - m_SwitchTexture = Graphics()->LoadTexture("editor/switch.png", IStorage::TYPE_ALL, GetTextureUsageFlag()); - return m_SwitchTexture; -} - -IGraphics::CTextureHandle CEditor::GetTuneTexture() -{ - if(!m_TuneTexture.IsValid()) - m_TuneTexture = Graphics()->LoadTexture("editor/tune.png", IStorage::TYPE_ALL, GetTextureUsageFlag()); - return m_TuneTexture; -} - -IGraphics::CTextureHandle CEditor::GetEntitiesTexture() -{ - if(!m_EntitiesTexture.IsValid()) - m_EntitiesTexture = Graphics()->LoadTexture("editor/entities/DDNet.png", IStorage::TYPE_ALL, GetTextureUsageFlag()); - return m_EntitiesTexture; -} - -void CEditor::Init() -{ - m_pInput = Kernel()->RequestInterface(); - m_pClient = Kernel()->RequestInterface(); - m_pConfigManager = Kernel()->RequestInterface(); - m_pConfig = m_pConfigManager->Values(); - m_pConsole = Kernel()->RequestInterface(); - m_pEngine = Kernel()->RequestInterface(); - m_pGraphics = Kernel()->RequestInterface(); - m_pTextRender = Kernel()->RequestInterface(); - m_pStorage = Kernel()->RequestInterface(); - m_pSound = Kernel()->RequestInterface(); - m_UI.Init(Kernel()); - m_UI.SetPopupMenuClosedCallback([this]() { - m_PopupEventWasActivated = false; - }); - m_RenderTools.Init(m_pGraphics, m_pTextRender); - m_ZoomEnvelopeX.OnInit(this); - m_ZoomEnvelopeY.OnInit(this); - m_Map.m_pEditor = this; - - m_vComponents.emplace_back(m_MapView); - m_vComponents.emplace_back(m_MapSettingsBackend); - m_vComponents.emplace_back(m_LayerSelector); - m_vComponents.emplace_back(m_Prompt); - for(CEditorComponent &Component : m_vComponents) - Component.OnInit(this); - - m_CheckerTexture = Graphics()->LoadTexture("editor/checker.png", IStorage::TYPE_ALL); - m_aCursorTextures[CURSOR_NORMAL] = Graphics()->LoadTexture("editor/cursor.png", IStorage::TYPE_ALL); - m_aCursorTextures[CURSOR_RESIZE_H] = Graphics()->LoadTexture("editor/cursor_resize.png", IStorage::TYPE_ALL); - m_aCursorTextures[CURSOR_RESIZE_V] = m_aCursorTextures[CURSOR_RESIZE_H]; - - m_pTilesetPicker = std::make_shared(this, 16, 16); - m_pTilesetPicker->MakePalette(); - m_pTilesetPicker->m_Readonly = true; - - m_pQuadsetPicker = std::make_shared(this); - m_pQuadsetPicker->NewQuad(0, 0, 64, 64); - m_pQuadsetPicker->m_Readonly = true; - - m_pBrush = std::make_shared(); - m_pBrush->m_pMap = &m_Map; - - Reset(false); -} - -void CEditor::PlaceBorderTiles() -{ - std::shared_ptr pT = std::static_pointer_cast(GetSelectedLayerType(0, LAYERTYPE_TILES)); - - for(int i = 0; i < pT->m_Width * pT->m_Height; ++i) - { - if(i % pT->m_Width < 2 || i % pT->m_Width > pT->m_Width - 3 || i < pT->m_Width * 2 || i > pT->m_Width * (pT->m_Height - 2)) - { - int x = i % pT->m_Width; - int y = i / pT->m_Width; - - CTile Current = pT->m_pTiles[i]; - Current.m_Index = 1; - pT->SetTile(x, y, Current); - } - } - - int GameGroupIndex = std::find(m_Map.m_vpGroups.begin(), m_Map.m_vpGroups.end(), m_Map.m_pGameGroup) - m_Map.m_vpGroups.begin(); - m_EditorHistory.RecordAction(std::make_shared(this, GameGroupIndex), "Tool 'Make borders'"); - - m_Map.OnModify(); -} - -void CEditor::HandleCursorMovement() -{ - const vec2 UpdatedMousePos = Ui()->UpdatedMousePos(); - const vec2 UpdatedMouseDelta = Ui()->UpdatedMouseDelta(); - - // fix correct world x and y - const std::shared_ptr pGroup = GetSelectedGroup(); - if(pGroup) - { - float aPoints[4]; - pGroup->Mapping(aPoints); - - float WorldWidth = aPoints[2] - aPoints[0]; - float WorldHeight = aPoints[3] - aPoints[1]; - - m_MouseWorldScale = WorldWidth / Graphics()->WindowWidth(); - - m_MouseWorldPos.x = aPoints[0] + WorldWidth * (UpdatedMousePos.x / Graphics()->WindowWidth()); - m_MouseWorldPos.y = aPoints[1] + WorldHeight * (UpdatedMousePos.y / Graphics()->WindowHeight()); - m_MouseDeltaWorld.x = UpdatedMouseDelta.x * (WorldWidth / Graphics()->WindowWidth()); - m_MouseDeltaWorld.y = UpdatedMouseDelta.y * (WorldHeight / Graphics()->WindowHeight()); - } - else - { - m_MouseWorldPos = vec2(-1.0f, -1.0f); - m_MouseDeltaWorld = vec2(0.0f, 0.0f); - } - - m_MouseWorldNoParaPos = vec2(-1.0f, -1.0f); - for(const std::shared_ptr &pGameGroup : m_Map.m_vpGroups) - { - if(!pGameGroup->m_GameGroup) - continue; - - float aPoints[4]; - pGameGroup->Mapping(aPoints); - - float WorldWidth = aPoints[2] - aPoints[0]; - float WorldHeight = aPoints[3] - aPoints[1]; - - m_MouseWorldNoParaPos.x = aPoints[0] + WorldWidth * (UpdatedMousePos.x / Graphics()->WindowWidth()); - m_MouseWorldNoParaPos.y = aPoints[1] + WorldHeight * (UpdatedMousePos.y / Graphics()->WindowHeight()); - } - - OnMouseMove(UpdatedMousePos); -} - -void CEditor::OnMouseMove(vec2 MousePos) -{ - m_vHoverTiles.clear(); - for(size_t g = 0; g < m_Map.m_vpGroups.size(); g++) - { - const std::shared_ptr pGroup = m_Map.m_vpGroups[g]; - for(size_t l = 0; l < pGroup->m_vpLayers.size(); l++) - { - const std::shared_ptr pLayer = pGroup->m_vpLayers[l]; - int LayerType = pLayer->m_Type; - if(LayerType != LAYERTYPE_TILES && - LayerType != LAYERTYPE_FRONT && - LayerType != LAYERTYPE_TELE && - LayerType != LAYERTYPE_SPEEDUP && - LayerType != LAYERTYPE_SWITCH && - LayerType != LAYERTYPE_TUNE) - continue; - - std::shared_ptr pTiles = std::static_pointer_cast(pLayer); - pGroup->MapScreen(); - float aPoints[4]; - pGroup->Mapping(aPoints); - float WorldWidth = aPoints[2] - aPoints[0]; - float WorldHeight = aPoints[3] - aPoints[1]; - CUIRect Rect; - Rect.x = aPoints[0] + WorldWidth * (MousePos.x / Graphics()->WindowWidth()); - Rect.y = aPoints[1] + WorldHeight * (MousePos.y / Graphics()->WindowHeight()); - Rect.w = 0; - Rect.h = 0; - RECTi r; - pTiles->Convert(Rect, &r); - pTiles->Clamp(&r); - int x = r.x; - int y = r.y; - - if(x < 0 || x >= pTiles->m_Width) - continue; - if(y < 0 || y >= pTiles->m_Height) - continue; - CTile Tile = pTiles->GetTile(x, y); - if(Tile.m_Index) - m_vHoverTiles.emplace_back( - g, l, x, y, Tile); - } - } - Ui()->MapScreen(); -} - -void CEditor::HandleAutosave() -{ - const float Time = Client()->GlobalTime(); - const float LastAutosaveUpdateTime = m_Map.m_LastAutosaveUpdateTime; - m_Map.m_LastAutosaveUpdateTime = Time; - - if(g_Config.m_EdAutosaveInterval == 0) - return; // autosave disabled - if(!m_Map.m_ModifiedAuto || m_Map.m_LastModifiedTime < 0.0f) - return; // no unsaved changes - - // Add time to autosave timer if the editor was disabled for more than 10 seconds, - // to prevent autosave from immediately activating when the editor is activated - // after being deactivated for some time. - if(LastAutosaveUpdateTime >= 0.0f && Time - LastAutosaveUpdateTime > 10.0f) - { - m_Map.m_LastSaveTime += Time - LastAutosaveUpdateTime; - } - - // Check if autosave timer has expired. - if(m_Map.m_LastSaveTime >= Time || Time - m_Map.m_LastSaveTime < 60 * g_Config.m_EdAutosaveInterval) - return; - - // Wait for 5 seconds of no modification before saving, to prevent autosave - // from immediately activating when a map is first modified or while user is - // modifying the map, but don't delay the autosave for more than 1 minute. - if(Time - m_Map.m_LastModifiedTime < 5.0f && Time - m_Map.m_LastSaveTime < 60 * (g_Config.m_EdAutosaveInterval + 1)) - return; - - PerformAutosave(); -} - -bool CEditor::PerformAutosave() -{ - char aDate[20]; - char aAutosavePath[IO_MAX_PATH_LENGTH]; - str_timestamp(aDate, sizeof(aDate)); - char aFileNameNoExt[IO_MAX_PATH_LENGTH]; - if(m_aFileName[0] == '\0') - { - str_copy(aFileNameNoExt, "unnamed"); - } - else - { - const char *pFileName = fs_filename(m_aFileName); - str_truncate(aFileNameNoExt, sizeof(aFileNameNoExt), pFileName, str_length(pFileName) - str_length(".map")); - } - str_format(aAutosavePath, sizeof(aAutosavePath), "maps/auto/%s_%s.map", aFileNameNoExt, aDate); - - m_Map.m_LastSaveTime = Client()->GlobalTime(); - if(Save(aAutosavePath)) - { - m_Map.m_ModifiedAuto = false; - // Clean up autosaves - if(g_Config.m_EdAutosaveMax) - { - CFileCollection AutosavedMaps; - AutosavedMaps.Init(Storage(), "maps/auto", aFileNameNoExt, ".map", g_Config.m_EdAutosaveMax); - } - return true; - } - else - { - ShowFileDialogError("Failed to automatically save map to file '%s'.", aAutosavePath); - return false; - } -} - -void CEditor::HandleWriterFinishJobs() -{ - if(m_WriterFinishJobs.empty()) - return; - - std::shared_ptr pJob = m_WriterFinishJobs.front(); - if(!pJob->Done()) - return; - m_WriterFinishJobs.pop_front(); - - char aBuf[2 * IO_MAX_PATH_LENGTH + 128]; - if(Storage()->FileExists(pJob->GetRealFileName(), IStorage::TYPE_SAVE) && !Storage()->RemoveFile(pJob->GetRealFileName(), IStorage::TYPE_SAVE)) - { - str_format(aBuf, sizeof(aBuf), "Saving failed: Could not remove old map file '%s'.", pJob->GetRealFileName()); - ShowFileDialogError("%s", aBuf); - Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "editor/save", aBuf); - return; - } - - if(!Storage()->RenameFile(pJob->GetTempFileName(), pJob->GetRealFileName(), IStorage::TYPE_SAVE)) - { - str_format(aBuf, sizeof(aBuf), "Saving failed: Could not move temporary map file '%s' to '%s'.", pJob->GetTempFileName(), pJob->GetRealFileName()); - ShowFileDialogError("%s", aBuf); - Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "editor/save", aBuf); - return; - } - - str_format(aBuf, sizeof(aBuf), "saving '%s' done", pJob->GetRealFileName()); - Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "editor/save", aBuf); - - // send rcon.. if we can - if(Client()->RconAuthed() && g_Config.m_EdAutoMapReload) - { - CServerInfo CurrentServerInfo; - Client()->GetServerInfo(&CurrentServerInfo); - - NETADDR pAddr = Client()->ServerAddress(); - char aAddrStr[NETADDR_MAXSTRSIZE]; - net_addr_str(&Client()->ServerAddress(), aAddrStr, sizeof(aAddrStr), true); - - // and if we're on a local address - bool IsLocalAddress = false; - if(pAddr.ip[0] == 127 || pAddr.ip[0] == 10 || (pAddr.ip[0] == 192 && pAddr.ip[1] == 168) || (pAddr.ip[0] == 172 && (pAddr.ip[1] >= 16 && pAddr.ip[1] <= 31))) - IsLocalAddress = true; - - if(str_startswith(aAddrStr, "[fe80:") || str_startswith(aAddrStr, "[::1")) - IsLocalAddress = true; - - if(IsLocalAddress) - { - char aMapName[128]; - IStorage::StripPathAndExtension(pJob->GetRealFileName(), aMapName, sizeof(aMapName)); - if(!str_comp(aMapName, CurrentServerInfo.m_aMap)) - Client()->Rcon("hot_reload"); - } - } -} - -void CEditor::OnUpdate() -{ - CUIElementBase::Init(Ui()); // update static pointer because game and editor use separate UI - - if(!m_EditorWasUsedBefore) - { - m_EditorWasUsedBefore = true; - Reset(); - } - - m_pContainerPannedLast = m_pContainerPanned; - - // handle mouse movement - vec2 CursorRel = vec2(0.0f, 0.0f); - IInput::ECursorType CursorType = Input()->CursorRelative(&CursorRel.x, &CursorRel.y); - if(CursorType != IInput::CURSOR_NONE) - { - Ui()->ConvertMouseMove(&CursorRel.x, &CursorRel.y, CursorType); - Ui()->OnCursorMove(CursorRel.x, CursorRel.y); - } - - // handle key presses - Input()->ConsumeEvents([&](const IInput::CEvent &Event) { - for(CEditorComponent &Component : m_vComponents) - { - // Events with flag `FLAG_RELEASE` must always be forwarded to all components so keys being - // released can be handled in all components also after some components have been disabled. - if(Component.OnInput(Event) && (Event.m_Flags & ~IInput::FLAG_RELEASE) != 0) - return; - } - Ui()->OnInput(Event); - }); - - HandleCursorMovement(); - HandleAutosave(); - HandleWriterFinishJobs(); - - for(CEditorComponent &Component : m_vComponents) - Component.OnUpdate(); -} - -void CEditor::OnRender() -{ - Ui()->ResetMouseSlow(); - - // toggle gui - if(m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && Input()->KeyPress(KEY_TAB)) - m_GuiActive = !m_GuiActive; - - if(Input()->KeyPress(KEY_F10)) - m_ShowMousePointer = false; - - if(m_Animate) - m_AnimateTime = (time_get() - m_AnimateStart) / (float)time_freq(); - else - m_AnimateTime = 0; - - ms_pUiGotContext = nullptr; - Ui()->StartCheck(); - - Ui()->Update(m_MouseWorldPos); - - Render(); - - m_MouseDeltaWorld = vec2(0.0f, 0.0f); - - if(Input()->KeyPress(KEY_F10)) - { - Graphics()->TakeScreenshot(nullptr); - m_ShowMousePointer = true; - } - - if(g_Config.m_Debug) - Ui()->DebugRender(2.0f, Ui()->Screen()->h - 27.0f); - - Ui()->FinishCheck(); - Ui()->ClearHotkeys(); - Input()->Clear(); - - CLineInput::RenderCandidates(); -} - -void CEditor::OnActivate() -{ - ResetMentions(); - ResetIngameMoved(); -} - -void CEditor::OnWindowResize() -{ - Ui()->OnWindowResize(); -} - -void CEditor::OnClose() -{ - m_ColorPipetteActive = false; - - if(m_ToolbarPreviewSound >= 0 && Sound()->IsPlaying(m_ToolbarPreviewSound)) - Sound()->Pause(m_ToolbarPreviewSound); - if(m_FilePreviewSound >= 0 && Sound()->IsPlaying(m_FilePreviewSound)) - Sound()->Pause(m_FilePreviewSound); -} - -void CEditor::OnDialogClose() -{ - Graphics()->UnloadTexture(&m_FilePreviewImage); - Sound()->UnloadSample(m_FilePreviewSound); - m_FilePreviewSound = -1; - m_FilePreviewState = PREVIEW_UNLOADED; -} - -void CEditor::LoadCurrentMap() -{ - if(Load(m_pClient->GetCurrentMapPath(), IStorage::TYPE_SAVE)) - { - m_ValidSaveFilename = true; - } - else - { - Load(m_pClient->GetCurrentMapPath(), IStorage::TYPE_ALL); - m_ValidSaveFilename = false; - } - - CGameClient *pGameClient = (CGameClient *)Kernel()->RequestInterface(); - vec2 Center = pGameClient->m_Camera.m_Center; - - MapView()->SetWorldOffset(Center); -} - -bool CEditor::Save(const char *pFilename) -{ - // Check if file with this name is already being saved at the moment - if(std::any_of(std::begin(m_WriterFinishJobs), std::end(m_WriterFinishJobs), [pFilename](const std::shared_ptr &Job) { return str_comp(pFilename, Job->GetRealFileName()) == 0; })) - return false; - - const auto &&ErrorHandler = [this](const char *pErrorMessage) { - ShowFileDialogError("%s", pErrorMessage); - Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "editor/save", pErrorMessage); - }; - return m_Map.Save(pFilename, ErrorHandler); -} - -bool CEditor::HandleMapDrop(const char *pFileName, int StorageType) -{ - if(HasUnsavedData()) - { - str_copy(m_aFileNamePending, pFileName); - m_PopupEventType = CEditor::POPEVENT_LOADDROP; - m_PopupEventActivated = true; - return true; - } - else - { - return Load(pFileName, IStorage::TYPE_ALL_OR_ABSOLUTE); - } -} - -bool CEditor::Load(const char *pFileName, int StorageType) -{ - const auto &&ErrorHandler = [this](const char *pErrorMessage) { - ShowFileDialogError("%s", pErrorMessage); - Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "editor/load", pErrorMessage); - }; - - Reset(); - bool Result = m_Map.Load(pFileName, StorageType, std::move(ErrorHandler)); - if(Result) - { - str_copy(m_aFileName, pFileName); - SortImages(); - SelectGameLayer(); - - for(CEditorComponent &Component : m_vComponents) - Component.OnMapLoad(); - } - else - { - m_aFileName[0] = 0; - } - return Result; -} - -bool CEditor::Append(const char *pFileName, int StorageType, bool IgnoreHistory) -{ - CEditorMap NewMap; - NewMap.m_pEditor = this; - - const auto &&ErrorHandler = [this](const char *pErrorMessage) { - ShowFileDialogError("%s", pErrorMessage); - Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "editor/append", pErrorMessage); - }; - if(!NewMap.Load(pFileName, StorageType, std::move(ErrorHandler))) - return false; - - CEditorActionAppendMap::SPrevInfo Info{ - (int)m_Map.m_vpGroups.size(), - (int)m_Map.m_vpImages.size(), - (int)m_Map.m_vpSounds.size(), - (int)m_Map.m_vpEnvelopes.size()}; - - // Keep a map to check if specific indices have already been replaced to prevent - // replacing those indices again when transfering images - static std::map s_ReplacedMap; - static const auto &&s_ReplaceIndex = [](int ToReplace, int ReplaceWith) { - return [ToReplace, ReplaceWith](int *pIndex) { - if(*pIndex == ToReplace && !s_ReplacedMap[pIndex]) - { - *pIndex = ReplaceWith; - s_ReplacedMap[pIndex] = true; - } - }; - }; - - const auto &&Rename = [&](const std::shared_ptr &pImage) { - char aRenamed[IO_MAX_PATH_LENGTH]; - int DuplicateCount = 1; - str_copy(aRenamed, pImage->m_aName); - while(std::find_if(m_Map.m_vpImages.begin(), m_Map.m_vpImages.end(), [aRenamed](const std::shared_ptr &OtherImage) { return str_comp(OtherImage->m_aName, aRenamed) == 0; }) != m_Map.m_vpImages.end()) - str_format(aRenamed, sizeof(aRenamed), "%s (%d)", pImage->m_aName, DuplicateCount++); // Rename to "image_name (%d)" - str_copy(pImage->m_aName, aRenamed); - }; - - // Transfer non-duplicate images - s_ReplacedMap.clear(); - for(auto NewMapIt = NewMap.m_vpImages.begin(); NewMapIt != NewMap.m_vpImages.end(); ++NewMapIt) - { - auto pNewImage = *NewMapIt; - auto NameIsTaken = [pNewImage](const std::shared_ptr &OtherImage) { return str_comp(pNewImage->m_aName, OtherImage->m_aName) == 0; }; - auto MatchInCurrentMap = std::find_if(m_Map.m_vpImages.begin(), m_Map.m_vpImages.end(), NameIsTaken); - - const bool IsDuplicate = MatchInCurrentMap != m_Map.m_vpImages.end(); - const int IndexToReplace = NewMapIt - NewMap.m_vpImages.begin(); - - if(IsDuplicate) - { - // Check for image data - const bool ImageDataEquals = (*MatchInCurrentMap)->DataEquals(*pNewImage); - - if(ImageDataEquals) - { - const int IndexToReplaceWith = MatchInCurrentMap - m_Map.m_vpImages.begin(); - - dbg_msg("editor", "map already contains image %s with the same data, removing duplicate", pNewImage->m_aName); - - // In the new map, replace the index of the duplicate image to the index of the same in the current map. - NewMap.ModifyImageIndex(s_ReplaceIndex(IndexToReplace, IndexToReplaceWith)); - } - else - { - // Rename image and add it - Rename(pNewImage); - - dbg_msg("editor", "map already contains image %s but contents of appended image is different. Renaming to %s", (*MatchInCurrentMap)->m_aName, pNewImage->m_aName); - - NewMap.ModifyImageIndex(s_ReplaceIndex(IndexToReplace, m_Map.m_vpImages.size())); - m_Map.m_vpImages.push_back(pNewImage); - } - } - else - { - NewMap.ModifyImageIndex(s_ReplaceIndex(IndexToReplace, m_Map.m_vpImages.size())); - m_Map.m_vpImages.push_back(pNewImage); - } - } - NewMap.m_vpImages.clear(); - - // modify indices - static const auto &&s_ModifyAddIndex = [](int AddAmount) { - return [AddAmount](int *pIndex) { - if(*pIndex >= 0) - *pIndex += AddAmount; - }; - }; - - NewMap.ModifySoundIndex(s_ModifyAddIndex(m_Map.m_vpSounds.size())); - NewMap.ModifyEnvelopeIndex(s_ModifyAddIndex(m_Map.m_vpEnvelopes.size())); - - // transfer sounds - for(const auto &pSound : NewMap.m_vpSounds) - m_Map.m_vpSounds.push_back(pSound); - NewMap.m_vpSounds.clear(); - - // transfer envelopes - for(const auto &pEnvelope : NewMap.m_vpEnvelopes) - m_Map.m_vpEnvelopes.push_back(pEnvelope); - NewMap.m_vpEnvelopes.clear(); - - // transfer groups - for(const auto &pGroup : NewMap.m_vpGroups) - { - if(pGroup != NewMap.m_pGameGroup) - { - pGroup->m_pMap = &m_Map; - m_Map.m_vpGroups.push_back(pGroup); - } - } - NewMap.m_vpGroups.clear(); - - // transfer server settings - for(const auto &pSetting : NewMap.m_vSettings) - { - // Check if setting already exists - bool AlreadyExists = false; - for(const auto &pExistingSetting : m_Map.m_vSettings) - { - if(!str_comp(pExistingSetting.m_aCommand, pSetting.m_aCommand)) - AlreadyExists = true; - } - if(!AlreadyExists) - m_Map.m_vSettings.push_back(pSetting); - } - - NewMap.m_vSettings.clear(); - - auto IndexMap = SortImages(); - - if(!IgnoreHistory) - m_EditorHistory.RecordAction(std::make_shared(this, pFileName, Info, IndexMap)); - - // all done \o/ - return true; -} - -void CEditor::UndoLastAction() -{ - if(m_ActiveExtraEditor == EXTRAEDITOR_SERVER_SETTINGS) - m_ServerSettingsHistory.Undo(); - else if(m_ActiveExtraEditor == EXTRAEDITOR_ENVELOPES) - m_EnvelopeEditorHistory.Undo(); - else - m_EditorHistory.Undo(); -} - -void CEditor::RedoLastAction() -{ - if(m_ActiveExtraEditor == EXTRAEDITOR_SERVER_SETTINGS) - m_ServerSettingsHistory.Redo(); - else if(m_ActiveExtraEditor == EXTRAEDITOR_ENVELOPES) - m_EnvelopeEditorHistory.Redo(); - else - m_EditorHistory.Redo(); -} - -void CEditor::AdjustBrushSpecialTiles(bool UseNextFree, int Adjust) -{ - // Adjust m_Number field of tune, switch and tele tiles by `Adjust` if `UseNextFree` is false - // If true, then use the next free number instead - - auto &&AdjustNumber = [Adjust](unsigned char &Number) { - Number = ((Number + Adjust) - 1 + 255) % 255 + 1; - }; - - for(auto &pLayer : m_pBrush->m_vpLayers) - { - if(pLayer->m_Type != LAYERTYPE_TILES) - continue; - - std::shared_ptr pLayerTiles = std::static_pointer_cast(pLayer); - - // Only handle tele, switch and tune layers - if(pLayerTiles->m_Tele) - { - int NextFreeTeleNumber = FindNextFreeTeleNumber(); - int NextFreeCPNumber = FindNextFreeTeleNumber(true); - - std::shared_ptr pTeleLayer = std::static_pointer_cast(pLayer); - for(int y = 0; y < pTeleLayer->m_Height; y++) - { - for(int x = 0; x < pTeleLayer->m_Width; x++) - { - int i = y * pTeleLayer->m_Width + x; - if(!IsValidTeleTile(pTeleLayer->m_pTiles[i].m_Index) || (!UseNextFree && !pTeleLayer->m_pTeleTile[i].m_Number)) - continue; - - if(UseNextFree) - { - if(IsTeleTileCheckpoint(pTeleLayer->m_pTiles[i].m_Index)) - pTeleLayer->m_pTeleTile[i].m_Number = NextFreeCPNumber; - else if(IsTeleTileNumberUsedAny(pTeleLayer->m_pTiles[i].m_Index)) - pTeleLayer->m_pTeleTile[i].m_Number = NextFreeTeleNumber; - } - else - AdjustNumber(pTeleLayer->m_pTeleTile[i].m_Number); - - if(!UseNextFree && Adjust == 0 && IsTeleTileNumberUsedAny(pTeleLayer->m_pTiles[i].m_Index)) - { - if(IsTeleTileCheckpoint(pTeleLayer->m_pTeleTile[i].m_Number)) - pTeleLayer->m_pTeleTile[i].m_Number = m_TeleCheckpointNumber; - else - pTeleLayer->m_pTeleTile[i].m_Number = m_TeleNumber; - } - } - } - } - else if(pLayerTiles->m_Tune) - { - if(!UseNextFree) - { - std::shared_ptr pTuneLayer = std::static_pointer_cast(pLayer); - for(int y = 0; y < pTuneLayer->m_Height; y++) - { - for(int x = 0; x < pTuneLayer->m_Width; x++) - { - int i = y * pTuneLayer->m_Width + x; - if(!IsValidTuneTile(pTuneLayer->m_pTiles[i].m_Index) || !pTuneLayer->m_pTuneTile[i].m_Number) - continue; - - AdjustNumber(pTuneLayer->m_pTuneTile[i].m_Number); - } - } - } - } - else if(pLayerTiles->m_Switch) - { - int NextFreeNumber = FindNextFreeSwitchNumber(); - - std::shared_ptr pSwitchLayer = std::static_pointer_cast(pLayer); - for(int y = 0; y < pSwitchLayer->m_Height; y++) - { - for(int x = 0; x < pSwitchLayer->m_Width; x++) - { - int i = y * pSwitchLayer->m_Width + x; - if(!IsValidSwitchTile(pSwitchLayer->m_pTiles[i].m_Index) || (!UseNextFree && !pSwitchLayer->m_pSwitchTile[i].m_Number)) - continue; - - if(UseNextFree) - pSwitchLayer->m_pSwitchTile[i].m_Number = NextFreeNumber; - else - AdjustNumber(pSwitchLayer->m_pSwitchTile[i].m_Number); - } - } - } - } -} - -int CEditor::FindNextFreeSwitchNumber() -{ - int Number = -1; - - for(int i = 1; i <= 255; i++) - { - if(!m_Map.m_pSwitchLayer->ContainsElementWithId(i)) - { - Number = i; - break; - } - } - return Number; -} - -int CEditor::FindNextFreeTeleNumber(bool Checkpoint) -{ - int Number = -1; - for(int i = 1; i <= 255; i++) - { - if(!m_Map.m_pTeleLayer->ContainsElementWithId(i, Checkpoint)) - { - Number = i; - break; - } - } - return Number; -} - -IEditor *CreateEditor() { return new CEditor; } diff --git a/src/game/editor/editor.h b/src/game/editor/editor.h deleted file mode 100644 index 359631d036..0000000000 --- a/src/game/editor/editor.h +++ /dev/null @@ -1,1193 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#ifndef GAME_EDITOR_EDITOR_H -#define GAME_EDITOR_EDITOR_H - -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "editor_history.h" -#include "editor_server_settings.h" -#include "editor_trackers.h" -#include "editor_ui.h" -#include "layer_selector.h" -#include "map_view.h" -#include "smooth_value.h" -#include -#include - -#include -#include -#include -#include -#include -#include - -typedef std::function FIndexModifyFunction; -template -using FDropdownRenderCallback = std::function &)>; - -// CEditor SPECIFIC -enum -{ - MODE_LAYERS = 0, - MODE_IMAGES, - MODE_SOUNDS, - NUM_MODES, - - DIALOG_NONE = 0, - DIALOG_FILE, - DIALOG_MAPSETTINGS_ERROR, - DIALOG_QUICK_PROMPT, -}; - -class CEditorImage; -class CEditorSound; - -class CEditorMap -{ - void MakeGameGroup(std::shared_ptr pGroup); - void MakeGameLayer(const std::shared_ptr &pLayer); - -public: - CEditor *m_pEditor; - - CEditorMap() - { - Clean(); - } - - ~CEditorMap() - { - Clean(); - } - - bool m_Modified; // unsaved changes in manual save - bool m_ModifiedAuto; // unsaved changes in autosave - float m_LastModifiedTime; - float m_LastSaveTime; - float m_LastAutosaveUpdateTime; - void OnModify(); - - std::vector> m_vpGroups; - std::vector> m_vpImages; - std::vector> m_vpEnvelopes; - std::vector> m_vpSounds; - - class CMapInfo - { - public: - char m_aAuthor[32]; - char m_aVersion[16]; - char m_aCredits[128]; - char m_aLicense[32]; - - void Reset() - { - m_aAuthor[0] = '\0'; - m_aVersion[0] = '\0'; - m_aCredits[0] = '\0'; - m_aLicense[0] = '\0'; - } - - void Copy(const CMapInfo &Source) - { - str_copy(m_aAuthor, Source.m_aAuthor); - str_copy(m_aVersion, Source.m_aVersion); - str_copy(m_aCredits, Source.m_aCredits); - str_copy(m_aLicense, Source.m_aLicense); - } - }; - CMapInfo m_MapInfo; - CMapInfo m_MapInfoTmp; - - std::vector m_vSettings; - - std::shared_ptr m_pGameLayer; - std::shared_ptr m_pGameGroup; - - std::shared_ptr NewEnvelope(CEnvelope::EType Type) - { - OnModify(); - std::shared_ptr pEnv = std::make_shared(Type); - m_vpEnvelopes.push_back(pEnv); - return pEnv; - } - - void DeleteEnvelope(int Index); - void SwapEnvelopes(int Index0, int Index1); - template - void VisitEnvelopeReferences(F &&Visitor); - - std::shared_ptr NewGroup() - { - OnModify(); - std::shared_ptr pGroup = std::make_shared(); - pGroup->m_pMap = this; - m_vpGroups.push_back(pGroup); - return pGroup; - } - - int SwapGroups(int Index0, int Index1) - { - if(Index0 < 0 || Index0 >= (int)m_vpGroups.size()) - return Index0; - if(Index1 < 0 || Index1 >= (int)m_vpGroups.size()) - return Index0; - if(Index0 == Index1) - return Index0; - OnModify(); - std::swap(m_vpGroups[Index0], m_vpGroups[Index1]); - return Index1; - } - - void DeleteGroup(int Index) - { - if(Index < 0 || Index >= (int)m_vpGroups.size()) - return; - OnModify(); - m_vpGroups.erase(m_vpGroups.begin() + Index); - } - - void ModifyImageIndex(FIndexModifyFunction pfnFunc) - { - OnModify(); - for(auto &pGroup : m_vpGroups) - pGroup->ModifyImageIndex(pfnFunc); - } - - void ModifyEnvelopeIndex(FIndexModifyFunction pfnFunc) - { - OnModify(); - for(auto &pGroup : m_vpGroups) - pGroup->ModifyEnvelopeIndex(pfnFunc); - } - - void ModifySoundIndex(FIndexModifyFunction pfnFunc) - { - OnModify(); - for(auto &pGroup : m_vpGroups) - pGroup->ModifySoundIndex(pfnFunc); - } - - void Clean(); - void CreateDefault(IGraphics::CTextureHandle EntitiesTexture); - - // io - bool Save(const char *pFilename, const std::function &ErrorHandler); - bool PerformPreSaveSanityChecks(const std::function &ErrorHandler); - bool Load(const char *pFilename, int StorageType, const std::function &ErrorHandler); - void PerformSanityChecks(const std::function &ErrorHandler); - - // DDRace - - std::shared_ptr m_pTeleLayer; - std::shared_ptr m_pSpeedupLayer; - std::shared_ptr m_pFrontLayer; - std::shared_ptr m_pSwitchLayer; - std::shared_ptr m_pTuneLayer; - void MakeTeleLayer(const std::shared_ptr &pLayer); - void MakeSpeedupLayer(const std::shared_ptr &pLayer); - void MakeFrontLayer(const std::shared_ptr &pLayer); - void MakeSwitchLayer(const std::shared_ptr &pLayer); - void MakeTuneLayer(const std::shared_ptr &pLayer); -}; - -class CProperty -{ -public: - CProperty(const char *pName, int Value, int Type, int Min, int Max) : - m_pName(pName), m_Value(Value), m_Type(Type), m_Min(Min), m_Max(Max) {} - - CProperty(std::nullptr_t) : - m_pName(nullptr), m_Value(0), m_Type(0), m_Min(0), m_Max(0) {} - - const char *m_pName; - int m_Value; - int m_Type; - int m_Min; - int m_Max; -}; - -enum -{ - PROPTYPE_NULL = 0, - PROPTYPE_BOOL, - PROPTYPE_INT, - PROPTYPE_ANGLE_SCROLL, - PROPTYPE_COLOR, - PROPTYPE_IMAGE, - PROPTYPE_ENVELOPE, - PROPTYPE_SHIFT, - PROPTYPE_SOUND, - PROPTYPE_AUTOMAPPER, -}; - -class CDataFileWriterFinishJob : public IJob -{ - char m_aRealFileName[IO_MAX_PATH_LENGTH]; - char m_aTempFileName[IO_MAX_PATH_LENGTH]; - CDataFileWriter m_Writer; - - void Run() override - { - m_Writer.Finish(); - } - -public: - CDataFileWriterFinishJob(const char *pRealFileName, const char *pTempFileName, CDataFileWriter &&Writer) : - m_Writer(std::move(Writer)) - { - str_copy(m_aRealFileName, pRealFileName); - str_copy(m_aTempFileName, pTempFileName); - } - - const char *GetRealFileName() const { return m_aRealFileName; } - const char *GetTempFileName() const { return m_aTempFileName; } -}; - -class CEditor : public IEditor -{ - class IInput *m_pInput = nullptr; - class IClient *m_pClient = nullptr; - class IConfigManager *m_pConfigManager = nullptr; - class CConfig *m_pConfig = nullptr; - class IConsole *m_pConsole = nullptr; - class IEngine *m_pEngine = nullptr; - class IGraphics *m_pGraphics = nullptr; - class ITextRender *m_pTextRender = nullptr; - class ISound *m_pSound = nullptr; - class IStorage *m_pStorage = nullptr; - CRenderTools m_RenderTools; - CUi m_UI; - - std::vector> m_vComponents; - CMapView m_MapView; - CLayerSelector m_LayerSelector; - CPrompt m_Prompt; - - bool m_EditorWasUsedBefore = false; - - IGraphics::CTextureHandle m_EntitiesTexture; - - IGraphics::CTextureHandle m_FrontTexture; - IGraphics::CTextureHandle m_TeleTexture; - IGraphics::CTextureHandle m_SpeedupTexture; - IGraphics::CTextureHandle m_SwitchTexture; - IGraphics::CTextureHandle m_TuneTexture; - - int GetTextureUsageFlag() const; - - enum EPreviewState - { - PREVIEW_UNLOADED, - PREVIEW_LOADED, - PREVIEW_ERROR, - }; - - std::shared_ptr m_apSavedBrushes[10]; - static const ColorRGBA ms_DefaultPropColor; - -public: - class IInput *Input() const { return m_pInput; } - class IClient *Client() const { return m_pClient; } - class IConfigManager *ConfigManager() const { return m_pConfigManager; } - class CConfig *Config() const { return m_pConfig; } - class IConsole *Console() const { return m_pConsole; } - class IEngine *Engine() const { return m_pEngine; } - class IGraphics *Graphics() const { return m_pGraphics; } - class ISound *Sound() const { return m_pSound; } - class ITextRender *TextRender() const { return m_pTextRender; } - class IStorage *Storage() const { return m_pStorage; } - CUi *Ui() { return &m_UI; } - CRenderTools *RenderTools() { return &m_RenderTools; } - - CMapView *MapView() { return &m_MapView; } - const CMapView *MapView() const { return &m_MapView; } - CLayerSelector *LayerSelector() { return &m_LayerSelector; } - - void SelectNextLayer(); - void SelectPreviousLayer(); - - void FillGameTiles(EGameTileOp FillTile) const; - bool CanFillGameTiles() const; - void AddQuadOrSound(); - void AddGroup(); - void AddSoundLayer(); - void AddTileLayer(); - void AddQuadsLayer(); - void AddSwitchLayer(); - void AddFrontLayer(); - void AddTuneLayer(); - void AddSpeedupLayer(); - void AddTeleLayer(); - void DeleteSelectedLayer(); - void LayerSelectImage(); - bool IsNonGameTileLayerSelected() const; - void MapDetails(); -#define REGISTER_QUICK_ACTION(name, text, callback, disabled, active, button_color, description) CQuickAction m_QuickAction##name; -#include -#undef REGISTER_QUICK_ACTION - - CEditor() : -#define REGISTER_QUICK_ACTION(name, text, callback, disabled, active, button_color, description) m_QuickAction##name(text, description, callback, disabled, active, button_color), -#include -#undef REGISTER_QUICK_ACTION - m_ZoomEnvelopeX(1.0f, 0.1f, 600.0f), - m_ZoomEnvelopeY(640.0f, 0.1f, 32000.0f), - m_MapSettingsCommandContext(m_MapSettingsBackend.NewContext(&m_SettingsCommandInput)) - { - m_EntitiesTexture.Invalidate(); - m_FrontTexture.Invalidate(); - m_TeleTexture.Invalidate(); - m_SpeedupTexture.Invalidate(); - m_SwitchTexture.Invalidate(); - m_TuneTexture.Invalidate(); - - m_Mode = MODE_LAYERS; - m_Dialog = 0; - - m_BrushColorEnabled = true; - - m_aFileName[0] = '\0'; - m_aFileNamePending[0] = '\0'; - m_aFileSaveName[0] = '\0'; - m_ValidSaveFilename = false; - - m_PopupEventActivated = false; - m_PopupEventWasActivated = false; - - m_FileDialogStorageType = 0; - m_FileDialogLastPopulatedStorageType = 0; - m_FileDialogSaveAction = false; - m_pFileDialogTitle = nullptr; - m_pFileDialogButtonText = nullptr; - m_pFileDialogUser = nullptr; - m_aFileDialogCurrentFolder[0] = '\0'; - m_aFileDialogCurrentLink[0] = '\0'; - m_aFilesSelectedName[0] = '\0'; - m_pFileDialogPath = m_aFileDialogCurrentFolder; - m_FileDialogOpening = false; - m_FilesSelectedIndex = -1; - - m_FilePreviewImage.Invalidate(); - m_FilePreviewSound = -1; - m_FilePreviewState = PREVIEW_UNLOADED; - - m_ToolbarPreviewSound = -1; - - m_SelectEntitiesImage = "DDNet"; - - m_ResetZoomEnvelope = true; - m_OffsetEnvelopeX = 0.1f; - m_OffsetEnvelopeY = 0.5f; - - m_ShowMousePointer = true; - - m_GuiActive = true; - m_PreviewZoom = false; - - m_ShowTileInfo = SHOW_TILE_OFF; - m_ShowDetail = true; - m_Animate = false; - m_AnimateStart = 0; - m_AnimateTime = 0; - m_AnimateSpeed = 1; - m_AnimateUpdatePopup = false; - - m_ShowEnvelopePreview = SHOWENV_NONE; - m_SelectedQuadEnvelope = -1; - - m_vSelectedEnvelopePoints = {}; - m_UpdateEnvPointInfo = false; - m_SelectedTangentInPoint = std::pair(-1, -1); - m_SelectedTangentOutPoint = std::pair(-1, -1); - m_CurrentQuadIndex = -1; - - m_QuadKnifeActive = false; - m_QuadKnifeCount = 0; - mem_zero(m_aQuadKnifePoints, sizeof(m_aQuadKnifePoints)); - - for(size_t i = 0; i < std::size(m_aSavedColors); ++i) - { - m_aSavedColors[i] = color_cast(ColorHSLA(i / (float)std::size(m_aSavedColors), 1.0f, 0.5f)); - } - - m_CheckerTexture.Invalidate(); - for(auto &CursorTexture : m_aCursorTextures) - CursorTexture.Invalidate(); - - m_CursorType = CURSOR_NORMAL; - - ms_pUiGotContext = nullptr; - - // DDRace - - m_TeleNumber = 1; - m_TeleCheckpointNumber = 1; - m_ViewTeleNumber = 0; - - m_SwitchNum = 1; - m_TuningNum = 1; - m_SwitchDelay = 0; - m_SpeedupForce = 50; - m_SpeedupMaxSpeed = 0; - m_SpeedupAngle = 0; - m_LargeLayerWasWarned = false; - m_PreventUnusedTilesWasWarned = false; - m_AllowPlaceUnusedTiles = 0; - m_BrushDrawDestructive = true; - } - - class CHoverTile - { - public: - CHoverTile(int Group, int Layer, int x, int y, const CTile Tile) : - m_Group(Group), - m_Layer(Layer), - m_X(x), - m_Y(y), - m_Tile(Tile) - { - } - - int m_Group; - int m_Layer; - int m_X; - int m_Y; - const CTile m_Tile; - }; - std::vector m_vHoverTiles; - const std::vector &HoverTiles() const { return m_vHoverTiles; } - - void Init() override; - void OnUpdate() override; - void OnRender() override; - void OnActivate() override; - void OnWindowResize() override; - void OnClose() override; - void OnDialogClose() override; - bool HasUnsavedData() const override { return m_Map.m_Modified; } - void UpdateMentions() override { m_Mentions++; } - void ResetMentions() override { m_Mentions = 0; } - void OnIngameMoved() override { m_IngameMoved = true; } - void ResetIngameMoved() override { m_IngameMoved = false; } - - void HandleCursorMovement(); - void OnMouseMove(vec2 MousePos); - void HandleAutosave(); - bool PerformAutosave(); - void HandleWriterFinishJobs(); - - void RefreshFilteredFileList(); - void FilelistPopulate(int StorageType, bool KeepSelection = false); - void InvokeFileDialog(int StorageType, int FileType, const char *pTitle, const char *pButtonText, - const char *pBasepath, bool FilenameAsDefault, - bool (*pfnFunc)(const char *pFilename, int StorageType, void *pUser), void *pUser); - struct SStringKeyComparator - { - bool operator()(const char *pLhs, const char *pRhs) const - { - return str_comp(pLhs, pRhs) < 0; - } - }; - std::map m_PopupMessageContexts; - void ShowFileDialogError(const char *pFormat, ...) - GNUC_ATTRIBUTE((format(printf, 2, 3))); - - void Reset(bool CreateDefault = true); - bool Save(const char *pFilename) override; - bool Load(const char *pFilename, int StorageType) override; - bool HandleMapDrop(const char *pFilename, int StorageType) override; - bool Append(const char *pFilename, int StorageType, bool IgnoreHistory = false); - void LoadCurrentMap(); - void Render(); - - void RenderPressedKeys(CUIRect View); - void RenderSavingIndicator(CUIRect View); - void FreeDynamicPopupMenus(); - void UpdateColorPipette(); - void RenderMousePointer(); - - std::vector GetSelectedQuads(); - std::shared_ptr GetSelectedLayerType(int Index, int Type) const; - std::shared_ptr GetSelectedLayer(int Index) const; - std::shared_ptr GetSelectedGroup() const; - CSoundSource *GetSelectedSource() const; - void SelectLayer(int LayerIndex, int GroupIndex = -1); - void AddSelectedLayer(int LayerIndex); - void SelectQuad(int Index); - void ToggleSelectQuad(int Index); - void DeselectQuads(); - void DeselectQuadPoints(); - void SelectQuadPoint(int QuadIndex, int Index); - void ToggleSelectQuadPoint(int QuadIndex, int Index); - void DeleteSelectedQuads(); - bool IsQuadSelected(int Index) const; - bool IsQuadCornerSelected(int Index) const; - bool IsQuadPointSelected(int QuadIndex, int Index) const; - int FindSelectedQuadIndex(int Index) const; - - int FindEnvPointIndex(int Index, int Channel) const; - void SelectEnvPoint(int Index); - void SelectEnvPoint(int Index, int Channel); - void ToggleEnvPoint(int Index, int Channel); - bool IsEnvPointSelected(int Index, int Channel) const; - bool IsEnvPointSelected(int Index) const; - void DeselectEnvPoints(); - void SelectTangentOutPoint(int Index, int Channel); - bool IsTangentOutPointSelected(int Index, int Channel) const; - void SelectTangentInPoint(int Index, int Channel); - bool IsTangentInPointSelected(int Index, int Channel) const; - bool IsTangentInSelected() const; - bool IsTangentOutSelected() const; - bool IsTangentSelected() const; - std::pair EnvGetSelectedTimeAndValue() const; - - template - SEditResult DoPropertiesWithState(CUIRect *pToolbox, CProperty *pProps, int *pIds, int *pNewVal, const std::vector &vColors = {}); - int DoProperties(CUIRect *pToolbox, CProperty *pProps, int *pIds, int *pNewVal, const std::vector &vColors = {}); - - CUi::SColorPickerPopupContext m_ColorPickerPopupContext; - const void *m_pColorPickerPopupActiveId = nullptr; - void DoColorPickerButton(const void *pId, const CUIRect *pRect, ColorRGBA Color, const std::function &SetColor); - - int m_Mode; - int m_Dialog; - char m_aTooltip[256] = ""; - - bool m_BrushColorEnabled; - - char m_aFileName[IO_MAX_PATH_LENGTH]; - char m_aFileNamePending[IO_MAX_PATH_LENGTH]; - char m_aFileSaveName[IO_MAX_PATH_LENGTH]; - bool m_ValidSaveFilename; - - enum - { - POPEVENT_EXIT = 0, - POPEVENT_LOAD, - POPEVENT_LOADCURRENT, - POPEVENT_LOADDROP, - POPEVENT_NEW, - POPEVENT_SAVE, - POPEVENT_SAVE_COPY, - POPEVENT_SAVE_IMG, - POPEVENT_SAVE_SOUND, - POPEVENT_LARGELAYER, - POPEVENT_PREVENTUNUSEDTILES, - POPEVENT_IMAGEDIV16, - POPEVENT_IMAGE_MAX, - POPEVENT_SOUND_MAX, - POPEVENT_PLACE_BORDER_TILES, - POPEVENT_PIXELART_BIG_IMAGE, - POPEVENT_PIXELART_MANY_COLORS, - POPEVENT_PIXELART_TOO_MANY_COLORS - }; - - int m_PopupEventType; - int m_PopupEventActivated; - int m_PopupEventWasActivated; - bool m_LargeLayerWasWarned; - bool m_PreventUnusedTilesWasWarned; - int m_AllowPlaceUnusedTiles; - bool m_BrushDrawDestructive; - - int m_Mentions = 0; - bool m_IngameMoved = false; - - enum - { - FILETYPE_MAP, - FILETYPE_IMG, - FILETYPE_SOUND, - NUM_FILETYPES - }; - - int m_FileDialogStorageType; - int m_FileDialogLastPopulatedStorageType; - bool m_FileDialogSaveAction; - const char *m_pFileDialogTitle; - const char *m_pFileDialogButtonText; - bool (*m_pfnFileDialogFunc)(const char *pFileName, int StorageType, void *pUser); - void *m_pFileDialogUser; - CLineInputBuffered m_FileDialogFileNameInput; - char m_aFileDialogCurrentFolder[IO_MAX_PATH_LENGTH]; - char m_aFileDialogCurrentLink[IO_MAX_PATH_LENGTH]; - char m_aFilesSelectedName[IO_MAX_PATH_LENGTH]; - CLineInputBuffered m_FileDialogFilterInput; - char *m_pFileDialogPath; - int m_FileDialogFileType; - bool m_FileDialogMultipleStorages = false; - bool m_FileDialogShowingRoot = false; - int m_FilesSelectedIndex; - CLineInputBuffered m_FileDialogNewFolderNameInput; - - IGraphics::CTextureHandle m_FilePreviewImage; - int m_FilePreviewSound; - EPreviewState m_FilePreviewState; - int m_FilePreviewImageWidth; - int m_FilePreviewImageHeight; - bool m_FileDialogOpening; - - int m_ToolbarPreviewSound; - - struct CFilelistItem - { - char m_aFilename[IO_MAX_PATH_LENGTH]; - char m_aName[IO_MAX_PATH_LENGTH]; - bool m_IsDir; - bool m_IsLink; - int m_StorageType; - time_t m_TimeModified; - }; - std::vector m_vCompleteFileList; - std::vector m_vpFilteredFileList; - - static bool CompareFilenameAscending(const CFilelistItem *pLhs, const CFilelistItem *pRhs) - { - if(str_comp(pLhs->m_aFilename, "..") == 0) - return true; - if(str_comp(pRhs->m_aFilename, "..") == 0) - return false; - if(pLhs->m_IsLink != pRhs->m_IsLink) - return pLhs->m_IsLink; - if(pLhs->m_IsDir != pRhs->m_IsDir) - return pLhs->m_IsDir; - return str_comp_filenames(pLhs->m_aName, pRhs->m_aName) < 0; - } - - static bool CompareFilenameDescending(const CFilelistItem *pLhs, const CFilelistItem *pRhs) - { - if(str_comp(pLhs->m_aFilename, "..") == 0) - return true; - if(str_comp(pRhs->m_aFilename, "..") == 0) - return false; - if(pLhs->m_IsLink != pRhs->m_IsLink) - return pLhs->m_IsLink; - if(pLhs->m_IsDir != pRhs->m_IsDir) - return pLhs->m_IsDir; - return str_comp_filenames(pLhs->m_aName, pRhs->m_aName) > 0; - } - - static bool CompareTimeModifiedAscending(const CFilelistItem *pLhs, const CFilelistItem *pRhs) - { - if(str_comp(pLhs->m_aFilename, "..") == 0) - return true; - if(str_comp(pRhs->m_aFilename, "..") == 0) - return false; - if(pLhs->m_IsLink || pRhs->m_IsLink) - return pLhs->m_IsLink; - if(pLhs->m_IsDir != pRhs->m_IsDir) - return pLhs->m_IsDir; - return pLhs->m_TimeModified < pRhs->m_TimeModified; - } - - static bool CompareTimeModifiedDescending(const CFilelistItem *pLhs, const CFilelistItem *pRhs) - { - if(str_comp(pLhs->m_aFilename, "..") == 0) - return true; - if(str_comp(pRhs->m_aFilename, "..") == 0) - return false; - if(pLhs->m_IsLink || pRhs->m_IsLink) - return pLhs->m_IsLink; - if(pLhs->m_IsDir != pRhs->m_IsDir) - return pLhs->m_IsDir; - return pLhs->m_TimeModified > pRhs->m_TimeModified; - } - - void SortFilteredFileList(); - int m_SortByFilename = 1; - int m_SortByTimeModified = 0; - - std::vector m_vSelectEntitiesFiles; - std::string m_SelectEntitiesImage; - - // Zooming - CSmoothValue m_ZoomEnvelopeX; - CSmoothValue m_ZoomEnvelopeY; - - bool m_ResetZoomEnvelope; - - float m_OffsetEnvelopeX; - float m_OffsetEnvelopeY; - - bool m_ShowMousePointer; - bool m_GuiActive; - - char m_aMenuBackgroundTooltip[256]; - bool m_PreviewZoom; - float m_MouseWorldScale = 1.0f; // Mouse (i.e. UI) scale relative to the World (selected Group) - vec2 m_MouseWorldPos = vec2(0.0f, 0.0f); - vec2 m_MouseWorldNoParaPos = vec2(0.0f, 0.0f); - vec2 m_MouseDeltaWorld = vec2(0.0f, 0.0f); - const void *m_pContainerPanned; - const void *m_pContainerPannedLast; - char m_MapEditorId; // UI element ID for the main map editor - - enum EShowTile - { - SHOW_TILE_OFF, - SHOW_TILE_DECIMAL, - SHOW_TILE_HEXADECIMAL - }; - EShowTile m_ShowTileInfo; - bool m_ShowDetail; - - bool m_Animate; - int64_t m_AnimateStart; - float m_AnimateTime; - float m_AnimateSpeed; - bool m_AnimateUpdatePopup; - - enum EExtraEditor - { - EXTRAEDITOR_NONE = -1, - EXTRAEDITOR_ENVELOPES, - EXTRAEDITOR_SERVER_SETTINGS, - EXTRAEDITOR_HISTORY, - NUM_EXTRAEDITORS, - }; - EExtraEditor m_ActiveExtraEditor = EXTRAEDITOR_NONE; - float m_aExtraEditorSplits[NUM_EXTRAEDITORS] = {250.0f, 250.0f, 250.0f}; - float m_ToolBoxWidth = 100.0f; - - enum EShowEnvelope - { - SHOWENV_NONE = 0, - SHOWENV_SELECTED, - SHOWENV_ALL - }; - EShowEnvelope m_ShowEnvelopePreview; - bool m_ShowPicker; - - std::vector m_vSelectedLayers; - std::vector m_vSelectedQuads; - int m_SelectedQuadPoint; - int m_SelectedQuadIndex; - int m_SelectedGroup; - int m_SelectedQuadPoints; - int m_SelectedEnvelope; - std::vector> m_vSelectedEnvelopePoints; - int m_SelectedQuadEnvelope; - int m_CurrentQuadIndex; - int m_SelectedImage; - int m_SelectedSound; - int m_SelectedSource; - std::pair m_SelectedTangentInPoint; - std::pair m_SelectedTangentOutPoint; - bool m_UpdateEnvPointInfo; - - bool m_QuadKnifeActive; - int m_QuadKnifeCount; - vec2 m_aQuadKnifePoints[4]; - - // Color palette and pipette - ColorRGBA m_aSavedColors[8]; - ColorRGBA m_PipetteColor = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - bool m_ColorPipetteActive = false; - - IGraphics::CTextureHandle m_CheckerTexture; - - enum ECursorType - { - CURSOR_NORMAL, - CURSOR_RESIZE_V, - CURSOR_RESIZE_H, - NUM_CURSORS - }; - IGraphics::CTextureHandle m_aCursorTextures[ECursorType::NUM_CURSORS]; - ECursorType m_CursorType; - - IGraphics::CTextureHandle GetEntitiesTexture(); - - std::shared_ptr m_pBrush; - std::shared_ptr m_pTilesetPicker; - std::shared_ptr m_pQuadsetPicker; - - static const void *ms_pUiGotContext; - - CEditorMap m_Map; - std::deque> m_WriterFinishJobs; - - int m_ShiftBy; - - static void EnvelopeEval(int TimeOffsetMillis, int Env, ColorRGBA &Result, size_t Channels, void *pUser); - - CLineInputBuffered<256> m_SettingsCommandInput; - CMapSettingsBackend m_MapSettingsBackend; - CMapSettingsBackend::CContext m_MapSettingsCommandContext; - - CImageInfo m_TileartImageInfo; - char m_aTileartFilename[IO_MAX_PATH_LENGTH]; - void AddTileart(bool IgnoreHistory = false); - void TileartCheckColors(); - - void PlaceBorderTiles(); - - void UpdateTooltip(const void *pId, const CUIRect *pRect, const char *pToolTip); - int DoButton_Editor_Common(const void *pId, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip); - int DoButton_Editor(const void *pId, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip); - int DoButton_Env(const void *pId, const char *pText, int Checked, const CUIRect *pRect, const char *pToolTip, ColorRGBA Color, int Corners); - - int DoButton_Ex(const void *pId, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip, int Corners, float FontSize = EditorFontSizes::MENU, int Align = TEXTALIGN_MC); - int DoButton_FontIcon(const void *pId, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip, int Corners, float FontSize = 10.0f); - int DoButton_MenuItem(const void *pId, const char *pText, int Checked, const CUIRect *pRect, int Flags = 0, const char *pToolTip = nullptr); - - int DoButton_DraggableEx(const void *pId, const char *pText, int Checked, const CUIRect *pRect, bool *pClicked, bool *pAbrupted, int Flags, const char *pToolTip = nullptr, int Corners = IGraphics::CORNER_ALL, float FontSize = 10.0f); - - bool DoEditBox(CLineInput *pLineInput, const CUIRect *pRect, float FontSize, int Corners = IGraphics::CORNER_ALL, const char *pToolTip = nullptr, const std::vector &vColorSplits = {}); - bool DoClearableEditBox(CLineInput *pLineInput, const CUIRect *pRect, float FontSize, int Corners = IGraphics::CORNER_ALL, const char *pToolTip = nullptr, const std::vector &vColorSplits = {}); - - void DoMapSettingsEditBox(CMapSettingsBackend::CContext *pContext, const CUIRect *pRect, float FontSize, float DropdownMaxHeight, int Corners = IGraphics::CORNER_ALL, const char *pToolTip = nullptr); - - template - int DoEditBoxDropdown(SEditBoxDropdownContext *pDropdown, CLineInput *pLineInput, const CUIRect *pEditBoxRect, int x, float MaxHeight, bool AutoWidth, const std::vector &vData, const FDropdownRenderCallback &pfnMatchCallback); - template - int RenderEditBoxDropdown(SEditBoxDropdownContext *pDropdown, CUIRect View, CLineInput *pLineInput, int x, float MaxHeight, bool AutoWidth, const std::vector &vData, const FDropdownRenderCallback &pfnMatchCallback); - - void RenderBackground(CUIRect View, IGraphics::CTextureHandle Texture, float Size, float Brightness) const; - - SEditResult UiDoValueSelector(void *pId, CUIRect *pRect, const char *pLabel, int Current, int Min, int Max, int Step, float Scale, const char *pToolTip, bool IsDegree = false, bool IsHex = false, int Corners = IGraphics::CORNER_ALL, const ColorRGBA *pColor = nullptr, bool ShowValue = true); - - static CUi::EPopupMenuFunctionResult PopupMenuFile(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupMenuTools(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupMenuSettings(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupGroup(void *pContext, CUIRect View, bool Active); - struct SLayerPopupContext : public SPopupMenuId - { - CEditor *m_pEditor; - std::vector> m_vpLayers; - std::vector m_vLayerIndices; - CLayerTiles::SCommonPropState m_CommonPropState; - }; - static CUi::EPopupMenuFunctionResult PopupLayer(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupQuad(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupSource(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupPoint(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupEnvPoint(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupEnvPointMulti(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupEnvPointCurveType(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupImage(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupSound(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupNewFolder(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupMapInfo(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupEvent(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupSelectImage(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupSelectSound(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupSelectGametileOp(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupSelectConfigAutoMap(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupTele(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupSpeedup(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupSwitch(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupTune(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupGoto(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupEntities(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupProofMode(void *pContext, CUIRect View, bool Active); - static CUi::EPopupMenuFunctionResult PopupAnimateSettings(void *pContext, CUIRect View, bool Active); - int m_PopupEnvelopeSelectedPoint = -1; - static CUi::EPopupMenuFunctionResult PopupEnvelopeCurvetype(void *pContext, CUIRect View, bool Active); - - static bool CallbackOpenMap(const char *pFileName, int StorageType, void *pUser); - static bool CallbackAppendMap(const char *pFileName, int StorageType, void *pUser); - static bool CallbackSaveMap(const char *pFileName, int StorageType, void *pUser); - static bool CallbackSaveCopyMap(const char *pFileName, int StorageType, void *pUser); - static bool CallbackAddTileart(const char *pFilepath, int StorageType, void *pUser); - static bool CallbackSaveImage(const char *pFileName, int StorageType, void *pUser); - static bool CallbackSaveSound(const char *pFileName, int StorageType, void *pUser); - static bool CallbackCustomEntities(const char *pFileName, int StorageType, void *pUser); - - void PopupSelectImageInvoke(int Current, float x, float y); - int PopupSelectImageResult(); - - void PopupSelectGametileOpInvoke(float x, float y); - int PopupSelectGameTileOpResult(); - - void PopupSelectConfigAutoMapInvoke(int Current, float x, float y); - int PopupSelectConfigAutoMapResult(); - - void PopupSelectSoundInvoke(int Current, float x, float y); - int PopupSelectSoundResult(); - - void DoQuadEnvelopes(const std::vector &vQuads, IGraphics::CTextureHandle Texture = IGraphics::CTextureHandle()); - void DoQuadEnvPoint(const CQuad *pQuad, int QIndex, int pIndex); - void DoQuadPoint(int LayerIndex, const std::shared_ptr &pLayer, CQuad *pQuad, int QuadIndex, int v); - void SetHotQuadPoint(const std::shared_ptr &pLayer); - - float TriangleArea(vec2 A, vec2 B, vec2 C); - bool IsInTriangle(vec2 Point, vec2 A, vec2 B, vec2 C); - void DoQuadKnife(int QuadIndex); - - void DoSoundSource(int LayerIndex, CSoundSource *pSource, int Index); - - enum class EAxis - { - AXIS_NONE = 0, - AXIS_X, - AXIS_Y - }; - struct SAxisAlignedBoundingBox - { - enum - { - POINT_TL = 0, - POINT_TR, - POINT_BL, - POINT_BR, - POINT_CENTER, - NUM_POINTS - }; - CPoint m_aPoints[NUM_POINTS]; - }; - void DoMapEditor(CUIRect View); - void DoToolbarLayers(CUIRect Toolbar); - void DoToolbarImages(CUIRect Toolbar); - void DoToolbarSounds(CUIRect Toolbar); - void DoQuad(int LayerIndex, const std::shared_ptr &pLayer, CQuad *pQuad, int Index); - void PreparePointDrag(const std::shared_ptr &pLayer, CQuad *pQuad, int QuadIndex, int PointIndex); - void DoPointDrag(const std::shared_ptr &pLayer, CQuad *pQuad, int QuadIndex, int PointIndex, int OffsetX, int OffsetY); - EAxis GetDragAxis(int OffsetX, int OffsetY) const; - void DrawAxis(EAxis Axis, CPoint &OriginalPoint, CPoint &Point) const; - void DrawAABB(const SAxisAlignedBoundingBox &AABB, int OffsetX = 0, int OffsetY = 0) const; - ColorRGBA GetButtonColor(const void *pId, int Checked); - - // Alignment methods - // These methods take `OffsetX` and `OffsetY` because the calculations are made with the original positions - // of the quad(s), before we started dragging. This allows us to edit `OffsetX` and `OffsetY` based on the previously - // calculated alignments. - struct SAlignmentInfo - { - CPoint m_AlignedPoint; // The "aligned" point, which we want to align/snap to - union - { - // The current changing value when aligned to this point. When aligning to a point on the X axis, then the X value is changing because - // we aligned the Y values (X axis aligned => Y values are the same, Y axis aligned => X values are the same). - int m_X; - int m_Y; - }; - EAxis m_Axis; // The axis we are aligning on - int m_PointIndex; // The point index we are aligning - int m_Diff; // Store the difference - }; - void ComputePointAlignments(const std::shared_ptr &pLayer, CQuad *pQuad, int QuadIndex, int PointIndex, int OffsetX, int OffsetY, std::vector &vAlignments, bool Append = false) const; - void ComputePointsAlignments(const std::shared_ptr &pLayer, bool Pivot, int OffsetX, int OffsetY, std::vector &vAlignments) const; - void ComputeAABBAlignments(const std::shared_ptr &pLayer, const SAxisAlignedBoundingBox &AABB, int OffsetX, int OffsetY, std::vector &vAlignments) const; - void DrawPointAlignments(const std::vector &vAlignments, int OffsetX, int OffsetY) const; - void QuadSelectionAABB(const std::shared_ptr &pLayer, SAxisAlignedBoundingBox &OutAABB); - void ApplyAlignments(const std::vector &vAlignments, int &OffsetX, int &OffsetY); - void ApplyAxisAlignment(int &OffsetX, int &OffsetY) const; - - bool ReplaceImage(const char *pFilename, int StorageType, bool CheckDuplicate); - static bool ReplaceImageCallback(const char *pFilename, int StorageType, void *pUser); - bool ReplaceSound(const char *pFileName, int StorageType, bool CheckDuplicate); - static bool ReplaceSoundCallback(const char *pFileName, int StorageType, void *pUser); - static bool AddImage(const char *pFilename, int StorageType, void *pUser); - static bool AddSound(const char *pFileName, int StorageType, void *pUser); - - bool IsEnvelopeUsed(int EnvelopeIndex) const; - void RemoveUnusedEnvelopes(); - - static bool IsVanillaImage(const char *pImage); - - void RenderLayers(CUIRect LayersBox); - void RenderImagesList(CUIRect Toolbox); - void RenderSelectedImage(CUIRect View); - void RenderSounds(CUIRect Toolbox); - void RenderModebar(CUIRect View); - void RenderStatusbar(CUIRect View, CUIRect *pTooltipRect); - void RenderTooltip(CUIRect TooltipRect); - - void RenderEnvelopeEditor(CUIRect View); - - void RenderMapSettingsErrorDialog(); - void RenderServerSettingsEditor(CUIRect View, bool ShowServerSettingsEditorLast); - static void MapSettingsDropdownRenderCallback(const SPossibleValueMatch &Match, char (&aOutput)[128], std::vector &vColorSplits); - - void RenderEditorHistory(CUIRect View); - - enum class EDragSide // Which side is the drag bar on - { - SIDE_BOTTOM, - SIDE_LEFT, - SIDE_TOP, - SIDE_RIGHT - }; - void DoEditorDragBar(CUIRect View, CUIRect *pDragBar, EDragSide Side, float *pValue, float MinValue = 100.0f, float MaxValue = 400.0f); - - void SetHotEnvelopePoint(const CUIRect &View, const std::shared_ptr &pEnvelope, int ActiveChannels); - - void RenderMenubar(CUIRect Menubar); - void RenderFileDialog(); - - void SelectGameLayer(); - std::vector SortImages(); - - void DoAudioPreview(CUIRect View, const void *pPlayPauseButtonId, const void *pStopButtonId, const void *pSeekBarId, int SampleId); - - // Tile Numbers For Explanations - TODO: Add/Improve tiles and explanations - enum - { - TILE_PUB_AIR, - TILE_PUB_HOOKABLE, - TILE_PUB_DEATH, - TILE_PUB_UNHOOKABLE, - - TILE_PUB_CREDITS1 = 140, - TILE_PUB_CREDITS2, - TILE_PUB_CREDITS3, - TILE_PUB_CREDITS4, - TILE_PUB_CREDITS5 = 156, - TILE_PUB_CREDITS6, - TILE_PUB_CREDITS7, - TILE_PUB_CREDITS8, - - TILE_PUB_ENTITIES_OFF1 = 190, - TILE_PUB_ENTITIES_OFF2, - }; - - enum - { - TILE_FNG_SPIKE_GOLD = 7, - TILE_FNG_SPIKE_NORMAL, - TILE_FNG_SPIKE_RED, - TILE_FNG_SPIKE_BLUE, - TILE_FNG_SCORE_RED, - TILE_FNG_SCORE_BLUE, - - TILE_FNG_SPIKE_GREEN = 14, - TILE_FNG_SPIKE_PURPLE, - - TILE_FNG_SPAWN = 192, - TILE_FNG_SPAWN_RED, - TILE_FNG_SPAWN_BLUE, - TILE_FNG_FLAG_RED, - TILE_FNG_FLAG_BLUE, - TILE_FNG_SHIELD, - TILE_FNG_HEART, - TILE_FNG_SHOTGUN, - TILE_FNG_GRENADE, - TILE_FNG_NINJA, - TILE_FNG_LASER, - - TILE_FNG_SPIKE_OLD1 = 208, - TILE_FNG_SPIKE_OLD2, - TILE_FNG_SPIKE_OLD3 - }; - - enum - { - TILE_VANILLA_SPAWN = 192, - TILE_VANILLA_SPAWN_RED, - TILE_VANILLA_SPAWN_BLUE, - TILE_VANILLA_FLAG_RED, - TILE_VANILLA_FLAG_BLUE, - TILE_VANILLA_SHIELD, - TILE_VANILLA_HEART, - TILE_VANILLA_SHOTGUN, - TILE_VANILLA_GRENADE, - TILE_VANILLA_NINJA, - TILE_VANILLA_LASER, - }; - - // Explanations - enum class EExplanation - { - NONE, - DDNET, - FNG, - RACE, - VANILLA, - BLOCKWORLDS - }; - static const char *ExplainDDNet(int Tile, int Layer); - static const char *ExplainFNG(int Tile, int Layer); - static const char *ExplainVanilla(int Tile, int Layer); - static const char *Explain(EExplanation Explanation, int Tile, int Layer); - - // Zooming - void ZoomAdaptOffsetX(float ZoomFactor, const CUIRect &View); - void UpdateZoomEnvelopeX(const CUIRect &View); - - void ZoomAdaptOffsetY(float ZoomFactor, const CUIRect &View); - void UpdateZoomEnvelopeY(const CUIRect &View); - - void ResetZoomEnvelope(const std::shared_ptr &pEnvelope, int ActiveChannels); - void RemoveTimeOffsetEnvelope(const std::shared_ptr &pEnvelope); - float ScreenToEnvelopeX(const CUIRect &View, float x) const; - float EnvelopeToScreenX(const CUIRect &View, float x) const; - float ScreenToEnvelopeY(const CUIRect &View, float y) const; - float EnvelopeToScreenY(const CUIRect &View, float y) const; - float ScreenToEnvelopeDX(const CUIRect &View, float DeltaX); - float ScreenToEnvelopeDY(const CUIRect &View, float DeltaY); - - // DDRace - - IGraphics::CTextureHandle GetFrontTexture(); - IGraphics::CTextureHandle GetTeleTexture(); - IGraphics::CTextureHandle GetSpeedupTexture(); - IGraphics::CTextureHandle GetSwitchTexture(); - IGraphics::CTextureHandle GetTuneTexture(); - - unsigned char m_TeleNumber; - unsigned char m_TeleCheckpointNumber; - unsigned char m_ViewTeleNumber; - - unsigned char m_TuningNum; - - unsigned char m_SpeedupForce; - unsigned char m_SpeedupMaxSpeed; - short m_SpeedupAngle; - - unsigned char m_SwitchNum; - unsigned char m_SwitchDelay; - unsigned char m_ViewSwitch; - - void AdjustBrushSpecialTiles(bool UseNextFree, int Adjust = 0); - int FindNextFreeSwitchNumber(); - int FindNextFreeTeleNumber(bool Checkpoint = false); - - // Undo/Redo - CEditorHistory m_EditorHistory; - CEditorHistory m_ServerSettingsHistory; - CEditorHistory m_EnvelopeEditorHistory; - CQuadEditTracker m_QuadTracker; - CEnvelopeEditorOperationTracker m_EnvOpTracker; - -private: - void UndoLastAction(); - void RedoLastAction(); - - std::map m_QuadDragOriginalPoints; -}; - -// make sure to inline this function -inline class IGraphics *CLayer::Graphics() { return m_pEditor->Graphics(); } -inline class ITextRender *CLayer::TextRender() { return m_pEditor->TextRender(); } - -#endif diff --git a/src/game/editor/editor_action.h b/src/game/editor/editor_action.h deleted file mode 100644 index d4fb124df4..0000000000 --- a/src/game/editor/editor_action.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef GAME_EDITOR_EDITOR_ACTION_H -#define GAME_EDITOR_EDITOR_ACTION_H - -#include - -class CEditor; - -class IEditorAction -{ -public: - IEditorAction(CEditor *pEditor) : - m_pEditor(pEditor) {} - - IEditorAction() = default; - - virtual ~IEditorAction() = default; - - virtual void Undo() = 0; - virtual void Redo() = 0; - - virtual bool IsEmpty() { return false; } - - const char *DisplayText() const { return m_aDisplayText; } - -protected: - CEditor *m_pEditor; - char m_aDisplayText[256]; -}; - -#endif diff --git a/src/game/editor/editor_actions.cpp b/src/game/editor/editor_actions.cpp deleted file mode 100644 index 8f4334d04b..0000000000 --- a/src/game/editor/editor_actions.cpp +++ /dev/null @@ -1,2121 +0,0 @@ -#include "editor_actions.h" -#include - -CEditorBrushDrawAction::CEditorBrushDrawAction(CEditor *pEditor, int Group) : - IEditorAction(pEditor), m_Group(Group) -{ - auto &Map = pEditor->m_Map; - for(size_t k = 0; k < Map.m_vpGroups[Group]->m_vpLayers.size(); k++) - { - auto pLayer = Map.m_vpGroups[Group]->m_vpLayers[k]; - - if(pLayer->m_Type == LAYERTYPE_TILES) - { - auto pLayerTiles = std::static_pointer_cast(pLayer); - - if(pLayer == Map.m_pTeleLayer) - { - if(!Map.m_pTeleLayer->m_History.empty()) - { - m_TeleTileChanges = std::map(Map.m_pTeleLayer->m_History); - Map.m_pTeleLayer->ClearHistory(); - } - } - else if(pLayer == Map.m_pTuneLayer) - { - if(!Map.m_pTuneLayer->m_History.empty()) - { - m_TuneTileChanges = std::map(Map.m_pTuneLayer->m_History); - Map.m_pTuneLayer->ClearHistory(); - } - } - else if(pLayer == Map.m_pSwitchLayer) - { - if(!Map.m_pSwitchLayer->m_History.empty()) - { - m_SwitchTileChanges = std::map(Map.m_pSwitchLayer->m_History); - Map.m_pSwitchLayer->ClearHistory(); - } - } - else if(pLayer == Map.m_pSpeedupLayer) - { - if(!Map.m_pSpeedupLayer->m_History.empty()) - { - m_SpeedupTileChanges = std::map(Map.m_pSpeedupLayer->m_History); - Map.m_pSpeedupLayer->ClearHistory(); - } - } - - if(!pLayerTiles->m_TilesHistory.empty()) - { - m_vTileChanges.emplace_back(k, std::map(pLayerTiles->m_TilesHistory)); - pLayerTiles->ClearHistory(); - } - } - } - - SetInfos(); - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Brush draw (x%d) on %d layers", m_TotalTilesDrawn, m_TotalLayers); -} - -void CEditorBrushDrawAction::SetInfos() -{ - m_TotalTilesDrawn = 0; - m_TotalLayers = 0; - - // Process normal tiles - for(auto const &Pair : m_vTileChanges) - { - int Layer = Pair.first; - std::shared_ptr pLayer = m_pEditor->m_Map.m_vpGroups[m_Group]->m_vpLayers[Layer]; - m_TotalLayers++; - - if(pLayer->m_Type == LAYERTYPE_TILES) - { - std::shared_ptr pLayerTiles = std::static_pointer_cast(pLayer); - auto Changes = Pair.second; - for(auto &Change : Changes) - { - m_TotalTilesDrawn += Change.second.size(); - } - } - } - - // Process speedup tiles - for(auto const &SpeedupChange : m_SpeedupTileChanges) - { - m_TotalTilesDrawn += SpeedupChange.second.size(); - } - - // Process tele tiles - for(auto const &TeleChange : m_TeleTileChanges) - { - m_TotalTilesDrawn += TeleChange.second.size(); - } - - // Process switch tiles - for(auto const &SwitchChange : m_SwitchTileChanges) - { - m_TotalTilesDrawn += SwitchChange.second.size(); - } - - // Process tune tiles - for(auto const &TuneChange : m_TuneTileChanges) - { - m_TotalTilesDrawn += TuneChange.second.size(); - } - - m_TotalLayers += !m_SpeedupTileChanges.empty(); - m_TotalLayers += !m_SwitchTileChanges.empty(); - m_TotalLayers += !m_TeleTileChanges.empty(); - m_TotalLayers += !m_TuneTileChanges.empty(); -} - -bool CEditorBrushDrawAction::IsEmpty() -{ - return m_vTileChanges.empty() && m_SpeedupTileChanges.empty() && m_SwitchTileChanges.empty() && m_TeleTileChanges.empty() && m_TuneTileChanges.empty(); -} - -void CEditorBrushDrawAction::Undo() -{ - Apply(true); -} - -void CEditorBrushDrawAction::Redo() -{ - Apply(false); -} - -void CEditorBrushDrawAction::Apply(bool Undo) -{ - auto &Map = m_pEditor->m_Map; - - // Process normal tiles - for(auto const &Pair : m_vTileChanges) - { - int Layer = Pair.first; - std::shared_ptr pLayer = Map.m_vpGroups[m_Group]->m_vpLayers[Layer]; - - if(pLayer->m_Type == LAYERTYPE_TILES) - { - std::shared_ptr pLayerTiles = std::static_pointer_cast(pLayer); - auto Changes = Pair.second; - for(auto &Change : Changes) - { - int y = Change.first; - auto Line = Change.second; - for(auto &Tile : Line) - { - int x = Tile.first; - STileStateChange State = Tile.second; - pLayerTiles->SetTileIgnoreHistory(x, y, Undo ? State.m_Previous : State.m_Current); - } - } - } - } - - // Process speedup tiles - for(auto const &SpeedupChange : m_SpeedupTileChanges) - { - int y = SpeedupChange.first; - auto Line = SpeedupChange.second; - for(auto &Tile : Line) - { - int x = Tile.first; - int Index = y * Map.m_pSpeedupLayer->m_Width + x; - SSpeedupTileStateChange State = Tile.second; - SSpeedupTileStateChange::SData Data = Undo ? State.m_Previous : State.m_Current; - - Map.m_pSpeedupLayer->m_pSpeedupTile[Index].m_Force = Data.m_Force; - Map.m_pSpeedupLayer->m_pSpeedupTile[Index].m_MaxSpeed = Data.m_MaxSpeed; - Map.m_pSpeedupLayer->m_pSpeedupTile[Index].m_Angle = Data.m_Angle; - Map.m_pSpeedupLayer->m_pSpeedupTile[Index].m_Type = Data.m_Type; - Map.m_pSpeedupLayer->m_pTiles[Index].m_Index = Data.m_Index; - } - } - - // Process tele tiles - for(auto const &TeleChange : m_TeleTileChanges) - { - int y = TeleChange.first; - auto Line = TeleChange.second; - for(auto &Tile : Line) - { - int x = Tile.first; - int Index = y * Map.m_pTeleLayer->m_Width + x; - STeleTileStateChange State = Tile.second; - STeleTileStateChange::SData Data = Undo ? State.m_Previous : State.m_Current; - - Map.m_pTeleLayer->m_pTeleTile[Index].m_Number = Data.m_Number; - Map.m_pTeleLayer->m_pTeleTile[Index].m_Type = Data.m_Type; - Map.m_pTeleLayer->m_pTiles[Index].m_Index = Data.m_Index; - } - } - - // Process switch tiles - for(auto const &SwitchChange : m_SwitchTileChanges) - { - int y = SwitchChange.first; - auto Line = SwitchChange.second; - for(auto &Tile : Line) - { - int x = Tile.first; - int Index = y * Map.m_pSwitchLayer->m_Width + x; - SSwitchTileStateChange State = Tile.second; - SSwitchTileStateChange::SData Data = Undo ? State.m_Previous : State.m_Current; - - Map.m_pSwitchLayer->m_pSwitchTile[Index].m_Number = Data.m_Number; - Map.m_pSwitchLayer->m_pSwitchTile[Index].m_Type = Data.m_Type; - Map.m_pSwitchLayer->m_pSwitchTile[Index].m_Flags = Data.m_Flags; - Map.m_pSwitchLayer->m_pSwitchTile[Index].m_Delay = Data.m_Delay; - Map.m_pSwitchLayer->m_pTiles[Index].m_Index = Data.m_Index; - } - } - - // Process tune tiles - for(auto const &TuneChange : m_TuneTileChanges) - { - int y = TuneChange.first; - auto Line = TuneChange.second; - for(auto &Tile : Line) - { - int x = Tile.first; - int Index = y * Map.m_pTuneLayer->m_Width + x; - STuneTileStateChange State = Tile.second; - STuneTileStateChange::SData Data = Undo ? State.m_Previous : State.m_Current; - - Map.m_pTuneLayer->m_pTuneTile[Index].m_Number = Data.m_Number; - Map.m_pTuneLayer->m_pTuneTile[Index].m_Type = Data.m_Type; - Map.m_pTuneLayer->m_pTiles[Index].m_Index = Data.m_Index; - } - } -} - -// ------------------------------------------- - -CEditorActionQuadPlace::CEditorActionQuadPlace(CEditor *pEditor, int GroupIndex, int LayerIndex, std::vector &vBrush) : - CEditorActionLayerBase(pEditor, GroupIndex, LayerIndex), m_vBrush(vBrush) -{ - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Quad place (x%d)", (int)m_vBrush.size()); -} - -void CEditorActionQuadPlace::Undo() -{ - std::shared_ptr pLayerQuads = std::static_pointer_cast(m_pLayer); - for(size_t k = 0; k < m_vBrush.size(); k++) - pLayerQuads->m_vQuads.pop_back(); - - m_pEditor->m_Map.OnModify(); -} -void CEditorActionQuadPlace::Redo() -{ - std::shared_ptr pLayerQuads = std::static_pointer_cast(m_pLayer); - for(auto &Brush : m_vBrush) - pLayerQuads->m_vQuads.push_back(Brush); - - m_pEditor->m_Map.OnModify(); -} - -CEditorActionSoundPlace::CEditorActionSoundPlace(CEditor *pEditor, int GroupIndex, int LayerIndex, std::vector &vBrush) : - CEditorActionLayerBase(pEditor, GroupIndex, LayerIndex), m_vBrush(vBrush) -{ - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Sound place (x%d)", (int)m_vBrush.size()); -} - -void CEditorActionSoundPlace::Undo() -{ - std::shared_ptr pLayerSounds = std::static_pointer_cast(m_pLayer); - for(size_t k = 0; k < m_vBrush.size(); k++) - pLayerSounds->m_vSources.pop_back(); - - m_pEditor->m_Map.OnModify(); -} - -void CEditorActionSoundPlace::Redo() -{ - std::shared_ptr pLayerSounds = std::static_pointer_cast(m_pLayer); - for(auto &Brush : m_vBrush) - pLayerSounds->m_vSources.push_back(Brush); - - m_pEditor->m_Map.OnModify(); -} - -// --------------------------------------------------------------------------------------- - -CEditorActionDeleteQuad::CEditorActionDeleteQuad(CEditor *pEditor, int GroupIndex, int LayerIndex, std::vector const &vQuadsIndices, std::vector const &vDeletedQuads) : - CEditorActionLayerBase(pEditor, GroupIndex, LayerIndex), m_vQuadsIndices(vQuadsIndices), m_vDeletedQuads(vDeletedQuads) -{ - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Delete quad (x%d)", (int)m_vDeletedQuads.size()); -} - -void CEditorActionDeleteQuad::Undo() -{ - std::shared_ptr pLayerQuads = std::static_pointer_cast(m_pLayer); - for(size_t k = 0; k < m_vQuadsIndices.size(); k++) - { - pLayerQuads->m_vQuads.insert(pLayerQuads->m_vQuads.begin() + m_vQuadsIndices[k], m_vDeletedQuads[k]); - } -} - -void CEditorActionDeleteQuad::Redo() -{ - std::shared_ptr pLayerQuads = std::static_pointer_cast(m_pLayer); - std::vector vQuads(m_vQuadsIndices); - - for(int i = 0; i < (int)vQuads.size(); ++i) - { - pLayerQuads->m_vQuads.erase(pLayerQuads->m_vQuads.begin() + vQuads[i]); - for(int j = i + 1; j < (int)vQuads.size(); ++j) - if(vQuads[j] > vQuads[i]) - vQuads[j]--; - - vQuads.erase(vQuads.begin() + i); - - i--; - } -} - -// --------------------------------------------------------------------------------------- - -CEditorActionEditQuadPoint::CEditorActionEditQuadPoint(CEditor *pEditor, int GroupIndex, int LayerIndex, int QuadIndex, std::vector const &vPreviousPoints, std::vector const &vCurrentPoints) : - CEditorActionLayerBase(pEditor, GroupIndex, LayerIndex), m_QuadIndex(QuadIndex), m_vPreviousPoints(vPreviousPoints), m_vCurrentPoints(vCurrentPoints) -{ - str_copy(m_aDisplayText, "Edit quad points"); -} - -void CEditorActionEditQuadPoint::Undo() -{ - std::shared_ptr pLayerQuads = std::static_pointer_cast(m_pLayer); - CQuad &Quad = pLayerQuads->m_vQuads[m_QuadIndex]; - for(int k = 0; k < 5; k++) - Quad.m_aPoints[k] = m_vPreviousPoints[k]; -} - -void CEditorActionEditQuadPoint::Redo() -{ - std::shared_ptr pLayerQuads = std::static_pointer_cast(m_pLayer); - CQuad &Quad = pLayerQuads->m_vQuads[m_QuadIndex]; - for(int k = 0; k < 5; k++) - Quad.m_aPoints[k] = m_vCurrentPoints[k]; -} - -CEditorActionEditQuadProp::CEditorActionEditQuadProp(CEditor *pEditor, int GroupIndex, int LayerIndex, int QuadIndex, EQuadProp Prop, int Previous, int Current) : - CEditorActionLayerBase(pEditor, GroupIndex, LayerIndex), m_QuadIndex(QuadIndex), m_Prop(Prop), m_Previous(Previous), m_Current(Current) -{ - static const char *s_apNames[] = { - "order", - "pos X", - "pos Y", - "pos env", - "pos env offset", - "color env", - "color env offset"}; - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Edit quad %s property in layer %d of group %d", s_apNames[(int)m_Prop], m_LayerIndex, m_GroupIndex); -} - -void CEditorActionEditQuadProp::Undo() -{ - Apply(m_Previous); -} - -void CEditorActionEditQuadProp::Redo() -{ - Apply(m_Current); -} - -void CEditorActionEditQuadProp::Apply(int Value) -{ - std::shared_ptr pLayerQuads = std::static_pointer_cast(m_pLayer); - CQuad &Quad = pLayerQuads->m_vQuads[m_QuadIndex]; - if(m_Prop == EQuadProp::PROP_POS_ENV) - Quad.m_PosEnv = Value; - else if(m_Prop == EQuadProp::PROP_POS_ENV_OFFSET) - Quad.m_PosEnvOffset = Value; - else if(m_Prop == EQuadProp::PROP_COLOR_ENV) - Quad.m_ColorEnv = Value; - else if(m_Prop == EQuadProp::PROP_COLOR_ENV_OFFSET) - Quad.m_ColorEnvOffset = Value; -} - -CEditorActionEditQuadPointProp::CEditorActionEditQuadPointProp(CEditor *pEditor, int GroupIndex, int LayerIndex, int QuadIndex, int PointIndex, EQuadPointProp Prop, int Previous, int Current) : - CEditorActionLayerBase(pEditor, GroupIndex, LayerIndex), m_QuadIndex(QuadIndex), m_PointIndex(PointIndex), m_Prop(Prop), m_Previous(Previous), m_Current(Current) -{ - static const char *s_apNames[] = { - "pos X", - "pos Y", - "color", - "tex U", - "tex V"}; - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Edit quad point %s property in layer %d of group %d", s_apNames[(int)m_Prop], m_LayerIndex, m_GroupIndex); -} - -void CEditorActionEditQuadPointProp::Undo() -{ - Apply(m_Previous); -} - -void CEditorActionEditQuadPointProp::Redo() -{ - Apply(m_Current); -} - -void CEditorActionEditQuadPointProp::Apply(int Value) -{ - std::shared_ptr pLayerQuads = std::static_pointer_cast(m_pLayer); - CQuad &Quad = pLayerQuads->m_vQuads[m_QuadIndex]; - - if(m_Prop == EQuadPointProp::PROP_COLOR) - { - const ColorRGBA ColorPick = ColorRGBA::UnpackAlphaLast(Value); - - Quad.m_aColors[m_PointIndex].r = ColorPick.r * 255.0f; - Quad.m_aColors[m_PointIndex].g = ColorPick.g * 255.0f; - Quad.m_aColors[m_PointIndex].b = ColorPick.b * 255.0f; - Quad.m_aColors[m_PointIndex].a = ColorPick.a * 255.0f; - - m_pEditor->m_ColorPickerPopupContext.m_RgbaColor = ColorPick; - m_pEditor->m_ColorPickerPopupContext.m_HslaColor = color_cast(ColorPick); - m_pEditor->m_ColorPickerPopupContext.m_HsvaColor = color_cast(m_pEditor->m_ColorPickerPopupContext.m_HslaColor); - } - else if(m_Prop == EQuadPointProp::PROP_TEX_U) - { - Quad.m_aTexcoords[m_PointIndex].x = Value; - } - else if(m_Prop == EQuadPointProp::PROP_TEX_V) - { - Quad.m_aTexcoords[m_PointIndex].y = Value; - } -} - -// --------------------------------------------------------------------------------------- - -CEditorActionBulk::CEditorActionBulk(CEditor *pEditor, const std::vector> &vpActions, const char *pDisplay, bool Reverse) : - IEditorAction(pEditor), m_vpActions(vpActions), m_Reverse(Reverse) -{ - // Assuming we only use bulk for actions of same type, if no display was provided - if(!pDisplay) - { - const char *pBaseDisplay = m_vpActions[0]->DisplayText(); - if(m_vpActions.size() == 1) - str_copy(m_aDisplayText, pBaseDisplay); - else - str_format(m_aDisplayText, sizeof(m_aDisplayText), "%s (x%d)", pBaseDisplay, (int)m_vpActions.size()); - } - else - { - str_copy(m_aDisplayText, pDisplay); - } -} - -void CEditorActionBulk::Undo() -{ - if(m_Reverse) - { - for(auto pIt = m_vpActions.rbegin(); pIt != m_vpActions.rend(); pIt++) - { - auto &pAction = *pIt; - pAction->Undo(); - } - } - else - { - for(auto &pAction : m_vpActions) - { - pAction->Undo(); - } - } -} - -void CEditorActionBulk::Redo() -{ - for(auto &pAction : m_vpActions) - { - pAction->Redo(); - } -} - -// --------- - -CEditorActionTileChanges::CEditorActionTileChanges(CEditor *pEditor, int GroupIndex, int LayerIndex, const char *pAction, const EditorTileStateChangeHistory &Changes) : - CEditorActionLayerBase(pEditor, GroupIndex, LayerIndex), m_Changes(Changes) -{ - ComputeInfos(); - str_format(m_aDisplayText, sizeof(m_aDisplayText), "%s (x%d)", pAction, m_TotalChanges); -} - -void CEditorActionTileChanges::Undo() -{ - Apply(true); -} - -void CEditorActionTileChanges::Redo() -{ - Apply(false); -} - -void CEditorActionTileChanges::Apply(bool Undo) -{ - auto &Map = m_pEditor->m_Map; - std::shared_ptr pLayerTiles = std::static_pointer_cast(m_pLayer); - for(auto &Change : m_Changes) - { - int y = Change.first; - auto Line = Change.second; - for(auto &Tile : Line) - { - int x = Tile.first; - STileStateChange State = Tile.second; - pLayerTiles->SetTileIgnoreHistory(x, y, Undo ? State.m_Previous : State.m_Current); - } - } - - Map.OnModify(); -} - -void CEditorActionTileChanges::ComputeInfos() -{ - m_TotalChanges = 0; - for(auto &Line : m_Changes) - m_TotalChanges += Line.second.size(); -} - -// --------- - -CEditorActionLayerBase::CEditorActionLayerBase(CEditor *pEditor, int GroupIndex, int LayerIndex) : - IEditorAction(pEditor), m_GroupIndex(GroupIndex), m_LayerIndex(LayerIndex) -{ - m_pLayer = pEditor->m_Map.m_vpGroups[GroupIndex]->m_vpLayers[LayerIndex]; -} - -// ---------- - -CEditorActionAddLayer::CEditorActionAddLayer(CEditor *pEditor, int GroupIndex, int LayerIndex, bool Duplicate) : - CEditorActionLayerBase(pEditor, GroupIndex, LayerIndex), m_Duplicate(Duplicate) -{ - str_format(m_aDisplayText, sizeof(m_aDisplayText), "%s %s layer in group %d", m_Duplicate ? "Duplicate" : "New", m_pLayer->TypeName(), m_GroupIndex); -} - -void CEditorActionAddLayer::Undo() -{ - // Undo: remove layer from vector but keep it in case we want to add it back - auto &vLayers = m_pEditor->m_Map.m_vpGroups[m_GroupIndex]->m_vpLayers; - - if(m_pLayer->m_Type == LAYERTYPE_TILES) - { - std::shared_ptr pLayerTiles = std::static_pointer_cast(m_pLayer); - if(pLayerTiles->m_Front) - m_pEditor->m_Map.m_pFrontLayer = nullptr; - else if(pLayerTiles->m_Tele) - m_pEditor->m_Map.m_pTeleLayer = nullptr; - else if(pLayerTiles->m_Speedup) - m_pEditor->m_Map.m_pSpeedupLayer = nullptr; - else if(pLayerTiles->m_Switch) - m_pEditor->m_Map.m_pSwitchLayer = nullptr; - else if(pLayerTiles->m_Tune) - m_pEditor->m_Map.m_pTuneLayer = nullptr; - } - - vLayers.erase(vLayers.begin() + m_LayerIndex); - - m_pEditor->m_Map.m_vpGroups[m_GroupIndex]->m_Collapse = false; - if(m_LayerIndex >= (int)vLayers.size()) - m_pEditor->SelectLayer(vLayers.size() - 1, m_GroupIndex); - - m_pEditor->m_Map.OnModify(); -} - -void CEditorActionAddLayer::Redo() -{ - // Redo: add back the removed layer contained in this class - auto &vLayers = m_pEditor->m_Map.m_vpGroups[m_GroupIndex]->m_vpLayers; - - if(m_pLayer->m_Type == LAYERTYPE_TILES) - { - std::shared_ptr pLayerTiles = std::static_pointer_cast(m_pLayer); - if(pLayerTiles->m_Front) - m_pEditor->m_Map.m_pFrontLayer = std::static_pointer_cast(m_pLayer); - else if(pLayerTiles->m_Tele) - m_pEditor->m_Map.m_pTeleLayer = std::static_pointer_cast(m_pLayer); - else if(pLayerTiles->m_Speedup) - m_pEditor->m_Map.m_pSpeedupLayer = std::static_pointer_cast(m_pLayer); - else if(pLayerTiles->m_Switch) - m_pEditor->m_Map.m_pSwitchLayer = std::static_pointer_cast(m_pLayer); - else if(pLayerTiles->m_Tune) - m_pEditor->m_Map.m_pTuneLayer = std::static_pointer_cast(m_pLayer); - } - - vLayers.insert(vLayers.begin() + m_LayerIndex, m_pLayer); - - m_pEditor->m_Map.m_vpGroups[m_GroupIndex]->m_Collapse = false; - m_pEditor->SelectLayer(m_LayerIndex, m_GroupIndex); - m_pEditor->m_Map.OnModify(); -} - -CEditorActionDeleteLayer::CEditorActionDeleteLayer(CEditor *pEditor, int GroupIndex, int LayerIndex) : - CEditorActionLayerBase(pEditor, GroupIndex, LayerIndex) -{ - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Delete %s layer of group %d", m_pLayer->TypeName(), m_GroupIndex); -} - -void CEditorActionDeleteLayer::Redo() -{ - // Redo: remove layer from vector but keep it in case we want to add it back - auto &vLayers = m_pEditor->m_Map.m_vpGroups[m_GroupIndex]->m_vpLayers; - - if(m_pLayer->m_Type == LAYERTYPE_TILES) - { - std::shared_ptr pLayerTiles = std::static_pointer_cast(m_pLayer); - if(pLayerTiles->m_Front) - m_pEditor->m_Map.m_pFrontLayer = nullptr; - else if(pLayerTiles->m_Tele) - m_pEditor->m_Map.m_pTeleLayer = nullptr; - else if(pLayerTiles->m_Speedup) - m_pEditor->m_Map.m_pSpeedupLayer = nullptr; - else if(pLayerTiles->m_Switch) - m_pEditor->m_Map.m_pSwitchLayer = nullptr; - else if(pLayerTiles->m_Tune) - m_pEditor->m_Map.m_pTuneLayer = nullptr; - } - - m_pEditor->m_Map.m_vpGroups[m_GroupIndex]->DeleteLayer(m_LayerIndex); - - m_pEditor->m_Map.m_vpGroups[m_GroupIndex]->m_Collapse = false; - if(m_LayerIndex >= (int)vLayers.size()) - m_pEditor->SelectLayer(vLayers.size() - 1, m_GroupIndex); - - m_pEditor->m_Map.OnModify(); -} - -void CEditorActionDeleteLayer::Undo() -{ - // Undo: add back the removed layer contained in this class - auto &vLayers = m_pEditor->m_Map.m_vpGroups[m_GroupIndex]->m_vpLayers; - - if(m_pLayer->m_Type == LAYERTYPE_TILES) - { - std::shared_ptr pLayerTiles = std::static_pointer_cast(m_pLayer); - if(pLayerTiles->m_Front) - m_pEditor->m_Map.m_pFrontLayer = std::static_pointer_cast(m_pLayer); - else if(pLayerTiles->m_Tele) - m_pEditor->m_Map.m_pTeleLayer = std::static_pointer_cast(m_pLayer); - else if(pLayerTiles->m_Speedup) - m_pEditor->m_Map.m_pSpeedupLayer = std::static_pointer_cast(m_pLayer); - else if(pLayerTiles->m_Switch) - m_pEditor->m_Map.m_pSwitchLayer = std::static_pointer_cast(m_pLayer); - else if(pLayerTiles->m_Tune) - m_pEditor->m_Map.m_pTuneLayer = std::static_pointer_cast(m_pLayer); - } - - vLayers.insert(vLayers.begin() + m_LayerIndex, m_pLayer); - - m_pEditor->m_Map.m_vpGroups[m_GroupIndex]->m_Collapse = false; - m_pEditor->SelectLayer(m_LayerIndex, m_GroupIndex); - m_pEditor->m_Map.OnModify(); -} - -CEditorActionGroup::CEditorActionGroup(CEditor *pEditor, int GroupIndex, bool Delete) : - IEditorAction(pEditor), m_GroupIndex(GroupIndex), m_Delete(Delete) -{ - m_pGroup = pEditor->m_Map.m_vpGroups[GroupIndex]; - if(m_Delete) - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Delete group %d", m_GroupIndex); - else - str_copy(m_aDisplayText, "New group", sizeof(m_aDisplayText)); -} - -void CEditorActionGroup::Undo() -{ - if(m_Delete) - { - // Undo: add back the group - m_pEditor->m_Map.m_vpGroups.insert(m_pEditor->m_Map.m_vpGroups.begin() + m_GroupIndex, m_pGroup); - m_pEditor->m_SelectedGroup = m_GroupIndex; - m_pEditor->m_Map.OnModify(); - } - else - { - // Undo: delete the group - m_pEditor->m_Map.DeleteGroup(m_GroupIndex); - m_pEditor->m_SelectedGroup = maximum(0, m_GroupIndex - 1); - } - - m_pEditor->m_Map.OnModify(); -} - -void CEditorActionGroup::Redo() -{ - if(!m_Delete) - { - // Redo: add back the group - m_pEditor->m_Map.m_vpGroups.insert(m_pEditor->m_Map.m_vpGroups.begin() + m_GroupIndex, m_pGroup); - m_pEditor->m_SelectedGroup = m_GroupIndex; - } - else - { - // Redo: delete the group - m_pEditor->m_Map.DeleteGroup(m_GroupIndex); - m_pEditor->m_SelectedGroup = maximum(0, m_GroupIndex - 1); - } - - m_pEditor->m_Map.OnModify(); -} - -CEditorActionEditGroupProp::CEditorActionEditGroupProp(CEditor *pEditor, int GroupIndex, EGroupProp Prop, int Previous, int Current) : - IEditorAction(pEditor), m_GroupIndex(GroupIndex), m_Prop(Prop), m_Previous(Previous), m_Current(Current) -{ - static const char *s_apNames[] = { - "order", - "pos X", - "pos Y", - "para X", - "para Y", - "use clipping", - "clip X", - "clip Y", - "clip W", - "clip H"}; - - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Edit group %d %s property", m_GroupIndex, s_apNames[(int)Prop]); -} - -void CEditorActionEditGroupProp::Undo() -{ - auto pGroup = m_pEditor->m_Map.m_vpGroups[m_GroupIndex]; - - if(m_Prop == EGroupProp::PROP_ORDER) - { - int CurrentOrder = m_Current; - bool Dir = m_Current > m_Previous; - while(CurrentOrder != m_Previous) - { - CurrentOrder = m_pEditor->m_Map.SwapGroups(CurrentOrder, Dir ? CurrentOrder - 1 : CurrentOrder + 1); - } - m_pEditor->m_SelectedGroup = m_Previous; - } - else - Apply(m_Previous); -} - -void CEditorActionEditGroupProp::Redo() -{ - auto pGroup = m_pEditor->m_Map.m_vpGroups[m_GroupIndex]; - - if(m_Prop == EGroupProp::PROP_ORDER) - { - int CurrentOrder = m_Previous; - bool Dir = m_Previous > m_Current; - while(CurrentOrder != m_Current) - { - CurrentOrder = m_pEditor->m_Map.SwapGroups(CurrentOrder, Dir ? CurrentOrder - 1 : CurrentOrder + 1); - } - m_pEditor->m_SelectedGroup = m_Current; - } - else - Apply(m_Current); -} - -void CEditorActionEditGroupProp::Apply(int Value) -{ - auto pGroup = m_pEditor->m_Map.m_vpGroups[m_GroupIndex]; - - if(m_Prop == EGroupProp::PROP_POS_X) - pGroup->m_OffsetX = Value; - if(m_Prop == EGroupProp::PROP_POS_Y) - pGroup->m_OffsetY = Value; - if(m_Prop == EGroupProp::PROP_PARA_X) - pGroup->m_ParallaxX = Value; - if(m_Prop == EGroupProp::PROP_PARA_Y) - pGroup->m_ParallaxY = Value; - if(m_Prop == EGroupProp::PROP_USE_CLIPPING) - pGroup->m_UseClipping = Value; - if(m_Prop == EGroupProp::PROP_CLIP_X) - pGroup->m_ClipX = Value; - if(m_Prop == EGroupProp::PROP_CLIP_Y) - pGroup->m_ClipY = Value; - if(m_Prop == EGroupProp::PROP_CLIP_W) - pGroup->m_ClipW = Value; - if(m_Prop == EGroupProp::PROP_CLIP_H) - pGroup->m_ClipH = Value; - - m_pEditor->m_Map.OnModify(); -} - -template -CEditorActionEditLayerPropBase::CEditorActionEditLayerPropBase(CEditor *pEditor, int GroupIndex, int LayerIndex, E Prop, int Previous, int Current) : - CEditorActionLayerBase(pEditor, GroupIndex, LayerIndex), m_Prop(Prop), m_Previous(Previous), m_Current(Current) -{ -} - -CEditorActionEditLayerProp::CEditorActionEditLayerProp(CEditor *pEditor, int GroupIndex, int LayerIndex, ELayerProp Prop, int Previous, int Current) : - CEditorActionEditLayerPropBase(pEditor, GroupIndex, LayerIndex, Prop, Previous, Current) -{ - static const char *s_apNames[] = { - "group", - "order", - "HQ"}; - - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Edit layer %d in group %d %s property", m_LayerIndex, m_GroupIndex, s_apNames[(int)m_Prop]); -} - -void CEditorActionEditLayerProp::Undo() -{ - auto pCurrentGroup = m_pEditor->m_Map.m_vpGroups[m_GroupIndex]; - - if(m_Prop == ELayerProp::PROP_ORDER) - { - m_pEditor->SelectLayer(pCurrentGroup->SwapLayers(m_Current, m_Previous)); - } - else - Apply(m_Previous); -} - -void CEditorActionEditLayerProp::Redo() -{ - auto pCurrentGroup = m_pEditor->m_Map.m_vpGroups[m_GroupIndex]; - - if(m_Prop == ELayerProp::PROP_ORDER) - { - m_pEditor->SelectLayer(pCurrentGroup->SwapLayers(m_Previous, m_Current)); - } - else - Apply(m_Current); -} - -void CEditorActionEditLayerProp::Apply(int Value) -{ - if(m_Prop == ELayerProp::PROP_GROUP) - { - auto pCurrentGroup = m_pEditor->m_Map.m_vpGroups[Value == m_Previous ? m_Current : m_Previous]; - auto pPreviousGroup = m_pEditor->m_Map.m_vpGroups[Value]; - pCurrentGroup->m_vpLayers.erase(pCurrentGroup->m_vpLayers.begin() + pCurrentGroup->m_vpLayers.size() - 1); - if(Value == m_Previous) - pPreviousGroup->m_vpLayers.insert(pPreviousGroup->m_vpLayers.begin() + m_LayerIndex, m_pLayer); - else - pPreviousGroup->m_vpLayers.push_back(m_pLayer); - m_pEditor->m_SelectedGroup = Value; - m_pEditor->SelectLayer(m_LayerIndex); - } - else if(m_Prop == ELayerProp::PROP_HQ) - { - m_pLayer->m_Flags = Value; - } - - m_pEditor->m_Map.OnModify(); -} - -CEditorActionEditLayerTilesProp::CEditorActionEditLayerTilesProp(CEditor *pEditor, int GroupIndex, int LayerIndex, ETilesProp Prop, int Previous, int Current) : - CEditorActionEditLayerPropBase(pEditor, GroupIndex, LayerIndex, Prop, Previous, Current) -{ - static const char *s_apNames[] = { - "width", - "height", - "shift", - "shift by", - "image", - "color", - "color env", - "color env offset", - "automapper", - "seed"}; - - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Edit tiles layer %d in group %d %s property", m_LayerIndex, m_GroupIndex, s_apNames[(int)Prop]); -} - -void CEditorActionEditLayerTilesProp::SetSavedLayers(const std::map> &SavedLayers) -{ - m_SavedLayers = std::map(SavedLayers); -} - -void CEditorActionEditLayerTilesProp::Undo() -{ - std::shared_ptr pLayerTiles = std::static_pointer_cast(m_pLayer); - std::shared_ptr pSavedLayerTiles = nullptr; - - if(m_Prop == ETilesProp::PROP_WIDTH || m_Prop == ETilesProp::PROP_HEIGHT) - { - if(m_Prop == ETilesProp::PROP_HEIGHT) - pLayerTiles->Resize(pLayerTiles->m_Width, m_Previous); - else if(m_Prop == ETilesProp::PROP_WIDTH) - pLayerTiles->Resize(m_Previous, pLayerTiles->m_Height); - - RestoreLayer(LAYERTYPE_TILES, pLayerTiles); - if(pLayerTiles->m_Game || pLayerTiles->m_Front || pLayerTiles->m_Switch || pLayerTiles->m_Speedup || pLayerTiles->m_Tune) - { - if(m_pEditor->m_Map.m_pFrontLayer && !pLayerTiles->m_Front) - RestoreLayer(LAYERTYPE_FRONT, m_pEditor->m_Map.m_pFrontLayer); - if(m_pEditor->m_Map.m_pTeleLayer && !pLayerTiles->m_Tele) - RestoreLayer(LAYERTYPE_TELE, m_pEditor->m_Map.m_pTeleLayer); - if(m_pEditor->m_Map.m_pSwitchLayer && !pLayerTiles->m_Switch) - RestoreLayer(LAYERTYPE_SWITCH, m_pEditor->m_Map.m_pSwitchLayer); - if(m_pEditor->m_Map.m_pSpeedupLayer && !pLayerTiles->m_Speedup) - RestoreLayer(LAYERTYPE_SPEEDUP, m_pEditor->m_Map.m_pSpeedupLayer); - if(m_pEditor->m_Map.m_pTuneLayer && !pLayerTiles->m_Tune) - RestoreLayer(LAYERTYPE_TUNE, m_pEditor->m_Map.m_pTuneLayer); - if(!pLayerTiles->m_Game) - RestoreLayer(LAYERTYPE_GAME, m_pEditor->m_Map.m_pGameLayer); - } - } - else if(m_Prop == ETilesProp::PROP_SHIFT) - { - RestoreLayer(LAYERTYPE_TILES, pLayerTiles); - } - else if(m_Prop == ETilesProp::PROP_SHIFT_BY) - { - m_pEditor->m_ShiftBy = m_Previous; - } - else if(m_Prop == ETilesProp::PROP_IMAGE) - { - if(m_Previous == -1) - { - pLayerTiles->m_Image = -1; - } - else - { - pLayerTiles->m_Image = m_Previous % m_pEditor->m_Map.m_vpImages.size(); - pLayerTiles->m_AutoMapperConfig = -1; - } - } - else if(m_Prop == ETilesProp::PROP_COLOR) - { - const ColorRGBA ColorPick = ColorRGBA::UnpackAlphaLast(m_Previous); - - pLayerTiles->m_Color.r = ColorPick.r * 255.0f; - pLayerTiles->m_Color.g = ColorPick.g * 255.0f; - pLayerTiles->m_Color.b = ColorPick.b * 255.0f; - pLayerTiles->m_Color.a = ColorPick.a * 255.0f; - - m_pEditor->m_ColorPickerPopupContext.m_RgbaColor = ColorPick; - m_pEditor->m_ColorPickerPopupContext.m_HslaColor = color_cast(ColorPick); - m_pEditor->m_ColorPickerPopupContext.m_HsvaColor = color_cast(m_pEditor->m_ColorPickerPopupContext.m_HslaColor); - } - else if(m_Prop == ETilesProp::PROP_COLOR_ENV) - { - pLayerTiles->m_ColorEnv = m_Previous; - } - else if(m_Prop == ETilesProp::PROP_COLOR_ENV_OFFSET) - { - pLayerTiles->m_ColorEnvOffset = m_Previous; - } - else if(m_Prop == ETilesProp::PROP_AUTOMAPPER) - { - pLayerTiles->m_AutoMapperConfig = m_Previous; - } - else if(m_Prop == ETilesProp::PROP_SEED) - { - pLayerTiles->m_Seed = m_Previous; - } - - m_pEditor->m_Map.OnModify(); -} - -void CEditorActionEditLayerTilesProp::Redo() -{ - std::shared_ptr pLayerTiles = std::static_pointer_cast(m_pLayer); - - if(m_Prop == ETilesProp::PROP_WIDTH || m_Prop == ETilesProp::PROP_HEIGHT) - { - if(m_Prop == ETilesProp::PROP_HEIGHT) - pLayerTiles->Resize(pLayerTiles->m_Width, m_Current); - else if(m_Prop == ETilesProp::PROP_WIDTH) - pLayerTiles->Resize(m_Current, pLayerTiles->m_Height); - - if(pLayerTiles->m_Game || pLayerTiles->m_Front || pLayerTiles->m_Switch || pLayerTiles->m_Speedup || pLayerTiles->m_Tune) - { - if(m_pEditor->m_Map.m_pFrontLayer && !pLayerTiles->m_Front) - m_pEditor->m_Map.m_pFrontLayer->Resize(pLayerTiles->m_Width, pLayerTiles->m_Height); - if(m_pEditor->m_Map.m_pTeleLayer && !pLayerTiles->m_Tele) - m_pEditor->m_Map.m_pTeleLayer->Resize(pLayerTiles->m_Width, pLayerTiles->m_Height); - if(m_pEditor->m_Map.m_pSwitchLayer && !pLayerTiles->m_Switch) - m_pEditor->m_Map.m_pSwitchLayer->Resize(pLayerTiles->m_Width, pLayerTiles->m_Height); - if(m_pEditor->m_Map.m_pSpeedupLayer && !pLayerTiles->m_Speedup) - m_pEditor->m_Map.m_pSpeedupLayer->Resize(pLayerTiles->m_Width, pLayerTiles->m_Height); - if(m_pEditor->m_Map.m_pTuneLayer && !pLayerTiles->m_Tune) - m_pEditor->m_Map.m_pTuneLayer->Resize(pLayerTiles->m_Width, pLayerTiles->m_Height); - if(!pLayerTiles->m_Game) - m_pEditor->m_Map.m_pGameLayer->Resize(pLayerTiles->m_Width, pLayerTiles->m_Height); - } - } - else if(m_Prop == ETilesProp::PROP_SHIFT) - { - pLayerTiles->Shift(m_Current); - } - else if(m_Prop == ETilesProp::PROP_SHIFT_BY) - { - m_pEditor->m_ShiftBy = m_Current; - } - else if(m_Prop == ETilesProp::PROP_IMAGE) - { - if(m_Current == -1) - { - pLayerTiles->m_Image = -1; - } - else - { - pLayerTiles->m_Image = m_Current % m_pEditor->m_Map.m_vpImages.size(); - pLayerTiles->m_AutoMapperConfig = -1; - } - } - else if(m_Prop == ETilesProp::PROP_COLOR) - { - const ColorRGBA ColorPick = ColorRGBA::UnpackAlphaLast(m_Current); - - pLayerTiles->m_Color.r = ColorPick.r * 255.0f; - pLayerTiles->m_Color.g = ColorPick.g * 255.0f; - pLayerTiles->m_Color.b = ColorPick.b * 255.0f; - pLayerTiles->m_Color.a = ColorPick.a * 255.0f; - - m_pEditor->m_ColorPickerPopupContext.m_RgbaColor = ColorPick; - m_pEditor->m_ColorPickerPopupContext.m_HslaColor = color_cast(ColorPick); - m_pEditor->m_ColorPickerPopupContext.m_HsvaColor = color_cast(m_pEditor->m_ColorPickerPopupContext.m_HslaColor); - } - else if(m_Prop == ETilesProp::PROP_COLOR_ENV) - { - pLayerTiles->m_ColorEnv = m_Current; - } - else if(m_Prop == ETilesProp::PROP_COLOR_ENV_OFFSET) - { - pLayerTiles->m_ColorEnvOffset = m_Current; - } - else if(m_Prop == ETilesProp::PROP_AUTOMAPPER) - { - pLayerTiles->m_AutoMapperConfig = m_Current; - } - else if(m_Prop == ETilesProp::PROP_SEED) - { - pLayerTiles->m_Seed = m_Current; - } - - m_pEditor->m_Map.OnModify(); -} - -void CEditorActionEditLayerTilesProp::RestoreLayer(int Layer, const std::shared_ptr &pLayerTiles) -{ - if(m_SavedLayers[Layer] != nullptr) - { - std::shared_ptr pSavedLayerTiles = std::static_pointer_cast(m_SavedLayers[Layer]); - mem_copy(pLayerTiles->m_pTiles, pSavedLayerTiles->m_pTiles, (size_t)pLayerTiles->m_Width * pLayerTiles->m_Height * sizeof(CTile)); - - if(pLayerTiles->m_Tele) - { - std::shared_ptr pLayerTele = std::static_pointer_cast(pLayerTiles); - std::shared_ptr pSavedLayerTele = std::static_pointer_cast(pSavedLayerTiles); - mem_copy(pLayerTele->m_pTeleTile, pSavedLayerTele->m_pTeleTile, (size_t)pLayerTiles->m_Width * pLayerTiles->m_Height * sizeof(CTeleTile)); - } - else if(pLayerTiles->m_Speedup) - { - std::shared_ptr pLayerSpeedup = std::static_pointer_cast(pLayerTiles); - std::shared_ptr pSavedLayerSpeedup = std::static_pointer_cast(pSavedLayerTiles); - mem_copy(pLayerSpeedup->m_pSpeedupTile, pSavedLayerSpeedup->m_pSpeedupTile, (size_t)pLayerTiles->m_Width * pLayerTiles->m_Height * sizeof(CSpeedupTile)); - } - else if(pLayerTiles->m_Switch) - { - std::shared_ptr pLayerSwitch = std::static_pointer_cast(pLayerTiles); - std::shared_ptr pSavedLayerSwitch = std::static_pointer_cast(pSavedLayerTiles); - mem_copy(pLayerSwitch->m_pSwitchTile, pSavedLayerSwitch->m_pSwitchTile, (size_t)pLayerTiles->m_Width * pLayerTiles->m_Height * sizeof(CSwitchTile)); - } - else if(pLayerTiles->m_Tune) - { - std::shared_ptr pLayerTune = std::static_pointer_cast(pLayerTiles); - std::shared_ptr pSavedLayerTune = std::static_pointer_cast(pSavedLayerTiles); - mem_copy(pLayerTune->m_pTuneTile, pSavedLayerTune->m_pTuneTile, (size_t)pLayerTiles->m_Width * pLayerTiles->m_Height * sizeof(CTuneTile)); - } - } -} - -CEditorActionEditLayerQuadsProp::CEditorActionEditLayerQuadsProp(CEditor *pEditor, int GroupIndex, int LayerIndex, ELayerQuadsProp Prop, int Previous, int Current) : - CEditorActionEditLayerPropBase(pEditor, GroupIndex, LayerIndex, Prop, Previous, Current) -{ - static const char *s_apNames[] = { - "image"}; - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Edit quads layer %d in group %d %s property", m_LayerIndex, m_GroupIndex, s_apNames[(int)m_Prop]); -} - -void CEditorActionEditLayerQuadsProp::Undo() -{ - Apply(m_Previous); -} - -void CEditorActionEditLayerQuadsProp::Redo() -{ - Apply(m_Current); -} - -void CEditorActionEditLayerQuadsProp::Apply(int Value) -{ - std::shared_ptr pLayerQuads = std::static_pointer_cast(m_pLayer); - if(m_Prop == ELayerQuadsProp::PROP_IMAGE) - { - if(Value >= 0) - pLayerQuads->m_Image = Value % m_pEditor->m_Map.m_vpImages.size(); - else - pLayerQuads->m_Image = -1; - } - - m_pEditor->m_Map.OnModify(); -} - -// -------------------------------------------------------------- - -CEditorActionEditLayersGroupAndOrder::CEditorActionEditLayersGroupAndOrder(CEditor *pEditor, int GroupIndex, const std::vector &LayerIndices, int NewGroupIndex, const std::vector &NewLayerIndices) : - IEditorAction(pEditor), m_GroupIndex(GroupIndex), m_LayerIndices(LayerIndices), m_NewGroupIndex(NewGroupIndex), m_NewLayerIndices(NewLayerIndices) -{ - std::sort(m_LayerIndices.begin(), m_LayerIndices.end()); - std::sort(m_NewLayerIndices.begin(), m_NewLayerIndices.end()); - - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Edit layers group and order (x%d)", (int)m_LayerIndices.size()); -} - -void CEditorActionEditLayersGroupAndOrder::Undo() -{ - // Undo : restore group and order - auto &Map = m_pEditor->m_Map; - auto &pCurrentGroup = Map.m_vpGroups[m_NewGroupIndex]; - auto &pPreviousGroup = Map.m_vpGroups[m_GroupIndex]; - std::vector> vpLayers; - vpLayers.reserve(m_NewLayerIndices.size()); - for(auto &LayerIndex : m_NewLayerIndices) - vpLayers.push_back(pCurrentGroup->m_vpLayers[LayerIndex]); - - int k = 0; - for(auto &pLayer : vpLayers) - { - pCurrentGroup->m_vpLayers.erase(std::find(pCurrentGroup->m_vpLayers.begin(), pCurrentGroup->m_vpLayers.end(), pLayer)); - pPreviousGroup->m_vpLayers.insert(pPreviousGroup->m_vpLayers.begin() + m_LayerIndices[k++], pLayer); - } - - m_pEditor->m_vSelectedLayers = m_LayerIndices; - m_pEditor->m_SelectedGroup = m_GroupIndex; -} - -void CEditorActionEditLayersGroupAndOrder::Redo() -{ - // Redo : move layers - auto &Map = m_pEditor->m_Map; - auto &pCurrentGroup = Map.m_vpGroups[m_GroupIndex]; - auto &pPreviousGroup = Map.m_vpGroups[m_NewGroupIndex]; - std::vector> vpLayers; - vpLayers.reserve(m_LayerIndices.size()); - for(auto &LayerIndex : m_LayerIndices) - vpLayers.push_back(pCurrentGroup->m_vpLayers[LayerIndex]); - - int k = 0; - for(auto &pLayer : vpLayers) - { - pCurrentGroup->m_vpLayers.erase(std::find(pCurrentGroup->m_vpLayers.begin(), pCurrentGroup->m_vpLayers.end(), pLayer)); - pPreviousGroup->m_vpLayers.insert(pPreviousGroup->m_vpLayers.begin() + m_NewLayerIndices[k++], pLayer); - } - - m_pEditor->m_vSelectedLayers = m_NewLayerIndices; - m_pEditor->m_SelectedGroup = m_NewGroupIndex; -} - -// ----------------------------------- - -CEditorActionAppendMap::CEditorActionAppendMap(CEditor *pEditor, const char *pMapName, const SPrevInfo &PrevInfo, std::vector &vImageIndexMap) : - IEditorAction(pEditor), m_PrevInfo(PrevInfo), m_vImageIndexMap(vImageIndexMap) -{ - str_copy(m_aMapName, pMapName); - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Append %s", m_aMapName); -} - -void CEditorActionAppendMap::Undo() -{ - auto &Map = m_pEditor->m_Map; - // Undo append: - // - delete added groups - // - delete added envelopes - // - delete added images - // - delete added sounds - - // Delete added groups - while((int)Map.m_vpGroups.size() != m_PrevInfo.m_Groups) - { - Map.m_vpGroups.pop_back(); - } - - // Delete added envelopes - while((int)Map.m_vpEnvelopes.size() != m_PrevInfo.m_Envelopes) - { - Map.m_vpEnvelopes.pop_back(); - } - - // Delete added sounds - while((int)Map.m_vpSounds.size() != m_PrevInfo.m_Sounds) - { - Map.m_vpSounds.pop_back(); - } - - // Delete added images - // Images are sorted when appending, so we need to revert sorting before deleting the images - if(!m_vImageIndexMap.empty()) - { - std::vector vReverseIndexMap; - vReverseIndexMap.resize(m_vImageIndexMap.size()); - - for(int k = 0; k < (int)m_vImageIndexMap.size(); k++) - vReverseIndexMap[m_vImageIndexMap[k]] = k; - - std::vector> vpRevertedImages; - vpRevertedImages.resize(Map.m_vpImages.size()); - - for(int k = 0; k < (int)vReverseIndexMap.size(); k++) - { - vpRevertedImages[vReverseIndexMap[k]] = Map.m_vpImages[k]; - } - Map.m_vpImages = vpRevertedImages; - - Map.ModifyImageIndex([vReverseIndexMap](int *pIndex) { - if(*pIndex >= 0) - { - *pIndex = vReverseIndexMap[*pIndex]; - } - }); - } - - while((int)Map.m_vpImages.size() != m_PrevInfo.m_Images) - { - Map.m_vpImages.pop_back(); - } -} - -void CEditorActionAppendMap::Redo() -{ - // Redo is just re-appending the same map - m_pEditor->Append(m_aMapName, IStorage::TYPE_ALL, true); -} - -// --------------------------- - -CEditorActionTileArt::CEditorActionTileArt(CEditor *pEditor, int PreviousImageCount, const char *pTileArtFile, std::vector &vImageIndexMap) : - IEditorAction(pEditor), m_PreviousImageCount(PreviousImageCount), m_vImageIndexMap(vImageIndexMap) -{ - str_copy(m_aTileArtFile, pTileArtFile); - str_copy(m_aDisplayText, "Tile art"); -} - -void CEditorActionTileArt::Undo() -{ - auto &Map = m_pEditor->m_Map; - - // Delete added group - Map.m_vpGroups.pop_back(); - - // Delete added images - // Images are sorted when appending, so we need to revert sorting before deleting the images - if(!m_vImageIndexMap.empty()) - { - std::vector vReverseIndexMap; - vReverseIndexMap.resize(m_vImageIndexMap.size()); - - for(int k = 0; k < (int)m_vImageIndexMap.size(); k++) - vReverseIndexMap[m_vImageIndexMap[k]] = k; - - std::vector> vpRevertedImages; - vpRevertedImages.resize(Map.m_vpImages.size()); - - for(int k = 0; k < (int)vReverseIndexMap.size(); k++) - { - vpRevertedImages[vReverseIndexMap[k]] = Map.m_vpImages[k]; - } - Map.m_vpImages = vpRevertedImages; - - Map.ModifyImageIndex([vReverseIndexMap](int *pIndex) { - if(*pIndex >= 0) - { - *pIndex = vReverseIndexMap[*pIndex]; - } - }); - } - - while((int)Map.m_vpImages.size() != m_PreviousImageCount) - { - Map.m_vpImages.pop_back(); - } -} - -void CEditorActionTileArt::Redo() -{ - if(!m_pEditor->Graphics()->LoadPng(m_pEditor->m_TileartImageInfo, m_aTileArtFile, IStorage::TYPE_ALL)) - { - m_pEditor->ShowFileDialogError("Failed to load image from file '%s'.", m_aTileArtFile); - return; - } - - IStorage::StripPathAndExtension(m_aTileArtFile, m_pEditor->m_aTileartFilename, sizeof(m_pEditor->m_aTileartFilename)); - m_pEditor->AddTileart(true); -} - -// --------------------------------- - -CEditorCommandAction::CEditorCommandAction(CEditor *pEditor, EType Type, int *pSelectedCommandIndex, int CommandIndex, const char *pPreviousCommand, const char *pCurrentCommand) : - IEditorAction(pEditor), m_Type(Type), m_pSelectedCommandIndex(pSelectedCommandIndex), m_CommandIndex(CommandIndex) -{ - if(pPreviousCommand != nullptr) - m_PreviousCommand = std::string(pPreviousCommand); - if(pCurrentCommand != nullptr) - m_CurrentCommand = std::string(pCurrentCommand); - - switch(m_Type) - { - case EType::ADD: - str_copy(m_aDisplayText, "Add command"); - break; - case EType::EDIT: - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Edit command %d", m_CommandIndex); - break; - case EType::DELETE: - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Delete command %d", m_CommandIndex); - break; - case EType::MOVE_UP: - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Move command %d up", m_CommandIndex); - break; - case EType::MOVE_DOWN: - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Move command %d down", m_CommandIndex); - break; - default: - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Edit command %d", m_CommandIndex); - break; - } -} - -void CEditorCommandAction::Undo() -{ - auto &Map = m_pEditor->m_Map; - switch(m_Type) - { - case EType::DELETE: - { - Map.m_vSettings.insert(Map.m_vSettings.begin() + m_CommandIndex, m_PreviousCommand.c_str()); - *m_pSelectedCommandIndex = m_CommandIndex; - break; - } - case EType::ADD: - { - Map.m_vSettings.erase(Map.m_vSettings.begin() + m_CommandIndex); - *m_pSelectedCommandIndex = Map.m_vSettings.size() - 1; - break; - } - case EType::EDIT: - { - str_copy(Map.m_vSettings[m_CommandIndex].m_aCommand, m_PreviousCommand.c_str()); - *m_pSelectedCommandIndex = m_CommandIndex; - break; - } - case EType::MOVE_DOWN: - { - std::swap(Map.m_vSettings[m_CommandIndex], Map.m_vSettings[m_CommandIndex + 1]); - *m_pSelectedCommandIndex = m_CommandIndex; - break; - } - case EType::MOVE_UP: - { - std::swap(Map.m_vSettings[m_CommandIndex], Map.m_vSettings[m_CommandIndex - 1]); - *m_pSelectedCommandIndex = m_CommandIndex; - break; - } - } -} - -void CEditorCommandAction::Redo() -{ - auto &Map = m_pEditor->m_Map; - switch(m_Type) - { - case EType::DELETE: - { - Map.m_vSettings.erase(Map.m_vSettings.begin() + m_CommandIndex); - *m_pSelectedCommandIndex = Map.m_vSettings.size() - 1; - break; - } - case EType::ADD: - { - Map.m_vSettings.insert(Map.m_vSettings.begin() + m_CommandIndex, m_PreviousCommand.c_str()); - *m_pSelectedCommandIndex = m_CommandIndex; - break; - } - case EType::EDIT: - { - str_copy(Map.m_vSettings[m_CommandIndex].m_aCommand, m_CurrentCommand.c_str()); - *m_pSelectedCommandIndex = m_CommandIndex; - break; - } - case EType::MOVE_DOWN: - { - std::swap(Map.m_vSettings[m_CommandIndex], Map.m_vSettings[m_CommandIndex + 1]); - *m_pSelectedCommandIndex = m_CommandIndex; - break; - } - case EType::MOVE_UP: - { - std::swap(Map.m_vSettings[m_CommandIndex], Map.m_vSettings[m_CommandIndex - 1]); - *m_pSelectedCommandIndex = m_CommandIndex; - break; - } - } -} - -// ------------------------------------------------ - -CEditorActionEnvelopeAdd::CEditorActionEnvelopeAdd(CEditor *pEditor, const std::shared_ptr &pEnv) : - IEditorAction(pEditor), m_pEnv(pEnv) -{ - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Add new %s envelope", pEnv->Type() == CEnvelope::EType::COLOR ? "color" : (pEnv->Type() == CEnvelope::EType::POSITION ? "position" : "sound")); -} - -void CEditorActionEnvelopeAdd::Undo() -{ - // Undo is removing the envelope, which was added at the back of the list - m_pEditor->m_Map.m_vpEnvelopes.pop_back(); - m_pEditor->m_SelectedEnvelope = m_pEditor->m_Map.m_vpEnvelopes.size() - 1; -} - -void CEditorActionEnvelopeAdd::Redo() -{ - // Redo is adding back at the back the saved envelope - m_pEditor->m_Map.m_vpEnvelopes.push_back(m_pEnv); - m_pEditor->m_SelectedEnvelope = m_pEditor->m_Map.m_vpEnvelopes.size() - 1; -} - -CEditorActionEveloppeDelete::CEditorActionEveloppeDelete(CEditor *pEditor, int EnvelopeIndex) : - IEditorAction(pEditor), m_EnvelopeIndex(EnvelopeIndex), m_pEnv(pEditor->m_Map.m_vpEnvelopes[EnvelopeIndex]) -{ - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Delete envelope %d", m_EnvelopeIndex); -} - -void CEditorActionEveloppeDelete::Undo() -{ - // Undo is adding back the envelope - m_pEditor->m_Map.m_vpEnvelopes.insert(m_pEditor->m_Map.m_vpEnvelopes.begin() + m_EnvelopeIndex, m_pEnv); - m_pEditor->m_SelectedEnvelope = m_EnvelopeIndex; -} - -void CEditorActionEveloppeDelete::Redo() -{ - // Redo is erasing the same envelope index - m_pEditor->m_Map.m_vpEnvelopes.erase(m_pEditor->m_Map.m_vpEnvelopes.begin() + m_EnvelopeIndex); - if(m_pEditor->m_SelectedEnvelope >= (int)m_pEditor->m_Map.m_vpEnvelopes.size()) - m_pEditor->m_SelectedEnvelope = m_pEditor->m_Map.m_vpEnvelopes.size() - 1; -} - -CEditorActionEnvelopeEdit::CEditorActionEnvelopeEdit(CEditor *pEditor, int EnvelopeIndex, EEditType EditType, int Previous, int Current) : - IEditorAction(pEditor), m_EnvelopeIndex(EnvelopeIndex), m_EditType(EditType), m_Previous(Previous), m_Current(Current), m_pEnv(pEditor->m_Map.m_vpEnvelopes[EnvelopeIndex]) -{ - static const char *s_apNames[] = { - "sync", - "order"}; - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Edit envelope %d %s", m_EnvelopeIndex, s_apNames[(int)m_EditType]); -} - -void CEditorActionEnvelopeEdit::Undo() -{ - switch(m_EditType) - { - case EEditType::ORDER: - { - m_pEditor->m_Map.SwapEnvelopes(m_Current, m_Previous); - break; - } - case EEditType::SYNC: - { - m_pEnv->m_Synchronized = m_Previous; - break; - } - } - m_pEditor->m_Map.OnModify(); - m_pEditor->m_SelectedEnvelope = m_EnvelopeIndex; -} - -void CEditorActionEnvelopeEdit::Redo() -{ - switch(m_EditType) - { - case EEditType::ORDER: - { - m_pEditor->m_Map.SwapEnvelopes(m_Previous, m_Current); - break; - } - case EEditType::SYNC: - { - m_pEnv->m_Synchronized = m_Current; - break; - } - } - m_pEditor->m_Map.OnModify(); - m_pEditor->m_SelectedEnvelope = m_EnvelopeIndex; -} - -CEditorActionEnvelopeEditPoint::CEditorActionEnvelopeEditPoint(CEditor *pEditor, int EnvelopeIndex, int PointIndex, int Channel, EEditType EditType, int Previous, int Current) : - IEditorAction(pEditor), m_EnvelopeIndex(EnvelopeIndex), m_PointIndex(PointIndex), m_Channel(Channel), m_EditType(EditType), m_Previous(Previous), m_Current(Current), m_pEnv(pEditor->m_Map.m_vpEnvelopes[EnvelopeIndex]) -{ - static const char *s_apNames[] = { - "time", - "value", - "curve type"}; - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Edit %s of point %d (channel %d) of env %d", s_apNames[(int)m_EditType], m_PointIndex, m_Channel, m_EnvelopeIndex); -} - -void CEditorActionEnvelopeEditPoint::Undo() -{ - Apply(m_Previous); -} - -void CEditorActionEnvelopeEditPoint::Redo() -{ - Apply(m_Current); -} - -void CEditorActionEnvelopeEditPoint::Apply(int Value) -{ - if(m_EditType == EEditType::TIME) - { - m_pEnv->m_vPoints[m_PointIndex].m_Time = Value; - } - else if(m_EditType == EEditType::VALUE) - { - m_pEnv->m_vPoints[m_PointIndex].m_aValues[m_Channel] = Value; - - if(m_pEnv->GetChannels() == 4) - { - auto *pValues = m_pEnv->m_vPoints[m_PointIndex].m_aValues; - const ColorRGBA Color = ColorRGBA(fx2f(pValues[0]), fx2f(pValues[1]), fx2f(pValues[2]), fx2f(pValues[3])); - - m_pEditor->m_ColorPickerPopupContext.m_RgbaColor = Color; - m_pEditor->m_ColorPickerPopupContext.m_HslaColor = color_cast(Color); - m_pEditor->m_ColorPickerPopupContext.m_HsvaColor = color_cast(m_pEditor->m_ColorPickerPopupContext.m_HslaColor); - } - } - else if(m_EditType == EEditType::CURVE_TYPE) - { - m_pEnv->m_vPoints[m_PointIndex].m_Curvetype = Value; - } - - m_pEditor->m_Map.OnModify(); -} - -// ---- - -CEditorActionEditEnvelopePointValue::CEditorActionEditEnvelopePointValue(CEditor *pEditor, int EnvIndex, int PointIndex, int Channel, EType Type, int OldTime, int OldValue, int NewTime, int NewValue) : - IEditorAction(pEditor), m_EnvIndex(EnvIndex), m_PtIndex(PointIndex), m_Channel(Channel), m_Type(Type), m_OldTime(OldTime), m_OldValue(OldValue), m_NewTime(NewTime), m_NewValue(NewValue) -{ - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Edit point %d%s value (envelope %d, channel %d)", PointIndex, m_Type == EType::TANGENT_IN ? "tangent in" : (m_Type == EType::TANGENT_OUT ? "tangent out" : ""), m_EnvIndex, m_Channel); -} - -void CEditorActionEditEnvelopePointValue::Undo() -{ - Apply(true); -} - -void CEditorActionEditEnvelopePointValue::Redo() -{ - Apply(false); -} - -void CEditorActionEditEnvelopePointValue::Apply(bool Undo) -{ - float CurrentValue = fx2f(Undo ? m_OldValue : m_NewValue); - float CurrentTime = (Undo ? m_OldTime : m_NewTime) / 1000.0f; - - std::shared_ptr pEnvelope = m_pEditor->m_Map.m_vpEnvelopes[m_EnvIndex]; - if(m_Type == EType::TANGENT_IN) - { - pEnvelope->m_vPoints[m_PtIndex].m_Bezier.m_aInTangentDeltaX[m_Channel] = minimum(CurrentTime * 1000.0f - pEnvelope->m_vPoints[m_PtIndex].m_Time, 0); - pEnvelope->m_vPoints[m_PtIndex].m_Bezier.m_aInTangentDeltaY[m_Channel] = f2fx(CurrentValue) - pEnvelope->m_vPoints[m_PtIndex].m_aValues[m_Channel]; - } - else if(m_Type == EType::TANGENT_OUT) - { - pEnvelope->m_vPoints[m_PtIndex].m_Bezier.m_aOutTangentDeltaX[m_Channel] = maximum(CurrentTime * 1000.0f - pEnvelope->m_vPoints[m_PtIndex].m_Time, 0); - pEnvelope->m_vPoints[m_PtIndex].m_Bezier.m_aOutTangentDeltaY[m_Channel] = f2fx(CurrentValue) - pEnvelope->m_vPoints[m_PtIndex].m_aValues[m_Channel]; - } - else - { - if(pEnvelope->GetChannels() == 1 || pEnvelope->GetChannels() == 4) - CurrentValue = clamp(CurrentValue, 0.0f, 1.0f); - pEnvelope->m_vPoints[m_PtIndex].m_aValues[m_Channel] = f2fx(CurrentValue); - - if(m_PtIndex != 0) - { - pEnvelope->m_vPoints[m_PtIndex].m_Time = CurrentTime * 1000.0f; - - if(pEnvelope->m_vPoints[m_PtIndex].m_Time < pEnvelope->m_vPoints[m_PtIndex - 1].m_Time) - pEnvelope->m_vPoints[m_PtIndex].m_Time = pEnvelope->m_vPoints[m_PtIndex - 1].m_Time + 1; - if(static_cast(m_PtIndex) + 1 != pEnvelope->m_vPoints.size() && pEnvelope->m_vPoints[m_PtIndex].m_Time > pEnvelope->m_vPoints[m_PtIndex + 1].m_Time) - pEnvelope->m_vPoints[m_PtIndex].m_Time = pEnvelope->m_vPoints[m_PtIndex + 1].m_Time - 1; - } - else - { - pEnvelope->m_vPoints[m_PtIndex].m_Time = 0.0f; - } - } - - m_pEditor->m_Map.OnModify(); - m_pEditor->m_UpdateEnvPointInfo = true; -} - -// --------------------- - -CEditorActionResetEnvelopePointTangent::CEditorActionResetEnvelopePointTangent(CEditor *pEditor, int EnvIndex, int PointIndex, int Channel, bool In) : - IEditorAction(pEditor), m_EnvIndex(EnvIndex), m_PointIndex(PointIndex), m_Channel(Channel), m_In(In) -{ - std::shared_ptr pEnvelope = pEditor->m_Map.m_vpEnvelopes[EnvIndex]; - if(In) - { - m_Previous[0] = pEnvelope->m_vPoints[PointIndex].m_Bezier.m_aInTangentDeltaX[Channel]; - m_Previous[1] = pEnvelope->m_vPoints[PointIndex].m_Bezier.m_aInTangentDeltaY[Channel]; - } - else - { - m_Previous[0] = pEnvelope->m_vPoints[PointIndex].m_Bezier.m_aOutTangentDeltaX[Channel]; - m_Previous[1] = pEnvelope->m_vPoints[PointIndex].m_Bezier.m_aOutTangentDeltaY[Channel]; - } - - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Reset point %d of env %d tangent %s", m_PointIndex, m_EnvIndex, m_In ? "in" : "out"); -} - -void CEditorActionResetEnvelopePointTangent::Undo() -{ - std::shared_ptr pEnvelope = m_pEditor->m_Map.m_vpEnvelopes[m_EnvIndex]; - if(m_In) - { - pEnvelope->m_vPoints[m_PointIndex].m_Bezier.m_aInTangentDeltaX[m_Channel] = m_Previous[0]; - pEnvelope->m_vPoints[m_PointIndex].m_Bezier.m_aInTangentDeltaY[m_Channel] = m_Previous[1]; - } - else - { - pEnvelope->m_vPoints[m_PointIndex].m_Bezier.m_aOutTangentDeltaX[m_Channel] = m_Previous[0]; - pEnvelope->m_vPoints[m_PointIndex].m_Bezier.m_aOutTangentDeltaY[m_Channel] = m_Previous[1]; - } - m_pEditor->m_Map.OnModify(); -} - -void CEditorActionResetEnvelopePointTangent::Redo() -{ - std::shared_ptr pEnvelope = m_pEditor->m_Map.m_vpEnvelopes[m_EnvIndex]; - if(m_In) - { - pEnvelope->m_vPoints[m_PointIndex].m_Bezier.m_aInTangentDeltaX[m_Channel] = 0.0f; - pEnvelope->m_vPoints[m_PointIndex].m_Bezier.m_aInTangentDeltaY[m_Channel] = 0.0f; - } - else - { - pEnvelope->m_vPoints[m_PointIndex].m_Bezier.m_aOutTangentDeltaX[m_Channel] = 0.0f; - pEnvelope->m_vPoints[m_PointIndex].m_Bezier.m_aOutTangentDeltaY[m_Channel] = 0.0f; - } - m_pEditor->m_Map.OnModify(); -} - -// ------------------ - -CEditorActionAddEnvelopePoint::CEditorActionAddEnvelopePoint(CEditor *pEditor, int EnvIndex, int Time, ColorRGBA Channels) : - IEditorAction(pEditor), m_EnvIndex(EnvIndex), m_Time(Time), m_Channels(Channels) -{ - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Add new point in envelope %d at time %f", m_EnvIndex, Time / 1000.0); -} - -void CEditorActionAddEnvelopePoint::Undo() -{ - // Delete added point - auto pEnvelope = m_pEditor->m_Map.m_vpEnvelopes[m_EnvIndex]; - auto pIt = std::find_if(pEnvelope->m_vPoints.begin(), pEnvelope->m_vPoints.end(), [this](const CEnvPoint_runtime &Point) { - return Point.m_Time == m_Time; - }); - if(pIt != pEnvelope->m_vPoints.end()) - { - pEnvelope->m_vPoints.erase(pIt); - } - - m_pEditor->m_Map.OnModify(); -} - -void CEditorActionAddEnvelopePoint::Redo() -{ - auto pEnvelope = m_pEditor->m_Map.m_vpEnvelopes[m_EnvIndex]; - pEnvelope->AddPoint(m_Time, - f2fx(m_Channels.r), f2fx(m_Channels.g), - f2fx(m_Channels.b), f2fx(m_Channels.a)); - - m_pEditor->m_Map.OnModify(); -} - -CEditorActionDeleteEnvelopePoint::CEditorActionDeleteEnvelopePoint(CEditor *pEditor, int EnvIndex, int PointIndex) : - IEditorAction(pEditor), m_EnvIndex(EnvIndex), m_PointIndex(PointIndex), m_Point(pEditor->m_Map.m_vpEnvelopes[EnvIndex]->m_vPoints[PointIndex]) -{ - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Delete point %d of envelope %d", m_PointIndex, m_EnvIndex); -} - -void CEditorActionDeleteEnvelopePoint::Undo() -{ - std::shared_ptr pEnvelope = m_pEditor->m_Map.m_vpEnvelopes[m_EnvIndex]; - pEnvelope->m_vPoints.insert(pEnvelope->m_vPoints.begin() + m_PointIndex, m_Point); - - m_pEditor->m_Map.OnModify(); -} - -void CEditorActionDeleteEnvelopePoint::Redo() -{ - std::shared_ptr pEnvelope = m_pEditor->m_Map.m_vpEnvelopes[m_EnvIndex]; - pEnvelope->m_vPoints.erase(pEnvelope->m_vPoints.begin() + m_PointIndex); - - auto pSelectedPointIt = std::find_if(m_pEditor->m_vSelectedEnvelopePoints.begin(), m_pEditor->m_vSelectedEnvelopePoints.end(), [this](const std::pair Pair) { - return Pair.first == m_PointIndex; - }); - - if(pSelectedPointIt != m_pEditor->m_vSelectedEnvelopePoints.end()) - m_pEditor->m_vSelectedEnvelopePoints.erase(pSelectedPointIt); - - m_pEditor->m_Map.OnModify(); -} - -// ------------------------------- - -CEditorActionEditLayerSoundsProp::CEditorActionEditLayerSoundsProp(CEditor *pEditor, int GroupIndex, int LayerIndex, ELayerSoundsProp Prop, int Previous, int Current) : - CEditorActionEditLayerPropBase(pEditor, GroupIndex, LayerIndex, Prop, Previous, Current) -{ - static const char *s_apNames[] = { - "sound"}; - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Edit sounds layer %d in group %d %s property", m_LayerIndex, m_GroupIndex, s_apNames[(int)m_Prop]); -} - -void CEditorActionEditLayerSoundsProp::Undo() -{ - Apply(m_Previous); -} - -void CEditorActionEditLayerSoundsProp::Redo() -{ - Apply(m_Current); -} - -void CEditorActionEditLayerSoundsProp::Apply(int Value) -{ - std::shared_ptr pLayerSounds = std::static_pointer_cast(m_pLayer); - if(m_Prop == ELayerSoundsProp::PROP_SOUND) - { - if(Value >= 0) - pLayerSounds->m_Sound = Value % m_pEditor->m_Map.m_vpSounds.size(); - else - pLayerSounds->m_Sound = -1; - } - - m_pEditor->m_Map.OnModify(); -} - -// --- - -CEditorActionDeleteSoundSource::CEditorActionDeleteSoundSource(CEditor *pEditor, int GroupIndex, int LayerIndex, int SourceIndex) : - CEditorActionLayerBase(pEditor, GroupIndex, LayerIndex), m_SourceIndex(SourceIndex) -{ - std::shared_ptr pLayerSounds = std::static_pointer_cast(m_pLayer); - m_Source = pLayerSounds->m_vSources[SourceIndex]; - - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Delete sound source %d in layer %d of group %d", SourceIndex, LayerIndex, GroupIndex); -} - -void CEditorActionDeleteSoundSource::Undo() -{ - std::shared_ptr pLayerSounds = std::static_pointer_cast(m_pLayer); - pLayerSounds->m_vSources.insert(pLayerSounds->m_vSources.begin() + m_SourceIndex, m_Source); - m_pEditor->m_SelectedSource = m_SourceIndex; - m_pEditor->m_Map.OnModify(); -} - -void CEditorActionDeleteSoundSource::Redo() -{ - std::shared_ptr pLayerSounds = std::static_pointer_cast(m_pLayer); - pLayerSounds->m_vSources.erase(pLayerSounds->m_vSources.begin() + m_SourceIndex); - m_pEditor->m_SelectedSource--; - m_pEditor->m_Map.OnModify(); -} - -// --------------- - -CEditorActionEditSoundSource::CEditorActionEditSoundSource(CEditor *pEditor, int GroupIndex, int LayerIndex, int SourceIndex, EEditType Type, int Value) : - CEditorActionLayerBase(pEditor, GroupIndex, LayerIndex), m_SourceIndex(SourceIndex), m_EditType(Type), m_CurrentValue(Value), m_pSavedObject(nullptr) -{ - Save(); - - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Edit sound source %d in layer %d of group %d", SourceIndex, LayerIndex, GroupIndex); -} - -void CEditorActionEditSoundSource::Undo() -{ - std::shared_ptr pLayerSounds = std::static_pointer_cast(m_pLayer); - CSoundSource *pSource = &pLayerSounds->m_vSources[m_SourceIndex]; - - if(m_EditType == EEditType::SHAPE) - { - CSoundShape *pSavedShape = (CSoundShape *)m_pSavedObject; - pSource->m_Shape.m_Type = pSavedShape->m_Type; - - // set default values - switch(pSource->m_Shape.m_Type) - { - case CSoundShape::SHAPE_CIRCLE: - { - pSource->m_Shape.m_Circle.m_Radius = pSavedShape->m_Circle.m_Radius; - break; - } - case CSoundShape::SHAPE_RECTANGLE: - { - pSource->m_Shape.m_Rectangle.m_Width = pSavedShape->m_Rectangle.m_Width; - pSource->m_Shape.m_Rectangle.m_Height = pSavedShape->m_Rectangle.m_Height; - break; - } - } - } - - m_pEditor->m_Map.OnModify(); -} - -void CEditorActionEditSoundSource::Redo() -{ - std::shared_ptr pLayerSounds = std::static_pointer_cast(m_pLayer); - CSoundSource *pSource = &pLayerSounds->m_vSources[m_SourceIndex]; - - if(m_EditType == EEditType::SHAPE) - { - pSource->m_Shape.m_Type = m_CurrentValue; - - // set default values - switch(pSource->m_Shape.m_Type) - { - case CSoundShape::SHAPE_CIRCLE: - { - pSource->m_Shape.m_Circle.m_Radius = 1000.0f; - break; - } - case CSoundShape::SHAPE_RECTANGLE: - { - pSource->m_Shape.m_Rectangle.m_Width = f2fx(1000.0f); - pSource->m_Shape.m_Rectangle.m_Height = f2fx(800.0f); - break; - } - } - } - - m_pEditor->m_Map.OnModify(); -} - -void CEditorActionEditSoundSource::Save() -{ - std::shared_ptr pLayerSounds = std::static_pointer_cast(m_pLayer); - CSoundSource *pSource = &pLayerSounds->m_vSources[m_SourceIndex]; - - if(m_EditType == EEditType::SHAPE) - { - CSoundShape *pShapeInfo = new CSoundShape; - pShapeInfo->m_Type = pSource->m_Shape.m_Type; - - switch(pSource->m_Shape.m_Type) - { - case CSoundShape::SHAPE_CIRCLE: - { - pShapeInfo->m_Circle.m_Radius = pSource->m_Shape.m_Circle.m_Radius; - break; - } - case CSoundShape::SHAPE_RECTANGLE: - { - pShapeInfo->m_Rectangle.m_Width = pSource->m_Shape.m_Rectangle.m_Width; - pShapeInfo->m_Rectangle.m_Height = pSource->m_Shape.m_Rectangle.m_Height; - break; - } - } - - m_pSavedObject = pShapeInfo; - } -} - -CEditorActionEditSoundSource::~CEditorActionEditSoundSource() -{ - if(m_EditType == EEditType::SHAPE) - { - CSoundShape *pSavedShape = (CSoundShape *)m_pSavedObject; - delete pSavedShape; - } -} - -// ----- - -CEditorActionEditSoundSourceProp::CEditorActionEditSoundSourceProp(CEditor *pEditor, int GroupIndex, int LayerIndex, int SourceIndex, ESoundProp Prop, int Previous, int Current) : - CEditorActionEditLayerPropBase(pEditor, GroupIndex, LayerIndex, Prop, Previous, Current), m_SourceIndex(SourceIndex) -{ - static const char *s_apNames[] = { - "pos X", - "pos Y", - "loop", - "pan", - "time delay", - "falloff", - "pos env", - "pos env offset", - "sound env", - "sound env offset"}; - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Edit sound source %d in layer %d of group %d %s property", SourceIndex, LayerIndex, GroupIndex, s_apNames[(int)Prop]); -} - -void CEditorActionEditSoundSourceProp::Undo() -{ - Apply(m_Previous); -} - -void CEditorActionEditSoundSourceProp::Redo() -{ - Apply(m_Current); -} - -void CEditorActionEditSoundSourceProp::Apply(int Value) -{ - std::shared_ptr pLayerSounds = std::static_pointer_cast(m_pLayer); - CSoundSource *pSource = &pLayerSounds->m_vSources[m_SourceIndex]; - - if(m_Prop == ESoundProp::PROP_POS_X) - { - pSource->m_Position.x = Value; - } - else if(m_Prop == ESoundProp::PROP_POS_Y) - { - pSource->m_Position.y = Value; - } - else if(m_Prop == ESoundProp::PROP_LOOP) - { - pSource->m_Loop = Value; - } - else if(m_Prop == ESoundProp::PROP_PAN) - { - pSource->m_Pan = Value; - } - else if(m_Prop == ESoundProp::PROP_TIME_DELAY) - { - pSource->m_TimeDelay = Value; - } - else if(m_Prop == ESoundProp::PROP_FALLOFF) - { - pSource->m_Falloff = Value; - } - else if(m_Prop == ESoundProp::PROP_POS_ENV) - { - pSource->m_PosEnv = Value; - } - else if(m_Prop == ESoundProp::PROP_POS_ENV_OFFSET) - { - pSource->m_PosEnvOffset = Value; - } - else if(m_Prop == ESoundProp::PROP_SOUND_ENV) - { - pSource->m_SoundEnv = Value; - } - else if(m_Prop == ESoundProp::PROP_SOUND_ENV_OFFSET) - { - pSource->m_SoundEnvOffset = Value; - } - - m_pEditor->m_Map.OnModify(); -} - -CEditorActionEditRectSoundSourceShapeProp::CEditorActionEditRectSoundSourceShapeProp(CEditor *pEditor, int GroupIndex, int LayerIndex, int SourceIndex, ERectangleShapeProp Prop, int Previous, int Current) : - CEditorActionEditLayerPropBase(pEditor, GroupIndex, LayerIndex, Prop, Previous, Current), m_SourceIndex(SourceIndex) -{ - static const char *s_apNames[] = { - "width", - "height"}; - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Edit sound source %d in layer %d of group %d sound shape %s property", m_SourceIndex, m_LayerIndex, m_GroupIndex, s_apNames[(int)Prop]); -} - -void CEditorActionEditRectSoundSourceShapeProp::Undo() -{ - Apply(m_Previous); -} - -void CEditorActionEditRectSoundSourceShapeProp::Redo() -{ - Apply(m_Current); -} - -void CEditorActionEditRectSoundSourceShapeProp::Apply(int Value) -{ - std::shared_ptr pLayerSounds = std::static_pointer_cast(m_pLayer); - CSoundSource *pSource = &pLayerSounds->m_vSources[m_SourceIndex]; - - if(m_Prop == ERectangleShapeProp::PROP_RECTANGLE_WIDTH) - { - pSource->m_Shape.m_Rectangle.m_Width = Value; - } - else if(m_Prop == ERectangleShapeProp::PROP_RECTANGLE_HEIGHT) - { - pSource->m_Shape.m_Rectangle.m_Height = Value; - } - - m_pEditor->m_Map.OnModify(); -} - -CEditorActionEditCircleSoundSourceShapeProp::CEditorActionEditCircleSoundSourceShapeProp(CEditor *pEditor, int GroupIndex, int LayerIndex, int SourceIndex, ECircleShapeProp Prop, int Previous, int Current) : - CEditorActionEditLayerPropBase(pEditor, GroupIndex, LayerIndex, Prop, Previous, Current), m_SourceIndex(SourceIndex) -{ - static const char *s_apNames[] = { - "radius"}; - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Edit sound source %d in layer %d of group %d sound shape %s property", m_SourceIndex, m_LayerIndex, m_GroupIndex, s_apNames[(int)Prop]); -} - -void CEditorActionEditCircleSoundSourceShapeProp::Undo() -{ - Apply(m_Previous); -} - -void CEditorActionEditCircleSoundSourceShapeProp::Redo() -{ - Apply(m_Current); -} - -void CEditorActionEditCircleSoundSourceShapeProp::Apply(int Value) -{ - std::shared_ptr pLayerSounds = std::static_pointer_cast(m_pLayer); - CSoundSource *pSource = &pLayerSounds->m_vSources[m_SourceIndex]; - - if(m_Prop == ECircleShapeProp::PROP_CIRCLE_RADIUS) - { - pSource->m_Shape.m_Circle.m_Radius = Value; - } - - m_pEditor->m_Map.OnModify(); -} - -// -------------------------- - -CEditorActionNewEmptySound::CEditorActionNewEmptySound(CEditor *pEditor, int GroupIndex, int LayerIndex, int x, int y) : - CEditorActionLayerBase(pEditor, GroupIndex, LayerIndex), m_X(x), m_Y(y) -{ - str_format(m_aDisplayText, sizeof(m_aDisplayText), "New sound in layer %d of group %d", LayerIndex, GroupIndex); -} - -void CEditorActionNewEmptySound::Undo() -{ - // Undo is simply deleting the added source - std::shared_ptr pLayerSounds = std::static_pointer_cast(m_pLayer); - pLayerSounds->m_vSources.pop_back(); - - m_pEditor->m_Map.OnModify(); -} - -void CEditorActionNewEmptySound::Redo() -{ - auto &Map = m_pEditor->m_Map; - std::shared_ptr pLayerSounds = std::static_pointer_cast(m_pLayer); - pLayerSounds->NewSource(m_X, m_Y); - - Map.OnModify(); -} - -CEditorActionNewEmptyQuad::CEditorActionNewEmptyQuad(CEditor *pEditor, int GroupIndex, int LayerIndex, int x, int y) : - CEditorActionLayerBase(pEditor, GroupIndex, LayerIndex), m_X(x), m_Y(y) -{ - str_format(m_aDisplayText, sizeof(m_aDisplayText), "New quad in layer %d of group %d", LayerIndex, GroupIndex); -} - -void CEditorActionNewEmptyQuad::Undo() -{ - // Undo is simply deleting the added quad - std::shared_ptr pLayerQuads = std::static_pointer_cast(m_pLayer); - pLayerQuads->m_vQuads.pop_back(); - - m_pEditor->m_Map.OnModify(); -} - -void CEditorActionNewEmptyQuad::Redo() -{ - auto &Map = m_pEditor->m_Map; - std::shared_ptr pLayerQuads = std::static_pointer_cast(m_pLayer); - - int Width = 64; - int Height = 64; - if(pLayerQuads->m_Image >= 0) - { - Width = Map.m_vpImages[pLayerQuads->m_Image]->m_Width; - Height = Map.m_vpImages[pLayerQuads->m_Image]->m_Height; - } - - pLayerQuads->NewQuad(m_X, m_Y, Width, Height); - - Map.OnModify(); -} - -// ------------- - -CEditorActionNewQuad::CEditorActionNewQuad(CEditor *pEditor, int GroupIndex, int LayerIndex) : - CEditorActionLayerBase(pEditor, GroupIndex, LayerIndex) -{ - std::shared_ptr pLayerQuads = std::static_pointer_cast(m_pLayer); - m_Quad = pLayerQuads->m_vQuads[pLayerQuads->m_vQuads.size() - 1]; - - str_format(m_aDisplayText, sizeof(m_aDisplayText), "New quad in layer %d of group %d", LayerIndex, GroupIndex); -} - -void CEditorActionNewQuad::Undo() -{ - std::shared_ptr pLayerQuads = std::static_pointer_cast(m_pLayer); - pLayerQuads->m_vQuads.pop_back(); -} - -void CEditorActionNewQuad::Redo() -{ - std::shared_ptr pLayerQuads = std::static_pointer_cast(m_pLayer); - pLayerQuads->m_vQuads.emplace_back(m_Quad); -} - -// -------------- - -CEditorActionMoveSoundSource::CEditorActionMoveSoundSource(CEditor *pEditor, int GroupIndex, int LayerIndex, int SourceIndex, CPoint OriginalPosition, CPoint CurrentPosition) : - CEditorActionLayerBase(pEditor, GroupIndex, LayerIndex), m_SourceIndex(SourceIndex), m_OriginalPosition(OriginalPosition), m_CurrentPosition(CurrentPosition) -{ - str_format(m_aDisplayText, sizeof(m_aDisplayText), "Move sound source %d of layer %d in group %d", SourceIndex, LayerIndex, GroupIndex); -} - -void CEditorActionMoveSoundSource::Undo() -{ - dbg_assert(m_pLayer->m_Type == LAYERTYPE_SOUNDS, "Layer type does not match a sound layer"); - std::static_pointer_cast(m_pLayer)->m_vSources[m_SourceIndex].m_Position = m_OriginalPosition; -} - -void CEditorActionMoveSoundSource::Redo() -{ - dbg_assert(m_pLayer->m_Type == LAYERTYPE_SOUNDS, "Layer type does not match a sound layer"); - std::static_pointer_cast(m_pLayer)->m_vSources[m_SourceIndex].m_Position = m_CurrentPosition; -} diff --git a/src/game/editor/editor_actions.h b/src/game/editor/editor_actions.h deleted file mode 100644 index 688a342176..0000000000 --- a/src/game/editor/editor_actions.h +++ /dev/null @@ -1,662 +0,0 @@ -#ifndef GAME_EDITOR_EDITOR_ACTIONS_H -#define GAME_EDITOR_EDITOR_ACTIONS_H - -#include "editor.h" -#include "editor_action.h" - -class CEditorActionLayerBase : public IEditorAction -{ -public: - CEditorActionLayerBase(CEditor *pEditor, int GroupIndex, int LayerIndex); - - virtual void Undo() override {} - virtual void Redo() override {} - -protected: - int m_GroupIndex; - int m_LayerIndex; - std::shared_ptr m_pLayer; -}; - -class CEditorBrushDrawAction : public IEditorAction -{ -public: - CEditorBrushDrawAction(CEditor *pEditor, int Group); - - void Undo() override; - void Redo() override; - bool IsEmpty() override; - -private: - int m_Group; - // m_vTileChanges is a list of changes for each layer that was modified. - // The std::pair is used to pair one layer (index) with its history (2D map). - // EditorTileStateChangeHistory is a 2D map, storing a change item at a specific y,x position. - std::vector>> m_vTileChanges; - EditorTileStateChangeHistory m_TeleTileChanges; - EditorTileStateChangeHistory m_SpeedupTileChanges; - EditorTileStateChangeHistory m_SwitchTileChanges; - EditorTileStateChangeHistory m_TuneTileChanges; - - int m_TotalTilesDrawn; - int m_TotalLayers; - - void Apply(bool Undo); - void SetInfos(); -}; - -// --------------------------------------------------------- - -class CEditorActionQuadPlace : public CEditorActionLayerBase -{ -public: - CEditorActionQuadPlace(CEditor *pEditor, int GroupIndex, int LayerIndex, std::vector &vBrush); - - void Undo() override; - void Redo() override; - -private: - std::vector m_vBrush; -}; - -class CEditorActionSoundPlace : public CEditorActionLayerBase -{ -public: - CEditorActionSoundPlace(CEditor *pEditor, int GroupIndex, int LayerIndex, std::vector &vBrush); - - void Undo() override; - void Redo() override; - -private: - std::vector m_vBrush; -}; - -// ------------------------------------------------------------- - -class CEditorActionDeleteQuad : public CEditorActionLayerBase -{ -public: - CEditorActionDeleteQuad(CEditor *pEditor, int GroupIndex, int LayerIndex, std::vector const &vQuadsIndices, std::vector const &vDeletedQuads); - - void Undo() override; - void Redo() override; - -private: - std::vector m_vQuadsIndices; - std::vector m_vDeletedQuads; -}; - -// ------------------------------------------------------------- - -class CEditorActionEditQuadPoint : public CEditorActionLayerBase -{ -public: - CEditorActionEditQuadPoint(CEditor *pEditor, int GroupIndex, int LayerIndex, int QuadIndex, std::vector const &vPreviousPoints, std::vector const &vCurrentPoints); - - void Undo() override; - void Redo() override; - -private: - int m_QuadIndex; - std::vector m_vPreviousPoints; - std::vector m_vCurrentPoints; -}; - -class CEditorActionEditQuadProp : public CEditorActionLayerBase -{ -public: - CEditorActionEditQuadProp(CEditor *pEditor, int GroupIndex, int LayerIndex, int QuadIndex, EQuadProp Prop, int Previous, int Current); - - void Undo() override; - void Redo() override; - -private: - int m_QuadIndex; - EQuadProp m_Prop; - int m_Previous; - int m_Current; - - void Apply(int Value); -}; - -class CEditorActionEditQuadPointProp : public CEditorActionLayerBase -{ -public: - CEditorActionEditQuadPointProp(CEditor *pEditor, int GroupIndex, int LayerIndex, int QuadIndex, int PointIndex, EQuadPointProp Prop, int Previous, int Current); - - void Undo() override; - void Redo() override; - -private: - int m_QuadIndex; - int m_PointIndex; - EQuadPointProp m_Prop; - int m_Previous; - int m_Current; - - void Apply(int Value); -}; - -// ------------------------------------------------------------- - -class CEditorActionBulk : public IEditorAction -{ -public: - CEditorActionBulk(CEditor *pEditor, const std::vector> &vpActions, const char *pDisplay = nullptr, bool Reverse = false); - - void Undo() override; - void Redo() override; - -private: - std::vector> m_vpActions; - std::string m_Display; - bool m_Reverse; -}; - -// - -class CEditorActionTileChanges : public CEditorActionLayerBase -{ -public: - CEditorActionTileChanges(CEditor *pEditor, int GroupIndex, int LayerIndex, const char *pAction, const EditorTileStateChangeHistory &Changes); - - void Undo() override; - void Redo() override; - -private: - EditorTileStateChangeHistory m_Changes; - int m_TotalChanges; - - void ComputeInfos(); - void Apply(bool Undo); -}; - -// ------------------------------------------------------------- - -class CEditorActionAddLayer : public CEditorActionLayerBase -{ -public: - CEditorActionAddLayer(CEditor *pEditor, int GroupIndex, int LayerIndex, bool Duplicate = false); - - void Undo() override; - void Redo() override; - -private: - bool m_Duplicate; -}; - -class CEditorActionDeleteLayer : public CEditorActionLayerBase -{ -public: - CEditorActionDeleteLayer(CEditor *pEditor, int GroupIndex, int LayerIndex); - - void Undo() override; - void Redo() override; -}; - -class CEditorActionGroup : public IEditorAction -{ -public: - CEditorActionGroup(CEditor *pEditor, int GroupIndex, bool Delete); - - void Undo() override; - void Redo() override; - -private: - int m_GroupIndex; - bool m_Delete; - std::shared_ptr m_pGroup; -}; - -class CEditorActionEditGroupProp : public IEditorAction -{ -public: - CEditorActionEditGroupProp(CEditor *pEditor, int GroupIndex, EGroupProp Prop, int Previous, int Current); - - void Undo() override; - void Redo() override; - -private: - int m_GroupIndex; - EGroupProp m_Prop; - int m_Previous; - int m_Current; - - void Apply(int Value); -}; - -template -class CEditorActionEditLayerPropBase : public CEditorActionLayerBase -{ -public: - CEditorActionEditLayerPropBase(CEditor *pEditor, int GroupIndex, int LayerIndex, E Prop, int Previous, int Current); - - virtual void Undo() override {} - virtual void Redo() override {} - -protected: - E m_Prop; - int m_Previous; - int m_Current; -}; - -class CEditorActionEditLayerProp : public CEditorActionEditLayerPropBase -{ -public: - CEditorActionEditLayerProp(CEditor *pEditor, int GroupIndex, int LayerIndex, ELayerProp Prop, int Previous, int Current); - - void Undo() override; - void Redo() override; - -private: - void Apply(int Value); -}; - -class CEditorActionEditLayerTilesProp : public CEditorActionEditLayerPropBase -{ -public: - CEditorActionEditLayerTilesProp(CEditor *pEditor, int GroupIndex, int LayerIndex, ETilesProp Prop, int Previous, int Current); - - void Undo() override; - void Redo() override; - - void SetSavedLayers(const std::map> &SavedLayers); - -private: - std::map> m_SavedLayers; - - void RestoreLayer(int Layer, const std::shared_ptr &pLayerTiles); -}; - -class CEditorActionEditLayerQuadsProp : public CEditorActionEditLayerPropBase -{ -public: - CEditorActionEditLayerQuadsProp(CEditor *pEditor, int GroupIndex, int LayerIndex, ELayerQuadsProp Prop, int Previous, int Current); - - void Undo() override; - void Redo() override; - -private: - void Apply(int Value); -}; - -class CEditorActionEditLayersGroupAndOrder : public IEditorAction -{ -public: - CEditorActionEditLayersGroupAndOrder(CEditor *pEditor, int GroupIndex, const std::vector &LayerIndices, int NewGroupIndex, const std::vector &NewLayerIndices); - - void Undo() override; - void Redo() override; - -private: - int m_GroupIndex; - std::vector m_LayerIndices; - int m_NewGroupIndex; - std::vector m_NewLayerIndices; -}; - -// -------------- - -class CEditorActionAppendMap : public IEditorAction -{ -public: - struct SPrevInfo - { - int m_Groups; - int m_Images; - int m_Sounds; - int m_Envelopes; - }; - -public: - CEditorActionAppendMap(CEditor *pEditor, const char *pMapName, const SPrevInfo &PrevInfo, std::vector &vImageIndexMap); - - void Undo() override; - void Redo() override; - -private: - char m_aMapName[IO_MAX_PATH_LENGTH]; - SPrevInfo m_PrevInfo; - std::vector m_vImageIndexMap; -}; - -// -------------- - -class CEditorActionTileArt : public IEditorAction -{ -public: - CEditorActionTileArt(CEditor *pEditor, int PreviousImageCount, const char *pTileArtFile, std::vector &vImageIndexMap); - - void Undo() override; - void Redo() override; - -private: - int m_PreviousImageCount; - char m_aTileArtFile[IO_MAX_PATH_LENGTH]; - std::vector m_vImageIndexMap; -}; - -// ---------------------- - -class CEditorCommandAction : public IEditorAction -{ -public: - enum class EType - { - DELETE, - ADD, - EDIT, - MOVE_UP, - MOVE_DOWN - }; - - CEditorCommandAction(CEditor *pEditor, EType Type, int *pSelectedCommandIndex, int CommandIndex, const char *pPreviousCommand = nullptr, const char *pCurrentCommand = nullptr); - - void Undo() override; - void Redo() override; - -private: - EType m_Type; - int *m_pSelectedCommandIndex; - int m_CommandIndex; - std::string m_PreviousCommand; - std::string m_CurrentCommand; -}; - -// ------------------------------ - -class CEditorActionEnvelopeAdd : public IEditorAction -{ -public: - CEditorActionEnvelopeAdd(CEditor *pEditor, const std::shared_ptr &pEnv); - - void Undo() override; - void Redo() override; - -private: - std::shared_ptr m_pEnv; -}; - -class CEditorActionEveloppeDelete : public IEditorAction -{ -public: - CEditorActionEveloppeDelete(CEditor *pEditor, int EnvelopeIndex); - - void Undo() override; - void Redo() override; - -private: - int m_EnvelopeIndex; - std::shared_ptr m_pEnv; -}; - -class CEditorActionEnvelopeEdit : public IEditorAction -{ -public: - enum class EEditType - { - SYNC, - ORDER - }; - - CEditorActionEnvelopeEdit(CEditor *pEditor, int EnvelopeIndex, EEditType EditType, int Previous, int Current); - - void Undo() override; - void Redo() override; - -private: - int m_EnvelopeIndex; - EEditType m_EditType; - int m_Previous; - int m_Current; - std::shared_ptr m_pEnv; -}; - -class CEditorActionEnvelopeEditPoint : public IEditorAction -{ -public: - enum class EEditType - { - TIME, - VALUE, - CURVE_TYPE, - HANDLE - }; - - CEditorActionEnvelopeEditPoint(CEditor *pEditor, int EnvelopeIndex, int PointIndex, int Channel, EEditType EditType, int Previous, int Current); - - void Undo() override; - void Redo() override; - -private: - int m_EnvelopeIndex; - int m_PointIndex; - int m_Channel; - EEditType m_EditType; - int m_Previous; - int m_Current; - std::shared_ptr m_pEnv; - - void Apply(int Value); -}; - -class CEditorActionAddEnvelopePoint : public IEditorAction -{ -public: - CEditorActionAddEnvelopePoint(CEditor *pEditor, int EnvIndex, int Time, ColorRGBA Channels); - - void Undo() override; - void Redo() override; - -private: - int m_EnvIndex; - int m_Time; - ColorRGBA m_Channels; -}; - -class CEditorActionDeleteEnvelopePoint : public IEditorAction -{ -public: - CEditorActionDeleteEnvelopePoint(CEditor *pEditor, int EnvIndex, int PointIndex); - - void Undo() override; - void Redo() override; - -private: - int m_EnvIndex; - int m_PointIndex; - CEnvPoint_runtime m_Point; -}; - -class CEditorActionEditEnvelopePointValue : public IEditorAction -{ -public: - enum class EType - { - TANGENT_IN, - TANGENT_OUT, - POINT - }; - - CEditorActionEditEnvelopePointValue(CEditor *pEditor, int EnvIndex, int PointIndex, int Channel, EType Type, int OldTime, int OldValue, int NewTime, int NewValue); - - void Undo() override; - void Redo() override; - -private: - int m_EnvIndex; - int m_PtIndex; - int m_Channel; - EType m_Type; - int m_OldTime; - int m_OldValue; - int m_NewTime; - int m_NewValue; - - void Apply(bool Undo); -}; - -class CEditorActionResetEnvelopePointTangent : public IEditorAction -{ -public: - CEditorActionResetEnvelopePointTangent(CEditor *pEditor, int EnvIndex, int PointIndex, int Channel, bool In); - - void Undo() override; - void Redo() override; - -private: - int m_EnvIndex; - int m_PointIndex; - int m_Channel; - bool m_In; - int m_Previous[2]; -}; - -class CEditorActionEditLayerSoundsProp : public CEditorActionEditLayerPropBase -{ -public: - CEditorActionEditLayerSoundsProp(CEditor *pEditor, int GroupIndex, int LayerIndex, ELayerSoundsProp Prop, int Previous, int Current); - - void Undo() override; - void Redo() override; - -private: - void Apply(int Value); -}; - -class CEditorActionDeleteSoundSource : public CEditorActionLayerBase -{ -public: - CEditorActionDeleteSoundSource(CEditor *pEditor, int GroupIndex, int LayerIndex, int SourceIndex); - - void Undo() override; - void Redo() override; - -private: - int m_SourceIndex; - CSoundSource m_Source; -}; - -class CEditorActionEditSoundSource : public CEditorActionLayerBase -{ -public: - enum class EEditType - { - SHAPE - }; - - CEditorActionEditSoundSource(CEditor *pEditor, int GroupIndex, int LayerIndex, int SourceIndex, EEditType Type, int Value); - ~CEditorActionEditSoundSource() override; - - void Undo() override; - void Redo() override; - -private: - int m_SourceIndex; - EEditType m_EditType; - int m_CurrentValue; - - std::vector m_vOriginalValues; - void *m_pSavedObject; - - void Save(); -}; - -class CEditorActionEditSoundSourceProp : public CEditorActionEditLayerPropBase -{ -public: - CEditorActionEditSoundSourceProp(CEditor *pEditor, int GroupIndex, int LayerIndex, int SourceIndex, ESoundProp Prop, int Previous, int Current); - - void Undo() override; - void Redo() override; - -private: - int m_SourceIndex; - -private: - void Apply(int Value); -}; - -class CEditorActionEditRectSoundSourceShapeProp : public CEditorActionEditLayerPropBase -{ -public: - CEditorActionEditRectSoundSourceShapeProp(CEditor *pEditor, int GroupIndex, int LayerIndex, int SourceIndex, ERectangleShapeProp Prop, int Previous, int Current); - - void Undo() override; - void Redo() override; - -private: - int m_SourceIndex; - -private: - void Apply(int Value); -}; - -class CEditorActionEditCircleSoundSourceShapeProp : public CEditorActionEditLayerPropBase -{ -public: - CEditorActionEditCircleSoundSourceShapeProp(CEditor *pEditor, int GroupIndex, int LayerIndex, int SourceIndex, ECircleShapeProp Prop, int Previous, int Current); - - void Undo() override; - void Redo() override; - -private: - int m_SourceIndex; - -private: - void Apply(int Value); -}; - -class CEditorActionNewEmptySound : public CEditorActionLayerBase -{ -public: - CEditorActionNewEmptySound(CEditor *pEditor, int GroupIndex, int LayerIndex, int x, int y); - - void Undo() override; - void Redo() override; - -private: - int m_X; - int m_Y; -}; - -class CEditorActionNewEmptyQuad : public CEditorActionLayerBase -{ -public: - CEditorActionNewEmptyQuad(CEditor *pEditor, int GroupIndex, int LayerIndex, int x, int y); - - void Undo() override; - void Redo() override; - -private: - int m_X; - int m_Y; -}; - -class CEditorActionNewQuad : public CEditorActionLayerBase -{ -public: - CEditorActionNewQuad(CEditor *pEditor, int GroupIndex, int LayerIndex); - - void Undo() override; - void Redo() override; - -private: - CQuad m_Quad; -}; - -class CEditorActionMoveSoundSource : public CEditorActionLayerBase -{ -public: - CEditorActionMoveSoundSource(CEditor *pEditor, int GroupIndex, int LayerIndex, int SourceIndex, CPoint OriginalPosition, CPoint CurrentPosition); - - void Undo() override; - void Redo() override; - -private: - int m_SourceIndex; - CPoint m_OriginalPosition; - CPoint m_CurrentPosition; -}; - -#endif diff --git a/src/game/editor/editor_history.cpp b/src/game/editor/editor_history.cpp deleted file mode 100644 index f020d42b12..0000000000 --- a/src/game/editor/editor_history.cpp +++ /dev/null @@ -1,95 +0,0 @@ -#include - -#include "editor.h" -#include "editor_actions.h" -#include "editor_history.h" - -void CEditorHistory::RecordAction(const std::shared_ptr &pAction) -{ - RecordAction(pAction, nullptr); -} - -void CEditorHistory::Execute(const std::shared_ptr &pAction, const char *pDisplay) -{ - pAction->Redo(); - RecordAction(pAction, pDisplay); -} - -void CEditorHistory::RecordAction(const std::shared_ptr &pAction, const char *pDisplay) -{ - if(m_IsBulk) - { - m_vpBulkActions.push_back(pAction); - return; - } - - m_vpRedoActions.clear(); - - if((int)m_vpUndoActions.size() >= g_Config.m_ClEditorMaxHistory) - { - m_vpUndoActions.pop_front(); - } - - if(pDisplay == nullptr) - m_vpUndoActions.emplace_back(pAction); - else - m_vpUndoActions.emplace_back(std::make_shared(m_pEditor, std::vector>{pAction}, pDisplay)); -} - -bool CEditorHistory::Undo() -{ - if(m_vpUndoActions.empty()) - return false; - - auto pLastAction = m_vpUndoActions.back(); - m_vpUndoActions.pop_back(); - - pLastAction->Undo(); - - m_vpRedoActions.emplace_back(pLastAction); - return true; -} - -bool CEditorHistory::Redo() -{ - if(m_vpRedoActions.empty()) - return false; - - auto pLastAction = m_vpRedoActions.back(); - m_vpRedoActions.pop_back(); - - pLastAction->Redo(); - - m_vpUndoActions.emplace_back(pLastAction); - return true; -} - -void CEditorHistory::Clear() -{ - m_vpUndoActions.clear(); - m_vpRedoActions.clear(); -} - -void CEditorHistory::BeginBulk() -{ - m_IsBulk = true; - m_vpBulkActions.clear(); -} - -void CEditorHistory::EndBulk(const char *pDisplay) -{ - if(!m_IsBulk) - return; - m_IsBulk = false; - - // Record bulk action - if(!m_vpBulkActions.empty()) - RecordAction(std::make_shared(m_pEditor, m_vpBulkActions, pDisplay, true)); - - m_vpBulkActions.clear(); -} - -void CEditorHistory::EndBulk(int DisplayToUse) -{ - EndBulk((DisplayToUse < 0 || DisplayToUse >= (int)m_vpBulkActions.size()) ? nullptr : m_vpBulkActions[DisplayToUse]->DisplayText()); -} diff --git a/src/game/editor/editor_history.h b/src/game/editor/editor_history.h deleted file mode 100644 index 1a0dbf79fa..0000000000 --- a/src/game/editor/editor_history.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef GAME_EDITOR_EDITOR_HISTORY_H -#define GAME_EDITOR_EDITOR_HISTORY_H - -#include "editor_action.h" - -#include -#include -#include - -class CEditorHistory -{ -public: - CEditorHistory() - { - m_pEditor = nullptr; - m_IsBulk = false; - } - - ~CEditorHistory() - { - Clear(); - } - - void RecordAction(const std::shared_ptr &pAction); - void RecordAction(const std::shared_ptr &pAction, const char *pDisplay); - void Execute(const std::shared_ptr &pAction, const char *pDisplay = nullptr); - - bool Undo(); - bool Redo(); - - void Clear(); - bool CanUndo() const { return !m_vpUndoActions.empty(); } - bool CanRedo() const { return !m_vpRedoActions.empty(); } - - void BeginBulk(); - void EndBulk(const char *pDisplay = nullptr); - void EndBulk(int DisplayToUse); - - CEditor *m_pEditor; - std::deque> m_vpUndoActions; - std::deque> m_vpRedoActions; - -private: - std::vector> m_vpBulkActions; - bool m_IsBulk; -}; - -#endif diff --git a/src/game/editor/editor_object.cpp b/src/game/editor/editor_object.cpp deleted file mode 100644 index 2889a068f2..0000000000 --- a/src/game/editor/editor_object.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#include "editor_object.h" - -#include "editor.h" - -void CEditorObject::OnInit(CEditor *pEditor) -{ - m_pEditor = pEditor; - OnReset(); -} - -void CEditorObject::OnUpdate() -{ - if(IsActive()) - OnActive(); - else if(IsHot()) - OnHot(); -} - -bool CEditorObject::OnInput(const IInput::CEvent &Event) -{ - return false; -} - -void CEditorObject::OnRender(CUIRect View) {} - -void CEditorObject::OnReset() {} -void CEditorObject::OnMapLoad() {} - -bool CEditorObject::IsHot() -{ - return Ui()->HotItem() == this; -} - -void CEditorObject::SetHot() -{ - Ui()->SetHotItem(this); -} - -void CEditorObject::UnsetHot() -{ - if(IsHot()) - Ui()->SetHotItem(nullptr); -} - -void CEditorObject::OnHot() {} - -bool CEditorObject::IsActive() -{ - return Ui()->CheckActiveItem(this); -} - -void CEditorObject::SetActive() -{ - SetHot(); - Ui()->SetActiveItem(this); -} - -void CEditorObject::SetInactive() -{ - if(IsActive()) - Ui()->SetActiveItem(nullptr); -} - -void CEditorObject::OnActive() {} - -CEditor *CEditorObject::Editor() { return m_pEditor; } -const CEditor *CEditorObject::Editor() const { return m_pEditor; } -IInput *CEditorObject::Input() { return m_pEditor->Input(); } -IClient *CEditorObject::Client() { return m_pEditor->Client(); } -CConfig *CEditorObject::Config() { return m_pEditor->Config(); } -IConsole *CEditorObject::Console() { return m_pEditor->Console(); } -IEngine *CEditorObject::Engine() { return m_pEditor->Engine(); } -IGraphics *CEditorObject::Graphics() { return m_pEditor->Graphics(); } -ISound *CEditorObject::Sound() { return m_pEditor->Sound(); } -ITextRender *CEditorObject::TextRender() { return m_pEditor->TextRender(); } -IStorage *CEditorObject::Storage() { return m_pEditor->Storage(); } -CUi *CEditorObject::Ui() { return m_pEditor->Ui(); } -CRenderTools *CEditorObject::RenderTools() { return m_pEditor->RenderTools(); } diff --git a/src/game/editor/editor_object.h b/src/game/editor/editor_object.h deleted file mode 100644 index 59fee4b2e4..0000000000 --- a/src/game/editor/editor_object.h +++ /dev/null @@ -1,85 +0,0 @@ -#ifndef GAME_EDITOR_EDITOR_OBJECT_H -#define GAME_EDITOR_EDITOR_OBJECT_H - -#include - -#include -#include - -class CUi; -class CEditor; -class IClient; -class CConfig; -class IConsole; -class IEngine; -class IGraphics; -class ISound; -class ITextRender; -class IStorage; -class CRenderTools; - -class CEditorObject -{ -public: - virtual ~CEditorObject() = default; - - /** - * Initialise the component and interface pointers. - * Needs to be the first function that is called. - * The default implentation also resets the component. - */ - virtual void OnInit(CEditor *pEditor); - - /** - * Maybe calls `OnHot` or `OnActive`. - */ - virtual void OnUpdate(); - - /** - * Gets called before `OnRender`. Should return true - * if the event was consumed. - */ - virtual bool OnInput(const IInput::CEvent &Event); - - virtual void OnRender(CUIRect View); - - /** - * Gets called after `OnRender` when the component is hot but not active. - */ - virtual void OnHot(); - - /** - * Gets called after `OnRender` when the component is active. - */ - virtual void OnActive(); - - virtual void OnReset(); - virtual void OnMapLoad(); - - bool IsHot(); - void SetHot(); - void UnsetHot(); - - bool IsActive(); - void SetActive(); - void SetInactive(); - - CEditor *Editor(); - const CEditor *Editor() const; - IInput *Input(); - IClient *Client(); - CConfig *Config(); - IConsole *Console(); - IEngine *Engine(); - IGraphics *Graphics(); - ISound *Sound(); - ITextRender *TextRender(); - IStorage *Storage(); - CUi *Ui(); - CRenderTools *RenderTools(); - -private: - CEditor *m_pEditor; -}; - -#endif diff --git a/src/game/editor/editor_props.cpp b/src/game/editor/editor_props.cpp deleted file mode 100644 index 34d1e92e98..0000000000 --- a/src/game/editor/editor_props.cpp +++ /dev/null @@ -1,279 +0,0 @@ -#include "editor.h" - -#include - -#include -#include - -using namespace FontIcons; - -const ColorRGBA CEditor::ms_DefaultPropColor = ColorRGBA(1, 1, 1, 0.5f); - -int CEditor::DoProperties(CUIRect *pToolbox, CProperty *pProps, int *pIds, int *pNewVal, const std::vector &vColors) -{ - auto Res = DoPropertiesWithState(pToolbox, pProps, pIds, pNewVal, vColors); - return Res.m_Value; -} - -template -SEditResult CEditor::DoPropertiesWithState(CUIRect *pToolBox, CProperty *pProps, int *pIds, int *pNewVal, const std::vector &vColors) -{ - int Change = -1; - EEditState State = EEditState::NONE; - - for(int i = 0; pProps[i].m_pName; i++) - { - const ColorRGBA *pColor = i >= (int)vColors.size() ? &ms_DefaultPropColor : &vColors[i]; - - CUIRect Slot; - pToolBox->HSplitTop(13.0f, &Slot, pToolBox); - CUIRect Label, Shifter; - Slot.VSplitMid(&Label, &Shifter); - Shifter.HMargin(1.0f, &Shifter); - Ui()->DoLabel(&Label, pProps[i].m_pName, 10.0f, TEXTALIGN_ML); - - if(pProps[i].m_Type == PROPTYPE_INT) - { - CUIRect Inc, Dec; - char aBuf[64]; - - Shifter.VSplitRight(10.0f, &Shifter, &Inc); - Shifter.VSplitLeft(10.0f, &Dec, &Shifter); - str_format(aBuf, sizeof(aBuf), "%d", pProps[i].m_Value); - auto NewValueRes = UiDoValueSelector((char *)&pIds[i], &Shifter, "", pProps[i].m_Value, pProps[i].m_Min, pProps[i].m_Max, 1, 1.0f, "Use left mouse button to drag and change the value. Hold shift to be more precise. Rightclick to edit as text.", false, false, 0, pColor); - int NewValue = NewValueRes.m_Value; - if(NewValue != pProps[i].m_Value || (NewValueRes.m_State != EEditState::NONE && NewValueRes.m_State != EEditState::EDITING)) - { - *pNewVal = NewValue; - Change = i; - State = NewValueRes.m_State; - } - if(DoButton_FontIcon((char *)&pIds[i] + 1, FONT_ICON_MINUS, 0, &Dec, 0, "Decrease", IGraphics::CORNER_L, 7.0f)) - { - *pNewVal = clamp(pProps[i].m_Value - 1, pProps[i].m_Min, pProps[i].m_Max); - Change = i; - State = EEditState::ONE_GO; - } - if(DoButton_FontIcon(((char *)&pIds[i]) + 2, FONT_ICON_PLUS, 0, &Inc, 0, "Increase", IGraphics::CORNER_R, 7.0f)) - { - *pNewVal = clamp(pProps[i].m_Value + 1, pProps[i].m_Min, pProps[i].m_Max); - Change = i; - State = EEditState::ONE_GO; - } - } - else if(pProps[i].m_Type == PROPTYPE_BOOL) - { - CUIRect No, Yes; - Shifter.VSplitMid(&No, &Yes); - if(DoButton_Ex(&pIds[i], "No", !pProps[i].m_Value, &No, 0, "", IGraphics::CORNER_L)) - { - *pNewVal = 0; - Change = i; - State = EEditState::ONE_GO; - } - if(DoButton_Ex(((char *)&pIds[i]) + 1, "Yes", pProps[i].m_Value, &Yes, 0, "", IGraphics::CORNER_R)) - { - *pNewVal = 1; - Change = i; - State = EEditState::ONE_GO; - } - } - else if(pProps[i].m_Type == PROPTYPE_ANGLE_SCROLL) - { - CUIRect Inc, Dec; - Shifter.VSplitRight(10.0f, &Shifter, &Inc); - Shifter.VSplitLeft(10.0f, &Dec, &Shifter); - const bool Shift = Input()->ShiftIsPressed(); - int Step = Shift ? 1 : 45; - int Value = pProps[i].m_Value; - - auto NewValueRes = UiDoValueSelector(&pIds[i], &Shifter, "", Value, pProps[i].m_Min, pProps[i].m_Max, Shift ? 1 : 45, Shift ? 1.0f : 10.0f, "Use left mouse button to drag and change the value. Hold shift to be more precise. Rightclick to edit as text.", false, false, 0); - int NewValue = NewValueRes.m_Value; - if(DoButton_FontIcon(&pIds[i] + 1, FONT_ICON_MINUS, 0, &Dec, 0, "Decrease", IGraphics::CORNER_L, 7.0f)) - { - NewValue = (std::ceil((pProps[i].m_Value / (float)Step)) - 1) * Step; - if(NewValue < 0) - NewValue += 360; - State = EEditState::ONE_GO; - } - if(DoButton_FontIcon(&pIds[i] + 2, FONT_ICON_PLUS, 0, &Inc, 0, "Increase", IGraphics::CORNER_R, 7.0f)) - { - NewValue = (pProps[i].m_Value + Step) / Step * Step; - State = EEditState::ONE_GO; - } - - if(NewValue != pProps[i].m_Value || (NewValueRes.m_State != EEditState::NONE && NewValueRes.m_State != EEditState::EDITING)) - { - *pNewVal = NewValue % 360; - Change = i; - State = NewValueRes.m_State; - } - } - else if(pProps[i].m_Type == PROPTYPE_COLOR) - { - const auto &&SetColor = [&](ColorRGBA NewColor) { - const int NewValue = NewColor.PackAlphaLast(); - if(NewValue != pProps[i].m_Value || m_ColorPickerPopupContext.m_State != EEditState::EDITING) - { - *pNewVal = NewValue; - Change = i; - State = m_ColorPickerPopupContext.m_State; - } - }; - DoColorPickerButton(&pIds[i], &Shifter, ColorRGBA::UnpackAlphaLast(pProps[i].m_Value), SetColor); - } - else if(pProps[i].m_Type == PROPTYPE_IMAGE) - { - const char *pName; - if(pProps[i].m_Value < 0) - pName = "None"; - else - pName = m_Map.m_vpImages[pProps[i].m_Value]->m_aName; - - if(DoButton_Ex(&pIds[i], pName, 0, &Shifter, 0, nullptr, IGraphics::CORNER_ALL)) - PopupSelectImageInvoke(pProps[i].m_Value, Ui()->MouseX(), Ui()->MouseY()); - - int r = PopupSelectImageResult(); - if(r >= -1) - { - *pNewVal = r; - Change = i; - State = EEditState::ONE_GO; - } - } - else if(pProps[i].m_Type == PROPTYPE_SHIFT) - { - CUIRect Left, Right, Up, Down; - Shifter.VSplitMid(&Left, &Up, 2.0f); - Left.VSplitLeft(10.0f, &Left, &Shifter); - Shifter.VSplitRight(10.0f, &Shifter, &Right); - Shifter.Draw(ColorRGBA(1, 1, 1, 0.5f), IGraphics::CORNER_NONE, 0.0f); - Ui()->DoLabel(&Shifter, "X", 10.0f, TEXTALIGN_MC); - Up.VSplitLeft(10.0f, &Up, &Shifter); - Shifter.VSplitRight(10.0f, &Shifter, &Down); - Shifter.Draw(ColorRGBA(1, 1, 1, 0.5f), IGraphics::CORNER_NONE, 0.0f); - Ui()->DoLabel(&Shifter, "Y", 10.0f, TEXTALIGN_MC); - if(DoButton_FontIcon(&pIds[i], FONT_ICON_MINUS, 0, &Left, 0, "Left", IGraphics::CORNER_L, 7.0f)) - { - *pNewVal = DIRECTION_LEFT; - Change = i; - State = EEditState::ONE_GO; - } - if(DoButton_FontIcon(((char *)&pIds[i]) + 3, FONT_ICON_PLUS, 0, &Right, 0, "Right", IGraphics::CORNER_R, 7.0f)) - { - *pNewVal = DIRECTION_RIGHT; - Change = i; - State = EEditState::ONE_GO; - } - if(DoButton_FontIcon(((char *)&pIds[i]) + 1, FONT_ICON_MINUS, 0, &Up, 0, "Up", IGraphics::CORNER_L, 7.0f)) - { - *pNewVal = DIRECTION_UP; - Change = i; - State = EEditState::ONE_GO; - } - if(DoButton_FontIcon(((char *)&pIds[i]) + 2, FONT_ICON_PLUS, 0, &Down, 0, "Down", IGraphics::CORNER_R, 7.0f)) - { - *pNewVal = DIRECTION_DOWN; - Change = i; - State = EEditState::ONE_GO; - } - } - else if(pProps[i].m_Type == PROPTYPE_SOUND) - { - const char *pName; - if(pProps[i].m_Value < 0) - pName = "None"; - else - pName = m_Map.m_vpSounds[pProps[i].m_Value]->m_aName; - - if(DoButton_Ex(&pIds[i], pName, 0, &Shifter, 0, nullptr, IGraphics::CORNER_ALL)) - PopupSelectSoundInvoke(pProps[i].m_Value, Ui()->MouseX(), Ui()->MouseY()); - - int r = PopupSelectSoundResult(); - if(r >= -1) - { - *pNewVal = r; - Change = i; - State = EEditState::ONE_GO; - } - } - else if(pProps[i].m_Type == PROPTYPE_AUTOMAPPER) - { - const char *pName; - if(pProps[i].m_Value < 0 || pProps[i].m_Min < 0 || pProps[i].m_Min >= (int)m_Map.m_vpImages.size()) - pName = "None"; - else - pName = m_Map.m_vpImages[pProps[i].m_Min]->m_AutoMapper.GetConfigName(pProps[i].m_Value); - - if(DoButton_Ex(&pIds[i], pName, 0, &Shifter, 0, nullptr, IGraphics::CORNER_ALL)) - PopupSelectConfigAutoMapInvoke(pProps[i].m_Value, Ui()->MouseX(), Ui()->MouseY()); - - int r = PopupSelectConfigAutoMapResult(); - if(r >= -1) - { - *pNewVal = r; - Change = i; - State = EEditState::ONE_GO; - } - } - else if(pProps[i].m_Type == PROPTYPE_ENVELOPE) - { - CUIRect Inc, Dec; - char aBuf[8]; - int CurValue = pProps[i].m_Value; - - Shifter.VSplitRight(10.0f, &Shifter, &Inc); - Shifter.VSplitLeft(10.0f, &Dec, &Shifter); - - if(CurValue <= 0) - str_copy(aBuf, "None:"); - else if(m_Map.m_vpEnvelopes[CurValue - 1]->m_aName[0]) - { - str_format(aBuf, sizeof(aBuf), "%s:", m_Map.m_vpEnvelopes[CurValue - 1]->m_aName); - if(!str_endswith(aBuf, ":")) - { - aBuf[sizeof(aBuf) - 2] = ':'; - aBuf[sizeof(aBuf) - 1] = '\0'; - } - } - else - aBuf[0] = '\0'; - - auto NewValueRes = UiDoValueSelector((char *)&pIds[i], &Shifter, aBuf, CurValue, 0, m_Map.m_vpEnvelopes.size(), 1, 1.0f, "Set Envelope", false, false, IGraphics::CORNER_NONE); - int NewVal = NewValueRes.m_Value; - if(NewVal != CurValue || (NewValueRes.m_State != EEditState::NONE && NewValueRes.m_State != EEditState::EDITING)) - { - *pNewVal = NewVal; - Change = i; - State = NewValueRes.m_State; - } - - if(DoButton_FontIcon((char *)&pIds[i] + 1, FONT_ICON_MINUS, 0, &Dec, 0, "Previous Envelope", IGraphics::CORNER_L, 7.0f)) - { - *pNewVal = pProps[i].m_Value - 1; - Change = i; - State = EEditState::ONE_GO; - } - if(DoButton_FontIcon(((char *)&pIds[i]) + 2, FONT_ICON_PLUS, 0, &Inc, 0, "Next Envelope", IGraphics::CORNER_R, 7.0f)) - { - *pNewVal = pProps[i].m_Value + 1; - Change = i; - State = EEditState::ONE_GO; - } - } - } - - return SEditResult{State, static_cast(Change)}; -} - -template SEditResult CEditor::DoPropertiesWithState(CUIRect *, CProperty *, int *, int *, const std::vector &); -template SEditResult CEditor::DoPropertiesWithState(CUIRect *, CProperty *, int *, int *, const std::vector &); -template SEditResult CEditor::DoPropertiesWithState(CUIRect *, CProperty *, int *, int *, const std::vector &); -template SEditResult CEditor::DoPropertiesWithState(CUIRect *, CProperty *, int *, int *, const std::vector &); -template SEditResult CEditor::DoPropertiesWithState(CUIRect *, CProperty *, int *, int *, const std::vector &); -template SEditResult CEditor::DoPropertiesWithState(CUIRect *, CProperty *, int *, int *, const std::vector &); -template SEditResult CEditor::DoPropertiesWithState(CUIRect *, CProperty *, int *, int *, const std::vector &); -template SEditResult CEditor::DoPropertiesWithState(CUIRect *, CProperty *, int *, int *, const std::vector &); -template SEditResult CEditor::DoPropertiesWithState(CUIRect *, CProperty *, int *, int *, const std::vector &); -template SEditResult CEditor::DoPropertiesWithState(CUIRect *, CProperty *, int *, int *, const std::vector &); -template SEditResult CEditor::DoPropertiesWithState(CUIRect *, CProperty *, int *, int *, const std::vector &); diff --git a/src/game/editor/editor_server_settings.cpp b/src/game/editor/editor_server_settings.cpp deleted file mode 100644 index 02678474cd..0000000000 --- a/src/game/editor/editor_server_settings.cpp +++ /dev/null @@ -1,2239 +0,0 @@ -#include "editor_server_settings.h" -#include "editor.h" - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include - -#include - -using namespace FontIcons; - -static const int FONT_SIZE = 12.0f; - -struct IMapSetting -{ - enum EType - { - SETTING_INT, - SETTING_COMMAND, - }; - const char *m_pName; - const char *m_pHelp; - EType m_Type; - - IMapSetting(const char *pName, const char *pHelp, EType Type) : - m_pName(pName), m_pHelp(pHelp), m_Type(Type) {} -}; -struct SMapSettingInt : public IMapSetting -{ - int m_Default; - int m_Min; - int m_Max; - - SMapSettingInt(const char *pName, const char *pHelp, int Default, int Min, int Max) : - IMapSetting(pName, pHelp, IMapSetting::SETTING_INT), m_Default(Default), m_Min(Min), m_Max(Max) {} -}; -struct SMapSettingCommand : public IMapSetting -{ - const char *m_pArgs; - - SMapSettingCommand(const char *pName, const char *pHelp, const char *pArgs) : - IMapSetting(pName, pHelp, IMapSetting::SETTING_COMMAND), m_pArgs(pArgs) {} -}; - -void CEditor::RenderServerSettingsEditor(CUIRect View, bool ShowServerSettingsEditorLast) -{ - static int s_CommandSelectedIndex = -1; - static CListBox s_ListBox; - s_ListBox.SetActive(!m_MapSettingsCommandContext.m_DropdownContext.m_ListBox.Active() && m_Dialog == DIALOG_NONE && !Ui()->IsPopupOpen()); - - bool GotSelection = s_ListBox.Active() && s_CommandSelectedIndex >= 0 && (size_t)s_CommandSelectedIndex < m_Map.m_vSettings.size(); - const bool CurrentInputValid = m_MapSettingsCommandContext.Valid(); // Use the context to validate the input - - CUIRect ToolBar, Button, Label, List, DragBar; - View.HSplitTop(22.0f, &DragBar, nullptr); - DragBar.y -= 2.0f; - DragBar.w += 2.0f; - DragBar.h += 4.0f; - DoEditorDragBar(View, &DragBar, EDragSide::SIDE_TOP, &m_aExtraEditorSplits[EXTRAEDITOR_SERVER_SETTINGS]); - View.HSplitTop(20.0f, &ToolBar, &View); - View.HSplitTop(2.0f, nullptr, &List); - ToolBar.HMargin(2.0f, &ToolBar); - - // delete button - ToolBar.VSplitRight(25.0f, &ToolBar, &Button); - ToolBar.VSplitRight(5.0f, &ToolBar, nullptr); - static int s_DeleteButton = 0; - if(DoButton_FontIcon(&s_DeleteButton, FONT_ICON_TRASH, GotSelection ? 0 : -1, &Button, 0, "[Delete] Delete the selected command from the command list.", IGraphics::CORNER_ALL, 9.0f) == 1 || (GotSelection && CLineInput::GetActiveInput() == nullptr && m_Dialog == DIALOG_NONE && Ui()->ConsumeHotkey(CUi::HOTKEY_DELETE))) - { - m_ServerSettingsHistory.RecordAction(std::make_shared(this, CEditorCommandAction::EType::DELETE, &s_CommandSelectedIndex, s_CommandSelectedIndex, m_Map.m_vSettings[s_CommandSelectedIndex].m_aCommand)); - - m_Map.m_vSettings.erase(m_Map.m_vSettings.begin() + s_CommandSelectedIndex); - if(s_CommandSelectedIndex >= (int)m_Map.m_vSettings.size()) - s_CommandSelectedIndex = m_Map.m_vSettings.size() - 1; - if(s_CommandSelectedIndex >= 0) - m_SettingsCommandInput.Set(m_Map.m_vSettings[s_CommandSelectedIndex].m_aCommand); - else - m_SettingsCommandInput.Clear(); - m_Map.OnModify(); - m_MapSettingsCommandContext.Update(); - s_ListBox.ScrollToSelected(); - } - - // move down button - ToolBar.VSplitRight(25.0f, &ToolBar, &Button); - const bool CanMoveDown = GotSelection && s_CommandSelectedIndex < (int)m_Map.m_vSettings.size() - 1; - static int s_DownButton = 0; - if(DoButton_FontIcon(&s_DownButton, FONT_ICON_SORT_DOWN, CanMoveDown ? 0 : -1, &Button, 0, "[Alt+Down] Move the selected command down.", IGraphics::CORNER_R, 11.0f) == 1 || (CanMoveDown && Input()->AltIsPressed() && Ui()->ConsumeHotkey(CUi::HOTKEY_DOWN))) - { - m_ServerSettingsHistory.RecordAction(std::make_shared(this, CEditorCommandAction::EType::MOVE_DOWN, &s_CommandSelectedIndex, s_CommandSelectedIndex)); - - std::swap(m_Map.m_vSettings[s_CommandSelectedIndex], m_Map.m_vSettings[s_CommandSelectedIndex + 1]); - s_CommandSelectedIndex++; - m_Map.OnModify(); - s_ListBox.ScrollToSelected(); - } - - // move up button - ToolBar.VSplitRight(25.0f, &ToolBar, &Button); - ToolBar.VSplitRight(5.0f, &ToolBar, nullptr); - const bool CanMoveUp = GotSelection && s_CommandSelectedIndex > 0; - static int s_UpButton = 0; - if(DoButton_FontIcon(&s_UpButton, FONT_ICON_SORT_UP, CanMoveUp ? 0 : -1, &Button, 0, "[Alt+Up] Move the selected command up.", IGraphics::CORNER_L, 11.0f) == 1 || (CanMoveUp && Input()->AltIsPressed() && Ui()->ConsumeHotkey(CUi::HOTKEY_UP))) - { - m_ServerSettingsHistory.RecordAction(std::make_shared(this, CEditorCommandAction::EType::MOVE_UP, &s_CommandSelectedIndex, s_CommandSelectedIndex)); - - std::swap(m_Map.m_vSettings[s_CommandSelectedIndex], m_Map.m_vSettings[s_CommandSelectedIndex - 1]); - s_CommandSelectedIndex--; - m_Map.OnModify(); - s_ListBox.ScrollToSelected(); - } - - // redo button - ToolBar.VSplitRight(25.0f, &ToolBar, &Button); - static int s_RedoButton = 0; - if(DoButton_FontIcon(&s_RedoButton, FONT_ICON_REDO, m_ServerSettingsHistory.CanRedo() ? 0 : -1, &Button, 0, "[Ctrl+Y] Redo command edit", IGraphics::CORNER_R, 11.0f) == 1 || (CanMoveDown && Input()->AltIsPressed() && Ui()->ConsumeHotkey(CUi::HOTKEY_DOWN))) - { - m_ServerSettingsHistory.Redo(); - } - - // undo button - ToolBar.VSplitRight(25.0f, &ToolBar, &Button); - ToolBar.VSplitRight(5.0f, &ToolBar, nullptr); - static int s_UndoButton = 0; - if(DoButton_FontIcon(&s_UndoButton, FONT_ICON_UNDO, m_ServerSettingsHistory.CanUndo() ? 0 : -1, &Button, 0, "[Ctrl+Z] Undo command edit", IGraphics::CORNER_L, 11.0f) == 1 || (CanMoveUp && Input()->AltIsPressed() && Ui()->ConsumeHotkey(CUi::HOTKEY_UP))) - { - m_ServerSettingsHistory.Undo(); - } - - GotSelection = s_ListBox.Active() && s_CommandSelectedIndex >= 0 && (size_t)s_CommandSelectedIndex < m_Map.m_vSettings.size(); - - int CollidingCommandIndex = -1; - ECollisionCheckResult CheckResult = ECollisionCheckResult::ERROR; - if(CurrentInputValid) - CollidingCommandIndex = m_MapSettingsCommandContext.CheckCollision(CheckResult); - - // update button - ToolBar.VSplitRight(25.0f, &ToolBar, &Button); - const bool CanAdd = CheckResult == ECollisionCheckResult::ADD; - const bool CanReplace = CheckResult == ECollisionCheckResult::REPLACE; - - const bool CanUpdate = GotSelection && CurrentInputValid && str_comp(m_Map.m_vSettings[s_CommandSelectedIndex].m_aCommand, m_SettingsCommandInput.GetString()) != 0; - - static int s_UpdateButton = 0; - if(DoButton_FontIcon(&s_UpdateButton, FONT_ICON_PENCIL, CanUpdate ? 0 : -1, &Button, 0, "[Alt+Enter] Update the selected command based on the entered value.", IGraphics::CORNER_R, 9.0f) == 1 || (CanUpdate && Input()->AltIsPressed() && m_Dialog == DIALOG_NONE && Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER))) - { - if(CollidingCommandIndex == -1) - { - bool Found = false; - int i; - for(i = 0; i < (int)m_Map.m_vSettings.size(); ++i) - { - if(i != s_CommandSelectedIndex && !str_comp(m_Map.m_vSettings[i].m_aCommand, m_SettingsCommandInput.GetString())) - { - Found = true; - break; - } - } - if(Found) - { - m_ServerSettingsHistory.RecordAction(std::make_shared(this, CEditorCommandAction::EType::DELETE, &s_CommandSelectedIndex, s_CommandSelectedIndex, m_Map.m_vSettings[s_CommandSelectedIndex].m_aCommand)); - m_Map.m_vSettings.erase(m_Map.m_vSettings.begin() + s_CommandSelectedIndex); - s_CommandSelectedIndex = i > s_CommandSelectedIndex ? i - 1 : i; - } - else - { - const char *pStr = m_SettingsCommandInput.GetString(); - m_ServerSettingsHistory.RecordAction(std::make_shared(this, CEditorCommandAction::EType::EDIT, &s_CommandSelectedIndex, s_CommandSelectedIndex, m_Map.m_vSettings[s_CommandSelectedIndex].m_aCommand, pStr)); - str_copy(m_Map.m_vSettings[s_CommandSelectedIndex].m_aCommand, pStr); - } - } - else - { - if(s_CommandSelectedIndex == CollidingCommandIndex) - { // If we are editing the currently collinding line, then we can just call EDIT on it - const char *pStr = m_SettingsCommandInput.GetString(); - m_ServerSettingsHistory.RecordAction(std::make_shared(this, CEditorCommandAction::EType::EDIT, &s_CommandSelectedIndex, s_CommandSelectedIndex, m_Map.m_vSettings[s_CommandSelectedIndex].m_aCommand, pStr)); - str_copy(m_Map.m_vSettings[s_CommandSelectedIndex].m_aCommand, pStr); - } - else - { // If not, then editing the current selected line will result in the deletion of the colliding line, and the editing of the selected line - const char *pStr = m_SettingsCommandInput.GetString(); - - char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "Delete command %d; Edit command %d", CollidingCommandIndex, s_CommandSelectedIndex); - - m_ServerSettingsHistory.BeginBulk(); - // Delete the colliding command - m_ServerSettingsHistory.RecordAction(std::make_shared(this, CEditorCommandAction::EType::DELETE, &s_CommandSelectedIndex, CollidingCommandIndex, m_Map.m_vSettings[CollidingCommandIndex].m_aCommand)); - m_Map.m_vSettings.erase(m_Map.m_vSettings.begin() + CollidingCommandIndex); - // Edit the selected command - s_CommandSelectedIndex = s_CommandSelectedIndex > CollidingCommandIndex ? s_CommandSelectedIndex - 1 : s_CommandSelectedIndex; - m_ServerSettingsHistory.RecordAction(std::make_shared(this, CEditorCommandAction::EType::EDIT, &s_CommandSelectedIndex, s_CommandSelectedIndex, m_Map.m_vSettings[s_CommandSelectedIndex].m_aCommand, pStr)); - str_copy(m_Map.m_vSettings[s_CommandSelectedIndex].m_aCommand, pStr); - - m_ServerSettingsHistory.EndBulk(aBuf); - } - } - - m_Map.OnModify(); - s_ListBox.ScrollToSelected(); - m_SettingsCommandInput.Clear(); - m_MapSettingsCommandContext.Reset(); // Reset context - Ui()->SetActiveItem(&m_SettingsCommandInput); - } - - // add button - ToolBar.VSplitRight(25.0f, &ToolBar, &Button); - ToolBar.VSplitRight(100.0f, &ToolBar, nullptr); - - static int s_AddButton = 0; - if(DoButton_FontIcon(&s_AddButton, CanReplace ? FONT_ICON_ARROWS_ROTATE : FONT_ICON_PLUS, CanAdd || CanReplace ? 0 : -1, &Button, 0, CanReplace ? "[Enter] Replace the corresponding command in the command list." : "[Enter] Add a command to the command list.", IGraphics::CORNER_L) == 1 || ((CanAdd || CanReplace) && !Input()->AltIsPressed() && m_Dialog == DIALOG_NONE && Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER))) - { - if(CanReplace) - { - dbg_assert(CollidingCommandIndex != -1, "Could not replace command"); - s_CommandSelectedIndex = CollidingCommandIndex; - - const char *pStr = m_SettingsCommandInput.GetString(); - m_ServerSettingsHistory.RecordAction(std::make_shared(this, CEditorCommandAction::EType::EDIT, &s_CommandSelectedIndex, s_CommandSelectedIndex, m_Map.m_vSettings[s_CommandSelectedIndex].m_aCommand, pStr)); - str_copy(m_Map.m_vSettings[s_CommandSelectedIndex].m_aCommand, pStr); - } - else if(CanAdd) - { - m_Map.m_vSettings.emplace_back(m_SettingsCommandInput.GetString()); - s_CommandSelectedIndex = m_Map.m_vSettings.size() - 1; - m_ServerSettingsHistory.RecordAction(std::make_shared(this, CEditorCommandAction::EType::ADD, &s_CommandSelectedIndex, s_CommandSelectedIndex, m_Map.m_vSettings[s_CommandSelectedIndex].m_aCommand)); - } - - m_Map.OnModify(); - s_ListBox.ScrollToSelected(); - m_SettingsCommandInput.Clear(); - m_MapSettingsCommandContext.Reset(); // Reset context - Ui()->SetActiveItem(&m_SettingsCommandInput); - } - - // command input (use remaining toolbar width) - if(!ShowServerSettingsEditorLast) // Just activated - Ui()->SetActiveItem(&m_SettingsCommandInput); - m_SettingsCommandInput.SetEmptyText("Command"); - - TextRender()->TextColor(TextRender()->DefaultTextColor()); - - // command list - s_ListBox.DoStart(15.0f, m_Map.m_vSettings.size(), 1, 3, s_CommandSelectedIndex, &List); - - for(size_t i = 0; i < m_Map.m_vSettings.size(); i++) - { - const CListboxItem Item = s_ListBox.DoNextItem(&m_Map.m_vSettings[i], s_CommandSelectedIndex >= 0 && (size_t)s_CommandSelectedIndex == i); - if(!Item.m_Visible) - continue; - - Item.m_Rect.VMargin(5.0f, &Label); - - SLabelProperties Props; - Props.m_MaxWidth = Label.w; - Props.m_EllipsisAtEnd = true; - Ui()->DoLabel(&Label, m_Map.m_vSettings[i].m_aCommand, 10.0f, TEXTALIGN_ML, Props); - } - - const int NewSelected = s_ListBox.DoEnd(); - if(s_CommandSelectedIndex != NewSelected || s_ListBox.WasItemSelected()) - { - s_CommandSelectedIndex = NewSelected; - if(m_SettingsCommandInput.IsEmpty() || !Input()->ModifierIsPressed()) // Allow ctrl+click to only change selection - { - m_SettingsCommandInput.Set(m_Map.m_vSettings[s_CommandSelectedIndex].m_aCommand); - m_MapSettingsCommandContext.Update(); - m_MapSettingsCommandContext.UpdateCursor(true); - } - m_MapSettingsCommandContext.m_DropdownContext.m_ShouldHide = true; - Ui()->SetActiveItem(&m_SettingsCommandInput); - } - - // Map setting input - DoMapSettingsEditBox(&m_MapSettingsCommandContext, &ToolBar, FONT_SIZE, List.h); -} - -void CEditor::DoMapSettingsEditBox(CMapSettingsBackend::CContext *pContext, const CUIRect *pRect, float FontSize, float DropdownMaxHeight, int Corners, const char *pToolTip) -{ - // Main method to do the full featured map settings edit box - - auto *pLineInput = pContext->LineInput(); - auto &Context = *pContext; - Context.SetFontSize(FontSize); - - // Set current active context if input is active - if(pLineInput->IsActive()) - CMapSettingsBackend::ms_pActiveContext = pContext; - - // Small utility to render a floating part above the input rect. - // Use to display either the error or the current argument name - const float PartMargin = 4.0f; - auto &&RenderFloatingPart = [&](CUIRect *pInputRect, float x, const char *pStr) { - CUIRect Background; - Background.x = x - PartMargin; - Background.y = pInputRect->y - pInputRect->h - 6.0f; - Background.w = TextRender()->TextWidth(FontSize, pStr) + 2 * PartMargin; - Background.h = pInputRect->h; - Background.Draw(ColorRGBA(0, 0, 0, 0.9f), IGraphics::CORNER_ALL, 3.0f); - - CUIRect Label; - Background.VSplitLeft(PartMargin, nullptr, &Label); - TextRender()->TextColor(0.8f, 0.8f, 0.8f, 1.0f); - Ui()->DoLabel(&Label, pStr, FontSize, TEXTALIGN_ML); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - }; - - // If we have a valid command, display the help in the tooltip - if(Context.CommandIsValid() && pLineInput->IsActive() && Ui()->HotItem() == nullptr) - Context.GetCommandHelpText(m_aTooltip, sizeof(m_aTooltip)); - - CUIRect ToolBar = *pRect; - CUIRect Button; - ToolBar.VSplitRight(ToolBar.h, &ToolBar, &Button); - - // Do the unknown command toggle button - if(DoButton_FontIcon(&Context.m_AllowUnknownCommands, FONT_ICON_QUESTION, Context.m_AllowUnknownCommands, &Button, 0, "Disallow/allow unknown or invalid commands", IGraphics::CORNER_R)) - { - Context.m_AllowUnknownCommands = !Context.m_AllowUnknownCommands; - Context.Update(); - } - - // Color the arguments - std::vector vColorSplits; - Context.ColorArguments(vColorSplits); - - // Do and render clearable edit box with the colors - if(DoClearableEditBox(pLineInput, &ToolBar, FontSize, IGraphics::CORNER_L, "Enter a server setting.", vColorSplits)) - { - Context.Update(); // Update the context when contents change - Context.m_DropdownContext.m_ShouldHide = false; - } - - // Update/track the cursor - if(Context.UpdateCursor()) - Context.m_DropdownContext.m_ShouldHide = false; - - // Calculate x position of the dropdown and the floating part - float x = ToolBar.x + Context.CurrentArgPos() - pLineInput->GetScrollOffset(); - x = clamp(x, ToolBar.x + PartMargin, ToolBar.x + ToolBar.w); - - if(pLineInput->IsActive()) - { - // If line input is active, let's display a floating part for either the current argument name - // or for the error, if any. The error is only displayed when the cursor is at the end of the input. - const bool IsAtEnd = pLineInput->GetCursorOffset() >= (m_MapSettingsCommandContext.CommentOffset() != -1 ? m_MapSettingsCommandContext.CommentOffset() : pLineInput->GetLength()); - - if(Context.CurrentArgName() && (!Context.HasError() || !IsAtEnd)) // Render argument name - RenderFloatingPart(&ToolBar, x, Context.CurrentArgName()); - else if(Context.HasError() && IsAtEnd) // Render error - RenderFloatingPart(&ToolBar, ToolBar.x + PartMargin, Context.Error()); - } - - // If we have possible matches for the current argument, let's display an editbox suggestions dropdown - const auto &vPossibleCommands = Context.PossibleMatches(); - int Selected = DoEditBoxDropdown(&Context.m_DropdownContext, pLineInput, &ToolBar, x - PartMargin, DropdownMaxHeight, Context.CurrentArg() >= 0, vPossibleCommands, MapSettingsDropdownRenderCallback); - - // If the dropdown just became visible, update the context - // This is needed when input loses focus and then we click a command in the map settings list - if(Context.m_DropdownContext.m_DidBecomeVisible) - { - Context.Update(); - Context.UpdateCursor(true); - } - - if(!vPossibleCommands.empty()) - { - // Check if the completion index has changed - if(Selected != pContext->m_CurrentCompletionIndex) - { - // If so, we should autocomplete the selected option - if(Selected != -1) - { - const char *pStr = vPossibleCommands[Selected].m_pValue; - int Len = pContext->m_CurrentCompletionIndex == -1 ? str_length(Context.CurrentArgValue()) : (pContext->m_CurrentCompletionIndex < (int)vPossibleCommands.size() ? str_length(vPossibleCommands[pContext->m_CurrentCompletionIndex].m_pValue) : 0); - size_t Start = Context.CurrentArgOffset(); - size_t End = Start + Len; - pLineInput->SetRange(pStr, Start, End); - } - - pContext->m_CurrentCompletionIndex = Selected; - } - } - else - { - Context.m_DropdownContext.m_ListBox.SetActive(false); - } -} - -template -int CEditor::DoEditBoxDropdown(SEditBoxDropdownContext *pDropdown, CLineInput *pLineInput, const CUIRect *pEditBoxRect, int x, float MaxHeight, bool AutoWidth, const std::vector &vData, const FDropdownRenderCallback &pfnMatchCallback) -{ - // Do an edit box with a possible dropdown - // This is a generic method which can display any data we want - - pDropdown->m_Selected = clamp(pDropdown->m_Selected, -1, (int)vData.size() - 1); - - if(Input()->KeyPress(KEY_SPACE) && Input()->ModifierIsPressed()) - { // Handle Ctrl+Space to show available options - pDropdown->m_ShortcutUsed = true; - // Remove inserted space - pLineInput->SetRange("", pLineInput->GetCursorOffset() - 1, pLineInput->GetCursorOffset()); - } - - if((!pDropdown->m_ShouldHide && !pLineInput->IsEmpty() && (pLineInput->IsActive() || pDropdown->m_MousePressedInside)) || pDropdown->m_ShortcutUsed) - { - if(!pDropdown->m_Visible) - { - pDropdown->m_DidBecomeVisible = true; - pDropdown->m_Visible = true; - } - else if(pDropdown->m_DidBecomeVisible) - pDropdown->m_DidBecomeVisible = false; - - if(!pLineInput->IsEmpty() || !pLineInput->IsActive()) - pDropdown->m_ShortcutUsed = false; - - int CurrentSelected = pDropdown->m_Selected; - - // Use tab to navigate through entries - if(Ui()->ConsumeHotkey(CUi::HOTKEY_TAB) && !vData.empty()) - { - int Direction = Input()->ShiftIsPressed() ? -1 : 1; - - pDropdown->m_Selected += Direction; - if(pDropdown->m_Selected < 0) - pDropdown->m_Selected = (int)vData.size() - 1; - pDropdown->m_Selected %= vData.size(); - } - - int Selected = RenderEditBoxDropdown(pDropdown, *pEditBoxRect, pLineInput, x, MaxHeight, AutoWidth, vData, pfnMatchCallback); - if(Selected != -1) - pDropdown->m_Selected = Selected; - - if(CurrentSelected != pDropdown->m_Selected) - pDropdown->m_ListBox.ScrollToSelected(); - - return pDropdown->m_Selected; - } - else - { - pDropdown->m_ShortcutUsed = false; - pDropdown->m_Visible = false; - pDropdown->m_ListBox.SetActive(false); - pDropdown->m_Selected = -1; - } - - return -1; -} - -template -int CEditor::RenderEditBoxDropdown(SEditBoxDropdownContext *pDropdown, CUIRect View, CLineInput *pLineInput, int x, float MaxHeight, bool AutoWidth, const std::vector &vData, const FDropdownRenderCallback &pfnMatchCallback) -{ - // Render a dropdown tied to an edit box/line input - auto *pListBox = &pDropdown->m_ListBox; - - pListBox->SetActive(m_Dialog == DIALOG_NONE && !Ui()->IsPopupOpen() && pLineInput->IsActive()); - pListBox->SetScrollbarWidth(15.0f); - - const int NumEntries = vData.size(); - - // Setup the rect - CUIRect CommandsDropdown = View; - CommandsDropdown.y += View.h + 0.1f; - CommandsDropdown.x = x; - if(AutoWidth) - CommandsDropdown.w = pDropdown->m_Width + pListBox->ScrollbarWidth(); - - pListBox->SetActive(NumEntries > 0); - if(NumEntries > 0) - { - // Draw the background - CommandsDropdown.h = minimum(NumEntries * 15.0f + 1.0f, MaxHeight); - CommandsDropdown.Draw(ColorRGBA(0.1f, 0.1f, 0.1f, 0.9f), IGraphics::CORNER_ALL, 3.0f); - - if(Ui()->MouseButton(0) && Ui()->MouseInside(&CommandsDropdown)) - pDropdown->m_MousePressedInside = true; - - // Do the list box - int Selected = pDropdown->m_Selected; - pListBox->DoStart(15.0f, NumEntries, 1, 3, Selected, &CommandsDropdown); - CUIRect Label; - - int NewIndex = Selected; - float LargestWidth = 0; - for(int i = 0; i < NumEntries; i++) - { - const CListboxItem Item = pListBox->DoNextItem(&vData[i], Selected == i); - - Item.m_Rect.VMargin(4.0f, &Label); - - SLabelProperties Props; - Props.m_MaxWidth = Label.w; - Props.m_EllipsisAtEnd = true; - - // Call the callback to fill the current line string - char aBuf[128]; - pfnMatchCallback(vData.at(i), aBuf, Props.m_vColorSplits); - - LargestWidth = maximum(LargestWidth, TextRender()->TextWidth(12.0f, aBuf) + 10.0f); - if(!Item.m_Visible) - continue; - - Ui()->DoLabel(&Label, aBuf, 12.0f, TEXTALIGN_ML, Props); - - if(Ui()->ActiveItem() == &vData[i]) - { - // If we selected an item (by clicking on it for example), then set the active item back to the - // line input so we don't loose focus - NewIndex = i; - Ui()->SetActiveItem(pLineInput); - } - } - - pDropdown->m_Width = LargestWidth; - - int EndIndex = pListBox->DoEnd(); - if(NewIndex == Selected) - NewIndex = EndIndex; - - if(pDropdown->m_MousePressedInside && !Ui()->MouseButton(0)) - { - Ui()->SetActiveItem(pLineInput); - pDropdown->m_MousePressedInside = false; - } - - if(NewIndex != Selected) - { - Ui()->SetActiveItem(pLineInput); - return NewIndex; - } - } - return -1; -} - -void CEditor::RenderMapSettingsErrorDialog() -{ - auto &LoadedMapSettings = m_MapSettingsBackend.m_LoadedMapSettings; - auto &vSettingsInvalid = LoadedMapSettings.m_vSettingsInvalid; - auto &vSettingsValid = LoadedMapSettings.m_vSettingsValid; - auto &SettingsDuplicate = LoadedMapSettings.m_SettingsDuplicate; - - Ui()->MapScreen(); - CUIRect Overlay = *Ui()->Screen(); - - Overlay.Draw(ColorRGBA(0, 0, 0, 0.33f), IGraphics::CORNER_NONE, 0.0f); - CUIRect Background; - Overlay.VMargin(150.0f, &Background); - Background.HMargin(50.0f, &Background); - Background.Draw(ColorRGBA(0, 0, 0, 0.80f), IGraphics::CORNER_ALL, 5.0f); - - CUIRect View; - Background.Margin(10.0f, &View); - - CUIRect Title, ButtonBar, Label; - View.HSplitTop(18.0f, &Title, &View); - View.HSplitTop(5.0f, nullptr, &View); // some spacing - View.HSplitBottom(18.0f, &View, &ButtonBar); - View.HSplitBottom(10.0f, &View, nullptr); // some spacing - - // title bar - Title.Draw(ColorRGBA(1, 1, 1, 0.25f), IGraphics::CORNER_ALL, 4.0f); - Title.VMargin(10.0f, &Title); - Ui()->DoLabel(&Title, "Map settings error", 12.0f, TEXTALIGN_ML); - - // Render body - { - static CLineInputBuffered<256> s_Input; - static CMapSettingsBackend::CContext s_Context = m_MapSettingsBackend.NewContext(&s_Input); - - // Some text - SLabelProperties Props; - CUIRect Text; - View.HSplitTop(30.0f, &Text, &View); - Props.m_MaxWidth = Text.w; - Ui()->DoLabel(&Text, "Below is a report of the invalid map settings found when loading the map. Please fix them before proceeding further.", 10.0f, TEXTALIGN_MC, Props); - - // Mixed list - CUIRect List = View; - View.Draw(ColorRGBA(1, 1, 1, 0.25f), IGraphics::CORNER_ALL, 3.0f); - - const float RowHeight = 18.0f; - static CScrollRegion s_ScrollRegion; - vec2 ScrollOffset(0.0f, 0.0f); - CScrollRegionParams ScrollParams; - ScrollParams.m_ScrollUnit = 120.0f; - s_ScrollRegion.Begin(&List, &ScrollOffset, &ScrollParams); - const float EndY = List.y + List.h; - List.y += ScrollOffset.y; - - List.HSplitTop(20.0f, nullptr, &List); - - static int s_FixingCommandIndex = -1; - - auto &&SetInput = [&](const char *pString) { - s_Input.Set(pString); - s_Context.Update(); - s_Context.UpdateCursor(true); - Ui()->SetActiveItem(&s_Input); - }; - - CUIRect FixInput; - bool DisplayFixInput = false; - float DropdownHeight = 110.0f; - - for(int i = 0; i < (int)m_Map.m_vSettings.size(); i++) - { - CUIRect Slot; - - auto pInvalidSetting = std::find_if(vSettingsInvalid.begin(), vSettingsInvalid.end(), [i](const SInvalidSetting &Setting) { return Setting.m_Index == i; }); - if(pInvalidSetting != vSettingsInvalid.end()) - { // This setting is invalid, only display it if its not a duplicate - if(!(pInvalidSetting->m_Type & SInvalidSetting::TYPE_DUPLICATE)) - { - bool IsFixing = s_FixingCommandIndex == i; - List.HSplitTop(RowHeight, &Slot, &List); - - // Draw a reddish background if setting is marked as deleted - if(pInvalidSetting->m_Context.m_Deleted) - Slot.Draw(ColorRGBA(0.85f, 0.0f, 0.0f, 0.15f), IGraphics::CORNER_ALL, 3.0f); - - Slot.VMargin(5.0f, &Slot); - Slot.HMargin(1.0f, &Slot); - - if(!IsFixing && !pInvalidSetting->m_Context.m_Fixed) - { // Display "Fix" and "delete" buttons if we're not fixing the command and the command has not been fixed - CUIRect FixBtn, DelBtn; - Slot.VSplitRight(30.0f, &Slot, &DelBtn); - Slot.VSplitRight(5.0f, &Slot, nullptr); - DelBtn.HMargin(1.0f, &DelBtn); - - Slot.VSplitRight(30.0f, &Slot, &FixBtn); - Slot.VSplitRight(10.0f, &Slot, nullptr); - FixBtn.HMargin(1.0f, &FixBtn); - - // Delete button - if(DoButton_FontIcon(&pInvalidSetting->m_Context.m_Deleted, FONT_ICON_TRASH, pInvalidSetting->m_Context.m_Deleted, &DelBtn, 0, "Delete this command", IGraphics::CORNER_ALL, 10.0f)) - pInvalidSetting->m_Context.m_Deleted = !pInvalidSetting->m_Context.m_Deleted; - - // Fix button - if(DoButton_Editor(&pInvalidSetting->m_Context.m_Fixed, "Fix", !pInvalidSetting->m_Context.m_Deleted ? (s_FixingCommandIndex == -1 ? 0 : (IsFixing ? 1 : -1)) : -1, &FixBtn, 0, "Fix this command")) - { - s_FixingCommandIndex = i; - SetInput(pInvalidSetting->m_aSetting); - } - } - else if(IsFixing) - { // If we're fixing this command, then display "Done" and "Cancel" buttons - // Also setup the input rect - CUIRect OkBtn, CancelBtn; - Slot.VSplitRight(50.0f, &Slot, &CancelBtn); - Slot.VSplitRight(5.0f, &Slot, nullptr); - CancelBtn.HMargin(1.0f, &CancelBtn); - - Slot.VSplitRight(30.0f, &Slot, &OkBtn); - Slot.VSplitRight(10.0f, &Slot, nullptr); - OkBtn.HMargin(1.0f, &OkBtn); - - // Buttons - static int s_Cancel = 0, s_Ok = 0; - if(DoButton_Editor(&s_Cancel, "Cancel", 0, &CancelBtn, 0, "Cancel fixing this command") || Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) - { - s_FixingCommandIndex = -1; - s_Input.Clear(); - } - - // "Done" button only enabled if the fixed setting is valid - // For that we use a local CContext s_Context and use it to check - // that the setting is valid and that it is not a duplicate - ECollisionCheckResult Res = ECollisionCheckResult::ERROR; - s_Context.CheckCollision(vSettingsValid, Res); - bool Valid = s_Context.Valid() && Res == ECollisionCheckResult::ADD; - - if(DoButton_Editor(&s_Ok, "Done", Valid ? 0 : -1, &OkBtn, 0, "Confirm editing of this command") || (s_Input.IsActive() && Valid && Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER))) - { - // Mark the setting is being fixed - pInvalidSetting->m_Context.m_Fixed = true; - str_copy(pInvalidSetting->m_aSetting, s_Input.GetString()); - // Add it to the list for future collision checks - vSettingsValid.emplace_back(s_Input.GetString()); - - // Clear the input & fixing command index - s_FixingCommandIndex = -1; - s_Input.Clear(); - } - } - - Label = Slot; - Props.m_EllipsisAtEnd = true; - Props.m_MaxWidth = Label.w; - - if(IsFixing) - { - // Setup input rect, which will be used to draw the map settings input later - Label.HMargin(1.0, &FixInput); - DisplayFixInput = true; - DropdownHeight = minimum(DropdownHeight, EndY - FixInput.y - 16.0f); - } - else - { - // Draw label in case we're not fixing this setting. - // Deleted settings are shown in gray with a red line through them - // Fixed settings are shown in green - // Invalid settings are shown in red - if(!pInvalidSetting->m_Context.m_Deleted) - { - if(pInvalidSetting->m_Context.m_Fixed) - TextRender()->TextColor(0.0f, 1.0f, 0.0f, 1.0f); - else - TextRender()->TextColor(1.0f, 0.0f, 0.0f, 1.0f); - Ui()->DoLabel(&Label, pInvalidSetting->m_aSetting, 10.0f, TEXTALIGN_ML, Props); - } - else - { - TextRender()->TextColor(0.3f, 0.3f, 0.3f, 1.0f); - Ui()->DoLabel(&Label, pInvalidSetting->m_aSetting, 10.0f, TEXTALIGN_ML, Props); - - CUIRect Line = Label; - Line.y = Label.y + Label.h / 2; - Line.h = 1; - Line.Draw(ColorRGBA(1, 0, 0, 1), IGraphics::CORNER_NONE, 0.0f); - } - } - TextRender()->TextColor(TextRender()->DefaultTextColor()); - } - } - else - { // This setting is valid - // Check for duplicates - const std::vector &vDuplicates = SettingsDuplicate.at(i); - int Chosen = -1; // This is the chosen duplicate setting. -1 means the first valid setting that was found which was not a duplicate - for(int d = 0; d < (int)vDuplicates.size(); d++) - { - int DupIndex = vDuplicates[d]; - if(vSettingsInvalid[DupIndex].m_Context.m_Chosen) - { - Chosen = d; - break; - } - } - - List.HSplitTop(RowHeight * (vDuplicates.size() + 1) + 2.0f, &Slot, &List); - Slot.HMargin(1.0f, &Slot); - - // Draw a background to highlight group of duplicates - if(!vDuplicates.empty()) - Slot.Draw(ColorRGBA(1, 1, 1, 0.15f), IGraphics::CORNER_ALL, 3.0f); - - Slot.VMargin(5.0f, &Slot); - Slot.HSplitTop(RowHeight, &Label, &Slot); - Label.HMargin(1.0f, &Label); - - // Draw a "choose" button next to the label in case we have duplicates for this line - if(!vDuplicates.empty()) - { - CUIRect ChooseBtn; - Label.VSplitRight(50.0f, &Label, &ChooseBtn); - Label.VSplitRight(5.0f, &Label, nullptr); - ChooseBtn.HMargin(1.0f, &ChooseBtn); - if(DoButton_Editor(&vDuplicates, "Choose", Chosen == -1, &ChooseBtn, 0, "Choose this command")) - { - if(Chosen != -1) - vSettingsInvalid[vDuplicates[Chosen]].m_Context.m_Chosen = false; - Chosen = -1; // Choosing this means that we do not choose any of the duplicates - } - } - - // Draw the label - Props.m_MaxWidth = Label.w; - Ui()->DoLabel(&Label, m_Map.m_vSettings[i].m_aCommand, 10.0f, TEXTALIGN_ML, Props); - - // Draw the list of duplicates, with a "Choose" button for each duplicate - // In case a duplicate is also invalid, then we draw a "Fix" button which behaves like the fix button above - // Duplicate settings name are shown in light blue, or in purple if they are also invalid - Slot.VSplitLeft(10.0f, nullptr, &Slot); - for(int DuplicateIndex = 0; DuplicateIndex < (int)vDuplicates.size(); DuplicateIndex++) - { - auto &Duplicate = vSettingsInvalid.at(vDuplicates[DuplicateIndex]); - bool IsFixing = s_FixingCommandIndex == Duplicate.m_Index; - bool IsInvalid = Duplicate.m_Type & SInvalidSetting::TYPE_INVALID; - - ColorRGBA Color(0.329f, 0.714f, 0.859f, 1.0f); - CUIRect SubSlot; - Slot.HSplitTop(RowHeight, &SubSlot, &Slot); - SubSlot.HMargin(1.0f, &SubSlot); - - if(!IsFixing) - { - // If not fixing, then display "Choose" and maybe "Fix" buttons. - - CUIRect ChooseBtn; - SubSlot.VSplitRight(50.0f, &SubSlot, &ChooseBtn); - SubSlot.VSplitRight(5.0f, &SubSlot, nullptr); - ChooseBtn.HMargin(1.0f, &ChooseBtn); - if(DoButton_Editor(&Duplicate.m_Context.m_Chosen, "Choose", IsInvalid && !Duplicate.m_Context.m_Fixed ? -1 : Duplicate.m_Context.m_Chosen, &ChooseBtn, 0, "Override with this command")) - { - Duplicate.m_Context.m_Chosen = !Duplicate.m_Context.m_Chosen; - if(Chosen != -1 && Chosen != DuplicateIndex) - vSettingsInvalid[vDuplicates[Chosen]].m_Context.m_Chosen = false; - Chosen = DuplicateIndex; - } - - if(IsInvalid) - { - if(!Duplicate.m_Context.m_Fixed) - { - Color = ColorRGBA(1, 0, 1, 1); - CUIRect FixBtn; - SubSlot.VSplitRight(30.0f, &SubSlot, &FixBtn); - SubSlot.VSplitRight(10.0f, &SubSlot, nullptr); - FixBtn.HMargin(1.0f, &FixBtn); - if(DoButton_Editor(&Duplicate.m_Context.m_Fixed, "Fix", s_FixingCommandIndex == -1 ? 0 : (IsFixing ? 1 : -1), &FixBtn, 0, "Fix this command (needed before it can be chosen)")) - { - s_FixingCommandIndex = Duplicate.m_Index; - SetInput(Duplicate.m_aSetting); - } - } - else - { - Color = ColorRGBA(0.329f, 0.714f, 0.859f, 1.0f); - } - } - } - else - { - // If we're fixing, display "Done" and "Cancel" buttons - CUIRect OkBtn, CancelBtn; - SubSlot.VSplitRight(50.0f, &SubSlot, &CancelBtn); - SubSlot.VSplitRight(5.0f, &SubSlot, nullptr); - CancelBtn.HMargin(1.0f, &CancelBtn); - - SubSlot.VSplitRight(30.0f, &SubSlot, &OkBtn); - SubSlot.VSplitRight(10.0f, &SubSlot, nullptr); - OkBtn.HMargin(1.0f, &OkBtn); - - static int s_Cancel = 0, s_Ok = 0; - if(DoButton_Editor(&s_Cancel, "Cancel", 0, &CancelBtn, 0, "Cancel fixing this command") || Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) - { - s_FixingCommandIndex = -1; - s_Input.Clear(); - } - - // Use the local CContext s_Context to validate the input - // We also need to make sure the fixed setting matches the initial duplicate setting - // For example: - // sv_deepfly 0 - // sv_deepfly 5 <- This is invalid and duplicate. We can only fix it by writing "sv_deepfly 0" or "sv_deepfly 1". - // If we write any other setting, like "sv_hit 1", it won't work as it does not match "sv_deepfly". - // To do that, we use the context and we check for collision with the current map setting - ECollisionCheckResult Res = ECollisionCheckResult::ERROR; - s_Context.CheckCollision({m_Map.m_vSettings[i]}, Res); - bool Valid = s_Context.Valid() && Res == ECollisionCheckResult::REPLACE; - - if(DoButton_Editor(&s_Ok, "Done", Valid ? 0 : -1, &OkBtn, 0, "Confirm editing of this command") || (s_Input.IsActive() && Valid && Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER))) - { - if(Valid) // Just to make sure - { - // Mark the setting as fixed - Duplicate.m_Context.m_Fixed = true; - str_copy(Duplicate.m_aSetting, s_Input.GetString()); - - s_FixingCommandIndex = -1; - s_Input.Clear(); - } - } - } - - Label = SubSlot; - Props.m_MaxWidth = Label.w; - - if(IsFixing) - { - // Setup input rect in case we are fixing the setting - Label.HMargin(1.0, &FixInput); - DisplayFixInput = true; - DropdownHeight = minimum(DropdownHeight, EndY - FixInput.y - 16.0f); - } - else - { - // Otherwise, render the setting label - TextRender()->TextColor(Color); - Ui()->DoLabel(&Label, Duplicate.m_aSetting, 10.0f, TEXTALIGN_ML, Props); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - } - } - } - - // Finally, add the slot to the scroll region - s_ScrollRegion.AddRect(Slot); - } - - // Add some padding to the bottom so the dropdown can actually display some values in case we - // fix an invalid setting at the bottom of the list - CUIRect PaddingBottom; - List.HSplitTop(30.0f, &PaddingBottom, &List); - s_ScrollRegion.AddRect(PaddingBottom); - - // Display the map settings edit box after having rendered all the lines, so the dropdown shows in - // front of everything, but is still being clipped by the scroll region. - if(DisplayFixInput) - DoMapSettingsEditBox(&s_Context, &FixInput, 10.0f, maximum(DropdownHeight, 30.0f)); - - s_ScrollRegion.End(); - } - - // Confirm button - static int s_ConfirmButton = 0, s_CancelButton = 0, s_FixAllButton = 0; - CUIRect ConfimButton, CancelButton, FixAllUnknownButton; - ButtonBar.VSplitLeft(110.0f, &CancelButton, &ButtonBar); - ButtonBar.VSplitRight(110.0f, &ButtonBar, &ConfimButton); - ButtonBar.VSplitRight(5.0f, &ButtonBar, nullptr); - ButtonBar.VSplitRight(150.0f, &ButtonBar, &FixAllUnknownButton); - - bool CanConfirm = true; - bool CanFixAllUnknown = false; - for(auto &InvalidSetting : vSettingsInvalid) - { - if(!InvalidSetting.m_Context.m_Fixed && !InvalidSetting.m_Context.m_Deleted && !(InvalidSetting.m_Type & SInvalidSetting::TYPE_DUPLICATE)) - { - CanConfirm = false; - if(InvalidSetting.m_Unknown) - CanFixAllUnknown = true; - break; - } - } - - auto &&Execute = [&]() { - // Execute will modify the actual map settings according to the fixes that were just made within the dialog. - - // Fix fixed settings, erase deleted settings - for(auto &FixedSetting : vSettingsInvalid) - { - if(FixedSetting.m_Context.m_Fixed) - { - str_copy(m_Map.m_vSettings[FixedSetting.m_Index].m_aCommand, FixedSetting.m_aSetting); - } - } - - // Choose chosen settings - // => Erase settings that don't match - // => Erase settings that were not chosen - std::vector vSettingsToErase; - for(auto &Setting : vSettingsInvalid) - { - if(Setting.m_Type & SInvalidSetting::TYPE_DUPLICATE) - { - if(!Setting.m_Context.m_Chosen) - vSettingsToErase.emplace_back(Setting.m_aSetting); - else - vSettingsToErase.emplace_back(m_Map.m_vSettings[Setting.m_CollidingIndex].m_aCommand); - } - } - - // Erase deleted settings - for(auto &DeletedSetting : vSettingsInvalid) - { - if(DeletedSetting.m_Context.m_Deleted) - { - m_Map.m_vSettings.erase( - std::remove_if(m_Map.m_vSettings.begin(), m_Map.m_vSettings.end(), [&](const CEditorMapSetting &MapSetting) { - return str_comp_nocase(MapSetting.m_aCommand, DeletedSetting.m_aSetting) == 0; - }), - m_Map.m_vSettings.end()); - } - } - - // Erase settings to erase - for(auto &Setting : vSettingsToErase) - { - m_Map.m_vSettings.erase( - std::remove_if(m_Map.m_vSettings.begin(), m_Map.m_vSettings.end(), [&](const CEditorMapSetting &MapSetting) { - return str_comp_nocase(MapSetting.m_aCommand, Setting.m_aCommand) == 0; - }), - m_Map.m_vSettings.end()); - } - - m_Map.OnModify(); - }; - - auto &&FixAllUnknown = [&] { - // Mark unknown settings as fixed - for(auto &InvalidSetting : vSettingsInvalid) - if(!InvalidSetting.m_Context.m_Fixed && !InvalidSetting.m_Context.m_Deleted && !(InvalidSetting.m_Type & SInvalidSetting::TYPE_DUPLICATE) && InvalidSetting.m_Unknown) - InvalidSetting.m_Context.m_Fixed = true; - }; - - // Fix all unknown settings - if(DoButton_Editor(&s_FixAllButton, "Allow all unknown settings", CanFixAllUnknown ? 0 : -1, &FixAllUnknownButton, 0, nullptr)) - { - FixAllUnknown(); - } - - // Confirm - execute the fixes - if(DoButton_Editor(&s_ConfirmButton, "Confirm", CanConfirm ? 0 : -1, &ConfimButton, 0, nullptr) || (CanConfirm && Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER))) - { - Execute(); - m_Dialog = DIALOG_NONE; - } - - // Cancel - we load a new empty map - if(DoButton_Editor(&s_CancelButton, "Cancel", 0, &CancelButton, 0, nullptr) || (Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE))) - { - Reset(); - m_aFileName[0] = 0; - m_Dialog = DIALOG_NONE; - } -} - -void CEditor::MapSettingsDropdownRenderCallback(const SPossibleValueMatch &Match, char (&aOutput)[128], std::vector &vColorSplits) -{ - // Check the match argument index. - // If it's -1, we're displaying the list of available map settings names - // If its >= 0, we're displaying the list of possible values matches for that argument - if(Match.m_ArgIndex == -1) - { - IMapSetting *pInfo = (IMapSetting *)Match.m_pData; - vColorSplits = { - {str_length(pInfo->m_pName) + 1, -1, ColorRGBA(0.6f, 0.6f, 0.6f, 1)}, // Darker arguments - }; - - if(pInfo->m_Type == IMapSetting::SETTING_INT) - { - str_format(aOutput, sizeof(aOutput), "%s i[value]", pInfo->m_pName); - } - else if(pInfo->m_Type == IMapSetting::SETTING_COMMAND) - { - SMapSettingCommand *pCommand = (SMapSettingCommand *)pInfo; - str_format(aOutput, sizeof(aOutput), "%s %s", pCommand->m_pName, pCommand->m_pArgs); - } - } - else - { - str_copy(aOutput, Match.m_pValue); - } -} - -// ---------------------------------------- - -CMapSettingsBackend::CContext *CMapSettingsBackend::ms_pActiveContext = nullptr; - -void CMapSettingsBackend::OnInit(CEditor *pEditor) -{ - CEditorComponent::OnInit(pEditor); - - // Register values loader - InitValueLoaders(); - - // Load settings/commands - LoadAllMapSettings(); - - CValuesBuilder Builder(&m_PossibleValuesPerCommand); - - // Load and parse static map settings so we can use them here - for(auto &pSetting : m_vpMapSettings) - { - // We want to parse the arguments of each map setting so we can autocomplete them later - // But that depends on the type of the setting. - // If we have a INT setting, then we know we can only ever have 1 argument which is a integer value - // If we have a COMMAND setting, then we need to parse its arguments - if(pSetting->m_Type == IMapSetting::SETTING_INT) - LoadSettingInt(std::static_pointer_cast(pSetting)); - else if(pSetting->m_Type == IMapSetting::SETTING_COMMAND) - LoadSettingCommand(std::static_pointer_cast(pSetting)); - - LoadPossibleValues(Builder(pSetting->m_pName), pSetting); - } - - // Init constraints - LoadConstraints(); -} - -void CMapSettingsBackend::LoadAllMapSettings() -{ - // Gather all config variables having the flag CFGFLAG_GAME - Editor()->ConfigManager()->PossibleConfigVariables("", CFGFLAG_GAME, PossibleConfigVariableCallback, this); - - // Load list of commands - LoadCommand("tune", "s[tuning] f[value]", "Tune variable to value or show current value"); - LoadCommand("tune_zone", "i[zone] s[tuning] f[value]", "Tune in zone a variable to value"); - LoadCommand("tune_zone_enter", "i[zone] r[message]", "which message to display on zone enter; use 0 for normal area"); - LoadCommand("tune_zone_leave", "i[zone] r[message]", "which message to display on zone leave; use 0 for normal area"); - LoadCommand("mapbug", "s[mapbug]", "Enable map compatibility mode using the specified bug (example: grenade-doubleexplosion@ddnet.tw)"); - LoadCommand("switch_open", "i[switch]", "Whether a switch is deactivated by default (otherwise activated)"); -} - -void CMapSettingsBackend::LoadCommand(const char *pName, const char *pArgs, const char *pHelp) -{ - m_vpMapSettings.emplace_back(std::make_shared(pName, pHelp, pArgs)); -} - -void CMapSettingsBackend::LoadSettingInt(const std::shared_ptr &pSetting) -{ - // We load an int argument here - m_ParsedCommandArgs[pSetting].emplace_back(); - auto &Arg = m_ParsedCommandArgs[pSetting].back(); - str_copy(Arg.m_aName, "value"); - Arg.m_Type = 'i'; -} - -void CMapSettingsBackend::LoadSettingCommand(const std::shared_ptr &pSetting) -{ - // This method parses a setting into its arguments (name and type) so we can later - // use them to validate the current input as well as display the current argument value - // over the line input. - - m_ParsedCommandArgs[pSetting].clear(); - const char *pIterator = pSetting->m_pArgs; - - char Type; - - while(*pIterator) - { - if(*pIterator == '?') // Skip optional values as a map setting should not have optional values - pIterator++; - - Type = *pIterator; - pIterator++; - while(*pIterator && *pIterator != '[') - pIterator++; - pIterator++; // skip '[' - - const char *pNameStart = pIterator; - - while(*pIterator && *pIterator != ']') - pIterator++; - - size_t Len = pIterator - pNameStart; - pIterator++; // Skip ']' - - dbg_assert(Len + 1 < sizeof(SParsedMapSettingArg::m_aName), "Length of server setting name exceeds limit."); - - // Append parsed arg - m_ParsedCommandArgs[pSetting].emplace_back(); - auto &Arg = m_ParsedCommandArgs[pSetting].back(); - str_copy(Arg.m_aName, pNameStart, Len + 1); - Arg.m_Type = Type; - - pIterator = str_skip_whitespaces_const(pIterator); - } -} - -void CMapSettingsBackend::LoadPossibleValues(const CSettingValuesBuilder &Builder, const std::shared_ptr &pSetting) -{ - // Call the value loader for that setting - auto Iter = m_LoaderFunctions.find(pSetting->m_pName); - if(Iter == m_LoaderFunctions.end()) - return; - - (*Iter->second)(Builder); -} - -void CMapSettingsBackend::RegisterLoader(const char *pSettingName, const FLoaderFunction &pfnLoader) -{ - // Registers a value loader function for a specific setting name - m_LoaderFunctions[pSettingName] = pfnLoader; -} - -void CMapSettingsBackend::LoadConstraints() -{ - // Make an instance of constraint builder - CCommandArgumentConstraintBuilder Command(&m_ArgConstraintsPerCommand); - - // Define constraints like this - // This is still a bit sad as we have to do it manually here. - Command("tune", 2).Unique(0); - Command("tune_zone", 3).Multiple(0).Unique(1); - Command("tune_zone_enter", 2).Unique(0); - Command("tune_zone_leave", 2).Unique(0); - Command("switch_open", 1).Unique(0); - Command("mapbug", 1).Unique(0); -} - -void CMapSettingsBackend::PossibleConfigVariableCallback(const SConfigVariable *pVariable, void *pUserData) -{ - CMapSettingsBackend *pBackend = (CMapSettingsBackend *)pUserData; - - if(pVariable->m_Type == SConfigVariable::VAR_INT) - { - SIntConfigVariable *pIntVariable = (SIntConfigVariable *)pVariable; - pBackend->m_vpMapSettings.emplace_back(std::make_shared( - pIntVariable->m_pScriptName, - pIntVariable->m_pHelp, - pIntVariable->m_Default, - pIntVariable->m_Min, - pIntVariable->m_Max)); - } -} - -void CMapSettingsBackend::CContext::Reset() -{ - m_LastCursorOffset = 0; - m_CursorArgIndex = -1; - m_pCurrentSetting = nullptr; - m_vCurrentArgs.clear(); - m_aCommand[0] = '\0'; - m_DropdownContext.m_Selected = -1; - m_CurrentCompletionIndex = -1; - m_DropdownContext.m_ShortcutUsed = false; - m_DropdownContext.m_MousePressedInside = false; - m_DropdownContext.m_Visible = false; - m_DropdownContext.m_ShouldHide = false; - m_CommentOffset = -1; - - ClearError(); -} - -void CMapSettingsBackend::CContext::Update() -{ - UpdateFromString(InputString()); -} - -void CMapSettingsBackend::CContext::UpdateFromString(const char *pStr) -{ - // This is the main method that does all the argument parsing and validating. - // It fills pretty much all the context values, the arguments, their position, - // if they are valid or not, etc. - - m_pCurrentSetting = nullptr; - m_vCurrentArgs.clear(); - m_CommentOffset = -1; - - const char *pIterator = pStr; - - // Check for comment - const char *pEnd = pStr; - int InString = 0; - - while(*pEnd) - { - if(*pEnd == '"') - InString ^= 1; - else if(*pEnd == '\\') // Escape sequences - { - if(pEnd[1] == '"') - pEnd++; - } - else if(!InString) - { - if(*pEnd == '#') // Found comment - { - m_CommentOffset = pEnd - pStr; - break; - } - } - - pEnd++; - } - - if(m_CommentOffset == 0) - return; - - // End command at start of comment, if any - char aInputString[256]; - str_copy(aInputString, pStr, m_CommentOffset != -1 ? m_CommentOffset + 1 : sizeof(aInputString)); - pIterator = aInputString; - - // Get the command/setting - m_aCommand[0] = '\0'; - while(pIterator && *pIterator != ' ' && *pIterator != '\0') - pIterator++; - - str_copy(m_aCommand, aInputString, (pIterator - aInputString) + 1); - - // Get the command if it is a recognized one - for(auto &pSetting : m_pBackend->m_vpMapSettings) - { - if(str_comp_nocase(m_aCommand, pSetting->m_pName) == 0) - { - m_pCurrentSetting = pSetting; - break; - } - } - - // Parse args - ParseArgs(aInputString, pIterator); -} - -void CMapSettingsBackend::CContext::ParseArgs(const char *pLineInputStr, const char *pStr) -{ - // This method parses the arguments of the current command, starting at pStr - - ClearError(); - - const char *pIterator = pStr; - - if(!pStr || *pStr == '\0') - return; // No arguments - - // NextArg is used to get the contents of the current argument and go to the next argument position - // It outputs the length of the argument in pLength and returns a boolean indicating if the parsing - // of that argument is valid or not (only the case when using strings with quotes (")) - auto &&NextArg = [&](const char *pArg, int *pLength) { - if(*pIterator == '"') - { - pIterator++; - bool Valid = true; - bool IsEscape = false; - - while(true) - { - if(pIterator[0] == '"' && !IsEscape) - break; - else if(pIterator[0] == 0) - { - Valid = false; - break; - } - - if(pIterator[0] == '\\' && !IsEscape) - IsEscape = true; - else if(IsEscape) - IsEscape = false; - - pIterator++; - } - const char *pEnd = ++pIterator; - pIterator = str_skip_to_whitespace_const(pIterator); - - // Make sure there are no other characters at the end, otherwise the string is invalid. - // E.g. "abcd"ef is invalid - Valid = Valid && pIterator == pEnd; - *pLength = pEnd - pArg; - - return Valid; - } - else - { - pIterator = str_skip_to_whitespace_const(pIterator); - *pLength = pIterator - pArg; - return true; - } - }; - - // Simple validation of string. Checks that it does not contain unescaped " in the middle of it. - auto &&ValidateStr = [](const char *pString) -> bool { - const char *pIt = pString; - bool IsEscape = false; - while(*pIt) - { - if(pIt[0] == '"' && !IsEscape) - return false; - - if(pIt[0] == '\\' && !IsEscape) - IsEscape = true; - else if(IsEscape) - IsEscape = false; - - pIt++; - } - return true; - }; - - const int CommandArgCount = m_pCurrentSetting != nullptr ? m_pBackend->m_ParsedCommandArgs.at(m_pCurrentSetting).size() : 0; - int ArgIndex = 0; - SCommandParseError::EErrorType Error = SCommandParseError::ERROR_NONE; - - // Also keep track of the visual X position of each argument within the input - float PosX = 0; - const float WW = m_pBackend->TextRender()->TextWidth(m_FontSize, " "); - PosX += m_pBackend->TextRender()->TextWidth(m_FontSize, m_aCommand); - - // Parsing beings - while(*pIterator) - { - Error = SCommandParseError::ERROR_NONE; - pIterator++; // Skip whitespace - PosX += WW; // Add whitespace width - - // Insert argument here - char Char = *pIterator; - const char *pArgStart = pIterator; - int Length; - bool Valid = NextArg(pArgStart, &Length); // Get contents and go to next argument position - size_t Offset = pArgStart - pLineInputStr; // Compute offset from the start of the input - - // Add new argument, copy the argument contents - m_vCurrentArgs.emplace_back(); - auto &NewArg = m_vCurrentArgs.back(); - // Fill argument value, with a maximum length of 256 - str_copy(NewArg.m_aValue, pArgStart, minimum((int)sizeof(SCurrentSettingArg::m_aValue), Length + 1)); - - // Validate argument from the parsed argument of the current setting. - // If current setting is not valid, then there are no arguments which results in an error. - - char Type = 'u'; // u = unknown - if(ArgIndex < CommandArgCount) - { - SParsedMapSettingArg &Arg = m_pBackend->m_ParsedCommandArgs[m_pCurrentSetting].at(ArgIndex); - if(Arg.m_Type == 'r') - { - // Rest of string, should add all the string if there was no quotes - // Otherwise, only get the contents in the quotes, and consider content after that as other arguments - if(Char != '"') - { - while(*pIterator) - pIterator++; - Length = pIterator - pArgStart; - str_copy(NewArg.m_aValue, pArgStart, Length + 1); - } - - if(!Valid) - Error = SCommandParseError::ERROR_INVALID_VALUE; - } - else if(Arg.m_Type == 'i') - { - // Validate int - if(!str_toint(NewArg.m_aValue, nullptr)) - Error = SCommandParseError::ERROR_INVALID_VALUE; - } - else if(Arg.m_Type == 'f') - { - // Validate float - if(!str_tofloat(NewArg.m_aValue, nullptr)) - Error = SCommandParseError::ERROR_INVALID_VALUE; - } - else if(Arg.m_Type == 's') - { - // Validate string - if(!Valid || (Char != '"' && !ValidateStr(NewArg.m_aValue))) - Error = SCommandParseError::ERROR_INVALID_VALUE; - } - - // Extended argument validation: - // for int settings it checks that the value is in range - // for command settings, it checks that the value is one of the possible values if there are any - EValidationResult Result = ValidateArg(ArgIndex, NewArg.m_aValue); - if(Length && !Error && Result != EValidationResult::VALID) - { - if(Result == EValidationResult::ERROR) - Error = SCommandParseError::ERROR_INVALID_VALUE; // Invalid argument value (invalid int, invalid float) - else if(Result == EValidationResult::UNKNOWN) - Error = SCommandParseError::ERROR_UNKNOWN_VALUE; // Unknown argument value - else if(Result == EValidationResult::INCOMPLETE) - Error = SCommandParseError::ERROR_INCOMPLETE; // Incomplete argument in case of possible values - else if(Result == EValidationResult::OUT_OF_RANGE) - Error = SCommandParseError::ERROR_OUT_OF_RANGE; // Out of range argument value in case of int settings - else - Error = SCommandParseError::ERROR_UNKNOWN; // Unknown error - } - - Type = Arg.m_Type; - } - else - { - // Error: too many arguments if no comment after - if(m_CommentOffset == -1) - Error = SCommandParseError::ERROR_TOO_MANY_ARGS; - else - { // Otherwise, check if there are any arguments left between this argument and the comment - const char *pSubIt = pArgStart; - pSubIt = str_skip_whitespaces_const(pSubIt); - if(*pSubIt != '\0') - { // If there aren't only spaces between the last argument and the comment, then this is an error - Error = SCommandParseError::ERROR_TOO_MANY_ARGS; - } - else // If there are, then just exit the loop to avoid getting an error - { - m_vCurrentArgs.pop_back(); - break; - } - } - } - - // Fill argument informations - NewArg.m_X = PosX; - NewArg.m_Start = Offset; - NewArg.m_End = Offset + Length; - NewArg.m_Error = Error != SCommandParseError::ERROR_NONE || Length == 0 || m_Error.m_Type != SCommandParseError::ERROR_NONE; - NewArg.m_ExpectedType = Type; - - // Check error and fill the error field with different messages - if(Error == SCommandParseError::ERROR_INVALID_VALUE || Error == SCommandParseError::ERROR_UNKNOWN_VALUE || Error == SCommandParseError::ERROR_OUT_OF_RANGE || Error == SCommandParseError::ERROR_INCOMPLETE) - { - // Only keep first error - if(!m_Error.m_aMessage[0]) - { - int ErrorArgIndex = (int)m_vCurrentArgs.size() - 1; - SCurrentSettingArg &ErrorArg = m_vCurrentArgs.back(); - SParsedMapSettingArg &SettingArg = m_pBackend->m_ParsedCommandArgs[m_pCurrentSetting].at(ArgIndex); - char aFormattedValue[256]; - FormatDisplayValue(ErrorArg.m_aValue, aFormattedValue); - - if(Error == SCommandParseError::ERROR_INVALID_VALUE || Error == SCommandParseError::ERROR_UNKNOWN_VALUE || Error == SCommandParseError::ERROR_INCOMPLETE) - { - static const std::map s_Names = { - {SCommandParseError::ERROR_INVALID_VALUE, "Invalid"}, - {SCommandParseError::ERROR_UNKNOWN_VALUE, "Unknown"}, - {SCommandParseError::ERROR_INCOMPLETE, "Incomplete"}, - }; - str_format(m_Error.m_aMessage, sizeof(m_Error.m_aMessage), "%s argument value: %s at position %d for argument '%s'", s_Names.at(Error), aFormattedValue, (int)ErrorArg.m_Start, SettingArg.m_aName); - } - else - { - std::shared_ptr pSettingInt = std::static_pointer_cast(m_pCurrentSetting); - str_format(m_Error.m_aMessage, sizeof(m_Error.m_aMessage), "Invalid argument value: %s at position %d for argument '%s': out of range [%d, %d]", aFormattedValue, (int)ErrorArg.m_Start, SettingArg.m_aName, pSettingInt->m_Min, pSettingInt->m_Max); - } - m_Error.m_ArgIndex = ErrorArgIndex; - m_Error.m_Type = Error; - } - } - else if(Error == SCommandParseError::ERROR_TOO_MANY_ARGS) - { - // Only keep first error - if(!m_Error.m_aMessage[0]) - { - if(m_pCurrentSetting != nullptr) - { - str_copy(m_Error.m_aMessage, "Too many arguments"); - m_Error.m_ArgIndex = ArgIndex; - break; - } - else - { - char aFormattedValue[256]; - FormatDisplayValue(m_aCommand, aFormattedValue); - str_format(m_Error.m_aMessage, sizeof(m_Error.m_aMessage), "Unknown server setting: %s", aFormattedValue); - m_Error.m_ArgIndex = -1; - break; - } - m_Error.m_Type = Error; - } - } - - PosX += m_pBackend->TextRender()->TextWidth(m_FontSize, pArgStart, Length); // Advance argument position - ArgIndex++; - } -} - -void CMapSettingsBackend::CContext::ClearError() -{ - m_Error.m_aMessage[0] = '\0'; - m_Error.m_Type = SCommandParseError::ERROR_NONE; -} - -bool CMapSettingsBackend::CContext::UpdateCursor(bool Force) -{ - // This method updates the cursor offset in this class from - // the cursor offset of the line input. - // It also updates the argument index where the cursor is at - // and the possible values matches if the argument index changes. - // Returns true in case the cursor changed position - - if(!m_pLineInput) - return false; - - size_t Offset = m_pLineInput->GetCursorOffset(); - if(Offset == m_LastCursorOffset && !Force) - return false; - - m_LastCursorOffset = Offset; - int NewArg = m_CursorArgIndex; - - // Update current argument under cursor - if(m_CommentOffset != -1 && Offset >= (size_t)m_CommentOffset) - { - NewArg = (int)m_vCurrentArgs.size(); - } - else - { - bool FoundArg = false; - for(int i = (int)m_vCurrentArgs.size() - 1; i >= 0; i--) - { - if(Offset >= m_vCurrentArgs[i].m_Start) - { - NewArg = i; - FoundArg = true; - break; - } - } - - if(!FoundArg) - NewArg = -1; - } - - bool ShouldUpdate = NewArg != m_CursorArgIndex; - m_CursorArgIndex = NewArg; - - // Do not show error if current argument is incomplete, as we are editing it - if(m_pLineInput != nullptr) - { - if(Offset == m_pLineInput->GetLength() && m_Error.m_aMessage[0] && m_Error.m_ArgIndex == m_CursorArgIndex && m_Error.m_Type == SCommandParseError::ERROR_INCOMPLETE) - ClearError(); - } - - if(m_DropdownContext.m_Selected == -1 || ShouldUpdate || Force) - { - // Update possible commands from cursor - UpdatePossibleMatches(); - } - - return true; -} - -EValidationResult CMapSettingsBackend::CContext::ValidateArg(int Index, const char *pArg) -{ - if(!m_pCurrentSetting) - return EValidationResult::ERROR; - - // Check if this argument is valid against current argument - if(m_pCurrentSetting->m_Type == IMapSetting::SETTING_INT) - { - std::shared_ptr pSetting = std::static_pointer_cast(m_pCurrentSetting); - if(Index > 0) - return EValidationResult::ERROR; - - int Value; - if(!str_toint(pArg, &Value)) // Try parse the integer - return EValidationResult::ERROR; - - return Value >= pSetting->m_Min && Value <= pSetting->m_Max ? EValidationResult::VALID : EValidationResult::OUT_OF_RANGE; - } - else if(m_pCurrentSetting->m_Type == IMapSetting::SETTING_COMMAND) - { - auto &vArgs = m_pBackend->m_ParsedCommandArgs.at(m_pCurrentSetting); - if(Index < (int)vArgs.size()) - { - auto It = m_pBackend->m_PossibleValuesPerCommand.find(m_pCurrentSetting->m_pName); - if(It != m_pBackend->m_PossibleValuesPerCommand.end()) - { - auto ValuesIt = It->second.find(Index); - if(ValuesIt != It->second.end()) - { - // This means that we have possible values for this argument for this setting - // In order to validate such arg, we have to check if it maches any of the possible values - const bool EqualsAny = std::any_of(ValuesIt->second.begin(), ValuesIt->second.end(), [pArg](auto *pValue) { return str_comp_nocase(pArg, pValue) == 0; }); - - // If equals, then argument is valid - if(EqualsAny) - return EValidationResult::VALID; - - // Here we check if argument is incomplete - const bool StartsAny = std::any_of(ValuesIt->second.begin(), ValuesIt->second.end(), [pArg](auto *pValue) { return str_startswith_nocase(pValue, pArg) != nullptr; }); - if(StartsAny) - return EValidationResult::INCOMPLETE; - - return EValidationResult::UNKNOWN; - } - } - } - - // If we get here, it means there are no posssible values for that specific argument. - // The validation for specific types such as int and floats were done earlier so if we get here - // we know the argument is valid. - // String and "rest of string" types are valid by default. - return EValidationResult::VALID; - } - - return EValidationResult::ERROR; -} - -void CMapSettingsBackend::CContext::UpdatePossibleMatches() -{ - // This method updates the possible values matches based on the cursor position within the current argument in the line input. - // For example ("|" is the cursor): - // - Typing "sv_deep|" will show "sv_deepfly" as a possible match in the dropdown - // Moving the cursor: "sv_|deep" will show all possible commands starting with "sv_" - // - Typing "tune ground_frict|" will show "ground_friction" as possible match - // Moving the cursor: "tune ground_|frict" will show all possible values starting with "ground_" for that argument (argument 0 of "tune" setting) - - m_vPossibleMatches.clear(); - m_DropdownContext.m_Selected = -1; - - if(m_CommentOffset == 0 || (m_aCommand[0] == '\0' && !m_DropdownContext.m_ShortcutUsed)) - return; - - // First case: argument index under cursor is -1 => we're on the command/setting name - if(m_CursorArgIndex == -1) - { - // Use a substring from the start of the input to the cursor offset - char aSubString[128]; - str_copy(aSubString, m_aCommand, minimum(m_LastCursorOffset + 1, sizeof(aSubString))); - - // Iterate through available map settings and find those which the beginning matches with the command/setting name we are writing - for(auto &pSetting : m_pBackend->m_vpMapSettings) - { - if(str_startswith_nocase(pSetting->m_pName, aSubString)) - { - m_vPossibleMatches.emplace_back(SPossibleValueMatch{ - pSetting->m_pName, - m_CursorArgIndex, - pSetting.get(), - }); - } - } - - // If there are no matches, then the command is unknown - if(m_vPossibleMatches.empty()) - { - // Fill the error if we do not allow unknown commands - char aFormattedValue[256]; - FormatDisplayValue(m_aCommand, aFormattedValue); - str_format(m_Error.m_aMessage, sizeof(m_Error.m_aMessage), "Unknown server setting: %s", aFormattedValue); - m_Error.m_ArgIndex = -1; - } - } - else - { - // Second case: we are on an argument - if(!m_pCurrentSetting) // If we are on an argument of an unknown setting, we can't handle it => no possible values, ever. - return; - - if(m_pCurrentSetting->m_Type == IMapSetting::SETTING_INT) - { - // No possible values for int settings. - // Maybe we can add "0" and "1" as possible values for settings that are binary. - } - else - { - // Get the parsed arguments for the current setting - auto &vArgs = m_pBackend->m_ParsedCommandArgs.at(m_pCurrentSetting); - // Make sure we are not out of bounds - if(m_CursorArgIndex < (int)vArgs.size() && m_CursorArgIndex < (int)m_vCurrentArgs.size()) - { - // Check if there are possible values for this command - auto It = m_pBackend->m_PossibleValuesPerCommand.find(m_pCurrentSetting->m_pName); - if(It != m_pBackend->m_PossibleValuesPerCommand.end()) - { - // If that's the case, then check if there are possible values for the current argument index the cursor is on - auto ValuesIt = It->second.find(m_CursorArgIndex); - if(ValuesIt != It->second.end()) - { - // If that's the case, then do the same as previously, we check for each value if they match - // with the current argument value - - auto &CurrentArg = m_vCurrentArgs.at(m_CursorArgIndex); - int SubstringLength = minimum(m_LastCursorOffset, CurrentArg.m_End) - CurrentArg.m_Start; - - // Substring based on the cursor position inside that argument - char aSubString[256]; - str_copy(aSubString, CurrentArg.m_aValue, SubstringLength + 1); - - for(auto &pValue : ValuesIt->second) - { - if(str_startswith_nocase(pValue, aSubString)) - { - m_vPossibleMatches.emplace_back(SPossibleValueMatch{ - pValue, - m_CursorArgIndex, - nullptr, - }); - } - } - } - } - } - } - } -} - -bool CMapSettingsBackend::CContext::OnInput(const IInput::CEvent &Event) -{ - if(!m_pLineInput) - return false; - - if(!m_pLineInput->IsActive()) - return false; - - if(Event.m_Flags & (IInput::FLAG_PRESS | IInput::FLAG_TEXT) && !m_pBackend->Input()->ModifierIsPressed() && !m_pBackend->Input()->AltIsPressed()) - { - // How to make this better? - // This checks when we press any key that is not handled by the dropdown - // When that's the case, it means we confirm the completion if we have a valid completion index - if(Event.m_Key != KEY_TAB && Event.m_Key != KEY_LSHIFT && Event.m_Key != KEY_RSHIFT && Event.m_Key != KEY_UP && Event.m_Key != KEY_DOWN && !(Event.m_Key >= KEY_MOUSE_1 && Event.m_Key <= KEY_MOUSE_WHEEL_RIGHT)) - { - if(m_CurrentCompletionIndex != -1) - { - m_CurrentCompletionIndex = -1; - m_DropdownContext.m_Selected = -1; - Update(); - UpdateCursor(true); - } - } - } - - return false; -} - -const char *CMapSettingsBackend::CContext::InputString() const -{ - if(!m_pLineInput) - return nullptr; - return m_pBackend->Input()->HasComposition() ? m_CompositionStringBuffer.c_str() : m_pLineInput->GetString(); -} - -const ColorRGBA CMapSettingsBackend::CContext::ms_ArgumentStringColor = ColorRGBA(84 / 255.0f, 1.0f, 1.0f, 1.0f); -const ColorRGBA CMapSettingsBackend::CContext::ms_ArgumentNumberColor = ColorRGBA(0.1f, 0.9f, 0.05f, 1.0f); -const ColorRGBA CMapSettingsBackend::CContext::ms_ArgumentUnknownColor = ColorRGBA(0.6f, 0.6f, 0.6f, 1.0f); -const ColorRGBA CMapSettingsBackend::CContext::ms_CommentColor = ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f); -const ColorRGBA CMapSettingsBackend::CContext::ms_ErrorColor = ColorRGBA(240 / 255.0f, 70 / 255.0f, 70 / 255.0f, 1.0f); - -void CMapSettingsBackend::CContext::ColorArguments(std::vector &vColorSplits) const -{ - // Get argument color based on its type - auto &&GetArgumentColor = [](char Type) -> ColorRGBA { - if(Type == 'u') - return ms_ArgumentUnknownColor; - else if(Type == 's' || Type == 'r') - return ms_ArgumentStringColor; - else if(Type == 'i' || Type == 'f') - return ms_ArgumentNumberColor; - return ms_ErrorColor; // Invalid arg type - }; - - // Iterate through all the current arguments and color them - for(int i = 0; i < ArgCount(); i++) - { - const auto &Argument = Arg(i); - // Color is based on the error flag and the type of the argument - auto Color = Argument.m_Error ? ms_ErrorColor : GetArgumentColor(Argument.m_ExpectedType); - vColorSplits.emplace_back(Argument.m_Start, Argument.m_End - Argument.m_Start, Color); - } - - if(m_pLineInput && !m_pLineInput->IsEmpty()) - { - if(!CommandIsValid() && m_CommentOffset != 0) - { - // If command is invalid, override color splits with red, but not comment - int ErrorLength = m_CommentOffset == -1 ? -1 : m_CommentOffset; - vColorSplits = {{0, ErrorLength, ms_ErrorColor}}; - } - else if(HasError()) - { - // If there is an error, then color the wrong part of the input, excluding comment - int ErrorLength = m_CommentOffset == -1 ? -1 : m_CommentOffset - ErrorOffset(); - vColorSplits.emplace_back(ErrorOffset(), ErrorLength, ms_ErrorColor); - } - if(m_CommentOffset != -1) - { // Color comment if there is one - vColorSplits.emplace_back(m_CommentOffset, -1, ms_CommentColor); - } - } - - std::sort(vColorSplits.begin(), vColorSplits.end(), [](const STextColorSplit &a, const STextColorSplit &b) { - return a.m_CharIndex < b.m_CharIndex; - }); -} - -int CMapSettingsBackend::CContext::CheckCollision(ECollisionCheckResult &Result) const -{ - return CheckCollision(m_pBackend->Editor()->m_Map.m_vSettings, Result); -} - -int CMapSettingsBackend::CContext::CheckCollision(const std::vector &vSettings, ECollisionCheckResult &Result) const -{ - return CheckCollision(InputString(), vSettings, Result); -} - -int CMapSettingsBackend::CContext::CheckCollision(const char *pInputString, const std::vector &vSettings, ECollisionCheckResult &Result) const -{ - // Checks for a collision with the current map settings. - // A collision is when a setting with the same arguments already exists and that it can't be added multiple times. - // For this, we use argument constraints that we define in CMapSettingsCommandObject::LoadConstraints(). - // For example, the "tune" command can be added multiple times, but only if the actual tune argument is different, thus - // the tune argument must be defined as UNIQUE. - // This method CheckCollision(ECollisionCheckResult&) returns an integer which is the index of the colliding line. If no - // colliding line was found, then it returns -1. - - const int InputLength = str_length(pInputString); - - if(m_CommentOffset == 0 || InputLength == 0) - { // Ignore comments - Result = ECollisionCheckResult::ADD; - return -1; - } - - struct SArgument - { - char m_aValue[128]; - SArgument(const char *pStr) - { - str_copy(m_aValue, pStr); - } - }; - - struct SLineArgs - { - int m_Index; - std::vector m_vArgs; - }; - - // For now we split each map setting corresponding to the setting we want to add by spaces - auto &&SplitSetting = [](const char *pStr) { - std::vector vaArgs; - const char *pIt = pStr; - char aBuffer[128]; - while((pIt = str_next_token(pIt, " ", aBuffer, sizeof(aBuffer)))) - vaArgs.emplace_back(aBuffer); - return vaArgs; - }; - - // Define the result of the check - Result = ECollisionCheckResult::ERROR; - - // First case: the command is not a valid (recognized) command. - if(!CommandIsValid()) - { - // If we don't allow unknown commands, then we know there is no collision - // and the check results in an error. - if(!m_AllowUnknownCommands) - return -1; - - // If we get here, it means we allow unknown commands. - // For them, we need to check if a similar exact command exists or not in the settings list. - // If it does, then we found a collision, and the result is REPLACE. - for(int i = 0; i < (int)vSettings.size(); i++) - { - if(str_comp_nocase(vSettings[i].m_aCommand, pInputString) == 0) - { - Result = ECollisionCheckResult::REPLACE; - return i; - } - } - - // If nothing was found, then we must ensure that the command, although unknown, is somewhat valid - // by checking if the command contains a space and that there is at least one non-empty argument. - const char *pSpace = str_find(pInputString, " "); - if(!pSpace || !*(pSpace + 1)) - Result = ECollisionCheckResult::ERROR; - else - Result = ECollisionCheckResult::ADD; - - return -1; // No collision - } - - // Second case: the command is valid. - // In this case, we know we have a valid setting name, which means we can use everything we have in this class which are - // related to valid map settings, such as parsed command arguments, etc. - - const std::shared_ptr &pSetting = Setting(); - if(pSetting->m_Type == IMapSetting::SETTING_INT) - { - // For integer settings, the check is quite simple as we know - // we can only ever have 1 argument. - - // The integer setting cannot be added multiple times, which means if a collision was found, then the only result we - // can have is REPLACE. - // In this case, the collision is found only by checking the command name for every setting in the current map settings. - char aBuffer[256]; - auto It = std::find_if(vSettings.begin(), vSettings.end(), [&](const CEditorMapSetting &Setting) { - const char *pLineSettingValue = Setting.m_aCommand; // Get the map setting command - pLineSettingValue = str_next_token(pLineSettingValue, " ", aBuffer, sizeof(aBuffer)); // Get the first token before the first space - return str_comp_nocase(aBuffer, pSetting->m_pName) == 0; // Check if that equals our current command - }); - - if(It == vSettings.end()) - { - // If nothing was found, then there is no collision and we can add that command to the list - Result = ECollisionCheckResult::ADD; - return -1; - } - else - { - // Otherwise, we can only replace it - Result = ECollisionCheckResult::REPLACE; - return It - vSettings.begin(); // This is the index of the colliding line - } - } - else if(pSetting->m_Type == IMapSetting::SETTING_COMMAND) - { - // For "command" settings, this is a bit more complex as we have to use argument constraints. - // The general idea is to split every map setting in their arguments separated by spaces. - // Then, for each argument, we check if it collides with any of the map settings. When that's the case, - // we need to check the constraint of the argument. If set to UNIQUE, then that's a collision and we can only - // replace the command in the list. - // If set to anything else, we consider that it is not a collision and we move to the next argument. - // This system is simple and somewhat flexible as we only need to declare the constraints, the rest should be - // handled automatically. - - std::shared_ptr pSettingCommand = std::static_pointer_cast(pSetting); - // Get matching lines for that command - std::vector vLineArgs; - for(int i = 0; i < (int)vSettings.size(); i++) - { - const auto &Setting = vSettings.at(i); - - // Split this setting into its arguments - std::vector vArgs = SplitSetting(Setting.m_aCommand); - // Only keep settings that match with the current input setting name - if(!vArgs.empty() && str_comp_nocase(vArgs[0].m_aValue, pSettingCommand->m_pName) == 0) - { - // When that's the case, we save them - vArgs.erase(vArgs.begin()); - vLineArgs.push_back(SLineArgs{ - i, - vArgs, - }); - } - } - - // Here is the simple algorithm to check for collisions according to argument constraints - bool Error = false; - int CollidingLineIndex = -1; - for(int ArgIndex = 0; ArgIndex < ArgCount(); ArgIndex++) - { - bool Collide = false; - const char *pValue = Arg(ArgIndex).m_aValue; - for(auto &Line : vLineArgs) - { - // Check first colliding line - if(str_comp_nocase(pValue, Line.m_vArgs[ArgIndex].m_aValue) == 0) - { - Collide = true; - CollidingLineIndex = Line.m_Index; - Error = m_pBackend->ArgConstraint(pSetting->m_pName, ArgIndex) == CMapSettingsBackend::EArgConstraint::UNIQUE; - } - if(Error) - break; - } - - // If we did not collide with any of the lines for that argument, we're good to go - // (or if we had an error) - if(!Collide || Error) - break; - - // Otherwise, remove non-colliding args from the list - vLineArgs.erase( - std::remove_if(vLineArgs.begin(), vLineArgs.end(), [&](const SLineArgs &Line) { - return str_comp_nocase(pValue, Line.m_vArgs[ArgIndex].m_aValue) != 0; - }), - vLineArgs.end()); - } - - // The result is either REPLACE when we found a collision, or ADD - Result = Error ? ECollisionCheckResult::REPLACE : ECollisionCheckResult::ADD; - return CollidingLineIndex; - } - - return -1; -} - -bool CMapSettingsBackend::CContext::Valid() const -{ - // Check if the entire setting is valid or not - - // We don't need to check whether a command is valid if we allow unknown commands - if(m_AllowUnknownCommands) - return true; - - if(m_CommentOffset == 0 || m_aCommand[0] == '\0') - return true; // A "comment" setting is considered valid. - - // Check if command is valid - if(m_pCurrentSetting) - { - // Check if all arguments are valid - const bool ArgumentsValid = std::all_of(m_vCurrentArgs.begin(), m_vCurrentArgs.end(), [](const SCurrentSettingArg &Arg) { - return !Arg.m_Error; - }); - - if(!ArgumentsValid) - return false; - - // Check that we have the same number of arguments - return m_vCurrentArgs.size() == m_pBackend->m_ParsedCommandArgs.at(m_pCurrentSetting).size(); - } - else - { - return false; - } -} - -void CMapSettingsBackend::CContext::GetCommandHelpText(char *pStr, int Length) const -{ - if(!m_pCurrentSetting) - return; - - str_copy(pStr, m_pCurrentSetting->m_pHelp, Length); -} - -void CMapSettingsBackend::CContext::UpdateCompositionString() -{ - if(!m_pLineInput) - return; - - const bool HasComposition = m_pBackend->Input()->HasComposition(); - - if(HasComposition) - { - const size_t CursorOffset = m_pLineInput->GetCursorOffset(); - const size_t DisplayCursorOffset = m_pLineInput->OffsetFromActualToDisplay(CursorOffset); - const std::string DisplayStr = std::string(m_pLineInput->GetString()); - std::string CompositionBuffer = DisplayStr.substr(0, DisplayCursorOffset) + m_pBackend->Input()->GetComposition() + DisplayStr.substr(DisplayCursorOffset); - if(CompositionBuffer != m_CompositionStringBuffer) - { - m_CompositionStringBuffer = CompositionBuffer; - Update(); - UpdateCursor(); - } - } -} - -template -void CMapSettingsBackend::CContext::FormatDisplayValue(const char *pValue, char (&aOut)[N]) -{ - const int MaxLength = 32; - if(str_length(pValue) > MaxLength) - { - str_copy(aOut, pValue, MaxLength); - str_append(aOut, "..."); - } - else - { - str_copy(aOut, pValue); - } -} - -bool CMapSettingsBackend::OnInput(const IInput::CEvent &Event) -{ - if(ms_pActiveContext) - return ms_pActiveContext->OnInput(Event); - - return false; -} - -void CMapSettingsBackend::OnUpdate() -{ - if(ms_pActiveContext && ms_pActiveContext->m_pLineInput && ms_pActiveContext->m_pLineInput->IsActive()) - ms_pActiveContext->UpdateCompositionString(); -} - -void CMapSettingsBackend::OnMapLoad() -{ - // Load & validate all map settings - m_LoadedMapSettings.Reset(); - - auto &vLoadedMapSettings = Editor()->m_Map.m_vSettings; - - // Keep a vector of valid map settings, to check collision against: m_vValidLoadedMapSettings - - // Create a local context with no lineinput, only used to parse the commands - CContext LocalContext = NewContext(nullptr); - - // Iterate through map settings - // Two steps: - // 1. Save valid and invalid settings - // 2. Check for duplicates - - std::vector> vSettingsInvalid; - - for(int i = 0; i < (int)vLoadedMapSettings.size(); i++) - { - CEditorMapSetting &Setting = vLoadedMapSettings.at(i); - // Parse the setting using the context - LocalContext.UpdateFromString(Setting.m_aCommand); - - bool Valid = LocalContext.Valid(); - ECollisionCheckResult Result = ECollisionCheckResult::ERROR; - LocalContext.CheckCollision(Setting.m_aCommand, m_LoadedMapSettings.m_vSettingsValid, Result); - - if(Valid && Result == ECollisionCheckResult::ADD) - m_LoadedMapSettings.m_vSettingsValid.emplace_back(Setting); - else - vSettingsInvalid.emplace_back(i, Valid, Setting); - - LocalContext.Reset(); - - // Empty duplicates for this line, might be filled later - m_LoadedMapSettings.m_SettingsDuplicate.insert({i, {}}); - } - - for(const auto &[Index, Valid, Setting] : vSettingsInvalid) - { - LocalContext.UpdateFromString(Setting.m_aCommand); - - ECollisionCheckResult Result = ECollisionCheckResult::ERROR; - int CollidingLineIndex = LocalContext.CheckCollision(Setting.m_aCommand, m_LoadedMapSettings.m_vSettingsValid, Result); - int RealCollidingLineIndex = CollidingLineIndex; - - if(CollidingLineIndex != -1) - RealCollidingLineIndex = std::find_if(vLoadedMapSettings.begin(), vLoadedMapSettings.end(), [&](const CEditorMapSetting &MapSetting) { - return str_comp_nocase(MapSetting.m_aCommand, m_LoadedMapSettings.m_vSettingsValid.at(CollidingLineIndex).m_aCommand) == 0; - }) - vLoadedMapSettings.begin(); - - int Type = 0; - if(!Valid) - Type |= SInvalidSetting::TYPE_INVALID; - if(Result == ECollisionCheckResult::REPLACE) - Type |= SInvalidSetting::TYPE_DUPLICATE; - - m_LoadedMapSettings.m_vSettingsInvalid.emplace_back(Index, Setting.m_aCommand, Type, RealCollidingLineIndex, !LocalContext.CommandIsValid()); - if(Type & SInvalidSetting::TYPE_DUPLICATE) - m_LoadedMapSettings.m_SettingsDuplicate[RealCollidingLineIndex].emplace_back(m_LoadedMapSettings.m_vSettingsInvalid.size() - 1); - - LocalContext.Reset(); - } - - if(!m_LoadedMapSettings.m_vSettingsInvalid.empty()) - Editor()->m_Dialog = DIALOG_MAPSETTINGS_ERROR; -} - -// ------ loaders - -void CMapSettingsBackend::InitValueLoaders() -{ - // Load the different possible values for some specific settings - RegisterLoader("tune", SValueLoader::LoadTuneValues); - RegisterLoader("tune_zone", SValueLoader::LoadTuneZoneValues); - RegisterLoader("mapbug", SValueLoader::LoadMapBugs); -} - -void SValueLoader::LoadTuneValues(const CSettingValuesBuilder &TuneBuilder) -{ - // Add available tuning names to argument 0 of setting "tune" - LoadArgumentTuneValues(TuneBuilder.Argument(0)); -} - -void SValueLoader::LoadTuneZoneValues(const CSettingValuesBuilder &TuneZoneBuilder) -{ - // Add available tuning names to argument 1 of setting "tune_zone" - LoadArgumentTuneValues(TuneZoneBuilder.Argument(1)); -} - -void SValueLoader::LoadMapBugs(const CSettingValuesBuilder &BugBuilder) -{ - // Get argument 0 of setting "mapbug" - auto ArgBuilder = BugBuilder.Argument(0); - // Add available map bugs options - ArgBuilder.Add("grenade-doubleexplosion@ddnet.tw"); -} - -void SValueLoader::LoadArgumentTuneValues(CArgumentValuesListBuilder &&ArgBuilder) -{ - // Iterate through available tunings add their name to the list - for(int i = 0; i < CTuningParams::Num(); i++) - { - ArgBuilder.Add(CTuningParams::Name(i)); - } -} diff --git a/src/game/editor/editor_server_settings.h b/src/game/editor/editor_server_settings.h deleted file mode 100644 index f4f1d6e292..0000000000 --- a/src/game/editor/editor_server_settings.h +++ /dev/null @@ -1,416 +0,0 @@ -#ifndef GAME_EDITOR_EDITOR_SERVER_SETTINGS_H -#define GAME_EDITOR_EDITOR_SERVER_SETTINGS_H - -#include "component.h" -#include "editor_ui.h" - -#include -#include -#include - -class CEditor; -struct SMapSettingInt; -struct SMapSettingCommand; -struct IMapSetting; -class CLineInput; - -struct CEditorMapSetting -{ - char m_aCommand[256]; - - CEditorMapSetting(const char *pCommand) - { - str_copy(m_aCommand, pCommand); - } -}; - -// A parsed map setting argument, storing the name and the type -// Used for validation and to display arguments names -struct SParsedMapSettingArg -{ - char m_aName[32]; - char m_Type; -}; - -// An argument for the current setting -struct SCurrentSettingArg -{ - char m_aValue[256]; // Value of the argument - float m_X; // The X position - size_t m_Start; // Start offset within the input string - size_t m_End; // End offset within the input string - bool m_Error; // If the argument is wrong or not - char m_ExpectedType; // The expected type -}; - -struct SPossibleValueMatch -{ - const char *m_pValue; // Possible value string - int m_ArgIndex; // Argument for that possible value - const void *m_pData; // Generic pointer to pass specific data -}; - -struct SCommandParseError -{ - char m_aMessage[256]; - int m_ArgIndex; - - enum EErrorType - { - ERROR_NONE = 0, - ERROR_TOO_MANY_ARGS, - ERROR_INVALID_VALUE, - ERROR_UNKNOWN_VALUE, - ERROR_INCOMPLETE, - ERROR_OUT_OF_RANGE, - ERROR_UNKNOWN - }; - EErrorType m_Type; -}; - -struct SInvalidSetting -{ - enum - { - TYPE_INVALID = 1 << 0, - TYPE_DUPLICATE = 1 << 1 - }; - int m_Index; // Index of the command in the loaded map settings list - char m_aSetting[256]; // String of the setting - int m_Type; // Type of that invalid setting - int m_CollidingIndex; // The colliding line index in case type is TYPE_DUPLICATE - bool m_Unknown; // Is the command unknown - - struct SContext - { - bool m_Fixed; - bool m_Deleted; - bool m_Chosen; - } m_Context; - - SInvalidSetting(int Index, const char *pSetting, int Type, int CollidingIndex, bool Unknown) : - m_Index(Index), m_Type(Type), m_CollidingIndex(CollidingIndex), m_Unknown(Unknown), m_Context() - { - str_copy(m_aSetting, pSetting); - } -}; - -// -------------------------------------- -// Builder classes & methods to generate list of possible values -// easily for specific settings and arguments. -// It uses a container stored inside CMapSettingsBackend. -// Usage: -// CValuesBuilder Builder(&m_Container); -// // Either do it in one go: -// Builder("tune").Argument(0).Add("value_1").Add("value_2"); -// // Or reference the builder (useful when using in a loop): -// auto TuneBuilder = Builder("tune").Argument(0); -// TuneBuilder.Add("value_1"); -// TuneBuilder.Add("value_2"); -// // ... - -using TArgumentValuesList = std::vector; // List of possible values -using TSettingValues = std::map; // Possible values per argument -using TSettingsArgumentValues = std::map; // Possible values per argument, per command/setting name - -class CValuesBuilder; -class CSettingValuesBuilder; -class CArgumentValuesListBuilder -{ -public: - CArgumentValuesListBuilder &Add(const char *pString) - { - m_pContainer->emplace_back(pString); - return *this; - } - -private: - CArgumentValuesListBuilder(std::vector *pContainer) : - m_pContainer(pContainer) {} - - std::vector *m_pContainer; - friend class CSettingValuesBuilder; -}; - -class CSettingValuesBuilder -{ -public: - CArgumentValuesListBuilder Argument(int Arg) const - { - return CArgumentValuesListBuilder(&(*m_pContainer)[Arg]); - } - -private: - CSettingValuesBuilder(TSettingValues *pContainer) : - m_pContainer(pContainer) {} - - friend class CValuesBuilder; - TSettingValues *m_pContainer; -}; - -class CValuesBuilder -{ -public: - CValuesBuilder(TSettingsArgumentValues *pContainer) : - m_pContainer(pContainer) - { - } - - CSettingValuesBuilder operator()(const char *pSettingName) const - { - return CSettingValuesBuilder(&(*m_pContainer)[pSettingName]); - } - -private: - TSettingsArgumentValues *m_pContainer; -}; - -// -------------------------------------- - -struct SValueLoader -{ - static void LoadTuneValues(const CSettingValuesBuilder &TuneBuilder); - static void LoadTuneZoneValues(const CSettingValuesBuilder &TuneZoneBuilder); - static void LoadMapBugs(const CSettingValuesBuilder &BugBuilder); - static void LoadArgumentTuneValues(CArgumentValuesListBuilder &&ArgBuilder); -}; - -enum class EValidationResult -{ - VALID = 0, - ERROR, - INCOMPLETE, - UNKNOWN, - OUT_OF_RANGE, -}; - -enum class ECollisionCheckResult -{ - ERROR, - REPLACE, - ADD -}; - -class CMapSettingsBackend : public CEditorComponent -{ - typedef void (*FLoaderFunction)(const CSettingValuesBuilder &); - -public: // General methods - CMapSettingsBackend() = default; - - void OnInit(CEditor *pEditor) override; - bool OnInput(const IInput::CEvent &Event) override; - void OnUpdate() override; - void OnMapLoad() override; - -public: // Constraints methods - enum class EArgConstraint - { - DEFAULT = 0, - UNIQUE, - MULTIPLE, - }; - - EArgConstraint ArgConstraint(const char *pSettingName, int Arg) const - { - return m_ArgConstraintsPerCommand.at(pSettingName).at(Arg); - } - -public: // Backend methods - const std::vector &ParsedArgs(const std::shared_ptr &pSetting) const - { - return m_ParsedCommandArgs.at(pSetting); - } - -public: // CContext - class CContext - { - static const ColorRGBA ms_ArgumentStringColor; - static const ColorRGBA ms_ArgumentNumberColor; - static const ColorRGBA ms_ArgumentUnknownColor; - static const ColorRGBA ms_CommentColor; - static const ColorRGBA ms_ErrorColor; - - friend class CMapSettingsBackend; - - public: - bool CommandIsValid() const { return m_pCurrentSetting != nullptr; } - int CurrentArg() const { return m_CursorArgIndex; } - const char *CurrentArgName() const { return (!m_pCurrentSetting || m_CursorArgIndex < 0 || m_CursorArgIndex >= (int)m_pBackend->m_ParsedCommandArgs.at(m_pCurrentSetting).size()) ? nullptr : m_pBackend->m_ParsedCommandArgs.at(m_pCurrentSetting).at(m_CursorArgIndex).m_aName; } - float CurrentArgPos() const { return (m_CursorArgIndex < 0 || m_CursorArgIndex >= (int)m_vCurrentArgs.size()) ? 0 : m_vCurrentArgs[m_CursorArgIndex].m_X; } - size_t CurrentArgOffset() const { return m_CursorArgIndex == -1 ? 0 : m_vCurrentArgs[m_CursorArgIndex].m_Start; } - const char *CurrentArgValue() const { return m_CursorArgIndex == -1 ? m_aCommand : m_vCurrentArgs[m_CursorArgIndex].m_aValue; } - const std::vector &PossibleMatches() const { return m_vPossibleMatches; } - bool HasError() const { return m_Error.m_aMessage[0] != '\0'; } - size_t ErrorOffset() const { return m_Error.m_ArgIndex < 0 ? 0 : m_vCurrentArgs.at(m_Error.m_ArgIndex).m_Start; } - const char *Error() const { return m_Error.m_aMessage; } - int ArgCount() const { return (int)m_vCurrentArgs.size(); } - const SCurrentSettingArg &Arg(int Index) const { return m_vCurrentArgs.at(Index); } - const std::shared_ptr &Setting() const { return m_pCurrentSetting; } - CLineInput *LineInput() const { return m_pLineInput; } - void SetFontSize(float FontSize) { m_FontSize = FontSize; } - int CommentOffset() const { return m_CommentOffset; }; - - int CheckCollision(ECollisionCheckResult &Result) const; - int CheckCollision(const std::vector &vSettings, ECollisionCheckResult &Result) const; - int CheckCollision(const char *pInputString, const std::vector &vSettings, ECollisionCheckResult &Result) const; - - void Update(); - void UpdateFromString(const char *pStr); - bool UpdateCursor(bool Force = false); - void Reset(); - void GetCommandHelpText(char *pStr, int Length) const; - bool Valid() const; - void ColorArguments(std::vector &vColorSplits) const; - - bool m_AllowUnknownCommands; - SEditBoxDropdownContext m_DropdownContext; - int m_CurrentCompletionIndex; - - private: // Methods - CContext(CMapSettingsBackend *pMaster, CLineInput *pLineinput) : - m_DropdownContext(), m_pLineInput(pLineinput), m_pBackend(pMaster) - { - m_AllowUnknownCommands = false; - Reset(); - } - - void ClearError(); - EValidationResult ValidateArg(int Index, const char *pArg); - void UpdatePossibleMatches(); - void ParseArgs(const char *pLineInputStr, const char *pStr); - bool OnInput(const IInput::CEvent &Event); - const char *InputString() const; - void UpdateCompositionString(); - - template - void FormatDisplayValue(const char *pValue, char (&aOut)[N]); - - private: // Fields - std::shared_ptr m_pCurrentSetting; // Current setting, can be nullptr in case of invalid setting name - std::vector m_vCurrentArgs; // Current parsed arguments from lineinput string - int m_CursorArgIndex; // The current argument the cursor is over - std::vector m_vPossibleMatches; // The current matches from cursor argument - size_t m_LastCursorOffset; // Last cursor offset - CLineInput *m_pLineInput; - char m_aCommand[128]; // The current command, not necessarily valid - SCommandParseError m_Error; // Error - int m_CommentOffset; // Position of the comment, if there is one - - CMapSettingsBackend *m_pBackend; - std::string m_CompositionStringBuffer; - float m_FontSize; - }; - - CContext NewContext(CLineInput *pLineInput) - { - return CContext(this, pLineInput); - } - -private: // Loader methods - void LoadAllMapSettings(); - void LoadCommand(const char *pName, const char *pArgs, const char *pHelp); - void LoadSettingInt(const std::shared_ptr &pSetting); - void LoadSettingCommand(const std::shared_ptr &pSetting); - void InitValueLoaders(); - void LoadPossibleValues(const CSettingValuesBuilder &Builder, const std::shared_ptr &pSetting); - void RegisterLoader(const char *pSettingName, const FLoaderFunction &pfnLoader); - void LoadConstraints(); - - static void PossibleConfigVariableCallback(const struct SConfigVariable *pVariable, void *pUserData); - -private: // Argument constraints - using TArgumentConstraints = std::map; // Constraint per argument index - using TCommandArgumentConstraints = std::map; // Constraints per command/setting name - - // Argument constraints builder - // Used to define arguments constraints for specific commands - // It uses a container stored in CMapSettingsBackend. - // Usage: - // CCommandArgumentConstraintBuilder Command(&m_Container); - // Command("tune", 2).Unique(0); // Defines argument 0 of command "tune" having 2 args as UNIQUE - // Command("tune_zone", 3).Multiple(0).Unique(1); - // // ^ Multiple() currently is only for readable purposes. It can be omited: - // // Command("tune_zone", 3).Unique(1); - // - - class CCommandArgumentConstraintBuilder; - - class CArgumentConstraintsBuilder - { - friend class CCommandArgumentConstraintBuilder; - - private: - CArgumentConstraintsBuilder(TArgumentConstraints *pContainer) : - m_pContainer(pContainer){}; - - TArgumentConstraints *m_pContainer; - - public: - CArgumentConstraintsBuilder &Multiple(int Arg) - { - // Define a multiple argument constraint - (*m_pContainer)[Arg] = EArgConstraint::MULTIPLE; - return *this; - } - - CArgumentConstraintsBuilder &Unique(int Arg) - { - // Define a unique argument constraint - (*m_pContainer)[Arg] = EArgConstraint::UNIQUE; - return *this; - } - }; - - class CCommandArgumentConstraintBuilder - { - public: - CCommandArgumentConstraintBuilder(TCommandArgumentConstraints *pContainer) : - m_pContainer(pContainer) {} - - CArgumentConstraintsBuilder operator()(const char *pSettingName, int ArgCount) - { - for(int i = 0; i < ArgCount; i++) - (*m_pContainer)[pSettingName][i] = EArgConstraint::DEFAULT; - return CArgumentConstraintsBuilder(&(*m_pContainer)[pSettingName]); - } - - private: - TCommandArgumentConstraints *m_pContainer; - }; - - TCommandArgumentConstraints m_ArgConstraintsPerCommand; - -private: // Backend fields - std::vector> m_vpMapSettings; - std::map, std::vector> m_ParsedCommandArgs; // Parsed available settings arguments, used for validation - TSettingsArgumentValues m_PossibleValuesPerCommand; - std::map m_LoaderFunctions; - - static CContext *ms_pActiveContext; - - friend class CEditor; - -private: // Map settings validation on load - struct SLoadedMapSettings - { - std::vector m_vSettingsInvalid; - std::vector m_vSettingsValid; - std::map> m_SettingsDuplicate; - - SLoadedMapSettings() : - m_vSettingsInvalid(), m_vSettingsValid(), m_SettingsDuplicate() - { - } - - void Reset() - { - m_vSettingsInvalid.clear(); - m_vSettingsValid.clear(); - m_SettingsDuplicate.clear(); - } - - } m_LoadedMapSettings; -}; - -#endif diff --git a/src/game/editor/editor_trackers.cpp b/src/game/editor/editor_trackers.cpp deleted file mode 100644 index 3200f67b81..0000000000 --- a/src/game/editor/editor_trackers.cpp +++ /dev/null @@ -1,671 +0,0 @@ -#include "editor_trackers.h" - -#include -#include - -#include "editor.h" -#include "editor_actions.h" - -CQuadEditTracker::CQuadEditTracker() : - m_pEditor(nullptr), m_TrackedProp(EQuadProp::PROP_NONE) {} - -CQuadEditTracker::~CQuadEditTracker() -{ - m_InitalPoints.clear(); - m_vSelectedQuads.clear(); -} - -void CQuadEditTracker::BeginQuadTrack(const std::shared_ptr &pLayer, const std::vector &vSelectedQuads, int GroupIndex, int LayerIndex) -{ - if(m_Tracking) - return; - m_Tracking = true; - m_vSelectedQuads.clear(); - m_pLayer = pLayer; - m_GroupIndex = GroupIndex < 0 ? m_pEditor->m_SelectedGroup : GroupIndex; - m_LayerIndex = LayerIndex < 0 ? m_pEditor->m_vSelectedLayers[0] : LayerIndex; - // Init all points - for(auto QuadIndex : vSelectedQuads) - { - auto &pQuad = pLayer->m_vQuads[QuadIndex]; - m_InitalPoints[QuadIndex] = std::vector(pQuad.m_aPoints, pQuad.m_aPoints + 5); - m_vSelectedQuads.push_back(QuadIndex); - } -} - -void CQuadEditTracker::EndQuadTrack() -{ - if(!m_Tracking) - return; - m_Tracking = false; - - // Record all moved stuff - std::vector> vpActions; - for(auto QuadIndex : m_vSelectedQuads) - { - auto &pQuad = m_pLayer->m_vQuads[QuadIndex]; - auto vCurrentPoints = std::vector(pQuad.m_aPoints, pQuad.m_aPoints + 5); - vpActions.push_back(std::make_shared(m_pEditor, m_GroupIndex, m_LayerIndex, QuadIndex, m_InitalPoints[QuadIndex], vCurrentPoints)); - } - m_pEditor->m_EditorHistory.RecordAction(std::make_shared(m_pEditor, vpActions)); -} - -void CQuadEditTracker::BeginQuadPropTrack(const std::shared_ptr &pLayer, const std::vector &vSelectedQuads, EQuadProp Prop, int GroupIndex, int LayerIndex) -{ - if(m_TrackedProp != EQuadProp::PROP_NONE) - return; - m_TrackedProp = Prop; - m_pLayer = pLayer; - m_GroupIndex = GroupIndex < 0 ? m_pEditor->m_SelectedGroup : GroupIndex; - m_LayerIndex = LayerIndex < 0 ? m_pEditor->m_vSelectedLayers[0] : LayerIndex; - m_vSelectedQuads = vSelectedQuads; - m_PreviousValues.clear(); - - for(auto QuadIndex : vSelectedQuads) - { - auto &Quad = pLayer->m_vQuads[QuadIndex]; - if(Prop == EQuadProp::PROP_POS_X || Prop == EQuadProp::PROP_POS_Y) - m_InitalPoints[QuadIndex] = std::vector(Quad.m_aPoints, Quad.m_aPoints + 5); - else if(Prop == EQuadProp::PROP_POS_ENV) - m_PreviousValues[QuadIndex] = Quad.m_PosEnv; - else if(Prop == EQuadProp::PROP_POS_ENV_OFFSET) - m_PreviousValues[QuadIndex] = Quad.m_PosEnvOffset; - else if(Prop == EQuadProp::PROP_COLOR_ENV) - m_PreviousValues[QuadIndex] = Quad.m_ColorEnv; - else if(Prop == EQuadProp::PROP_COLOR_ENV_OFFSET) - m_PreviousValues[QuadIndex] = Quad.m_ColorEnvOffset; - } -} -void CQuadEditTracker::EndQuadPropTrack(EQuadProp Prop) -{ - if(m_TrackedProp != Prop) - return; - m_TrackedProp = EQuadProp::PROP_NONE; - - std::vector> vpActions; - - for(auto QuadIndex : m_vSelectedQuads) - { - auto &Quad = m_pLayer->m_vQuads[QuadIndex]; - if(Prop == EQuadProp::PROP_POS_X || Prop == EQuadProp::PROP_POS_Y) - { - auto vCurrentPoints = std::vector(Quad.m_aPoints, Quad.m_aPoints + 5); - vpActions.push_back(std::make_shared(m_pEditor, m_GroupIndex, m_LayerIndex, QuadIndex, m_InitalPoints[QuadIndex], vCurrentPoints)); - } - else - { - int Value = 0; - if(Prop == EQuadProp::PROP_POS_ENV) - Value = Quad.m_PosEnv; - else if(Prop == EQuadProp::PROP_POS_ENV_OFFSET) - Value = Quad.m_PosEnvOffset; - else if(Prop == EQuadProp::PROP_COLOR_ENV) - Value = Quad.m_ColorEnv; - else if(Prop == EQuadProp::PROP_COLOR_ENV_OFFSET) - Value = Quad.m_ColorEnvOffset; - - if(Value != m_PreviousValues[QuadIndex]) - vpActions.push_back(std::make_shared(m_pEditor, m_GroupIndex, m_LayerIndex, QuadIndex, Prop, m_PreviousValues[QuadIndex], Value)); - } - } - - if(!vpActions.empty()) - m_pEditor->m_EditorHistory.RecordAction(std::make_shared(m_pEditor, vpActions)); -} - -void CQuadEditTracker::BeginQuadPointPropTrack(const std::shared_ptr &pLayer, const std::vector &vSelectedQuads, int SelectedQuadPoints, int GroupIndex, int LayerIndex) -{ - if(!m_vTrackedProps.empty()) - return; - - m_pLayer = pLayer; - m_GroupIndex = GroupIndex < 0 ? m_pEditor->m_SelectedGroup : GroupIndex; - m_LayerIndex = LayerIndex < 0 ? m_pEditor->m_vSelectedLayers[0] : LayerIndex; - m_SelectedQuadPoints = SelectedQuadPoints; - m_vSelectedQuads = vSelectedQuads; - m_PreviousValuesPoint.clear(); - - for(auto QuadIndex : vSelectedQuads) - { - m_PreviousValuesPoint[QuadIndex] = std::vector>(4); - } -} - -void CQuadEditTracker::AddQuadPointPropTrack(EQuadPointProp Prop) -{ - if(std::find(m_vTrackedProps.begin(), m_vTrackedProps.end(), Prop) != m_vTrackedProps.end()) - return; - - m_vTrackedProps.push_back(Prop); - - for(auto QuadIndex : m_vSelectedQuads) - { - auto &Quad = m_pLayer->m_vQuads[QuadIndex]; - if(Prop == EQuadPointProp::PROP_POS_X || Prop == EQuadPointProp::PROP_POS_Y) - m_InitalPoints[QuadIndex] = std::vector(Quad.m_aPoints, Quad.m_aPoints + 5); - else if(Prop == EQuadPointProp::PROP_COLOR) - { - for(int v = 0; v < 4; v++) - { - if(m_SelectedQuadPoints & (1 << v)) - { - int Color = PackColor(Quad.m_aColors[v]); - m_PreviousValuesPoint[QuadIndex][v][Prop] = Color; - } - } - } - else if(Prop == EQuadPointProp::PROP_TEX_U) - { - for(int v = 0; v < 4; v++) - { - if(m_SelectedQuadPoints & (1 << v)) - { - m_PreviousValuesPoint[QuadIndex][v][Prop] = Quad.m_aTexcoords[v].x; - } - } - } - else if(Prop == EQuadPointProp::PROP_TEX_V) - { - for(int v = 0; v < 4; v++) - { - if(m_SelectedQuadPoints & (1 << v)) - { - m_PreviousValuesPoint[QuadIndex][v][Prop] = Quad.m_aTexcoords[v].y; - } - } - } - } -} - -void CQuadEditTracker::EndQuadPointPropTrack(EQuadPointProp Prop) -{ - auto It = std::find(m_vTrackedProps.begin(), m_vTrackedProps.end(), Prop); - if(It == m_vTrackedProps.end()) - return; - - m_vTrackedProps.erase(It); - - std::vector> vpActions; - - for(auto QuadIndex : m_vSelectedQuads) - { - auto &Quad = m_pLayer->m_vQuads[QuadIndex]; - if(Prop == EQuadPointProp::PROP_POS_X || Prop == EQuadPointProp::PROP_POS_Y) - { - auto vCurrentPoints = std::vector(Quad.m_aPoints, Quad.m_aPoints + 5); - vpActions.push_back(std::make_shared(m_pEditor, m_GroupIndex, m_LayerIndex, QuadIndex, m_InitalPoints[QuadIndex], vCurrentPoints)); - } - else - { - int Value = 0; - for(int v = 0; v < 4; v++) - { - if(m_SelectedQuadPoints & (1 << v)) - { - if(Prop == EQuadPointProp::PROP_COLOR) - { - Value = PackColor(Quad.m_aColors[v]); - } - else if(Prop == EQuadPointProp::PROP_TEX_U) - { - Value = Quad.m_aTexcoords[v].x; - } - else if(Prop == EQuadPointProp::PROP_TEX_V) - { - Value = Quad.m_aTexcoords[v].y; - } - - if(Value != m_PreviousValuesPoint[QuadIndex][v][Prop]) - vpActions.push_back(std::make_shared(m_pEditor, m_GroupIndex, m_LayerIndex, QuadIndex, v, Prop, m_PreviousValuesPoint[QuadIndex][v][Prop], Value)); - } - } - } - } - - if(!vpActions.empty()) - m_pEditor->m_EditorHistory.RecordAction(std::make_shared(m_pEditor, vpActions)); -} - -void CQuadEditTracker::EndQuadPointPropTrackAll() -{ - std::vector> vpActions; - for(auto &Prop : m_vTrackedProps) - { - for(auto QuadIndex : m_vSelectedQuads) - { - auto &Quad = m_pLayer->m_vQuads[QuadIndex]; - if(Prop == EQuadPointProp::PROP_POS_X || Prop == EQuadPointProp::PROP_POS_Y) - { - auto vCurrentPoints = std::vector(Quad.m_aPoints, Quad.m_aPoints + 5); - vpActions.push_back(std::make_shared(m_pEditor, m_GroupIndex, m_LayerIndex, QuadIndex, m_InitalPoints[QuadIndex], vCurrentPoints)); - } - else - { - int Value = 0; - for(int v = 0; v < 4; v++) - { - if(m_SelectedQuadPoints & (1 << v)) - { - if(Prop == EQuadPointProp::PROP_COLOR) - { - Value = PackColor(Quad.m_aColors[v]); - } - else if(Prop == EQuadPointProp::PROP_TEX_U) - { - Value = Quad.m_aTexcoords[v].x; - } - else if(Prop == EQuadPointProp::PROP_TEX_V) - { - Value = Quad.m_aTexcoords[v].y; - } - - if(Value != m_PreviousValuesPoint[QuadIndex][v][Prop]) - vpActions.push_back(std::make_shared(m_pEditor, m_GroupIndex, m_LayerIndex, QuadIndex, v, Prop, m_PreviousValuesPoint[QuadIndex][v][Prop], Value)); - } - } - } - } - } - - if(!vpActions.empty()) - m_pEditor->m_EditorHistory.RecordAction(std::make_shared(m_pEditor, vpActions)); - - m_vTrackedProps.clear(); -} - -// ----------------------------- - -void CEnvelopeEditorOperationTracker::Begin(EEnvelopeEditorOp Operation) -{ - if(m_TrackedOp == Operation) - return; - - if(m_TrackedOp != EEnvelopeEditorOp::OP_NONE) - { - Stop(true); - } - - m_TrackedOp = Operation; - - if(Operation == EEnvelopeEditorOp::OP_DRAG_POINT || Operation == EEnvelopeEditorOp::OP_DRAG_POINT_X || Operation == EEnvelopeEditorOp::OP_DRAG_POINT_Y || Operation == EEnvelopeEditorOp::OP_SCALE) - { - HandlePointDragStart(); - } -} - -void CEnvelopeEditorOperationTracker::Stop(bool Switch) -{ - if(m_TrackedOp == EEnvelopeEditorOp::OP_NONE) - return; - - if(m_TrackedOp == EEnvelopeEditorOp::OP_DRAG_POINT || m_TrackedOp == EEnvelopeEditorOp::OP_DRAG_POINT_X || m_TrackedOp == EEnvelopeEditorOp::OP_DRAG_POINT_Y || m_TrackedOp == EEnvelopeEditorOp::OP_SCALE) - { - HandlePointDragEnd(Switch); - } - - m_TrackedOp = EEnvelopeEditorOp::OP_NONE; -} - -void CEnvelopeEditorOperationTracker::HandlePointDragStart() -{ - // Figure out which points are selected and which channels - // Save their X and Y position (time and value) - auto pEnv = m_pEditor->m_Map.m_vpEnvelopes[m_pEditor->m_SelectedEnvelope]; - - for(auto [PointIndex, Channel] : m_pEditor->m_vSelectedEnvelopePoints) - { - auto &Point = pEnv->m_vPoints[PointIndex]; - auto &Data = m_SavedValues[PointIndex]; - Data.m_Values[Channel] = Point.m_aValues[Channel]; - if(Data.m_Used) - continue; - Data.m_Time = Point.m_Time; - Data.m_Used = true; - } -} - -void CEnvelopeEditorOperationTracker::HandlePointDragEnd(bool Switch) -{ - if(Switch && m_TrackedOp != EEnvelopeEditorOp::OP_SCALE) - return; - - int EnvIndex = m_pEditor->m_SelectedEnvelope; - auto pEnv = m_pEditor->m_Map.m_vpEnvelopes[EnvIndex]; - std::vector> vpActions; - - for(auto const &Entry : m_SavedValues) - { - int PointIndex = Entry.first; - auto &Point = pEnv->m_vPoints[PointIndex]; - const auto &Data = Entry.second; - - if(Data.m_Time != Point.m_Time) - { // Save time - vpActions.push_back(std::make_shared(m_pEditor, EnvIndex, PointIndex, 0, CEditorActionEnvelopeEditPoint::EEditType::TIME, Data.m_Time, Point.m_Time)); - } - - for(auto Value : Data.m_Values) - { - // Value.second is the saved value, Value.first is the channel - int Channel = Value.first; - if(Value.second != Point.m_aValues[Channel]) - { // Save value - vpActions.push_back(std::make_shared(m_pEditor, EnvIndex, PointIndex, Channel, CEditorActionEnvelopeEditPoint::EEditType::VALUE, Value.second, Point.m_aValues[Channel])); - } - } - } - - if(!vpActions.empty()) - { - m_pEditor->m_EnvelopeEditorHistory.RecordAction(std::make_shared(m_pEditor, vpActions, "Envelope point drag")); - } - - m_SavedValues.clear(); -} - -// ----------------------------------------------------------------------- -CSoundSourceOperationTracker::CSoundSourceOperationTracker(CEditor *pEditor) : - m_pEditor(pEditor), m_pSource(nullptr), m_TrackedOp(ESoundSourceOp::OP_NONE), m_LayerIndex(-1) -{ -} - -void CSoundSourceOperationTracker::Begin(CSoundSource *pSource, ESoundSourceOp Operation, int LayerIndex) -{ - if(m_TrackedOp == Operation || m_TrackedOp != ESoundSourceOp::OP_NONE) - return; - - m_TrackedOp = Operation; - m_pSource = pSource; - m_LayerIndex = LayerIndex; - - if(m_TrackedOp == ESoundSourceOp::OP_MOVE) - HandlePointMove(EState::STATE_BEGIN); -} - -void CSoundSourceOperationTracker::End() -{ - if(m_TrackedOp == ESoundSourceOp::OP_NONE) - return; - - if(m_TrackedOp == ESoundSourceOp::OP_MOVE) - HandlePointMove(EState::STATE_END); - - m_TrackedOp = ESoundSourceOp::OP_NONE; -} - -void CSoundSourceOperationTracker::HandlePointMove(EState State) -{ - if(State == EState::STATE_BEGIN) - { - m_Data.m_OriginalPoint = m_pSource->m_Position; - } - else if(State == EState::STATE_END) - { - m_pEditor->m_EditorHistory.RecordAction(std::make_shared(m_pEditor, m_pEditor->m_SelectedGroup, m_LayerIndex, m_pEditor->m_SelectedSource, m_Data.m_OriginalPoint, m_pSource->m_Position)); - } -} - -// ----------------------------------------------------------------------- - -int SPropTrackerHelper::GetDefaultGroupIndex(CEditor *pEditor) -{ - return pEditor->m_SelectedGroup; -} - -int SPropTrackerHelper::GetDefaultLayerIndex(CEditor *pEditor) -{ - return pEditor->m_vSelectedLayers[0]; -} - -// ----------------------------------------------------------------------- - -void CLayerPropTracker::OnEnd(ELayerProp Prop, int Value) -{ - if(Prop == ELayerProp::PROP_GROUP) - { - m_pEditor->m_EditorHistory.RecordAction(std::make_shared(m_pEditor, m_OriginalGroupIndex, std::vector{m_OriginalLayerIndex}, m_CurrentGroupIndex, std::vector{m_CurrentLayerIndex})); - } - else - { - m_pEditor->m_EditorHistory.RecordAction(std::make_shared(m_pEditor, m_CurrentGroupIndex, m_CurrentLayerIndex, Prop, m_OriginalValue, Value)); - } -} - -int CLayerPropTracker::PropToValue(ELayerProp Prop) -{ - switch(Prop) - { - case ELayerProp::PROP_GROUP: return m_CurrentGroupIndex; - case ELayerProp::PROP_HQ: return m_pObject->m_Flags; - case ELayerProp::PROP_ORDER: return m_CurrentLayerIndex; - default: return 0; - } -} - -// ----------------------------------------------------------------------- - -bool CLayerTilesPropTracker::EndChecker(ETilesProp Prop, EEditState State, int Value) -{ - return (State == EEditState::END || State == EEditState::ONE_GO) && (Value != m_OriginalValue || Prop == ETilesProp::PROP_SHIFT); -} - -void CLayerTilesPropTracker::OnStart(ETilesProp Prop) -{ - if(Prop == ETilesProp::PROP_WIDTH || Prop == ETilesProp::PROP_HEIGHT) - { - m_SavedLayers[LAYERTYPE_TILES] = m_pObject->Duplicate(); - if(m_pObject->m_Game || m_pObject->m_Front || m_pObject->m_Switch || m_pObject->m_Speedup || m_pObject->m_Tune || m_pObject->m_Tele) - { // Need to save all entities layers when any entity layer - if(m_pEditor->m_Map.m_pFrontLayer && !m_pObject->m_Front) - m_SavedLayers[LAYERTYPE_FRONT] = m_pEditor->m_Map.m_pFrontLayer->Duplicate(); - if(m_pEditor->m_Map.m_pTeleLayer && !m_pObject->m_Tele) - m_SavedLayers[LAYERTYPE_TELE] = m_pEditor->m_Map.m_pTeleLayer->Duplicate(); - if(m_pEditor->m_Map.m_pSwitchLayer && !m_pObject->m_Switch) - m_SavedLayers[LAYERTYPE_SWITCH] = m_pEditor->m_Map.m_pSwitchLayer->Duplicate(); - if(m_pEditor->m_Map.m_pSpeedupLayer && !m_pObject->m_Speedup) - m_SavedLayers[LAYERTYPE_SPEEDUP] = m_pEditor->m_Map.m_pSpeedupLayer->Duplicate(); - if(m_pEditor->m_Map.m_pTuneLayer && !m_pObject->m_Tune) - m_SavedLayers[LAYERTYPE_TUNE] = m_pEditor->m_Map.m_pTuneLayer->Duplicate(); - if(!m_pObject->m_Game) - m_SavedLayers[LAYERTYPE_GAME] = m_pEditor->m_Map.m_pGameLayer->Duplicate(); - } - } - else if(Prop == ETilesProp::PROP_SHIFT) - { - m_SavedLayers[LAYERTYPE_TILES] = m_pObject->Duplicate(); - } -} - -void CLayerTilesPropTracker::OnEnd(ETilesProp Prop, int Value) -{ - auto pAction = std::make_shared(m_pEditor, m_OriginalGroupIndex, m_OriginalLayerIndex, Prop, m_OriginalValue, Value); - - pAction->SetSavedLayers(m_SavedLayers); - m_SavedLayers.clear(); - - m_pEditor->m_EditorHistory.RecordAction(pAction); -} - -int CLayerTilesPropTracker::PropToValue(ETilesProp Prop) -{ - switch(Prop) - { - case ETilesProp::PROP_AUTOMAPPER: return m_pObject->m_AutoMapperConfig; - case ETilesProp::PROP_COLOR: return PackColor(m_pObject->m_Color); - case ETilesProp::PROP_COLOR_ENV: return m_pObject->m_ColorEnv; - case ETilesProp::PROP_COLOR_ENV_OFFSET: return m_pObject->m_ColorEnvOffset; - case ETilesProp::PROP_HEIGHT: return m_pObject->m_Height; - case ETilesProp::PROP_WIDTH: return m_pObject->m_Width; - case ETilesProp::PROP_IMAGE: return m_pObject->m_Image; - case ETilesProp::PROP_SEED: return m_pObject->m_Seed; - case ETilesProp::PROP_SHIFT_BY: return m_pEditor->m_ShiftBy; - default: return 0; - } -} - -// ------------------------------ - -void CLayerTilesCommonPropTracker::OnStart(ETilesCommonProp Prop) -{ - for(auto &pLayer : m_vpLayers) - { - if(Prop == ETilesCommonProp::PROP_SHIFT) - { - m_SavedLayers[pLayer][LAYERTYPE_TILES] = pLayer->Duplicate(); - } - } -} - -void CLayerTilesCommonPropTracker::OnEnd(ETilesCommonProp Prop, int Value) -{ - std::vector> vpActions; - - static std::map s_PropMap{ - {ETilesCommonProp::PROP_COLOR, ETilesProp::PROP_COLOR}, - {ETilesCommonProp::PROP_SHIFT, ETilesProp::PROP_SHIFT}, - {ETilesCommonProp::PROP_SHIFT_BY, ETilesProp::PROP_SHIFT_BY}}; - - int j = 0; - for(auto &pLayer : m_vpLayers) - { - int LayerIndex = m_vLayerIndices[j++]; - auto pAction = std::make_shared(m_pEditor, m_OriginalGroupIndex, LayerIndex, s_PropMap[Prop], m_OriginalValue, Value); - pAction->SetSavedLayers(m_SavedLayers[pLayer]); - vpActions.push_back(pAction); - } - - char aDisplay[256]; - static const char *s_apNames[] = { - "width", - "height", - "shift", - "shift by", - "color", - }; - - str_format(aDisplay, sizeof(aDisplay), "Edit %d layers common property: %s", (int)m_vpLayers.size(), s_apNames[(int)Prop]); - m_pEditor->m_EditorHistory.RecordAction(std::make_shared(m_pEditor, vpActions, aDisplay)); -} - -bool CLayerTilesCommonPropTracker::EndChecker(ETilesCommonProp Prop, EEditState State, int Value) -{ - return (State == EEditState::END || State == EEditState::ONE_GO) && (Value != m_OriginalValue || Prop == ETilesCommonProp::PROP_SHIFT); -} - -int CLayerTilesCommonPropTracker::PropToValue(ETilesCommonProp Prop) -{ - if(Prop == ETilesCommonProp::PROP_SHIFT_BY) - return m_pEditor->m_ShiftBy; - return 0; -} - -// ------------------------------ - -void CLayerGroupPropTracker::OnEnd(EGroupProp Prop, int Value) -{ - m_pEditor->m_EditorHistory.RecordAction(std::make_shared(m_pEditor, m_pEditor->m_SelectedGroup, Prop, m_OriginalValue, Value)); -} - -int CLayerGroupPropTracker::PropToValue(EGroupProp Prop) -{ - switch(Prop) - { - case EGroupProp::PROP_ORDER: return m_pEditor->m_SelectedGroup; - case EGroupProp::PROP_POS_X: return m_pObject->m_OffsetX; - case EGroupProp::PROP_POS_Y: return m_pObject->m_OffsetY; - case EGroupProp::PROP_PARA_X: return m_pObject->m_ParallaxX; - case EGroupProp::PROP_PARA_Y: return m_pObject->m_ParallaxY; - case EGroupProp::PROP_USE_CLIPPING: return m_pObject->m_UseClipping; - case EGroupProp::PROP_CLIP_X: return m_pObject->m_ClipX; - case EGroupProp::PROP_CLIP_Y: return m_pObject->m_ClipY; - case EGroupProp::PROP_CLIP_W: return m_pObject->m_ClipW; - case EGroupProp::PROP_CLIP_H: return m_pObject->m_ClipH; - default: return 0; - } -} - -// ------------------------------------------------------------------ - -void CLayerQuadsPropTracker::OnEnd(ELayerQuadsProp Prop, int Value) -{ - auto pAction = std::make_shared(m_pEditor, m_OriginalGroupIndex, m_OriginalLayerIndex, Prop, m_OriginalValue, Value); - m_pEditor->m_EditorHistory.RecordAction(pAction); -} - -int CLayerQuadsPropTracker::PropToValue(ELayerQuadsProp Prop) -{ - if(Prop == ELayerQuadsProp::PROP_IMAGE) - return m_pObject->m_Image; - return 0; -} - -// ------------------------------------------------------------------- - -void CLayerSoundsPropTracker::OnEnd(ELayerSoundsProp Prop, int Value) -{ - auto pAction = std::make_shared(m_pEditor, m_OriginalGroupIndex, m_OriginalLayerIndex, Prop, m_OriginalValue, Value); - m_pEditor->m_EditorHistory.RecordAction(pAction); -} - -int CLayerSoundsPropTracker::PropToValue(ELayerSoundsProp Prop) -{ - if(Prop == ELayerSoundsProp::PROP_SOUND) - return m_pObject->m_Sound; - return 0; -} - -// ---- - -void CSoundSourcePropTracker::OnEnd(ESoundProp Prop, int Value) -{ - m_pEditor->m_EditorHistory.RecordAction(std::make_shared(m_pEditor, m_OriginalGroupIndex, m_OriginalLayerIndex, m_pEditor->m_SelectedSource, Prop, m_OriginalValue, Value)); -} - -int CSoundSourcePropTracker::PropToValue(ESoundProp Prop) -{ - switch(Prop) - { - case ESoundProp::PROP_POS_X: return m_pObject->m_Position.x; - case ESoundProp::PROP_POS_Y: return m_pObject->m_Position.y; - case ESoundProp::PROP_LOOP: return m_pObject->m_Loop; - case ESoundProp::PROP_PAN: return m_pObject->m_Pan; - case ESoundProp::PROP_TIME_DELAY: return m_pObject->m_TimeDelay; - case ESoundProp::PROP_FALLOFF: return m_pObject->m_Falloff; - case ESoundProp::PROP_POS_ENV: return m_pObject->m_PosEnv; - case ESoundProp::PROP_POS_ENV_OFFSET: return m_pObject->m_PosEnvOffset; - case ESoundProp::PROP_SOUND_ENV: return m_pObject->m_SoundEnv; - case ESoundProp::PROP_SOUND_ENV_OFFSET: return m_pObject->m_SoundEnvOffset; - default: return 0; - } -} - -// ---- - -void CSoundSourceRectShapePropTracker::OnEnd(ERectangleShapeProp Prop, int Value) -{ - m_pEditor->m_EditorHistory.RecordAction(std::make_shared(m_pEditor, m_OriginalGroupIndex, m_OriginalLayerIndex, m_pEditor->m_SelectedSource, Prop, m_OriginalValue, Value)); -} - -int CSoundSourceRectShapePropTracker::PropToValue(ERectangleShapeProp Prop) -{ - switch(Prop) - { - case ERectangleShapeProp::PROP_RECTANGLE_WIDTH: return m_pObject->m_Shape.m_Rectangle.m_Width; - case ERectangleShapeProp::PROP_RECTANGLE_HEIGHT: return m_pObject->m_Shape.m_Rectangle.m_Height; - default: return 0; - } -} - -void CSoundSourceCircleShapePropTracker::OnEnd(ECircleShapeProp Prop, int Value) -{ - m_pEditor->m_EditorHistory.RecordAction(std::make_shared(m_pEditor, m_OriginalGroupIndex, m_OriginalLayerIndex, m_pEditor->m_SelectedSource, Prop, m_OriginalValue, Value)); -} - -int CSoundSourceCircleShapePropTracker::PropToValue(ECircleShapeProp Prop) -{ - switch(Prop) - { - case ECircleShapeProp::PROP_CIRCLE_RADIUS: return m_pObject->m_Shape.m_Circle.m_Radius; - default: return 0; - } -} diff --git a/src/game/editor/editor_trackers.h b/src/game/editor/editor_trackers.h deleted file mode 100644 index 4767e732df..0000000000 --- a/src/game/editor/editor_trackers.h +++ /dev/null @@ -1,315 +0,0 @@ -#ifndef GAME_EDITOR_EDITOR_TRACKERS_H -#define GAME_EDITOR_EDITOR_TRACKERS_H - -#include -#include -#include - -#include -#include -#include - -class CEditor; -class CLayerTiles; -class CLayerGroup; -class CLayerSounds; -struct CSoundSource; - -class CQuadEditTracker -{ -public: - CQuadEditTracker(); - ~CQuadEditTracker(); - - void BeginQuadTrack(const std::shared_ptr &pLayer, const std::vector &vSelectedQuads, int GroupIndex = -1, int LayerIndex = -1); - void EndQuadTrack(); - - void BeginQuadPropTrack(const std::shared_ptr &pLayer, const std::vector &vSelectedQuads, EQuadProp Prop, int GroupIndex = -1, int LayerIndex = -1); - void EndQuadPropTrack(EQuadProp Prop); - - void BeginQuadPointPropTrack(const std::shared_ptr &pLayer, const std::vector &vSelectedQuads, int SelectedQuadPoints, int GroupIndex = -1, int LayerIndex = -1); - void AddQuadPointPropTrack(EQuadPointProp Prop); - void EndQuadPointPropTrack(EQuadPointProp Prop); - void EndQuadPointPropTrackAll(); - - CEditor *m_pEditor; - -private: - std::vector m_vSelectedQuads; - int m_SelectedQuadPoints; - std::map> m_InitalPoints; - - bool m_Tracking = false; - std::shared_ptr m_pLayer; - - EQuadProp m_TrackedProp; - std::vector m_vTrackedProps; - std::map m_PreviousValues; - std::map>> m_PreviousValuesPoint; - int m_LayerIndex; - int m_GroupIndex; -}; - -enum class EEnvelopeEditorOp -{ - OP_NONE = 0, - OP_SELECT, - OP_DRAG_POINT, - OP_DRAG_POINT_X, - OP_DRAG_POINT_Y, - OP_CONTEXT_MENU, - OP_BOX_SELECT, - OP_SCALE -}; - -enum class ESoundSourceOp -{ - OP_NONE = 0, - OP_MOVE, - OP_CONTEXT_MENU, -}; - -class CEnvelopeEditorOperationTracker -{ -public: - CEnvelopeEditorOperationTracker() = default; - - void Begin(EEnvelopeEditorOp Operation); - void Stop(bool Switch = true); - inline void Reset() { m_TrackedOp = EEnvelopeEditorOp::OP_NONE; } - - CEditor *m_pEditor; - -private: - EEnvelopeEditorOp m_TrackedOp = EEnvelopeEditorOp::OP_NONE; - - struct SPointData - { - bool m_Used; - int m_Time; - std::map m_Values; - }; - - std::map m_SavedValues; - - void HandlePointDragStart(); - void HandlePointDragEnd(bool Switch); -}; - -class CSoundSourceOperationTracker -{ -public: - CSoundSourceOperationTracker(CEditor *pEditor); - - void Begin(CSoundSource *pSource, ESoundSourceOp Operation, int LayerIndex); - void End(); - -private: - CEditor *m_pEditor; - CSoundSource *m_pSource; - ESoundSourceOp m_TrackedOp; - int m_LayerIndex; - - struct SData - { - CPoint m_OriginalPoint; - }; - SData m_Data; - - enum EState - { - STATE_BEGIN, - STATE_EDITING, - STATE_END - }; - void HandlePointMove(EState State); -}; - -struct SPropTrackerHelper -{ - static int GetDefaultGroupIndex(CEditor *pEditor); - static int GetDefaultLayerIndex(CEditor *pEditor); -}; - -template -class CPropTracker -{ -public: - CPropTracker(CEditor *pEditor) : - m_pEditor(pEditor), m_OriginalValue(0), m_pObject(nullptr), m_OriginalLayerIndex(-1), m_OriginalGroupIndex(-1), m_CurrentLayerIndex(-1), m_CurrentGroupIndex(-1), m_Tracking(false) {} - CEditor *m_pEditor; - - void Begin(T *pObject, E Prop, EEditState State, int GroupIndex = -1, int LayerIndex = -1) - { - if(m_Tracking || Prop == static_cast(-1)) - return; - m_pObject = pObject; - - m_OriginalGroupIndex = GroupIndex < 0 ? SPropTrackerHelper::GetDefaultGroupIndex(m_pEditor) : GroupIndex; - m_OriginalLayerIndex = LayerIndex < 0 ? SPropTrackerHelper::GetDefaultLayerIndex(m_pEditor) : LayerIndex; - m_CurrentGroupIndex = m_OriginalGroupIndex; - m_CurrentLayerIndex = m_OriginalLayerIndex; - - int Value = PropToValue(Prop); - if(StartChecker(Prop, State, Value)) - { - m_Tracking = true; - m_OriginalValue = Value; - OnStart(Prop); - } - } - - void End(E Prop, EEditState State, int GroupIndex = -1, int LayerIndex = -1) - { - if(!m_Tracking || Prop == static_cast(-1)) - return; - - m_CurrentGroupIndex = GroupIndex < 0 ? SPropTrackerHelper::GetDefaultGroupIndex(m_pEditor) : GroupIndex; - m_CurrentLayerIndex = LayerIndex < 0 ? SPropTrackerHelper::GetDefaultLayerIndex(m_pEditor) : LayerIndex; - - int Value = PropToValue(Prop); - if(EndChecker(Prop, State, Value)) - { - m_Tracking = false; - OnEnd(Prop, Value); - } - } - -protected: - virtual void OnStart(E Prop) {} - virtual void OnEnd(E Prop, int Value) {} - virtual int PropToValue(E Prop) { return 0; } - virtual bool StartChecker(E Prop, EEditState State, int Value) - { - return State == EEditState::START || State == EEditState::ONE_GO; - } - virtual bool EndChecker(E Prop, EEditState State, int Value) - { - return (State == EEditState::END || State == EEditState::ONE_GO) && (Value != m_OriginalValue); - } - - int m_OriginalValue; - T *m_pObject; - int m_OriginalLayerIndex; - int m_OriginalGroupIndex; - int m_CurrentLayerIndex; - int m_CurrentGroupIndex; - bool m_Tracking; -}; - -class CLayerPropTracker : public CPropTracker -{ -public: - CLayerPropTracker(CEditor *pEditor) : - CPropTracker(pEditor){}; - -protected: - void OnEnd(ELayerProp Prop, int Value) override; - int PropToValue(ELayerProp Prop) override; -}; - -class CLayerTilesPropTracker : public CPropTracker -{ -public: - CLayerTilesPropTracker(CEditor *pEditor) : - CPropTracker(pEditor){}; - -protected: - void OnStart(ETilesProp Prop) override; - void OnEnd(ETilesProp Prop, int Value) override; - bool EndChecker(ETilesProp Prop, EEditState State, int Value) override; - - int PropToValue(ETilesProp Prop) override; - -private: - std::map> m_SavedLayers; -}; - -class CLayerTilesCommonPropTracker : public CPropTracker -{ -public: - CLayerTilesCommonPropTracker(CEditor *pEditor) : - CPropTracker(pEditor){}; - -protected: - void OnStart(ETilesCommonProp Prop) override; - void OnEnd(ETilesCommonProp Prop, int Value) override; - bool EndChecker(ETilesCommonProp Prop, EEditState State, int Value) override; - - int PropToValue(ETilesCommonProp Prop) override; - -private: - std::map, std::map>> m_SavedLayers; - -public: - std::vector> m_vpLayers; - std::vector m_vLayerIndices; -}; - -class CLayerGroupPropTracker : public CPropTracker -{ -public: - CLayerGroupPropTracker(CEditor *pEditor) : - CPropTracker(pEditor){}; - -protected: - void OnEnd(EGroupProp Prop, int Value) override; - int PropToValue(EGroupProp Prop) override; -}; - -class CLayerQuadsPropTracker : public CPropTracker -{ -public: - CLayerQuadsPropTracker(CEditor *pEditor) : - CPropTracker(pEditor){}; - -protected: - void OnEnd(ELayerQuadsProp Prop, int Value) override; - int PropToValue(ELayerQuadsProp Prop) override; -}; - -class CLayerSoundsPropTracker : public CPropTracker -{ -public: - CLayerSoundsPropTracker(CEditor *pEditor) : - CPropTracker(pEditor){}; - -protected: - void OnEnd(ELayerSoundsProp Prop, int Value) override; - int PropToValue(ELayerSoundsProp Prop) override; -}; - -class CSoundSourcePropTracker : public CPropTracker -{ -public: - CSoundSourcePropTracker(CEditor *pEditor) : - CPropTracker(pEditor) {} - -protected: - void OnEnd(ESoundProp Prop, int Value) override; - int PropToValue(ESoundProp Prop) override; -}; - -class CSoundSourceRectShapePropTracker : public CPropTracker -{ -public: - CSoundSourceRectShapePropTracker(CEditor *pEditor) : - CPropTracker(pEditor) {} - -protected: - void OnEnd(ERectangleShapeProp Prop, int Value) override; - int PropToValue(ERectangleShapeProp Prop) override; -}; - -class CSoundSourceCircleShapePropTracker : public CPropTracker -{ -public: - CSoundSourceCircleShapePropTracker(CEditor *pEditor) : - CPropTracker(pEditor) {} - -protected: - void OnEnd(ECircleShapeProp Prop, int Value) override; - int PropToValue(ECircleShapeProp Prop) override; -}; - -#endif diff --git a/src/game/editor/editor_ui.h b/src/game/editor/editor_ui.h deleted file mode 100644 index b3e2b54822..0000000000 --- a/src/game/editor/editor_ui.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef GAME_EDITOR_EDITOR_UI_H -#define GAME_EDITOR_EDITOR_UI_H - -#include - -struct SEditBoxDropdownContext -{ - bool m_Visible = false; - int m_Selected = -1; - CListBox m_ListBox; - bool m_ShortcutUsed = false; - bool m_DidBecomeVisible = false; - bool m_MousePressedInside = false; - bool m_ShouldHide = false; - int m_Width = 0; -}; - -namespace EditorFontSizes { -MAYBE_UNUSED static constexpr float MENU = 10.0f; -} - -#endif diff --git a/src/game/editor/enums.h b/src/game/editor/enums.h deleted file mode 100644 index d14679b95d..0000000000 --- a/src/game/editor/enums.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef GAME_EDITOR_ENUMS_H -#define GAME_EDITOR_ENUMS_H - -constexpr const char *g_apGametileOpNames[] = { - "Air", - "Hookable", - "Death", - "Unhookable", - "Hookthrough", - "Freeze", - "Unfreeze", - "Deep Freeze", - "Deep Unfreeze", - "Blue Check-Tele", - "Red Check-Tele", - "Live Freeze", - "Live Unfreeze", -}; -enum class EGameTileOp -{ - AIR, - HOOKABLE, - DEATH, - UNHOOKABLE, - HOOKTHROUGH, - FREEZE, - UNFREEZE, - DEEP_FREEZE, - DEEP_UNFREEZE, - BLUE_CHECK_TELE, - RED_CHECK_TELE, - LIVE_FREEZE, - LIVE_UNFREEZE, -}; - -#endif diff --git a/src/game/editor/explanations.cpp b/src/game/editor/explanations.cpp deleted file mode 100644 index ad52b5d26e..0000000000 --- a/src/game/editor/explanations.cpp +++ /dev/null @@ -1,688 +0,0 @@ -#include "editor.h" - -// DDNet entity explanations by Lady Saavik -// TODO: Add other entities' tiles' explanations and improve new ones - -const char *CEditor::ExplainDDNet(int Tile, int Layer) -{ - switch(Tile) - { - case TILE_AIR: - return "EMPTY: Can be used as an eraser."; - case TILE_SOLID: - if(Layer == LAYER_GAME) - return "HOOKABLE: It's possible to hook and collide with it."; - break; - case TILE_DEATH: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "KILL: Kills the tee."; - break; - case TILE_NOHOOK: - if(Layer == LAYER_GAME) - return "UNHOOKABLE: It's not possible to hook it, but can collide with it."; - break; - case TILE_NOLASER: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "LASER BLOCKER: Doesn't let DRAGGING & SPINNING LASER and PLASMA TURRET reach tees through it."; - break; - case TILE_THROUGH_CUT: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "HOOKTHROUGH: Shortcut for new hookthrough."; - break; - case TILE_THROUGH_ALL: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "HOOKTHROUGH: Combined with a collision tile is new hookthrough, otherwise stops hooks, from all directions."; - break; - case TILE_THROUGH_DIR: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "HOOKTHROUGH: Combined with a collision tile is new hookthrough, otherwise stops hook, from one direction."; - break; - case TILE_THROUGH: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "HOOKTHROUGH: Combined with (UN)HOOKABLE tiles, allows to hook through the walls."; - break; - case TILE_JUMP: - if(Layer == LAYER_SWITCH) - return "JUMP: Sets defined amount of jumps (default is 2)."; - break; - case TILE_FREEZE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "FREEZE: Freezes tees for 3 seconds."; - if(Layer == LAYER_SWITCH) - return "FREEZE: Freezes tees for defined amount of seconds."; - break; - case TILE_UNFREEZE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "UNFREEZE: Unfreezes tees immediately."; - break; - case TILE_TELEINEVIL: - if(Layer == LAYER_TELE) - return "RED TELEPORT: After falling into this tile, tees appear on TO with the same number. Speed and hooks are reset."; - break; - case TILE_DFREEZE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "DEEP FREEZE: Permanent freeze. Only UNDEEP tile can cancel this effect."; - break; - case TILE_DUNFREEZE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "UNDEEP: Removes DEEP FREEZE effect."; - break; - case TILE_LFREEZE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "LIVE FREEZE: Live frozen tees cannot move or jump, while hook and weapons can still be used."; - break; - case TILE_LUNFREEZE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "LIVE UNFREEZE: Removes LIVE FREEZE effect."; - break; - case TILE_TELEINWEAPON: - if(Layer == LAYER_TELE) - return "WEAPON TELEPORT: Teleports bullets shot into it to TELEPORT TO, where it comes out. Direction, angle and length are kept."; - break; - case TILE_TELEINHOOK: - if(Layer == LAYER_TELE) - return "HOOK TELEPORT: Teleports hooks entering into it to TELEPORT TO, where it comes out. Direction, angle and length are kept."; - break; - case TILE_WALLJUMP: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "WALLJUMP: Placed next to a wall. Enables climbing up the wall."; - break; - case TILE_EHOOK_ENABLE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "ENDLESS HOOK: Activates endless hook."; - break; - case TILE_EHOOK_DISABLE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "ENDLESS HOOK OFF: Deactivates endless hook."; - break; - case TILE_HIT_ENABLE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "HIT OTHERS: You can hit others."; - if(Layer == LAYER_SWITCH) - return "HIT OTHERS: You can activate hitting others for single weapons, using delay number to select which."; - break; - case TILE_HIT_DISABLE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "HIT OTHERS: You can't hit others."; - if(Layer == LAYER_SWITCH) - return "HIT OTHERS: You can deactivate hitting others for single weapons, using delay number to select which."; - break; - case TILE_SOLO_ENABLE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "SOLO: You are now in a solo part."; - break; - case TILE_SOLO_DISABLE: // also TILE_SWITCHTIMEDOPEN - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "SOLO: You are now out of the solo part."; - if(Layer == LAYER_SWITCH) - return "TIME SWITCH: Activates switch (e.g. closes door) with the same number for a set amount of seconds."; - break; - case TILE_SWITCHTIMEDCLOSE: - if(Layer == LAYER_SWITCH) - return "TIME SWITCH: Deactivates switch (e.g. opens door) with the same number for a set amount of seconds."; - break; - case TILE_SWITCHOPEN: - if(Layer == LAYER_SWITCH) - return "SWITCH: Activates switch (e.g. closes door) with the same number."; - break; - case TILE_SWITCHCLOSE: - if(Layer == LAYER_SWITCH) - return "SWITCH: Deactivates switch (e.g. opens door) with the same number."; - break; - case TILE_TELEIN: - if(Layer == LAYER_TELE) - return "BLUE TELEPORT: After falling into this tile, tees appear on TO with the same number. Speed and hook are kept."; - break; - case TILE_TELEOUT: - if(Layer == LAYER_TELE) - return "TELEPORT TO: Destination tile for FROMs, WEAPON & HOOK TELEPORTs with the same numbers."; - break; - case TILE_BOOST: - if(Layer == LAYER_SPEEDUP) - return "SPEEDUP: Gives tee defined speed. Arrow shows direction and angle."; - break; - case TILE_TELECHECK: - if(Layer == LAYER_TELE) - return "CHECKPOINT TELEPORT: After having touched this tile, any CFRM will teleport you to CTO with the same number."; - break; - case TILE_TELECHECKOUT: - if(Layer == LAYER_TELE) - return "CHECKPOINT TELEPORT TO: Tees will appear here after touching TELEPORT CHECKPOINT with the same number and falling into CFROM TELEPORT."; - break; - case TILE_TELECHECKIN: - if(Layer == LAYER_TELE) - return "BLUE CHECKPOINT TELEPORT: Sends tees to CTO with the same number as the last touched TELEPORT CHECKPOINT. Speed and hook are kept."; - break; - case TILE_REFILL_JUMPS: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "REFILL JUMPS: Restores all jumps."; - break; - case TILE_START: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "START: Starts counting your race time."; - break; - case TILE_FINISH: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "FINISH: End of race."; - break; - case TILE_STOP: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "STOPPER: You can hook and shoot through it. You can't go through it against the arrow."; - break; - case TILE_STOPS: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "STOPPER: You can hook and shoot through it. You can't go through it against the arrows."; - break; - case TILE_STOPA: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "STOPPER: You can hook and shoot through it. You can't go through it."; - break; - case TILE_TELECHECKINEVIL: - if(Layer == LAYER_TELE) - return "RED CHECKPOINT TELEPORT: Send tees to CTO with the same number as the last touched TELEPORT CHECKPOINT. Speed and hook are reset."; - break; - case TILE_CP: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "SPEEDER: Causes weapons, SHIELD, HEART and SPINNING LASER to move slowly."; - break; - case TILE_CP_F: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "SPEEDER: Causes weapons, SHIELD, HEART and SPINNING LASER to move quickly."; - break; - case TILE_TUNE: - if(Layer == LAYER_TUNE) - return "TUNE ZONE: Area where defined tunes work."; - break; - case TILE_OLDLASER: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "GLOBAL OLD SHOTGUN: Shotgun drags others always towards the shooter, even after having bounced. Shooter can't hit themselves. Place only one tile somewhere on the map."; - break; - case TILE_NPC: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "GLOBAL COLLISION OFF: Nobody can collide with others. Place only one tile somewhere on the map."; - break; - case TILE_EHOOK: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "GLOBAL ENDLESS HOOK ON: Everyone has endless hook. Place only one tile somewhere on the map."; - break; - case TILE_NOHIT: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "GLOBAL HIT OTHERS OFF: Nobody can hit others. Place only one tile somewhere on the map."; - break; - case TILE_NPH: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "GLOBAL HOOK OTHERS OFF: Nobody can hook others. Place only one tile somewhere on the map."; - break; - case TILE_UNLOCK_TEAM: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "UNLOCK TEAM: Forces team to be unlocked so that team doesn't get killed when one dies."; - break; - case TILE_ADD_TIME: - if(Layer == LAYER_SWITCH) - return "PENALTY: Adds time to your current race time. Opposite of BONUS."; - break; - case TILE_NPC_DISABLE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "COLLISION OFF: You can't collide with others."; - break; - case TILE_UNLIMITED_JUMPS_DISABLE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "SUPER JUMP OFF: You don't have unlimited air jumps."; - break; - case TILE_JETPACK_DISABLE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "JETPACK OFF: You lose your jetpack gun."; - break; - case TILE_NPH_DISABLE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "HOOK OTHERS OFF: You can't hook others."; - break; - case TILE_SUBTRACT_TIME: - if(Layer == LAYER_SWITCH) - return "BONUS: Subtracts time from your current race time. Opposite of PENALTY."; - break; - case TILE_NPC_ENABLE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "COLLISION: You can collide with others."; - break; - case TILE_UNLIMITED_JUMPS_ENABLE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "SUPER JUMP: You have unlimited air jumps."; - break; - case TILE_JETPACK_ENABLE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "JETPACK: You have a jetpack gun."; - break; - case TILE_NPH_ENABLE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "HOOK OTHERS: You can hook others."; - break; - case TILE_CREDITS_1: - case TILE_CREDITS_2: - case TILE_CREDITS_3: - case TILE_CREDITS_4: - case TILE_CREDITS_5: - case TILE_CREDITS_6: - case TILE_CREDITS_7: - case TILE_CREDITS_8: - return "CREDITS: Who designed the entities."; - case TILE_ENTITIES_OFF_1: - case TILE_ENTITIES_OFF_2: - return "ENTITIES OFF SIGN: Informs people playing with entities about important marks, tips, information or text on the map."; - // Entities - case ENTITY_OFFSET + ENTITY_SPAWN: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "SPAWN: Here tees will appear after joining the game or dying somewhere on the map."; - break; - case ENTITY_OFFSET + ENTITY_SPAWN_RED: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "SPAWN: Red team members spawn here, same as normal spawn in DDRace."; - break; - case ENTITY_OFFSET + ENTITY_SPAWN_BLUE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "SPAWN: Blue team members spawn here, same as normal spawn in DDRace."; - break; - case ENTITY_OFFSET + ENTITY_FLAGSTAND_RED: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "FLAG: Not used in DDRace. Place where red team flag is."; - break; - case ENTITY_OFFSET + ENTITY_FLAGSTAND_BLUE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "FLAG: Not used in DDRace. Place where blue team flag is."; - break; - case ENTITY_OFFSET + ENTITY_ARMOR_1: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "SHIELD: Takes all weapons (except hammer and pistol) away."; - break; - case ENTITY_OFFSET + ENTITY_HEALTH_1: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "HEART: Works like a FREEZE tile. Freezes tees for 3 seconds by default."; - break; - case ENTITY_OFFSET + ENTITY_WEAPON_SHOTGUN: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "SHOTGUN: Drags the tees towards it. Bounces off the walls."; - break; - case ENTITY_OFFSET + ENTITY_WEAPON_GRENADE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "GRENADE LAUNCHER: Throws exploding bullets. Also known as rocket."; - break; - case ENTITY_OFFSET + ENTITY_POWERUP_NINJA: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "NINJA: Makes you invisible in the darkest nights."; - break; - case ENTITY_OFFSET + ENTITY_WEAPON_LASER: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "LASER: Unfreezes hit tee. Bounces off the walls. Also known as laser."; - break; - case ENTITY_OFFSET + ENTITY_LASER_FAST_CCW: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "SPINNING LASER: Tile where freezing laser (made with LASER LENGTH) begins. Counter-Clockwise, fast."; - break; - case ENTITY_OFFSET + ENTITY_LASER_NORMAL_CCW: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "SPINNING LASER: Tile where freezing laser (made with LASER LENGTH) begins. Counter-Clockwise, medium speed."; - break; - case ENTITY_OFFSET + ENTITY_LASER_SLOW_CCW: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "SPINNING LASER: Tile where freezing laser (made with LASER LENGTH) begins. Counter-Clockwise, slow."; - break; - case ENTITY_OFFSET + ENTITY_LASER_STOP: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "NON-SPINNING LASER: Tile where freezing laser (made with LASER LENGTH) begins."; - break; - case ENTITY_OFFSET + ENTITY_LASER_SLOW_CW: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "SPINNING LASER: Tile where freezing laser (made with LASER LENGTH) begins. Clockwise, slow."; - break; - case ENTITY_OFFSET + ENTITY_LASER_NORMAL_CW: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "SPINNING LASER: Tile where freezing laser (made with LASER LENGTH) begins. Clockwise, medium speed."; - break; - case ENTITY_OFFSET + ENTITY_LASER_FAST_CW: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "SPINNING LASER: Tile where freezing laser (made with LASER LENGTH) begins. Clockwise, fast."; - break; - case ENTITY_OFFSET + ENTITY_LASER_SHORT: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "LASER LENGTH: Put next to DOOR or SPINNING LASER, makes it 3 tiles long."; - break; - case ENTITY_OFFSET + ENTITY_LASER_MEDIUM: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "LASER LENGTH: Put next to DOOR or SPINNING LASER, makes it 6 tiles long."; - break; - case ENTITY_OFFSET + ENTITY_LASER_LONG: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "LASER LENGTH: Put next to DOOR or SPINNING LASER, makes it 9 tiles long."; - break; - case ENTITY_OFFSET + ENTITY_LASER_C_SLOW: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "LASER LENGTH CHANGE: Put next to LASER LENGTH, causes it to length and shorten constantly. Works only on (NON-)SPINNING LASER, not on DOOR. Lengthen, slow."; - break; - case ENTITY_OFFSET + ENTITY_LASER_C_NORMAL: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "LASER LENGTH CHANGE: Put next to LASER LENGTH, causes it to length and shorten constantly. Works only on (NON-)SPINNING LASER, not on DOOR. Lengthen, medium speed."; - break; - case ENTITY_OFFSET + ENTITY_LASER_C_FAST: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "LASER LENGTH CHANGE: Put next to LASER LENGTH, causes it to length and shorten constantly. Works only on (NON-)SPINNING LASER, not on DOOR. Lengthen, fast."; - break; - case ENTITY_OFFSET + ENTITY_LASER_O_SLOW: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "LASER LENGTH CHANGE: Put next to LASER LENGTH, causes it to length and shorten constantly. Works only on (NON-)SPINNING LASER, not on DOOR. Shorten, slow."; - break; - case ENTITY_OFFSET + ENTITY_LASER_O_NORMAL: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "LASER LENGTH CHANGE: Put next to LASER LENGTH, causes it to length and shorten constantly. Works only on (NON-)SPINNING LASER, not on DOOR. Shorten, medium speed."; - break; - case ENTITY_OFFSET + ENTITY_LASER_O_FAST: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "LASER LENGTH CHANGE: Put next to LASER LENGTH, causes it to length and shorten constantly. Works only on (NON-)SPINNING LASER, not on DOOR. Shorten, fast."; - break; - case ENTITY_OFFSET + ENTITY_PLASMAE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "PLASMA TURRET: Shoots plasma bullets at the closest tee. They explode on an obstactle they hit (wall or tee)."; - break; - case ENTITY_OFFSET + ENTITY_PLASMAF: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "PLASMA TURRET: Shoots plasma bullets that work like FREEZE at the closest tee."; - break; - case ENTITY_OFFSET + ENTITY_PLASMA: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "PLASMA TURRET: Shoots plasma bullets that work like FREEZE at the closest tee. They also explode on an obstactly they hit (wall or tee)."; - break; - case ENTITY_OFFSET + ENTITY_PLASMAU: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "PLASMA TURRET: Shoots plasma bullets that work like UNFREEZE at the closest tee."; - break; - case ENTITY_OFFSET + ENTITY_CRAZY_SHOTGUN_EX: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "EXPLODING BULLET: Bounces off the walls with explosion. Touching the bullet works like FREEZE tile (freezes for 3 seconds by default)."; - break; - case ENTITY_OFFSET + ENTITY_CRAZY_SHOTGUN: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "BULLET: Bounces off the walls without explosion. Touching the bullet works like FREEZE tile (freezes for 3 seconds by default)."; - break; - case ENTITY_OFFSET + ENTITY_ARMOR_SHOTGUN: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "SHOTGUN SHIELD: Takes shotgun away."; - break; - case ENTITY_OFFSET + ENTITY_ARMOR_GRENADE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "GRENADE SHIELD: Takes grenade away."; - break; - case ENTITY_OFFSET + ENTITY_ARMOR_NINJA: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "NINJA SHIELD: Takes ninja away."; - break; - case ENTITY_OFFSET + ENTITY_ARMOR_LASER: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "LASER SHIELD: Takes laser away."; - break; - case ENTITY_OFFSET + ENTITY_DRAGGER_WEAK: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "DRAGGING LASER: Grabs and attracts the closest tee to it. Can't reach tees through walls and LASER BLOCKER. Weak."; - break; - case ENTITY_OFFSET + ENTITY_DRAGGER_NORMAL: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "DRAGGING LASER: Grabs and attracts the closest tee to it. Can't reach tees through walls and LASER BLOCKER. Medium strength."; - break; - case ENTITY_OFFSET + ENTITY_DRAGGER_STRONG: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "DRAGGING LASER: Grabs and attracts the closest tee to it. Can't reach tees through walls and LASER BLOCKER. Strong."; - break; - case ENTITY_OFFSET + ENTITY_DRAGGER_WEAK_NW: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "DRAGGING LASER: Grabs and attracts the closest tee to it. Can reach tees through walls but not through LASER BLOCKER. Weak."; - break; - case ENTITY_OFFSET + ENTITY_DRAGGER_NORMAL_NW: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "DRAGGING LASER: Grabs and attracts the closest tee to it. Can reach tees through walls but not through LASER BLOCKER. Medium strength."; - break; - case ENTITY_OFFSET + ENTITY_DRAGGER_STRONG_NW: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "DRAGGING LASER: Grabs and attracts the closest tee to it. Can reach tees through walls but not through LASER BLOCKER. Strong."; - break; - case ENTITY_OFFSET + ENTITY_DOOR: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH) - return "DOOR: Combined with LASER LENGTH creates doors. Doesn't allow to go through it (only with NINJA)."; - break; - case TILE_TELE_GUN_ENABLE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "TELEGUN: Turn gun on as telegun weapon."; - break; - case TILE_TELE_GUN_DISABLE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "TELEGUN OFF: Turn gun off as telegun weapon."; - break; - case TILE_ALLOW_TELE_GUN: - if(Layer == LAYER_FRONT) - return "TELEGUN: Place on top of a collision tile, activates a spot to teleport to, cancels movement."; - if(Layer == LAYER_SWITCH) - return "TELEGUN: Place on top of a collision tile, activates a spot to teleport to, cancels movement, for single weapons, using delay number to select which."; - break; - case TILE_ALLOW_BLUE_TELE_GUN: - if(Layer == LAYER_FRONT) - return "TELEGUN: Place on top of a collision tile, activates a spot to teleport to, preserves movement."; - if(Layer == LAYER_SWITCH) - return "TELEGUN: Place on top of a collision tile, activates a spot to teleport to, preserves movement, for single weapons, using delay number to select which."; - break; - case TILE_TELE_GRENADE_ENABLE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "TELEGRENADE: Turn grenade on as telegun weapon."; - break; - case TILE_TELE_GRENADE_DISABLE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "TELEGRENADE OFF: Turn grenade off as telegun weapon."; - break; - case TILE_TELE_LASER_ENABLE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "TELELASER: Turn laser on as telegun weapon."; - break; - case TILE_TELE_LASER_DISABLE: - if(Layer == LAYER_GAME || Layer == LAYER_FRONT) - return "TELELASER OFF: Turn laser off as telegun weapon."; - break; - } - if(Tile >= TILE_TIME_CHECKPOINT_FIRST && Tile <= TILE_TIME_CHECKPOINT_LAST && (Layer == LAYER_GAME || Layer == LAYER_FRONT)) - return "TIME CHECKPOINT: Compares your current race time with your record to show you whether you are running faster or slower."; - return nullptr; -} - -const char *CEditor::ExplainFNG(int Tile, int Layer) -{ - switch(Tile) - { - case TILE_PUB_AIR: - return "EMPTY: Can be used as an eraser."; - case TILE_PUB_HOOKABLE: - if(Layer == LAYER_GAME) - return "HOOKABLE: It's possible to hook and collide with it."; - break; - case TILE_PUB_DEATH: - if(Layer == LAYER_GAME) - return "DEATH: Kills the tee."; - break; - case TILE_PUB_UNHOOKABLE: - if(Layer == LAYER_GAME) - return "UNHOOKABLE: It's not possible to hook it, but can collide with it."; - break; - case TILE_FNG_SPIKE_GOLD: - if(Layer == LAYER_GAME) - return "GOLDEN SPIKE: Kills the tee and gives points to the killer. (Amount of points given is set inside the server)"; - break; - case TILE_FNG_SPIKE_NORMAL: - if(Layer == LAYER_GAME) - return "NORMAL SPIKE: Kills the tee and gives points to the killer. (Amount of points given is set inside the server)"; - break; - case TILE_FNG_SPIKE_RED: - if(Layer == LAYER_GAME) - return "RED SPIKE: Red team spikes. Gives negative points when killer is in blue team (Amount of points given is set inside the server)"; - break; - case TILE_FNG_SPIKE_BLUE: - if(Layer == LAYER_GAME) - return "BLUE SPIKE: Blue team spikes. Gives negative points when killer is in red team (Amount of points given is set inside the server)"; - break; - case TILE_FNG_SCORE_RED: - if(Layer == LAYER_GAME) - return "SCORE: Old tile used for showing red team score using laser text. No longer usable in FNG2"; - break; - case TILE_FNG_SCORE_BLUE: - if(Layer == LAYER_GAME) - return "SCORE: Old tile used for showing blue team score using laser text. No longer usable in FNG2"; - break; - case TILE_FNG_SPIKE_GREEN: - if(Layer == LAYER_GAME) - return "GREEN SPIKE: Kills the tee and gives points to the killer. (Amount of points given is set inside the server)"; - break; - case TILE_FNG_SPIKE_PURPLE: - if(Layer == LAYER_GAME) - return "PURPLE SPIKE: Kills the tee and gives points to the killer. (Amount of points given is set inside the server)"; - break; - case TILE_FNG_SPAWN: - if(Layer == LAYER_GAME) - return "SPAWN: Here tees will appear after joining the game or dying."; - break; - case TILE_FNG_SPAWN_RED: - if(Layer == LAYER_GAME) - return "SPAWN: Red team members spawn here."; - break; - case TILE_FNG_SPAWN_BLUE: - if(Layer == LAYER_GAME) - return "SPAWN: Blue team members spawn here."; - break; - case TILE_FNG_FLAG_RED: - if(Layer == LAYER_GAME) - return "FLAG: Not used in FNG. Place where red team flag is."; - break; - case TILE_FNG_FLAG_BLUE: - if(Layer == LAYER_GAME) - return "FLAG: Not used in FNG. Place where blue team flag is."; - break; - case TILE_FNG_SHIELD: - if(Layer == LAYER_GAME) - return "SHIELD: Does nothing in FNG."; - break; - case TILE_FNG_HEART: - if(Layer == LAYER_GAME) - return "HEART: Does nothing in FNG."; - break; - case TILE_FNG_SHOTGUN: - if(Layer == LAYER_GAME) - return "SHOTGUN: Not used in FNG. Gives you shotgun with 10 charges."; - break; - case TILE_FNG_GRENADE: - if(Layer == LAYER_GAME) - return "GRENADE: Gives you grenade weapon with 10 charges. Not really useful in FNG."; - break; - case TILE_FNG_NINJA: - if(Layer == LAYER_GAME) - return "NINJA: Does nothing in FNG."; - break; - case TILE_FNG_LASER: - if(Layer == LAYER_GAME) - return "LASER: Gives you laser weapon with 10 charges. Not really useful in FNG."; - break; - case TILE_FNG_SPIKE_OLD1: - case TILE_FNG_SPIKE_OLD2: - case TILE_FNG_SPIKE_OLD3: - if(Layer == LAYER_GAME) - return "SPIKE: Old FNG spikes. Deprecated."; - break; - } - if((Tile >= TILE_PUB_CREDITS1 && Tile <= TILE_PUB_CREDITS8) && Layer == LAYER_GAME) - return "CREDITS: Who designed the entities."; - else if((Tile == TILE_PUB_ENTITIES_OFF1 || Tile == TILE_PUB_ENTITIES_OFF2) && Layer == LAYER_GAME) - return "ENTITIES OFF SIGN: Informs people playing with entities about important marks, tips, information or text on the map."; - return nullptr; -} - -const char *CEditor::ExplainVanilla(int Tile, int Layer) -{ - switch(Tile) - { - case TILE_PUB_AIR: - return "EMPTY: Can be used as an eraser."; - case TILE_PUB_HOOKABLE: - if(Layer == LAYER_GAME) - return "HOOKABLE: It's possible to hook and collide with it."; - break; - case TILE_PUB_DEATH: - if(Layer == LAYER_GAME) - return "DEATH: Kills the tee."; - break; - case TILE_PUB_UNHOOKABLE: - if(Layer == LAYER_GAME) - return "UNHOOKABLE: It's not possible to hook it, but can collide with it."; - break; - case TILE_VANILLA_SPAWN: - if(Layer == LAYER_GAME) - return "SPAWN: Here tees will appear after joining the game or dying."; - break; - case TILE_VANILLA_SPAWN_RED: - if(Layer == LAYER_GAME) - return "SPAWN: Red team members spawn here."; - break; - case TILE_VANILLA_SPAWN_BLUE: - if(Layer == LAYER_GAME) - return "SPAWN: Blue team members spawn here."; - break; - case TILE_VANILLA_FLAG_RED: - if(Layer == LAYER_GAME) - return "FLAG: Place where red team flag is."; - break; - case TILE_VANILLA_FLAG_BLUE: - if(Layer == LAYER_GAME) - return "FLAG: Place where blue team flag is."; - break; - case TILE_VANILLA_SHIELD: - if(Layer == LAYER_GAME) - return "SHIELD: Gives player +1 shield."; - break; - case TILE_VANILLA_HEART: - if(Layer == LAYER_GAME) - return "HEART: Gives player +1 health"; - break; - case TILE_VANILLA_SHOTGUN: - if(Layer == LAYER_GAME) - return "SHOTGUN: Gives you shotgun weapon with 10 charges."; - break; - case TILE_VANILLA_GRENADE: - if(Layer == LAYER_GAME) - return "GRENADE: Gives you grenade weapon with 10 charges."; - break; - case TILE_VANILLA_NINJA: - if(Layer == LAYER_GAME) - return "NINJA: Gives you ninja for a period of time."; - break; - case TILE_VANILLA_LASER: - if(Layer == LAYER_GAME) - return "LASER: Gives you laser weapon with 10 charges."; - break; - } - if((Tile >= TILE_PUB_CREDITS1 && Tile <= TILE_PUB_CREDITS8) && Layer == LAYER_GAME) - return "CREDITS: Who designed the entities."; - else if((Tile == TILE_PUB_ENTITIES_OFF1 || Tile == TILE_PUB_ENTITIES_OFF2) && Layer == LAYER_GAME) - return "ENTITIES OFF SIGN: Informs people playing with entities about important marks, tips, information or text on the map."; - return nullptr; -} - -const char *CEditor::Explain(EExplanation Explanation, int Tile, int Layer) -{ - switch(Explanation) - { - case EExplanation::NONE: - return nullptr; - case EExplanation::DDNET: - return ExplainDDNet(Tile, Layer); - case EExplanation::FNG: - return ExplainFNG(Tile, Layer); - case EExplanation::RACE: - return nullptr; // TODO: Explanations for Race - case EExplanation::VANILLA: - return ExplainVanilla(Tile, Layer); - case EExplanation::BLOCKWORLDS: - return nullptr; // TODO: Explanations for Blockworlds - } - dbg_assert(false, "logic error"); - return nullptr; -} diff --git a/src/game/editor/layer_selector.cpp b/src/game/editor/layer_selector.cpp deleted file mode 100644 index 4db70b67c8..0000000000 --- a/src/game/editor/layer_selector.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include - -#include "editor.h" - -#include "layer_selector.h" - -void CLayerSelector::OnInit(CEditor *pEditor) -{ - CEditorComponent::OnInit(pEditor); - - m_SelectionOffset = 0; -} - -bool CLayerSelector::SelectByTile() -{ - // ctrl+rightclick a map index to select the layer that has a tile there - if(Ui()->HotItem() != &Editor()->m_MapEditorId) - return false; - if(!Input()->ModifierIsPressed() || !Ui()->MouseButtonClicked(1)) - return false; - if(!g_Config.m_EdLayerSelector) - return false; - - int MatchedGroup = -1; - int MatchedLayer = -1; - int Matches = 0; - bool IsFound = false; - for(auto HoverTile : Editor()->HoverTiles()) - { - if(MatchedGroup == -1) - { - MatchedGroup = HoverTile.m_Group; - MatchedLayer = HoverTile.m_Layer; - } - if(++Matches > m_SelectionOffset) - { - m_SelectionOffset++; - MatchedGroup = HoverTile.m_Group; - MatchedLayer = HoverTile.m_Layer; - IsFound = true; - break; - } - } - if(MatchedGroup != -1 && MatchedLayer != -1) - { - if(!IsFound) - m_SelectionOffset = 1; - Editor()->SelectLayer(MatchedLayer, MatchedGroup); - return true; - } - return false; -} diff --git a/src/game/editor/layer_selector.h b/src/game/editor/layer_selector.h deleted file mode 100644 index 1ea088ac24..0000000000 --- a/src/game/editor/layer_selector.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef GAME_EDITOR_LAYER_SELECTOR_H -#define GAME_EDITOR_LAYER_SELECTOR_H - -#include "component.h" - -class CLayerSelector : public CEditorComponent -{ - int m_SelectionOffset; - -public: - void OnInit(CEditor *pEditor) override; - bool SelectByTile(); -}; - -#endif diff --git a/src/game/editor/map_grid.cpp b/src/game/editor/map_grid.cpp deleted file mode 100644 index 6b090610fa..0000000000 --- a/src/game/editor/map_grid.cpp +++ /dev/null @@ -1,149 +0,0 @@ -#include "map_grid.h" - -#include - -#include "editor.h" - -static constexpr int MIN_GRID_FACTOR = 1; -static constexpr int MAX_GRID_FACTOR = 15; - -void CMapGrid::OnReset() -{ - m_GridActive = false; - m_GridFactor = 1; -} - -void CMapGrid::OnRender(CUIRect View) -{ - if(!m_GridActive) - return; - - std::shared_ptr pGroup = Editor()->GetSelectedGroup(); - if(pGroup) - { - pGroup->MapScreen(); - - float aGroupPoints[4]; - pGroup->Mapping(aGroupPoints); - - const CUIRect *pScreen = Ui()->Screen(); - - int LineDistance = GridLineDistance(); - - int XOffset = aGroupPoints[0] / LineDistance; - int YOffset = aGroupPoints[1] / LineDistance; - int XGridOffset = XOffset % m_GridFactor; - int YGridOffset = YOffset % m_GridFactor; - - Graphics()->TextureClear(); - Graphics()->LinesBegin(); - - for(int i = 0; i < (int)pScreen->w; i++) - { - if((i + YGridOffset) % m_GridFactor == 0) - Graphics()->SetColor(1.0f, 0.3f, 0.3f, 0.3f); - else - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.15f); - - IGraphics::CLineItem Line = IGraphics::CLineItem(LineDistance * XOffset, LineDistance * i + LineDistance * YOffset, pScreen->w + aGroupPoints[2], LineDistance * i + LineDistance * YOffset); - Graphics()->LinesDraw(&Line, 1); - - if((i + XGridOffset) % m_GridFactor == 0) - Graphics()->SetColor(1.0f, 0.3f, 0.3f, 0.3f); - else - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.15f); - - Line = IGraphics::CLineItem(LineDistance * i + LineDistance * XOffset, LineDistance * YOffset, LineDistance * i + LineDistance * XOffset, pScreen->h + aGroupPoints[3]); - Graphics()->LinesDraw(&Line, 1); - } - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - Graphics()->LinesEnd(); - } -} - -int CMapGrid::GridLineDistance() const -{ - if(Editor()->MapView()->Zoom()->GetValue() <= 10.0f) - return 4; - else if(Editor()->MapView()->Zoom()->GetValue() <= 50.0f) - return 8; - else if(Editor()->MapView()->Zoom()->GetValue() <= 100.0f) - return 16; - else if(Editor()->MapView()->Zoom()->GetValue() <= 250.0f) - return 32; - else if(Editor()->MapView()->Zoom()->GetValue() <= 450.0f) - return 64; - else if(Editor()->MapView()->Zoom()->GetValue() <= 850.0f) - return 128; - else if(Editor()->MapView()->Zoom()->GetValue() <= 1550.0f) - return 256; - else - return 512; -} - -void CMapGrid::SnapToGrid(float &x, float &y) const -{ - const int GridDistance = GridLineDistance() * m_GridFactor; - x = (int)((x + (x >= 0 ? 1.0f : -1.0f) * GridDistance / 2) / GridDistance) * GridDistance; - y = (int)((y + (y >= 0 ? 1.0f : -1.0f) * GridDistance / 2) / GridDistance) * GridDistance; -} - -bool CMapGrid::IsEnabled() const -{ - return m_GridActive; -} - -void CMapGrid::Toggle() -{ - m_GridActive = !m_GridActive; -} - -int CMapGrid::Factor() const -{ - return m_GridFactor; -} - -void CMapGrid::SetFactor(int Factor) -{ - m_GridFactor = clamp(Factor, MIN_GRID_FACTOR, MAX_GRID_FACTOR); -} - -void CMapGrid::DoSettingsPopup(vec2 Position) -{ - Ui()->DoPopupMenu(&m_PopupGridSettingsId, Position.x, Position.y, 120.0f, 37.0f, this, PopupGridSettings); -} - -CUi::EPopupMenuFunctionResult CMapGrid::PopupGridSettings(void *pContext, CUIRect View, bool Active) -{ - CMapGrid *pMapGrid = static_cast(pContext); - - enum - { - PROP_SIZE = 0, - NUM_PROPS, - }; - CProperty aProps[] = { - {"Size", pMapGrid->Factor(), PROPTYPE_INT, MIN_GRID_FACTOR, MAX_GRID_FACTOR}, - {nullptr}, - }; - - static int s_aIds[NUM_PROPS]; - int NewVal; - int Prop = pMapGrid->Editor()->DoProperties(&View, aProps, s_aIds, &NewVal); - - if(Prop == PROP_SIZE) - { - pMapGrid->SetFactor(NewVal); - } - - CUIRect Button; - View.HSplitBottom(12.0f, &View, &Button); - - static char s_DefaultButton; - if(pMapGrid->Editor()->DoButton_Ex(&s_DefaultButton, "Default", 0, &Button, 0, "Normal grid size", IGraphics::CORNER_ALL)) - { - pMapGrid->SetFactor(1); - } - - return CUi::POPUP_KEEP_OPEN; -} diff --git a/src/game/editor/map_grid.h b/src/game/editor/map_grid.h deleted file mode 100644 index 0a4110cb51..0000000000 --- a/src/game/editor/map_grid.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef GAME_EDITOR_MAP_GRID_H -#define GAME_EDITOR_MAP_GRID_H - -#include "component.h" - -#include - -class CMapGrid : public CEditorComponent -{ -public: - void OnReset() override; - void OnRender(CUIRect View) override; - - void SnapToGrid(float &x, float &y) const; - int GridLineDistance() const; - - /** - * Returns whether the grid is rendered. - */ - bool IsEnabled() const; - - void Toggle(); - - int Factor() const; - void SetFactor(int Factor); - - void DoSettingsPopup(vec2 Position); - -private: - bool m_GridActive; - int m_GridFactor; - - SPopupMenuId m_PopupGridSettingsId; - static CUi::EPopupMenuFunctionResult PopupGridSettings(void *pContext, CUIRect View, bool Active); -}; - -#endif diff --git a/src/game/editor/map_view.cpp b/src/game/editor/map_view.cpp deleted file mode 100644 index 355eb8b91a..0000000000 --- a/src/game/editor/map_view.cpp +++ /dev/null @@ -1,236 +0,0 @@ -#include "map_view.h" - -#include -#include - -#include -#include - -#include "editor.h" - -void CMapView::OnInit(CEditor *pEditor) -{ - CEditorComponent::OnInit(pEditor); - RegisterSubComponent(m_MapGrid); - RegisterSubComponent(m_ProofMode); - InitSubComponents(); -} - -void CMapView::OnReset() -{ - m_Zoom = CSmoothValue(200.0f, 10.0f, 2000.0f); - m_Zoom.OnInit(Editor()); - m_WorldZoom = 1.0f; - - SetWorldOffset({0, 0}); - SetEditorOffset({0, 0}); - - m_ProofMode.OnReset(); - m_MapGrid.OnReset(); - m_ShowPicker = false; -} - -void CMapView::OnMapLoad() -{ - m_ProofMode.OnMapLoad(); -} - -bool CMapView::IsFocused() -{ - if(m_ProofMode.m_ProofBorders == CProofMode::PROOF_BORDER_MENU) - return GetWorldOffset() == m_ProofMode.m_vMenuBackgroundPositions[m_ProofMode.m_CurrentMenuProofIndex]; - else - return GetWorldOffset() == vec2(0, 0); -} - -void CMapView::Focus() -{ - if(m_ProofMode.m_ProofBorders == CProofMode::PROOF_BORDER_MENU) - SetWorldOffset(m_ProofMode.m_vMenuBackgroundPositions[m_ProofMode.m_CurrentMenuProofIndex]); - else - SetWorldOffset({0, 0}); -} - -void CMapView::RenderGroupBorder() -{ - std::shared_ptr pGroup = Editor()->GetSelectedGroup(); - if(pGroup) - { - pGroup->MapScreen(); - - for(size_t i = 0; i < Editor()->m_vSelectedLayers.size(); i++) - { - std::shared_ptr pLayer = Editor()->GetSelectedLayerType(i, LAYERTYPE_TILES); - if(pLayer) - { - float w, h; - pLayer->GetSize(&w, &h); - - IGraphics::CLineItem aArray[4] = { - IGraphics::CLineItem(0, 0, w, 0), - IGraphics::CLineItem(w, 0, w, h), - IGraphics::CLineItem(w, h, 0, h), - IGraphics::CLineItem(0, h, 0, 0)}; - Graphics()->TextureClear(); - Graphics()->LinesBegin(); - Graphics()->LinesDraw(aArray, std::size(aArray)); - Graphics()->LinesEnd(); - } - } - } -} - -void CMapView::RenderMap() -{ - if(Editor()->m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && Input()->ShiftIsPressed() && !Input()->ModifierIsPressed() && Input()->KeyPress(KEY_G)) - { - const bool AnyHidden = - !Editor()->m_Map.m_pGameLayer->m_Visible || - (Editor()->m_Map.m_pFrontLayer && !Editor()->m_Map.m_pFrontLayer->m_Visible) || - (Editor()->m_Map.m_pTeleLayer && !Editor()->m_Map.m_pTeleLayer->m_Visible) || - (Editor()->m_Map.m_pSpeedupLayer && !Editor()->m_Map.m_pSpeedupLayer->m_Visible) || - (Editor()->m_Map.m_pTuneLayer && !Editor()->m_Map.m_pTuneLayer->m_Visible) || - (Editor()->m_Map.m_pSwitchLayer && !Editor()->m_Map.m_pSwitchLayer->m_Visible); - Editor()->m_Map.m_pGameLayer->m_Visible = AnyHidden; - if(Editor()->m_Map.m_pFrontLayer) - Editor()->m_Map.m_pFrontLayer->m_Visible = AnyHidden; - if(Editor()->m_Map.m_pTeleLayer) - Editor()->m_Map.m_pTeleLayer->m_Visible = AnyHidden; - if(Editor()->m_Map.m_pSpeedupLayer) - Editor()->m_Map.m_pSpeedupLayer->m_Visible = AnyHidden; - if(Editor()->m_Map.m_pTuneLayer) - Editor()->m_Map.m_pTuneLayer->m_Visible = AnyHidden; - if(Editor()->m_Map.m_pSwitchLayer) - Editor()->m_Map.m_pSwitchLayer->m_Visible = AnyHidden; - } - - for(auto &pGroup : Editor()->m_Map.m_vpGroups) - { - if(pGroup->m_Visible) - pGroup->Render(); - } - - // render the game, tele, speedup, front, tune and switch above everything else - if(Editor()->m_Map.m_pGameGroup->m_Visible) - { - Editor()->m_Map.m_pGameGroup->MapScreen(); - for(auto &pLayer : Editor()->m_Map.m_pGameGroup->m_vpLayers) - { - if(pLayer->m_Visible && pLayer->IsEntitiesLayer()) - pLayer->Render(); - } - } - - std::shared_ptr pSelectedTilesLayer = std::static_pointer_cast(Editor()->GetSelectedLayerType(0, LAYERTYPE_TILES)); - if(Editor()->m_ShowTileInfo != CEditor::SHOW_TILE_OFF && pSelectedTilesLayer && pSelectedTilesLayer->m_Visible && m_Zoom.GetValue() <= 300.0f) - { - Editor()->GetSelectedGroup()->MapScreen(); - pSelectedTilesLayer->ShowInfo(); - } -} - -void CMapView::ResetZoom() -{ - SetEditorOffset({0, 0}); - m_Zoom.SetValue(100.0f); -} - -float CMapView::ScaleLength(float Value) const -{ - return m_WorldZoom * Value; -} - -void CMapView::ZoomMouseTarget(float ZoomFactor) -{ - // zoom to the current mouse position - // get absolute mouse position - float aPoints[4]; - RenderTools()->MapScreenToWorld( - GetWorldOffset().x, GetWorldOffset().y, - 100.0f, 100.0f, 100.0f, 0.0f, 0.0f, Graphics()->ScreenAspect(), m_WorldZoom, aPoints); - - float WorldWidth = aPoints[2] - aPoints[0]; - float WorldHeight = aPoints[3] - aPoints[1]; - - float Mwx = aPoints[0] + WorldWidth * (Ui()->MouseX() / Ui()->Screen()->w); - float Mwy = aPoints[1] + WorldHeight * (Ui()->MouseY() / Ui()->Screen()->h); - - // adjust camera - OffsetWorld((vec2(Mwx, Mwy) - GetWorldOffset()) * (1.0f - ZoomFactor)); -} - -void CMapView::UpdateZoom() -{ - float OldLevel = m_Zoom.GetValue(); - bool UpdatedZoom = m_Zoom.UpdateValue(); - m_Zoom.SetValueRange(10.0f, g_Config.m_EdLimitMaxZoomLevel ? 2000.0f : std::numeric_limits::max()); - float NewLevel = m_Zoom.GetValue(); - if(UpdatedZoom && g_Config.m_EdZoomTarget) - ZoomMouseTarget(NewLevel / OldLevel); - m_WorldZoom = NewLevel / 100.0f; -} - -CSmoothValue *CMapView::Zoom() -{ - return &m_Zoom; -} - -const CSmoothValue *CMapView::Zoom() const -{ - return &m_Zoom; -} - -CProofMode *CMapView::ProofMode() -{ - return &m_ProofMode; -} - -const CProofMode *CMapView::ProofMode() const -{ - return &m_ProofMode; -} - -CMapGrid *CMapView::MapGrid() -{ - return &m_MapGrid; -} - -const CMapGrid *CMapView::MapGrid() const -{ - return &m_MapGrid; -} - -void CMapView::OffsetWorld(vec2 Offset) -{ - m_WorldOffset += Offset; -} - -void CMapView::OffsetEditor(vec2 Offset) -{ - m_EditorOffset += Offset; -} - -void CMapView::SetWorldOffset(vec2 WorldOffset) -{ - m_WorldOffset = WorldOffset; -} - -void CMapView::SetEditorOffset(vec2 EditorOffset) -{ - m_EditorOffset = EditorOffset; -} - -vec2 CMapView::GetWorldOffset() const -{ - return m_WorldOffset; -} - -vec2 CMapView::GetEditorOffset() const -{ - return m_EditorOffset; -} - -float CMapView::GetWorldZoom() const -{ - return m_WorldZoom; -} diff --git a/src/game/editor/map_view.h b/src/game/editor/map_view.h deleted file mode 100644 index ca99ca836d..0000000000 --- a/src/game/editor/map_view.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef GAME_EDITOR_MAP_VIEW_H -#define GAME_EDITOR_MAP_VIEW_H - -#include - -#include "component.h" -#include "map_grid.h" -#include "proof_mode.h" -#include "smooth_value.h" - -class CLayerGroup; - -class CMapView : public CEditorComponent -{ -public: - void OnInit(CEditor *pEditor) override; - void OnReset() override; - void OnMapLoad() override; - - void ZoomMouseTarget(float ZoomFactor); - void UpdateZoom(); - - void RenderGroupBorder(); - void RenderMap(); - - bool IsFocused(); - void Focus(); - - /** - * Reset zoom and editor offset. - */ - void ResetZoom(); - - /** - * Scale length according to zoom value. - */ - float ScaleLength(float Value) const; - - bool m_ShowPicker; // TODO: make private - - float GetWorldZoom() const; - - void OffsetWorld(vec2 Offset); - void OffsetEditor(vec2 Offset); - void SetWorldOffset(vec2 WorldOffset); - void SetEditorOffset(vec2 EditorOffset); - vec2 GetWorldOffset() const; - vec2 GetEditorOffset() const; - - CSmoothValue *Zoom(); - const CSmoothValue *Zoom() const; - CProofMode *ProofMode(); - const CProofMode *ProofMode() const; - CMapGrid *MapGrid(); - const CMapGrid *MapGrid() const; - -private: - CSmoothValue m_Zoom = CSmoothValue(200.0f, 10.0f, 2000.0f); - float m_WorldZoom; - - CProofMode m_ProofMode; - CMapGrid m_MapGrid; - - vec2 m_WorldOffset; - vec2 m_EditorOffset; -}; - -#endif diff --git a/src/game/editor/mapitems.h b/src/game/editor/mapitems.h deleted file mode 100644 index 7873ee7e73..0000000000 --- a/src/game/editor/mapitems.h +++ /dev/null @@ -1,125 +0,0 @@ -#ifndef GAME_EDITOR_MAPITEMS_H -#define GAME_EDITOR_MAPITEMS_H - -enum class EQuadProp -{ - PROP_NONE = -1, - PROP_ORDER, - PROP_POS_X, - PROP_POS_Y, - PROP_POS_ENV, - PROP_POS_ENV_OFFSET, - PROP_COLOR_ENV, - PROP_COLOR_ENV_OFFSET, - NUM_PROPS, -}; - -enum class EQuadPointProp -{ - PROP_NONE = -1, - PROP_POS_X, - PROP_POS_Y, - PROP_COLOR, - PROP_TEX_U, - PROP_TEX_V, - NUM_PROPS, -}; - -enum class ESoundProp -{ - PROP_NONE = -1, - PROP_POS_X, - PROP_POS_Y, - PROP_LOOP, - PROP_PAN, - PROP_TIME_DELAY, - PROP_FALLOFF, - PROP_POS_ENV, - PROP_POS_ENV_OFFSET, - PROP_SOUND_ENV, - PROP_SOUND_ENV_OFFSET, - NUM_PROPS, -}; - -enum class ERectangleShapeProp -{ - PROP_NONE = -1, - PROP_RECTANGLE_WIDTH, - PROP_RECTANGLE_HEIGHT, - NUM_RECTANGLE_PROPS, -}; - -enum class ECircleShapeProp -{ - PROP_NONE = -1, - PROP_CIRCLE_RADIUS, - NUM_CIRCLE_PROPS, -}; - -enum class ELayerProp -{ - PROP_NONE = -1, - PROP_GROUP, - PROP_ORDER, - PROP_HQ, - NUM_PROPS, -}; - -enum class ETilesProp -{ - PROP_NONE = -1, - PROP_WIDTH, - PROP_HEIGHT, - PROP_SHIFT, - PROP_SHIFT_BY, - PROP_IMAGE, - PROP_COLOR, - PROP_COLOR_ENV, - PROP_COLOR_ENV_OFFSET, - PROP_AUTOMAPPER, - PROP_SEED, - NUM_PROPS -}; - -enum class ETilesCommonProp -{ - PROP_NONE = -1, - PROP_WIDTH, - PROP_HEIGHT, - PROP_SHIFT, - PROP_SHIFT_BY, - PROP_COLOR, - NUM_PROPS, -}; - -enum class EGroupProp -{ - PROP_NONE = -1, - PROP_ORDER, - PROP_POS_X, - PROP_POS_Y, - PROP_PARA_X, - PROP_PARA_Y, - PROP_USE_CLIPPING, - PROP_CLIP_X, - PROP_CLIP_Y, - PROP_CLIP_W, - PROP_CLIP_H, - NUM_PROPS, -}; - -enum class ELayerQuadsProp -{ - PROP_NONE = -1, - PROP_IMAGE, - NUM_PROPS, -}; - -enum class ELayerSoundsProp -{ - PROP_NONE = -1, - PROP_SOUND, - NUM_PROPS, -}; - -#endif diff --git a/src/game/editor/mapitems/envelope.cpp b/src/game/editor/mapitems/envelope.cpp deleted file mode 100644 index 174ee96cc2..0000000000 --- a/src/game/editor/mapitems/envelope.cpp +++ /dev/null @@ -1,148 +0,0 @@ -#include "envelope.h" - -#include -#include -#include - -using namespace std::chrono_literals; - -CEnvelope::CEnvelopePointAccess::CEnvelopePointAccess(std::vector *pvPoints) -{ - m_pvPoints = pvPoints; -} - -int CEnvelope::CEnvelopePointAccess::NumPoints() const -{ - return m_pvPoints->size(); -} - -const CEnvPoint *CEnvelope::CEnvelopePointAccess::GetPoint(int Index) const -{ - if(Index < 0 || (size_t)Index >= m_pvPoints->size()) - return nullptr; - return &m_pvPoints->at(Index); -} - -const CEnvPointBezier *CEnvelope::CEnvelopePointAccess::GetBezier(int Index) const -{ - if(Index < 0 || (size_t)Index >= m_pvPoints->size()) - return nullptr; - return &m_pvPoints->at(Index).m_Bezier; -} - -CEnvelope::CEnvelope(EType Type) : - m_Type(Type), m_PointsAccess(&m_vPoints) {} - -CEnvelope::CEnvelope(int NumChannels) : - m_PointsAccess(&m_vPoints) -{ - switch(NumChannels) - { - case 1: - m_Type = EType::SOUND; - break; - case 3: - m_Type = EType::POSITION; - break; - case 4: - m_Type = EType::COLOR; - break; - default: - dbg_assert(false, "invalid number of channels for envelope"); - } -} - -void CEnvelope::Resort() -{ - std::sort(m_vPoints.begin(), m_vPoints.end()); -} - -std::pair CEnvelope::GetValueRange(int ChannelMask) -{ - float Top = -std::numeric_limits::infinity(); - float Bottom = std::numeric_limits::infinity(); - CEnvPoint_runtime *pPrevPoint = nullptr; - for(auto &Point : m_vPoints) - { - for(int c = 0; c < GetChannels(); c++) - { - if(ChannelMask & (1 << c)) - { - { - // value handle - const float v = fx2f(Point.m_aValues[c]); - Top = maximum(Top, v); - Bottom = minimum(Bottom, v); - } - - if(Point.m_Curvetype == CURVETYPE_BEZIER) - { - // out-tangent handle - const float v = fx2f(Point.m_aValues[c] + Point.m_Bezier.m_aOutTangentDeltaY[c]); - Top = maximum(Top, v); - Bottom = minimum(Bottom, v); - } - - if(pPrevPoint != nullptr && pPrevPoint->m_Curvetype == CURVETYPE_BEZIER) - { - // in-tangent handle - const float v = fx2f(Point.m_aValues[c] + Point.m_Bezier.m_aInTangentDeltaY[c]); - Top = maximum(Top, v); - Bottom = minimum(Bottom, v); - } - } - } - pPrevPoint = &Point; - } - - return {Bottom, Top}; -} - -void CEnvelope::Eval(float Time, ColorRGBA &Result, size_t Channels) -{ - Channels = minimum(Channels, GetChannels(), CEnvPoint::MAX_CHANNELS); - CRenderTools::RenderEvalEnvelope(&m_PointsAccess, std::chrono::nanoseconds((int64_t)((double)Time * (double)std::chrono::nanoseconds(1s).count())), Result, Channels); -} - -void CEnvelope::AddPoint(int Time, int v0, int v1, int v2, int v3) -{ - CEnvPoint_runtime p; - p.m_Time = Time; - p.m_aValues[0] = v0; - p.m_aValues[1] = v1; - p.m_aValues[2] = v2; - p.m_aValues[3] = v3; - p.m_Curvetype = CURVETYPE_LINEAR; - for(int c = 0; c < CEnvPoint::MAX_CHANNELS; c++) - { - p.m_Bezier.m_aInTangentDeltaX[c] = 0; - p.m_Bezier.m_aInTangentDeltaY[c] = 0; - p.m_Bezier.m_aOutTangentDeltaX[c] = 0; - p.m_Bezier.m_aOutTangentDeltaY[c] = 0; - } - m_vPoints.push_back(p); - Resort(); -} - -float CEnvelope::EndTime() const -{ - if(m_vPoints.empty()) - return 0.0f; - return m_vPoints.back().m_Time / 1000.0f; -} - -int CEnvelope::GetChannels() const -{ - switch(m_Type) - { - case EType::POSITION: - return 3; - case EType::COLOR: - return 4; - case EType::SOUND: - return 1; - default: - dbg_assert(false, "unknown envelope type"); - dbg_break(); - } -} diff --git a/src/game/editor/mapitems/envelope.h b/src/game/editor/mapitems/envelope.h deleted file mode 100644 index b3a00a258f..0000000000 --- a/src/game/editor/mapitems/envelope.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef GAME_EDITOR_MAPITEMS_ENVELOPE_H -#define GAME_EDITOR_MAPITEMS_ENVELOPE_H - -#include -#include - -class CEnvelope -{ -public: - std::vector m_vPoints; - char m_aName[32] = ""; - bool m_Synchronized = false; - - enum class EType - { - POSITION, - COLOR, - SOUND - }; - explicit CEnvelope(EType Type); - explicit CEnvelope(int NumChannels); - - std::pair GetValueRange(int ChannelMask); - void Eval(float Time, ColorRGBA &Result, size_t Channels); - void AddPoint(int Time, int v0, int v1 = 0, int v2 = 0, int v3 = 0); - float EndTime() const; - int GetChannels() const; - EType Type() const { return m_Type; } - -private: - void Resort(); - - EType m_Type; - - class CEnvelopePointAccess : public IEnvelopePointAccess - { - std::vector *m_pvPoints; - - public: - CEnvelopePointAccess(std::vector *pvPoints); - - int NumPoints() const override; - const CEnvPoint *GetPoint(int Index) const override; - const CEnvPointBezier *GetBezier(int Index) const override; - }; - CEnvelopePointAccess m_PointsAccess; -}; - -#endif diff --git a/src/game/editor/mapitems/image.cpp b/src/game/editor/mapitems/image.cpp deleted file mode 100644 index 0266ccb99d..0000000000 --- a/src/game/editor/mapitems/image.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "image.h" - -#include - -CEditorImage::CEditorImage(CEditor *pEditor) : - m_AutoMapper(pEditor) -{ - OnInit(pEditor); - m_Texture.Invalidate(); -} - -CEditorImage::~CEditorImage() -{ - Graphics()->UnloadTexture(&m_Texture); - free(m_pData); - m_pData = nullptr; -} - -void CEditorImage::OnInit(CEditor *pEditor) -{ - CEditorComponent::OnInit(pEditor); - RegisterSubComponent(m_AutoMapper); - InitSubComponents(); -} - -void CEditorImage::AnalyseTileFlags() -{ - mem_zero(m_aTileFlags, sizeof(m_aTileFlags)); - - size_t tw = m_Width / 16; // tilesizes - size_t th = m_Height / 16; - if(tw == th && m_Format == CImageInfo::FORMAT_RGBA) - { - int TileId = 0; - for(size_t ty = 0; ty < 16; ty++) - for(size_t tx = 0; tx < 16; tx++, TileId++) - { - bool Opaque = true; - for(size_t x = 0; x < tw; x++) - for(size_t y = 0; y < th; y++) - { - size_t p = (ty * tw + y) * m_Width + tx * tw + x; - if(m_pData[p * 4 + 3] < 250) - { - Opaque = false; - break; - } - } - - if(Opaque) - m_aTileFlags[TileId] |= TILEFLAG_OPAQUE; - } - } -} diff --git a/src/game/editor/mapitems/image.h b/src/game/editor/mapitems/image.h deleted file mode 100644 index 7e2142f630..0000000000 --- a/src/game/editor/mapitems/image.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef GAME_EDITOR_MAPITEMS_IMAGE_H -#define GAME_EDITOR_MAPITEMS_IMAGE_H - -#include - -#include -#include - -class CEditorImage : public CImageInfo, public CEditorComponent -{ -public: - explicit CEditorImage(CEditor *pEditor); - ~CEditorImage(); - - void OnInit(CEditor *pEditor) override; - void AnalyseTileFlags(); - - IGraphics::CTextureHandle m_Texture; - int m_External = 0; - char m_aName[IO_MAX_PATH_LENGTH] = ""; - unsigned char m_aTileFlags[256]; - CAutoMapper m_AutoMapper; -}; - -#endif diff --git a/src/game/editor/mapitems/layer.h b/src/game/editor/mapitems/layer.h deleted file mode 100644 index 3f62e04f94..0000000000 --- a/src/game/editor/mapitems/layer.h +++ /dev/null @@ -1,81 +0,0 @@ -#ifndef GAME_EDITOR_MAPITEMS_LAYER_H -#define GAME_EDITOR_MAPITEMS_LAYER_H - -#include -#include -#include -#include - -#include - -using FIndexModifyFunction = std::function; - -class CLayerGroup; - -class CLayer -{ -public: - class CEditor *m_pEditor; - class IGraphics *Graphics(); - class ITextRender *TextRender(); - - explicit CLayer(CEditor *pEditor) - { - m_Type = LAYERTYPE_INVALID; - str_copy(m_aName, "(invalid)"); - m_Visible = true; - m_Readonly = false; - m_Flags = 0; - m_pEditor = pEditor; - } - - CLayer(const CLayer &Other) - { - str_copy(m_aName, Other.m_aName); - m_Flags = Other.m_Flags; - m_pEditor = Other.m_pEditor; - m_Type = Other.m_Type; - m_Visible = true; - m_Readonly = false; - } - - virtual ~CLayer() - { - } - - virtual void BrushSelecting(CUIRect Rect) {} - virtual int BrushGrab(std::shared_ptr pBrush, CUIRect Rect) { return 0; } - virtual void FillSelection(bool Empty, std::shared_ptr pBrush, CUIRect Rect) {} - virtual void BrushDraw(std::shared_ptr pBrush, vec2 WorldPos) {} - virtual void BrushPlace(std::shared_ptr pBrush, vec2 WorldPos) {} - virtual void BrushFlipX() {} - virtual void BrushFlipY() {} - virtual void BrushRotate(float Amount) {} - - virtual bool IsEntitiesLayer() const { return false; } - - virtual void Render(bool Tileset = false) {} - virtual CUi::EPopupMenuFunctionResult RenderProperties(CUIRect *pToolbox) { return CUi::POPUP_KEEP_OPEN; } - - virtual void ModifyImageIndex(FIndexModifyFunction pfnFunc) {} - virtual void ModifyEnvelopeIndex(FIndexModifyFunction pfnFunc) {} - virtual void ModifySoundIndex(FIndexModifyFunction pfnFunc) {} - - virtual std::shared_ptr Duplicate() const = 0; - virtual const char *TypeName() const = 0; - - virtual void GetSize(float *pWidth, float *pHeight) - { - *pWidth = 0; - *pHeight = 0; - } - - char m_aName[12]; - int m_Type; - int m_Flags; - - bool m_Readonly; - bool m_Visible; -}; - -#endif diff --git a/src/game/editor/mapitems/layer_front.cpp b/src/game/editor/mapitems/layer_front.cpp deleted file mode 100644 index b553ead212..0000000000 --- a/src/game/editor/mapitems/layer_front.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include - -CLayerFront::CLayerFront(CEditor *pEditor, int w, int h) : - CLayerTiles(pEditor, w, h) -{ - str_copy(m_aName, "Front"); - m_Front = 1; -} - -void CLayerFront::SetTile(int x, int y, CTile Tile) -{ - if(Tile.m_Index == TILE_THROUGH_CUT) - { - CTile nohook = {TILE_NOHOOK}; - m_pEditor->m_Map.m_pGameLayer->CLayerTiles::SetTile(x, y, nohook); // NOLINT(bugprone-parent-virtual-call) - } - else if(Tile.m_Index == TILE_AIR && CLayerTiles::GetTile(x, y).m_Index == TILE_THROUGH_CUT) - { - CTile air = {TILE_AIR}; - m_pEditor->m_Map.m_pGameLayer->CLayerTiles::SetTile(x, y, air); // NOLINT(bugprone-parent-virtual-call) - } - if(m_pEditor->m_AllowPlaceUnusedTiles || IsValidFrontTile(Tile.m_Index)) - { - CLayerTiles::SetTile(x, y, Tile); - } - else - { - CTile air = {TILE_AIR}; - CLayerTiles::SetTile(x, y, air); - ShowPreventUnusedTilesWarning(); - } -} - -void CLayerFront::Resize(int NewW, int NewH) -{ - // resize tile data - CLayerTiles::Resize(NewW, NewH); - - // resize gamelayer too - if(m_pEditor->m_Map.m_pGameLayer->m_Width != NewW || m_pEditor->m_Map.m_pGameLayer->m_Height != NewH) - m_pEditor->m_Map.m_pGameLayer->Resize(NewW, NewH); -} - -const char *CLayerFront::TypeName() const -{ - return "front"; -} diff --git a/src/game/editor/mapitems/layer_front.h b/src/game/editor/mapitems/layer_front.h deleted file mode 100644 index fbddfac1fa..0000000000 --- a/src/game/editor/mapitems/layer_front.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef GAME_EDITOR_MAPITEMS_LAYER_FRONT_H -#define GAME_EDITOR_MAPITEMS_LAYER_FRONT_H - -#include "layer_tiles.h" - -class CLayerFront : public CLayerTiles -{ -public: - CLayerFront(CEditor *pEditor, int w, int h); - - void Resize(int NewW, int NewH) override; - void SetTile(int x, int y, CTile Tile) override; - const char *TypeName() const override; -}; - -#endif diff --git a/src/game/editor/mapitems/layer_game.cpp b/src/game/editor/mapitems/layer_game.cpp deleted file mode 100644 index 14dfd27e14..0000000000 --- a/src/game/editor/mapitems/layer_game.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include "layer_game.h" - -#include - -CLayerGame::CLayerGame(CEditor *pEditor, int w, int h) : - CLayerTiles(pEditor, w, h) -{ - str_copy(m_aName, "Game"); - m_Game = 1; -} - -CLayerGame::~CLayerGame() = default; - -CTile CLayerGame::GetTile(int x, int y) -{ - if(m_pEditor->m_Map.m_pFrontLayer && m_pEditor->m_Map.m_pFrontLayer->GetTile(x, y).m_Index == TILE_THROUGH_CUT) - { - CTile ThroughCut = {TILE_THROUGH_CUT}; - return ThroughCut; - } - else - { - return CLayerTiles::GetTile(x, y); - } -} - -void CLayerGame::SetTile(int x, int y, CTile Tile) -{ - if(Tile.m_Index == TILE_THROUGH_CUT && m_pEditor->m_SelectEntitiesImage == "DDNet") - { - if(!m_pEditor->m_Map.m_pFrontLayer) - { - std::shared_ptr pLayerFront = std::make_shared(m_pEditor, m_Width, m_Height); - m_pEditor->m_Map.MakeFrontLayer(pLayerFront); - m_pEditor->m_Map.m_pGameGroup->AddLayer(pLayerFront); - } - CTile nohook = {TILE_NOHOOK}; - CLayerTiles::SetTile(x, y, nohook); - CTile ThroughCut = {TILE_THROUGH_CUT}; - m_pEditor->m_Map.m_pFrontLayer->CLayerTiles::SetTile(x, y, ThroughCut); // NOLINT(bugprone-parent-virtual-call) - } - else - { - if(m_pEditor->m_SelectEntitiesImage == "DDNet" && m_pEditor->m_Map.m_pFrontLayer && m_pEditor->m_Map.m_pFrontLayer->GetTile(x, y).m_Index == TILE_THROUGH_CUT) - { - CTile air = {TILE_AIR}; - m_pEditor->m_Map.m_pFrontLayer->CLayerTiles::SetTile(x, y, air); // NOLINT(bugprone-parent-virtual-call) - } - if(m_pEditor->m_AllowPlaceUnusedTiles || IsValidGameTile(Tile.m_Index)) - { - CLayerTiles::SetTile(x, y, Tile); - } - else - { - CTile air = {TILE_AIR}; - CLayerTiles::SetTile(x, y, air); - ShowPreventUnusedTilesWarning(); - } - } -} - -CUi::EPopupMenuFunctionResult CLayerGame::RenderProperties(CUIRect *pToolbox) -{ - const CUi::EPopupMenuFunctionResult Result = CLayerTiles::RenderProperties(pToolbox); - m_Image = -1; - return Result; -} - -const char *CLayerGame::TypeName() const -{ - return "game"; -} diff --git a/src/game/editor/mapitems/layer_game.h b/src/game/editor/mapitems/layer_game.h deleted file mode 100644 index 4fd7b71b86..0000000000 --- a/src/game/editor/mapitems/layer_game.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef GAME_EDITOR_MAPITEMS_LAYER_GAME_H -#define GAME_EDITOR_MAPITEMS_LAYER_GAME_H - -#include "layer_tiles.h" - -class CLayerGame : public CLayerTiles -{ -public: - CLayerGame(CEditor *pEditor, int w, int h); - ~CLayerGame(); - - CTile GetTile(int x, int y) override; - void SetTile(int x, int y, CTile Tile) override; - const char *TypeName() const override; - - CUi::EPopupMenuFunctionResult RenderProperties(CUIRect *pToolbox) override; -}; - -#endif diff --git a/src/game/editor/mapitems/layer_group.cpp b/src/game/editor/mapitems/layer_group.cpp deleted file mode 100644 index 29208697e3..0000000000 --- a/src/game/editor/mapitems/layer_group.cpp +++ /dev/null @@ -1,157 +0,0 @@ -#include "layer_group.h" - -#include -#include - -CLayerGroup::CLayerGroup() -{ - m_vpLayers.clear(); - m_aName[0] = 0; - m_Visible = true; - m_Collapse = false; - m_GameGroup = false; - m_OffsetX = 0; - m_OffsetY = 0; - m_ParallaxX = 100; - m_ParallaxY = 100; - - m_UseClipping = 0; - m_ClipX = 0; - m_ClipY = 0; - m_ClipW = 0; - m_ClipH = 0; -} - -CLayerGroup::~CLayerGroup() -{ - m_vpLayers.clear(); -} - -void CLayerGroup::Convert(CUIRect *pRect) const -{ - pRect->x += m_OffsetX; - pRect->y += m_OffsetY; -} - -void CLayerGroup::Mapping(float *pPoints) const -{ - float NormalParallaxZoom = clamp((double)(maximum(m_ParallaxX, m_ParallaxY)), 0., 100.); - float ParallaxZoom = m_pMap->m_pEditor->m_PreviewZoom ? NormalParallaxZoom : 100.0f; - - m_pMap->m_pEditor->RenderTools()->MapScreenToWorld( - m_pMap->m_pEditor->MapView()->GetWorldOffset().x, m_pMap->m_pEditor->MapView()->GetWorldOffset().y, - m_ParallaxX, m_ParallaxY, ParallaxZoom, m_OffsetX, m_OffsetY, - m_pMap->m_pEditor->Graphics()->ScreenAspect(), m_pMap->m_pEditor->MapView()->GetWorldZoom(), pPoints); - - pPoints[0] += m_pMap->m_pEditor->MapView()->GetEditorOffset().x; - pPoints[1] += m_pMap->m_pEditor->MapView()->GetEditorOffset().y; - pPoints[2] += m_pMap->m_pEditor->MapView()->GetEditorOffset().x; - pPoints[3] += m_pMap->m_pEditor->MapView()->GetEditorOffset().y; -} - -void CLayerGroup::MapScreen() const -{ - float aPoints[4]; - Mapping(aPoints); - m_pMap->m_pEditor->Graphics()->MapScreen(aPoints[0], aPoints[1], aPoints[2], aPoints[3]); -} - -void CLayerGroup::Render() -{ - MapScreen(); - IGraphics *pGraphics = m_pMap->m_pEditor->Graphics(); - - if(m_UseClipping) - { - float aPoints[4]; - m_pMap->m_pGameGroup->Mapping(aPoints); - float x0 = (m_ClipX - aPoints[0]) / (aPoints[2] - aPoints[0]); - float y0 = (m_ClipY - aPoints[1]) / (aPoints[3] - aPoints[1]); - float x1 = ((m_ClipX + m_ClipW) - aPoints[0]) / (aPoints[2] - aPoints[0]); - float y1 = ((m_ClipY + m_ClipH) - aPoints[1]) / (aPoints[3] - aPoints[1]); - - pGraphics->ClipEnable((int)(x0 * pGraphics->ScreenWidth()), (int)(y0 * pGraphics->ScreenHeight()), - (int)((x1 - x0) * pGraphics->ScreenWidth()), (int)((y1 - y0) * pGraphics->ScreenHeight())); - } - - for(auto &pLayer : m_vpLayers) - { - if(pLayer->m_Visible) - { - if(pLayer->m_Type == LAYERTYPE_TILES) - { - std::shared_ptr pTiles = std::static_pointer_cast(pLayer); - if(pTiles->m_Game || pTiles->m_Front || pTiles->m_Tele || pTiles->m_Speedup || pTiles->m_Tune || pTiles->m_Switch) - continue; - } - if(m_pMap->m_pEditor->m_ShowDetail || !(pLayer->m_Flags & LAYERFLAG_DETAIL)) - pLayer->Render(); - } - } - - for(auto &pLayer : m_vpLayers) - { - if(pLayer->m_Visible && pLayer->m_Type == LAYERTYPE_TILES && !pLayer->IsEntitiesLayer()) - { - std::shared_ptr pTiles = std::static_pointer_cast(pLayer); - if(pTiles->m_Game || pTiles->m_Front || pTiles->m_Tele || pTiles->m_Speedup || pTiles->m_Tune || pTiles->m_Switch) - { - pLayer->Render(); - } - } - } - - if(m_UseClipping) - pGraphics->ClipDisable(); -} - -void CLayerGroup::AddLayer(const std::shared_ptr &pLayer) -{ - m_pMap->OnModify(); - m_vpLayers.push_back(pLayer); -} - -void CLayerGroup::DeleteLayer(int Index) -{ - if(Index < 0 || Index >= (int)m_vpLayers.size()) - return; - m_vpLayers.erase(m_vpLayers.begin() + Index); - m_pMap->OnModify(); -} - -void CLayerGroup::DuplicateLayer(int Index) -{ - if(Index < 0 || Index >= (int)m_vpLayers.size()) - return; - - std::shared_ptr pDup = m_vpLayers[Index]->Duplicate(); - m_vpLayers.insert(m_vpLayers.begin() + Index + 1, pDup); - - m_pMap->OnModify(); -} - -void CLayerGroup::GetSize(float *pWidth, float *pHeight) const -{ - *pWidth = 0; - *pHeight = 0; - for(const auto &pLayer : m_vpLayers) - { - float lw, lh; - pLayer->GetSize(&lw, &lh); - *pWidth = maximum(*pWidth, lw); - *pHeight = maximum(*pHeight, lh); - } -} - -int CLayerGroup::SwapLayers(int Index0, int Index1) -{ - if(Index0 < 0 || Index0 >= (int)m_vpLayers.size()) - return Index0; - if(Index1 < 0 || Index1 >= (int)m_vpLayers.size()) - return Index0; - if(Index0 == Index1) - return Index0; - m_pMap->OnModify(); - std::swap(m_vpLayers[Index0], m_vpLayers[Index1]); - return Index1; -} diff --git a/src/game/editor/mapitems/layer_group.h b/src/game/editor/mapitems/layer_group.h deleted file mode 100644 index 78e1488e0b..0000000000 --- a/src/game/editor/mapitems/layer_group.h +++ /dev/null @@ -1,78 +0,0 @@ -#ifndef GAME_EDITOR_MAPITEMS_LAYER_GROUP_H -#define GAME_EDITOR_MAPITEMS_LAYER_GROUP_H - -#include "layer.h" - -#include -#include - -class CLayerGroup -{ -public: - class CEditorMap *m_pMap; - - std::vector> m_vpLayers; - - int m_OffsetX; - int m_OffsetY; - - int m_ParallaxX; - int m_ParallaxY; - - int m_UseClipping; - int m_ClipX; - int m_ClipY; - int m_ClipW; - int m_ClipH; - - char m_aName[12]; - bool m_GameGroup; - bool m_Visible; - bool m_Collapse; - - CLayerGroup(); - ~CLayerGroup(); - - void Convert(CUIRect *pRect) const; - void Render(); - void MapScreen() const; - void Mapping(float *pPoints) const; - - void GetSize(float *pWidth, float *pHeight) const; - - void DeleteLayer(int Index); - void DuplicateLayer(int Index); - int SwapLayers(int Index0, int Index1); - - bool IsEmpty() const - { - return m_vpLayers.empty(); - } - - void Clear() - { - m_vpLayers.clear(); - } - - void AddLayer(const std::shared_ptr &pLayer); - - void ModifyImageIndex(FIndexModifyFunction Func) - { - for(auto &pLayer : m_vpLayers) - pLayer->ModifyImageIndex(Func); - } - - void ModifyEnvelopeIndex(FIndexModifyFunction Func) - { - for(auto &pLayer : m_vpLayers) - pLayer->ModifyEnvelopeIndex(Func); - } - - void ModifySoundIndex(FIndexModifyFunction Func) - { - for(auto &pLayer : m_vpLayers) - pLayer->ModifySoundIndex(Func); - } -}; - -#endif diff --git a/src/game/editor/mapitems/layer_quads.cpp b/src/game/editor/mapitems/layer_quads.cpp deleted file mode 100644 index b523f815d2..0000000000 --- a/src/game/editor/mapitems/layer_quads.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include "layer_quads.h" - -#include -#include - -#include "image.h" - -CLayerQuads::CLayerQuads(CEditor *pEditor) : - CLayer(pEditor) -{ - m_Type = LAYERTYPE_QUADS; - m_aName[0] = '\0'; - m_Image = -1; -} - -CLayerQuads::CLayerQuads(const CLayerQuads &Other) : - CLayer(Other) -{ - m_Image = Other.m_Image; - m_vQuads = Other.m_vQuads; -} - -CLayerQuads::~CLayerQuads() = default; - -void CLayerQuads::Render(bool QuadPicker) -{ - Graphics()->TextureClear(); - if(m_Image >= 0 && (size_t)m_Image < m_pEditor->m_Map.m_vpImages.size()) - Graphics()->TextureSet(m_pEditor->m_Map.m_vpImages[m_Image]->m_Texture); - - Graphics()->BlendNone(); - m_pEditor->RenderTools()->ForceRenderQuads(m_vQuads.data(), m_vQuads.size(), LAYERRENDERFLAG_OPAQUE, CEditor::EnvelopeEval, m_pEditor); - Graphics()->BlendNormal(); - m_pEditor->RenderTools()->ForceRenderQuads(m_vQuads.data(), m_vQuads.size(), LAYERRENDERFLAG_TRANSPARENT, CEditor::EnvelopeEval, m_pEditor); -} - -CQuad *CLayerQuads::NewQuad(int x, int y, int Width, int Height) -{ - m_pEditor->m_Map.OnModify(); - - m_vQuads.emplace_back(); - CQuad *pQuad = &m_vQuads[m_vQuads.size() - 1]; - - pQuad->m_PosEnv = -1; - pQuad->m_ColorEnv = -1; - pQuad->m_PosEnvOffset = 0; - pQuad->m_ColorEnvOffset = 0; - - Width /= 2; - Height /= 2; - pQuad->m_aPoints[0].x = i2fx(x - Width); - pQuad->m_aPoints[0].y = i2fx(y - Height); - pQuad->m_aPoints[1].x = i2fx(x + Width); - pQuad->m_aPoints[1].y = i2fx(y - Height); - pQuad->m_aPoints[2].x = i2fx(x - Width); - pQuad->m_aPoints[2].y = i2fx(y + Height); - pQuad->m_aPoints[3].x = i2fx(x + Width); - pQuad->m_aPoints[3].y = i2fx(y + Height); - - pQuad->m_aPoints[4].x = i2fx(x); // pivot - pQuad->m_aPoints[4].y = i2fx(y); - - pQuad->m_aTexcoords[0].x = i2fx(0); - pQuad->m_aTexcoords[0].y = i2fx(0); - - pQuad->m_aTexcoords[1].x = i2fx(1); - pQuad->m_aTexcoords[1].y = i2fx(0); - - pQuad->m_aTexcoords[2].x = i2fx(0); - pQuad->m_aTexcoords[2].y = i2fx(1); - - pQuad->m_aTexcoords[3].x = i2fx(1); - pQuad->m_aTexcoords[3].y = i2fx(1); - - pQuad->m_aColors[0].r = 255; - pQuad->m_aColors[0].g = 255; - pQuad->m_aColors[0].b = 255; - pQuad->m_aColors[0].a = 255; - pQuad->m_aColors[1].r = 255; - pQuad->m_aColors[1].g = 255; - pQuad->m_aColors[1].b = 255; - pQuad->m_aColors[1].a = 255; - pQuad->m_aColors[2].r = 255; - pQuad->m_aColors[2].g = 255; - pQuad->m_aColors[2].b = 255; - pQuad->m_aColors[2].a = 255; - pQuad->m_aColors[3].r = 255; - pQuad->m_aColors[3].g = 255; - pQuad->m_aColors[3].b = 255; - pQuad->m_aColors[3].a = 255; - - return pQuad; -} - -void CLayerQuads::BrushSelecting(CUIRect Rect) -{ - // draw selection rectangle - IGraphics::CLineItem Array[4] = { - IGraphics::CLineItem(Rect.x, Rect.y, Rect.x + Rect.w, Rect.y), - IGraphics::CLineItem(Rect.x + Rect.w, Rect.y, Rect.x + Rect.w, Rect.y + Rect.h), - IGraphics::CLineItem(Rect.x + Rect.w, Rect.y + Rect.h, Rect.x, Rect.y + Rect.h), - IGraphics::CLineItem(Rect.x, Rect.y + Rect.h, Rect.x, Rect.y)}; - Graphics()->TextureClear(); - Graphics()->LinesBegin(); - Graphics()->LinesDraw(Array, 4); - Graphics()->LinesEnd(); -} - -int CLayerQuads::BrushGrab(std::shared_ptr pBrush, CUIRect Rect) -{ - // create new layers - std::shared_ptr pGrabbed = std::make_shared(m_pEditor); - pGrabbed->m_Image = m_Image; - pBrush->AddLayer(pGrabbed); - - //dbg_msg("", "%f %f %f %f", rect.x, rect.y, rect.w, rect.h); - for(const auto &Quad : m_vQuads) - { - float px = fx2f(Quad.m_aPoints[4].x); - float py = fx2f(Quad.m_aPoints[4].y); - - if(px > Rect.x && px < Rect.x + Rect.w && py > Rect.y && py < Rect.y + Rect.h) - { - CQuad n = Quad; - - for(auto &Point : n.m_aPoints) - { - Point.x -= f2fx(Rect.x); - Point.y -= f2fx(Rect.y); - } - - pGrabbed->m_vQuads.push_back(n); - } - } - - return pGrabbed->m_vQuads.empty() ? 0 : 1; -} - -void CLayerQuads::BrushPlace(std::shared_ptr pBrush, vec2 WorldPos) -{ - std::shared_ptr pQuadLayer = std::static_pointer_cast(pBrush); - std::vector vAddedQuads; - for(const auto &Quad : pQuadLayer->m_vQuads) - { - CQuad n = Quad; - - for(auto &Point : n.m_aPoints) - { - Point.x += f2fx(WorldPos.x); - Point.y += f2fx(WorldPos.y); - } - - m_vQuads.push_back(n); - vAddedQuads.push_back(n); - } - m_pEditor->m_EditorHistory.RecordAction(std::make_shared(m_pEditor, m_pEditor->m_SelectedGroup, m_pEditor->m_vSelectedLayers[0], vAddedQuads)); - m_pEditor->m_Map.OnModify(); -} - -void CLayerQuads::BrushFlipX() -{ - for(auto &Quad : m_vQuads) - { - std::swap(Quad.m_aPoints[0], Quad.m_aPoints[1]); - std::swap(Quad.m_aPoints[2], Quad.m_aPoints[3]); - } - m_pEditor->m_Map.OnModify(); -} - -void CLayerQuads::BrushFlipY() -{ - for(auto &Quad : m_vQuads) - { - std::swap(Quad.m_aPoints[0], Quad.m_aPoints[2]); - std::swap(Quad.m_aPoints[1], Quad.m_aPoints[3]); - } - m_pEditor->m_Map.OnModify(); -} - -void Rotate(vec2 *pCenter, vec2 *pPoint, float Rotation) -{ - float x = pPoint->x - pCenter->x; - float y = pPoint->y - pCenter->y; - pPoint->x = x * std::cos(Rotation) - y * std::sin(Rotation) + pCenter->x; - pPoint->y = x * std::sin(Rotation) + y * std::cos(Rotation) + pCenter->y; -} - -void CLayerQuads::BrushRotate(float Amount) -{ - vec2 Center; - GetSize(&Center.x, &Center.y); - Center.x /= 2; - Center.y /= 2; - - for(auto &Quad : m_vQuads) - { - for(auto &Point : Quad.m_aPoints) - { - vec2 Pos(fx2f(Point.x), fx2f(Point.y)); - Rotate(&Center, &Pos, Amount); - Point.x = f2fx(Pos.x); - Point.y = f2fx(Pos.y); - } - } -} - -void CLayerQuads::GetSize(float *pWidth, float *pHeight) -{ - *pWidth = 0; - *pHeight = 0; - - for(const auto &Quad : m_vQuads) - { - for(const auto &Point : Quad.m_aPoints) - { - *pWidth = maximum(*pWidth, fx2f(Point.x)); - *pHeight = maximum(*pHeight, fx2f(Point.y)); - } - } -} - -CUi::EPopupMenuFunctionResult CLayerQuads::RenderProperties(CUIRect *pToolBox) -{ - CProperty aProps[] = { - {"Image", m_Image, PROPTYPE_IMAGE, -1, 0}, - {nullptr}, - }; - - static int s_aIds[(int)ELayerQuadsProp::NUM_PROPS] = {0}; - int NewVal = 0; - auto [State, Prop] = m_pEditor->DoPropertiesWithState(pToolBox, aProps, s_aIds, &NewVal); - if(Prop != ELayerQuadsProp::PROP_NONE && (State == EEditState::END || State == EEditState::ONE_GO)) - { - m_pEditor->m_Map.OnModify(); - } - - static CLayerQuadsPropTracker s_Tracker(m_pEditor); - s_Tracker.Begin(this, Prop, State); - - if(Prop == ELayerQuadsProp::PROP_IMAGE) - { - if(NewVal >= 0) - m_Image = NewVal % m_pEditor->m_Map.m_vpImages.size(); - else - m_Image = -1; - } - - s_Tracker.End(Prop, State); - - return CUi::POPUP_KEEP_OPEN; -} - -void CLayerQuads::ModifyImageIndex(FIndexModifyFunction Func) -{ - Func(&m_Image); -} - -void CLayerQuads::ModifyEnvelopeIndex(FIndexModifyFunction Func) -{ - for(auto &Quad : m_vQuads) - { - Func(&Quad.m_PosEnv); - Func(&Quad.m_ColorEnv); - } -} - -std::shared_ptr CLayerQuads::Duplicate() const -{ - return std::make_shared(*this); -} - -int CLayerQuads::SwapQuads(int Index0, int Index1) -{ - if(Index0 < 0 || Index0 >= (int)m_vQuads.size()) - return Index0; - if(Index1 < 0 || Index1 >= (int)m_vQuads.size()) - return Index0; - if(Index0 == Index1) - return Index0; - m_pEditor->m_Map.OnModify(); - std::swap(m_vQuads[Index0], m_vQuads[Index1]); - return Index1; -} - -const char *CLayerQuads::TypeName() const -{ - return "quads"; -} diff --git a/src/game/editor/mapitems/layer_quads.h b/src/game/editor/mapitems/layer_quads.h deleted file mode 100644 index e0026aaff0..0000000000 --- a/src/game/editor/mapitems/layer_quads.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef GAME_EDITOR_MAPITEMS_LAYER_QUADS_H -#define GAME_EDITOR_MAPITEMS_LAYER_QUADS_H - -#include "layer.h" - -class CLayerQuads : public CLayer -{ -public: - explicit CLayerQuads(CEditor *pEditor); - CLayerQuads(const CLayerQuads &Other); - ~CLayerQuads(); - - void Render(bool QuadPicker = false) override; - CQuad *NewQuad(int x, int y, int Width, int Height); - int SwapQuads(int Index0, int Index1); - - void BrushSelecting(CUIRect Rect) override; - int BrushGrab(std::shared_ptr pBrush, CUIRect Rect) override; - void BrushPlace(std::shared_ptr pBrush, vec2 WorldPos) override; - void BrushFlipX() override; - void BrushFlipY() override; - void BrushRotate(float Amount) override; - - CUi::EPopupMenuFunctionResult RenderProperties(CUIRect *pToolbox) override; - - void ModifyImageIndex(FIndexModifyFunction pfnFunc) override; - void ModifyEnvelopeIndex(FIndexModifyFunction pfnFunc) override; - - void GetSize(float *pWidth, float *pHeight) override; - std::shared_ptr Duplicate() const override; - const char *TypeName() const override; - - int m_Image; - std::vector m_vQuads; -}; - -#endif diff --git a/src/game/editor/mapitems/layer_sounds.cpp b/src/game/editor/mapitems/layer_sounds.cpp deleted file mode 100644 index d25de9a2c6..0000000000 --- a/src/game/editor/mapitems/layer_sounds.cpp +++ /dev/null @@ -1,224 +0,0 @@ -#include "layer_sounds.h" - -#include -#include -#include - -static const float s_SourceVisualSize = 32.0f; - -CLayerSounds::CLayerSounds(CEditor *pEditor) : - CLayer(pEditor) -{ - m_Type = LAYERTYPE_SOUNDS; - m_aName[0] = '\0'; - m_Sound = -1; -} - -CLayerSounds::CLayerSounds(const CLayerSounds &Other) : - CLayer(Other) -{ - m_Sound = Other.m_Sound; - m_vSources = Other.m_vSources; -} - -CLayerSounds::~CLayerSounds() = default; - -void CLayerSounds::Render(bool Tileset) -{ - // TODO: nice texture - Graphics()->TextureClear(); - Graphics()->BlendNormal(); - Graphics()->QuadsBegin(); - - // draw falloff distance - Graphics()->SetColor(0.6f, 0.8f, 1.0f, 0.4f); - for(const auto &Source : m_vSources) - { - ColorRGBA Offset = ColorRGBA(0.0f, 0.0f, 0.0f, 0.0f); - CEditor::EnvelopeEval(Source.m_PosEnvOffset, Source.m_PosEnv, Offset, 2, m_pEditor); - const vec2 Position = vec2(fx2f(Source.m_Position.x) + Offset.r, fx2f(Source.m_Position.y) + Offset.g); - const float Falloff = Source.m_Falloff / 255.0f; - - switch(Source.m_Shape.m_Type) - { - case CSoundShape::SHAPE_CIRCLE: - { - m_pEditor->Graphics()->DrawCircle(Position.x, Position.y, Source.m_Shape.m_Circle.m_Radius, 32); - if(Falloff > 0.0f) - { - m_pEditor->Graphics()->DrawCircle(Position.x, Position.y, Source.m_Shape.m_Circle.m_Radius * Falloff, 32); - } - break; - } - case CSoundShape::SHAPE_RECTANGLE: - { - const float Width = fx2f(Source.m_Shape.m_Rectangle.m_Width); - const float Height = fx2f(Source.m_Shape.m_Rectangle.m_Height); - m_pEditor->Graphics()->DrawRectExt(Position.x - Width / 2, Position.y - Height / 2, Width, Height, 0.0f, IGraphics::CORNER_NONE); - if(Falloff > 0.0f) - { - m_pEditor->Graphics()->DrawRectExt(Position.x - Falloff * Width / 2, Position.y - Falloff * Height / 2, Width * Falloff, Height * Falloff, 0.0f, IGraphics::CORNER_NONE); - } - break; - } - } - } - - Graphics()->QuadsEnd(); - - // draw handles - Graphics()->TextureSet(g_pData->m_aImages[IMAGE_AUDIO_SOURCE].m_Id); - Graphics()->QuadsBegin(); - - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - m_pEditor->RenderTools()->SelectSprite(SPRITE_AUDIO_SOURCE); - for(const auto &Source : m_vSources) - { - ColorRGBA Offset = ColorRGBA(0.0f, 0.0f, 0.0f, 0.0f); - CEditor::EnvelopeEval(Source.m_PosEnvOffset, Source.m_PosEnv, Offset, 2, m_pEditor); - const vec2 Position = vec2(fx2f(Source.m_Position.x) + Offset.r, fx2f(Source.m_Position.y) + Offset.g); - m_pEditor->RenderTools()->DrawSprite(Position.x, Position.y, m_pEditor->MapView()->ScaleLength(s_SourceVisualSize)); - } - - Graphics()->QuadsEnd(); -} - -CSoundSource *CLayerSounds::NewSource(int x, int y) -{ - m_pEditor->m_Map.OnModify(); - - m_vSources.emplace_back(); - CSoundSource *pSource = &m_vSources[m_vSources.size() - 1]; - - pSource->m_Position.x = f2fx(x); - pSource->m_Position.y = f2fx(y); - - pSource->m_Loop = 1; - pSource->m_Pan = 1; - pSource->m_TimeDelay = 0; - - pSource->m_PosEnv = -1; - pSource->m_PosEnvOffset = 0; - pSource->m_SoundEnv = -1; - pSource->m_SoundEnvOffset = 0; - - pSource->m_Falloff = 80; - - pSource->m_Shape.m_Type = CSoundShape::SHAPE_CIRCLE; - pSource->m_Shape.m_Circle.m_Radius = 1500; - - return pSource; -} - -void CLayerSounds::BrushSelecting(CUIRect Rect) -{ - // draw selection rectangle - IGraphics::CLineItem Array[4] = { - IGraphics::CLineItem(Rect.x, Rect.y, Rect.x + Rect.w, Rect.y), - IGraphics::CLineItem(Rect.x + Rect.w, Rect.y, Rect.x + Rect.w, Rect.y + Rect.h), - IGraphics::CLineItem(Rect.x + Rect.w, Rect.y + Rect.h, Rect.x, Rect.y + Rect.h), - IGraphics::CLineItem(Rect.x, Rect.y + Rect.h, Rect.x, Rect.y)}; - Graphics()->TextureClear(); - Graphics()->LinesBegin(); - Graphics()->LinesDraw(Array, 4); - Graphics()->LinesEnd(); -} - -int CLayerSounds::BrushGrab(std::shared_ptr pBrush, CUIRect Rect) -{ - // create new layer - std::shared_ptr pGrabbed = std::make_shared(m_pEditor); - pGrabbed->m_Sound = m_Sound; - pBrush->AddLayer(pGrabbed); - - for(const auto &Source : m_vSources) - { - float px = fx2f(Source.m_Position.x); - float py = fx2f(Source.m_Position.y); - - if(px > Rect.x && px < Rect.x + Rect.w && py > Rect.y && py < Rect.y + Rect.h) - { - CSoundSource n = Source; - - n.m_Position.x -= f2fx(Rect.x); - n.m_Position.y -= f2fx(Rect.y); - - pGrabbed->m_vSources.push_back(n); - } - } - - return pGrabbed->m_vSources.empty() ? 0 : 1; -} - -void CLayerSounds::BrushPlace(std::shared_ptr pBrush, vec2 WorldPos) -{ - std::shared_ptr pSoundLayer = std::static_pointer_cast(pBrush); - std::vector vAddedSources; - for(const auto &Source : pSoundLayer->m_vSources) - { - CSoundSource n = Source; - - n.m_Position.x += f2fx(WorldPos.x); - n.m_Position.y += f2fx(WorldPos.y); - - m_vSources.push_back(n); - vAddedSources.push_back(n); - } - m_pEditor->m_EditorHistory.RecordAction(std::make_shared(m_pEditor, m_pEditor->m_SelectedGroup, m_pEditor->m_vSelectedLayers[0], vAddedSources)); - m_pEditor->m_Map.OnModify(); -} - -CUi::EPopupMenuFunctionResult CLayerSounds::RenderProperties(CUIRect *pToolBox) -{ - CProperty aProps[] = { - {"Sound", m_Sound, PROPTYPE_SOUND, -1, 0}, - {nullptr}, - }; - - static int s_aIds[(int)ELayerSoundsProp::NUM_PROPS] = {0}; - int NewVal = 0; - auto [State, Prop] = m_pEditor->DoPropertiesWithState(pToolBox, aProps, s_aIds, &NewVal); - if(Prop != ELayerSoundsProp::PROP_NONE && (State == EEditState::END || State == EEditState::ONE_GO)) - { - m_pEditor->m_Map.OnModify(); - } - - static CLayerSoundsPropTracker s_Tracker(m_pEditor); - s_Tracker.Begin(this, Prop, State); - - if(Prop == ELayerSoundsProp::PROP_SOUND) - { - if(NewVal >= 0) - m_Sound = NewVal % m_pEditor->m_Map.m_vpSounds.size(); - else - m_Sound = -1; - } - - s_Tracker.End(Prop, State); - - return CUi::POPUP_KEEP_OPEN; -} - -void CLayerSounds::ModifySoundIndex(FIndexModifyFunction Func) -{ - Func(&m_Sound); -} - -void CLayerSounds::ModifyEnvelopeIndex(FIndexModifyFunction Func) -{ - for(auto &Source : m_vSources) - { - Func(&Source.m_SoundEnv); - Func(&Source.m_PosEnv); - } -} - -std::shared_ptr CLayerSounds::Duplicate() const -{ - return std::make_shared(*this); -} - -const char *CLayerSounds::TypeName() const -{ - return "sounds"; -} diff --git a/src/game/editor/mapitems/layer_sounds.h b/src/game/editor/mapitems/layer_sounds.h deleted file mode 100644 index 5efe11d515..0000000000 --- a/src/game/editor/mapitems/layer_sounds.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef GAME_EDITOR_MAPITEMS_LAYER_SOUNDS_H -#define GAME_EDITOR_MAPITEMS_LAYER_SOUNDS_H - -#include "layer.h" - -class CLayerSounds : public CLayer -{ -public: - explicit CLayerSounds(CEditor *pEditor); - CLayerSounds(const CLayerSounds &Other); - ~CLayerSounds(); - - void Render(bool Tileset = false) override; - CSoundSource *NewSource(int x, int y); - - void BrushSelecting(CUIRect Rect) override; - int BrushGrab(std::shared_ptr pBrush, CUIRect Rect) override; - void BrushPlace(std::shared_ptr pBrush, vec2 WorldPos) override; - - CUi::EPopupMenuFunctionResult RenderProperties(CUIRect *pToolbox) override; - - void ModifyEnvelopeIndex(FIndexModifyFunction pfnFunc) override; - void ModifySoundIndex(FIndexModifyFunction pfnFunc) override; - - std::shared_ptr Duplicate() const override; - const char *TypeName() const override; - - int m_Sound; - std::vector m_vSources; -}; - -#endif diff --git a/src/game/editor/mapitems/layer_speedup.cpp b/src/game/editor/mapitems/layer_speedup.cpp deleted file mode 100644 index e963da8e81..0000000000 --- a/src/game/editor/mapitems/layer_speedup.cpp +++ /dev/null @@ -1,313 +0,0 @@ -#include "layer_speedup.h" - -#include - -CLayerSpeedup::CLayerSpeedup(CEditor *pEditor, int w, int h) : - CLayerTiles(pEditor, w, h) -{ - str_copy(m_aName, "Speedup"); - m_Speedup = 1; - - m_pSpeedupTile = new CSpeedupTile[w * h]; - mem_zero(m_pSpeedupTile, (size_t)w * h * sizeof(CSpeedupTile)); -} - -CLayerSpeedup::CLayerSpeedup(const CLayerSpeedup &Other) : - CLayerTiles(Other) -{ - str_copy(m_aName, "Speedup copy"); - m_Speedup = 1; - - m_pSpeedupTile = new CSpeedupTile[m_Width * m_Height]; - mem_copy(m_pSpeedupTile, Other.m_pSpeedupTile, (size_t)m_Width * m_Height * sizeof(CSpeedupTile)); -} - -CLayerSpeedup::~CLayerSpeedup() -{ - delete[] m_pSpeedupTile; -} - -void CLayerSpeedup::Resize(int NewW, int NewH) -{ - // resize speedup data - CSpeedupTile *pNewSpeedupData = new CSpeedupTile[NewW * NewH]; - mem_zero(pNewSpeedupData, (size_t)NewW * NewH * sizeof(CSpeedupTile)); - - // copy old data - for(int y = 0; y < minimum(NewH, m_Height); y++) - mem_copy(&pNewSpeedupData[y * NewW], &m_pSpeedupTile[y * m_Width], minimum(m_Width, NewW) * sizeof(CSpeedupTile)); - - // replace old - delete[] m_pSpeedupTile; - m_pSpeedupTile = pNewSpeedupData; - - // resize tile data - CLayerTiles::Resize(NewW, NewH); - - // resize gamelayer too - if(m_pEditor->m_Map.m_pGameLayer->m_Width != NewW || m_pEditor->m_Map.m_pGameLayer->m_Height != NewH) - m_pEditor->m_Map.m_pGameLayer->Resize(NewW, NewH); -} - -void CLayerSpeedup::Shift(int Direction) -{ - CLayerTiles::Shift(Direction); - ShiftImpl(m_pSpeedupTile, Direction, m_pEditor->m_ShiftBy); -} - -bool CLayerSpeedup::IsEmpty(const std::shared_ptr &pLayer) -{ - for(int y = 0; y < pLayer->m_Height; y++) - for(int x = 0; x < pLayer->m_Width; x++) - if(m_pEditor->m_AllowPlaceUnusedTiles || IsValidSpeedupTile(pLayer->GetTile(x, y).m_Index)) - return false; - - return true; -} - -void CLayerSpeedup::BrushDraw(std::shared_ptr pBrush, vec2 WorldPos) -{ - if(m_Readonly) - return; - - std::shared_ptr pSpeedupLayer = std::static_pointer_cast(pBrush); - int sx = ConvertX(WorldPos.x); - int sy = ConvertY(WorldPos.y); - if(str_comp(pSpeedupLayer->m_aFileName, m_pEditor->m_aFileName)) - { - m_pEditor->m_SpeedupAngle = pSpeedupLayer->m_SpeedupAngle; - m_pEditor->m_SpeedupForce = pSpeedupLayer->m_SpeedupForce; - m_pEditor->m_SpeedupMaxSpeed = pSpeedupLayer->m_SpeedupMaxSpeed; - } - - bool Destructive = m_pEditor->m_BrushDrawDestructive || IsEmpty(pSpeedupLayer); - - for(int y = 0; y < pSpeedupLayer->m_Height; y++) - for(int x = 0; x < pSpeedupLayer->m_Width; x++) - { - int fx = x + sx; - int fy = y + sy; - - if(fx < 0 || fx >= m_Width || fy < 0 || fy >= m_Height) - continue; - - if(!Destructive && GetTile(fx, fy).m_Index) - continue; - - int Index = fy * m_Width + fx; - SSpeedupTileStateChange::SData Previous{ - m_pSpeedupTile[Index].m_Force, - m_pSpeedupTile[Index].m_Angle, - m_pSpeedupTile[Index].m_MaxSpeed, - m_pSpeedupTile[Index].m_Type, - m_pTiles[Index].m_Index}; - - if((m_pEditor->m_AllowPlaceUnusedTiles || IsValidSpeedupTile(pSpeedupLayer->m_pTiles[y * pSpeedupLayer->m_Width + x].m_Index)) && pSpeedupLayer->m_pTiles[y * pSpeedupLayer->m_Width + x].m_Index != TILE_AIR) - { - if(m_pEditor->m_SpeedupAngle != pSpeedupLayer->m_SpeedupAngle || m_pEditor->m_SpeedupForce != pSpeedupLayer->m_SpeedupForce || m_pEditor->m_SpeedupMaxSpeed != pSpeedupLayer->m_SpeedupMaxSpeed) - { - m_pSpeedupTile[Index].m_Force = m_pEditor->m_SpeedupForce; - m_pSpeedupTile[Index].m_MaxSpeed = m_pEditor->m_SpeedupMaxSpeed; - m_pSpeedupTile[Index].m_Angle = m_pEditor->m_SpeedupAngle; - m_pSpeedupTile[Index].m_Type = pSpeedupLayer->m_pTiles[y * pSpeedupLayer->m_Width + x].m_Index; - m_pTiles[Index].m_Index = pSpeedupLayer->m_pTiles[y * pSpeedupLayer->m_Width + x].m_Index; - } - else if(pSpeedupLayer->m_pSpeedupTile[y * pSpeedupLayer->m_Width + x].m_Force) - { - m_pSpeedupTile[Index].m_Force = pSpeedupLayer->m_pSpeedupTile[y * pSpeedupLayer->m_Width + x].m_Force; - m_pSpeedupTile[Index].m_Angle = pSpeedupLayer->m_pSpeedupTile[y * pSpeedupLayer->m_Width + x].m_Angle; - m_pSpeedupTile[Index].m_MaxSpeed = pSpeedupLayer->m_pSpeedupTile[y * pSpeedupLayer->m_Width + x].m_MaxSpeed; - m_pSpeedupTile[Index].m_Type = pSpeedupLayer->m_pTiles[y * pSpeedupLayer->m_Width + x].m_Index; - m_pTiles[Index].m_Index = pSpeedupLayer->m_pTiles[y * pSpeedupLayer->m_Width + x].m_Index; - } - else if(m_pEditor->m_SpeedupForce) - { - m_pSpeedupTile[Index].m_Force = m_pEditor->m_SpeedupForce; - m_pSpeedupTile[Index].m_MaxSpeed = m_pEditor->m_SpeedupMaxSpeed; - m_pSpeedupTile[Index].m_Angle = m_pEditor->m_SpeedupAngle; - m_pSpeedupTile[Index].m_Type = pSpeedupLayer->m_pTiles[y * pSpeedupLayer->m_Width + x].m_Index; - m_pTiles[Index].m_Index = pSpeedupLayer->m_pTiles[y * pSpeedupLayer->m_Width + x].m_Index; - } - else - { - m_pSpeedupTile[Index].m_Force = 0; - m_pSpeedupTile[Index].m_MaxSpeed = 0; - m_pSpeedupTile[Index].m_Angle = 0; - m_pSpeedupTile[Index].m_Type = 0; - m_pTiles[Index].m_Index = 0; - } - } - else - { - m_pSpeedupTile[Index].m_Force = 0; - m_pSpeedupTile[Index].m_MaxSpeed = 0; - m_pSpeedupTile[Index].m_Angle = 0; - m_pSpeedupTile[Index].m_Type = 0; - m_pTiles[Index].m_Index = 0; - - if(pSpeedupLayer->m_pTiles[y * pSpeedupLayer->m_Width + x].m_Index != TILE_AIR) - ShowPreventUnusedTilesWarning(); - } - - SSpeedupTileStateChange::SData Current{ - m_pSpeedupTile[Index].m_Force, - m_pSpeedupTile[Index].m_Angle, - m_pSpeedupTile[Index].m_MaxSpeed, - m_pSpeedupTile[Index].m_Type, - m_pTiles[Index].m_Index}; - - RecordStateChange(fx, fy, Previous, Current); - } - FlagModified(sx, sy, pSpeedupLayer->m_Width, pSpeedupLayer->m_Height); -} - -void CLayerSpeedup::RecordStateChange(int x, int y, SSpeedupTileStateChange::SData Previous, SSpeedupTileStateChange::SData Current) -{ - if(!m_History[y][x].m_Changed) - m_History[y][x] = SSpeedupTileStateChange{true, Previous, Current}; - else - m_History[y][x].m_Current = Current; -} - -void CLayerSpeedup::BrushFlipX() -{ - CLayerTiles::BrushFlipX(); - BrushFlipXImpl(m_pSpeedupTile); -} - -void CLayerSpeedup::BrushFlipY() -{ - CLayerTiles::BrushFlipY(); - BrushFlipYImpl(m_pSpeedupTile); -} - -void CLayerSpeedup::BrushRotate(float Amount) -{ - int Rotation = (round_to_int(360.0f * Amount / (pi * 2)) / 90) % 4; // 0=0°, 1=90°, 2=180°, 3=270° - if(Rotation < 0) - Rotation += 4; - - if(Rotation == 1 || Rotation == 3) - { - // 90° rotation - CSpeedupTile *pTempData1 = new CSpeedupTile[m_Width * m_Height]; - CTile *pTempData2 = new CTile[m_Width * m_Height]; - mem_copy(pTempData1, m_pSpeedupTile, (size_t)m_Width * m_Height * sizeof(CSpeedupTile)); - mem_copy(pTempData2, m_pTiles, (size_t)m_Width * m_Height * sizeof(CTile)); - CSpeedupTile *pDst1 = m_pSpeedupTile; - CTile *pDst2 = m_pTiles; - for(int x = 0; x < m_Width; ++x) - for(int y = m_Height - 1; y >= 0; --y, ++pDst1, ++pDst2) - { - *pDst1 = pTempData1[y * m_Width + x]; - *pDst2 = pTempData2[y * m_Width + x]; - } - - std::swap(m_Width, m_Height); - delete[] pTempData1; - delete[] pTempData2; - } - - if(Rotation == 2 || Rotation == 3) - { - BrushFlipX(); - BrushFlipY(); - } -} - -void CLayerSpeedup::FillSelection(bool Empty, std::shared_ptr pBrush, CUIRect Rect) -{ - if(m_Readonly || (!Empty && pBrush->m_Type != LAYERTYPE_TILES)) - return; - - Snap(&Rect); // corrects Rect; no need of <= - - Snap(&Rect); - - int sx = ConvertX(Rect.x); - int sy = ConvertY(Rect.y); - int w = ConvertX(Rect.w); - int h = ConvertY(Rect.h); - - std::shared_ptr pLt = std::static_pointer_cast(pBrush); - - bool Destructive = m_pEditor->m_BrushDrawDestructive || Empty || IsEmpty(pLt); - - for(int y = 0; y < h; y++) - { - for(int x = 0; x < w; x++) - { - int fx = x + sx; - int fy = y + sy; - - if(fx < 0 || fx >= m_Width || fy < 0 || fy >= m_Height) - continue; - - if(!Destructive && GetTile(fx, fy).m_Index) - continue; - - const int SrcIndex = Empty ? 0 : (y * pLt->m_Width + x % pLt->m_Width) % (pLt->m_Width * pLt->m_Height); - const int TgtIndex = fy * m_Width + fx; - - SSpeedupTileStateChange::SData Previous{ - m_pSpeedupTile[TgtIndex].m_Force, - m_pSpeedupTile[TgtIndex].m_Angle, - m_pSpeedupTile[TgtIndex].m_MaxSpeed, - m_pSpeedupTile[TgtIndex].m_Type, - m_pTiles[TgtIndex].m_Index}; - - if(Empty || (!m_pEditor->m_AllowPlaceUnusedTiles && !IsValidSpeedupTile((pLt->m_pTiles[SrcIndex]).m_Index))) // no speed up tile chosen: reset - { - m_pTiles[TgtIndex].m_Index = 0; - m_pSpeedupTile[TgtIndex].m_Force = 0; - m_pSpeedupTile[TgtIndex].m_Angle = 0; - - if(!Empty) - ShowPreventUnusedTilesWarning(); - } - else - { - m_pTiles[TgtIndex] = pLt->m_pTiles[SrcIndex]; - if(pLt->m_Speedup && m_pTiles[TgtIndex].m_Index > 0) - { - m_pSpeedupTile[TgtIndex].m_Type = m_pTiles[TgtIndex].m_Index; - - if((pLt->m_pSpeedupTile[SrcIndex].m_Force == 0 && m_pEditor->m_SpeedupForce) || m_pEditor->m_SpeedupForce != pLt->m_SpeedupForce) - m_pSpeedupTile[TgtIndex].m_Force = m_pEditor->m_SpeedupForce; - else - m_pSpeedupTile[TgtIndex].m_Force = pLt->m_pSpeedupTile[SrcIndex].m_Force; - - if((pLt->m_pSpeedupTile[SrcIndex].m_Angle == 0 && m_pEditor->m_SpeedupAngle) || m_pEditor->m_SpeedupAngle != pLt->m_SpeedupAngle) - m_pSpeedupTile[TgtIndex].m_Angle = m_pEditor->m_SpeedupAngle; - else - m_pSpeedupTile[TgtIndex].m_Angle = pLt->m_pSpeedupTile[SrcIndex].m_Angle; - - if((pLt->m_pSpeedupTile[SrcIndex].m_MaxSpeed == 0 && m_pEditor->m_SpeedupMaxSpeed) || m_pEditor->m_SpeedupMaxSpeed != pLt->m_SpeedupMaxSpeed) - m_pSpeedupTile[TgtIndex].m_MaxSpeed = m_pEditor->m_SpeedupMaxSpeed; - else - m_pSpeedupTile[TgtIndex].m_MaxSpeed = pLt->m_pSpeedupTile[SrcIndex].m_MaxSpeed; - } - } - - SSpeedupTileStateChange::SData Current{ - m_pSpeedupTile[TgtIndex].m_Force, - m_pSpeedupTile[TgtIndex].m_Angle, - m_pSpeedupTile[TgtIndex].m_MaxSpeed, - m_pSpeedupTile[TgtIndex].m_Type, - m_pTiles[TgtIndex].m_Index}; - - RecordStateChange(fx, fy, Previous, Current); - } - } - FlagModified(sx, sy, w, h); -} - -std::shared_ptr CLayerSpeedup::Duplicate() const -{ - return std::make_shared(*this); -} - -const char *CLayerSpeedup::TypeName() const -{ - return "speedup"; -} diff --git a/src/game/editor/mapitems/layer_speedup.h b/src/game/editor/mapitems/layer_speedup.h deleted file mode 100644 index 5b298d5288..0000000000 --- a/src/game/editor/mapitems/layer_speedup.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef GAME_EDITOR_MAPITEMS_LAYER_SPEEDUP_H -#define GAME_EDITOR_MAPITEMS_LAYER_SPEEDUP_H - -#include "layer_tiles.h" - -struct SSpeedupTileStateChange -{ - bool m_Changed; - struct SData - { - int m_Force; - int m_Angle; - int m_MaxSpeed; - int m_Type; - int m_Index; - } m_Previous, m_Current; -}; - -class CLayerSpeedup : public CLayerTiles -{ -public: - CLayerSpeedup(CEditor *pEditor, int w, int h); - CLayerSpeedup(const CLayerSpeedup &Other); - ~CLayerSpeedup(); - - CSpeedupTile *m_pSpeedupTile; - int m_SpeedupForce; - int m_SpeedupMaxSpeed; - int m_SpeedupAngle; - - void Resize(int NewW, int NewH) override; - void Shift(int Direction) override; - bool IsEmpty(const std::shared_ptr &pLayer) override; - void BrushDraw(std::shared_ptr pBrush, vec2 WorldPos) override; - void BrushFlipX() override; - void BrushFlipY() override; - void BrushRotate(float Amount) override; - void FillSelection(bool Empty, std::shared_ptr pBrush, CUIRect Rect) override; - - EditorTileStateChangeHistory m_History; - void ClearHistory() override - { - CLayerTiles::ClearHistory(); - m_History.clear(); - } - - std::shared_ptr Duplicate() const override; - const char *TypeName() const override; - -private: - void RecordStateChange(int x, int y, SSpeedupTileStateChange::SData Previous, SSpeedupTileStateChange::SData Current); -}; - -#endif diff --git a/src/game/editor/mapitems/layer_switch.cpp b/src/game/editor/mapitems/layer_switch.cpp deleted file mode 100644 index 25e1bc35ee..0000000000 --- a/src/game/editor/mapitems/layer_switch.cpp +++ /dev/null @@ -1,393 +0,0 @@ -#include "layer_switch.h" - -#include - -CLayerSwitch::CLayerSwitch(CEditor *pEditor, int w, int h) : - CLayerTiles(pEditor, w, h) -{ - str_copy(m_aName, "Switch"); - m_Switch = 1; - - m_pSwitchTile = new CSwitchTile[w * h]; - mem_zero(m_pSwitchTile, (size_t)w * h * sizeof(CSwitchTile)); - m_GotoSwitchLastPos = ivec2(-1, -1); - m_GotoSwitchOffset = 0; -} - -CLayerSwitch::CLayerSwitch(const CLayerSwitch &Other) : - CLayerTiles(Other) -{ - str_copy(m_aName, "Switch copy"); - m_Switch = 1; - - m_pSwitchTile = new CSwitchTile[m_Width * m_Height]; - mem_copy(m_pSwitchTile, Other.m_pSwitchTile, (size_t)m_Width * m_Height * sizeof(CSwitchTile)); -} - -CLayerSwitch::~CLayerSwitch() -{ - delete[] m_pSwitchTile; -} - -void CLayerSwitch::Resize(int NewW, int NewH) -{ - // resize switch data - CSwitchTile *pNewSwitchData = new CSwitchTile[NewW * NewH]; - mem_zero(pNewSwitchData, (size_t)NewW * NewH * sizeof(CSwitchTile)); - - // copy old data - for(int y = 0; y < minimum(NewH, m_Height); y++) - mem_copy(&pNewSwitchData[y * NewW], &m_pSwitchTile[y * m_Width], minimum(m_Width, NewW) * sizeof(CSwitchTile)); - - // replace old - delete[] m_pSwitchTile; - m_pSwitchTile = pNewSwitchData; - - // resize tile data - CLayerTiles::Resize(NewW, NewH); - - // resize gamelayer too - if(m_pEditor->m_Map.m_pGameLayer->m_Width != NewW || m_pEditor->m_Map.m_pGameLayer->m_Height != NewH) - m_pEditor->m_Map.m_pGameLayer->Resize(NewW, NewH); -} - -void CLayerSwitch::Shift(int Direction) -{ - CLayerTiles::Shift(Direction); - ShiftImpl(m_pSwitchTile, Direction, m_pEditor->m_ShiftBy); -} - -bool CLayerSwitch::IsEmpty(const std::shared_ptr &pLayer) -{ - for(int y = 0; y < pLayer->m_Height; y++) - for(int x = 0; x < pLayer->m_Width; x++) - if(m_pEditor->m_AllowPlaceUnusedTiles || IsValidSwitchTile(pLayer->GetTile(x, y).m_Index)) - return false; - - return true; -} - -void CLayerSwitch::BrushDraw(std::shared_ptr pBrush, vec2 WorldPos) -{ - if(m_Readonly) - return; - - std::shared_ptr pSwitchLayer = std::static_pointer_cast(pBrush); - int sx = ConvertX(WorldPos.x); - int sy = ConvertY(WorldPos.y); - if(str_comp(pSwitchLayer->m_aFileName, m_pEditor->m_aFileName)) - { - m_pEditor->m_SwitchNum = pSwitchLayer->m_SwitchNumber; - m_pEditor->m_SwitchDelay = pSwitchLayer->m_SwitchDelay; - } - - bool Destructive = m_pEditor->m_BrushDrawDestructive || IsEmpty(pSwitchLayer); - - for(int y = 0; y < pSwitchLayer->m_Height; y++) - for(int x = 0; x < pSwitchLayer->m_Width; x++) - { - int fx = x + sx; - int fy = y + sy; - - if(fx < 0 || fx >= m_Width || fy < 0 || fy >= m_Height) - continue; - - if(!Destructive && GetTile(fx, fy).m_Index) - continue; - - int Index = fy * m_Width + fx; - SSwitchTileStateChange::SData Previous{ - m_pSwitchTile[Index].m_Number, - m_pSwitchTile[Index].m_Type, - m_pSwitchTile[Index].m_Flags, - m_pSwitchTile[Index].m_Delay, - m_pTiles[Index].m_Index}; - - if((m_pEditor->m_AllowPlaceUnusedTiles || IsValidSwitchTile(pSwitchLayer->m_pTiles[y * pSwitchLayer->m_Width + x].m_Index)) && pSwitchLayer->m_pTiles[y * pSwitchLayer->m_Width + x].m_Index != TILE_AIR) - { - if(m_pEditor->m_SwitchNum != pSwitchLayer->m_SwitchNumber || m_pEditor->m_SwitchDelay != pSwitchLayer->m_SwitchDelay) - { - m_pSwitchTile[Index].m_Number = m_pEditor->m_SwitchNum; - m_pSwitchTile[Index].m_Delay = m_pEditor->m_SwitchDelay; - } - else if(pSwitchLayer->m_pSwitchTile[y * pSwitchLayer->m_Width + x].m_Number) - { - m_pSwitchTile[Index].m_Number = pSwitchLayer->m_pSwitchTile[y * pSwitchLayer->m_Width + x].m_Number; - m_pSwitchTile[Index].m_Delay = pSwitchLayer->m_pSwitchTile[y * pSwitchLayer->m_Width + x].m_Delay; - } - else - { - m_pSwitchTile[Index].m_Number = m_pEditor->m_SwitchNum; - m_pSwitchTile[Index].m_Delay = m_pEditor->m_SwitchDelay; - } - - m_pSwitchTile[Index].m_Type = pSwitchLayer->m_pTiles[y * pSwitchLayer->m_Width + x].m_Index; - m_pSwitchTile[Index].m_Flags = pSwitchLayer->m_pTiles[y * pSwitchLayer->m_Width + x].m_Flags; - m_pTiles[Index].m_Index = pSwitchLayer->m_pTiles[y * pSwitchLayer->m_Width + x].m_Index; - m_pTiles[Index].m_Flags = pSwitchLayer->m_pTiles[y * pSwitchLayer->m_Width + x].m_Flags; - - if(!IsSwitchTileFlagsUsed(pSwitchLayer->m_pTiles[y * pSwitchLayer->m_Width + x].m_Index)) - { - m_pSwitchTile[Index].m_Flags = 0; - } - if(!IsSwitchTileNumberUsed(pSwitchLayer->m_pTiles[y * pSwitchLayer->m_Width + x].m_Index)) - { - m_pSwitchTile[Index].m_Number = 0; - } - if(!IsSwitchTileDelayUsed(pSwitchLayer->m_pTiles[y * pSwitchLayer->m_Width + x].m_Index)) - { - m_pSwitchTile[Index].m_Delay = 0; - } - } - else - { - m_pSwitchTile[Index].m_Number = 0; - m_pSwitchTile[Index].m_Type = 0; - m_pSwitchTile[Index].m_Flags = 0; - m_pSwitchTile[Index].m_Delay = 0; - m_pTiles[Index].m_Index = 0; - - if(pSwitchLayer->m_pTiles[y * pSwitchLayer->m_Width + x].m_Index != TILE_AIR) - ShowPreventUnusedTilesWarning(); - } - - SSwitchTileStateChange::SData Current{ - m_pSwitchTile[Index].m_Number, - m_pSwitchTile[Index].m_Type, - m_pSwitchTile[Index].m_Flags, - m_pSwitchTile[Index].m_Delay, - m_pTiles[Index].m_Index}; - - RecordStateChange(fx, fy, Previous, Current); - } - FlagModified(sx, sy, pSwitchLayer->m_Width, pSwitchLayer->m_Height); -} - -void CLayerSwitch::RecordStateChange(int x, int y, SSwitchTileStateChange::SData Previous, SSwitchTileStateChange::SData Current) -{ - if(!m_History[y][x].m_Changed) - m_History[y][x] = SSwitchTileStateChange{true, Previous, Current}; - else - m_History[y][x].m_Current = Current; -} - -void CLayerSwitch::BrushFlipX() -{ - CLayerTiles::BrushFlipX(); - BrushFlipXImpl(m_pSwitchTile); -} - -void CLayerSwitch::BrushFlipY() -{ - CLayerTiles::BrushFlipY(); - BrushFlipYImpl(m_pSwitchTile); -} - -void CLayerSwitch::BrushRotate(float Amount) -{ - int Rotation = (round_to_int(360.0f * Amount / (pi * 2)) / 90) % 4; // 0=0°, 1=90°, 2=180°, 3=270° - if(Rotation < 0) - Rotation += 4; - - if(Rotation == 1 || Rotation == 3) - { - // 90° rotation - CSwitchTile *pTempData1 = new CSwitchTile[m_Width * m_Height]; - CTile *pTempData2 = new CTile[m_Width * m_Height]; - mem_copy(pTempData1, m_pSwitchTile, (size_t)m_Width * m_Height * sizeof(CSwitchTile)); - mem_copy(pTempData2, m_pTiles, (size_t)m_Width * m_Height * sizeof(CTile)); - CSwitchTile *pDst1 = m_pSwitchTile; - CTile *pDst2 = m_pTiles; - for(int x = 0; x < m_Width; ++x) - for(int y = m_Height - 1; y >= 0; --y, ++pDst1, ++pDst2) - { - *pDst1 = pTempData1[y * m_Width + x]; - *pDst2 = pTempData2[y * m_Width + x]; - if(IsRotatableTile(pDst2->m_Index)) - { - if(pDst2->m_Flags & TILEFLAG_ROTATE) - pDst2->m_Flags ^= (TILEFLAG_YFLIP | TILEFLAG_XFLIP); - pDst2->m_Flags ^= TILEFLAG_ROTATE; - } - } - - std::swap(m_Width, m_Height); - delete[] pTempData1; - delete[] pTempData2; - } - - if(Rotation == 2 || Rotation == 3) - { - BrushFlipX(); - BrushFlipY(); - } -} - -void CLayerSwitch::FillSelection(bool Empty, std::shared_ptr pBrush, CUIRect Rect) -{ - if(m_Readonly || (!Empty && pBrush->m_Type != LAYERTYPE_TILES)) - return; - - Snap(&Rect); // corrects Rect; no need of <= - - Snap(&Rect); - - int sx = ConvertX(Rect.x); - int sy = ConvertY(Rect.y); - int w = ConvertX(Rect.w); - int h = ConvertY(Rect.h); - - std::shared_ptr pLt = std::static_pointer_cast(pBrush); - - bool Destructive = m_pEditor->m_BrushDrawDestructive || Empty || IsEmpty(pLt); - - for(int y = 0; y < h; y++) - { - for(int x = 0; x < w; x++) - { - int fx = x + sx; - int fy = y + sy; - - if(fx < 0 || fx >= m_Width || fy < 0 || fy >= m_Height) - continue; - - if(!Destructive && GetTile(fx, fy).m_Index) - continue; - - const int SrcIndex = Empty ? 0 : (y * pLt->m_Width + x % pLt->m_Width) % (pLt->m_Width * pLt->m_Height); - const int TgtIndex = fy * m_Width + fx; - - SSwitchTileStateChange::SData Previous{ - m_pSwitchTile[TgtIndex].m_Number, - m_pSwitchTile[TgtIndex].m_Type, - m_pSwitchTile[TgtIndex].m_Flags, - m_pSwitchTile[TgtIndex].m_Delay, - m_pTiles[TgtIndex].m_Index}; - - if(Empty || (!m_pEditor->m_AllowPlaceUnusedTiles && !IsValidSwitchTile((pLt->m_pTiles[SrcIndex]).m_Index))) - { - m_pTiles[TgtIndex].m_Index = 0; - m_pSwitchTile[TgtIndex].m_Type = 0; - m_pSwitchTile[TgtIndex].m_Number = 0; - m_pSwitchTile[TgtIndex].m_Delay = 0; - - if(!Empty) - ShowPreventUnusedTilesWarning(); - } - else - { - m_pTiles[TgtIndex] = pLt->m_pTiles[SrcIndex]; - m_pSwitchTile[TgtIndex].m_Type = m_pTiles[TgtIndex].m_Index; - if(pLt->m_Switch && m_pTiles[TgtIndex].m_Index > 0) - { - if(!IsSwitchTileNumberUsed(m_pSwitchTile[TgtIndex].m_Type)) - m_pSwitchTile[TgtIndex].m_Number = 0; - else if(pLt->m_pSwitchTile[SrcIndex].m_Number == 0 || m_pEditor->m_SwitchNum != pLt->m_SwitchNumber) - m_pSwitchTile[TgtIndex].m_Number = m_pEditor->m_SwitchNum; - else - m_pSwitchTile[TgtIndex].m_Number = pLt->m_pSwitchTile[SrcIndex].m_Number; - - if(!IsSwitchTileDelayUsed(m_pSwitchTile[TgtIndex].m_Type)) - m_pSwitchTile[TgtIndex].m_Delay = 0; - else if(pLt->m_pSwitchTile[SrcIndex].m_Delay == 0 || m_pEditor->m_SwitchDelay != pLt->m_SwitchDelay) - m_pSwitchTile[TgtIndex].m_Delay = m_pEditor->m_SwitchDelay; - else - m_pSwitchTile[TgtIndex].m_Delay = pLt->m_pSwitchTile[SrcIndex].m_Delay; - - if(!IsSwitchTileFlagsUsed(m_pSwitchTile[TgtIndex].m_Type)) - m_pSwitchTile[TgtIndex].m_Flags = 0; - else - m_pSwitchTile[TgtIndex].m_Flags = pLt->m_pSwitchTile[SrcIndex].m_Flags; - } - } - - SSwitchTileStateChange::SData Current{ - m_pSwitchTile[TgtIndex].m_Number, - m_pSwitchTile[TgtIndex].m_Type, - m_pSwitchTile[TgtIndex].m_Flags, - m_pSwitchTile[TgtIndex].m_Delay, - m_pTiles[TgtIndex].m_Index}; - - RecordStateChange(fx, fy, Previous, Current); - } - } - FlagModified(sx, sy, w, h); -} - -bool CLayerSwitch::ContainsElementWithId(int Id) -{ - for(int y = 0; y < m_Height; ++y) - { - for(int x = 0; x < m_Width; ++x) - { - if(IsSwitchTileNumberUsed(m_pSwitchTile[y * m_Width + x].m_Type) && m_pSwitchTile[y * m_Width + x].m_Number == Id) - { - return true; - } - } - } - - return false; -} - -void CLayerSwitch::GetPos(int Number, int Offset, ivec2 &SwitchPos) -{ - int Match = -1; - ivec2 MatchPos = ivec2(-1, -1); - SwitchPos = ivec2(-1, -1); - - auto FindTile = [this, &Match, &MatchPos, &Number, &Offset]() { - for(int x = 0; x < m_Width; x++) - { - for(int y = 0; y < m_Height; y++) - { - int i = y * m_Width + x; - int Switch = m_pSwitchTile[i].m_Number; - if(Number == Switch) - { - Match++; - if(Offset != -1) - { - if(Match == Offset) - { - MatchPos = ivec2(x, y); - m_GotoSwitchOffset = Match; - return; - } - continue; - } - MatchPos = ivec2(x, y); - if(m_GotoSwitchLastPos != ivec2(-1, -1)) - { - if(distance(m_GotoSwitchLastPos, MatchPos) < 10.0f) - { - m_GotoSwitchOffset++; - continue; - } - } - m_GotoSwitchLastPos = MatchPos; - if(Match == m_GotoSwitchOffset) - return; - } - } - } - }; - FindTile(); - - if(MatchPos == ivec2(-1, -1)) - return; - if(Match < m_GotoSwitchOffset) - m_GotoSwitchOffset = -1; - SwitchPos = MatchPos; - m_GotoSwitchOffset++; -} - -std::shared_ptr CLayerSwitch::Duplicate() const -{ - return std::make_shared(*this); -} - -const char *CLayerSwitch::TypeName() const -{ - return "switch"; -} diff --git a/src/game/editor/mapitems/layer_switch.h b/src/game/editor/mapitems/layer_switch.h deleted file mode 100644 index 810cbf9efe..0000000000 --- a/src/game/editor/mapitems/layer_switch.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef GAME_EDITOR_MAPITEMS_LAYER_SWITCH_H -#define GAME_EDITOR_MAPITEMS_LAYER_SWITCH_H - -#include "layer_tiles.h" - -struct SSwitchTileStateChange -{ - bool m_Changed; - struct SData - { - int m_Number; - int m_Type; - int m_Flags; - int m_Delay; - int m_Index; - } m_Previous, m_Current; -}; - -class CLayerSwitch : public CLayerTiles -{ -public: - CLayerSwitch(CEditor *pEditor, int w, int h); - CLayerSwitch(const CLayerSwitch &Other); - ~CLayerSwitch(); - - CSwitchTile *m_pSwitchTile; - unsigned char m_SwitchNumber; - unsigned char m_SwitchDelay; - - void Resize(int NewW, int NewH) override; - void Shift(int Direction) override; - bool IsEmpty(const std::shared_ptr &pLayer) override; - void BrushDraw(std::shared_ptr pBrush, vec2 WorldPos) override; - void BrushFlipX() override; - void BrushFlipY() override; - void BrushRotate(float Amount) override; - void FillSelection(bool Empty, std::shared_ptr pBrush, CUIRect Rect) override; - virtual bool ContainsElementWithId(int Id); - virtual void GetPos(int Number, int Offset, ivec2 &SwitchPos); - - int m_GotoSwitchOffset; - ivec2 m_GotoSwitchLastPos; - - EditorTileStateChangeHistory m_History; - inline void ClearHistory() override - { - CLayerTiles::ClearHistory(); - m_History.clear(); - } - - std::shared_ptr Duplicate() const override; - const char *TypeName() const override; - -private: - void RecordStateChange(int x, int y, SSwitchTileStateChange::SData Previous, SSwitchTileStateChange::SData Current); -}; - -#endif diff --git a/src/game/editor/mapitems/layer_tele.cpp b/src/game/editor/mapitems/layer_tele.cpp deleted file mode 100644 index f015a547b6..0000000000 --- a/src/game/editor/mapitems/layer_tele.cpp +++ /dev/null @@ -1,377 +0,0 @@ -#include "layer_tele.h" - -#include - -CLayerTele::CLayerTele(CEditor *pEditor, int w, int h) : - CLayerTiles(pEditor, w, h) -{ - str_copy(m_aName, "Tele"); - m_Tele = 1; - - m_pTeleTile = new CTeleTile[w * h]; - mem_zero(m_pTeleTile, (size_t)w * h * sizeof(CTeleTile)); - - m_GotoTeleOffset = 0; - m_GotoTeleLastPos = ivec2(-1, -1); -} - -CLayerTele::CLayerTele(const CLayerTele &Other) : - CLayerTiles(Other) -{ - str_copy(m_aName, "Tele copy"); - m_Tele = 1; - - m_pTeleTile = new CTeleTile[m_Width * m_Height]; - mem_copy(m_pTeleTile, Other.m_pTeleTile, (size_t)m_Width * m_Height * sizeof(CTeleTile)); -} - -CLayerTele::~CLayerTele() -{ - delete[] m_pTeleTile; -} - -void CLayerTele::Resize(int NewW, int NewH) -{ - // resize tele data - CTeleTile *pNewTeleData = new CTeleTile[NewW * NewH]; - mem_zero(pNewTeleData, (size_t)NewW * NewH * sizeof(CTeleTile)); - - // copy old data - for(int y = 0; y < minimum(NewH, m_Height); y++) - mem_copy(&pNewTeleData[y * NewW], &m_pTeleTile[y * m_Width], minimum(m_Width, NewW) * sizeof(CTeleTile)); - - // replace old - delete[] m_pTeleTile; - m_pTeleTile = pNewTeleData; - - // resize tile data - CLayerTiles::Resize(NewW, NewH); - - // resize gamelayer too - if(m_pEditor->m_Map.m_pGameLayer->m_Width != NewW || m_pEditor->m_Map.m_pGameLayer->m_Height != NewH) - m_pEditor->m_Map.m_pGameLayer->Resize(NewW, NewH); -} - -void CLayerTele::Shift(int Direction) -{ - CLayerTiles::Shift(Direction); - ShiftImpl(m_pTeleTile, Direction, m_pEditor->m_ShiftBy); -} - -bool CLayerTele::IsEmpty(const std::shared_ptr &pLayer) -{ - for(int y = 0; y < pLayer->m_Height; y++) - for(int x = 0; x < pLayer->m_Width; x++) - if(m_pEditor->m_AllowPlaceUnusedTiles || IsValidTeleTile(pLayer->GetTile(x, y).m_Index)) - return false; - - return true; -} - -void CLayerTele::BrushDraw(std::shared_ptr pBrush, vec2 WorldPos) -{ - if(m_Readonly) - return; - - std::shared_ptr pTeleLayer = std::static_pointer_cast(pBrush); - int sx = ConvertX(WorldPos.x); - int sy = ConvertY(WorldPos.y); - if(str_comp(pTeleLayer->m_aFileName, m_pEditor->m_aFileName)) - m_pEditor->m_TeleNumber = pTeleLayer->m_TeleNum; - - bool Destructive = m_pEditor->m_BrushDrawDestructive || IsEmpty(pTeleLayer); - - for(int y = 0; y < pTeleLayer->m_Height; y++) - for(int x = 0; x < pTeleLayer->m_Width; x++) - { - int fx = x + sx; - int fy = y + sy; - - if(fx < 0 || fx >= m_Width || fy < 0 || fy >= m_Height) - continue; - - if(!Destructive && GetTile(fx, fy).m_Index) - continue; - - int Index = fy * m_Width + fx; - STeleTileStateChange::SData Previous{ - m_pTeleTile[Index].m_Number, - m_pTeleTile[Index].m_Type, - m_pTiles[Index].m_Index}; - - unsigned char TgtIndex = pTeleLayer->m_pTiles[y * pTeleLayer->m_Width + x].m_Index; - if((m_pEditor->m_AllowPlaceUnusedTiles || IsValidTeleTile(TgtIndex)) && TgtIndex != TILE_AIR) - { - bool IsCheckpoint = IsTeleTileCheckpoint(TgtIndex); - if(!IsCheckpoint && !IsTeleTileNumberUsed(TgtIndex, false)) - { - // Tele tile number is unused. Set a known value which is not 0, - // as tiles with number 0 would be ignored by previous versions. - m_pTeleTile[Index].m_Number = 255; - } - else if(pTeleLayer->m_pTeleTile[y * pTeleLayer->m_Width + x].m_Number) - { - m_pTeleTile[Index].m_Number = pTeleLayer->m_pTeleTile[y * pTeleLayer->m_Width + x].m_Number; - } - else - { - if((!IsCheckpoint && !m_pEditor->m_TeleNumber) || (IsCheckpoint && !m_pEditor->m_TeleCheckpointNumber)) - { - m_pTeleTile[Index].m_Number = 0; - m_pTeleTile[Index].m_Type = 0; - m_pTiles[Index].m_Index = 0; - - STeleTileStateChange::SData Current{ - m_pTeleTile[Index].m_Number, - m_pTeleTile[Index].m_Type, - m_pTiles[Index].m_Index}; - - RecordStateChange(fx, fy, Previous, Current); - continue; - } - else - { - m_pTeleTile[Index].m_Number = IsCheckpoint ? m_pEditor->m_TeleCheckpointNumber : m_pEditor->m_TeleNumber; - } - } - - m_pTeleTile[Index].m_Type = pTeleLayer->m_pTiles[y * pTeleLayer->m_Width + x].m_Index; - m_pTiles[Index].m_Index = pTeleLayer->m_pTiles[y * pTeleLayer->m_Width + x].m_Index; - } - else - { - m_pTeleTile[Index].m_Number = 0; - m_pTeleTile[Index].m_Type = 0; - m_pTiles[Index].m_Index = 0; - - if(pTeleLayer->m_pTiles[y * pTeleLayer->m_Width + x].m_Index != TILE_AIR) - ShowPreventUnusedTilesWarning(); - } - - STeleTileStateChange::SData Current{ - m_pTeleTile[Index].m_Number, - m_pTeleTile[Index].m_Type, - m_pTiles[Index].m_Index}; - - RecordStateChange(fx, fy, Previous, Current); - } - FlagModified(sx, sy, pTeleLayer->m_Width, pTeleLayer->m_Height); -} - -void CLayerTele::RecordStateChange(int x, int y, STeleTileStateChange::SData Previous, STeleTileStateChange::SData Current) -{ - if(!m_History[y][x].m_Changed) - m_History[y][x] = STeleTileStateChange{true, Previous, Current}; - else - { - m_History[y][x].m_Current = Current; - } -} - -void CLayerTele::BrushFlipX() -{ - CLayerTiles::BrushFlipX(); - BrushFlipXImpl(m_pTeleTile); -} - -void CLayerTele::BrushFlipY() -{ - CLayerTiles::BrushFlipY(); - BrushFlipYImpl(m_pTeleTile); -} - -void CLayerTele::BrushRotate(float Amount) -{ - int Rotation = (round_to_int(360.0f * Amount / (pi * 2)) / 90) % 4; // 0=0°, 1=90°, 2=180°, 3=270° - if(Rotation < 0) - Rotation += 4; - - if(Rotation == 1 || Rotation == 3) - { - // 90° rotation - CTeleTile *pTempData1 = new CTeleTile[m_Width * m_Height]; - CTile *pTempData2 = new CTile[m_Width * m_Height]; - mem_copy(pTempData1, m_pTeleTile, (size_t)m_Width * m_Height * sizeof(CTeleTile)); - mem_copy(pTempData2, m_pTiles, (size_t)m_Width * m_Height * sizeof(CTile)); - CTeleTile *pDst1 = m_pTeleTile; - CTile *pDst2 = m_pTiles; - for(int x = 0; x < m_Width; ++x) - for(int y = m_Height - 1; y >= 0; --y, ++pDst1, ++pDst2) - { - *pDst1 = pTempData1[y * m_Width + x]; - *pDst2 = pTempData2[y * m_Width + x]; - } - - std::swap(m_Width, m_Height); - delete[] pTempData1; - delete[] pTempData2; - } - - if(Rotation == 2 || Rotation == 3) - { - BrushFlipX(); - BrushFlipY(); - } -} - -void CLayerTele::FillSelection(bool Empty, std::shared_ptr pBrush, CUIRect Rect) -{ - if(m_Readonly || (!Empty && pBrush->m_Type != LAYERTYPE_TILES)) - return; - - Snap(&Rect); // corrects Rect; no need of <= - - Snap(&Rect); - - int sx = ConvertX(Rect.x); - int sy = ConvertY(Rect.y); - int w = ConvertX(Rect.w); - int h = ConvertY(Rect.h); - - std::shared_ptr pLt = std::static_pointer_cast(pBrush); - - bool Destructive = m_pEditor->m_BrushDrawDestructive || Empty || IsEmpty(pLt); - - for(int y = 0; y < h; y++) - { - for(int x = 0; x < w; x++) - { - int fx = x + sx; - int fy = y + sy; - - if(fx < 0 || fx >= m_Width || fy < 0 || fy >= m_Height) - continue; - - if(!Destructive && GetTile(fx, fy).m_Index) - continue; - - const int SrcIndex = Empty ? 0 : (y * pLt->m_Width + x % pLt->m_Width) % (pLt->m_Width * pLt->m_Height); - const int TgtIndex = fy * m_Width + fx; - - STeleTileStateChange::SData Previous{ - m_pTeleTile[TgtIndex].m_Number, - m_pTeleTile[TgtIndex].m_Type, - m_pTiles[TgtIndex].m_Index}; - - if(Empty || (!m_pEditor->m_AllowPlaceUnusedTiles && !IsValidTeleTile((pLt->m_pTiles[SrcIndex]).m_Index))) - { - m_pTiles[TgtIndex].m_Index = 0; - m_pTeleTile[TgtIndex].m_Type = 0; - m_pTeleTile[TgtIndex].m_Number = 0; - - if(!Empty) - ShowPreventUnusedTilesWarning(); - } - else - { - m_pTiles[TgtIndex] = pLt->m_pTiles[SrcIndex]; - if(pLt->m_Tele && m_pTiles[TgtIndex].m_Index > 0) - { - m_pTeleTile[TgtIndex].m_Type = m_pTiles[TgtIndex].m_Index; - bool IsCheckpoint = IsTeleTileCheckpoint(m_pTiles[TgtIndex].m_Index); - - if(!IsCheckpoint && !IsTeleTileNumberUsed(m_pTeleTile[TgtIndex].m_Type, false)) - { - // Tele tile number is unused. Set a known value which is not 0, - // as tiles with number 0 would be ignored by previous versions. - m_pTeleTile[TgtIndex].m_Number = 255; - } - else if(!IsCheckpoint && ((pLt->m_pTeleTile[SrcIndex].m_Number == 0 && m_pEditor->m_TeleNumber) || m_pEditor->m_TeleNumber != pLt->m_TeleNum)) - m_pTeleTile[TgtIndex].m_Number = m_pEditor->m_TeleNumber; - else if(IsCheckpoint && ((pLt->m_pTeleTile[SrcIndex].m_Number == 0 && m_pEditor->m_TeleCheckpointNumber) || m_pEditor->m_TeleCheckpointNumber != pLt->m_TeleCheckpointNum)) - m_pTeleTile[TgtIndex].m_Number = m_pEditor->m_TeleCheckpointNumber; - else - m_pTeleTile[TgtIndex].m_Number = pLt->m_pTeleTile[SrcIndex].m_Number; - } - } - - STeleTileStateChange::SData Current{ - m_pTeleTile[TgtIndex].m_Number, - m_pTeleTile[TgtIndex].m_Type, - m_pTiles[TgtIndex].m_Index}; - - RecordStateChange(fx, fy, Previous, Current); - } - } - FlagModified(sx, sy, w, h); -} - -bool CLayerTele::ContainsElementWithId(int Id, bool Checkpoint) -{ - for(int y = 0; y < m_Height; ++y) - { - for(int x = 0; x < m_Width; ++x) - { - if(IsTeleTileNumberUsed(m_pTeleTile[y * m_Width + x].m_Type, Checkpoint) && m_pTeleTile[y * m_Width + x].m_Number == Id) - { - return true; - } - } - } - - return false; -} - -void CLayerTele::GetPos(int Number, int Offset, int &TeleX, int &TeleY) -{ - int Match = -1; - ivec2 MatchPos = ivec2(-1, -1); - TeleX = -1; - TeleY = -1; - - auto FindTile = [this, &Match, &MatchPos, &Number, &Offset]() { - for(int x = 0; x < m_Width; x++) - { - for(int y = 0; y < m_Height; y++) - { - int i = y * m_Width + x; - int Tele = m_pTeleTile[i].m_Number; - if(Number == Tele) - { - Match++; - if(Offset != -1) - { - if(Match == Offset) - { - MatchPos = ivec2(x, y); - m_GotoTeleOffset = Match; - return; - } - continue; - } - MatchPos = ivec2(x, y); - if(m_GotoTeleLastPos != ivec2(-1, -1)) - { - if(distance(m_GotoTeleLastPos, MatchPos) < 10.0f) - { - m_GotoTeleOffset++; - continue; - } - } - m_GotoTeleLastPos = MatchPos; - if(Match == m_GotoTeleOffset) - return; - } - } - } - }; - FindTile(); - - if(MatchPos == ivec2(-1, -1)) - return; - if(Match < m_GotoTeleOffset) - m_GotoTeleOffset = -1; - TeleX = MatchPos.x; - TeleY = MatchPos.y; - m_GotoTeleOffset++; -} - -std::shared_ptr CLayerTele::Duplicate() const -{ - return std::make_shared(*this); -} - -const char *CLayerTele::TypeName() const -{ - return "tele"; -} diff --git a/src/game/editor/mapitems/layer_tele.h b/src/game/editor/mapitems/layer_tele.h deleted file mode 100644 index 1a373e79ad..0000000000 --- a/src/game/editor/mapitems/layer_tele.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef GAME_EDITOR_MAPITEMS_LAYER_TELE_H -#define GAME_EDITOR_MAPITEMS_LAYER_TELE_H - -#include "layer_tiles.h" - -struct STeleTileStateChange -{ - bool m_Changed; - struct SData - { - int m_Number; - int m_Type; - int m_Index; - } m_Previous, m_Current; -}; - -class CLayerTele : public CLayerTiles -{ -public: - CLayerTele(CEditor *pEditor, int w, int h); - CLayerTele(const CLayerTele &Other); - ~CLayerTele(); - - CTeleTile *m_pTeleTile; - unsigned char m_TeleNum; - unsigned char m_TeleCheckpointNum; - - void Resize(int NewW, int NewH) override; - void Shift(int Direction) override; - bool IsEmpty(const std::shared_ptr &pLayer) override; - void BrushDraw(std::shared_ptr pBrush, vec2 WorldPos) override; - void BrushFlipX() override; - void BrushFlipY() override; - void BrushRotate(float Amount) override; - void FillSelection(bool Empty, std::shared_ptr pBrush, CUIRect Rect) override; - virtual bool ContainsElementWithId(int Id, bool Checkpoint); - virtual void GetPos(int Number, int Offset, int &TeleX, int &TeleY); - - int m_GotoTeleOffset; - ivec2 m_GotoTeleLastPos; - - EditorTileStateChangeHistory m_History; - inline void ClearHistory() override - { - CLayerTiles::ClearHistory(); - m_History.clear(); - } - - std::shared_ptr Duplicate() const override; - const char *TypeName() const override; - -private: - void RecordStateChange(int x, int y, STeleTileStateChange::SData Previous, STeleTileStateChange::SData Current); - - friend class CLayerTiles; -}; - -#endif diff --git a/src/game/editor/mapitems/layer_tiles.cpp b/src/game/editor/mapitems/layer_tiles.cpp deleted file mode 100644 index db113f60fb..0000000000 --- a/src/game/editor/mapitems/layer_tiles.cpp +++ /dev/null @@ -1,1328 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ -#include "layer_tiles.h" - -#include -#include -#include -#include -#include - -#include -#include - -#include "image.h" - -CLayerTiles::CLayerTiles(CEditor *pEditor, int w, int h) : - CLayer(pEditor) -{ - m_Type = LAYERTYPE_TILES; - m_aName[0] = '\0'; - m_Width = w; - m_Height = h; - m_Image = -1; - m_Game = 0; - m_Color.r = 255; - m_Color.g = 255; - m_Color.b = 255; - m_Color.a = 255; - m_ColorEnv = -1; - m_ColorEnvOffset = 0; - - m_Tele = 0; - m_Speedup = 0; - m_Front = 0; - m_Switch = 0; - m_Tune = 0; - m_AutoMapperConfig = -1; - m_Seed = 0; - m_AutoAutoMap = false; - - m_pTiles = new CTile[m_Width * m_Height]; - mem_zero(m_pTiles, (size_t)m_Width * m_Height * sizeof(CTile)); -} - -CLayerTiles::CLayerTiles(const CLayerTiles &Other) : - CLayer(Other) -{ - m_Width = Other.m_Width; - m_Height = Other.m_Height; - m_pTiles = new CTile[m_Width * m_Height]; - mem_copy(m_pTiles, Other.m_pTiles, (size_t)m_Width * m_Height * sizeof(CTile)); - - m_Image = Other.m_Image; - m_Game = Other.m_Game; - m_Color = Other.m_Color; - m_ColorEnv = Other.m_ColorEnv; - m_ColorEnvOffset = Other.m_ColorEnvOffset; - - m_AutoMapperConfig = Other.m_AutoMapperConfig; - m_Seed = Other.m_Seed; - m_AutoAutoMap = Other.m_AutoAutoMap; - m_Tele = Other.m_Tele; - m_Speedup = Other.m_Speedup; - m_Front = Other.m_Front; - m_Switch = Other.m_Switch; - m_Tune = Other.m_Tune; - - str_copy(m_aFileName, Other.m_aFileName); -} - -CLayerTiles::~CLayerTiles() -{ - delete[] m_pTiles; -} - -CTile CLayerTiles::GetTile(int x, int y) -{ - return m_pTiles[y * m_Width + x]; -} - -void CLayerTiles::SetTile(int x, int y, CTile Tile) -{ - auto CurrentTile = m_pTiles[y * m_Width + x]; - SetTileIgnoreHistory(x, y, Tile); - RecordStateChange(x, y, CurrentTile, Tile); -} - -void CLayerTiles::SetTileIgnoreHistory(int x, int y, CTile Tile) const -{ - m_pTiles[y * m_Width + x] = Tile; -} - -void CLayerTiles::RecordStateChange(int x, int y, CTile Previous, CTile Tile) -{ - if(!m_TilesHistory[y][x].m_Changed) - m_TilesHistory[y][x] = STileStateChange{true, Previous, Tile}; - else - m_TilesHistory[y][x].m_Current = Tile; -} - -void CLayerTiles::PrepareForSave() -{ - for(int y = 0; y < m_Height; y++) - for(int x = 0; x < m_Width; x++) - m_pTiles[y * m_Width + x].m_Flags &= TILEFLAG_XFLIP | TILEFLAG_YFLIP | TILEFLAG_ROTATE; - - if(m_Image != -1 && m_Color.a == 255) - { - for(int y = 0; y < m_Height; y++) - for(int x = 0; x < m_Width; x++) - m_pTiles[y * m_Width + x].m_Flags |= m_pEditor->m_Map.m_vpImages[m_Image]->m_aTileFlags[m_pTiles[y * m_Width + x].m_Index]; - } -} - -void CLayerTiles::ExtractTiles(int TilemapItemVersion, const CTile *pSavedTiles, size_t SavedTilesSize) const -{ - const size_t DestSize = (size_t)m_Width * m_Height; - if(TilemapItemVersion >= CMapItemLayerTilemap::TILE_SKIP_MIN_VERSION) - CMap::ExtractTiles(m_pTiles, DestSize, pSavedTiles, SavedTilesSize); - else if(SavedTilesSize >= DestSize) - mem_copy(m_pTiles, pSavedTiles, DestSize * sizeof(CTile)); -} - -void CLayerTiles::MakePalette() const -{ - for(int y = 0; y < m_Height; y++) - for(int x = 0; x < m_Width; x++) - m_pTiles[y * m_Width + x].m_Index = y * 16 + x; -} - -void CLayerTiles::Render(bool Tileset) -{ - IGraphics::CTextureHandle Texture; - if(m_Image >= 0 && (size_t)m_Image < m_pEditor->m_Map.m_vpImages.size()) - Texture = m_pEditor->m_Map.m_vpImages[m_Image]->m_Texture; - else if(m_Game) - Texture = m_pEditor->GetEntitiesTexture(); - else if(m_Front) - Texture = m_pEditor->GetFrontTexture(); - else if(m_Tele) - Texture = m_pEditor->GetTeleTexture(); - else if(m_Speedup) - Texture = m_pEditor->GetSpeedupTexture(); - else if(m_Switch) - Texture = m_pEditor->GetSwitchTexture(); - else if(m_Tune) - Texture = m_pEditor->GetTuneTexture(); - Graphics()->TextureSet(Texture); - - ColorRGBA ColorEnv = ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f); - CEditor::EnvelopeEval(m_ColorEnvOffset, m_ColorEnv, ColorEnv, 4, m_pEditor); - const ColorRGBA Color = ColorRGBA(m_Color.r / 255.0f, m_Color.g / 255.0f, m_Color.b / 255.0f, m_Color.a / 255.0f).Multiply(ColorEnv); - - Graphics()->BlendNone(); - m_pEditor->RenderTools()->RenderTilemap(m_pTiles, m_Width, m_Height, 32.0f, Color, LAYERRENDERFLAG_OPAQUE); - Graphics()->BlendNormal(); - m_pEditor->RenderTools()->RenderTilemap(m_pTiles, m_Width, m_Height, 32.0f, Color, LAYERRENDERFLAG_TRANSPARENT); - - // Render DDRace Layers - if(!Tileset) - { - if(m_Tele) - m_pEditor->RenderTools()->RenderTeleOverlay(static_cast(this)->m_pTeleTile, m_Width, m_Height, 32.0f); - if(m_Speedup) - m_pEditor->RenderTools()->RenderSpeedupOverlay(static_cast(this)->m_pSpeedupTile, m_Width, m_Height, 32.0f); - if(m_Switch) - m_pEditor->RenderTools()->RenderSwitchOverlay(static_cast(this)->m_pSwitchTile, m_Width, m_Height, 32.0f); - if(m_Tune) - m_pEditor->RenderTools()->RenderTuneOverlay(static_cast(this)->m_pTuneTile, m_Width, m_Height, 32.0f); - } -} - -int CLayerTiles::ConvertX(float x) const { return (int)(x / 32.0f); } -int CLayerTiles::ConvertY(float y) const { return (int)(y / 32.0f); } - -void CLayerTiles::Convert(CUIRect Rect, RECTi *pOut) const -{ - pOut->x = ConvertX(Rect.x); - pOut->y = ConvertY(Rect.y); - pOut->w = ConvertX(Rect.x + Rect.w + 31) - pOut->x; - pOut->h = ConvertY(Rect.y + Rect.h + 31) - pOut->y; -} - -void CLayerTiles::Snap(CUIRect *pRect) const -{ - RECTi Out; - Convert(*pRect, &Out); - pRect->x = Out.x * 32.0f; - pRect->y = Out.y * 32.0f; - pRect->w = Out.w * 32.0f; - pRect->h = Out.h * 32.0f; -} - -void CLayerTiles::Clamp(RECTi *pRect) const -{ - if(pRect->x < 0) - { - pRect->w += pRect->x; - pRect->x = 0; - } - - if(pRect->y < 0) - { - pRect->h += pRect->y; - pRect->y = 0; - } - - if(pRect->x + pRect->w > m_Width) - pRect->w = m_Width - pRect->x; - - if(pRect->y + pRect->h > m_Height) - pRect->h = m_Height - pRect->y; - - if(pRect->h < 0) - pRect->h = 0; - if(pRect->w < 0) - pRect->w = 0; -} - -bool CLayerTiles::IsEntitiesLayer() const -{ - return m_pEditor->m_Map.m_pGameLayer.get() == this || m_pEditor->m_Map.m_pTeleLayer.get() == this || m_pEditor->m_Map.m_pSpeedupLayer.get() == this || m_pEditor->m_Map.m_pFrontLayer.get() == this || m_pEditor->m_Map.m_pSwitchLayer.get() == this || m_pEditor->m_Map.m_pTuneLayer.get() == this; -} - -bool CLayerTiles::IsEmpty(const std::shared_ptr &pLayer) -{ - for(int y = 0; y < pLayer->m_Height; y++) - { - for(int x = 0; x < pLayer->m_Width; x++) - { - int Index = pLayer->GetTile(x, y).m_Index; - if(Index) - { - if(pLayer->m_Game) - { - if(m_pEditor->m_AllowPlaceUnusedTiles || IsValidGameTile(Index)) - return false; - } - else if(pLayer->m_Front) - { - if(m_pEditor->m_AllowPlaceUnusedTiles || IsValidFrontTile(Index)) - return false; - } - else - return false; - } - } - } - - return true; -} - -void CLayerTiles::BrushSelecting(CUIRect Rect) -{ - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.4f); - Snap(&Rect); - IGraphics::CQuadItem QuadItem(Rect.x, Rect.y, Rect.w, Rect.h); - Graphics()->QuadsDrawTL(&QuadItem, 1); - Graphics()->QuadsEnd(); - char aBuf[16]; - str_format(aBuf, sizeof(aBuf), "%d⨯%d", ConvertX(Rect.w), ConvertY(Rect.h)); - TextRender()->Text(Rect.x + 3.0f, Rect.y + 3.0f, m_pEditor->m_ShowPicker ? 15.0f : m_pEditor->MapView()->ScaleLength(15.0f), aBuf, -1.0f); -} - -template -static void InitGrabbedLayer(std::shared_ptr pLayer, CLayerTiles *pThisLayer) -{ - pLayer->m_pEditor = pThisLayer->m_pEditor; - pLayer->m_Image = pThisLayer->m_Image; - pLayer->m_Game = pThisLayer->m_Game; - pLayer->m_Front = pThisLayer->m_Front; - pLayer->m_Tele = pThisLayer->m_Tele; - pLayer->m_Speedup = pThisLayer->m_Speedup; - pLayer->m_Switch = pThisLayer->m_Switch; - pLayer->m_Tune = pThisLayer->m_Tune; - if(pThisLayer->m_pEditor->m_BrushColorEnabled) - { - pLayer->m_Color = pThisLayer->m_Color; - pLayer->m_Color.a = 255; - } -}; - -int CLayerTiles::BrushGrab(std::shared_ptr pBrush, CUIRect Rect) -{ - RECTi r; - Convert(Rect, &r); - Clamp(&r); - - if(!r.w || !r.h) - return 0; - - // create new layers - if(this->m_Tele) - { - std::shared_ptr pGrabbed = std::make_shared(m_pEditor, r.w, r.h); - InitGrabbedLayer(pGrabbed, this); - - pBrush->AddLayer(pGrabbed); - - for(int y = 0; y < r.h; y++) - { - for(int x = 0; x < r.w; x++) - { - // copy the tiles - pGrabbed->m_pTiles[y * pGrabbed->m_Width + x] = GetTile(r.x + x, r.y + y); - - // copy the tele data - if(!m_pEditor->Input()->KeyIsPressed(KEY_SPACE)) - { - pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x] = static_cast(this)->m_pTeleTile[(r.y + y) * m_Width + (r.x + x)]; - unsigned char TgtIndex = pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x].m_Type; - if(IsValidTeleTile(TgtIndex)) - { - if(IsTeleTileNumberUsed(TgtIndex, false)) - m_pEditor->m_TeleNumber = pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x].m_Number; - else if(IsTeleTileNumberUsed(TgtIndex, true)) - m_pEditor->m_TeleCheckpointNumber = pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x].m_Number; - } - } - else - { - CTile Tile = pGrabbed->m_pTiles[y * pGrabbed->m_Width + x]; - if(IsValidTeleTile(Tile.m_Index) && IsTeleTileNumberUsedAny(Tile.m_Index)) - { - pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x].m_Number = IsTeleTileCheckpoint(Tile.m_Index) ? m_pEditor->m_TeleCheckpointNumber : m_pEditor->m_TeleNumber; - } - } - } - } - - pGrabbed->m_TeleNum = m_pEditor->m_TeleNumber; - pGrabbed->m_TeleCheckpointNum = m_pEditor->m_TeleCheckpointNumber; - - str_copy(pGrabbed->m_aFileName, m_pEditor->m_aFileName); - } - else if(this->m_Speedup) - { - std::shared_ptr pGrabbed = std::make_shared(m_pEditor, r.w, r.h); - InitGrabbedLayer(pGrabbed, this); - - pBrush->AddLayer(pGrabbed); - - // copy the tiles - for(int y = 0; y < r.h; y++) - for(int x = 0; x < r.w; x++) - pGrabbed->m_pTiles[y * pGrabbed->m_Width + x] = GetTile(r.x + x, r.y + y); - - // copy the speedup data - if(!m_pEditor->Input()->KeyIsPressed(KEY_SPACE)) - for(int y = 0; y < r.h; y++) - for(int x = 0; x < r.w; x++) - { - pGrabbed->m_pSpeedupTile[y * pGrabbed->m_Width + x] = static_cast(this)->m_pSpeedupTile[(r.y + y) * m_Width + (r.x + x)]; - if(IsValidSpeedupTile(pGrabbed->m_pSpeedupTile[y * pGrabbed->m_Width + x].m_Type)) - { - m_pEditor->m_SpeedupAngle = pGrabbed->m_pSpeedupTile[y * pGrabbed->m_Width + x].m_Angle; - m_pEditor->m_SpeedupForce = pGrabbed->m_pSpeedupTile[y * pGrabbed->m_Width + x].m_Force; - m_pEditor->m_SpeedupMaxSpeed = pGrabbed->m_pSpeedupTile[y * pGrabbed->m_Width + x].m_MaxSpeed; - } - } - pGrabbed->m_SpeedupForce = m_pEditor->m_SpeedupForce; - pGrabbed->m_SpeedupMaxSpeed = m_pEditor->m_SpeedupMaxSpeed; - pGrabbed->m_SpeedupAngle = m_pEditor->m_SpeedupAngle; - str_copy(pGrabbed->m_aFileName, m_pEditor->m_aFileName); - } - else if(this->m_Switch) - { - std::shared_ptr pGrabbed = std::make_shared(m_pEditor, r.w, r.h); - InitGrabbedLayer(pGrabbed, this); - - pBrush->AddLayer(pGrabbed); - - // copy the tiles - for(int y = 0; y < r.h; y++) - for(int x = 0; x < r.w; x++) - pGrabbed->m_pTiles[y * pGrabbed->m_Width + x] = GetTile(r.x + x, r.y + y); - - // copy the switch data - if(!m_pEditor->Input()->KeyIsPressed(KEY_SPACE)) - for(int y = 0; y < r.h; y++) - for(int x = 0; x < r.w; x++) - { - pGrabbed->m_pSwitchTile[y * pGrabbed->m_Width + x] = static_cast(this)->m_pSwitchTile[(r.y + y) * m_Width + (r.x + x)]; - if(IsValidSwitchTile(pGrabbed->m_pSwitchTile[y * pGrabbed->m_Width + x].m_Type)) - { - m_pEditor->m_SwitchNum = pGrabbed->m_pSwitchTile[y * pGrabbed->m_Width + x].m_Number; - m_pEditor->m_SwitchDelay = pGrabbed->m_pSwitchTile[y * pGrabbed->m_Width + x].m_Delay; - } - } - pGrabbed->m_SwitchNumber = m_pEditor->m_SwitchNum; - pGrabbed->m_SwitchDelay = m_pEditor->m_SwitchDelay; - str_copy(pGrabbed->m_aFileName, m_pEditor->m_aFileName); - } - - else if(this->m_Tune) - { - std::shared_ptr pGrabbed = std::make_shared(m_pEditor, r.w, r.h); - InitGrabbedLayer(pGrabbed, this); - - pBrush->AddLayer(pGrabbed); - - // copy the tiles - for(int y = 0; y < r.h; y++) - for(int x = 0; x < r.w; x++) - pGrabbed->m_pTiles[y * pGrabbed->m_Width + x] = GetTile(r.x + x, r.y + y); - - // copy the tiles - if(!m_pEditor->Input()->KeyIsPressed(KEY_SPACE)) - for(int y = 0; y < r.h; y++) - for(int x = 0; x < r.w; x++) - { - pGrabbed->m_pTuneTile[y * pGrabbed->m_Width + x] = static_cast(this)->m_pTuneTile[(r.y + y) * m_Width + (r.x + x)]; - if(IsValidTuneTile(pGrabbed->m_pTuneTile[y * pGrabbed->m_Width + x].m_Type)) - { - m_pEditor->m_TuningNum = pGrabbed->m_pTuneTile[y * pGrabbed->m_Width + x].m_Number; - } - } - pGrabbed->m_TuningNumber = m_pEditor->m_TuningNum; - str_copy(pGrabbed->m_aFileName, m_pEditor->m_aFileName); - } - else if(this->m_Front) - { - std::shared_ptr pGrabbed = std::make_shared(m_pEditor, r.w, r.h); - InitGrabbedLayer(pGrabbed, this); - - pBrush->AddLayer(pGrabbed); - - // copy the tiles - for(int y = 0; y < r.h; y++) - for(int x = 0; x < r.w; x++) - pGrabbed->m_pTiles[y * pGrabbed->m_Width + x] = GetTile(r.x + x, r.y + y); - str_copy(pGrabbed->m_aFileName, m_pEditor->m_aFileName); - } - else - { - std::shared_ptr pGrabbed = std::make_shared(m_pEditor, r.w, r.h); - InitGrabbedLayer(pGrabbed, this); - - pBrush->AddLayer(pGrabbed); - - // copy the tiles - for(int y = 0; y < r.h; y++) - for(int x = 0; x < r.w; x++) - pGrabbed->m_pTiles[y * pGrabbed->m_Width + x] = GetTile(r.x + x, r.y + y); - str_copy(pGrabbed->m_aFileName, m_pEditor->m_aFileName); - } - - return 1; -} - -void CLayerTiles::FillSelection(bool Empty, std::shared_ptr pBrush, CUIRect Rect) -{ - if(m_Readonly || (!Empty && pBrush->m_Type != LAYERTYPE_TILES)) - return; - - Snap(&Rect); - - int sx = ConvertX(Rect.x); - int sy = ConvertY(Rect.y); - int w = ConvertX(Rect.w); - int h = ConvertY(Rect.h); - - std::shared_ptr pLt = std::static_pointer_cast(pBrush); - - bool Destructive = m_pEditor->m_BrushDrawDestructive || Empty || IsEmpty(pLt); - - for(int y = 0; y < h; y++) - { - for(int x = 0; x < w; x++) - { - int fx = x + sx; - int fy = y + sy; - - if(fx < 0 || fx >= m_Width || fy < 0 || fy >= m_Height) - continue; - - bool HasTile = GetTile(fx, fy).m_Index; - if(!Empty && pLt->GetTile(x % pLt->m_Width, y % pLt->m_Height).m_Index == TILE_THROUGH_CUT) - { - if(m_Game && m_pEditor->m_Map.m_pFrontLayer) - { - HasTile = HasTile || m_pEditor->m_Map.m_pFrontLayer->GetTile(fx, fy).m_Index; - } - else if(m_Front) - { - HasTile = HasTile || m_pEditor->m_Map.m_pGameLayer->GetTile(fx, fy).m_Index; - } - } - - if(!Destructive && HasTile) - continue; - - SetTile(fx, fy, Empty ? CTile{TILE_AIR} : pLt->m_pTiles[(y * pLt->m_Width + x % pLt->m_Width) % (pLt->m_Width * pLt->m_Height)]); - } - } - FlagModified(sx, sy, w, h); -} - -void CLayerTiles::BrushDraw(std::shared_ptr pBrush, vec2 WorldPos) -{ - if(m_Readonly) - return; - - // - std::shared_ptr pTileLayer = std::static_pointer_cast(pBrush); - int sx = ConvertX(WorldPos.x); - int sy = ConvertY(WorldPos.y); - - bool Destructive = m_pEditor->m_BrushDrawDestructive || IsEmpty(pTileLayer); - - for(int y = 0; y < pTileLayer->m_Height; y++) - for(int x = 0; x < pTileLayer->m_Width; x++) - { - int fx = x + sx; - int fy = y + sy; - - if(fx < 0 || fx >= m_Width || fy < 0 || fy >= m_Height) - continue; - - bool HasTile = GetTile(fx, fy).m_Index; - if(pTileLayer->GetTile(x, y).m_Index == TILE_THROUGH_CUT) - { - if(m_Game && m_pEditor->m_Map.m_pFrontLayer) - { - HasTile = HasTile || m_pEditor->m_Map.m_pFrontLayer->GetTile(fx, fy).m_Index; - } - else if(m_Front) - { - HasTile = HasTile || m_pEditor->m_Map.m_pGameLayer->GetTile(fx, fy).m_Index; - } - } - - if(!Destructive && HasTile) - continue; - - SetTile(fx, fy, pTileLayer->GetTile(x, y)); - } - - FlagModified(sx, sy, pTileLayer->m_Width, pTileLayer->m_Height); -} - -void CLayerTiles::BrushFlipX() -{ - BrushFlipXImpl(m_pTiles); - - if(m_Tele || m_Speedup || m_Tune) - return; - - bool Rotate = !(m_Game || m_Front || m_Switch) || m_pEditor->m_AllowPlaceUnusedTiles; - for(int y = 0; y < m_Height; y++) - for(int x = 0; x < m_Width; x++) - if(!Rotate && !IsRotatableTile(m_pTiles[y * m_Width + x].m_Index)) - m_pTiles[y * m_Width + x].m_Flags = 0; - else - m_pTiles[y * m_Width + x].m_Flags ^= (m_pTiles[y * m_Width + x].m_Flags & TILEFLAG_ROTATE) ? TILEFLAG_YFLIP : TILEFLAG_XFLIP; -} - -void CLayerTiles::BrushFlipY() -{ - BrushFlipYImpl(m_pTiles); - - if(m_Tele || m_Speedup || m_Tune) - return; - - bool Rotate = !(m_Game || m_Front || m_Switch) || m_pEditor->m_AllowPlaceUnusedTiles; - for(int y = 0; y < m_Height; y++) - for(int x = 0; x < m_Width; x++) - if(!Rotate && !IsRotatableTile(m_pTiles[y * m_Width + x].m_Index)) - m_pTiles[y * m_Width + x].m_Flags = 0; - else - m_pTiles[y * m_Width + x].m_Flags ^= (m_pTiles[y * m_Width + x].m_Flags & TILEFLAG_ROTATE) ? TILEFLAG_XFLIP : TILEFLAG_YFLIP; -} - -void CLayerTiles::BrushRotate(float Amount) -{ - int Rotation = (round_to_int(360.0f * Amount / (pi * 2)) / 90) % 4; // 0=0°, 1=90°, 2=180°, 3=270° - if(Rotation < 0) - Rotation += 4; - - if(Rotation == 1 || Rotation == 3) - { - // 90° rotation - CTile *pTempData = new CTile[m_Width * m_Height]; - mem_copy(pTempData, m_pTiles, (size_t)m_Width * m_Height * sizeof(CTile)); - CTile *pDst = m_pTiles; - bool Rotate = !(m_Game || m_Front) || m_pEditor->m_AllowPlaceUnusedTiles; - for(int x = 0; x < m_Width; ++x) - for(int y = m_Height - 1; y >= 0; --y, ++pDst) - { - *pDst = pTempData[y * m_Width + x]; - if(!Rotate && !IsRotatableTile(pDst->m_Index)) - pDst->m_Flags = 0; - else - { - if(pDst->m_Flags & TILEFLAG_ROTATE) - pDst->m_Flags ^= (TILEFLAG_YFLIP | TILEFLAG_XFLIP); - pDst->m_Flags ^= TILEFLAG_ROTATE; - } - } - - std::swap(m_Width, m_Height); - delete[] pTempData; - } - - if(Rotation == 2 || Rotation == 3) - { - BrushFlipX(); - BrushFlipY(); - } -} - -std::shared_ptr CLayerTiles::Duplicate() const -{ - return std::make_shared(*this); -} - -const char *CLayerTiles::TypeName() const -{ - return "tiles"; -} - -void CLayerTiles::Resize(int NewW, int NewH) -{ - CTile *pNewData = new CTile[NewW * NewH]; - mem_zero(pNewData, (size_t)NewW * NewH * sizeof(CTile)); - - // copy old data - for(int y = 0; y < minimum(NewH, m_Height); y++) - mem_copy(&pNewData[y * NewW], &m_pTiles[y * m_Width], minimum(m_Width, NewW) * sizeof(CTile)); - - // replace old - delete[] m_pTiles; - m_pTiles = pNewData; - m_Width = NewW; - m_Height = NewH; - - // resize tele layer if available - if(m_Game && m_pEditor->m_Map.m_pTeleLayer && (m_pEditor->m_Map.m_pTeleLayer->m_Width != NewW || m_pEditor->m_Map.m_pTeleLayer->m_Height != NewH)) - m_pEditor->m_Map.m_pTeleLayer->Resize(NewW, NewH); - - // resize speedup layer if available - if(m_Game && m_pEditor->m_Map.m_pSpeedupLayer && (m_pEditor->m_Map.m_pSpeedupLayer->m_Width != NewW || m_pEditor->m_Map.m_pSpeedupLayer->m_Height != NewH)) - m_pEditor->m_Map.m_pSpeedupLayer->Resize(NewW, NewH); - - // resize front layer - if(m_Game && m_pEditor->m_Map.m_pFrontLayer && (m_pEditor->m_Map.m_pFrontLayer->m_Width != NewW || m_pEditor->m_Map.m_pFrontLayer->m_Height != NewH)) - m_pEditor->m_Map.m_pFrontLayer->Resize(NewW, NewH); - - // resize switch layer if available - if(m_Game && m_pEditor->m_Map.m_pSwitchLayer && (m_pEditor->m_Map.m_pSwitchLayer->m_Width != NewW || m_pEditor->m_Map.m_pSwitchLayer->m_Height != NewH)) - m_pEditor->m_Map.m_pSwitchLayer->Resize(NewW, NewH); - - // resize tune layer if available - if(m_Game && m_pEditor->m_Map.m_pTuneLayer && (m_pEditor->m_Map.m_pTuneLayer->m_Width != NewW || m_pEditor->m_Map.m_pTuneLayer->m_Height != NewH)) - m_pEditor->m_Map.m_pTuneLayer->Resize(NewW, NewH); -} - -void CLayerTiles::Shift(int Direction) -{ - ShiftImpl(m_pTiles, Direction, m_pEditor->m_ShiftBy); -} - -void CLayerTiles::ShowInfo() -{ - float ScreenX0, ScreenY0, ScreenX1, ScreenY1; - Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); - Graphics()->TextureSet(m_pEditor->Client()->GetDebugFont()); - Graphics()->QuadsBegin(); - - int StartY = maximum(0, (int)(ScreenY0 / 32.0f) - 1); - int StartX = maximum(0, (int)(ScreenX0 / 32.0f) - 1); - int EndY = minimum((int)(ScreenY1 / 32.0f) + 1, m_Height); - int EndX = minimum((int)(ScreenX1 / 32.0f) + 1, m_Width); - - for(int y = StartY; y < EndY; y++) - for(int x = StartX; x < EndX; x++) - { - int c = x + y * m_Width; - if(m_pTiles[c].m_Index) - { - char aBuf[4]; - if(m_pEditor->m_ShowTileInfo == CEditor::SHOW_TILE_HEXADECIMAL) - { - str_hex(aBuf, sizeof(aBuf), &m_pTiles[c].m_Index, 1); - aBuf[2] = '\0'; // would otherwise be a space - } - else - { - str_format(aBuf, sizeof(aBuf), "%d", m_pTiles[c].m_Index); - } - m_pEditor->Graphics()->QuadsText(x * 32, y * 32, 16.0f, aBuf); - - char aFlags[4] = {m_pTiles[c].m_Flags & TILEFLAG_XFLIP ? 'X' : ' ', - m_pTiles[c].m_Flags & TILEFLAG_YFLIP ? 'Y' : ' ', - m_pTiles[c].m_Flags & TILEFLAG_ROTATE ? 'R' : ' ', - 0}; - m_pEditor->Graphics()->QuadsText(x * 32, y * 32 + 16, 16.0f, aFlags); - } - x += m_pTiles[c].m_Skip; - } - - Graphics()->QuadsEnd(); - Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); -} - -void CLayerTiles::FillGameTiles(EGameTileOp Fill) -{ - if(!CanFillGameTiles()) - return; - - std::shared_ptr pGroup = m_pEditor->m_Map.m_vpGroups[m_pEditor->m_SelectedGroup]; - - int Result = (int)Fill; - switch(Fill) - { - case EGameTileOp::HOOKTHROUGH: - Result = TILE_THROUGH_CUT; - break; - case EGameTileOp::FREEZE: - Result = TILE_FREEZE; - break; - case EGameTileOp::UNFREEZE: - Result = TILE_UNFREEZE; - break; - case EGameTileOp::DEEP_FREEZE: - Result = TILE_DFREEZE; - break; - case EGameTileOp::DEEP_UNFREEZE: - Result = TILE_DUNFREEZE; - break; - case EGameTileOp::BLUE_CHECK_TELE: - Result = TILE_TELECHECKIN; - break; - case EGameTileOp::RED_CHECK_TELE: - Result = TILE_TELECHECKINEVIL; - break; - case EGameTileOp::LIVE_FREEZE: - Result = TILE_LFREEZE; - break; - case EGameTileOp::LIVE_UNFREEZE: - Result = TILE_LUNFREEZE; - break; - default: - break; - } - if(Result > -1) - { - const int OffsetX = -pGroup->m_OffsetX / 32; - const int OffsetY = -pGroup->m_OffsetY / 32; - - std::vector> vpActions; - std::shared_ptr pGLayer = m_pEditor->m_Map.m_pGameLayer; - int GameLayerIndex = std::find(m_pEditor->m_Map.m_pGameGroup->m_vpLayers.begin(), m_pEditor->m_Map.m_pGameGroup->m_vpLayers.end(), pGLayer) - m_pEditor->m_Map.m_pGameGroup->m_vpLayers.begin(); - - if(Result != TILE_TELECHECKIN && Result != TILE_TELECHECKINEVIL) - { - if(pGLayer->m_Width < m_Width + OffsetX || pGLayer->m_Height < m_Height + OffsetY) - { - std::map> savedLayers; - savedLayers[LAYERTYPE_TILES] = pGLayer->Duplicate(); - savedLayers[LAYERTYPE_GAME] = savedLayers[LAYERTYPE_TILES]; - - int PrevW = pGLayer->m_Width; - int PrevH = pGLayer->m_Height; - const int NewW = pGLayer->m_Width < m_Width + OffsetX ? m_Width + OffsetX : pGLayer->m_Width; - const int NewH = pGLayer->m_Height < m_Height + OffsetY ? m_Height + OffsetY : pGLayer->m_Height; - pGLayer->Resize(NewW, NewH); - vpActions.push_back(std::make_shared(m_pEditor, m_pEditor->m_SelectedGroup, GameLayerIndex, ETilesProp::PROP_WIDTH, PrevW, NewW)); - const std::shared_ptr &Action1 = std::static_pointer_cast(vpActions[vpActions.size() - 1]); - vpActions.push_back(std::make_shared(m_pEditor, m_pEditor->m_SelectedGroup, GameLayerIndex, ETilesProp::PROP_HEIGHT, PrevH, NewH)); - const std::shared_ptr &Action2 = std::static_pointer_cast(vpActions[vpActions.size() - 1]); - - Action1->SetSavedLayers(savedLayers); - Action2->SetSavedLayers(savedLayers); - } - - int Changes = 0; - for(int y = OffsetY < 0 ? -OffsetY : 0; y < m_Height; y++) - { - for(int x = OffsetX < 0 ? -OffsetX : 0; x < m_Width; x++) - { - if(GetTile(x, y).m_Index) - { - const CTile ResultTile = {(unsigned char)Result}; - pGLayer->SetTile(x + OffsetX, y + OffsetY, ResultTile); - Changes++; - } - } - } - - vpActions.push_back(std::make_shared(m_pEditor, m_pEditor->m_SelectedGroup)); - char aDisplay[256]; - str_format(aDisplay, sizeof(aDisplay), "Construct '%s' game tiles (x%d)", g_apGametileOpNames[(int)Fill], Changes); - m_pEditor->m_EditorHistory.RecordAction(std::make_shared(m_pEditor, vpActions, aDisplay, true)); - } - else - { - if(!m_pEditor->m_Map.m_pTeleLayer) - { - std::shared_ptr pLayer = std::make_shared(m_pEditor, m_Width, m_Height); - m_pEditor->m_Map.MakeTeleLayer(pLayer); - m_pEditor->m_Map.m_pGameGroup->AddLayer(pLayer); - - vpActions.push_back(std::make_shared(m_pEditor, m_pEditor->m_SelectedGroup, m_pEditor->m_Map.m_pGameGroup->m_vpLayers.size() - 1)); - - if(m_Width != pGLayer->m_Width || m_Height > pGLayer->m_Height) - { - std::map> savedLayers; - savedLayers[LAYERTYPE_TILES] = pGLayer->Duplicate(); - savedLayers[LAYERTYPE_GAME] = savedLayers[LAYERTYPE_TILES]; - - int NewW = pGLayer->m_Width; - int NewH = pGLayer->m_Height; - if(m_Width > pGLayer->m_Width) - { - NewW = m_Width; - } - if(m_Height > pGLayer->m_Height) - { - NewH = m_Height; - } - - int PrevW = pGLayer->m_Width; - int PrevH = pGLayer->m_Height; - pLayer->Resize(NewW, NewH); - vpActions.push_back(std::make_shared(m_pEditor, m_pEditor->m_SelectedGroup, GameLayerIndex, ETilesProp::PROP_WIDTH, PrevW, NewW)); - const std::shared_ptr &Action1 = std::static_pointer_cast(vpActions[vpActions.size() - 1]); - vpActions.push_back(std::make_shared(m_pEditor, m_pEditor->m_SelectedGroup, GameLayerIndex, ETilesProp::PROP_HEIGHT, PrevH, NewH)); - const std::shared_ptr &Action2 = std::static_pointer_cast(vpActions[vpActions.size() - 1]); - - Action1->SetSavedLayers(savedLayers); - Action2->SetSavedLayers(savedLayers); - } - } - - std::shared_ptr pTLayer = m_pEditor->m_Map.m_pTeleLayer; - int TeleLayerIndex = std::find(m_pEditor->m_Map.m_pGameGroup->m_vpLayers.begin(), m_pEditor->m_Map.m_pGameGroup->m_vpLayers.end(), pTLayer) - m_pEditor->m_Map.m_pGameGroup->m_vpLayers.begin(); - - if(pTLayer->m_Width < m_Width + OffsetX || pTLayer->m_Height < m_Height + OffsetY) - { - std::map> savedLayers; - savedLayers[LAYERTYPE_TILES] = pTLayer->Duplicate(); - savedLayers[LAYERTYPE_TELE] = savedLayers[LAYERTYPE_TILES]; - - int PrevW = pTLayer->m_Width; - int PrevH = pTLayer->m_Height; - int NewW = pTLayer->m_Width < m_Width + OffsetX ? m_Width + OffsetX : pTLayer->m_Width; - int NewH = pTLayer->m_Height < m_Height + OffsetY ? m_Height + OffsetY : pTLayer->m_Height; - pTLayer->Resize(NewW, NewH); - std::shared_ptr Action1, Action2; - vpActions.push_back(Action1 = std::make_shared(m_pEditor, m_pEditor->m_SelectedGroup, TeleLayerIndex, ETilesProp::PROP_WIDTH, PrevW, NewW)); - vpActions.push_back(Action2 = std::make_shared(m_pEditor, m_pEditor->m_SelectedGroup, TeleLayerIndex, ETilesProp::PROP_HEIGHT, PrevH, NewH)); - - Action1->SetSavedLayers(savedLayers); - Action2->SetSavedLayers(savedLayers); - } - - int Changes = 0; - for(int y = OffsetY < 0 ? -OffsetY : 0; y < m_Height; y++) - { - for(int x = OffsetX < 0 ? -OffsetX : 0; x < m_Width; x++) - { - if(GetTile(x, y).m_Index) - { - auto TileIndex = (y + OffsetY) * pTLayer->m_Width + x + OffsetX; - Changes++; - - STeleTileStateChange::SData Previous{ - pTLayer->m_pTeleTile[TileIndex].m_Number, - pTLayer->m_pTeleTile[TileIndex].m_Type, - pTLayer->m_pTiles[TileIndex].m_Index}; - - pTLayer->m_pTiles[TileIndex].m_Index = TILE_AIR + Result; - pTLayer->m_pTeleTile[TileIndex].m_Number = 1; - pTLayer->m_pTeleTile[TileIndex].m_Type = TILE_AIR + Result; - - STeleTileStateChange::SData Current{ - pTLayer->m_pTeleTile[TileIndex].m_Number, - pTLayer->m_pTeleTile[TileIndex].m_Type, - pTLayer->m_pTiles[TileIndex].m_Index}; - - pTLayer->RecordStateChange(x, y, Previous, Current); - } - } - } - - vpActions.push_back(std::make_shared(m_pEditor, m_pEditor->m_SelectedGroup)); - char aDisplay[256]; - str_format(aDisplay, sizeof(aDisplay), "Construct 'tele' game tiles (x%d)", Changes); - m_pEditor->m_EditorHistory.RecordAction(std::make_shared(m_pEditor, vpActions, aDisplay, true)); - } - } -} - -bool CLayerTiles::CanFillGameTiles() const -{ - const bool EntitiesLayer = IsEntitiesLayer(); - if(EntitiesLayer) - return false; - - std::shared_ptr pGroup = m_pEditor->m_Map.m_vpGroups[m_pEditor->m_SelectedGroup]; - - // Game tiles can only be constructed if the layer is relative to the game layer - return !(pGroup->m_OffsetX % 32) && !(pGroup->m_OffsetY % 32) && pGroup->m_ParallaxX == 100 && pGroup->m_ParallaxY == 100; -} - -CUi::EPopupMenuFunctionResult CLayerTiles::RenderProperties(CUIRect *pToolBox) -{ - CUIRect Button; - - const bool EntitiesLayer = IsEntitiesLayer(); - - if(CanFillGameTiles()) - { - pToolBox->HSplitBottom(12.0f, pToolBox, &Button); - static int s_GameTilesButton = 0; - if(m_pEditor->DoButton_Editor(&s_GameTilesButton, "Game tiles", 0, &Button, 0, "Constructs game tiles from this layer")) - m_pEditor->PopupSelectGametileOpInvoke(m_pEditor->Ui()->MouseX(), m_pEditor->Ui()->MouseY()); - const int Selected = m_pEditor->PopupSelectGameTileOpResult(); - FillGameTiles((EGameTileOp)Selected); - } - - if(m_pEditor->m_Map.m_pGameLayer.get() != this) - { - if(m_Image >= 0 && (size_t)m_Image < m_pEditor->m_Map.m_vpImages.size() && m_pEditor->m_Map.m_vpImages[m_Image]->m_AutoMapper.IsLoaded() && m_AutoMapperConfig != -1) - { - pToolBox->HSplitBottom(2.0f, pToolBox, nullptr); - pToolBox->HSplitBottom(12.0f, pToolBox, &Button); - if(m_Seed != 0) - { - CUIRect ButtonAuto; - Button.VSplitRight(16.0f, &Button, &ButtonAuto); - Button.VSplitRight(2.0f, &Button, nullptr); - static int s_AutoMapperButtonAuto = 0; - if(m_pEditor->DoButton_Editor(&s_AutoMapperButtonAuto, "A", m_AutoAutoMap, &ButtonAuto, 0, "Automatically run automap after modifications.")) - { - m_AutoAutoMap = !m_AutoAutoMap; - FlagModified(0, 0, m_Width, m_Height); - if(!m_TilesHistory.empty()) // Sometimes pressing that button causes the automap to run so we should be able to undo that - { - // record undo - m_pEditor->m_EditorHistory.RecordAction(std::make_shared(m_pEditor, m_pEditor->m_SelectedGroup, m_pEditor->m_vSelectedLayers[0], "Auto map", m_TilesHistory)); - ClearHistory(); - } - } - } - - static int s_AutoMapperButton = 0; - if(m_pEditor->DoButton_Editor(&s_AutoMapperButton, "Automap", 0, &Button, 0, "Run the automapper")) - { - m_pEditor->m_Map.m_vpImages[m_Image]->m_AutoMapper.Proceed(this, m_AutoMapperConfig, m_Seed); - // record undo - m_pEditor->m_EditorHistory.RecordAction(std::make_shared(m_pEditor, m_pEditor->m_SelectedGroup, m_pEditor->m_vSelectedLayers[0], "Auto map", m_TilesHistory)); - ClearHistory(); - return CUi::POPUP_CLOSE_CURRENT; - } - } - } - - int Color = PackColor(m_Color); - - CProperty aProps[] = { - {"Width", m_Width, PROPTYPE_INT, 1, 100000}, - {"Height", m_Height, PROPTYPE_INT, 1, 100000}, - {"Shift", 0, PROPTYPE_SHIFT, 0, 0}, - {"Shift by", m_pEditor->m_ShiftBy, PROPTYPE_INT, 1, 100000}, - {"Image", m_Image, PROPTYPE_IMAGE, 0, 0}, - {"Color", Color, PROPTYPE_COLOR, 0, 0}, - {"Color Env", m_ColorEnv + 1, PROPTYPE_ENVELOPE, 0, 0}, - {"Color TO", m_ColorEnvOffset, PROPTYPE_INT, -1000000, 1000000}, - {"Auto Rule", m_AutoMapperConfig, PROPTYPE_AUTOMAPPER, m_Image, 0}, - {"Seed", m_Seed, PROPTYPE_INT, 0, 1000000000}, - {nullptr}, - }; - - if(EntitiesLayer) // remove the image and color properties if this is a game layer - { - aProps[(int)ETilesProp::PROP_IMAGE].m_pName = nullptr; - aProps[(int)ETilesProp::PROP_COLOR].m_pName = nullptr; - aProps[(int)ETilesProp::PROP_AUTOMAPPER].m_pName = nullptr; - } - if(m_Image == -1) - { - aProps[(int)ETilesProp::PROP_AUTOMAPPER].m_pName = nullptr; - aProps[(int)ETilesProp::PROP_SEED].m_pName = nullptr; - } - - static int s_aIds[(int)ETilesProp::NUM_PROPS] = {0}; - int NewVal = 0; - auto [State, Prop] = m_pEditor->DoPropertiesWithState(pToolBox, aProps, s_aIds, &NewVal); - - static CLayerTilesPropTracker s_Tracker(m_pEditor); - s_Tracker.Begin(this, Prop, State); - m_pEditor->m_EditorHistory.BeginBulk(); - - if(Prop == ETilesProp::PROP_WIDTH && NewVal > 1) - { - if(NewVal > 1000 && !m_pEditor->m_LargeLayerWasWarned) - { - m_pEditor->m_PopupEventType = CEditor::POPEVENT_LARGELAYER; - m_pEditor->m_PopupEventActivated = true; - m_pEditor->m_LargeLayerWasWarned = true; - } - Resize(NewVal, m_Height); - } - else if(Prop == ETilesProp::PROP_HEIGHT && NewVal > 1) - { - if(NewVal > 1000 && !m_pEditor->m_LargeLayerWasWarned) - { - m_pEditor->m_PopupEventType = CEditor::POPEVENT_LARGELAYER; - m_pEditor->m_PopupEventActivated = true; - m_pEditor->m_LargeLayerWasWarned = true; - } - Resize(m_Width, NewVal); - } - else if(Prop == ETilesProp::PROP_SHIFT) - { - Shift(NewVal); - } - else if(Prop == ETilesProp::PROP_SHIFT_BY) - { - m_pEditor->m_ShiftBy = NewVal; - } - else if(Prop == ETilesProp::PROP_IMAGE) - { - m_Image = NewVal; - if(NewVal == -1) - { - m_Image = -1; - } - else - { - m_Image = NewVal % m_pEditor->m_Map.m_vpImages.size(); - m_AutoMapperConfig = -1; - - if(m_pEditor->m_Map.m_vpImages[m_Image]->m_Width % 16 != 0 || m_pEditor->m_Map.m_vpImages[m_Image]->m_Height % 16 != 0) - { - m_pEditor->m_PopupEventType = CEditor::POPEVENT_IMAGEDIV16; - m_pEditor->m_PopupEventActivated = true; - m_Image = -1; - } - } - } - else if(Prop == ETilesProp::PROP_COLOR) - { - m_Color.r = (NewVal >> 24) & 0xff; - m_Color.g = (NewVal >> 16) & 0xff; - m_Color.b = (NewVal >> 8) & 0xff; - m_Color.a = NewVal & 0xff; - } - else if(Prop == ETilesProp::PROP_COLOR_ENV) - { - int Index = clamp(NewVal - 1, -1, (int)m_pEditor->m_Map.m_vpEnvelopes.size() - 1); - const int Step = (Index - m_ColorEnv) % 2; - if(Step != 0) - { - for(; Index >= -1 && Index < (int)m_pEditor->m_Map.m_vpEnvelopes.size(); Index += Step) - { - if(Index == -1 || m_pEditor->m_Map.m_vpEnvelopes[Index]->GetChannels() == 4) - { - m_ColorEnv = Index; - break; - } - } - } - } - else if(Prop == ETilesProp::PROP_COLOR_ENV_OFFSET) - { - m_ColorEnvOffset = NewVal; - } - else if(Prop == ETilesProp::PROP_SEED) - { - m_Seed = NewVal; - } - else if(Prop == ETilesProp::PROP_AUTOMAPPER) - { - if(m_Image >= 0 && m_pEditor->m_Map.m_vpImages[m_Image]->m_AutoMapper.ConfigNamesNum() > 0 && NewVal >= 0) - m_AutoMapperConfig = NewVal % m_pEditor->m_Map.m_vpImages[m_Image]->m_AutoMapper.ConfigNamesNum(); - else - m_AutoMapperConfig = -1; - } - - s_Tracker.End(Prop, State); - - // Check if modified property could have an effect on automapper - if((State == EEditState::END || State == EEditState::ONE_GO) && HasAutomapEffect(Prop)) - { - FlagModified(0, 0, m_Width, m_Height); - - // Record undo if automapper was ran - if(m_AutoAutoMap && !m_TilesHistory.empty()) - { - m_pEditor->m_EditorHistory.RecordAction(std::make_shared(m_pEditor, m_pEditor->m_SelectedGroup, m_pEditor->m_vSelectedLayers[0], "Auto map", m_TilesHistory)); - ClearHistory(); - } - } - - // End undo bulk, taking the first action display as the displayed text in the history - // This is usually the resulting text of the edit layer tiles prop action - // Since we may also squeeze a tile changes action, we want both to appear as one, thus using a bulk - m_pEditor->m_EditorHistory.EndBulk(0); - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CLayerTiles::RenderCommonProperties(SCommonPropState &State, CEditor *pEditor, CUIRect *pToolbox, std::vector> &vpLayers, std::vector &vLayerIndices) -{ - if(State.m_Modified) - { - CUIRect Commit; - pToolbox->HSplitBottom(20.0f, pToolbox, &Commit); - static int s_CommitButton = 0; - if(pEditor->DoButton_Editor(&s_CommitButton, "Commit", 0, &Commit, 0, "Applies the changes")) - { - bool HasModifiedSize = (State.m_Modified & SCommonPropState::MODIFIED_SIZE) != 0; - bool HasModifiedColor = (State.m_Modified & SCommonPropState::MODIFIED_COLOR) != 0; - - std::vector> vpActions; - int j = 0; - int GroupIndex = pEditor->m_SelectedGroup; - for(auto &pLayer : vpLayers) - { - int LayerIndex = vLayerIndices[j++]; - if(HasModifiedSize) - { - std::map> SavedLayers; - SavedLayers[LAYERTYPE_TILES] = pLayer->Duplicate(); - if(pLayer->m_Game || pLayer->m_Front || pLayer->m_Switch || pLayer->m_Speedup || pLayer->m_Tune || pLayer->m_Tele) - { // Need to save all entities layers when any entity layer - if(pEditor->m_Map.m_pFrontLayer && !pLayer->m_Front) - SavedLayers[LAYERTYPE_FRONT] = pEditor->m_Map.m_pFrontLayer->Duplicate(); - if(pEditor->m_Map.m_pTeleLayer && !pLayer->m_Tele) - SavedLayers[LAYERTYPE_TELE] = pEditor->m_Map.m_pTeleLayer->Duplicate(); - if(pEditor->m_Map.m_pSwitchLayer && !pLayer->m_Switch) - SavedLayers[LAYERTYPE_SWITCH] = pEditor->m_Map.m_pSwitchLayer->Duplicate(); - if(pEditor->m_Map.m_pSpeedupLayer && !pLayer->m_Speedup) - SavedLayers[LAYERTYPE_SPEEDUP] = pEditor->m_Map.m_pSpeedupLayer->Duplicate(); - if(pEditor->m_Map.m_pTuneLayer && !pLayer->m_Tune) - SavedLayers[LAYERTYPE_TUNE] = pEditor->m_Map.m_pTuneLayer->Duplicate(); - if(!pLayer->m_Game) - SavedLayers[LAYERTYPE_GAME] = pEditor->m_Map.m_pGameLayer->Duplicate(); - } - - int PrevW = pLayer->m_Width; - int PrevH = pLayer->m_Height; - pLayer->Resize(State.m_Width, State.m_Height); - - if(PrevW != State.m_Width) - { - std::shared_ptr pAction; - vpActions.push_back(pAction = std::make_shared(pEditor, GroupIndex, LayerIndex, ETilesProp::PROP_WIDTH, PrevW, State.m_Width)); - pAction->SetSavedLayers(SavedLayers); - } - - if(PrevH != State.m_Height) - { - std::shared_ptr pAction; - vpActions.push_back(pAction = std::make_shared(pEditor, GroupIndex, LayerIndex, ETilesProp::PROP_HEIGHT, PrevH, State.m_Height)); - pAction->SetSavedLayers(SavedLayers); - } - } - - if(HasModifiedColor && !pLayer->IsEntitiesLayer()) - { - int Color = 0; - Color |= pLayer->m_Color.r << 24; - Color |= pLayer->m_Color.g << 16; - Color |= pLayer->m_Color.b << 8; - Color |= pLayer->m_Color.a; - - pLayer->m_Color.r = (State.m_Color >> 24) & 0xff; - pLayer->m_Color.g = (State.m_Color >> 16) & 0xff; - pLayer->m_Color.b = (State.m_Color >> 8) & 0xff; - pLayer->m_Color.a = State.m_Color & 0xff; - - vpActions.push_back(std::make_shared(pEditor, GroupIndex, LayerIndex, ETilesProp::PROP_COLOR, Color, State.m_Color)); - } - - pLayer->FlagModified(0, 0, pLayer->m_Width, pLayer->m_Height); - } - State.m_Modified = 0; - - char aDisplay[256]; - str_format(aDisplay, sizeof(aDisplay), "Edit %d layers common properties: %s", (int)vpLayers.size(), HasModifiedColor && HasModifiedSize ? "color, size" : (HasModifiedColor ? "color" : "size")); - pEditor->m_EditorHistory.RecordAction(std::make_shared(pEditor, vpActions, aDisplay)); - } - } - else - { - for(auto &pLayer : vpLayers) - { - if(pLayer->m_Width > State.m_Width) - State.m_Width = pLayer->m_Width; - if(pLayer->m_Height > State.m_Height) - State.m_Height = pLayer->m_Height; - } - } - - { - CUIRect Warning; - pToolbox->HSplitTop(13.0f, &Warning, pToolbox); - Warning.HMargin(0.5f, &Warning); - - pEditor->TextRender()->TextColor(ColorRGBA(1.0f, 0.0f, 0.0f, 1.0f)); - SLabelProperties Props; - Props.m_MaxWidth = Warning.w; - pEditor->Ui()->DoLabel(&Warning, "Editing multiple layers", 9.0f, TEXTALIGN_ML, Props); - pEditor->TextRender()->TextColor(ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f)); - pToolbox->HSplitTop(2.0f, nullptr, pToolbox); - } - - CProperty aProps[] = { - {"Width", State.m_Width, PROPTYPE_INT, 1, 100000}, - {"Height", State.m_Height, PROPTYPE_INT, 1, 100000}, - {"Shift", 0, PROPTYPE_SHIFT, 0, 0}, - {"Shift by", pEditor->m_ShiftBy, PROPTYPE_INT, 1, 100000}, - {"Color", State.m_Color, PROPTYPE_COLOR, 0, 0}, - {nullptr}, - }; - - static int s_aIds[(int)ETilesCommonProp::NUM_PROPS] = {0}; - int NewVal = 0; - auto [PropState, Prop] = pEditor->DoPropertiesWithState(pToolbox, aProps, s_aIds, &NewVal); - - static CLayerTilesCommonPropTracker s_Tracker(pEditor); - s_Tracker.m_vpLayers = vpLayers; - s_Tracker.m_vLayerIndices = vLayerIndices; - - s_Tracker.Begin(nullptr, Prop, PropState); - - if(Prop == ETilesCommonProp::PROP_WIDTH && NewVal > 1) - { - if(NewVal > 1000 && !pEditor->m_LargeLayerWasWarned) - { - pEditor->m_PopupEventType = CEditor::POPEVENT_LARGELAYER; - pEditor->m_PopupEventActivated = true; - pEditor->m_LargeLayerWasWarned = true; - } - State.m_Width = NewVal; - } - else if(Prop == ETilesCommonProp::PROP_HEIGHT && NewVal > 1) - { - if(NewVal > 1000 && !pEditor->m_LargeLayerWasWarned) - { - pEditor->m_PopupEventType = CEditor::POPEVENT_LARGELAYER; - pEditor->m_PopupEventActivated = true; - pEditor->m_LargeLayerWasWarned = true; - } - State.m_Height = NewVal; - } - else if(Prop == ETilesCommonProp::PROP_SHIFT) - { - for(auto &pLayer : vpLayers) - pLayer->Shift(NewVal); - } - else if(Prop == ETilesCommonProp::PROP_SHIFT_BY) - { - pEditor->m_ShiftBy = NewVal; - } - else if(Prop == ETilesCommonProp::PROP_COLOR) - { - State.m_Color = NewVal; - } - - s_Tracker.End(Prop, PropState); - - if(PropState == EEditState::END || PropState == EEditState::ONE_GO) - { - if(Prop == ETilesCommonProp::PROP_WIDTH || Prop == ETilesCommonProp::PROP_HEIGHT) - { - State.m_Modified |= SCommonPropState::MODIFIED_SIZE; - } - else if(Prop == ETilesCommonProp::PROP_COLOR) - { - State.m_Modified |= SCommonPropState::MODIFIED_COLOR; - } - } - - return CUi::POPUP_KEEP_OPEN; -} - -void CLayerTiles::FlagModified(int x, int y, int w, int h) -{ - m_pEditor->m_Map.OnModify(); - if(m_Seed != 0 && m_AutoMapperConfig != -1 && m_AutoAutoMap && m_Image >= 0) - { - m_pEditor->m_Map.m_vpImages[m_Image]->m_AutoMapper.ProceedLocalized(this, m_AutoMapperConfig, m_Seed, x, y, w, h); - } -} - -void CLayerTiles::ModifyImageIndex(FIndexModifyFunction Func) -{ - Func(&m_Image); -} - -void CLayerTiles::ModifyEnvelopeIndex(FIndexModifyFunction Func) -{ - Func(&m_ColorEnv); -} - -void CLayerTiles::ShowPreventUnusedTilesWarning() -{ - if(!m_pEditor->m_PreventUnusedTilesWasWarned) - { - m_pEditor->m_PopupEventType = CEditor::POPEVENT_PREVENTUNUSEDTILES; - m_pEditor->m_PopupEventActivated = true; - m_pEditor->m_PreventUnusedTilesWasWarned = true; - } -} - -bool CLayerTiles::HasAutomapEffect(ETilesProp Prop) -{ - switch(Prop) - { - case ETilesProp::PROP_WIDTH: - case ETilesProp::PROP_HEIGHT: - case ETilesProp::PROP_SHIFT: - case ETilesProp::PROP_IMAGE: - case ETilesProp::PROP_AUTOMAPPER: - case ETilesProp::PROP_SEED: - return true; - default: - return false; - } - return false; -} diff --git a/src/game/editor/mapitems/layer_tiles.h b/src/game/editor/mapitems/layer_tiles.h deleted file mode 100644 index b6ca148d7e..0000000000 --- a/src/game/editor/mapitems/layer_tiles.h +++ /dev/null @@ -1,201 +0,0 @@ -#ifndef GAME_EDITOR_MAPITEMS_LAYER_TILES_H -#define GAME_EDITOR_MAPITEMS_LAYER_TILES_H - -#include -#include -#include - -#include "layer.h" - -struct STileStateChange -{ - bool m_Changed; - CTile m_Previous; - CTile m_Current; -}; - -template -using EditorTileStateChangeHistory = std::map>; - -enum -{ - DIRECTION_LEFT = 0, - DIRECTION_RIGHT, - DIRECTION_UP, - DIRECTION_DOWN, -}; - -struct RECTi -{ - int x, y; - int w, h; -}; - -class CLayerTiles : public CLayer -{ -protected: - template - void ShiftImpl(T *pTiles, int Direction, int ShiftBy) - { - switch(Direction) - { - case DIRECTION_LEFT: - ShiftBy = minimum(ShiftBy, m_Width); - for(int y = 0; y < m_Height; ++y) - { - if(ShiftBy < m_Width) - mem_move(&pTiles[y * m_Width], &pTiles[y * m_Width + ShiftBy], (m_Width - ShiftBy) * sizeof(T)); - mem_zero(&pTiles[y * m_Width + (m_Width - ShiftBy)], ShiftBy * sizeof(T)); - } - break; - case DIRECTION_RIGHT: - ShiftBy = minimum(ShiftBy, m_Width); - for(int y = 0; y < m_Height; ++y) - { - if(ShiftBy < m_Width) - mem_move(&pTiles[y * m_Width + ShiftBy], &pTiles[y * m_Width], (m_Width - ShiftBy) * sizeof(T)); - mem_zero(&pTiles[y * m_Width], ShiftBy * sizeof(T)); - } - break; - case DIRECTION_UP: - ShiftBy = minimum(ShiftBy, m_Height); - for(int y = ShiftBy; y < m_Height; ++y) - { - mem_copy(&pTiles[(y - ShiftBy) * m_Width], &pTiles[y * m_Width], m_Width * sizeof(T)); - } - for(int y = m_Height - ShiftBy; y < m_Height; ++y) - { - mem_zero(&pTiles[y * m_Width], m_Width * sizeof(T)); - } - break; - case DIRECTION_DOWN: - ShiftBy = minimum(ShiftBy, m_Height); - for(int y = m_Height - ShiftBy - 1; y >= 0; --y) - { - mem_copy(&pTiles[(y + ShiftBy) * m_Width], &pTiles[y * m_Width], m_Width * sizeof(T)); - } - for(int y = 0; y < ShiftBy; ++y) - { - mem_zero(&pTiles[y * m_Width], m_Width * sizeof(T)); - } - break; - } - } - template - void BrushFlipXImpl(T *pTiles) - { - for(int y = 0; y < m_Height; y++) - for(int x = 0; x < m_Width / 2; x++) - std::swap(pTiles[y * m_Width + x], pTiles[(y + 1) * m_Width - 1 - x]); - } - template - void BrushFlipYImpl(T *pTiles) - { - for(int y = 0; y < m_Height / 2; y++) - for(int x = 0; x < m_Width; x++) - std::swap(pTiles[y * m_Width + x], pTiles[(m_Height - 1 - y) * m_Width + x]); - } - -public: - CLayerTiles(CEditor *pEditor, int w, int h); - CLayerTiles(const CLayerTiles &Other); - ~CLayerTiles(); - - virtual CTile GetTile(int x, int y); - virtual void SetTile(int x, int y, CTile Tile); - void SetTileIgnoreHistory(int x, int y, CTile Tile) const; - - virtual void Resize(int NewW, int NewH); - virtual void Shift(int Direction); - - void MakePalette() const; - void Render(bool Tileset = false) override; - - int ConvertX(float x) const; - int ConvertY(float y) const; - void Convert(CUIRect Rect, RECTi *pOut) const; - void Snap(CUIRect *pRect) const; - void Clamp(RECTi *pRect) const; - - virtual bool IsEntitiesLayer() const override; - - virtual bool IsEmpty(const std::shared_ptr &pLayer); - void BrushSelecting(CUIRect Rect) override; - int BrushGrab(std::shared_ptr pBrush, CUIRect Rect) override; - void FillSelection(bool Empty, std::shared_ptr pBrush, CUIRect Rect) override; - void FillGameTiles(EGameTileOp Fill); - bool CanFillGameTiles() const; - void BrushDraw(std::shared_ptr pBrush, vec2 WorldPos) override; - void BrushFlipX() override; - void BrushFlipY() override; - void BrushRotate(float Amount) override; - - std::shared_ptr Duplicate() const override; - const char *TypeName() const override; - - virtual void ShowInfo(); - CUi::EPopupMenuFunctionResult RenderProperties(CUIRect *pToolbox) override; - - struct SCommonPropState - { - enum - { - MODIFIED_SIZE = 1 << 0, - MODIFIED_COLOR = 1 << 1, - }; - int m_Modified = 0; - int m_Width = -1; - int m_Height = -1; - int m_Color = 0; - }; - static CUi::EPopupMenuFunctionResult RenderCommonProperties(SCommonPropState &State, CEditor *pEditor, CUIRect *pToolbox, std::vector> &vpLayers, std::vector &vLayerIndices); - - void ModifyImageIndex(FIndexModifyFunction pfnFunc) override; - void ModifyEnvelopeIndex(FIndexModifyFunction pfnFunc) override; - - void PrepareForSave(); - void ExtractTiles(int TilemapItemVersion, const CTile *pSavedTiles, size_t SavedTilesSize) const; - - void GetSize(float *pWidth, float *pHeight) override - { - *pWidth = m_Width * 32.0f; - *pHeight = m_Height * 32.0f; - } - - void FlagModified(int x, int y, int w, int h); - - int m_Game; - int m_Image; - int m_Width; - int m_Height; - CColor m_Color; - int m_ColorEnv; - int m_ColorEnvOffset; - CTile *m_pTiles; - - // DDRace - - int m_AutoMapperConfig; - int m_Seed; - bool m_AutoAutoMap; - int m_Tele; - int m_Speedup; - int m_Front; - int m_Switch; - int m_Tune; - char m_aFileName[IO_MAX_PATH_LENGTH]; - - EditorTileStateChangeHistory m_TilesHistory; - inline virtual void ClearHistory() { m_TilesHistory.clear(); } - - static bool HasAutomapEffect(ETilesProp Prop); - -protected: - void RecordStateChange(int x, int y, CTile Previous, CTile Tile); - - void ShowPreventUnusedTilesWarning(); - - friend class CAutoMapper; -}; - -#endif diff --git a/src/game/editor/mapitems/layer_tune.cpp b/src/game/editor/mapitems/layer_tune.cpp deleted file mode 100644 index a417599221..0000000000 --- a/src/game/editor/mapitems/layer_tune.cpp +++ /dev/null @@ -1,279 +0,0 @@ -#include "layer_tune.h" - -#include - -CLayerTune::CLayerTune(CEditor *pEditor, int w, int h) : - CLayerTiles(pEditor, w, h) -{ - str_copy(m_aName, "Tune"); - m_Tune = 1; - - m_pTuneTile = new CTuneTile[w * h]; - mem_zero(m_pTuneTile, (size_t)w * h * sizeof(CTuneTile)); -} - -CLayerTune::CLayerTune(const CLayerTune &Other) : - CLayerTiles(Other) -{ - str_copy(m_aName, "Tune copy"); - m_Tune = 1; - - m_pTuneTile = new CTuneTile[m_Width * m_Height]; - mem_copy(m_pTuneTile, Other.m_pTuneTile, (size_t)m_Width * m_Height * sizeof(CTuneTile)); -} - -CLayerTune::~CLayerTune() -{ - delete[] m_pTuneTile; -} - -void CLayerTune::Resize(int NewW, int NewH) -{ - // resize Tune data - CTuneTile *pNewTuneData = new CTuneTile[NewW * NewH]; - mem_zero(pNewTuneData, (size_t)NewW * NewH * sizeof(CTuneTile)); - - // copy old data - for(int y = 0; y < minimum(NewH, m_Height); y++) - mem_copy(&pNewTuneData[y * NewW], &m_pTuneTile[y * m_Width], minimum(m_Width, NewW) * sizeof(CTuneTile)); - - // replace old - delete[] m_pTuneTile; - m_pTuneTile = pNewTuneData; - - // resize tile data - CLayerTiles::Resize(NewW, NewH); - - // resize gamelayer too - if(m_pEditor->m_Map.m_pGameLayer->m_Width != NewW || m_pEditor->m_Map.m_pGameLayer->m_Height != NewH) - m_pEditor->m_Map.m_pGameLayer->Resize(NewW, NewH); -} - -void CLayerTune::Shift(int Direction) -{ - CLayerTiles::Shift(Direction); - ShiftImpl(m_pTuneTile, Direction, m_pEditor->m_ShiftBy); -} - -bool CLayerTune::IsEmpty(const std::shared_ptr &pLayer) -{ - for(int y = 0; y < pLayer->m_Height; y++) - for(int x = 0; x < pLayer->m_Width; x++) - if(m_pEditor->m_AllowPlaceUnusedTiles || IsValidTuneTile(pLayer->GetTile(x, y).m_Index)) - return false; - - return true; -} - -void CLayerTune::BrushDraw(std::shared_ptr pBrush, vec2 WorldPos) -{ - if(m_Readonly) - return; - - std::shared_ptr pTuneLayer = std::static_pointer_cast(pBrush); - int sx = ConvertX(WorldPos.x); - int sy = ConvertY(WorldPos.y); - if(str_comp(pTuneLayer->m_aFileName, m_pEditor->m_aFileName)) - { - m_pEditor->m_TuningNum = pTuneLayer->m_TuningNumber; - } - - bool Destructive = m_pEditor->m_BrushDrawDestructive || IsEmpty(pTuneLayer); - - for(int y = 0; y < pTuneLayer->m_Height; y++) - for(int x = 0; x < pTuneLayer->m_Width; x++) - { - int fx = x + sx; - int fy = y + sy; - - if(fx < 0 || fx >= m_Width || fy < 0 || fy >= m_Height) - continue; - - if(!Destructive && GetTile(fx, fy).m_Index) - continue; - - int Index = fy * m_Width + fx; - STuneTileStateChange::SData Previous{ - m_pTuneTile[Index].m_Number, - m_pTuneTile[Index].m_Type, - m_pTiles[Index].m_Index}; - - if((m_pEditor->m_AllowPlaceUnusedTiles || IsValidTuneTile(pTuneLayer->m_pTiles[y * pTuneLayer->m_Width + x].m_Index)) && pTuneLayer->m_pTiles[y * pTuneLayer->m_Width + x].m_Index != TILE_AIR) - { - if(m_pEditor->m_TuningNum != pTuneLayer->m_TuningNumber) - { - m_pTuneTile[Index].m_Number = m_pEditor->m_TuningNum; - } - else if(pTuneLayer->m_pTuneTile[y * pTuneLayer->m_Width + x].m_Number) - m_pTuneTile[Index].m_Number = pTuneLayer->m_pTuneTile[y * pTuneLayer->m_Width + x].m_Number; - else - { - if(!m_pEditor->m_TuningNum) - { - m_pTuneTile[Index].m_Number = 0; - m_pTuneTile[Index].m_Type = 0; - m_pTiles[Index].m_Index = 0; - continue; - } - else - m_pTuneTile[Index].m_Number = m_pEditor->m_TuningNum; - } - - m_pTuneTile[Index].m_Type = pTuneLayer->m_pTiles[y * pTuneLayer->m_Width + x].m_Index; - m_pTiles[Index].m_Index = pTuneLayer->m_pTiles[y * pTuneLayer->m_Width + x].m_Index; - } - else - { - m_pTuneTile[Index].m_Number = 0; - m_pTuneTile[Index].m_Type = 0; - m_pTiles[Index].m_Index = 0; - - if(pTuneLayer->m_pTiles[y * pTuneLayer->m_Width + x].m_Index != TILE_AIR) - ShowPreventUnusedTilesWarning(); - } - - STuneTileStateChange::SData Current{ - m_pTuneTile[Index].m_Number, - m_pTuneTile[Index].m_Type, - m_pTiles[Index].m_Index}; - - RecordStateChange(fx, fy, Previous, Current); - } - FlagModified(sx, sy, pTuneLayer->m_Width, pTuneLayer->m_Height); -} - -void CLayerTune::RecordStateChange(int x, int y, STuneTileStateChange::SData Previous, STuneTileStateChange::SData Current) -{ - if(!m_History[y][x].m_Changed) - m_History[y][x] = STuneTileStateChange{true, Previous, Current}; - else - m_History[y][x].m_Current = Current; -} - -void CLayerTune::BrushFlipX() -{ - CLayerTiles::BrushFlipX(); - BrushFlipXImpl(m_pTuneTile); -} - -void CLayerTune::BrushFlipY() -{ - CLayerTiles::BrushFlipY(); - BrushFlipYImpl(m_pTuneTile); -} - -void CLayerTune::BrushRotate(float Amount) -{ - int Rotation = (round_to_int(360.0f * Amount / (pi * 2)) / 90) % 4; // 0=0°, 1=90°, 2=180°, 3=270° - if(Rotation < 0) - Rotation += 4; - - if(Rotation == 1 || Rotation == 3) - { - // 90° rotation - CTuneTile *pTempData1 = new CTuneTile[m_Width * m_Height]; - CTile *pTempData2 = new CTile[m_Width * m_Height]; - mem_copy(pTempData1, m_pTuneTile, (size_t)m_Width * m_Height * sizeof(CTuneTile)); - mem_copy(pTempData2, m_pTiles, (size_t)m_Width * m_Height * sizeof(CTile)); - CTuneTile *pDst1 = m_pTuneTile; - CTile *pDst2 = m_pTiles; - for(int x = 0; x < m_Width; ++x) - for(int y = m_Height - 1; y >= 0; --y, ++pDst1, ++pDst2) - { - *pDst1 = pTempData1[y * m_Width + x]; - *pDst2 = pTempData2[y * m_Width + x]; - } - - std::swap(m_Width, m_Height); - delete[] pTempData1; - delete[] pTempData2; - } - - if(Rotation == 2 || Rotation == 3) - { - BrushFlipX(); - BrushFlipY(); - } -} - -void CLayerTune::FillSelection(bool Empty, std::shared_ptr pBrush, CUIRect Rect) -{ - if(m_Readonly || (!Empty && pBrush->m_Type != LAYERTYPE_TILES)) - return; - - Snap(&Rect); // corrects Rect; no need of <= - - int sx = ConvertX(Rect.x); - int sy = ConvertY(Rect.y); - int w = ConvertX(Rect.w); - int h = ConvertY(Rect.h); - - std::shared_ptr pLt = std::static_pointer_cast(pBrush); - - bool Destructive = m_pEditor->m_BrushDrawDestructive || Empty || IsEmpty(pLt); - - for(int y = 0; y < h; y++) - { - for(int x = 0; x < w; x++) - { - int fx = x + sx; - int fy = y + sy; - - if(fx < 0 || fx >= m_Width || fy < 0 || fy >= m_Height) - continue; - - if(!Destructive && GetTile(fx, fy).m_Index) - continue; - - const int SrcIndex = Empty ? 0 : (y * pLt->m_Width + x % pLt->m_Width) % (pLt->m_Width * pLt->m_Height); - const int TgtIndex = fy * m_Width + fx; - - STuneTileStateChange::SData Previous{ - m_pTuneTile[TgtIndex].m_Number, - m_pTuneTile[TgtIndex].m_Type, - m_pTiles[TgtIndex].m_Index}; - - if(Empty || (!m_pEditor->m_AllowPlaceUnusedTiles && !IsValidTuneTile((pLt->m_pTiles[SrcIndex]).m_Index))) - { - m_pTiles[TgtIndex].m_Index = 0; - m_pTuneTile[TgtIndex].m_Type = 0; - m_pTuneTile[TgtIndex].m_Number = 0; - - if(!Empty) - ShowPreventUnusedTilesWarning(); - } - else - { - m_pTiles[TgtIndex] = pLt->m_pTiles[SrcIndex]; - if(pLt->m_Tune && m_pTiles[TgtIndex].m_Index > 0) - { - m_pTuneTile[TgtIndex].m_Type = m_pTiles[fy * m_Width + fx].m_Index; - - if((pLt->m_pTuneTile[SrcIndex].m_Number == 0 && m_pEditor->m_TuningNum) || m_pEditor->m_TuningNum != pLt->m_TuningNumber) - m_pTuneTile[TgtIndex].m_Number = m_pEditor->m_TuningNum; - else - m_pTuneTile[TgtIndex].m_Number = pLt->m_pTuneTile[SrcIndex].m_Number; - } - } - - STuneTileStateChange::SData Current{ - m_pTuneTile[TgtIndex].m_Number, - m_pTuneTile[TgtIndex].m_Type, - m_pTiles[TgtIndex].m_Index}; - - RecordStateChange(fx, fy, Previous, Current); - } - } - - FlagModified(sx, sy, w, h); -} - -std::shared_ptr CLayerTune::Duplicate() const -{ - return std::make_shared(*this); -} - -const char *CLayerTune::TypeName() const -{ - return "tune"; -} diff --git a/src/game/editor/mapitems/layer_tune.h b/src/game/editor/mapitems/layer_tune.h deleted file mode 100644 index 6ea607d8dc..0000000000 --- a/src/game/editor/mapitems/layer_tune.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef GAME_EDITOR_MAPITEMS_LAYER_TUNE_H -#define GAME_EDITOR_MAPITEMS_LAYER_TUNE_H - -#include "layer_tiles.h" - -struct STuneTileStateChange -{ - bool m_Changed; - struct SData - { - int m_Number; - int m_Type; - int m_Index; - } m_Previous, m_Current; -}; - -class CLayerTune : public CLayerTiles -{ -public: - CLayerTune(CEditor *pEditor, int w, int h); - CLayerTune(const CLayerTune &Other); - ~CLayerTune(); - - CTuneTile *m_pTuneTile; - unsigned char m_TuningNumber; - - void Resize(int NewW, int NewH) override; - void Shift(int Direction) override; - bool IsEmpty(const std::shared_ptr &pLayer) override; - void BrushDraw(std::shared_ptr pBrush, vec2 WorldPos) override; - void BrushFlipX() override; - void BrushFlipY() override; - void BrushRotate(float Amount) override; - void FillSelection(bool Empty, std::shared_ptr pBrush, CUIRect Rect) override; - - EditorTileStateChangeHistory m_History; - inline void ClearHistory() override - { - CLayerTiles::ClearHistory(); - m_History.clear(); - } - - std::shared_ptr Duplicate() const override; - const char *TypeName() const override; - -private: - void RecordStateChange(int x, int y, STuneTileStateChange::SData Previous, STuneTileStateChange::SData Current); -}; - -#endif diff --git a/src/game/editor/mapitems/map.cpp b/src/game/editor/mapitems/map.cpp deleted file mode 100644 index 8f8ae1fbb0..0000000000 --- a/src/game/editor/mapitems/map.cpp +++ /dev/null @@ -1,178 +0,0 @@ -#include - -#include "image.h" - -void CEditorMap::OnModify() -{ - m_Modified = true; - m_ModifiedAuto = true; - m_LastModifiedTime = m_pEditor->Client()->GlobalTime(); -} - -void CEditorMap::DeleteEnvelope(int Index) -{ - if(Index < 0 || Index >= (int)m_vpEnvelopes.size()) - return; - - OnModify(); - - VisitEnvelopeReferences([Index](int &ElementIndex) { - if(ElementIndex == Index) - ElementIndex = -1; - else if(ElementIndex > Index) - ElementIndex--; - }); - - m_vpEnvelopes.erase(m_vpEnvelopes.begin() + Index); -} - -void CEditorMap::SwapEnvelopes(int Index0, int Index1) -{ - if(Index0 < 0 || Index0 >= (int)m_vpEnvelopes.size()) - return; - if(Index1 < 0 || Index1 >= (int)m_vpEnvelopes.size()) - return; - if(Index0 == Index1) - return; - - OnModify(); - - VisitEnvelopeReferences([Index0, Index1](int &ElementIndex) { - if(ElementIndex == Index0) - ElementIndex = Index1; - else if(ElementIndex == Index1) - ElementIndex = Index0; - }); - - std::swap(m_vpEnvelopes[Index0], m_vpEnvelopes[Index1]); -} - -template -void CEditorMap::VisitEnvelopeReferences(F &&Visitor) -{ - for(auto &pGroup : m_vpGroups) - { - for(auto &pLayer : pGroup->m_vpLayers) - { - if(pLayer->m_Type == LAYERTYPE_QUADS) - { - std::shared_ptr pLayerQuads = std::static_pointer_cast(pLayer); - for(auto &Quad : pLayerQuads->m_vQuads) - { - Visitor(Quad.m_PosEnv); - Visitor(Quad.m_ColorEnv); - } - } - else if(pLayer->m_Type == LAYERTYPE_TILES) - { - std::shared_ptr pLayerTiles = std::static_pointer_cast(pLayer); - Visitor(pLayerTiles->m_ColorEnv); - } - else if(pLayer->m_Type == LAYERTYPE_SOUNDS) - { - std::shared_ptr pLayerSounds = std::static_pointer_cast(pLayer); - for(auto &Source : pLayerSounds->m_vSources) - { - Visitor(Source.m_PosEnv); - Visitor(Source.m_SoundEnv); - } - } - } - } -} - -void CEditorMap::MakeGameLayer(const std::shared_ptr &pLayer) -{ - m_pGameLayer = std::static_pointer_cast(pLayer); - m_pGameLayer->m_pEditor = m_pEditor; -} - -void CEditorMap::MakeGameGroup(std::shared_ptr pGroup) -{ - m_pGameGroup = std::move(pGroup); - m_pGameGroup->m_GameGroup = true; - str_copy(m_pGameGroup->m_aName, "Game"); -} - -void CEditorMap::Clean() -{ - m_vpGroups.clear(); - m_vpEnvelopes.clear(); - m_vpImages.clear(); - m_vpSounds.clear(); - - m_MapInfo.Reset(); - m_MapInfoTmp.Reset(); - - m_vSettings.clear(); - - m_pGameLayer = nullptr; - m_pGameGroup = nullptr; - - m_Modified = false; - m_ModifiedAuto = false; - - m_pTeleLayer = nullptr; - m_pSpeedupLayer = nullptr; - m_pFrontLayer = nullptr; - m_pSwitchLayer = nullptr; - m_pTuneLayer = nullptr; -} - -void CEditorMap::CreateDefault(IGraphics::CTextureHandle EntitiesTexture) -{ - // add background - std::shared_ptr pGroup = NewGroup(); - pGroup->m_ParallaxX = 0; - pGroup->m_ParallaxY = 0; - std::shared_ptr pLayer = std::make_shared(m_pEditor); - CQuad *pQuad = pLayer->NewQuad(0, 0, 1600, 1200); - pQuad->m_aColors[0].r = pQuad->m_aColors[1].r = 94; - pQuad->m_aColors[0].g = pQuad->m_aColors[1].g = 132; - pQuad->m_aColors[0].b = pQuad->m_aColors[1].b = 174; - pQuad->m_aColors[2].r = pQuad->m_aColors[3].r = 204; - pQuad->m_aColors[2].g = pQuad->m_aColors[3].g = 232; - pQuad->m_aColors[2].b = pQuad->m_aColors[3].b = 255; - pGroup->AddLayer(pLayer); - - // add game layer and reset front, tele, speedup, tune and switch layer pointers - MakeGameGroup(NewGroup()); - MakeGameLayer(std::make_shared(m_pEditor, 50, 50)); - m_pGameGroup->AddLayer(m_pGameLayer); - - m_pFrontLayer = nullptr; - m_pTeleLayer = nullptr; - m_pSpeedupLayer = nullptr; - m_pSwitchLayer = nullptr; - m_pTuneLayer = nullptr; -} - -void CEditorMap::MakeTeleLayer(const std::shared_ptr &pLayer) -{ - m_pTeleLayer = std::static_pointer_cast(pLayer); - m_pTeleLayer->m_pEditor = m_pEditor; -} - -void CEditorMap::MakeSpeedupLayer(const std::shared_ptr &pLayer) -{ - m_pSpeedupLayer = std::static_pointer_cast(pLayer); - m_pSpeedupLayer->m_pEditor = m_pEditor; -} - -void CEditorMap::MakeFrontLayer(const std::shared_ptr &pLayer) -{ - m_pFrontLayer = std::static_pointer_cast(pLayer); - m_pFrontLayer->m_pEditor = m_pEditor; -} - -void CEditorMap::MakeSwitchLayer(const std::shared_ptr &pLayer) -{ - m_pSwitchLayer = std::static_pointer_cast(pLayer); - m_pSwitchLayer->m_pEditor = m_pEditor; -} - -void CEditorMap::MakeTuneLayer(const std::shared_ptr &pLayer) -{ - m_pTuneLayer = std::static_pointer_cast(pLayer); - m_pTuneLayer->m_pEditor = m_pEditor; -} diff --git a/src/game/editor/mapitems/map_io.cpp b/src/game/editor/mapitems/map_io.cpp deleted file mode 100644 index 30f85c6764..0000000000 --- a/src/game/editor/mapitems/map_io.cpp +++ /dev/null @@ -1,1082 +0,0 @@ -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "image.h" -#include "sound.h" - -template -static int MakeVersion(int i, const T &v) -{ - return (i << 16) + sizeof(T); -} - -// compatibility with old sound layers -struct CSoundSource_DEPRECATED -{ - CPoint m_Position; - int m_Loop; - int m_TimeDelay; // in s - int m_FalloffDistance; - int m_PosEnv; - int m_PosEnvOffset; - int m_SoundEnv; - int m_SoundEnvOffset; -}; - -bool CEditorMap::Save(const char *pFileName, const std::function &ErrorHandler) -{ - char aFileNameTmp[IO_MAX_PATH_LENGTH]; - IStorage::FormatTmpPath(aFileNameTmp, sizeof(aFileNameTmp), pFileName); - - char aBuf[IO_MAX_PATH_LENGTH + 64]; - str_format(aBuf, sizeof(aBuf), "saving to '%s'...", aFileNameTmp); - m_pEditor->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "editor", aBuf); - - if(!PerformPreSaveSanityChecks(ErrorHandler)) - { - return false; - } - - CDataFileWriter Writer; - if(!Writer.Open(m_pEditor->Storage(), aFileNameTmp)) - { - str_format(aBuf, sizeof(aBuf), "Error: Failed to open file '%s' for writing.", aFileNameTmp); - ErrorHandler(aBuf); - return false; - } - - // save version - { - CMapItemVersion Item; - Item.m_Version = CMapItemVersion::CURRENT_VERSION; - Writer.AddItem(MAPITEMTYPE_VERSION, 0, sizeof(Item), &Item); - } - - // save map info - { - CMapItemInfoSettings Item; - Item.m_Version = 1; - Item.m_Author = Writer.AddDataString(m_MapInfo.m_aAuthor); - Item.m_MapVersion = Writer.AddDataString(m_MapInfo.m_aVersion); - Item.m_Credits = Writer.AddDataString(m_MapInfo.m_aCredits); - Item.m_License = Writer.AddDataString(m_MapInfo.m_aLicense); - - Item.m_Settings = -1; - if(!m_vSettings.empty()) - { - int Size = 0; - for(const auto &Setting : m_vSettings) - { - Size += str_length(Setting.m_aCommand) + 1; - } - - char *pSettings = (char *)malloc(maximum(Size, 1)); - char *pNext = pSettings; - for(const auto &Setting : m_vSettings) - { - int Length = str_length(Setting.m_aCommand) + 1; - mem_copy(pNext, Setting.m_aCommand, Length); - pNext += Length; - } - Item.m_Settings = Writer.AddData(Size, pSettings); - free(pSettings); - } - - Writer.AddItem(MAPITEMTYPE_INFO, 0, sizeof(Item), &Item); - } - - // save images - for(size_t i = 0; i < m_vpImages.size(); i++) - { - std::shared_ptr pImg = m_vpImages[i]; - - // analyse the image for when saving (should be done when we load the image) - // TODO! - pImg->AnalyseTileFlags(); - - CMapItemImage Item; - Item.m_Version = CMapItemImage::CURRENT_VERSION; - - Item.m_Width = pImg->m_Width; - Item.m_Height = pImg->m_Height; - Item.m_External = pImg->m_External; - Item.m_ImageName = Writer.AddDataString(pImg->m_aName); - if(pImg->m_External) - { - Item.m_ImageData = -1; - } - else - { - dbg_assert(pImg->m_Format == CImageInfo::FORMAT_RGBA, "Embedded images must be in RGBA format"); - Item.m_ImageData = Writer.AddData(pImg->DataSize(), pImg->m_pData); - } - Writer.AddItem(MAPITEMTYPE_IMAGE, i, sizeof(Item), &Item); - } - - // save sounds - for(size_t i = 0; i < m_vpSounds.size(); i++) - { - std::shared_ptr pSound = m_vpSounds[i]; - - CMapItemSound Item; - Item.m_Version = 1; - - Item.m_External = 0; - Item.m_SoundName = Writer.AddDataString(pSound->m_aName); - Item.m_SoundData = Writer.AddData(pSound->m_DataSize, pSound->m_pData); - // Value is not read in new versions, but we still need to write it for compatibility with old versions. - Item.m_SoundDataSize = pSound->m_DataSize; - - Writer.AddItem(MAPITEMTYPE_SOUND, i, sizeof(Item), &Item); - } - - // save layers - int LayerCount = 0, GroupCount = 0; - int AutomapperCount = 0; - for(const auto &pGroup : m_vpGroups) - { - CMapItemGroup GItem; - GItem.m_Version = CMapItemGroup::CURRENT_VERSION; - - GItem.m_ParallaxX = pGroup->m_ParallaxX; - GItem.m_ParallaxY = pGroup->m_ParallaxY; - GItem.m_OffsetX = pGroup->m_OffsetX; - GItem.m_OffsetY = pGroup->m_OffsetY; - GItem.m_UseClipping = pGroup->m_UseClipping; - GItem.m_ClipX = pGroup->m_ClipX; - GItem.m_ClipY = pGroup->m_ClipY; - GItem.m_ClipW = pGroup->m_ClipW; - GItem.m_ClipH = pGroup->m_ClipH; - GItem.m_StartLayer = LayerCount; - GItem.m_NumLayers = 0; - - // save group name - StrToInts(GItem.m_aName, std::size(GItem.m_aName), pGroup->m_aName); - - for(const std::shared_ptr &pLayer : pGroup->m_vpLayers) - { - if(pLayer->m_Type == LAYERTYPE_TILES) - { - m_pEditor->Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "editor", "saving tiles layer"); - std::shared_ptr pLayerTiles = std::static_pointer_cast(pLayer); - pLayerTiles->PrepareForSave(); - - CMapItemLayerTilemap Item; - Item.m_Version = CMapItemLayerTilemap::CURRENT_VERSION; - - Item.m_Layer.m_Version = 0; // was previously uninitialized, do not rely on it being 0 - Item.m_Layer.m_Flags = pLayerTiles->m_Flags; - Item.m_Layer.m_Type = pLayerTiles->m_Type; - - Item.m_Color = pLayerTiles->m_Color; - Item.m_ColorEnv = pLayerTiles->m_ColorEnv; - Item.m_ColorEnvOffset = pLayerTiles->m_ColorEnvOffset; - - Item.m_Width = pLayerTiles->m_Width; - Item.m_Height = pLayerTiles->m_Height; - // Item.m_Flags = pLayerTiles->m_Game ? TILESLAYERFLAG_GAME : 0; - - if(pLayerTiles->m_Tele) - Item.m_Flags = TILESLAYERFLAG_TELE; - else if(pLayerTiles->m_Speedup) - Item.m_Flags = TILESLAYERFLAG_SPEEDUP; - else if(pLayerTiles->m_Front) - Item.m_Flags = TILESLAYERFLAG_FRONT; - else if(pLayerTiles->m_Switch) - Item.m_Flags = TILESLAYERFLAG_SWITCH; - else if(pLayerTiles->m_Tune) - Item.m_Flags = TILESLAYERFLAG_TUNE; - else - Item.m_Flags = pLayerTiles->m_Game ? TILESLAYERFLAG_GAME : 0; - - Item.m_Image = pLayerTiles->m_Image; - - // the following values were previously uninitialized, do not rely on them being -1 when unused - Item.m_Tele = -1; - Item.m_Speedup = -1; - Item.m_Front = -1; - Item.m_Switch = -1; - Item.m_Tune = -1; - - if(Item.m_Flags && !(pLayerTiles->m_Game)) - { - CTile *pEmptyTiles = (CTile *)calloc((size_t)pLayerTiles->m_Width * pLayerTiles->m_Height, sizeof(CTile)); - mem_zero(pEmptyTiles, (size_t)pLayerTiles->m_Width * pLayerTiles->m_Height * sizeof(CTile)); - Item.m_Data = Writer.AddData((size_t)pLayerTiles->m_Width * pLayerTiles->m_Height * sizeof(CTile), pEmptyTiles); - free(pEmptyTiles); - - if(pLayerTiles->m_Tele) - Item.m_Tele = Writer.AddData((size_t)pLayerTiles->m_Width * pLayerTiles->m_Height * sizeof(CTeleTile), std::static_pointer_cast(pLayerTiles)->m_pTeleTile); - else if(pLayerTiles->m_Speedup) - Item.m_Speedup = Writer.AddData((size_t)pLayerTiles->m_Width * pLayerTiles->m_Height * sizeof(CSpeedupTile), std::static_pointer_cast(pLayerTiles)->m_pSpeedupTile); - else if(pLayerTiles->m_Front) - Item.m_Front = Writer.AddData((size_t)pLayerTiles->m_Width * pLayerTiles->m_Height * sizeof(CTile), pLayerTiles->m_pTiles); - else if(pLayerTiles->m_Switch) - Item.m_Switch = Writer.AddData((size_t)pLayerTiles->m_Width * pLayerTiles->m_Height * sizeof(CSwitchTile), std::static_pointer_cast(pLayerTiles)->m_pSwitchTile); - else if(pLayerTiles->m_Tune) - Item.m_Tune = Writer.AddData((size_t)pLayerTiles->m_Width * pLayerTiles->m_Height * sizeof(CTuneTile), std::static_pointer_cast(pLayerTiles)->m_pTuneTile); - } - else - Item.m_Data = Writer.AddData((size_t)pLayerTiles->m_Width * pLayerTiles->m_Height * sizeof(CTile), pLayerTiles->m_pTiles); - - // save layer name - StrToInts(Item.m_aName, std::size(Item.m_aName), pLayerTiles->m_aName); - - // save item - Writer.AddItem(MAPITEMTYPE_LAYER, LayerCount, sizeof(Item), &Item); - - // save auto mapper of each tile layer (not physics layer) - if(!Item.m_Flags) - { - CMapItemAutoMapperConfig ItemAutomapper; - ItemAutomapper.m_Version = CMapItemAutoMapperConfig::CURRENT_VERSION; - ItemAutomapper.m_GroupId = GroupCount; - ItemAutomapper.m_LayerId = GItem.m_NumLayers; - ItemAutomapper.m_AutomapperConfig = pLayerTiles->m_AutoMapperConfig; - ItemAutomapper.m_AutomapperSeed = pLayerTiles->m_Seed; - ItemAutomapper.m_Flags = 0; - if(pLayerTiles->m_AutoAutoMap) - ItemAutomapper.m_Flags |= CMapItemAutoMapperConfig::FLAG_AUTOMATIC; - - Writer.AddItem(MAPITEMTYPE_AUTOMAPPER_CONFIG, AutomapperCount, sizeof(ItemAutomapper), &ItemAutomapper); - AutomapperCount++; - } - } - else if(pLayer->m_Type == LAYERTYPE_QUADS) - { - m_pEditor->Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "editor", "saving quads layer"); - std::shared_ptr pLayerQuads = std::static_pointer_cast(pLayer); - CMapItemLayerQuads Item; - Item.m_Version = 2; - Item.m_Layer.m_Version = 0; // was previously uninitialized, do not rely on it being 0 - Item.m_Layer.m_Flags = pLayerQuads->m_Flags; - Item.m_Layer.m_Type = pLayerQuads->m_Type; - Item.m_Image = pLayerQuads->m_Image; - - Item.m_NumQuads = 0; - Item.m_Data = -1; - if(!pLayerQuads->m_vQuads.empty()) - { - // add the data - Item.m_NumQuads = pLayerQuads->m_vQuads.size(); - Item.m_Data = Writer.AddDataSwapped(pLayerQuads->m_vQuads.size() * sizeof(CQuad), pLayerQuads->m_vQuads.data()); - } - else - { - // add dummy data for backwards compatibility - // this allows the layer to be loaded with an empty array since m_NumQuads is 0 while saving - CQuad Dummy{}; - Item.m_Data = Writer.AddDataSwapped(sizeof(CQuad), &Dummy); - } - - // save layer name - StrToInts(Item.m_aName, std::size(Item.m_aName), pLayerQuads->m_aName); - - // save item - Writer.AddItem(MAPITEMTYPE_LAYER, LayerCount, sizeof(Item), &Item); - } - else if(pLayer->m_Type == LAYERTYPE_SOUNDS) - { - m_pEditor->Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "editor", "saving sounds layer"); - std::shared_ptr pLayerSounds = std::static_pointer_cast(pLayer); - CMapItemLayerSounds Item; - Item.m_Version = CMapItemLayerSounds::CURRENT_VERSION; - Item.m_Layer.m_Version = 0; // was previously uninitialized, do not rely on it being 0 - Item.m_Layer.m_Flags = pLayerSounds->m_Flags; - Item.m_Layer.m_Type = pLayerSounds->m_Type; - Item.m_Sound = pLayerSounds->m_Sound; - - Item.m_NumSources = 0; - if(!pLayerSounds->m_vSources.empty()) - { - // add the data - Item.m_NumSources = pLayerSounds->m_vSources.size(); - Item.m_Data = Writer.AddDataSwapped(pLayerSounds->m_vSources.size() * sizeof(CSoundSource), pLayerSounds->m_vSources.data()); - } - else - { - // add dummy data for backwards compatibility - // this allows the layer to be loaded with an empty array since m_NumSources is 0 while saving - CSoundSource Dummy{}; - Item.m_Data = Writer.AddDataSwapped(sizeof(CSoundSource), &Dummy); - } - - // save layer name - StrToInts(Item.m_aName, std::size(Item.m_aName), pLayerSounds->m_aName); - - // save item - Writer.AddItem(MAPITEMTYPE_LAYER, LayerCount, sizeof(Item), &Item); - } - - GItem.m_NumLayers++; - LayerCount++; - } - - Writer.AddItem(MAPITEMTYPE_GROUP, GroupCount, sizeof(GItem), &GItem); - GroupCount++; - } - - // save envelopes - m_pEditor->Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "editor", "saving envelopes"); - int PointCount = 0; - for(size_t e = 0; e < m_vpEnvelopes.size(); e++) - { - CMapItemEnvelope Item; - Item.m_Version = CMapItemEnvelope::CURRENT_VERSION; - Item.m_Channels = m_vpEnvelopes[e]->GetChannels(); - Item.m_StartPoint = PointCount; - Item.m_NumPoints = m_vpEnvelopes[e]->m_vPoints.size(); - Item.m_Synchronized = m_vpEnvelopes[e]->m_Synchronized; - StrToInts(Item.m_aName, std::size(Item.m_aName), m_vpEnvelopes[e]->m_aName); - - Writer.AddItem(MAPITEMTYPE_ENVELOPE, e, sizeof(Item), &Item); - PointCount += Item.m_NumPoints; - } - - // save points - m_pEditor->Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "editor", "saving envelope points"); - bool BezierUsed = false; - for(const auto &pEnvelope : m_vpEnvelopes) - { - for(const auto &Point : pEnvelope->m_vPoints) - { - if(Point.m_Curvetype == CURVETYPE_BEZIER) - { - BezierUsed = true; - break; - } - } - if(BezierUsed) - break; - } - - CEnvPoint *pPoints = (CEnvPoint *)calloc(maximum(PointCount, 1), sizeof(CEnvPoint)); - CEnvPointBezier *pPointsBezier = nullptr; - if(BezierUsed) - pPointsBezier = (CEnvPointBezier *)calloc(maximum(PointCount, 1), sizeof(CEnvPointBezier)); - PointCount = 0; - - for(const auto &pEnvelope : m_vpEnvelopes) - { - const CEnvPoint_runtime *pPrevPoint = nullptr; - for(const auto &Point : pEnvelope->m_vPoints) - { - mem_copy(&pPoints[PointCount], &Point, sizeof(CEnvPoint)); - if(pPointsBezier != nullptr) - { - if(Point.m_Curvetype == CURVETYPE_BEZIER) - { - mem_copy(&pPointsBezier[PointCount].m_aOutTangentDeltaX, &Point.m_Bezier.m_aOutTangentDeltaX, sizeof(Point.m_Bezier.m_aOutTangentDeltaX)); - mem_copy(&pPointsBezier[PointCount].m_aOutTangentDeltaY, &Point.m_Bezier.m_aOutTangentDeltaY, sizeof(Point.m_Bezier.m_aOutTangentDeltaY)); - } - if(pPrevPoint != nullptr && pPrevPoint->m_Curvetype == CURVETYPE_BEZIER) - { - mem_copy(&pPointsBezier[PointCount].m_aInTangentDeltaX, &Point.m_Bezier.m_aInTangentDeltaX, sizeof(Point.m_Bezier.m_aInTangentDeltaX)); - mem_copy(&pPointsBezier[PointCount].m_aInTangentDeltaY, &Point.m_Bezier.m_aInTangentDeltaY, sizeof(Point.m_Bezier.m_aInTangentDeltaY)); - } - } - PointCount++; - pPrevPoint = &Point; - } - } - - Writer.AddItem(MAPITEMTYPE_ENVPOINTS, 0, sizeof(CEnvPoint) * PointCount, pPoints); - free(pPoints); - - if(pPointsBezier != nullptr) - { - Writer.AddItem(MAPITEMTYPE_ENVPOINTS_BEZIER, 0, sizeof(CEnvPointBezier) * PointCount, pPointsBezier); - free(pPointsBezier); - } - - // finish the data file - std::shared_ptr pWriterFinishJob = std::make_shared(pFileName, aFileNameTmp, std::move(Writer)); - m_pEditor->Engine()->AddJob(pWriterFinishJob); - m_pEditor->m_WriterFinishJobs.push_back(pWriterFinishJob); - - return true; -} - -bool CEditorMap::PerformPreSaveSanityChecks(const std::function &ErrorHandler) -{ - bool Success = true; - char aErrorMessage[256]; - - for(const std::shared_ptr &pImage : m_vpImages) - { - if(!pImage->m_External && pImage->m_pData == nullptr) - { - str_format(aErrorMessage, sizeof(aErrorMessage), "Error: Saving is not possible because the image '%s' could not be loaded. Remove or replace this image.", pImage->m_aName); - ErrorHandler(aErrorMessage); - Success = false; - } - } - - for(const std::shared_ptr &pSound : m_vpSounds) - { - if(pSound->m_pData == nullptr) - { - str_format(aErrorMessage, sizeof(aErrorMessage), "Error: Saving is not possible because the sound '%s' could not be loaded. Remove or replace this sound.", pSound->m_aName); - ErrorHandler(aErrorMessage); - Success = false; - } - } - - return Success; -} - -bool CEditorMap::Load(const char *pFileName, int StorageType, const std::function &ErrorHandler) -{ - CDataFileReader DataFile; - if(!DataFile.Open(m_pEditor->Storage(), pFileName, StorageType)) - { - ErrorHandler("Error: Failed to open map file. See local console for details."); - return false; - } - - // check version - const CMapItemVersion *pItemVersion = static_cast(DataFile.FindItem(MAPITEMTYPE_VERSION, 0)); - if(pItemVersion == nullptr || pItemVersion->m_Version != CMapItemVersion::CURRENT_VERSION) - { - ErrorHandler("Error: The map has an unsupported version."); - return false; - } - - Clean(); - - // load map info - { - int Start, Num; - DataFile.GetType(MAPITEMTYPE_INFO, &Start, &Num); - for(int i = Start; i < Start + Num; i++) - { - int ItemSize = DataFile.GetItemSize(Start); - int ItemId; - CMapItemInfoSettings *pItem = (CMapItemInfoSettings *)DataFile.GetItem(i, nullptr, &ItemId); - if(!pItem || ItemId != 0) - continue; - - const auto &&ReadStringInfo = [&](int Index, char *pBuffer, size_t BufferSize, const char *pErrorContext) { - const char *pStr = DataFile.GetDataString(Index); - if(pStr == nullptr) - { - char aBuf[128]; - str_format(aBuf, sizeof(aBuf), "Error: Failed to read %s from map info.", pErrorContext); - ErrorHandler(aBuf); - pBuffer[0] = '\0'; - } - else - { - str_copy(pBuffer, pStr, BufferSize); - } - }; - - ReadStringInfo(pItem->m_Author, m_MapInfo.m_aAuthor, sizeof(m_MapInfo.m_aAuthor), "author"); - ReadStringInfo(pItem->m_MapVersion, m_MapInfo.m_aVersion, sizeof(m_MapInfo.m_aVersion), "version"); - ReadStringInfo(pItem->m_Credits, m_MapInfo.m_aCredits, sizeof(m_MapInfo.m_aCredits), "credits"); - ReadStringInfo(pItem->m_License, m_MapInfo.m_aLicense, sizeof(m_MapInfo.m_aLicense), "license"); - - if(pItem->m_Version != 1 || ItemSize < (int)sizeof(CMapItemInfoSettings)) - break; - - if(!(pItem->m_Settings > -1)) - break; - - const unsigned Size = DataFile.GetDataSize(pItem->m_Settings); - char *pSettings = (char *)DataFile.GetData(pItem->m_Settings); - char *pNext = pSettings; - while(pNext < pSettings + Size) - { - int StrSize = str_length(pNext) + 1; - m_vSettings.emplace_back(pNext); - pNext += StrSize; - } - } - } - - // load images - { - int Start, Num; - DataFile.GetType(MAPITEMTYPE_IMAGE, &Start, &Num); - for(int i = 0; i < Num; i++) - { - CMapItemImage_v2 *pItem = (CMapItemImage_v2 *)DataFile.GetItem(Start + i); - - // copy base info - std::shared_ptr pImg = std::make_shared(m_pEditor); - pImg->m_External = pItem->m_External; - - const char *pName = DataFile.GetDataString(pItem->m_ImageName); - if(pName == nullptr || pName[0] == '\0') - { - char aBuf[128]; - str_format(aBuf, sizeof(aBuf), "Error: Failed to read name of image %d.", i); - ErrorHandler(aBuf); - } - else - str_copy(pImg->m_aName, pName); - - if(pItem->m_Version > 1 && pItem->m_MustBe1 != 1) - { - char aBuf[128]; - str_format(aBuf, sizeof(aBuf), "Error: Unsupported image type of image %d '%s'.", i, pImg->m_aName); - ErrorHandler(aBuf); - } - - if(pImg->m_External || (pItem->m_Version > 1 && pItem->m_MustBe1 != 1)) - { - char aBuf[IO_MAX_PATH_LENGTH]; - str_format(aBuf, sizeof(aBuf), "mapres/%s.png", pImg->m_aName); - - // load external - CImageInfo ImgInfo; - if(m_pEditor->Graphics()->LoadPng(ImgInfo, aBuf, IStorage::TYPE_ALL)) - { - pImg->m_Width = ImgInfo.m_Width; - pImg->m_Height = ImgInfo.m_Height; - pImg->m_Format = ImgInfo.m_Format; - pImg->m_pData = ImgInfo.m_pData; - ConvertToRgba(*pImg); - - int TextureLoadFlag = m_pEditor->Graphics()->Uses2DTextureArrays() ? IGraphics::TEXLOAD_TO_2D_ARRAY_TEXTURE : IGraphics::TEXLOAD_TO_3D_TEXTURE; - if(pImg->m_Width % 16 != 0 || pImg->m_Height % 16 != 0) - TextureLoadFlag = 0; - pImg->m_External = 1; - pImg->m_Texture = m_pEditor->Graphics()->LoadTextureRaw(*pImg, TextureLoadFlag, aBuf); - } - else - { - str_format(aBuf, sizeof(aBuf), "Error: Failed to load external image '%s'.", pImg->m_aName); - ErrorHandler(aBuf); - } - } - else - { - pImg->m_Width = pItem->m_Width; - pImg->m_Height = pItem->m_Height; - pImg->m_Format = CImageInfo::FORMAT_RGBA; - - // copy image data - void *pData = DataFile.GetData(pItem->m_ImageData); - const size_t DataSize = pImg->DataSize(); - pImg->m_pData = static_cast(malloc(DataSize)); - mem_copy(pImg->m_pData, pData, DataSize); - int TextureLoadFlag = m_pEditor->Graphics()->Uses2DTextureArrays() ? IGraphics::TEXLOAD_TO_2D_ARRAY_TEXTURE : IGraphics::TEXLOAD_TO_3D_TEXTURE; - if(pImg->m_Width % 16 != 0 || pImg->m_Height % 16 != 0) - TextureLoadFlag = 0; - pImg->m_Texture = m_pEditor->Graphics()->LoadTextureRaw(*pImg, TextureLoadFlag, pImg->m_aName); - } - - // load auto mapper file - pImg->m_AutoMapper.Load(pImg->m_aName); - - m_vpImages.push_back(pImg); - - // unload image - DataFile.UnloadData(pItem->m_ImageData); - DataFile.UnloadData(pItem->m_ImageName); - } - } - - // load sounds - { - int Start, Num; - DataFile.GetType(MAPITEMTYPE_SOUND, &Start, &Num); - for(int i = 0; i < Num; i++) - { - CMapItemSound *pItem = (CMapItemSound *)DataFile.GetItem(Start + i); - - // copy base info - std::shared_ptr pSound = std::make_shared(m_pEditor); - - const char *pName = DataFile.GetDataString(pItem->m_SoundName); - if(pName == nullptr || pName[0] == '\0') - { - char aBuf[128]; - str_format(aBuf, sizeof(aBuf), "Error: Failed to read name of sound %d.", i); - ErrorHandler(aBuf); - } - else - str_copy(pSound->m_aName, pName); - - if(pItem->m_External) - { - char aBuf[IO_MAX_PATH_LENGTH]; - str_format(aBuf, sizeof(aBuf), "mapres/%s.opus", pSound->m_aName); - - // load external - if(m_pEditor->Storage()->ReadFile(aBuf, IStorage::TYPE_ALL, &pSound->m_pData, &pSound->m_DataSize)) - { - pSound->m_SoundId = m_pEditor->Sound()->LoadOpusFromMem(pSound->m_pData, pSound->m_DataSize, true); - } - else - { - str_format(aBuf, sizeof(aBuf), "Error: Failed to load external sound '%s'.", pSound->m_aName); - ErrorHandler(aBuf); - } - } - else - { - pSound->m_DataSize = DataFile.GetDataSize(pItem->m_SoundData); - void *pData = DataFile.GetData(pItem->m_SoundData); - pSound->m_pData = malloc(pSound->m_DataSize); - mem_copy(pSound->m_pData, pData, pSound->m_DataSize); - pSound->m_SoundId = m_pEditor->Sound()->LoadOpusFromMem(pSound->m_pData, pSound->m_DataSize, true); - } - - m_vpSounds.push_back(pSound); - - // unload sound - DataFile.UnloadData(pItem->m_SoundData); - DataFile.UnloadData(pItem->m_SoundName); - } - } - - // load groups - { - int LayersStart, LayersNum; - DataFile.GetType(MAPITEMTYPE_LAYER, &LayersStart, &LayersNum); - - int Start, Num; - DataFile.GetType(MAPITEMTYPE_GROUP, &Start, &Num); - - for(int g = 0; g < Num; g++) - { - CMapItemGroup *pGItem = (CMapItemGroup *)DataFile.GetItem(Start + g); - - if(pGItem->m_Version < 1 || pGItem->m_Version > CMapItemGroup::CURRENT_VERSION) - continue; - - std::shared_ptr pGroup = NewGroup(); - pGroup->m_ParallaxX = pGItem->m_ParallaxX; - pGroup->m_ParallaxY = pGItem->m_ParallaxY; - pGroup->m_OffsetX = pGItem->m_OffsetX; - pGroup->m_OffsetY = pGItem->m_OffsetY; - - if(pGItem->m_Version >= 2) - { - pGroup->m_UseClipping = pGItem->m_UseClipping; - pGroup->m_ClipX = pGItem->m_ClipX; - pGroup->m_ClipY = pGItem->m_ClipY; - pGroup->m_ClipW = pGItem->m_ClipW; - pGroup->m_ClipH = pGItem->m_ClipH; - } - - // load group name - if(pGItem->m_Version >= 3) - IntsToStr(pGItem->m_aName, std::size(pGItem->m_aName), pGroup->m_aName, std::size(pGroup->m_aName)); - - for(int l = 0; l < pGItem->m_NumLayers; l++) - { - CMapItemLayer *pLayerItem = (CMapItemLayer *)DataFile.GetItem(LayersStart + pGItem->m_StartLayer + l); - if(!pLayerItem) - continue; - - if(pLayerItem->m_Type == LAYERTYPE_TILES) - { - CMapItemLayerTilemap *pTilemapItem = (CMapItemLayerTilemap *)pLayerItem; - - std::shared_ptr pTiles; - if(pTilemapItem->m_Flags & TILESLAYERFLAG_GAME) - { - pTiles = std::make_shared(m_pEditor, pTilemapItem->m_Width, pTilemapItem->m_Height); - MakeGameLayer(pTiles); - MakeGameGroup(pGroup); - } - else if(pTilemapItem->m_Flags & TILESLAYERFLAG_TELE) - { - if(pTilemapItem->m_Version <= 2) - pTilemapItem->m_Tele = *((const int *)(pTilemapItem) + 15); - - pTiles = std::make_shared(m_pEditor, pTilemapItem->m_Width, pTilemapItem->m_Height); - MakeTeleLayer(pTiles); - } - else if(pTilemapItem->m_Flags & TILESLAYERFLAG_SPEEDUP) - { - if(pTilemapItem->m_Version <= 2) - pTilemapItem->m_Speedup = *((const int *)(pTilemapItem) + 16); - - pTiles = std::make_shared(m_pEditor, pTilemapItem->m_Width, pTilemapItem->m_Height); - MakeSpeedupLayer(pTiles); - } - else if(pTilemapItem->m_Flags & TILESLAYERFLAG_FRONT) - { - if(pTilemapItem->m_Version <= 2) - pTilemapItem->m_Front = *((const int *)(pTilemapItem) + 17); - - pTiles = std::make_shared(m_pEditor, pTilemapItem->m_Width, pTilemapItem->m_Height); - MakeFrontLayer(pTiles); - } - else if(pTilemapItem->m_Flags & TILESLAYERFLAG_SWITCH) - { - if(pTilemapItem->m_Version <= 2) - pTilemapItem->m_Switch = *((const int *)(pTilemapItem) + 18); - - pTiles = std::make_shared(m_pEditor, pTilemapItem->m_Width, pTilemapItem->m_Height); - MakeSwitchLayer(pTiles); - } - else if(pTilemapItem->m_Flags & TILESLAYERFLAG_TUNE) - { - if(pTilemapItem->m_Version <= 2) - pTilemapItem->m_Tune = *((const int *)(pTilemapItem) + 19); - - pTiles = std::make_shared(m_pEditor, pTilemapItem->m_Width, pTilemapItem->m_Height); - MakeTuneLayer(pTiles); - } - else - { - pTiles = std::make_shared(m_pEditor, pTilemapItem->m_Width, pTilemapItem->m_Height); - pTiles->m_pEditor = m_pEditor; - pTiles->m_Color = pTilemapItem->m_Color; - pTiles->m_ColorEnv = pTilemapItem->m_ColorEnv; - pTiles->m_ColorEnvOffset = pTilemapItem->m_ColorEnvOffset; - } - - pTiles->m_Flags = pLayerItem->m_Flags; - - pGroup->AddLayer(pTiles); - pTiles->m_Image = pTilemapItem->m_Image; - pTiles->m_Game = pTilemapItem->m_Flags & TILESLAYERFLAG_GAME; - - // load layer name - if(pTilemapItem->m_Version >= 3) - IntsToStr(pTilemapItem->m_aName, std::size(pTilemapItem->m_aName), pTiles->m_aName, std::size(pTiles->m_aName)); - - if(pTiles->m_Tele) - { - void *pTeleData = DataFile.GetData(pTilemapItem->m_Tele); - unsigned int Size = DataFile.GetDataSize(pTilemapItem->m_Tele); - if(Size >= (size_t)pTiles->m_Width * pTiles->m_Height * sizeof(CTeleTile)) - { - CTeleTile *pLayerTeleTiles = std::static_pointer_cast(pTiles)->m_pTeleTile; - mem_copy(pLayerTeleTiles, pTeleData, (size_t)pTiles->m_Width * pTiles->m_Height * sizeof(CTeleTile)); - - for(int i = 0; i < pTiles->m_Width * pTiles->m_Height; i++) - { - if(IsValidTeleTile(pLayerTeleTiles[i].m_Type)) - pTiles->m_pTiles[i].m_Index = pLayerTeleTiles[i].m_Type; - else - pTiles->m_pTiles[i].m_Index = 0; - } - } - DataFile.UnloadData(pTilemapItem->m_Tele); - } - else if(pTiles->m_Speedup) - { - void *pSpeedupData = DataFile.GetData(pTilemapItem->m_Speedup); - unsigned int Size = DataFile.GetDataSize(pTilemapItem->m_Speedup); - - if(Size >= (size_t)pTiles->m_Width * pTiles->m_Height * sizeof(CSpeedupTile)) - { - CSpeedupTile *pLayerSpeedupTiles = std::static_pointer_cast(pTiles)->m_pSpeedupTile; - mem_copy(pLayerSpeedupTiles, pSpeedupData, (size_t)pTiles->m_Width * pTiles->m_Height * sizeof(CSpeedupTile)); - - for(int i = 0; i < pTiles->m_Width * pTiles->m_Height; i++) - { - if(IsValidSpeedupTile(pLayerSpeedupTiles[i].m_Type) && pLayerSpeedupTiles[i].m_Force > 0) - pTiles->m_pTiles[i].m_Index = pLayerSpeedupTiles[i].m_Type; - else - pTiles->m_pTiles[i].m_Index = 0; - } - } - - DataFile.UnloadData(pTilemapItem->m_Speedup); - } - else if(pTiles->m_Front) - { - void *pFrontData = DataFile.GetData(pTilemapItem->m_Front); - unsigned int Size = DataFile.GetDataSize(pTilemapItem->m_Front); - pTiles->ExtractTiles(pTilemapItem->m_Version, (CTile *)pFrontData, Size); - DataFile.UnloadData(pTilemapItem->m_Front); - } - else if(pTiles->m_Switch) - { - void *pSwitchData = DataFile.GetData(pTilemapItem->m_Switch); - unsigned int Size = DataFile.GetDataSize(pTilemapItem->m_Switch); - if(Size >= (size_t)pTiles->m_Width * pTiles->m_Height * sizeof(CSwitchTile)) - { - CSwitchTile *pLayerSwitchTiles = std::static_pointer_cast(pTiles)->m_pSwitchTile; - mem_copy(pLayerSwitchTiles, pSwitchData, (size_t)pTiles->m_Width * pTiles->m_Height * sizeof(CSwitchTile)); - - for(int i = 0; i < pTiles->m_Width * pTiles->m_Height; i++) - { - if(((pLayerSwitchTiles[i].m_Type > (ENTITY_CRAZY_SHOTGUN + ENTITY_OFFSET) && pLayerSwitchTiles[i].m_Type < (ENTITY_DRAGGER_WEAK + ENTITY_OFFSET)) || pLayerSwitchTiles[i].m_Type == (ENTITY_LASER_O_FAST + 1 + ENTITY_OFFSET))) - continue; - else if(pLayerSwitchTiles[i].m_Type >= (ENTITY_ARMOR_1 + ENTITY_OFFSET) && pLayerSwitchTiles[i].m_Type <= (ENTITY_DOOR + ENTITY_OFFSET)) - { - pTiles->m_pTiles[i].m_Index = pLayerSwitchTiles[i].m_Type; - pTiles->m_pTiles[i].m_Flags = pLayerSwitchTiles[i].m_Flags; - continue; - } - - if(IsValidSwitchTile(pLayerSwitchTiles[i].m_Type)) - { - pTiles->m_pTiles[i].m_Index = pLayerSwitchTiles[i].m_Type; - pTiles->m_pTiles[i].m_Flags = pLayerSwitchTiles[i].m_Flags; - } - } - } - DataFile.UnloadData(pTilemapItem->m_Switch); - } - else if(pTiles->m_Tune) - { - void *pTuneData = DataFile.GetData(pTilemapItem->m_Tune); - unsigned int Size = DataFile.GetDataSize(pTilemapItem->m_Tune); - if(Size >= (size_t)pTiles->m_Width * pTiles->m_Height * sizeof(CTuneTile)) - { - CTuneTile *pLayerTuneTiles = std::static_pointer_cast(pTiles)->m_pTuneTile; - mem_copy(pLayerTuneTiles, pTuneData, (size_t)pTiles->m_Width * pTiles->m_Height * sizeof(CTuneTile)); - - for(int i = 0; i < pTiles->m_Width * pTiles->m_Height; i++) - { - if(IsValidTuneTile(pLayerTuneTiles[i].m_Type)) - pTiles->m_pTiles[i].m_Index = pLayerTuneTiles[i].m_Type; - else - pTiles->m_pTiles[i].m_Index = 0; - } - } - DataFile.UnloadData(pTilemapItem->m_Tune); - } - else // regular tile layer or game layer - { - void *pData = DataFile.GetData(pTilemapItem->m_Data); - unsigned int Size = DataFile.GetDataSize(pTilemapItem->m_Data); - pTiles->ExtractTiles(pTilemapItem->m_Version, (CTile *)pData, Size); - - if(pTiles->m_Game && pTilemapItem->m_Version == MakeVersion(1, *pTilemapItem)) - { - for(int i = 0; i < pTiles->m_Width * pTiles->m_Height; i++) - { - if(pTiles->m_pTiles[i].m_Index) - pTiles->m_pTiles[i].m_Index += ENTITY_OFFSET; - } - } - DataFile.UnloadData(pTilemapItem->m_Data); - } - } - else if(pLayerItem->m_Type == LAYERTYPE_QUADS) - { - const CMapItemLayerQuads *pQuadsItem = (CMapItemLayerQuads *)pLayerItem; - - std::shared_ptr pQuads = std::make_shared(m_pEditor); - pQuads->m_Flags = pLayerItem->m_Flags; - pQuads->m_Image = pQuadsItem->m_Image; - if(pQuads->m_Image < -1 || pQuads->m_Image >= (int)m_vpImages.size()) - pQuads->m_Image = -1; - - // load layer name - if(pQuadsItem->m_Version >= 2) - IntsToStr(pQuadsItem->m_aName, std::size(pQuadsItem->m_aName), pQuads->m_aName, std::size(pQuads->m_aName)); - - if(pQuadsItem->m_NumQuads > 0) - { - void *pData = DataFile.GetDataSwapped(pQuadsItem->m_Data); - pQuads->m_vQuads.resize(pQuadsItem->m_NumQuads); - mem_copy(pQuads->m_vQuads.data(), pData, sizeof(CQuad) * pQuadsItem->m_NumQuads); - DataFile.UnloadData(pQuadsItem->m_Data); - } - - pGroup->AddLayer(pQuads); - } - else if(pLayerItem->m_Type == LAYERTYPE_SOUNDS) - { - const CMapItemLayerSounds *pSoundsItem = (CMapItemLayerSounds *)pLayerItem; - if(pSoundsItem->m_Version < 1 || pSoundsItem->m_Version > CMapItemLayerSounds::CURRENT_VERSION) - continue; - - std::shared_ptr pSounds = std::make_shared(m_pEditor); - pSounds->m_Flags = pLayerItem->m_Flags; - pSounds->m_Sound = pSoundsItem->m_Sound; - - // validate m_Sound - if(pSounds->m_Sound < -1 || pSounds->m_Sound >= (int)m_vpSounds.size()) - pSounds->m_Sound = -1; - - // load layer name - IntsToStr(pSoundsItem->m_aName, std::size(pSoundsItem->m_aName), pSounds->m_aName, std::size(pSounds->m_aName)); - - // load data - if(pSoundsItem->m_NumSources > 0) - { - void *pData = DataFile.GetDataSwapped(pSoundsItem->m_Data); - pSounds->m_vSources.resize(pSoundsItem->m_NumSources); - mem_copy(pSounds->m_vSources.data(), pData, sizeof(CSoundSource) * pSoundsItem->m_NumSources); - DataFile.UnloadData(pSoundsItem->m_Data); - } - - pGroup->AddLayer(pSounds); - } - else if(pLayerItem->m_Type == LAYERTYPE_SOUNDS_DEPRECATED) - { - // compatibility with old sound layers - const CMapItemLayerSounds *pSoundsItem = (CMapItemLayerSounds *)pLayerItem; - if(pSoundsItem->m_Version < 1 || pSoundsItem->m_Version > CMapItemLayerSounds::CURRENT_VERSION) - continue; - - std::shared_ptr pSounds = std::make_shared(m_pEditor); - pSounds->m_Flags = pLayerItem->m_Flags; - pSounds->m_Sound = pSoundsItem->m_Sound; - - // validate m_Sound - if(pSounds->m_Sound < -1 || pSounds->m_Sound >= (int)m_vpSounds.size()) - pSounds->m_Sound = -1; - - // load layer name - IntsToStr(pSoundsItem->m_aName, std::size(pSoundsItem->m_aName), pSounds->m_aName, std::size(pSounds->m_aName)); - - // load data - CSoundSource_DEPRECATED *pData = (CSoundSource_DEPRECATED *)DataFile.GetDataSwapped(pSoundsItem->m_Data); - pGroup->AddLayer(pSounds); - pSounds->m_vSources.resize(pSoundsItem->m_NumSources); - - for(int i = 0; i < pSoundsItem->m_NumSources; i++) - { - CSoundSource_DEPRECATED *pOldSource = &pData[i]; - - CSoundSource &Source = pSounds->m_vSources[i]; - Source.m_Position = pOldSource->m_Position; - Source.m_Loop = pOldSource->m_Loop; - Source.m_Pan = true; - Source.m_TimeDelay = pOldSource->m_TimeDelay; - Source.m_Falloff = 0; - - Source.m_PosEnv = pOldSource->m_PosEnv; - Source.m_PosEnvOffset = pOldSource->m_PosEnvOffset; - Source.m_SoundEnv = pOldSource->m_SoundEnv; - Source.m_SoundEnvOffset = pOldSource->m_SoundEnvOffset; - - Source.m_Shape.m_Type = CSoundShape::SHAPE_CIRCLE; - Source.m_Shape.m_Circle.m_Radius = pOldSource->m_FalloffDistance; - } - - DataFile.UnloadData(pSoundsItem->m_Data); - } - } - } - } - - // load envelopes - { - const CMapBasedEnvelopePointAccess EnvelopePoints(&DataFile); - - int EnvStart, EnvNum; - DataFile.GetType(MAPITEMTYPE_ENVELOPE, &EnvStart, &EnvNum); - for(int e = 0; e < EnvNum; e++) - { - CMapItemEnvelope *pItem = (CMapItemEnvelope *)DataFile.GetItem(EnvStart + e); - int Channels = pItem->m_Channels; - if(Channels <= 0 || Channels == 2 || Channels > CEnvPoint::MAX_CHANNELS) - { - // Fall back to showing all channels if the number of channels is unsupported - Channels = CEnvPoint::MAX_CHANNELS; - } - if(Channels != pItem->m_Channels) - { - char aBuf[128]; - str_format(aBuf, sizeof(aBuf), "Error: Envelope %d had an invalid number of channels, %d, which was changed to %d.", e, pItem->m_Channels, Channels); - ErrorHandler(aBuf); - } - - std::shared_ptr pEnv = std::make_shared(Channels); - pEnv->m_vPoints.resize(pItem->m_NumPoints); - for(int p = 0; p < pItem->m_NumPoints; p++) - { - const CEnvPoint *pPoint = EnvelopePoints.GetPoint(pItem->m_StartPoint + p); - if(pPoint != nullptr) - mem_copy(&pEnv->m_vPoints[p], pPoint, sizeof(CEnvPoint)); - const CEnvPointBezier *pPointBezier = EnvelopePoints.GetBezier(pItem->m_StartPoint + p); - if(pPointBezier != nullptr) - mem_copy(&pEnv->m_vPoints[p].m_Bezier, pPointBezier, sizeof(CEnvPointBezier)); - } - if(pItem->m_aName[0] != -1) // compatibility with old maps - IntsToStr(pItem->m_aName, std::size(pItem->m_aName), pEnv->m_aName, std::size(pEnv->m_aName)); - m_vpEnvelopes.push_back(pEnv); - if(pItem->m_Version >= CMapItemEnvelope_v2::CURRENT_VERSION) - pEnv->m_Synchronized = pItem->m_Synchronized; - } - } - - // load automapper configurations - { - int AutomapperConfigStart, AutomapperConfigNum; - DataFile.GetType(MAPITEMTYPE_AUTOMAPPER_CONFIG, &AutomapperConfigStart, &AutomapperConfigNum); - for(int i = 0; i < AutomapperConfigNum; i++) - { - CMapItemAutoMapperConfig *pItem = (CMapItemAutoMapperConfig *)DataFile.GetItem(AutomapperConfigStart + i); - if(pItem->m_Version == CMapItemAutoMapperConfig::CURRENT_VERSION) - { - if(pItem->m_GroupId >= 0 && (size_t)pItem->m_GroupId < m_vpGroups.size() && - pItem->m_LayerId >= 0 && (size_t)pItem->m_LayerId < m_vpGroups[pItem->m_GroupId]->m_vpLayers.size()) - { - std::shared_ptr pLayer = m_vpGroups[pItem->m_GroupId]->m_vpLayers[pItem->m_LayerId]; - if(pLayer->m_Type == LAYERTYPE_TILES) - { - std::shared_ptr pTiles = std::static_pointer_cast(m_vpGroups[pItem->m_GroupId]->m_vpLayers[pItem->m_LayerId]); - // only load auto mappers for tile layers (not physics layers) - if(!(pTiles->m_Game || pTiles->m_Tele || pTiles->m_Speedup || - pTiles->m_Front || pTiles->m_Switch || pTiles->m_Tune)) - { - pTiles->m_AutoMapperConfig = pItem->m_AutomapperConfig; - pTiles->m_Seed = pItem->m_AutomapperSeed; - pTiles->m_AutoAutoMap = !!(pItem->m_Flags & CMapItemAutoMapperConfig::FLAG_AUTOMATIC); - } - } - } - } - } - } - - PerformSanityChecks(ErrorHandler); - - m_Modified = false; - m_ModifiedAuto = false; - m_LastModifiedTime = -1.0f; - m_LastSaveTime = m_pEditor->Client()->GlobalTime(); - return true; -} - -void CEditorMap::PerformSanityChecks(const std::function &ErrorHandler) -{ - // Check if there are any images with a width or height that is not divisible by 16 which are - // used in tile layers. Reset the image for these layers, to prevent crashes with some drivers. - size_t ImageIndex = 0; - for(const std::shared_ptr &pImage : m_vpImages) - { - if(pImage->m_Width % 16 != 0 || pImage->m_Height % 16 != 0) - { - size_t GroupIndex = 0; - for(const std::shared_ptr &pGroup : m_vpGroups) - { - size_t LayerIndex = 0; - for(const std::shared_ptr &pLayer : pGroup->m_vpLayers) - { - if(pLayer->m_Type == LAYERTYPE_TILES) - { - std::shared_ptr pLayerTiles = std::static_pointer_cast(pLayer); - if(pLayerTiles->m_Image >= 0 && (size_t)pLayerTiles->m_Image == ImageIndex) - { - pLayerTiles->m_Image = -1; - char aBuf[IO_MAX_PATH_LENGTH + 128]; - str_format(aBuf, sizeof(aBuf), "Error: The image '%s' (size %" PRIzu "x%" PRIzu ") has a width or height that is not divisible by 16 and therefore cannot be used for tile layers. The image of layer #%" PRIzu " '%s' in group #%" PRIzu " '%s' has been unset.", pImage->m_aName, pImage->m_Width, pImage->m_Height, LayerIndex, pLayer->m_aName, GroupIndex, pGroup->m_aName); - ErrorHandler(aBuf); - } - } - ++LayerIndex; - } - ++GroupIndex; - } - } - ++ImageIndex; - } -} diff --git a/src/game/editor/mapitems/sound.cpp b/src/game/editor/mapitems/sound.cpp deleted file mode 100644 index 33b260091e..0000000000 --- a/src/game/editor/mapitems/sound.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "sound.h" - -#include - -CEditorSound::CEditorSound(CEditor *pEditor) -{ - OnInit(pEditor); -} - -CEditorSound::~CEditorSound() -{ - Sound()->UnloadSample(m_SoundId); - free(m_pData); - m_pData = nullptr; -} diff --git a/src/game/editor/mapitems/sound.h b/src/game/editor/mapitems/sound.h deleted file mode 100644 index 360d545468..0000000000 --- a/src/game/editor/mapitems/sound.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef GAME_EDITOR_MAPITEMS_SOUND_H -#define GAME_EDITOR_MAPITEMS_SOUND_H - -#include -#include - -class CEditorSound : public CEditorComponent -{ -public: - explicit CEditorSound(CEditor *pEditor); - ~CEditorSound(); - - int m_SoundId = -1; - char m_aName[IO_MAX_PATH_LENGTH] = ""; - - void *m_pData = nullptr; - unsigned m_DataSize = 0; -}; - -#endif diff --git a/src/game/editor/popups.cpp b/src/game/editor/popups.cpp deleted file mode 100644 index 11801145b2..0000000000 --- a/src/game/editor/popups.cpp +++ /dev/null @@ -1,2927 +0,0 @@ -/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ -/* If you are missing that file, acquire a complete release at teeworlds.com. */ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "editor.h" -#include "editor_actions.h" - -using namespace FontIcons; - -CUi::EPopupMenuFunctionResult CEditor::PopupMenuFile(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - static int s_NewMapButton = 0; - static int s_SaveButton = 0; - static int s_SaveAsButton = 0; - static int s_SaveCopyButton = 0; - static int s_OpenButton = 0; - static int s_OpenCurrentMapButton = 0; - static int s_AppendButton = 0; - static int s_ExitButton = 0; - - CUIRect Slot; - View.HSplitTop(12.0f, &Slot, &View); - if(pEditor->DoButton_MenuItem(&s_NewMapButton, "New", 0, &Slot, 0, "Creates a new map (ctrl+n)")) - { - if(pEditor->HasUnsavedData()) - { - pEditor->m_PopupEventType = POPEVENT_NEW; - pEditor->m_PopupEventActivated = true; - } - else - { - pEditor->Reset(); - pEditor->m_aFileName[0] = 0; - } - return CUi::POPUP_CLOSE_CURRENT; - } - - View.HSplitTop(10.0f, nullptr, &View); - View.HSplitTop(12.0f, &Slot, &View); - if(pEditor->DoButton_MenuItem(&s_OpenButton, "Load", 0, &Slot, 0, "Opens a map for editing (ctrl+l)")) - { - if(pEditor->HasUnsavedData()) - { - pEditor->m_PopupEventType = POPEVENT_LOAD; - pEditor->m_PopupEventActivated = true; - } - else - pEditor->InvokeFileDialog(IStorage::TYPE_ALL, FILETYPE_MAP, "Load map", "Load", "maps", false, CEditor::CallbackOpenMap, pEditor); - return CUi::POPUP_CLOSE_CURRENT; - } - - View.HSplitTop(2.0f, nullptr, &View); - View.HSplitTop(12.0f, &Slot, &View); - if(pEditor->DoButton_MenuItem(&s_OpenCurrentMapButton, pEditor->m_QuickActionLoadCurrentMap.Label(), 0, &Slot, 0, pEditor->m_QuickActionLoadCurrentMap.Description())) - { - pEditor->m_QuickActionLoadCurrentMap.Call(); - return CUi::POPUP_CLOSE_CURRENT; - } - - View.HSplitTop(10.0f, nullptr, &View); - View.HSplitTop(12.0f, &Slot, &View); - if(pEditor->DoButton_MenuItem(&s_AppendButton, "Append", 0, &Slot, 0, "Opens a map and adds everything from that map to the current one (ctrl+a)")) - { - pEditor->InvokeFileDialog(IStorage::TYPE_ALL, FILETYPE_MAP, "Append map", "Append", "maps", false, CEditor::CallbackAppendMap, pEditor); - return CUi::POPUP_CLOSE_CURRENT; - } - - View.HSplitTop(10.0f, nullptr, &View); - View.HSplitTop(12.0f, &Slot, &View); - if(pEditor->DoButton_MenuItem(&s_SaveButton, "Save", 0, &Slot, 0, "Saves the current map (ctrl+s)")) - { - if(pEditor->m_aFileName[0] && pEditor->m_ValidSaveFilename) - { - str_copy(pEditor->m_aFileSaveName, pEditor->m_aFileName); - pEditor->m_PopupEventType = POPEVENT_SAVE; - pEditor->m_PopupEventActivated = true; - } - else - pEditor->InvokeFileDialog(IStorage::TYPE_SAVE, FILETYPE_MAP, "Save map", "Save", "maps", false, CEditor::CallbackSaveMap, pEditor); - return CUi::POPUP_CLOSE_CURRENT; - } - - View.HSplitTop(2.0f, nullptr, &View); - View.HSplitTop(12.0f, &Slot, &View); - if(pEditor->DoButton_MenuItem(&s_SaveAsButton, pEditor->m_QuickActionSaveAs.Label(), 0, &Slot, 0, pEditor->m_QuickActionSaveAs.Description())) - { - pEditor->m_QuickActionSaveAs.Call(); - return CUi::POPUP_CLOSE_CURRENT; - } - - View.HSplitTop(2.0f, nullptr, &View); - View.HSplitTop(12.0f, &Slot, &View); - if(pEditor->DoButton_MenuItem(&s_SaveCopyButton, "Save Copy", 0, &Slot, 0, "Saves a copy of the current map under a new name (ctrl+shift+alt+s)")) - { - pEditor->InvokeFileDialog(IStorage::TYPE_SAVE, FILETYPE_MAP, "Save map", "Save", "maps", true, CEditor::CallbackSaveCopyMap, pEditor); - return CUi::POPUP_CLOSE_CURRENT; - } - - View.HSplitTop(10.0f, nullptr, &View); - View.HSplitTop(12.0f, &Slot, &View); - if(pEditor->DoButton_MenuItem(&pEditor->m_QuickActionMapDetails, pEditor->m_QuickActionMapDetails.Label(), 0, &Slot, 0, pEditor->m_QuickActionMapDetails.Description())) - { - pEditor->m_QuickActionMapDetails.Call(); - return CUi::POPUP_CLOSE_CURRENT; - } - - View.HSplitTop(10.0f, nullptr, &View); - View.HSplitTop(12.0f, &Slot, &View); - if(pEditor->DoButton_MenuItem(&s_ExitButton, "Exit", 0, &Slot, 0, "Exits from the editor")) - { - if(pEditor->HasUnsavedData()) - { - pEditor->m_PopupEventType = POPEVENT_EXIT; - pEditor->m_PopupEventActivated = true; - } - else - { - pEditor->OnClose(); - g_Config.m_ClEditor = 0; - } - return CUi::POPUP_CLOSE_CURRENT; - } - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupMenuTools(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - CUIRect Slot; - View.HSplitTop(12.0f, &Slot, &View); - static int s_RemoveUnusedEnvelopesButton = 0; - static CUi::SConfirmPopupContext s_ConfirmPopupContext; - if(pEditor->DoButton_MenuItem(&s_RemoveUnusedEnvelopesButton, "Remove unused envelopes", 0, &Slot, 0, "Removes all unused envelopes from the map")) - { - s_ConfirmPopupContext.Reset(); - s_ConfirmPopupContext.YesNoButtons(); - str_copy(s_ConfirmPopupContext.m_aMessage, "Are you sure that you want to remove all unused envelopes from this map?"); - pEditor->Ui()->ShowPopupConfirm(Slot.x + Slot.w, Slot.y, &s_ConfirmPopupContext); - } - if(s_ConfirmPopupContext.m_Result == CUi::SConfirmPopupContext::CONFIRMED) - pEditor->RemoveUnusedEnvelopes(); - if(s_ConfirmPopupContext.m_Result != CUi::SConfirmPopupContext::UNSET) - { - s_ConfirmPopupContext.Reset(); - return CUi::POPUP_CLOSE_CURRENT; - } - - static int s_BorderButton = 0; - View.HSplitTop(2.0f, nullptr, &View); - View.HSplitTop(12.0f, &Slot, &View); - if(pEditor->DoButton_MenuItem(&s_BorderButton, "Place Border", 0, &Slot, 0, "Place tiles in a 2-tile wide border at the edges of the layer")) - { - std::shared_ptr pT = std::static_pointer_cast(pEditor->GetSelectedLayerType(0, LAYERTYPE_TILES)); - if(pT && !pT->m_Tele && !pT->m_Speedup && !pT->m_Switch && !pT->m_Front && !pT->m_Tune) - { - pEditor->m_PopupEventType = POPEVENT_PLACE_BORDER_TILES; - pEditor->m_PopupEventActivated = true; - } - else - { - static CUi::SMessagePopupContext s_MessagePopupContext; - s_MessagePopupContext.DefaultColor(pEditor->m_pTextRender); - str_copy(s_MessagePopupContext.m_aMessage, "No tile layer selected"); - pEditor->Ui()->ShowPopupMessage(Slot.x, Slot.y + Slot.h, &s_MessagePopupContext); - } - } - - static int s_GotoButton = 0; - View.HSplitTop(2.0f, nullptr, &View); - View.HSplitTop(12.0f, &Slot, &View); - if(pEditor->DoButton_MenuItem(&s_GotoButton, "Goto XY", 0, &Slot, 0, "Go to a specified coordinate point on the map")) - { - static SPopupMenuId s_PopupGotoId; - pEditor->Ui()->DoPopupMenu(&s_PopupGotoId, Slot.x, Slot.y + Slot.h, 120, 52, pEditor, PopupGoto); - } - - static int s_TileartButton = 0; - View.HSplitTop(2.0f, nullptr, &View); - View.HSplitTop(12.0f, &Slot, &View); - if(pEditor->DoButton_MenuItem(&s_TileartButton, "Add tileart", 0, &Slot, 0, "Generate tileart from image")) - { - pEditor->InvokeFileDialog(IStorage::TYPE_ALL, FILETYPE_IMG, "Add tileart", "Open", "mapres", false, CallbackAddTileart, pEditor); - return CUi::POPUP_CLOSE_CURRENT; - } - - return CUi::POPUP_KEEP_OPEN; -} - -static int EntitiesListdirCallback(const char *pName, int IsDir, int StorageType, void *pUser) -{ - CEditor *pEditor = (CEditor *)pUser; - if(!IsDir && str_endswith(pName, ".png")) - { - std::string Name = pName; - pEditor->m_vSelectEntitiesFiles.push_back(Name.substr(0, Name.length() - 4)); - } - - return 0; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupMenuSettings(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - CUIRect Slot; - View.HSplitTop(12.0f, &Slot, &View); - static int s_EntitiesButtonId = 0; - char aButtonText[64]; - str_format(aButtonText, sizeof(aButtonText), "Entities: %s", pEditor->m_SelectEntitiesImage.c_str()); - if(pEditor->DoButton_MenuItem(&s_EntitiesButtonId, aButtonText, 0, &Slot, 0, "Choose game layer entities image for different gametypes")) - { - pEditor->m_vSelectEntitiesFiles.clear(); - pEditor->Storage()->ListDirectory(IStorage::TYPE_ALL, "editor/entities", EntitiesListdirCallback, pEditor); - std::sort(pEditor->m_vSelectEntitiesFiles.begin(), pEditor->m_vSelectEntitiesFiles.end()); - pEditor->m_vSelectEntitiesFiles.emplace_back("Custom…"); - - static SPopupMenuId s_PopupEntitiesId; - pEditor->Ui()->DoPopupMenu(&s_PopupEntitiesId, Slot.x, Slot.y + Slot.h, 250, pEditor->m_vSelectEntitiesFiles.size() * 14.0f + 10.0f, pEditor, PopupEntities); - } - - View.HSplitTop(2.0f, nullptr, &View); - View.HSplitTop(12.0f, &Slot, &View); - { - Slot.VMargin(5.0f, &Slot); - - CUIRect Label, Selector; - Slot.VSplitMid(&Label, &Selector); - CUIRect No, Yes; - Selector.VSplitMid(&No, &Yes); - - pEditor->Ui()->DoLabel(&Label, "Brush coloring", 10.0f, TEXTALIGN_ML); - static int s_ButtonNo = 0; - static int s_ButtonYes = 0; - if(pEditor->DoButton_Ex(&s_ButtonNo, "No", !pEditor->m_BrushColorEnabled, &No, 0, "Disable brush coloring", IGraphics::CORNER_L)) - { - pEditor->m_BrushColorEnabled = false; - } - if(pEditor->DoButton_Ex(&s_ButtonYes, "Yes", pEditor->m_BrushColorEnabled, &Yes, 0, "Enable brush coloring", IGraphics::CORNER_R)) - { - pEditor->m_BrushColorEnabled = true; - } - } - - View.HSplitTop(2.0f, nullptr, &View); - View.HSplitTop(12.0f, &Slot, &View); - { - Slot.VMargin(5.0f, &Slot); - - CUIRect Label, Selector; - Slot.VSplitMid(&Label, &Selector); - CUIRect No, Yes; - Selector.VSplitMid(&No, &Yes); - - pEditor->Ui()->DoLabel(&Label, "Allow unused", 10.0f, TEXTALIGN_ML); - if(pEditor->m_AllowPlaceUnusedTiles != -1) - { - static int s_ButtonNo = 0; - static int s_ButtonYes = 0; - if(pEditor->DoButton_Ex(&s_ButtonNo, "No", !pEditor->m_AllowPlaceUnusedTiles, &No, 0, "[ctrl+u] Disallow placing unused tiles", IGraphics::CORNER_L)) - { - pEditor->m_AllowPlaceUnusedTiles = false; - } - if(pEditor->DoButton_Ex(&s_ButtonYes, "Yes", pEditor->m_AllowPlaceUnusedTiles, &Yes, 0, "[ctrl+u] Allow placing unused tiles", IGraphics::CORNER_R)) - { - pEditor->m_AllowPlaceUnusedTiles = true; - } - } - } - - View.HSplitTop(2.0f, nullptr, &View); - View.HSplitTop(12.0f, &Slot, &View); - { - Slot.VMargin(5.0f, &Slot); - - CUIRect Label, Selector; - Slot.VSplitMid(&Label, &Selector); - CUIRect Off, Dec, Hex; - Selector.VSplitLeft(Selector.w / 3.0f, &Off, &Selector); - Selector.VSplitMid(&Dec, &Hex); - - pEditor->Ui()->DoLabel(&Label, "Show Info", 10.0f, TEXTALIGN_ML); - static int s_ButtonOff = 0; - static int s_ButtonDec = 0; - static int s_ButtonHex = 0; - CQuickAction *pAction = &pEditor->m_QuickActionShowInfoOff; - if(pEditor->DoButton_Ex(&s_ButtonOff, pAction->LabelShort(), pAction->Active(), &Off, 0, pAction->Description(), IGraphics::CORNER_L)) - { - pAction->Call(); - } - pAction = &pEditor->m_QuickActionShowInfoDec; - if(pEditor->DoButton_Ex(&s_ButtonDec, pAction->LabelShort(), pAction->Active(), &Dec, 0, pAction->Description(), IGraphics::CORNER_NONE)) - { - pAction->Call(); - } - pAction = &pEditor->m_QuickActionShowInfoHex; - if(pEditor->DoButton_Ex(&s_ButtonHex, pAction->LabelShort(), pAction->Active(), &Hex, 0, pAction->Description(), IGraphics::CORNER_R)) - { - pAction->Call(); - } - } - - View.HSplitTop(2.0f, nullptr, &View); - View.HSplitTop(12.0f, &Slot, &View); - { - Slot.VMargin(5.0f, &Slot); - - CUIRect Label, Selector; - Slot.VSplitMid(&Label, &Selector); - CUIRect No, Yes; - Selector.VSplitMid(&No, &Yes); - - pEditor->Ui()->DoLabel(&Label, "Align quads", 10.0f, TEXTALIGN_ML); - - static int s_ButtonNo = 0; - static int s_ButtonYes = 0; - if(pEditor->DoButton_Ex(&s_ButtonNo, "No", !g_Config.m_EdAlignQuads, &No, 0, "Do not perform quad alignment to other quads/points when moving quads", IGraphics::CORNER_L)) - { - g_Config.m_EdAlignQuads = false; - } - if(pEditor->DoButton_Ex(&s_ButtonYes, "Yes", g_Config.m_EdAlignQuads, &Yes, 0, "Allow quad alignment to other quads/points when moving quads", IGraphics::CORNER_R)) - { - g_Config.m_EdAlignQuads = true; - } - } - - View.HSplitTop(2.0f, nullptr, &View); - View.HSplitTop(12.0f, &Slot, &View); - { - Slot.VMargin(5.0f, &Slot); - - CUIRect Label, Selector; - Slot.VSplitMid(&Label, &Selector); - CUIRect No, Yes; - Selector.VSplitMid(&No, &Yes); - - pEditor->Ui()->DoLabel(&Label, "Show quads bounds", 10.0f, TEXTALIGN_ML); - - static int s_ButtonNo = 0; - static int s_ButtonYes = 0; - if(pEditor->DoButton_Ex(&s_ButtonNo, "No", !g_Config.m_EdShowQuadsRect, &No, 0, "Do not show quad bounds when moving quads", IGraphics::CORNER_L)) - { - g_Config.m_EdShowQuadsRect = false; - } - if(pEditor->DoButton_Ex(&s_ButtonYes, "Yes", g_Config.m_EdShowQuadsRect, &Yes, 0, "Show quad bounds when moving quads", IGraphics::CORNER_R)) - { - g_Config.m_EdShowQuadsRect = true; - } - } - - View.HSplitTop(2.0f, nullptr, &View); - View.HSplitTop(12.0f, &Slot, &View); - { - Slot.VMargin(5.0f, &Slot); - - CUIRect Label, Selector; - Slot.VSplitMid(&Label, &Selector); - CUIRect No, Yes; - Selector.VSplitMid(&No, &Yes); - - pEditor->Ui()->DoLabel(&Label, "Auto map reload", 10.0f, TEXTALIGN_ML); - - static int s_ButtonNo = 0; - static int s_ButtonYes = 0; - if(pEditor->DoButton_Ex(&s_ButtonNo, "No", !g_Config.m_EdAutoMapReload, &No, 0, "Do not run 'hot_reload' on the local server while rcon authed on map save", IGraphics::CORNER_L)) - { - g_Config.m_EdAutoMapReload = false; - } - if(pEditor->DoButton_Ex(&s_ButtonYes, "Yes", g_Config.m_EdAutoMapReload, &Yes, 0, "Run 'hot_reload' on the local server while rcon authed on map save", IGraphics::CORNER_R)) - { - g_Config.m_EdAutoMapReload = true; - } - } - - View.HSplitTop(2.0f, nullptr, &View); - View.HSplitTop(12.0f, &Slot, &View); - { - Slot.VMargin(5.0f, &Slot); - - CUIRect Label, Selector; - Slot.VSplitMid(&Label, &Selector); - CUIRect No, Yes; - Selector.VSplitMid(&No, &Yes); - - pEditor->Ui()->DoLabel(&Label, "Select layers by tile", 10.0f, TEXTALIGN_ML); - - static int s_ButtonNo = 0; - static int s_ButtonYes = 0; - if(pEditor->DoButton_Ex(&s_ButtonNo, "No", !g_Config.m_EdLayerSelector, &No, 0, "Do not select layers when Ctrl+right clicking on a tile", IGraphics::CORNER_L)) - { - g_Config.m_EdLayerSelector = false; - } - if(pEditor->DoButton_Ex(&s_ButtonYes, "Yes", g_Config.m_EdLayerSelector, &Yes, 0, "Select layers when Ctrl+right clicking on a tile", IGraphics::CORNER_R)) - { - g_Config.m_EdLayerSelector = true; - } - } - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupGroup(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - // remove group button - CUIRect Button; - View.HSplitBottom(12.0f, &View, &Button); - static int s_DeleteButton = 0; - - // don't allow deletion of game group - if(pEditor->m_Map.m_pGameGroup != pEditor->GetSelectedGroup()) - { - if(pEditor->DoButton_Editor(&s_DeleteButton, "Delete group", 0, &Button, 0, "Delete group")) - { - pEditor->m_EditorHistory.RecordAction(std::make_shared(pEditor, pEditor->m_SelectedGroup, true)); - pEditor->m_Map.DeleteGroup(pEditor->m_SelectedGroup); - pEditor->m_SelectedGroup = maximum(0, pEditor->m_SelectedGroup - 1); - return CUi::POPUP_CLOSE_CURRENT; - } - } - else - { - if(pEditor->DoButton_Editor(&s_DeleteButton, "Clean up game tiles", 0, &Button, 0, "Removes game tiles that aren't based on a layer")) - { - // gather all tile layers - std::vector> vpLayers; - int GameLayerIndex = -1; - for(int LayerIndex = 0; LayerIndex < (int)pEditor->m_Map.m_pGameGroup->m_vpLayers.size(); LayerIndex++) - { - auto &pLayer = pEditor->m_Map.m_pGameGroup->m_vpLayers.at(LayerIndex); - if(pLayer != pEditor->m_Map.m_pGameLayer && pLayer->m_Type == LAYERTYPE_TILES) - vpLayers.push_back(std::static_pointer_cast(pLayer)); - else if(pLayer == pEditor->m_Map.m_pGameLayer) - GameLayerIndex = LayerIndex; - } - - // search for unneeded game tiles - std::shared_ptr pGameLayer = pEditor->m_Map.m_pGameLayer; - for(int y = 0; y < pGameLayer->m_Height; ++y) - { - for(int x = 0; x < pGameLayer->m_Width; ++x) - { - if(pGameLayer->m_pTiles[y * pGameLayer->m_Width + x].m_Index > static_cast(TILE_NOHOOK)) - continue; - - bool Found = false; - for(const auto &pLayer : vpLayers) - { - if(x < pLayer->m_Width && y < pLayer->m_Height && pLayer->m_pTiles[y * pLayer->m_Width + x].m_Index) - { - Found = true; - break; - } - } - - CTile Tile = pGameLayer->GetTile(x, y); - if(!Found && Tile.m_Index != TILE_AIR) - { - Tile.m_Index = TILE_AIR; - pGameLayer->SetTile(x, y, Tile); - pEditor->m_Map.OnModify(); - } - } - } - - if(!pGameLayer->m_TilesHistory.empty()) - { - if(GameLayerIndex == -1) - { - dbg_msg("editor", "failed to record action (GameLayerIndex not found)"); - } - else - { - // record undo - pEditor->m_EditorHistory.RecordAction(std::make_shared(pEditor, pEditor->m_SelectedGroup, GameLayerIndex, "Clean up game tiles", pGameLayer->m_TilesHistory)); - } - pGameLayer->ClearHistory(); - } - - return CUi::POPUP_CLOSE_CURRENT; - } - } - - if(pEditor->GetSelectedGroup()->m_GameGroup && !pEditor->m_Map.m_pTeleLayer) - { - // new tele layer - View.HSplitBottom(5.0f, &View, nullptr); - View.HSplitBottom(12.0f, &View, &Button); - if(pEditor->DoButton_Editor(&pEditor->m_QuickActionAddTeleLayer, pEditor->m_QuickActionAddTeleLayer.Label(), 0, &Button, 0, pEditor->m_QuickActionAddTeleLayer.Description())) - { - pEditor->m_QuickActionAddTeleLayer.Call(); - return CUi::POPUP_CLOSE_CURRENT; - } - } - - if(pEditor->GetSelectedGroup()->m_GameGroup && !pEditor->m_Map.m_pSpeedupLayer) - { - // new speedup layer - View.HSplitBottom(5.0f, &View, nullptr); - View.HSplitBottom(12.0f, &View, &Button); - if(pEditor->DoButton_Editor(&pEditor->m_QuickActionAddSpeedupLayer, pEditor->m_QuickActionAddSpeedupLayer.Label(), 0, &Button, 0, pEditor->m_QuickActionAddSpeedupLayer.Description())) - { - pEditor->m_QuickActionAddSpeedupLayer.Call(); - return CUi::POPUP_CLOSE_CURRENT; - } - } - - if(pEditor->GetSelectedGroup()->m_GameGroup && !pEditor->m_Map.m_pTuneLayer) - { - // new tune layer - View.HSplitBottom(5.0f, &View, nullptr); - View.HSplitBottom(12.0f, &View, &Button); - if(pEditor->DoButton_Editor(&pEditor->m_QuickActionAddTuneLayer, pEditor->m_QuickActionAddTuneLayer.Label(), 0, &Button, 0, pEditor->m_QuickActionAddTuneLayer.Description())) - { - pEditor->m_QuickActionAddTuneLayer.Call(); - return CUi::POPUP_CLOSE_CURRENT; - } - } - - if(pEditor->GetSelectedGroup()->m_GameGroup && !pEditor->m_Map.m_pFrontLayer) - { - // new front layer - View.HSplitBottom(5.0f, &View, nullptr); - View.HSplitBottom(12.0f, &View, &Button); - if(pEditor->DoButton_Editor(&pEditor->m_QuickActionAddFrontLayer, pEditor->m_QuickActionAddFrontLayer.Label(), 0, &Button, 0, pEditor->m_QuickActionAddFrontLayer.Description())) - { - pEditor->m_QuickActionAddFrontLayer.Call(); - return CUi::POPUP_CLOSE_CURRENT; - } - } - - if(pEditor->GetSelectedGroup()->m_GameGroup && !pEditor->m_Map.m_pSwitchLayer) - { - // new Switch layer - View.HSplitBottom(5.0f, &View, nullptr); - View.HSplitBottom(12.0f, &View, &Button); - if(pEditor->DoButton_Editor(&pEditor->m_QuickActionAddSwitchLayer, pEditor->m_QuickActionAddSwitchLayer.Label(), 0, &Button, 0, pEditor->m_QuickActionAddSwitchLayer.Description())) - { - pEditor->m_QuickActionAddSwitchLayer.Call(); - return CUi::POPUP_CLOSE_CURRENT; - } - } - - // new quad layer - View.HSplitBottom(5.0f, &View, nullptr); - View.HSplitBottom(12.0f, &View, &Button); - if(pEditor->DoButton_Editor(&pEditor->m_QuickActionAddQuadsLayer, pEditor->m_QuickActionAddQuadsLayer.Label(), 0, &Button, 0, pEditor->m_QuickActionAddQuadsLayer.Description())) - { - pEditor->m_QuickActionAddQuadsLayer.Call(); - return CUi::POPUP_CLOSE_CURRENT; - } - - // new tile layer - View.HSplitBottom(5.0f, &View, nullptr); - View.HSplitBottom(12.0f, &View, &Button); - if(pEditor->DoButton_Editor(&pEditor->m_QuickActionAddTileLayer, pEditor->m_QuickActionAddTileLayer.Label(), 0, &Button, 0, pEditor->m_QuickActionAddTileLayer.Description())) - { - pEditor->m_QuickActionAddTileLayer.Call(); - return CUi::POPUP_CLOSE_CURRENT; - } - - // new sound layer - View.HSplitBottom(5.0f, &View, nullptr); - View.HSplitBottom(12.0f, &View, &Button); - if(pEditor->DoButton_Editor(&pEditor->m_QuickActionAddSoundLayer, pEditor->m_QuickActionAddSoundLayer.Label(), 0, &Button, 0, pEditor->m_QuickActionAddSoundLayer.Description())) - { - pEditor->m_QuickActionAddSoundLayer.Call(); - return CUi::POPUP_CLOSE_CURRENT; - } - - // group name - if(!pEditor->GetSelectedGroup()->m_GameGroup) - { - View.HSplitBottom(5.0f, &View, nullptr); - View.HSplitBottom(12.0f, &View, &Button); - pEditor->Ui()->DoLabel(&Button, "Name:", 10.0f, TEXTALIGN_ML); - Button.VSplitLeft(40.0f, nullptr, &Button); - static CLineInput s_NameInput; - s_NameInput.SetBuffer(pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->m_aName, sizeof(pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->m_aName)); - if(pEditor->DoEditBox(&s_NameInput, &Button, 10.0f)) - pEditor->m_Map.OnModify(); - } - - CProperty aProps[] = { - {"Order", pEditor->m_SelectedGroup, PROPTYPE_INT, 0, (int)pEditor->m_Map.m_vpGroups.size() - 1}, - {"Pos X", -pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->m_OffsetX, PROPTYPE_INT, -1000000, 1000000}, - {"Pos Y", -pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->m_OffsetY, PROPTYPE_INT, -1000000, 1000000}, - {"Para X", pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->m_ParallaxX, PROPTYPE_INT, -1000000, 1000000}, - {"Para Y", pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->m_ParallaxY, PROPTYPE_INT, -1000000, 1000000}, - {"Use Clipping", pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->m_UseClipping, PROPTYPE_BOOL, 0, 1}, - {"Clip X", pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->m_ClipX, PROPTYPE_INT, -1000000, 1000000}, - {"Clip Y", pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->m_ClipY, PROPTYPE_INT, -1000000, 1000000}, - {"Clip W", pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->m_ClipW, PROPTYPE_INT, 0, 1000000}, - {"Clip H", pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->m_ClipH, PROPTYPE_INT, 0, 1000000}, - {nullptr}, - }; - - // cut the properties that aren't needed - if(pEditor->GetSelectedGroup()->m_GameGroup) - aProps[(int)EGroupProp::PROP_POS_X].m_pName = nullptr; - - static int s_aIds[(int)EGroupProp::NUM_PROPS] = {0}; - int NewVal = 0; - auto [State, Prop] = pEditor->DoPropertiesWithState(&View, aProps, s_aIds, &NewVal); - if(Prop != EGroupProp::PROP_NONE && (State == EEditState::END || State == EEditState::ONE_GO)) - { - pEditor->m_Map.OnModify(); - } - - static CLayerGroupPropTracker s_Tracker(pEditor); - s_Tracker.Begin(pEditor->GetSelectedGroup().get(), Prop, State); - - if(Prop == EGroupProp::PROP_ORDER) - { - pEditor->m_SelectedGroup = pEditor->m_Map.SwapGroups(pEditor->m_SelectedGroup, NewVal); - } - - // these can not be changed on the game group - if(!pEditor->GetSelectedGroup()->m_GameGroup) - { - if(Prop == EGroupProp::PROP_PARA_X) - { - pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->m_ParallaxX = NewVal; - } - else if(Prop == EGroupProp::PROP_PARA_Y) - { - pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->m_ParallaxY = NewVal; - } - else if(Prop == EGroupProp::PROP_POS_X) - { - pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->m_OffsetX = -NewVal; - } - else if(Prop == EGroupProp::PROP_POS_Y) - { - pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->m_OffsetY = -NewVal; - } - else if(Prop == EGroupProp::PROP_USE_CLIPPING) - { - pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->m_UseClipping = NewVal; - } - else if(Prop == EGroupProp::PROP_CLIP_X) - { - pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->m_ClipX = NewVal; - } - else if(Prop == EGroupProp::PROP_CLIP_Y) - { - pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->m_ClipY = NewVal; - } - else if(Prop == EGroupProp::PROP_CLIP_W) - { - pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->m_ClipW = NewVal; - } - else if(Prop == EGroupProp::PROP_CLIP_H) - { - pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->m_ClipH = NewVal; - } - } - - s_Tracker.End(Prop, State); - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupLayer(void *pContext, CUIRect View, bool Active) -{ - SLayerPopupContext *pPopup = (SLayerPopupContext *)pContext; - CEditor *pEditor = pPopup->m_pEditor; - - std::shared_ptr pCurrentGroup = pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]; - std::shared_ptr pCurrentLayer = pEditor->GetSelectedLayer(0); - - if(pPopup->m_vpLayers.size() > 1) - { - return CLayerTiles::RenderCommonProperties(pPopup->m_CommonPropState, pEditor, &View, pPopup->m_vpLayers, pPopup->m_vLayerIndices); - } - - const bool EntitiesLayer = pCurrentLayer->IsEntitiesLayer(); - - // delete button - if(pEditor->m_Map.m_pGameLayer != pCurrentLayer) // entities layers except the game layer can be deleted - { - CUIRect DeleteButton; - View.HSplitBottom(12.0f, &View, &DeleteButton); - if(pEditor->DoButton_Editor(&pEditor->m_QuickActionDeleteLayer, pEditor->m_QuickActionDeleteLayer.Label(), 0, &DeleteButton, 0, pEditor->m_QuickActionDeleteLayer.Description())) - { - pEditor->m_QuickActionDeleteLayer.Call(); - return CUi::POPUP_CLOSE_CURRENT; - } - } - - // duplicate button - if(!EntitiesLayer) // entities layers cannot be duplicated - { - CUIRect DuplicateButton; - View.HSplitBottom(4.0f, &View, nullptr); - View.HSplitBottom(12.0f, &View, &DuplicateButton); - static int s_DuplicationButton = 0; - if(pEditor->DoButton_Editor(&s_DuplicationButton, "Duplicate layer", 0, &DuplicateButton, 0, "Duplicates the layer")) - { - pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->DuplicateLayer(pEditor->m_vSelectedLayers[0]); - pEditor->m_EditorHistory.RecordAction(std::make_shared(pEditor, pEditor->m_SelectedGroup, pEditor->m_vSelectedLayers[0] + 1, true)); - return CUi::POPUP_CLOSE_CURRENT; - } - } - - // layer name - if(!EntitiesLayer) // name cannot be changed for entities layers - { - CUIRect Label, EditBox; - View.HSplitBottom(5.0f, &View, nullptr); - View.HSplitBottom(12.0f, &View, &Label); - Label.VSplitLeft(40.0f, &Label, &EditBox); - pEditor->Ui()->DoLabel(&Label, "Name:", 10.0f, TEXTALIGN_ML); - static CLineInput s_NameInput; - s_NameInput.SetBuffer(pCurrentLayer->m_aName, sizeof(pCurrentLayer->m_aName)); - if(pEditor->DoEditBox(&s_NameInput, &EditBox, 10.0f)) - pEditor->m_Map.OnModify(); - } - - // spacing if any button was rendered - if(!EntitiesLayer || pEditor->m_Map.m_pGameLayer != pCurrentLayer) - View.HSplitBottom(10.0f, &View, nullptr); - - CProperty aProps[] = { - {"Group", pEditor->m_SelectedGroup, PROPTYPE_INT, 0, (int)pEditor->m_Map.m_vpGroups.size() - 1}, - {"Order", pEditor->m_vSelectedLayers[0], PROPTYPE_INT, 0, (int)pCurrentGroup->m_vpLayers.size() - 1}, - {"Detail", pCurrentLayer->m_Flags & LAYERFLAG_DETAIL, PROPTYPE_BOOL, 0, 1}, - {nullptr}, - }; - - // don't use Group and Detail from the selection if this is an entities layer - if(EntitiesLayer) - { - aProps[0].m_Type = PROPTYPE_NULL; - aProps[2].m_Type = PROPTYPE_NULL; - } - - static int s_aIds[(int)ELayerProp::NUM_PROPS] = {0}; - int NewVal = 0; - auto [State, Prop] = pEditor->DoPropertiesWithState(&View, aProps, s_aIds, &NewVal); - if(Prop != ELayerProp::PROP_NONE && (State == EEditState::END || State == EEditState::ONE_GO)) - { - pEditor->m_Map.OnModify(); - } - - static CLayerPropTracker s_Tracker(pEditor); - s_Tracker.Begin(pCurrentLayer.get(), Prop, State); - - if(Prop == ELayerProp::PROP_ORDER) - { - int NewIndex = pCurrentGroup->SwapLayers(pEditor->m_vSelectedLayers[0], NewVal); - pEditor->SelectLayer(NewIndex); - } - else if(Prop == ELayerProp::PROP_GROUP) - { - if(NewVal >= 0 && (size_t)NewVal < pEditor->m_Map.m_vpGroups.size() && NewVal != pEditor->m_SelectedGroup) - { - auto Position = std::find(pCurrentGroup->m_vpLayers.begin(), pCurrentGroup->m_vpLayers.end(), pCurrentLayer); - if(Position != pCurrentGroup->m_vpLayers.end()) - pCurrentGroup->m_vpLayers.erase(Position); - pEditor->m_Map.m_vpGroups[NewVal]->m_vpLayers.push_back(pCurrentLayer); - pEditor->m_SelectedGroup = NewVal; - pEditor->SelectLayer(pEditor->m_Map.m_vpGroups[NewVal]->m_vpLayers.size() - 1); - } - } - else if(Prop == ELayerProp::PROP_HQ) - { - pCurrentLayer->m_Flags &= ~LAYERFLAG_DETAIL; - if(NewVal) - pCurrentLayer->m_Flags |= LAYERFLAG_DETAIL; - } - - s_Tracker.End(Prop, State); - - return pCurrentLayer->RenderProperties(&View); -} - -CUi::EPopupMenuFunctionResult CEditor::PopupQuad(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - std::vector vpQuads = pEditor->GetSelectedQuads(); - if(pEditor->m_SelectedQuadIndex < 0 || pEditor->m_SelectedQuadIndex >= (int)vpQuads.size()) - return CUi::POPUP_CLOSE_CURRENT; - CQuad *pCurrentQuad = vpQuads[pEditor->m_SelectedQuadIndex]; - std::shared_ptr pLayer = std::static_pointer_cast(pEditor->GetSelectedLayerType(0, LAYERTYPE_QUADS)); - - CUIRect Button; - - // delete button - View.HSplitBottom(12.0f, &View, &Button); - static int s_DeleteButton = 0; - if(pEditor->DoButton_Editor(&s_DeleteButton, "Delete", 0, &Button, 0, "Deletes the current quad")) - { - if(pLayer) - { - pEditor->m_Map.OnModify(); - pEditor->DeleteSelectedQuads(); - } - return CUi::POPUP_CLOSE_CURRENT; - } - - // aspect ratio button - View.HSplitBottom(10.0f, &View, nullptr); - View.HSplitBottom(12.0f, &View, &Button); - if(pLayer && pLayer->m_Image >= 0 && (size_t)pLayer->m_Image < pEditor->m_Map.m_vpImages.size()) - { - static int s_AspectRatioButton = 0; - if(pEditor->DoButton_Editor(&s_AspectRatioButton, "Aspect ratio", 0, &Button, 0, "Resizes the current Quad based on the aspect ratio of the image")) - { - pEditor->m_QuadTracker.BeginQuadTrack(pLayer, pEditor->m_vSelectedQuads); - for(auto &pQuad : vpQuads) - { - int Top = pQuad->m_aPoints[0].y; - int Left = pQuad->m_aPoints[0].x; - int Right = pQuad->m_aPoints[0].x; - - for(int k = 1; k < 4; k++) - { - if(pQuad->m_aPoints[k].y < Top) - Top = pQuad->m_aPoints[k].y; - if(pQuad->m_aPoints[k].x < Left) - Left = pQuad->m_aPoints[k].x; - if(pQuad->m_aPoints[k].x > Right) - Right = pQuad->m_aPoints[k].x; - } - - const int Height = (Right - Left) * pEditor->m_Map.m_vpImages[pLayer->m_Image]->m_Height / pEditor->m_Map.m_vpImages[pLayer->m_Image]->m_Width; - - pQuad->m_aPoints[0].x = Left; - pQuad->m_aPoints[0].y = Top; - pQuad->m_aPoints[1].x = Right; - pQuad->m_aPoints[1].y = Top; - pQuad->m_aPoints[2].x = Left; - pQuad->m_aPoints[2].y = Top + Height; - pQuad->m_aPoints[3].x = Right; - pQuad->m_aPoints[3].y = Top + Height; - pEditor->m_Map.OnModify(); - } - pEditor->m_QuadTracker.EndQuadTrack(); - - return CUi::POPUP_CLOSE_CURRENT; - } - } - - // center pivot button - View.HSplitBottom(6.0f, &View, nullptr); - View.HSplitBottom(12.0f, &View, &Button); - static int s_CenterButton = 0; - if(pEditor->DoButton_Editor(&s_CenterButton, "Center pivot", 0, &Button, 0, "Centers the pivot of the current quad")) - { - pEditor->m_QuadTracker.BeginQuadTrack(pLayer, pEditor->m_vSelectedQuads); - int Top = pCurrentQuad->m_aPoints[0].y; - int Left = pCurrentQuad->m_aPoints[0].x; - int Bottom = pCurrentQuad->m_aPoints[0].y; - int Right = pCurrentQuad->m_aPoints[0].x; - - for(int k = 1; k < 4; k++) - { - if(pCurrentQuad->m_aPoints[k].y < Top) - Top = pCurrentQuad->m_aPoints[k].y; - if(pCurrentQuad->m_aPoints[k].x < Left) - Left = pCurrentQuad->m_aPoints[k].x; - if(pCurrentQuad->m_aPoints[k].y > Bottom) - Bottom = pCurrentQuad->m_aPoints[k].y; - if(pCurrentQuad->m_aPoints[k].x > Right) - Right = pCurrentQuad->m_aPoints[k].x; - } - - pCurrentQuad->m_aPoints[4].x = Left + (Right - Left) / 2; - pCurrentQuad->m_aPoints[4].y = Top + (Bottom - Top) / 2; - pEditor->m_QuadTracker.EndQuadTrack(); - pEditor->m_Map.OnModify(); - return CUi::POPUP_CLOSE_CURRENT; - } - - // align button - View.HSplitBottom(6.0f, &View, nullptr); - View.HSplitBottom(12.0f, &View, &Button); - static int s_AlignButton = 0; - if(pEditor->DoButton_Editor(&s_AlignButton, "Align", 0, &Button, 0, "Aligns coordinates of the quad points")) - { - pEditor->m_QuadTracker.BeginQuadTrack(pLayer, pEditor->m_vSelectedQuads); - for(auto &pQuad : vpQuads) - { - for(int k = 1; k < 4; k++) - { - pQuad->m_aPoints[k].x = 1000.0f * (pQuad->m_aPoints[k].x / 1000); - pQuad->m_aPoints[k].y = 1000.0f * (pQuad->m_aPoints[k].y / 1000); - } - pEditor->m_Map.OnModify(); - } - pEditor->m_QuadTracker.EndQuadTrack(); - return CUi::POPUP_CLOSE_CURRENT; - } - - // square button - View.HSplitBottom(6.0f, &View, nullptr); - View.HSplitBottom(12.0f, &View, &Button); - static int s_Button = 0; - if(pEditor->DoButton_Editor(&s_Button, "Square", 0, &Button, 0, "Squares the current quad")) - { - pEditor->m_QuadTracker.BeginQuadTrack(pLayer, pEditor->m_vSelectedQuads); - for(auto &pQuad : vpQuads) - { - int Top = pQuad->m_aPoints[0].y; - int Left = pQuad->m_aPoints[0].x; - int Bottom = pQuad->m_aPoints[0].y; - int Right = pQuad->m_aPoints[0].x; - - for(int k = 1; k < 4; k++) - { - if(pQuad->m_aPoints[k].y < Top) - Top = pQuad->m_aPoints[k].y; - if(pQuad->m_aPoints[k].x < Left) - Left = pQuad->m_aPoints[k].x; - if(pQuad->m_aPoints[k].y > Bottom) - Bottom = pQuad->m_aPoints[k].y; - if(pQuad->m_aPoints[k].x > Right) - Right = pQuad->m_aPoints[k].x; - } - - pQuad->m_aPoints[0].x = Left; - pQuad->m_aPoints[0].y = Top; - pQuad->m_aPoints[1].x = Right; - pQuad->m_aPoints[1].y = Top; - pQuad->m_aPoints[2].x = Left; - pQuad->m_aPoints[2].y = Bottom; - pQuad->m_aPoints[3].x = Right; - pQuad->m_aPoints[3].y = Bottom; - pEditor->m_Map.OnModify(); - } - pEditor->m_QuadTracker.EndQuadTrack(); - return CUi::POPUP_CLOSE_CURRENT; - } - - // slice button - View.HSplitBottom(6.0f, &View, nullptr); - View.HSplitBottom(12.0f, &View, &Button); - static int s_SliceButton = 0; - if(pEditor->DoButton_Editor(&s_SliceButton, "Slice", 0, &Button, 0, "Enables quad knife mode")) - { - pEditor->m_QuadKnifeCount = 0; - pEditor->m_QuadKnifeActive = true; - return CUi::POPUP_CLOSE_CURRENT; - } - - const int NumQuads = pLayer ? (int)pLayer->m_vQuads.size() : 0; - CProperty aProps[] = { - {"Order", pEditor->m_vSelectedQuads[pEditor->m_SelectedQuadIndex], PROPTYPE_INT, 0, NumQuads}, - {"Pos X", fx2i(pCurrentQuad->m_aPoints[4].x), PROPTYPE_INT, -1000000, 1000000}, - {"Pos Y", fx2i(pCurrentQuad->m_aPoints[4].y), PROPTYPE_INT, -1000000, 1000000}, - {"Pos. Env", pCurrentQuad->m_PosEnv + 1, PROPTYPE_ENVELOPE, 0, 0}, - {"Pos. TO", pCurrentQuad->m_PosEnvOffset, PROPTYPE_INT, -1000000, 1000000}, - {"Color Env", pCurrentQuad->m_ColorEnv + 1, PROPTYPE_ENVELOPE, 0, 0}, - {"Color TO", pCurrentQuad->m_ColorEnvOffset, PROPTYPE_INT, -1000000, 1000000}, - {nullptr}, - }; - - static int s_aIds[(int)EQuadProp::NUM_PROPS] = {0}; - int NewVal = 0; - auto [State, Prop] = pEditor->DoPropertiesWithState(&View, aProps, s_aIds, &NewVal); - if(Prop != EQuadProp::PROP_NONE && (State == EEditState::START || State == EEditState::ONE_GO)) - { - pEditor->m_QuadTracker.BeginQuadPropTrack(pLayer, pEditor->m_vSelectedQuads, Prop); - } - - const float OffsetX = i2fx(NewVal) - pCurrentQuad->m_aPoints[4].x; - const float OffsetY = i2fx(NewVal) - pCurrentQuad->m_aPoints[4].y; - - if(Prop == EQuadProp::PROP_ORDER && pLayer) - { - const int QuadIndex = pLayer->SwapQuads(pEditor->m_vSelectedQuads[pEditor->m_SelectedQuadIndex], NewVal); - pEditor->m_vSelectedQuads[pEditor->m_SelectedQuadIndex] = QuadIndex; - } - - for(auto &pQuad : vpQuads) - { - if(Prop == EQuadProp::PROP_POS_X) - { - for(auto &Point : pQuad->m_aPoints) - Point.x += OffsetX; - } - else if(Prop == EQuadProp::PROP_POS_Y) - { - for(auto &Point : pQuad->m_aPoints) - Point.y += OffsetY; - } - else if(Prop == EQuadProp::PROP_POS_ENV) - { - int Index = clamp(NewVal - 1, -1, (int)pEditor->m_Map.m_vpEnvelopes.size() - 1); - int StepDirection = Index < pQuad->m_PosEnv ? -1 : 1; - if(StepDirection != 0) - { - for(; Index >= -1 && Index < (int)pEditor->m_Map.m_vpEnvelopes.size(); Index += StepDirection) - { - if(Index == -1 || pEditor->m_Map.m_vpEnvelopes[Index]->GetChannels() == 3) - { - pQuad->m_PosEnv = Index; - break; - } - } - } - } - else if(Prop == EQuadProp::PROP_POS_ENV_OFFSET) - { - pQuad->m_PosEnvOffset = NewVal; - } - else if(Prop == EQuadProp::PROP_COLOR_ENV) - { - int Index = clamp(NewVal - 1, -1, (int)pEditor->m_Map.m_vpEnvelopes.size() - 1); - int StepDirection = Index < pQuad->m_ColorEnv ? -1 : 1; - if(StepDirection != 0) - { - for(; Index >= -1 && Index < (int)pEditor->m_Map.m_vpEnvelopes.size(); Index += StepDirection) - { - if(Index == -1 || pEditor->m_Map.m_vpEnvelopes[Index]->GetChannels() == 4) - { - pQuad->m_ColorEnv = Index; - break; - } - } - } - } - else if(Prop == EQuadProp::PROP_COLOR_ENV_OFFSET) - { - pQuad->m_ColorEnvOffset = NewVal; - } - } - - if(Prop != EQuadProp::PROP_NONE && (State == EEditState::END || State == EEditState::ONE_GO)) - { - pEditor->m_QuadTracker.EndQuadPropTrack(Prop); - pEditor->m_Map.OnModify(); - } - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupSource(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - CSoundSource *pSource = pEditor->GetSelectedSource(); - if(!pSource) - return CUi::POPUP_CLOSE_CURRENT; - - CUIRect Button; - - // delete button - View.HSplitBottom(12.0f, &View, &Button); - static int s_DeleteButton = 0; - if(pEditor->DoButton_Editor(&s_DeleteButton, "Delete", 0, &Button, 0, "Deletes the current source")) - { - std::shared_ptr pLayer = std::static_pointer_cast(pEditor->GetSelectedLayerType(0, LAYERTYPE_SOUNDS)); - if(pLayer) - { - pEditor->m_EditorHistory.Execute(std::make_shared(pEditor, pEditor->m_SelectedGroup, pEditor->m_vSelectedLayers[0], pEditor->m_SelectedSource)); - } - return CUi::POPUP_CLOSE_CURRENT; - } - - // Sound shape button - CUIRect ShapeButton; - View.HSplitBottom(3.0f, &View, nullptr); - View.HSplitBottom(12.0f, &View, &ShapeButton); - - static const char *s_apShapeNames[CSoundShape::NUM_SHAPES] = { - "Rectangle", - "Circle"}; - - pSource->m_Shape.m_Type = pSource->m_Shape.m_Type % CSoundShape::NUM_SHAPES; // prevent out of array errors - - static int s_ShapeTypeButton = 0; - if(pEditor->DoButton_Editor(&s_ShapeTypeButton, s_apShapeNames[pSource->m_Shape.m_Type], 0, &ShapeButton, 0, "Change shape")) - { - pEditor->m_EditorHistory.Execute(std::make_shared(pEditor, pEditor->m_SelectedGroup, pEditor->m_vSelectedLayers[0], pEditor->m_SelectedSource, CEditorActionEditSoundSource::EEditType::SHAPE, (pSource->m_Shape.m_Type + 1) % CSoundShape::NUM_SHAPES)); - } - - CProperty aProps[] = { - {"Pos X", pSource->m_Position.x / 1000, PROPTYPE_INT, -1000000, 1000000}, - {"Pos Y", pSource->m_Position.y / 1000, PROPTYPE_INT, -1000000, 1000000}, - {"Loop", pSource->m_Loop, PROPTYPE_BOOL, 0, 1}, - {"Pan", pSource->m_Pan, PROPTYPE_BOOL, 0, 1}, - {"Delay", pSource->m_TimeDelay, PROPTYPE_INT, 0, 1000000}, - {"Falloff", pSource->m_Falloff, PROPTYPE_INT, 0, 255}, - {"Pos. Env", pSource->m_PosEnv + 1, PROPTYPE_ENVELOPE, 0, 0}, - {"Pos. TO", pSource->m_PosEnvOffset, PROPTYPE_INT, -1000000, 1000000}, - {"Sound Env", pSource->m_SoundEnv + 1, PROPTYPE_ENVELOPE, 0, 0}, - {"Sound. TO", pSource->m_SoundEnvOffset, PROPTYPE_INT, -1000000, 1000000}, - {nullptr}, - }; - - static int s_aIds[(int)ESoundProp::NUM_PROPS] = {0}; - int NewVal = 0; - auto [State, Prop] = pEditor->DoPropertiesWithState(&View, aProps, s_aIds, &NewVal); - if(Prop != ESoundProp::PROP_NONE && (State == EEditState::END || State == EEditState::ONE_GO)) - { - pEditor->m_Map.OnModify(); - } - - static CSoundSourcePropTracker s_Tracker(pEditor); - s_Tracker.Begin(pSource, Prop, State); - - if(Prop == ESoundProp::PROP_POS_X) - { - pSource->m_Position.x = NewVal * 1000; - } - else if(Prop == ESoundProp::PROP_POS_Y) - { - pSource->m_Position.y = NewVal * 1000; - } - else if(Prop == ESoundProp::PROP_LOOP) - { - pSource->m_Loop = NewVal; - } - else if(Prop == ESoundProp::PROP_PAN) - { - pSource->m_Pan = NewVal; - } - else if(Prop == ESoundProp::PROP_TIME_DELAY) - { - pSource->m_TimeDelay = NewVal; - } - else if(Prop == ESoundProp::PROP_FALLOFF) - { - pSource->m_Falloff = NewVal; - } - else if(Prop == ESoundProp::PROP_POS_ENV) - { - int Index = clamp(NewVal - 1, -1, (int)pEditor->m_Map.m_vpEnvelopes.size() - 1); - const int StepDirection = Index < pSource->m_PosEnv ? -1 : 1; - for(; Index >= -1 && Index < (int)pEditor->m_Map.m_vpEnvelopes.size(); Index += StepDirection) - { - if(Index == -1 || pEditor->m_Map.m_vpEnvelopes[Index]->GetChannels() == 3) - { - pSource->m_PosEnv = Index; - break; - } - } - } - else if(Prop == ESoundProp::PROP_POS_ENV_OFFSET) - { - pSource->m_PosEnvOffset = NewVal; - } - else if(Prop == ESoundProp::PROP_SOUND_ENV) - { - int Index = clamp(NewVal - 1, -1, (int)pEditor->m_Map.m_vpEnvelopes.size() - 1); - const int StepDirection = Index < pSource->m_SoundEnv ? -1 : 1; - for(; Index >= -1 && Index < (int)pEditor->m_Map.m_vpEnvelopes.size(); Index += StepDirection) - { - if(Index == -1 || pEditor->m_Map.m_vpEnvelopes[Index]->GetChannels() == 1) - { - pSource->m_SoundEnv = Index; - break; - } - } - } - else if(Prop == ESoundProp::PROP_SOUND_ENV_OFFSET) - { - pSource->m_SoundEnvOffset = NewVal; - } - - s_Tracker.End(Prop, State); - - // source shape properties - switch(pSource->m_Shape.m_Type) - { - case CSoundShape::SHAPE_CIRCLE: - { - CProperty aCircleProps[] = { - {"Radius", pSource->m_Shape.m_Circle.m_Radius, PROPTYPE_INT, 0, 1000000}, - {nullptr}, - }; - - static int s_aCircleIds[(int)ECircleShapeProp::NUM_CIRCLE_PROPS] = {0}; - NewVal = 0; - auto [LocalState, LocalProp] = pEditor->DoPropertiesWithState(&View, aCircleProps, s_aCircleIds, &NewVal); - if(LocalProp != ECircleShapeProp::PROP_NONE && (LocalState == EEditState::END || LocalState == EEditState::ONE_GO)) - { - pEditor->m_Map.OnModify(); - } - - static CSoundSourceCircleShapePropTracker s_ShapeTracker(pEditor); - s_ShapeTracker.Begin(pSource, LocalProp, LocalState); - - if(LocalProp == ECircleShapeProp::PROP_CIRCLE_RADIUS) - { - pSource->m_Shape.m_Circle.m_Radius = NewVal; - } - - s_ShapeTracker.End(LocalProp, LocalState); - break; - } - - case CSoundShape::SHAPE_RECTANGLE: - { - CProperty aRectangleProps[] = { - {"Width", pSource->m_Shape.m_Rectangle.m_Width / 1024, PROPTYPE_INT, 0, 1000000}, - {"Height", pSource->m_Shape.m_Rectangle.m_Height / 1024, PROPTYPE_INT, 0, 1000000}, - {nullptr}, - }; - - static int s_aRectangleIds[(int)ERectangleShapeProp::NUM_RECTANGLE_PROPS] = {0}; - NewVal = 0; - auto [LocalState, LocalProp] = pEditor->DoPropertiesWithState(&View, aRectangleProps, s_aRectangleIds, &NewVal); - if(LocalProp != ERectangleShapeProp::PROP_NONE && (LocalState == EEditState::END || LocalState == EEditState::ONE_GO)) - { - pEditor->m_Map.OnModify(); - } - - static CSoundSourceRectShapePropTracker s_ShapeTracker(pEditor); - s_ShapeTracker.Begin(pSource, LocalProp, LocalState); - - if(LocalProp == ERectangleShapeProp::PROP_RECTANGLE_WIDTH) - { - pSource->m_Shape.m_Rectangle.m_Width = NewVal * 1024; - } - else if(LocalProp == ERectangleShapeProp::PROP_RECTANGLE_HEIGHT) - { - pSource->m_Shape.m_Rectangle.m_Height = NewVal * 1024; - } - - s_ShapeTracker.End(LocalProp, LocalState); - break; - } - } - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupPoint(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - std::vector vpQuads = pEditor->GetSelectedQuads(); - if(!in_range(pEditor->m_SelectedQuadIndex, 0, vpQuads.size() - 1)) - return CUi::POPUP_CLOSE_CURRENT; - CQuad *pCurrentQuad = vpQuads[pEditor->m_SelectedQuadIndex]; - std::shared_ptr pLayer = std::static_pointer_cast(pEditor->GetSelectedLayerType(0, LAYERTYPE_QUADS)); - - int Color = PackColor(pCurrentQuad->m_aColors[pEditor->m_SelectedQuadPoint]); - - const int X = fx2i(pCurrentQuad->m_aPoints[pEditor->m_SelectedQuadPoint].x); - const int Y = fx2i(pCurrentQuad->m_aPoints[pEditor->m_SelectedQuadPoint].y); - const int TextureU = fx2f(pCurrentQuad->m_aTexcoords[pEditor->m_SelectedQuadPoint].x) * 1024; - const int TextureV = fx2f(pCurrentQuad->m_aTexcoords[pEditor->m_SelectedQuadPoint].y) * 1024; - - CProperty aProps[] = { - {"Pos X", X, PROPTYPE_INT, -1000000, 1000000}, - {"Pos Y", Y, PROPTYPE_INT, -1000000, 1000000}, - {"Color", Color, PROPTYPE_COLOR, 0, 0}, - {"Tex U", TextureU, PROPTYPE_INT, -1000000, 1000000}, - {"Tex V", TextureV, PROPTYPE_INT, -1000000, 1000000}, - {nullptr}, - }; - - static int s_aIds[(int)EQuadPointProp::NUM_PROPS] = {0}; - int NewVal = 0; - auto [State, Prop] = pEditor->DoPropertiesWithState(&View, aProps, s_aIds, &NewVal); - if(Prop != EQuadPointProp::PROP_NONE && (State == EEditState::START || State == EEditState::ONE_GO)) - { - pEditor->m_QuadTracker.BeginQuadPointPropTrack(pLayer, pEditor->m_vSelectedQuads, pEditor->m_SelectedQuadPoints); - pEditor->m_QuadTracker.AddQuadPointPropTrack(Prop); - } - - for(CQuad *pQuad : vpQuads) - { - if(Prop == EQuadPointProp::PROP_POS_X) - { - for(int v = 0; v < 4; v++) - if(pEditor->IsQuadCornerSelected(v)) - pQuad->m_aPoints[v].x = i2fx(fx2i(pQuad->m_aPoints[v].x) + NewVal - X); - } - else if(Prop == EQuadPointProp::PROP_POS_Y) - { - for(int v = 0; v < 4; v++) - if(pEditor->IsQuadCornerSelected(v)) - pQuad->m_aPoints[v].y = i2fx(fx2i(pQuad->m_aPoints[v].y) + NewVal - Y); - } - else if(Prop == EQuadPointProp::PROP_COLOR) - { - for(int v = 0; v < 4; v++) - { - if(pEditor->IsQuadCornerSelected(v)) - { - pQuad->m_aColors[v].r = (NewVal >> 24) & 0xff; - pQuad->m_aColors[v].g = (NewVal >> 16) & 0xff; - pQuad->m_aColors[v].b = (NewVal >> 8) & 0xff; - pQuad->m_aColors[v].a = NewVal & 0xff; - } - } - } - else if(Prop == EQuadPointProp::PROP_TEX_U) - { - for(int v = 0; v < 4; v++) - if(pEditor->IsQuadCornerSelected(v)) - pQuad->m_aTexcoords[v].x = f2fx(fx2f(pQuad->m_aTexcoords[v].x) + (NewVal - TextureU) / 1024.0f); - } - else if(Prop == EQuadPointProp::PROP_TEX_V) - { - for(int v = 0; v < 4; v++) - if(pEditor->IsQuadCornerSelected(v)) - pQuad->m_aTexcoords[v].y = f2fx(fx2f(pQuad->m_aTexcoords[v].y) + (NewVal - TextureV) / 1024.0f); - } - } - - if(Prop != EQuadPointProp::PROP_NONE && (State == EEditState::END || State == EEditState::ONE_GO)) - { - pEditor->m_QuadTracker.EndQuadPointPropTrack(Prop); - pEditor->m_Map.OnModify(); - } - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupEnvPoint(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - if(pEditor->m_SelectedEnvelope < 0 || pEditor->m_SelectedEnvelope >= (int)pEditor->m_Map.m_vpEnvelopes.size()) - return CUi::POPUP_CLOSE_CURRENT; - - const float RowHeight = 12.0f; - CUIRect Row, Label, EditBox; - - pEditor->m_ShowEnvelopePreview = SHOWENV_SELECTED; - - std::shared_ptr pEnvelope = pEditor->m_Map.m_vpEnvelopes[pEditor->m_SelectedEnvelope]; - - if(pEnvelope->GetChannels() == 4 && !pEditor->IsTangentSelected()) - { - View.HSplitTop(RowHeight, &Row, &View); - View.HSplitTop(4.0f, nullptr, &View); - Row.VSplitLeft(60.0f, &Label, &Row); - Row.VSplitLeft(10.0f, nullptr, &EditBox); - pEditor->Ui()->DoLabel(&Label, "Color:", RowHeight - 2.0f, TEXTALIGN_ML); - - const auto SelectedPoint = pEditor->m_vSelectedEnvelopePoints.front(); - const int SelectedIndex = SelectedPoint.first; - auto *pValues = pEnvelope->m_vPoints[SelectedIndex].m_aValues; - const ColorRGBA Color = ColorRGBA(fx2f(pValues[0]), fx2f(pValues[1]), fx2f(pValues[2]), fx2f(pValues[3])); - const auto &&SetColor = [&](ColorRGBA NewColor) { - if(Color == NewColor && pEditor->m_ColorPickerPopupContext.m_State == EEditState::EDITING) - return; - - static int s_Values[4]; - - if(pEditor->m_ColorPickerPopupContext.m_State == EEditState::START || pEditor->m_ColorPickerPopupContext.m_State == EEditState::ONE_GO) - { - for(int Channel = 0; Channel < 4; ++Channel) - s_Values[Channel] = pValues[Channel]; - } - - for(int Channel = 0; Channel < 4; ++Channel) - { - pValues[Channel] = f2fx(NewColor[Channel]); - } - - if(pEditor->m_ColorPickerPopupContext.m_State == EEditState::END || pEditor->m_ColorPickerPopupContext.m_State == EEditState::ONE_GO) - { - std::vector> vpActions(4); - - for(int Channel = 0; Channel < 4; ++Channel) - { - vpActions[Channel] = std::make_shared(pEditor, pEditor->m_SelectedEnvelope, SelectedIndex, Channel, CEditorActionEnvelopeEditPoint::EEditType::VALUE, s_Values[Channel], f2fx(NewColor[Channel])); - } - - char aDisplay[256]; - str_format(aDisplay, sizeof(aDisplay), "Edit color of point %d of envelope %d", SelectedIndex, pEditor->m_SelectedEnvelope); - pEditor->m_EnvelopeEditorHistory.RecordAction(std::make_shared(pEditor, vpActions, aDisplay)); - } - - pEditor->m_UpdateEnvPointInfo = true; - pEditor->m_Map.OnModify(); - }; - static char s_ColorPickerButton; - pEditor->DoColorPickerButton(&s_ColorPickerButton, &EditBox, Color, SetColor); - } - - static CLineInputNumber s_CurValueInput; - static CLineInputNumber s_CurTimeInput; - - static float s_CurrentTime = 0; - static float s_CurrentValue = 0; - - if(pEditor->m_UpdateEnvPointInfo) - { - pEditor->m_UpdateEnvPointInfo = false; - - auto TimeAndValue = pEditor->EnvGetSelectedTimeAndValue(); - int CurrentTime = TimeAndValue.first; - int CurrentValue = TimeAndValue.second; - - // update displayed text - s_CurValueInput.SetFloat(fx2f(CurrentValue)); - s_CurTimeInput.SetFloat(CurrentTime / 1000.0f); - - s_CurrentTime = s_CurTimeInput.GetFloat(); - s_CurrentValue = s_CurValueInput.GetFloat(); - } - - View.HSplitTop(RowHeight, &Row, &View); - Row.VSplitLeft(60.0f, &Label, &Row); - Row.VSplitLeft(10.0f, nullptr, &EditBox); - pEditor->Ui()->DoLabel(&Label, "Value:", RowHeight - 2.0f, TEXTALIGN_ML); - pEditor->DoEditBox(&s_CurValueInput, &EditBox, RowHeight - 2.0f, IGraphics::CORNER_ALL, "The value of the selected envelope point"); - - View.HSplitTop(4.0f, nullptr, &View); - View.HSplitTop(RowHeight, &Row, &View); - Row.VSplitLeft(60.0f, &Label, &Row); - Row.VSplitLeft(10.0f, nullptr, &EditBox); - pEditor->Ui()->DoLabel(&Label, "Time (in s):", RowHeight - 2.0f, TEXTALIGN_ML); - pEditor->DoEditBox(&s_CurTimeInput, &EditBox, RowHeight - 2.0f, IGraphics::CORNER_ALL, "The time of the selected envelope point"); - - if(pEditor->Input()->KeyIsPressed(KEY_RETURN) || pEditor->Input()->KeyIsPressed(KEY_KP_ENTER)) - { - float CurrentTime = s_CurTimeInput.GetFloat(); - float CurrentValue = s_CurValueInput.GetFloat(); - if(!(absolute(CurrentTime - s_CurrentTime) < 0.0001f && absolute(CurrentValue - s_CurrentValue) < 0.0001f)) - { - auto [OldTime, OldValue] = pEditor->EnvGetSelectedTimeAndValue(); - - if(pEditor->IsTangentInSelected()) - { - auto [SelectedIndex, SelectedChannel] = pEditor->m_SelectedTangentInPoint; - - pEditor->m_EnvelopeEditorHistory.Execute(std::make_shared(pEditor, pEditor->m_SelectedEnvelope, SelectedIndex, SelectedChannel, CEditorActionEditEnvelopePointValue::EType::TANGENT_IN, OldTime, OldValue, static_cast(CurrentTime * 1000.0f), f2fx(CurrentValue))); - CurrentTime = (pEnvelope->m_vPoints[SelectedIndex].m_Time + pEnvelope->m_vPoints[SelectedIndex].m_Bezier.m_aInTangentDeltaX[SelectedChannel]) / 1000.0f; - } - else if(pEditor->IsTangentOutSelected()) - { - auto [SelectedIndex, SelectedChannel] = pEditor->m_SelectedTangentOutPoint; - - pEditor->m_EnvelopeEditorHistory.Execute(std::make_shared(pEditor, pEditor->m_SelectedEnvelope, SelectedIndex, SelectedChannel, CEditorActionEditEnvelopePointValue::EType::TANGENT_OUT, OldTime, OldValue, static_cast(CurrentTime * 1000.0f), f2fx(CurrentValue))); - CurrentTime = (pEnvelope->m_vPoints[SelectedIndex].m_Time + pEnvelope->m_vPoints[SelectedIndex].m_Bezier.m_aOutTangentDeltaX[SelectedChannel]) / 1000.0f; - } - else - { - auto [SelectedIndex, SelectedChannel] = pEditor->m_vSelectedEnvelopePoints.front(); - pEditor->m_EnvelopeEditorHistory.Execute(std::make_shared(pEditor, pEditor->m_SelectedEnvelope, SelectedIndex, SelectedChannel, CEditorActionEditEnvelopePointValue::EType::POINT, OldTime, OldValue, static_cast(CurrentTime * 1000.0f), f2fx(CurrentValue))); - - if(SelectedIndex != 0) - { - CurrentTime = pEnvelope->m_vPoints[SelectedIndex].m_Time / 1000.0f; - } - else - { - CurrentTime = 0.0f; - pEnvelope->m_vPoints[SelectedIndex].m_Time = 0.0f; - } - } - - s_CurTimeInput.SetFloat(static_cast(CurrentTime * 1000.0f) / 1000.0f); - s_CurValueInput.SetFloat(fx2f(f2fx(CurrentValue))); - - s_CurrentTime = s_CurTimeInput.GetFloat(); - s_CurrentValue = s_CurValueInput.GetFloat(); - } - } - - View.HSplitTop(6.0f, nullptr, &View); - View.HSplitTop(RowHeight, &Row, &View); - static int s_DeleteButtonId = 0; - const char *pButtonText = pEditor->IsTangentSelected() ? "Reset" : "Delete"; - const char *pTooltip = pEditor->IsTangentSelected() ? "Reset tangent point to default value." : "Delete current envelope point in all channels."; - if(pEditor->DoButton_Editor(&s_DeleteButtonId, pButtonText, 0, &Row, 0, pTooltip)) - { - if(pEditor->IsTangentInSelected()) - { - auto [SelectedIndex, SelectedChannel] = pEditor->m_SelectedTangentInPoint; - pEditor->m_EnvelopeEditorHistory.Execute(std::make_shared(pEditor, pEditor->m_SelectedEnvelope, SelectedIndex, SelectedChannel, true)); - } - else if(pEditor->IsTangentOutSelected()) - { - auto [SelectedIndex, SelectedChannel] = pEditor->m_SelectedTangentOutPoint; - pEditor->m_EnvelopeEditorHistory.Execute(std::make_shared(pEditor, pEditor->m_SelectedEnvelope, SelectedIndex, SelectedChannel, false)); - } - else - { - auto [SelectedIndex, SelectedChannel] = pEditor->m_vSelectedEnvelopePoints.front(); - pEditor->m_EnvelopeEditorHistory.Execute(std::make_shared(pEditor, pEditor->m_SelectedEnvelope, SelectedIndex)); - } - - return CUi::POPUP_CLOSE_CURRENT; - } - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupEnvPointMulti(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - const float RowHeight = 12.0f; - - static int s_CurveButtonId = 0; - CUIRect CurveButton; - View.HSplitTop(RowHeight, &CurveButton, &View); - if(pEditor->DoButton_Editor(&s_CurveButtonId, "Project onto", 0, &CurveButton, 0, "Project all selected envelopes onto the curve between the first and last selected envelope.")) - { - static SPopupMenuId s_PopupCurveTypeId; - pEditor->Ui()->DoPopupMenu(&s_PopupCurveTypeId, pEditor->Ui()->MouseX(), pEditor->Ui()->MouseY(), 80, 80, pEditor, PopupEnvPointCurveType); - } - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupEnvPointCurveType(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - const float RowHeight = 14.0f; - - int CurveType = -1; - - static int s_ButtonLinearId; - CUIRect ButtonLinear; - View.HSplitTop(RowHeight, &ButtonLinear, &View); - if(pEditor->DoButton_MenuItem(&s_ButtonLinearId, "Linear", 0, &ButtonLinear)) - CurveType = CURVETYPE_LINEAR; - - static int s_ButtonSlowId; - CUIRect ButtonSlow; - View.HSplitTop(RowHeight, &ButtonSlow, &View); - if(pEditor->DoButton_MenuItem(&s_ButtonSlowId, "Slow", 0, &ButtonSlow)) - CurveType = CURVETYPE_SLOW; - - static int s_ButtonFastId; - CUIRect ButtonFast; - View.HSplitTop(RowHeight, &ButtonFast, &View); - if(pEditor->DoButton_MenuItem(&s_ButtonFastId, "Fast", 0, &ButtonFast)) - CurveType = CURVETYPE_FAST; - - static int s_ButtonStepId; - CUIRect ButtonStep; - View.HSplitTop(RowHeight, &ButtonStep, &View); - if(pEditor->DoButton_MenuItem(&s_ButtonStepId, "Step", 0, &ButtonStep)) - CurveType = CURVETYPE_STEP; - - static int s_ButtonSmoothId; - CUIRect ButtonSmooth; - View.HSplitTop(RowHeight, &ButtonSmooth, &View); - if(pEditor->DoButton_MenuItem(&s_ButtonSmoothId, "Smooth", 0, &ButtonSmooth)) - CurveType = CURVETYPE_SMOOTH; - - std::vector> vpActions; - - if(CurveType >= 0) - { - std::shared_ptr pEnvelope = pEditor->m_Map.m_vpEnvelopes.at(pEditor->m_SelectedEnvelope); - - for(int c = 0; c < pEnvelope->GetChannels(); c++) - { - int FirstSelectedIndex = pEnvelope->m_vPoints.size(); - int LastSelectedIndex = -1; - for(auto [SelectedIndex, SelectedChannel] : pEditor->m_vSelectedEnvelopePoints) - { - if(SelectedChannel == c) - { - FirstSelectedIndex = minimum(FirstSelectedIndex, SelectedIndex); - LastSelectedIndex = maximum(LastSelectedIndex, SelectedIndex); - } - } - - if(FirstSelectedIndex < (int)pEnvelope->m_vPoints.size() && LastSelectedIndex >= 0 && FirstSelectedIndex != LastSelectedIndex) - { - CEnvPoint FirstPoint = pEnvelope->m_vPoints[FirstSelectedIndex]; - CEnvPoint LastPoint = pEnvelope->m_vPoints[LastSelectedIndex]; - - CEnvelope HelperEnvelope(1); - HelperEnvelope.AddPoint(FirstPoint.m_Time, FirstPoint.m_aValues[c]); - HelperEnvelope.AddPoint(LastPoint.m_Time, LastPoint.m_aValues[c]); - HelperEnvelope.m_vPoints[0].m_Curvetype = CurveType; - - for(auto [SelectedIndex, SelectedChannel] : pEditor->m_vSelectedEnvelopePoints) - { - if(SelectedChannel == c) - { - if(SelectedIndex != FirstSelectedIndex && SelectedIndex != LastSelectedIndex) - { - CEnvPoint &CurrentPoint = pEnvelope->m_vPoints[SelectedIndex]; - ColorRGBA Channels = ColorRGBA(0.0f, 0.0f, 0.0f, 0.0f); - HelperEnvelope.Eval(CurrentPoint.m_Time / 1000.0f, Channels, 1); - int PrevValue = CurrentPoint.m_aValues[c]; - CurrentPoint.m_aValues[c] = f2fx(Channels.r); - vpActions.push_back(std::make_shared(pEditor, pEditor->m_SelectedEnvelope, SelectedIndex, SelectedChannel, CEditorActionEnvelopeEditPoint::EEditType::VALUE, PrevValue, CurrentPoint.m_aValues[c])); - } - } - } - } - } - - if(!vpActions.empty()) - { - pEditor->m_EnvelopeEditorHistory.RecordAction(std::make_shared(pEditor, vpActions, "Project points")); - } - - pEditor->m_Map.OnModify(); - return CUi::POPUP_CLOSE_CURRENT; - } - - return CUi::POPUP_KEEP_OPEN; -} - -static const auto &&gs_ModifyIndexDeleted = [](int DeletedIndex) { - return [DeletedIndex](int *pIndex) { - if(*pIndex == DeletedIndex) - *pIndex = -1; - else if(*pIndex > DeletedIndex) - *pIndex = *pIndex - 1; - }; -}; - -CUi::EPopupMenuFunctionResult CEditor::PopupImage(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - static int s_ExternalButton = 0; - static int s_ReimportButton = 0; - static int s_ReplaceButton = 0; - static int s_RemoveButton = 0; - static int s_ExportButton = 0; - - const float RowHeight = 12.0f; - - CUIRect Slot; - View.HSplitTop(RowHeight, &Slot, &View); - std::shared_ptr pImg = pEditor->m_Map.m_vpImages[pEditor->m_SelectedImage]; - - if(!pImg->m_External) - { - CUIRect Label, EditBox; - - static CLineInput s_RenameInput; - - Slot.VMargin(5.0f, &Slot); - Slot.VSplitLeft(35.0f, &Label, &Slot); - Slot.VSplitLeft(RowHeight - 2.0f, nullptr, &EditBox); - pEditor->Ui()->DoLabel(&Label, "Name:", RowHeight - 2.0f, TEXTALIGN_ML); - - s_RenameInput.SetBuffer(pImg->m_aName, sizeof(pImg->m_aName)); - if(pEditor->DoEditBox(&s_RenameInput, &EditBox, RowHeight - 2.0f)) - pEditor->m_Map.OnModify(); - - View.HSplitTop(5.0f, nullptr, &View); - View.HSplitTop(RowHeight, &Slot, &View); - } - - if(pImg->m_External) - { - if(pEditor->DoButton_MenuItem(&s_ExternalButton, "Embed", 0, &Slot, 0, "Embeds the image into the map file.")) - { - if(pImg->m_pData == nullptr) - { - pEditor->ShowFileDialogError("Embedding is not possible because the image could not be loaded."); - return CUi::POPUP_KEEP_OPEN; - } - pImg->m_External = 0; - return CUi::POPUP_CLOSE_CURRENT; - } - View.HSplitTop(5.0f, nullptr, &View); - View.HSplitTop(RowHeight, &Slot, &View); - } - else if(CEditor::IsVanillaImage(pImg->m_aName)) - { - if(pEditor->DoButton_MenuItem(&s_ExternalButton, "Make external", 0, &Slot, 0, "Removes the image from the map file.")) - { - pImg->m_External = 1; - return CUi::POPUP_CLOSE_CURRENT; - } - View.HSplitTop(5.0f, nullptr, &View); - View.HSplitTop(RowHeight, &Slot, &View); - } - - static CUi::SSelectionPopupContext s_SelectionPopupContext; - static CScrollRegion s_SelectionPopupScrollRegion; - s_SelectionPopupContext.m_pScrollRegion = &s_SelectionPopupScrollRegion; - if(pEditor->DoButton_MenuItem(&s_ReimportButton, "Re-import", 0, &Slot, 0, "Re-imports the image from the mapres folder")) - { - char aFilename[IO_MAX_PATH_LENGTH]; - str_format(aFilename, sizeof(aFilename), "%s.png", pImg->m_aName); - s_SelectionPopupContext.Reset(); - std::set EntriesSet; - pEditor->Storage()->FindFiles(aFilename, "mapres", IStorage::TYPE_ALL, &EntriesSet); - for(const auto &Entry : EntriesSet) - s_SelectionPopupContext.m_vEntries.push_back(Entry); - if(s_SelectionPopupContext.m_vEntries.empty()) - { - pEditor->ShowFileDialogError("Error: could not find image '%s' in the mapres folder.", aFilename); - } - else if(s_SelectionPopupContext.m_vEntries.size() == 1) - { - s_SelectionPopupContext.m_pSelection = &s_SelectionPopupContext.m_vEntries.front(); - } - else - { - str_copy(s_SelectionPopupContext.m_aMessage, "Select the wanted image:"); - pEditor->Ui()->ShowPopupSelection(pEditor->Ui()->MouseX(), pEditor->Ui()->MouseY(), &s_SelectionPopupContext); - } - } - if(s_SelectionPopupContext.m_pSelection != nullptr) - { - const bool WasExternal = pImg->m_External; - const bool Result = pEditor->ReplaceImage(s_SelectionPopupContext.m_pSelection->c_str(), IStorage::TYPE_ALL, false); - pImg->m_External = WasExternal; - s_SelectionPopupContext.Reset(); - return Result ? CUi::POPUP_CLOSE_CURRENT : CUi::POPUP_KEEP_OPEN; - } - - View.HSplitTop(5.0f, nullptr, &View); - View.HSplitTop(RowHeight, &Slot, &View); - if(pEditor->DoButton_MenuItem(&s_ReplaceButton, "Replace", 0, &Slot, 0, "Replaces the image with a new one")) - { - pEditor->InvokeFileDialog(IStorage::TYPE_ALL, FILETYPE_IMG, "Replace Image", "Replace", "mapres", false, ReplaceImageCallback, pEditor); - return CUi::POPUP_CLOSE_CURRENT; - } - - View.HSplitTop(5.0f, nullptr, &View); - View.HSplitTop(RowHeight, &Slot, &View); - if(pEditor->DoButton_MenuItem(&s_RemoveButton, "Remove", 0, &Slot, 0, "Removes the image from the map")) - { - pEditor->m_Map.m_vpImages.erase(pEditor->m_Map.m_vpImages.begin() + pEditor->m_SelectedImage); - pEditor->m_Map.ModifyImageIndex(gs_ModifyIndexDeleted(pEditor->m_SelectedImage)); - return CUi::POPUP_CLOSE_CURRENT; - } - - if(!pImg->m_External) - { - View.HSplitTop(5.0f, nullptr, &View); - View.HSplitTop(RowHeight, &Slot, &View); - if(pEditor->DoButton_MenuItem(&s_ExportButton, "Export", 0, &Slot, 0, "Export the image")) - { - if(pImg->m_pData == nullptr) - { - pEditor->ShowFileDialogError("Exporting is not possible because the image could not be loaded."); - return CUi::POPUP_KEEP_OPEN; - } - pEditor->InvokeFileDialog(IStorage::TYPE_SAVE, FILETYPE_IMG, "Save image", "Save", "mapres", false, CallbackSaveImage, pEditor); - pEditor->m_FileDialogFileNameInput.Set(pImg->m_aName); - return CUi::POPUP_CLOSE_CURRENT; - } - } - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupSound(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - static int s_ReimportButton = 0; - static int s_ReplaceButton = 0; - static int s_RemoveButton = 0; - static int s_ExportButton = 0; - - const float RowHeight = 12.0f; - - CUIRect Slot; - View.HSplitTop(RowHeight, &Slot, &View); - std::shared_ptr pSound = pEditor->m_Map.m_vpSounds[pEditor->m_SelectedSound]; - - static CUi::SSelectionPopupContext s_SelectionPopupContext; - static CScrollRegion s_SelectionPopupScrollRegion; - s_SelectionPopupContext.m_pScrollRegion = &s_SelectionPopupScrollRegion; - - CUIRect Label, EditBox; - - static CLineInput s_RenameInput; - - Slot.VMargin(5.0f, &Slot); - Slot.VSplitLeft(35.0f, &Label, &Slot); - Slot.VSplitLeft(RowHeight - 2.0f, nullptr, &EditBox); - pEditor->Ui()->DoLabel(&Label, "Name:", RowHeight - 2.0f, TEXTALIGN_ML); - - s_RenameInput.SetBuffer(pSound->m_aName, sizeof(pSound->m_aName)); - if(pEditor->DoEditBox(&s_RenameInput, &EditBox, RowHeight - 2.0f)) - pEditor->m_Map.OnModify(); - - View.HSplitTop(5.0f, nullptr, &View); - View.HSplitTop(RowHeight, &Slot, &View); - - if(pEditor->DoButton_MenuItem(&s_ReimportButton, "Re-import", 0, &Slot, 0, "Re-imports the sound from the mapres folder")) - { - char aFilename[IO_MAX_PATH_LENGTH]; - str_format(aFilename, sizeof(aFilename), "%s.opus", pSound->m_aName); - s_SelectionPopupContext.Reset(); - std::set EntriesSet; - pEditor->Storage()->FindFiles(aFilename, "mapres", IStorage::TYPE_ALL, &EntriesSet); - for(const auto &Entry : EntriesSet) - s_SelectionPopupContext.m_vEntries.push_back(Entry); - if(s_SelectionPopupContext.m_vEntries.empty()) - { - pEditor->ShowFileDialogError("Error: could not find sound '%s' in the mapres folder.", aFilename); - } - else if(s_SelectionPopupContext.m_vEntries.size() == 1) - { - s_SelectionPopupContext.m_pSelection = &s_SelectionPopupContext.m_vEntries.front(); - } - else - { - str_copy(s_SelectionPopupContext.m_aMessage, "Select the wanted sound:"); - pEditor->Ui()->ShowPopupSelection(pEditor->Ui()->MouseX(), pEditor->Ui()->MouseY(), &s_SelectionPopupContext); - } - } - if(s_SelectionPopupContext.m_pSelection != nullptr) - { - const bool Result = pEditor->ReplaceSound(s_SelectionPopupContext.m_pSelection->c_str(), IStorage::TYPE_ALL, false); - s_SelectionPopupContext.Reset(); - return Result ? CUi::POPUP_CLOSE_CURRENT : CUi::POPUP_KEEP_OPEN; - } - - View.HSplitTop(5.0f, nullptr, &View); - View.HSplitTop(RowHeight, &Slot, &View); - if(pEditor->DoButton_MenuItem(&s_ReplaceButton, "Replace", 0, &Slot, 0, "Replaces the sound with a new one")) - { - pEditor->InvokeFileDialog(IStorage::TYPE_ALL, FILETYPE_SOUND, "Replace sound", "Replace", "mapres", false, ReplaceSoundCallback, pEditor); - return CUi::POPUP_CLOSE_CURRENT; - } - - View.HSplitTop(5.0f, nullptr, &View); - View.HSplitTop(RowHeight, &Slot, &View); - if(pEditor->DoButton_MenuItem(&s_RemoveButton, "Remove", 0, &Slot, 0, "Removes the sound from the map")) - { - pEditor->m_Map.m_vpSounds.erase(pEditor->m_Map.m_vpSounds.begin() + pEditor->m_SelectedSound); - pEditor->m_Map.ModifySoundIndex(gs_ModifyIndexDeleted(pEditor->m_SelectedSound)); - return CUi::POPUP_CLOSE_CURRENT; - } - - View.HSplitTop(5.0f, nullptr, &View); - View.HSplitTop(RowHeight, &Slot, &View); - if(pEditor->DoButton_MenuItem(&s_ExportButton, "Export", 0, &Slot, 0, "Export sound")) - { - if(pSound->m_pData == nullptr) - { - pEditor->ShowFileDialogError("Exporting is not possible because the sound could not be loaded."); - return CUi::POPUP_KEEP_OPEN; - } - pEditor->InvokeFileDialog(IStorage::TYPE_SAVE, FILETYPE_SOUND, "Save sound", "Save", "mapres", false, CallbackSaveSound, pEditor); - pEditor->m_FileDialogFileNameInput.Set(pSound->m_aName); - return CUi::POPUP_CLOSE_CURRENT; - } - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupNewFolder(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - CUIRect Label, ButtonBar, Button; - - View.Margin(10.0f, &View); - View.HSplitBottom(20.0f, &View, &ButtonBar); - - // title - View.HSplitTop(20.0f, &Label, &View); - pEditor->Ui()->DoLabel(&Label, "Create new folder", 20.0f, TEXTALIGN_MC); - View.HSplitTop(10.0f, nullptr, &View); - - // folder name - View.HSplitTop(20.0f, &Label, &View); - pEditor->Ui()->DoLabel(&Label, "Name:", 10.0f, TEXTALIGN_ML); - Label.VSplitLeft(50.0f, nullptr, &Button); - Button.HMargin(2.0f, &Button); - pEditor->DoEditBox(&pEditor->m_FileDialogNewFolderNameInput, &Button, 12.0f); - - // button bar - ButtonBar.VSplitLeft(110.0f, &Button, &ButtonBar); - static int s_CancelButton = 0; - if(pEditor->DoButton_Editor(&s_CancelButton, "Cancel", 0, &Button, 0, nullptr)) - return CUi::POPUP_CLOSE_CURRENT; - - ButtonBar.VSplitRight(110.0f, &ButtonBar, &Button); - static int s_CreateButton = 0; - if(pEditor->DoButton_Editor(&s_CreateButton, "Create", 0, &Button, 0, nullptr) || (Active && pEditor->Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER))) - { - // create the folder - if(!pEditor->m_FileDialogNewFolderNameInput.IsEmpty()) - { - char aBuf[IO_MAX_PATH_LENGTH]; - str_format(aBuf, sizeof(aBuf), "%s/%s", pEditor->m_pFileDialogPath, pEditor->m_FileDialogNewFolderNameInput.GetString()); - if(pEditor->Storage()->CreateFolder(aBuf, IStorage::TYPE_SAVE)) - { - pEditor->FilelistPopulate(IStorage::TYPE_SAVE); - return CUi::POPUP_CLOSE_CURRENT; - } - else - { - pEditor->ShowFileDialogError("Failed to create the folder '%s'.", aBuf); - } - } - } - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupMapInfo(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - CUIRect Label, ButtonBar, Button; - - View.Margin(10.0f, &View); - View.HSplitBottom(20.0f, &View, &ButtonBar); - - // title - View.HSplitTop(20.0f, &Label, &View); - pEditor->Ui()->DoLabel(&Label, "Map details", 20.0f, TEXTALIGN_MC); - View.HSplitTop(10.0f, nullptr, &View); - - // author box - View.HSplitTop(20.0f, &Label, &View); - pEditor->Ui()->DoLabel(&Label, "Author:", 10.0f, TEXTALIGN_ML); - Label.VSplitLeft(60.0f, nullptr, &Button); - Button.HMargin(3.0f, &Button); - static CLineInput s_AuthorInput; - s_AuthorInput.SetBuffer(pEditor->m_Map.m_MapInfoTmp.m_aAuthor, sizeof(pEditor->m_Map.m_MapInfoTmp.m_aAuthor)); - pEditor->DoEditBox(&s_AuthorInput, &Button, 10.0f); - - // version box - View.HSplitTop(20.0f, &Label, &View); - pEditor->Ui()->DoLabel(&Label, "Version:", 10.0f, TEXTALIGN_ML); - Label.VSplitLeft(60.0f, nullptr, &Button); - Button.HMargin(3.0f, &Button); - static CLineInput s_VersionInput; - s_VersionInput.SetBuffer(pEditor->m_Map.m_MapInfoTmp.m_aVersion, sizeof(pEditor->m_Map.m_MapInfoTmp.m_aVersion)); - pEditor->DoEditBox(&s_VersionInput, &Button, 10.0f); - - // credits box - View.HSplitTop(20.0f, &Label, &View); - pEditor->Ui()->DoLabel(&Label, "Credits:", 10.0f, TEXTALIGN_ML); - Label.VSplitLeft(60.0f, nullptr, &Button); - Button.HMargin(3.0f, &Button); - static CLineInput s_CreditsInput; - s_CreditsInput.SetBuffer(pEditor->m_Map.m_MapInfoTmp.m_aCredits, sizeof(pEditor->m_Map.m_MapInfoTmp.m_aCredits)); - pEditor->DoEditBox(&s_CreditsInput, &Button, 10.0f); - - // license box - View.HSplitTop(20.0f, &Label, &View); - pEditor->Ui()->DoLabel(&Label, "License:", 10.0f, TEXTALIGN_ML); - Label.VSplitLeft(60.0f, nullptr, &Button); - Button.HMargin(3.0f, &Button); - static CLineInput s_LicenseInput; - s_LicenseInput.SetBuffer(pEditor->m_Map.m_MapInfoTmp.m_aLicense, sizeof(pEditor->m_Map.m_MapInfoTmp.m_aLicense)); - pEditor->DoEditBox(&s_LicenseInput, &Button, 10.0f); - - // button bar - ButtonBar.VSplitLeft(110.0f, &Label, &ButtonBar); - static int s_CancelButton = 0; - if(pEditor->DoButton_Editor(&s_CancelButton, "Cancel", 0, &Label, 0, nullptr)) - return CUi::POPUP_CLOSE_CURRENT; - - ButtonBar.VSplitRight(110.0f, &ButtonBar, &Label); - static int s_ConfirmButton = 0; - if(pEditor->DoButton_Editor(&s_ConfirmButton, "Confirm", 0, &Label, 0, nullptr) || (Active && pEditor->Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER))) - { - bool AuthorDifferent = str_comp(pEditor->m_Map.m_MapInfoTmp.m_aAuthor, pEditor->m_Map.m_MapInfo.m_aAuthor) != 0; - bool VersionDifferent = str_comp(pEditor->m_Map.m_MapInfoTmp.m_aVersion, pEditor->m_Map.m_MapInfo.m_aVersion) != 0; - bool CreditsDifferent = str_comp(pEditor->m_Map.m_MapInfoTmp.m_aCredits, pEditor->m_Map.m_MapInfo.m_aCredits) != 0; - bool LicenseDifferent = str_comp(pEditor->m_Map.m_MapInfoTmp.m_aLicense, pEditor->m_Map.m_MapInfo.m_aLicense) != 0; - - if(AuthorDifferent || VersionDifferent || CreditsDifferent || LicenseDifferent) - pEditor->m_Map.OnModify(); - - pEditor->m_Map.m_MapInfo.Copy(pEditor->m_Map.m_MapInfoTmp); - return CUi::POPUP_CLOSE_CURRENT; - } - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupEvent(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - const char *pTitle; - const char *pMessage; - char aMessageBuf[128]; - if(pEditor->m_PopupEventType == POPEVENT_EXIT) - { - pTitle = "Exit the editor"; - pMessage = "The map contains unsaved data, you might want to save it before you exit the editor.\n\nContinue anyway?"; - } - else if(pEditor->m_PopupEventType == POPEVENT_LOAD || pEditor->m_PopupEventType == POPEVENT_LOADCURRENT || pEditor->m_PopupEventType == POPEVENT_LOADDROP) - { - pTitle = "Load map"; - pMessage = "The map contains unsaved data, you might want to save it before you load a new map.\n\nContinue anyway?"; - } - else if(pEditor->m_PopupEventType == POPEVENT_NEW) - { - pTitle = "New map"; - pMessage = "The map contains unsaved data, you might want to save it before you create a new map.\n\nContinue anyway?"; - } - else if(pEditor->m_PopupEventType == POPEVENT_SAVE || pEditor->m_PopupEventType == POPEVENT_SAVE_COPY) - { - pTitle = "Save map"; - pMessage = "The file already exists.\n\nDo you want to overwrite the map?"; - } - else if(pEditor->m_PopupEventType == POPEVENT_SAVE_IMG) - { - pTitle = "Save image"; - pMessage = "The file already exists.\n\nDo you want to overwrite the image?"; - } - else if(pEditor->m_PopupEventType == POPEVENT_SAVE_SOUND) - { - pTitle = "Save sound"; - pMessage = "The file already exists.\n\nDo you want to overwrite the sound?"; - } - else if(pEditor->m_PopupEventType == POPEVENT_LARGELAYER) - { - pTitle = "Large layer"; - pMessage = "You are trying to set the height or width of a layer to more than 1000 tiles. This is actually possible, but only rarely necessary. It may cause the editor to work slower and will result in a larger file size as well as higher memory usage for client and server."; - } - else if(pEditor->m_PopupEventType == POPEVENT_PREVENTUNUSEDTILES) - { - pTitle = "Unused tiles disabled"; - pMessage = "Unused tiles can't be placed by default because they could get a use later and then destroy your map.\n\nActivate the 'Allow Unused' setting to be able to place every tile."; - } - else if(pEditor->m_PopupEventType == POPEVENT_IMAGEDIV16) - { - pTitle = "Image width/height"; - pMessage = "The width or height of this image is not divisible by 16. This is required for images used in tile layers."; - } - else if(pEditor->m_PopupEventType == POPEVENT_IMAGE_MAX) - { - pTitle = "Max images"; - str_format(aMessageBuf, sizeof(aMessageBuf), "The client only allows a maximum of %" PRIzu " images.", MAX_MAPIMAGES); - pMessage = aMessageBuf; - } - else if(pEditor->m_PopupEventType == POPEVENT_SOUND_MAX) - { - pTitle = "Max sounds"; - str_format(aMessageBuf, sizeof(aMessageBuf), "The client only allows a maximum of %" PRIzu " sounds.", MAX_MAPSOUNDS); - pMessage = aMessageBuf; - } - else if(pEditor->m_PopupEventType == POPEVENT_PLACE_BORDER_TILES) - { - pTitle = "Place border tiles"; - pMessage = "This is going to overwrite any existing tiles around the edges of the layer.\n\nContinue?"; - } - else if(pEditor->m_PopupEventType == POPEVENT_PIXELART_BIG_IMAGE) - { - pTitle = "Big image"; - pMessage = "The selected image is big. Converting it to tileart may take some time.\n\nContinue anyway?"; - } - else if(pEditor->m_PopupEventType == POPEVENT_PIXELART_MANY_COLORS) - { - pTitle = "Many colors"; - pMessage = "The selected image contains many colors, which will lead to a big mapfile. You may want to consider reducing the number of colors.\n\nContinue anyway?"; - } - else if(pEditor->m_PopupEventType == POPEVENT_PIXELART_TOO_MANY_COLORS) - { - pTitle = "Too many colors"; - pMessage = "The client only supports 64 images but more would be needed to add the selected image as tileart."; - } - else - { - dbg_assert(false, "m_PopupEventType invalid"); - return CUi::POPUP_CLOSE_CURRENT; - } - - CUIRect Label, ButtonBar, Button; - - View.Margin(10.0f, &View); - View.HSplitBottom(20.0f, &View, &ButtonBar); - - // title - View.HSplitTop(20.0f, &Label, &View); - pEditor->Ui()->DoLabel(&Label, pTitle, 20.0f, TEXTALIGN_MC); - - // message - SLabelProperties Props; - Props.m_MaxWidth = View.w; - pEditor->Ui()->DoLabel(&View, pMessage, 10.0f, TEXTALIGN_ML, Props); - - // button bar - ButtonBar.VSplitLeft(110.0f, &Button, &ButtonBar); - if(pEditor->m_PopupEventType != POPEVENT_LARGELAYER && - pEditor->m_PopupEventType != POPEVENT_PREVENTUNUSEDTILES && - pEditor->m_PopupEventType != POPEVENT_IMAGEDIV16 && - pEditor->m_PopupEventType != POPEVENT_IMAGE_MAX && - pEditor->m_PopupEventType != POPEVENT_SOUND_MAX && - pEditor->m_PopupEventType != POPEVENT_PIXELART_TOO_MANY_COLORS) - { - static int s_CancelButton = 0; - if(pEditor->DoButton_Editor(&s_CancelButton, "Cancel", 0, &Button, 0, nullptr)) - { - if(pEditor->m_PopupEventType == POPEVENT_LOADDROP) - pEditor->m_aFileNamePending[0] = 0; - pEditor->m_PopupEventWasActivated = false; - - if(pEditor->m_PopupEventType == POPEVENT_PIXELART_BIG_IMAGE || pEditor->m_PopupEventType == POPEVENT_PIXELART_MANY_COLORS) - { - pEditor->m_TileartImageInfo.Free(); - } - - return CUi::POPUP_CLOSE_CURRENT; - } - } - - ButtonBar.VSplitRight(110.0f, &ButtonBar, &Button); - static int s_ConfirmButton = 0; - if(pEditor->DoButton_Editor(&s_ConfirmButton, "Confirm", 0, &Button, 0, nullptr) || (Active && pEditor->Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER))) - { - if(pEditor->m_PopupEventType == POPEVENT_EXIT) - { - pEditor->OnClose(); - g_Config.m_ClEditor = 0; - } - else if(pEditor->m_PopupEventType == POPEVENT_LOAD) - { - pEditor->InvokeFileDialog(IStorage::TYPE_ALL, FILETYPE_MAP, "Load map", "Load", "maps", false, CEditor::CallbackOpenMap, pEditor); - } - else if(pEditor->m_PopupEventType == POPEVENT_LOADCURRENT) - { - pEditor->LoadCurrentMap(); - } - else if(pEditor->m_PopupEventType == POPEVENT_LOADDROP) - { - int Result = pEditor->Load(pEditor->m_aFileNamePending, IStorage::TYPE_ALL_OR_ABSOLUTE); - if(!Result) - dbg_msg("editor", "editing passed map file '%s' failed", pEditor->m_aFileNamePending); - pEditor->m_aFileNamePending[0] = 0; - } - else if(pEditor->m_PopupEventType == POPEVENT_NEW) - { - pEditor->Reset(); - pEditor->m_aFileName[0] = 0; - } - else if(pEditor->m_PopupEventType == POPEVENT_SAVE) - { - CallbackSaveMap(pEditor->m_aFileSaveName, IStorage::TYPE_SAVE, pEditor); - return CUi::POPUP_CLOSE_CURRENT; - } - else if(pEditor->m_PopupEventType == POPEVENT_SAVE_COPY) - { - CallbackSaveCopyMap(pEditor->m_aFileSaveName, IStorage::TYPE_SAVE, pEditor); - return CUi::POPUP_CLOSE_CURRENT; - } - else if(pEditor->m_PopupEventType == POPEVENT_SAVE_IMG) - { - CallbackSaveImage(pEditor->m_aFileSaveName, IStorage::TYPE_SAVE, pEditor); - return CUi::POPUP_CLOSE_CURRENT; - } - else if(pEditor->m_PopupEventType == POPEVENT_SAVE_SOUND) - { - CallbackSaveSound(pEditor->m_aFileSaveName, IStorage::TYPE_SAVE, pEditor); - return CUi::POPUP_CLOSE_CURRENT; - } - else if(pEditor->m_PopupEventType == POPEVENT_PLACE_BORDER_TILES) - { - pEditor->PlaceBorderTiles(); - } - else if(pEditor->m_PopupEventType == POPEVENT_PIXELART_BIG_IMAGE) - { - pEditor->TileartCheckColors(); - } - else if(pEditor->m_PopupEventType == POPEVENT_PIXELART_MANY_COLORS) - { - pEditor->AddTileart(); - } - pEditor->m_PopupEventWasActivated = false; - return CUi::POPUP_CLOSE_CURRENT; - } - - return CUi::POPUP_KEEP_OPEN; -} - -static int g_SelectImageSelected = -100; -static int g_SelectImageCurrent = -100; - -CUi::EPopupMenuFunctionResult CEditor::PopupSelectImage(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - CUIRect ButtonBar, ImageView; - View.VSplitLeft(150.0f, &ButtonBar, &View); - View.Margin(10.0f, &ImageView); - - int ShowImage = g_SelectImageCurrent; - - const float ButtonHeight = 12.0f; - const float ButtonMargin = 2.0f; - - static CListBox s_ListBox; - s_ListBox.DoStart(ButtonHeight, pEditor->m_Map.m_vpImages.size() + 1, 1, 4, g_SelectImageCurrent + 1, &ButtonBar, false); - s_ListBox.DoAutoSpacing(ButtonMargin); - - for(int i = 0; i <= (int)pEditor->m_Map.m_vpImages.size(); i++) - { - static int s_NoneButton = 0; - CListboxItem Item = s_ListBox.DoNextItem(i == 0 ? (void *)&s_NoneButton : &pEditor->m_Map.m_vpImages[i - 1], (i - 1) == g_SelectImageCurrent, 3.0f); - if(!Item.m_Visible) - continue; - - if(pEditor->Ui()->MouseInside(&Item.m_Rect)) - ShowImage = i - 1; - - CUIRect Label; - Item.m_Rect.VMargin(5.0f, &Label); - - SLabelProperties Props; - Props.m_MaxWidth = Label.w; - Props.m_EllipsisAtEnd = true; - pEditor->Ui()->DoLabel(&Label, i == 0 ? "None" : pEditor->m_Map.m_vpImages[i - 1]->m_aName, EditorFontSizes::MENU, TEXTALIGN_ML, Props); - } - - int NewSelected = s_ListBox.DoEnd() - 1; - if(NewSelected != g_SelectImageCurrent) - g_SelectImageSelected = NewSelected; - - if(ShowImage >= 0 && (size_t)ShowImage < pEditor->m_Map.m_vpImages.size()) - { - if(ImageView.h < ImageView.w) - ImageView.w = ImageView.h; - else - ImageView.h = ImageView.w; - float Max = (float)(maximum(pEditor->m_Map.m_vpImages[ShowImage]->m_Width, pEditor->m_Map.m_vpImages[ShowImage]->m_Height)); - ImageView.w *= pEditor->m_Map.m_vpImages[ShowImage]->m_Width / Max; - ImageView.h *= pEditor->m_Map.m_vpImages[ShowImage]->m_Height / Max; - pEditor->Graphics()->TextureSet(pEditor->m_Map.m_vpImages[ShowImage]->m_Texture); - pEditor->Graphics()->BlendNormal(); - pEditor->Graphics()->WrapClamp(); - pEditor->Graphics()->QuadsBegin(); - IGraphics::CQuadItem QuadItem(ImageView.x, ImageView.y, ImageView.w, ImageView.h); - pEditor->Graphics()->QuadsDrawTL(&QuadItem, 1); - pEditor->Graphics()->QuadsEnd(); - pEditor->Graphics()->WrapNormal(); - } - - return CUi::POPUP_KEEP_OPEN; -} - -void CEditor::PopupSelectImageInvoke(int Current, float x, float y) -{ - static SPopupMenuId s_PopupSelectImageId; - g_SelectImageSelected = -100; - g_SelectImageCurrent = Current; - Ui()->DoPopupMenu(&s_PopupSelectImageId, x, y, 450, 300, this, PopupSelectImage); -} - -int CEditor::PopupSelectImageResult() -{ - if(g_SelectImageSelected == -100) - return -100; - - g_SelectImageCurrent = g_SelectImageSelected; - g_SelectImageSelected = -100; - return g_SelectImageCurrent; -} - -static int g_SelectSoundSelected = -100; -static int g_SelectSoundCurrent = -100; - -CUi::EPopupMenuFunctionResult CEditor::PopupSelectSound(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - const float ButtonHeight = 12.0f; - const float ButtonMargin = 2.0f; - - static CListBox s_ListBox; - s_ListBox.DoStart(ButtonHeight, pEditor->m_Map.m_vpSounds.size() + 1, 1, 4, g_SelectSoundCurrent + 1, &View, false); - s_ListBox.DoAutoSpacing(ButtonMargin); - - for(int i = 0; i <= (int)pEditor->m_Map.m_vpSounds.size(); i++) - { - static int s_NoneButton = 0; - CListboxItem Item = s_ListBox.DoNextItem(i == 0 ? (void *)&s_NoneButton : &pEditor->m_Map.m_vpSounds[i - 1], (i - 1) == g_SelectSoundCurrent, 3.0f); - if(!Item.m_Visible) - continue; - - CUIRect Label; - Item.m_Rect.VMargin(5.0f, &Label); - - SLabelProperties Props; - Props.m_MaxWidth = Label.w; - Props.m_EllipsisAtEnd = true; - pEditor->Ui()->DoLabel(&Label, i == 0 ? "None" : pEditor->m_Map.m_vpSounds[i - 1]->m_aName, EditorFontSizes::MENU, TEXTALIGN_ML, Props); - } - - int NewSelected = s_ListBox.DoEnd() - 1; - if(NewSelected != g_SelectSoundCurrent) - g_SelectSoundSelected = NewSelected; - - return CUi::POPUP_KEEP_OPEN; -} - -void CEditor::PopupSelectSoundInvoke(int Current, float x, float y) -{ - static SPopupMenuId s_PopupSelectSoundId; - g_SelectSoundSelected = -100; - g_SelectSoundCurrent = Current; - Ui()->DoPopupMenu(&s_PopupSelectSoundId, x, y, 150, 300, this, PopupSelectSound); -} - -int CEditor::PopupSelectSoundResult() -{ - if(g_SelectSoundSelected == -100) - return -100; - - g_SelectSoundCurrent = g_SelectSoundSelected; - g_SelectSoundSelected = -100; - return g_SelectSoundCurrent; -} - -static int s_GametileOpSelected = -1; - -static const char *s_apGametileOpButtonNames[] = { - "Air", - "Hookable", - "Death", - "Unhookable", - "Hookthrough", - "Freeze", - "Unfreeze", - "Deep Freeze", - "Deep Unfreeze", - "Blue Check-Tele", - "Red Check-Tele", - "Live Freeze", - "Live Unfreeze", -}; - -CUi::EPopupMenuFunctionResult CEditor::PopupSelectGametileOp(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - const int PreviousSelected = s_GametileOpSelected; - - CUIRect Button; - for(size_t i = 0; i < std::size(s_apGametileOpButtonNames); ++i) - { - View.HSplitTop(2.0f, nullptr, &View); - View.HSplitTop(12.0f, &Button, &View); - if(pEditor->DoButton_Editor(&s_apGametileOpButtonNames[i], s_apGametileOpButtonNames[i], 0, &Button, 0, nullptr)) - s_GametileOpSelected = i; - } - - return s_GametileOpSelected == PreviousSelected ? CUi::POPUP_KEEP_OPEN : CUi::POPUP_CLOSE_CURRENT; -} - -void CEditor::PopupSelectGametileOpInvoke(float x, float y) -{ - static SPopupMenuId s_PopupSelectGametileOpId; - s_GametileOpSelected = -1; - Ui()->DoPopupMenu(&s_PopupSelectGametileOpId, x, y, 120.0f, std::size(s_apGametileOpButtonNames) * 14.0f + 10.0f, this, PopupSelectGametileOp); -} - -int CEditor::PopupSelectGameTileOpResult() -{ - if(s_GametileOpSelected < 0) - return -1; - - int Result = s_GametileOpSelected; - s_GametileOpSelected = -1; - return Result; -} - -static int s_AutoMapConfigSelected = -100; -static int s_AutoMapConfigCurrent = -100; - -CUi::EPopupMenuFunctionResult CEditor::PopupSelectConfigAutoMap(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - std::shared_ptr pLayer = std::static_pointer_cast(pEditor->GetSelectedLayer(0)); - CAutoMapper *pAutoMapper = &pEditor->m_Map.m_vpImages[pLayer->m_Image]->m_AutoMapper; - - const float ButtonHeight = 12.0f; - const float ButtonMargin = 2.0f; - - static CListBox s_ListBox; - s_ListBox.DoStart(ButtonHeight, pAutoMapper->ConfigNamesNum() + 1, 1, 4, s_AutoMapConfigCurrent + 1, &View, false); - s_ListBox.DoAutoSpacing(ButtonMargin); - - for(int i = 0; i < pAutoMapper->ConfigNamesNum() + 1; i++) - { - static int s_NoneButton = 0; - CListboxItem Item = s_ListBox.DoNextItem(i == 0 ? (void *)&s_NoneButton : pAutoMapper->GetConfigName(i - 1), (i - 1) == s_AutoMapConfigCurrent, 3.0f); - if(!Item.m_Visible) - continue; - - CUIRect Label; - Item.m_Rect.VMargin(5.0f, &Label); - - SLabelProperties Props; - Props.m_MaxWidth = Label.w; - Props.m_EllipsisAtEnd = true; - pEditor->Ui()->DoLabel(&Label, i == 0 ? "None" : pAutoMapper->GetConfigName(i - 1), EditorFontSizes::MENU, TEXTALIGN_ML, Props); - } - - int NewSelected = s_ListBox.DoEnd() - 1; - if(NewSelected != s_AutoMapConfigCurrent) - s_AutoMapConfigSelected = NewSelected; - - return CUi::POPUP_KEEP_OPEN; -} - -void CEditor::PopupSelectConfigAutoMapInvoke(int Current, float x, float y) -{ - static SPopupMenuId s_PopupSelectConfigAutoMapId; - s_AutoMapConfigSelected = -100; - s_AutoMapConfigCurrent = Current; - std::shared_ptr pLayer = std::static_pointer_cast(GetSelectedLayer(0)); - const int ItemCount = minimum(m_Map.m_vpImages[pLayer->m_Image]->m_AutoMapper.ConfigNamesNum(), 10); - // Width for buttons is 120, 15 is the scrollbar width, 2 is the margin between both. - Ui()->DoPopupMenu(&s_PopupSelectConfigAutoMapId, x, y, 120.0f + 15.0f + 2.0f, 26.0f + 14.0f * ItemCount, this, PopupSelectConfigAutoMap); -} - -int CEditor::PopupSelectConfigAutoMapResult() -{ - if(s_AutoMapConfigSelected == -100) - return -100; - - s_AutoMapConfigCurrent = s_AutoMapConfigSelected; - s_AutoMapConfigSelected = -100; - return s_AutoMapConfigCurrent; -} - -// DDRace - -CUi::EPopupMenuFunctionResult CEditor::PopupTele(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - static int s_PreviousTeleNumber; - static int s_PreviousCheckpointNumber; - static int s_PreviousViewTeleNumber; - - CUIRect NumberPicker; - CUIRect FindEmptySlot; - CUIRect FindFreeTeleSlot, FindFreeCheckpointSlot, FindFreeViewSlot; - - View.VSplitRight(15.f, &NumberPicker, &FindEmptySlot); - NumberPicker.VSplitRight(2.f, &NumberPicker, nullptr); - - FindEmptySlot.HSplitTop(13.0f, &FindFreeTeleSlot, &FindEmptySlot); - FindEmptySlot.HSplitTop(13.0f, &FindFreeCheckpointSlot, &FindEmptySlot); - FindEmptySlot.HSplitTop(13.0f, &FindFreeViewSlot, &FindEmptySlot); - - FindFreeTeleSlot.HMargin(1.0f, &FindFreeTeleSlot); - FindFreeCheckpointSlot.HMargin(1.0f, &FindFreeCheckpointSlot); - FindFreeViewSlot.HMargin(1.0f, &FindFreeViewSlot); - - auto ViewTele = [](CEditor *pEd) -> bool { - if(!pEd->m_ViewTeleNumber) - return false; - int TeleX, TeleY; - pEd->m_Map.m_pTeleLayer->GetPos(pEd->m_ViewTeleNumber, -1, TeleX, TeleY); - if(TeleX != -1 && TeleY != -1) - { - pEd->MapView()->SetWorldOffset({32.0f * TeleX + 0.5f, 32.0f * TeleY + 0.5f}); - return true; - } - return false; - }; - - static std::vector s_vColors = { - ColorRGBA(0.5f, 1, 0.5f, 0.5f), - ColorRGBA(0.5f, 1, 0.5f, 0.5f), - ColorRGBA(1, 0.5f, 0.5f, 0.5f), - }; - enum - { - PROP_TELE = 0, - PROP_TELE_CP, - PROP_TELE_VIEW, - NUM_PROPS, - }; - - // find next free numbers buttons - { - // Pressing ctrl+f will find next free numbers for both tele and checkpoints - - static int s_NextFreeTelePid = 0; - if(pEditor->DoButton_Editor(&s_NextFreeTelePid, "F", 0, &FindFreeTeleSlot, 0, "[ctrl+f] Find next free tele number") || (Active && pEditor->Input()->ModifierIsPressed() && pEditor->Input()->KeyPress(KEY_F))) - { - int TeleNumber = pEditor->FindNextFreeTeleNumber(); - - if(TeleNumber != -1) - { - pEditor->m_TeleNumber = TeleNumber; - pEditor->AdjustBrushSpecialTiles(false); - } - } - - static int s_NextFreeCheckpointPid = 0; - if(pEditor->DoButton_Editor(&s_NextFreeCheckpointPid, "F", 0, &FindFreeCheckpointSlot, 0, "[ctrl+f] Find next free checkpoint number") || (Active && pEditor->Input()->ModifierIsPressed() && pEditor->Input()->KeyPress(KEY_F))) - { - int CPNumber = pEditor->FindNextFreeTeleNumber(true); - - if(CPNumber != -1) - { - pEditor->m_TeleCheckpointNumber = CPNumber; - pEditor->AdjustBrushSpecialTiles(false); - } - } - - static int s_NextFreeViewPid = 0; - int btn = pEditor->DoButton_Editor(&s_NextFreeViewPid, "N", 0, &FindFreeViewSlot, 0, "[n] Show next tele with this number"); - if(btn || (Active && pEditor->Input()->KeyPress(KEY_N))) - s_vColors[PROP_TELE_VIEW] = ViewTele(pEditor) ? ColorRGBA(0.5f, 1, 0.5f, 0.5f) : ColorRGBA(1, 0.5f, 0.5f, 0.5f); - } - - // number picker - { - CProperty aProps[] = { - {"Number", pEditor->m_TeleNumber, PROPTYPE_INT, 1, 255}, - {"Checkpoint", pEditor->m_TeleCheckpointNumber, PROPTYPE_INT, 1, 255}, - {"View", pEditor->m_ViewTeleNumber, PROPTYPE_INT, 1, 255}, - {nullptr}, - }; - - static int s_aIds[NUM_PROPS] = {0}; - - int NewVal = 0; - int Prop = pEditor->DoProperties(&NumberPicker, aProps, s_aIds, &NewVal, s_vColors); - if(Prop == PROP_TELE) - { - pEditor->m_TeleNumber = (NewVal - 1 + 255) % 255 + 1; - pEditor->AdjustBrushSpecialTiles(false); - } - else if(Prop == PROP_TELE_CP) - { - pEditor->m_TeleCheckpointNumber = (NewVal - 1 + 255) % 255 + 1; - pEditor->AdjustBrushSpecialTiles(false); - } - else if(Prop == PROP_TELE_VIEW) - pEditor->m_ViewTeleNumber = (NewVal - 1 + 255) % 255 + 1; - - if(s_PreviousTeleNumber == 1 || s_PreviousTeleNumber != pEditor->m_TeleNumber) - s_vColors[PROP_TELE] = pEditor->m_Map.m_pTeleLayer->ContainsElementWithId(pEditor->m_TeleNumber, false) ? ColorRGBA(1, 0.5f, 0.5f, 0.5f) : ColorRGBA(0.5f, 1, 0.5f, 0.5f); - - if(s_PreviousCheckpointNumber == 1 || s_PreviousCheckpointNumber != pEditor->m_TeleCheckpointNumber) - s_vColors[PROP_TELE_CP] = pEditor->m_Map.m_pTeleLayer->ContainsElementWithId(pEditor->m_TeleCheckpointNumber, true) ? ColorRGBA(1, 0.5f, 0.5f, 0.5f) : ColorRGBA(0.5f, 1, 0.5f, 0.5f); - - if(s_PreviousViewTeleNumber != pEditor->m_ViewTeleNumber) - s_vColors[PROP_TELE_VIEW] = ViewTele(pEditor) ? ColorRGBA(0.5f, 1, 0.5f, 0.5f) : ColorRGBA(1, 0.5f, 0.5f, 0.5f); - } - - s_PreviousTeleNumber = pEditor->m_TeleNumber; - s_PreviousCheckpointNumber = pEditor->m_TeleCheckpointNumber; - s_PreviousViewTeleNumber = pEditor->m_ViewTeleNumber; - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupSpeedup(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - enum - { - PROP_FORCE = 0, - PROP_MAXSPEED, - PROP_ANGLE, - NUM_PROPS - }; - - CProperty aProps[] = { - {"Force", pEditor->m_SpeedupForce, PROPTYPE_INT, 1, 255}, - {"Max Speed", pEditor->m_SpeedupMaxSpeed, PROPTYPE_INT, 0, 255}, - {"Angle", pEditor->m_SpeedupAngle, PROPTYPE_ANGLE_SCROLL, 0, 359}, - {nullptr}, - }; - - static int s_aIds[NUM_PROPS] = {0}; - int NewVal = 0; - int Prop = pEditor->DoProperties(&View, aProps, s_aIds, &NewVal); - - if(Prop == PROP_FORCE) - { - pEditor->m_SpeedupForce = clamp(NewVal, 1, 255); - } - else if(Prop == PROP_MAXSPEED) - { - pEditor->m_SpeedupMaxSpeed = clamp(NewVal, 0, 255); - } - else if(Prop == PROP_ANGLE) - { - pEditor->m_SpeedupAngle = clamp(NewVal, 0, 359); - } - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupSwitch(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - CUIRect NumberPicker, FindEmptySlot, ViewEmptySlot; - - View.VSplitRight(15.0f, &NumberPicker, &FindEmptySlot); - NumberPicker.VSplitRight(2.0f, &NumberPicker, nullptr); - - FindEmptySlot.HSplitTop(13.0f, &FindEmptySlot, &ViewEmptySlot); - ViewEmptySlot.HSplitTop(13.0f, nullptr, &ViewEmptySlot); - - FindEmptySlot.HMargin(1.0f, &FindEmptySlot); - ViewEmptySlot.HMargin(1.0f, &ViewEmptySlot); - - auto ViewSwitch = [pEditor]() -> bool { - if(!pEditor->m_ViewSwitch) - return false; - ivec2 SwitchPos; - pEditor->m_Map.m_pSwitchLayer->GetPos(pEditor->m_ViewSwitch, -1, SwitchPos); - if(SwitchPos != ivec2(-1, -1)) - { - pEditor->MapView()->SetWorldOffset({32.0f * SwitchPos.x + 0.5f, 32.0f * SwitchPos.y + 0.5f}); - return true; - } - return false; - }; - - static std::vector s_vColors = { - ColorRGBA(1, 1, 1, 0.5f), - ColorRGBA(1, 1, 1, 0.5f), - ColorRGBA(1, 1, 1, 0.5f), - }; - - enum - { - PROP_SWITCH_NUMBER = 0, - PROP_SWITCH_DELAY, - PROP_SWITCH_VIEW, - NUM_PROPS, - }; - - // find empty number button - { - static int s_EmptySlotPid = 0; - if(pEditor->DoButton_Editor(&s_EmptySlotPid, "F", 0, &FindEmptySlot, 0, "[ctrl+f] Find empty slot") || (Active && pEditor->Input()->ModifierIsPressed() && pEditor->Input()->KeyPress(KEY_F))) - { - int Number = pEditor->FindNextFreeSwitchNumber(); - - if(Number != -1) - pEditor->m_SwitchNum = Number; - } - - static int s_NextViewPid = 0; - int ButtonResult = pEditor->DoButton_Editor(&s_NextViewPid, "N", 0, &ViewEmptySlot, 0, "[n] Show next switcher with this number"); - if(ButtonResult || (Active && pEditor->Input()->KeyPress(KEY_N))) - s_vColors[PROP_SWITCH_VIEW] = ViewSwitch() ? ColorRGBA(0.5f, 1, 0.5f, 0.5f) : ColorRGBA(1, 0.5f, 0.5f, 0.5f); - } - - // number picker - static int s_PreviousNumber = -1; - static int s_PreviousView = -1; - { - CProperty aProps[] = { - {"Number", pEditor->m_SwitchNum, PROPTYPE_INT, 0, 255}, - {"Delay", pEditor->m_SwitchDelay, PROPTYPE_INT, 0, 255}, - {"View", pEditor->m_ViewSwitch, PROPTYPE_INT, 0, 255}, - {nullptr}, - }; - - static int s_aIds[NUM_PROPS] = {0}; - int NewVal = 0; - int Prop = pEditor->DoProperties(&NumberPicker, aProps, s_aIds, &NewVal, s_vColors); - - if(Prop == PROP_SWITCH_NUMBER) - { - pEditor->m_SwitchNum = (NewVal + 256) % 256; - } - else if(Prop == PROP_SWITCH_DELAY) - { - pEditor->m_SwitchDelay = (NewVal + 256) % 256; - } - else if(Prop == PROP_SWITCH_VIEW) - { - pEditor->m_ViewSwitch = (NewVal + 256) % 256; - } - - if(s_PreviousNumber == 1 || s_PreviousNumber != pEditor->m_SwitchNum) - s_vColors[PROP_SWITCH_NUMBER] = pEditor->m_Map.m_pSwitchLayer->ContainsElementWithId(pEditor->m_SwitchNum) ? ColorRGBA(1, 0.5f, 0.5f, 0.5f) : ColorRGBA(0.5f, 1, 0.5f, 0.5f); - if(s_PreviousView != pEditor->m_ViewSwitch) - s_vColors[PROP_SWITCH_VIEW] = ViewSwitch() ? ColorRGBA(0.5f, 1, 0.5f, 0.5f) : ColorRGBA(1, 0.5f, 0.5f, 0.5f); - } - - s_PreviousNumber = pEditor->m_SwitchNum; - s_PreviousView = pEditor->m_ViewSwitch; - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupTune(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - enum - { - PROP_TUNE = 0, - NUM_PROPS, - }; - - CProperty aProps[] = { - {"Zone", pEditor->m_TuningNum, PROPTYPE_INT, 1, 255}, - {nullptr}, - }; - - static int s_aIds[NUM_PROPS] = {0}; - int NewVal = 0; - int Prop = pEditor->DoProperties(&View, aProps, s_aIds, &NewVal); - - if(Prop == PROP_TUNE) - { - pEditor->m_TuningNum = (NewVal - 1 + 255) % 255 + 1; - } - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupGoto(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - enum - { - PROP_COORD_X = 0, - PROP_COORD_Y, - NUM_PROPS, - }; - - static ivec2 s_GotoPos(0, 0); - - CProperty aProps[] = { - {"X", s_GotoPos.x, PROPTYPE_INT, std::numeric_limits::min(), std::numeric_limits::max()}, - {"Y", s_GotoPos.y, PROPTYPE_INT, std::numeric_limits::min(), std::numeric_limits::max()}, - {nullptr}, - }; - - static int s_aIds[NUM_PROPS] = {0}; - int NewVal = 0; - int Prop = pEditor->DoProperties(&View, aProps, s_aIds, &NewVal); - - if(Prop == PROP_COORD_X) - { - s_GotoPos.x = NewVal; - } - else if(Prop == PROP_COORD_Y) - { - s_GotoPos.y = NewVal; - } - - CUIRect Button; - View.HSplitBottom(12.0f, &View, &Button); - - static int s_Button; - if(pEditor->DoButton_Editor(&s_Button, "Go", 0, &Button, 0, nullptr)) - { - pEditor->MapView()->SetWorldOffset({32.0f * s_GotoPos.x + 0.5f, 32.0f * s_GotoPos.y + 0.5f}); - } - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupEntities(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - for(size_t i = 0; i < pEditor->m_vSelectEntitiesFiles.size(); i++) - { - CUIRect Button; - View.HSplitTop(14.0f, &Button, &View); - - const char *pName = pEditor->m_vSelectEntitiesFiles[i].c_str(); - if(pEditor->DoButton_MenuItem(pName, pName, pEditor->m_vSelectEntitiesFiles[i] == pEditor->m_SelectEntitiesImage, &Button)) - { - if(pEditor->m_vSelectEntitiesFiles[i] != pEditor->m_SelectEntitiesImage) - { - if(i == pEditor->m_vSelectEntitiesFiles.size() - 1) - { - pEditor->InvokeFileDialog(IStorage::TYPE_ALL, FILETYPE_IMG, "Custom Entities", "Load", "assets/entities", false, CallbackCustomEntities, pEditor); - return CUi::POPUP_CLOSE_CURRENT; - } - - pEditor->m_SelectEntitiesImage = pEditor->m_vSelectEntitiesFiles[i]; - pEditor->m_AllowPlaceUnusedTiles = pEditor->m_SelectEntitiesImage == "DDNet" ? 0 : -1; - pEditor->m_PreventUnusedTilesWasWarned = false; - - pEditor->Graphics()->UnloadTexture(&pEditor->m_EntitiesTexture); - - char aBuf[IO_MAX_PATH_LENGTH]; - str_format(aBuf, sizeof(aBuf), "editor/entities/%s.png", pName); - pEditor->m_EntitiesTexture = pEditor->Graphics()->LoadTexture(aBuf, IStorage::TYPE_ALL, pEditor->GetTextureUsageFlag()); - return CUi::POPUP_CLOSE_CURRENT; - } - } - } - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupProofMode(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - CUIRect Button; - View.HSplitTop(12.0f, &Button, &View); - static int s_ButtonIngame; - if(pEditor->DoButton_MenuItem(&s_ButtonIngame, "Ingame", pEditor->MapView()->ProofMode()->IsModeIngame(), &Button, 0, "These borders represent what a player maximum can see.")) - { - pEditor->MapView()->ProofMode()->SetModeIngame(); - return CUi::POPUP_CLOSE_CURRENT; - } - - View.HSplitTop(2.0f, nullptr, &View); - View.HSplitTop(12.0f, &Button, &View); - static int s_ButtonMenu; - if(pEditor->DoButton_MenuItem(&s_ButtonMenu, "Menu", pEditor->MapView()->ProofMode()->IsModeMenu(), &Button, 0, "These borders represent what will be shown in the menu.")) - { - pEditor->MapView()->ProofMode()->SetModeMenu(); - return CUi::POPUP_CLOSE_CURRENT; - } - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupAnimateSettings(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - constexpr float MIN_ANIM_SPEED = 0.001f; - constexpr float MAX_ANIM_SPEED = 1000000.0f; - - CUIRect Row, Label, ButtonDecrease, EditBox, ButtonIncrease, ButtonReset; - View.HSplitTop(13.0f, &Row, &View); - Row.VSplitMid(&Label, &Row); - Row.HMargin(1.0f, &Row); - Row.VSplitLeft(10.0f, &ButtonDecrease, &Row); - Row.VSplitRight(10.0f, &EditBox, &ButtonIncrease); - View.HSplitBottom(12.0f, &View, &ButtonReset); - pEditor->Ui()->DoLabel(&Label, "Speed", 10.0f, TEXTALIGN_ML); - - static char s_DecreaseButton; - if(pEditor->DoButton_FontIcon(&s_DecreaseButton, FONT_ICON_MINUS, 0, &ButtonDecrease, 0, "Decrease animation speed", IGraphics::CORNER_L, 7.0f)) - { - pEditor->m_AnimateSpeed -= pEditor->m_AnimateSpeed <= 1.0f ? 0.1f : 0.5f; - pEditor->m_AnimateSpeed = maximum(pEditor->m_AnimateSpeed, MIN_ANIM_SPEED); - pEditor->m_AnimateUpdatePopup = true; - } - - static char s_IncreaseButton; - if(pEditor->DoButton_FontIcon(&s_IncreaseButton, FONT_ICON_PLUS, 0, &ButtonIncrease, 0, "Increase animation speed", IGraphics::CORNER_R, 7.0f)) - { - if(pEditor->m_AnimateSpeed < 0.1f) - pEditor->m_AnimateSpeed = 0.1f; - else - pEditor->m_AnimateSpeed += pEditor->m_AnimateSpeed < 1.0f ? 0.1f : 0.5f; - pEditor->m_AnimateSpeed = minimum(pEditor->m_AnimateSpeed, MAX_ANIM_SPEED); - pEditor->m_AnimateUpdatePopup = true; - } - - static char s_DefaultButton; - if(pEditor->DoButton_Ex(&s_DefaultButton, "Default", 0, &ButtonReset, 0, "Normal animation speed", IGraphics::CORNER_ALL)) - { - pEditor->m_AnimateSpeed = 1.0f; - pEditor->m_AnimateUpdatePopup = true; - } - - static CLineInputNumber s_SpeedInput; - if(pEditor->m_AnimateUpdatePopup) - { - s_SpeedInput.SetFloat(pEditor->m_AnimateSpeed); - pEditor->m_AnimateUpdatePopup = false; - } - - if(pEditor->DoEditBox(&s_SpeedInput, &EditBox, 10.0f, IGraphics::CORNER_NONE, "The animation speed")) - { - pEditor->m_AnimateSpeed = clamp(s_SpeedInput.GetFloat(), MIN_ANIM_SPEED, MAX_ANIM_SPEED); - } - - return CUi::POPUP_KEEP_OPEN; -} - -CUi::EPopupMenuFunctionResult CEditor::PopupEnvelopeCurvetype(void *pContext, CUIRect View, bool Active) -{ - CEditor *pEditor = static_cast(pContext); - - if(pEditor->m_SelectedEnvelope < 0 || pEditor->m_SelectedEnvelope >= (int)pEditor->m_Map.m_vpEnvelopes.size()) - { - return CUi::POPUP_CLOSE_CURRENT; - } - std::shared_ptr pEnvelope = pEditor->m_Map.m_vpEnvelopes[pEditor->m_SelectedEnvelope]; - - if(pEditor->m_PopupEnvelopeSelectedPoint < 0 || pEditor->m_PopupEnvelopeSelectedPoint >= (int)pEnvelope->m_vPoints.size()) - { - return CUi::POPUP_CLOSE_CURRENT; - } - CEnvPoint_runtime &SelectedPoint = pEnvelope->m_vPoints[pEditor->m_PopupEnvelopeSelectedPoint]; - - static const char *const TYPE_NAMES[NUM_CURVETYPES] = {"Step", "Linear", "Slow", "Fast", "Smooth", "Bezier"}; - static char s_aButtonIds[NUM_CURVETYPES] = {0}; - - for(int Type = 0; Type < NUM_CURVETYPES; Type++) - { - CUIRect Button; - View.HSplitTop(14.0f, &Button, &View); - - if(pEditor->DoButton_MenuItem(&s_aButtonIds[Type], TYPE_NAMES[Type], Type == SelectedPoint.m_Curvetype, &Button)) - { - const int PrevCurve = SelectedPoint.m_Curvetype; - if(PrevCurve != Type) - { - SelectedPoint.m_Curvetype = Type; - pEditor->m_EnvelopeEditorHistory.RecordAction(std::make_shared(pEditor, - pEditor->m_SelectedEnvelope, pEditor->m_PopupEnvelopeSelectedPoint, 0, CEditorActionEnvelopeEditPoint::EEditType::CURVE_TYPE, PrevCurve, SelectedPoint.m_Curvetype)); - pEditor->m_Map.OnModify(); - return CUi::POPUP_CLOSE_CURRENT; - } - } - } - - return CUi::POPUP_KEEP_OPEN; -} diff --git a/src/game/editor/prompt.cpp b/src/game/editor/prompt.cpp deleted file mode 100644 index 822651e004..0000000000 --- a/src/game/editor/prompt.cpp +++ /dev/null @@ -1,166 +0,0 @@ -#include -#include -#include - -#include "editor.h" - -#include "prompt.h" - -bool FuzzyMatch(const char *pHaystack, const char *pNeedle) -{ - if(!pNeedle || !pNeedle[0]) - return false; - char aBuf[2] = {0}; - const char *pHit = pHaystack; - int NeedleLen = str_length(pNeedle); - for(int i = 0; i < NeedleLen; i++) - { - if(!pHit) - return false; - aBuf[0] = pNeedle[i]; - pHit = str_find_nocase(pHit, aBuf); - if(pHit) - pHit++; - } - return pHit; -} - -bool CPrompt::IsActive() -{ - return CEditorComponent::IsActive() || Editor()->m_Dialog == DIALOG_QUICK_PROMPT; -} - -void CPrompt::SetActive() -{ - Editor()->m_Dialog = DIALOG_QUICK_PROMPT; - CEditorComponent::SetActive(); - - Ui()->SetActiveItem(&m_PromptInput); -} - -void CPrompt::SetInactive() -{ - m_ResetFilterResults = true; - m_PromptInput.Clear(); - if(Editor()->m_Dialog == DIALOG_QUICK_PROMPT) - Editor()->m_Dialog = DIALOG_NONE; - CEditorComponent::SetInactive(); -} - -bool CPrompt::OnInput(const IInput::CEvent &Event) -{ - if(Input()->ModifierIsPressed() && Input()->KeyIsPressed(KEY_P)) - { - SetActive(); - } - return false; -} - -void CPrompt::OnInit(CEditor *pEditor) -{ - CEditorComponent::OnInit(pEditor); - -#define REGISTER_QUICK_ACTION(name, text, callback, disabled, active, button_color, description) m_vQuickActions.emplace_back(&Editor()->m_QuickAction##name); -#include -#undef REGISTER_QUICK_ACTION -} - -void CPrompt::OnRender(CUIRect _) -{ - if(!IsActive()) - return; - - if(Ui()->ConsumeHotkey(CUi::HOTKEY_ESCAPE)) - { - SetInactive(); - return; - } - - static CListBox s_ListBox; - CUIRect Prompt, PromptBox; - CUIRect Suggestions; - - Ui()->MapScreen(); - CUIRect Overlay = *Ui()->Screen(); - - Overlay.Draw(ColorRGBA(0, 0, 0, 0.33f), IGraphics::CORNER_NONE, 0.0f); - CUIRect Background; - Overlay.VMargin(150.0f, &Background); - Background.HMargin(50.0f, &Background); - Background.Draw(ColorRGBA(0, 0, 0, 0.80f), IGraphics::CORNER_ALL, 5.0f); - - Background.Margin(10.0f, &Prompt); - - Prompt.VSplitMid(nullptr, &PromptBox); - - Prompt.HSplitTop(16.0f, &PromptBox, &Suggestions); - PromptBox.Draw(ColorRGBA(0, 0, 0, 0.75f), IGraphics::CORNER_ALL, 2.0f); - Suggestions.y += 6.0f; - - if(Ui()->DoClearableEditBox(&m_PromptInput, &PromptBox, 10.0f) || m_ResetFilterResults) - { - m_PromptSelectedIndex = 0; - m_vpFilteredPromptList.clear(); - if(m_ResetFilterResults && m_pLastAction && !m_pLastAction->Disabled()) - { - m_vpFilteredPromptList.push_back(m_pLastAction); - } - for(auto *pQuickAction : m_vQuickActions) - { - if(pQuickAction->Disabled()) - continue; - - if(m_PromptInput.IsEmpty() || FuzzyMatch(pQuickAction->Label(), m_PromptInput.GetString())) - { - if(!m_ResetFilterResults || pQuickAction != m_pLastAction) - m_vpFilteredPromptList.push_back(pQuickAction); - } - } - m_ResetFilterResults = false; - } - - s_ListBox.SetActive(!Ui()->IsPopupOpen()); - s_ListBox.DoStart(15.0f, m_vpFilteredPromptList.size(), 1, 5, m_PromptSelectedIndex, &Suggestions, false); - - float LabelWidth = Overlay.w > 855.0f ? 200.0f : 100.0f; - - for(size_t i = 0; i < m_vpFilteredPromptList.size(); i++) - { - const CListboxItem Item = s_ListBox.DoNextItem(m_vpFilteredPromptList[i]->ActionButtonId(), m_PromptSelectedIndex >= 0 && (size_t)m_PromptSelectedIndex == i); - if(!Item.m_Visible) - continue; - - CUIRect LabelColumn, DescColumn; - float Margin = 5.0f; - Item.m_Rect.VMargin(Margin, &LabelColumn); - LabelColumn.VSplitLeft(LabelWidth, &LabelColumn, &DescColumn); - DescColumn.VSplitLeft(Margin, nullptr, &DescColumn); - - SLabelProperties Props; - Props.m_MaxWidth = LabelColumn.w; - Props.m_EllipsisAtEnd = true; - Ui()->DoLabel(&LabelColumn, m_vpFilteredPromptList[i]->Label(), 10.0f, TEXTALIGN_ML, Props); - - Props.m_MaxWidth = DescColumn.w; - TextRender()->TextColor(TextRender()->DefaultTextColor().WithAlpha(Item.m_Selected ? 1.0f : 0.8f)); - Ui()->DoLabel(&DescColumn, m_vpFilteredPromptList[i]->Description(), 10.0f, TEXTALIGN_MR, Props); - TextRender()->TextColor(TextRender()->DefaultTextColor()); - } - - const int NewSelected = s_ListBox.DoEnd(); - if(m_PromptSelectedIndex != NewSelected) - { - m_PromptSelectedIndex = NewSelected; - } - - if(s_ListBox.WasItemActivated()) - { - if(m_PromptSelectedIndex >= 0) - { - CQuickAction *pBtn = m_vpFilteredPromptList[m_PromptSelectedIndex]; - SetInactive(); - pBtn->Call(); - m_pLastAction = pBtn; - } - } -} diff --git a/src/game/editor/prompt.h b/src/game/editor/prompt.h deleted file mode 100644 index 2d873e580c..0000000000 --- a/src/game/editor/prompt.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef GAME_EDITOR_PROMPT_H -#define GAME_EDITOR_PROMPT_H - -#include -#include -#include - -#include "component.h" - -class CPrompt : public CEditorComponent -{ - bool m_ResetFilterResults = true; - CQuickAction *m_pLastAction = nullptr; - int m_PromptSelectedIndex = -1; - - std::vector m_vpFilteredPromptList; - std::vector m_vQuickActions; - CLineInputBuffered<512> m_PromptInput; - -public: - void OnInit(CEditor *pEditor) override; - bool OnInput(const IInput::CEvent &Event) override; - void OnRender(CUIRect _) override; - bool IsActive(); - void SetActive(); - void SetInactive(); -}; - -#endif diff --git a/src/game/editor/proof_mode.cpp b/src/game/editor/proof_mode.cpp deleted file mode 100644 index 769fee4989..0000000000 --- a/src/game/editor/proof_mode.cpp +++ /dev/null @@ -1,246 +0,0 @@ -#include "proof_mode.h" - -#include - -#include "editor.h" - -void CProofMode::OnInit(CEditor *pEditor) -{ - CEditorComponent::OnInit(pEditor); - SetMenuBackgroundPositionNames(); - OnReset(); - OnMapLoad(); -} - -void CProofMode::OnReset() -{ - m_ProofBorders = PROOF_BORDER_OFF; - m_CurrentMenuProofIndex = 0; -} - -void CProofMode::OnMapLoad() -{ - m_vMenuBackgroundCollisions = {}; - ResetMenuBackgroundPositions(); -} - -void CProofMode::SetMenuBackgroundPositionNames() -{ - m_vpMenuBackgroundPositionNames.resize(CMenuBackground::NUM_POS); - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_START] = "start"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_BROWSER_INTERNET] = "browser(internet)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_BROWSER_LAN] = "browser(lan)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_DEMOS] = "demos"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_NEWS] = "news"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_BROWSER_FAVORITES] = "favorites"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_SETTINGS_LANGUAGE] = "settings(language)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_SETTINGS_GENERAL] = "settings(general)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_SETTINGS_PLAYER] = "settings(player)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_SETTINGS_TEE] = "settings(tee)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_SETTINGS_APPEARANCE] = "settings(appearance)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_SETTINGS_CONTROLS] = "settings(controls)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_SETTINGS_GRAPHICS] = "settings(graphics)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_SETTINGS_SOUND] = "settings(sound)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_SETTINGS_DDNET] = "settings(ddnet)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_SETTINGS_ASSETS] = "settings(assets)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_BROWSER_CUSTOM0] = "custom(1)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_BROWSER_CUSTOM1] = "custom(2)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_BROWSER_CUSTOM2] = "custom(3)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_BROWSER_CUSTOM3] = "custom(4)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_BROWSER_CUSTOM4] = "custom(5)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_SETTINGS_RESERVED0] = "reserved settings(1)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_SETTINGS_RESERVED1] = "reserved settings(2)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_RESERVED0] = "reserved(1)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_RESERVED1] = "reserved(2)"; - m_vpMenuBackgroundPositionNames[CMenuBackground::POS_RESERVED2] = "reserved(3)"; -} - -void CProofMode::ResetMenuBackgroundPositions() -{ - std::array aBackgroundPositions = GenerateMenuBackgroundPositions(); - m_vMenuBackgroundPositions.assign(aBackgroundPositions.begin(), aBackgroundPositions.end()); - - if(Editor()->m_Map.m_pGameLayer) - { - for(int y = 0; y < Editor()->m_Map.m_pGameLayer->m_Height; ++y) - { - for(int x = 0; x < Editor()->m_Map.m_pGameLayer->m_Width; ++x) - { - CTile Tile = Editor()->m_Map.m_pGameLayer->GetTile(x, y); - if(Tile.m_Index >= TILE_TIME_CHECKPOINT_FIRST && Tile.m_Index <= TILE_TIME_CHECKPOINT_LAST) - { - int ArrayIndex = clamp((Tile.m_Index - TILE_TIME_CHECKPOINT_FIRST), 0, CMenuBackground::NUM_POS); - m_vMenuBackgroundPositions[ArrayIndex] = vec2(x * 32.0f + 16.0f, y * 32.0f + 16.0f); - } - - x += Tile.m_Skip; - } - } - } - - m_vMenuBackgroundCollisions.clear(); - m_vMenuBackgroundCollisions.resize(m_vMenuBackgroundPositions.size()); - for(size_t i = 0; i < m_vMenuBackgroundPositions.size(); i++) - { - for(size_t j = i + 1; j < m_vMenuBackgroundPositions.size(); j++) - { - if(i != j && distance(m_vMenuBackgroundPositions[i], m_vMenuBackgroundPositions[j]) < 0.001f) - m_vMenuBackgroundCollisions.at(i).push_back(j); - } - } -} - -void CProofMode::RenderScreenSizes() -{ - const vec2 WorldOffset = Editor()->MapView()->GetWorldOffset(); - - // render screen sizes - if(m_ProofBorders != PROOF_BORDER_OFF && !Editor()->MapView()->m_ShowPicker) - { - std::shared_ptr pGameGroup = Editor()->m_Map.m_pGameGroup; - pGameGroup->MapScreen(); - - Graphics()->TextureClear(); - Graphics()->LinesBegin(); - - // possible screen sizes (white border) - float aLastPoints[4]; - float Start = 1.0f; // 9.0f/16.0f; - float End = 16.0f / 9.0f; - const int NumSteps = 20; - for(int i = 0; i <= NumSteps; i++) - { - float aPoints[4]; - float Aspect = Start + (End - Start) * (i / (float)NumSteps); - - float Zoom = (m_ProofBorders == PROOF_BORDER_MENU) ? 0.7f : 1.0f; - RenderTools()->MapScreenToWorld( - WorldOffset.x, WorldOffset.y, - 100.0f, 100.0f, 100.0f, 0.0f, 0.0f, Aspect, Zoom, aPoints); - - if(i == 0) - { - IGraphics::CLineItem aArray[2] = { - IGraphics::CLineItem(aPoints[0], aPoints[1], aPoints[2], aPoints[1]), - IGraphics::CLineItem(aPoints[0], aPoints[3], aPoints[2], aPoints[3])}; - Graphics()->LinesDraw(aArray, std::size(aArray)); - } - - if(i != 0) - { - IGraphics::CLineItem aArray[4] = { - IGraphics::CLineItem(aPoints[0], aPoints[1], aLastPoints[0], aLastPoints[1]), - IGraphics::CLineItem(aPoints[2], aPoints[1], aLastPoints[2], aLastPoints[1]), - IGraphics::CLineItem(aPoints[0], aPoints[3], aLastPoints[0], aLastPoints[3]), - IGraphics::CLineItem(aPoints[2], aPoints[3], aLastPoints[2], aLastPoints[3])}; - Graphics()->LinesDraw(aArray, std::size(aArray)); - } - - if(i == NumSteps) - { - IGraphics::CLineItem aArray[2] = { - IGraphics::CLineItem(aPoints[0], aPoints[1], aPoints[0], aPoints[3]), - IGraphics::CLineItem(aPoints[2], aPoints[1], aPoints[2], aPoints[3])}; - Graphics()->LinesDraw(aArray, std::size(aArray)); - } - - mem_copy(aLastPoints, aPoints, sizeof(aPoints)); - } - - // two screen sizes (green and red border) - { - Graphics()->SetColor(1, 0, 0, 1); - for(int i = 0; i < 2; i++) - { - float aPoints[4]; - const float aAspects[] = {4.0f / 3.0f, 16.0f / 10.0f, 5.0f / 4.0f, 16.0f / 9.0f}; - float Aspect = aAspects[i]; - - float Zoom = (m_ProofBorders == PROOF_BORDER_MENU) ? 0.7f : 1.0f; - RenderTools()->MapScreenToWorld( - WorldOffset.x, WorldOffset.y, - 100.0f, 100.0f, 100.0f, 0.0f, 0.0f, Aspect, Zoom, aPoints); - - CUIRect r; - r.x = aPoints[0]; - r.y = aPoints[1]; - r.w = aPoints[2] - aPoints[0]; - r.h = aPoints[3] - aPoints[1]; - - IGraphics::CLineItem aArray[4] = { - IGraphics::CLineItem(r.x, r.y, r.x + r.w, r.y), - IGraphics::CLineItem(r.x + r.w, r.y, r.x + r.w, r.y + r.h), - IGraphics::CLineItem(r.x + r.w, r.y + r.h, r.x, r.y + r.h), - IGraphics::CLineItem(r.x, r.y + r.h, r.x, r.y)}; - Graphics()->LinesDraw(aArray, std::size(aArray)); - Graphics()->SetColor(0, 1, 0, 1); - } - } - Graphics()->LinesEnd(); - - // tee position (blue circle) and other screen positions - { - Graphics()->TextureClear(); - Graphics()->QuadsBegin(); - Graphics()->SetColor(0, 0, 1, 0.3f); - Graphics()->DrawCircle(WorldOffset.x, WorldOffset.y - 3.0f, 20.0f, 32); - - if(m_ProofBorders == PROOF_BORDER_MENU) - { - Graphics()->SetColor(0, 1, 0, 0.3f); - - std::set Indices; - for(int i = 0; i < (int)m_vMenuBackgroundPositions.size(); i++) - Indices.insert(i); - - while(!Indices.empty()) - { - int i = *Indices.begin(); - Indices.erase(i); - for(int k : m_vMenuBackgroundCollisions.at(i)) - Indices.erase(k); - - vec2 Pos = m_vMenuBackgroundPositions[i]; - Pos += WorldOffset - m_vMenuBackgroundPositions[m_CurrentMenuProofIndex]; - - if(Pos == WorldOffset) - continue; - - Graphics()->DrawCircle(Pos.x, Pos.y - 3.0f, 20.0f, 32); - } - } - - Graphics()->QuadsEnd(); - } - } -} - -bool CProofMode::IsEnabled() const -{ - return m_ProofBorders != PROOF_BORDER_OFF; -} - -bool CProofMode::IsModeMenu() const -{ - return m_ProofBorders == PROOF_BORDER_MENU; -} - -bool CProofMode::IsModeIngame() const -{ - return m_ProofBorders == PROOF_BORDER_INGAME; -} - -void CProofMode::Toggle() -{ - m_ProofBorders = m_ProofBorders == PROOF_BORDER_OFF ? PROOF_BORDER_INGAME : PROOF_BORDER_OFF; -} - -void CProofMode::SetModeIngame() -{ - m_ProofBorders = PROOF_BORDER_INGAME; -} - -void CProofMode::SetModeMenu() -{ - m_ProofBorders = PROOF_BORDER_MENU; -} diff --git a/src/game/editor/proof_mode.h b/src/game/editor/proof_mode.h deleted file mode 100644 index ffffd84732..0000000000 --- a/src/game/editor/proof_mode.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef GAME_EDITOR_PROOF_MODE_H -#define GAME_EDITOR_PROOF_MODE_H - -#include "component.h" - -class CProofMode : public CEditorComponent -{ -public: - void OnInit(CEditor *pEditor) override; - void OnReset() override; - void OnMapLoad() override; - void RenderScreenSizes(); - - bool IsEnabled() const; - bool IsModeMenu() const; - bool IsModeIngame() const; - void Toggle(); - void SetModeMenu(); - void SetModeIngame(); - - enum EProofBorder - { - PROOF_BORDER_OFF, - PROOF_BORDER_INGAME, - PROOF_BORDER_MENU - }; - EProofBorder m_ProofBorders; - - int m_CurrentMenuProofIndex; - std::vector m_vMenuBackgroundPositions; - std::vector m_vpMenuBackgroundPositionNames; - std::vector> m_vMenuBackgroundCollisions; - - void SetMenuBackgroundPositionNames(); - void ResetMenuBackgroundPositions(); -}; - -#endif diff --git a/src/game/editor/quick_action.h b/src/game/editor/quick_action.h deleted file mode 100644 index b6bb686345..0000000000 --- a/src/game/editor/quick_action.h +++ /dev/null @@ -1,73 +0,0 @@ -#ifndef GAME_EDITOR_QUICK_ACTION_H -#define GAME_EDITOR_QUICK_ACTION_H - -#include -#include - -typedef std::function FButtonClickCallback; -typedef std::function FButtonDisabledCallback; -typedef std::function FButtonActiveCallback; -typedef std::function FButtonColorCallback; - -class CQuickAction -{ -private: - const char *m_pLabel; - const char *m_pDescription; - - FButtonClickCallback m_pfnCallback; - FButtonDisabledCallback m_pfnDisabledCallback; - FButtonActiveCallback m_pfnActiveCallback; - FButtonColorCallback m_pfnColorCallback; - - const char m_ActionButtonId = 0; - -public: - CQuickAction( - const char *pLabel, - const char *pDescription, - FButtonClickCallback pfnCallback, - FButtonDisabledCallback pfnDisabledCallback, - FButtonActiveCallback pfnActiveCallback, - FButtonColorCallback pfnColorCallback) : - m_pLabel(pLabel), - m_pDescription(pDescription), - m_pfnCallback(std::move(pfnCallback)), - m_pfnDisabledCallback(std::move(pfnDisabledCallback)), - m_pfnActiveCallback(std::move(pfnActiveCallback)), - m_pfnColorCallback(std::move(pfnColorCallback)) - { - } - - // code to run when the action is triggered - void Call() const { m_pfnCallback(); } - - // bool that indicates if the action can be performed not or not - bool Disabled() { return m_pfnDisabledCallback(); } - - // bool that indicates if the action is currently running - // only applies to actions that can be turned on or off like proof borders - bool Active() { return m_pfnActiveCallback(); } - - // color "enum" that represents the state of the quick actions button - // used as Checked argument for DoButton_Editor() - int Color() { return m_pfnColorCallback(); } - - const char *Label() const { return m_pLabel; } - - // skips to the part of the label after the first colon - // useful for buttons that only show the state - const char *LabelShort() const - { - const char *pShort = str_find(m_pLabel, ": "); - if(!pShort) - return m_pLabel; - return pShort + 2; - } - - const char *Description() const { return m_pDescription; } - - const void *ActionButtonId() const { return &m_ActionButtonId; } -}; - -#endif diff --git a/src/game/editor/quick_actions.cpp b/src/game/editor/quick_actions.cpp deleted file mode 100644 index 852ce48d61..0000000000 --- a/src/game/editor/quick_actions.cpp +++ /dev/null @@ -1,216 +0,0 @@ -#include -#include - -#include "editor.h" - -#include "editor_actions.h" - -void CEditor::FillGameTiles(EGameTileOp FillTile) const -{ - std::shared_ptr pTileLayer = std::static_pointer_cast(GetSelectedLayerType(0, LAYERTYPE_TILES)); - if(pTileLayer) - pTileLayer->FillGameTiles(FillTile); -} - -bool CEditor::CanFillGameTiles() const -{ - std::shared_ptr pTileLayer = std::static_pointer_cast(GetSelectedLayerType(0, LAYERTYPE_TILES)); - if(pTileLayer) - return pTileLayer->CanFillGameTiles(); - return false; -} - -void CEditor::AddQuadOrSound() -{ - std::shared_ptr pLayer = GetSelectedLayer(0); - if(!pLayer) - return; - if(pLayer->m_Type != LAYERTYPE_QUADS && pLayer->m_Type != LAYERTYPE_SOUNDS) - return; - - std::shared_ptr pGroup = GetSelectedGroup(); - - float aMapping[4]; - pGroup->Mapping(aMapping); - int x = aMapping[0] + (aMapping[2] - aMapping[0]) / 2; - int y = aMapping[1] + (aMapping[3] - aMapping[1]) / 2; - if(m_Dialog == DIALOG_NONE && CLineInput::GetActiveInput() == nullptr && Input()->KeyPress(KEY_Q) && Input()->ModifierIsPressed()) - { - x += Ui()->MouseWorldX() - (MapView()->GetWorldOffset().x * pGroup->m_ParallaxX / 100) - pGroup->m_OffsetX; - y += Ui()->MouseWorldY() - (MapView()->GetWorldOffset().y * pGroup->m_ParallaxY / 100) - pGroup->m_OffsetY; - } - - if(pLayer->m_Type == LAYERTYPE_QUADS) - m_EditorHistory.Execute(std::make_shared(this, m_SelectedGroup, m_vSelectedLayers[0], x, y)); - else if(pLayer->m_Type == LAYERTYPE_SOUNDS) - m_EditorHistory.Execute(std::make_shared(this, m_SelectedGroup, m_vSelectedLayers[0], x, y)); -} - -void CEditor::AddGroup() -{ - m_Map.NewGroup(); - m_SelectedGroup = m_Map.m_vpGroups.size() - 1; - m_EditorHistory.RecordAction(std::make_shared(this, m_SelectedGroup, false)); -} - -void CEditor::AddSoundLayer() -{ - std::shared_ptr pSoundLayer = std::make_shared(this); - m_Map.m_vpGroups[m_SelectedGroup]->AddLayer(pSoundLayer); - int LayerIndex = m_Map.m_vpGroups[m_SelectedGroup]->m_vpLayers.size() - 1; - SelectLayer(LayerIndex); - m_Map.m_vpGroups[m_SelectedGroup]->m_Collapse = false; - m_EditorHistory.RecordAction(std::make_shared(this, m_SelectedGroup, LayerIndex)); -} - -void CEditor::AddTileLayer() -{ - std::shared_ptr pTileLayer = std::make_shared(this, m_Map.m_pGameLayer->m_Width, m_Map.m_pGameLayer->m_Height); - pTileLayer->m_pEditor = this; - m_Map.m_vpGroups[m_SelectedGroup]->AddLayer(pTileLayer); - int LayerIndex = m_Map.m_vpGroups[m_SelectedGroup]->m_vpLayers.size() - 1; - SelectLayer(LayerIndex); - m_Map.m_vpGroups[m_SelectedGroup]->m_Collapse = false; - m_EditorHistory.RecordAction(std::make_shared(this, m_SelectedGroup, LayerIndex)); -} - -void CEditor::AddQuadsLayer() -{ - std::shared_ptr pQuadLayer = std::make_shared(this); - m_Map.m_vpGroups[m_SelectedGroup]->AddLayer(pQuadLayer); - int LayerIndex = m_Map.m_vpGroups[m_SelectedGroup]->m_vpLayers.size() - 1; - SelectLayer(LayerIndex); - m_Map.m_vpGroups[m_SelectedGroup]->m_Collapse = false; - m_EditorHistory.RecordAction(std::make_shared(this, m_SelectedGroup, LayerIndex)); -} - -void CEditor::AddSwitchLayer() -{ - std::shared_ptr pSwitchLayer = std::make_shared(this, m_Map.m_pGameLayer->m_Width, m_Map.m_pGameLayer->m_Height); - m_Map.MakeSwitchLayer(pSwitchLayer); - m_Map.m_vpGroups[m_SelectedGroup]->AddLayer(pSwitchLayer); - int LayerIndex = m_Map.m_vpGroups[m_SelectedGroup]->m_vpLayers.size() - 1; - SelectLayer(LayerIndex); - m_pBrush->Clear(); - m_EditorHistory.RecordAction(std::make_shared(this, m_SelectedGroup, LayerIndex)); -} - -void CEditor::AddFrontLayer() -{ - std::shared_ptr pFrontLayer = std::make_shared(this, m_Map.m_pGameLayer->m_Width, m_Map.m_pGameLayer->m_Height); - m_Map.MakeFrontLayer(pFrontLayer); - m_Map.m_vpGroups[m_SelectedGroup]->AddLayer(pFrontLayer); - int LayerIndex = m_Map.m_vpGroups[m_SelectedGroup]->m_vpLayers.size() - 1; - SelectLayer(LayerIndex); - m_pBrush->Clear(); - m_EditorHistory.RecordAction(std::make_shared(this, m_SelectedGroup, LayerIndex)); -} - -void CEditor::AddTuneLayer() -{ - std::shared_ptr pTuneLayer = std::make_shared(this, m_Map.m_pGameLayer->m_Width, m_Map.m_pGameLayer->m_Height); - m_Map.MakeTuneLayer(pTuneLayer); - m_Map.m_vpGroups[m_SelectedGroup]->AddLayer(pTuneLayer); - int LayerIndex = m_Map.m_vpGroups[m_SelectedGroup]->m_vpLayers.size() - 1; - SelectLayer(LayerIndex); - m_pBrush->Clear(); - m_EditorHistory.RecordAction(std::make_shared(this, m_SelectedGroup, LayerIndex)); -} - -void CEditor::AddSpeedupLayer() -{ - std::shared_ptr pSpeedupLayer = std::make_shared(this, m_Map.m_pGameLayer->m_Width, m_Map.m_pGameLayer->m_Height); - m_Map.MakeSpeedupLayer(pSpeedupLayer); - m_Map.m_vpGroups[m_SelectedGroup]->AddLayer(pSpeedupLayer); - int LayerIndex = m_Map.m_vpGroups[m_SelectedGroup]->m_vpLayers.size() - 1; - SelectLayer(LayerIndex); - m_pBrush->Clear(); - m_EditorHistory.RecordAction(std::make_shared(this, m_SelectedGroup, LayerIndex)); -} - -void CEditor::AddTeleLayer() -{ - std::shared_ptr pTeleLayer = std::make_shared(this, m_Map.m_pGameLayer->m_Width, m_Map.m_pGameLayer->m_Height); - m_Map.MakeTeleLayer(pTeleLayer); - m_Map.m_vpGroups[m_SelectedGroup]->AddLayer(pTeleLayer); - int LayerIndex = m_Map.m_vpGroups[m_SelectedGroup]->m_vpLayers.size() - 1; - SelectLayer(LayerIndex); - m_pBrush->Clear(); - m_EditorHistory.RecordAction(std::make_shared(this, m_SelectedGroup, LayerIndex)); -} - -bool CEditor::IsNonGameTileLayerSelected() const -{ - std::shared_ptr pLayer = GetSelectedLayer(0); - if(!pLayer) - return false; - if(pLayer->m_Type != LAYERTYPE_TILES) - return false; - if( - pLayer == m_Map.m_pGameLayer || - pLayer == m_Map.m_pFrontLayer || - pLayer == m_Map.m_pSwitchLayer || - pLayer == m_Map.m_pTeleLayer || - pLayer == m_Map.m_pSpeedupLayer || - pLayer == m_Map.m_pTuneLayer) - return false; - - return true; -} - -void CEditor::LayerSelectImage() -{ - if(!IsNonGameTileLayerSelected()) - return; - - std::shared_ptr pLayer = GetSelectedLayer(0); - std::shared_ptr pTiles = std::static_pointer_cast(pLayer); - - static SLayerPopupContext s_LayerPopupContext = {}; - s_LayerPopupContext.m_pEditor = this; - Ui()->DoPopupMenu(&s_LayerPopupContext, Ui()->MouseX(), Ui()->MouseY(), 120, 270, &s_LayerPopupContext, PopupLayer); - PopupSelectImageInvoke(pTiles->m_Image, Ui()->MouseX(), Ui()->MouseY()); -} - -void CEditor::MapDetails() -{ - const CUIRect *pScreen = Ui()->Screen(); - m_Map.m_MapInfoTmp.Copy(m_Map.m_MapInfo); - static SPopupMenuId s_PopupMapInfoId; - constexpr float PopupWidth = 400.0f; - constexpr float PopupHeight = 170.0f; - Ui()->DoPopupMenu( - &s_PopupMapInfoId, - pScreen->w / 2.0f - PopupWidth / 2.0f, - pScreen->h / 2.0f - PopupHeight / 2.0f, - PopupWidth, - PopupHeight, - this, - PopupMapInfo); - Ui()->SetActiveItem(nullptr); -} - -void CEditor::DeleteSelectedLayer() -{ - std::shared_ptr pCurrentLayer = GetSelectedLayer(0); - if(!pCurrentLayer) - return; - if(m_Map.m_pGameLayer == pCurrentLayer) - return; - - m_EditorHistory.RecordAction(std::make_shared(this, m_SelectedGroup, m_vSelectedLayers[0])); - - if(pCurrentLayer == m_Map.m_pFrontLayer) - m_Map.m_pFrontLayer = nullptr; - if(pCurrentLayer == m_Map.m_pTeleLayer) - m_Map.m_pTeleLayer = nullptr; - if(pCurrentLayer == m_Map.m_pSpeedupLayer) - m_Map.m_pSpeedupLayer = nullptr; - if(pCurrentLayer == m_Map.m_pSwitchLayer) - m_Map.m_pSwitchLayer = nullptr; - if(pCurrentLayer == m_Map.m_pTuneLayer) - m_Map.m_pTuneLayer = nullptr; - m_Map.m_vpGroups[m_SelectedGroup]->DeleteLayer(m_vSelectedLayers[0]); - - SelectPreviousLayer(); -} diff --git a/src/game/editor/quick_actions.h b/src/game/editor/quick_actions.h deleted file mode 100644 index f1e1b282fb..0000000000 --- a/src/game/editor/quick_actions.h +++ /dev/null @@ -1,372 +0,0 @@ -// This file can be included several times. - -#ifndef REGISTER_QUICK_ACTION -#define REGISTER_QUICK_ACTION(name, text, callback, disabled, active, button_color, description) -#endif - -#define ALWAYS_FALSE []() -> bool { return false; } -#define DEFAULT_BTN []() -> int { return -1; } - -REGISTER_QUICK_ACTION( - ToggleGrid, - "Toggle Grid", - [&]() { MapView()->MapGrid()->Toggle(); }, - ALWAYS_FALSE, - [&]() -> bool { return MapView()->MapGrid()->IsEnabled(); }, - DEFAULT_BTN, - "[Ctrl+G] Toggle Grid.") -REGISTER_QUICK_ACTION( - GameTilesAir, - "Game tiles: Air", - [&]() { FillGameTiles(EGameTileOp::AIR); }, - [&]() -> bool { return !CanFillGameTiles(); }, - ALWAYS_FALSE, - DEFAULT_BTN, - "Constructs game tiles from this layer.") -REGISTER_QUICK_ACTION( - GameTilesHookable, - "Game tiles: Hookable", - [&]() { FillGameTiles(EGameTileOp::HOOKABLE); }, - [&]() -> bool { return !CanFillGameTiles(); }, - ALWAYS_FALSE, - DEFAULT_BTN, - "Constructs game tiles from this layer.") -REGISTER_QUICK_ACTION( - GameTilesDeath, - "Game tiles: Death", - [&]() { FillGameTiles(EGameTileOp::DEATH); }, - [&]() -> bool { return !CanFillGameTiles(); }, - ALWAYS_FALSE, - DEFAULT_BTN, - "Constructs game tiles from this layer.") -REGISTER_QUICK_ACTION( - GameTilesUnhookable, - "Game tiles: Unhookable", - [&]() { FillGameTiles(EGameTileOp::UNHOOKABLE); }, - [&]() -> bool { return !CanFillGameTiles(); }, - ALWAYS_FALSE, - DEFAULT_BTN, - "Constructs game tiles from this layer.") -REGISTER_QUICK_ACTION( - GameTilesHookthrough, - "Game tiles: Hookthrough", - [&]() { FillGameTiles(EGameTileOp::HOOKTHROUGH); }, - [&]() -> bool { return !CanFillGameTiles(); }, - ALWAYS_FALSE, - DEFAULT_BTN, - "Constructs game tiles from this layer.") -REGISTER_QUICK_ACTION( - GameTilesFreeze, - "Game tiles: Freeze", - [&]() { FillGameTiles(EGameTileOp::FREEZE); }, - [&]() -> bool { return !CanFillGameTiles(); }, - ALWAYS_FALSE, - DEFAULT_BTN, - "Constructs game tiles from this layer.") -REGISTER_QUICK_ACTION( - GameTilesUnfreeze, - "Game tiles: Unfreeze", - [&]() { FillGameTiles(EGameTileOp::UNFREEZE); }, - [&]() -> bool { return !CanFillGameTiles(); }, - ALWAYS_FALSE, - DEFAULT_BTN, - "Constructs game tiles from this layer.") -REGISTER_QUICK_ACTION( - GameTilesDeepFreeze, - "Game tiles: Deep Freeze", - [&]() { FillGameTiles(EGameTileOp::DEEP_FREEZE); }, - [&]() -> bool { return !CanFillGameTiles(); }, - ALWAYS_FALSE, - DEFAULT_BTN, - "Constructs game tiles from this layer.") -REGISTER_QUICK_ACTION( - GameTilesDeepUnfreeze, - "Game tiles: Deep Unfreeze", - [&]() { FillGameTiles(EGameTileOp::DEEP_UNFREEZE); }, - [&]() -> bool { return !CanFillGameTiles(); }, - ALWAYS_FALSE, - DEFAULT_BTN, - "Constructs game tiles from this layer.") -REGISTER_QUICK_ACTION( - GameTilesBlueCheckTele, - "Game tiles: Blue Check Tele", - [&]() { FillGameTiles(EGameTileOp::BLUE_CHECK_TELE); }, - [&]() -> bool { return !CanFillGameTiles(); }, - ALWAYS_FALSE, - DEFAULT_BTN, - "Constructs game tiles from this layer.") -REGISTER_QUICK_ACTION( - GameTilesRedCheckTele, - "Game tiles: Red Check Tele", - [&]() { FillGameTiles(EGameTileOp::RED_CHECK_TELE); }, - [&]() -> bool { return !CanFillGameTiles(); }, - ALWAYS_FALSE, - DEFAULT_BTN, - "Constructs game tiles from this layer.") -REGISTER_QUICK_ACTION( - GameTilesLiveFreeze, - "Game tiles: Live Freeze", - [&]() { FillGameTiles(EGameTileOp::LIVE_FREEZE); }, - [&]() -> bool { return !CanFillGameTiles(); }, - ALWAYS_FALSE, - DEFAULT_BTN, - "Constructs game tiles from this layer.") -REGISTER_QUICK_ACTION( - GameTilesLiveUnfreeze, - "Game tiles: Live Unfreeze", - [&]() { FillGameTiles(EGameTileOp::LIVE_UNFREEZE); }, - [&]() -> bool { return !CanFillGameTiles(); }, - ALWAYS_FALSE, - DEFAULT_BTN, - "Constructs game tiles from this layer.") -REGISTER_QUICK_ACTION( - AddGroup, - "Add group", - [&]() { AddGroup(); }, - ALWAYS_FALSE, - ALWAYS_FALSE, - DEFAULT_BTN, - "Adds a new group.") -REGISTER_QUICK_ACTION( - ResetZoom, - "Reset Zoom", - [&]() { MapView()->ResetZoom(); }, - ALWAYS_FALSE, - ALWAYS_FALSE, - DEFAULT_BTN, - "[Numpad*] Zoom to normal and remove editor offset.") -REGISTER_QUICK_ACTION( - ZoomOut, - "Zoom Out", - [&]() { MapView()->Zoom()->ChangeValue(50.0f); }, - ALWAYS_FALSE, - ALWAYS_FALSE, - DEFAULT_BTN, - "[Numpad-] Zoom out.") -REGISTER_QUICK_ACTION( - ZoomIn, - "Zoom In", - [&]() { MapView()->Zoom()->ChangeValue(-50.0f); }, - ALWAYS_FALSE, - ALWAYS_FALSE, - DEFAULT_BTN, - "[Numpad+] Zoom in.") -REGISTER_QUICK_ACTION( - Refocus, - "Refocus", - [&]() { MapView()->Focus(); }, - ALWAYS_FALSE, - ALWAYS_FALSE, - DEFAULT_BTN, - "[Home] Restore map focus.") -REGISTER_QUICK_ACTION( - Proof, - "Proof", - [&]() { MapView()->ProofMode()->Toggle(); }, - ALWAYS_FALSE, - [&]() -> bool { return MapView()->ProofMode()->IsEnabled(); }, - DEFAULT_BTN, - "Toggles proof borders. These borders represent the area that a player can see with default zoom.") -REGISTER_QUICK_ACTION( - AddTileLayer, "Add tile layer", [&]() { AddTileLayer(); }, ALWAYS_FALSE, ALWAYS_FALSE, DEFAULT_BTN, "Creates a new tile layer.") -REGISTER_QUICK_ACTION( - AddSwitchLayer, - "Add switch layer", - [&]() { AddSwitchLayer(); }, - [&]() -> bool { return !GetSelectedGroup()->m_GameGroup || m_Map.m_pSwitchLayer; }, - ALWAYS_FALSE, - DEFAULT_BTN, - "Creates a new switch layer.") -REGISTER_QUICK_ACTION( - AddTuneLayer, - "Add tune layer", - [&]() { AddTuneLayer(); }, - [&]() -> bool { return !GetSelectedGroup()->m_GameGroup || m_Map.m_pTuneLayer; }, - ALWAYS_FALSE, - DEFAULT_BTN, - "Creates a new tuning layer.") -REGISTER_QUICK_ACTION( - AddSpeedupLayer, - "Add speedup layer", - [&]() { AddSpeedupLayer(); }, - [&]() -> bool { return !GetSelectedGroup()->m_GameGroup || m_Map.m_pSpeedupLayer; }, - ALWAYS_FALSE, - DEFAULT_BTN, - "Creates a new speedup layer.") -REGISTER_QUICK_ACTION( - AddTeleLayer, - "Add tele layer", - [&]() { AddTeleLayer(); }, - [&]() -> bool { return !GetSelectedGroup()->m_GameGroup || m_Map.m_pTeleLayer; }, - ALWAYS_FALSE, - DEFAULT_BTN, - "Creates a new tele layer.") -REGISTER_QUICK_ACTION( - AddFrontLayer, - "Add front layer", - [&]() { AddFrontLayer(); }, - [&]() -> bool { return !GetSelectedGroup()->m_GameGroup || m_Map.m_pFrontLayer; }, - ALWAYS_FALSE, - DEFAULT_BTN, - "Creates a new item layer.") -REGISTER_QUICK_ACTION( - AddQuadsLayer, "Add quads layer", [&]() { AddQuadsLayer(); }, ALWAYS_FALSE, ALWAYS_FALSE, DEFAULT_BTN, "Creates a new quads layer.") -REGISTER_QUICK_ACTION( - AddSoundLayer, "Add sound layer", [&]() { AddSoundLayer(); }, ALWAYS_FALSE, ALWAYS_FALSE, DEFAULT_BTN, "Creates a new sound layer.") -REGISTER_QUICK_ACTION( - SaveAs, - "Save As", - [&]() { InvokeFileDialog(IStorage::TYPE_SAVE, FILETYPE_MAP, "Save map", "Save As", "maps", true, CEditor::CallbackSaveMap, this); }, - ALWAYS_FALSE, - ALWAYS_FALSE, - DEFAULT_BTN, - "[Ctrl+Shift+S] Saves the current map under a new name.") -REGISTER_QUICK_ACTION( - LoadCurrentMap, - "Load Current Map", - [&]() { - if(HasUnsavedData()) - { - m_PopupEventType = POPEVENT_LOADCURRENT; - m_PopupEventActivated = true; - } - else - { - LoadCurrentMap(); - } - }, - ALWAYS_FALSE, - ALWAYS_FALSE, - DEFAULT_BTN, - "[Ctrl+Alt+L] Opens the current in game map for editing.") -REGISTER_QUICK_ACTION( - Envelopes, - "Envelopes", - [&]() { m_ActiveExtraEditor = m_ActiveExtraEditor == EXTRAEDITOR_ENVELOPES ? EXTRAEDITOR_NONE : EXTRAEDITOR_ENVELOPES; }, - ALWAYS_FALSE, - ALWAYS_FALSE, - [&]() -> int { return m_ShowPicker ? -1 : m_ActiveExtraEditor == EXTRAEDITOR_ENVELOPES; }, - "Toggles the envelope editor.") -REGISTER_QUICK_ACTION( - ServerSettings, - "Server settings", - [&]() { m_ActiveExtraEditor = m_ActiveExtraEditor == EXTRAEDITOR_SERVER_SETTINGS ? EXTRAEDITOR_NONE : EXTRAEDITOR_SERVER_SETTINGS; }, - ALWAYS_FALSE, - ALWAYS_FALSE, - [&]() -> int { return m_ShowPicker ? -1 : m_ActiveExtraEditor == EXTRAEDITOR_SERVER_SETTINGS; }, - "Toggles the server settings editor.") -REGISTER_QUICK_ACTION( - History, - "History", - [&]() { m_ActiveExtraEditor = m_ActiveExtraEditor == EXTRAEDITOR_HISTORY ? EXTRAEDITOR_NONE : EXTRAEDITOR_HISTORY; }, - ALWAYS_FALSE, - ALWAYS_FALSE, - [&]() -> int { return m_ShowPicker ? -1 : m_ActiveExtraEditor == EXTRAEDITOR_HISTORY; }, - "Toggles the editor history view.") -REGISTER_QUICK_ACTION( - AddImage, - "Add Image", - [&]() { InvokeFileDialog(IStorage::TYPE_ALL, FILETYPE_IMG, "Add Image", "Add", "mapres", false, AddImage, this); }, - ALWAYS_FALSE, - ALWAYS_FALSE, - DEFAULT_BTN, - "Load a new image to use in the map.") -REGISTER_QUICK_ACTION( - LayerPropAddImage, - "Layer: Add Image", - [&]() { LayerSelectImage(); }, - [&]() -> bool { return !IsNonGameTileLayerSelected(); }, - ALWAYS_FALSE, - DEFAULT_BTN, - "Pick mapres image for currently selected layer.") -REGISTER_QUICK_ACTION( - ShowInfoOff, - "Show Info: Off", - [&]() { - m_ShowTileInfo = SHOW_TILE_OFF; - m_ShowEnvelopePreview = SHOWENV_NONE; - }, - ALWAYS_FALSE, - [&]() -> bool { return m_ShowTileInfo == SHOW_TILE_OFF; }, - DEFAULT_BTN, - "Do not show tile information.") -REGISTER_QUICK_ACTION( - ShowInfoDec, - "Show Info: Dec", - [&]() { - m_ShowTileInfo = SHOW_TILE_DECIMAL; - m_ShowEnvelopePreview = SHOWENV_NONE; - }, - ALWAYS_FALSE, - [&]() -> bool { return m_ShowTileInfo == SHOW_TILE_DECIMAL; }, - DEFAULT_BTN, - "[Ctrl+I] Show tile information.") -REGISTER_QUICK_ACTION( - ShowInfoHex, - "Show Info: Hex", - [&]() { - m_ShowTileInfo = SHOW_TILE_HEXADECIMAL; - m_ShowEnvelopePreview = SHOWENV_NONE; - }, - ALWAYS_FALSE, - [&]() -> bool { return m_ShowTileInfo == SHOW_TILE_HEXADECIMAL; }, - DEFAULT_BTN, - "[Ctrl+Shift+I] Show tile information in hexadecimal.") -REGISTER_QUICK_ACTION( - DeleteLayer, - "Delete layer", - [&]() { DeleteSelectedLayer(); }, - [&]() -> bool { - std::shared_ptr pCurrentLayer = GetSelectedLayer(0); - if(!pCurrentLayer) - return true; - return m_Map.m_pGameLayer == pCurrentLayer; - }, - ALWAYS_FALSE, - DEFAULT_BTN, - "Deletes the layer.") -REGISTER_QUICK_ACTION( - Pipette, - "Pipette", - [&]() { m_ColorPipetteActive = !m_ColorPipetteActive; }, - ALWAYS_FALSE, - [&]() -> bool { return m_ColorPipetteActive; }, - DEFAULT_BTN, - "[Ctrl+Shift+C] Color pipette. Pick a color from the screen by clicking on it.") -REGISTER_QUICK_ACTION( - MapDetails, - "Map details", - [&]() { MapDetails(); }, - ALWAYS_FALSE, - ALWAYS_FALSE, - DEFAULT_BTN, - "Adjust the map details of the current map.") -REGISTER_QUICK_ACTION( - AddQuad, - "Add Quad", - [&]() { AddQuadOrSound(); }, - [&]() -> bool { - std::shared_ptr pLayer = GetSelectedLayer(0); - if(!pLayer) - return false; - return pLayer->m_Type != LAYERTYPE_QUADS; - }, - ALWAYS_FALSE, - DEFAULT_BTN, - "[Ctrl+Q] Add a new quad.") -REGISTER_QUICK_ACTION( - AddSound, - "Add Sound", - [&]() { AddQuadOrSound(); }, - [&]() -> bool { - std::shared_ptr pLayer = GetSelectedLayer(0); - if(!pLayer) - return false; - return pLayer->m_Type != LAYERTYPE_SOUNDS; - }, - ALWAYS_FALSE, - DEFAULT_BTN, - "[Ctrl+Q] Add a new sound source.") - -#undef ALWAYS_FALSE -#undef DEFAULT_BTN diff --git a/src/game/editor/smooth_value.cpp b/src/game/editor/smooth_value.cpp deleted file mode 100644 index 5f99ad5f7c..0000000000 --- a/src/game/editor/smooth_value.cpp +++ /dev/null @@ -1,95 +0,0 @@ -#include "smooth_value.h" - -#include -#include - -CSmoothValue::CSmoothValue(float InitialValue, float MinValue, float MaxValue) : - m_Smoothing(false), m_Value(InitialValue), m_MinValue(MinValue), m_MaxValue(MaxValue) {} - -void CSmoothValue::SetValue(float Target) -{ - Target = clamp(Target, m_MinValue, m_MaxValue); - - const float Now = Client()->GlobalTime(); - float Current = m_Value; - float Derivative = 0.0f; - if(m_Smoothing) - { - const float Progress = ZoomProgress(Now); - Current = m_ValueSmoothing.Evaluate(Progress); - Derivative = m_ValueSmoothing.Derivative(Progress); - } - - m_ValueSmoothingTarget = Target; - m_ValueSmoothing = CCubicBezier::With(Current, Derivative, 0.0f, m_ValueSmoothingTarget); - m_ValueSmoothingStart = Now; - m_ValueSmoothingEnd = Now + g_Config.m_EdSmoothZoomTime / 1000.0f; - - m_Smoothing = true; -} - -void CSmoothValue::ChangeValue(float Amount) -{ - const float CurrentTarget = m_Smoothing ? m_ValueSmoothingTarget : m_Value; - SetValue(CurrentTarget + Amount); -} - -bool CSmoothValue::UpdateValue() -{ - if(m_Smoothing) - { - const float Time = Client()->GlobalTime(); - const float OldLevel = m_Value; - if(Time >= m_ValueSmoothingEnd) - { - m_Value = m_ValueSmoothingTarget; - m_Smoothing = false; - } - else - { - m_Value = m_ValueSmoothing.Evaluate(ZoomProgress(Time)); - if((OldLevel < m_ValueSmoothingTarget && m_Value > m_ValueSmoothingTarget) || (OldLevel > m_ValueSmoothingTarget && m_Value < m_ValueSmoothingTarget)) - { - m_Value = m_ValueSmoothingTarget; - m_Smoothing = false; - } - } - m_Value = clamp(m_Value, m_MinValue, m_MaxValue); - - return true; - } - - return false; -} - -float CSmoothValue::ZoomProgress(float CurrentTime) const -{ - return (CurrentTime - m_ValueSmoothingStart) / (m_ValueSmoothingEnd - m_ValueSmoothingStart); -} - -float CSmoothValue::GetValue() const -{ - return m_Value; -} - -void CSmoothValue::SetValueInstant(float Target) -{ - m_Smoothing = false; - m_Value = Target; -} - -void CSmoothValue::SetValueRange(float MinValue, float MaxValue) -{ - m_MinValue = MinValue; - m_MaxValue = MaxValue; -} - -float CSmoothValue::GetMinValue() const -{ - return m_MinValue; -} - -float CSmoothValue::GetMaxValue() const -{ - return m_MaxValue; -} diff --git a/src/game/editor/smooth_value.h b/src/game/editor/smooth_value.h deleted file mode 100644 index 2b6ffc43a5..0000000000 --- a/src/game/editor/smooth_value.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef GAME_EDITOR_SMOOTH_VALUE_H -#define GAME_EDITOR_SMOOTH_VALUE_H - -#include - -#include "component.h" - -/** - * A value that is changed smoothly over time. - */ -class CSmoothValue : public CEditorComponent -{ -public: - CSmoothValue(float InitialValue, float MinValue, float MaxValue); - - /** - * Set a new target which the value should change to. - */ - void SetValue(float Target); - - /** - * Change the value by the given amount. - */ - void ChangeValue(float Amount); - - /** - * Set the value to the target instantly. If the value was changing the - * target will be discarded. - */ - void SetValueInstant(float Target); - - bool UpdateValue(); - - float GetValue() const; - void SetValueRange(float MinValue, float MaxValue); - float GetMinValue() const; - float GetMaxValue() const; - -private: - float ZoomProgress(float CurrentTime) const; - - bool m_Smoothing; - float m_Value; - CCubicBezier m_ValueSmoothing; - float m_ValueSmoothingTarget; - float m_ValueSmoothingStart; - float m_ValueSmoothingEnd; - - float m_MinValue; - float m_MaxValue; -}; - -#endif diff --git a/src/game/editor/tileart.cpp b/src/game/editor/tileart.cpp deleted file mode 100644 index 102a75cc2c..0000000000 --- a/src/game/editor/tileart.cpp +++ /dev/null @@ -1,214 +0,0 @@ -#include "editor.h" -#include "editor_actions.h" - -#include - -#include - -bool operator<(const ColorRGBA &Left, const ColorRGBA &Right) -{ - if(Left.r != Right.r) - return Left.r < Right.r; - else if(Left.g != Right.g) - return Left.g < Right.g; - else if(Left.b != Right.b) - return Left.b < Right.b; - else - return Left.a < Right.a; -} - -static std::vector GetUniqueColors(const CImageInfo &Image) -{ - std::set ColorSet; - std::vector vUniqueColors; - for(size_t x = 0; x < Image.m_Width; x++) - { - for(size_t y = 0; y < Image.m_Height; y++) - { - ColorRGBA Color = Image.PixelColor(x, y); - if(Color.a > 0 && ColorSet.insert(Color).second) - vUniqueColors.push_back(Color); - } - } - std::sort(vUniqueColors.begin(), vUniqueColors.end()); - - return vUniqueColors; -} - -constexpr int NumTilesRow = 16; -constexpr int NumTilesColumn = 16; -constexpr int NumTiles = NumTilesRow * NumTilesColumn; -constexpr int TileSize = 64; - -static int GetColorIndex(const std::array &ColorGroup, ColorRGBA Color) -{ - std::array::const_iterator Iterator = std::find(ColorGroup.begin(), ColorGroup.end(), Color); - if(Iterator == ColorGroup.end()) - return 0; - return Iterator - ColorGroup.begin(); -} - -static std::vector> GroupColors(const std::vector &vColors) -{ - std::vector> vaColorGroups; - - for(size_t i = 0; i < vColors.size(); i += NumTiles - 1) - { - auto &Group = vaColorGroups.emplace_back(); - std::copy_n(vColors.begin() + i, std::min(NumTiles - 1, vColors.size() - i), Group.begin() + 1); - } - - return vaColorGroups; -} - -static void SetColorTile(CImageInfo &Image, int x, int y, ColorRGBA Color) -{ - for(int i = 0; i < TileSize; i++) - { - for(int j = 0; j < TileSize; j++) - Image.SetPixelColor(x * TileSize + i, y * TileSize + j, Color); - } -} - -static CImageInfo ColorGroupToImage(const std::array &aColorGroup) -{ - CImageInfo Image; - Image.m_Width = NumTilesRow * TileSize; - Image.m_Height = NumTilesColumn * TileSize; - Image.m_Format = CImageInfo::FORMAT_RGBA; - Image.m_pData = static_cast(malloc(Image.DataSize())); - - for(int y = 0; y < NumTilesColumn; y++) - { - for(int x = 0; x < NumTilesRow; x++) - { - int ColorIndex = x + NumTilesRow * y; - SetColorTile(Image, x, y, aColorGroup[ColorIndex]); - } - } - - return Image; -} - -static std::vector ColorGroupsToImages(const std::vector> &vaColorGroups) -{ - std::vector vImages; - vImages.reserve(vaColorGroups.size()); - for(const auto &ColorGroup : vaColorGroups) - vImages.push_back(ColorGroupToImage(ColorGroup)); - - return vImages; -} - -static std::shared_ptr ImageInfoToEditorImage(CEditor *pEditor, const CImageInfo &Image, const char *pName) -{ - std::shared_ptr pEditorImage = std::make_shared(pEditor); - pEditorImage->m_Width = Image.m_Width; - pEditorImage->m_Height = Image.m_Height; - pEditorImage->m_Format = Image.m_Format; - pEditorImage->m_pData = Image.m_pData; - - int TextureLoadFlag = pEditor->Graphics()->Uses2DTextureArrays() ? IGraphics::TEXLOAD_TO_2D_ARRAY_TEXTURE : IGraphics::TEXLOAD_TO_3D_TEXTURE; - pEditorImage->m_Texture = pEditor->Graphics()->LoadTextureRaw(Image, TextureLoadFlag, pName); - pEditorImage->m_External = 0; - str_copy(pEditorImage->m_aName, pName); - - return pEditorImage; -} - -static std::shared_ptr AddLayerWithImage(CEditor *pEditor, const std::shared_ptr &pGroup, int Width, int Height, const CImageInfo &Image, const char *pName) -{ - std::shared_ptr pEditorImage = ImageInfoToEditorImage(pEditor, Image, pName); - pEditor->m_Map.m_vpImages.push_back(pEditorImage); - - std::shared_ptr pLayer = std::make_shared(pEditor, Width, Height); - str_copy(pLayer->m_aName, pName); - pLayer->m_Image = pEditor->m_Map.m_vpImages.size() - 1; - pGroup->AddLayer(pLayer); - - return pLayer; -} - -static void SetTilelayerIndices(const std::shared_ptr &pLayer, const std::array &aColorGroup, const CImageInfo &Image) -{ - for(int x = 0; x < pLayer->m_Width; x++) - { - for(int y = 0; y < pLayer->m_Height; y++) - pLayer->m_pTiles[x + y * pLayer->m_Width].m_Index = GetColorIndex(aColorGroup, Image.PixelColor(x, y)); - } -} - -void CEditor::AddTileart(bool IgnoreHistory) -{ - char aTileArtFileName[IO_MAX_PATH_LENGTH]; - IStorage::StripPathAndExtension(m_aTileartFilename, aTileArtFileName, sizeof(aTileArtFileName)); - - std::shared_ptr pGroup = m_Map.NewGroup(); - str_copy(pGroup->m_aName, aTileArtFileName); - - int ImageCount = m_Map.m_vpImages.size(); - - auto vUniqueColors = GetUniqueColors(m_TileartImageInfo); - auto vaColorGroups = GroupColors(vUniqueColors); - auto vColorImages = ColorGroupsToImages(vaColorGroups); - char aImageName[IO_MAX_PATH_LENGTH]; - for(size_t i = 0; i < vColorImages.size(); i++) - { - str_format(aImageName, sizeof(aImageName), "%s %" PRIzu, aTileArtFileName, i + 1); - std::shared_ptr pLayer = AddLayerWithImage(this, pGroup, m_TileartImageInfo.m_Width, m_TileartImageInfo.m_Height, vColorImages[i], aImageName); - SetTilelayerIndices(pLayer, vaColorGroups[i], m_TileartImageInfo); - } - auto IndexMap = SortImages(); - - if(!IgnoreHistory) - { - m_EditorHistory.RecordAction(std::make_shared(this, ImageCount, m_aTileartFilename, IndexMap)); - } - - m_TileartImageInfo.Free(); - m_Map.OnModify(); - m_Dialog = DIALOG_NONE; -} - -void CEditor::TileartCheckColors() -{ - auto vUniqueColors = GetUniqueColors(m_TileartImageInfo); - int NumColorGroups = std::ceil(vUniqueColors.size() / 255.0f); - if(m_Map.m_vpImages.size() + NumColorGroups >= 64) - { - m_PopupEventType = CEditor::POPEVENT_PIXELART_TOO_MANY_COLORS; - m_PopupEventActivated = true; - m_TileartImageInfo.Free(); - } - else if(NumColorGroups > 1) - { - m_PopupEventType = CEditor::POPEVENT_PIXELART_MANY_COLORS; - m_PopupEventActivated = true; - } - else - AddTileart(); -} - -bool CEditor::CallbackAddTileart(const char *pFilepath, int StorageType, void *pUser) -{ - CEditor *pEditor = (CEditor *)pUser; - - if(!pEditor->Graphics()->LoadPng(pEditor->m_TileartImageInfo, pFilepath, StorageType)) - { - pEditor->ShowFileDialogError("Failed to load image from file '%s'.", pFilepath); - return false; - } - - str_copy(pEditor->m_aTileartFilename, pFilepath); - if(pEditor->m_TileartImageInfo.m_Width * pEditor->m_TileartImageInfo.m_Height > 10'000) - { - pEditor->m_PopupEventType = CEditor::POPEVENT_PIXELART_BIG_IMAGE; - pEditor->m_PopupEventActivated = true; - return false; - } - else - { - pEditor->TileartCheckColors(); - return false; - } -} diff --git a/src/game/gamecore.cpp b/src/game/gamecore.cpp index 45081cad3e..4ff39a33fa 100644 --- a/src/game/gamecore.cpp +++ b/src/game/gamecore.cpp @@ -134,7 +134,7 @@ void CCharacterCore::Init(CWorldCore *pWorld, CCollision *pCollision, CTeamsCore m_Id = -1; // fail safe, if core's tuning didn't get updated at all, just fallback to world tuning. - m_Tuning = m_pWorld->m_aTuning[g_Config.m_ClDummy]; + m_Tuning = m_pWorld->m_aTuning; } void CCharacterCore::SetCoreWorld(CWorldCore *pWorld, CCollision *pCollision, CTeamsCore *pTeams) diff --git a/src/game/gamecore.h b/src/game/gamecore.h index 0cce06c2c4..52cb249628 100644 --- a/src/game/gamecore.h +++ b/src/game/gamecore.h @@ -164,7 +164,7 @@ class CWorldCore return m_pPrng->RandomBits() % BelowThis; } - CTuningParams m_aTuning[2]; + CTuningParams m_aTuning; class CCharacterCore *m_apCharacters[MAX_CLIENTS]; CPrng *m_pPrng; diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp index 57acc45a4b..d1de69b953 100644 --- a/src/game/server/gamecontext.cpp +++ b/src/game/server/gamecontext.cpp @@ -1045,7 +1045,7 @@ void CGameContext::OnTick() } // copy tuning - m_World.m_Core.m_aTuning[0] = m_Tuning; + m_World.m_Core.m_aTuning = m_Tuning; m_World.Tick(); UpdatePlayerMaps(); diff --git a/src/game/server/gamecontroller.cpp b/src/game/server/gamecontroller.cpp index ab5be9dd59..0dca520849 100644 --- a/src/game/server/gamecontroller.cpp +++ b/src/game/server/gamecontroller.cpp @@ -124,7 +124,7 @@ void IGameController::EvaluateSpawnType(CSpawnEval *pEval, int Type, int DDTeam) for(int Index = 0; Index < 5 && Result == -1; ++Index) { Result = Index; - if(!GameServer()->m_World.m_Core.m_aTuning[0].m_PlayerCollision) + if(!GameServer()->m_World.m_Core.m_aTuning.m_PlayerCollision) break; for(int c = 0; c < Num; ++c) { diff --git a/src/game/server/gameworld.cpp b/src/game/server/gameworld.cpp index 5f42290810..2f02921b21 100644 --- a/src/game/server/gameworld.cpp +++ b/src/game/server/gameworld.cpp @@ -398,5 +398,5 @@ void CGameWorld::ReleaseHooked(int ClientId) CTuningParams *CGameWorld::Tuning() { - return &m_Core.m_aTuning[0]; + return &m_Core.m_aTuning; } diff --git a/src/macos/client.mm b/src/macos/client.mm deleted file mode 100644 index 052e83c585..0000000000 --- a/src/macos/client.mm +++ /dev/null @@ -1,22 +0,0 @@ -#import - -extern "C" int TWMain(int argc, const char **argv); - -int main(int argc, const char **argv) -{ - BOOL FinderLaunch = argc >= 2 && !strncmp(argv[1], "-psn", 4); - - NSString *pResourcePath = [[NSBundle mainBundle] resourcePath]; - if(!pResourcePath) - return -1; - - [[NSFileManager defaultManager] changeCurrentDirectoryPath:pResourcePath]; - - if(FinderLaunch) - { - const char *apArgv[2] = { argv[0], NULL }; - return TWMain(1, apArgv); - } - else - return TWMain(argc, argv); -} diff --git a/src/macos/notifications.mm b/src/macos/notifications.mm deleted file mode 100644 index 2501fe0e6b..0000000000 --- a/src/macos/notifications.mm +++ /dev/null @@ -1,19 +0,0 @@ -#import -#import -#import - -// TODO: NSUserNotification is deprecated. Use the User Notifications framework instead: https://developer.apple.com/documentation/usernotifications?language=objc -void NotificationsNotifyMacOsInternal(const char *pTitle, const char *pMessage) -{ - NSString* pNsTitle = [NSString stringWithCString:pTitle encoding:NSUTF8StringEncoding]; - NSString* pNsMsg = [NSString stringWithCString:pMessage encoding:NSUTF8StringEncoding]; - - NSUserNotification *pNotification = [[NSUserNotification alloc] autorelease]; - pNotification.title = pNsTitle; - pNotification.informativeText = pNsMsg; - pNotification.soundName = NSUserNotificationDefaultSoundName; - - [[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:pNotification]; - - [NSApp requestUserAttention:NSInformationalRequest]; // use NSCriticalRequest to annoy the user (doesn't stop bouncing) -} diff --git a/src/masterping/Cargo.lock b/src/masterping/Cargo.lock deleted file mode 100644 index 69bc6423c9..0000000000 --- a/src/masterping/Cargo.lock +++ /dev/null @@ -1,516 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "anyhow" -version = "1.0.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" -dependencies = [ - "backtrace", -] - -[[package]] -name = "backtrace" -version = "0.3.67" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bumpalo" -version = "3.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" - -[[package]] -name = "cc" -version = "1.0.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chunked_transfer" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cca491388666e04d7248af3f60f0c40cfb0991c72205595d7c396e3510207d1a" - -[[package]] -name = "clap" -version = "2.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" -dependencies = [ - "bitflags", - "strsim", - "term_size", - "textwrap", - "unicode-width", -] - -[[package]] -name = "crc32fast" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "flate2" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "form_urlencoded" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "getrandom" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec7af912d60cdbd3677c1af9352ebae6fb8394d165568a2234df0fa00f87793" - -[[package]] -name = "idna" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "js-sys" -version = "0.3.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "libc" -version = "0.2.139" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" - -[[package]] -name = "log" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "masterping" -version = "0.0.1" -dependencies = [ - "anyhow", - "clap", - "ureq", - "uuid", -] - -[[package]] -name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "miniz_oxide" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" -dependencies = [ - "adler", -] - -[[package]] -name = "object" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "239da7f290cfa979f43f85a8efeee9a8a76d0827c356d37f9d3d7254d6b537fb" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" - -[[package]] -name = "percent-encoding" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" - -[[package]] -name = "proc-macro2" -version = "1.0.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a8eca9f9c4ffde41714334dee777596264c7825420f521abc92b5b5deb63a5" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin", - "untrusted", - "web-sys", - "winapi", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" - -[[package]] -name = "rustls" -version = "0.20.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "539a2bfe908f471bfa933876bd1eb6a19cf2176d375f82ef7f99530a40e48c2c" -dependencies = [ - "log", - "ring", - "sct", - "webpki", -] - -[[package]] -name = "sct" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - -[[package]] -name = "syn" -version = "1.0.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "term_size" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e4129646ca0ed8f45d09b929036bafad5377103edd06e50bf574b353d2b08d9" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "term_size", - "unicode-width", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" - -[[package]] -name = "unicode-bidi" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" - -[[package]] -name = "unicode-ident" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-width" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "ureq" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97acb4c28a254fd7a4aeec976c46a7fa404eac4d7c134b30c75144846d7cb8f" -dependencies = [ - "base64", - "chunked_transfer", - "flate2", - "log", - "once_cell", - "rustls", - "url", - "webpki", - "webpki-roots", -] - -[[package]] -name = "url" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "uuid" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" - -[[package]] -name = "web-sys" -version = "0.3.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "webpki-roots" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/src/masterping/Cargo.toml b/src/masterping/Cargo.toml deleted file mode 100644 index 0e1bf06123..0000000000 --- a/src/masterping/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "masterping" -version = "0.0.1" -authors = ["heinrich5991 "] -edition = "2021" -publish = false -license = "Zlib" - -[workspace] - -[dependencies] -anyhow = { version = "1.0.66", features = ["backtrace"] } -clap = { version = "2.34.0", default-features = false, features = [ - "suggestions", - "wrap_help", -] } -ureq = "2.5.0" -uuid = { version = "1.2.2", features = ["v4"] } diff --git a/src/masterping/src/main.rs b/src/masterping/src/main.rs deleted file mode 100644 index b52c58a5c1..0000000000 --- a/src/masterping/src/main.rs +++ /dev/null @@ -1,142 +0,0 @@ -use anyhow::bail; -use anyhow::Context; -use clap::value_t_or_exit; -use clap::App; -use clap::Arg; -use std::io; -use std::net::SocketAddr; -use std::net::ToSocketAddrs; -use std::net::UdpSocket; -use std::str::FromStr; -use std::time::Duration; -use std::time::Instant; -use uuid::Uuid; - -use self::IpVersion::*; - -#[derive(Clone, Copy)] -enum IpVersion { - Ipv4, - Ipv6, -} - -struct InvalidIpVersion; - -impl FromStr for IpVersion { - type Err = InvalidIpVersion; - fn from_str(s: &str) -> Result { - Ok(match s { - "ipv4" => Ipv4, - "ipv6" => Ipv6, - _ => return Err(InvalidIpVersion), - }) - } -} - -struct IpvResolver(IpVersion); - -impl ureq::Resolver for IpvResolver { - fn resolve(&self, netloc: &str) -> io::Result> { - ToSocketAddrs::to_socket_addrs(netloc).map(|iter| { - iter.filter(|s| match self.0 { - Ipv4 => s.is_ipv4(), - Ipv6 => s.is_ipv6(), - }) - .collect() - }) - } -} - -fn main() -> anyhow::Result<()> { - let matches = App::new("masterping") - .about("Continuously checks if the masterserver is accepting registrations.") - .arg(Arg::with_name("ipv") - .value_name("IPV") - .required(true) - .help("IP version (either \"ipv6\" or \"ipv4\").") - ) - .arg(Arg::with_name("masterurl") - .value_name("MASTERURL") - .required(true) - .help("URL of the masterserver registration endpoint (something like \"https://master1.ddnet.org/ddnet/15/register\")") - ) - .get_matches(); - - let ipv = value_t_or_exit!(matches.value_of("ipv"), IpVersion); - let url = matches.value_of("masterurl").unwrap(); - - let bindaddr = match ipv { - Ipv4 => "0.0.0.0:0", - Ipv6 => "[::]:0", - }; - let udp = UdpSocket::bind(bindaddr).context("UdpSocket::bind")?; - let address = format!( - "tw-0.6+udp://connecting-address.invalid:{}", - udp.local_addr().context("UdpSocket::local_addr")?.port() - ); - let challenge_secret = Uuid::new_v4().to_string(); - - let agent = ureq::builder() - .user_agent("masterping/0.0.1") - .resolver(IpvResolver(ipv)) - .build(); - let response = agent - .post(url) - .set("Address", &address) - .set("Secret", &Uuid::new_v4().to_string()) - .set("Challenge-Secret", &challenge_secret) - .set("Info-Serial", "0") - .send_bytes(b"") - .map_err(|e| { - if let ureq::Error::Status(status, response) = e { - let status_text = response.status_text().to_owned(); - if let Ok(response) = response.into_string() { - eprintln!("{}", response); - } - ureq::Error::Status( - status, - ureq::Response::new(status, &status_text, "").unwrap(), - ) - } else { - e - } - })? - .into_string()?; - - if response != "{\"status\":\"need_challenge\"}\n" { - bail!("Unexpected response {:?}", response); - } - - let expected_msg_prefix = { - let mut expected = Vec::new(); - expected.extend_from_slice(b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffchal"); - expected.extend_from_slice(challenge_secret.as_bytes()); - expected.push(0); - expected - }; - - let mut buf = [0; 65536]; - let deadline = Instant::now() + Duration::from_secs(3); - udp.set_read_timeout(Some(Duration::from_secs(3))) - .context("UdpSocket::set_read_timeout")?; - loop { - let (read, from) = udp - .recv_from(&mut buf) - .context("couldn't receive ping from mastersrv in time")?; - let message = &buf[..read]; - if message.starts_with(&expected_msg_prefix) { - println!("{}", from); - break; - } - let mut duration = deadline - .checked_duration_since(Instant::now()) - .unwrap_or_default(); - if duration == Duration::ZERO { - duration = Duration::from_nanos(1); - } - udp.set_read_timeout(Some(duration)) - .context("UdpSocket::set_read_timeout")?; - } - - Ok(()) -} diff --git a/src/mastersrv/Cargo.lock b/src/mastersrv/Cargo.lock deleted file mode 100644 index ee42e554b3..0000000000 --- a/src/mastersrv/Cargo.lock +++ /dev/null @@ -1,1327 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "aho-corasick" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" -dependencies = [ - "memchr", -] - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" -dependencies = [ - "serde", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "base64" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "block-buffer" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" - -[[package]] -name = "cc" -version = "1.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74b6a57f98764a267ff415d50a25e6e166f3831a5071af4995296ea97d210490" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "wasm-bindgen", - "windows-targets", -] - -[[package]] -name = "clap" -version = "2.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" -dependencies = [ - "bitflags", - "strsim", - "term_size", - "textwrap", - "unicode-width", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "cpufeatures" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" -dependencies = [ - "libc", -] - -[[package]] -name = "crypto-common" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "digest" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "env_logger" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" -dependencies = [ - "matches", - "percent-encoding", -] - -[[package]] -name = "futures-channel" -version = "0.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" - -[[package]] -name = "futures-sink" -version = "0.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" - -[[package]] -name = "futures-task" -version = "0.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" - -[[package]] -name = "futures-util" -version = "0.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" -dependencies = [ - "futures-core", - "futures-sink", - "futures-task", - "pin-project-lite", - "pin-utils", -] - -[[package]] -name = "generic-array" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "h2" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util 0.7.1", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" - -[[package]] -name = "headers" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cff78e5788be1e0ab65b04d306b2ed5092c815ec97ec70f4ebd5aee158aa55d" -dependencies = [ - "base64", - "bitflags", - "bytes", - "headers-core", - "http", - "httpdate", - "mime", - "sha-1", -] - -[[package]] -name = "headers-core" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" -dependencies = [ - "http", -] - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "http" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" - -[[package]] -name = "httpdate" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "hyper" -version = "0.14.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b26ae0a80afebe130861d90abf98e3814a4f28a4c6ffeb5ab8ebb2be311e0ef2" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "idna" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" -dependencies = [ - "autocfg", - "hashbrown", -] - -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - -[[package]] -name = "itoa" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" - -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "libc" -version = "0.2.155" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" - -[[package]] -name = "libloc" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2714dc2e1457b05760031b876cf46c7abf11b302278b59ebb7bbd37f8bc9145" -dependencies = [ - "chrono", - "ipnet", - "memmap2", - "yoke", - "yoke-derive", - "zerocopy", - "zerocopy-derive", -] - -[[package]] -name = "log" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "mastersrv" -version = "0.0.1" -dependencies = [ - "arrayvec", - "base64", - "bytes", - "clap", - "env_logger", - "headers", - "hex", - "libloc", - "log", - "mime", - "rand", - "serde", - "serde_json", - "sha2", - "tokio", - "tokio-stream", - "url", - "warp", -] - -[[package]] -name = "matches" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" - -[[package]] -name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "memmap2" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" -dependencies = [ - "libc", - "stable_deref_trait", -] - -[[package]] -name = "mime" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" - -[[package]] -name = "mime_guess" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" -dependencies = [ - "mime", - "unicase", -] - -[[package]] -name = "mio" -version = "0.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" -dependencies = [ - "libc", - "log", - "miow", - "ntapi", - "winapi", -] - -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi", -] - -[[package]] -name = "ntapi" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" -dependencies = [ - "winapi", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "percent-encoding" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" - -[[package]] -name = "pin-project" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.92", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "ppv-lite86" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" - -[[package]] -name = "proc-macro2" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" -dependencies = [ - "getrandom", -] - -[[package]] -name = "regex" -version = "1.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.6.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" - -[[package]] -name = "ryu" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" - -[[package]] -name = "scoped-tls" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" - -[[package]] -name = "serde" -version = "1.0.137" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.137" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.92", -] - -[[package]] -name = "serde_json" -version = "1.0.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f972498cf015f7c0746cac89ebe1d6ef10c293b94175a243a2d9442c163d9944" -dependencies = [ - "indexmap", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha-1" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "slab" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" - -[[package]] -name = "socket2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - -[[package]] -name = "syn" -version = "1.0.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff7c592601f11445996a06f8ad0c27f094a58857c2f89e97974ab9235b92c52" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "syn" -version = "2.0.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "synstructure" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.68", -] - -[[package]] -name = "term_size" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e4129646ca0ed8f45d09b929036bafad5377103edd06e50bf574b353d2b08d9" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "termcolor" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "term_size", - "unicode-width", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" - -[[package]] -name = "tokio" -version = "1.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c27a64b625de6d309e8c57716ba93021dccf1b3b5c97edd6d3dd2d2135afc0a" -dependencies = [ - "bytes", - "libc", - "memchr", - "mio", - "num_cpus", - "pin-project-lite", - "tokio-macros", - "winapi", -] - -[[package]] -name = "tokio-macros" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.92", -] - -[[package]] -name = "tokio-stream" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "log", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "tower-service" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" - -[[package]] -name = "tracing" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" -dependencies = [ - "cfg-if", - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.92", -] - -[[package]] -name = "tracing-core" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "try-lock" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" - -[[package]] -name = "typenum" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" - -[[package]] -name = "unicase" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-width" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" - -[[package]] -name = "unicode-xid" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" - -[[package]] -name = "url" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" -dependencies = [ - "form_urlencoded", - "idna", - "matches", - "percent-encoding", - "serde", -] - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "want" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" -dependencies = [ - "log", - "try-lock", -] - -[[package]] -name = "warp" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cef4e1e9114a4b7f1ac799f16ce71c14de5778500c5450ec6b7b920c55b587e" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "headers", - "http", - "hyper", - "log", - "mime", - "mime_guess", - "percent-encoding", - "pin-project", - "scoped-tls", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-stream", - "tokio-util 0.6.9", - "tower-service", - "tracing", -] - -[[package]] -name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" - -[[package]] -name = "wasm-bindgen" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.68", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.68", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" - -[[package]] -name = "yoke" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" -dependencies = [ - "serde", - "stable_deref_trait", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.68", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.68", -] - -[[package]] -name = "zerofrom" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" diff --git a/src/mastersrv/Cargo.toml b/src/mastersrv/Cargo.toml deleted file mode 100644 index df249c2c54..0000000000 --- a/src/mastersrv/Cargo.toml +++ /dev/null @@ -1,36 +0,0 @@ -[package] -name = "mastersrv" -version = "0.0.1" -authors = ["heinrich5991 "] -edition = "2021" -publish = false -license = "Zlib" - -[workspace] - -[dependencies] -arrayvec = { version = "0.5.2", features = ["serde"] } -base64 = "0.13.0" -bytes = "1.1.0" -clap = { version = "2.34.0", default-features = false, features = [ - "suggestions", - "wrap_help", -] } -env_logger = "0.8.3" -headers = "0.3.7" -hex = "0.4.3" -libloc = "0.1.0" -log = "0.4.17" -mime = "0.3.16" -rand = "0.8.4" -serde = { version = "1.0.126", features = ["derive"] } -serde_json = { version = "1.0.64", features = [ - "float_roundtrip", - "preserve_order", - "raw_value", -] } -sha2 = "0.10.0" -tokio = { version = "1.6.0", features = ["macros", "rt", "rt-multi-thread"] } -tokio-stream = { version = "0.1.8", features = ["net"] } -url = { version = "2.2.2", features = ["serde"] } -warp = { version = "0.3.1", default-features = false } diff --git a/src/mastersrv/README.md b/src/mastersrv/README.md deleted file mode 100644 index 1c661bb7d9..0000000000 --- a/src/mastersrv/README.md +++ /dev/null @@ -1,55 +0,0 @@ -mastersrv -========= - -The mastersrv maintains a list of all registered DDNet (and Teeworlds) servers. -Game servers try to register themselves with the mastersrv via an HTTP POST -request on /ddnet/15/register. The mastersrv delays the registration until the -the game server can prove it actually listens on the provided port -(`need_challenge`). In order to do that, the mastersrv sends a UDP message -containing an opaque token to the game server. The game server will include -this token in its next register and the register process will succeed -(`success`). - -To build the mastersrv, have a recent version of -[Rust](https://www.rust-lang.org/) installed and run `cargo build --release` in -the `src/mastersrv` folder. The resulting binary should appear in -`src/mastersrv/target/release/mastersrv`. - -Use `--help` to see some of the options of the mastersrv. - -servers.json -============ - -The `servers.json` file produced by the mastersrv is not actually served -automatically, it needs to be served by another HTTPS server, probably by the -same as the reverse proxy handling HTTPS for the mastersrv. It is suggested to -serve the `servers.json` file at the path `/ddnet/15/servers.json`. - -Logs -==== - -To enable logs, set the environment variable `RUST_LOG=mastersrv,info`. Logs -should appear already when just starting the mastersrv. - -Reverse proxy -============= - -In order to run this mastersrv in production, you must put it behind a reverse -proxy that handles HTTPS, such as nginx, Caddy, or Apache. - -This means the mastersrv cannot determine the origin IP address by looking at -the IP address of the request, it will come from the reverse proxy, likely on -localhost. The mastersrv expects that the reverse proxy adds a header where it -puts the original requester IP address, e.g. `Connecting-IP`. Add -`--connecting-ip-header Connecting-IP` to the command line options of the -mastersrv. - -For nginx, add `proxy_set_header Connecting-IP $remote_addr;` - -For Caddy, add `header_up Connecting-IP {http.request.remote}`. - -For Apache, run `a2enmod headers` and add `RequestHeader set Connecting-IP "%{REMOTE_ADDR}s"` to the -config. - -If you're behind Cloudflare, instead use `--connecting-ip-header -CF-Connecting-IP` without any changes. diff --git a/src/mastersrv/src/addr.rs b/src/mastersrv/src/addr.rs deleted file mode 100644 index 09020fbe88..0000000000 --- a/src/mastersrv/src/addr.rs +++ /dev/null @@ -1,312 +0,0 @@ -use arrayvec::ArrayString; -use std::fmt; -use std::fmt::Write; -use std::net::IpAddr; -use std::net::SocketAddr; -use std::str::FromStr; -use url::Url; - -#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)] -pub enum Protocol { - V5, - V6, - V7, - Ddper6, -} - -#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)] -pub struct Addr { - // `ip`, `port` come before `protocol` so that the order groups addresses - // with the same IP addresses together. - pub ip: IpAddr, - pub port: u16, - pub protocol: Protocol, -} - -/// A register address, serialized like -/// tw-0.6+udp://connecting-address.invalid:8303. -#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)] -pub struct RegisterAddr { - pub port: u16, - pub protocol: Protocol, -} - -impl fmt::Display for Protocol { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - self.as_str().fmt(f) - } -} - -#[derive(Clone, Copy, Debug)] -pub struct UnknownProtocol; - -impl fmt::Display for UnknownProtocol { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - "protocol must be one of tw-0.5+udp, tw-0.6+udp, tw-0.7+udp or ddper-0.6+udp".fmt(f) - } -} - -impl FromStr for Protocol { - type Err = UnknownProtocol; - fn from_str(s: &str) -> Result { - use self::Protocol::*; - Ok(match s { - "tw-0.5+udp" => V5, - "tw-0.6+udp" => V6, - "tw-0.7+udp" => V7, - "ddper-0.6+udp" => Ddper6, - _ => return Err(UnknownProtocol), - }) - } -} - -impl serde::Serialize for Protocol { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - serializer.serialize_str(self.as_str()) - } -} - -struct ProtocolVisitor; - -impl<'de> serde::de::Visitor<'de> for ProtocolVisitor { - type Value = Protocol; - - fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.write_str("one of \"tw-0.5+udp\", \"tw-0.6+udp\", \"tw-0.7+udp\" and \"ddper-0.6+udp\"") - } - fn visit_str(self, v: &str) -> Result { - let invalid_value = || E::invalid_value(serde::de::Unexpected::Str(v), &self); - Ok(Protocol::from_str(v).map_err(|_| invalid_value())?) - } -} - -impl<'de> serde::Deserialize<'de> for Protocol { - fn deserialize(deserializer: D) -> Result - where - D: serde::de::Deserializer<'de>, - { - deserializer.deserialize_str(ProtocolVisitor) - } -} - -impl Protocol { - fn as_str(self) -> &'static str { - use self::Protocol::*; - match self { - V5 => "tw-0.5+udp", - V6 => "tw-0.6+udp", - V7 => "tw-0.7+udp", - Ddper6 => "ddper-0.6+udp", - } - } -} - -impl Addr { - pub fn to_socket_addr(self) -> SocketAddr { - SocketAddr::new(self.ip, self.port) - } -} - -impl fmt::Display for Addr { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let mut buf: ArrayString<[u8; 128]> = ArrayString::new(); - write!(&mut buf, "{}://{}", self.protocol, self.to_socket_addr()).unwrap(); - buf.fmt(f) - } -} - -#[derive(Clone, Copy, Debug)] -pub struct InvalidAddr; - -impl FromStr for Addr { - type Err = InvalidAddr; - fn from_str(s: &str) -> Result { - let url = Url::parse(s).map_err(|_| InvalidAddr)?; - let protocol: Protocol = url.scheme().parse().map_err(|_| InvalidAddr)?; - let mut ip_port: ArrayString<[u8; 64]> = ArrayString::new(); - write!( - &mut ip_port, - "{}:{}", - url.host_str().ok_or(InvalidAddr)?, - url.port().ok_or(InvalidAddr)? - ) - .unwrap(); - let sock_addr: SocketAddr = ip_port.parse().map_err(|_| InvalidAddr)?; - Ok(Addr { - ip: sock_addr.ip(), - port: sock_addr.port(), - protocol, - }) - } -} - -impl serde::Serialize for Addr { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - let mut buf: ArrayString<[u8; 128]> = ArrayString::new(); - write!(&mut buf, "{}", self).unwrap(); - serializer.serialize_str(&buf) - } -} - -struct AddrVisitor; - -impl<'de> serde::de::Visitor<'de> for AddrVisitor { - type Value = Addr; - - fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.write_str("a URL like tw-0.6+udp://127.0.0.1:8303") - } - fn visit_str(self, v: &str) -> Result { - let invalid_value = || E::invalid_value(serde::de::Unexpected::Str(v), &self); - Ok(Addr::from_str(v).map_err(|_| invalid_value())?) - } -} - -impl<'de> serde::Deserialize<'de> for Addr { - fn deserialize(deserializer: D) -> Result - where - D: serde::de::Deserializer<'de>, - { - deserializer.deserialize_str(AddrVisitor) - } -} - -impl RegisterAddr { - pub fn with_ip(self, ip: IpAddr) -> Addr { - Addr { - ip, - port: self.port, - protocol: self.protocol, - } - } -} - -impl fmt::Display for RegisterAddr { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let mut buf: ArrayString<[u8; 128]> = ArrayString::new(); - write!( - &mut buf, - "{}://connecting-address.invalid:{}", - self.protocol, self.port, - ) - .unwrap(); - buf.fmt(f) - } -} - -#[derive(Clone, Copy, Debug)] -pub enum ParseRegisterAddrError { - Url(url::ParseError), - Protocol(UnknownProtocol), - HostNotConnectingAddressInvalid, - PortNotPresent, -} - -impl fmt::Display for ParseRegisterAddrError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - use self::ParseRegisterAddrError::*; - match *self { - Url(e) => write!(f, "URL parse error: {}", e), - Protocol(e) => write!(f, "protocol parse error: {}", e), - HostNotConnectingAddressInvalid => write!( - f, - "register address must have domain connecting-address.invalid" - ), - PortNotPresent => write!(f, "register address must specify port"), - } - } -} - -impl FromStr for RegisterAddr { - type Err = ParseRegisterAddrError; - fn from_str(s: &str) -> Result { - use self::ParseRegisterAddrError as Error; - let url = Url::parse(s).map_err(Error::Url)?; - let protocol: Protocol = url.scheme().parse().map_err(Error::Protocol)?; - if url.host_str() != Some("connecting-address.invalid") { - return Err(Error::HostNotConnectingAddressInvalid); - } - let port = url.port().ok_or(Error::PortNotPresent)?; - Ok(RegisterAddr { port, protocol }) - } -} - -impl serde::Serialize for RegisterAddr { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - let mut buf: ArrayString<[u8; 128]> = ArrayString::new(); - write!(&mut buf, "{}", self).unwrap(); - serializer.serialize_str(&buf) - } -} - -struct RegisterAddrVisitor; - -impl<'de> serde::de::Visitor<'de> for RegisterAddrVisitor { - type Value = RegisterAddr; - - fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.write_str("a URL like tw-0.6+udp://connecting-address.invalid:8303") - } - fn visit_str(self, v: &str) -> Result { - let invalid_value = || E::invalid_value(serde::de::Unexpected::Str(v), &self); - Ok(RegisterAddr::from_str(v).map_err(|_| invalid_value())?) - } -} - -impl<'de> serde::Deserialize<'de> for RegisterAddr { - fn deserialize(deserializer: D) -> Result - where - D: serde::de::Deserializer<'de>, - { - deserializer.deserialize_str(RegisterAddrVisitor) - } -} - -#[cfg(test)] -mod test { - use super::Addr; - use super::Protocol; - use super::RegisterAddr; - use std::net::IpAddr; - use std::str::FromStr; - - #[test] - fn addr_from_str() { - assert_eq!( - Addr::from_str("tw-0.6+udp://127.0.0.1:8303").unwrap(), - Addr { - ip: IpAddr::from_str("127.0.0.1").unwrap(), - port: 8303, - protocol: Protocol::V6, - } - ); - assert_eq!( - Addr::from_str("tw-0.6+udp://[::1]:8303").unwrap(), - Addr { - ip: IpAddr::from_str("::1").unwrap(), - port: 8303, - protocol: Protocol::V6, - } - ); - } - - #[test] - fn register_addr_from_str() { - assert_eq!( - RegisterAddr::from_str("tw-0.6+udp://connecting-address.invalid:8303").unwrap(), - RegisterAddr { - port: 8303, - protocol: Protocol::V6, - } - ); - } -} diff --git a/src/mastersrv/src/locations.rs b/src/mastersrv/src/locations.rs deleted file mode 100644 index 99870e1308..0000000000 --- a/src/mastersrv/src/locations.rs +++ /dev/null @@ -1,40 +0,0 @@ -use arrayvec::ArrayString; -use std::net::IpAddr; -use std::path::Path; - -pub type Location = ArrayString<[u8; 12]>; - -#[allow(dead_code)] // only used for `Debug` impl -#[derive(Debug)] -pub struct LocationsError(String); - -pub struct Locations { - inner: Option, -} - -impl Locations { - pub fn empty() -> Locations { - Locations { - inner: None, - } - } - pub fn read(filename: &Path) -> Result { - let inner = libloc::Locations::open(filename) - .map_err(|e| LocationsError(format!("error opening {:?}: {}", filename, e)))?; - Ok(Locations { - inner: Some(inner), - }) - } - pub fn lookup(&self, addr: IpAddr) -> Option { - self.inner.as_ref().and_then(|inner| { - let country_code = inner.lookup(addr)?.country_code(); - let continent_code = inner.country(country_code)?.continent_code(); - let mut result = ArrayString::new(); - result.push_str(continent_code); - result.push_str(":"); - result.push_str(country_code); - result.make_ascii_lowercase(); - Some(result) - }) - } -} diff --git a/src/mastersrv/src/main.rs b/src/mastersrv/src/main.rs deleted file mode 100644 index d19f48c848..0000000000 --- a/src/mastersrv/src/main.rs +++ /dev/null @@ -1,1096 +0,0 @@ -use arrayvec::ArrayString; -use arrayvec::ArrayVec; -use clap::value_t_or_exit; -use clap::App; -use clap::Arg; -use headers::HeaderMapExt as _; -use rand::random; -use serde::Deserialize; -use serde::Serialize; -use serde_json as json; -use sha2::Digest; -use sha2::Sha512_256 as SecureHash; -use std::borrow::Cow; -use std::collections::hash_map; -use std::collections::BTreeMap; -use std::collections::HashMap; -use std::ffi::OsStr; -use std::fmt; -use std::io; -use std::io::Write; -use std::mem; -use std::net::IpAddr; -use std::net::SocketAddr; -use std::panic; -use std::panic::UnwindSafe; -use std::path::Path; -use std::process; -use std::str; -use std::sync; -use std::sync::Arc; -use std::sync::Mutex; -use std::time::Duration; -use std::time::Instant; -use std::time::SystemTime; -use tokio::fs; -use tokio::fs::File; -use tokio::io::AsyncReadExt; -use tokio::time; -use warp::Filter; - -#[macro_use] -extern crate log; - -use crate::addr::Addr; -use crate::addr::Protocol; -use crate::addr::RegisterAddr; -use crate::locations::Location; -use crate::locations::Locations; - -// Naming convention: Always use the abbreviation `addr` except in user-facing -// (e.g. serialized) identifiers. -mod addr; -mod locations; - -const SERVER_TIMEOUT_SECONDS: u64 = 30; - -type ShortString = ArrayString<[u8; 64]>; - -#[derive(Debug, Deserialize)] -struct Register { - address: RegisterAddr, - secret: ShortString, - connless_request_token: Option, - challenge_secret: ShortString, - challenge_token: Option, - info_serial: i64, - info: Option, -} - -#[derive(Debug, Deserialize)] -struct Delete { - address: RegisterAddr, - secret: ShortString, -} - -#[derive(Debug, Serialize)] -#[serde(rename_all = "snake_case", tag = "status")] -enum RegisterResponse { - Success, - NeedChallenge, - NeedInfo, - Error(RegisterError), -} - -#[derive(Debug, Serialize)] -struct RegisterError { - #[serde(skip)] - is_unsupported_media_type: bool, - message: Cow<'static, str>, -} - -impl RegisterError { - fn new(s: String) -> RegisterError { - RegisterError { - is_unsupported_media_type: false, - message: Cow::Owned(s), - } - } - fn unsupported_media_type() -> RegisterError { - RegisterError { - is_unsupported_media_type: true, - message: Cow::Borrowed("The request's Content-Type is not supported"), - } - } - fn status(&self) -> warp::http::StatusCode { - use warp::http::StatusCode; - if !self.is_unsupported_media_type { - StatusCode::BAD_REQUEST - } else { - StatusCode::UNSUPPORTED_MEDIA_TYPE - } - } -} - -impl From<&'static str> for RegisterError { - fn from(s: &'static str) -> RegisterError { - RegisterError { - is_unsupported_media_type: false, - message: Cow::Borrowed(s), - } - } -} - -/// Time in milliseconds since the epoch of the timekeeper. -#[derive(Clone, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)] -struct Timestamp(i64); - -impl Timestamp { - fn minus_seconds(self, seconds: u64) -> Timestamp { - Timestamp(self.0 - seconds.checked_mul(1_000).unwrap() as i64) - } - fn difference_added(self, other: Timestamp, base: Timestamp) -> Timestamp { - Timestamp(self.0 + (other.0 - base.0)) - } -} - -#[derive(Clone, Copy)] -struct Timekeeper { - instant: Instant, - system: SystemTime, -} - -impl Timekeeper { - fn new() -> Timekeeper { - Timekeeper { - instant: Instant::now(), - system: SystemTime::now(), - } - } - fn now(&self) -> Timestamp { - Timestamp(self.instant.elapsed().as_millis() as i64) - } - fn from_system_time(&self, system: SystemTime) -> Timestamp { - let difference = if let Ok(d) = system.duration_since(self.system) { - d.as_millis() as i64 - } else { - -(self.system.duration_since(system).unwrap().as_millis() as i64) - }; - Timestamp(difference) - } -} - -#[derive(Debug, Serialize)] -struct SerializedServers<'a> { - pub servers: Vec>, -} - -impl<'a> SerializedServers<'a> { - fn new() -> SerializedServers<'a> { - SerializedServers { - servers: Vec::new(), - } - } -} - -#[derive(Debug, Serialize)] -struct SerializedServer<'a> { - pub addresses: &'a [Addr], - #[serde(skip_serializing_if = "Option::is_none")] - pub location: Option, - pub info: &'a json::value::RawValue, -} - -impl<'a> SerializedServer<'a> { - fn new(server: &'a Server, location: Option) -> SerializedServer<'a> { - SerializedServer { - addresses: &server.addresses, - location, - info: &server.info, - } - } -} - -#[derive(Deserialize, Serialize)] -struct DumpServer<'a> { - pub info_serial: i64, - pub info: Cow<'a, json::value::RawValue>, -} - -impl<'a> From<&'a Server> for DumpServer<'a> { - fn from(server: &'a Server) -> DumpServer<'a> { - DumpServer { - info_serial: server.info_serial, - info: Cow::Borrowed(&server.info), - } - } -} - -#[derive(Deserialize, Serialize)] -struct Dump<'a> { - pub now: Timestamp, - // Use `BTreeMap`s so the serialization is stable. - pub addresses: BTreeMap, - pub servers: BTreeMap>, -} - -impl<'a> Dump<'a> { - fn new(now: Timestamp, servers: &'a Servers) -> Dump<'a> { - Dump { - now, - addresses: servers - .addresses - .iter() - .map(|(&addr, a_info)| (addr, a_info.clone())) - .collect(), - servers: servers - .servers - .iter() - .map(|(&secret, server)| (secret, DumpServer::from(server))) - .collect(), - } - } - fn fixup_timestamps(&mut self, new_now: Timestamp) { - let self_now = self.now; - let translate_timestamp = |ts| new_now.difference_added(ts, self_now); - self.now = translate_timestamp(self.now); - for a_info in self.addresses.values_mut() { - a_info.ping_time = translate_timestamp(a_info.ping_time); - } - } -} - -#[derive(Clone, Copy, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)] -#[serde(rename_all = "snake_case")] -enum EntryKind { - Backcompat, - Mastersrv, -} - -#[derive(Clone, Deserialize, Serialize)] -struct AddrInfo { - kind: EntryKind, - ping_time: Timestamp, - #[serde(skip_serializing_if = "Option::is_none")] - location: Option, - secret: ShortString, -} - -struct Challenge { - current: ShortString, - prev: ShortString, -} - -impl Challenge { - fn is_valid(&self, challenge: &str) -> bool { - challenge == &self.current || challenge == &self.prev - } - fn current(&self) -> &str { - &self.current - } -} - -struct Challenger { - seed: [u8; 16], - prev_seed: [u8; 16], -} - -impl Challenger { - fn new() -> Challenger { - Challenger { - seed: random(), - prev_seed: random(), - } - } - fn reseed(&mut self) { - self.prev_seed = mem::replace(&mut self.seed, random()); - } - fn for_addr(&self, addr: &Addr) -> Challenge { - fn hash(seed: &[u8], addr: &[u8]) -> ShortString { - let mut hash = SecureHash::new(); - hash.update(addr); - hash.update(seed); - let mut buf = [0; 64]; - let len = - base64::encode_config_slice(&hash.finalize()[..16], base64::STANDARD, &mut buf); - ShortString::from(str::from_utf8(&buf[..len]).unwrap()).unwrap() - } - let mut buf: ArrayVec<[u8; 128]> = ArrayVec::new(); - write!(&mut buf, "{}", addr).unwrap(); - Challenge { - current: hash(&self.seed, &buf), - prev: hash(&self.prev_seed, &buf), - } - } -} - -struct Shared<'a> { - challenger: &'a Mutex, - locations: &'a Locations, - servers: &'a Mutex, - socket: &'a Arc, - timekeeper: Timekeeper, -} - -impl<'a> Shared<'a> { - fn challenge_for_addr(&self, addr: &Addr) -> Challenge { - self.challenger - .lock() - .unwrap_or_else(|poison| poison.into_inner()) - .for_addr(addr) - } - fn lock_servers(&'a self) -> sync::MutexGuard<'a, Servers> { - self.servers - .lock() - .unwrap_or_else(|poison| poison.into_inner()) - } -} - -/// Maintains a mapping from server addresses to server info. -/// -/// Also maintains a mapping from addresses to corresponding server addresses. -#[derive(Clone, Deserialize, Serialize)] -struct Servers { - pub addresses: HashMap, - pub servers: HashMap, -} - -enum AddResult { - Added, - Refreshed, - NeedInfo, - Obsolete, -} - -enum RemoveResult { - Removed, - NotFound, -} - -struct FromDumpError; - -impl Servers { - fn new() -> Servers { - Servers { - addresses: HashMap::new(), - servers: HashMap::new(), - } - } - fn add( - &mut self, - addr: Addr, - a_info: AddrInfo, - info_serial: i64, - info: Option>, - ) -> AddResult { - let need_info = self - .servers - .get(&a_info.secret) - .map(|entry| info_serial > entry.info_serial) - .unwrap_or(true); - if need_info && info.is_none() { - return AddResult::NeedInfo; - } - let insert_addr; - let secret = a_info.secret; - match self.addresses.entry(addr) { - hash_map::Entry::Vacant(v) => { - v.insert(a_info); - insert_addr = true; - } - hash_map::Entry::Occupied(mut o) => { - if a_info.kind < o.get().kind { - // Don't replace masterserver entries with stuff from backcompat. - return AddResult::Obsolete; - } - if a_info.ping_time < o.get().ping_time { - // Don't replace address info with older one. - return AddResult::Obsolete; - } - let old = o.insert(a_info); - insert_addr = old.secret != secret; - if insert_addr { - let server = self.servers.get_mut(&old.secret).unwrap(); - server.addresses.retain(|&a| a != addr); - if server.addresses.is_empty() { - assert!(self.servers.remove(&old.secret).is_some()); - } - } - } - } - match self.servers.entry(secret) { - hash_map::Entry::Vacant(v) => { - assert!(insert_addr); - v.insert(Server { - addresses: vec![addr], - info_serial, - info: info.unwrap().into_owned(), - }); - } - hash_map::Entry::Occupied(mut o) => { - let server = &mut o.get_mut(); - if insert_addr { - server.addresses.push(addr); - server.addresses.sort_unstable(); - } - if info_serial > server.info_serial { - server.info_serial = info_serial; - server.info = info.unwrap().into_owned(); - } - } - } - if insert_addr { - AddResult::Added - } else { - AddResult::Refreshed - } - } - fn remove(&mut self, addr: Addr, secret: ShortString) -> RemoveResult { - match self.addresses.get(&addr) { - Some(a_info) if secret == a_info.secret => {} - _ => return RemoveResult::NotFound, - } - assert!(self.addresses.remove(&addr).is_some()); - let server = self.servers.get_mut(&secret).unwrap(); - server.addresses.retain(|&a| a != addr); - if server.addresses.is_empty() { - assert!(self.servers.remove(&secret).is_some()); - } - RemoveResult::Removed - } - fn prune_before(&mut self, time: Timestamp, log: bool) { - let mut remove = Vec::new(); - for (&addr, a_info) in &self.addresses { - if a_info.ping_time < time { - remove.push(addr); - } - } - for addr in remove { - if log { - debug!("removing {} due to timeout", addr); - } - let secret = self.addresses.remove(&addr).unwrap().secret; - let server = self.servers.get_mut(&secret).unwrap(); - server.addresses.retain(|&a| a != addr); - if server.addresses.is_empty() { - assert!(self.servers.remove(&secret).is_some()); - } - } - } - fn merge(&mut self, other: &Dump) { - for (&addr, a_info) in &other.addresses { - let server = &other.servers[&*a_info.secret]; - self.add( - addr, - a_info.clone(), - server.info_serial, - Some(Cow::Borrowed(&server.info)), - ); - } - } - fn from_dump(dump: Dump) -> Result { - let mut result = Servers { - addresses: dump.addresses.into_iter().collect(), - servers: dump - .servers - .into_iter() - .map(|(secret, server)| { - ( - secret, - Server { - addresses: vec![], - info_serial: server.info_serial, - info: server.info.into_owned(), - }, - ) - }) - .collect(), - }; - // Fix up addresses in `Server` struct -- they're not serialized into a - // `Dump`. - for (&addr, a_info) in &result.addresses { - result - .servers - .get_mut(&a_info.secret) - .ok_or(FromDumpError)? - .addresses - .push(addr); - } - for server in result.servers.values_mut() { - if server.addresses.is_empty() { - return Err(FromDumpError); - } - server.addresses.sort_unstable(); - } - Ok(result) - } -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -struct Server { - pub addresses: Vec, - pub info_serial: i64, - pub info: Box, -} - -async fn handle_periodic_reseed(challenger: Arc>) { - loop { - tokio::time::sleep(Duration::from_secs(3600)).await; - challenger - .lock() - .unwrap_or_else(|poison| poison.into_inner()) - .reseed(); - } -} - -async fn read_dump(path: &Path, timekeeper: Timekeeper) -> Result, io::Error> { - let mut buffer = Vec::new(); - let timestamp = timekeeper.from_system_time(fs::metadata(&path).await?.modified().unwrap()); - buffer.clear(); - File::open(&path).await?.read_to_end(&mut buffer).await?; - let mut dump: Dump = json::from_slice(&buffer)?; - dump.fixup_timestamps(timestamp); - Ok(dump) -} - -async fn read_dump_dir(path: &Path, timekeeper: Timekeeper) -> Vec> { - let mut dir_entries = fs::read_dir(path).await.unwrap(); - let mut dumps = Vec::new(); - while let Some(entry) = dir_entries.next_entry().await.unwrap() { - let path = entry.path(); - if path.extension() != Some(OsStr::new("json")) { - continue; - } - let dump = read_dump(&path, timekeeper).await.unwrap(); - dumps.push((path, dump)); - } - dumps.sort_unstable_by(|(path1, _), (path2, _)| path1.cmp(path2)); - dumps.into_iter().map(|(_, dump)| dump).collect() -} - -async fn overwrite_atomically( - filename: &str, - temp_filename: &str, - content: &[u8], -) -> io::Result<()> { - fs::write(temp_filename, content).await?; - fs::rename(temp_filename, filename).await?; - Ok(()) -} - -async fn handle_periodic_writeout( - servers: Arc>, - dumps_dir: Option, - dump_filename: Option, - addresses_filename: Option, - servers_filename: String, - timekeeper: Timekeeper, -) { - let dump_filename = dump_filename.map(|f| { - let tmp = format!("{}.tmp.{}", f, process::id()); - (f, tmp) - }); - let addresses_filename = addresses_filename.map(|f| { - let tmp = format!("{}.tmp.{}", f, process::id()); - (f, tmp) - }); - let servers_filename_temp = &format!("{}.tmp.{}", servers_filename, process::id()); - - let start = Instant::now(); - let mut iteration = 0; - - loop { - let now = timekeeper.now(); - let mut servers = { - let mut servers = servers.lock().unwrap_or_else(|poison| poison.into_inner()); - servers.prune_before(now.minus_seconds(SERVER_TIMEOUT_SECONDS), true); - servers.clone() - }; - if let Some((filename, filename_temp)) = &dump_filename { - let json = json::to_string(&Dump::new(now, &servers)).unwrap(); - overwrite_atomically(filename, filename_temp, json.as_bytes()) - .await - .unwrap(); - } - { - let other_dumps = match &dumps_dir { - Some(dir) => read_dump_dir(Path::new(dir), timekeeper).await, - None => Vec::new(), - }; - if let Some((filename, filename_temp)) = &addresses_filename { - let mut non_backcompat_addrs: Vec = Vec::new(); - non_backcompat_addrs.extend(servers.addresses.keys()); - let oldest = now.minus_seconds(SERVER_TIMEOUT_SECONDS); - for other_dump in &other_dumps { - non_backcompat_addrs.extend( - other_dump - .addresses - .iter() - .filter(|(_, a_info)| { - a_info.kind != EntryKind::Backcompat && a_info.ping_time >= oldest - }) - .map(|(addr, _)| addr), - ); - } - non_backcompat_addrs.sort_unstable(); - non_backcompat_addrs.dedup(); - let json = json::to_string(&non_backcompat_addrs).unwrap(); - overwrite_atomically(filename, filename_temp, json.as_bytes()) - .await - .unwrap(); - } - for other_dump in &other_dumps { - servers.merge(other_dump); - } - drop(other_dumps); - let json = { - let mut serialized = SerializedServers::new(); - servers.prune_before(now.minus_seconds(SERVER_TIMEOUT_SECONDS), false); - serialized.servers.extend(servers.servers.values().map(|s| { - // Get the location of the first registered address. Since - // the addresses are kept sorted, this is stable. - let location = s - .addresses - .iter() - .filter_map(|addr| servers.addresses[addr].location) - .next(); - SerializedServer::new(s, location) - })); - serialized.servers.sort_by_key(|s| s.addresses); - json::to_string(&serialized).unwrap() - }; - overwrite_atomically(&servers_filename, servers_filename_temp, json.as_bytes()) - .await - .unwrap(); - } - let elapsed = start.elapsed(); - if elapsed.as_secs() <= iteration { - let remaining_ns = 1_000_000_000 - elapsed.subsec_nanos(); - time::sleep(Duration::new(0, remaining_ns)).await; - iteration += 1; - } else { - iteration = elapsed.as_secs(); - } - } -} - -async fn send_challenge( - connless_request_token_7: Option<[u8; 4]>, - socket: Arc, - target: SocketAddr, - challenge_secret: ShortString, - challenge: ShortString, -) { - let mut packet = Vec::with_capacity(128); - if let Some(t) = connless_request_token_7 { - packet.extend_from_slice(b"\x21"); - packet.extend_from_slice(&t); - packet.extend_from_slice(b"\xff\xff\xff\xff\xff\xff\xff\xffchal"); - } else { - packet.extend_from_slice(b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffchal"); - } - packet.extend_from_slice(challenge_secret.as_bytes()); - packet.push(0); - packet.extend_from_slice(challenge.as_bytes()); - packet.push(0); - socket.send_to(&packet, target).await.unwrap(); -} - -fn handle_register( - shared: Shared, - remote_addr: IpAddr, - register: Register, -) -> Result { - let connless_request_token_7 = match register.address.protocol { - Protocol::V5 => None, - Protocol::V6 => None, - Protocol::V7 => { - let token_hex = register - .connless_request_token - .as_ref() - .ok_or_else(|| "registering with tw-0.7+udp:// requires header Connless-Token")?; - let mut token = [0; 4]; - hex::decode_to_slice(token_hex.as_bytes(), &mut token).map_err(|e| { - RegisterError::new(format!("invalid hex in Connless-Request-Token: {}", e)) - })?; - Some(token) - } - Protocol::Ddper6 => None, - }; - - let addr = register.address.with_ip(remote_addr); - let challenge = shared.challenge_for_addr(&addr); - - let correct_challenge = register - .challenge_token - .as_ref() - .map(|ct| challenge.is_valid(ct)) - .unwrap_or(false); - let should_send_challenge = register - .challenge_token - .as_ref() - .map(|ct| ct != challenge.current()) - .unwrap_or(true); - - let result = if correct_challenge { - let raw_info = register - .info - .map(|i| -> Result<_, RegisterError> { - let info = i.as_object().ok_or("register info must be an object")?; - - // Normalize the JSON to strip any spaces etc. - Ok(json::value::to_raw_value(&info).unwrap()) - }) - .transpose()?; - - let add_result = shared.lock_servers().add( - addr, - AddrInfo { - kind: EntryKind::Mastersrv, - ping_time: shared.timekeeper.now(), - location: shared.locations.lookup(addr.ip), - secret: register.secret, - }, - register.info_serial, - raw_info.map(Cow::Owned), - ); - match add_result { - AddResult::Added => debug!("successfully registered {}", addr), - AddResult::Refreshed => {} - AddResult::NeedInfo => {} - AddResult::Obsolete => { - warn!( - "received obsolete entry {}, shouldn't normally happen", - addr - ); - } - } - if let AddResult::NeedInfo = add_result { - RegisterResponse::NeedInfo - } else { - RegisterResponse::Success - } - } else { - RegisterResponse::NeedChallenge - }; - - if should_send_challenge { - if let RegisterResponse::Success = result { - trace!("re-sending challenge to {}", addr); - } else { - trace!("sending challenge to {}", addr); - } - tokio::spawn(send_challenge( - connless_request_token_7, - shared.socket.clone(), - addr.to_socket_addr(), - register.challenge_secret, - challenge.current, - )); - } - - Ok(result) -} - -fn handle_delete( - shared: Shared, - remote_addr: IpAddr, - delete: Delete, -) -> Result { - let addr = delete.address.with_ip(remote_addr); - match shared.lock_servers().remove(addr, delete.secret) { - RemoveResult::Removed => { - debug!("successfully removed {}", addr); - Ok(RegisterResponse::Success) - } - RemoveResult::NotFound => Err("could not find registered server".into()), - } -} - -fn parse_opt( - headers: &warp::http::HeaderMap, - name: &str, -) -> Result, RegisterError> -where - T::Err: fmt::Display, -{ - headers - .get(name) - .map(|v| -> Result { - v.to_str() - .map_err(|e| RegisterError::new(format!("invalid header {}: {}", name, e)))? - .parse() - .map_err(|e| RegisterError::new(format!("invalid header {}: {}", name, e))) - }) - .transpose() -} -fn parse(headers: &warp::http::HeaderMap, name: &str) -> Result -where - T::Err: fmt::Display, -{ - parse_opt(headers, name)? - .ok_or_else(|| RegisterError::new(format!("missing required header {}", name))) -} - -fn register_from_headers( - headers: &warp::http::HeaderMap, - info: &[u8], -) -> Result { - Ok(Register { - address: parse(headers, "Address")?, - secret: parse(headers, "Secret")?, - connless_request_token: parse_opt(headers, "Connless-Token")?, - challenge_secret: parse(headers, "Challenge-Secret")?, - challenge_token: parse_opt(headers, "Challenge-Token")?, - info_serial: parse(headers, "Info-Serial")?, - info: if !info.is_empty() { - match headers.typed_get::().map(mime::Mime::from) { - Some(mime) if mime.essence_str() == mime::APPLICATION_JSON => {} - _ => return Err(RegisterError::unsupported_media_type()), - } - Some(json::from_slice(info).map_err(|e| { - RegisterError::new(format!("Request body deserialize error: {}", e)) - })?) - } else { - None - }, - }) -} - -fn delete_from_headers(headers: &warp::http::HeaderMap) -> Result { - Ok(Delete { - address: parse(headers, "Address")?, - secret: parse(headers, "Secret")?, - }) -} - -async fn recover(err: warp::Rejection) -> Result { - use warp::http::StatusCode; - let (e, status): (&dyn fmt::Display, _) = if err.is_not_found() { - (&"Not found", StatusCode::NOT_FOUND) - } else if let Some(e) = err.find::() { - (e, StatusCode::METHOD_NOT_ALLOWED) - } else if let Some(e) = err.find::() { - (e, StatusCode::BAD_REQUEST) - } else if let Some(e) = err.find::() { - (e, StatusCode::BAD_REQUEST) - } else if let Some(e) = err.find::() { - (e, StatusCode::BAD_REQUEST) - } else if let Some(e) = err.find::() { - (e, StatusCode::BAD_REQUEST) - } else if let Some(e) = err.find::() { - (e, StatusCode::LENGTH_REQUIRED) - } else if let Some(e) = err.find::() { - (e, StatusCode::PAYLOAD_TOO_LARGE) - } else { - return Err(err); - }; - - let response = RegisterResponse::Error(RegisterError::new(format!("{}", e))); - Ok(warp::http::Response::builder() - .status(status) - .header(warp::http::header::CONTENT_TYPE, "application/json") - .body(json::to_string(&response).unwrap() + "\n")) -} - -#[derive(Clone)] -struct AssertUnwindSafe(pub T); -impl panic::UnwindSafe for AssertUnwindSafe {} -impl panic::RefUnwindSafe for AssertUnwindSafe {} - -// TODO: put active part masterservers on a different domain? -#[tokio::main] -async fn main() { - env_logger::init(); - - let mut command = App::new("mastersrv") - .about("Collects game server info via an HTTP endpoint and aggregates them.") - .arg(Arg::with_name("listen") - .long("listen") - .value_name("ADDRESS") - .default_value("[::]:8080") - .help("Listen address for the HTTP endpoint.") - ) - .arg(Arg::with_name("connecting-ip-header") - .long("connecting-ip-header") - .value_name("HEADER") - .help("HTTP header to use to determine the client IP address.") - ) - .arg(Arg::with_name("locations") - .long("locations") - .value_name("LOCATIONS") - .help("IP to continent locations database filename (libloc format, can be obtained from https://location.ipfire.org/databases/1/location.db.xz).") - ) - .arg(Arg::with_name("write-addresses") - .long("write-addresses") - .value_name("FILENAME") - .help("Dump all new-style addresses to a file each second.") - ) - .arg(Arg::with_name("write-dump") - .long("write-dump") - .value_name("DUMP") - .help("Dump the internal state to a JSON file each second.") - ) - .arg(Arg::with_name("read-write-dump") - .long("read-write-dump") - .value_name("DUMP") - .conflicts_with("write-dump") - .help("Dump the internal state to a JSON file each second, but also read it at the start.") - ) - .arg(Arg::with_name("read-dump-dir") - .long("read-dump-dir") - .takes_value(true) - .value_name("DUMP_DIR") - .help("Read dumps from other mastersrv instances from the specified directory (looking only at *.json files).") - ) - .arg(Arg::with_name("out") - .long("out") - .value_name("OUT") - .default_value("servers.json") - .help("Output file for the aggregated server list in a DDNet 15.5+ compatible format.") - ); - - if cfg!(unix) { - command = command.arg( - Arg::with_name("listen-unix") - .long("listen-unix") - .value_name("PATH") - .requires("connecting-ip-header") - .conflicts_with("listen") - .help("Listen on the specified Unix domain socket."), - ); - } - - let matches = command.get_matches(); - - let listen_address = value_t_or_exit!(matches.value_of("listen"), SocketAddr); - let connecting_ip_header = matches - .value_of("connecting-ip-header") - .map(|s| s.to_owned()); - let listen_unix = if cfg!(unix) { - matches.value_of("listen-unix") - } else { - None - }; - let read_write_dump = matches.value_of("read-write-dump").map(|s| s.to_owned()); - - let timekeeper = Timekeeper::new(); - let challenger = Arc::new(Mutex::new(Challenger::new())); - let locations = Arc::new( - matches - .value_of("locations") - .map(|l| Locations::read(Path::new(&l))) - .transpose() - .unwrap() - .unwrap_or_else(Locations::empty), - ); - let mut servers = Servers::new(); - match &read_write_dump { - Some(path) => match read_dump(Path::new(&path), timekeeper).await { - Ok(dump) => match Servers::from_dump(dump) { - Ok(read_servers) => { - info!("successfully read previous dump"); - servers = read_servers; - } - Err(FromDumpError) => error!("previous dump was inconsistent"), - }, - Err(e) => error!("couldn't read previous dump: {}", e), - }, - None => {} - } - let servers = Arc::new(Mutex::new(servers)); - let socket = Arc::new(tokio::net::UdpSocket::bind("[::]:0").await.unwrap()); - let socket = AssertUnwindSafe(socket); - - let task_reseed = tokio::spawn(handle_periodic_reseed(challenger.clone())); - let task_writeout = tokio::spawn(handle_periodic_writeout( - servers.clone(), - matches.value_of("read-dump-dir").map(|s| s.to_owned()), - matches - .value_of("write-dump") - .map(|s| s.to_owned()) - .or(read_write_dump), - matches.value_of("write-addresses").map(|s| s.to_owned()), - matches.value_of("out").unwrap().to_owned(), - timekeeper, - )); - - let connecting_addr = move |addr: Option, - headers: &warp::http::HeaderMap| - -> Result { - let mut addr = if let Some(header) = &connecting_ip_header { - headers - .get(header) - .ok_or_else(|| RegisterError::new(format!("missing {} header", header)))? - .to_str() - .map_err(|_| RegisterError::from("non-ASCII in connecting IP header"))? - .parse() - .map_err(|e| RegisterError::new(format!("{}", e)))? - } else { - addr.unwrap().ip() - }; - if let IpAddr::V6(v6) = addr { - if let Some(v4) = v6.to_ipv4_mapped() { - addr = IpAddr::from(v4); - } - } - Ok(addr) - }; - - fn build_response(f: F) -> Result, warp::http::Error> - where - F: FnOnce() -> Result + UnwindSafe, - { - let (http_status, body) = match panic::catch_unwind(f) { - Ok(Ok(r)) => (warp::http::StatusCode::OK, r), - Ok(Err(e)) => (e.status(), RegisterResponse::Error(e)), - Err(_) => ( - warp::http::StatusCode::INTERNAL_SERVER_ERROR, - RegisterResponse::Error("unexpected panic".into()), - ), - }; - warp::http::Response::builder() - .status(http_status) - .header(warp::http::header::CONTENT_TYPE, "application/json") - .body(json::to_string(&body).unwrap() + "\n") - } - - let register = warp::path!("ddnet" / "15" / "register") - .and(warp::post()) - .and(warp::header::headers_cloned()) - .and(warp::addr::remote()) - .and(warp::body::content_length_limit(32 * 1024)) // limit body size to 32 KiB - .and(warp::body::bytes()) - .map( - move |headers: warp::http::HeaderMap, addr: Option, info: bytes::Bytes| { - build_response(|| { - let shared = Shared { - challenger: &challenger, - locations: &locations, - servers: &servers, - socket: &socket.0, - timekeeper, - }; - let addr = connecting_addr(addr, &headers)?; - match headers.get("Action").map(warp::http::HeaderValue::as_bytes) { - None => { - let register = register_from_headers(&headers, &info)?; - handle_register(shared, addr, register) - } - Some(b"delete") => { - let delete = delete_from_headers(&headers)?; - handle_delete(shared, addr, delete) - } - Some(action) => { - Err(RegisterError::new(format!("Unknown Action header value {:?} (must either not be present or have value \"delete\"", String::from_utf8_lossy(action)))) - } - } - }) - }, - ) - .recover(recover); - let server = warp::serve(register); - - let task_server = if let Some(path) = listen_unix { - #[cfg(unix)] - { - use tokio::net::UnixListener; - use tokio_stream::wrappers::UnixListenerStream; - let _ = fs::remove_file(path).await; - let unix_socket = UnixListener::bind(path).unwrap(); - tokio::spawn(server.run_incoming(UnixListenerStream::new(unix_socket))) - } - #[cfg(not(unix))] - { - let _ = path; - unreachable!(); - } - } else { - tokio::spawn(server.run(listen_address)) - }; - - match tokio::try_join!(task_reseed, task_writeout, task_server) { - Ok(((), (), ())) => unreachable!(), - Err(e) => panic::resume_unwind(e.into_panic()), - } -} diff --git a/src/rust-bridge/.clang-tidy b/src/rust-bridge/.clang-tidy deleted file mode 100644 index d550bc98a4..0000000000 --- a/src/rust-bridge/.clang-tidy +++ /dev/null @@ -1,3 +0,0 @@ -# Need at least one check, otherwise clang-tidy fails, use one that can't -# happen in our code since we don't use OpenMP API. -Checks: '-*,openmp-exception-escape' diff --git a/src/rust-bridge/cpp/console.cpp b/src/rust-bridge/cpp/console.cpp deleted file mode 100644 index 368ec06330..0000000000 --- a/src/rust-bridge/cpp/console.cpp +++ /dev/null @@ -1,164 +0,0 @@ -#include "base/rust.h" -#include "engine/console.h" -#include "engine/rust.h" -#include -#include -#include -#include -#include -#include - -namespace rust { -inline namespace cxxbridge1 { -// #include "rust/cxx.h" - -#ifndef CXXBRIDGE1_IS_COMPLETE -#define CXXBRIDGE1_IS_COMPLETE -namespace detail { -namespace { -template -struct is_complete : std::false_type {}; -template -struct is_complete : std::true_type {}; -} // namespace -} // namespace detail -#endif // CXXBRIDGE1_IS_COMPLETE - -#ifndef CXXBRIDGE1_RELOCATABLE -#define CXXBRIDGE1_RELOCATABLE -namespace detail { -template -struct make_void { - using type = void; -}; - -template -using void_t = typename make_void::type; - -template class, typename...> -struct detect : std::false_type {}; -template